@edifice.io/react 2.6.9-develop-integration.20261014191834 → 2.6.9-develop-integration.20261014223540

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.
@@ -3,6 +3,7 @@ export * from './useBookmark';
3
3
  export * from './useBreakpoint';
4
4
  export * from './useBrowserInfo';
5
5
  export * from './useCantoo';
6
+ export * from './useCarbonioUnread';
6
7
  export * from './useCheckable';
7
8
  export * from './useClickOutside';
8
9
  export * from './useConversation';
@@ -1,4 +1,4 @@
1
- export type Background = 'default' | 'pink-200' | 'yellow-200' | 'orange-200' | 'blue-200' | 'green-200';
1
+ export type Background = 'default' | 'pink-200' | 'yellow-200' | 'orange-200' | 'blue-200' | 'green-200' | 'crna';
2
2
  declare const _default: () => {
3
3
  betaEnabled: boolean | undefined;
4
4
  background: Background;
@@ -0,0 +1 @@
1
+ export { default as useCarbonioUnread } from './useCarbonioUnread';
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Carbonio messaging access, and the unread message count of its Inbox.
3
+ * The count is only fetched for users allowed to open Carbonio.
4
+ */
5
+ declare const useCarbonioUnread: () => {
6
+ readonly hasCarbonioWorkflow: boolean | Record<string, boolean>;
7
+ readonly unreadCount: number;
8
+ };
9
+ export default useCarbonioUnread;
@@ -0,0 +1,25 @@
1
+ import { odeServices } from "@edifice.io/client";
2
+ import { useQuery } from "@tanstack/react-query";
3
+ import useHasWorkflow from "../useHasWorkflow/useHasWorkflow.js";
4
+ const CARBONIO_PREAUTH_WORKFLOW = "org.entcore.auth.controllers.CarbonioPreauthController|preauth", useCarbonioUnread = () => {
5
+ const hasCarbonioWorkflow = useHasWorkflow(CARBONIO_PREAUTH_WORKFLOW) || !1, {
6
+ data
7
+ } = useQuery({
8
+ queryKey: ["carbonio", "unread", "count"],
9
+ queryFn: () => odeServices.http().get("/auth/carbonio/unread", {
10
+ disableNotifications: !0
11
+ }),
12
+ enabled: hasCarbonioWorkflow,
13
+ staleTime: 5 * 60 * 1e3,
14
+ // 5 minutes
15
+ // Each call queries the Carbonio server: a failure means no badge, not another try.
16
+ retry: !1
17
+ });
18
+ return {
19
+ hasCarbonioWorkflow,
20
+ unreadCount: (data == null ? void 0 : data.count) ?? 0
21
+ };
22
+ };
23
+ export {
24
+ useCarbonioUnread as default
25
+ };
@@ -2,8 +2,15 @@ import { GoogleDriveDocument, ID } from '@edifice.io/client';
2
2
  import { TreeItem } from '../../components/Tree/types';
3
3
  export type GoogleDriveFolderNode = TreeItem & {
4
4
  files?: GoogleDriveDocument[];
5
+ /** False when the folder's content can't be copied to the workspace. */
6
+ canCopyToWorkspace?: boolean;
5
7
  };
6
- export default function useGoogleDriveSearch(rootId: string, rootName: string, userId?: string): {
8
+ /**
9
+ * Which documents a search browses from its root: the user's own Drive, or
10
+ * the documents other users shared with them.
11
+ */
12
+ export type GoogleDriveSearchFilter = 'mydrive' | 'shared';
13
+ export default function useGoogleDriveSearch(rootId: string, rootName: string, userId?: string, filter?: GoogleDriveSearchFilter): {
7
14
  root: GoogleDriveFolderNode;
8
15
  needsAuth: boolean;
9
16
  isCheckingAuth: boolean;
@@ -2,7 +2,7 @@ import { useState, useCallback } from "react";
2
2
  import { odeServices } from "@edifice.io/client";
3
3
  import { useQueryClient } from "@tanstack/react-query";
4
4
  import { findNodeById, modifyNode } from "../../components/Tree/utilities/tree.js";
5
- function useGoogleDriveSearch(rootId, rootName, userId) {
5
+ function useGoogleDriveSearch(rootId, rootName, userId, filter = "mydrive") {
6
6
  const [root, setRoot] = useState({
7
7
  id: rootId,
8
8
  name: rootName,
@@ -11,30 +11,32 @@ function useGoogleDriveSearch(rootId, rootName, userId) {
11
11
  setRoot((prev) => {
12
12
  const node = findNodeById(prev, folderId);
13
13
  if (!node) return prev;
14
- const children = subfolders.map((f) => {
14
+ const restrict = (doc) => node.canCopyToWorkspace === !1 ? {
15
+ ...doc,
16
+ canCopyToWorkspace: !1
17
+ } : doc, children = subfolders.map(restrict).map((f) => {
15
18
  var _a;
16
- const existing = (_a = node.children) == null ? void 0 : _a.find((c) => c.id === f.id);
17
- return existing ? {
18
- ...existing,
19
- name: f.name
20
- } : {
19
+ return {
20
+ // Keep an already loaded subfolder's own content.
21
+ ...(_a = node.children) == null ? void 0 : _a.find((c) => c.id === f.id),
21
22
  id: f.id,
22
- name: f.name
23
+ name: f.name,
24
+ canCopyToWorkspace: f.canCopyToWorkspace
23
25
  };
24
26
  });
25
27
  return modifyNode(prev, (n) => n.id === node.id ? {
26
28
  ...n,
27
29
  children,
28
- files
30
+ files: files.map(restrict)
29
31
  } : n);
30
32
  });
31
33
  }, []), queryClient = useQueryClient(), [loadError, setLoadError] = useState(null), loadContent = useCallback(async (folderId) => {
32
34
  if (!userId) return;
33
- const parentId = folderId === rootId ? void 0 : folderId;
35
+ const parentId = folderId === rootId ? void 0 : folderId, isSharedRoot = filter === "shared" && !parentId;
34
36
  try {
35
37
  const payload = await queryClient.fetchQuery({
36
- queryKey: ["googledrive", "documents", userId, parentId ?? "root"],
37
- queryFn: () => odeServices.googledrive().listDocuments(userId, parentId),
38
+ queryKey: ["googledrive", "documents", userId, isSharedRoot ? "shared" : parentId ?? "root"],
39
+ queryFn: () => isSharedRoot ? odeServices.googledrive().listSharedDocuments(userId) : odeServices.googledrive().listDocuments(userId, parentId),
38
40
  staleTime: 6e4
39
41
  }), subfolders = [], files = [];
40
42
  payload.filter((doc) => doc.id !== parentId).forEach((doc) => {
@@ -43,7 +45,7 @@ function useGoogleDriveSearch(rootId, rootName, userId) {
43
45
  } catch (error) {
44
46
  setLoadError(error);
45
47
  }
46
- }, [rootId, userId, queryClient, updateFolder]);
48
+ }, [rootId, userId, filter, queryClient, updateFolder]);
47
49
  return {
48
50
  root,
49
51
  needsAuth: !1,
package/dist/index.js CHANGED
@@ -86,46 +86,47 @@ import { default as default84 } from "./hooks/useBookmark/useBookmark.js";
86
86
  import { default as default85 } from "./hooks/useBreakpoint/useBreakpoint.js";
87
87
  import { default as default86 } from "./hooks/useBrowserInfo/useBrowserInfo.js";
88
88
  import { default as default87 } from "./hooks/useCantoo/useCantoo.js";
89
- import { default as default88 } from "./hooks/useClickOutside/useClickOutside.js";
90
- import { default as default89 } from "./hooks/useConversation/useConversation.js";
91
- import { default as default90 } from "./hooks/useDate/useDate.js";
92
- import { default as default91 } from "./hooks/useDebounce/useDebounce.js";
93
- import { default as default92 } from "./hooks/useDirectory/useDirectory.js";
94
- import { default as default93 } from "./hooks/useDropdown/useDropdown.js";
95
- import { default as default94 } from "./hooks/useDropzone/useDropzone.js";
96
- import { default as default95 } from "./hooks/useEdificeIcons/useEdificeIcons.js";
97
- import { default as default96 } from "./hooks/useGoogleDriveSearch/useGoogleDriveSearch.js";
98
- import { default as default97 } from "./hooks/useHasWorkflow/useHasWorkflow.js";
99
- import { default as default98 } from "./hooks/useHover/useHover.js";
100
- import { default as default99 } from "./hooks/useHttpErrorToast/useHttpErrorToast.js";
101
- import { default as default100 } from "./hooks/useImage/useImage.js";
102
- import { default as default101 } from "./hooks/useInfiniteScroll/useInfiniteScroll.js";
103
- import { default as default102 } from "./hooks/useIsAdmc/useIsAdmc.js";
104
- import { default as default103 } from "./hooks/useIsAdml/useIsAdml.js";
105
- import { default as default104 } from "./hooks/useIsAdmlcOrAdmc/useIsAdmlcOrAdmc.js";
106
- import { default as default105 } from "./hooks/useKeyPress/useKeyPress.js";
107
- import { default as default106 } from "./hooks/useLibraryUrl/useLibraryUrl.js";
108
- import { default as default107 } from "./hooks/useMediaLibrary/useMediaLibrary.js";
109
- import { default as default108 } from "./hooks/useNextcloudSearch/useNextcloudSearch.js";
110
- import { default as default109 } from "./hooks/usePublicConf/usePublicConf.js";
111
- import { default as default110 } from "./hooks/useScrollToTop/useScrollToTop.js";
112
- import { default as default111 } from "./modules/modals/ShareModal/hooks/useShareMutation.js";
113
- import { default as default112 } from "./hooks/useTitle/useTitle.js";
114
- import { default as default113 } from "./hooks/useToast/useToast.js";
115
- import { default as default114 } from "./hooks/useToggle/useToggle.js";
116
- import { default as default115 } from "./hooks/useTrapFocus/useTrapFocus.js";
117
- import { default as default116 } from "./hooks/useTrashedResource/useTrashedResource.js";
118
- import { default as default117 } from "./hooks/useUiOverride/useUiOverride.js";
119
- import { default as default118 } from "./modules/modals/ResourceModal/hooks/useUpdateMutation.js";
120
- import { default as default119 } from "./hooks/useUpload/useUpload.js";
121
- import { default as default120 } from "./hooks/useUploadFiles/useUploadFiles.js";
122
- import { default as default121 } from "./hooks/useUser/useUser.js";
123
- import { default as default122 } from "./hooks/useWorkspaceFile/useWorkspaceFile.js";
124
- import { default as default123 } from "./hooks/useWorkspaceFolders/useWorkspaceFolders.js";
125
- import { WORKSPACE_SHARED_FOLDER_ID, WORKSPACE_USER_FOLDER_ID, default as default124 } from "./hooks/useWorkspaceFolders/useWorkspaceFoldersTree.js";
126
- import { default as default125 } from "./hooks/useWorkspaceSearch/useWorkspaceSearch.js";
127
- import { default as default126 } from "./hooks/useXitiTrackPageLoad/useXitiTrackPageLoad.js";
128
- import { default as default127 } from "./hooks/useZendeskGuide/useZendeskGuide.js";
89
+ import { default as default88 } from "./hooks/useCarbonioUnread/useCarbonioUnread.js";
90
+ import { default as default89 } from "./hooks/useClickOutside/useClickOutside.js";
91
+ import { default as default90 } from "./hooks/useConversation/useConversation.js";
92
+ import { default as default91 } from "./hooks/useDate/useDate.js";
93
+ import { default as default92 } from "./hooks/useDebounce/useDebounce.js";
94
+ import { default as default93 } from "./hooks/useDirectory/useDirectory.js";
95
+ import { default as default94 } from "./hooks/useDropdown/useDropdown.js";
96
+ import { default as default95 } from "./hooks/useDropzone/useDropzone.js";
97
+ import { default as default96 } from "./hooks/useEdificeIcons/useEdificeIcons.js";
98
+ import { default as default97 } from "./hooks/useGoogleDriveSearch/useGoogleDriveSearch.js";
99
+ import { default as default98 } from "./hooks/useHasWorkflow/useHasWorkflow.js";
100
+ import { default as default99 } from "./hooks/useHover/useHover.js";
101
+ import { default as default100 } from "./hooks/useHttpErrorToast/useHttpErrorToast.js";
102
+ import { default as default101 } from "./hooks/useImage/useImage.js";
103
+ import { default as default102 } from "./hooks/useInfiniteScroll/useInfiniteScroll.js";
104
+ import { default as default103 } from "./hooks/useIsAdmc/useIsAdmc.js";
105
+ import { default as default104 } from "./hooks/useIsAdml/useIsAdml.js";
106
+ import { default as default105 } from "./hooks/useIsAdmlcOrAdmc/useIsAdmlcOrAdmc.js";
107
+ import { default as default106 } from "./hooks/useKeyPress/useKeyPress.js";
108
+ import { default as default107 } from "./hooks/useLibraryUrl/useLibraryUrl.js";
109
+ import { default as default108 } from "./hooks/useMediaLibrary/useMediaLibrary.js";
110
+ import { default as default109 } from "./hooks/useNextcloudSearch/useNextcloudSearch.js";
111
+ import { default as default110 } from "./hooks/usePublicConf/usePublicConf.js";
112
+ import { default as default111 } from "./hooks/useScrollToTop/useScrollToTop.js";
113
+ import { default as default112 } from "./modules/modals/ShareModal/hooks/useShareMutation.js";
114
+ import { default as default113 } from "./hooks/useTitle/useTitle.js";
115
+ import { default as default114 } from "./hooks/useToast/useToast.js";
116
+ import { default as default115 } from "./hooks/useToggle/useToggle.js";
117
+ import { default as default116 } from "./hooks/useTrapFocus/useTrapFocus.js";
118
+ import { default as default117 } from "./hooks/useTrashedResource/useTrashedResource.js";
119
+ import { default as default118 } from "./hooks/useUiOverride/useUiOverride.js";
120
+ import { default as default119 } from "./modules/modals/ResourceModal/hooks/useUpdateMutation.js";
121
+ import { default as default120 } from "./hooks/useUpload/useUpload.js";
122
+ import { default as default121 } from "./hooks/useUploadFiles/useUploadFiles.js";
123
+ import { default as default122 } from "./hooks/useUser/useUser.js";
124
+ import { default as default123 } from "./hooks/useWorkspaceFile/useWorkspaceFile.js";
125
+ import { default as default124 } from "./hooks/useWorkspaceFolders/useWorkspaceFolders.js";
126
+ import { WORKSPACE_SHARED_FOLDER_ID, WORKSPACE_USER_FOLDER_ID, default as default125 } from "./hooks/useWorkspaceFolders/useWorkspaceFoldersTree.js";
127
+ import { default as default126 } from "./hooks/useWorkspaceSearch/useWorkspaceSearch.js";
128
+ import { default as default127 } from "./hooks/useXitiTrackPageLoad/useXitiTrackPageLoad.js";
129
+ import { default as default128 } from "./hooks/useZendeskGuide/useZendeskGuide.js";
129
130
  import { AccessiblePalette, DefaultPalette } from "./components/ColorPicker/ColorPalette.js";
130
131
  import { AntProvider } from "./providers/AntThemeProvider/AntProvider.js";
131
132
  import { BetaSwitch } from "./components/BetaSwitch/BetaSwitch.js";
@@ -161,7 +162,7 @@ import { emptyScreenMapping } from "./utilities/emptyscreen-mapping/emptyscreen-
161
162
  import { getRotateTransitionStyle } from "./utilities/rotate-transition-style/get-rotate-transition-style.js";
162
163
  import { invalidateQueriesWithFirstPage } from "./utilities/react-query/react-query-utils.js";
163
164
  import { mergeRefs, setRef } from "./utilities/refs/ref.js";
164
- import { default as default128 } from "./hooks/useBackground/useBackground.js";
165
+ import { default as default129 } from "./hooks/useBackground/useBackground.js";
165
166
  import { useCheckable } from "./hooks/useCheckable/useCheckable.js";
166
167
  import { useEdificeClient } from "./providers/EdificeClientProvider/EdificeClientProvider.hook.js";
167
168
  import { useEdificeTheme } from "./providers/EdificeThemeProvider/EdificeThemeProvider.hook.js";
@@ -170,7 +171,7 @@ import { useOverlay } from "./components/PageLayout/hook/useOverlay.js";
170
171
  import { useScreeb } from "./hooks/useScreeb/useScreeb.js";
171
172
  import { useTreeSortable } from "./components/Tree/hooks/useTreeSortable.js";
172
173
  import { useTreeView } from "./components/TreeView/hooks/useTreeView.js";
173
- import { default as default129 } from "./hooks/useUserPreferences/useUserPreferences.js";
174
+ import { default as default130 } from "./hooks/useUserPreferences/useUserPreferences.js";
174
175
  export {
175
176
  AccessiblePalette,
176
177
  default2 as ActionBar,
@@ -322,61 +323,62 @@ export {
322
323
  setRef,
323
324
  updateNode,
324
325
  updateParentIds,
325
- default128 as useBackground,
326
+ default129 as useBackground,
326
327
  default84 as useBookmark,
327
328
  default85 as useBreakpoint,
328
329
  default86 as useBrowserInfo,
329
330
  default87 as useCantoo,
331
+ default88 as useCarbonioUnread,
330
332
  useCheckable,
331
- default88 as useClickOutside,
332
- default89 as useConversation,
333
- default90 as useDate,
334
- default91 as useDebounce,
335
- default92 as useDirectory,
336
- default93 as useDropdown,
337
- default94 as useDropzone,
333
+ default89 as useClickOutside,
334
+ default90 as useConversation,
335
+ default91 as useDate,
336
+ default92 as useDebounce,
337
+ default93 as useDirectory,
338
+ default94 as useDropdown,
339
+ default95 as useDropzone,
338
340
  useDropzoneContext,
339
341
  useEdificeClient,
340
- default95 as useEdificeIcons,
342
+ default96 as useEdificeIcons,
341
343
  useEdificeTheme,
342
344
  useFileToAttachment,
343
- default96 as useGoogleDriveSearch,
344
- default97 as useHasWorkflow,
345
- default98 as useHover,
346
- default99 as useHttpErrorToast,
347
- default100 as useImage,
348
- default101 as useInfiniteScroll,
349
- default102 as useIsAdmc,
350
- default103 as useIsAdml,
351
- default104 as useIsAdmlcOrAdmc,
352
- default105 as useKeyPress,
353
- default106 as useLibraryUrl,
354
- default107 as useMediaLibrary,
355
- default108 as useNextcloudSearch,
345
+ default97 as useGoogleDriveSearch,
346
+ default98 as useHasWorkflow,
347
+ default99 as useHover,
348
+ default100 as useHttpErrorToast,
349
+ default101 as useImage,
350
+ default102 as useInfiniteScroll,
351
+ default103 as useIsAdmc,
352
+ default104 as useIsAdml,
353
+ default105 as useIsAdmlcOrAdmc,
354
+ default106 as useKeyPress,
355
+ default107 as useLibraryUrl,
356
+ default108 as useMediaLibrary,
357
+ default109 as useNextcloudSearch,
356
358
  useOverlay,
357
359
  usePageLayout,
358
- default109 as usePublicConf,
360
+ default110 as usePublicConf,
359
361
  useScreeb,
360
- default110 as useScrollToTop,
361
- default111 as useShareMutation,
362
- default112 as useTitle,
363
- default113 as useToast,
364
- default114 as useToggle,
365
- default115 as useTrapFocus,
366
- default116 as useTrashedResource,
362
+ default111 as useScrollToTop,
363
+ default112 as useShareMutation,
364
+ default113 as useTitle,
365
+ default114 as useToast,
366
+ default115 as useToggle,
367
+ default116 as useTrapFocus,
368
+ default117 as useTrashedResource,
367
369
  useTreeSortable,
368
370
  useTreeView,
369
- default117 as useUiOverride,
370
- default118 as useUpdateMutation,
371
- default119 as useUpload,
372
- default120 as useUploadFiles,
373
- default121 as useUser,
374
- default129 as useUserPreferences,
375
- default122 as useWorkspaceFile,
376
- default123 as useWorkspaceFolders,
377
- default124 as useWorkspaceFoldersTree,
378
- default125 as useWorkspaceSearch,
379
- default126 as useXitiTrackPageLoad,
380
- default127 as useZendeskGuide,
371
+ default118 as useUiOverride,
372
+ default119 as useUpdateMutation,
373
+ default120 as useUpload,
374
+ default121 as useUploadFiles,
375
+ default122 as useUser,
376
+ default130 as useUserPreferences,
377
+ default123 as useWorkspaceFile,
378
+ default124 as useWorkspaceFolders,
379
+ default125 as useWorkspaceFoldersTree,
380
+ default126 as useWorkspaceSearch,
381
+ default127 as useXitiTrackPageLoad,
382
+ default128 as useZendeskGuide,
381
383
  wrapTreeNode
382
384
  };
@@ -16,7 +16,7 @@ import SvgIconNotificationBeta from "../../../icons/components/nav/IconNotificat
16
16
  import { useHasNotificationToday } from "../Notifications/hooks/useNotificationList.js";
17
17
  import useConversation from "../../../../hooks/useConversation/useConversation.js";
18
18
  import useUser from "../../../../hooks/useUser/useUser.js";
19
- import useHasWorkflow from "../../../../hooks/useHasWorkflow/useHasWorkflow.js";
19
+ import useCarbonioUnread from "../../../../hooks/useCarbonioUnread/useCarbonioUnread.js";
20
20
  import { useEdificeTheme } from "../../../../providers/EdificeThemeProvider/EdificeThemeProvider.hook.js";
21
21
  import useHover from "../../../../hooks/useHover/useHover.js";
22
22
  import LogoBeta from "../../../../components/LogoBeta/LogoBeta.js";
@@ -37,7 +37,10 @@ const Header = ({
37
37
  } = useConversation(), {
38
38
  user,
39
39
  avatar
40
- } = useUser(), hasCarbonioPreauthWorkflow = useHasWorkflow("org.entcore.auth.controllers.CarbonioPreauthController|preauth") || !1, classes = clsx("header-beta d-print-none no-2d no-1d"), {
40
+ } = useUser(), {
41
+ hasCarbonioWorkflow,
42
+ unreadCount: carbonioUnreadCount
43
+ } = useCarbonioUnread(), classes = clsx("header-beta d-print-none no-2d no-1d"), {
41
44
  userAvatar,
42
45
  userName,
43
46
  communitiesWorkflow,
@@ -62,8 +65,12 @@ const Header = ({
62
65
  level: "danger"
63
66
  }, className: "position-absolute", children: messages })
64
67
  ] }) }),
65
- hasCarbonioPreauthWorkflow && /* @__PURE__ */ jsx(NavItem, { children: /* @__PURE__ */ jsxs("a", { className: "nav-link position-relative", href: "/auth/carbonio/preauth", target: "_blank", "data-testid": "header-messagerie-button", children: [
68
+ hasCarbonioWorkflow && /* @__PURE__ */ jsx(NavItem, { children: /* @__PURE__ */ jsxs("a", { className: "nav-link position-relative", href: "/auth/carbonio/preauth", target: "_blank", "data-testid": "header-messagerie-button", children: [
66
69
  /* @__PURE__ */ jsx(SvgIconMessagesBeta, {}),
70
+ carbonioUnreadCount > 0 && /* @__PURE__ */ jsx(Badge, { variant: {
71
+ type: "notification",
72
+ level: "danger"
73
+ }, className: "position-absolute", children: carbonioUnreadCount }),
67
74
  /* @__PURE__ */ jsx(VisuallyHidden, { children: t("conversation") })
68
75
  ] }) }),
69
76
  /* @__PURE__ */ jsx(NavItem, { children: /* @__PURE__ */ jsx(NavLink, { link: "/welcome", translate: t("navbar.applications"), "data-testid": "header-my-apps-button", children: /* @__PURE__ */ jsx(SvgIconMyAppsBeta, {}) }) }),
@@ -1,5 +1,5 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
- import { useState, useCallback, useEffect, useMemo } from "react";
2
+ import { useState, useEffect, useMemo, useCallback } from "react";
3
3
  import { DocumentHelper } from "@edifice.io/client";
4
4
  import clsx from "clsx";
5
5
  import { useTranslation } from "react-i18next";
@@ -20,7 +20,7 @@ import EmptyScreen from "../../../components/EmptyScreen/EmptyScreen.js";
20
20
  import Button from "../../../components/Button/Button.js";
21
21
  import LoadingScreen from "../../../components/LoadingScreen/LoadingScreen.js";
22
22
  import GoogleDriveFileCard from "../FileCard/GoogleDriveFileCard.js";
23
- const ROOT_ID = "root";
23
+ const ROOT_ID = "root", SHARED_ROOT_ID = "shared";
24
24
  function compare(a, b) {
25
25
  return a === b ? 0 : a === void 0 ? -1 : b === void 0 ? 1 : a.localeCompare(b);
26
26
  }
@@ -34,23 +34,26 @@ const GoogleDrive = ({
34
34
  t
35
35
  } = useTranslation(), {
36
36
  user
37
- } = useUser(), {
37
+ } = useUser(), myDrive = useGoogleDriveSearch(ROOT_ID, t("google-drive.mydrive"), user == null ? void 0 : user.userId), sharedWithMe = useGoogleDriveSearch(SHARED_ROOT_ID, t("workspace.tree.shared"), user == null ? void 0 : user.userId, "shared"), [currentNodeId, setCurrentNodeId] = useState(ROOT_ID), sectionOf = (nodeId) => findNodeById(sharedWithMe.root, nodeId) ? sharedWithMe : myDrive, {
38
38
  root,
39
39
  loadContent,
40
40
  loadError
41
- } = useGoogleDriveSearch(ROOT_ID, t("google-drive.mydrive"), user == null ? void 0 : user.userId), [currentNodeId, setCurrentNodeId] = useState(ROOT_ID), currentNode = findNodeById(root, currentNodeId) ?? root, [searchTerm, setSearchTerm] = useState(void 0), [sortOrder, setSortOrder] = useState(["modified", "desc"]), [selectedDocuments, setSelectedDocuments] = useState([]), handleTreeItemChange = useCallback((nodeId) => {
42
- setCurrentNodeId(nodeId), loadContent(nodeId);
43
- }, [loadContent]);
41
+ } = sectionOf(currentNodeId), currentNode = findNodeById(root, currentNodeId) ?? root, [searchTerm, setSearchTerm] = useState(void 0), [sortOrder, setSortOrder] = useState(["modified", "desc"]), [selectedDocuments, setSelectedDocuments] = useState([]), handleTreeItemChange = (nodeId) => {
42
+ setCurrentNodeId(nodeId), sectionOf(nodeId).loadContent(nodeId);
43
+ }, loadMyDrive = myDrive.loadContent;
44
44
  useEffect(() => {
45
- loadContent(ROOT_ID);
46
- }, [loadContent]);
45
+ loadMyDrive(ROOT_ID);
46
+ }, [loadMyDrive]);
47
47
  const documents = useMemo(() => {
48
48
  if (!currentNode.files) return;
49
49
  const matchesRole = (doc) => {
50
50
  if (!roles) return !0;
51
51
  const role = DocumentHelper.role(doc.contentType, !1);
52
52
  return Array.isArray(roles) ? roles.includes(role) : roles === role;
53
- }, normalizedSearchTerm = searchTerm == null ? void 0 : searchTerm.toLowerCase(), list = currentNode.files.filter((f) => (!normalizedSearchTerm || f.name.toLowerCase().includes(normalizedSearchTerm)) && matchesRole(f));
53
+ }, normalizedSearchTerm = searchTerm == null ? void 0 : searchTerm.toLowerCase(), list = currentNode.files.filter((f) => (
54
+ // A document that can't leave Google Drive could never be added.
55
+ f.canCopyToWorkspace && (!normalizedSearchTerm || f.name.toLowerCase().includes(normalizedSearchTerm)) && matchesRole(f)
56
+ ));
54
57
  let sortFunction;
55
58
  return sortOrder[0] === "name" ? sortFunction = sortOrder[1] === "asc" ? (a, b) => compare(a.name, b.name) : (a, b) => compare(b.name, a.name) : sortFunction = (a, b) => compare(b.lastModified, a.lastModified), list.sort(sortFunction);
56
59
  }, [currentNode, searchTerm, sortOrder, roles]), selectedIds = useMemo(() => new Set(selectedDocuments.map((d) => d.id)), [selectedDocuments]), handleSearchChange = useCallback((e) => {
@@ -69,7 +72,7 @@ const GoogleDrive = ({
69
72
  position: "sticky",
70
73
  top: 0,
71
74
  paddingTop: "1.2rem"
72
- }, children: /* @__PURE__ */ jsx(Tree, { nodes: root, selectedNodeId: currentNodeId, showIcon: !0, onTreeItemClick: handleTreeItemChange, onTreeItemUnfold: handleTreeItemChange }) }) }),
75
+ }, children: /* @__PURE__ */ jsx(Tree, { nodes: [myDrive.root, sharedWithMe.root], selectedNodeId: currentNodeId, showIcon: !0, onTreeItemClick: handleTreeItemChange, onTreeItemUnfold: handleTreeItemChange }) }) }),
73
76
  /* @__PURE__ */ jsx(Grid.Col, { sm: "12", md: "5", xl: "8", children: /* @__PURE__ */ jsxs(Grid, { className: "flex-grow-1 gap-0", children: [
74
77
  /* @__PURE__ */ jsxs(Grid.Col, { sm: "4", md: "8", xl: "12", children: [
75
78
  /* @__PURE__ */ jsx("div", { className: "workspace-search px-16 py-8 ", children: /* @__PURE__ */ jsx(SearchBar, { isVariant: !0, className: "gap-16", onChange: handleSearchChange }) }),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edifice.io/react",
3
- "version": "2.6.9-develop-integration.20261014191834",
3
+ "version": "2.6.9-develop-integration.20261014223540",
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/bootstrap": "2.6.9-develop-integration.20261014191834",
144
- "@edifice.io/utilities": "2.6.9-develop-integration.20261014191834",
145
- "@edifice.io/tiptap-extensions": "2.6.9-develop-integration.20261014191834"
143
+ "@edifice.io/tiptap-extensions": "2.6.9-develop-integration.20261014223540",
144
+ "@edifice.io/utilities": "2.6.9-develop-integration.20261014223540",
145
+ "@edifice.io/bootstrap": "2.6.9-develop-integration.20261014223540"
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.9-develop-integration.20261014191834",
177
- "@edifice.io/config": "2.6.9-develop-integration.20261014191834"
176
+ "@edifice.io/config": "2.6.9-develop-integration.20261014223540",
177
+ "@edifice.io/client": "2.6.9-develop-integration.20261014223540"
178
178
  },
179
179
  "peerDependencies": {
180
180
  "@react-spring/web": "9.7.5",