diff --git a/client/package.json b/client/package.json index 8483c13a1e..d524a9a11c 100644 --- a/client/package.json +++ b/client/package.json @@ -39,6 +39,7 @@ "clsx": "^1.2.1", "copy-to-clipboard": "^3.3.3", "crypto-browserify": "^3.12.0", + "export-from-json": "^1.7.2", "lodash": "^4.17.21", "lucide-react": "^0.113.0", "react": "^18.2.0", diff --git a/client/src/components/Endpoints/EditPresetDialog.jsx b/client/src/components/Endpoints/EditPresetDialog.jsx index d2f825bd4e..39c8b989ad 100644 --- a/client/src/components/Endpoints/EditPresetDialog.jsx +++ b/client/src/components/Endpoints/EditPresetDialog.jsx @@ -1,8 +1,9 @@ import React, { useEffect, useState } from 'react'; import { useSetRecoilState, useRecoilValue } from 'recoil'; import axios from 'axios'; +import exportFromJSON from 'export-from-json'; import DialogTemplate from '../ui/DialogTemplate'; -import { Dialog } from '../ui/Dialog.tsx'; +import { Dialog, DialogClose, DialogButton } from '../ui/Dialog.tsx'; import { Input } from '../ui/Input.tsx'; import { Label } from '../ui/Label.tsx'; import Dropdown from '../ui/Dropdown'; @@ -55,17 +56,47 @@ const EditPresetDialog = ({ open, onOpenChange, preset: _preset }) => { const defaultTextProps = 'rounded-md border border-gray-200 focus:border-slate-400 focus:bg-gray-50 bg-transparent text-sm shadow-[0_0_10px_rgba(0,0,0,0.05)] outline-none placeholder:text-gray-400 focus:outline-none focus:ring-gray-400 focus:ring-opacity-20 focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-500 dark:bg-gray-700 focus:dark:bg-gray-600 dark:text-gray-50 dark:shadow-[0_0_15px_rgba(0,0,0,0.10)] dark:focus:border-gray-400 dark:focus:outline-none dark:focus:ring-0 dark:focus:ring-gray-400 dark:focus:ring-offset-0'; + // in order not to use wrong data from other endpoint + const clearPreset = () => { + if (preset?.endpoint === 'openAI') + return { + title: preset?.title, + endpoint: preset?.endpoint, + model: preset?.model, + chatGptLabel: preset?.chatGptLabel, + promptPrefix: preset?.promptPrefix, + temperature: preset?.temperature, + top_p: preset?.top_p, + presence_penalty: preset?.presence_penalty, + frequency_penalty: preset?.frequency_penalty + }; + else + return { + title: preset?.title, + endpoint: preset?.endpoint + }; + // TODO: else + }; + const submitPreset = () => { axios({ method: 'post', url: '/api/presets', - data: preset, + data: clearPreset(), withCredentials: true }).then(res => { setPresets(res?.data); }); }; + const exportPreset = () => { + exportFromJSON({ + data: clearPreset(), + fileName: `${preset?.title}.json`, + exportType: exportFromJSON.types.json + }); + }; + useEffect(() => { setPreset(_preset); }, [open]); @@ -123,11 +154,26 @@ const EditPresetDialog = ({ open, onOpenChange, preset: _preset }) => {
{renderSettings()}
} - selection={{ - selectHandler: submitPreset, - selectClasses: 'bg-green-600 hover:bg-green-700 dark:hover:bg-green-800 text-white', - selectText: 'Save' - }} + buttons={ + <> + + Save + + + } + leftButtons={ + <> + + Export + + + } /> ); diff --git a/client/src/components/ui/Dialog.tsx b/client/src/components/ui/Dialog.tsx index b7019e8ae6..9448089e73 100644 --- a/client/src/components/ui/Dialog.tsx +++ b/client/src/components/ui/Dialog.tsx @@ -1,5 +1,6 @@ import * as React from "react" import * as DialogPrimitive from "@radix-ui/react-dialog" +import { Button } from '../ui/Button'; import { X } from "lucide-react" import { cn } from "../../utils" @@ -81,7 +82,7 @@ const DialogFooter = ({ }: React.HTMLAttributes) => (
, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( +
*/} {main ? main : null} - Cancel - {buttons ? buttons : null} - - {selectText} - +
{leftButtons ? leftButtons : null}
+
+ Cancel + {buttons ? buttons : null} + {selection ? ( + + {selectText} + + ) : null} +
);