@edifice.io/react 2.6.2-develop-integration.20260824151812 → 2.6.2-develop-integration-crna.20260825121901

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 (88) hide show
  1. package/dist/components/Alert/Alert.js +1 -1
  2. package/dist/components/DatePicker/DatePicker.d.ts +5 -0
  3. package/dist/components/DatePicker/DatePicker.js +2 -0
  4. package/dist/components/Layout/Layout.js +5 -3
  5. package/dist/hooks/index.d.ts +0 -1
  6. package/dist/icons-apps.js +112 -100
  7. package/dist/icons.js +340 -338
  8. package/dist/index.js +146 -152
  9. package/dist/modules/homepage/components/Communities/Communities.d.ts +10 -0
  10. package/dist/modules/homepage/components/Communities/CommunitiesContainer.d.ts +9 -0
  11. package/dist/modules/homepage/components/Communities/CommunitiesSkeleton.d.ts +5 -0
  12. package/dist/modules/homepage/components/Communities/CommunityItem.d.ts +11 -0
  13. package/dist/modules/homepage/components/Communities/index.d.ts +8 -0
  14. package/dist/modules/homepage/components/Communities/useCommunities.d.ts +13 -0
  15. package/dist/modules/homepage/components/Favorites/Favorites.js +7 -4
  16. package/dist/modules/homepage/components/Header/Header.js +20 -2
  17. package/dist/modules/homepage/components/HomeCard/HomeCard.d.ts +5 -1
  18. package/dist/modules/homepage/components/HomeCard/HomeCard.js +10 -2
  19. package/dist/modules/homepage/components/LastInfos/LastInfosList.js +2 -2
  20. package/dist/modules/homepage/components/Notifications/NotificationItem.js +5 -4
  21. package/dist/modules/homepage/components/Notifications/NotificationList.d.ts +7 -1
  22. package/dist/modules/homepage/components/Notifications/NotificationList.js +10 -3
  23. package/dist/modules/homepage/components/Notifications/NotificationListContainer.js +4 -1
  24. package/dist/modules/homepage/components/Notifications/components/CommonNotificationItem.d.ts +2 -1
  25. package/dist/modules/homepage/components/Notifications/components/CommonNotificationItem.js +14 -10
  26. package/dist/modules/homepage/components/Notifications/components/NotificationFilterMenu.d.ts +16 -0
  27. package/dist/modules/homepage/components/Notifications/components/NotificationFilterMenu.js +29 -0
  28. package/dist/modules/homepage/components/Notifications/components/NotificationFilterModal.d.ts +18 -0
  29. package/dist/modules/homepage/components/Notifications/components/NotificationFilterModal.js +67 -0
  30. package/dist/modules/homepage/components/Notifications/components/NotificationItemResource.d.ts +2 -1
  31. package/dist/modules/homepage/components/Notifications/components/NotificationItemResource.js +3 -2
  32. package/dist/modules/homepage/components/Notifications/components/NotificationOptionsMenu.d.ts +12 -0
  33. package/dist/modules/homepage/components/Notifications/components/NotificationOptionsMenu.js +42 -0
  34. package/dist/modules/homepage/components/Notifications/components/ReportNotificationModal.d.ts +13 -0
  35. package/dist/modules/homepage/components/Notifications/components/ReportNotificationModal.js +31 -0
  36. package/dist/modules/homepage/components/Notifications/components/SystemNotificationItem.d.ts +3 -1
  37. package/dist/modules/homepage/components/Notifications/components/SystemNotificationItem.js +3 -2
  38. package/dist/modules/homepage/components/Notifications/components/UserNotificationItem.d.ts +3 -1
  39. package/dist/modules/homepage/components/Notifications/components/UserNotificationItem.js +3 -2
  40. package/dist/modules/homepage/components/Notifications/components/notificationAdapter.d.ts +22 -7
  41. package/dist/modules/homepage/components/Notifications/components/notificationAdapter.js +31 -13
  42. package/dist/modules/homepage/components/Notifications/hooks/useNotificationList.d.ts +11 -1
  43. package/dist/modules/homepage/components/Notifications/hooks/useNotificationList.js +34 -2
  44. package/dist/modules/homepage/components/Notifications/services/api/index.d.ts +2 -0
  45. package/dist/modules/homepage/components/Notifications/services/api/notificationService.d.ts +8 -0
  46. package/dist/modules/homepage/components/Notifications/services/api/notificationService.js +12 -0
  47. package/dist/modules/homepage/components/Notifications/services/queries/notification.d.ts +13 -1
  48. package/dist/modules/homepage/components/Notifications/services/queries/notification.js +41 -4
  49. package/dist/modules/homepage/components/SchoolSpace/SchoolSpace.js +20 -11
  50. package/dist/modules/homepage/components/UserSpace/UserSpace.js +5 -2
  51. package/dist/modules/homepage/components/UserSpace/hooks/useChildren.d.ts +14 -0
  52. package/dist/modules/homepage/components/UserSpace/hooks/useChildren.js +23 -0
  53. package/dist/modules/homepage/components/UserSpace/hooks/useProfileLinks.d.ts +8 -0
  54. package/dist/modules/homepage/components/UserSpace/hooks/useProfileLinks.js +65 -0
  55. package/dist/modules/icons/components/IconClass.d.ts +7 -0
  56. package/dist/modules/icons/components/IconClass.js +13 -0
  57. package/dist/modules/icons/components/apps/IconNextcloudDeck.d.ts +7 -0
  58. package/dist/modules/icons/components/apps/IconNextcloudDeck.js +14 -0
  59. package/dist/modules/icons/components/apps/IconNextcloudFiles.d.ts +7 -0
  60. package/dist/modules/icons/components/apps/IconNextcloudFiles.js +14 -0
  61. package/dist/modules/icons/components/apps/IconNextcloudForms.d.ts +7 -0
  62. package/dist/modules/icons/components/apps/IconNextcloudForms.js +14 -0
  63. package/dist/modules/icons/components/apps/IconNextcloudNotes.d.ts +7 -0
  64. package/dist/modules/icons/components/apps/IconNextcloudNotes.js +14 -0
  65. package/dist/modules/icons/components/apps/IconNextcloudTalk.d.ts +7 -0
  66. package/dist/modules/icons/components/apps/IconNextcloudTalk.js +14 -0
  67. package/dist/modules/icons/components/apps/IconPeertube.d.ts +7 -0
  68. package/dist/modules/icons/components/apps/IconPeertube.js +21 -0
  69. package/dist/modules/icons/components/apps/index.d.ts +6 -0
  70. package/dist/modules/icons/components/index.d.ts +1 -0
  71. package/dist/modules/multimedia/FileCard/index.d.ts +0 -2
  72. package/dist/modules/multimedia/MediaLibrary/MediaLibrary.d.ts +2 -2
  73. package/dist/modules/multimedia/MediaLibrary/MediaLibrary.js +7 -20
  74. package/dist/modules/multimedia/MediaLibrary/innertabs/index.d.ts +0 -1
  75. package/dist/modules/multimedia/MediaLibrary/innertabs/index.js +0 -2
  76. package/dist/modules/multimedia/index.d.ts +0 -1
  77. package/dist/multimedia.js +12 -16
  78. package/package.json +6 -6
  79. package/dist/hooks/useNextcloudSearch/index.d.ts +0 -1
  80. package/dist/hooks/useNextcloudSearch/useNextcloudSearch.d.ts +0 -12
  81. package/dist/hooks/useNextcloudSearch/useNextcloudSearch.js +0 -56
  82. package/dist/modules/multimedia/FileCard/NextcloudFileCard.d.ts +0 -25
  83. package/dist/modules/multimedia/FileCard/NextcloudFileCard.js +0 -105
  84. package/dist/modules/multimedia/MediaLibrary/innertabs/Nextcloud.d.ts +0 -1
  85. package/dist/modules/multimedia/MediaLibrary/innertabs/Nextcloud.js +0 -35
  86. package/dist/modules/multimedia/Nextcloud/Nextcloud.d.ts +0 -24
  87. package/dist/modules/multimedia/Nextcloud/Nextcloud.js +0 -109
  88. package/dist/modules/multimedia/Nextcloud/index.d.ts +0 -2
@@ -1,4 +1,6 @@
1
- import { useNotificationTypes, useNotifications } from "../services/queries/notification.js";
1
+ import { useState, useEffect } from "react";
2
+ import { useNotificationTypes, useNotifications, useTimelinePreference, useSaveTimelinePreference } from "../services/queries/notification.js";
3
+ import useDate from "../../../../../hooks/useDate/useDate.js";
2
4
  const useNotificationListContainer = () => {
3
5
  const {
4
6
  data: notificationTypes,
@@ -6,21 +8,51 @@ const useNotificationListContainer = () => {
6
8
  isFetched: isFetchedTypes,
7
9
  error: errorTypes
8
10
  } = useNotificationTypes(), {
11
+ data: preference,
12
+ isFetched: isFetchedPreference
13
+ } = useTimelinePreference(), {
14
+ mutate: saveTimelinePreference
15
+ } = useSaveTimelinePreference(), [selectedTypes, setSelectedTypesState] = useState();
16
+ useEffect(() => {
17
+ if (selectedTypes === void 0 && isFetchedTypes && isFetchedPreference) {
18
+ const preferredTypes = preference == null ? void 0 : preference.type;
19
+ setSelectedTypesState(preferredTypes && preferredTypes.length > 0 ? preferredTypes : notificationTypes ?? []);
20
+ }
21
+ }, [selectedTypes, isFetchedTypes, isFetchedPreference, preference, notificationTypes]);
22
+ const setSelectedTypes = (types) => {
23
+ setSelectedTypesState(types), saveTimelinePreference({
24
+ ...preference,
25
+ type: types
26
+ });
27
+ }, {
9
28
  data: notifications,
10
29
  hasNextPage,
11
30
  isLoading: isLoadingNotifications,
12
31
  error: errorNotifications,
13
32
  fetchNextPage
14
- } = useNotifications(notificationTypes ?? [], isFetchedTypes && !!notificationTypes);
33
+ } = useNotifications(selectedTypes ?? [], isFetchedTypes && !!selectedTypes);
15
34
  return {
16
35
  notifications,
17
36
  notificationTypes,
37
+ selectedTypes,
38
+ setSelectedTypes,
18
39
  hasNextPage,
19
40
  loadNextPage: () => fetchNextPage(),
20
41
  isLoading: isLoadingTypes || isLoadingNotifications,
21
42
  error: errorTypes || errorNotifications
22
43
  };
44
+ }, useHasNotificationToday = () => {
45
+ const {
46
+ dateIsToday
47
+ } = useDate(), {
48
+ data: notificationTypes,
49
+ isFetched: isFetchedTypes
50
+ } = useNotificationTypes(), {
51
+ data: notifications
52
+ } = useNotifications(notificationTypes ?? [], isFetchedTypes);
53
+ return (notifications == null ? void 0 : notifications.some((notification) => dateIsToday(notification.date))) ?? !1;
23
54
  };
24
55
  export {
56
+ useHasNotificationToday,
25
57
  useNotificationListContainer
26
58
  };
@@ -1,4 +1,6 @@
1
1
  export declare const notificationService: {
2
2
  getNotifications(types: string[], page: number): Promise<import('@edifice.io/client').NotificationModel[]>;
3
3
  getNotificationTypes(): Promise<string[]>;
4
+ reportNotification(id: string): Promise<any>;
5
+ deleteNotification(id: string): Promise<any>;
4
6
  };
@@ -12,4 +12,12 @@ export declare const createNotificationService: (baseURL: string) => {
12
12
  */
13
13
  getNotifications(types: string[], page: number): Promise<NotificationModel[]>;
14
14
  getNotificationTypes(): Promise<string[]>;
15
+ /**
16
+ * Report a notification as inappropriate.
17
+ */
18
+ reportNotification(id: string): Promise<any>;
19
+ /**
20
+ * Delete a notification.
21
+ */
22
+ deleteNotification(id: string): Promise<any>;
15
23
  };
@@ -14,6 +14,18 @@ const createNotificationService = (baseURL) => ({
14
14
  },
15
15
  getNotificationTypes() {
16
16
  return odeServices.http().get(`${baseURL}/timeline/types`);
17
+ },
18
+ /**
19
+ * Report a notification as inappropriate.
20
+ */
21
+ reportNotification(id) {
22
+ return odeServices.http().put(`${baseURL}/timeline/${id}/report`);
23
+ },
24
+ /**
25
+ * Delete a notification.
26
+ */
27
+ deleteNotification(id) {
28
+ return odeServices.http().put(`${baseURL}/timeline/${id}`);
17
29
  }
18
30
  });
19
31
  export {
@@ -1,14 +1,22 @@
1
1
  import { NotificationModel } from '@edifice.io/client';
2
+ import { InfiniteData } from '@tanstack/react-query';
3
+ /** Shape of the `timeline` userbook preference (only `type` is read/written here). */
4
+ export interface TimelinePreference {
5
+ page?: number;
6
+ type: string[];
7
+ config?: Record<string, unknown>;
8
+ }
2
9
  export declare const notificationQueryKeys: {
3
10
  all: () => readonly ["notifications"];
4
11
  notifications: (types?: string[]) => readonly ["notifications", "list", string[]];
5
12
  types: () => readonly ["notifications", "types"];
13
+ preference: () => readonly ["notifications", "preference"];
6
14
  };
7
15
  export declare const notificationQueryOptions: {
8
16
  getNotifications(types: string[], enabled: boolean): import('@tanstack/react-query').OmitKeyof<import('@tanstack/react-query').UseInfiniteQueryOptions<NotificationModel[], Error, NotificationModel[], NotificationModel[], readonly ["notifications", "list", string[]], number>, "queryFn"> & {
9
17
  queryFn?: import('@tanstack/react-query').QueryFunction<NotificationModel[], readonly ["notifications", "list", string[]], number> | undefined;
10
18
  } & {
11
- queryKey: import('@tanstack/react-query').DataTag<readonly ["notifications", "list", string[]], import('@tanstack/react-query').InfiniteData<NotificationModel[], unknown>>;
19
+ queryKey: import('@tanstack/react-query').DataTag<readonly ["notifications", "list", string[]], InfiniteData<NotificationModel[], unknown>>;
12
20
  };
13
21
  getNotificationTypes(): import('@tanstack/react-query').OmitKeyof<import('@tanstack/react-query').UseQueryOptions<string[], Error, string[], import('@tanstack/react-query').QueryKey>, "queryFn"> & {
14
22
  queryFn?: import('@tanstack/react-query').QueryFunction<string[], import('@tanstack/react-query').QueryKey, never> | undefined;
@@ -18,3 +26,7 @@ export declare const notificationQueryOptions: {
18
26
  };
19
27
  export declare const useNotifications: (types?: string[], enabled?: boolean) => import('@tanstack/react-query').UseInfiniteQueryResult<NotificationModel[], Error>;
20
28
  export declare const useNotificationTypes: () => import('@tanstack/react-query').UseQueryResult<string[], Error>;
29
+ export declare const useTimelinePreference: () => import('@tanstack/react-query').UseQueryResult<TimelinePreference, Error>;
30
+ export declare const useSaveTimelinePreference: () => import('@tanstack/react-query').UseMutationResult<void, Error, TimelinePreference, unknown>;
31
+ export declare const useReportNotification: () => import('@tanstack/react-query').UseMutationResult<any, Error, string, unknown>;
32
+ export declare const useDeleteNotification: () => import('@tanstack/react-query').UseMutationResult<any, Error, string, unknown>;
@@ -1,9 +1,11 @@
1
- import { useQuery, useInfiniteQuery, queryOptions, infiniteQueryOptions } from "@tanstack/react-query";
1
+ import { odeServices } from "@edifice.io/client";
2
+ import { useQuery, useInfiniteQuery, useMutation, useQueryClient, queryOptions, infiniteQueryOptions } from "@tanstack/react-query";
2
3
  import { notificationService } from "../api/index.js";
3
4
  const notificationQueryKeys = {
4
5
  all: () => ["notifications"],
5
6
  notifications: (types = []) => [...notificationQueryKeys.all(), "list", types],
6
- types: () => [...notificationQueryKeys.all(), "types"]
7
+ types: () => [...notificationQueryKeys.all(), "types"],
8
+ preference: () => [...notificationQueryKeys.all(), "preference"]
7
9
  }, notificationQueryOptions = {
8
10
  getNotifications(types, enabled) {
9
11
  return infiniteQueryOptions({
@@ -31,10 +33,45 @@ const notificationQueryKeys = {
31
33
  queryFn: async () => notificationService.getNotificationTypes()
32
34
  });
33
35
  }
34
- }, useNotifications = (types = [], enabled = !0) => useInfiniteQuery(notificationQueryOptions.getNotifications(types, enabled)), useNotificationTypes = () => useQuery(notificationQueryOptions.getNotificationTypes());
36
+ }, useNotifications = (types = [], enabled = !0) => useInfiniteQuery(notificationQueryOptions.getNotifications(types, enabled)), useNotificationTypes = () => useQuery(notificationQueryOptions.getNotificationTypes()), useTimelinePreference = () => useQuery({
37
+ queryKey: notificationQueryKeys.preference(),
38
+ queryFn: () => odeServices.conf().getPreference("timeline")
39
+ }), useSaveTimelinePreference = () => {
40
+ const queryClient = useQueryClient();
41
+ return useMutation({
42
+ mutationFn: (preference) => odeServices.conf().savePreference("timeline", preference),
43
+ onSuccess: (_data, preference) => {
44
+ queryClient.setQueryData(notificationQueryKeys.preference(), preference);
45
+ },
46
+ onError: () => {
47
+ queryClient.invalidateQueries({
48
+ queryKey: notificationQueryKeys.preference()
49
+ });
50
+ }
51
+ });
52
+ }, useReportNotification = () => useMutation({
53
+ mutationFn: (id) => notificationService.reportNotification(id)
54
+ }), useDeleteNotification = () => {
55
+ const queryClient = useQueryClient();
56
+ return useMutation({
57
+ mutationFn: (id) => notificationService.deleteNotification(id),
58
+ onSuccess: (_data, id) => {
59
+ queryClient.setQueriesData({
60
+ queryKey: [...notificationQueryKeys.all(), "list"]
61
+ }, (data) => data && {
62
+ ...data,
63
+ pages: data.pages.map((page) => page.filter((notification) => notification._id !== id))
64
+ });
65
+ }
66
+ });
67
+ };
35
68
  export {
36
69
  notificationQueryKeys,
37
70
  notificationQueryOptions,
71
+ useDeleteNotification,
38
72
  useNotificationTypes,
39
- useNotifications
73
+ useNotifications,
74
+ useReportNotification,
75
+ useSaveTimelinePreference,
76
+ useTimelinePreference
40
77
  };
@@ -1,10 +1,12 @@
1
- import { jsx, jsxs, Fragment } from "react/jsx-runtime";
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
2
  import { useTranslation } from "react-i18next";
3
3
  import SvgIconRafterUp from "../../../icons/components/IconRafterUp.js";
4
+ import SvgIconUserSearch from "../../../icons/components/IconUserSearch.js";
4
5
  import useToggle from "../../../../hooks/useToggle/useToggle.js";
5
6
  import Flex from "../../../../components/Flex/Flex.js";
6
7
  import Dropdown from "../../../../components/Dropdown/Dropdown.js";
7
8
  import IconButton from "../../../../components/Button/IconButton.js";
9
+ import ButtonBeta from "../../../../components/ButtonBeta/ButtonBeta.js";
8
10
  import { getRotateTransitionStyle } from "../../../../utilities/rotate-transition-style/get-rotate-transition-style.js";
9
11
  const SchoolSpace = ({
10
12
  schools,
@@ -13,16 +15,23 @@ const SchoolSpace = ({
13
15
  }) => {
14
16
  const [isExpanded, toggleExpanded] = useToggle(!1), {
15
17
  t
16
- } = useTranslation(), hasManySchools = schools && schools.length > 1;
17
- return selectedSchool ? /* @__PURE__ */ jsx("div", { className: "school-space", children: /* @__PURE__ */ jsxs(Flex, { className: "school-space-container", justify: "center", gap: "4", align: "center", children: [
18
- /* @__PURE__ */ jsx("b", { children: selectedSchool.name }),
19
- hasManySchools && /* @__PURE__ */ jsx(Dropdown, { placement: "bottom-end", onToggle: toggleExpanded, children: (triggerProps) => /* @__PURE__ */ jsxs(Fragment, { children: [
20
- /* @__PURE__ */ jsx(IconButton, { ...triggerProps, "aria-label": t("show"), color: "tertiary", variant: "ghost", icon: /* @__PURE__ */ jsx(SvgIconRafterUp, { className: "w-16 min-w-0", style: getRotateTransitionStyle(isExpanded, {
21
- degrees: 180
22
- }) }) }),
23
- /* @__PURE__ */ jsx(Dropdown.Menu, { children: schools.map((school) => /* @__PURE__ */ jsx(Dropdown.Item, { onClick: () => onSelectedSchoolChange == null ? void 0 : onSelectedSchoolChange(school), children: /* @__PURE__ */ jsx(Flex, { direction: "column", children: /* @__PURE__ */ jsx("p", { children: school.name }) }) }, school.id)) })
24
- ] }) })
25
- ] }) }) : null;
18
+ } = useTranslation();
19
+ if (!selectedSchool) return null;
20
+ const hasManySchools = schools && schools.length > 1, directoryUrl = `/userbook/annuaire#/search?${new URLSearchParams({
21
+ structure: selectedSchool.id
22
+ }).toString()}`;
23
+ return /* @__PURE__ */ jsxs(Flex, { gap: "4", direction: "column", className: "school-space", children: [
24
+ /* @__PURE__ */ jsxs(Flex, { className: "school-space-container", justify: "center", gap: "4", align: "center", children: [
25
+ /* @__PURE__ */ jsx("b", { children: selectedSchool.name }),
26
+ hasManySchools && /* @__PURE__ */ jsx(Dropdown, { placement: "bottom-end", onToggle: toggleExpanded, children: (triggerProps) => /* @__PURE__ */ jsxs(Fragment, { children: [
27
+ /* @__PURE__ */ jsx(IconButton, { ...triggerProps, "aria-label": t("show"), color: "tertiary", variant: "ghost", icon: /* @__PURE__ */ jsx(SvgIconRafterUp, { className: "w-16 min-w-0", style: getRotateTransitionStyle(isExpanded, {
28
+ degrees: 180
29
+ }) }) }),
30
+ /* @__PURE__ */ jsx(Dropdown.Menu, { children: schools.map((school) => /* @__PURE__ */ jsx(Dropdown.Item, { onClick: () => onSelectedSchoolChange == null ? void 0 : onSelectedSchoolChange(school), children: /* @__PURE__ */ jsx(Flex, { direction: "column", children: /* @__PURE__ */ jsx("p", { children: school.name }) }) }, school.id)) })
31
+ ] }) })
32
+ ] }),
33
+ /* @__PURE__ */ jsx(ButtonBeta, { variant: "outline", className: "school-space-directory-button", leftIcon: /* @__PURE__ */ jsx(SvgIconUserSearch, {}), onClick: () => window.location.href = directoryUrl, children: t("homepage.school-space.directory") })
34
+ ] });
26
35
  };
27
36
  export {
28
37
  SchoolSpace as default
@@ -1,8 +1,11 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { useTranslation } from "react-i18next";
3
+ import SvgIconClass from "../../../icons/components/IconClass.js";
4
+ import { useProfileLinks } from "./hooks/useProfileLinks.js";
3
5
  import HomeCard from "../HomeCard/HomeCard.js";
4
6
  import Flex from "../../../../components/Flex/Flex.js";
5
7
  import Avatar from "../../../../components/Avatar/Avatar.js";
8
+ import ButtonBeta from "../../../../components/ButtonBeta/ButtonBeta.js";
6
9
  function UserSpace({
7
10
  name,
8
11
  avatar,
@@ -11,8 +14,8 @@ function UserSpace({
11
14
  }) {
12
15
  const {
13
16
  t
14
- } = useTranslation();
15
- return /* @__PURE__ */ jsxs(HomeCard, { variant: "user", children: [
17
+ } = useTranslation(), links = useProfileLinks(profile);
18
+ return /* @__PURE__ */ jsxs(HomeCard, { variant: "user", footer: !!links && /* @__PURE__ */ jsx(Flex, { children: links.map((link, index) => /* @__PURE__ */ jsx(ButtonBeta, { size: "sm", variant: "ghost", leftIcon: /* @__PURE__ */ jsx(SvgIconClass, {}), onClick: () => window.location.href = link.url, children: link.text }, `${link.url}-${index}`)) }), children: [
16
19
  /* @__PURE__ */ jsxs(Flex, { className: "user-space", direction: "row", gap: "8", children: [
17
20
  /* @__PURE__ */ jsx(Avatar, { className: "user-space--avatar", size: "auto", alt: name, src: avatar, variant: "circle" }),
18
21
  /* @__PURE__ */ jsxs(Flex, { direction: "column", children: [
@@ -0,0 +1,14 @@
1
+ import { Child, StructureChildren } from '@edifice.io/client';
2
+ export declare const childrenQueryKeys: {
3
+ all: (userId: string) => readonly ["children", string];
4
+ };
5
+ export declare const childrenQueryOptions: (userId: string | undefined, enabled: boolean) => import('@tanstack/react-query').OmitKeyof<import('@tanstack/react-query').UseQueryOptions<StructureChildren[], Error, Child[], import('@tanstack/react-query').QueryKey>, "queryFn"> & {
6
+ queryFn?: import('@tanstack/react-query').QueryFunction<StructureChildren[], import('@tanstack/react-query').QueryKey, never> | undefined;
7
+ } & {
8
+ queryKey: import('@tanstack/react-query').DataTag<import('@tanstack/react-query').QueryKey, StructureChildren[]>;
9
+ };
10
+ /**
11
+ * Fetches the children of a "Relative" user across all their structures,
12
+ * merged into a single list.
13
+ */
14
+ export declare function useChildren(userId: string | undefined, enabled: boolean): import('@tanstack/react-query').UseQueryResult<Child[], Error>;
@@ -0,0 +1,23 @@
1
+ import { odeServices } from "@edifice.io/client";
2
+ import { useQuery, queryOptions } from "@tanstack/react-query";
3
+ const childrenQueryKeys = {
4
+ all: (userId) => ["children", userId]
5
+ };
6
+ function flattenChildrenByStructure(structures) {
7
+ const seenIds = /* @__PURE__ */ new Set();
8
+ return structures.flatMap((structure) => structure.children).filter((child) => seenIds.has(child.id) ? !1 : (seenIds.add(child.id), !0));
9
+ }
10
+ const childrenQueryOptions = (userId, enabled) => queryOptions({
11
+ queryKey: childrenQueryKeys.all(userId ?? ""),
12
+ queryFn: () => odeServices.directory().getChildren(userId),
13
+ enabled: enabled && !!userId,
14
+ select: flattenChildrenByStructure
15
+ });
16
+ function useChildren(userId, enabled) {
17
+ return useQuery(childrenQueryOptions(userId, enabled));
18
+ }
19
+ export {
20
+ childrenQueryKeys,
21
+ childrenQueryOptions,
22
+ useChildren
23
+ };
@@ -0,0 +1,8 @@
1
+ import { UserProfile } from '@edifice.io/client';
2
+ type ProfileLink = {
3
+ url: string;
4
+ text: string;
5
+ };
6
+ /** Generates user's links to show in the UserSpace home component. */
7
+ export declare function useProfileLinks(profile: UserProfile[number]): Array<ProfileLink> | undefined;
8
+ export {};
@@ -0,0 +1,65 @@
1
+ import { useTranslation } from "react-i18next";
2
+ import { useEdificeClient } from "../../../../../providers/EdificeClientProvider/EdificeClientProvider.hook.js";
3
+ import { useChildren } from "./useChildren.js";
4
+ function useProfileLinks(profile) {
5
+ var _a;
6
+ const {
7
+ user
8
+ } = useEdificeClient(), {
9
+ t
10
+ } = useTranslation(), isRelative = profile === "Relative", {
11
+ data: children
12
+ } = useChildren(user == null ? void 0 : user.userId, isRelative), structureId = (_a = user == null ? void 0 : user.structures) == null ? void 0 : _a[0];
13
+ if (structureId && profile) {
14
+ const baseUrl = "/userbook/annuaire#/search", buildStructureGroupsUrl = () => {
15
+ const params = new URLSearchParams({
16
+ filters: "groups",
17
+ structure: structureId
18
+ });
19
+ return `${baseUrl}?${params.toString()}`;
20
+ }, buildClassesUrl = (classIds = []) => {
21
+ const params = new URLSearchParams({
22
+ filters: "groups",
23
+ structure: structureId
24
+ });
25
+ return classIds.forEach((c) => params.append("class", String(c))), `${baseUrl}?${params.toString()}`;
26
+ };
27
+ switch (profile) {
28
+ case "Teacher":
29
+ return [{
30
+ text: t("homepage.userspace.teacher.link.classes"),
31
+ url: buildClassesUrl(user.classes)
32
+ }];
33
+ case "Student":
34
+ return [{
35
+ text: t("homepage.userspace.student.link.teachers"),
36
+ url: "/userbook/annuaire#/search?filters=groups&profile=Teacher"
37
+ }, {
38
+ text: t("homepage.userspace.student.link.classes"),
39
+ url: buildClassesUrl(user.classes)
40
+ }];
41
+ case "Relative":
42
+ return children != null && children.length ? children.map((child) => {
43
+ var _a2;
44
+ return {
45
+ text: t("homepage.userspace.relative.link.classes", {
46
+ childName: child.firstName
47
+ }),
48
+ url: buildClassesUrl((_a2 = child.classes) == null ? void 0 : _a2.map(({
49
+ id
50
+ }) => id))
51
+ };
52
+ }) : void 0;
53
+ case "Personnel":
54
+ return [{
55
+ text: t("homepage.userspace.personnel.link.classesAndGroups"),
56
+ url: buildStructureGroupsUrl()
57
+ }];
58
+ case "Guest":
59
+ return;
60
+ }
61
+ }
62
+ }
63
+ export {
64
+ useProfileLinks
65
+ };
@@ -0,0 +1,7 @@
1
+ import { SVGProps } from 'react';
2
+ interface SVGRProps {
3
+ title?: string;
4
+ titleId?: string;
5
+ }
6
+ declare const SvgIconClass: ({ title, titleId, ...props }: SVGProps<SVGSVGElement> & SVGRProps) => import("react/jsx-runtime").JSX.Element;
7
+ export default SvgIconClass;
@@ -0,0 +1,13 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ const SvgIconClass = ({
3
+ title,
4
+ titleId,
5
+ ...props
6
+ }) => /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", width: "24", height: "24", fill: "none", viewBox: "0 0 24 24", "aria-hidden": "true", "aria-labelledby": titleId, ...props, children: [
7
+ title ? /* @__PURE__ */ jsx("title", { id: titleId, children: title }) : null,
8
+ /* @__PURE__ */ jsx("path", { fill: "currentColor", fillRule: "evenodd", d: "M2.074 17.258c.707-.837 1.705-1.349 2.79-1.349h5.727c1.085 0 2.083.512 2.79 1.35.701.831 1.073 1.928 1.073 3.044V22a1 1 0 1 1-2 0v-1.697c0-.684-.23-1.314-.603-1.755-.367-.436-.826-.639-1.26-.639H4.864c-.434 0-.893.203-1.261.64-.372.44-.603 1.07-.603 1.754V22a1 1 0 1 1-2 0v-1.697c0-1.116.372-2.213 1.074-3.045M7.728 8.5a2.182 2.182 0 1 0 0 4.364 2.182 2.182 0 0 0 0-4.364m-4.182 2.182a4.182 4.182 0 1 1 8.364 0 4.182 4.182 0 0 1-8.364 0", clipRule: "evenodd" }),
9
+ /* @__PURE__ */ jsx("path", { fill: "currentColor", fillRule: "evenodd", d: "M0 5a3 3 0 0 1 3-3h18a3 3 0 0 1 3 3v11a3 3 0 0 1-3 3h-5a1 1 0 1 1 0-2h5a1 1 0 0 0 1-1V5a1 1 0 0 0-1-1H3a1 1 0 0 0-1 1v10a1 1 0 1 1-2 0z", clipRule: "evenodd" })
10
+ ] });
11
+ export {
12
+ SvgIconClass as default
13
+ };
@@ -0,0 +1,7 @@
1
+ import { SVGProps } from 'react';
2
+ interface SVGRProps {
3
+ title?: string;
4
+ titleId?: string;
5
+ }
6
+ declare const SvgIconNextcloudDeck: ({ title, titleId, ...props }: SVGProps<SVGSVGElement> & SVGRProps) => import("react/jsx-runtime").JSX.Element;
7
+ export default SvgIconNextcloudDeck;
@@ -0,0 +1,14 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ const SvgIconNextcloudDeck = ({
3
+ title,
4
+ titleId,
5
+ ...props
6
+ }) => /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 32 32", width: "24", height: "24", "aria-hidden": "true", "aria-labelledby": titleId, ...props, children: [
7
+ title ? /* @__PURE__ */ jsx("title", { id: titleId, children: title }) : null,
8
+ /* @__PURE__ */ jsx("path", { d: "M5.1 14.2h21.7c1 0 1.8.8 1.8 1.8v10.9c0 1-.8 1.8-1.8 1.8H5.1c-1 0-1.8-.8-1.8-1.8V16c0-1 .8-1.8 1.8-1.8m.9-3.6h20c.5 0 .9.4.9.9s-.4.9-.9.9H6c-.5 0-.9-.4-.9-.9s.4-.9.9-.9M7.9 7h16.3c.4 0 .8.4.8.9s-.4.9-.9.9H7.9c-.5 0-.9-.4-.9-.9s.4-.9.9-.9m1.8-3.7h12.7c.5 0 .9.4.9.9s-.4.9-.9.9H9.7c-.5 0-.9-.4-.9-.9s.4-.9.9-.9", style: {
9
+ fill: "#4a4a4a"
10
+ } })
11
+ ] });
12
+ export {
13
+ SvgIconNextcloudDeck as default
14
+ };
@@ -0,0 +1,7 @@
1
+ import { SVGProps } from 'react';
2
+ interface SVGRProps {
3
+ title?: string;
4
+ titleId?: string;
5
+ }
6
+ declare const SvgIconNextcloudFiles: ({ title, titleId, ...props }: SVGProps<SVGSVGElement> & SVGRProps) => import("react/jsx-runtime").JSX.Element;
7
+ export default SvgIconNextcloudFiles;
@@ -0,0 +1,14 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ const SvgIconNextcloudFiles = ({
3
+ title,
4
+ titleId,
5
+ ...props
6
+ }) => /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 32 32", width: "24", height: "24", "aria-hidden": "true", "aria-labelledby": titleId, ...props, children: [
7
+ title ? /* @__PURE__ */ jsx("title", { id: titleId, children: title }) : null,
8
+ /* @__PURE__ */ jsx("path", { d: "M13.5 6.1H6.1c-1.4 0-2.5 1.1-2.5 2.5v14.9c0 1.4 1.1 2.5 2.5 2.5H26c1.4 0 2.5-1.1 2.5-2.5V11c0-1.4-1.1-2.5-2.5-2.5H16z", style: {
9
+ fill: "#4a4a4a"
10
+ } })
11
+ ] });
12
+ export {
13
+ SvgIconNextcloudFiles as default
14
+ };
@@ -0,0 +1,7 @@
1
+ import { SVGProps } from 'react';
2
+ interface SVGRProps {
3
+ title?: string;
4
+ titleId?: string;
5
+ }
6
+ declare const SvgIconNextcloudForms: ({ title, titleId, ...props }: SVGProps<SVGSVGElement> & SVGRProps) => import("react/jsx-runtime").JSX.Element;
7
+ export default SvgIconNextcloudForms;
@@ -0,0 +1,14 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ const SvgIconNextcloudForms = ({
3
+ title,
4
+ titleId,
5
+ ...props
6
+ }) => /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 512 512", width: "24", height: "24", "aria-hidden": "true", "aria-labelledby": titleId, ...props, children: [
7
+ title ? /* @__PURE__ */ jsx("title", { id: titleId, children: title }) : null,
8
+ /* @__PURE__ */ jsx("path", { d: "M209.3 365.1V334h186.9v31.1zm0-93.5v-31.1h186.9v31.1zm0-93.5V147h186.9v31.1zm-62.4 202.5c-8.6 0-15.9-3-21.9-9.2-5.9-5.8-9.3-13.7-9.2-22 0-8.6 3-15.9 9.2-21.9 5.8-5.9 13.6-9.3 21.9-9.2 8.6 0 15.9 3 22 9.2 6 6 9.2 13.4 9.2 21.9.1 8.3-3.2 16.3-9.2 22-5.7 6-13.7 9.3-22 9.2m0-93.5c-8.6 0-15.9-3-21.9-9.2-5.9-5.8-9.3-13.7-9.2-22 0-8.6 3-15.9 9.2-22 5.8-5.9 13.6-9.3 21.9-9.2 8.6 0 15.9 3 22 9.2 6 6.1 9.2 13.4 9.2 22 .1 8.3-3.2 16.3-9.2 22-5.7 6.1-13.7 9.4-22 9.2m0-93.4c-8.6 0-15.9-3-21.9-9.2-5.9-5.8-9.3-13.6-9.2-21.9 0-8.6 3-15.9 9.2-22 5.8-5.9 13.6-9.3 21.9-9.2 8.6 0 15.9 3 22 9.2 6 6.1 9.2 13.4 9.2 22s-3 15.9-9.2 21.9c-5.7 6-13.7 9.4-22 9.2", style: {
9
+ fill: "#4a4a4a"
10
+ } })
11
+ ] });
12
+ export {
13
+ SvgIconNextcloudForms as default
14
+ };
@@ -0,0 +1,7 @@
1
+ import { SVGProps } from 'react';
2
+ interface SVGRProps {
3
+ title?: string;
4
+ titleId?: string;
5
+ }
6
+ declare const SvgIconNextcloudNotes: ({ title, titleId, ...props }: SVGProps<SVGSVGElement> & SVGRProps) => import("react/jsx-runtime").JSX.Element;
7
+ export default SvgIconNextcloudNotes;
@@ -0,0 +1,14 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ const SvgIconNextcloudNotes = ({
3
+ title,
4
+ titleId,
5
+ ...props
6
+ }) => /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 128 128", width: "24", height: "24", "aria-hidden": "true", "aria-labelledby": titleId, ...props, children: [
7
+ title ? /* @__PURE__ */ jsx("title", { id: titleId, children: title }) : null,
8
+ /* @__PURE__ */ jsx("path", { d: "M15 94.2V115h20.8l61.4-61.4-20.8-20.9zm98.4-56.7c2.2-2.2 2.2-5.7 0-7.8l-13-13c-2.2-2.2-5.7-2.2-7.8 0L82.4 26.8l20.8 20.8z", style: {
9
+ fill: "#4a4a4a"
10
+ } })
11
+ ] });
12
+ export {
13
+ SvgIconNextcloudNotes as default
14
+ };
@@ -0,0 +1,7 @@
1
+ import { SVGProps } from 'react';
2
+ interface SVGRProps {
3
+ title?: string;
4
+ titleId?: string;
5
+ }
6
+ declare const SvgIconNextcloudTalk: ({ title, titleId, ...props }: SVGProps<SVGSVGElement> & SVGRProps) => import("react/jsx-runtime").JSX.Element;
7
+ export default SvgIconNextcloudTalk;
@@ -0,0 +1,14 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ const SvgIconNextcloudTalk = ({
3
+ title,
4
+ titleId,
5
+ ...props
6
+ }) => /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 16 16", width: "24", height: "24", "aria-hidden": "true", "aria-labelledby": titleId, ...props, children: [
7
+ title ? /* @__PURE__ */ jsx("title", { id: titleId, children: title }) : null,
8
+ /* @__PURE__ */ jsx("path", { d: "M8 1C4.1 1 1 4.1 1 8s3.1 7 7 7c1.3 0 2.5-.4 3.6-1 .9.3 2.8 1.4 3.2.9.5-.5-.6-2.6-.8-3.4.6-1.1.9-2.3.9-3.5 0-3.9-3.1-7-7-7Zm0 2.7c2.4 0 4.3 1.9 4.3 4.3s-1.9 4.3-4.3 4.3S3.7 10.4 3.7 8 5.6 3.7 8 3.7", style: {
9
+ fill: "#4a4a4a"
10
+ } })
11
+ ] });
12
+ export {
13
+ SvgIconNextcloudTalk as default
14
+ };
@@ -0,0 +1,7 @@
1
+ import { SVGProps } from 'react';
2
+ interface SVGRProps {
3
+ title?: string;
4
+ titleId?: string;
5
+ }
6
+ declare const SvgIconPeertube: ({ title, titleId, ...props }: SVGProps<SVGSVGElement> & SVGRProps) => import("react/jsx-runtime").JSX.Element;
7
+ export default SvgIconPeertube;
@@ -0,0 +1,21 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ const SvgIconPeertube = ({
3
+ title,
4
+ titleId,
5
+ ...props
6
+ }) => /* @__PURE__ */ jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", xmlSpace: "preserve", viewBox: "69.8 0 372.4 512", width: "24", height: "24", "aria-hidden": "true", "aria-labelledby": titleId, ...props, children: [
7
+ title ? /* @__PURE__ */ jsx("title", { id: titleId, children: title }) : null,
8
+ /* @__PURE__ */ jsx("path", { d: "M69.8 0v256L256 139.6", style: {
9
+ fill: "#211f20"
10
+ } }),
11
+ /* @__PURE__ */ jsx("path", { d: "M69.8 256v256L256 372.4", style: {
12
+ fill: "#737373"
13
+ } }),
14
+ /* @__PURE__ */ jsx("path", { d: "M256 139.6v232.7L442.2 256", style: {
15
+ fill: "#f1680d"
16
+ } }),
17
+ /* @__PURE__ */ jsx("path", { d: "M256 372.4V139.6L69.8 256z" })
18
+ ] });
19
+ export {
20
+ SvgIconPeertube as default
21
+ };
@@ -75,6 +75,11 @@ export { default as IconMuseefrancaisphoto } from './IconMuseefrancaisphoto';
75
75
  export { default as IconMyNetwork } from './IconMyNetwork';
76
76
  export { default as IconNabook } from './IconNabook';
77
77
  export { default as IconNetvibes } from './IconNetvibes';
78
+ export { default as IconNextcloudDeck } from './IconNextcloudDeck';
79
+ export { default as IconNextcloudFiles } from './IconNextcloudFiles';
80
+ export { default as IconNextcloudForms } from './IconNextcloudForms';
81
+ export { default as IconNextcloudNotes } from './IconNextcloudNotes';
82
+ export { default as IconNextcloudTalk } from './IconNextcloudTalk';
78
83
  export { default as IconNote } from './IconNote';
79
84
  export { default as IconNotebook } from './IconNotebook';
80
85
  export { default as IconNotes } from './IconNotes';
@@ -87,6 +92,7 @@ export { default as IconParametrages } from './IconParametrages';
87
92
  export { default as IconParaschool } from './IconParaschool';
88
93
  export { default as IconParcours } from './IconParcours';
89
94
  export { default as IconPearltrees } from './IconPearltrees';
95
+ export { default as IconPeertube } from './IconPeertube';
90
96
  export { default as IconPicardieCursus } from './IconPicardieCursus';
91
97
  export { default as IconPlaceholder } from './IconPlaceholder';
92
98
  export { default as IconPoll } from './IconPoll';
@@ -30,6 +30,7 @@ export { default as IconCantoo } from './IconCantoo';
30
30
  export { default as IconCenter } from './IconCenter';
31
31
  export { default as IconCheck } from './IconCheck';
32
32
  export { default as IconChecklist } from './IconChecklist';
33
+ export { default as IconClass } from './IconClass';
33
34
  export { default as IconClockAlert } from './IconClockAlert';
34
35
  export { default as IconClock } from './IconClock';
35
36
  export { default as IconCloseFullScreen } from './IconCloseFullScreen';
@@ -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
  */