@lijian-ui/dsh-file-manager 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/client.js +310 -267
- package/lib/client.js.map +1 -1
- package/lib/tsconfig.client.tsbuildinfo +1 -1
- package/lib/types/client/FilePanelDockItem.d.ts.map +1 -1
- package/lib/types/client/index.d.ts.map +1 -1
- package/lib/types/client/locales.d.ts +21 -0
- package/lib/types/client/locales.d.ts.map +1 -1
- package/lib/types/client/mount.d.ts +2 -1
- package/lib/types/client/mount.d.ts.map +1 -1
- package/lib/types/client/picker/FilePickerModal.d.ts.map +1 -1
- package/lib/types/client/store.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/client/FilePanelDockItem.tsx +2 -1
- package/src/client/index.ts +8 -2
- package/src/client/locales.ts +46 -0
- package/src/client/mount.tsx +18 -2
- package/src/client/picker/FilePickerModal.tsx +15 -14
- package/src/client/preview/PreviewPanel.tsx +1 -1
- package/src/client/store.ts +2 -1
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* failure degrades the panels, never the GUI boot.
|
|
6
6
|
* @module dsh-filemgr/client/mount
|
|
7
7
|
*/
|
|
8
|
+
import type { LocaleFace } from '@deepseek-ai/dsh-client-ui-slots';
|
|
8
9
|
import type { PanelStores } from './store.ts';
|
|
9
10
|
import type { FileReferenceSelection } from './preview/selection.ts';
|
|
10
11
|
/**
|
|
@@ -18,5 +19,5 @@ import type { FileReferenceSelection } from './preview/selection.ts';
|
|
|
18
19
|
* a preview selection (path + start/end line).
|
|
19
20
|
* @returns a disposer unmounting both trees.
|
|
20
21
|
*/
|
|
21
|
-
export declare function mountPanels(stores: PanelStores, onToggleExplorer: () => void, onReference: (path: string, isDir: boolean) => void, onAddFileReference: (selection: FileReferenceSelection) => boolean): () => void;
|
|
22
|
+
export declare function mountPanels(stores: PanelStores, onToggleExplorer: () => void, onReference: (path: string, isDir: boolean) => void, onAddFileReference: (selection: FileReferenceSelection) => boolean, locale: LocaleFace): () => void;
|
|
22
23
|
//# sourceMappingURL=mount.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../../../src/client/mount.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../../../src/client/mount.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAG7C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAuCpE;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,WAAW,EACnB,gBAAgB,EAAE,MAAM,IAAI,EAC5B,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,EACnD,kBAAkB,EAAE,CAAC,SAAS,EAAE,sBAAsB,KAAK,OAAO,EAClE,MAAM,EAAE,UAAU,GACjB,MAAM,IAAI,CAmBZ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilePickerModal.d.ts","sourceRoot":"","sources":["../../../../src/client/picker/FilePickerModal.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAE3E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"FilePickerModal.d.ts","sourceRoot":"","sources":["../../../../src/client/picker/FilePickerModal.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAE3E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAqB7D,2EAA2E;AAC3E,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,OAAO,CAAA;CACf;AAED,kEAAkE;AAClE,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,GAAG,EACH,QAAQ,EACR,OAAO,GACR,EAAE;IACD,KAAK,EAAE,SAAS,CAAA;IAChB,GAAG,EAAE,QAAQ,CAAA;IACb,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAA;IACvC,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAuQrB;AAoBD,wFAAwF;AACxF,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAOnG;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IAAE,GAAG,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,QAAQ,CAAA;CAAE,GAAG,GAAG,CAAC,OAAO,CAmJ/F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/client/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAY,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACvG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/client/store.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lijian-ui/dsh-file-manager",
|
|
3
3
|
"description": "DSH web GUI right-panel system: a pixel-faithful re-implementation of FileManager's Explorer + Preview columns (file tree, filename search, git changes, multi-tab preview of 10+ formats) driven by real host-side fs/git services, hot-pluggable via a profile bundle without any dsh source changes",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.1",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
7
7
|
"types": "lib/types/index.d.ts",
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import { useEffect, useState, type ReactElement } from 'react'
|
|
15
15
|
import { DockItem } from './DockItem.tsx'
|
|
16
|
+
import { t } from './locales.ts'
|
|
16
17
|
|
|
17
18
|
const EV = {
|
|
18
19
|
toggleFile: 'dsh-dock:toggle-filepanel',
|
|
@@ -29,7 +30,7 @@ export function FilePanelDockItem(): ReactElement {
|
|
|
29
30
|
return (
|
|
30
31
|
<DockItem
|
|
31
32
|
active={active}
|
|
32
|
-
label=
|
|
33
|
+
label={t('dock.filePanel.label')}
|
|
33
34
|
onClick={() => window.dispatchEvent(new CustomEvent(EV.toggleFile))}
|
|
34
35
|
>
|
|
35
36
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
|
package/src/client/index.ts
CHANGED
|
@@ -27,7 +27,7 @@ import { FileManagerSettingsCard, FileManagerSettingsCardController, type FileMa
|
|
|
27
27
|
import { PanelLayoutController } from './layout.ts'
|
|
28
28
|
import { createPanelStores, layoutSetRoot } from './store.ts'
|
|
29
29
|
import { mountPanels } from './mount.tsx'
|
|
30
|
-
import { NS, dictionaries, setLanguage, type FileManagerPanelKey } from './locales.ts'
|
|
30
|
+
import { NS, dictionaries, setLanguage, bindT, type FileManagerPanelKey } from './locales.ts'
|
|
31
31
|
import { DragFileInlay, type DragFileInjected } from './drag/DragFileInlay.tsx'
|
|
32
32
|
import { insertPathIntoDraft } from './drag/file-drag.ts'
|
|
33
33
|
import { MermaidChatEnhancer } from './chat/mermaid-chat.tsx'
|
|
@@ -97,6 +97,12 @@ export function apply(ctx: ClientContext): void {
|
|
|
97
97
|
|
|
98
98
|
ctx.effect(() => ctx.locale.register(NS, dictionaries), 'dsh-filemgr: dictionaries')
|
|
99
99
|
|
|
100
|
+
// Bind the reactive translate function from the locale service so every
|
|
101
|
+
// `t()` call reads the active locale at call time (same mechanism as
|
|
102
|
+
// session-cleaner / im-gateway). The legacy `currentLanguage` + `setLanguage`
|
|
103
|
+
// path in locales.ts remains as a fallback.
|
|
104
|
+
bindT(ctx.locale.bind(NS))
|
|
105
|
+
|
|
100
106
|
// The `file` reference source: registers the codec that serializes file
|
|
101
107
|
// chips on submit (`@path:lines`), which the shell requires before any
|
|
102
108
|
// `slash/input-insert-reference` chip can send. Inert as a menu
|
|
@@ -352,7 +358,7 @@ export function apply(ctx: ClientContext): void {
|
|
|
352
358
|
// Mount everything. DOM failures degrade the panels, never the GUI.
|
|
353
359
|
try {
|
|
354
360
|
layout.mount()
|
|
355
|
-
mountPanels(stores, () => layout.toggleExplorer(), onReference, onAddFileReference)
|
|
361
|
+
mountPanels(stores, () => layout.toggleExplorer(), onReference, onAddFileReference, ctx.locale)
|
|
356
362
|
} catch (error) {
|
|
357
363
|
console.error('[dsh-filemgr] mount failed:', error)
|
|
358
364
|
}
|
package/src/client/locales.ts
CHANGED
|
@@ -110,6 +110,23 @@ const zh = {
|
|
|
110
110
|
'settings.unsaved': '未保存',
|
|
111
111
|
'settings.saveFailed': '部署未接受这些值,已保留供你修改。',
|
|
112
112
|
'settings.invalidNumber': '请输入数字,留空则使用默认值。',
|
|
113
|
+
|
|
114
|
+
// ── FilePanelDockItem.tsx ──
|
|
115
|
+
'dock.filePanel.label': '文件面板',
|
|
116
|
+
|
|
117
|
+
// ── PreviewPanel.tsx ──
|
|
118
|
+
'preview.addToChat': '添加到对话',
|
|
119
|
+
|
|
120
|
+
// ── FilePickerModal.tsx ──
|
|
121
|
+
'picker.title': '引用项目文件',
|
|
122
|
+
'picker.searchPlaceholder': '搜索工作区文件…',
|
|
123
|
+
'picker.loading': '加载中…',
|
|
124
|
+
'picker.emptyDir': '(空目录)',
|
|
125
|
+
'picker.emptySelection': '选择文件或目录(可多选)',
|
|
126
|
+
'picker.insert': '插入',
|
|
127
|
+
'picker.removeAria': '移除',
|
|
128
|
+
'picker.clearAria': '清空',
|
|
129
|
+
'picker.closeAria': '关闭',
|
|
113
130
|
} as const
|
|
114
131
|
|
|
115
132
|
const en: Record<keyof typeof zh, string> = {
|
|
@@ -217,6 +234,18 @@ const en: Record<keyof typeof zh, string> = {
|
|
|
217
234
|
'settings.unsaved': 'Unsaved',
|
|
218
235
|
'settings.saveFailed': 'The deployment rejected these values; your edits are kept.',
|
|
219
236
|
'settings.invalidNumber': 'Enter a number, or leave it empty to use the default.',
|
|
237
|
+
|
|
238
|
+
'dock.filePanel.label': 'File Panel',
|
|
239
|
+
'preview.addToChat': 'Add to Chat',
|
|
240
|
+
'picker.title': 'Reference Project Files',
|
|
241
|
+
'picker.searchPlaceholder': 'Search workspace files…',
|
|
242
|
+
'picker.loading': 'Loading…',
|
|
243
|
+
'picker.emptyDir': '(empty directory)',
|
|
244
|
+
'picker.emptySelection': 'Select files or directories (multi-select)',
|
|
245
|
+
'picker.insert': 'Insert',
|
|
246
|
+
'picker.removeAria': 'Remove',
|
|
247
|
+
'picker.clearAria': 'Clear',
|
|
248
|
+
'picker.closeAria': 'Close',
|
|
220
249
|
}
|
|
221
250
|
|
|
222
251
|
export type FileManagerPanelKey = keyof typeof zh
|
|
@@ -239,8 +268,25 @@ export function setLanguage(language: string): void {
|
|
|
239
268
|
currentLanguage = language === 'en' ? 'en' : 'zh'
|
|
240
269
|
}
|
|
241
270
|
|
|
271
|
+
/**
|
|
272
|
+
* Reactive translate function bound by the client entry via
|
|
273
|
+
* `ctx.locale.bind(NS)`. When set, `t` delegates to it so every call reads
|
|
274
|
+
* the active locale at call time (re-evaluated on each render). This is the
|
|
275
|
+
* same mechanism session-cleaner / im-gateway use; the legacy
|
|
276
|
+
* `currentLanguage` + `setLanguage` path remains as a fallback for any code
|
|
277
|
+
* path that runs before `bindT` is called.
|
|
278
|
+
*/
|
|
279
|
+
import type { TranslateNS } from '@deepseek-ai/dsh-client-ui-slots'
|
|
280
|
+
|
|
281
|
+
let _boundT: TranslateNS<'filemgr'> | null = null
|
|
282
|
+
|
|
283
|
+
export function bindT(t: TranslateNS<'filemgr'>): void {
|
|
284
|
+
_boundT = t
|
|
285
|
+
}
|
|
286
|
+
|
|
242
287
|
/** Translate one key with optional params. */
|
|
243
288
|
export function t(key: FileManagerPanelKey, params?: Record<string, string | number>): string {
|
|
289
|
+
if (_boundT !== null) return _boundT(key, params)
|
|
244
290
|
const table = dictionaries[currentLanguage] ?? zh
|
|
245
291
|
const template = table[key] ?? zh[key]
|
|
246
292
|
return params === undefined ? template : format(template, params)
|
package/src/client/mount.tsx
CHANGED
|
@@ -6,12 +6,27 @@
|
|
|
6
6
|
* @module dsh-filemgr/client/mount
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
|
+
import { useSyncExternalStore, type ReactElement } from 'react'
|
|
9
10
|
import { createRoot, type Root } from 'react-dom/client'
|
|
11
|
+
import type { LocaleFace } from '@deepseek-ai/dsh-client-ui-slots'
|
|
10
12
|
import type { PanelStores } from './store.ts'
|
|
11
13
|
import { ExplorerPanel } from './components/ExplorerPanel.tsx'
|
|
12
14
|
import { PreviewPanel } from './preview/PreviewPanel.tsx'
|
|
13
15
|
import type { FileReferenceSelection } from './preview/selection.ts'
|
|
14
16
|
|
|
17
|
+
/**
|
|
18
|
+
* Wrapper that subscribes to locale revision so createRoot-mounted panels
|
|
19
|
+
* re-render on language switch (slot outlets do this automatically via
|
|
20
|
+
* useLocaleRevision; createRoot trees must opt in explicitly).
|
|
21
|
+
*/
|
|
22
|
+
function LocaleAwareRoot({ children, locale }: { children: ReactElement; locale: LocaleFace }): ReactElement {
|
|
23
|
+
useSyncExternalStore(
|
|
24
|
+
(cb: () => void) => locale.subscribe(cb),
|
|
25
|
+
() => locale.getSnapshot().revision,
|
|
26
|
+
)
|
|
27
|
+
return children
|
|
28
|
+
}
|
|
29
|
+
|
|
15
30
|
const EXPLORER_COL_SELECTOR = '[data-filemgr-explorer-col]'
|
|
16
31
|
const PREVIEW_COL_SELECTOR = '[data-filemgr-preview-col]'
|
|
17
32
|
|
|
@@ -52,6 +67,7 @@ export function mountPanels(
|
|
|
52
67
|
onToggleExplorer: () => void,
|
|
53
68
|
onReference: (path: string, isDir: boolean) => void,
|
|
54
69
|
onAddFileReference: (selection: FileReferenceSelection) => boolean,
|
|
70
|
+
locale: LocaleFace,
|
|
55
71
|
): () => void {
|
|
56
72
|
let explorerRoot: Root | undefined
|
|
57
73
|
let previewRoot: Root | undefined
|
|
@@ -59,11 +75,11 @@ export function mountPanels(
|
|
|
59
75
|
|
|
60
76
|
disposers.push(waitForElement(EXPLORER_COL_SELECTOR, (el) => {
|
|
61
77
|
explorerRoot = createRoot(el)
|
|
62
|
-
explorerRoot.render(<ExplorerPanel stores={stores} onToggleCollapse={onToggleExplorer} onReference={onReference}
|
|
78
|
+
explorerRoot.render(<LocaleAwareRoot locale={locale}><ExplorerPanel stores={stores} onToggleCollapse={onToggleExplorer} onReference={onReference} /></LocaleAwareRoot>)
|
|
63
79
|
}))
|
|
64
80
|
disposers.push(waitForElement(PREVIEW_COL_SELECTOR, (el) => {
|
|
65
81
|
previewRoot = createRoot(el)
|
|
66
|
-
previewRoot.render(<PreviewPanel stores={stores} onAddFileReference={onAddFileReference}
|
|
82
|
+
previewRoot.render(<LocaleAwareRoot locale={locale}><PreviewPanel stores={stores} onAddFileReference={onAddFileReference} /></LocaleAwareRoot>)
|
|
67
83
|
}))
|
|
68
84
|
|
|
69
85
|
return () => {
|
|
@@ -23,6 +23,7 @@ import type { PanelApi } from '../api.ts'
|
|
|
23
23
|
import { filePicker, type PickState } from './file-picker.ts'
|
|
24
24
|
import { ChevronDownIcon, ChevronRightIcon, CloseIcon, FileIcon, FolderIcon, FolderOpenIcon, SearchIcon } from '../components/icons.tsx'
|
|
25
25
|
import { appendToDraft, insertFileReference, type RefSpan } from '../reference.ts'
|
|
26
|
+
import { t } from '../locales.ts'
|
|
26
27
|
import pickerCss from '../styles/picker.module.css'
|
|
27
28
|
|
|
28
29
|
/** Debounce for the workspace search box. */
|
|
@@ -194,9 +195,9 @@ export function FilePickerModal({
|
|
|
194
195
|
{isDir && isOpen && (
|
|
195
196
|
<div>
|
|
196
197
|
{isLoading ? (
|
|
197
|
-
<div className={pickerCss.note} style={{ paddingLeft: 8 + (depth + 1) * 16 }}
|
|
198
|
+
<div className={pickerCss.note} style={{ paddingLeft: 8 + (depth + 1) * 16 }}>{t('picker.loading')}</div>
|
|
198
199
|
) : children.length === 0 ? (
|
|
199
|
-
<div className={pickerCss.note} style={{ paddingLeft: 8 + (depth + 1) * 16 }}
|
|
200
|
+
<div className={pickerCss.note} style={{ paddingLeft: 8 + (depth + 1) * 16 }}>{t('picker.emptyDir')}</div>
|
|
200
201
|
) : (
|
|
201
202
|
children.map((child) => renderNode(child, depth + 1))
|
|
202
203
|
)}
|
|
@@ -218,8 +219,8 @@ export function FilePickerModal({
|
|
|
218
219
|
<div className={pickerCss.modal} onClick={(e) => e.stopPropagation()}>
|
|
219
220
|
<div className={pickerCss.header}>
|
|
220
221
|
<div className={pickerCss.titleRow}>
|
|
221
|
-
<span className={pickerCss.title}
|
|
222
|
-
<button type="button" className={pickerCss.closeBtn} onClick={onClose} aria-label=
|
|
222
|
+
<span className={pickerCss.title}>{t('picker.title')}</span>
|
|
223
|
+
<button type="button" className={pickerCss.closeBtn} onClick={onClose} aria-label={t('picker.closeAria')}>
|
|
223
224
|
<CloseIcon size={16} />
|
|
224
225
|
</button>
|
|
225
226
|
</div>
|
|
@@ -227,13 +228,13 @@ export function FilePickerModal({
|
|
|
227
228
|
<span className={pickerCss.searchIcon}><SearchIcon size={14} /></span>
|
|
228
229
|
<input
|
|
229
230
|
className={pickerCss.searchInput}
|
|
230
|
-
placeholder=
|
|
231
|
+
placeholder={t('picker.searchPlaceholder')}
|
|
231
232
|
value={search}
|
|
232
233
|
onChange={(e) => setSearch(e.target.value)}
|
|
233
234
|
autoFocus
|
|
234
235
|
/>
|
|
235
236
|
{search !== '' && (
|
|
236
|
-
<button type="button" className={pickerCss.searchClear} onClick={() => setSearch('')} aria-label=
|
|
237
|
+
<button type="button" className={pickerCss.searchClear} onClick={() => setSearch('')} aria-label={t('picker.clearAria')}>
|
|
237
238
|
<CloseIcon size={13} />
|
|
238
239
|
</button>
|
|
239
240
|
)}
|
|
@@ -244,9 +245,9 @@ export function FilePickerModal({
|
|
|
244
245
|
<div className={pickerCss.body}>
|
|
245
246
|
{searchResults !== null ? (
|
|
246
247
|
searching ? (
|
|
247
|
-
<div className={pickerCss.note}
|
|
248
|
+
<div className={pickerCss.note}>{t('explorer.search.searching')}</div>
|
|
248
249
|
) : searchResults.length === 0 ? (
|
|
249
|
-
<div className={pickerCss.note}
|
|
250
|
+
<div className={pickerCss.note}>{t('explorer.search.empty')}</div>
|
|
250
251
|
) : (
|
|
251
252
|
searchResults.map((hit) => {
|
|
252
253
|
const isSel = selected.has(hit.path)
|
|
@@ -276,9 +277,9 @@ export function FilePickerModal({
|
|
|
276
277
|
})
|
|
277
278
|
)
|
|
278
279
|
) : rootLoading ? (
|
|
279
|
-
<div className={pickerCss.note}
|
|
280
|
+
<div className={pickerCss.note}>{t('picker.loading')}</div>
|
|
280
281
|
) : rootEntries.length === 0 ? (
|
|
281
|
-
<div className={pickerCss.note}
|
|
282
|
+
<div className={pickerCss.note}>{t('picker.emptyDir')}</div>
|
|
282
283
|
) : (
|
|
283
284
|
rootEntries.map((entry) => tree(entry, 0))
|
|
284
285
|
)}
|
|
@@ -287,7 +288,7 @@ export function FilePickerModal({
|
|
|
287
288
|
<div className={pickerCss.footer}>
|
|
288
289
|
<div className={pickerCss.chips}>
|
|
289
290
|
{selectedList.length === 0 ? (
|
|
290
|
-
<span className={pickerCss.chipsEmpty}
|
|
291
|
+
<span className={pickerCss.chipsEmpty}>{t('picker.emptySelection')}</span>
|
|
291
292
|
) : (
|
|
292
293
|
selectedList.map((pick) => (
|
|
293
294
|
<span key={pick.path} className={pickerCss.chip}>
|
|
@@ -296,7 +297,7 @@ export function FilePickerModal({
|
|
|
296
297
|
type="button"
|
|
297
298
|
className={pickerCss.chipX}
|
|
298
299
|
onClick={() => toggleSelect(pick.path, pick.isDir)}
|
|
299
|
-
aria-label=
|
|
300
|
+
aria-label={t('picker.removeAria')}
|
|
300
301
|
>
|
|
301
302
|
<CloseIcon size={11} />
|
|
302
303
|
</button>
|
|
@@ -305,14 +306,14 @@ export function FilePickerModal({
|
|
|
305
306
|
)}
|
|
306
307
|
</div>
|
|
307
308
|
<div className={pickerCss.footerActions}>
|
|
308
|
-
<button type="button" className={pickerCss.cancelBtn} onClick={onClose}
|
|
309
|
+
<button type="button" className={pickerCss.cancelBtn} onClick={onClose}>{t('common.cancel')}</button>
|
|
309
310
|
<button
|
|
310
311
|
type="button"
|
|
311
312
|
className={pickerCss.insertBtn}
|
|
312
313
|
disabled={selectedList.length === 0}
|
|
313
314
|
onClick={() => onInsert(selectedList)}
|
|
314
315
|
>
|
|
315
|
-
|
|
316
|
+
{t('picker.insert')}{selectedList.length > 0 ? ` (${selectedList.length})` : ''}
|
|
316
317
|
</button>
|
|
317
318
|
</div>
|
|
318
319
|
</div>
|
package/src/client/store.ts
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
import type { FileRead, FsEntry, GitStatusView, PreviewContentType, SearchHit } from '../core/types.ts'
|
|
14
14
|
import type { PanelApi } from './api.ts'
|
|
15
15
|
import { detectContentType, isTextType, pdfPreviewUrl, tabIdOf } from './fileType.ts'
|
|
16
|
+
import { t } from './locales.ts'
|
|
16
17
|
import {
|
|
17
18
|
createDebounced, evictPreviewScopes, readJson, readStoredNumber, writeJson, writeStoredNumber,
|
|
18
19
|
} from './persist.ts'
|
|
@@ -1133,7 +1134,7 @@ export function createPreviewStore(api: PanelApi): PreviewStore {
|
|
|
1133
1134
|
...item,
|
|
1134
1135
|
loading: false,
|
|
1135
1136
|
error: result.error.code === 'write-conflict'
|
|
1136
|
-
? '
|
|
1137
|
+
? t('preview.saveConflict')
|
|
1137
1138
|
: result.error.message,
|
|
1138
1139
|
}
|
|
1139
1140
|
}
|