@ynput/ayon-frontend-shared 0.2.22 → 0.2.23

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.
Files changed (45) hide show
  1. package/dist/_virtual/index.cjs10.js +4 -4
  2. package/dist/_virtual/index.cjs8.js +4 -4
  3. package/dist/_virtual/index.cjs9.js +4 -4
  4. package/dist/_virtual/index.es10.js +4 -4
  5. package/dist/_virtual/index.es8.js +4 -4
  6. package/dist/_virtual/index.es9.js +4 -4
  7. package/dist/node_modules/rehype/node_modules/unified/lib/index.cjs.js +2 -2
  8. package/dist/node_modules/rehype/node_modules/unified/lib/index.es.js +2 -2
  9. package/dist/node_modules/rehype-parse/lib/index.cjs.js +1 -1
  10. package/dist/node_modules/rehype-parse/lib/index.es.js +1 -1
  11. package/dist/node_modules/vfile/lib/index.cjs.js +1 -1
  12. package/dist/node_modules/vfile/lib/index.es.js +1 -1
  13. package/dist/shared/src/containers/Views/ViewsMenu/SectionHeader.cjs.js +17 -0
  14. package/dist/shared/src/containers/Views/ViewsMenu/SectionHeader.cjs.js.map +1 -0
  15. package/dist/shared/src/containers/Views/ViewsMenu/SectionHeader.es.js +17 -0
  16. package/dist/shared/src/containers/Views/ViewsMenu/SectionHeader.es.js.map +1 -0
  17. package/dist/shared/src/containers/Views/ViewsMenu/SectionHeader.styled.cjs.js +37 -0
  18. package/dist/shared/src/containers/Views/ViewsMenu/SectionHeader.styled.cjs.js.map +1 -0
  19. package/dist/shared/src/containers/Views/ViewsMenu/SectionHeader.styled.es.js +37 -0
  20. package/dist/shared/src/containers/Views/ViewsMenu/SectionHeader.styled.es.js.map +1 -0
  21. package/dist/shared/src/containers/Views/ViewsMenu/ViewsMenu.cjs.js +13 -2
  22. package/dist/shared/src/containers/Views/ViewsMenu/ViewsMenu.cjs.js.map +1 -1
  23. package/dist/shared/src/containers/Views/ViewsMenu/ViewsMenu.es.js +14 -3
  24. package/dist/shared/src/containers/Views/ViewsMenu/ViewsMenu.es.js.map +1 -1
  25. package/dist/shared/src/containers/Views/ViewsMenu/ViewsMenu.styled.cjs.js +1 -2
  26. package/dist/shared/src/containers/Views/ViewsMenu/ViewsMenu.styled.cjs.js.map +1 -1
  27. package/dist/shared/src/containers/Views/ViewsMenu/ViewsMenu.styled.es.js +2 -3
  28. package/dist/shared/src/containers/Views/ViewsMenu/ViewsMenu.styled.es.js.map +1 -1
  29. package/dist/shared/src/containers/Views/context/ViewsContext.cjs.js +5 -0
  30. package/dist/shared/src/containers/Views/context/ViewsContext.cjs.js.map +1 -1
  31. package/dist/shared/src/containers/Views/context/ViewsContext.es.js +5 -0
  32. package/dist/shared/src/containers/Views/context/ViewsContext.es.js.map +1 -1
  33. package/dist/shared/src/containers/Views/hooks/useBuildViewMenuItems.cjs.js +45 -13
  34. package/dist/shared/src/containers/Views/hooks/useBuildViewMenuItems.cjs.js.map +1 -1
  35. package/dist/shared/src/containers/Views/hooks/useBuildViewMenuItems.es.js +45 -13
  36. package/dist/shared/src/containers/Views/hooks/useBuildViewMenuItems.es.js.map +1 -1
  37. package/dist/shared/src/containers/Views/utils/getCustomViewsFallback.cjs.js +2 -1
  38. package/dist/shared/src/containers/Views/utils/getCustomViewsFallback.cjs.js.map +1 -1
  39. package/dist/shared/src/containers/Views/utils/getCustomViewsFallback.es.js +2 -1
  40. package/dist/shared/src/containers/Views/utils/getCustomViewsFallback.es.js.map +1 -1
  41. package/dist/types/containers/Views/ViewsMenu/SectionHeader.d.ts +6 -0
  42. package/dist/types/containers/Views/ViewsMenu/SectionHeader.styled.d.ts +1 -0
  43. package/dist/types/containers/Views/ViewsMenu/ViewsMenu.d.ts +8 -3
  44. package/dist/types/containers/Views/utils/getCustomViewsFallback.d.ts +4 -3
  45. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  const _commonjsHelpers = require("./_commonjsHelpers.cjs.js");
3
- const index = require("../node_modules/extend/index.cjs.js");
4
- var extendExports = index.__require();
5
- const extend = /* @__PURE__ */ _commonjsHelpers.getDefaultExportFromCjs(extendExports);
6
- module.exports = extend;
3
+ const index = require("../node_modules/parse5/lib/parser/index.cjs.js");
4
+ var parserExports = index.__require();
5
+ const Parser5 = /* @__PURE__ */ _commonjsHelpers.getDefaultExportFromCjs(parserExports);
6
+ module.exports = Parser5;
7
7
  //# sourceMappingURL=index.cjs10.js.map
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  const _commonjsHelpers = require("./_commonjsHelpers.cjs.js");
3
- const index = require("../node_modules/parse5/lib/parser/index.cjs.js");
4
- var parserExports = index.__require();
5
- const Parser5 = /* @__PURE__ */ _commonjsHelpers.getDefaultExportFromCjs(parserExports);
6
- module.exports = Parser5;
3
+ const index = require("../node_modules/is-buffer/index.cjs.js");
4
+ var isBufferExports = index.__require();
5
+ const isBuffer = /* @__PURE__ */ _commonjsHelpers.getDefaultExportFromCjs(isBufferExports);
6
+ module.exports = isBuffer;
7
7
  //# sourceMappingURL=index.cjs8.js.map
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  const _commonjsHelpers = require("./_commonjsHelpers.cjs.js");
3
- const index = require("../node_modules/is-buffer/index.cjs.js");
4
- var isBufferExports = index.__require();
5
- const isBuffer = /* @__PURE__ */ _commonjsHelpers.getDefaultExportFromCjs(isBufferExports);
6
- module.exports = isBuffer;
3
+ const index = require("../node_modules/extend/index.cjs.js");
4
+ var extendExports = index.__require();
5
+ const extend = /* @__PURE__ */ _commonjsHelpers.getDefaultExportFromCjs(extendExports);
6
+ module.exports = extend;
7
7
  //# sourceMappingURL=index.cjs9.js.map
@@ -1,8 +1,8 @@
1
1
  import { getDefaultExportFromCjs } from "./_commonjsHelpers.es.js";
2
- import { __require as requireExtend } from "../node_modules/extend/index.es.js";
3
- var extendExports = requireExtend();
4
- const extend = /* @__PURE__ */ getDefaultExportFromCjs(extendExports);
2
+ import { __require as requireParser } from "../node_modules/parse5/lib/parser/index.es.js";
3
+ var parserExports = requireParser();
4
+ const Parser5 = /* @__PURE__ */ getDefaultExportFromCjs(parserExports);
5
5
  export {
6
- extend as default
6
+ Parser5 as default
7
7
  };
8
8
  //# sourceMappingURL=index.es10.js.map
@@ -1,8 +1,8 @@
1
1
  import { getDefaultExportFromCjs } from "./_commonjsHelpers.es.js";
2
- import { __require as requireParser } from "../node_modules/parse5/lib/parser/index.es.js";
3
- var parserExports = requireParser();
4
- const Parser5 = /* @__PURE__ */ getDefaultExportFromCjs(parserExports);
2
+ import { __require as requireIsBuffer } from "../node_modules/is-buffer/index.es.js";
3
+ var isBufferExports = requireIsBuffer();
4
+ const isBuffer = /* @__PURE__ */ getDefaultExportFromCjs(isBufferExports);
5
5
  export {
6
- Parser5 as default
6
+ isBuffer as default
7
7
  };
8
8
  //# sourceMappingURL=index.es8.js.map
@@ -1,8 +1,8 @@
1
1
  import { getDefaultExportFromCjs } from "./_commonjsHelpers.es.js";
2
- import { __require as requireIsBuffer } from "../node_modules/is-buffer/index.es.js";
3
- var isBufferExports = requireIsBuffer();
4
- const isBuffer = /* @__PURE__ */ getDefaultExportFromCjs(isBufferExports);
2
+ import { __require as requireExtend } from "../node_modules/extend/index.es.js";
3
+ var extendExports = requireExtend();
4
+ const extend = /* @__PURE__ */ getDefaultExportFromCjs(extendExports);
5
5
  export {
6
- isBuffer as default
6
+ extend as default
7
7
  };
8
8
  //# sourceMappingURL=index.es9.js.map
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const index$3 = require("../../../../bail/index.cjs.js");
4
- const index$5 = require("../../../../../_virtual/index.cjs9.js");
5
- const index = require("../../../../../_virtual/index.cjs10.js");
4
+ const index$5 = require("../../../../../_virtual/index.cjs8.js");
5
+ const index = require("../../../../../_virtual/index.cjs9.js");
6
6
  const index$2 = require("../../../../is-plain-obj/index.cjs.js");
7
7
  const index$1 = require("../../../../trough/lib/index.cjs.js");
8
8
  const index$4 = require("../../../../vfile/lib/index.cjs.js");
@@ -1,6 +1,6 @@
1
1
  import { bail } from "../../../../bail/index.es.js";
2
- import isBuffer from "../../../../../_virtual/index.es9.js";
3
- import extend from "../../../../../_virtual/index.es10.js";
2
+ import isBuffer from "../../../../../_virtual/index.es8.js";
3
+ import extend from "../../../../../_virtual/index.es9.js";
4
4
  import isPlainObject from "../../../../is-plain-obj/index.es.js";
5
5
  import { trough } from "../../../../trough/lib/index.es.js";
6
6
  import { VFile } from "../../../../vfile/lib/index.es.js";
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- const index = require("../../../_virtual/index.cjs8.js");
2
+ const index = require("../../../_virtual/index.cjs10.js");
3
3
  const errors = require("./errors.cjs.js");
4
4
  const index$1 = require("../../hast-util-from-parse5/lib/index.cjs.js");
5
5
  const base = "https://html.spec.whatwg.org/multipage/parsing.html#parse-error-";
@@ -1,4 +1,4 @@
1
- import Parser5 from "../../../_virtual/index.es8.js";
1
+ import Parser5 from "../../../_virtual/index.es10.js";
2
2
  import { errors } from "./errors.es.js";
3
3
  import { fromParse5 } from "../../hast-util-from-parse5/lib/index.es.js";
4
4
  const base = "https://html.spec.whatwg.org/multipage/parsing.html#parse-error-";
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const index$1 = require("../../../_virtual/index.cjs9.js");
3
+ const index$1 = require("../../../_virtual/index.cjs8.js");
4
4
  const minpath_browser = require("./minpath.browser.cjs.js");
5
5
  const minproc_browser = require("./minproc.browser.cjs.js");
6
6
  const minurl_browser = require("./minurl.browser.cjs.js");
@@ -1,4 +1,4 @@
1
- import isBuffer from "../../../_virtual/index.es9.js";
1
+ import isBuffer from "../../../_virtual/index.es8.js";
2
2
  import { path } from "./minpath.browser.es.js";
3
3
  import { proc } from "./minproc.browser.es.js";
4
4
  import { urlToPath } from "./minurl.browser.es.js";
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("../../../../../_virtual/jsx-runtime.cjs.js");
4
+ const React = require("react");
5
+ const ayonReactComponents = require("@ynput/ayon-react-components");
6
+ const SectionHeader_styled = require("./SectionHeader.styled.cjs.js");
7
+ const SectionHeader = React.forwardRef(
8
+ ({ title, collapsed, ...props }, ref) => {
9
+ return /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsxs(SectionHeader_styled.SectionHeader, { ...props, ref, children: [
10
+ /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx("span", { children: title }),
11
+ /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx("span", { className: "spacer" }),
12
+ /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(ayonReactComponents.Icon, { className: "icon", icon: collapsed ? "expand_more" : "expand_less" })
13
+ ] });
14
+ }
15
+ );
16
+ exports.SectionHeader = SectionHeader;
17
+ //# sourceMappingURL=SectionHeader.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SectionHeader.cjs.js","sources":["../../../../../../src/containers/Views/ViewsMenu/SectionHeader.tsx"],"sourcesContent":["import { forwardRef } from 'react'\nimport { Icon } from '@ynput/ayon-react-components'\nimport * as S from './SectionHeader.styled'\n\nexport interface SectionHeaderProps extends React.LiHTMLAttributes<HTMLLIElement> {\n id: string\n title: string\n collapsed?: boolean\n}\n\nexport const SectionHeader = forwardRef<HTMLLIElement, SectionHeaderProps>(\n ({ title, collapsed, ...props }, ref) => {\n return (\n <S.SectionHeader {...props} ref={ref}>\n <span>{title}</span>\n <span className=\"spacer\" />\n <Icon className=\"icon\" icon={collapsed ? 'expand_more' : 'expand_less'} />\n </S.SectionHeader>\n )\n },\n)\n"],"names":["forwardRef","S.SectionHeader","jsx","Icon"],"mappings":";;;;;;AAUO,MAAM,gBAAgBA,MAAA;AAAA,EAC3B,CAAC,EAAE,OAAO,WAAW,GAAG,MAAA,GAAS,QAAQ;AACvC,6DACGC,qBAAAA,eAAA,EAAiB,GAAG,OAAO,KAC1B,UAAA;AAAA,MAAAC,2BAAAA,kBAAAA,IAAC,UAAM,UAAM,MAAA,CAAA;AAAA,MACbA,2BAAAA,kBAAAA,IAAC,QAAK,EAAA,WAAU,SAAS,CAAA;AAAA,uDACxBC,oBAAAA,MAAK,EAAA,WAAU,QAAO,MAAM,YAAY,gBAAgB,cAAe,CAAA;AAAA,IAAA,GAC1E;AAAA,EAAA;AAGN;;"}
@@ -0,0 +1,17 @@
1
+ import { j as jsxRuntimeExports } from "../../../../../_virtual/jsx-runtime.es.js";
2
+ import { forwardRef } from "react";
3
+ import { Icon } from "@ynput/ayon-react-components";
4
+ import { SectionHeader as SectionHeader$1 } from "./SectionHeader.styled.es.js";
5
+ const SectionHeader = forwardRef(
6
+ ({ title, collapsed, ...props }, ref) => {
7
+ return /* @__PURE__ */ jsxRuntimeExports.jsxs(SectionHeader$1, { ...props, ref, children: [
8
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: title }),
9
+ /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "spacer" }),
10
+ /* @__PURE__ */ jsxRuntimeExports.jsx(Icon, { className: "icon", icon: collapsed ? "expand_more" : "expand_less" })
11
+ ] });
12
+ }
13
+ );
14
+ export {
15
+ SectionHeader
16
+ };
17
+ //# sourceMappingURL=SectionHeader.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SectionHeader.es.js","sources":["../../../../../../src/containers/Views/ViewsMenu/SectionHeader.tsx"],"sourcesContent":["import { forwardRef } from 'react'\nimport { Icon } from '@ynput/ayon-react-components'\nimport * as S from './SectionHeader.styled'\n\nexport interface SectionHeaderProps extends React.LiHTMLAttributes<HTMLLIElement> {\n id: string\n title: string\n collapsed?: boolean\n}\n\nexport const SectionHeader = forwardRef<HTMLLIElement, SectionHeaderProps>(\n ({ title, collapsed, ...props }, ref) => {\n return (\n <S.SectionHeader {...props} ref={ref}>\n <span>{title}</span>\n <span className=\"spacer\" />\n <Icon className=\"icon\" icon={collapsed ? 'expand_more' : 'expand_less'} />\n </S.SectionHeader>\n )\n },\n)\n"],"names":["S.SectionHeader","jsx"],"mappings":";;;;AAUO,MAAM,gBAAgB;AAAA,EAC3B,CAAC,EAAE,OAAO,WAAW,GAAG,MAAA,GAAS,QAAQ;AACvC,kDACGA,iBAAA,EAAiB,GAAG,OAAO,KAC1B,UAAA;AAAA,MAAAC,kCAAAA,IAAC,UAAM,UAAM,MAAA,CAAA;AAAA,MACbA,kCAAAA,IAAC,QAAK,EAAA,WAAU,SAAS,CAAA;AAAA,4CACxB,MAAK,EAAA,WAAU,QAAO,MAAM,YAAY,gBAAgB,cAAe,CAAA;AAAA,IAAA,GAC1E;AAAA,EAAA;AAGN;"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const styled = require("styled-components");
4
+ const ayonReactComponents = require("@ynput/ayon-react-components");
5
+ const SectionHeader = styled.li`
6
+ ${ayonReactComponents.theme.labelSmall}
7
+ color: var(--md-sys-color-outline);
8
+ user-select: none;
9
+ border-radius: var(--border-radius-m);
10
+ height: 28px;
11
+ padding: 0 8px;
12
+
13
+ display: flex;
14
+ align-items: center;
15
+ gap: var(--base-gap-small);
16
+
17
+ cursor: pointer;
18
+
19
+ &:hover {
20
+ background-color: var(--md-sys-color-surface-container-high-hover);
21
+ }
22
+
23
+ .spacer {
24
+ flex: 1;
25
+ }
26
+ .icon {
27
+ font-size: 18px;
28
+ color: var(--md-sys-color-outline);
29
+ display: none;
30
+ }
31
+
32
+ &:hover .icon {
33
+ display: inline-flex;
34
+ }
35
+ `;
36
+ exports.SectionHeader = SectionHeader;
37
+ //# sourceMappingURL=SectionHeader.styled.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SectionHeader.styled.cjs.js","sources":["../../../../../../src/containers/Views/ViewsMenu/SectionHeader.styled.ts"],"sourcesContent":["import styled from 'styled-components'\nimport { theme } from '@ynput/ayon-react-components'\n\nexport const SectionHeader = styled.li`\n ${theme.labelSmall}\n color: var(--md-sys-color-outline);\n user-select: none;\n border-radius: var(--border-radius-m);\n height: 28px;\n padding: 0 8px;\n\n display: flex;\n align-items: center;\n gap: var(--base-gap-small);\n\n cursor: pointer;\n\n &:hover {\n background-color: var(--md-sys-color-surface-container-high-hover);\n }\n\n .spacer {\n flex: 1;\n }\n .icon {\n font-size: 18px;\n color: var(--md-sys-color-outline);\n display: none;\n }\n\n &:hover .icon {\n display: inline-flex;\n }\n`\n"],"names":["theme"],"mappings":";;;;AAGO,MAAM,gBAAgB,OAAO;AAAA,IAChCA,0BAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;"}
@@ -0,0 +1,37 @@
1
+ import styled from "styled-components";
2
+ import { theme } from "@ynput/ayon-react-components";
3
+ const SectionHeader = styled.li`
4
+ ${theme.labelSmall}
5
+ color: var(--md-sys-color-outline);
6
+ user-select: none;
7
+ border-radius: var(--border-radius-m);
8
+ height: 28px;
9
+ padding: 0 8px;
10
+
11
+ display: flex;
12
+ align-items: center;
13
+ gap: var(--base-gap-small);
14
+
15
+ cursor: pointer;
16
+
17
+ &:hover {
18
+ background-color: var(--md-sys-color-surface-container-high-hover);
19
+ }
20
+
21
+ .spacer {
22
+ flex: 1;
23
+ }
24
+ .icon {
25
+ font-size: 18px;
26
+ color: var(--md-sys-color-outline);
27
+ display: none;
28
+ }
29
+
30
+ &:hover .icon {
31
+ display: inline-flex;
32
+ }
33
+ `;
34
+ export {
35
+ SectionHeader
36
+ };
37
+ //# sourceMappingURL=SectionHeader.styled.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SectionHeader.styled.es.js","sources":["../../../../../../src/containers/Views/ViewsMenu/SectionHeader.styled.ts"],"sourcesContent":["import styled from 'styled-components'\nimport { theme } from '@ynput/ayon-react-components'\n\nexport const SectionHeader = styled.li`\n ${theme.labelSmall}\n color: var(--md-sys-color-outline);\n user-select: none;\n border-radius: var(--border-radius-m);\n height: 28px;\n padding: 0 8px;\n\n display: flex;\n align-items: center;\n gap: var(--base-gap-small);\n\n cursor: pointer;\n\n &:hover {\n background-color: var(--md-sys-color-surface-container-high-hover);\n }\n\n .spacer {\n flex: 1;\n }\n .icon {\n font-size: 18px;\n color: var(--md-sys-color-outline);\n display: none;\n }\n\n &:hover .icon {\n display: inline-flex;\n }\n`\n"],"names":[],"mappings":";;AAGO,MAAM,gBAAgB,OAAO;AAAA,IAChC,MAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;"}
@@ -4,14 +4,25 @@ const jsxRuntime = require("../../../../../_virtual/jsx-runtime.cjs.js");
4
4
  const React = require("react");
5
5
  const ViewItem = require("../ViewItem/ViewItem.cjs.js");
6
6
  const ViewsMenu_styled = require("./ViewsMenu.styled.cjs.js");
7
+ const SectionHeader = require("./SectionHeader.cjs.js");
7
8
  const VIEW_DIVIDER = "_divider_";
9
+ const isSectionHeader = (item) => typeof item === "object" && item !== null && "type" in item && item.type === "section";
8
10
  const ViewsMenu = React.forwardRef(
9
11
  ({ items, selected, ...props }, ref) => {
10
12
  return /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(ViewsMenu_styled.Scrollable, { children: /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(ViewsMenu_styled.ViewsMenu, { ...props, ref, children: items.map((item, index) => {
11
13
  if (item === "_divider_") {
12
14
  return /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(ViewsMenu_styled.ViewsMenuDivider, {}, index);
13
- } else if (typeof item === "string") {
14
- return /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(ViewsMenu_styled.ViewsMenuTitle, { children: item }, index);
15
+ } else if (isSectionHeader(item)) {
16
+ return /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(
17
+ SectionHeader.SectionHeader,
18
+ {
19
+ id: item.id,
20
+ title: item.title,
21
+ collapsed: item.collapsed,
22
+ onClick: item.onToggle
23
+ },
24
+ item.id
25
+ );
15
26
  } else {
16
27
  return /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(
17
28
  ViewItem.ViewItem,
@@ -1 +1 @@
1
- {"version":3,"file":"ViewsMenu.cjs.js","sources":["../../../../../../src/containers/Views/ViewsMenu/ViewsMenu.tsx"],"sourcesContent":["import { forwardRef } from 'react'\nimport { ViewItem } from '../ViewItem/ViewItem'\nimport * as Styled from './ViewsMenu.styled'\n\nexport const VIEW_DIVIDER = '_divider_' as const // Represents a divider\ntype Title = string // Represents a title\nexport type ViewMenuItem = ViewItem | typeof VIEW_DIVIDER | Title\n\nexport interface ViewsMenuProps extends React.HTMLAttributes<HTMLUListElement> {\n items: ViewMenuItem[] // Array of ViewMenuItem or string\n selected: string\n}\n\nexport const ViewsMenu = forwardRef<HTMLUListElement, ViewsMenuProps>(\n ({ items, selected, ...props }, ref) => {\n return (\n <Styled.Scrollable>\n <Styled.ViewsMenu {...props} ref={ref}>\n {items.map((item, index) => {\n if (item === '_divider_') {\n return <Styled.ViewsMenuDivider key={index} />\n } else if (typeof item === 'string') {\n return <Styled.ViewsMenuTitle key={index}>{item}</Styled.ViewsMenuTitle>\n } else {\n return (\n <ViewItem\n key={(item.id || '') + index.toString()}\n tabIndex={0}\n isSelected={item.id === selected}\n autoFocus={index === 0}\n {...item}\n />\n )\n }\n })}\n </Styled.ViewsMenu>\n </Styled.Scrollable>\n )\n },\n)\n"],"names":["forwardRef","jsx","Styled.Scrollable","Styled.ViewsMenu","Styled.ViewsMenuDivider","Styled.ViewsMenuTitle","ViewItem"],"mappings":";;;;;;AAIO,MAAM,eAAe;AASrB,MAAM,YAAYA,MAAA;AAAA,EACvB,CAAC,EAAE,OAAO,UAAU,GAAG,MAAA,GAAS,QAAQ;AACtC,WACGC,2BAAAA,kBAAAA,IAAAC,iBAAAA,YAAA,EACC,2DAACC,iBAAO,WAAP,EAAkB,GAAG,OAAO,KAC1B,UAAA,MAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,UAAI,SAAS,aAAa;AACxB,eAAQF,iDAAAG,iBAAAA,kBAAA,CAAA,GAA6B,KAAO;AAAA,MAAA,WACnC,OAAO,SAAS,UAAU;AACnC,eAAQH,2BAAAA,kBAAAA,IAAAI,iBAAAA,gBAAA,EAAmC,kBAAR,KAAa;AAAA,MAAA,OAC3C;AAEH,eAAAJ,2BAAA,kBAAA;AAAA,UAACK,SAAA;AAAA,UAAA;AAAA,YAEC,UAAU;AAAA,YACV,YAAY,KAAK,OAAO;AAAA,YACxB,WAAW,UAAU;AAAA,YACpB,GAAG;AAAA,UAAA;AAAA,WAJE,KAAK,MAAM,MAAM,MAAM,SAAS;AAAA,QAKxC;AAAA,MAAA;AAAA,IAEJ,CACD,GACH,EACF,CAAA;AAAA,EAAA;AAGN;;;"}
1
+ {"version":3,"file":"ViewsMenu.cjs.js","sources":["../../../../../../src/containers/Views/ViewsMenu/ViewsMenu.tsx"],"sourcesContent":["import { forwardRef } from 'react'\nimport { ViewItem } from '../ViewItem/ViewItem'\nimport * as Styled from './ViewsMenu.styled'\nimport { SectionHeader } from './SectionHeader'\n\nexport const VIEW_DIVIDER = '_divider_' as const // Represents a divider\nexport type ViewSectionHeader = {\n type: 'section'\n id: string\n title: string\n collapsed?: boolean\n onToggle?: () => void\n}\nexport type ViewMenuItem = ViewItem | typeof VIEW_DIVIDER | ViewSectionHeader\n\nexport interface ViewsMenuProps extends React.HTMLAttributes<HTMLUListElement> {\n items: ViewMenuItem[] // Array of ViewMenuItem or string\n selected: string\n}\n\nconst isSectionHeader = (item: ViewMenuItem): item is ViewSectionHeader =>\n typeof item === 'object' && item !== null && 'type' in item && (item as any).type === 'section'\n\nexport const ViewsMenu = forwardRef<HTMLUListElement, ViewsMenuProps>(\n ({ items, selected, ...props }, ref) => {\n return (\n <Styled.Scrollable>\n <Styled.ViewsMenu {...props} ref={ref}>\n {items.map((item, index) => {\n if (item === '_divider_') {\n return <Styled.ViewsMenuDivider key={index} />\n } else if (isSectionHeader(item)) {\n return (\n <SectionHeader\n key={item.id}\n id={item.id}\n title={item.title}\n collapsed={item.collapsed}\n onClick={item.onToggle}\n />\n )\n } else {\n return (\n <ViewItem\n key={(item.id || '') + index.toString()}\n tabIndex={0}\n isSelected={item.id === selected}\n autoFocus={index === 0}\n {...item}\n />\n )\n }\n })}\n </Styled.ViewsMenu>\n </Styled.Scrollable>\n )\n },\n)\n"],"names":["forwardRef","jsx","Styled.Scrollable","Styled.ViewsMenu","Styled.ViewsMenuDivider","SectionHeader","ViewItem"],"mappings":";;;;;;;AAKO,MAAM,eAAe;AAe5B,MAAM,kBAAkB,CAAC,SACvB,OAAO,SAAS,YAAY,SAAS,QAAQ,UAAU,QAAS,KAAa,SAAS;AAEjF,MAAM,YAAYA,MAAA;AAAA,EACvB,CAAC,EAAE,OAAO,UAAU,GAAG,MAAA,GAAS,QAAQ;AACtC,WACGC,2BAAAA,kBAAAA,IAAAC,iBAAAA,YAAA,EACC,2DAACC,iBAAO,WAAP,EAAkB,GAAG,OAAO,KAC1B,UAAA,MAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,UAAI,SAAS,aAAa;AACxB,eAAQF,iDAAAG,iBAAAA,kBAAA,CAAA,GAA6B,KAAO;AAAA,MAAA,WACnC,gBAAgB,IAAI,GAAG;AAE9B,eAAAH,2BAAA,kBAAA;AAAA,UAACI,cAAA;AAAA,UAAA;AAAA,YAEC,IAAI,KAAK;AAAA,YACT,OAAO,KAAK;AAAA,YACZ,WAAW,KAAK;AAAA,YAChB,SAAS,KAAK;AAAA,UAAA;AAAA,UAJT,KAAK;AAAA,QAKZ;AAAA,MAAA,OAEG;AAEH,eAAAJ,2BAAA,kBAAA;AAAA,UAACK,SAAA;AAAA,UAAA;AAAA,YAEC,UAAU;AAAA,YACV,YAAY,KAAK,OAAO;AAAA,YACxB,WAAW,UAAU;AAAA,YACpB,GAAG;AAAA,UAAA;AAAA,WAJE,KAAK,MAAM,MAAM,MAAM,SAAS;AAAA,QAKxC;AAAA,MAAA;AAAA,IAEJ,CACD,GACH,EACF,CAAA;AAAA,EAAA;AAGN;;;"}
@@ -1,15 +1,26 @@
1
1
  import { j as jsxRuntimeExports } from "../../../../../_virtual/jsx-runtime.es.js";
2
2
  import { forwardRef } from "react";
3
3
  import { ViewItem } from "../ViewItem/ViewItem.es.js";
4
- import { Scrollable, ViewsMenu as ViewsMenu$1, ViewsMenuDivider, ViewsMenuTitle } from "./ViewsMenu.styled.es.js";
4
+ import { Scrollable, ViewsMenu as ViewsMenu$1, ViewsMenuDivider } from "./ViewsMenu.styled.es.js";
5
+ import { SectionHeader } from "./SectionHeader.es.js";
5
6
  const VIEW_DIVIDER = "_divider_";
7
+ const isSectionHeader = (item) => typeof item === "object" && item !== null && "type" in item && item.type === "section";
6
8
  const ViewsMenu = forwardRef(
7
9
  ({ items, selected, ...props }, ref) => {
8
10
  return /* @__PURE__ */ jsxRuntimeExports.jsx(Scrollable, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(ViewsMenu$1, { ...props, ref, children: items.map((item, index) => {
9
11
  if (item === "_divider_") {
10
12
  return /* @__PURE__ */ jsxRuntimeExports.jsx(ViewsMenuDivider, {}, index);
11
- } else if (typeof item === "string") {
12
- return /* @__PURE__ */ jsxRuntimeExports.jsx(ViewsMenuTitle, { children: item }, index);
13
+ } else if (isSectionHeader(item)) {
14
+ return /* @__PURE__ */ jsxRuntimeExports.jsx(
15
+ SectionHeader,
16
+ {
17
+ id: item.id,
18
+ title: item.title,
19
+ collapsed: item.collapsed,
20
+ onClick: item.onToggle
21
+ },
22
+ item.id
23
+ );
13
24
  } else {
14
25
  return /* @__PURE__ */ jsxRuntimeExports.jsx(
15
26
  ViewItem,
@@ -1 +1 @@
1
- {"version":3,"file":"ViewsMenu.es.js","sources":["../../../../../../src/containers/Views/ViewsMenu/ViewsMenu.tsx"],"sourcesContent":["import { forwardRef } from 'react'\nimport { ViewItem } from '../ViewItem/ViewItem'\nimport * as Styled from './ViewsMenu.styled'\n\nexport const VIEW_DIVIDER = '_divider_' as const // Represents a divider\ntype Title = string // Represents a title\nexport type ViewMenuItem = ViewItem | typeof VIEW_DIVIDER | Title\n\nexport interface ViewsMenuProps extends React.HTMLAttributes<HTMLUListElement> {\n items: ViewMenuItem[] // Array of ViewMenuItem or string\n selected: string\n}\n\nexport const ViewsMenu = forwardRef<HTMLUListElement, ViewsMenuProps>(\n ({ items, selected, ...props }, ref) => {\n return (\n <Styled.Scrollable>\n <Styled.ViewsMenu {...props} ref={ref}>\n {items.map((item, index) => {\n if (item === '_divider_') {\n return <Styled.ViewsMenuDivider key={index} />\n } else if (typeof item === 'string') {\n return <Styled.ViewsMenuTitle key={index}>{item}</Styled.ViewsMenuTitle>\n } else {\n return (\n <ViewItem\n key={(item.id || '') + index.toString()}\n tabIndex={0}\n isSelected={item.id === selected}\n autoFocus={index === 0}\n {...item}\n />\n )\n }\n })}\n </Styled.ViewsMenu>\n </Styled.Scrollable>\n )\n },\n)\n"],"names":["jsx","Styled.Scrollable","Styled.ViewsMenu","Styled.ViewsMenuDivider","Styled.ViewsMenuTitle"],"mappings":";;;;AAIO,MAAM,eAAe;AASrB,MAAM,YAAY;AAAA,EACvB,CAAC,EAAE,OAAO,UAAU,GAAG,MAAA,GAAS,QAAQ;AACtC,WACGA,kCAAAA,IAAAC,YAAA,EACC,gDAACC,aAAA,EAAkB,GAAG,OAAO,KAC1B,UAAA,MAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,UAAI,SAAS,aAAa;AACxB,eAAQF,sCAAAG,kBAAA,CAAA,GAA6B,KAAO;AAAA,MAAA,WACnC,OAAO,SAAS,UAAU;AACnC,eAAQH,kCAAAA,IAAAI,gBAAA,EAAmC,kBAAR,KAAa;AAAA,MAAA,OAC3C;AAEH,eAAAJ,kCAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,UAAU;AAAA,YACV,YAAY,KAAK,OAAO;AAAA,YACxB,WAAW,UAAU;AAAA,YACpB,GAAG;AAAA,UAAA;AAAA,WAJE,KAAK,MAAM,MAAM,MAAM,SAAS;AAAA,QAKxC;AAAA,MAAA;AAAA,IAEJ,CACD,GACH,EACF,CAAA;AAAA,EAAA;AAGN;"}
1
+ {"version":3,"file":"ViewsMenu.es.js","sources":["../../../../../../src/containers/Views/ViewsMenu/ViewsMenu.tsx"],"sourcesContent":["import { forwardRef } from 'react'\nimport { ViewItem } from '../ViewItem/ViewItem'\nimport * as Styled from './ViewsMenu.styled'\nimport { SectionHeader } from './SectionHeader'\n\nexport const VIEW_DIVIDER = '_divider_' as const // Represents a divider\nexport type ViewSectionHeader = {\n type: 'section'\n id: string\n title: string\n collapsed?: boolean\n onToggle?: () => void\n}\nexport type ViewMenuItem = ViewItem | typeof VIEW_DIVIDER | ViewSectionHeader\n\nexport interface ViewsMenuProps extends React.HTMLAttributes<HTMLUListElement> {\n items: ViewMenuItem[] // Array of ViewMenuItem or string\n selected: string\n}\n\nconst isSectionHeader = (item: ViewMenuItem): item is ViewSectionHeader =>\n typeof item === 'object' && item !== null && 'type' in item && (item as any).type === 'section'\n\nexport const ViewsMenu = forwardRef<HTMLUListElement, ViewsMenuProps>(\n ({ items, selected, ...props }, ref) => {\n return (\n <Styled.Scrollable>\n <Styled.ViewsMenu {...props} ref={ref}>\n {items.map((item, index) => {\n if (item === '_divider_') {\n return <Styled.ViewsMenuDivider key={index} />\n } else if (isSectionHeader(item)) {\n return (\n <SectionHeader\n key={item.id}\n id={item.id}\n title={item.title}\n collapsed={item.collapsed}\n onClick={item.onToggle}\n />\n )\n } else {\n return (\n <ViewItem\n key={(item.id || '') + index.toString()}\n tabIndex={0}\n isSelected={item.id === selected}\n autoFocus={index === 0}\n {...item}\n />\n )\n }\n })}\n </Styled.ViewsMenu>\n </Styled.Scrollable>\n )\n },\n)\n"],"names":["jsx","Styled.Scrollable","Styled.ViewsMenu","Styled.ViewsMenuDivider"],"mappings":";;;;;AAKO,MAAM,eAAe;AAe5B,MAAM,kBAAkB,CAAC,SACvB,OAAO,SAAS,YAAY,SAAS,QAAQ,UAAU,QAAS,KAAa,SAAS;AAEjF,MAAM,YAAY;AAAA,EACvB,CAAC,EAAE,OAAO,UAAU,GAAG,MAAA,GAAS,QAAQ;AACtC,WACGA,kCAAAA,IAAAC,YAAA,EACC,gDAACC,aAAA,EAAkB,GAAG,OAAO,KAC1B,UAAA,MAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,UAAI,SAAS,aAAa;AACxB,eAAQF,sCAAAG,kBAAA,CAAA,GAA6B,KAAO;AAAA,MAAA,WACnC,gBAAgB,IAAI,GAAG;AAE9B,eAAAH,kCAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,IAAI,KAAK;AAAA,YACT,OAAO,KAAK;AAAA,YACZ,WAAW,KAAK;AAAA,YAChB,SAAS,KAAK;AAAA,UAAA;AAAA,UAJT,KAAK;AAAA,QAKZ;AAAA,MAAA,OAEG;AAEH,eAAAA,kCAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,UAAU;AAAA,YACV,YAAY,KAAK,OAAO;AAAA,YACxB,WAAW,UAAU;AAAA,YACpB,GAAG;AAAA,UAAA;AAAA,WAJE,KAAK,MAAM,MAAM,MAAM,SAAS;AAAA,QAKxC;AAAA,MAAA;AAAA,IAEJ,CACD,GACH,EACF,CAAA;AAAA,EAAA;AAGN;"}
@@ -22,12 +22,11 @@ const ViewsMenuDivider = styled.li`
22
22
  background-color: var(--md-sys-color-outline-variant);
23
23
  margin: 4px 0;
24
24
  `;
25
- const ViewsMenuTitle = styled.li`
25
+ styled.li`
26
26
  ${ayonReactComponents.theme.labelSmall}
27
27
  color: var(--md-sys-color-outline);
28
28
  `;
29
29
  exports.Scrollable = Scrollable;
30
30
  exports.ViewsMenu = ViewsMenu;
31
31
  exports.ViewsMenuDivider = ViewsMenuDivider;
32
- exports.ViewsMenuTitle = ViewsMenuTitle;
33
32
  //# sourceMappingURL=ViewsMenu.styled.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ViewsMenu.styled.cjs.js","sources":["../../../../../../src/containers/Views/ViewsMenu/ViewsMenu.styled.ts"],"sourcesContent":["import { theme } from '@ynput/ayon-react-components'\nimport styled from 'styled-components'\n\nexport const Scrollable = styled.div`\n overflow: auto;\n max-height: 40vh;\n`\n\nexport const ViewsMenu = styled.ul`\n /* reset defaults */\n margin: 0;\n padding: 0;\n list-style: none;\n\n display: flex;\n flex-direction: column;\n gap: var(--base-gap-small);\n margin-bottom: var(--padding-s);\n`\n\n// 1px line divider\nexport const ViewsMenuDivider = styled.li`\n height: 1px;\n background-color: var(--md-sys-color-outline-variant);\n margin: 4px 0;\n`\n\nexport const ViewsMenuTitle = styled.li`\n ${theme.labelSmall}\n color: var(--md-sys-color-outline);\n`\n"],"names":["theme"],"mappings":";;;;AAGO,MAAM,aAAa,OAAO;AAAA;AAAA;AAAA;AAK1B,MAAM,YAAY,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAazB,MAAM,mBAAmB,OAAO;AAAA;AAAA;AAAA;AAAA;AAMhC,MAAM,iBAAiB,OAAO;AAAA,IACjCA,0BAAM,UAAU;AAAA;AAAA;;;;;"}
1
+ {"version":3,"file":"ViewsMenu.styled.cjs.js","sources":["../../../../../../src/containers/Views/ViewsMenu/ViewsMenu.styled.ts"],"sourcesContent":["import { theme } from '@ynput/ayon-react-components'\nimport styled from 'styled-components'\n\nexport const Scrollable = styled.div`\n overflow: auto;\n max-height: 40vh;\n`\n\nexport const ViewsMenu = styled.ul`\n /* reset defaults */\n margin: 0;\n padding: 0;\n list-style: none;\n\n display: flex;\n flex-direction: column;\n gap: var(--base-gap-small);\n margin-bottom: var(--padding-s);\n`\n\n// 1px line divider\nexport const ViewsMenuDivider = styled.li`\n height: 1px;\n background-color: var(--md-sys-color-outline-variant);\n margin: 4px 0;\n`\n\nexport const ViewsMenuTitle = styled.li`\n ${theme.labelSmall}\n color: var(--md-sys-color-outline);\n`\n"],"names":["theme"],"mappings":";;;;AAGO,MAAM,aAAa,OAAO;AAAA;AAAA;AAAA;AAK1B,MAAM,YAAY,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAazB,MAAM,mBAAmB,OAAO;AAAA;AAAA;AAAA;AAAA;AAMT,OAAO;AAAA,IACjCA,0BAAM,UAAU;AAAA;AAAA;;;;"}
@@ -20,14 +20,13 @@ const ViewsMenuDivider = styled.li`
20
20
  background-color: var(--md-sys-color-outline-variant);
21
21
  margin: 4px 0;
22
22
  `;
23
- const ViewsMenuTitle = styled.li`
23
+ styled.li`
24
24
  ${theme.labelSmall}
25
25
  color: var(--md-sys-color-outline);
26
26
  `;
27
27
  export {
28
28
  Scrollable,
29
29
  ViewsMenu,
30
- ViewsMenuDivider,
31
- ViewsMenuTitle
30
+ ViewsMenuDivider
32
31
  };
33
32
  //# sourceMappingURL=ViewsMenu.styled.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ViewsMenu.styled.es.js","sources":["../../../../../../src/containers/Views/ViewsMenu/ViewsMenu.styled.ts"],"sourcesContent":["import { theme } from '@ynput/ayon-react-components'\nimport styled from 'styled-components'\n\nexport const Scrollable = styled.div`\n overflow: auto;\n max-height: 40vh;\n`\n\nexport const ViewsMenu = styled.ul`\n /* reset defaults */\n margin: 0;\n padding: 0;\n list-style: none;\n\n display: flex;\n flex-direction: column;\n gap: var(--base-gap-small);\n margin-bottom: var(--padding-s);\n`\n\n// 1px line divider\nexport const ViewsMenuDivider = styled.li`\n height: 1px;\n background-color: var(--md-sys-color-outline-variant);\n margin: 4px 0;\n`\n\nexport const ViewsMenuTitle = styled.li`\n ${theme.labelSmall}\n color: var(--md-sys-color-outline);\n`\n"],"names":[],"mappings":";;AAGO,MAAM,aAAa,OAAO;AAAA;AAAA;AAAA;AAK1B,MAAM,YAAY,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAazB,MAAM,mBAAmB,OAAO;AAAA;AAAA;AAAA;AAAA;AAMhC,MAAM,iBAAiB,OAAO;AAAA,IACjC,MAAM,UAAU;AAAA;AAAA;"}
1
+ {"version":3,"file":"ViewsMenu.styled.es.js","sources":["../../../../../../src/containers/Views/ViewsMenu/ViewsMenu.styled.ts"],"sourcesContent":["import { theme } from '@ynput/ayon-react-components'\nimport styled from 'styled-components'\n\nexport const Scrollable = styled.div`\n overflow: auto;\n max-height: 40vh;\n`\n\nexport const ViewsMenu = styled.ul`\n /* reset defaults */\n margin: 0;\n padding: 0;\n list-style: none;\n\n display: flex;\n flex-direction: column;\n gap: var(--base-gap-small);\n margin-bottom: var(--padding-s);\n`\n\n// 1px line divider\nexport const ViewsMenuDivider = styled.li`\n height: 1px;\n background-color: var(--md-sys-color-outline-variant);\n margin: 4px 0;\n`\n\nexport const ViewsMenuTitle = styled.li`\n ${theme.labelSmall}\n color: var(--md-sys-color-outline);\n`\n"],"names":[],"mappings":";;AAGO,MAAM,aAAa,OAAO;AAAA;AAAA;AAAA;AAK1B,MAAM,YAAY,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAazB,MAAM,mBAAmB,OAAO;AAAA;AAAA;AAAA;AAAA;AAMT,OAAO;AAAA,IACjC,MAAM,UAAU;AAAA;AAAA;"}
@@ -6,6 +6,7 @@ require("react-dom");
6
6
  require("../Views.styled.cjs.js");
7
7
  require("clsx");
8
8
  const ViewsMenuContainer = require("../ViewsMenuContainer/ViewsMenuContainer.cjs.js");
9
+ const useLocalStorage = require("../../../hooks/useLocalStorage.cjs.js");
9
10
  require("../../../context/RemoteModulesContext.cjs.js");
10
11
  require("../../../../../_virtual/runtime.cjs.js");
11
12
  require("../../../../../_virtual/semver.cjs.js");
@@ -125,6 +126,10 @@ const ViewsProvider = ({
125
126
  });
126
127
  const [isMenuOpen, setIsMenuOpen] = React.useState(false);
127
128
  const [editingView, setEditingView] = React.useState(null);
129
+ const [collapsedSections, setCollapsedSections] = useLocalStorage.useLocalStorage(
130
+ "collapsed-views",
131
+ {}
132
+ );
128
133
  const { data: shareOptions } = share.useGetShareOptionsQuery(
129
134
  { projectName },
130
135
  { skip: !powerLicense || !editingView }
@@ -1 +1 @@
1
- {"version":3,"file":"ViewsContext.cjs.js","sources":["../../../../../../src/containers/Views/context/ViewsContext.tsx"],"sourcesContent":["import { createContext, useContext, FC, ReactNode, useState, useMemo, useCallback } from 'react'\nimport { ViewType, WORKING_VIEW_ID } from '../index'\nimport {\n GetDefaultViewApiResponse,\n useGetCurrentUserQuery,\n useGetWorkingViewQuery,\n useGetViewQuery,\n useListViewsQuery,\n UserModel,\n ViewListItemModel,\n viewsQueries,\n useGetShareOptionsQuery,\n ShareOption,\n} from '@shared/api'\nimport useBuildViewMenuItems from '../hooks/useBuildViewMenuItems'\nimport { ViewMenuItem } from '../ViewsMenu/ViewsMenu'\nimport { usePowerpack } from '@shared/context'\nimport { useSelectedView } from '../hooks/useSelectedView'\nimport { UseViewMutations, useViewsMutations } from '../hooks/useViewsMutations'\nimport { useSaveViewFromCurrent } from '../hooks/useSaveViewFromCurrent'\nimport { useViewSettingsChanged } from '../hooks/useViewSettingsChanged'\n\nexport type ViewData = GetDefaultViewApiResponse\nexport type ViewSettings = GetDefaultViewApiResponse['settings']\nexport type SelectedViewState = ViewData | undefined // id of view otherwise null with use working\nexport type EditingViewState = string | true | null // id of view being edited otherwise null\n\nconst viewTypes = ['overview', 'taskProgress', 'lists'] as const\nexport interface ViewsContextValue {\n // State\n viewType?: ViewType\n projectName?: string\n currentUser?: UserModel\n isMenuOpen: boolean\n editingView: EditingViewState\n selectedView: SelectedViewState\n\n // Views data\n viewsList: ViewListItemModel[]\n viewSettings: ViewSettings | undefined\n workingSettings: ViewSettings | undefined\n workingView: ViewListItemModel | undefined\n editingViewId: string | undefined\n viewMenuItems: ViewMenuItem[]\n editingViewData?: ViewData\n isLoadingViews: boolean\n isViewWorking: boolean\n\n // Data\n shareOptions?: ShareOption[] // available users to share with (undefined means loading)\n\n // Actions\n setIsMenuOpen: (open: boolean) => void\n setEditingView: (editing: EditingViewState) => void\n setSelectedView: (viewId: string) => void\n onSettingsChanged: (changed: boolean) => void\n\n // Mutations\n onCreateView: UseViewMutations['onCreateView']\n onDeleteView: UseViewMutations['onDeleteView']\n onUpdateView: UseViewMutations['onUpdateView']\n\n // Actions (shared)\n resetWorkingView: () => Promise<void>\n\n // api\n api: typeof viewsQueries\n dispatch: any\n}\n\nconst ViewsContext = createContext<ViewsContextValue | null>(null)\n\nexport interface ViewsProviderProps {\n children: ReactNode\n viewType?: string\n projectName?: string\n dispatch?: any\n debug?: {\n powerLicense?: boolean\n }\n}\n\nexport const ViewsProvider: FC<ViewsProviderProps> = ({\n children,\n viewType: viewTypeProp,\n projectName,\n dispatch,\n debug,\n}) => {\n // validate viewType\n const viewType = viewTypes.includes(viewTypeProp as ViewType)\n ? (viewTypeProp as ViewType)\n : undefined\n\n let { powerLicense } = usePowerpack()\n if (debug?.powerLicense !== undefined) {\n console.warn('Using debug power license:', debug.powerLicense)\n powerLicense = debug.powerLicense\n }\n\n const { data: currentUser } = useGetCurrentUserQuery()\n\n const { onCreateView, onDeleteView, onUpdateView, onResetWorkingView } = useViewsMutations({\n viewType,\n projectName,\n })\n\n const [isMenuOpen, setIsMenuOpen] = useState(false)\n const [editingView, setEditingView] = useState<EditingViewState>(null)\n\n // when editing the view, get all users that can be shared to that view\n const { data: shareOptions } = useGetShareOptionsQuery(\n { projectName },\n { skip: !powerLicense || !editingView },\n )\n\n // setting of default views\n const [selectedView, setSelectedView, previousSelectedViewId] = useSelectedView({\n viewType: viewType as string,\n projectName: projectName,\n })\n\n const [viewSettingsChanged, setViewSettingsChanged] = useViewSettingsChanged({\n viewType: viewType as ViewType,\n })\n\n // Fetch views data\n const { currentData: viewsList = [], isLoading: isLoadingViews } = useListViewsQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n\n // always get your working view\n const { currentData: workingView } = useGetWorkingViewQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n\n const workingSettings = workingView?.settings\n\n // which settings to use for the view\n const viewSettings =\n !selectedView || selectedView.id === WORKING_VIEW_ID ? workingSettings : selectedView?.settings\n\n // is the working view selected?\n const isViewWorking = selectedView?.id === workingView?.id\n // were we just on a custom view and then edited it and ended up on the working view\n const editingViewId =\n viewSettingsChanged &&\n isViewWorking &&\n !!previousSelectedViewId &&\n previousSelectedViewId !== workingView?.id\n ? previousSelectedViewId\n : undefined\n\n // get data for the view we are editing\n const { currentData: editingViewDataData } = useGetViewQuery(\n { viewId: editingView as string, projectName: projectName, viewType: viewType as string },\n { skip: !(typeof editingView === 'string') || !powerLicense },\n )\n\n const editingViewData = useMemo(\n () => (editingView === editingViewDataData?.id ? editingViewDataData : undefined),\n [editingView, editingViewDataData],\n )\n\n const { onSaveViewFromCurrent } = useSaveViewFromCurrent({\n viewType: viewType,\n projectName,\n sourceSettings: viewSettings,\n onUpdateView: onUpdateView,\n })\n\n // Reset working view to default (empty) settings\n const resetWorkingView = useCallback(async () => {\n try {\n await onResetWorkingView({\n existingWorkingViewId: workingView?.id,\n selectedViewId: selectedView?.id,\n setSelectedView,\n setSettingsChanged: setViewSettingsChanged,\n notify: true,\n })\n } catch (error) {\n console.error('Failed to reset view:', error)\n }\n }, [workingView, onResetWorkingView, selectedView, setSelectedView, setViewSettingsChanged])\n\n // build the menu items for the views\n const viewMenuItems = useBuildViewMenuItems({\n viewsList,\n workingView,\n viewType,\n projectName,\n currentUser,\n useWorkingView: !powerLicense,\n editingViewId,\n onResetWorkingView,\n onSelect: (viewId) => {\n setSelectedView(viewId)\n // reset the settings changed state when switching views\n setViewSettingsChanged(false)\n // close the menu when selecting a view\n setIsMenuOpen(false)\n },\n onEdit: (viewId) => setEditingView(viewId),\n onSave: async (viewId) => onSaveViewFromCurrent(viewId),\n })\n\n const value: ViewsContextValue = {\n viewType,\n projectName,\n isMenuOpen,\n editingView,\n currentUser,\n selectedView,\n viewSettings,\n workingSettings,\n editingViewData,\n viewsList,\n workingView,\n editingViewId,\n viewMenuItems,\n isLoadingViews,\n isViewWorking,\n // data\n shareOptions,\n setIsMenuOpen,\n setEditingView,\n setSelectedView,\n onSettingsChanged: setViewSettingsChanged,\n // mutations\n onCreateView,\n onUpdateView,\n onDeleteView,\n // shared actions\n resetWorkingView,\n // api\n api: viewsQueries,\n dispatch,\n }\n\n return <ViewsContext.Provider value={value}>{children}</ViewsContext.Provider>\n}\n\nexport const useViewsContext = (): ViewsContextValue => {\n const context = useContext(ViewsContext)\n if (!context) {\n throw new Error('useViewsContext must be used within a ViewsProvider')\n }\n return context\n}\n"],"names":["createContext","usePowerpack","useGetCurrentUserQuery","useViewsMutations","useState","useGetShareOptionsQuery","useSelectedView","useViewSettingsChanged","useListViewsQuery","useGetWorkingViewQuery","WORKING_VIEW_ID","useGetViewQuery","useMemo","useSaveViewFromCurrent","useCallback","useBuildViewMenuItems","viewsQueries","jsx","useContext"],"mappings":"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"}
1
+ {"version":3,"file":"ViewsContext.cjs.js","sources":["../../../../../../src/containers/Views/context/ViewsContext.tsx"],"sourcesContent":["import { createContext, useContext, FC, ReactNode, useState, useMemo, useCallback } from 'react'\nimport { ViewType, WORKING_VIEW_ID } from '../index'\nimport {\n GetDefaultViewApiResponse,\n useGetCurrentUserQuery,\n useGetWorkingViewQuery,\n useGetViewQuery,\n useListViewsQuery,\n UserModel,\n ViewListItemModel,\n viewsQueries,\n useGetShareOptionsQuery,\n ShareOption,\n} from '@shared/api'\nimport useBuildViewMenuItems from '../hooks/useBuildViewMenuItems'\nimport { ViewMenuItem } from '../ViewsMenu/ViewsMenu'\nimport { usePowerpack } from '@shared/context'\nimport { useSelectedView } from '../hooks/useSelectedView'\nimport { UseViewMutations, useViewsMutations } from '../hooks/useViewsMutations'\nimport { useSaveViewFromCurrent } from '../hooks/useSaveViewFromCurrent'\nimport { useViewSettingsChanged } from '../hooks/useViewSettingsChanged'\nimport { useLocalStorage } from '@shared/hooks'\n\nexport type ViewData = GetDefaultViewApiResponse\nexport type ViewSettings = GetDefaultViewApiResponse['settings']\nexport type SelectedViewState = ViewData | undefined // id of view otherwise null with use working\nexport type EditingViewState = string | true | null // id of view being edited otherwise null\n\nconst viewTypes = ['overview', 'taskProgress', 'lists'] as const\nexport interface ViewsContextValue {\n // State\n viewType?: ViewType\n projectName?: string\n currentUser?: UserModel\n isMenuOpen: boolean\n editingView: EditingViewState\n selectedView: SelectedViewState\n\n // Views data\n viewsList: ViewListItemModel[]\n viewSettings: ViewSettings | undefined\n workingSettings: ViewSettings | undefined\n workingView: ViewListItemModel | undefined\n editingViewId: string | undefined\n viewMenuItems: ViewMenuItem[]\n editingViewData?: ViewData\n isLoadingViews: boolean\n isViewWorking: boolean\n\n // Data\n shareOptions?: ShareOption[] // available users to share with (undefined means loading)\n\n // Actions\n setIsMenuOpen: (open: boolean) => void\n setEditingView: (editing: EditingViewState) => void\n setSelectedView: (viewId: string) => void\n onSettingsChanged: (changed: boolean) => void\n\n // Mutations\n onCreateView: UseViewMutations['onCreateView']\n onDeleteView: UseViewMutations['onDeleteView']\n onUpdateView: UseViewMutations['onUpdateView']\n\n // Actions (shared)\n resetWorkingView: () => Promise<void>\n\n // api\n api: typeof viewsQueries\n dispatch: any\n}\n\nconst ViewsContext = createContext<ViewsContextValue | null>(null)\n\nexport interface ViewsProviderProps {\n children: ReactNode\n viewType?: string\n projectName?: string\n dispatch?: any\n debug?: {\n powerLicense?: boolean\n }\n}\n\nexport const ViewsProvider: FC<ViewsProviderProps> = ({\n children,\n viewType: viewTypeProp,\n projectName,\n dispatch,\n debug,\n}) => {\n // validate viewType\n const viewType = viewTypes.includes(viewTypeProp as ViewType)\n ? (viewTypeProp as ViewType)\n : undefined\n\n let { powerLicense } = usePowerpack()\n if (debug?.powerLicense !== undefined) {\n console.warn('Using debug power license:', debug.powerLicense)\n powerLicense = debug.powerLicense\n }\n\n const { data: currentUser } = useGetCurrentUserQuery()\n\n const { onCreateView, onDeleteView, onUpdateView, onResetWorkingView } = useViewsMutations({\n viewType,\n projectName,\n })\n\n const [isMenuOpen, setIsMenuOpen] = useState(false)\n const [editingView, setEditingView] = useState<EditingViewState>(null)\n const [collapsedSections, setCollapsedSections] = useLocalStorage<Record<string, boolean>>(\n 'collapsed-views',\n {},\n )\n\n // when editing the view, get all users that can be shared to that view\n const { data: shareOptions } = useGetShareOptionsQuery(\n { projectName },\n { skip: !powerLicense || !editingView },\n )\n\n // setting of default views\n const [selectedView, setSelectedView, previousSelectedViewId] = useSelectedView({\n viewType: viewType as string,\n projectName: projectName,\n })\n\n const [viewSettingsChanged, setViewSettingsChanged] = useViewSettingsChanged({\n viewType: viewType as ViewType,\n })\n\n // Fetch views data\n const { currentData: viewsList = [], isLoading: isLoadingViews } = useListViewsQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n\n // always get your working view\n const { currentData: workingView } = useGetWorkingViewQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n\n const workingSettings = workingView?.settings\n\n // which settings to use for the view\n const viewSettings =\n !selectedView || selectedView.id === WORKING_VIEW_ID ? workingSettings : selectedView?.settings\n\n // is the working view selected?\n const isViewWorking = selectedView?.id === workingView?.id\n // were we just on a custom view and then edited it and ended up on the working view\n const editingViewId =\n viewSettingsChanged &&\n isViewWorking &&\n !!previousSelectedViewId &&\n previousSelectedViewId !== workingView?.id\n ? previousSelectedViewId\n : undefined\n\n // get data for the view we are editing\n const { currentData: editingViewDataData } = useGetViewQuery(\n { viewId: editingView as string, projectName: projectName, viewType: viewType as string },\n { skip: !(typeof editingView === 'string') || !powerLicense },\n )\n\n const editingViewData = useMemo(\n () => (editingView === editingViewDataData?.id ? editingViewDataData : undefined),\n [editingView, editingViewDataData],\n )\n\n const { onSaveViewFromCurrent } = useSaveViewFromCurrent({\n viewType: viewType,\n projectName,\n sourceSettings: viewSettings,\n onUpdateView: onUpdateView,\n })\n\n // Reset working view to default (empty) settings\n const resetWorkingView = useCallback(async () => {\n try {\n await onResetWorkingView({\n existingWorkingViewId: workingView?.id,\n selectedViewId: selectedView?.id,\n setSelectedView,\n setSettingsChanged: setViewSettingsChanged,\n notify: true,\n })\n } catch (error) {\n console.error('Failed to reset view:', error)\n }\n }, [workingView, onResetWorkingView, selectedView, setSelectedView, setViewSettingsChanged])\n\n // build the menu items for the views\n const viewMenuItems = useBuildViewMenuItems({\n viewsList,\n workingView,\n viewType,\n projectName,\n currentUser,\n useWorkingView: !powerLicense,\n editingViewId,\n onResetWorkingView,\n onSelect: (viewId) => {\n setSelectedView(viewId)\n // reset the settings changed state when switching views\n setViewSettingsChanged(false)\n // close the menu when selecting a view\n setIsMenuOpen(false)\n },\n onEdit: (viewId) => setEditingView(viewId),\n onSave: async (viewId) => onSaveViewFromCurrent(viewId),\n })\n\n const value: ViewsContextValue = {\n viewType,\n projectName,\n isMenuOpen,\n editingView,\n currentUser,\n selectedView,\n viewSettings,\n workingSettings,\n editingViewData,\n viewsList,\n workingView,\n editingViewId,\n viewMenuItems,\n isLoadingViews,\n isViewWorking,\n // data\n shareOptions,\n setIsMenuOpen,\n setEditingView,\n setSelectedView,\n onSettingsChanged: setViewSettingsChanged,\n // mutations\n onCreateView,\n onUpdateView,\n onDeleteView,\n // shared actions\n resetWorkingView,\n // api\n api: viewsQueries,\n dispatch,\n }\n\n return <ViewsContext.Provider value={value}>{children}</ViewsContext.Provider>\n}\n\nexport const useViewsContext = (): ViewsContextValue => {\n const context = useContext(ViewsContext)\n if (!context) {\n throw new Error('useViewsContext must be used within a ViewsProvider')\n }\n return context\n}\n"],"names":["createContext","usePowerpack","useGetCurrentUserQuery","useViewsMutations","useState","useLocalStorage","useGetShareOptionsQuery","useSelectedView","useViewSettingsChanged","useListViewsQuery","useGetWorkingViewQuery","WORKING_VIEW_ID","useGetViewQuery","useMemo","useSaveViewFromCurrent","useCallback","useBuildViewMenuItems","viewsQueries","jsx","useContext"],"mappings":"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"}
@@ -4,6 +4,7 @@ import "react-dom";
4
4
  import "../Views.styled.es.js";
5
5
  import "clsx";
6
6
  import { WORKING_VIEW_ID } from "../ViewsMenuContainer/ViewsMenuContainer.es.js";
7
+ import { useLocalStorage } from "../../../hooks/useLocalStorage.es.js";
7
8
  import "../../../context/RemoteModulesContext.es.js";
8
9
  import "../../../../../_virtual/runtime.es.js";
9
10
  import "../../../../../_virtual/semver.es.js";
@@ -123,6 +124,10 @@ const ViewsProvider = ({
123
124
  });
124
125
  const [isMenuOpen, setIsMenuOpen] = useState(false);
125
126
  const [editingView, setEditingView] = useState(null);
127
+ const [collapsedSections, setCollapsedSections] = useLocalStorage(
128
+ "collapsed-views",
129
+ {}
130
+ );
126
131
  const { data: shareOptions } = useGetShareOptionsQuery(
127
132
  { projectName },
128
133
  { skip: !powerLicense || !editingView }
@@ -1 +1 @@
1
- {"version":3,"file":"ViewsContext.es.js","sources":["../../../../../../src/containers/Views/context/ViewsContext.tsx"],"sourcesContent":["import { createContext, useContext, FC, ReactNode, useState, useMemo, useCallback } from 'react'\nimport { ViewType, WORKING_VIEW_ID } from '../index'\nimport {\n GetDefaultViewApiResponse,\n useGetCurrentUserQuery,\n useGetWorkingViewQuery,\n useGetViewQuery,\n useListViewsQuery,\n UserModel,\n ViewListItemModel,\n viewsQueries,\n useGetShareOptionsQuery,\n ShareOption,\n} from '@shared/api'\nimport useBuildViewMenuItems from '../hooks/useBuildViewMenuItems'\nimport { ViewMenuItem } from '../ViewsMenu/ViewsMenu'\nimport { usePowerpack } from '@shared/context'\nimport { useSelectedView } from '../hooks/useSelectedView'\nimport { UseViewMutations, useViewsMutations } from '../hooks/useViewsMutations'\nimport { useSaveViewFromCurrent } from '../hooks/useSaveViewFromCurrent'\nimport { useViewSettingsChanged } from '../hooks/useViewSettingsChanged'\n\nexport type ViewData = GetDefaultViewApiResponse\nexport type ViewSettings = GetDefaultViewApiResponse['settings']\nexport type SelectedViewState = ViewData | undefined // id of view otherwise null with use working\nexport type EditingViewState = string | true | null // id of view being edited otherwise null\n\nconst viewTypes = ['overview', 'taskProgress', 'lists'] as const\nexport interface ViewsContextValue {\n // State\n viewType?: ViewType\n projectName?: string\n currentUser?: UserModel\n isMenuOpen: boolean\n editingView: EditingViewState\n selectedView: SelectedViewState\n\n // Views data\n viewsList: ViewListItemModel[]\n viewSettings: ViewSettings | undefined\n workingSettings: ViewSettings | undefined\n workingView: ViewListItemModel | undefined\n editingViewId: string | undefined\n viewMenuItems: ViewMenuItem[]\n editingViewData?: ViewData\n isLoadingViews: boolean\n isViewWorking: boolean\n\n // Data\n shareOptions?: ShareOption[] // available users to share with (undefined means loading)\n\n // Actions\n setIsMenuOpen: (open: boolean) => void\n setEditingView: (editing: EditingViewState) => void\n setSelectedView: (viewId: string) => void\n onSettingsChanged: (changed: boolean) => void\n\n // Mutations\n onCreateView: UseViewMutations['onCreateView']\n onDeleteView: UseViewMutations['onDeleteView']\n onUpdateView: UseViewMutations['onUpdateView']\n\n // Actions (shared)\n resetWorkingView: () => Promise<void>\n\n // api\n api: typeof viewsQueries\n dispatch: any\n}\n\nconst ViewsContext = createContext<ViewsContextValue | null>(null)\n\nexport interface ViewsProviderProps {\n children: ReactNode\n viewType?: string\n projectName?: string\n dispatch?: any\n debug?: {\n powerLicense?: boolean\n }\n}\n\nexport const ViewsProvider: FC<ViewsProviderProps> = ({\n children,\n viewType: viewTypeProp,\n projectName,\n dispatch,\n debug,\n}) => {\n // validate viewType\n const viewType = viewTypes.includes(viewTypeProp as ViewType)\n ? (viewTypeProp as ViewType)\n : undefined\n\n let { powerLicense } = usePowerpack()\n if (debug?.powerLicense !== undefined) {\n console.warn('Using debug power license:', debug.powerLicense)\n powerLicense = debug.powerLicense\n }\n\n const { data: currentUser } = useGetCurrentUserQuery()\n\n const { onCreateView, onDeleteView, onUpdateView, onResetWorkingView } = useViewsMutations({\n viewType,\n projectName,\n })\n\n const [isMenuOpen, setIsMenuOpen] = useState(false)\n const [editingView, setEditingView] = useState<EditingViewState>(null)\n\n // when editing the view, get all users that can be shared to that view\n const { data: shareOptions } = useGetShareOptionsQuery(\n { projectName },\n { skip: !powerLicense || !editingView },\n )\n\n // setting of default views\n const [selectedView, setSelectedView, previousSelectedViewId] = useSelectedView({\n viewType: viewType as string,\n projectName: projectName,\n })\n\n const [viewSettingsChanged, setViewSettingsChanged] = useViewSettingsChanged({\n viewType: viewType as ViewType,\n })\n\n // Fetch views data\n const { currentData: viewsList = [], isLoading: isLoadingViews } = useListViewsQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n\n // always get your working view\n const { currentData: workingView } = useGetWorkingViewQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n\n const workingSettings = workingView?.settings\n\n // which settings to use for the view\n const viewSettings =\n !selectedView || selectedView.id === WORKING_VIEW_ID ? workingSettings : selectedView?.settings\n\n // is the working view selected?\n const isViewWorking = selectedView?.id === workingView?.id\n // were we just on a custom view and then edited it and ended up on the working view\n const editingViewId =\n viewSettingsChanged &&\n isViewWorking &&\n !!previousSelectedViewId &&\n previousSelectedViewId !== workingView?.id\n ? previousSelectedViewId\n : undefined\n\n // get data for the view we are editing\n const { currentData: editingViewDataData } = useGetViewQuery(\n { viewId: editingView as string, projectName: projectName, viewType: viewType as string },\n { skip: !(typeof editingView === 'string') || !powerLicense },\n )\n\n const editingViewData = useMemo(\n () => (editingView === editingViewDataData?.id ? editingViewDataData : undefined),\n [editingView, editingViewDataData],\n )\n\n const { onSaveViewFromCurrent } = useSaveViewFromCurrent({\n viewType: viewType,\n projectName,\n sourceSettings: viewSettings,\n onUpdateView: onUpdateView,\n })\n\n // Reset working view to default (empty) settings\n const resetWorkingView = useCallback(async () => {\n try {\n await onResetWorkingView({\n existingWorkingViewId: workingView?.id,\n selectedViewId: selectedView?.id,\n setSelectedView,\n setSettingsChanged: setViewSettingsChanged,\n notify: true,\n })\n } catch (error) {\n console.error('Failed to reset view:', error)\n }\n }, [workingView, onResetWorkingView, selectedView, setSelectedView, setViewSettingsChanged])\n\n // build the menu items for the views\n const viewMenuItems = useBuildViewMenuItems({\n viewsList,\n workingView,\n viewType,\n projectName,\n currentUser,\n useWorkingView: !powerLicense,\n editingViewId,\n onResetWorkingView,\n onSelect: (viewId) => {\n setSelectedView(viewId)\n // reset the settings changed state when switching views\n setViewSettingsChanged(false)\n // close the menu when selecting a view\n setIsMenuOpen(false)\n },\n onEdit: (viewId) => setEditingView(viewId),\n onSave: async (viewId) => onSaveViewFromCurrent(viewId),\n })\n\n const value: ViewsContextValue = {\n viewType,\n projectName,\n isMenuOpen,\n editingView,\n currentUser,\n selectedView,\n viewSettings,\n workingSettings,\n editingViewData,\n viewsList,\n workingView,\n editingViewId,\n viewMenuItems,\n isLoadingViews,\n isViewWorking,\n // data\n shareOptions,\n setIsMenuOpen,\n setEditingView,\n setSelectedView,\n onSettingsChanged: setViewSettingsChanged,\n // mutations\n onCreateView,\n onUpdateView,\n onDeleteView,\n // shared actions\n resetWorkingView,\n // api\n api: viewsQueries,\n dispatch,\n }\n\n return <ViewsContext.Provider value={value}>{children}</ViewsContext.Provider>\n}\n\nexport const useViewsContext = (): ViewsContextValue => {\n const context = useContext(ViewsContext)\n if (!context) {\n throw new Error('useViewsContext must be used within a ViewsProvider')\n }\n return context\n}\n"],"names":["viewsQueries","jsx"],"mappings":"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"}
1
+ {"version":3,"file":"ViewsContext.es.js","sources":["../../../../../../src/containers/Views/context/ViewsContext.tsx"],"sourcesContent":["import { createContext, useContext, FC, ReactNode, useState, useMemo, useCallback } from 'react'\nimport { ViewType, WORKING_VIEW_ID } from '../index'\nimport {\n GetDefaultViewApiResponse,\n useGetCurrentUserQuery,\n useGetWorkingViewQuery,\n useGetViewQuery,\n useListViewsQuery,\n UserModel,\n ViewListItemModel,\n viewsQueries,\n useGetShareOptionsQuery,\n ShareOption,\n} from '@shared/api'\nimport useBuildViewMenuItems from '../hooks/useBuildViewMenuItems'\nimport { ViewMenuItem } from '../ViewsMenu/ViewsMenu'\nimport { usePowerpack } from '@shared/context'\nimport { useSelectedView } from '../hooks/useSelectedView'\nimport { UseViewMutations, useViewsMutations } from '../hooks/useViewsMutations'\nimport { useSaveViewFromCurrent } from '../hooks/useSaveViewFromCurrent'\nimport { useViewSettingsChanged } from '../hooks/useViewSettingsChanged'\nimport { useLocalStorage } from '@shared/hooks'\n\nexport type ViewData = GetDefaultViewApiResponse\nexport type ViewSettings = GetDefaultViewApiResponse['settings']\nexport type SelectedViewState = ViewData | undefined // id of view otherwise null with use working\nexport type EditingViewState = string | true | null // id of view being edited otherwise null\n\nconst viewTypes = ['overview', 'taskProgress', 'lists'] as const\nexport interface ViewsContextValue {\n // State\n viewType?: ViewType\n projectName?: string\n currentUser?: UserModel\n isMenuOpen: boolean\n editingView: EditingViewState\n selectedView: SelectedViewState\n\n // Views data\n viewsList: ViewListItemModel[]\n viewSettings: ViewSettings | undefined\n workingSettings: ViewSettings | undefined\n workingView: ViewListItemModel | undefined\n editingViewId: string | undefined\n viewMenuItems: ViewMenuItem[]\n editingViewData?: ViewData\n isLoadingViews: boolean\n isViewWorking: boolean\n\n // Data\n shareOptions?: ShareOption[] // available users to share with (undefined means loading)\n\n // Actions\n setIsMenuOpen: (open: boolean) => void\n setEditingView: (editing: EditingViewState) => void\n setSelectedView: (viewId: string) => void\n onSettingsChanged: (changed: boolean) => void\n\n // Mutations\n onCreateView: UseViewMutations['onCreateView']\n onDeleteView: UseViewMutations['onDeleteView']\n onUpdateView: UseViewMutations['onUpdateView']\n\n // Actions (shared)\n resetWorkingView: () => Promise<void>\n\n // api\n api: typeof viewsQueries\n dispatch: any\n}\n\nconst ViewsContext = createContext<ViewsContextValue | null>(null)\n\nexport interface ViewsProviderProps {\n children: ReactNode\n viewType?: string\n projectName?: string\n dispatch?: any\n debug?: {\n powerLicense?: boolean\n }\n}\n\nexport const ViewsProvider: FC<ViewsProviderProps> = ({\n children,\n viewType: viewTypeProp,\n projectName,\n dispatch,\n debug,\n}) => {\n // validate viewType\n const viewType = viewTypes.includes(viewTypeProp as ViewType)\n ? (viewTypeProp as ViewType)\n : undefined\n\n let { powerLicense } = usePowerpack()\n if (debug?.powerLicense !== undefined) {\n console.warn('Using debug power license:', debug.powerLicense)\n powerLicense = debug.powerLicense\n }\n\n const { data: currentUser } = useGetCurrentUserQuery()\n\n const { onCreateView, onDeleteView, onUpdateView, onResetWorkingView } = useViewsMutations({\n viewType,\n projectName,\n })\n\n const [isMenuOpen, setIsMenuOpen] = useState(false)\n const [editingView, setEditingView] = useState<EditingViewState>(null)\n const [collapsedSections, setCollapsedSections] = useLocalStorage<Record<string, boolean>>(\n 'collapsed-views',\n {},\n )\n\n // when editing the view, get all users that can be shared to that view\n const { data: shareOptions } = useGetShareOptionsQuery(\n { projectName },\n { skip: !powerLicense || !editingView },\n )\n\n // setting of default views\n const [selectedView, setSelectedView, previousSelectedViewId] = useSelectedView({\n viewType: viewType as string,\n projectName: projectName,\n })\n\n const [viewSettingsChanged, setViewSettingsChanged] = useViewSettingsChanged({\n viewType: viewType as ViewType,\n })\n\n // Fetch views data\n const { currentData: viewsList = [], isLoading: isLoadingViews } = useListViewsQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n\n // always get your working view\n const { currentData: workingView } = useGetWorkingViewQuery(\n { projectName: projectName, viewType: viewType as string },\n { skip: !viewType },\n )\n\n const workingSettings = workingView?.settings\n\n // which settings to use for the view\n const viewSettings =\n !selectedView || selectedView.id === WORKING_VIEW_ID ? workingSettings : selectedView?.settings\n\n // is the working view selected?\n const isViewWorking = selectedView?.id === workingView?.id\n // were we just on a custom view and then edited it and ended up on the working view\n const editingViewId =\n viewSettingsChanged &&\n isViewWorking &&\n !!previousSelectedViewId &&\n previousSelectedViewId !== workingView?.id\n ? previousSelectedViewId\n : undefined\n\n // get data for the view we are editing\n const { currentData: editingViewDataData } = useGetViewQuery(\n { viewId: editingView as string, projectName: projectName, viewType: viewType as string },\n { skip: !(typeof editingView === 'string') || !powerLicense },\n )\n\n const editingViewData = useMemo(\n () => (editingView === editingViewDataData?.id ? editingViewDataData : undefined),\n [editingView, editingViewDataData],\n )\n\n const { onSaveViewFromCurrent } = useSaveViewFromCurrent({\n viewType: viewType,\n projectName,\n sourceSettings: viewSettings,\n onUpdateView: onUpdateView,\n })\n\n // Reset working view to default (empty) settings\n const resetWorkingView = useCallback(async () => {\n try {\n await onResetWorkingView({\n existingWorkingViewId: workingView?.id,\n selectedViewId: selectedView?.id,\n setSelectedView,\n setSettingsChanged: setViewSettingsChanged,\n notify: true,\n })\n } catch (error) {\n console.error('Failed to reset view:', error)\n }\n }, [workingView, onResetWorkingView, selectedView, setSelectedView, setViewSettingsChanged])\n\n // build the menu items for the views\n const viewMenuItems = useBuildViewMenuItems({\n viewsList,\n workingView,\n viewType,\n projectName,\n currentUser,\n useWorkingView: !powerLicense,\n editingViewId,\n onResetWorkingView,\n onSelect: (viewId) => {\n setSelectedView(viewId)\n // reset the settings changed state when switching views\n setViewSettingsChanged(false)\n // close the menu when selecting a view\n setIsMenuOpen(false)\n },\n onEdit: (viewId) => setEditingView(viewId),\n onSave: async (viewId) => onSaveViewFromCurrent(viewId),\n })\n\n const value: ViewsContextValue = {\n viewType,\n projectName,\n isMenuOpen,\n editingView,\n currentUser,\n selectedView,\n viewSettings,\n workingSettings,\n editingViewData,\n viewsList,\n workingView,\n editingViewId,\n viewMenuItems,\n isLoadingViews,\n isViewWorking,\n // data\n shareOptions,\n setIsMenuOpen,\n setEditingView,\n setSelectedView,\n onSettingsChanged: setViewSettingsChanged,\n // mutations\n onCreateView,\n onUpdateView,\n onDeleteView,\n // shared actions\n resetWorkingView,\n // api\n api: viewsQueries,\n dispatch,\n }\n\n return <ViewsContext.Provider value={value}>{children}</ViewsContext.Provider>\n}\n\nexport const useViewsContext = (): ViewsContextValue => {\n const context = useContext(ViewsContext)\n if (!context) {\n throw new Error('useViewsContext must be used within a ViewsProvider')\n }\n return context\n}\n"],"names":["viewsQueries","jsx"],"mappings":"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"}
@@ -80,6 +80,7 @@ const ViewsMenu = require("../ViewsMenu/ViewsMenu.cjs.js");
80
80
  const ayonReactComponents = require("@ynput/ayon-react-components");
81
81
  const generateWorkingView = require("../utils/generateWorkingView.cjs.js");
82
82
  const reactToastify = require("react-toastify");
83
+ const useLocalStorage = require("../../../hooks/useLocalStorage.cjs.js");
83
84
  const useLoadModule = require("../../../hooks/useLoadModule.cjs.js");
84
85
  require("../../../../../_virtual/runtime.cjs.js");
85
86
  require("../../../../../_virtual/semver.cjs.js");
@@ -161,16 +162,28 @@ const useBuildViewMenuItems = ({
161
162
  // minVersion: minVersion,
162
163
  skip: !viewType || !powerLicense
163
164
  });
164
- const { myViews, sharedViews } = React.useMemo(
165
- () => getCustomViews({
166
- viewsList: extendedViewsList,
167
- onEdit,
168
- onSelect,
169
- onSave: handleEditView
170
- }),
171
- [viewsList, onEdit, onSelect, handleEditView]
165
+ const { myViews, sharedViews, allPrivateViews } = getCustomViews({
166
+ viewsList: extendedViewsList,
167
+ onEdit,
168
+ onSelect,
169
+ onSave: handleEditView
170
+ });
171
+ const stateKey = "viewsMenuCollapsed";
172
+ const [collapsed, setCollapsed] = useLocalStorage.useLocalStorage(stateKey, {});
173
+ const toggleSection = React.useCallback(
174
+ (id) => {
175
+ setCollapsed({ ...collapsed, [id]: !collapsed[id] });
176
+ },
177
+ [collapsed, setCollapsed]
172
178
  );
173
- const dividers = myViews.length || sharedViews.length ? [ViewsMenu.VIEW_DIVIDER] : [];
179
+ const sections = React.useMemo(() => {
180
+ return [
181
+ { id: "myViews", title: "My views", items: myViews },
182
+ { id: "sharedViews", title: "Shared views", items: sharedViews },
183
+ { id: "allPrivateViews", title: "All private views", items: allPrivateViews }
184
+ ];
185
+ }, [myViews, sharedViews, allPrivateViews]);
186
+ console.log(allPrivateViews);
174
187
  const workingViewItem = React.useMemo(
175
188
  () => ({
176
189
  ...workingBaseView,
@@ -181,10 +194,29 @@ const useBuildViewMenuItems = ({
181
194
  }),
182
195
  [handleWorkingViewChange, onResetWorkingView]
183
196
  );
184
- const viewItems = React.useMemo(
185
- () => [workingViewItem, ...dividers, ...myViews, ...sharedViews, ...dividers],
186
- [workingView, myViews, sharedViews, workingViewItem]
187
- );
197
+ const viewItems = React.useMemo(() => {
198
+ const result = [workingViewItem];
199
+ const visibleSections = sections.filter((s) => {
200
+ var _a;
201
+ return (((_a = s.items) == null ? void 0 : _a.length) || 0) > 0;
202
+ });
203
+ if (visibleSections.length > 0) result.push(ViewsMenu.VIEW_DIVIDER);
204
+ visibleSections.forEach((section) => {
205
+ const isCollapsed = !!collapsed[section.id];
206
+ result.push({
207
+ type: "section",
208
+ id: section.id,
209
+ title: section.title,
210
+ collapsed: isCollapsed,
211
+ onToggle: () => toggleSection(section.id)
212
+ });
213
+ if (!isCollapsed) {
214
+ result.push(...section.items);
215
+ }
216
+ });
217
+ if (visibleSections.length > 0) result.push(ViewsMenu.VIEW_DIVIDER);
218
+ return result;
219
+ }, [workingViewItem, sections, collapsed, toggleSection]);
188
220
  return viewItems;
189
221
  };
190
222
  exports.WORKING_VIEW_ID = WORKING_VIEW_ID;
@@ -1 +1 @@
1
- {"version":3,"file":"useBuildViewMenuItems.cjs.js","sources":["../../../../../../src/containers/Views/hooks/useBuildViewMenuItems.tsx"],"sourcesContent":["import { useCreateViewMutation, UserModel, ViewListItemModel } from '@shared/api'\nimport { useCallback, useMemo } from 'react'\nimport { VIEW_DIVIDER, ViewMenuItem } from '../ViewsMenu/ViewsMenu'\nimport { ViewItem } from '../ViewItem/ViewItem'\nimport { Icon } from '@ynput/ayon-react-components'\nimport { generateWorkingView } from '../utils/generateWorkingView'\nimport { toast } from 'react-toastify'\nimport { useLoadModule } from '@shared/hooks'\nimport { getCustomViewsFallback } from '../utils/getCustomViewsFallback'\nimport { usePowerpack } from '@shared/context'\n\n// constants\nexport const WORKING_VIEW_ID = '_working_' as const\nexport const NEW_VIEW_ID = '_new_view_' as const\nexport type ViewListItemModelExtended = ViewListItemModel & {\n isOwner: boolean\n highlighted?: 'save' | 'edit'\n}\n\ntype Props = {\n viewsList: ViewListItemModel[]\n workingView?: ViewListItemModel\n viewType?: string\n projectName?: string\n currentUser?: UserModel\n useWorkingView?: boolean\n editingViewId?: string // the preview id of the view being edited\n onEdit: (viewId: string) => void\n onSelect: (viewId: string) => void\n onSave: (viewId: string) => Promise<void>\n onResetWorkingView?: () => void\n}\n\nconst useBuildViewMenuItems = ({\n viewsList,\n workingView,\n viewType,\n projectName,\n currentUser,\n useWorkingView,\n editingViewId,\n onSelect,\n onEdit,\n onSave,\n onResetWorkingView,\n}: Props): ViewMenuItem[] => {\n const { powerLicense } = usePowerpack()\n\n // MUTATIONS\n const [createView] = useCreateViewMutation()\n\n const extendedViewsList: ViewListItemModelExtended[] = useMemo(\n () =>\n viewsList.map((view) => ({\n ...view,\n isOwner: view.owner === currentUser?.name,\n highlighted: editingViewId === view.id ? 'save' : undefined,\n })),\n [viewsList, currentUser, editingViewId],\n )\n\n const workingBaseView: ViewItem = {\n id: WORKING_VIEW_ID,\n label: useWorkingView ? 'Personal view' : 'Working view',\n startContent: useWorkingView && <Icon icon=\"person\" />,\n isEditable: false,\n }\n\n // if we have a working view, we use it, otherwise we create one\n const handleWorkingViewChange = useCallback(async () => {\n let workingViewId = workingView?.id\n if (!workingView) {\n // no working view found, create one\n try {\n console.warn('No working view found, creating a new one')\n const workingView = generateWorkingView()\n await createView({\n payload: workingView,\n viewType: viewType as string,\n projectName: projectName,\n }).unwrap()\n // set id of the new view\n workingViewId = workingView.id\n } catch (error: any) {\n toast.error(`Failed to create working view: ${error}`)\n }\n }\n // select the working view\n onSelect(workingViewId as string)\n }, [workingView, viewType, createView, projectName, onSelect])\n\n const handleEditView = async (viewId: string) => {\n // save the view and then selected it\n try {\n await onSave(viewId)\n onSelect(viewId)\n } catch (error: any) {\n toast.error(error)\n }\n }\n\n const [getCustomViews, { isLoading: isLoadingQueries }] = useLoadModule({\n addon: 'powerpack',\n remote: 'views',\n module: 'getCustomViews',\n fallback: getCustomViewsFallback,\n // minVersion: minVersion,\n skip: !viewType || !powerLicense,\n })\n\n const { myViews, sharedViews } = useMemo(\n () =>\n getCustomViews({\n viewsList: extendedViewsList,\n onEdit,\n onSelect,\n onSave: handleEditView,\n }),\n [viewsList, onEdit, onSelect, handleEditView],\n )\n\n const dividers = myViews.length || sharedViews.length ? [VIEW_DIVIDER] : []\n\n const workingViewItem: ViewMenuItem = useMemo(\n () => ({\n ...workingBaseView,\n onClick: handleWorkingViewChange,\n // expose reset button when handler is provided\n isEditable: Boolean(onResetWorkingView),\n onResetView: onResetWorkingView,\n }),\n [handleWorkingViewChange, onResetWorkingView],\n )\n\n const viewItems: ViewMenuItem[] = useMemo(\n () => [workingViewItem, ...dividers, ...myViews, ...sharedViews, ...dividers],\n [workingView, myViews, sharedViews, workingViewItem],\n )\n\n return viewItems\n}\n\nexport default useBuildViewMenuItems\n"],"names":["usePowerpack","useCreateViewMutation","useMemo","jsx","Icon","useCallback","workingView","generateWorkingView","toast","useLoadModule","getCustomViewsFallback","VIEW_DIVIDER"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYO,MAAM,kBAAkB;AAqB/B,MAAM,wBAAwB,CAAC;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA6B;AACrB,QAAA,EAAE,aAAa,IAAIA,8BAAa;AAGhC,QAAA,CAAC,UAAU,IAAIC,kCAAsB;AAE3C,QAAM,oBAAiDC,MAAA;AAAA,IACrD,MACE,UAAU,IAAI,CAAC,UAAU;AAAA,MACvB,GAAG;AAAA,MACH,SAAS,KAAK,WAAU,2CAAa;AAAA,MACrC,aAAa,kBAAkB,KAAK,KAAK,SAAS;AAAA,IAAA,EAClD;AAAA,IACJ,CAAC,WAAW,aAAa,aAAa;AAAA,EACxC;AAEA,QAAM,kBAA4B;AAAA,IAChC,IAAI;AAAA,IACJ,OAAO,iBAAiB,kBAAkB;AAAA,IAC1C,cAAc,kBAAmBC,2BAAA,kBAAA,IAAAC,oBAAA,MAAA,EAAK,MAAK,UAAS;AAAA,IACpD,YAAY;AAAA,EACd;AAGM,QAAA,0BAA0BC,MAAAA,YAAY,YAAY;AACtD,QAAI,gBAAgB,2CAAa;AACjC,QAAI,CAAC,aAAa;AAEZ,UAAA;AACF,gBAAQ,KAAK,2CAA2C;AACxD,cAAMC,eAAcC,oBAAAA,oBAAoB;AACxC,cAAM,WAAW;AAAA,UACf,SAASD;AAAAA,UACT;AAAA,UACA;AAAA,QACD,CAAA,EAAE,OAAO;AAEV,wBAAgBA,aAAY;AAAA,eACrB,OAAY;AACbE,sBAAAA,MAAA,MAAM,kCAAkC,KAAK,EAAE;AAAA,MAAA;AAAA,IACvD;AAGF,aAAS,aAAuB;AAAA,EAAA,GAC/B,CAAC,aAAa,UAAU,YAAY,aAAa,QAAQ,CAAC;AAEvD,QAAA,iBAAiB,OAAO,WAAmB;AAE3C,QAAA;AACF,YAAM,OAAO,MAAM;AACnB,eAAS,MAAM;AAAA,aACR,OAAY;AACnBA,oBAAA,MAAM,MAAM,KAAK;AAAA,IAAA;AAAA,EAErB;AAEA,QAAM,CAAC,gBAAgB,EAAE,WAAW,iBAAkB,CAAA,IAAIC,cAAAA,cAAc;AAAA,IACtE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAUC,uBAAA;AAAA;AAAA,IAEV,MAAM,CAAC,YAAY,CAAC;AAAA,EAAA,CACrB;AAEK,QAAA,EAAE,SAAS,YAAA,IAAgBR,MAAA;AAAA,IAC/B,MACE,eAAe;AAAA,MACb,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IAAA,CACT;AAAA,IACH,CAAC,WAAW,QAAQ,UAAU,cAAc;AAAA,EAC9C;AAEM,QAAA,WAAW,QAAQ,UAAU,YAAY,SAAS,CAACS,UAAY,YAAA,IAAI,CAAC;AAE1E,QAAM,kBAAgCT,MAAA;AAAA,IACpC,OAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS;AAAA;AAAA,MAET,YAAY,QAAQ,kBAAkB;AAAA,MACtC,aAAa;AAAA,IAAA;AAAA,IAEf,CAAC,yBAAyB,kBAAkB;AAAA,EAC9C;AAEA,QAAM,YAA4BA,MAAA;AAAA,IAChC,MAAM,CAAC,iBAAiB,GAAG,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,QAAQ;AAAA,IAC5E,CAAC,aAAa,SAAS,aAAa,eAAe;AAAA,EACrD;AAEO,SAAA;AACT;;;"}
1
+ {"version":3,"file":"useBuildViewMenuItems.cjs.js","sources":["../../../../../../src/containers/Views/hooks/useBuildViewMenuItems.tsx"],"sourcesContent":["import { useCreateViewMutation, UserModel, ViewListItemModel } from '@shared/api'\nimport { useCallback, useMemo } from 'react'\nimport { VIEW_DIVIDER, ViewMenuItem } from '../ViewsMenu/ViewsMenu'\nimport { ViewItem } from '../ViewItem/ViewItem'\nimport { Icon } from '@ynput/ayon-react-components'\nimport { generateWorkingView } from '../utils/generateWorkingView'\nimport { toast } from 'react-toastify'\nimport { useLoadModule, useLocalStorage } from '@shared/hooks'\nimport { getCustomViewsFallback } from '../utils/getCustomViewsFallback'\nimport { usePowerpack } from '@shared/context'\n\n// constants\nexport const WORKING_VIEW_ID = '_working_' as const\nexport const NEW_VIEW_ID = '_new_view_' as const\nexport type ViewListItemModelExtended = ViewListItemModel & {\n isOwner: boolean\n highlighted?: 'save' | 'edit'\n}\n\ntype Props = {\n viewsList: ViewListItemModel[]\n workingView?: ViewListItemModel\n viewType?: string\n projectName?: string\n currentUser?: UserModel\n useWorkingView?: boolean\n editingViewId?: string // the preview id of the view being edited\n onEdit: (viewId: string) => void\n onSelect: (viewId: string) => void\n onSave: (viewId: string) => Promise<void>\n onResetWorkingView?: () => void\n}\n\ntype CollapsedState = Record<string, boolean>\n\nconst useBuildViewMenuItems = ({\n viewsList,\n workingView,\n viewType,\n projectName,\n currentUser,\n useWorkingView,\n editingViewId,\n onSelect,\n onEdit,\n onSave,\n onResetWorkingView,\n}: Props): ViewMenuItem[] => {\n const { powerLicense } = usePowerpack()\n\n // MUTATIONS\n const [createView] = useCreateViewMutation()\n\n const extendedViewsList: ViewListItemModelExtended[] = useMemo(\n () =>\n viewsList.map((view) => ({\n ...view,\n isOwner: view.owner === currentUser?.name,\n highlighted: editingViewId === view.id ? 'save' : undefined,\n })),\n [viewsList, currentUser, editingViewId],\n )\n\n const workingBaseView: ViewItem = {\n id: WORKING_VIEW_ID,\n label: useWorkingView ? 'Personal view' : 'Working view',\n startContent: useWorkingView && <Icon icon=\"person\" />,\n isEditable: false,\n }\n\n // if we have a working view, we use it, otherwise we create one\n const handleWorkingViewChange = useCallback(async () => {\n let workingViewId = workingView?.id\n if (!workingView) {\n // no working view found, create one\n try {\n console.warn('No working view found, creating a new one')\n const workingView = generateWorkingView()\n await createView({\n payload: workingView,\n viewType: viewType as string,\n projectName: projectName,\n }).unwrap()\n // set id of the new view\n workingViewId = workingView.id\n } catch (error: any) {\n toast.error(`Failed to create working view: ${error}`)\n }\n }\n // select the working view\n onSelect(workingViewId as string)\n }, [workingView, viewType, createView, projectName, onSelect])\n\n const handleEditView = async (viewId: string) => {\n // save the view and then selected it\n try {\n await onSave(viewId)\n onSelect(viewId)\n } catch (error: any) {\n toast.error(error)\n }\n }\n\n const [getCustomViews, { isLoading: isLoadingQueries }] = useLoadModule({\n addon: 'powerpack',\n remote: 'views',\n module: 'getCustomViews',\n fallback: getCustomViewsFallback,\n // minVersion: minVersion,\n skip: !viewType || !powerLicense,\n })\n\n const { myViews, sharedViews, allPrivateViews } = getCustomViews({\n viewsList: extendedViewsList,\n onEdit,\n onSelect,\n onSave: handleEditView,\n })\n\n // Collapsed state persisted globally across all viewTypes and projects\n const stateKey = 'viewsMenuCollapsed'\n\n const [collapsed, setCollapsed] = useLocalStorage<CollapsedState>(stateKey, {})\n\n const toggleSection = useCallback(\n (id: string) => {\n setCollapsed({ ...collapsed, [id]: !collapsed[id] })\n },\n [collapsed, setCollapsed],\n )\n\n const sections: Array<{ id: string; title: string; items: ViewItem[] }> = useMemo(() => {\n return [\n { id: 'myViews', title: 'My views', items: myViews as ViewItem[] },\n { id: 'sharedViews', title: 'Shared views', items: sharedViews as ViewItem[] },\n { id: 'allPrivateViews', title: 'All private views', items: allPrivateViews as ViewItem[] },\n ]\n }, [myViews, sharedViews, allPrivateViews])\n\n console.log(allPrivateViews)\n\n const workingViewItem: ViewMenuItem = useMemo(\n () => ({\n ...workingBaseView,\n onClick: handleWorkingViewChange,\n // expose reset button when handler is provided\n isEditable: Boolean(onResetWorkingView),\n onResetView: onResetWorkingView,\n }),\n [handleWorkingViewChange, onResetWorkingView],\n )\n\n // Build list with headers after computing items, omit sections with no items, and hide items when collapsed\n const viewItems: ViewMenuItem[] = useMemo(() => {\n const result: ViewMenuItem[] = [workingViewItem]\n\n // Add divider only if any section exists\n const visibleSections = sections.filter((s) => (s.items?.length || 0) > 0)\n if (visibleSections.length > 0) result.push(VIEW_DIVIDER)\n\n visibleSections.forEach((section) => {\n const isCollapsed = !!collapsed[section.id]\n result.push({\n type: 'section',\n id: section.id,\n title: section.title,\n collapsed: isCollapsed,\n onToggle: () => toggleSection(section.id),\n })\n if (!isCollapsed) {\n result.push(...section.items)\n }\n })\n\n // Add a closing divider after all sections (only if sections exist)\n if (visibleSections.length > 0) result.push(VIEW_DIVIDER)\n\n return result\n }, [workingViewItem, sections, collapsed, toggleSection])\n\n return viewItems\n}\n\nexport default useBuildViewMenuItems\n"],"names":["usePowerpack","useCreateViewMutation","useMemo","jsx","Icon","useCallback","workingView","generateWorkingView","toast","useLoadModule","getCustomViewsFallback","useLocalStorage","VIEW_DIVIDER"],"mappings":"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"}
@@ -78,6 +78,7 @@ import { VIEW_DIVIDER } from "../ViewsMenu/ViewsMenu.es.js";
78
78
  import { Icon } from "@ynput/ayon-react-components";
79
79
  import { generateWorkingView } from "../utils/generateWorkingView.es.js";
80
80
  import { toast } from "react-toastify";
81
+ import { useLocalStorage } from "../../../hooks/useLocalStorage.es.js";
81
82
  import { useLoadModule } from "../../../hooks/useLoadModule.es.js";
82
83
  import "../../../../../_virtual/runtime.es.js";
83
84
  import "../../../../../_virtual/semver.es.js";
@@ -159,16 +160,28 @@ const useBuildViewMenuItems = ({
159
160
  // minVersion: minVersion,
160
161
  skip: !viewType || !powerLicense
161
162
  });
162
- const { myViews, sharedViews } = useMemo(
163
- () => getCustomViews({
164
- viewsList: extendedViewsList,
165
- onEdit,
166
- onSelect,
167
- onSave: handleEditView
168
- }),
169
- [viewsList, onEdit, onSelect, handleEditView]
163
+ const { myViews, sharedViews, allPrivateViews } = getCustomViews({
164
+ viewsList: extendedViewsList,
165
+ onEdit,
166
+ onSelect,
167
+ onSave: handleEditView
168
+ });
169
+ const stateKey = "viewsMenuCollapsed";
170
+ const [collapsed, setCollapsed] = useLocalStorage(stateKey, {});
171
+ const toggleSection = useCallback(
172
+ (id) => {
173
+ setCollapsed({ ...collapsed, [id]: !collapsed[id] });
174
+ },
175
+ [collapsed, setCollapsed]
170
176
  );
171
- const dividers = myViews.length || sharedViews.length ? [VIEW_DIVIDER] : [];
177
+ const sections = useMemo(() => {
178
+ return [
179
+ { id: "myViews", title: "My views", items: myViews },
180
+ { id: "sharedViews", title: "Shared views", items: sharedViews },
181
+ { id: "allPrivateViews", title: "All private views", items: allPrivateViews }
182
+ ];
183
+ }, [myViews, sharedViews, allPrivateViews]);
184
+ console.log(allPrivateViews);
172
185
  const workingViewItem = useMemo(
173
186
  () => ({
174
187
  ...workingBaseView,
@@ -179,10 +192,29 @@ const useBuildViewMenuItems = ({
179
192
  }),
180
193
  [handleWorkingViewChange, onResetWorkingView]
181
194
  );
182
- const viewItems = useMemo(
183
- () => [workingViewItem, ...dividers, ...myViews, ...sharedViews, ...dividers],
184
- [workingView, myViews, sharedViews, workingViewItem]
185
- );
195
+ const viewItems = useMemo(() => {
196
+ const result = [workingViewItem];
197
+ const visibleSections = sections.filter((s) => {
198
+ var _a;
199
+ return (((_a = s.items) == null ? void 0 : _a.length) || 0) > 0;
200
+ });
201
+ if (visibleSections.length > 0) result.push(VIEW_DIVIDER);
202
+ visibleSections.forEach((section) => {
203
+ const isCollapsed = !!collapsed[section.id];
204
+ result.push({
205
+ type: "section",
206
+ id: section.id,
207
+ title: section.title,
208
+ collapsed: isCollapsed,
209
+ onToggle: () => toggleSection(section.id)
210
+ });
211
+ if (!isCollapsed) {
212
+ result.push(...section.items);
213
+ }
214
+ });
215
+ if (visibleSections.length > 0) result.push(VIEW_DIVIDER);
216
+ return result;
217
+ }, [workingViewItem, sections, collapsed, toggleSection]);
186
218
  return viewItems;
187
219
  };
188
220
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"useBuildViewMenuItems.es.js","sources":["../../../../../../src/containers/Views/hooks/useBuildViewMenuItems.tsx"],"sourcesContent":["import { useCreateViewMutation, UserModel, ViewListItemModel } from '@shared/api'\nimport { useCallback, useMemo } from 'react'\nimport { VIEW_DIVIDER, ViewMenuItem } from '../ViewsMenu/ViewsMenu'\nimport { ViewItem } from '../ViewItem/ViewItem'\nimport { Icon } from '@ynput/ayon-react-components'\nimport { generateWorkingView } from '../utils/generateWorkingView'\nimport { toast } from 'react-toastify'\nimport { useLoadModule } from '@shared/hooks'\nimport { getCustomViewsFallback } from '../utils/getCustomViewsFallback'\nimport { usePowerpack } from '@shared/context'\n\n// constants\nexport const WORKING_VIEW_ID = '_working_' as const\nexport const NEW_VIEW_ID = '_new_view_' as const\nexport type ViewListItemModelExtended = ViewListItemModel & {\n isOwner: boolean\n highlighted?: 'save' | 'edit'\n}\n\ntype Props = {\n viewsList: ViewListItemModel[]\n workingView?: ViewListItemModel\n viewType?: string\n projectName?: string\n currentUser?: UserModel\n useWorkingView?: boolean\n editingViewId?: string // the preview id of the view being edited\n onEdit: (viewId: string) => void\n onSelect: (viewId: string) => void\n onSave: (viewId: string) => Promise<void>\n onResetWorkingView?: () => void\n}\n\nconst useBuildViewMenuItems = ({\n viewsList,\n workingView,\n viewType,\n projectName,\n currentUser,\n useWorkingView,\n editingViewId,\n onSelect,\n onEdit,\n onSave,\n onResetWorkingView,\n}: Props): ViewMenuItem[] => {\n const { powerLicense } = usePowerpack()\n\n // MUTATIONS\n const [createView] = useCreateViewMutation()\n\n const extendedViewsList: ViewListItemModelExtended[] = useMemo(\n () =>\n viewsList.map((view) => ({\n ...view,\n isOwner: view.owner === currentUser?.name,\n highlighted: editingViewId === view.id ? 'save' : undefined,\n })),\n [viewsList, currentUser, editingViewId],\n )\n\n const workingBaseView: ViewItem = {\n id: WORKING_VIEW_ID,\n label: useWorkingView ? 'Personal view' : 'Working view',\n startContent: useWorkingView && <Icon icon=\"person\" />,\n isEditable: false,\n }\n\n // if we have a working view, we use it, otherwise we create one\n const handleWorkingViewChange = useCallback(async () => {\n let workingViewId = workingView?.id\n if (!workingView) {\n // no working view found, create one\n try {\n console.warn('No working view found, creating a new one')\n const workingView = generateWorkingView()\n await createView({\n payload: workingView,\n viewType: viewType as string,\n projectName: projectName,\n }).unwrap()\n // set id of the new view\n workingViewId = workingView.id\n } catch (error: any) {\n toast.error(`Failed to create working view: ${error}`)\n }\n }\n // select the working view\n onSelect(workingViewId as string)\n }, [workingView, viewType, createView, projectName, onSelect])\n\n const handleEditView = async (viewId: string) => {\n // save the view and then selected it\n try {\n await onSave(viewId)\n onSelect(viewId)\n } catch (error: any) {\n toast.error(error)\n }\n }\n\n const [getCustomViews, { isLoading: isLoadingQueries }] = useLoadModule({\n addon: 'powerpack',\n remote: 'views',\n module: 'getCustomViews',\n fallback: getCustomViewsFallback,\n // minVersion: minVersion,\n skip: !viewType || !powerLicense,\n })\n\n const { myViews, sharedViews } = useMemo(\n () =>\n getCustomViews({\n viewsList: extendedViewsList,\n onEdit,\n onSelect,\n onSave: handleEditView,\n }),\n [viewsList, onEdit, onSelect, handleEditView],\n )\n\n const dividers = myViews.length || sharedViews.length ? [VIEW_DIVIDER] : []\n\n const workingViewItem: ViewMenuItem = useMemo(\n () => ({\n ...workingBaseView,\n onClick: handleWorkingViewChange,\n // expose reset button when handler is provided\n isEditable: Boolean(onResetWorkingView),\n onResetView: onResetWorkingView,\n }),\n [handleWorkingViewChange, onResetWorkingView],\n )\n\n const viewItems: ViewMenuItem[] = useMemo(\n () => [workingViewItem, ...dividers, ...myViews, ...sharedViews, ...dividers],\n [workingView, myViews, sharedViews, workingViewItem],\n )\n\n return viewItems\n}\n\nexport default useBuildViewMenuItems\n"],"names":["jsx","workingView"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYO,MAAM,kBAAkB;AAqB/B,MAAM,wBAAwB,CAAC;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA6B;AACrB,QAAA,EAAE,aAAa,IAAI,aAAa;AAGhC,QAAA,CAAC,UAAU,IAAI,sBAAsB;AAE3C,QAAM,oBAAiD;AAAA,IACrD,MACE,UAAU,IAAI,CAAC,UAAU;AAAA,MACvB,GAAG;AAAA,MACH,SAAS,KAAK,WAAU,2CAAa;AAAA,MACrC,aAAa,kBAAkB,KAAK,KAAK,SAAS;AAAA,IAAA,EAClD;AAAA,IACJ,CAAC,WAAW,aAAa,aAAa;AAAA,EACxC;AAEA,QAAM,kBAA4B;AAAA,IAChC,IAAI;AAAA,IACJ,OAAO,iBAAiB,kBAAkB;AAAA,IAC1C,cAAc,kBAAmBA,kCAAA,IAAA,MAAA,EAAK,MAAK,UAAS;AAAA,IACpD,YAAY;AAAA,EACd;AAGM,QAAA,0BAA0B,YAAY,YAAY;AACtD,QAAI,gBAAgB,2CAAa;AACjC,QAAI,CAAC,aAAa;AAEZ,UAAA;AACF,gBAAQ,KAAK,2CAA2C;AACxD,cAAMC,eAAc,oBAAoB;AACxC,cAAM,WAAW;AAAA,UACf,SAASA;AAAAA,UACT;AAAA,UACA;AAAA,QACD,CAAA,EAAE,OAAO;AAEV,wBAAgBA,aAAY;AAAA,eACrB,OAAY;AACb,cAAA,MAAM,kCAAkC,KAAK,EAAE;AAAA,MAAA;AAAA,IACvD;AAGF,aAAS,aAAuB;AAAA,EAAA,GAC/B,CAAC,aAAa,UAAU,YAAY,aAAa,QAAQ,CAAC;AAEvD,QAAA,iBAAiB,OAAO,WAAmB;AAE3C,QAAA;AACF,YAAM,OAAO,MAAM;AACnB,eAAS,MAAM;AAAA,aACR,OAAY;AACnB,YAAM,MAAM,KAAK;AAAA,IAAA;AAAA,EAErB;AAEA,QAAM,CAAC,gBAAgB,EAAE,WAAW,iBAAkB,CAAA,IAAI,cAAc;AAAA,IACtE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA;AAAA,IAEV,MAAM,CAAC,YAAY,CAAC;AAAA,EAAA,CACrB;AAEK,QAAA,EAAE,SAAS,YAAA,IAAgB;AAAA,IAC/B,MACE,eAAe;AAAA,MACb,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IAAA,CACT;AAAA,IACH,CAAC,WAAW,QAAQ,UAAU,cAAc;AAAA,EAC9C;AAEM,QAAA,WAAW,QAAQ,UAAU,YAAY,SAAS,CAAC,YAAY,IAAI,CAAC;AAE1E,QAAM,kBAAgC;AAAA,IACpC,OAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS;AAAA;AAAA,MAET,YAAY,QAAQ,kBAAkB;AAAA,MACtC,aAAa;AAAA,IAAA;AAAA,IAEf,CAAC,yBAAyB,kBAAkB;AAAA,EAC9C;AAEA,QAAM,YAA4B;AAAA,IAChC,MAAM,CAAC,iBAAiB,GAAG,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,QAAQ;AAAA,IAC5E,CAAC,aAAa,SAAS,aAAa,eAAe;AAAA,EACrD;AAEO,SAAA;AACT;"}
1
+ {"version":3,"file":"useBuildViewMenuItems.es.js","sources":["../../../../../../src/containers/Views/hooks/useBuildViewMenuItems.tsx"],"sourcesContent":["import { useCreateViewMutation, UserModel, ViewListItemModel } from '@shared/api'\nimport { useCallback, useMemo } from 'react'\nimport { VIEW_DIVIDER, ViewMenuItem } from '../ViewsMenu/ViewsMenu'\nimport { ViewItem } from '../ViewItem/ViewItem'\nimport { Icon } from '@ynput/ayon-react-components'\nimport { generateWorkingView } from '../utils/generateWorkingView'\nimport { toast } from 'react-toastify'\nimport { useLoadModule, useLocalStorage } from '@shared/hooks'\nimport { getCustomViewsFallback } from '../utils/getCustomViewsFallback'\nimport { usePowerpack } from '@shared/context'\n\n// constants\nexport const WORKING_VIEW_ID = '_working_' as const\nexport const NEW_VIEW_ID = '_new_view_' as const\nexport type ViewListItemModelExtended = ViewListItemModel & {\n isOwner: boolean\n highlighted?: 'save' | 'edit'\n}\n\ntype Props = {\n viewsList: ViewListItemModel[]\n workingView?: ViewListItemModel\n viewType?: string\n projectName?: string\n currentUser?: UserModel\n useWorkingView?: boolean\n editingViewId?: string // the preview id of the view being edited\n onEdit: (viewId: string) => void\n onSelect: (viewId: string) => void\n onSave: (viewId: string) => Promise<void>\n onResetWorkingView?: () => void\n}\n\ntype CollapsedState = Record<string, boolean>\n\nconst useBuildViewMenuItems = ({\n viewsList,\n workingView,\n viewType,\n projectName,\n currentUser,\n useWorkingView,\n editingViewId,\n onSelect,\n onEdit,\n onSave,\n onResetWorkingView,\n}: Props): ViewMenuItem[] => {\n const { powerLicense } = usePowerpack()\n\n // MUTATIONS\n const [createView] = useCreateViewMutation()\n\n const extendedViewsList: ViewListItemModelExtended[] = useMemo(\n () =>\n viewsList.map((view) => ({\n ...view,\n isOwner: view.owner === currentUser?.name,\n highlighted: editingViewId === view.id ? 'save' : undefined,\n })),\n [viewsList, currentUser, editingViewId],\n )\n\n const workingBaseView: ViewItem = {\n id: WORKING_VIEW_ID,\n label: useWorkingView ? 'Personal view' : 'Working view',\n startContent: useWorkingView && <Icon icon=\"person\" />,\n isEditable: false,\n }\n\n // if we have a working view, we use it, otherwise we create one\n const handleWorkingViewChange = useCallback(async () => {\n let workingViewId = workingView?.id\n if (!workingView) {\n // no working view found, create one\n try {\n console.warn('No working view found, creating a new one')\n const workingView = generateWorkingView()\n await createView({\n payload: workingView,\n viewType: viewType as string,\n projectName: projectName,\n }).unwrap()\n // set id of the new view\n workingViewId = workingView.id\n } catch (error: any) {\n toast.error(`Failed to create working view: ${error}`)\n }\n }\n // select the working view\n onSelect(workingViewId as string)\n }, [workingView, viewType, createView, projectName, onSelect])\n\n const handleEditView = async (viewId: string) => {\n // save the view and then selected it\n try {\n await onSave(viewId)\n onSelect(viewId)\n } catch (error: any) {\n toast.error(error)\n }\n }\n\n const [getCustomViews, { isLoading: isLoadingQueries }] = useLoadModule({\n addon: 'powerpack',\n remote: 'views',\n module: 'getCustomViews',\n fallback: getCustomViewsFallback,\n // minVersion: minVersion,\n skip: !viewType || !powerLicense,\n })\n\n const { myViews, sharedViews, allPrivateViews } = getCustomViews({\n viewsList: extendedViewsList,\n onEdit,\n onSelect,\n onSave: handleEditView,\n })\n\n // Collapsed state persisted globally across all viewTypes and projects\n const stateKey = 'viewsMenuCollapsed'\n\n const [collapsed, setCollapsed] = useLocalStorage<CollapsedState>(stateKey, {})\n\n const toggleSection = useCallback(\n (id: string) => {\n setCollapsed({ ...collapsed, [id]: !collapsed[id] })\n },\n [collapsed, setCollapsed],\n )\n\n const sections: Array<{ id: string; title: string; items: ViewItem[] }> = useMemo(() => {\n return [\n { id: 'myViews', title: 'My views', items: myViews as ViewItem[] },\n { id: 'sharedViews', title: 'Shared views', items: sharedViews as ViewItem[] },\n { id: 'allPrivateViews', title: 'All private views', items: allPrivateViews as ViewItem[] },\n ]\n }, [myViews, sharedViews, allPrivateViews])\n\n console.log(allPrivateViews)\n\n const workingViewItem: ViewMenuItem = useMemo(\n () => ({\n ...workingBaseView,\n onClick: handleWorkingViewChange,\n // expose reset button when handler is provided\n isEditable: Boolean(onResetWorkingView),\n onResetView: onResetWorkingView,\n }),\n [handleWorkingViewChange, onResetWorkingView],\n )\n\n // Build list with headers after computing items, omit sections with no items, and hide items when collapsed\n const viewItems: ViewMenuItem[] = useMemo(() => {\n const result: ViewMenuItem[] = [workingViewItem]\n\n // Add divider only if any section exists\n const visibleSections = sections.filter((s) => (s.items?.length || 0) > 0)\n if (visibleSections.length > 0) result.push(VIEW_DIVIDER)\n\n visibleSections.forEach((section) => {\n const isCollapsed = !!collapsed[section.id]\n result.push({\n type: 'section',\n id: section.id,\n title: section.title,\n collapsed: isCollapsed,\n onToggle: () => toggleSection(section.id),\n })\n if (!isCollapsed) {\n result.push(...section.items)\n }\n })\n\n // Add a closing divider after all sections (only if sections exist)\n if (visibleSections.length > 0) result.push(VIEW_DIVIDER)\n\n return result\n }, [workingViewItem, sections, collapsed, toggleSection])\n\n return viewItems\n}\n\nexport default useBuildViewMenuItems\n"],"names":["jsx","workingView"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYO,MAAM,kBAAkB;AAuB/B,MAAM,wBAAwB,CAAC;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAA6B;AACrB,QAAA,EAAE,aAAa,IAAI,aAAa;AAGhC,QAAA,CAAC,UAAU,IAAI,sBAAsB;AAE3C,QAAM,oBAAiD;AAAA,IACrD,MACE,UAAU,IAAI,CAAC,UAAU;AAAA,MACvB,GAAG;AAAA,MACH,SAAS,KAAK,WAAU,2CAAa;AAAA,MACrC,aAAa,kBAAkB,KAAK,KAAK,SAAS;AAAA,IAAA,EAClD;AAAA,IACJ,CAAC,WAAW,aAAa,aAAa;AAAA,EACxC;AAEA,QAAM,kBAA4B;AAAA,IAChC,IAAI;AAAA,IACJ,OAAO,iBAAiB,kBAAkB;AAAA,IAC1C,cAAc,kBAAmBA,kCAAA,IAAA,MAAA,EAAK,MAAK,UAAS;AAAA,IACpD,YAAY;AAAA,EACd;AAGM,QAAA,0BAA0B,YAAY,YAAY;AACtD,QAAI,gBAAgB,2CAAa;AACjC,QAAI,CAAC,aAAa;AAEZ,UAAA;AACF,gBAAQ,KAAK,2CAA2C;AACxD,cAAMC,eAAc,oBAAoB;AACxC,cAAM,WAAW;AAAA,UACf,SAASA;AAAAA,UACT;AAAA,UACA;AAAA,QACD,CAAA,EAAE,OAAO;AAEV,wBAAgBA,aAAY;AAAA,eACrB,OAAY;AACb,cAAA,MAAM,kCAAkC,KAAK,EAAE;AAAA,MAAA;AAAA,IACvD;AAGF,aAAS,aAAuB;AAAA,EAAA,GAC/B,CAAC,aAAa,UAAU,YAAY,aAAa,QAAQ,CAAC;AAEvD,QAAA,iBAAiB,OAAO,WAAmB;AAE3C,QAAA;AACF,YAAM,OAAO,MAAM;AACnB,eAAS,MAAM;AAAA,aACR,OAAY;AACnB,YAAM,MAAM,KAAK;AAAA,IAAA;AAAA,EAErB;AAEA,QAAM,CAAC,gBAAgB,EAAE,WAAW,iBAAkB,CAAA,IAAI,cAAc;AAAA,IACtE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA;AAAA,IAEV,MAAM,CAAC,YAAY,CAAC;AAAA,EAAA,CACrB;AAED,QAAM,EAAE,SAAS,aAAa,gBAAA,IAAoB,eAAe;AAAA,IAC/D,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EAAA,CACT;AAGD,QAAM,WAAW;AAEjB,QAAM,CAAC,WAAW,YAAY,IAAI,gBAAgC,UAAU,CAAA,CAAE;AAE9E,QAAM,gBAAgB;AAAA,IACpB,CAAC,OAAe;AACD,mBAAA,EAAE,GAAG,WAAW,CAAC,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG;AAAA,IACrD;AAAA,IACA,CAAC,WAAW,YAAY;AAAA,EAC1B;AAEM,QAAA,WAAoE,QAAQ,MAAM;AAC/E,WAAA;AAAA,MACL,EAAE,IAAI,WAAW,OAAO,YAAY,OAAO,QAAsB;AAAA,MACjE,EAAE,IAAI,eAAe,OAAO,gBAAgB,OAAO,YAA0B;AAAA,MAC7E,EAAE,IAAI,mBAAmB,OAAO,qBAAqB,OAAO,gBAA8B;AAAA,IAC5F;AAAA,EACC,GAAA,CAAC,SAAS,aAAa,eAAe,CAAC;AAE1C,UAAQ,IAAI,eAAe;AAE3B,QAAM,kBAAgC;AAAA,IACpC,OAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS;AAAA;AAAA,MAET,YAAY,QAAQ,kBAAkB;AAAA,MACtC,aAAa;AAAA,IAAA;AAAA,IAEf,CAAC,yBAAyB,kBAAkB;AAAA,EAC9C;AAGM,QAAA,YAA4B,QAAQ,MAAM;AACxC,UAAA,SAAyB,CAAC,eAAe;AAGzC,UAAA,kBAAkB,SAAS,OAAO,CAAC;;AAAO,uBAAE,UAAF,mBAAS,WAAU,KAAK;AAAA,KAAC;AACzE,QAAI,gBAAgB,SAAS,EAAG,QAAO,KAAK,YAAY;AAExC,oBAAA,QAAQ,CAAC,YAAY;AACnC,YAAM,cAAc,CAAC,CAAC,UAAU,QAAQ,EAAE;AAC1C,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,IAAI,QAAQ;AAAA,QACZ,OAAO,QAAQ;AAAA,QACf,WAAW;AAAA,QACX,UAAU,MAAM,cAAc,QAAQ,EAAE;AAAA,MAAA,CACzC;AACD,UAAI,CAAC,aAAa;AACT,eAAA,KAAK,GAAG,QAAQ,KAAK;AAAA,MAAA;AAAA,IAC9B,CACD;AAGD,QAAI,gBAAgB,SAAS,EAAG,QAAO,KAAK,YAAY;AAEjD,WAAA;AAAA,KACN,CAAC,iBAAiB,UAAU,WAAW,aAAa,CAAC;AAEjD,SAAA;AACT;"}
@@ -2,7 +2,8 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const getCustomViewsFallback = (props) => ({
4
4
  myViews: [],
5
- sharedViews: []
5
+ sharedViews: [],
6
+ allPrivateViews: []
6
7
  });
7
8
  exports.getCustomViewsFallback = getCustomViewsFallback;
8
9
  //# sourceMappingURL=getCustomViewsFallback.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"getCustomViewsFallback.cjs.js","sources":["../../../../../../src/containers/Views/utils/getCustomViewsFallback.ts"],"sourcesContent":["import { ViewMenuItem } from '../ViewsMenu/ViewsMenu'\nimport { ViewListItemModelExtended } from '../hooks/useBuildViewMenuItems'\n\nexport type GetCustomViews = {\n viewsList: ViewListItemModelExtended[]\n onEdit: (viewId: string) => void\n onSelect: (viewId: string) => void\n onSave: (viewId: string) => void\n}\n\nexport type CustomViews = {\n myViews: ViewMenuItem[]\n sharedViews: ViewMenuItem[]\n}\n\nexport const getCustomViewsFallback = (props: GetCustomViews): CustomViews => ({\n myViews: [],\n sharedViews: [],\n})\n"],"names":[],"mappings":";;AAea,MAAA,yBAAyB,CAAC,WAAwC;AAAA,EAC7E,SAAS,CAAC;AAAA,EACV,aAAa,CAAA;AACf;;"}
1
+ {"version":3,"file":"getCustomViewsFallback.cjs.js","sources":["../../../../../../src/containers/Views/utils/getCustomViewsFallback.ts"],"sourcesContent":["import { ViewItem } from '../ViewItem/ViewItem'\nimport { ViewListItemModelExtended } from '../hooks/useBuildViewMenuItems'\n\nexport type GetCustomViews = {\n viewsList: ViewListItemModelExtended[]\n onEdit: (viewId: string) => void\n onSelect: (viewId: string) => void\n onSave: (viewId: string) => void\n}\n\nexport type CustomViews = {\n myViews: ViewItem[] // views current user has created but are private\n sharedViews: ViewItem[] // public views I have shared or are shared with me\n allPrivateViews: ViewItem[] // ADMIN ONLY: views that are private and current user is not the owner\n}\n\nexport const getCustomViewsFallback = (props: GetCustomViews): CustomViews => ({\n myViews: [],\n sharedViews: [],\n allPrivateViews: [],\n})\n"],"names":[],"mappings":";;AAgBa,MAAA,yBAAyB,CAAC,WAAwC;AAAA,EAC7E,SAAS,CAAC;AAAA,EACV,aAAa,CAAC;AAAA,EACd,iBAAiB,CAAA;AACnB;;"}
@@ -1,6 +1,7 @@
1
1
  const getCustomViewsFallback = (props) => ({
2
2
  myViews: [],
3
- sharedViews: []
3
+ sharedViews: [],
4
+ allPrivateViews: []
4
5
  });
5
6
  export {
6
7
  getCustomViewsFallback
@@ -1 +1 @@
1
- {"version":3,"file":"getCustomViewsFallback.es.js","sources":["../../../../../../src/containers/Views/utils/getCustomViewsFallback.ts"],"sourcesContent":["import { ViewMenuItem } from '../ViewsMenu/ViewsMenu'\nimport { ViewListItemModelExtended } from '../hooks/useBuildViewMenuItems'\n\nexport type GetCustomViews = {\n viewsList: ViewListItemModelExtended[]\n onEdit: (viewId: string) => void\n onSelect: (viewId: string) => void\n onSave: (viewId: string) => void\n}\n\nexport type CustomViews = {\n myViews: ViewMenuItem[]\n sharedViews: ViewMenuItem[]\n}\n\nexport const getCustomViewsFallback = (props: GetCustomViews): CustomViews => ({\n myViews: [],\n sharedViews: [],\n})\n"],"names":[],"mappings":"AAea,MAAA,yBAAyB,CAAC,WAAwC;AAAA,EAC7E,SAAS,CAAC;AAAA,EACV,aAAa,CAAA;AACf;"}
1
+ {"version":3,"file":"getCustomViewsFallback.es.js","sources":["../../../../../../src/containers/Views/utils/getCustomViewsFallback.ts"],"sourcesContent":["import { ViewItem } from '../ViewItem/ViewItem'\nimport { ViewListItemModelExtended } from '../hooks/useBuildViewMenuItems'\n\nexport type GetCustomViews = {\n viewsList: ViewListItemModelExtended[]\n onEdit: (viewId: string) => void\n onSelect: (viewId: string) => void\n onSave: (viewId: string) => void\n}\n\nexport type CustomViews = {\n myViews: ViewItem[] // views current user has created but are private\n sharedViews: ViewItem[] // public views I have shared or are shared with me\n allPrivateViews: ViewItem[] // ADMIN ONLY: views that are private and current user is not the owner\n}\n\nexport const getCustomViewsFallback = (props: GetCustomViews): CustomViews => ({\n myViews: [],\n sharedViews: [],\n allPrivateViews: [],\n})\n"],"names":[],"mappings":"AAgBa,MAAA,yBAAyB,CAAC,WAAwC;AAAA,EAC7E,SAAS,CAAC;AAAA,EACV,aAAa,CAAC;AAAA,EACd,iBAAiB,CAAA;AACnB;"}
@@ -0,0 +1,6 @@
1
+ export interface SectionHeaderProps extends React.LiHTMLAttributes<HTMLLIElement> {
2
+ id: string;
3
+ title: string;
4
+ collapsed?: boolean;
5
+ }
6
+ export declare const SectionHeader: import('react').ForwardRefExoticComponent<SectionHeaderProps & import('react').RefAttributes<HTMLLIElement>>;
@@ -0,0 +1 @@
1
+ export declare const SectionHeader: import('styled-components/dist/types').IStyledComponentBase<"web", import('styled-components').FastOmit<import('react').DetailedHTMLProps<import('react').LiHTMLAttributes<HTMLLIElement>, HTMLLIElement>, never>> & string;
@@ -1,10 +1,15 @@
1
1
  import { ViewItem } from '../ViewItem/ViewItem';
2
2
  export declare const VIEW_DIVIDER: "_divider_";
3
- type Title = string;
4
- export type ViewMenuItem = ViewItem | typeof VIEW_DIVIDER | Title;
3
+ export type ViewSectionHeader = {
4
+ type: 'section';
5
+ id: string;
6
+ title: string;
7
+ collapsed?: boolean;
8
+ onToggle?: () => void;
9
+ };
10
+ export type ViewMenuItem = ViewItem | typeof VIEW_DIVIDER | ViewSectionHeader;
5
11
  export interface ViewsMenuProps extends React.HTMLAttributes<HTMLUListElement> {
6
12
  items: ViewMenuItem[];
7
13
  selected: string;
8
14
  }
9
15
  export declare const ViewsMenu: import('react').ForwardRefExoticComponent<ViewsMenuProps & import('react').RefAttributes<HTMLUListElement>>;
10
- export {};
@@ -1,4 +1,4 @@
1
- import { ViewMenuItem } from '../ViewsMenu/ViewsMenu';
1
+ import { ViewItem } from '../ViewItem/ViewItem';
2
2
  import { ViewListItemModelExtended } from '../hooks/useBuildViewMenuItems';
3
3
  export type GetCustomViews = {
4
4
  viewsList: ViewListItemModelExtended[];
@@ -7,7 +7,8 @@ export type GetCustomViews = {
7
7
  onSave: (viewId: string) => void;
8
8
  };
9
9
  export type CustomViews = {
10
- myViews: ViewMenuItem[];
11
- sharedViews: ViewMenuItem[];
10
+ myViews: ViewItem[];
11
+ sharedViews: ViewItem[];
12
+ allPrivateViews: ViewItem[];
12
13
  };
13
14
  export declare const getCustomViewsFallback: (props: GetCustomViews) => CustomViews;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ynput/ayon-frontend-shared",
3
- "version": "0.2.22",
3
+ "version": "0.2.23",
4
4
  "description": "Shared React components for AYON frontend",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.es.js",