Skip to content

Commit 469b54f

Browse files
authored
feat: Added the ability to mount hard drives (#143)
* fix(admin-client): 修改游标遍历方向为降序 * feat(fs): 添加挂载功能 * fix(文件管理器): 移除已挂载磁盘缓存并改进挂载逻辑 * refactor(fs): 重构 indexedDB 操作以支持错误处理和单例模式 * feat(fs): 添加挂载文件夹功能支持 * feat(fs): 实现挂载文件系统的get方法 * feat(文件管理器): 添加本地文件夹图标和支持挂载模式 * feat(fs): 添加卸载挂载点功能 * fix(文件管理器): 修复远程文件处理和挂载功能 * feat(文件系统): 添加对挂载文件系统的支持并优化错误提示 * refactor(fs): 重构文件系统挂载相关代码 * fix(sw): 修正拼写错误,将resposeMountedFs改为responseMountedFs * feat(用户模块): 添加获取挂载信息功能 * Delete mount.js * fix(fs): 将挂载路径分隔符从冒号改为大于号 * fix(sw): 修正文件挂载路径的正则表达式匹配问题 * chore: bump version --------- Co-authored-by: huang yao <5945154+kirakiray@users.noreply.github.com>
1 parent ba78447 commit 469b54f

File tree

24 files changed

+584
-127
lines changed

24 files changed

+584
-127
lines changed

dist/hashes.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

dist/packages.zip

5.18 KB
Binary file not shown.

others/apps/admin/pages/record-backup.html

Lines changed: 0 additions & 79 deletions
This file was deleted.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "noneos",
3-
"version": "3.2.12",
3+
"version": "3.2.13",
44
"description": "A browser-based operating system",
55
"type": "module",
66
"scripts": {

packages/apps/file-manager.napp/comps/bottom-address.html

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,24 @@
8989
remoteRoot: 1,
9090
});
9191

92-
arr.push({
93-
name: rootName,
94-
kind: "dir",
95-
path: e,
96-
});
92+
// 挂载模式
93+
if (rootName.startsWith("$mount-")) {
94+
// 挂载模式
95+
const [mark, reRootName] = rootName.split(">");
96+
97+
arr.push({
98+
name: reRootName,
99+
kind: "folder-local",
100+
path: e,
101+
});
102+
} else {
103+
arr.push({
104+
name: rootName,
105+
kind: "dir",
106+
path: e,
107+
});
108+
}
109+
97110
continue;
98111
}
99112
}

packages/apps/file-manager.napp/comps/file-explore.html

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@
107107
{{$data.name}}
108108
</p-menu-item>
109109
</o-fill>
110-
<p-menu-item on:click="openWith('web')">
110+
<p-menu-item on:click="openWith('web')" attr:disabled="isRemote">
111111
<n-local-icon name="tab" slot="prefix"></n-local-icon>
112112
Web
113113
</p-menu-item>
@@ -269,6 +269,9 @@
269269
apps: [], // 所有可用的应用列表
270270
},
271271
proto: {
272+
get isRemote() {
273+
return this.path.startsWith("$user-");
274+
},
272275
async createDir() {
273276
debugger;
274277
},
@@ -311,7 +314,11 @@
311314
const selectedData = this.selecteds[0];
312315

313316
if (data === "web") {
314-
window.open("$" + selectedData.path);
317+
if (selectedData.path.startsWith("$mount-")) {
318+
window.open("/" + encodeURI(selectedData.path));
319+
return;
320+
}
321+
window.open("/$" + encodeURI(selectedData.path));
315322
return;
316323
}
317324

packages/apps/file-manager.napp/comps/handle-block.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@
4242
<o-else-if :value="kind === 'dir'">
4343
<img src="../sources/list-folder.svg" />
4444
</o-else-if>
45+
<o-else-if :value="kind === 'folder-local'">
46+
<img src="../sources/folder-local.svg" />
47+
</o-else-if>
4548
<o-else>
4649
<img src="../sources/list-file.svg" />
4750
</o-else>

packages/apps/file-manager.napp/outer-layout.html

Lines changed: 115 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
<l-m src="/packages/comps/user-avatar.html"></l-m>
99
<l-m src="/packages/comps/user-name.html"></l-m>
1010
<l-m src="/packages/comps/user-state.html"></l-m>
11+
<l-m src="/packages/pui/button/button.html"></l-m>
1112
<style>
1213
:host {
1314
display: block;
@@ -46,6 +47,10 @@
4647
.left-bottom {
4748
margin-top: auto;
4849
}
50+
51+
.hide {
52+
display: none !important;
53+
}
4954
</style>
5055
<n-horsp-pannel on:open-dialog="openDialog">
5156
<div slot="left" class="left-con">
@@ -63,6 +68,32 @@
6368
<o-fill :value="locals" name="path-item"> </o-fill>
6469
</p-list>
6570
</p-list-item>
71+
<o-if :value="showMounted">
72+
<p-list-item collapse-childs="open" button="suffix">
73+
<localized-content style="font-size: 13px; font-weight: 600">
74+
<span lang="cn">本机文件夹</span>
75+
<span lang="en">Local Folder</span>
76+
<span lang="ja">ローカルフォルダ</span>
77+
</localized-content>
78+
<i toggle-collapse triangle slot="suffix"></i>
79+
<p-list slot="childs">
80+
<o-fill :value="mounted" name="path-item" fill-key="path">
81+
</o-fill>
82+
<p-list-item button on:click="mountTab">
83+
<n-local-icon
84+
slot="prefix"
85+
name="add"
86+
style="padding-left: var(--padding-left, 8px)"
87+
></n-local-icon>
88+
<localized-content>
89+
<span lang="cn">添加</span>
90+
<span lang="en">Add</span>
91+
<span lang="ja">追加</span>
92+
</localized-content>
93+
</p-list-item>
94+
</p-list>
95+
</p-list-item>
96+
</o-if>
6697
<p-list-item collapse-childs="open" button="suffix">
6798
<span style="font-size: 13px; font-weight: 600">
6899
<localized-content>
@@ -131,6 +162,19 @@
131162
style="padding-left: var(--padding-left, 8px)"
132163
></n-local-icon>
133164
{{$data.name}}
165+
166+
<p-button
167+
class:hide="!$data.isLocalMount"
168+
on:click="$host.unmountTab($data,$event)"
169+
size="mini"
170+
variant="text"
171+
color="normal"
172+
style="z-index: 3"
173+
slot="suffix"
174+
icon
175+
>
176+
<n-local-icon name="eject"></n-local-icon>
177+
</p-button>
134178
</p-list-item>
135179
</template>
136180
<p-dialog :open="showErrorDialog" on:click-mask="showErrorDialog=false">
@@ -140,7 +184,10 @@
140184

141185
<script>
142186
export default async ({ load, url }) => {
143-
const { get } = await load("/packages/fs/main.js");
187+
const { get, mount, getMounted, unmount } = await load(
188+
"/packages/fs/main.js"
189+
);
190+
const { confirm } = await load("/packages/pui/util.js");
144191

145192
const { getLocalized } = await load("/packages/i18n/localized-object.js");
146193

@@ -190,13 +237,57 @@
190237
],
191238
selectedRootName: null, // 选中的目录的名称
192239
remotes: [], // 远端设备
240+
mounted: [], // 挂载的设备
193241
showErrorDialog: false,
194242
dialogData: {
195243
title: "",
196244
content: "",
197245
},
246+
showMounted: !!window.showDirectoryPicker, // 是否展示挂载的设备
198247
},
199248
proto: {
249+
async unmountTab(data, event) {
250+
event.stopPropagation();
251+
252+
const result = await confirm({
253+
title: await getLocalized({
254+
cn: "确认卸载",
255+
en: "Confirm Unmount",
256+
ja: "アンマウントを確認",
257+
}),
258+
content: await getLocalized({
259+
cn: `是否确认卸载 ${data.name}?`,
260+
en: `Are you sure to unmount ${data.name}?`,
261+
ja: `${data.name} をアンマウントしますか?`,
262+
}),
263+
});
264+
265+
if (!result) {
266+
return;
267+
}
268+
269+
await unmount(data.id);
270+
this.loadMounted();
271+
},
272+
async mountTab() {
273+
await mount({
274+
save: true,
275+
});
276+
277+
this.loadMounted();
278+
},
279+
async loadMounted() {
280+
const mounted = await getMounted();
281+
this.mounted = mounted.map((e) => {
282+
return {
283+
id: e.id,
284+
name: e.name,
285+
path: e.path,
286+
icon: "ssd",
287+
isLocalMount: true,
288+
};
289+
});
290+
},
200291
openDialog(e) {
201292
this.showErrorDialog = true;
202293
this.dialogData.title = e.data.title;
@@ -214,6 +305,7 @@
214305
},
215306
},
216307
async ready() {
308+
this.loadMounted();
217309
const isSafari =
218310
navigator.userAgent.includes("Safari") &&
219311
!navigator.userAgent.includes("Chrome");
@@ -279,6 +371,28 @@
279371
},
280372
];
281373
}
374+
375+
// 获取对方挂载信息
376+
remoteUser.getMounted().then((mounteds) => {
377+
mounteds.forEach((mounted) => {
378+
if (
379+
!targetItem.dirs.some((d) => d.path === mounted.path)
380+
) {
381+
targetItem.dirs.push({
382+
icon: "ssd",
383+
name: mounted.name,
384+
path: mounted.path,
385+
});
386+
} else {
387+
const targetDir = targetItem.dirs.find(
388+
(d) => d.path === mounted.path
389+
);
390+
if (targetDir) {
391+
targetDir.name = mounted.name;
392+
}
393+
}
394+
});
395+
});
282396
} else {
283397
if (targetItem && targetItem.dirs.length) {
284398
targetItem.dirs = [];
Lines changed: 1 addition & 0 deletions
Loading
Lines changed: 1 addition & 0 deletions
Loading

0 commit comments

Comments
 (0)