2023-05-13 12:15:18 +00:00
|
|
|
import React, {FC} from 'react';
|
2023-05-06 12:17:39 +00:00
|
|
|
import {
|
|
|
|
createTableColumn,
|
|
|
|
DataGrid,
|
|
|
|
DataGridBody,
|
|
|
|
DataGridCell,
|
|
|
|
DataGridHeader,
|
|
|
|
DataGridHeaderCell,
|
|
|
|
DataGridRow,
|
|
|
|
TableCellLayout,
|
|
|
|
TableColumnDefinition,
|
|
|
|
Text,
|
|
|
|
Textarea
|
|
|
|
} from '@fluentui/react-components';
|
2023-05-07 13:27:13 +00:00
|
|
|
import {ToolTipButton} from '../components/ToolTipButton';
|
2023-05-13 15:36:30 +00:00
|
|
|
import {ArrowClockwise20Regular, ArrowDownload20Regular, Folder20Regular, Open20Regular} from '@fluentui/react-icons';
|
2023-05-13 12:15:18 +00:00
|
|
|
import {observer} from 'mobx-react-lite';
|
|
|
|
import commonStore, {ModelSourceItem} from '../stores/commonStore';
|
|
|
|
import {BrowserOpenURL} from '../../wailsjs/runtime';
|
2023-05-13 15:36:30 +00:00
|
|
|
import {DownloadFile, OpenFileFolder} from '../../wailsjs/go/backend_golang/App';
|
|
|
|
import manifest from '../../../manifest.json';
|
2023-05-06 12:17:39 +00:00
|
|
|
|
2023-05-13 12:15:18 +00:00
|
|
|
const columns: TableColumnDefinition<ModelSourceItem>[] = [
|
|
|
|
createTableColumn<ModelSourceItem>({
|
2023-05-06 12:17:39 +00:00
|
|
|
columnId: 'file',
|
|
|
|
compare: (a, b) => {
|
2023-05-13 12:15:18 +00:00
|
|
|
return a.name.localeCompare(b.name);
|
2023-05-06 12:17:39 +00:00
|
|
|
},
|
|
|
|
renderHeaderCell: () => {
|
|
|
|
return 'File';
|
|
|
|
},
|
|
|
|
renderCell: (item) => {
|
|
|
|
return (
|
|
|
|
<TableCellLayout className="break-all">
|
2023-05-13 12:15:18 +00:00
|
|
|
{item.name}
|
2023-05-06 12:17:39 +00:00
|
|
|
</TableCellLayout>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}),
|
2023-05-13 12:15:18 +00:00
|
|
|
createTableColumn<ModelSourceItem>({
|
2023-05-06 12:17:39 +00:00
|
|
|
columnId: 'desc',
|
|
|
|
compare: (a, b) => {
|
2023-05-13 15:36:30 +00:00
|
|
|
if (a.desc && b.desc)
|
|
|
|
return a.desc['en'].localeCompare(b.desc['en']);
|
|
|
|
else
|
|
|
|
return 0;
|
2023-05-06 12:17:39 +00:00
|
|
|
},
|
|
|
|
renderHeaderCell: () => {
|
|
|
|
return 'Desc';
|
|
|
|
},
|
|
|
|
renderCell: (item) => {
|
|
|
|
return (
|
|
|
|
<TableCellLayout>
|
2023-05-13 15:36:30 +00:00
|
|
|
{item.desc && item.desc['en']}
|
2023-05-06 12:17:39 +00:00
|
|
|
</TableCellLayout>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}),
|
2023-05-13 12:15:18 +00:00
|
|
|
createTableColumn<ModelSourceItem>({
|
2023-05-06 12:17:39 +00:00
|
|
|
columnId: 'size',
|
|
|
|
compare: (a, b) => {
|
|
|
|
return a.size - b.size;
|
|
|
|
},
|
|
|
|
renderHeaderCell: () => {
|
|
|
|
return 'Size';
|
|
|
|
},
|
|
|
|
renderCell: (item) => {
|
|
|
|
return (
|
|
|
|
<TableCellLayout>
|
|
|
|
{(item.size / (1024 * 1024 * 1024)).toFixed(2) + 'GB'}
|
|
|
|
</TableCellLayout>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}),
|
2023-05-13 12:15:18 +00:00
|
|
|
createTableColumn<ModelSourceItem>({
|
2023-05-06 12:17:39 +00:00
|
|
|
columnId: 'lastUpdated',
|
|
|
|
compare: (a, b) => {
|
2023-05-13 12:15:18 +00:00
|
|
|
if (!a.lastUpdatedMs)
|
|
|
|
a.lastUpdatedMs = Date.parse(a.lastUpdated);
|
|
|
|
if (!b.lastUpdatedMs)
|
|
|
|
b.lastUpdatedMs = Date.parse(b.lastUpdated);
|
2023-05-13 15:36:30 +00:00
|
|
|
return b.lastUpdatedMs - a.lastUpdatedMs;
|
2023-05-06 12:17:39 +00:00
|
|
|
},
|
|
|
|
renderHeaderCell: () => {
|
|
|
|
return 'Last updated';
|
|
|
|
},
|
|
|
|
|
|
|
|
renderCell: (item) => {
|
|
|
|
return new Date(item.lastUpdated).toLocaleString();
|
|
|
|
}
|
|
|
|
}),
|
2023-05-13 12:15:18 +00:00
|
|
|
createTableColumn<ModelSourceItem>({
|
2023-05-06 12:17:39 +00:00
|
|
|
columnId: 'actions',
|
|
|
|
compare: (a, b) => {
|
2023-05-13 15:36:30 +00:00
|
|
|
return a.isDownloading ? 0 : a.isLocal ? -1 : 1;
|
2023-05-06 12:17:39 +00:00
|
|
|
},
|
|
|
|
renderHeaderCell: () => {
|
|
|
|
return 'Actions';
|
|
|
|
},
|
|
|
|
renderCell: (item) => {
|
|
|
|
return (
|
|
|
|
<TableCellLayout>
|
2023-05-13 12:15:18 +00:00
|
|
|
<div className="flex gap-1">
|
2023-05-13 15:36:30 +00:00
|
|
|
{
|
|
|
|
item.isLocal &&
|
|
|
|
<ToolTipButton desc="Open Folder" icon={<Folder20Regular/>} onClick={() => {
|
|
|
|
OpenFileFolder(`.\\${manifest.localModelPath}\\${item.name}`);
|
|
|
|
}}/>
|
|
|
|
}
|
|
|
|
{item.downloadUrl && !item.isLocal &&
|
|
|
|
<ToolTipButton desc="Download" icon={<ArrowDownload20Regular/>} onClick={() => {
|
|
|
|
DownloadFile(`./${manifest.localModelPath}/${item.name}`, item.downloadUrl!);
|
|
|
|
}}/>}
|
|
|
|
{item.url && <ToolTipButton desc="Open Url" icon={<Open20Regular/>} onClick={() => {
|
|
|
|
BrowserOpenURL(item.url!);
|
|
|
|
}}/>}
|
2023-05-13 12:15:18 +00:00
|
|
|
</div>
|
2023-05-06 12:17:39 +00:00
|
|
|
</TableCellLayout>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
})
|
|
|
|
];
|
2023-05-05 15:23:34 +00:00
|
|
|
|
2023-05-13 12:15:18 +00:00
|
|
|
export const Models: FC = observer(() => {
|
2023-05-05 15:23:34 +00:00
|
|
|
return (
|
2023-05-13 12:15:18 +00:00
|
|
|
<div className="flex flex-col gap-2 p-2 h-full">
|
|
|
|
<Text size={600}>Models</Text>
|
2023-05-06 12:17:39 +00:00
|
|
|
<div className="flex flex-col gap-1">
|
|
|
|
<div className="flex justify-between">
|
2023-05-13 12:15:18 +00:00
|
|
|
<Text weight="medium">Model Source Manifest List</Text>
|
2023-05-06 12:17:39 +00:00
|
|
|
<ToolTipButton desc="Refresh" icon={<ArrowClockwise20Regular/>}/>
|
|
|
|
</div>
|
2023-05-13 12:15:18 +00:00
|
|
|
<Text size={100}>Provide JSON file URLs for the models manifest. Separate URLs with semicolons. The "models"
|
|
|
|
field in JSON files will be parsed into the following table.</Text>
|
2023-05-06 12:17:39 +00:00
|
|
|
<Textarea size="large" resize="vertical"
|
2023-05-13 12:15:18 +00:00
|
|
|
defaultValue={commonStore.modelSourceManifestList}
|
|
|
|
onChange={(e, data) => commonStore.setModelSourceManifestList(data.value)}/>
|
2023-05-06 12:17:39 +00:00
|
|
|
</div>
|
2023-05-13 12:15:18 +00:00
|
|
|
<div className="flex grow overflow-hidden">
|
|
|
|
<DataGrid
|
|
|
|
items={commonStore.modelSourceList}
|
|
|
|
columns={columns}
|
|
|
|
sortable={true}
|
|
|
|
style={{display: 'flex'}}
|
|
|
|
className="flex-col"
|
|
|
|
>
|
|
|
|
<DataGridHeader>
|
|
|
|
<DataGridRow>
|
|
|
|
{({renderHeaderCell}) => (
|
|
|
|
<DataGridHeaderCell>{renderHeaderCell()}</DataGridHeaderCell>
|
2023-05-06 12:17:39 +00:00
|
|
|
)}
|
|
|
|
</DataGridRow>
|
2023-05-13 12:15:18 +00:00
|
|
|
</DataGridHeader>
|
|
|
|
<div className="overflow-y-auto overflow-x-hidden">
|
|
|
|
<DataGridBody<ModelSourceItem>>
|
|
|
|
{({item, rowId}) => (
|
|
|
|
<DataGridRow<ModelSourceItem> key={rowId}>
|
|
|
|
{({renderCell}) => (
|
|
|
|
<DataGridCell>{renderCell(item)}</DataGridCell>
|
|
|
|
)}
|
|
|
|
</DataGridRow>
|
|
|
|
)}
|
|
|
|
</DataGridBody>
|
|
|
|
</div>
|
|
|
|
</DataGrid>
|
|
|
|
</div>
|
2023-05-05 15:23:34 +00:00
|
|
|
</div>
|
|
|
|
);
|
2023-05-13 12:15:18 +00:00
|
|
|
});
|