dsh-group-status 0.5.0 → 0.5.2
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/CHANGELOG.md +117 -0
- package/README.en.md +138 -133
- package/README.md +140 -133
- package/docs/facet-protocol.md +274 -0
- package/docs/media/glyph-completed.svg +3 -0
- package/docs/media/glyph-pending.svg +3 -0
- package/docs/media/glyph-running.svg +6 -0
- package/docs/media/screenshot-folders.png +0 -0
- package/docs/media/screenshot-hover.png +0 -0
- package/docs/upgrading.md +241 -0
- package/lib/client.js +1197 -1159
- package/lib/client.js.map +1 -1
- package/lib/index.js +31 -4
- package/lib/types/build-stamp.d.ts +4 -0
- package/lib/types/build-stamp.d.ts.map +1 -0
- package/lib/types/build-stamp.js +23 -0
- package/lib/types/build-stamp.js.map +1 -0
- package/lib/types/client/BadgeSettingsCard.js +3 -3
- package/lib/types/client/BadgeSettingsCard.js.map +1 -1
- package/lib/types/client/group-status.d.ts +5 -0
- package/lib/types/client/group-status.d.ts.map +1 -1
- package/lib/types/client/group-status.js +25 -0
- package/lib/types/client/group-status.js.map +1 -1
- package/lib/types/client/locales.d.ts +4 -0
- package/lib/types/client/locales.d.ts.map +1 -1
- package/lib/types/client/locales.js +4 -0
- package/lib/types/client/locales.js.map +1 -1
- package/lib/types/client/navigation.d.ts +23 -8
- package/lib/types/client/navigation.d.ts.map +1 -1
- package/lib/types/client/navigation.js +20 -3
- package/lib/types/client/navigation.js.map +1 -1
- package/lib/types/client/rows/EmptySessions.d.ts +4 -0
- package/lib/types/client/rows/EmptySessions.d.ts.map +1 -0
- package/lib/types/client/rows/EmptySessions.js +10 -0
- package/lib/types/client/rows/EmptySessions.js.map +1 -0
- package/lib/types/client/rows/ListView.d.ts +24 -0
- package/lib/types/client/rows/ListView.d.ts.map +1 -0
- package/lib/types/client/rows/ListView.js +81 -0
- package/lib/types/client/rows/ListView.js.map +1 -0
- package/lib/types/client/rows/SessionTree.d.ts +4 -0
- package/lib/types/client/rows/SessionTree.d.ts.map +1 -0
- package/lib/types/client/rows/SessionTree.js +381 -0
- package/lib/types/client/rows/SessionTree.js.map +1 -0
- package/lib/types/client/rows/ViewOptionsMenu.d.ts +14 -0
- package/lib/types/client/rows/ViewOptionsMenu.d.ts.map +1 -0
- package/lib/types/client/rows/ViewOptionsMenu.js +50 -0
- package/lib/types/client/rows/ViewOptionsMenu.js.map +1 -0
- package/lib/types/client/rows/WorkspaceBrowser.d.ts +0 -5
- package/lib/types/client/rows/WorkspaceBrowser.d.ts.map +1 -1
- package/lib/types/client/rows/WorkspaceBrowser.js +7 -557
- package/lib/types/client/rows/WorkspaceBrowser.js.map +1 -1
- package/lib/types/client/rows/browser-shared.d.ts +105 -0
- package/lib/types/client/rows/browser-shared.d.ts.map +1 -0
- package/lib/types/client/rows/browser-shared.js +93 -0
- package/lib/types/client/rows/browser-shared.js.map +1 -0
- package/lib/types/client/session-actions/derived.d.ts.map +1 -1
- package/lib/types/client/session-actions/derived.js +13 -2
- package/lib/types/client/session-actions/derived.js.map +1 -1
- package/lib/types/client/session-watermarks.d.ts +6 -1
- package/lib/types/client/session-watermarks.d.ts.map +1 -1
- package/lib/types/client/session-watermarks.js +31 -11
- package/lib/types/client/session-watermarks.js.map +1 -1
- package/lib/types/client/toast/register.d.ts.map +1 -1
- package/lib/types/client/toast/register.js +102 -132
- package/lib/types/client/toast/register.js.map +1 -1
- package/lib/types/host-contract.d.ts +15 -1
- package/lib/types/host-contract.d.ts.map +1 -1
- package/lib/types/host-contract.js +47 -4
- package/lib/types/host-contract.js.map +1 -1
- package/lib/types/index.d.ts +6 -3
- package/lib/types/index.d.ts.map +1 -1
- package/lib/types/index.js +10 -4
- package/lib/types/index.js.map +1 -1
- package/package.json +17 -3
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/** The two wide-only list bodies: the flat single-list view and the search results view. */
|
|
3
|
+
import { useMemo, useRef, useState } from 'react';
|
|
4
|
+
import clsx from 'clsx';
|
|
5
|
+
import { HoverCardGroup } from '@deepseek-ai/dsh-client-ui-primitives';
|
|
6
|
+
import { deriveFlat, deriveSearchResults } from "../tree.js";
|
|
7
|
+
import { SearchResultItem, SessionNodeItem } from "./Rows.js";
|
|
8
|
+
import { AnimatedRows } from "./AnimatedRows.js";
|
|
9
|
+
import { FLAT_SESSION_ORDER_KEY } from "../stores.js";
|
|
10
|
+
import css from './WorkspaceBrowser.module.css';
|
|
11
|
+
import { mainViewSessionId, sessionDragOrder, useNativeDragAcceptance, } from "./browser-shared.js";
|
|
12
|
+
import { EmptySessions } from "./EmptySessions.js";
|
|
13
|
+
/** The flat "In one list" body: every session is one draggable top-level row. */
|
|
14
|
+
export function FlatList({ list, sessionIds, rowState, onLeaveArchivedOnly, useSessionStatus, open, onSessionRenameRequest, usePanelInfo, setSessionOrder, workspaceReady, animationResetKey, revealSessionId, onSessionRevealed, renderSlot, t, }) {
|
|
15
|
+
const panelActive = usePanelInfo(info => info.activePanelId !== null);
|
|
16
|
+
const statuses = useSessionStatus(s => s);
|
|
17
|
+
const rows = useMemo(() => deriveFlat(list, sessionIds, rowState, statuses), [list, sessionIds, rowState, statuses]);
|
|
18
|
+
const [drag, setDrag] = useState(null);
|
|
19
|
+
const dropCommitted = useRef(false);
|
|
20
|
+
useNativeDragAcceptance(drag !== null);
|
|
21
|
+
const mainViewId = useMemo(() => mainViewSessionId(list), [list]);
|
|
22
|
+
const currentId = panelActive ? undefined : mainViewId;
|
|
23
|
+
const commitDrag = (activeDrag, over) => {
|
|
24
|
+
if (dropCommitted.current)
|
|
25
|
+
return;
|
|
26
|
+
dropCommitted.current = true;
|
|
27
|
+
setDrag(null);
|
|
28
|
+
const nextOrder = sessionDragOrder(sessionIds, rows, activeDrag, over);
|
|
29
|
+
if (nextOrder !== undefined)
|
|
30
|
+
setSessionOrder(FLAT_SESSION_ORDER_KEY, nextOrder);
|
|
31
|
+
};
|
|
32
|
+
const now = Date.now();
|
|
33
|
+
return (_jsxs(HoverCardGroup, { className: clsx(css.treeBody, css.wide), children: [_jsxs(AnimatedRows, { className: clsx(css.list, css.flatList), label: t('section.sessions'), rowKeys: rows.length === 0 ? ['empty'] : rows.map(row => `session:${row.id}`), ready: list.phase === 'ready' && workspaceReady && drag === null, resetKey: animationResetKey, children: [rows.length === 0 && (_jsx(EmptySessions, { rowState: rowState, onLeaveArchivedOnly: onLeaveArchivedOnly, t: t })), rows.map((node) => {
|
|
34
|
+
const active = drag !== null && drag.pinned === node.pinned;
|
|
35
|
+
const normalizeHalf = (half) => node.blank ? 'after' : half;
|
|
36
|
+
return (_jsx(SessionNodeItem, { node: node, currentId: currentId, now: now, onOpen: open, onRenameRequest: onSessionRenameRequest, renderSlot: renderSlot, onReveal: node.id === revealSessionId
|
|
37
|
+
? () => { onSessionRevealed(node.id); }
|
|
38
|
+
: undefined, drag: {
|
|
39
|
+
start: () => {
|
|
40
|
+
dropCommitted.current = false;
|
|
41
|
+
setDrag({ accountKey: FLAT_SESSION_ORDER_KEY, sessionId: node.id, pinned: node.pinned, over: null });
|
|
42
|
+
},
|
|
43
|
+
active,
|
|
44
|
+
marker: active && drag.over?.id === node.id ? drag.over.half : null,
|
|
45
|
+
hover: (half) => {
|
|
46
|
+
setDrag(current => current === null ? current : {
|
|
47
|
+
...current, over: { id: node.id, half: normalizeHalf(half) },
|
|
48
|
+
});
|
|
49
|
+
},
|
|
50
|
+
drop: (half) => {
|
|
51
|
+
if (drag !== null)
|
|
52
|
+
commitDrag(drag, { id: node.id, half: normalizeHalf(half) });
|
|
53
|
+
},
|
|
54
|
+
end: () => {
|
|
55
|
+
if (drag?.over !== null && drag?.over !== undefined)
|
|
56
|
+
commitDrag(drag, drag.over);
|
|
57
|
+
else
|
|
58
|
+
setDrag(null);
|
|
59
|
+
dropCommitted.current = false;
|
|
60
|
+
},
|
|
61
|
+
}, t: t }, node.id));
|
|
62
|
+
})] }), _jsx("span", { className: css.fade })] }));
|
|
63
|
+
}
|
|
64
|
+
/** Flat search body: local metadata matches plus the current Host result page. */
|
|
65
|
+
export function SearchResults({ useSessions, useSessionStatus, open, onUnarchive, workspaces, archivedSessionIds, archivedFilter, query, remote, resultLimit, usePanelInfo, t, }) {
|
|
66
|
+
const panelActive = usePanelInfo(info => info.activePanelId !== null);
|
|
67
|
+
const list = useSessions(s => s);
|
|
68
|
+
const statuses = useSessionStatus(s => s);
|
|
69
|
+
const currentRemote = remote.query === query
|
|
70
|
+
? remote
|
|
71
|
+
: { query, status: 'loading', items: [], hasMore: false };
|
|
72
|
+
const results = useMemo(() => deriveSearchResults(list, workspaces, query, archivedSessionIds, archivedFilter, statuses, currentRemote, resultLimit), [list, workspaces, query, archivedSessionIds, archivedFilter, statuses, currentRemote, resultLimit]);
|
|
73
|
+
const pending = currentRemote.status === 'loading';
|
|
74
|
+
const mainViewId = useMemo(() => mainViewSessionId(list), [list]);
|
|
75
|
+
const currentId = panelActive ? undefined : mainViewId;
|
|
76
|
+
return (_jsxs("div", { className: clsx(css.treeBody, css.wide), children: [_jsxs("div", { className: css.list, children: [_jsx("div", { className: css.searchTree, role: "tree", "aria-label": t('search.results.aria'), "aria-busy": pending, children: results.items.map(result => (_jsx(SearchResultItem, { result: result, currentId: currentId, onOpen: open, onUnarchive: onUnarchive, t: t }, result.id))) }), pending && (
|
|
77
|
+
/* Two skeleton rows on an empty list, one when local matches already
|
|
78
|
+
show and only the content hits are outstanding. */
|
|
79
|
+
_jsx("div", { role: "status", "aria-label": t('search.pending'), children: (results.items.length === 0 ? [0, 1] : [0]).map(i => (_jsxs("div", { className: css.skeletonRow, "aria-hidden": "true", children: [_jsx("span", { className: css.skeletonDot }), _jsxs("span", { className: css.skeletonBars, children: [_jsx("span", { className: css.skeletonBar }), _jsx("span", { className: clsx(css.skeletonBar, css.skeletonBarWide) })] })] }, i))) })), !pending && results.items.length === 0 && (_jsx("div", { className: css.empty, role: "status", children: t('search.noMatches') })), results.hasMore && (_jsx("div", { className: css.searchStatus, role: "status", children: t('search.hasMore', { n: resultLimit }) }))] }), _jsx("span", { className: css.fade })] }));
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=ListView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ListView.js","sourceRoot":"","sources":["../../../../src/client/rows/ListView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type SessionTreeProps } from './browser-shared.ts';
|
|
2
|
+
/** The scrolling session tree; unmounting drops the sessions subscription and local row limits. */
|
|
3
|
+
export declare function SessionTree({ list, useSessionStatus, startSession, open, workspaces, ungroupedSessionIds, rowState, onLeaveArchivedOnly, workspaceReady, animationResetKey, usePanelInfo, onRenameRequest, onDeleteRequest, onSessionRenameRequest, renderSlot, insertWorkspaceBefore, nestWorkspaces, groupExpansion, setGroupExpanded, setSessionOrder, home, t, revealSessionId, onSessionRevealed, shortcuts, useBadgeSettings, }: SessionTreeProps): import("react").JSX.Element;
|
|
4
|
+
//# sourceMappingURL=SessionTree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionTree.d.ts","sourceRoot":"","sources":["../../../../src/client/rows/SessionTree.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAEW,KAAK,gBAAgB,EACtC,MAAM,qBAAqB,CAAA;AAW5B,mGAAmG;AACnG,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EAAE,gBAAgB,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,mBAAmB,EAC3E,QAAQ,EAAE,mBAAmB,EAC7B,cAAc,EAAE,iBAAiB,EAAE,YAAY,EAC/C,eAAe,EAAE,eAAe,EAAE,sBAAsB,EACxD,UAAU,EACV,qBAAqB,EACrB,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAChD,eAAe,EAAE,IAAI,EAAE,CAAC,EACxB,eAAe,EAAE,iBAAiB,EAAE,SAAS,EAAE,gBAAgB,GAChE,EAAE,gBAAgB,+BA2ZlB"}
|
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* The scrolling session tree: Workspace groups, aggregated live-status badges,
|
|
4
|
+
* watermarks, and row drag ordering.
|
|
5
|
+
*
|
|
6
|
+
* Split out of `WorkspaceBrowser.tsx` so the shell keeps only the header, search
|
|
7
|
+
* box, and dialogs; this file owns the tree body and its local row limits, and
|
|
8
|
+
* unmounting it drops both the sessions subscription and those limits.
|
|
9
|
+
*/
|
|
10
|
+
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
11
|
+
import clsx from 'clsx';
|
|
12
|
+
import { HoverCardGroup } from '@deepseek-ai/dsh-client-ui-primitives';
|
|
13
|
+
import { deriveGroups, owningGroupKey, owningParentFolder, UNGROUPED_KEY } from "../tree.js";
|
|
14
|
+
import { directStatusesForGroups, withAggregatedStatus } from "../group-status.js";
|
|
15
|
+
import { raiseWatermarks, requiredWatermark, SESSION_WATERMARK_BASE, watermarkRows } from "../session-watermarks.js";
|
|
16
|
+
import { facetStore } from "../facet-store.js";
|
|
17
|
+
import { useRegisteredFacets } from "../use-registered-facets.js";
|
|
18
|
+
import { ProjectRowItem, SessionNodeItem } from "./Rows.js";
|
|
19
|
+
import { AnimatedRows } from "./AnimatedRows.js";
|
|
20
|
+
import css from './WorkspaceBrowser.module.css';
|
|
21
|
+
import { mainViewSessionId, sessionDragOrder, useNativeDragAcceptance, workspaceGroupHalf, } from "./browser-shared.js";
|
|
22
|
+
import { EmptySessions } from "./EmptySessions.js";
|
|
23
|
+
// 外部状态来源:**本文件不认识任何具体插件**。运行时只有登记面(`../facets.ts`)与
|
|
24
|
+
// 它背后的存储订阅;谁想让自己的状态进折叠徽标,就按协议注册一个 facet
|
|
25
|
+
// (`docs/facet-protocol.md`)。现有两家已各自注册,本插件不再代管任何来源。
|
|
26
|
+
//
|
|
27
|
+
// 这里只经 `useRegisteredFacets` 订阅一次外部存储,与 facet 数量无关,所以增删来源不会
|
|
28
|
+
// 改变 hook 调用序列(那正是逐个调 provider hook 的写法做不到的);登记面本身**迟到**也
|
|
29
|
+
// 照样生效,理由与踩过的坑写在那个文件里。本插件不再筛外部来源:登记面即所见。
|
|
30
|
+
const facetsStore = facetStore();
|
|
31
|
+
/** The scrolling session tree; unmounting drops the sessions subscription and local row limits. */
|
|
32
|
+
export function SessionTree({ list, useSessionStatus, startSession, open, workspaces, ungroupedSessionIds, rowState, onLeaveArchivedOnly, workspaceReady, animationResetKey, usePanelInfo, onRenameRequest, onDeleteRequest, onSessionRenameRequest, renderSlot, insertWorkspaceBefore, nestWorkspaces, groupExpansion, setGroupExpanded, setSessionOrder, home, t, revealSessionId, onSessionRevealed, shortcuts, useBadgeSettings, }) {
|
|
33
|
+
const panelActive = usePanelInfo(info => info.activePanelId !== null);
|
|
34
|
+
// 徽标设置:**本插件自己**那三档会话状态的显隐、悬停明细、数字样式。
|
|
35
|
+
const badgeSettings = useBadgeSettings(settings => settings);
|
|
36
|
+
const statuses = useSessionStatus(s => s);
|
|
37
|
+
// 外部状态:订阅 + 读登记面,在 `useRegisteredFacets` 里一次做完。这里刻意**不**自己
|
|
38
|
+
// 摊开那两行:登记面是运行时增删的(提供方在自己的 apply 里注册,宿主不保证它早于本
|
|
39
|
+
// 组件首渲染),而 memo 的依赖里必须有版本号,否则订阅只换来一次重渲染、算的却还是
|
|
40
|
+
// 上一次的登记面——「注册成功了却永远不进徽标」。推导过程与回归用例见
|
|
41
|
+
// `../use-registered-facets.ts`。外部来源的显隐不归本插件管:来源不注册就是不显示。
|
|
42
|
+
const facets = useRegisteredFacets(facetsStore);
|
|
43
|
+
const mainViewId = useMemo(() => mainViewSessionId(list), [list]);
|
|
44
|
+
const current = panelActive ? undefined : mainViewId;
|
|
45
|
+
const revealGroup = revealSessionId === undefined || !workspaceReady
|
|
46
|
+
? undefined
|
|
47
|
+
: owningGroupKey(workspaces, revealSessionId);
|
|
48
|
+
const [storedWatermarks, setStoredWatermarks] = useState({});
|
|
49
|
+
const [watermarkMotionKey, setWatermarkMotionKey] = useState(0);
|
|
50
|
+
// Transient drag marker state; the selected mode owns the resulting order.
|
|
51
|
+
const [drag, setDrag] = useState(null);
|
|
52
|
+
const sessionDropCommitted = useRef(false);
|
|
53
|
+
const [workspaceDrag, setWorkspaceDrag] = useState(null);
|
|
54
|
+
const workspaceDropCommitted = useRef(false);
|
|
55
|
+
const nativeDragActive = drag !== null || workspaceDrag !== null;
|
|
56
|
+
useNativeDragAcceptance(nativeDragActive);
|
|
57
|
+
const currentGroup = current === undefined || !workspaceReady
|
|
58
|
+
? undefined
|
|
59
|
+
: owningGroupKey(workspaces, current);
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
if (current === undefined || currentGroup === undefined || Object.hasOwn(groupExpansion, currentGroup))
|
|
62
|
+
return;
|
|
63
|
+
setGroupExpanded(currentGroup, true);
|
|
64
|
+
}, [current, currentGroup, setGroupExpanded, groupExpansion]);
|
|
65
|
+
const parents = useMemo(() => {
|
|
66
|
+
if (!nestWorkspaces)
|
|
67
|
+
return new Map();
|
|
68
|
+
const keysByPath = new Map(workspaces.map(workspace => [workspace.path, workspace.workspaceId]));
|
|
69
|
+
const paths = [...keysByPath.keys()];
|
|
70
|
+
return new Map(workspaces.map((workspace) => {
|
|
71
|
+
const path = owningParentFolder(workspace.path, paths);
|
|
72
|
+
return [workspace.workspaceId, path === undefined ? undefined : keysByPath.get(path)];
|
|
73
|
+
}));
|
|
74
|
+
}, [nestWorkspaces, workspaces]);
|
|
75
|
+
const currentAncestors = useMemo(() => {
|
|
76
|
+
const keys = new Set();
|
|
77
|
+
for (let key = currentGroup === undefined ? undefined : parents.get(currentGroup); key !== undefined; key = parents.get(key)) {
|
|
78
|
+
keys.add(key);
|
|
79
|
+
}
|
|
80
|
+
return keys;
|
|
81
|
+
}, [currentGroup, parents]);
|
|
82
|
+
const expandedGroups = useMemo(() => {
|
|
83
|
+
const ancestorKeys = new Set(parents.values());
|
|
84
|
+
return [...workspaces.map(workspace => workspace.workspaceId), UNGROUPED_KEY]
|
|
85
|
+
.filter(key => groupExpansion[key] ?? ancestorKeys.has(key));
|
|
86
|
+
}, [groupExpansion, parents, workspaces]);
|
|
87
|
+
const groups = useMemo(() => deriveGroups(list, workspaces, rowState, statuses, {
|
|
88
|
+
expandedGroups,
|
|
89
|
+
ungroupedOrder: ungroupedSessionIds,
|
|
90
|
+
}), [list, workspaces, rowState, statuses, expandedGroups, ungroupedSessionIds]);
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
for (let key = revealGroup; key !== undefined; key = parents.get(key)) {
|
|
93
|
+
if (groupExpansion[key] === false || (key === revealGroup && groupExpansion[key] !== true)) {
|
|
94
|
+
setGroupExpanded(key, true);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}, [groupExpansion, parents, revealGroup, setGroupExpanded]);
|
|
98
|
+
const baselines = new Map(groups.map(group => [
|
|
99
|
+
group.key,
|
|
100
|
+
Math.max(SESSION_WATERMARK_BASE, requiredWatermark(group.expanded ? group.sessions : [], current, group.key === revealGroup ? revealSessionId : undefined)),
|
|
101
|
+
]));
|
|
102
|
+
const foldedKeys = new Set(groups.filter(group => !group.expanded).map(group => group.key));
|
|
103
|
+
const underFoldedAncestor = (key) => {
|
|
104
|
+
for (let owner = parents.get(key); owner !== undefined; owner = parents.get(owner)) {
|
|
105
|
+
if (foldedKeys.has(owner))
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
return false;
|
|
109
|
+
};
|
|
110
|
+
const requiredWatermarks = new Map([...baselines].filter(([key]) => !underFoldedAncestor(key)));
|
|
111
|
+
const sessionWatermarks = raiseWatermarks(storedWatermarks, requiredWatermarks);
|
|
112
|
+
if (sessionWatermarks !== storedWatermarks) {
|
|
113
|
+
setStoredWatermarks(marks => raiseWatermarks(marks, requiredWatermarks));
|
|
114
|
+
}
|
|
115
|
+
const dropWatermarks = (drop) => {
|
|
116
|
+
if (!Object.keys(storedWatermarks).some(drop))
|
|
117
|
+
return;
|
|
118
|
+
setStoredWatermarks(marks => Object.fromEntries(Object.entries(marks).filter(([key]) => !drop(key))));
|
|
119
|
+
setWatermarkMotionKey(key => key + 1);
|
|
120
|
+
};
|
|
121
|
+
const withinGroup = (key, root) => {
|
|
122
|
+
for (let owner = key; owner !== undefined; owner = parents.get(owner)) {
|
|
123
|
+
if (owner === root)
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
return false;
|
|
127
|
+
};
|
|
128
|
+
const now = Date.now();
|
|
129
|
+
const commitSessionDrag = (activeDrag, over) => {
|
|
130
|
+
if (sessionDropCommitted.current)
|
|
131
|
+
return;
|
|
132
|
+
sessionDropCommitted.current = true;
|
|
133
|
+
setDrag(null);
|
|
134
|
+
const group = groups.find(candidate => candidate.key === activeDrag.accountKey);
|
|
135
|
+
if (group === undefined)
|
|
136
|
+
return;
|
|
137
|
+
if (over.id === activeDrag.sessionId)
|
|
138
|
+
return;
|
|
139
|
+
const accountSessionIds = activeDrag.accountKey === UNGROUPED_KEY
|
|
140
|
+
? ungroupedSessionIds
|
|
141
|
+
: workspaces.find(workspace => workspace.workspaceId === activeDrag.accountKey)?.sessionIds;
|
|
142
|
+
if (accountSessionIds === undefined)
|
|
143
|
+
return;
|
|
144
|
+
const renderedSessions = watermarkRows(group.sessions, sessionWatermarks[group.key] ?? SESSION_WATERMARK_BASE).rows;
|
|
145
|
+
const nextOrder = sessionDragOrder(accountSessionIds, renderedSessions, activeDrag, over);
|
|
146
|
+
if (nextOrder !== undefined)
|
|
147
|
+
setSessionOrder(activeDrag.accountKey, nextOrder);
|
|
148
|
+
};
|
|
149
|
+
const commitWorkspaceDrag = (activeDrag, over) => {
|
|
150
|
+
if (workspaceDropCommitted.current)
|
|
151
|
+
return;
|
|
152
|
+
workspaceDropCommitted.current = true;
|
|
153
|
+
setWorkspaceDrag(null);
|
|
154
|
+
const owner = parents.get(activeDrag.workspaceId);
|
|
155
|
+
const siblings = workspaces.filter(workspace => parents.get(workspace.workspaceId) === owner);
|
|
156
|
+
const rowIndex = siblings.findIndex(workspace => workspace.workspaceId === over.id);
|
|
157
|
+
if (rowIndex === -1)
|
|
158
|
+
return;
|
|
159
|
+
const anchor = over.half === 'before' ? over.id : siblings[rowIndex + 1]?.workspaceId;
|
|
160
|
+
if (anchor === activeDrag.workspaceId)
|
|
161
|
+
return;
|
|
162
|
+
const sourceIndex = siblings.findIndex(workspace => workspace.workspaceId === activeDrag.workspaceId);
|
|
163
|
+
const anchorIndex = anchor === undefined
|
|
164
|
+
? siblings.length
|
|
165
|
+
: siblings.findIndex(workspace => workspace.workspaceId === anchor);
|
|
166
|
+
if (sourceIndex !== -1 && (anchorIndex === sourceIndex || anchorIndex === sourceIndex + 1))
|
|
167
|
+
return;
|
|
168
|
+
insertWorkspaceBefore(activeDrag.workspaceId, anchor).catch((reason) => {
|
|
169
|
+
console.warn('workspace reorder rejected:', reason);
|
|
170
|
+
});
|
|
171
|
+
};
|
|
172
|
+
// Build tree structure from original groups (for aggregation traversal)
|
|
173
|
+
const childrenByParentForAggregation = useMemo(() => {
|
|
174
|
+
const rendered = new Set(groups.map(group => group.key));
|
|
175
|
+
const children = new Map();
|
|
176
|
+
for (const group of groups) {
|
|
177
|
+
let parent = parents.get(group.key);
|
|
178
|
+
while (parent !== undefined && !rendered.has(parent))
|
|
179
|
+
parent = parents.get(parent);
|
|
180
|
+
const siblings = children.get(parent);
|
|
181
|
+
if (siblings === undefined)
|
|
182
|
+
children.set(parent, [group]);
|
|
183
|
+
else
|
|
184
|
+
siblings.push(group);
|
|
185
|
+
}
|
|
186
|
+
return children;
|
|
187
|
+
}, [groups, parents]);
|
|
188
|
+
// Fork-owned: each group's DIRECT member status — the input to the tree-wide
|
|
189
|
+
// aggregation below. deriveGroups stopped computing liveStatus (PR #10 moved it
|
|
190
|
+
// out), so this map is the aggregator's only data source. Expanded groups are
|
|
191
|
+
// measured too; see directStatusesForGroups.
|
|
192
|
+
const directStatusByGroup = useMemo(() => directStatusesForGroups(groups, facets, now),
|
|
193
|
+
// `now` 刻意不进依赖:它是渲染期的时钟读数,唯一影响的是"哪些截止还算将来"。
|
|
194
|
+
// 提供方的 store 到点会通知,需要新答案的那次渲染本来就带着新的 `now` 发生。
|
|
195
|
+
[groups, facets]);
|
|
196
|
+
// Multi-level aggregation: a collapsed folder's badge covers its own members plus
|
|
197
|
+
// every descendant group's, at any depth. Every row comes back measured, so the
|
|
198
|
+
// render path can never see an unresolved liveStatus.
|
|
199
|
+
const groupsWithAggregatedStatus = useMemo(() => withAggregatedStatus(groups, directStatusByGroup, childrenByParentForAggregation), [groups, directStatusByGroup, childrenByParentForAggregation]);
|
|
200
|
+
// Rebuild tree structure with aggregated groups (for rendering)
|
|
201
|
+
const childrenByParent = useMemo(() => {
|
|
202
|
+
const rendered = new Set(groupsWithAggregatedStatus.map(group => group.key));
|
|
203
|
+
const children = new Map();
|
|
204
|
+
for (const group of groupsWithAggregatedStatus) {
|
|
205
|
+
// The archived-only view drops empty groups, so an ancestor may be
|
|
206
|
+
// absent; nest under the nearest rendered one.
|
|
207
|
+
let parent = parents.get(group.key);
|
|
208
|
+
while (parent !== undefined && !rendered.has(parent))
|
|
209
|
+
parent = parents.get(parent);
|
|
210
|
+
const siblings = children.get(parent);
|
|
211
|
+
if (siblings === undefined)
|
|
212
|
+
children.set(parent, [group]);
|
|
213
|
+
else
|
|
214
|
+
siblings.push(group);
|
|
215
|
+
}
|
|
216
|
+
return children;
|
|
217
|
+
}, [groupsWithAggregatedStatus, parents]);
|
|
218
|
+
const rootGroups = childrenByParent.get(undefined) ?? [];
|
|
219
|
+
const workspaceDropAtListStart = rootGroups[0]?.workspaceId !== undefined
|
|
220
|
+
&& workspaceDrag?.over?.id === rootGroups[0].workspaceId
|
|
221
|
+
&& workspaceDrag.over.half === 'before';
|
|
222
|
+
const rowKeys = groupsWithAggregatedStatus.length === 0 ? ['empty'] : [];
|
|
223
|
+
const renderGroup = (group, depth) => {
|
|
224
|
+
const workspaceId = group.workspaceId;
|
|
225
|
+
const children = childrenByParent.get(group.key) ?? [];
|
|
226
|
+
const compatibleDrag = workspaceDrag !== null && parents.get(workspaceDrag.workspaceId) === parents.get(group.key);
|
|
227
|
+
const watermark = sessionWatermarks[group.key] ?? SESSION_WATERMARK_BASE;
|
|
228
|
+
const collapsed = watermarkRows(group.sessions, baselines.get(group.key) ?? SESSION_WATERMARK_BASE);
|
|
229
|
+
const visible = watermarkRows(group.sessions, watermark);
|
|
230
|
+
const sessionsExpanded = visible.hiddenCount === 0;
|
|
231
|
+
rowKeys.push(`workspace:${group.key}`);
|
|
232
|
+
const childRows = group.expanded ? children.map(child => renderGroup(child, depth + 1)) : [];
|
|
233
|
+
const sessions = visible.rows;
|
|
234
|
+
for (const node of sessions)
|
|
235
|
+
rowKeys.push(`session:${node.id}`);
|
|
236
|
+
if (collapsed.hiddenCount > 0)
|
|
237
|
+
rowKeys.push(`overflow:${group.key}`);
|
|
238
|
+
const workspaceMarker = workspaceId !== undefined && workspaceDrag?.over?.id === workspaceId
|
|
239
|
+
? workspaceDrag.over.half
|
|
240
|
+
: null;
|
|
241
|
+
const workspaceDragProps = workspaceId === undefined ? undefined : {
|
|
242
|
+
start: () => {
|
|
243
|
+
workspaceDropCommitted.current = false;
|
|
244
|
+
setWorkspaceDrag({ workspaceId, over: null });
|
|
245
|
+
},
|
|
246
|
+
end: () => {
|
|
247
|
+
if (workspaceDrag?.over !== null && workspaceDrag?.over !== undefined) {
|
|
248
|
+
commitWorkspaceDrag(workspaceDrag, workspaceDrag.over);
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
setWorkspaceDrag(null);
|
|
252
|
+
}
|
|
253
|
+
workspaceDropCommitted.current = false;
|
|
254
|
+
},
|
|
255
|
+
};
|
|
256
|
+
const hoverWorkspace = workspaceId === undefined || !compatibleDrag
|
|
257
|
+
? undefined
|
|
258
|
+
: (half) => {
|
|
259
|
+
setWorkspaceDrag(active => active === null
|
|
260
|
+
? active
|
|
261
|
+
: { ...active, over: { id: workspaceId, half } });
|
|
262
|
+
};
|
|
263
|
+
const dropWorkspace = workspaceId === undefined || !compatibleDrag
|
|
264
|
+
? undefined
|
|
265
|
+
: (half) => {
|
|
266
|
+
commitWorkspaceDrag(workspaceDrag, { id: workspaceId, half });
|
|
267
|
+
};
|
|
268
|
+
// group arrives from groupsWithAggregatedStatus: collapsed groups already
|
|
269
|
+
// carry the bottom-up aggregated liveStatus (direct + all descendants).
|
|
270
|
+
return (
|
|
271
|
+
// Group section: header, descendant Workspaces, and own Session rows. The
|
|
272
|
+
// inter-group breathing room is the section's own margin
|
|
273
|
+
// (WorkspaceBrowser.module.css).
|
|
274
|
+
_jsxs("div", { style: { '--dsh-workspace-indent': `${depth * 12}px` }, className: clsx(css.groupSection, workspaceMarker === 'before' && css.workspaceDropBefore, workspaceMarker === 'after' && css.workspaceDropAfter), onDragOver: workspaceDrag === null
|
|
275
|
+
? undefined
|
|
276
|
+
: (e) => {
|
|
277
|
+
e.preventDefault();
|
|
278
|
+
if (hoverWorkspace === undefined && parents.get(group.key) !== undefined)
|
|
279
|
+
return;
|
|
280
|
+
e.stopPropagation();
|
|
281
|
+
if (hoverWorkspace === undefined) {
|
|
282
|
+
e.dataTransfer.dropEffect = 'none';
|
|
283
|
+
if (workspaceDrag.over !== null)
|
|
284
|
+
setWorkspaceDrag({ ...workspaceDrag, over: null });
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
e.dataTransfer.dropEffect = 'move';
|
|
288
|
+
hoverWorkspace(workspaceGroupHalf(e));
|
|
289
|
+
}
|
|
290
|
+
}, onDrop: workspaceDrag === null
|
|
291
|
+
? undefined
|
|
292
|
+
: (e) => {
|
|
293
|
+
e.preventDefault();
|
|
294
|
+
if (dropWorkspace === undefined && parents.get(group.key) !== undefined)
|
|
295
|
+
return;
|
|
296
|
+
e.stopPropagation();
|
|
297
|
+
if (dropWorkspace === undefined) {
|
|
298
|
+
workspaceDropCommitted.current = true;
|
|
299
|
+
setWorkspaceDrag(null);
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
dropWorkspace(workspaceGroupHalf(e));
|
|
303
|
+
}
|
|
304
|
+
}, children: [_jsx(ProjectRowItem, { newShortcut: shortcuts.find(row => row.id === 'session.new'), group: group, containsCurrentDescendant: currentAncestors.has(group.key), home: home, settings: badgeSettings, now: now, t: t, onToggle: () => {
|
|
305
|
+
if (group.expanded)
|
|
306
|
+
dropWatermarks(key => withinGroup(key, group.key));
|
|
307
|
+
setGroupExpanded(group.key, !group.expanded);
|
|
308
|
+
}, onCreate: () => {
|
|
309
|
+
if (group.workspaceId !== undefined) {
|
|
310
|
+
setGroupExpanded(group.key, true);
|
|
311
|
+
startSession(group.workspaceId);
|
|
312
|
+
}
|
|
313
|
+
}, drag: workspaceDragProps, actions: group.workspaceId === undefined
|
|
314
|
+
? undefined
|
|
315
|
+
: {
|
|
316
|
+
rename: () => {
|
|
317
|
+
/* v8 ignore next -- narrowing guard: the actions object exists only for real-workspace groups. */
|
|
318
|
+
if (group.workspaceId !== undefined)
|
|
319
|
+
onRenameRequest(group.workspaceId, group.label);
|
|
320
|
+
},
|
|
321
|
+
delete: () => {
|
|
322
|
+
/* v8 ignore next -- narrowing guard: the actions object exists only for real-workspace groups. */
|
|
323
|
+
if (group.workspaceId !== undefined)
|
|
324
|
+
onDeleteRequest(group.workspaceId, group.label);
|
|
325
|
+
},
|
|
326
|
+
} }), childRows.length > 0 && (_jsx("div", { role: "group", children: childRows })), group.expanded && sessions.map((node) => {
|
|
327
|
+
// Session drag never leaves its browser-local account, and pinned
|
|
328
|
+
// rows reorder only within their leading pinned block.
|
|
329
|
+
const sameGroupDrag = drag !== null && drag.accountKey === group.key;
|
|
330
|
+
const compatibleTarget = sameGroupDrag && drag.pinned === node.pinned;
|
|
331
|
+
const normalizeHalf = (half) => node.blank ? 'after' : half;
|
|
332
|
+
const dragProps = {
|
|
333
|
+
start: () => {
|
|
334
|
+
sessionDropCommitted.current = false;
|
|
335
|
+
setDrag({ accountKey: group.key, sessionId: node.id, pinned: node.pinned, over: null });
|
|
336
|
+
},
|
|
337
|
+
active: compatibleTarget,
|
|
338
|
+
marker: sameGroupDrag && drag.over?.id === node.id ? drag.over.half : null,
|
|
339
|
+
hover: (half) => {
|
|
340
|
+
/* v8 ignore next -- narrowing guard: Rows gates hover on `active`, which is false while the drag state is null. */
|
|
341
|
+
setDrag(d => (d === null ? d : {
|
|
342
|
+
...d, over: { id: node.id, half: normalizeHalf(half) },
|
|
343
|
+
}));
|
|
344
|
+
},
|
|
345
|
+
drop: (half) => {
|
|
346
|
+
/* v8 ignore next -- narrowing guard: Rows gates drop on `active`, which is false while the drag state is null. */
|
|
347
|
+
if (drag === null)
|
|
348
|
+
return;
|
|
349
|
+
commitSessionDrag(drag, { id: node.id, half: normalizeHalf(half) });
|
|
350
|
+
},
|
|
351
|
+
end: () => {
|
|
352
|
+
if (drag?.over !== null && drag?.over !== undefined)
|
|
353
|
+
commitSessionDrag(drag, drag.over);
|
|
354
|
+
else
|
|
355
|
+
setDrag(null);
|
|
356
|
+
sessionDropCommitted.current = false;
|
|
357
|
+
},
|
|
358
|
+
};
|
|
359
|
+
return (_jsx(SessionNodeItem, { node: node, currentId: current, now: now, onOpen: open, onRenameRequest: onSessionRenameRequest, renderSlot: renderSlot, onReveal: node.id === revealSessionId && group.key === revealGroup
|
|
360
|
+
? () => { onSessionRevealed(node.id); }
|
|
361
|
+
: undefined, drag: dragProps, t: t }, node.id));
|
|
362
|
+
}), group.expanded && collapsed.hiddenCount > 0 && (_jsx("button", { type: "button", className: css.sessionOverflowButton, "data-row-key": `overflow:${group.key}`, "aria-expanded": sessionsExpanded, onClick: () => {
|
|
363
|
+
if (sessionsExpanded) {
|
|
364
|
+
dropWatermarks(key => key === group.key);
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
setStoredWatermarks(marks => ({
|
|
368
|
+
...marks,
|
|
369
|
+
[group.key]: visible.hiddenCount <= SESSION_WATERMARK_BASE
|
|
370
|
+
? Infinity
|
|
371
|
+
: watermark + SESSION_WATERMARK_BASE,
|
|
372
|
+
}));
|
|
373
|
+
setWatermarkMotionKey(key => key + 1);
|
|
374
|
+
}, children: sessionsExpanded
|
|
375
|
+
? t('sessions.collapse')
|
|
376
|
+
: t('sessions.expand', { n: visible.hiddenCount }) }))] }, group.key));
|
|
377
|
+
};
|
|
378
|
+
const groupRows = rootGroups.map(group => renderGroup(group, 0));
|
|
379
|
+
return (_jsxs(HoverCardGroup, { className: clsx(css.treeBody, css.wide), children: [workspaceDropAtListStart && _jsx("span", { className: css.listTopDropIndicator, "aria-hidden": "true" }), _jsxs(AnimatedRows, { className: clsx(css.list, workspaceDropAtListStart && css.listTopDropActive), label: t('section.sessions'), rowKeys: rowKeys, ready: list.phase === 'ready' && workspaceReady && !nativeDragActive, resetKey: JSON.stringify([animationResetKey, watermarkMotionKey]), children: [groupsWithAggregatedStatus.length === 0 && (_jsx(EmptySessions, { rowState: rowState, onLeaveArchivedOnly: onLeaveArchivedOnly, t: t })), groupRows] }), _jsx("span", { className: css.fade })] }));
|
|
380
|
+
}
|
|
381
|
+
//# sourceMappingURL=SessionTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionTree.js","sourceRoot":"","sources":["../../../../src/client/rows/SessionTree.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { WorkspaceBrowserProps } from '../contract/slots.ts';
|
|
2
|
+
import type { ArchivedFilter, SessionOrderBy } from '../tree.ts';
|
|
3
|
+
import type { SessionGroupBy } from '../stores.ts';
|
|
4
|
+
/** Grouping, ordering, and archived-filter menu; own open state so it resets with the wide chrome. */
|
|
5
|
+
export declare function ViewOptionsMenu({ groupBy, orderBy, archivedFilter, onGroupPick, onOrderPick, onArchivedFilterPick, t }: {
|
|
6
|
+
groupBy: SessionGroupBy;
|
|
7
|
+
orderBy: SessionOrderBy;
|
|
8
|
+
archivedFilter: ArchivedFilter;
|
|
9
|
+
onGroupPick: (mode: SessionGroupBy) => void;
|
|
10
|
+
onOrderPick: (mode: SessionOrderBy) => void;
|
|
11
|
+
onArchivedFilterPick: (filter: ArchivedFilter) => void;
|
|
12
|
+
t: WorkspaceBrowserProps['t'];
|
|
13
|
+
}): import("react").JSX.Element;
|
|
14
|
+
//# sourceMappingURL=ViewOptionsMenu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViewOptionsMenu.d.ts","sourceRoot":"","sources":["../../../../src/client/rows/ViewOptionsMenu.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAGlD,sGAAsG;AACtG,wBAAgB,eAAe,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC,EAAE,EAAE;IACvH,OAAO,EAAE,cAAc,CAAA;IACvB,OAAO,EAAE,cAAc,CAAA;IACvB,cAAc,EAAE,cAAc,CAAA;IAC9B,WAAW,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAA;IAC3C,WAAW,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,CAAA;IAC3C,oBAAoB,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAA;IACtD,CAAC,EAAE,qBAAqB,CAAC,GAAG,CAAC,CAAA;CAC9B,+BAsDA"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Grouping, ordering, and archived-filter menu for the section header.
|
|
4
|
+
*
|
|
5
|
+
* Own open state so it resets with the wide chrome; the trigger button is the
|
|
6
|
+
* menu's own anchor, so the header does not thread a callback down for it.
|
|
7
|
+
*/
|
|
8
|
+
import { useState } from 'react';
|
|
9
|
+
import clsx from 'clsx';
|
|
10
|
+
import { IconArchiveCheckOutlineRegular, IconArchiveOffOutlineRegular, IconChevronsUpDownOutlineRegular, IconClockOutlineRegular, IconFlatListOutlineRegular, IconFolderCloseRegular, IconQueueOutlineRegular, IconSlidersTwoOutlineRegular, IconWorkspaceTreeOutlineRegular, Menu, Tooltip, } from '@deepseek-ai/dsh-client-ui-primitives';
|
|
11
|
+
import css from './WorkspaceBrowser.module.css';
|
|
12
|
+
/** Grouping, ordering, and archived-filter menu; own open state so it resets with the wide chrome. */
|
|
13
|
+
export function ViewOptionsMenu({ groupBy, orderBy, archivedFilter, onGroupPick, onOrderPick, onArchivedFilterPick, t }) {
|
|
14
|
+
const [open, setOpen] = useState(false);
|
|
15
|
+
return (_jsx(Menu, { open: open, onClose: () => { setOpen(false); }, items: [
|
|
16
|
+
{ type: 'label', id: 'group-by', text: t('groupBy.label') },
|
|
17
|
+
{ id: 'workspace', label: t('groupBy.workspace'), icon: _jsx(IconFolderCloseRegular, {}) },
|
|
18
|
+
{ id: 'workspace-tree', label: t('groupBy.workspaceTree'), icon: _jsx(IconWorkspaceTreeOutlineRegular, {}) },
|
|
19
|
+
{ id: 'flat', label: t('groupBy.flat'), icon: _jsx(IconFlatListOutlineRegular, {}) },
|
|
20
|
+
{ type: 'separator', id: 'order-by-separator' },
|
|
21
|
+
{ type: 'label', id: 'order-by', text: t('orderBy.label') },
|
|
22
|
+
{ id: 'manual', label: t('orderBy.manual'), icon: _jsx(IconChevronsUpDownOutlineRegular, {}) },
|
|
23
|
+
{ id: 'updated', label: t('orderBy.updated'), icon: _jsx(IconClockOutlineRegular, {}) },
|
|
24
|
+
{ type: 'separator', id: 'archived-filter-separator' },
|
|
25
|
+
{ type: 'label', id: 'filter-by', text: t('filterBy.label') },
|
|
26
|
+
{ id: 'hide-archived', label: t('viewOptions.hideArchived'), icon: _jsx(IconArchiveOffOutlineRegular, {}) },
|
|
27
|
+
{ id: 'show-archived', label: t('viewOptions.showArchived'), icon: _jsx(IconQueueOutlineRegular, {}) },
|
|
28
|
+
{ id: 'only-archived', label: t('viewOptions.onlyArchived'), icon: _jsx(IconArchiveCheckOutlineRegular, {}) },
|
|
29
|
+
], selectedIds: [
|
|
30
|
+
groupBy,
|
|
31
|
+
orderBy,
|
|
32
|
+
{ default: 'hide-archived', show: 'show-archived', only: 'only-archived' }[archivedFilter],
|
|
33
|
+
], onSelect: (id) => {
|
|
34
|
+
if (id === 'workspace' || id === 'workspace-tree' || id === 'flat')
|
|
35
|
+
onGroupPick(id);
|
|
36
|
+
else if (id === 'manual' || id === 'updated')
|
|
37
|
+
onOrderPick(id);
|
|
38
|
+
else if (id === 'hide-archived')
|
|
39
|
+
onArchivedFilterPick('default');
|
|
40
|
+
else if (id === 'show-archived')
|
|
41
|
+
onArchivedFilterPick('show');
|
|
42
|
+
else if (id === 'only-archived')
|
|
43
|
+
onArchivedFilterPick('only');
|
|
44
|
+
setOpen(false);
|
|
45
|
+
}, align: "end", dense: true, listClassName: css.viewOptionsMenu,
|
|
46
|
+
// Portal: the section header clips overflow, so an in-place list would
|
|
47
|
+
// be cut off at the header's bounds.
|
|
48
|
+
portal: true, anchor: (_jsx(Tooltip, { label: t('viewOptions.label'), side: "bottom", delayMs: 500, children: _jsx("button", { type: "button", className: clsx(css.iconButton, css.wide), "aria-label": t('viewOptions.label'), onClick: () => { setOpen(v => !v); }, children: _jsx(IconSlidersTwoOutlineRegular, {}) }) })) }));
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=ViewOptionsMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViewOptionsMenu.js","sourceRoot":"","sources":["../../../../src/client/rows/ViewOptionsMenu.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,3 @@
|
|
|
1
1
|
import type { WorkspaceBrowserProps } from '../contract/slots.ts';
|
|
2
|
-
/**
|
|
3
|
-
* Render the browsing region.
|
|
4
|
-
* @param props - composed slot props (shell owner share + store + injected actions).
|
|
5
|
-
* @returns the region element tree.
|
|
6
|
-
*/
|
|
7
2
|
export declare function WorkspaceBrowser({ wide, usePanelInfo, expandSidebar, useSessions, useSessionStatus, useWorkspaces, useStore, actions, startSession, open, requestSessionRename, notifyArchivedNotOpenable, renameWorkspace, deleteWorkspace, insertWorkspaceBefore, unarchiveSession, createWorkspace, searchSessions, searchResultLimit, useDirectoryFlow, useHostInfo, useShortcuts, useWorkspaceShortcuts, useBadgeSettings, requestSearch, requestAddWorkspace, closeAddWorkspace, setDirectoryBusy, renderSlot, t, }: WorkspaceBrowserProps): import("react").JSX.Element;
|
|
8
3
|
//# sourceMappingURL=WorkspaceBrowser.d.ts.map
|