diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..70a14370c --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "workbench.colorCustomizations": { + "activityBar.background": "#0D3607", + "titleBar.activeBackground": "#134B09", + "titleBar.activeForeground": "#F2FDF0" + } +} diff --git a/package.json b/package.json index 8cfe46837..7b3e25c83 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,8 @@ "scripts": { "start": "cross-env NODE_ENV=development electron ./build/main.js", "test": "rm -rf ./test/tmp/* && mocha -r espower-typescript/guess -r tsconfig-paths/register \"test/**/*.test.ts\"", - "clean:dist": "rimraf ./dist/*", - "clean:build": "rimraf ./build/*", + "clean:dist": "rimraf ./dist", + "clean:build": "rimraf ./build", "dev": "npm run clean:build && concurrently \"npm run dev:main\" \"npm run dev:renderer\"", "dev:main": "vite build --watch --config ./vite.main.config.mts", "dev:renderer": "vite --config ./vite.render.config.mts", diff --git a/src/common/events.ts b/src/common/events.ts index f93bf7550..753722ec6 100644 --- a/src/common/events.ts +++ b/src/common/events.ts @@ -6,6 +6,7 @@ export default { active_main_window: 'active_main_window', add_new: 'add_new', + import_folder: 'import_folder', browser_link: 'browser_link', close_find: 'close_find', cmd_run_result: 'cmd_run_result', diff --git a/src/common/i18n/languages/de.ts b/src/common/i18n/languages/de.ts index 499514925..1cf42b7ad 100644 --- a/src/common/i18n/languages/de.ts +++ b/src/common/i18n/languages/de.ts @@ -53,6 +53,7 @@ const lang: LanguageDict = { find_and_replace: 'Suchen und ersetzen', find_history: 'Verlauf suchen', folder: 'Ordner', + folder_import: 'Import ordner', front: 'Vorderseite', general: 'Allgemein', group: 'Gruppe', diff --git a/src/common/i18n/languages/en.ts b/src/common/i18n/languages/en.ts index a3be9a393..6b9cbc9a3 100644 --- a/src/common/i18n/languages/en.ts +++ b/src/common/i18n/languages/en.ts @@ -52,6 +52,7 @@ export default { find_and_replace: 'Find and replace', find_history: 'Find history', folder: 'Folder', + folder_import: 'Import folder', front: 'Front', general: 'General', group: 'Group', diff --git a/src/common/i18n/languages/fr.ts b/src/common/i18n/languages/fr.ts index 2ac758057..f80a491d8 100644 --- a/src/common/i18n/languages/fr.ts +++ b/src/common/i18n/languages/fr.ts @@ -53,6 +53,7 @@ const lang: LanguageDict = { find_and_replace: 'Rechercher et remplacer', find_history: 'Historique des recherches', folder: 'Dossier', + folder_import: 'Importer dossier', front: 'Front', general: 'Général', group: 'Groupe', diff --git a/src/common/i18n/languages/ja.ts b/src/common/i18n/languages/ja.ts index 9fb1ea823..526fb92a1 100644 --- a/src/common/i18n/languages/ja.ts +++ b/src/common/i18n/languages/ja.ts @@ -53,6 +53,7 @@ const lang: LanguageDict = { find_and_replace: '検索と置換', find_history: '検索履歴', folder: 'フォルダー', + folder_import: 'フォルダーをインポート', front: '前面', general: '一般', group: 'グループ', diff --git a/src/common/i18n/languages/ko.ts b/src/common/i18n/languages/ko.ts index 7bf70639f..f3ac30d35 100644 --- a/src/common/i18n/languages/ko.ts +++ b/src/common/i18n/languages/ko.ts @@ -51,6 +51,7 @@ export default { find_and_replace: '찾기 및 바꾸기', find_history: '이력 찾기', folder: '폴더', + folder_import: '가져오기 폴더', front: '앞쪽', general: '일반', group: '그룹', diff --git a/src/common/i18n/languages/tr.ts b/src/common/i18n/languages/tr.ts index 9a0cec956..a3c0a3543 100644 --- a/src/common/i18n/languages/tr.ts +++ b/src/common/i18n/languages/tr.ts @@ -50,6 +50,7 @@ export default { find_and_replace: 'Bul ve Değiştir', find_history: 'Arama Geçmişi', folder: 'Klasör', + folder_import: 'İçe Aktar Klasör', front: 'Ön', general: 'Genel', group: 'Grup', diff --git a/src/common/i18n/languages/zh-hant.ts b/src/common/i18n/languages/zh-hant.ts index 04de02f56..28de042cd 100644 --- a/src/common/i18n/languages/zh-hant.ts +++ b/src/common/i18n/languages/zh-hant.ts @@ -52,6 +52,7 @@ const lang: LanguageDict = { find_and_replace: '尋找並替換', find_history: '尋找歷史', folder: '資料夾', + folder_import: '匯入資料夾', front: '前置', general: '一般', group: '群組', diff --git a/src/common/i18n/languages/zh.ts b/src/common/i18n/languages/zh.ts index 12431bf5c..402594464 100644 --- a/src/common/i18n/languages/zh.ts +++ b/src/common/i18n/languages/zh.ts @@ -52,6 +52,7 @@ const lang: LanguageDict = { find_and_replace: '查找并替换', find_history: '查找历史', folder: '文件夹', + folder_import: '导入文件夹', front: '前置', general: '通用', group: '组合', diff --git a/src/main/actions/index.ts b/src/main/actions/index.ts index 6ada6d217..08757182c 100644 --- a/src/main/actions/index.ts +++ b/src/main/actions/index.ts @@ -63,4 +63,5 @@ export { default as migrateCheck } from './migrate/checkIfMigration' export { default as migrateData } from './migrate/migrateData' export { default as exportData } from './migrate/export' export { default as importData } from './migrate/import' +export { default as importFolder } from './migrate/importFolder' export { default as importDataFromUrl } from './migrate/importFromUrl' diff --git a/src/main/actions/migrate/importFolder.ts b/src/main/actions/migrate/importFolder.ts new file mode 100644 index 000000000..f7a3e3512 --- /dev/null +++ b/src/main/actions/migrate/importFolder.ts @@ -0,0 +1,54 @@ +/** + * import + * @author: oldj + * @homepage: https://oldj.net + */ + +import importV3Data from '@main/actions/migrate/importV3Data' +import getI18N from '@main/core/getI18N' +import { swhdb } from '@main/data' +import { dialog } from 'electron' +import { promises as fs } from 'fs' +import _ from 'lodash' +import { IHostsContentObject, IHostsListObject } from '../../../common/data' + +export default async (): Promise => { + let { lang } = await getI18N() + + let result = await dialog.showOpenDialog({ + title: lang.import, + defaultPath: global.last_path, + filters: [ + { name: 'JSON', extensions: ['json'] }, + { name: 'All Files', extensions: ['*'] }, + ], + properties: ['openFile'], + }) + + if (result.canceled) { + return null + } + + let paths = result.filePaths + let fn = paths[0] + let content = await fs.readFile(fn, 'utf-8') + + let data: { hosts: IHostsContentObject[], tree: IHostsListObject[] }; + try { + data = JSON.parse(content) + } catch (e) { + console.error(e) + return 'parse_error' + } + + await swhdb.collection.hosts.rebuildIndexes(); + for (const item of data.hosts) { + await swhdb.collection.hosts.insert(item); + } + + for (const item of data.tree) { + await swhdb.list.tree.push(item); + } + + return true +} diff --git a/src/renderer/components/EditHostsInfo.tsx b/src/renderer/components/EditHostsInfo.tsx index 8089a493c..966d1b5f0 100644 --- a/src/renderer/components/EditHostsInfo.tsx +++ b/src/renderer/components/EditHostsInfo.tsx @@ -43,7 +43,7 @@ import styles from './EditHostsInfo.module.scss' const EditHostsInfo = () => { const { lang } = useI18n() const [hosts, setHosts] = useState(null) - const { hosts_data, setList, current_hosts, setCurrentHosts } = useHostsData() + const { hosts_data, setList, current_hosts, setCurrentHosts, loadHostsData } = useHostsData() const [is_show, setIsShow] = useState(false) const [is_add, setIsAdd] = useState(true) const [is_refreshing, setIsRefreshing] = useState(false) @@ -116,6 +116,32 @@ const EditHostsInfo = () => { setIsShow(true) }) + useOnBroadcast(events.import_folder, async () => { + let r = await actions.importFolder() + if (r === null) { + return + } else if (r === true) { + toast({ + status: 'success', + description: lang.import_done, + isClosable: true, + }) + await loadHostsData() + setCurrentHosts(null) + } else { + let description = lang.import_fail + if (typeof r === 'string') { + description += ` [${r}]` + } + + toast({ + status: 'error', + description, + isClosable: true, + }) + } + }) + useOnBroadcast( events.hosts_refreshed, (_hosts: IHostsListObject) => { diff --git a/src/renderer/components/LeftPanel/index.tsx b/src/renderer/components/LeftPanel/index.tsx index 4f5419b5d..afd2d64f1 100644 --- a/src/renderer/components/LeftPanel/index.tsx +++ b/src/renderer/components/LeftPanel/index.tsx @@ -29,6 +29,12 @@ const Index = (props: Props) => { agent.broadcast(events.add_new) }, }, + { + label: lang.folder_import, + click() { + agent.broadcast(events.import_folder) + }, + }, ]) return (