Skip to content

Commit a55b05d

Browse files
committed
feat(file-browser): Add parent directory navigation item to list view
Add a dedicated '..' list tile at the top of directory listings to provide explicit one-level-up navigation. Update list template (`src/pages/fileBrowser/list.hbs`): - Render parent directory tile ('..') when `prevDir` flag is active - Adjust handlebars conditionals for message displays and item list loop Handle `prevDir` action in file browser (`src/pages/fileBrowser/fileBrowser.js`): - Add `prevDir` action handler navigating to `navStack.get(-2)` - Pass `prevDir` condition check (`navStack.length >= 2`) into list render template - Ignore context menu actions triggered on the `prevDir` item Adjust layout styling (`src/pages/fileBrowser/fileBrowser.scss`): - Adjust height calculation for message and spinner containers when `prevDir` item is visible (AI generated commit message)
1 parent 208c1df commit a55b05d

3 files changed

Lines changed: 70 additions & 33 deletions

File tree

src/pages/fileBrowser/fileBrowser.js

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,23 +1011,24 @@ function FileBrowserInclude(mode, info, doesOpenLast = true) {
10111011
return;
10121012
}
10131013

1014-
if (isContextMenu) action = "contextmenu";
1015-
else if (isOpenDoc) action = "openDoc";
1014+
if (isContextMenu) return contextMenuHandler();
1015+
if (isOpenDoc) action = "openDoc";
10161016

10171017
switch (action) {
10181018
case "navigation":
10191019
folder();
10201020
break;
1021-
case "contextmenu":
1022-
contextMenuHandler();
1023-
break;
10241021
case "open":
10251022
if (isDir) folder();
10261023
else if (!$el.hasAttribute("disabled")) file();
10271024
break;
10281025
case "openDoc":
10291026
openDoc();
10301027
break;
1028+
case "prevDir": {
1029+
const dir = navStack.get(-2);
1030+
if (dir) navigate(dir);
1031+
}
10311032
}
10321033

10331034
async function folder() {
@@ -1080,6 +1081,7 @@ function FileBrowserInclude(mode, info, doesOpenLast = true) {
10801081
}
10811082

10821083
async function contextMenuHandler() {
1084+
if (action === "prevDir") return;
10831085
if (appSettings.value.vibrateOnTap) {
10841086
navigator.vibrate(config.VIBRATION_TIME);
10851087
}
@@ -1726,13 +1728,22 @@ function FileBrowserInclude(mode, info, doesOpenLast = true) {
17261728
currentDir = dir;
17271729
updatePasteToggler();
17281730

1731+
const hasPrevDir = navStack.length >= 2;
17291732
let $placeholder;
17301733
let errMsg;
17311734
let { list } = dir;
17321735
if (!list) {
1733-
$placeholder = helpers.parseHTML(mustache.render(_list, {}));
1736+
$placeholder = helpers.parseHTML(
1737+
mustache.render(_list, {
1738+
prevDir: hasPrevDir,
1739+
}),
1740+
);
17341741
$placeholder.classList.add("placeholder");
1735-
$placeholder.innerHTML = `<span id="spinner">${createTailSpinSvg()}</span>`;
1742+
$placeholder.insertAdjacentHTML(
1743+
"beforeend",
1744+
`<span id="spinner">${createTailSpinSvg()}</span>`,
1745+
);
1746+
/** @type {HTMLSpanElement} */
17361747
$content.appendChild($placeholder);
17371748

17381749
try {
@@ -1766,6 +1777,7 @@ function FileBrowserInclude(mode, info, doesOpenLast = true) {
17661777

17671778
const $list = helpers.parseHTML(
17681779
mustache.render(_list, {
1780+
prevDir: hasPrevDir,
17691781
msg: errMsg ?? (!list?.length && strings["empty folder message"]),
17701782
list,
17711783
}),

src/pages/fileBrowser/fileBrowser.scss

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,18 @@
8989
height: calc(100% - 60px);
9090
overflow-y: auto;
9191

92-
> #spinner {
92+
> :is(#msg, #spinner) {
9393
pointer-events: none;
9494
width: 100%;
9595
height: 100%;
9696
display: flex;
9797
align-items: center;
9898
justify-content: center;
99+
font-weight: bold;
100+
text-align: center;
101+
}
102+
&:has(> [data-action="prevDir"]) > :is(#msg, #spinner) {
103+
height: calc(100% - 45px);
99104
}
100105

101106
.tile {

src/pages/fileBrowser/list.hbs

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,49 @@
1-
<ul class="list" id="list" empty-msg="{{msg}}">{{#list}}
2-
{{#.}}
3-
<li
4-
tabindex="1"
5-
class="tile {{#isLink}}symlink{{/isLink}}"
6-
data-action="open"
7-
data-type="{{type}}"
8-
data-name="{{name}}"
9-
{{#home}}data-home="{{.}}"{{/home}}
10-
{{#notSelectable}}data-not-selectable{{/notSelectable}}
11-
{{#openDoc}}data-open-doc{{/openDoc}}
12-
{{#ftpAccount}}data-ftp-account{{/ftpAccount}}
13-
{{#uuid}}data-uuid="{{uuid}}"{{/uuid}}
14-
{{#storageType}}data-storage-type="{{.}}"{{/storageType}}
15-
{{#disabled}}disabled{{/disabled}}
16-
>
17-
<span
18-
class="icon {{icon}} {{#uuid}}user-added-storage{{/uuid}}"
1+
<ul class="list" id="list">
2+
{{#prevDir}}
3+
<li
4+
tabindex="1"
5+
class="tile"
6+
data-action="prevDir"
7+
data-not-selectable
8+
>
9+
<span class="icon"></span>
10+
<div class="text">
11+
<span>..</span>
12+
</div>
13+
</li>
14+
{{/prevDir}}
15+
{{^list}}
16+
{{#msg}}
17+
<div id="msg">{{.}}</div>
18+
{{/msg}}
19+
{{/list}}
20+
{{#list}}
21+
{{#.}}
22+
<li
23+
tabindex="1"
24+
class="tile {{#isLink}}symlink{{/isLink}}"
25+
data-action="open"
26+
data-type="{{type}}"
27+
data-name="{{name}}"
28+
{{#home}}data-home="{{.}}"{{/home}}
29+
{{#notSelectable}}data-not-selectable{{/notSelectable}}
30+
{{#oneDirUp}}data-one-dir-up{{/oneDirUp}}
31+
{{#openDoc}}data-open-doc{{/openDoc}}
32+
{{#ftpAccount}}data-ftp-account{{/ftpAccount}}
33+
{{#uuid}}data-uuid="{{.}}"{{/uuid}}
1934
{{#storageType}}data-storage-type="{{.}}"{{/storageType}}
20-
></span>
35+
{{#disabled}}disabled{{/disabled}}
36+
>
37+
<span
38+
class="icon {{icon}} {{#uuid}}user-added-storage{{/uuid}}"
39+
{{#storageType}}data-storage-type="{{.}}"{{/storageType}}
40+
></span>
2141

22-
<div class="text">
23-
<span>{{name}}</span>
24-
</div>
25-
<data-url>{{url}}</data-url>
26-
</li>
27-
{{/.}}
42+
<div class="text">
43+
<span>{{name}}</span>
44+
</div>
45+
<data-url>{{url}}</data-url>
46+
</li>
47+
{{/.}}
2848
{{/list}}
2949
</ul>

0 commit comments

Comments
 (0)