@parhelia/core 0.1.12775 → 0.1.12776
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/dist/editor/settings/SettingsHeaderActionsContext.d.ts +4 -1
- package/dist/editor/settings/SettingsHeaderActionsContext.js +11 -0
- package/dist/editor/settings/SettingsHeaderActionsContext.js.map +1 -1
- package/dist/editor/settings/SettingsView.js +14 -13
- package/dist/editor/settings/SettingsView.js.map +1 -1
- package/dist/editor/settings/panels/ProjectTemplatesPanel.js +135 -4
- package/dist/editor/settings/panels/ProjectTemplatesPanel.js.map +1 -1
- package/dist/editor/ui/Splitter.d.ts +1 -0
- package/dist/editor/ui/Splitter.js +7 -1
- package/dist/editor/ui/Splitter.js.map +1 -1
- package/dist/revision.d.ts +2 -2
- package/dist/revision.js +2 -2
- package/dist/task-board/views/DependencyGraphView.d.ts +9 -1
- package/dist/task-board/views/DependencyGraphView.js +49 -12
- package/dist/task-board/views/DependencyGraphView.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type Dispatch, type ReactNode, type SetStateAction } from "react";
|
|
1
|
+
import { type Dispatch, type RefObject, type ReactNode, type SetStateAction } from "react";
|
|
2
2
|
export type SettingsHeaderActionsSetter = Dispatch<SetStateAction<ReactNode>>;
|
|
3
3
|
export declare const SettingsHeaderActionsContext: import("react").Context<SettingsHeaderActionsSetter | null>;
|
|
4
4
|
export declare function useSettingsHeaderActions(): SettingsHeaderActionsSetter | null;
|
|
@@ -6,3 +6,6 @@ export declare function useRequiredSettingsHeaderActions(): SettingsHeaderAction
|
|
|
6
6
|
export declare const SettingsBreadcrumbExtraContext: import("react").Context<SettingsHeaderActionsSetter | null>;
|
|
7
7
|
export declare function useSettingsBreadcrumbExtra(): SettingsHeaderActionsSetter | null;
|
|
8
8
|
export declare function useRequiredSettingsBreadcrumbExtra(): SettingsHeaderActionsSetter;
|
|
9
|
+
export declare const SettingsMainContentRefContext: import("react").Context<RefObject<HTMLDivElement | null> | null>;
|
|
10
|
+
export declare function useSettingsMainContentRef(): RefObject<HTMLDivElement | null> | null;
|
|
11
|
+
export declare function useRequiredSettingsMainContentRef(): RefObject<HTMLDivElement | null>;
|
|
@@ -21,4 +21,15 @@ export function useRequiredSettingsBreadcrumbExtra() {
|
|
|
21
21
|
}
|
|
22
22
|
return setter;
|
|
23
23
|
}
|
|
24
|
+
export const SettingsMainContentRefContext = createContext(null);
|
|
25
|
+
export function useSettingsMainContentRef() {
|
|
26
|
+
return useContext(SettingsMainContentRefContext);
|
|
27
|
+
}
|
|
28
|
+
export function useRequiredSettingsMainContentRef() {
|
|
29
|
+
const mainContentRef = useContext(SettingsMainContentRefContext);
|
|
30
|
+
if (!mainContentRef) {
|
|
31
|
+
throw new Error("useRequiredSettingsMainContentRef must be used inside SettingsMainContentRefContext.Provider");
|
|
32
|
+
}
|
|
33
|
+
return mainContentRef;
|
|
34
|
+
}
|
|
24
35
|
//# sourceMappingURL=SettingsHeaderActionsContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsHeaderActionsContext.js","sourceRoot":"","sources":["../../../src/editor/settings/SettingsHeaderActionsContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,UAAU,
|
|
1
|
+
{"version":3,"file":"SettingsHeaderActionsContext.js","sourceRoot":"","sources":["../../../src/editor/settings/SettingsHeaderActionsContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,UAAU,GAKX,MAAM,OAAO,CAAC;AAIf,MAAM,CAAC,MAAM,4BAA4B,GACvC,aAAa,CAAqC,IAAI,CAAC,CAAC;AAE1D,MAAM,UAAU,wBAAwB;IACtC,OAAO,UAAU,CAAC,4BAA4B,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,gCAAgC;IAC9C,MAAM,MAAM,GAAG,UAAU,CAAC,4BAA4B,CAAC,CAAC;IAExD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,4FAA4F,CAC7F,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,8BAA8B,GACzC,aAAa,CAAqC,IAAI,CAAC,CAAC;AAE1D,MAAM,UAAU,0BAA0B;IACxC,OAAO,UAAU,CAAC,8BAA8B,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,kCAAkC;IAChD,MAAM,MAAM,GAAG,UAAU,CAAC,8BAA8B,CAAC,CAAC;IAE1D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,gGAAgG,CACjG,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,MAAM,6BAA6B,GACxC,aAAa,CAA0C,IAAI,CAAC,CAAC;AAE/D,MAAM,UAAU,yBAAyB;IACvC,OAAO,UAAU,CAAC,6BAA6B,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,iCAAiC;IAC/C,MAAM,cAAc,GAAG,UAAU,CAAC,6BAA6B,CAAC,CAAC;IAEjE,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,8FAA8F,CAC/F,CAAC;IACJ,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useEffect, useState } from "react";
|
|
2
|
+
import { useEffect, useRef, useState } from "react";
|
|
3
3
|
import { usePathname, useSearchParams } from "../client/navigation";
|
|
4
4
|
import { useEditContext } from "../client/editContext";
|
|
5
5
|
import { SimpleMenu } from "../ui/SimpleMenu";
|
|
6
6
|
import { StatusSummary } from "./StatusSummary";
|
|
7
7
|
import { SettingsBreadcrumb } from "./SettingsBreadcrumb";
|
|
8
|
-
import { SettingsBreadcrumbExtraContext, SettingsHeaderActionsContext, } from "./SettingsHeaderActionsContext";
|
|
8
|
+
import { SettingsBreadcrumbExtraContext, SettingsHeaderActionsContext, SettingsMainContentRefContext, } from "./SettingsHeaderActionsContext";
|
|
9
9
|
import { Info, Menu } from "lucide-react";
|
|
10
10
|
import { cn } from "../../lib/utils";
|
|
11
11
|
export function SettingsView() {
|
|
@@ -99,6 +99,7 @@ export function SettingsView() {
|
|
|
99
99
|
const [mobileSidebarOpen, setMobileSidebarOpen] = useState(false);
|
|
100
100
|
const [headerActions, setHeaderActions] = useState(null);
|
|
101
101
|
const [breadcrumbExtra, setBreadcrumbExtra] = useState(null);
|
|
102
|
+
const settingsMainContentRef = useRef(null);
|
|
102
103
|
const settingsSubtitle = config?.settings.subtitle;
|
|
103
104
|
const items = groups?.map((group) => {
|
|
104
105
|
return {
|
|
@@ -136,16 +137,16 @@ export function SettingsView() {
|
|
|
136
137
|
? "Close settings navigation"
|
|
137
138
|
: "Open settings navigation", title: mobileSidebarOpen
|
|
138
139
|
? "Close settings navigation"
|
|
139
|
-
: "Open settings navigation", children: _jsx(Menu, { className: "h-4 w-4", strokeWidth: 1.75 }) }))] }), _jsxs("div", { className: "relative flex min-h-0 flex-1 overflow-hidden", children: [!isDesktop && mobileSidebarOpen && (_jsx("button", { type: "button", className: "absolute inset-0 z-10 bg-black/20", "aria-label": "Close settings navigation", onClick: () => setMobileSidebarOpen(false) })), _jsxs("div", { className: cn("z-20 flex min-h-0 flex-col border-r border-gray-200 bg-gray-50", "transition-[width,transform,box-shadow] duration-300 ease-out", isDesktop
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
140
|
+
: "Open settings navigation", children: _jsx(Menu, { className: "h-4 w-4", strokeWidth: 1.75 }) }))] }), _jsx(SettingsMainContentRefContext.Provider, { value: settingsMainContentRef, children: _jsxs("div", { ref: settingsMainContentRef, className: "relative flex min-h-0 flex-1 overflow-hidden", "data-element": "settings-view-main-content", "data-testid": "settings-view-main-content", children: [!isDesktop && mobileSidebarOpen && (_jsx("button", { type: "button", className: "absolute inset-0 z-10 bg-black/20", "aria-label": "Close settings navigation", onClick: () => setMobileSidebarOpen(false) })), _jsxs("div", { className: cn("z-20 flex min-h-0 flex-col border-r border-gray-200 bg-gray-50", "transition-[width,transform,box-shadow] duration-300 ease-out", isDesktop
|
|
141
|
+
? "relative w-64"
|
|
142
|
+
: mobileSidebarOpen
|
|
143
|
+
? "absolute inset-y-0 left-0 w-64 shadow-xl"
|
|
144
|
+
: "absolute inset-y-0 left-0 w-0 -translate-x-full overflow-hidden border-r-0"), children: [_jsx(StatusSummary, { onNavigate: handleNavigateToStatus, collapsed: !isDesktop && !mobileSidebarOpen }), _jsx("div", { className: "min-h-0 flex-1 overflow-auto", children: _jsx(SimpleMenu, { items: items, activeItemKey: activeItemKey, collapsed: !isDesktop && !mobileSidebarOpen, onItemClick: (item) => {
|
|
145
|
+
setActiveItemKey(item.id);
|
|
146
|
+
updateUrl(item.id);
|
|
147
|
+
if (!isDesktop) {
|
|
148
|
+
setMobileSidebarOpen(false);
|
|
149
|
+
}
|
|
150
|
+
} }) })] }), _jsx("div", { className: "relative flex min-h-0 w-full flex-1 flex-col bg-white select-text", "data-testid": "settings-view-content", children: selectedPanel ? (_jsx(SettingsBreadcrumbExtraContext.Provider, { value: setBreadcrumbExtra, children: _jsx(SettingsHeaderActionsContext.Provider, { value: setHeaderActions, children: _jsx("div", { className: "min-h-0 flex-1 overflow-auto", children: selectedPanel.content }, selectedPanel.id) }) })) : (_jsxs("div", { className: "flex h-full flex-col items-center justify-center text-gray-500", children: [_jsx(Info, { className: "mb-4 h-10 w-10" }), _jsx("p", { children: "Select a panel from the menu to view its content" })] })) })] }) })] }));
|
|
150
151
|
}
|
|
151
152
|
//# sourceMappingURL=SettingsView.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsView.js","sourceRoot":"","sources":["../../../src/editor/settings/SettingsView.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"SettingsView.js","sourceRoot":"","sources":["../../../src/editor/settings/SettingsView.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EACL,8BAA8B,EAC9B,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAErC,MAAM,UAAU,YAAY;IAC1B,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,WAAW,EAAE,aAAa,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC;IACvC,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,iFAAiF;IACjF,iEAAiE;IACjE,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CACtD,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;QACzB,CAAC,OAAO,MAAM,KAAK,WAAW;YAC5B,CAAC,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;YAC5D,CAAC,CAAC,IAAI,CAAC,CACZ,CAAC;IACF,MAAM,YAAY,GAAG,GAAG,EAAE,CACxB,OAAO,MAAM,KAAK,WAAW;QAC7B,MAAM,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC;IAElD,6DAA6D;IAC7D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,GAAG,GACP,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;YAC3B,CAAC,OAAO,MAAM,KAAK,WAAW;gBAC5B,CAAC,CAAC,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;gBAC5D,CAAC,CAAC,IAAI,CAAC,CAAC;QACZ,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,uFAAuF;IACvF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO;QAE1C,MAAM,oBAAoB,GAAG,GAAG,EAAE;YAChC,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACvE,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;gBAC7B,mBAAmB,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC;QAC1D,gFAAgF;QAChF,yEAAyE;QACzE,oEAAoE;QAEpE,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC;QAC/D,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAEvB,2CAA2C;IAC3C,MAAM,oBAAoB,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAEvE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAChD,gBAAgB,IAAI,oBAAoB,IAAI,IAAI,CACjD,CAAC;IAEF,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAE/B,MAAM,SAAS,GAAG,CAAC,GAAkB,EAAE,EAAE;QACvC,IAAI,gBAAgB,KAAK,GAAG;YAAE,OAAO;QAErC,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE7D,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YAC5B,oEAAoE;YACpE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;QAED,oFAAoF;QACpF,mDAAmD;QACnD,0EAA0E;QAC1E,uEAAuE;QACvE,MAAM,cAAc,GAClB,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QACtE,MAAM,MAAM,GAAG,GAAG,cAAc,IAAI,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;QACzD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC,CAAC;IAEF,kFAAkF;IAClF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,iBAAiB,GAAG,gBAAgB,IAAI,oBAAoB,IAAI,IAAI,CAAC;QAC3E,IAAI,iBAAiB,KAAK,aAAa,EAAE,CAAC;YACxC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,EAAE,CAAC,gBAAgB,EAAE,oBAAoB,EAAE,aAAa,CAAC,CAAC,CAAC;IAE5D,sEAAsE;IACtE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,aAAa,IAAI,oBAAoB,EAAE,CAAC;YAC3C,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,EAAE,CAAC,oBAAoB,EAAE,aAAa,CAAC,CAAC,CAAC;IAE1C,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAU,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC;IAE1E,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO;QAE1C,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,EAAE,CAAC;QAET,UAAU,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC9C,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAY,IAAI,CAAC,CAAC;IACpE,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAY,IAAI,CAAC,CAAC;IACxE,MAAM,sBAAsB,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IACnE,MAAM,gBAAgB,GAAG,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAEnD,MAAM,KAAK,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAClC,OAAO;YACL,EAAE,EAAE,KAAK,CAAC,KAAK;YACf,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EACH,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC3B,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB,CAAC,CAAC,IAAI,EAAE;SACZ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,4CAA4C;IAC5C,MAAM,aAAa,GAAG,MAAM;QAC1B,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1B,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,aAAa,CAAC,CAAC;IAE9C,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,CACL,cAAK,SAAS,EAAC,kDAAkD,2BAE3D,CACP,CAAC;IACJ,CAAC;IAED,MAAM,sBAAsB,GAAG,GAAG,EAAE;QAClC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC3B,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpB,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,sBAAsB,GAAG,GAAG,EAAE;QAClC,WAAW,EAAE,eAAe,CAAC,UAAU,EAAE;YACvC,gBAAgB,EAAE,IAAI;YACtB,SAAS,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE;SAClC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAC,8BAA8B,iBAAa,eAAe,aACvE,eAAK,SAAS,EAAC,4CAA4C,iBAAa,sBAAsB,aAC3F,aAAa,IAAI,CAChB,eACE,SAAS,EAAE,EAAE,CACX,oEAAoE,EACpE,CAAC,SAAS,IAAI,OAAO,CACtB,aAED,KAAC,kBAAkB,IACjB,gBAAgB,EAAE,gBAAgB,EAClC,iBAAiB,EAAE,aAAa,CAAC,KAAK,EACtC,oBAAoB,EAAE,aAAa,CAAC,QAAQ,EAC5C,eAAe,EAAE,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,EACnD,eAAe,EAAE,sBAAsB,GACvC,EACD,SAAS,IAAI,aAAa,CAAC,CAAC,CAAC,CAC5B,cACE,SAAS,EAAC,wCAAwC,iBACtC,8BAA8B,YAEzC,aAAa,GACV,CACP,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,EACA,CAAC,SAAS,IAAI,CACb,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAC9C,SAAS,EAAC,sMAAsM,gBAE9M,iBAAiB;4BACf,CAAC,CAAC,2BAA2B;4BAC7B,CAAC,CAAC,0BAA0B,EAEhC,KAAK,EACH,iBAAiB;4BACf,CAAC,CAAC,2BAA2B;4BAC7B,CAAC,CAAC,0BAA0B,YAGhC,KAAC,IAAI,IAAC,SAAS,EAAC,SAAS,EAAC,WAAW,EAAE,IAAI,GAAI,GACxC,CACV,IACG,EACN,KAAC,6BAA6B,CAAC,QAAQ,IAAC,KAAK,EAAE,sBAAsB,YACnE,eACE,GAAG,EAAE,sBAAsB,EAC3B,SAAS,EAAC,8CAA8C,kBAC3C,4BAA4B,iBAC7B,4BAA4B,aAEvC,CAAC,SAAS,IAAI,iBAAiB,IAAI,CAClC,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,mCAAmC,gBAClC,2BAA2B,EACtC,OAAO,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,GAC1C,CACH,EAED,eACE,SAAS,EAAE,EAAE,CACX,gEAAgE,EAChE,+DAA+D,EAC/D,SAAS;gCACP,CAAC,CAAC,eAAe;gCACjB,CAAC,CAAC,iBAAiB;oCACjB,CAAC,CAAC,0CAA0C;oCAC5C,CAAC,CAAC,4EAA4E,CACnF,aAED,KAAC,aAAa,IACZ,UAAU,EAAE,sBAAsB,EAClC,SAAS,EAAE,CAAC,SAAS,IAAI,CAAC,iBAAiB,GAC3C,EACF,cAAK,SAAS,EAAC,8BAA8B,YAC3C,KAAC,UAAU,IACT,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,CAAC,SAAS,IAAI,CAAC,iBAAiB,EAC3C,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE;4CACpB,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;4CAC1B,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;4CACnB,IAAI,CAAC,SAAS,EAAE,CAAC;gDACf,oBAAoB,CAAC,KAAK,CAAC,CAAC;4CAC9B,CAAC;wCACH,CAAC,GACD,GACE,IACF,EAGN,cAAK,SAAS,EAAC,mEAAmE,iBAAa,uBAAuB,YACnH,aAAa,CAAC,CAAC,CAAC,CACf,KAAC,8BAA8B,CAAC,QAAQ,IAAC,KAAK,EAAE,kBAAkB,YAChE,KAAC,4BAA4B,CAAC,QAAQ,IAAC,KAAK,EAAE,gBAAgB,YAC5D,cAEE,SAAS,EAAC,8BAA8B,YAEvC,aAAa,CAAC,OAAO,IAHjB,aAAa,CAAC,EAAE,CAIjB,GACgC,GACA,CAC3C,CAAC,CAAC,CAAC,CACF,eAAK,SAAS,EAAC,gEAAgE,aAC7E,KAAC,IAAI,IAAC,SAAS,EAAC,gBAAgB,GAAG,EACnC,2EAAuD,IACnD,CACP,GACG,IACF,GACiC,IACrC,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -19,6 +19,7 @@ import { deleteProjectTemplate, getProjectTemplates, getProjectTemplateAgent, re
|
|
|
19
19
|
import { getAiProfilesErrorMessage, loadAiProfiles, } from "../../services/aiService";
|
|
20
20
|
import { updateAgentContext } from "../../services/agentService";
|
|
21
21
|
import { useEditContext } from "../../client/editContext";
|
|
22
|
+
import { localStorageService } from "../../services/localStorageService";
|
|
22
23
|
import { ItemNameDialog, } from "../../ui/ItemNameDialogNew";
|
|
23
24
|
import { SimpleTabs } from "../../ui/SimpleTabs";
|
|
24
25
|
import { isTypingEventTarget } from "../../utils/keyboardNavigation";
|
|
@@ -26,10 +27,25 @@ import { cn } from "../../../lib/utils";
|
|
|
26
27
|
import { AgentProfileEditorPanel, } from "./AgentProfileEditorPanel";
|
|
27
28
|
import { ProjectTemplateAgentPanel } from "./ProjectTemplateAgentPanel";
|
|
28
29
|
import { ProjectTemplateSelector } from "./ProjectTemplateSelector";
|
|
29
|
-
import { useRequiredSettingsBreadcrumbExtra, useRequiredSettingsHeaderActions, } from "../SettingsHeaderActionsContext";
|
|
30
|
+
import { useRequiredSettingsBreadcrumbExtra, useRequiredSettingsHeaderActions, useRequiredSettingsMainContentRef, } from "../SettingsHeaderActionsContext";
|
|
30
31
|
import { useSearchParams } from "../../client/navigation";
|
|
31
32
|
// Query param for deep-linking the selected project template (settings reload).
|
|
32
33
|
const SELECTED_PROJECT_TEMPLATE_QUERY_PARAM = "projectTemplateId";
|
|
34
|
+
function measureOverlayBounds(element) {
|
|
35
|
+
if (!element) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const rect = element.getBoundingClientRect();
|
|
39
|
+
if (rect.width <= 0 || rect.height <= 0) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
top: rect.top,
|
|
44
|
+
left: rect.left,
|
|
45
|
+
width: rect.width,
|
|
46
|
+
height: rect.height,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
33
49
|
const PRIORITY_OPTIONS = [
|
|
34
50
|
{ value: "", label: "No priority" },
|
|
35
51
|
{ value: "Low", label: "Low" },
|
|
@@ -51,6 +67,7 @@ const PROJECT_TEMPLATE_ROOT_PATHS = [
|
|
|
51
67
|
"/sitecore/system/parhelia/settings/project templates",
|
|
52
68
|
"/sitecore/system/parhelia/system/project templates",
|
|
53
69
|
];
|
|
70
|
+
const PROJECT_TEMPLATE_SPLITTER_STORAGE_KEY = "settings-project-templates-panel-splitter-v3";
|
|
54
71
|
function isProjectTemplateItemChange(changes, selectedTemplateId) {
|
|
55
72
|
const normalizedSelectedTemplateId = selectedTemplateId?.toLowerCase() ?? null;
|
|
56
73
|
return changes.some((change) => {
|
|
@@ -406,6 +423,11 @@ export function ProjectTemplatesPanel() {
|
|
|
406
423
|
const [duplicatingAgentProfile, setDuplicatingAgentProfile] = useState(false);
|
|
407
424
|
const [mobileView, setMobileView] = useState("detail");
|
|
408
425
|
const [editingAgentProfile, setEditingAgentProfile] = useState(null);
|
|
426
|
+
const [isTaskEditorMaximized, setIsTaskEditorMaximized] = useState(false);
|
|
427
|
+
const [taskEditorOverlayBounds, setTaskEditorOverlayBounds] = useState(null);
|
|
428
|
+
const [forceCollapseAgentPanelKey, setForceCollapseAgentPanelKey] = useState(0);
|
|
429
|
+
const [forceExpandAgentPanelKey, setForceExpandAgentPanelKey] = useState(0);
|
|
430
|
+
const settingsMainContentRef = useRequiredSettingsMainContentRef();
|
|
409
431
|
const setSettingsHeaderActions = useRequiredSettingsHeaderActions();
|
|
410
432
|
const setSettingsBreadcrumbExtra = useRequiredSettingsBreadcrumbExtra();
|
|
411
433
|
const autosaveTimeoutRef = useRef(null);
|
|
@@ -421,6 +443,108 @@ export function ProjectTemplatesPanel() {
|
|
|
421
443
|
const templateAgentLoadRunIdRef = useRef(0);
|
|
422
444
|
const externalRefreshTimeoutRef = useRef(null);
|
|
423
445
|
const pendingExternalRefreshRef = useRef(false);
|
|
446
|
+
const agentPanelWasExpandedBeforeMaximizeRef = useRef(null);
|
|
447
|
+
const exitTaskEditorMaximizedRef = useRef(() => { });
|
|
448
|
+
const wasAgentPanelCollapsed = () => {
|
|
449
|
+
const stored = localStorageService.getItem(PROJECT_TEMPLATE_SPLITTER_STORAGE_KEY);
|
|
450
|
+
return stored?.lastCollapsed ?? true;
|
|
451
|
+
};
|
|
452
|
+
const restoreAgentPanelAfterMaximize = () => {
|
|
453
|
+
if (agentPanelWasExpandedBeforeMaximizeRef.current === true) {
|
|
454
|
+
setForceExpandAgentPanelKey((value) => value + 1);
|
|
455
|
+
}
|
|
456
|
+
agentPanelWasExpandedBeforeMaximizeRef.current = null;
|
|
457
|
+
};
|
|
458
|
+
/* eslint-disable react-hooks/exhaustive-deps */
|
|
459
|
+
const exitTaskEditorMaximized = () => {
|
|
460
|
+
setIsTaskEditorMaximized(false);
|
|
461
|
+
restoreAgentPanelAfterMaximize();
|
|
462
|
+
};
|
|
463
|
+
exitTaskEditorMaximizedRef.current = exitTaskEditorMaximized;
|
|
464
|
+
const handleToggleTaskEditorMaximized = () => {
|
|
465
|
+
if (isTaskEditorMaximized) {
|
|
466
|
+
exitTaskEditorMaximized();
|
|
467
|
+
return;
|
|
468
|
+
}
|
|
469
|
+
const nextBounds = measureOverlayBounds(settingsMainContentRef.current);
|
|
470
|
+
if (!nextBounds) {
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
const agentPanelCollapsed = wasAgentPanelCollapsed();
|
|
474
|
+
agentPanelWasExpandedBeforeMaximizeRef.current = !agentPanelCollapsed;
|
|
475
|
+
if (!agentPanelCollapsed) {
|
|
476
|
+
setForceCollapseAgentPanelKey((value) => value + 1);
|
|
477
|
+
}
|
|
478
|
+
setTaskEditorOverlayBounds(nextBounds);
|
|
479
|
+
setIsTaskEditorMaximized(true);
|
|
480
|
+
};
|
|
481
|
+
useEffect(() => {
|
|
482
|
+
if (!isTaskEditorMaximized) {
|
|
483
|
+
setTaskEditorOverlayBounds(null);
|
|
484
|
+
return;
|
|
485
|
+
}
|
|
486
|
+
const settingsMainContent = settingsMainContentRef.current;
|
|
487
|
+
const updateBounds = () => {
|
|
488
|
+
const nextBounds = measureOverlayBounds(settingsMainContentRef.current);
|
|
489
|
+
if (nextBounds) {
|
|
490
|
+
setTaskEditorOverlayBounds(nextBounds);
|
|
491
|
+
}
|
|
492
|
+
};
|
|
493
|
+
updateBounds();
|
|
494
|
+
if (typeof window === "undefined") {
|
|
495
|
+
return;
|
|
496
|
+
}
|
|
497
|
+
let frameId = null;
|
|
498
|
+
const scheduleUpdate = () => {
|
|
499
|
+
if (frameId != null) {
|
|
500
|
+
window.cancelAnimationFrame(frameId);
|
|
501
|
+
}
|
|
502
|
+
frameId = window.requestAnimationFrame(() => {
|
|
503
|
+
frameId = null;
|
|
504
|
+
updateBounds();
|
|
505
|
+
});
|
|
506
|
+
};
|
|
507
|
+
const resizeObserver = typeof ResizeObserver !== "undefined" && settingsMainContent
|
|
508
|
+
? new ResizeObserver(scheduleUpdate)
|
|
509
|
+
: null;
|
|
510
|
+
if (resizeObserver && settingsMainContent) {
|
|
511
|
+
resizeObserver.observe(settingsMainContent);
|
|
512
|
+
}
|
|
513
|
+
window.addEventListener("resize", scheduleUpdate);
|
|
514
|
+
window.addEventListener("scroll", scheduleUpdate, true);
|
|
515
|
+
return () => {
|
|
516
|
+
if (frameId != null) {
|
|
517
|
+
window.cancelAnimationFrame(frameId);
|
|
518
|
+
}
|
|
519
|
+
resizeObserver?.disconnect();
|
|
520
|
+
window.removeEventListener("resize", scheduleUpdate);
|
|
521
|
+
window.removeEventListener("scroll", scheduleUpdate, true);
|
|
522
|
+
};
|
|
523
|
+
}, [isTaskEditorMaximized, settingsMainContentRef]);
|
|
524
|
+
useEffect(() => {
|
|
525
|
+
if (isTaskEditorMaximized &&
|
|
526
|
+
(!draftTemplate || activeDetailTab !== "tasks" || isMobile)) {
|
|
527
|
+
exitTaskEditorMaximizedRef.current();
|
|
528
|
+
}
|
|
529
|
+
}, [
|
|
530
|
+
activeDetailTab,
|
|
531
|
+
draftTemplate,
|
|
532
|
+
isMobile,
|
|
533
|
+
isTaskEditorMaximized,
|
|
534
|
+
]);
|
|
535
|
+
const projectTemplateEditorStyle = useMemo(() => {
|
|
536
|
+
if (!isTaskEditorMaximized || !taskEditorOverlayBounds) {
|
|
537
|
+
return undefined;
|
|
538
|
+
}
|
|
539
|
+
return {
|
|
540
|
+
position: "fixed",
|
|
541
|
+
top: taskEditorOverlayBounds.top,
|
|
542
|
+
left: taskEditorOverlayBounds.left,
|
|
543
|
+
width: taskEditorOverlayBounds.width,
|
|
544
|
+
height: taskEditorOverlayBounds.height,
|
|
545
|
+
zIndex: 80,
|
|
546
|
+
};
|
|
547
|
+
}, [isTaskEditorMaximized, taskEditorOverlayBounds]);
|
|
424
548
|
useEffect(() => {
|
|
425
549
|
let cancelled = false;
|
|
426
550
|
loadAiProfiles()
|
|
@@ -1537,6 +1661,12 @@ export function ProjectTemplatesPanel() {
|
|
|
1537
1661
|
removeTaskTemplateById(selectedTaskId);
|
|
1538
1662
|
}, [removeTaskTemplateById, selectedTaskId]);
|
|
1539
1663
|
const handleProjectTemplateEditorKeyDownCapture = useCallback((event) => {
|
|
1664
|
+
if (event.key === "Escape" && isTaskEditorMaximized) {
|
|
1665
|
+
event.preventDefault();
|
|
1666
|
+
event.stopPropagation();
|
|
1667
|
+
exitTaskEditorMaximizedRef.current();
|
|
1668
|
+
return;
|
|
1669
|
+
}
|
|
1540
1670
|
if (event.key !== "Delete")
|
|
1541
1671
|
return;
|
|
1542
1672
|
if (isTypingEventTarget(event.nativeEvent))
|
|
@@ -1556,6 +1686,7 @@ export function ProjectTemplatesPanel() {
|
|
|
1556
1686
|
}, [
|
|
1557
1687
|
handleDeleteSelectedTask,
|
|
1558
1688
|
handleRemoveDependency,
|
|
1689
|
+
isTaskEditorMaximized,
|
|
1559
1690
|
selectedDependencyId,
|
|
1560
1691
|
selectedTaskId,
|
|
1561
1692
|
]);
|
|
@@ -1603,7 +1734,7 @@ export function ProjectTemplatesPanel() {
|
|
|
1603
1734
|
if (!draftTemplate) {
|
|
1604
1735
|
return null;
|
|
1605
1736
|
}
|
|
1606
|
-
const graphView = (_jsx("div", { className: "h-full min-h-0 overflow-hidden bg-slate-50/40", "data-testid": "project-template-graph", children: _jsx(DependencyGraphView, { projectId: draftTemplate.id, layoutKey: `project-template:${draftTemplate.id}`, tasks: graphTasks, dependencies: graphDependencies, miniMapWidth: 160, miniMapHeight: 120, showMiniMap: !isMobile, orientation: "horizontal", showOrientationToggle: true, autoLayoutStrategy: "hierarchy", savedLayout: draftTemplate.graphLayout, selectedTaskId: selectedTaskId, selectedDependencyId: selectedDependencyId, onSelectTask: handleSelectTask, onSelectDependency: handleSelectDependencyFromGraph, onClearDependencySelection: handleClearDependencySelection, onAddDependentTaskFromNode: (taskId) => {
|
|
1737
|
+
const graphView = (_jsx("div", { className: "h-full min-h-0 overflow-hidden bg-slate-50/40", "data-testid": "project-template-graph", children: _jsx(DependencyGraphView, { projectId: draftTemplate.id, layoutKey: `project-template:${draftTemplate.id}`, tasks: graphTasks, dependencies: graphDependencies, miniMapWidth: 160, miniMapHeight: 120, showMiniMap: !isMobile, isMaximized: !isMobile && isTaskEditorMaximized, onToggleMaximized: !isMobile ? handleToggleTaskEditorMaximized : undefined, orientation: "horizontal", showOrientationToggle: true, autoLayoutStrategy: "hierarchy", savedLayout: draftTemplate.graphLayout, selectedTaskId: selectedTaskId, selectedDependencyId: selectedDependencyId, onSelectTask: handleSelectTask, onSelectDependency: handleSelectDependencyFromGraph, onClearDependencySelection: handleClearDependencySelection, onAddDependentTaskFromNode: (taskId) => {
|
|
1607
1738
|
void handleOpenCreateDependentTaskDialogForTask(taskId);
|
|
1608
1739
|
}, onAddChildTaskFromNode: (taskId) => {
|
|
1609
1740
|
void handleOpenAddChildTaskDialogForTask(taskId);
|
|
@@ -1723,7 +1854,7 @@ export function ProjectTemplatesPanel() {
|
|
|
1723
1854
|
openInWizardMode: checked,
|
|
1724
1855
|
})), "aria-label": "Open new projects from this template in wizard mode", "data-testid": "project-template-open-in-wizard-mode-switch" })] })] }));
|
|
1725
1856
|
const taskEditorContent = (_jsx("div", { className: "flex h-full min-h-0 flex-1 flex-col overflow-hidden", children: renderTemplateTaskEditorMain() }));
|
|
1726
|
-
return (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col overflow-y-auto overscroll-y-contain
|
|
1857
|
+
return (_jsxs("div", { className: cn("flex min-h-0 flex-1 flex-col overflow-y-auto overscroll-y-contain md:overflow-hidden", isTaskEditorMaximized ? "overflow-hidden p-0" : "p-5"), children: [_jsx("div", { className: "flex shrink-0 flex-col gap-5 md:max-h-[50vh] md:min-h-0 md:overflow-y-auto md:overscroll-y-contain", children: saveError && (_jsx("div", { className: "rounded border border-red-200 bg-red-50 px-4 py-3 text-xs text-red-700", children: saveError })) }), _jsxs("section", { className: cn("flex min-h-0 flex-1 flex-col rounded-lg border border-gray-200 bg-white shadow-sm md:overflow-hidden", isTaskEditorMaximized && "overflow-hidden rounded-none shadow-xl"), "data-testid": "project-template-task-editor-shell", children: [_jsxs("div", { className: "flex shrink-0 items-center justify-between gap-3 border-b border-gray-100 px-4 py-3", children: [_jsx("div", { className: "min-w-0 flex-1", children: _jsx(SimpleTabs, { tabs: detailTabs, activeTab: activeDetailTab === "basic" ? 0 : 1, setActiveTab: (index) => setActiveDetailTab(index === 0 ? "basic" : "tasks"), hideContent: true, variant: "elegant", className: "w-full justify-start gap-6" }) }), _jsxs(Button, { size: "sm", variant: "outline", onClick: () => void handleOpenCreateTaskDialog(), disabled: creatingTask, "data-testid": "project-template-add-task-button", className: activeDetailTab === "tasks"
|
|
1727
1858
|
? ""
|
|
1728
1859
|
: "pointer-events-none invisible", "aria-hidden": activeDetailTab !== "tasks", tabIndex: activeDetailTab === "tasks" ? undefined : -1, children: [_jsx(Plus, { className: "h-4 w-4", strokeWidth: 1.5 }), "Add Task"] })] }), _jsx("div", { className: "flex min-h-0 flex-1 flex-col overflow-hidden", children: activeDetailTab === "basic"
|
|
1729
1860
|
? basicSettingsContent
|
|
@@ -1751,7 +1882,7 @@ export function ProjectTemplatesPanel() {
|
|
|
1751
1882
|
hidden: isMobile && mobileView !== "agent",
|
|
1752
1883
|
},
|
|
1753
1884
|
];
|
|
1754
|
-
return (_jsxs(_Fragment, { children: [_jsx("div", { className: "h-full", "data-testid": "project-template-editor", onKeyDownCapture: handleProjectTemplateEditorKeyDownCapture, children: _jsx(Splitter, { panels: panels, localStorageKey:
|
|
1885
|
+
return (_jsxs(_Fragment, { children: [_jsx("div", { className: cn("h-full", isTaskEditorMaximized && "fixed overflow-hidden bg-white shadow-xl"), style: projectTemplateEditorStyle, "data-testid": "project-template-editor", onKeyDownCapture: handleProjectTemplateEditorKeyDownCapture, children: _jsx(Splitter, { panels: panels, localStorageKey: PROJECT_TEMPLATE_SPLITTER_STORAGE_KEY, direction: "horizontal", className: "h-full", forceExpandLastPanelKey: editingAgentProfile?.id ?? null }) }), _jsx(Dialog, { open: isCreateTaskDialogOpen, onOpenChange: (open) => {
|
|
1755
1886
|
setIsCreateTaskDialogOpen(open);
|
|
1756
1887
|
if (!open) {
|
|
1757
1888
|
setNewTaskDependencySourceId(null);
|