mirror of
https://github.com/FranP-code/ChatGPT.git
synced 2025-10-13 00:13:25 +00:00
chore: add pretty
This commit is contained in:
52
src/view/model/SyncCustom/Form.tsx
vendored
52
src/view/model/SyncCustom/Form.tsx
vendored
@@ -1,4 +1,10 @@
|
||||
import { useEffect, useState, ForwardRefRenderFunction, useImperativeHandle, forwardRef } from 'react';
|
||||
import {
|
||||
useEffect,
|
||||
useState,
|
||||
ForwardRefRenderFunction,
|
||||
useImperativeHandle,
|
||||
forwardRef,
|
||||
} from 'react';
|
||||
import { Form, Input, Select, Tooltip } from 'antd';
|
||||
import { v4 } from 'uuid';
|
||||
import type { FormProps } from 'antd';
|
||||
@@ -7,7 +13,7 @@ import { DISABLE_AUTO_COMPLETE, chatRoot } from '@/utils';
|
||||
import useInit from '@/hooks/useInit';
|
||||
|
||||
interface SyncFormProps {
|
||||
record?: Record<string|symbol, any> | null;
|
||||
record?: Record<string | symbol, any> | null;
|
||||
type: string;
|
||||
}
|
||||
|
||||
@@ -54,10 +60,18 @@ const SyncForm: ForwardRefRenderFunction<FormProps, SyncFormProps> = ({ record,
|
||||
|
||||
const jsonTip = (
|
||||
<Tooltip
|
||||
title={<pre>{JSON.stringify([
|
||||
{ cmd: '', act: '', prompt: '' },
|
||||
{ cmd: '', act: '', prompt: '' },
|
||||
], null, 2)}</pre>}
|
||||
title={
|
||||
<pre>
|
||||
{JSON.stringify(
|
||||
[
|
||||
{ cmd: '', act: '', prompt: '' },
|
||||
{ cmd: '', act: '', prompt: '' },
|
||||
],
|
||||
null,
|
||||
2,
|
||||
)}
|
||||
</pre>
|
||||
}
|
||||
>
|
||||
<a>JSON</a>
|
||||
</Tooltip>
|
||||
@@ -65,10 +79,12 @@ const SyncForm: ForwardRefRenderFunction<FormProps, SyncFormProps> = ({ record,
|
||||
|
||||
const csvTip = (
|
||||
<Tooltip
|
||||
title={<pre>{`"cmd","act","prompt"
|
||||
title={
|
||||
<pre>{`"cmd","act","prompt"
|
||||
"cmd","act","prompt"
|
||||
"cmd","act","prompt"
|
||||
"cmd","act","prompt"`}</pre>}
|
||||
"cmd","act","prompt"`}</pre>
|
||||
}
|
||||
>
|
||||
<a>CSV</a>
|
||||
</Tooltip>
|
||||
@@ -76,11 +92,7 @@ const SyncForm: ForwardRefRenderFunction<FormProps, SyncFormProps> = ({ record,
|
||||
|
||||
return (
|
||||
<>
|
||||
<Form
|
||||
form={form}
|
||||
labelCol={{ span: 4 }}
|
||||
initialValues={initFormValue}
|
||||
>
|
||||
<Form form={form} labelCol={{ span: 4 }} initialValues={initFormValue}>
|
||||
<Form.Item
|
||||
label="Name"
|
||||
name="name"
|
||||
@@ -92,7 +104,7 @@ const SyncForm: ForwardRefRenderFunction<FormProps, SyncFormProps> = ({ record,
|
||||
label="PATH"
|
||||
name="path"
|
||||
rules={[{ required: true, message: 'Please enter the path!' }]}
|
||||
>
|
||||
>
|
||||
<Input
|
||||
placeholder="YOUR_PATH"
|
||||
addonBefore={pathOptions}
|
||||
@@ -100,13 +112,17 @@ const SyncForm: ForwardRefRenderFunction<FormProps, SyncFormProps> = ({ record,
|
||||
{...DISABLE_AUTO_COMPLETE}
|
||||
/>
|
||||
</Form.Item>
|
||||
<Form.Item style={{ display: 'none' }} name="id" initialValue={v4().replace(/-/g, '')}><input /></Form.Item>
|
||||
<Form.Item style={{ display: 'none' }} name="id" initialValue={v4().replace(/-/g, '')}>
|
||||
<input />
|
||||
</Form.Item>
|
||||
</Form>
|
||||
<div className="tip">
|
||||
<p>The file supports only {csvTip} and {jsonTip} formats.</p>
|
||||
<p>
|
||||
The file supports only {csvTip} and {jsonTip} formats.
|
||||
</p>
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
export default forwardRef(SyncForm);
|
||||
|
||||
26
src/view/model/SyncCustom/config.tsx
vendored
26
src/view/model/SyncCustom/config.tsx
vendored
@@ -26,7 +26,7 @@ export const syncColumns = () => [
|
||||
dataIndex: 'path',
|
||||
key: 'path',
|
||||
width: 180,
|
||||
render: (_: string, row: any) => <RenderPath row={row} />
|
||||
render: (_: string, row: any) => <RenderPath row={row} />,
|
||||
},
|
||||
{
|
||||
title: 'Last updated',
|
||||
@@ -36,7 +36,7 @@ export const syncColumns = () => [
|
||||
render: (v: number) => (
|
||||
<div>
|
||||
<HistoryOutlined style={{ marginRight: 5, color: v ? '#52c41a' : '#ff4d4f' }} />
|
||||
{ v ? fmtDate(v) : ''}
|
||||
{v ? fmtDate(v) : ''}
|
||||
</div>
|
||||
),
|
||||
},
|
||||
@@ -56,7 +56,11 @@ export const syncColumns = () => [
|
||||
>
|
||||
<a>Sync</a>
|
||||
</Popconfirm>
|
||||
{row.last_updated && <Link to={`${row.id}`} state={row}>View</Link>}
|
||||
{row.last_updated && (
|
||||
<Link to={`${row.id}`} state={row}>
|
||||
View
|
||||
</Link>
|
||||
)}
|
||||
<a onClick={() => actions.setRecord(row, 'edit')}>Edit</a>
|
||||
<Popconfirm
|
||||
title="Are you sure to delete this path?"
|
||||
@@ -67,23 +71,23 @@ export const syncColumns = () => [
|
||||
<a>Delete</a>
|
||||
</Popconfirm>
|
||||
</Space>
|
||||
)
|
||||
}
|
||||
}
|
||||
);
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
const RenderPath = ({ row }: any) => {
|
||||
const [filePath, setFilePath] = useState('');
|
||||
useInit(async () => {
|
||||
setFilePath(await getPath(row));
|
||||
})
|
||||
return <a onClick={() => shell.open(filePath)}>{filePath}</a>
|
||||
setFilePath(await getPath(row));
|
||||
});
|
||||
return <a onClick={() => shell.open(filePath)}>{filePath}</a>;
|
||||
};
|
||||
|
||||
export const getPath = async (row: any) => {
|
||||
if (!/^http/.test(row.protocol)) {
|
||||
return await path.join(await chatRoot(), row.path) + `.${row.ext}`;
|
||||
return (await path.join(await chatRoot(), row.path)) + `.${row.ext}`;
|
||||
} else {
|
||||
return `${row.protocol}://${row.path}.${row.ext}`;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
58
src/view/model/SyncCustom/index.tsx
vendored
58
src/view/model/SyncCustom/index.tsx
vendored
@@ -10,7 +10,13 @@ import { CHAT_MODEL_JSON, chatRoot, readJSON, genCmd } from '@/utils';
|
||||
import { syncColumns, getPath } from './config';
|
||||
import SyncForm from './Form';
|
||||
|
||||
const fmtData = (data: Record<string, any>[] = []) => (Array.isArray(data) ? data : []).map((i) => ({ ...i, cmd: i.cmd ? i.cmd : genCmd(i.act), tags: ['user-sync'], enable: true }));
|
||||
const fmtData = (data: Record<string, any>[] = []) =>
|
||||
(Array.isArray(data) ? data : []).map((i) => ({
|
||||
...i,
|
||||
cmd: i.cmd ? i.cmd : genCmd(i.act),
|
||||
tags: ['user-sync'],
|
||||
enable: true,
|
||||
}));
|
||||
|
||||
export default function SyncCustom() {
|
||||
const [isVisible, setVisible] = useState(false);
|
||||
@@ -37,7 +43,10 @@ export default function SyncCustom() {
|
||||
handleSync(filename).then((isOk: boolean) => {
|
||||
opInfo.resetRecord();
|
||||
if (!isOk) return;
|
||||
const data = opReplace(opInfo?.opRecord?.[opSafeKey], { ...opInfo?.opRecord, last_updated: Date.now() });
|
||||
const data = opReplace(opInfo?.opRecord?.[opSafeKey], {
|
||||
...opInfo?.opRecord,
|
||||
last_updated: Date.now(),
|
||||
});
|
||||
modelSet(data);
|
||||
opInfo.resetRecord();
|
||||
});
|
||||
@@ -48,9 +57,13 @@ export default function SyncCustom() {
|
||||
if (['delete'].includes(opInfo.opType)) {
|
||||
(async () => {
|
||||
try {
|
||||
const file = await path.join(await chatRoot(), 'cache_model', `${opInfo?.opRecord?.id}.json`);
|
||||
const file = await path.join(
|
||||
await chatRoot(),
|
||||
'cache_model',
|
||||
`${opInfo?.opRecord?.id}.json`,
|
||||
);
|
||||
await fs.removeFile(file);
|
||||
} catch(e) {}
|
||||
} catch (e) {}
|
||||
const data = opRemove(opInfo?.opRecord?.[opSafeKey]);
|
||||
modelSet(data);
|
||||
opInfo.resetRecord();
|
||||
@@ -94,29 +107,24 @@ export default function SyncCustom() {
|
||||
};
|
||||
|
||||
const handleOk = () => {
|
||||
formRef.current?.form?.validateFields()
|
||||
.then((vals: Record<string, any>) => {
|
||||
if (opInfo.opType === 'new') {
|
||||
const data = opAdd(vals);
|
||||
modelSet(data);
|
||||
message.success('Data added successfully');
|
||||
}
|
||||
if (opInfo.opType === 'edit') {
|
||||
const data = opReplace(opInfo?.opRecord?.[opSafeKey], vals);
|
||||
modelSet(data);
|
||||
message.success('Data updated successfully');
|
||||
}
|
||||
hide();
|
||||
})
|
||||
formRef.current?.form?.validateFields().then((vals: Record<string, any>) => {
|
||||
if (opInfo.opType === 'new') {
|
||||
const data = opAdd(vals);
|
||||
modelSet(data);
|
||||
message.success('Data added successfully');
|
||||
}
|
||||
if (opInfo.opType === 'edit') {
|
||||
const data = opReplace(opInfo?.opRecord?.[opSafeKey], vals);
|
||||
modelSet(data);
|
||||
message.success('Data updated successfully');
|
||||
}
|
||||
hide();
|
||||
});
|
||||
};
|
||||
|
||||
return (
|
||||
<div>
|
||||
<Button
|
||||
className="chat-add-btn"
|
||||
type="primary"
|
||||
onClick={opInfo.opNew}
|
||||
>
|
||||
<Button className="chat-add-btn" type="primary" onClick={opInfo.opNew}>
|
||||
Add PATH
|
||||
</Button>
|
||||
<Table
|
||||
@@ -138,5 +146,5 @@ export default function SyncCustom() {
|
||||
<SyncForm ref={formRef} record={opInfo?.opRecord} type={opInfo.opType} />
|
||||
</Modal>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
4
src/view/model/SyncPrompts/config.tsx
vendored
4
src/view/model/SyncPrompts/config.tsx
vendored
@@ -41,8 +41,6 @@ export const syncColumns = () => [
|
||||
dataIndex: 'prompt',
|
||||
key: 'prompt',
|
||||
// width: 300,
|
||||
render: (v: string) => (
|
||||
<span className="chat-prompts-val">{v}</span>
|
||||
),
|
||||
render: (v: string) => <span className="chat-prompts-val">{v}</span>,
|
||||
},
|
||||
];
|
||||
|
||||
3
src/view/model/SyncPrompts/index.scss
vendored
3
src/view/model/SyncPrompts/index.scss
vendored
@@ -1,4 +1,5 @@
|
||||
.chat-table-tip, .chat-table-btns {
|
||||
.chat-table-tip,
|
||||
.chat-table-btns {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
20
src/view/model/SyncPrompts/index.tsx
vendored
20
src/view/model/SyncPrompts/index.tsx
vendored
@@ -52,7 +52,7 @@ export default function SyncPrompts() {
|
||||
}, [opInfo.opTime]);
|
||||
|
||||
const handleEnable = (isEnable: boolean) => {
|
||||
const data = opReplaceItems(selectedRowIDs, { enable: isEnable })
|
||||
const data = opReplaceItems(selectedRowIDs, { enable: isEnable });
|
||||
modelCacheSet(data);
|
||||
};
|
||||
|
||||
@@ -72,7 +72,9 @@ export default function SyncPrompts() {
|
||||
<div>
|
||||
{selectedItems.length > 0 && (
|
||||
<>
|
||||
<Button type="primary" onClick={() => handleEnable(true)}>Enable</Button>
|
||||
<Button type="primary" onClick={() => handleEnable(true)}>
|
||||
Enable
|
||||
</Button>
|
||||
<Button onClick={() => handleEnable(false)}>Disable</Button>
|
||||
<span className="num">Selected {selectedItems.length} items</span>
|
||||
</>
|
||||
@@ -84,7 +86,11 @@ export default function SyncPrompts() {
|
||||
<FilePath url={promptsURL} content="f/awesome-chatgpt-prompts/prompts.csv" />
|
||||
<FilePath label="CACHE" paths="cache_model/chatgpt_prompts.json" />
|
||||
</div>
|
||||
{lastUpdated && <span style={{ marginLeft: 10, color: '#888', fontSize: 12 }}>Last updated on {fmtDate(lastUpdated)}</span>}
|
||||
{lastUpdated && (
|
||||
<span style={{ marginLeft: 10, color: '#888', fontSize: 12 }}>
|
||||
Last updated on {fmtDate(lastUpdated)}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
<Table
|
||||
key={lastUpdated}
|
||||
@@ -94,8 +100,10 @@ export default function SyncPrompts() {
|
||||
dataSource={opData}
|
||||
rowSelection={rowSelection}
|
||||
pagination={TABLE_PAGINATION}
|
||||
expandable={{expandedRowRender: (record) => <div style={{ padding: 10 }}>{record.prompt}</div>}}
|
||||
expandable={{
|
||||
expandedRowRender: (record) => <div style={{ padding: 10 }}>{record.prompt}</div>,
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
10
src/view/model/SyncRecord/config.tsx
vendored
10
src/view/model/SyncRecord/config.tsx
vendored
@@ -25,7 +25,11 @@ export const syncColumns = () => [
|
||||
key: 'tags',
|
||||
// width: 150,
|
||||
render: (v: string[]) => (
|
||||
<span className="chat-prompts-tags">{v?.map(i => <Tag key={i}>{i}</Tag>)}</span>
|
||||
<span className="chat-prompts-tags">
|
||||
{v?.map((i) => (
|
||||
<Tag key={i}>{i}</Tag>
|
||||
))}
|
||||
</span>
|
||||
),
|
||||
},
|
||||
{
|
||||
@@ -43,8 +47,6 @@ export const syncColumns = () => [
|
||||
dataIndex: 'prompt',
|
||||
key: 'prompt',
|
||||
// width: 300,
|
||||
render: (v: string) => (
|
||||
<span className="chat-prompts-val">{v}</span>
|
||||
),
|
||||
render: (v: string) => <span className="chat-prompts-val">{v}</span>,
|
||||
},
|
||||
];
|
||||
|
||||
22
src/view/model/SyncRecord/index.tsx
vendored
22
src/view/model/SyncRecord/index.tsx
vendored
@@ -30,7 +30,7 @@ export default function SyncRecord() {
|
||||
useInit(async () => {
|
||||
setFilePath(await getPath(state));
|
||||
setJsonPath(await path.join(await chatRoot(), 'cache_model', `${state?.id}.json`));
|
||||
})
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
if (modelCacheJson.length <= 0) return;
|
||||
@@ -45,7 +45,7 @@ export default function SyncRecord() {
|
||||
}, [opInfo.opTime]);
|
||||
|
||||
const handleEnable = (isEnable: boolean) => {
|
||||
const data = opReplaceItems(selectedRowIDs, { enable: isEnable })
|
||||
const data = opReplaceItems(selectedRowIDs, { enable: isEnable });
|
||||
modelCacheSet(data);
|
||||
};
|
||||
|
||||
@@ -58,7 +58,9 @@ export default function SyncRecord() {
|
||||
<div>
|
||||
{selectedItems.length > 0 && (
|
||||
<>
|
||||
<Button type="primary" onClick={() => handleEnable(true)}>Enable</Button>
|
||||
<Button type="primary" onClick={() => handleEnable(true)}>
|
||||
Enable
|
||||
</Button>
|
||||
<Button onClick={() => handleEnable(false)}>Disable</Button>
|
||||
<span className="num">Selected {selectedItems.length} items</span>
|
||||
</>
|
||||
@@ -70,7 +72,11 @@ export default function SyncRecord() {
|
||||
<FilePath url={filePath} />
|
||||
<FilePath label="CACHE" paths={`cache_model/${state?.id}.json`} />
|
||||
</div>
|
||||
{state?.last_updated && <span style={{ marginLeft: 10, color: '#888', fontSize: 12 }}>Last updated on {fmtDate(state?.last_updated)}</span>}
|
||||
{state?.last_updated && (
|
||||
<span style={{ marginLeft: 10, color: '#888', fontSize: 12 }}>
|
||||
Last updated on {fmtDate(state?.last_updated)}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
<Table
|
||||
key="prompt"
|
||||
@@ -80,8 +86,10 @@ export default function SyncRecord() {
|
||||
dataSource={opData}
|
||||
rowSelection={rowSelection}
|
||||
pagination={TABLE_PAGINATION}
|
||||
expandable={{expandedRowRender: (record) => <div style={{ padding: 10 }}>{record.prompt}</div>}}
|
||||
expandable={{
|
||||
expandedRowRender: (record) => <div style={{ padding: 10 }}>{record.prompt}</div>,
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
17
src/view/model/UserCustom/Form.tsx
vendored
17
src/view/model/UserCustom/Form.tsx
vendored
@@ -6,7 +6,7 @@ import Tags from '@comps/Tags';
|
||||
import { DISABLE_AUTO_COMPLETE } from '@/utils';
|
||||
|
||||
interface UserCustomFormProps {
|
||||
record?: Record<string|symbol, any> | null;
|
||||
record?: Record<string | symbol, any> | null;
|
||||
}
|
||||
|
||||
const initFormValue = {
|
||||
@@ -16,7 +16,10 @@ const initFormValue = {
|
||||
prompt: '',
|
||||
};
|
||||
|
||||
const UserCustomForm: ForwardRefRenderFunction<FormProps, UserCustomFormProps> = ({ record }, ref) => {
|
||||
const UserCustomForm: ForwardRefRenderFunction<FormProps, UserCustomFormProps> = (
|
||||
{ record },
|
||||
ref,
|
||||
) => {
|
||||
const [form] = Form.useForm();
|
||||
useImperativeHandle(ref, () => ({ form }));
|
||||
|
||||
@@ -27,11 +30,7 @@ const UserCustomForm: ForwardRefRenderFunction<FormProps, UserCustomFormProps> =
|
||||
}, [record]);
|
||||
|
||||
return (
|
||||
<Form
|
||||
form={form}
|
||||
labelCol={{ span: 4 }}
|
||||
initialValues={initFormValue}
|
||||
>
|
||||
<Form form={form} labelCol={{ span: 4 }} initialValues={initFormValue}>
|
||||
<Form.Item
|
||||
label="/{cmd}"
|
||||
name="cmd"
|
||||
@@ -60,7 +59,7 @@ const UserCustomForm: ForwardRefRenderFunction<FormProps, UserCustomFormProps> =
|
||||
<Input.TextArea rows={4} placeholder="Please enter a prompt" {...DISABLE_AUTO_COMPLETE} />
|
||||
</Form.Item>
|
||||
</Form>
|
||||
)
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
export default forwardRef(UserCustomForm);
|
||||
|
||||
14
src/view/model/UserCustom/config.tsx
vendored
14
src/view/model/UserCustom/config.tsx
vendored
@@ -7,7 +7,7 @@ export const modelColumns = () => [
|
||||
fixed: 'left',
|
||||
width: 120,
|
||||
key: 'cmd',
|
||||
render: (v: string) => <Tag color="#2a2a2a">/{v}</Tag>
|
||||
render: (v: string) => <Tag color="#2a2a2a">/{v}</Tag>,
|
||||
},
|
||||
{
|
||||
title: 'Act',
|
||||
@@ -21,7 +21,11 @@ export const modelColumns = () => [
|
||||
key: 'tags',
|
||||
width: 150,
|
||||
render: (v: string[]) => (
|
||||
<span className="chat-prompts-tags">{v?.map(i => <Tag key={i}>{i}</Tag>)}</span>
|
||||
<span className="chat-prompts-tags">
|
||||
{v?.map((i) => (
|
||||
<Tag key={i}>{i}</Tag>
|
||||
))}
|
||||
</span>
|
||||
),
|
||||
},
|
||||
{
|
||||
@@ -39,9 +43,7 @@ export const modelColumns = () => [
|
||||
dataIndex: 'prompt',
|
||||
key: 'prompt',
|
||||
width: 300,
|
||||
render: (v: string) => (
|
||||
<span className="chat-prompts-val">{v}</span>
|
||||
),
|
||||
render: (v: string) => <span className="chat-prompts-val">{v}</span>,
|
||||
},
|
||||
{
|
||||
title: 'Action',
|
||||
@@ -61,5 +63,5 @@ export const modelColumns = () => [
|
||||
</Popconfirm>
|
||||
</Space>
|
||||
),
|
||||
}
|
||||
},
|
||||
];
|
||||
|
||||
77
src/view/model/UserCustom/index.tsx
vendored
77
src/view/model/UserCustom/index.tsx
vendored
@@ -50,10 +50,10 @@ export default function LanguageModel() {
|
||||
const data = opReplace(opInfo?.opRecord?.[opSafeKey], opInfo?.opRecord);
|
||||
modelCacheSet(data);
|
||||
}
|
||||
}, [opInfo.opTime])
|
||||
}, [opInfo.opTime]);
|
||||
|
||||
const handleEnable = (isEnable: boolean) => {
|
||||
const data = opReplaceItems(selectedRowIDs, { enable: isEnable })
|
||||
const data = opReplaceItems(selectedRowIDs, { enable: isEnable });
|
||||
modelCacheSet(data);
|
||||
};
|
||||
|
||||
@@ -63,38 +63,51 @@ export default function LanguageModel() {
|
||||
};
|
||||
|
||||
const handleOk = () => {
|
||||
formRef.current?.form?.validateFields()
|
||||
.then(async (vals: Record<string, any>) => {
|
||||
if (modelCacheJson.map((i: any) => i.cmd).includes(vals.cmd) && opInfo?.opRecord?.cmd !== vals.cmd) {
|
||||
message.warning(`"cmd: /${vals.cmd}" already exists, please change the "${vals.cmd}" name and resubmit.`);
|
||||
return;
|
||||
}
|
||||
let data = [];
|
||||
switch (opInfo.opType) {
|
||||
case 'new': data = opAdd(vals); break;
|
||||
case 'edit': data = opReplace(opInfo?.opRecord?.[opSafeKey], vals); break;
|
||||
default: break;
|
||||
}
|
||||
await modelCacheSet(data);
|
||||
opInit(data);
|
||||
modelSet({
|
||||
id: 'user_custom',
|
||||
last_updated: Date.now(),
|
||||
});
|
||||
hide();
|
||||
})
|
||||
formRef.current?.form?.validateFields().then(async (vals: Record<string, any>) => {
|
||||
if (
|
||||
modelCacheJson.map((i: any) => i.cmd).includes(vals.cmd) &&
|
||||
opInfo?.opRecord?.cmd !== vals.cmd
|
||||
) {
|
||||
message.warning(
|
||||
`"cmd: /${vals.cmd}" already exists, please change the "${vals.cmd}" name and resubmit.`,
|
||||
);
|
||||
return;
|
||||
}
|
||||
let data = [];
|
||||
switch (opInfo.opType) {
|
||||
case 'new':
|
||||
data = opAdd(vals);
|
||||
break;
|
||||
case 'edit':
|
||||
data = opReplace(opInfo?.opRecord?.[opSafeKey], vals);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
await modelCacheSet(data);
|
||||
opInit(data);
|
||||
modelSet({
|
||||
id: 'user_custom',
|
||||
last_updated: Date.now(),
|
||||
});
|
||||
hide();
|
||||
});
|
||||
};
|
||||
|
||||
const modalTitle = `${({ new: 'Create', edit: 'Edit' })[opInfo.opType]} Model`;
|
||||
const modalTitle = `${{ new: 'Create', edit: 'Edit' }[opInfo.opType]} Model`;
|
||||
|
||||
return (
|
||||
<div>
|
||||
<div className="chat-table-btns">
|
||||
<Button className="chat-add-btn" type="primary" onClick={opInfo.opNew}>Add Model</Button>
|
||||
<Button className="chat-add-btn" type="primary" onClick={opInfo.opNew}>
|
||||
Add Model
|
||||
</Button>
|
||||
<div>
|
||||
{selectedItems.length > 0 && (
|
||||
<>
|
||||
<Button type="primary" onClick={() => handleEnable(true)}>Enable</Button>
|
||||
<Button type="primary" onClick={() => handleEnable(true)}>
|
||||
Enable
|
||||
</Button>
|
||||
<Button onClick={() => handleEnable(false)}>Disable</Button>
|
||||
<span className="num">Selected {selectedItems.length} items</span>
|
||||
</>
|
||||
@@ -103,7 +116,11 @@ export default function LanguageModel() {
|
||||
</div>
|
||||
<div className="chat-table-tip">
|
||||
<FilePath label="CACHE" paths="cache_model/user_custom.json" />
|
||||
{lastUpdated && <span style={{ marginLeft: 10, color: '#888', fontSize: 12 }}>Last updated on {fmtDate(lastUpdated)}</span>}
|
||||
{lastUpdated && (
|
||||
<span style={{ marginLeft: 10, color: '#888', fontSize: 12 }}>
|
||||
Last updated on {fmtDate(lastUpdated)}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
<Table
|
||||
key={lastUpdated}
|
||||
@@ -113,7 +130,9 @@ export default function LanguageModel() {
|
||||
dataSource={opData}
|
||||
rowSelection={rowSelection}
|
||||
pagination={TABLE_PAGINATION}
|
||||
expandable={{expandedRowRender: (record) => <div style={{ padding: 10 }}>{record.prompt}</div>}}
|
||||
expandable={{
|
||||
expandedRowRender: (record) => <div style={{ padding: 10 }}>{record.prompt}</div>,
|
||||
}}
|
||||
/>
|
||||
<Modal
|
||||
open={isVisible}
|
||||
@@ -126,5 +145,5 @@ export default function LanguageModel() {
|
||||
<UserCustomForm record={opInfo?.opRecord} ref={formRef} />
|
||||
</Modal>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user