Skip to content

Commit 45188d0

Browse files
committed
fix up context menus
1 parent 67d072c commit 45188d0

3 files changed

Lines changed: 67 additions & 58 deletions

File tree

frontend/app/view/preview/preview-directory-utils.tsx

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
// Copyright 2025, Command Line Inc.
1+
// Copyright 2026, Command Line Inc.
22
// SPDX-License-Identifier: Apache-2.0
33

4-
import { globalStore } from "@/app/store/global";
4+
import { getSettingsKeyAtom, globalStore } from "@/app/store/global";
55
import { RpcApi } from "@/app/store/wshclientapi";
66
import { TabRpcClient } from "@/app/store/wshrpcutil";
77
import { fireAndForget, isBlank } from "@/util/util";
@@ -152,3 +152,56 @@ export function handleFileDelete(
152152
model.refreshCallback();
153153
});
154154
}
155+
156+
export function makeDirectoryDefaultMenuItems(model: PreviewModel): ContextMenuItem[] {
157+
const defaultSort = globalStore.get(getSettingsKeyAtom("preview:defaultsort")) ?? "name";
158+
const showHiddenFiles = globalStore.get(model.showHiddenFiles) ?? true;
159+
return [
160+
{
161+
label: "Directory Sort Order",
162+
submenu: [
163+
{
164+
label: "Name",
165+
type: "checkbox",
166+
checked: defaultSort === "name",
167+
click: () =>
168+
fireAndForget(() => RpcApi.SetConfigCommand(TabRpcClient, { "preview:defaultsort": "name" })),
169+
},
170+
{
171+
label: "Last Modified",
172+
type: "checkbox",
173+
checked: defaultSort === "modtime",
174+
click: () =>
175+
fireAndForget(() =>
176+
RpcApi.SetConfigCommand(TabRpcClient, { "preview:defaultsort": "modtime" })
177+
),
178+
},
179+
],
180+
},
181+
{
182+
label: "Show Hidden Files",
183+
submenu: [
184+
{
185+
label: "On",
186+
type: "checkbox",
187+
checked: showHiddenFiles,
188+
click: () => {
189+
globalStore.set(model.showHiddenFiles, true);
190+
fireAndForget(() => RpcApi.SetConfigCommand(TabRpcClient, { "preview:showhiddenfiles": true }));
191+
},
192+
},
193+
{
194+
label: "Off",
195+
type: "checkbox",
196+
checked: !showHiddenFiles,
197+
click: () => {
198+
globalStore.set(model.showHiddenFiles, false);
199+
fireAndForget(() =>
200+
RpcApi.SetConfigCommand(TabRpcClient, { "preview:showhiddenfiles": false })
201+
);
202+
},
203+
},
204+
],
205+
},
206+
];
207+
}

frontend/app/view/preview/preview-directory.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import {
3939
handleFileDelete,
4040
handleRename,
4141
isIconValid,
42+
makeDirectoryDefaultMenuItems,
4243
mergeError,
4344
overwriteError,
4445
} from "./preview-directory-utils";
@@ -159,9 +160,7 @@ function DirectoryTable({
159160
sortingFn: "alphanumeric",
160161
}),
161162
columnHelper.accessor("modtime", {
162-
cell: (info) => (
163-
<span className="dir-table-lastmod">{getLastModifiedTime(info.getValue())}</span>
164-
),
163+
cell: (info) => <span className="dir-table-lastmod">{getLastModifiedTime(info.getValue())}</span>,
165164
header: () => <span>Last Modified</span>,
166165
size: 91,
167166
minSize: 65,
@@ -409,6 +408,13 @@ function TableBody({
409408
];
410409
addOpenMenuItems(menu, conn, finfo);
411410
menu.push(
411+
{
412+
type: "separator",
413+
},
414+
{
415+
label: "Default Settings",
416+
submenu: makeDirectoryDefaultMenuItems(model),
417+
},
412418
{
413419
type: "separator",
414420
},

frontend/app/view/preview/preview-model.tsx

Lines changed: 3 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { loadable } from "jotai/utils";
2020
import type * as MonacoTypes from "monaco-editor";
2121
import { createRef } from "react";
2222
import { PreviewView } from "./preview";
23+
import { makeDirectoryDefaultMenuItems } from "./preview-directory-utils";
2324

2425
// TODO drive this using config
2526
const BOOKMARKS: { label: string; path: string }[] = [
@@ -795,60 +796,9 @@ export class PreviewModel implements ViewModel {
795796
});
796797
}
797798
if (loadableSV.state == "hasData" && loadableSV.data.specializedView == "directory") {
798-
const defaultSort = globalStore.get(getSettingsKeyAtom("preview:defaultsort")) ?? "name";
799-
const showHiddenFiles = globalStore.get(this.showHiddenFiles) ?? true;
800799
menuItems.push({ type: "separator" });
801-
menuItems.push({ label: "Directory Defaults", enabled: false });
802-
menuItems.push({
803-
label: "Sort Order",
804-
submenu: [
805-
{
806-
label: "Name",
807-
type: "checkbox",
808-
checked: defaultSort === "name",
809-
click: () =>
810-
fireAndForget(() =>
811-
RpcApi.SetConfigCommand(TabRpcClient, { "preview:defaultsort": "name" })
812-
),
813-
},
814-
{
815-
label: "Last Modified",
816-
type: "checkbox",
817-
checked: defaultSort === "modtime",
818-
click: () =>
819-
fireAndForget(() =>
820-
RpcApi.SetConfigCommand(TabRpcClient, { "preview:defaultsort": "modtime" })
821-
),
822-
},
823-
],
824-
});
825-
menuItems.push({
826-
label: "Show Hidden Files",
827-
submenu: [
828-
{
829-
label: "On",
830-
type: "checkbox",
831-
checked: showHiddenFiles,
832-
click: () => {
833-
globalStore.set(this.showHiddenFiles, true);
834-
fireAndForget(() =>
835-
RpcApi.SetConfigCommand(TabRpcClient, { "preview:showhiddenfiles": true })
836-
);
837-
},
838-
},
839-
{
840-
label: "Off",
841-
type: "checkbox",
842-
checked: !showHiddenFiles,
843-
click: () => {
844-
globalStore.set(this.showHiddenFiles, false);
845-
fireAndForget(() =>
846-
RpcApi.SetConfigCommand(TabRpcClient, { "preview:showhiddenfiles": false })
847-
);
848-
},
849-
},
850-
],
851-
});
800+
menuItems.push({ label: "Default Settings", enabled: false });
801+
menuItems.push(...makeDirectoryDefaultMenuItems(this));
852802
}
853803
return menuItems;
854804
}

0 commit comments

Comments
 (0)