@edifice.io/react 2.6.0-develop-integration.20260717095527 → 2.6.0-develop-enabling.20260720144517

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 (35) hide show
  1. package/dist/components/Layout/Layout.js +10 -3
  2. package/dist/components/Layout/components/HeaderNotificationsOverlay.d.ts +5 -0
  3. package/dist/components/Layout/components/HeaderNotificationsOverlay.js +18 -0
  4. package/dist/components/PageLayout/store/overlayStore.js +1 -1
  5. package/dist/hooks/index.d.ts +1 -1
  6. package/dist/hooks/useUiOverride/index.d.ts +1 -0
  7. package/dist/hooks/useUiOverride/useUiOverride.d.ts +5 -0
  8. package/dist/hooks/useUiOverride/useUiOverride.js +13 -0
  9. package/dist/index.js +148 -150
  10. package/dist/modules/homepage/components/Header/Header.d.ts +3 -1
  11. package/dist/modules/homepage/components/Header/Header.js +3 -2
  12. package/dist/modules/multimedia/FileCard/index.d.ts +0 -2
  13. package/dist/modules/multimedia/MediaLibrary/MediaLibrary.d.ts +2 -2
  14. package/dist/modules/multimedia/MediaLibrary/MediaLibrary.js +7 -20
  15. package/dist/modules/multimedia/MediaLibrary/innertabs/index.d.ts +0 -1
  16. package/dist/modules/multimedia/MediaLibrary/innertabs/index.js +0 -2
  17. package/dist/modules/multimedia/index.d.ts +0 -1
  18. package/dist/multimedia.js +12 -16
  19. package/dist/providers/MockedProvider/MockedProvider.js +4 -3
  20. package/dist/utilities/create-selectors/create-selectors.d.ts +37 -0
  21. package/dist/utilities/create-selectors/index.d.ts +1 -0
  22. package/dist/utilities/index.d.ts +1 -0
  23. package/package.json +6 -6
  24. package/dist/hooks/useNextcloudSearch/index.d.ts +0 -1
  25. package/dist/hooks/useNextcloudSearch/useNextcloudSearch.d.ts +0 -9
  26. package/dist/hooks/useNextcloudSearch/useNextcloudSearch.js +0 -48
  27. package/dist/modules/multimedia/FileCard/NextcloudFileCard.d.ts +0 -25
  28. package/dist/modules/multimedia/FileCard/NextcloudFileCard.js +0 -105
  29. package/dist/modules/multimedia/MediaLibrary/innertabs/Nextcloud.d.ts +0 -1
  30. package/dist/modules/multimedia/MediaLibrary/innertabs/Nextcloud.js +0 -35
  31. package/dist/modules/multimedia/Nextcloud/Nextcloud.d.ts +0 -24
  32. package/dist/modules/multimedia/Nextcloud/Nextcloud.js +0 -93
  33. package/dist/modules/multimedia/Nextcloud/index.d.ts +0 -2
  34. package/dist/utilities/create-selectors/createSelectors.d.ts +0 -10
  35. /package/dist/utilities/create-selectors/{createSelectors.js → create-selectors.js} +0 -0
@@ -1,15 +1,19 @@
1
1
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { Suspense, lazy } from "react";
2
3
  import clsx from "clsx";
3
4
  import { Toaster } from "react-hot-toast";
4
5
  import { useTranslation } from "react-i18next";
5
6
  import { useEdificeTheme } from "../../providers/EdificeThemeProvider/EdificeThemeProvider.hook.js";
6
7
  import Header from "./components/Header.js";
8
+ import HeaderNotificationsOverlay from "./components/HeaderNotificationsOverlay.js";
9
+ import { useOverlay } from "../PageLayout/hook/useOverlay.js";
10
+ import useUiOverride from "../../hooks/useUiOverride/useUiOverride.js";
7
11
  import useCookiesConsent from "../../hooks/useCookiesConsent/useCookiesConsent.js";
8
12
  import useZendeskGuide from "../../hooks/useZendeskGuide/useZendeskGuide.js";
9
13
  import useCantoo from "../../hooks/useCantoo/useCantoo.js";
10
14
  import Alert from "../Alert/Alert.js";
11
15
  import Button from "../Button/Button.js";
12
- const Layout = ({
16
+ const HeaderV2 = /* @__PURE__ */ lazy(() => import("../../modules/homepage/components/Header/Header.js")), Layout = ({
13
17
  children,
14
18
  headless = !1,
15
19
  whiteBg = !0,
@@ -18,7 +22,9 @@ const Layout = ({
18
22
  }) => {
19
23
  const {
20
24
  theme
21
- } = useEdificeTheme(), {
25
+ } = useEdificeTheme(), override = useUiOverride("layout.header"), isHeaderV2 = (override == null ? void 0 : override.variant) === "v2", {
26
+ toggleOverlay
27
+ } = useOverlay(), {
22
28
  t
23
29
  } = useTranslation(), {
24
30
  showCookiesConsent,
@@ -31,11 +37,12 @@ const Layout = ({
31
37
  "container-fluid": !headless,
32
38
  "rounded-4 border": (theme == null ? void 0 : theme.is1d) && !headless,
33
39
  "mt-24": (theme == null ? void 0 : theme.is1d) && !headless
34
- }, className), renderHeader = headless ? null : /* @__PURE__ */ jsx(Header, { is1d: theme == null ? void 0 : theme.is1d, src: theme == null ? void 0 : theme.basePath }), renderCookies = showCookiesConsent && /* @__PURE__ */ jsx(Alert, { type: "info", className: "m-12 rgpd", isConfirm: !0, position: "bottom-right", button: /* @__PURE__ */ jsx(Button, { color: "tertiary", variant: "ghost", onClick: handleConsultCookies, children: t("rgpd.cookies.banner.button.consult") }), onClose: handleCloseCookiesConsent, children: t("rgpd.cookies.banner.text1") }), renderToaster = /* @__PURE__ */ jsx(Toaster, { containerClassName: "toaster-container", toastOptions: {
40
+ }, className), renderHeader = headless ? null : isHeaderV2 ? /* @__PURE__ */ jsx(Suspense, { fallback: null, children: /* @__PURE__ */ jsx(HeaderV2, { src: theme == null ? void 0 : theme.basePath, dataProduct: override == null ? void 0 : override.theme, onNotificationsClick: toggleOverlay }) }) : /* @__PURE__ */ jsx(Header, { is1d: theme == null ? void 0 : theme.is1d, src: theme == null ? void 0 : theme.basePath }), renderNotificationsOverlay = !headless && isHeaderV2 && /* @__PURE__ */ jsx(HeaderNotificationsOverlay, {}), renderCookies = showCookiesConsent && /* @__PURE__ */ jsx(Alert, { type: "info", className: "m-12 rgpd", isConfirm: !0, position: "bottom-right", button: /* @__PURE__ */ jsx(Button, { color: "tertiary", variant: "ghost", onClick: handleConsultCookies, children: t("rgpd.cookies.banner.button.consult") }), onClose: handleCloseCookiesConsent, children: t("rgpd.cookies.banner.text1") }), renderToaster = /* @__PURE__ */ jsx(Toaster, { containerClassName: "toaster-container", toastOptions: {
35
41
  position: "top-right"
36
42
  } });
37
43
  return /* @__PURE__ */ jsxs(Fragment, { children: [
38
44
  renderHeader,
45
+ renderNotificationsOverlay,
39
46
  /* @__PURE__ */ jsx("main", { className: classes, ...restProps, children }),
40
47
  renderToaster,
41
48
  renderCookies
@@ -0,0 +1,5 @@
1
+ declare const HeaderNotificationsOverlay: {
2
+ (): import("react/jsx-runtime").JSX.Element;
3
+ displayName: string;
4
+ };
5
+ export default HeaderNotificationsOverlay;
@@ -0,0 +1,18 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { NotificationListContainer } from "../../../modules/homepage/components/Notifications/NotificationListContainer.js";
3
+ import PageLayoutOverlay from "../../PageLayout/components/PageLayoutOverlay.js";
4
+ import { useOverlay } from "../../PageLayout/hook/useOverlay.js";
5
+ const HeaderNotificationsOverlay = () => {
6
+ const {
7
+ isOverlayOpen,
8
+ updateOverlayOpen
9
+ } = useOverlay(), handleClose = () => updateOverlayOpen(!1);
10
+ return (
11
+ // NotificationList renders its own header with a close button, so
12
+ // PageLayoutOverlay's default close button would be redundant (double X).
13
+ /* @__PURE__ */ jsx(PageLayoutOverlay, { onClose: handleClose, closeButton: !1, children: isOverlayOpen && /* @__PURE__ */ jsx(NotificationListContainer, { onCloseNotifications: handleClose }) })
14
+ );
15
+ };
16
+ export {
17
+ HeaderNotificationsOverlay as default
18
+ };
@@ -1,5 +1,5 @@
1
1
  import { create } from "zustand";
2
- import { createSelectors } from "../../../utilities/create-selectors/createSelectors.js";
2
+ import { createSelectors } from "../../../utilities/create-selectors/create-selectors.js";
3
3
  const useOverlayStore = createSelectors(create((set) => ({
4
4
  overlayOpen: !1,
5
5
  updateOverlayOpen: (value) => set((previousState) => ({
@@ -22,7 +22,6 @@ export * from './useIsAdmlcOrAdmc';
22
22
  export * from './useKeyPress';
23
23
  export * from './useLibraryUrl';
24
24
  export * from './useMediaLibrary';
25
- export * from './useNextcloudSearch';
26
25
  export * from './usePublicConf';
27
26
  export * from './useScreeb';
28
27
  export * from './useScrollToTop';
@@ -31,6 +30,7 @@ export * from './useToast';
31
30
  export * from './useToggle';
32
31
  export * from './useTrapFocus';
33
32
  export * from './useTrashedResource';
33
+ export * from './useUiOverride';
34
34
  export * from './useUpload';
35
35
  export * from './useUploadFiles';
36
36
  export * from './useUser';
@@ -0,0 +1 @@
1
+ export { default as useUiOverride } from './useUiOverride';
@@ -0,0 +1,5 @@
1
+ /** Read the platform-driven UI override registered under `key` in the theme-conf, normalized to an object form. */
2
+ export default function useUiOverride(key: string): {
3
+ variant: string;
4
+ theme?: string;
5
+ } | undefined;
@@ -0,0 +1,13 @@
1
+ import { useEdificeTheme } from "../../providers/EdificeThemeProvider/EdificeThemeProvider.hook.js";
2
+ function useUiOverride(key) {
3
+ var _a;
4
+ const {
5
+ theme
6
+ } = useEdificeTheme(), raw = (_a = theme == null ? void 0 : theme.uiOverrides) == null ? void 0 : _a[key];
7
+ return typeof raw == "string" ? {
8
+ variant: raw
9
+ } : raw;
10
+ }
11
+ export {
12
+ useUiOverride as default
13
+ };
package/dist/index.js CHANGED
@@ -44,81 +44,79 @@ import { default as default42 } from "./components/LogoBeta/LogoBeta.js";
44
44
  import { default as default43 } from "./modules/multimedia/MediaLibrary/MediaLibrary.js";
45
45
  import { default as default44 } from "./components/MediaViewer/MediaViewer.js";
46
46
  import { default as default45 } from "./components/Modal/Modal.js";
47
- import { default as default46 } from "./modules/multimedia/Nextcloud/Nextcloud.js";
48
- import { default as default47 } from "./modules/multimedia/FileCard/NextcloudFileCard.js";
49
- import { default as default48 } from "./modules/modals/OnboardingModal/OnboardingModal.js";
50
- import { default as default49 } from "./components/PageLayout/PageLayout.js";
51
- import { default as default50 } from "./components/PreventPropagation/PreventPropagation.js";
52
- import { default as default51, Root } from "./components/PromotionCard/PromotionCard.js";
53
- import { default as default52 } from "./modules/modals/PublishModal/PublishModal.js";
54
- import { default as default53 } from "./components/Radio/Radio.js";
55
- import { default as default54 } from "./components/RadioCard/RadioCard.js";
56
- import { default as default55 } from "./components/SearchBar/SearchBar.js";
57
- import { default as default56 } from "./components/Button/SearchButton.js";
58
- import { default as default57 } from "./components/SegmentedControl/SegmentedControl.js";
59
- import { default as default58 } from "./components/Select/Select.js";
60
- import { default as default59 } from "./modules/modals/ShareModal/apps/ShareBlog.js";
61
- import { default as default60 } from "./modules/modals/ShareModal/ShareModal.js";
62
- import { default as default61 } from "./modules/modals/ShareModal/ShareResources.js";
63
- import { default as default62 } from "./components/Tree/components/SortableTree.js";
64
- import { default as default63 } from "./components/StackedGroup/StackedGroup.js";
65
- import { default as default64 } from "./components/Stepper/Stepper.js";
66
- import { default as default65 } from "./components/Switch/Switch.js";
67
- import { default as default66 } from "./components/Table/components/Table.js";
68
- import { default as default67 } from "./components/TextArea/TextArea.js";
69
- import { default as default68 } from "./components/Skeleton/TextSkeleton.js";
70
- import { default as default69 } from "./components/Tooltip/Tooltip.js";
71
- import { default as default70 } from "./components/Tree/components/Tree.js";
72
- import { default as default71 } from "./components/TreeView/TreeView.js";
73
- import { default as default72 } from "./modules/multimedia/UploadCard/UploadCard.js";
74
- import { default as default73 } from "./modules/multimedia/UploadFiles/UploadFiles.js";
75
- import { default as default74 } from "./modules/multimedia/VideoEmbed/VideoEmbed.js";
76
- import { default as default75 } from "./modules/multimedia/VideoRecorder/VideoRecorder.js";
77
- import { default as default76 } from "./components/VisuallyHidden/VisuallyHidden.js";
78
- import { default as default77 } from "./modules/multimedia/Workspace/Workspace.js";
79
- import { default as default78 } from "./modules/multimedia/WorkspaceFolders/WorkspaceFolders.js";
80
- import { default as default79 } from "./hooks/useBookmark/useBookmark.js";
81
- import { default as default80 } from "./hooks/useBreakpoint/useBreakpoint.js";
82
- import { default as default81 } from "./hooks/useBrowserInfo/useBrowserInfo.js";
83
- import { default as default82 } from "./hooks/useCantoo/useCantoo.js";
84
- import { default as default83 } from "./hooks/useClickOutside/useClickOutside.js";
85
- import { default as default84 } from "./hooks/useConversation/useConversation.js";
86
- import { default as default85 } from "./hooks/useDate/useDate.js";
87
- import { default as default86 } from "./hooks/useDebounce/useDebounce.js";
88
- import { default as default87 } from "./hooks/useDirectory/useDirectory.js";
89
- import { default as default88 } from "./hooks/useDropdown/useDropdown.js";
90
- import { default as default89 } from "./hooks/useDropzone/useDropzone.js";
91
- import { default as default90 } from "./hooks/useEdificeIcons/useEdificeIcons.js";
92
- import { default as default91 } from "./hooks/useHasWorkflow/useHasWorkflow.js";
93
- import { default as default92 } from "./hooks/useHover/useHover.js";
94
- import { default as default93 } from "./hooks/useHttpErrorToast/useHttpErrorToast.js";
95
- import { default as default94 } from "./hooks/useImage/useImage.js";
96
- import { default as default95 } from "./hooks/useInfiniteScroll/useInfiniteScroll.js";
97
- import { default as default96 } from "./hooks/useIsAdmc/useIsAdmc.js";
98
- import { default as default97 } from "./hooks/useIsAdml/useIsAdml.js";
99
- import { default as default98 } from "./hooks/useIsAdmlcOrAdmc/useIsAdmlcOrAdmc.js";
100
- import { default as default99 } from "./hooks/useKeyPress/useKeyPress.js";
101
- import { default as default100 } from "./hooks/useLibraryUrl/useLibraryUrl.js";
102
- import { default as default101 } from "./hooks/useMediaLibrary/useMediaLibrary.js";
103
- import { default as default102 } from "./hooks/useNextcloudSearch/useNextcloudSearch.js";
104
- import { default as default103 } from "./hooks/usePublicConf/usePublicConf.js";
105
- import { default as default104 } from "./hooks/useScrollToTop/useScrollToTop.js";
106
- import { default as default105 } from "./modules/modals/ShareModal/hooks/useShareMutation.js";
107
- import { default as default106 } from "./hooks/useTitle/useTitle.js";
108
- import { default as default107 } from "./hooks/useToast/useToast.js";
109
- import { default as default108 } from "./hooks/useToggle/useToggle.js";
110
- import { default as default109 } from "./hooks/useTrapFocus/useTrapFocus.js";
111
- import { default as default110 } from "./hooks/useTrashedResource/useTrashedResource.js";
112
- import { default as default111 } from "./modules/modals/ResourceModal/hooks/useUpdateMutation.js";
113
- import { default as default112 } from "./hooks/useUpload/useUpload.js";
114
- import { default as default113 } from "./hooks/useUploadFiles/useUploadFiles.js";
115
- import { default as default114 } from "./hooks/useUser/useUser.js";
116
- import { default as default115 } from "./hooks/useWorkspaceFile/useWorkspaceFile.js";
117
- import { default as default116 } from "./hooks/useWorkspaceFolders/useWorkspaceFolders.js";
118
- import { WORKSPACE_SHARED_FOLDER_ID, WORKSPACE_USER_FOLDER_ID, default as default117 } from "./hooks/useWorkspaceFolders/useWorkspaceFoldersTree.js";
119
- import { default as default118 } from "./hooks/useWorkspaceSearch/useWorkspaceSearch.js";
120
- import { default as default119 } from "./hooks/useXitiTrackPageLoad/useXitiTrackPageLoad.js";
121
- import { default as default120 } from "./hooks/useZendeskGuide/useZendeskGuide.js";
47
+ import { default as default46 } from "./modules/modals/OnboardingModal/OnboardingModal.js";
48
+ import { default as default47 } from "./components/PageLayout/PageLayout.js";
49
+ import { default as default48 } from "./components/PreventPropagation/PreventPropagation.js";
50
+ import { default as default49, Root } from "./components/PromotionCard/PromotionCard.js";
51
+ import { default as default50 } from "./modules/modals/PublishModal/PublishModal.js";
52
+ import { default as default51 } from "./components/Radio/Radio.js";
53
+ import { default as default52 } from "./components/RadioCard/RadioCard.js";
54
+ import { default as default53 } from "./components/SearchBar/SearchBar.js";
55
+ import { default as default54 } from "./components/Button/SearchButton.js";
56
+ import { default as default55 } from "./components/SegmentedControl/SegmentedControl.js";
57
+ import { default as default56 } from "./components/Select/Select.js";
58
+ import { default as default57 } from "./modules/modals/ShareModal/apps/ShareBlog.js";
59
+ import { default as default58 } from "./modules/modals/ShareModal/ShareModal.js";
60
+ import { default as default59 } from "./modules/modals/ShareModal/ShareResources.js";
61
+ import { default as default60 } from "./components/Tree/components/SortableTree.js";
62
+ import { default as default61 } from "./components/StackedGroup/StackedGroup.js";
63
+ import { default as default62 } from "./components/Stepper/Stepper.js";
64
+ import { default as default63 } from "./components/Switch/Switch.js";
65
+ import { default as default64 } from "./components/Table/components/Table.js";
66
+ import { default as default65 } from "./components/TextArea/TextArea.js";
67
+ import { default as default66 } from "./components/Skeleton/TextSkeleton.js";
68
+ import { default as default67 } from "./components/Tooltip/Tooltip.js";
69
+ import { default as default68 } from "./components/Tree/components/Tree.js";
70
+ import { default as default69 } from "./components/TreeView/TreeView.js";
71
+ import { default as default70 } from "./modules/multimedia/UploadCard/UploadCard.js";
72
+ import { default as default71 } from "./modules/multimedia/UploadFiles/UploadFiles.js";
73
+ import { default as default72 } from "./modules/multimedia/VideoEmbed/VideoEmbed.js";
74
+ import { default as default73 } from "./modules/multimedia/VideoRecorder/VideoRecorder.js";
75
+ import { default as default74 } from "./components/VisuallyHidden/VisuallyHidden.js";
76
+ import { default as default75 } from "./modules/multimedia/Workspace/Workspace.js";
77
+ import { default as default76 } from "./modules/multimedia/WorkspaceFolders/WorkspaceFolders.js";
78
+ import { default as default77 } from "./hooks/useBookmark/useBookmark.js";
79
+ import { default as default78 } from "./hooks/useBreakpoint/useBreakpoint.js";
80
+ import { default as default79 } from "./hooks/useBrowserInfo/useBrowserInfo.js";
81
+ import { default as default80 } from "./hooks/useCantoo/useCantoo.js";
82
+ import { default as default81 } from "./hooks/useClickOutside/useClickOutside.js";
83
+ import { default as default82 } from "./hooks/useConversation/useConversation.js";
84
+ import { default as default83 } from "./hooks/useDate/useDate.js";
85
+ import { default as default84 } from "./hooks/useDebounce/useDebounce.js";
86
+ import { default as default85 } from "./hooks/useDirectory/useDirectory.js";
87
+ import { default as default86 } from "./hooks/useDropdown/useDropdown.js";
88
+ import { default as default87 } from "./hooks/useDropzone/useDropzone.js";
89
+ import { default as default88 } from "./hooks/useEdificeIcons/useEdificeIcons.js";
90
+ import { default as default89 } from "./hooks/useHasWorkflow/useHasWorkflow.js";
91
+ import { default as default90 } from "./hooks/useHover/useHover.js";
92
+ import { default as default91 } from "./hooks/useHttpErrorToast/useHttpErrorToast.js";
93
+ import { default as default92 } from "./hooks/useImage/useImage.js";
94
+ import { default as default93 } from "./hooks/useInfiniteScroll/useInfiniteScroll.js";
95
+ import { default as default94 } from "./hooks/useIsAdmc/useIsAdmc.js";
96
+ import { default as default95 } from "./hooks/useIsAdml/useIsAdml.js";
97
+ import { default as default96 } from "./hooks/useIsAdmlcOrAdmc/useIsAdmlcOrAdmc.js";
98
+ import { default as default97 } from "./hooks/useKeyPress/useKeyPress.js";
99
+ import { default as default98 } from "./hooks/useLibraryUrl/useLibraryUrl.js";
100
+ import { default as default99 } from "./hooks/useMediaLibrary/useMediaLibrary.js";
101
+ import { default as default100 } from "./hooks/usePublicConf/usePublicConf.js";
102
+ import { default as default101 } from "./hooks/useScrollToTop/useScrollToTop.js";
103
+ import { default as default102 } from "./modules/modals/ShareModal/hooks/useShareMutation.js";
104
+ import { default as default103 } from "./hooks/useTitle/useTitle.js";
105
+ import { default as default104 } from "./hooks/useToast/useToast.js";
106
+ import { default as default105 } from "./hooks/useToggle/useToggle.js";
107
+ import { default as default106 } from "./hooks/useTrapFocus/useTrapFocus.js";
108
+ import { default as default107 } from "./hooks/useTrashedResource/useTrashedResource.js";
109
+ import { default as default108 } from "./hooks/useUiOverride/useUiOverride.js";
110
+ import { default as default109 } from "./modules/modals/ResourceModal/hooks/useUpdateMutation.js";
111
+ import { default as default110 } from "./hooks/useUpload/useUpload.js";
112
+ import { default as default111 } from "./hooks/useUploadFiles/useUploadFiles.js";
113
+ import { default as default112 } from "./hooks/useUser/useUser.js";
114
+ import { default as default113 } from "./hooks/useWorkspaceFile/useWorkspaceFile.js";
115
+ import { default as default114 } from "./hooks/useWorkspaceFolders/useWorkspaceFolders.js";
116
+ import { WORKSPACE_SHARED_FOLDER_ID, WORKSPACE_USER_FOLDER_ID, default as default115 } from "./hooks/useWorkspaceFolders/useWorkspaceFoldersTree.js";
117
+ import { default as default116 } from "./hooks/useWorkspaceSearch/useWorkspaceSearch.js";
118
+ import { default as default117 } from "./hooks/useXitiTrackPageLoad/useXitiTrackPageLoad.js";
119
+ import { default as default118 } from "./hooks/useZendeskGuide/useZendeskGuide.js";
122
120
  import { AccessiblePalette, DefaultPalette } from "./components/ColorPicker/ColorPalette.js";
123
121
  import { AntProvider } from "./providers/AntThemeProvider/AntProvider.js";
124
122
  import { BetaSwitch } from "./components/BetaSwitch/BetaSwitch.js";
@@ -149,6 +147,7 @@ import { UserSearch } from "./components/UserSearch/UserSearch.js";
149
147
  import { VisibleType } from "./components/UserSearch/types/visible.js";
150
148
  import { buildTree, determineNewParentId, findItemIndexInTree, flattenNodes, flattenTree, generateUpdateData, getActiveAndOverNodes, getDragDepth, getIndicesToUpdate, getProjection, updateParentIds } from "./components/Tree/utilities/tree-sortable.js";
151
149
  import { checkUserRight } from "./utilities/check-user-rights/check-user-rights.js";
150
+ import { createSelectors } from "./utilities/create-selectors/create-selectors.js";
152
151
  import { emptyScreenMapping } from "./utilities/emptyscreen-mapping/emptyscreen-mapping.js";
153
152
  import { getRotateTransitionStyle } from "./utilities/rotate-transition-style/get-rotate-transition-style.js";
154
153
  import { invalidateQueriesWithFirstPage } from "./utilities/react-query/react-query-utils.js";
@@ -226,61 +225,60 @@ export {
226
225
  Menu,
227
226
  MockedProvider,
228
227
  default45 as Modal,
229
- default46 as Nextcloud,
230
- default47 as NextcloudFileCard,
231
- default48 as OnboardingModal,
232
- default49 as PageLayout,
228
+ default46 as OnboardingModal,
229
+ default47 as PageLayout,
233
230
  PageLayoutContext,
234
231
  Pagination,
235
232
  Popover,
236
233
  PopoverBody,
237
234
  PopoverFooter,
238
235
  PopoverHeader,
239
- default50 as PreventPropagation,
240
- default51 as PromotionCard,
241
- default52 as PublishModal,
242
- default53 as Radio,
243
- default54 as RadioCard,
236
+ default48 as PreventPropagation,
237
+ default49 as PromotionCard,
238
+ default50 as PublishModal,
239
+ default51 as Radio,
240
+ default52 as RadioCard,
244
241
  ResourceModal,
245
242
  Root,
246
- default55 as SearchBar,
247
- default56 as SearchButton,
248
- default57 as SegmentedControl,
249
- default58 as Select,
250
- default59 as ShareBlog,
251
- default60 as ShareModal,
252
- default61 as ShareResources,
253
- default62 as SortableTree,
254
- default63 as StackedGroup,
255
- default64 as Stepper,
256
- default65 as Switch,
257
- default66 as Table,
243
+ default53 as SearchBar,
244
+ default54 as SearchButton,
245
+ default55 as SegmentedControl,
246
+ default56 as Select,
247
+ default57 as ShareBlog,
248
+ default58 as ShareModal,
249
+ default59 as ShareResources,
250
+ default60 as SortableTree,
251
+ default61 as StackedGroup,
252
+ default62 as Stepper,
253
+ default63 as Switch,
254
+ default64 as Table,
258
255
  Tabs,
259
- default67 as TextArea,
260
- default68 as TextSkeleton,
256
+ default65 as TextArea,
257
+ default66 as TextSkeleton,
261
258
  Toolbar,
262
- default69 as Tooltip,
263
- default70 as Tree,
259
+ default67 as Tooltip,
260
+ default68 as Tree,
264
261
  TreeNode,
265
262
  TreeNodeFolderWrapper,
266
- default71 as TreeView,
263
+ default69 as TreeView,
267
264
  Upload,
268
- default72 as UploadCard,
269
- default73 as UploadFiles,
265
+ default70 as UploadCard,
266
+ default71 as UploadFiles,
270
267
  UserRightsList,
271
268
  UserSearch,
272
- default74 as VideoEmbed,
273
- default75 as VideoRecorder,
269
+ default72 as VideoEmbed,
270
+ default73 as VideoRecorder,
274
271
  VisibleType,
275
- default76 as VisuallyHidden,
272
+ default74 as VisuallyHidden,
276
273
  WORKSPACE_SHARED_FOLDER_ID,
277
274
  WORKSPACE_USER_FOLDER_ID,
278
- default77 as Workspace,
279
- default78 as WorkspaceFolders,
275
+ default75 as Workspace,
276
+ default76 as WorkspaceFolders,
280
277
  addNode,
281
278
  arrayUnique,
282
279
  buildTree,
283
280
  checkUserRight,
281
+ createSelectors,
284
282
  deleteNode,
285
283
  determineNewParentId,
286
284
  emptyScreenMapping,
@@ -306,57 +304,57 @@ export {
306
304
  setRef,
307
305
  updateNode,
308
306
  updateParentIds,
309
- default79 as useBookmark,
310
- default80 as useBreakpoint,
311
- default81 as useBrowserInfo,
312
- default82 as useCantoo,
307
+ default77 as useBookmark,
308
+ default78 as useBreakpoint,
309
+ default79 as useBrowserInfo,
310
+ default80 as useCantoo,
313
311
  useCheckable,
314
- default83 as useClickOutside,
315
- default84 as useConversation,
316
- default85 as useDate,
317
- default86 as useDebounce,
318
- default87 as useDirectory,
319
- default88 as useDropdown,
320
- default89 as useDropzone,
312
+ default81 as useClickOutside,
313
+ default82 as useConversation,
314
+ default83 as useDate,
315
+ default84 as useDebounce,
316
+ default85 as useDirectory,
317
+ default86 as useDropdown,
318
+ default87 as useDropzone,
321
319
  useDropzoneContext,
322
320
  useEdificeClient,
323
- default90 as useEdificeIcons,
321
+ default88 as useEdificeIcons,
324
322
  useEdificeTheme,
325
323
  useFileToAttachment,
326
- default91 as useHasWorkflow,
327
- default92 as useHover,
328
- default93 as useHttpErrorToast,
329
- default94 as useImage,
330
- default95 as useInfiniteScroll,
331
- default96 as useIsAdmc,
332
- default97 as useIsAdml,
333
- default98 as useIsAdmlcOrAdmc,
334
- default99 as useKeyPress,
335
- default100 as useLibraryUrl,
336
- default101 as useMediaLibrary,
337
- default102 as useNextcloudSearch,
324
+ default89 as useHasWorkflow,
325
+ default90 as useHover,
326
+ default91 as useHttpErrorToast,
327
+ default92 as useImage,
328
+ default93 as useInfiniteScroll,
329
+ default94 as useIsAdmc,
330
+ default95 as useIsAdml,
331
+ default96 as useIsAdmlcOrAdmc,
332
+ default97 as useKeyPress,
333
+ default98 as useLibraryUrl,
334
+ default99 as useMediaLibrary,
338
335
  useOverlay,
339
336
  usePageLayout,
340
- default103 as usePublicConf,
337
+ default100 as usePublicConf,
341
338
  useScreeb,
342
- default104 as useScrollToTop,
343
- default105 as useShareMutation,
344
- default106 as useTitle,
345
- default107 as useToast,
346
- default108 as useToggle,
347
- default109 as useTrapFocus,
348
- default110 as useTrashedResource,
339
+ default101 as useScrollToTop,
340
+ default102 as useShareMutation,
341
+ default103 as useTitle,
342
+ default104 as useToast,
343
+ default105 as useToggle,
344
+ default106 as useTrapFocus,
345
+ default107 as useTrashedResource,
349
346
  useTreeSortable,
350
347
  useTreeView,
351
- default111 as useUpdateMutation,
352
- default112 as useUpload,
353
- default113 as useUploadFiles,
354
- default114 as useUser,
355
- default115 as useWorkspaceFile,
356
- default116 as useWorkspaceFolders,
357
- default117 as useWorkspaceFoldersTree,
358
- default118 as useWorkspaceSearch,
359
- default119 as useXitiTrackPageLoad,
360
- default120 as useZendeskGuide,
348
+ default108 as useUiOverride,
349
+ default109 as useUpdateMutation,
350
+ default110 as useUpload,
351
+ default111 as useUploadFiles,
352
+ default112 as useUser,
353
+ default113 as useWorkspaceFile,
354
+ default114 as useWorkspaceFolders,
355
+ default115 as useWorkspaceFoldersTree,
356
+ default116 as useWorkspaceSearch,
357
+ default117 as useXitiTrackPageLoad,
358
+ default118 as useZendeskGuide,
361
359
  wrapTreeNode
362
360
  };
@@ -1,9 +1,11 @@
1
1
  export interface HeaderProps {
2
2
  src: string | undefined;
3
3
  onNotificationsClick?: () => void;
4
+ /** Scope this header's CSS theme (`data-product`) to its own subtree, independently of the page's ambient theme. */
5
+ dataProduct?: string;
4
6
  }
5
7
  declare const Header: {
6
- ({ src, onNotificationsClick, }: HeaderProps): JSX.Element;
8
+ ({ src, onNotificationsClick, dataProduct, }: HeaderProps): JSX.Element;
7
9
  displayName: string;
8
10
  };
9
11
  export default Header;
@@ -25,7 +25,8 @@ import Avatar from "../../../../components/Avatar/Avatar.js";
25
25
  import { Popover, PopoverBody } from "../../../../components/Popover/Popover.js";
26
26
  const Header = ({
27
27
  src = "",
28
- onNotificationsClick
28
+ onNotificationsClick,
29
+ dataProduct
29
30
  }) => {
30
31
  const {
31
32
  t
@@ -47,7 +48,7 @@ const Header = ({
47
48
  } = useEdificeTheme(), hasMessages = messages > 0, [userRef, isUserHovered] = useHover(), popoverUserId = useId(), handleNotificationsClick = () => {
48
49
  onNotificationsClick == null || onNotificationsClick();
49
50
  };
50
- return /* @__PURE__ */ jsx("header", { className: classes, children: /* @__PURE__ */ jsxs(Navbar, { className: "px-24", children: [
51
+ return /* @__PURE__ */ jsx("header", { className: classes, "data-product": dataProduct, children: /* @__PURE__ */ jsxs(Navbar, { className: "px-24", children: [
51
52
  /* @__PURE__ */ jsx(LogoBeta, { src: `${src}/img/illustrations/logo.png` }),
52
53
  /* @__PURE__ */ jsxs("ul", { className: "navbar-nav", children: [
53
54
  /* @__PURE__ */ jsx(NavItem, { children: /* @__PURE__ */ jsx(NavLink, { link: "/timeline/timeline", translate: t("navbar.home"), "data-testid": "header-home-button", children: /* @__PURE__ */ jsx(SvgIconHomeBeta, {}) }) }),
@@ -1,4 +1,2 @@
1
1
  export { default as FileCard } from './FileCard';
2
2
  export * from './FileCard';
3
- export { default as NextcloudFileCard } from './NextcloudFileCard';
4
- export * from './NextcloudFileCard';
@@ -1,4 +1,4 @@
1
- import { NextcloudDocument, WorkspaceElement, WorkspaceVisibility } from '@edifice.io/client';
1
+ import { WorkspaceElement, WorkspaceVisibility } from '@edifice.io/client';
2
2
  import { TabsItemProps } from '../../../components';
3
3
  import { ExternalLinkTabProps } from './innertabs/ExternalLink';
4
4
  import { InternalLinkTabProps, InternalLinkTabResult } from './innertabs/InternalLink';
@@ -54,7 +54,7 @@ export interface MediaLibraryRef {
54
54
  /**
55
55
  * The resulting type depends on the actual selected Tab when modal is closed.
56
56
  */
57
- export type MediaLibraryResult = WorkspaceElement[] | WorkspaceElement | NextcloudDocument[] | InternalLinkTabResult | string | /*TODO type des autres résultats ?*/ any;
57
+ export type MediaLibraryResult = WorkspaceElement[] | WorkspaceElement | InternalLinkTabResult | string | /*TODO type des autres résultats ?*/ any;
58
58
  /**
59
59
  * MediaLibrary component properties
60
60
  */
@@ -12,7 +12,6 @@ import SvgIconSmartphone from "../../icons/components/IconSmartphone.js";
12
12
  import { InnerTabs } from "./innertabs/index.js";
13
13
  import { MediaLibraryContext } from "./MediaLibraryContext.js";
14
14
  import useHasWorkflow from "../../../hooks/useHasWorkflow/useHasWorkflow.js";
15
- import usePublicConf from "../../../hooks/usePublicConf/usePublicConf.js";
16
15
  import useHttpErrorToast from "../../../hooks/useHttpErrorToast/useHttpErrorToast.js";
17
16
  import Modal from "../../../components/Modal/Modal.js";
18
17
  import { Tabs } from "../../../components/Tabs/components/Tabs.js";
@@ -30,8 +29,6 @@ const orderedTabs = [
30
29
  // Filesystem browser + drag'n'drop of files
31
30
  "workspace",
32
31
  // Media browser
33
- "nextcloud",
34
- // Nextcloud media browser
35
32
  "video-embedder"
36
33
  // Link to a hosted video
37
34
  ], mediaLibraryTypes = {
@@ -73,7 +70,7 @@ const orderedTabs = [
73
70
  onCancel,
74
71
  onTabChange
75
72
  }, ref) => {
76
- var _a, _b;
73
+ var _a;
77
74
  const linkTabProps = useRef(), refModal = useRef(null);
78
75
  useImperativeHandle(ref, () => ({
79
76
  show,
@@ -84,9 +81,7 @@ const orderedTabs = [
84
81
  }));
85
82
  const {
86
83
  t
87
- } = useTranslation(), workspaceCreateWorkflow = useHasWorkflow("org.entcore.workspace.controllers.WorkspaceController|addDocument"), videoCaptureWorkflow = useHasWorkflow("com.opendigitaleducation.video.controllers.VideoController|capture"), nextcloudViewWorkflow = useHasWorkflow("fr.openent.nextcloud.controller.NextcloudController|view"), {
88
- data: workspacePublicConf
89
- } = usePublicConf("workspace"), enableNextcloudTab = ((_a = workspacePublicConf == null ? void 0 : workspacePublicConf["folder-service"]) == null ? void 0 : _a.includes("nextcloud")) && nextcloudViewWorkflow, [type, setType] = useState(null);
84
+ } = useTranslation(), workspaceCreateWorkflow = useHasWorkflow("org.entcore.workspace.controllers.WorkspaceController|addDocument"), videoCaptureWorkflow = useHasWorkflow("com.opendigitaleducation.video.controllers.VideoController|capture"), [type, setType] = useState(null);
90
85
  useHttpErrorToast({
91
86
  active: !!type,
92
87
  isDismissible: !0,
@@ -101,14 +96,6 @@ const orderedTabs = [
101
96
  availableFor: ["audio", "video", "image", "attachment"],
102
97
  isEnable: null
103
98
  },
104
- nextcloud: {
105
- id: "nextcloud",
106
- icon: /* @__PURE__ */ jsx(SvgIconGlobe, {}),
107
- label: t("bbm.nextcloud"),
108
- content: /* @__PURE__ */ jsx(InnerTabs.Nextcloud, {}),
109
- availableFor: ["audio", "video", "image", "attachment"],
110
- isEnable: () => !!enableNextcloudTab
111
- },
112
99
  upload: {
113
100
  id: "upload",
114
101
  icon: /* @__PURE__ */ jsx(SvgIconSmartphone, {}),
@@ -190,17 +177,17 @@ const orderedTabs = [
190
177
  linkTabProps.current = props, "resourceId" in props || "appPrefix" in props || setDefaultTabId("external-link"), setType("hyperlink");
191
178
  };
192
179
  useEffect(() => {
193
- var _a2, _b2;
180
+ var _a2, _b;
194
181
  const typeKey = type || "none";
195
- !defaultTabId && typeof ((_a2 = mediaLibraryTypes[typeKey]) == null ? void 0 : _a2.defaultTab) == "string" && setDefaultTabId((_b2 = mediaLibraryTypes[typeKey]) == null ? void 0 : _b2.defaultTab);
182
+ !defaultTabId && typeof ((_a2 = mediaLibraryTypes[typeKey]) == null ? void 0 : _a2.defaultTab) == "string" && setDefaultTabId((_b = mediaLibraryTypes[typeKey]) == null ? void 0 : _b.defaultTab);
196
183
  }, [defaultTabId, type]);
197
- const modalHeader = t(((_b = mediaLibraryTypes[type ?? "none"]) == null ? void 0 : _b.title) ?? "bbm"), resetState = () => {
184
+ const modalHeader = t(((_a = mediaLibraryTypes[type ?? "none"]) == null ? void 0 : _a.title) ?? "bbm"), resetState = () => {
198
185
  linkTabProps.current = void 0, setResult(void 0), setResultCounter(void 0), setDefaultTabId(void 0), setPreSuccess(void 0), setDeletionsOnCancel([]);
199
186
  }, handleTabChange = (tab) => {
200
187
  onTabChange == null || onTabChange(tab, deletionsOnCancel), resetState();
201
- }, isWorkspaceElementArray = (result2) => Array.isArray(result2) && (result2.length === 0 || "eType" in result2[0]), handleOnSuccess = useCallback(() => {
188
+ }, handleOnSuccess = useCallback(() => {
202
189
  const triggerSuccess = async (result2) => {
203
- isWorkspaceElementArray(result2) && ["protected", "public"].findIndex((v) => v === visibility) >= 0 && (result2 = await odeServices.workspace().transferDocuments(result2, appCode ?? "media-library", visibility)), onSuccess(result2);
190
+ result2 instanceof Array && ["protected", "public"].findIndex((v) => v === visibility) >= 0 && (result2 = await odeServices.workspace().transferDocuments(result2, appCode ?? "media-library", visibility)), onSuccess(result2);
204
191
  };
205
192
  onSuccessAction ? onSuccessAction().then((result2) => {
206
193
  triggerSuccess(result2);
@@ -4,7 +4,6 @@ export declare const InnerTabs: {
4
4
  Upload: () => import("react/jsx-runtime").JSX.Element;
5
5
  ExternalLink: ({ link, multiNodeSelected, }: import('./ExternalLink').ExternalLinkTabProps) => import("react/jsx-runtime").JSX.Element;
6
6
  Workspace: () => import("react/jsx-runtime").JSX.Element;
7
- Nextcloud: () => import("react/jsx-runtime").JSX.Element;
8
7
  InternalLink: ({ target, resourceId, appPrefix, }: import('./InternalLink').InternalLinkTabProps) => import("react/jsx-runtime").JSX.Element;
9
8
  Iframe: () => import("react/jsx-runtime").JSX.Element;
10
9
  VideoEmbedder: () => import("react/jsx-runtime").JSX.Element;
@@ -2,7 +2,6 @@ import { Audio } from "./Audio.js";
2
2
  import { ExternalLink } from "./ExternalLink.js";
3
3
  import { Iframe } from "./Iframe.js";
4
4
  import { InternalLink } from "./InternalLink.js";
5
- import { Nextcloud } from "./Nextcloud.js";
6
5
  import { Upload } from "./Upload.js";
7
6
  import { Video } from "./Video.js";
8
7
  import { VideoEmbedder } from "./VideoEmbedder.js";
@@ -13,7 +12,6 @@ const InnerTabs = {
13
12
  Upload,
14
13
  ExternalLink,
15
14
  Workspace,
16
- Nextcloud,
17
15
  InternalLink,
18
16
  Iframe,
19
17
  VideoEmbedder
@@ -5,7 +5,6 @@ export * from './ImagePicker';
5
5
  export * from './FileCard';
6
6
  export * from './Linker';
7
7
  export * from './MediaLibrary';
8
- export * from './Nextcloud';
9
8
  export * from './UploadCard';
10
9
  export * from './VideoEmbed';
11
10
  export * from './VideoRecorder';
@@ -4,14 +4,12 @@ import { default as default4 } from "./modules/multimedia/FileCard/FileCard.js";
4
4
  import { default as default5 } from "./modules/multimedia/ImageEditor/components/ImageEditor.js";
5
5
  import { default as default6 } from "./modules/multimedia/ImagePicker/ImagePicker.js";
6
6
  import { default as default7 } from "./modules/multimedia/MediaLibrary/MediaLibrary.js";
7
- import { default as default8 } from "./modules/multimedia/Nextcloud/Nextcloud.js";
8
- import { default as default9 } from "./modules/multimedia/FileCard/NextcloudFileCard.js";
9
- import { default as default10 } from "./modules/multimedia/UploadCard/UploadCard.js";
10
- import { default as default11 } from "./modules/multimedia/UploadFiles/UploadFiles.js";
11
- import { default as default12 } from "./modules/multimedia/VideoEmbed/VideoEmbed.js";
12
- import { default as default13 } from "./modules/multimedia/VideoRecorder/VideoRecorder.js";
13
- import { default as default14 } from "./modules/multimedia/Workspace/Workspace.js";
14
- import { default as default15 } from "./modules/multimedia/WorkspaceFolders/WorkspaceFolders.js";
7
+ import { default as default8 } from "./modules/multimedia/UploadCard/UploadCard.js";
8
+ import { default as default9 } from "./modules/multimedia/UploadFiles/UploadFiles.js";
9
+ import { default as default10 } from "./modules/multimedia/VideoEmbed/VideoEmbed.js";
10
+ import { default as default11 } from "./modules/multimedia/VideoRecorder/VideoRecorder.js";
11
+ import { default as default12 } from "./modules/multimedia/Workspace/Workspace.js";
12
+ import { default as default13 } from "./modules/multimedia/WorkspaceFolders/WorkspaceFolders.js";
15
13
  import { ExternalLinker } from "./modules/multimedia/Linker/ExternalLinker/ExternalLinker.js";
16
14
  import { InternalLinker } from "./modules/multimedia/Linker/InternalLinker/InternalLinker.js";
17
15
  import { Upload } from "./modules/multimedia/MediaLibrary/innertabs/Upload.js";
@@ -24,13 +22,11 @@ export {
24
22
  default6 as ImagePicker,
25
23
  InternalLinker,
26
24
  default7 as MediaLibrary,
27
- default8 as Nextcloud,
28
- default9 as NextcloudFileCard,
29
25
  Upload,
30
- default10 as UploadCard,
31
- default11 as UploadFiles,
32
- default12 as VideoEmbed,
33
- default13 as VideoRecorder,
34
- default14 as Workspace,
35
- default15 as WorkspaceFolders
26
+ default8 as UploadCard,
27
+ default9 as UploadFiles,
28
+ default10 as VideoEmbed,
29
+ default11 as VideoRecorder,
30
+ default12 as Workspace,
31
+ default13 as WorkspaceFolders
36
32
  };
@@ -1,12 +1,13 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
- import { QueryClientProvider, QueryClient } from "@tanstack/react-query";
2
+ import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
3
+ import { useState } from "react";
3
4
  import { EdificeClientContext } from "../EdificeClientProvider/EdificeClientProvider.context.js";
4
5
  import { EdificeThemeContext } from "../EdificeThemeProvider/EdificeThemeProvider.context.js";
5
6
  import { mockQueryResult, mockSession, mockConf } from "./MockedProvider.mocks.js";
6
- const queryClient = new QueryClient(), MockedProvider = ({
7
+ const MockedProvider = ({
7
8
  children
8
9
  }) => {
9
- const themeContextValue = {
10
+ const [queryClient] = useState(() => new QueryClient()), themeContextValue = {
10
11
  theme: "default",
11
12
  setTheme: vi.fn()
12
13
  }, clientContextValue = {
@@ -0,0 +1,37 @@
1
+ import { StoreApi, UseBoundStore } from 'zustand';
2
+ type WithSelectors<S> = S extends {
3
+ getState: () => infer T;
4
+ } ? S & {
5
+ use: {
6
+ [K in keyof T]: () => T[K];
7
+ };
8
+ } : never;
9
+ /**
10
+ * Augments a Zustand store with auto-generated, per-field selector hooks,
11
+ * so consumers can call `store.use.myValue()` instead of
12
+ * `store((s) => s.myValue)` and never forget a selector.
13
+ *
14
+ * Pattern from the Zustand docs:
15
+ * https://zustand.docs.pmnd.rs/guides/auto-generating-selectors
16
+ *
17
+ * @param _store - The bound store to augment.
18
+ * @returns The same store instance, mutated with a `use` object exposing one
19
+ * selector hook per state key.
20
+ *
21
+ * @remarks
22
+ * - The store is mutated in place; the returned reference is the input store.
23
+ * - Selectors are generated once, from the keys present at call time. Fields
24
+ * added to the state later won't get a `use.<key>` selector.
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * const useBearStore = createSelectors(
29
+ * create<BearState>(() => ({ bears: 0 })),
30
+ * );
31
+ *
32
+ * // In a component:
33
+ * const bears = useBearStore.use.bears();
34
+ * ```
35
+ */
36
+ export declare const createSelectors: <S extends UseBoundStore<StoreApi<object>>>(_store: S) => WithSelectors<S>;
37
+ export {};
@@ -0,0 +1 @@
1
+ export * from './create-selectors';
@@ -1,4 +1,5 @@
1
1
  export * from './check-user-rights';
2
+ export * from './create-selectors';
2
3
  export * from './emptyscreen-mapping';
3
4
  export * from './react-query';
4
5
  export * from './refs';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edifice.io/react",
3
- "version": "2.6.0-develop-integration.20260717095527",
3
+ "version": "2.6.0-develop-enabling.20260720144517",
4
4
  "description": "Edifice React Library",
5
5
  "keywords": [
6
6
  "react",
@@ -140,9 +140,9 @@
140
140
  "swiper": "10.1.0",
141
141
  "ua-parser-js": "1.0.36",
142
142
  "zustand": "4.5.7",
143
- "@edifice.io/tiptap-extensions": "2.6.0-develop-integration.20260717095527",
144
- "@edifice.io/bootstrap": "2.6.0-develop-integration.20260717095527",
145
- "@edifice.io/utilities": "2.6.0-develop-integration.20260717095527"
143
+ "@edifice.io/bootstrap": "2.6.0-develop-enabling.20260720144517",
144
+ "@edifice.io/utilities": "2.6.0-develop-enabling.20260720144517",
145
+ "@edifice.io/tiptap-extensions": "2.6.0-develop-enabling.20260720144517"
146
146
  },
147
147
  "devDependencies": {
148
148
  "@babel/plugin-transform-react-pure-annotations": "7.27.1",
@@ -173,8 +173,8 @@
173
173
  "vite": "5.4.14",
174
174
  "vite-plugin-dts": "4.5.4",
175
175
  "vite-tsconfig-paths": "5.1.4",
176
- "@edifice.io/client": "2.6.0-develop-integration.20260717095527",
177
- "@edifice.io/config": "2.6.0-develop-integration.20260717095527"
176
+ "@edifice.io/client": "2.6.0-develop-enabling.20260720144517",
177
+ "@edifice.io/config": "2.6.0-develop-enabling.20260720144517"
178
178
  },
179
179
  "peerDependencies": {
180
180
  "@react-spring/web": "9.7.5",
@@ -1 +0,0 @@
1
- export { default as useNextcloudSearch } from './useNextcloudSearch';
@@ -1,9 +0,0 @@
1
- import { ID, NextcloudDocument } from '@edifice.io/client';
2
- import { TreeData } from '../../types';
3
- export type NextcloudFolderNode = TreeData & {
4
- files?: NextcloudDocument[];
5
- };
6
- export default function useNextcloudSearch(rootId: string, rootName: string, userId?: string): {
7
- root: NextcloudFolderNode;
8
- loadContent: (folderId?: ID) => void;
9
- };
@@ -1,48 +0,0 @@
1
- import { useReducer, useCallback } from "react";
2
- import { odeServices } from "@edifice.io/client";
3
- import { useQueryClient } from "@tanstack/react-query";
4
- import { findNodeById } from "../../components/TreeView/utilities/treeview.js";
5
- function useNextcloudSearch(rootId, rootName, userId) {
6
- function treeReducer(state, action) {
7
- switch (action.type) {
8
- case "update": {
9
- const node = findNodeById(state, action.folderId);
10
- return node && (node.children = action.subfolders.map((f) => ({
11
- id: f.path,
12
- name: f.name
13
- })), node.files = action.files), {
14
- ...state
15
- };
16
- }
17
- default:
18
- throw Error("[useNextcloudSearch] Unknown action type: " + action.type);
19
- }
20
- }
21
- const [root, dispatch] = useReducer(treeReducer, {
22
- id: rootId,
23
- name: rootName,
24
- section: !0
25
- }), queryClient = useQueryClient(), loadContent = useCallback(async (folderId) => {
26
- if (!userId) return;
27
- const path = folderId === rootId ? void 0 : folderId, payload = await queryClient.fetchQuery({
28
- queryKey: ["nextcloud", "documents", userId, path ?? "/"],
29
- queryFn: () => odeServices.nextcloud().listDocuments(userId, path),
30
- staleTime: 6e4
31
- }), subfolders = [], files = [], currentPath = path ?? "/";
32
- payload.filter((doc) => doc.path !== currentPath).forEach((doc) => {
33
- doc.isFolder ? subfolders.push(doc) : files.push(doc);
34
- }), dispatch({
35
- folderId,
36
- subfolders,
37
- files,
38
- type: "update"
39
- });
40
- }, [rootId, userId, queryClient]);
41
- return {
42
- root,
43
- loadContent
44
- };
45
- }
46
- export {
47
- useNextcloudSearch as default
48
- };
@@ -1,25 +0,0 @@
1
- import { ReactNode } from 'react';
2
- import { NextcloudDocument } from '@edifice.io/client';
3
- import { CardProps } from '../../../components/Card';
4
- export interface NextcloudFileCardProps extends CardProps {
5
- doc: NextcloudDocument;
6
- /**
7
- * Id of the user who owns the Nextcloud document, used to build the preview URL.
8
- */
9
- userId: string;
10
- /**
11
- * Custom icon to override the default based on file type
12
- * Can be a string or a React node
13
- */
14
- customIcon?: ReactNode;
15
- /**
16
- * Custom color class to override the default based on file type
17
- * Example: "bg-purple-300" or any valid CSS class
18
- */
19
- customColor?: string;
20
- }
21
- declare const NextcloudFileCard: {
22
- ({ doc, userId, isClickable, isSelectable, isSelected, onClick, className, onSelect, isFocused, app, customIcon, customColor, }: NextcloudFileCardProps): import("react/jsx-runtime").JSX.Element;
23
- displayName: string;
24
- };
25
- export default NextcloudFileCard;
@@ -1,105 +0,0 @@
1
- import { jsx, jsxs } from "react/jsx-runtime";
2
- import { useRef } from "react";
3
- import { DocumentHelper, odeServices } from "@edifice.io/client";
4
- import clsx from "clsx";
5
- import SvgIconLandscape from "../../icons/components/IconLandscape.js";
6
- import SvgIconMic from "../../icons/components/IconMic.js";
7
- import SvgIconTextPage from "../../icons/components/IconTextPage.js";
8
- import SvgIconVideo from "../../icons/components/IconVideo.js";
9
- import FileIcon from "./FileIcon.js";
10
- import useThumbnail from "../../../hooks/useThumbnail/useThumbnail.js";
11
- import Card from "../../../components/Card/Card.js";
12
- const NextcloudFileCard = ({
13
- doc,
14
- userId,
15
- isClickable = !0,
16
- isSelectable = !1,
17
- isSelected = !1,
18
- onClick,
19
- className,
20
- onSelect,
21
- isFocused,
22
- app,
23
- customIcon,
24
- customColor
25
- }) => {
26
- const ref = useRef(null), type = DocumentHelper.role(doc.contentType, !1);
27
- function getRoleMap(type2) {
28
- if (customIcon !== void 0 || customColor !== void 0)
29
- return {
30
- icon: customIcon || /* @__PURE__ */ jsx(SvgIconTextPage, { width: 22, height: 22 }),
31
- color: customColor || "bg-gray-300",
32
- hasShadow: !1
33
- };
34
- const roleMappings = {
35
- csv: {
36
- icon: ".CSV",
37
- color: "bg-orange-200"
38
- },
39
- xls: {
40
- icon: ".XLS",
41
- color: "bg-green-200"
42
- },
43
- doc: {
44
- icon: ".DOC",
45
- color: "bg-blue-200"
46
- },
47
- txt: {
48
- icon: ".TXT",
49
- color: "bg-blue-200"
50
- },
51
- pdf: {
52
- icon: ".PDF",
53
- color: "bg-red-200"
54
- },
55
- audio: {
56
- icon: /* @__PURE__ */ jsx(SvgIconMic, { width: 22, height: 22 }),
57
- color: "bg-red-200"
58
- },
59
- ppt: {
60
- icon: ".PPT",
61
- color: "bg-red-200"
62
- },
63
- img: {
64
- icon: /* @__PURE__ */ jsx(SvgIconLandscape, { width: 22, height: 22 }),
65
- color: "bg-green-200"
66
- },
67
- video: {
68
- icon: /* @__PURE__ */ jsx(SvgIconVideo, { width: 22, height: 22 }),
69
- color: "bg-purple-200"
70
- },
71
- zip: {
72
- icon: ".ZIP",
73
- color: "bg-gray-300"
74
- },
75
- md: {
76
- icon: ".MD",
77
- color: "bg-blue-200"
78
- },
79
- unknown: {
80
- icon: /* @__PURE__ */ jsx(SvgIconTextPage, { width: 22, height: 22 }),
81
- color: "bg-gray-300"
82
- }
83
- };
84
- return roleMappings[type2] || roleMappings.unknown;
85
- }
86
- const roleMap = getRoleMap(type ?? "unknown"), file = clsx("file position-relative rounded", (roleMap == null ? void 0 : roleMap.color) ?? "bg-yellow-200"), mediaSrc = type === "img" ? odeServices.nextcloud().getFileUrl(userId, doc) : null, hasThumbnail = useThumbnail(mediaSrc, {
87
- ref
88
- }), imageStyles = hasThumbnail && {
89
- backgroundImage: `url(${mediaSrc})`,
90
- backgroundSize: "cover"
91
- };
92
- return /* @__PURE__ */ jsx(Card, { className: clsx("card-file", className), isClickable, isSelectable, isSelected, onClick, app, isFocused, onSelect, children: /* @__PURE__ */ jsxs(Card.Body, { space: "8", children: [
93
- /* @__PURE__ */ jsx("div", { ref, className: file, style: {
94
- aspectRatio: "16/10",
95
- ...imageStyles
96
- }, children: type !== "img" || type === "img" && !hasThumbnail ? /* @__PURE__ */ jsx(FileIcon, { type, roleMap }) : null }),
97
- /* @__PURE__ */ jsxs("div", { className: "mt-4", children: [
98
- /* @__PURE__ */ jsx(Card.Text, { children: doc.name }),
99
- /* @__PURE__ */ jsx(Card.Text, { className: "text-black-50", children: doc == null ? void 0 : doc.ownerDisplayName })
100
- ] })
101
- ] }) });
102
- };
103
- export {
104
- NextcloudFileCard as default
105
- };
@@ -1 +0,0 @@
1
- export declare const Nextcloud: () => import("react/jsx-runtime").JSX.Element;
@@ -1,35 +0,0 @@
1
- import { jsx } from "react/jsx-runtime";
2
- import { odeServices } from "@edifice.io/client";
3
- import { useMediaLibraryContext } from "../MediaLibraryContext.js";
4
- import useUser from "../../../../hooks/useUser/useUser.js";
5
- import Nextcloud$1 from "../../Nextcloud/Nextcloud.js";
6
- const Nextcloud = () => {
7
- const {
8
- type,
9
- setResultCounter,
10
- setResult,
11
- setPreSuccess,
12
- multiple
13
- } = useMediaLibraryContext(), {
14
- user
15
- } = useUser();
16
- function getDocumentRoleFilter() {
17
- switch (type) {
18
- case "image":
19
- return "img";
20
- case "audio":
21
- return "audio";
22
- case "video":
23
- return "video";
24
- default:
25
- return null;
26
- }
27
- }
28
- function handleSelect(result) {
29
- setResultCounter(result.length), result.length ? (setResult(result), setPreSuccess(() => () => user != null && user.userId ? odeServices.nextcloud().copyDocumentToWorkspace(user.userId, result.map((doc) => doc.path)) : Promise.resolve([]))) : (setResult(), setPreSuccess(void 0));
30
- }
31
- return /* @__PURE__ */ jsx(Nextcloud$1, { roles: getDocumentRoleFilter(), onSelect: handleSelect, multiple, className: "border rounded overflow-y-auto" });
32
- };
33
- export {
34
- Nextcloud
35
- };
@@ -1,24 +0,0 @@
1
- import { NextcloudDocument, Role } from '@edifice.io/client';
2
- /**
3
- * Nextcloud component properties
4
- */
5
- export interface NextcloudProps {
6
- /**
7
- * Notify parent when media elements are successfully selected.
8
- */
9
- onSelect: (result: NextcloudDocument[]) => void;
10
- /**
11
- * Boolean to know if we can select 1 or many files.
12
- */
13
- multiple?: boolean | undefined;
14
- /**
15
- * Document roles to filter files by; null (default) shows all roles.
16
- */
17
- roles?: Role | Role[] | null;
18
- /**
19
- * Optional class for styling purpose
20
- */
21
- className?: string;
22
- }
23
- declare const Nextcloud: ({ onSelect, multiple, roles, className, }: NextcloudProps) => import("react/jsx-runtime").JSX.Element;
24
- export default Nextcloud;
@@ -1,93 +0,0 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
2
- import { useState, useCallback, useEffect, useMemo } from "react";
3
- import { DocumentHelper } from "@edifice.io/client";
4
- import clsx from "clsx";
5
- import { useTranslation } from "react-i18next";
6
- import { findNodeById } from "../../../components/Tree/utilities/tree.js";
7
- import SvgIconSortAscendingLetters from "../../icons/components/IconSortAscendingLetters.js";
8
- import SvgIconSortDescendingLetters from "../../icons/components/IconSortDescendingLetters.js";
9
- import SvgIconSortTime from "../../icons/components/IconSortTime.js";
10
- import illuNoContentInFolder from "@edifice.io/bootstrap/dist/images/emptyscreen/illu-no-content-in-folder.svg";
11
- import useUser from "../../../hooks/useUser/useUser.js";
12
- import useNextcloudSearch from "../../../hooks/useNextcloudSearch/useNextcloudSearch.js";
13
- import { Grid } from "../../../components/Grid/Grid.js";
14
- import Tree from "../../../components/Tree/components/Tree.js";
15
- import SearchBar from "../../../components/SearchBar/SearchBar.js";
16
- import Dropdown from "../../../components/Dropdown/Dropdown.js";
17
- import LoadingScreen from "../../../components/LoadingScreen/LoadingScreen.js";
18
- import NextcloudFileCard from "../FileCard/NextcloudFileCard.js";
19
- import EmptyScreen from "../../../components/EmptyScreen/EmptyScreen.js";
20
- const ROOT_ID = "root";
21
- function compare(a, b) {
22
- return a ? b ? a.localeCompare(b) : 1 : -1;
23
- }
24
- const Nextcloud = ({
25
- onSelect,
26
- multiple = !0,
27
- roles,
28
- className
29
- }) => {
30
- const {
31
- t
32
- } = useTranslation(), {
33
- user
34
- } = useUser(), {
35
- root,
36
- loadContent
37
- } = useNextcloudSearch(ROOT_ID, t("nextcloud"), user == null ? void 0 : user.userId), [currentNodeId, setCurrentNodeId] = useState(ROOT_ID), treeRoot = root, currentNode = findNodeById(treeRoot, currentNodeId) ?? root, [searchTerm, setSearchTerm] = useState(null), [sortOrder, setSortOrder] = useState(["modified", "desc"]), [selectedDocuments, setSelectedDocuments] = useState([]), handleTreeItemChange = useCallback((nodeId) => {
38
- setCurrentNodeId(nodeId), loadContent(nodeId);
39
- }, [loadContent]);
40
- useEffect(() => {
41
- loadContent(ROOT_ID);
42
- }, [loadContent]);
43
- const documents = useMemo(() => {
44
- if (!currentNode.files) return;
45
- let list = [].concat(currentNode.files);
46
- searchTerm && (list = list.filter((f) => f.name.indexOf(searchTerm) >= 0)), roles && (list = list.filter((f) => {
47
- const role = DocumentHelper.role(f.contentType, !1);
48
- return typeof roles == "string" ? roles === role : Array.isArray(roles) ? roles.includes(role) : !1;
49
- }));
50
- const sortFunction = sortOrder[0] === "name" ? sortOrder[1] === "asc" ? (a, b) => compare(a.name, b.name) : (a, b) => compare(b.name, a.name) : (a, b) => compare(b.lastModified, a.lastModified);
51
- return list.sort(sortFunction);
52
- }, [root, currentNode, searchTerm, sortOrder, roles]), selectedPaths = useMemo(() => new Set(selectedDocuments.map((d) => d.path)), [selectedDocuments]), handleSearchChange = useCallback((e) => {
53
- setSearchTerm(e.target.value);
54
- }, [setSearchTerm]);
55
- function getSortOrderLabel() {
56
- return sortOrder[0] === "name" ? sortOrder[1] === "asc" ? t("sort.order.alpha.asc") : t("sort.order.alpha.desc") : t("sort.order.modify.desc");
57
- }
58
- function handleSelectDoc(doc) {
59
- let currentDocuments = [...selectedDocuments];
60
- multiple ? currentDocuments.includes(doc) ? currentDocuments = currentDocuments.filter((selectedDocument) => selectedDocument.path !== doc.path) : currentDocuments = [...currentDocuments, doc] : currentDocuments = [doc], setSelectedDocuments(currentDocuments), onSelect(currentDocuments);
61
- }
62
- const nextcloud = clsx("workspace flex-grow-1 gap-0", className);
63
- return /* @__PURE__ */ jsxs(Grid, { className: nextcloud, children: [
64
- /* @__PURE__ */ jsx(Grid.Col, { sm: "12", md: "3", xl: "4", className: "workspace-folders p-12 pt-0 gap-12", children: /* @__PURE__ */ jsx("div", { style: {
65
- position: "sticky",
66
- top: 0,
67
- paddingTop: "1.2rem"
68
- }, children: /* @__PURE__ */ jsx(Tree, { nodes: treeRoot, selectedNodeId: currentNodeId, showIcon: !0, onTreeItemClick: handleTreeItemChange, onTreeItemUnfold: handleTreeItemChange }) }) }),
69
- /* @__PURE__ */ jsx(Grid.Col, { sm: "12", md: "5", xl: "8", children: /* @__PURE__ */ jsxs(Grid, { className: "flex-grow-1 gap-0", children: [
70
- /* @__PURE__ */ jsxs(Grid.Col, { sm: "4", md: "8", xl: "12", children: [
71
- /* @__PURE__ */ jsx("div", { className: "workspace-search px-16 py-8 ", children: /* @__PURE__ */ jsx(SearchBar, { isVariant: !0, className: "gap-16", onChange: handleSearchChange }) }),
72
- /* @__PURE__ */ jsxs("div", { className: "d-flex align-items-center justify-content-end px-8 py-4", children: [
73
- /* @__PURE__ */ jsx("small", { className: "text-muted", children: t("workspace.search.order") }),
74
- /* @__PURE__ */ jsxs(Dropdown, { children: [
75
- /* @__PURE__ */ jsx(Dropdown.Trigger, { size: "sm", label: getSortOrderLabel(), variant: "ghost" }),
76
- /* @__PURE__ */ jsxs(Dropdown.Menu, { children: [
77
- /* @__PURE__ */ jsx(Dropdown.Item, { icon: /* @__PURE__ */ jsx(SvgIconSortTime, {}), onClick: () => setSortOrder(["modified", "desc"]), children: t("sort.order.modify.desc") }),
78
- /* @__PURE__ */ jsx(Dropdown.Item, { icon: /* @__PURE__ */ jsx(SvgIconSortAscendingLetters, {}), onClick: () => setSortOrder(["name", "asc"]), children: t("sort.order.alpha.asc") }),
79
- /* @__PURE__ */ jsx(Dropdown.Item, { icon: /* @__PURE__ */ jsx(SvgIconSortDescendingLetters, {}), onClick: () => setSortOrder(["name", "desc"]), children: t("sort.order.alpha.desc") })
80
- ] })
81
- ] })
82
- ] })
83
- ] }),
84
- /* @__PURE__ */ jsx(Grid.Col, { sm: "4", md: "8", xl: "12", className: "p-8 gap-8", children: documents ? documents.length !== 0 ? /* @__PURE__ */ jsx("div", { className: "grid grid-workspace", children: documents.map((doc) => {
85
- const isSelected = selectedPaths.has(doc.path);
86
- return /* @__PURE__ */ jsx(NextcloudFileCard, { doc, userId: user.userId, isSelected, onClick: () => handleSelectDoc(doc) }, doc.path);
87
- }) }) : /* @__PURE__ */ jsx(EmptyScreen, { imageSrc: illuNoContentInFolder, size: 64, text: t("nextcloud.empty.docSpace") }) : /* @__PURE__ */ jsx(LoadingScreen, {}) })
88
- ] }) })
89
- ] });
90
- };
91
- export {
92
- Nextcloud as default
93
- };
@@ -1,2 +0,0 @@
1
- export { default as Nextcloud } from './Nextcloud';
2
- export * from './Nextcloud';
@@ -1,10 +0,0 @@
1
- import { StoreApi, UseBoundStore } from 'zustand';
2
- type WithSelectors<S> = S extends {
3
- getState: () => infer T;
4
- } ? S & {
5
- use: {
6
- [K in keyof T]: () => T[K];
7
- };
8
- } : never;
9
- export declare const createSelectors: <S extends UseBoundStore<StoreApi<object>>>(_store: S) => WithSelectors<S>;
10
- export {};