@edifice.io/react 2.5.2-develop-b2school.20251124152203 → 2.5.2-develop-b2school-actualites.20251127174432
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/AppIcon/index.d.ts +1 -0
- package/dist/components/Divider/Divider.d.ts +5 -0
- package/dist/components/Divider/Divider.js +21 -0
- package/dist/components/Divider/index.d.ts +1 -0
- package/dist/components/Flex/Flex.js +1 -1
- package/dist/components/Menu/components/MenuButton.d.ts +2 -0
- package/dist/components/Menu/components/MenuButton.js +13 -4
- package/dist/components/Select/Select.d.ts +6 -2
- package/dist/components/Select/Select.js +10 -4
- package/dist/components/SeparatedInfo/SeparatedInfo.d.ts +6 -0
- package/dist/components/SeparatedInfo/SeparatedInfo.js +13 -0
- package/dist/components/SeparatedInfo/index.d.ts +1 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/editor.js +40 -36
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/useInfiniteScroll/index.d.ts +1 -0
- package/dist/hooks/useInfiniteScroll/useInfiniteScroll.d.ts +33 -0
- package/dist/hooks/useInfiniteScroll/useInfiniteScroll.js +20 -0
- package/dist/icons.js +294 -292
- package/dist/index.js +86 -74
- package/dist/modals.js +8 -6
- package/dist/modules/comments/components/Comment.js +5 -3
- package/dist/modules/comments/components/CommentList.js +1 -1
- package/dist/modules/comments/constants.d.ts +4 -0
- package/dist/modules/comments/constants.js +2 -1
- package/dist/modules/comments/provider/CommentProvider.js +2 -1
- package/dist/modules/comments/types.d.ts +4 -0
- package/dist/modules/editor/components/Editor/EditorPreview.d.ts +14 -0
- package/dist/modules/editor/components/Editor/EditorPreview.js +56 -0
- package/dist/modules/editor/components/Editor/EditorPreviewSkeleton.d.ts +8 -0
- package/dist/modules/editor/components/Editor/EditorPreviewSkeleton.js +24 -0
- package/dist/modules/editor/components/Editor/index.d.ts +2 -0
- package/dist/modules/icons/components/IconClockAlert.d.ts +7 -0
- package/dist/modules/icons/components/IconClockAlert.js +17 -0
- package/dist/modules/icons/components/index.d.ts +1 -0
- package/dist/modules/modals/ShareModal/ShareBookmark.d.ts +1 -1
- package/dist/modules/modals/ShareModal/ShareBookmark.js +5 -2
- package/dist/modules/modals/ShareModal/ShareModal.d.ts +1 -11
- package/dist/modules/modals/ShareModal/ShareModal.js +13 -105
- package/dist/modules/modals/ShareModal/ShareResources.d.ts +168 -0
- package/dist/modules/modals/ShareModal/ShareResources.js +137 -0
- package/dist/modules/modals/ShareModal/hooks/useSearch.d.ts +2 -1
- package/dist/modules/modals/ShareModal/hooks/useSearch.js +3 -2
- package/dist/modules/modals/ShareModal/hooks/useShare.d.ts +12 -5
- package/dist/modules/modals/ShareModal/hooks/useShare.js +20 -13
- package/dist/modules/modals/ShareModal/hooks/useShareBookmark.d.ts +1 -1
- package/dist/modules/modals/ShareModal/hooks/useShareBookmark.js +1 -1
- package/dist/modules/modals/ShareModal/index.d.ts +3 -1
- package/dist/providers/AntThemeProvider/AntProvider.d.ts +10 -0
- package/dist/providers/AntThemeProvider/AntProvider.js +11 -0
- package/dist/providers/AntThemeProvider/antThemeConfig.d.ts +7 -0
- package/dist/providers/AntThemeProvider/antThemeConfig.js +10 -0
- package/dist/providers/EdificeThemeProvider/EdificeThemeProvider.js +2 -1
- package/dist/providers/index.d.ts +1 -0
- package/dist/style.css +1 -0
- package/dist/utilities/index.d.ts +1 -0
- package/dist/utilities/react-query/index.d.ts +1 -0
- package/dist/utilities/react-query/react-query-utils.d.ts +21 -0
- package/dist/utilities/react-query/react-query-utils.js +13 -0
- package/package.json +8 -6
|
@@ -1,25 +1,11 @@
|
|
|
1
1
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
-
import { useState } from "react";
|
|
2
|
+
import { useRef, useState } from "react";
|
|
3
3
|
import { createPortal } from "react-dom";
|
|
4
4
|
import { useTranslation } from "react-i18next";
|
|
5
|
-
import
|
|
6
|
-
import SvgIconInfoCircle from "../../icons/components/IconInfoCircle.js";
|
|
7
|
-
import SvgIconRafterDown from "../../icons/components/IconRafterDown.js";
|
|
8
|
-
import { ShareBookmark } from "./ShareBookmark.js";
|
|
9
|
-
import { ShareBookmarkLine } from "./ShareBookmarkLine.js";
|
|
10
|
-
import { useSearch } from "./hooks/useSearch.js";
|
|
11
|
-
import useShare from "./hooks/useShare.js";
|
|
12
|
-
import { useShareBookmark } from "./hooks/useShareBookmark.js";
|
|
5
|
+
import ShareResources from "./ShareResources.js";
|
|
13
6
|
import Modal from "../../../components/Modal/Modal.js";
|
|
14
7
|
import Alert from "../../../components/Alert/Alert.js";
|
|
15
|
-
import Heading from "../../../components/Heading/Heading.js";
|
|
16
|
-
import LoadingScreen from "../../../components/LoadingScreen/LoadingScreen.js";
|
|
17
|
-
import VisuallyHidden from "../../../components/VisuallyHidden/VisuallyHidden.js";
|
|
18
|
-
import Avatar from "../../../components/Avatar/Avatar.js";
|
|
19
|
-
import Checkbox from "../../../components/Checkbox/Checkbox.js";
|
|
20
8
|
import Button from "../../../components/Button/Button.js";
|
|
21
|
-
import Tooltip from "../../../components/Tooltip/Tooltip.js";
|
|
22
|
-
import Combobox from "../../../components/Combobox/Combobox.js";
|
|
23
9
|
function ShareResourceModal({
|
|
24
10
|
isOpen,
|
|
25
11
|
shareOptions,
|
|
@@ -28,104 +14,26 @@ function ShareResourceModal({
|
|
|
28
14
|
onSuccess,
|
|
29
15
|
onCancel
|
|
30
16
|
}) {
|
|
31
|
-
const {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
} = shareOptions, [isLoading, setIsLoading] = useState(!0), {
|
|
36
|
-
state: {
|
|
37
|
-
isSharing,
|
|
38
|
-
shareRights,
|
|
39
|
-
shareRightActions
|
|
40
|
-
},
|
|
41
|
-
dispatch: shareDispatch,
|
|
42
|
-
myAvatar,
|
|
43
|
-
currentIsAuthor,
|
|
44
|
-
handleShare,
|
|
45
|
-
toggleRight,
|
|
46
|
-
handleDeleteRow
|
|
47
|
-
} = useShare({
|
|
48
|
-
resourceId,
|
|
49
|
-
resourceCreatorId,
|
|
50
|
-
resourceRights,
|
|
51
|
-
shareResource,
|
|
52
|
-
setIsLoading,
|
|
53
|
-
onSuccess
|
|
54
|
-
}), {
|
|
55
|
-
state: {
|
|
56
|
-
searchResults,
|
|
57
|
-
searchInputValue
|
|
58
|
-
},
|
|
59
|
-
showSearchAdmlHint,
|
|
60
|
-
showSearchLoading,
|
|
61
|
-
showSearchNoResults,
|
|
62
|
-
getSearchMinLength,
|
|
63
|
-
handleSearchInputChange,
|
|
64
|
-
handleSearchResultsChange
|
|
65
|
-
} = useSearch({
|
|
66
|
-
resourceId,
|
|
67
|
-
resourceCreatorId,
|
|
68
|
-
shareRights,
|
|
69
|
-
shareDispatch
|
|
70
|
-
}), {
|
|
71
|
-
refBookmark,
|
|
72
|
-
showBookmark,
|
|
73
|
-
handleBookmarkChange,
|
|
74
|
-
toggleBookmark,
|
|
75
|
-
bookmark,
|
|
76
|
-
handleOnSave,
|
|
77
|
-
showBookmarkInput,
|
|
78
|
-
toggleBookmarkInput
|
|
79
|
-
} = useShareBookmark({
|
|
80
|
-
shareRights,
|
|
81
|
-
shareDispatch
|
|
82
|
-
}), {
|
|
17
|
+
const refShareResources = useRef(null), handleShare = () => {
|
|
18
|
+
var _a;
|
|
19
|
+
(_a = refShareResources.current) == null || _a.handleShare();
|
|
20
|
+
}, [isSaving, setIsSaving] = useState(!1), {
|
|
83
21
|
t
|
|
84
|
-
} = useTranslation(),
|
|
22
|
+
} = useTranslation(), onSaving = (isSaving2) => {
|
|
23
|
+
setIsSaving(isSaving2);
|
|
24
|
+
};
|
|
85
25
|
return /* @__PURE__ */ createPortal(/* @__PURE__ */ jsxs(Modal, { id: "share_modal", size: "lg", isOpen, onModalClose: onCancel, children: [
|
|
86
26
|
/* @__PURE__ */ jsx(Modal.Header, { onModalClose: onCancel, children: t("share.title") }),
|
|
87
27
|
/* @__PURE__ */ jsxs(Modal.Body, { children: [
|
|
88
28
|
/* @__PURE__ */ jsx(Alert, { type: "info", className: "mb-16", children: t("explorer.modal.share.alert.community") }),
|
|
89
|
-
/* @__PURE__ */ jsx(
|
|
90
|
-
/* @__PURE__ */ jsx("div", { className: "table-responsive", children: isLoading ? /* @__PURE__ */ jsx(LoadingScreen, {}) : /* @__PURE__ */ jsxs("table", { className: "table border align-middle mb-0", children: [
|
|
91
|
-
/* @__PURE__ */ jsx("thead", { className: "bg-secondary", children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
92
|
-
/* @__PURE__ */ jsx("th", { scope: "col", className: "w-32", children: /* @__PURE__ */ jsx(VisuallyHidden, { children: t("explorer.modal.share.avatar.shared.alt") }) }),
|
|
93
|
-
/* @__PURE__ */ jsx("th", { scope: "col", children: /* @__PURE__ */ jsx(VisuallyHidden, { children: t("explorer.modal.share.search.placeholder") }) }),
|
|
94
|
-
shareRightActions.map((shareRightAction) => /* @__PURE__ */ jsx("th", { scope: "col", className: "text-center text-white", children: t(shareRightAction.displayName) }, shareRightAction.displayName)),
|
|
95
|
-
/* @__PURE__ */ jsx("th", { scope: "col", children: /* @__PURE__ */ jsx(VisuallyHidden, { children: t("close") }) })
|
|
96
|
-
] }) }),
|
|
97
|
-
/* @__PURE__ */ jsxs("tbody", { children: [
|
|
98
|
-
currentIsAuthor() && /* @__PURE__ */ jsxs("tr", { children: [
|
|
99
|
-
/* @__PURE__ */ jsx("th", { scope: "row", children: /* @__PURE__ */ jsx(Avatar, { alt: t("explorer.modal.share.avatar.me.alt"), size: "xs", src: myAvatar, variant: "circle" }) }),
|
|
100
|
-
/* @__PURE__ */ jsx("td", { children: t("share.me") }),
|
|
101
|
-
shareRightActions.map((shareRightAction) => /* @__PURE__ */ jsx("td", { style: {
|
|
102
|
-
width: "80px"
|
|
103
|
-
}, className: "text-center text-white", children: /* @__PURE__ */ jsx(Checkbox, { checked: !0, disabled: !0 }) }, shareRightAction.displayName)),
|
|
104
|
-
/* @__PURE__ */ jsx("td", {})
|
|
105
|
-
] }),
|
|
106
|
-
/* @__PURE__ */ jsx(ShareBookmarkLine, { showBookmark, shareRightActions, shareRights, onDeleteRow: handleDeleteRow, toggleRight, toggleBookmark })
|
|
107
|
-
] })
|
|
108
|
-
] }) }),
|
|
109
|
-
/* @__PURE__ */ jsxs("div", { className: "mt-16", children: [
|
|
110
|
-
/* @__PURE__ */ jsx(Button, { color: "tertiary", leftIcon: /* @__PURE__ */ jsx(SvgIconBookmark, {}), rightIcon: /* @__PURE__ */ jsx(SvgIconRafterDown, { title: t("show"), className: "w-16 min-w-0", style: {
|
|
111
|
-
transition: "rotate 0.2s ease-out",
|
|
112
|
-
rotate: showBookmarkInput ? "-180deg" : "0deg"
|
|
113
|
-
} }), type: "button", variant: "ghost", className: "fw-normal", onClick: () => toggleBookmarkInput(!showBookmarkInput), children: t("share.save.sharebookmark") }),
|
|
114
|
-
showBookmarkInput && /* @__PURE__ */ jsx(ShareBookmark, { refBookmark, bookmark, onBookmarkChange: handleBookmarkChange, onSave: handleOnSave })
|
|
115
|
-
] }),
|
|
116
|
-
/* @__PURE__ */ jsx("hr", {}),
|
|
117
|
-
/* @__PURE__ */ jsxs(Heading, { headingStyle: "h4", level: "h3", className: "mb-16 d-flex align-items-center", children: [
|
|
118
|
-
/* @__PURE__ */ jsx("div", { className: "me-8", children: t("explorer.modal.share.search") }),
|
|
119
|
-
/* @__PURE__ */ jsx(Tooltip, { message: "Vos favoris de partage s’affichent en priorité dans votre liste lorsque vous recherchez un groupe ou une personne, vous pouvez les retrouver dans l’annuaire.", placement: "top", children: /* @__PURE__ */ jsx(SvgIconInfoCircle, { className: "c-pointer", height: "18" }) })
|
|
120
|
-
] }),
|
|
121
|
-
/* @__PURE__ */ jsx("div", { className: "row", children: /* @__PURE__ */ jsx("div", { className: "col-10", children: /* @__PURE__ */ jsx(Combobox, { value: searchInputValue, placeholder: searchPlaceholder, isLoading: showSearchLoading(), noResult: showSearchNoResults(), options: searchResults, searchMinLength: getSearchMinLength(), onSearchInputChange: handleSearchInputChange, onSearchResultsChange: handleSearchResultsChange }) }) }),
|
|
29
|
+
/* @__PURE__ */ jsx(ShareResources, { shareOptions, shareResource, ref: refShareResources, onSuccess, onSaving, classNameSearchInput: "flex-fill" }),
|
|
122
30
|
children
|
|
123
31
|
] }),
|
|
124
32
|
/* @__PURE__ */ jsxs(Modal.Footer, { children: [
|
|
125
|
-
/* @__PURE__ */ jsx(Button, { type: "button", color: "tertiary", variant: "ghost", onClick: onCancel, children: t("explorer.cancel") }),
|
|
126
|
-
/* @__PURE__ */ jsx(Button, { type: "button", color: "primary", variant: "filled", isLoading:
|
|
33
|
+
/* @__PURE__ */ jsx(Button, { type: "button", color: "tertiary", variant: "ghost", onClick: onCancel, disabled: isSaving, children: t("explorer.cancel") }),
|
|
34
|
+
/* @__PURE__ */ jsx(Button, { type: "button", color: "primary", variant: "filled", isLoading: isSaving, onClick: handleShare, disabled: isSaving, children: t("share") })
|
|
127
35
|
] })
|
|
128
|
-
] }), document.getElementById("portal"));
|
|
36
|
+
] }), document.getElementById("portal") || document.body);
|
|
129
37
|
}
|
|
130
38
|
export {
|
|
131
39
|
ShareResourceModal as default
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { ID, PutShareResponse, RightStringified, ShareRight, ShareRightActionDisplayName, ShareUrls } from '@edifice.io/client';
|
|
2
|
+
import { UseMutationResult } from '../../../node_modules/@tanstack/react-query';
|
|
3
|
+
/**
|
|
4
|
+
* Configuration options for sharing a resource
|
|
5
|
+
*
|
|
6
|
+
* @typedef {Object} ShareOptions
|
|
7
|
+
* @property {ID} resourceId - Unique identifier of the resource to share
|
|
8
|
+
* @property {RightStringified[]} resourceRights - Current rights assigned to the resource
|
|
9
|
+
* @property {string} resourceCreatorId - User ID of the resource creator
|
|
10
|
+
* @property {ShareRightActionDisplayName[]} [filteredActions] - Optional list of allowed actions to display
|
|
11
|
+
* @property {ShareUrls} [urls] - Optional custom URLs for API endpoints related to sharing operations
|
|
12
|
+
*
|
|
13
|
+
* @example Example related to sharing thread resources:
|
|
14
|
+
* ```ts
|
|
15
|
+
* const shareOptions: ShareOptions = {
|
|
16
|
+
* resourceId: '12345',
|
|
17
|
+
* resourceRights: [],
|
|
18
|
+
* resourceCreatorId: 'user-67890',
|
|
19
|
+
* filteredActions: ['read', 'contrib'],
|
|
20
|
+
* urls: {
|
|
21
|
+
* getResourceRights: '/api/V1/thread/shares', (get endpoint)
|
|
22
|
+
* saveResourceRights: '/api/V1/thread/shares', (put endpoint)
|
|
23
|
+
* getShareMapping: '/api/V1/rights/sharing'
|
|
24
|
+
* }
|
|
25
|
+
* };
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @example Example related to sharing info resources:
|
|
29
|
+
* ```ts
|
|
30
|
+
* const shareOptions: ShareOptions = {
|
|
31
|
+
* resourceId: '12345',
|
|
32
|
+
* resourceRights: [],
|
|
33
|
+
* resourceCreatorId: 'user-67890',
|
|
34
|
+
* filteredActions: ['read', 'contrib'],
|
|
35
|
+
* urls: {
|
|
36
|
+
* getResourceRights: '/api/V1/info/shares', (get endpoint)
|
|
37
|
+
* saveResourceRights: '/api/V1/info/shares', (put endpoint)
|
|
38
|
+
* getShareMapping: '/api/V1/rights/sharing'
|
|
39
|
+
* }
|
|
40
|
+
* };
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export type ShareOptions = {
|
|
44
|
+
resourceId: ID;
|
|
45
|
+
resourceRights: RightStringified[];
|
|
46
|
+
resourceCreatorId: string;
|
|
47
|
+
filteredActions?: ShareRightActionDisplayName[];
|
|
48
|
+
urls?: ShareUrls;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* React Query mutation result for share operations
|
|
52
|
+
*
|
|
53
|
+
* @typedef {UseMutationResult<PutShareResponse, unknown, {resourceId: string; rights: ShareRight[]}, unknown>} ShareResourceMutation
|
|
54
|
+
*/
|
|
55
|
+
export type ShareResourceMutation = UseMutationResult<PutShareResponse, unknown, {
|
|
56
|
+
resourceId: string;
|
|
57
|
+
rights: ShareRight[];
|
|
58
|
+
}, unknown>;
|
|
59
|
+
/**
|
|
60
|
+
* Props for the ShareResources component
|
|
61
|
+
*
|
|
62
|
+
* @interface ShareResourceProps
|
|
63
|
+
* @property {ShareOptions} shareOptions - Configuration for the resource being shared
|
|
64
|
+
* @property {ShareResourceMutation} [shareResource] - Optional React Query mutation for optimistic UI updates
|
|
65
|
+
* @property {() => void} [onSuccess] - Callback fired after successful share operation
|
|
66
|
+
* @property {(shareRights: ShareRight[], isDirty: boolean) => void} [onChange] - Callback fired when share rights change
|
|
67
|
+
* @property {string} [classNameSearchInput] - Optional CSS class for the search input wrapper (default: 'col-6')
|
|
68
|
+
*/
|
|
69
|
+
interface ShareResourceProps {
|
|
70
|
+
/**
|
|
71
|
+
* Expect resourceId,
|
|
72
|
+
* new rights array (replace shared array),
|
|
73
|
+
* creatorId
|
|
74
|
+
* of a resource */
|
|
75
|
+
shareOptions: ShareOptions;
|
|
76
|
+
/**
|
|
77
|
+
* Use the `shareResource` props when you need to do Optimistic UI
|
|
78
|
+
* otherwise ShareModal handles everything
|
|
79
|
+
* Must use React Query */
|
|
80
|
+
shareResource?: ShareResourceMutation;
|
|
81
|
+
/**
|
|
82
|
+
* onSuccess callback when a resource is successfully shared
|
|
83
|
+
*/
|
|
84
|
+
onSuccess?: () => void;
|
|
85
|
+
/**
|
|
86
|
+
* Callback when share rights change
|
|
87
|
+
*/
|
|
88
|
+
onChange?: (shareRights: ShareRight[], isDirty: boolean, isSaving: boolean) => void;
|
|
89
|
+
/**
|
|
90
|
+
* Callback when SHareRessource component isSaving share rights or bookmark
|
|
91
|
+
*/
|
|
92
|
+
onSaving?: (isSaving: boolean) => void;
|
|
93
|
+
/**
|
|
94
|
+
* Optional className for the search input
|
|
95
|
+
*/
|
|
96
|
+
classNameSearchInput?: string;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Ref interface exposed by ShareResources component
|
|
100
|
+
*
|
|
101
|
+
* @interface ShareResourcesRef
|
|
102
|
+
* @property {() => void} handleShare - Method to trigger the share operation
|
|
103
|
+
* @property {() => boolean} isSharing - Method to check if sharing is in progress
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```tsx
|
|
107
|
+
* const ref = useRef<ShareResourcesRef>(null);
|
|
108
|
+
*
|
|
109
|
+
* // Trigger share programmatically
|
|
110
|
+
* ref.current?.handleShare();
|
|
111
|
+
*
|
|
112
|
+
* // Check sharing status
|
|
113
|
+
* const sharing = ref.current?.isSharing();
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
export interface ShareResourcesRef {
|
|
117
|
+
handleShare: (notify?: boolean) => void;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* ShareResources Component
|
|
121
|
+
*
|
|
122
|
+
* A component for managing resource sharing permissions with users and groups.
|
|
123
|
+
* Provides search functionality, bookmark management, and granular rights control.
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* ```tsx
|
|
127
|
+
* import { useRef } from 'react';
|
|
128
|
+
* import ShareResources, { ShareResourcesRef, ShareOptions } from './ShareResources';
|
|
129
|
+
*
|
|
130
|
+
* function MyComponent() {
|
|
131
|
+
* const shareRef = useRef<ShareResourcesRef>(null);
|
|
132
|
+
*
|
|
133
|
+
* const shareOptions: ShareOptions = {
|
|
134
|
+
* resourceId: '123',
|
|
135
|
+
* resourceRights: [],
|
|
136
|
+
* resourceCreatorId: 'user-456',
|
|
137
|
+
* filteredActions: ['read', 'contrib'],
|
|
138
|
+
* urls: {
|
|
139
|
+
* getResourceRights: '/api/share/rights',
|
|
140
|
+
* putResourceRights: '/api/share/update'
|
|
141
|
+
* }
|
|
142
|
+
* };
|
|
143
|
+
*
|
|
144
|
+
* const handleSave = () => {
|
|
145
|
+
* if (shareRef.current) {
|
|
146
|
+
* shareRef.current.handleShare();
|
|
147
|
+
* }
|
|
148
|
+
* };
|
|
149
|
+
*
|
|
150
|
+
* return (
|
|
151
|
+
* <>
|
|
152
|
+
* <ShareResources
|
|
153
|
+
* ref={shareRef}
|
|
154
|
+
* shareOptions={shareOptions}
|
|
155
|
+
* onSuccess={() => console.log('Shared successfully')}
|
|
156
|
+
* onChange={(rights, isDirty, isSaving) => console.log('Rights changed:', isDirty)}
|
|
157
|
+
* />
|
|
158
|
+
* <button onClick={handleSave}>Save Changes</button>
|
|
159
|
+
* </>
|
|
160
|
+
* );
|
|
161
|
+
* }
|
|
162
|
+
* ```
|
|
163
|
+
*
|
|
164
|
+
* @component
|
|
165
|
+
* @forwardRef
|
|
166
|
+
*/
|
|
167
|
+
declare const ShareResources: import('react').ForwardRefExoticComponent<ShareResourceProps & import('react').RefAttributes<ShareResourcesRef>>;
|
|
168
|
+
export default ShareResources;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef, useState, useImperativeHandle, useEffect } from "react";
|
|
3
|
+
import { useTranslation } from "react-i18next";
|
|
4
|
+
import SvgIconBookmark from "../../icons/components/IconBookmark.js";
|
|
5
|
+
import SvgIconInfoCircle from "../../icons/components/IconInfoCircle.js";
|
|
6
|
+
import SvgIconRafterDown from "../../icons/components/IconRafterDown.js";
|
|
7
|
+
import { ShareBookmark } from "./ShareBookmark.js";
|
|
8
|
+
import { ShareBookmarkLine } from "./ShareBookmarkLine.js";
|
|
9
|
+
import { useSearch } from "./hooks/useSearch.js";
|
|
10
|
+
import useShare from "./hooks/useShare.js";
|
|
11
|
+
import { useShareBookmark } from "./hooks/useShareBookmark.js";
|
|
12
|
+
import Heading from "../../../components/Heading/Heading.js";
|
|
13
|
+
import Tooltip from "../../../components/Tooltip/Tooltip.js";
|
|
14
|
+
import Combobox from "../../../components/Combobox/Combobox.js";
|
|
15
|
+
import LoadingScreen from "../../../components/LoadingScreen/LoadingScreen.js";
|
|
16
|
+
import VisuallyHidden from "../../../components/VisuallyHidden/VisuallyHidden.js";
|
|
17
|
+
import Avatar from "../../../components/Avatar/Avatar.js";
|
|
18
|
+
import Checkbox from "../../../components/Checkbox/Checkbox.js";
|
|
19
|
+
import Button from "../../../components/Button/Button.js";
|
|
20
|
+
const ShareResources = /* @__PURE__ */ forwardRef(({
|
|
21
|
+
shareOptions,
|
|
22
|
+
shareResource,
|
|
23
|
+
onSuccess = () => {
|
|
24
|
+
},
|
|
25
|
+
onChange = () => {
|
|
26
|
+
},
|
|
27
|
+
onSaving = () => {
|
|
28
|
+
},
|
|
29
|
+
classNameSearchInput = "col-6"
|
|
30
|
+
}, ref) => {
|
|
31
|
+
const {
|
|
32
|
+
resourceId,
|
|
33
|
+
resourceCreatorId,
|
|
34
|
+
resourceRights,
|
|
35
|
+
filteredActions,
|
|
36
|
+
urls
|
|
37
|
+
} = shareOptions, [isLoading, setIsLoading] = useState(!0), [isSavingBookmark, setIsSavingBookmark] = useState(!1), {
|
|
38
|
+
state: {
|
|
39
|
+
isSharing,
|
|
40
|
+
shareRights,
|
|
41
|
+
shareRightActions
|
|
42
|
+
},
|
|
43
|
+
dispatch: shareDispatch,
|
|
44
|
+
myAvatar,
|
|
45
|
+
currentIsAuthor,
|
|
46
|
+
toggleRight,
|
|
47
|
+
handleShare,
|
|
48
|
+
handleDeleteRow,
|
|
49
|
+
isDirty
|
|
50
|
+
} = useShare({
|
|
51
|
+
resourceId,
|
|
52
|
+
resourceCreatorId,
|
|
53
|
+
resourceRights,
|
|
54
|
+
shareResource,
|
|
55
|
+
setIsLoading,
|
|
56
|
+
onSuccess,
|
|
57
|
+
filteredActions,
|
|
58
|
+
urls
|
|
59
|
+
}), {
|
|
60
|
+
state: {
|
|
61
|
+
searchResults,
|
|
62
|
+
searchInputValue
|
|
63
|
+
},
|
|
64
|
+
showSearchAdmlHint,
|
|
65
|
+
showSearchLoading,
|
|
66
|
+
showSearchNoResults,
|
|
67
|
+
getSearchMinLength,
|
|
68
|
+
handleSearchInputChange,
|
|
69
|
+
handleSearchResultsChange
|
|
70
|
+
} = useSearch({
|
|
71
|
+
resourceId,
|
|
72
|
+
resourceCreatorId,
|
|
73
|
+
shareRights,
|
|
74
|
+
shareDispatch,
|
|
75
|
+
urlResourceRights: urls == null ? void 0 : urls.getResourceRights
|
|
76
|
+
}), {
|
|
77
|
+
refBookmark,
|
|
78
|
+
showBookmark,
|
|
79
|
+
handleBookmarkChange,
|
|
80
|
+
toggleBookmark,
|
|
81
|
+
bookmark,
|
|
82
|
+
handleOnSave,
|
|
83
|
+
showBookmarkInput,
|
|
84
|
+
toggleBookmarkInput
|
|
85
|
+
} = useShareBookmark({
|
|
86
|
+
shareRights,
|
|
87
|
+
shareDispatch
|
|
88
|
+
}), handleOnSaveBookmark = () => (setIsSavingBookmark(!0), handleOnSave().then(() => {
|
|
89
|
+
setIsSavingBookmark(!1);
|
|
90
|
+
}));
|
|
91
|
+
useImperativeHandle(ref, () => ({
|
|
92
|
+
handleShare
|
|
93
|
+
}), [handleShare]), useEffect(() => {
|
|
94
|
+
onChange(shareRights.rights, isDirty, isSavingBookmark || isSharing);
|
|
95
|
+
}, [isDirty, shareRights.rights, onChange, isSavingBookmark, isSharing]), useEffect(() => {
|
|
96
|
+
onSaving(isSavingBookmark || isSharing);
|
|
97
|
+
}, [isSavingBookmark, isSharing, onSaving]);
|
|
98
|
+
const {
|
|
99
|
+
t
|
|
100
|
+
} = useTranslation(), searchPlaceholder = showSearchAdmlHint() ? t("explorer.search.adml.hint") : t("explorer.modal.share.search.placeholder");
|
|
101
|
+
return /* @__PURE__ */ jsxs("div", { children: [
|
|
102
|
+
/* @__PURE__ */ jsxs(Heading, { headingStyle: "h4", level: "h3", className: "mb-16 d-flex align-items-center", children: [
|
|
103
|
+
/* @__PURE__ */ jsx("div", { className: "me-8", children: t("explorer.modal.share.search") }),
|
|
104
|
+
/* @__PURE__ */ jsx(Tooltip, { message: "Vos favoris de partage s’affichent en priorité dans votre liste lorsque vous recherchez un groupe ou une personne, vous pouvez les retrouver dans l’annuaire.", placement: "top", children: /* @__PURE__ */ jsx(SvgIconInfoCircle, { className: "c-pointer", height: "18" }) })
|
|
105
|
+
] }),
|
|
106
|
+
/* @__PURE__ */ jsx("div", { className: "row mb-16", children: /* @__PURE__ */ jsx("div", { className: classNameSearchInput, children: /* @__PURE__ */ jsx(Combobox, { value: searchInputValue, placeholder: searchPlaceholder, isLoading: showSearchLoading(), noResult: showSearchNoResults(), options: searchResults, searchMinLength: getSearchMinLength(), onSearchInputChange: handleSearchInputChange, onSearchResultsChange: handleSearchResultsChange }) }) }),
|
|
107
|
+
/* @__PURE__ */ jsx("div", { className: "table-responsive", children: isLoading ? /* @__PURE__ */ jsx(LoadingScreen, {}) : /* @__PURE__ */ jsxs("table", { className: "table border align-middle mb-0 rounded-3", children: [
|
|
108
|
+
/* @__PURE__ */ jsx("thead", { className: "bg-blue-200", children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
109
|
+
/* @__PURE__ */ jsx("th", { scope: "col", className: "w-32", children: /* @__PURE__ */ jsx(VisuallyHidden, { children: t("explorer.modal.share.avatar.shared.alt") }) }),
|
|
110
|
+
/* @__PURE__ */ jsx("th", { scope: "col", children: /* @__PURE__ */ jsx(VisuallyHidden, { children: t("explorer.modal.share.search.placeholder") }) }),
|
|
111
|
+
shareRightActions.map((shareRightAction) => /* @__PURE__ */ jsx("th", { scope: "col", className: "text-center text-gray-800", children: t(shareRightAction.displayName) }, shareRightAction.displayName)),
|
|
112
|
+
/* @__PURE__ */ jsx("th", { scope: "col", children: /* @__PURE__ */ jsx(VisuallyHidden, { children: t("close") }) })
|
|
113
|
+
] }) }),
|
|
114
|
+
/* @__PURE__ */ jsxs("tbody", { children: [
|
|
115
|
+
currentIsAuthor() && /* @__PURE__ */ jsxs("tr", { children: [
|
|
116
|
+
/* @__PURE__ */ jsx("th", { scope: "row", children: /* @__PURE__ */ jsx(Avatar, { alt: t("explorer.modal.share.avatar.me.alt"), size: "xs", src: myAvatar, variant: "circle" }) }),
|
|
117
|
+
/* @__PURE__ */ jsx("td", { children: t("share.me") }),
|
|
118
|
+
shareRightActions.map((shareRightAction) => /* @__PURE__ */ jsx("td", { style: {
|
|
119
|
+
width: "80px"
|
|
120
|
+
}, className: "text-center text-white", children: /* @__PURE__ */ jsx(Checkbox, { checked: !0, disabled: !0 }) }, shareRightAction.displayName)),
|
|
121
|
+
/* @__PURE__ */ jsx("td", {})
|
|
122
|
+
] }),
|
|
123
|
+
/* @__PURE__ */ jsx(ShareBookmarkLine, { showBookmark, shareRightActions, shareRights, onDeleteRow: handleDeleteRow, toggleRight, toggleBookmark })
|
|
124
|
+
] })
|
|
125
|
+
] }) }),
|
|
126
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-16", children: [
|
|
127
|
+
/* @__PURE__ */ jsx(Button, { color: "tertiary", leftIcon: /* @__PURE__ */ jsx(SvgIconBookmark, {}), rightIcon: /* @__PURE__ */ jsx(SvgIconRafterDown, { title: t("show"), className: "w-16 min-w-0", style: {
|
|
128
|
+
transition: "rotate 0.2s ease-out",
|
|
129
|
+
rotate: showBookmarkInput ? "-180deg" : "0deg"
|
|
130
|
+
} }), type: "button", variant: "ghost", className: "fw-normal", onClick: () => toggleBookmarkInput(!showBookmarkInput), children: t("share.save.sharebookmark") }),
|
|
131
|
+
showBookmarkInput && /* @__PURE__ */ jsx(ShareBookmark, { refBookmark, bookmark, onBookmarkChange: handleBookmarkChange, onSave: handleOnSaveBookmark })
|
|
132
|
+
] })
|
|
133
|
+
] });
|
|
134
|
+
});
|
|
135
|
+
export {
|
|
136
|
+
ShareResources as default
|
|
137
|
+
};
|
|
@@ -3,11 +3,12 @@ import { ShareRightWithVisibles, ShareSubject } from '@edifice.io/client';
|
|
|
3
3
|
import { OptionListItemType } from '../../../../components';
|
|
4
4
|
import { ShareOptions } from '../ShareModal';
|
|
5
5
|
import { ShareAction } from './useShare';
|
|
6
|
-
export declare const useSearch: ({ resourceId, resourceCreatorId, shareRights, shareDispatch, }: {
|
|
6
|
+
export declare const useSearch: ({ resourceId, resourceCreatorId, shareRights, shareDispatch, urlResourceRights, }: {
|
|
7
7
|
resourceId: ShareOptions["resourceCreatorId"];
|
|
8
8
|
resourceCreatorId: ShareOptions["resourceCreatorId"];
|
|
9
9
|
shareRights: ShareRightWithVisibles;
|
|
10
10
|
shareDispatch: Dispatch<ShareAction>;
|
|
11
|
+
urlResourceRights?: string;
|
|
11
12
|
}) => {
|
|
12
13
|
state: {
|
|
13
14
|
searchInputValue: string;
|
|
@@ -58,7 +58,8 @@ const defaultActions = [{
|
|
|
58
58
|
resourceId,
|
|
59
59
|
resourceCreatorId,
|
|
60
60
|
shareRights,
|
|
61
|
-
shareDispatch
|
|
61
|
+
shareDispatch,
|
|
62
|
+
urlResourceRights
|
|
62
63
|
}) => {
|
|
63
64
|
const [state, dispatch] = useReducer(reducer, initialState), debouncedSearchInputValue = useDebounce(state.searchInputValue, 500), {
|
|
64
65
|
isAdml
|
|
@@ -82,7 +83,7 @@ const defaultActions = [{
|
|
|
82
83
|
type: "isSearching",
|
|
83
84
|
payload: !0
|
|
84
85
|
}), !isAdml && debouncedSearchInputValue2.length >= 1 || isAdml && debouncedSearchInputValue2.length >= 3) {
|
|
85
|
-
const resSearchShareSubjects = await odeServices.share().searchShareSubjects(appCode, resourceId, debouncedSearchInputValue2);
|
|
86
|
+
const resSearchShareSubjects = await odeServices.share().searchShareSubjects(appCode, resourceId, debouncedSearchInputValue2, urlResourceRights);
|
|
86
87
|
dispatch({
|
|
87
88
|
type: "addApiResult",
|
|
88
89
|
payload: resSearchShareSubjects
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ShareRight, ShareRightAction, ShareRightActionDisplayName, ShareRightWithVisibles } from '@edifice.io/client';
|
|
2
|
-
import { ShareOptions, ShareResourceMutation } from '../
|
|
1
|
+
import { ShareRight, ShareRightAction, ShareRightActionDisplayName, ShareRightWithVisibles, ShareUrls } from '@edifice.io/client';
|
|
2
|
+
import { ShareOptions, ShareResourceMutation } from '../ShareResources';
|
|
3
3
|
interface UseShareResourceModalProps {
|
|
4
4
|
/**
|
|
5
5
|
* Resource ID (assetId)
|
|
@@ -15,10 +15,15 @@ interface UseShareResourceModalProps {
|
|
|
15
15
|
resourceCreatorId: ShareOptions['resourceCreatorId'];
|
|
16
16
|
shareResource?: ShareResourceMutation;
|
|
17
17
|
onSuccess: () => void;
|
|
18
|
-
setIsLoading
|
|
18
|
+
setIsLoading?: (value: boolean) => void;
|
|
19
|
+
resourceShareRights?: ShareRightWithVisibles;
|
|
20
|
+
resourceShareRightActions?: ShareRightAction[];
|
|
21
|
+
filteredActions?: ShareRightActionDisplayName[];
|
|
22
|
+
urls?: ShareUrls;
|
|
19
23
|
}
|
|
20
24
|
type State = {
|
|
21
25
|
isSharing: boolean;
|
|
26
|
+
isDirty?: boolean;
|
|
22
27
|
shareRights: ShareRightWithVisibles;
|
|
23
28
|
shareRightActions: ShareRightAction[];
|
|
24
29
|
};
|
|
@@ -38,9 +43,10 @@ export type ShareAction = {
|
|
|
38
43
|
type: 'isSharing';
|
|
39
44
|
payload: boolean;
|
|
40
45
|
};
|
|
41
|
-
export default function useShare({ resourceId, resourceRights, resourceCreatorId, shareResource, setIsLoading, onSuccess, }: UseShareResourceModalProps): {
|
|
46
|
+
export default function useShare({ resourceId, resourceRights, resourceCreatorId, shareResource, setIsLoading, onSuccess, filteredActions, urls, }: UseShareResourceModalProps): {
|
|
42
47
|
state: {
|
|
43
48
|
isSharing: boolean;
|
|
49
|
+
isDirty?: boolean;
|
|
44
50
|
shareRights: ShareRightWithVisibles;
|
|
45
51
|
shareRightActions: ShareRightAction[];
|
|
46
52
|
};
|
|
@@ -48,7 +54,8 @@ export default function useShare({ resourceId, resourceRights, resourceCreatorId
|
|
|
48
54
|
currentIsAuthor: () => boolean;
|
|
49
55
|
myAvatar: string;
|
|
50
56
|
handleDeleteRow: (shareRight: ShareRight) => void;
|
|
51
|
-
handleShare: () => Promise<void>;
|
|
57
|
+
handleShare: (notify?: boolean) => Promise<void>;
|
|
52
58
|
toggleRight: (shareRight: ShareRight, actionName: ShareRightActionDisplayName) => void;
|
|
59
|
+
isDirty: boolean;
|
|
53
60
|
};
|
|
54
61
|
export {};
|
|
@@ -6,6 +6,7 @@ import useUser from "../../../../hooks/useUser/useUser.js";
|
|
|
6
6
|
import useToast from "../../../../hooks/useToast/useToast.js";
|
|
7
7
|
const initialState = {
|
|
8
8
|
isSharing: !1,
|
|
9
|
+
isDirty: !1,
|
|
9
10
|
shareRights: {
|
|
10
11
|
rights: [],
|
|
11
12
|
visibleBookmarks: [],
|
|
@@ -24,17 +25,20 @@ function reducer(state, action) {
|
|
|
24
25
|
case "deleteRow":
|
|
25
26
|
return {
|
|
26
27
|
...state,
|
|
27
|
-
shareRights: action.payload
|
|
28
|
+
shareRights: action.payload,
|
|
29
|
+
isDirty: !0
|
|
28
30
|
};
|
|
29
31
|
case "updateShareRights":
|
|
30
32
|
return {
|
|
31
33
|
...state,
|
|
32
|
-
shareRights: action.payload
|
|
34
|
+
shareRights: action.payload,
|
|
35
|
+
isDirty: !0
|
|
33
36
|
};
|
|
34
37
|
case "toggleRight":
|
|
35
38
|
return {
|
|
36
39
|
...state,
|
|
37
|
-
shareRights: action.payload
|
|
40
|
+
shareRights: action.payload,
|
|
41
|
+
isDirty: !0
|
|
38
42
|
};
|
|
39
43
|
case "isSharing":
|
|
40
44
|
return {
|
|
@@ -51,7 +55,9 @@ function useShare({
|
|
|
51
55
|
resourceCreatorId,
|
|
52
56
|
shareResource,
|
|
53
57
|
setIsLoading,
|
|
54
|
-
onSuccess
|
|
58
|
+
onSuccess,
|
|
59
|
+
filteredActions,
|
|
60
|
+
urls
|
|
55
61
|
}) {
|
|
56
62
|
const {
|
|
57
63
|
appCode
|
|
@@ -64,18 +70,18 @@ function useShare({
|
|
|
64
70
|
useEffect(() => {
|
|
65
71
|
resourceId && (async () => {
|
|
66
72
|
try {
|
|
67
|
-
const [shareRightActions, shareRights] = await Promise.all([odeServices.share().getActionsForApp(appCode), odeServices.share().getRightsForResource(appCode, resourceId)]);
|
|
73
|
+
const [shareRightActions, shareRights] = await Promise.all([odeServices.share().getActionsForApp(appCode, urls == null ? void 0 : urls.getShareMapping), odeServices.share().getRightsForResource(appCode, resourceId, urls)]), filteredShareRightActions = filteredActions ? shareRightActions.filter((action) => filteredActions.includes(action.id)) : shareRightActions;
|
|
68
74
|
dispatch({
|
|
69
75
|
type: "init",
|
|
70
76
|
payload: {
|
|
71
|
-
shareRightActions,
|
|
77
|
+
shareRightActions: filteredShareRightActions,
|
|
72
78
|
shareRights
|
|
73
79
|
}
|
|
74
80
|
});
|
|
75
81
|
} catch (error) {
|
|
76
82
|
console.error(error);
|
|
77
83
|
}
|
|
78
|
-
setIsLoading(!1);
|
|
84
|
+
setIsLoading == null || setIsLoading(!1);
|
|
79
85
|
})();
|
|
80
86
|
}, [resourceId]);
|
|
81
87
|
const toggleRight = (shareRight, actionName) => {
|
|
@@ -143,7 +149,7 @@ function useShare({
|
|
|
143
149
|
}
|
|
144
150
|
});
|
|
145
151
|
},
|
|
146
|
-
handleShare: async () => {
|
|
152
|
+
handleShare: async (notify = !0) => {
|
|
147
153
|
dispatch({
|
|
148
154
|
type: "isSharing",
|
|
149
155
|
payload: !0
|
|
@@ -169,12 +175,12 @@ function useShare({
|
|
|
169
175
|
resourceId,
|
|
170
176
|
rights: shares
|
|
171
177
|
});
|
|
172
|
-
notifySuccess(result);
|
|
178
|
+
notify && notifySuccess(result);
|
|
173
179
|
} else {
|
|
174
|
-
const result = await odeServices.share().saveRights(appCode, resourceId, shares);
|
|
175
|
-
notifySuccess(result);
|
|
180
|
+
const result = await odeServices.share().saveRights(appCode, resourceId, shares, urls);
|
|
181
|
+
notify && notifySuccess(result);
|
|
176
182
|
}
|
|
177
|
-
onSuccess();
|
|
183
|
+
urls != null && urls.getResourceRights && odeServices.cache().clearCache(urls.getResourceRights), onSuccess();
|
|
178
184
|
} catch (error) {
|
|
179
185
|
typeof error == "string" && toast.error(t("explorer.shared.status.error")), typeof error == "object" && toast.error(t((error == null ? void 0 : error.error) || "explorer.shared.status.error")), console.error("Failed to save share", error);
|
|
180
186
|
} finally {
|
|
@@ -184,7 +190,8 @@ function useShare({
|
|
|
184
190
|
});
|
|
185
191
|
}
|
|
186
192
|
},
|
|
187
|
-
toggleRight
|
|
193
|
+
toggleRight,
|
|
194
|
+
isDirty: !!state.isDirty
|
|
188
195
|
};
|
|
189
196
|
}
|
|
190
197
|
export {
|
|
@@ -16,7 +16,7 @@ export declare const useShareBookmark: ({ shareRights, shareDispatch, }: UseShar
|
|
|
16
16
|
bookmark: BookmarkProps;
|
|
17
17
|
handleBookmarkChange: () => void;
|
|
18
18
|
setBookmark: Dispatch<import('react').SetStateAction<BookmarkProps>>;
|
|
19
|
-
handleOnSave: () => void
|
|
19
|
+
handleOnSave: () => Promise<void>;
|
|
20
20
|
toggleBookmark: () => void;
|
|
21
21
|
toggleBookmarkInput: Dispatch<import('react').SetStateAction<boolean>>;
|
|
22
22
|
};
|
|
@@ -56,7 +56,7 @@ const useShareBookmark = ({
|
|
|
56
56
|
handleOnSave: () => {
|
|
57
57
|
var _a;
|
|
58
58
|
const inputValue = ((_a = refBookmark.current) == null ? void 0 : _a.value) || "";
|
|
59
|
-
saveBookmark(inputValue);
|
|
59
|
+
return saveBookmark(inputValue);
|
|
60
60
|
},
|
|
61
61
|
toggleBookmark,
|
|
62
62
|
toggleBookmarkInput
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
-
export { default as ShareModal } from './ShareModal';
|
|
2
1
|
export { default as ShareBlog } from './apps/ShareBlog';
|
|
3
2
|
export { default as useShareMutation } from './hooks/useShareMutation';
|
|
3
|
+
export { default as ShareModal } from './ShareModal';
|
|
4
|
+
export * from './ShareResources';
|
|
5
|
+
export { default as ShareResources } from './ShareResources';
|