@edifice.io/react 2.4.2-develop-pedago.20251118152821 → 2.4.2-develop-b2school-actualites.20251119110458

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 (41) hide show
  1. package/dist/components/AppIcon/index.d.ts +1 -0
  2. package/dist/components/Divider/Divider.d.ts +5 -0
  3. package/dist/components/Divider/Divider.js +21 -0
  4. package/dist/components/Divider/index.d.ts +1 -0
  5. package/dist/components/Flex/Flex.js +1 -1
  6. package/dist/components/Menu/components/MenuButton.d.ts +2 -0
  7. package/dist/components/Menu/components/MenuButton.js +13 -4
  8. package/dist/components/Select/Select.d.ts +6 -2
  9. package/dist/components/Select/Select.js +10 -4
  10. package/dist/components/SeparatedInfo/SeparatedInfo.d.ts +6 -0
  11. package/dist/components/SeparatedInfo/SeparatedInfo.js +13 -0
  12. package/dist/components/SeparatedInfo/index.d.ts +1 -0
  13. package/dist/components/index.d.ts +2 -0
  14. package/dist/editor.js +40 -36
  15. package/dist/hooks/index.d.ts +1 -0
  16. package/dist/hooks/useInfiniteScroll/index.d.ts +1 -0
  17. package/dist/hooks/useInfiniteScroll/useInfiniteScroll.d.ts +33 -0
  18. package/dist/hooks/useInfiniteScroll/useInfiniteScroll.js +20 -0
  19. package/dist/icons.js +294 -292
  20. package/dist/index.js +86 -78
  21. package/dist/modules/comments/components/Comment.js +5 -3
  22. package/dist/modules/comments/components/CommentList.js +1 -1
  23. package/dist/modules/comments/constants.d.ts +4 -0
  24. package/dist/modules/comments/constants.js +2 -1
  25. package/dist/modules/comments/provider/CommentProvider.js +2 -1
  26. package/dist/modules/comments/types.d.ts +4 -0
  27. package/dist/modules/editor/components/Editor/EditorPreview.d.ts +14 -0
  28. package/dist/modules/editor/components/Editor/EditorPreview.js +56 -0
  29. package/dist/modules/editor/components/Editor/EditorPreviewSkeleton.d.ts +8 -0
  30. package/dist/modules/editor/components/Editor/EditorPreviewSkeleton.js +24 -0
  31. package/dist/modules/editor/components/Editor/index.d.ts +2 -0
  32. package/dist/modules/icons/components/IconClockAlert.d.ts +7 -0
  33. package/dist/modules/icons/components/IconClockAlert.js +17 -0
  34. package/dist/modules/icons/components/index.d.ts +1 -0
  35. package/dist/modules/multimedia/FileCard/FileCard.js +1 -1
  36. package/dist/modules/multimedia/FileCard/FileIcon.js +1 -1
  37. package/dist/utilities/index.d.ts +1 -0
  38. package/dist/utilities/react-query/index.d.ts +1 -0
  39. package/dist/utilities/react-query/react-query-utils.d.ts +21 -0
  40. package/dist/utilities/react-query/react-query-utils.js +13 -0
  41. package/package.json +6 -6
package/dist/index.js CHANGED
@@ -63,52 +63,55 @@ import { default as default62 } from "./hooks/useHasWorkflow/useHasWorkflow.js";
63
63
  import { default as default63 } from "./hooks/useHover/useHover.js";
64
64
  import { useHttpErrorToast } from "./hooks/useHttpErrorToast/useHttpErrorToast.js";
65
65
  import { default as default64 } from "./hooks/useImage/useImage.js";
66
- import { default as default65 } from "./hooks/useIsAdml/useIsAdml.js";
67
- import { default as default66 } from "./hooks/useIsAdmc/useIsAdmc.js";
68
- import { default as default67 } from "./hooks/useIsAdmlcOrAdmc/useIsAdmlcOrAdmc.js";
69
- import { default as default68 } from "./hooks/useKeyPress/useKeyPress.js";
70
- import { default as default69 } from "./hooks/useLibraryUrl/useLibraryUrl.js";
71
- import { default as default70 } from "./hooks/useMediaLibrary/useMediaLibrary.js";
72
- import { default as default71 } from "./hooks/useScrollToTop/useScrollToTop.js";
73
- import { default as default72 } from "./hooks/useTitle/useTitle.js";
74
- import { default as default73 } from "./hooks/useToast/useToast.js";
75
- import { default as default74 } from "./hooks/useToggle/useToggle.js";
76
- import { default as default75 } from "./hooks/useTrapFocus/useTrapFocus.js";
77
- import { default as default76 } from "./hooks/useTrashedResource/useTrashedResource.js";
78
- import { default as default77 } from "./hooks/useUpload/useUpload.js";
79
- import { default as default78 } from "./hooks/useUploadFiles/useUploadFiles.js";
80
- import { default as default79 } from "./hooks/useUser/useUser.js";
81
- import { default as default80 } from "./hooks/useWorkspaceFile/useWorkspaceFile.js";
82
- import { default as default81 } from "./hooks/useWorkspaceFolders/useWorkspaceFolders.js";
83
- import { WORKSPACE_SHARED_FOLDER_ID, WORKSPACE_USER_FOLDER_ID, default as default82 } from "./hooks/useWorkspaceFolders/useWorkspaceFoldersTree.js";
84
- import { default as default83 } from "./hooks/useWorkspaceSearch/useWorkspaceSearch.js";
85
- import { default as default84 } from "./hooks/useXitiTrackPageLoad/useXitiTrackPageLoad.js";
86
- import { default as default85 } from "./hooks/useZendeskGuide/useZendeskGuide.js";
87
- import { default as default86 } from "./modules/modals/ConfirmModal/ConfirmModal.js";
88
- import { default as default87 } from "./modules/modals/OnboardingModal/OnboardingModal.js";
89
- import { default as default88 } from "./modules/modals/PublishModal/PublishModal.js";
90
- import { default as default89 } from "./modules/modals/ResourceModal/apps/BlogPublic.js";
91
- import { default as default90 } from "./modules/modals/ResourceModal/hooks/useUpdateMutation.js";
92
- import { default as default91 } from "./modules/modals/ShareModal/ShareModal.js";
93
- import { default as default92 } from "./modules/modals/ShareModal/apps/ShareBlog.js";
94
- import { default as default93 } from "./modules/modals/ShareModal/hooks/useShareMutation.js";
95
- import { default as default94 } from "./modules/multimedia/AudioRecorder/AudioRecorder.js";
96
- import { default as default95 } from "./modules/multimedia/Embed/Embed.js";
97
- import { default as default96 } from "./modules/multimedia/ImageEditor/components/ImageEditor.js";
98
- import { default as default97 } from "./modules/multimedia/ImagePicker/ImagePicker.js";
99
- import { default as default98 } from "./modules/multimedia/FileCard/FileCard.js";
100
- import { default as default99 } from "./modules/multimedia/MediaLibrary/MediaLibrary.js";
101
- import { default as default100 } from "./modules/multimedia/VideoEmbed/VideoEmbed.js";
102
- import { default as default101 } from "./modules/multimedia/VideoRecorder/VideoRecorder.js";
103
- import { default as default102 } from "./modules/multimedia/Workspace/Workspace.js";
104
- import { default as default103 } from "./modules/multimedia/WorkspaceFolders/WorkspaceFolders.js";
66
+ import { default as default65 } from "./hooks/useInfiniteScroll/useInfiniteScroll.js";
67
+ import { default as default66 } from "./hooks/useIsAdml/useIsAdml.js";
68
+ import { default as default67 } from "./hooks/useIsAdmc/useIsAdmc.js";
69
+ import { default as default68 } from "./hooks/useIsAdmlcOrAdmc/useIsAdmlcOrAdmc.js";
70
+ import { default as default69 } from "./hooks/useKeyPress/useKeyPress.js";
71
+ import { default as default70 } from "./hooks/useLibraryUrl/useLibraryUrl.js";
72
+ import { default as default71 } from "./hooks/useMediaLibrary/useMediaLibrary.js";
73
+ import { default as default72 } from "./hooks/useScrollToTop/useScrollToTop.js";
74
+ import { default as default73 } from "./hooks/useTitle/useTitle.js";
75
+ import { default as default74 } from "./hooks/useToast/useToast.js";
76
+ import { default as default75 } from "./hooks/useToggle/useToggle.js";
77
+ import { default as default76 } from "./hooks/useTrapFocus/useTrapFocus.js";
78
+ import { default as default77 } from "./hooks/useTrashedResource/useTrashedResource.js";
79
+ import { default as default78 } from "./hooks/useUpload/useUpload.js";
80
+ import { default as default79 } from "./hooks/useUploadFiles/useUploadFiles.js";
81
+ import { default as default80 } from "./hooks/useUser/useUser.js";
82
+ import { default as default81 } from "./hooks/useWorkspaceFile/useWorkspaceFile.js";
83
+ import { default as default82 } from "./hooks/useWorkspaceFolders/useWorkspaceFolders.js";
84
+ import { WORKSPACE_SHARED_FOLDER_ID, WORKSPACE_USER_FOLDER_ID, default as default83 } from "./hooks/useWorkspaceFolders/useWorkspaceFoldersTree.js";
85
+ import { default as default84 } from "./hooks/useWorkspaceSearch/useWorkspaceSearch.js";
86
+ import { default as default85 } from "./hooks/useXitiTrackPageLoad/useXitiTrackPageLoad.js";
87
+ import { default as default86 } from "./hooks/useZendeskGuide/useZendeskGuide.js";
88
+ import { default as default87 } from "./modules/modals/ConfirmModal/ConfirmModal.js";
89
+ import { default as default88 } from "./modules/modals/OnboardingModal/OnboardingModal.js";
90
+ import { default as default89 } from "./modules/modals/PublishModal/PublishModal.js";
91
+ import { default as default90 } from "./modules/modals/ResourceModal/apps/BlogPublic.js";
92
+ import { default as default91 } from "./modules/modals/ResourceModal/hooks/useUpdateMutation.js";
93
+ import { default as default92 } from "./modules/modals/ShareModal/ShareModal.js";
94
+ import { default as default93 } from "./modules/modals/ShareModal/apps/ShareBlog.js";
95
+ import { default as default94 } from "./modules/modals/ShareModal/hooks/useShareMutation.js";
96
+ import { default as default95 } from "./modules/multimedia/AudioRecorder/AudioRecorder.js";
97
+ import { default as default96 } from "./modules/multimedia/Embed/Embed.js";
98
+ import { default as default97 } from "./modules/multimedia/ImageEditor/components/ImageEditor.js";
99
+ import { default as default98 } from "./modules/multimedia/ImagePicker/ImagePicker.js";
100
+ import { default as default99 } from "./modules/multimedia/FileCard/FileCard.js";
101
+ import { default as default100 } from "./modules/multimedia/MediaLibrary/MediaLibrary.js";
102
+ import { default as default101 } from "./modules/multimedia/VideoEmbed/VideoEmbed.js";
103
+ import { default as default102 } from "./modules/multimedia/VideoRecorder/VideoRecorder.js";
104
+ import { default as default103 } from "./modules/multimedia/Workspace/Workspace.js";
105
+ import { default as default104 } from "./modules/multimedia/WorkspaceFolders/WorkspaceFolders.js";
105
106
  import { AccessiblePalette, DefaultPalette } from "./components/ColorPicker/ColorPalette.js";
107
+ import { Divider } from "./components/Divider/Divider.js";
106
108
  import { DropzoneContext, useDropzoneContext } from "./components/Dropzone/DropzoneContext.js";
107
109
  import { Column, Grid } from "./components/Grid/Grid.js";
108
110
  import { Layout } from "./components/Layout/Layout.js";
109
111
  import { List } from "./components/List/List.js";
110
112
  import { Menu } from "./components/Menu/components/Menu.js";
111
113
  import { Popover, PopoverBody, PopoverFooter, PopoverHeader } from "./components/Popover/Popover.js";
114
+ import { SeparatedInfo } from "./components/SeparatedInfo/SeparatedInfo.js";
112
115
  import { Tabs } from "./components/Tabs/components/Tabs.js";
113
116
  import { Toolbar } from "./components/Toolbar/Toolbar.js";
114
117
  import { useTreeSortable } from "./components/Tree/hooks/useTreeSortable.js";
@@ -129,6 +132,7 @@ import { useEdificeTheme } from "./providers/EdificeThemeProvider/EdificeThemePr
129
132
  import { MockedProvider } from "./providers/MockedProvider/MockedProvider.js";
130
133
  import { checkUserRight } from "./utilities/check-user-rights/check-user-rights.js";
131
134
  import { emptyScreenMapping } from "./utilities/emptyscreen-mapping/emptyscreen-mapping.js";
135
+ import { invalidateQueriesWithFirstPage } from "./utilities/react-query/react-query-utils.js";
132
136
  import { mergeRefs, setRef } from "./utilities/refs/ref.js";
133
137
  export {
134
138
  AccessiblePalette,
@@ -137,11 +141,11 @@ export {
137
141
  default4 as AppHeader,
138
142
  default5 as AppIcon,
139
143
  default6 as Attachment,
140
- default94 as AudioRecorder,
144
+ default95 as AudioRecorder,
141
145
  default7 as Avatar,
142
146
  default8 as AvatarGroup,
143
147
  default9 as Badge,
144
- default89 as BlogPublic,
148
+ default90 as BlogPublic,
145
149
  default10 as Breadcrumb,
146
150
  default11 as Button,
147
151
  default38 as ButtonSkeleton,
@@ -151,8 +155,9 @@ export {
151
155
  default17 as ColorPickerItem,
152
156
  Column,
153
157
  default18 as Combobox,
154
- default86 as ConfirmModal,
158
+ default87 as ConfirmModal,
155
159
  DefaultPalette,
160
+ Divider,
156
161
  DndTree,
157
162
  default19 as Dropdown,
158
163
  default20 as Dropzone,
@@ -161,10 +166,10 @@ export {
161
166
  EdificeClientProvider,
162
167
  EdificeThemeContext,
163
168
  EdificeThemeProvider,
164
- default95 as Embed,
169
+ default96 as Embed,
165
170
  default21 as EmptyScreen,
166
171
  ExternalLinker,
167
- default98 as FileCard,
172
+ default99 as FileCard,
168
173
  default22 as Flex,
169
174
  default24 as FormControl,
170
175
  default23 as FormText,
@@ -172,8 +177,8 @@ export {
172
177
  default25 as Heading,
173
178
  default12 as IconButton,
174
179
  default26 as Image,
175
- default96 as ImageEditor,
176
- default97 as ImagePicker,
180
+ default97 as ImageEditor,
181
+ default98 as ImagePicker,
177
182
  default27 as Input,
178
183
  InternalLinker,
179
184
  default28 as Label,
@@ -182,25 +187,26 @@ export {
182
187
  default29 as Loading,
183
188
  default30 as LoadingScreen,
184
189
  default31 as Logo,
185
- default99 as MediaLibrary,
190
+ default100 as MediaLibrary,
186
191
  Menu,
187
192
  MockedProvider,
188
193
  default32 as Modal,
189
- default87 as OnboardingModal,
194
+ default88 as OnboardingModal,
190
195
  Popover,
191
196
  PopoverBody,
192
197
  PopoverFooter,
193
198
  PopoverHeader,
194
199
  default33 as PreventPropagation,
195
- default88 as PublishModal,
200
+ default89 as PublishModal,
196
201
  default34 as Radio,
197
202
  default35 as RadioCard,
198
203
  ResourceModal,
199
204
  default36 as SearchBar,
200
205
  default13 as SearchButton,
201
206
  default37 as Select,
202
- default92 as ShareBlog,
203
- default91 as ShareModal,
207
+ SeparatedInfo,
208
+ default93 as ShareBlog,
209
+ default92 as ShareModal,
204
210
  default46 as SortableTree,
205
211
  default40 as StackedGroup,
206
212
  default41 as Stepper,
@@ -215,13 +221,13 @@ export {
215
221
  TreeNode,
216
222
  TreeNodeFolderWrapper,
217
223
  default48 as TreeView,
218
- default100 as VideoEmbed,
219
- default101 as VideoRecorder,
224
+ default101 as VideoEmbed,
225
+ default102 as VideoRecorder,
220
226
  default49 as VisuallyHidden,
221
227
  WORKSPACE_SHARED_FOLDER_ID,
222
228
  WORKSPACE_USER_FOLDER_ID,
223
- default102 as Workspace,
224
- default103 as WorkspaceFolders,
229
+ default103 as Workspace,
230
+ default104 as WorkspaceFolders,
225
231
  addNode,
226
232
  arrayUnique,
227
233
  buildTree,
@@ -243,6 +249,7 @@ export {
243
249
  getIndicesToUpdate,
244
250
  getProjection,
245
251
  hasChildren,
252
+ invalidateQueriesWithFirstPage,
246
253
  mergeRefs,
247
254
  modifyNode,
248
255
  moveNode,
@@ -269,30 +276,31 @@ export {
269
276
  default63 as useHover,
270
277
  useHttpErrorToast,
271
278
  default64 as useImage,
272
- default66 as useIsAdmc,
273
- default65 as useIsAdml,
274
- default67 as useIsAdmlcOrAdmc,
275
- default68 as useKeyPress,
276
- default69 as useLibraryUrl,
277
- default70 as useMediaLibrary,
278
- default71 as useScrollToTop,
279
- default93 as useShareMutation,
280
- default72 as useTitle,
281
- default73 as useToast,
282
- default74 as useToggle,
283
- default75 as useTrapFocus,
284
- default76 as useTrashedResource,
279
+ default65 as useInfiniteScroll,
280
+ default67 as useIsAdmc,
281
+ default66 as useIsAdml,
282
+ default68 as useIsAdmlcOrAdmc,
283
+ default69 as useKeyPress,
284
+ default70 as useLibraryUrl,
285
+ default71 as useMediaLibrary,
286
+ default72 as useScrollToTop,
287
+ default94 as useShareMutation,
288
+ default73 as useTitle,
289
+ default74 as useToast,
290
+ default75 as useToggle,
291
+ default76 as useTrapFocus,
292
+ default77 as useTrashedResource,
285
293
  useTreeSortable,
286
294
  useTreeView,
287
- default90 as useUpdateMutation,
288
- default77 as useUpload,
289
- default78 as useUploadFiles,
290
- default79 as useUser,
291
- default80 as useWorkspaceFile,
292
- default81 as useWorkspaceFolders,
293
- default82 as useWorkspaceFoldersTree,
294
- default83 as useWorkspaceSearch,
295
- default84 as useXitiTrackPageLoad,
296
- default85 as useZendeskGuide,
295
+ default91 as useUpdateMutation,
296
+ default78 as useUpload,
297
+ default79 as useUploadFiles,
298
+ default80 as useUser,
299
+ default81 as useWorkspaceFile,
300
+ default82 as useWorkspaceFolders,
301
+ default83 as useWorkspaceFoldersTree,
302
+ default84 as useWorkspaceSearch,
303
+ default85 as useXitiTrackPageLoad,
304
+ default86 as useZendeskGuide,
297
305
  wrapTreeNode
298
306
  };
@@ -8,9 +8,9 @@ import { BadgeProfile } from "./BadgeProfile.js";
8
8
  import { CommentAvatar } from "./CommentAvatar.js";
9
9
  import { CommentDate } from "./CommentDate.js";
10
10
  import { CommentTitle } from "./CommentTitle.js";
11
- import { TextCounter } from "./TextCounter.js";
12
11
  import { CommentDeleted } from "./CommentDeleted.js";
13
12
  import { CommentReplies } from "./CommentReplies.js";
13
+ import { TextCounter } from "./TextCounter.js";
14
14
  import Button from "../../../components/Button/Button.js";
15
15
  import LoadingScreen from "../../../components/LoadingScreen/LoadingScreen.js";
16
16
  const DeleteModal = /* @__PURE__ */ lazy(() => import("./DeleteModal.js")), Comment = ({
@@ -41,6 +41,8 @@ const DeleteModal = /* @__PURE__ */ lazy(() => import("./DeleteModal.js")), Comm
41
41
  handleReplyToComment
42
42
  } = useCommentsContext(), replies = (defaultComments == null ? void 0 : defaultComments.filter((comm) => comm.replyTo === comment.id)) ?? [], hasReplies = replies.length > 0, hasAllDeletedReplies = replies.every((reply) => reply.deleted), isEditing = editCommentId === comment.id, handleChangeContent = (event) => {
43
43
  resizeTextarea(), setValue(event.target.value);
44
+ }, handleDeleteComment = (id2) => {
45
+ onDeleteComment(id2), setIsDeleteModalOpen(!1);
44
46
  };
45
47
  return /* @__PURE__ */ jsxs(Fragment, { children: [
46
48
  comment.deleted && hasReplies && !hasAllDeletedReplies && /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -73,7 +75,7 @@ const DeleteModal = /* @__PURE__ */ lazy(() => import("./DeleteModal.js")), Comm
73
75
  whiteSpace: "pre-line"
74
76
  }, children: content }),
75
77
  type === "edit" && /* @__PURE__ */ jsxs("div", { className: "ms-n8", children: [
76
- !replyTo && /* @__PURE__ */ jsx(Button, { variant: "ghost", color: "tertiary", size: "sm", onClick: () => handleReplyToComment(comment.id), children: t("comment.reply") }),
78
+ !(replyTo || options.disableReply) && /* @__PURE__ */ jsx(Button, { variant: "ghost", color: "tertiary", size: "sm", onClick: () => handleReplyToComment(comment.id), children: t("comment.reply") }),
77
79
  userId === authorId && /* @__PURE__ */ jsx(Button, { variant: "ghost", color: "tertiary", size: "sm", onClick: () => {
78
80
  handleModifyComment(comment.id), setValue(content);
79
81
  }, children: t("comment.edit") }),
@@ -83,7 +85,7 @@ const DeleteModal = /* @__PURE__ */ lazy(() => import("./DeleteModal.js")), Comm
83
85
  ] })
84
86
  ] }, id),
85
87
  /* @__PURE__ */ jsx(CommentReplies, { parentComment: comment }),
86
- /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(LoadingScreen, { position: !1 }), children: isDeleteModalOpen && /* @__PURE__ */ jsx(DeleteModal, { isOpen: isDeleteModalOpen, onCancel: () => setIsDeleteModalOpen(!1), onSuccess: () => onDeleteComment(id) }) })
88
+ /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(LoadingScreen, { position: !1 }), children: isDeleteModalOpen && /* @__PURE__ */ jsx(DeleteModal, { isOpen: isDeleteModalOpen, onCancel: () => setIsDeleteModalOpen(!1), onSuccess: () => handleDeleteComment(id) }) })
87
89
  ] })
88
90
  ] });
89
91
  };
@@ -14,7 +14,7 @@ function CommentList() {
14
14
  const {
15
15
  authorId
16
16
  } = comment, profile = ((_a = profiles == null ? void 0 : profiles.find((user2) => (user2 == null ? void 0 : user2.userId) === authorId)) == null ? void 0 : _a.profile) ?? "Guest";
17
- return /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Comment, { comment, profile, userId: user == null ? void 0 : user.userId }) }, comment.id);
17
+ return /* @__PURE__ */ jsx("div", { id: `comment-${comment.id}`, children: /* @__PURE__ */ jsx(Comment, { comment, profile, userId: user == null ? void 0 : user.userId }) }, comment.id);
18
18
  });
19
19
  }
20
20
  export {
@@ -22,3 +22,7 @@ export declare const DEFAULT_MAX_REPLIES = 5;
22
22
  * Number of comments to add when adding more comment in the limited list
23
23
  */
24
24
  export declare const DEFAULT_ADD_REPLIES = 5;
25
+ /**
26
+ * Forbid replying to a comment. Defaults to false.
27
+ */
28
+ export declare const DEFAULT_DISABLE_REPLY = false;
@@ -1,7 +1,8 @@
1
- const DEFAULT_MAX_COMMENT_LENGTH = 200, DEFAULT_MAX_REPLY_LENGTH = 200, DEFAULT_MAX_COMMENTS = 4, DEFAULT_ADD_COMMENTS = 5, DEFAULT_MAX_REPLIES = 5, DEFAULT_ADD_REPLIES = 5;
1
+ const DEFAULT_MAX_COMMENT_LENGTH = 200, DEFAULT_MAX_REPLY_LENGTH = 200, DEFAULT_MAX_COMMENTS = 4, DEFAULT_ADD_COMMENTS = 5, DEFAULT_MAX_REPLIES = 5, DEFAULT_ADD_REPLIES = 5, DEFAULT_DISABLE_REPLY = !1;
2
2
  export {
3
3
  DEFAULT_ADD_COMMENTS,
4
4
  DEFAULT_ADD_REPLIES,
5
+ DEFAULT_DISABLE_REPLY,
5
6
  DEFAULT_MAX_COMMENTS,
6
7
  DEFAULT_MAX_COMMENT_LENGTH,
7
8
  DEFAULT_MAX_REPLIES,
@@ -3,7 +3,7 @@ import { useMemo } from "react";
3
3
  import { CommentForm } from "../components/CommentForm.js";
4
4
  import { CommentHeader } from "../components/CommentHeader.js";
5
5
  import { CommentList } from "../components/CommentList.js";
6
- import { DEFAULT_ADD_REPLIES, DEFAULT_MAX_REPLIES, DEFAULT_ADD_COMMENTS, DEFAULT_MAX_COMMENTS, DEFAULT_MAX_REPLY_LENGTH, DEFAULT_MAX_COMMENT_LENGTH } from "../constants.js";
6
+ import { DEFAULT_DISABLE_REPLY, DEFAULT_ADD_REPLIES, DEFAULT_MAX_REPLIES, DEFAULT_ADD_COMMENTS, DEFAULT_MAX_COMMENTS, DEFAULT_MAX_REPLY_LENGTH, DEFAULT_MAX_COMMENT_LENGTH } from "../constants.js";
7
7
  import { CommentContext } from "../context/Context.js";
8
8
  import { useComments } from "../hooks/useComments.js";
9
9
  import Button from "../../../components/Button/Button.js";
@@ -20,6 +20,7 @@ const CommentProvider = ({
20
20
  additionalComments: DEFAULT_ADD_COMMENTS,
21
21
  maxReplies: DEFAULT_MAX_REPLIES,
22
22
  additionalReplies: DEFAULT_ADD_REPLIES,
23
+ disableReply: DEFAULT_DISABLE_REPLY,
23
24
  ...commentOptions
24
25
  }, {
25
26
  type
@@ -104,6 +104,10 @@ export type CommentOptions = {
104
104
  * Number of replies to load additionally in the limited list
105
105
  */
106
106
  additionalReplies: number;
107
+ /**
108
+ * Forbid replying to a comment. Defaults to false.
109
+ */
110
+ disableReply: boolean;
107
111
  };
108
112
  export interface UserProfileResult {
109
113
  /**
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Editor component properties
3
+ */
4
+ export interface EditorPreviewProps {
5
+ /** Rich content to render. */
6
+ content: string;
7
+ /** Display with or without a border */
8
+ variant?: 'outline' | 'ghost';
9
+ onDetailClick?: () => void;
10
+ onMediaClick?: () => void;
11
+ maxMediaDisplayed?: number;
12
+ }
13
+ declare const EditorPreview: ({ content, variant, onDetailClick, onMediaClick, maxMediaDisplayed, }: EditorPreviewProps) => import("react/jsx-runtime").JSX.Element;
14
+ export default EditorPreview;
@@ -0,0 +1,56 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { useState, useEffect } from "react";
3
+ import clsx from "clsx";
4
+ import { getThumbnail } from "@edifice.io/utilities";
5
+ import { useTranslation } from "react-i18next";
6
+ import Image from "../../../../components/Image/Image.js";
7
+ const EditorPreview = ({
8
+ content,
9
+ variant = "outline",
10
+ onDetailClick,
11
+ onMediaClick,
12
+ maxMediaDisplayed = 3
13
+ }) => {
14
+ const {
15
+ t
16
+ } = useTranslation(), [summaryContent, setSummaryContent] = useState(""), [medias, setMedias] = useState([]), borderClass = clsx(variant === "outline" && "border rounded-3 py-12 px-16"), hasMediaCallback = onDetailClick || onMediaClick, handleMediaClick = (e) => {
17
+ onMediaClick && (e.stopPropagation(), onMediaClick());
18
+ };
19
+ return useEffect(() => {
20
+ const contentHTML = content;
21
+ if (contentHTML) {
22
+ const doc = new DOMParser().parseFromString(contentHTML, "text/html"), mediaElements = Array.from(doc.querySelectorAll("img, video, iframe, audio, embed"));
23
+ setMedias(mediaElements.filter((el) => el.tagName.toLowerCase() === "img").map((el) => {
24
+ const image = el;
25
+ return image.src ? {
26
+ url: getThumbnail(image.src, 0, 300),
27
+ alt: image.alt
28
+ } : {
29
+ url: "",
30
+ alt: ""
31
+ };
32
+ })), mediaElements.forEach((el) => {
33
+ var _a;
34
+ return (_a = el.parentNode) == null ? void 0 : _a.removeChild(el);
35
+ }), setSummaryContent(doc.body.textContent || "");
36
+ }
37
+ }, [content]), /* @__PURE__ */ jsxs("div", { className: borderClass, "data-testid": "editor-preview", onClick: onDetailClick, tabIndex: onDetailClick ? -1 : void 0, role: onDetailClick ? "button" : void 0, children: [
38
+ /* @__PURE__ */ jsx("div", { className: "flex-fill text-truncate text-truncate-2 post-preview-content overflow-hidden", style: {
39
+ overflowWrap: "anywhere"
40
+ }, children: summaryContent }),
41
+ /* @__PURE__ */ jsx("div", { onClick: handleMediaClick, tabIndex: hasMediaCallback ? -1 : void 0, role: hasMediaCallback ? "button" : void 0, className: "d-flex align-items-center justify-content-center gap-24 px-32 pt-16", children: medias.slice(0, maxMediaDisplayed).map((media, index) => /* @__PURE__ */ jsxs("div", { className: clsx("position-relative col-12 col-md-4 ", {
42
+ "d-none d-md-block": index >= 1
43
+ }), children: [
44
+ /* @__PURE__ */ jsx(Image, { alt: media.alt, objectFit: "cover", ratio: "16", className: "rounded", loading: "lazy", src: media.url, sizes: "" }),
45
+ (index === 0 || index === 2) && medias.length - (index + 1) > 0 && /* @__PURE__ */ jsx("div", { className: clsx("position-absolute top-0 bottom-0 start-0 end-0 d-flex justify-content-center align-items-center rounded text-light bg-dark bg-opacity-50", {
46
+ "d-flex d-md-none": index === 0,
47
+ "d-none d-md-flex": index === 2
48
+ }), children: t("editor.preview.moreMedia", {
49
+ mediaCount: medias.length - (index + 1)
50
+ }) })
51
+ ] }, media.url)) })
52
+ ] });
53
+ };
54
+ export {
55
+ EditorPreview as default
56
+ };
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Editor component properties
3
+ */
4
+ export interface EditorPreviewSkeletonProps {
5
+ variant?: 'outline' | 'ghost';
6
+ }
7
+ declare const EditorPreview: ({ variant }: EditorPreviewSkeletonProps) => import("react/jsx-runtime").JSX.Element;
8
+ export default EditorPreview;
@@ -0,0 +1,24 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import clsx from "clsx";
3
+ import TextSkeleton from "../../../../components/Skeleton/TextSkeleton.js";
4
+ import Image from "../../../../components/Image/Image.js";
5
+ const EditorPreview = ({
6
+ variant = "outline"
7
+ }) => {
8
+ const borderClass = clsx(variant === "outline" && "border rounded-3"), contentClass = clsx("mt-16", variant === "outline" && "my-12 mx-16");
9
+ return /* @__PURE__ */ jsx("div", { className: borderClass, "data-testid": "editor-preview", children: /* @__PURE__ */ jsxs("div", { className: contentClass, children: [
10
+ /* @__PURE__ */ jsx(TextSkeleton, { className: "col-12" }),
11
+ /* @__PURE__ */ jsx(TextSkeleton, { className: "col-12" }),
12
+ /* @__PURE__ */ jsxs("div", { className: "d-flex justify-content-center gap-24 px-32 pt-16", children: [
13
+ /* @__PURE__ */ jsx("div", { style: {
14
+ maxWidth: "150px"
15
+ }, className: "col-12 col-md-4", children: /* @__PURE__ */ jsx(Image, { alt: "", objectFit: "cover", ratio: "16", className: "rounded placeholder", src: "", sizes: "" }) }),
16
+ /* @__PURE__ */ jsx("div", { style: {
17
+ maxWidth: "150px"
18
+ }, className: "col-12 col-md-4", children: /* @__PURE__ */ jsx(Image, { alt: "", objectFit: "cover", ratio: "16", className: "rounded placeholder", src: "", sizes: "" }) })
19
+ ] })
20
+ ] }) });
21
+ };
22
+ export {
23
+ EditorPreview as default
24
+ };
@@ -1,3 +1,5 @@
1
1
  export * from './Editor';
2
2
  export { default as Editor } from './Editor';
3
+ export { default as EditorPreview } from './EditorPreview';
4
+ export { default as EditorPreviewSkeleton } from './EditorPreviewSkeleton';
3
5
  export { default as EditorSkeleton } from './EditorSkeleton';
@@ -0,0 +1,7 @@
1
+ import { SVGProps } from 'react';
2
+ interface SVGRProps {
3
+ title?: string;
4
+ titleId?: string;
5
+ }
6
+ declare const SvgIconClockAlert: ({ title, titleId, ...props }: SVGProps<SVGSVGElement> & SVGRProps) => import("react/jsx-runtime").JSX.Element;
7
+ export default SvgIconClockAlert;
@@ -0,0 +1,17 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ const SvgIconClockAlert = ({
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__ */ jsxs("g", { fill: "currentColor", clipPath: "url(#icon-clock-alert_svg__a)", children: [
9
+ /* @__PURE__ */ jsx("path", { d: "M0 10.075C0 4.51 4.51 0 10.075 0c4.573 0 8.431 3.046 9.663 7.217a1 1 0 0 1-1.918.566A8.075 8.075 0 1 0 7.783 17.82a1 1 0 0 1-.566 1.918C3.046 18.506 0 14.648 0 10.075" }),
10
+ /* @__PURE__ */ jsx("path", { d: "M10.075 4.108a1 1 0 0 1 1 1v5.43a1 1 0 0 1-.357.767L7.83 13.728a1 1 0 1 1-1.286-1.532l2.53-2.123V5.108a1 1 0 0 1 1-1M17 13.3a1 1 0 0 1 1 1v2.2a1 1 0 1 1-2 0v-2.2a1 1 0 0 1 1-1M17 18.4a1 1 0 1 0 0 2h.006a1 1 0 1 0 0-2z" }),
11
+ /* @__PURE__ */ jsx("path", { fillRule: "evenodd", d: "M17 10a7 7 0 1 0 0 14 7 7 0 0 0 0-14m-5 7a5 5 0 1 1 10 0 5 5 0 0 1-10 0", clipRule: "evenodd" })
12
+ ] }),
13
+ /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx("clipPath", { id: "icon-clock-alert_svg__a", children: /* @__PURE__ */ jsx("path", { fill: "#fff", d: "M0 0h24v24H0z" }) }) })
14
+ ] });
15
+ export {
16
+ SvgIconClockAlert as default
17
+ };
@@ -24,6 +24,7 @@ export { default as IconCantoo } from './IconCantoo';
24
24
  export { default as IconCenter } from './IconCenter';
25
25
  export { default as IconCheck } from './IconCheck';
26
26
  export { default as IconChecklist } from './IconChecklist';
27
+ export { default as IconClockAlert } from './IconClockAlert';
27
28
  export { default as IconClock } from './IconClock';
28
29
  export { default as IconCloseFullScreen } from './IconCloseFullScreen';
29
30
  export { default as IconClose } from './IconClose';
@@ -82,7 +82,7 @@ const FileCard = ({
82
82
  };
83
83
  return roleMappings[type2] || roleMappings.unknown;
84
84
  }
85
- const roleMap = getRoleMap(type ?? "unknown"), file = clsx("file position-relative rounded", (roleMap == null ? void 0 : roleMap.color) ?? "bg-yellow-200"), mediaSrc = doc.eType === "resource" ? doc.thumbnail : type === "img" || type === "video" ? odeServices.workspace().getThumbnailUrl(doc) : null, hasThumbnail = useThumbnail(mediaSrc, {
85
+ const roleMap = getRoleMap(type ?? "unknown"), file = clsx("file position-relative rounded", (roleMap == null ? void 0 : roleMap.color) ?? "bg-yellow-200"), mediaSrc = type === "img" || type === "video" ? odeServices.workspace().getThumbnailUrl(doc) : null, hasThumbnail = useThumbnail(mediaSrc, {
86
86
  ref
87
87
  }), imageStyles = hasThumbnail && {
88
88
  backgroundImage: `url(${mediaSrc})`,
@@ -5,7 +5,7 @@ const FileIcon = ({
5
5
  type,
6
6
  roleMap
7
7
  }) => {
8
- const hasShadow = typeof (roleMap == null ? void 0 : roleMap.icon) != "string" && type !== "unknown" && (roleMap == null ? void 0 : roleMap.hasShadow) !== !1, fileicon = clsx("position-absolute rounded-circle top-50 start-50 translate-middle", {
8
+ const hasShadow = typeof (roleMap == null ? void 0 : roleMap.icon) != "string" && type !== "unknown" && (roleMap == null ? void 0 : roleMap.hasShadow) !== !1, fileicon = clsx("position-absolute top-50 start-50 translate-middle", {
9
9
  "p-12 rounded-circle shadow": hasShadow
10
10
  }, roleMap == null ? void 0 : roleMap.color);
11
11
  return /* @__PURE__ */ jsx("div", { className: fileicon, children: (roleMap == null ? void 0 : roleMap.icon) ?? /* @__PURE__ */ jsx(SvgIconPaperclip, {}) });
@@ -1,3 +1,4 @@
1
1
  export * from './check-user-rights';
2
2
  export * from './emptyscreen-mapping';
3
+ export * from './react-query';
3
4
  export * from './refs';
@@ -0,0 +1 @@
1
+ export * from './react-query-utils';
@@ -0,0 +1,21 @@
1
+ import { InvalidateQueryFilters, QueryClient } from '../../node_modules/@tanstack/react-query';
2
+ /**
3
+ * Invalidates queries and resets infinite query data to only contain the first page.
4
+ *
5
+ * This utility function is useful when you want to invalidate a query but also ensure
6
+ * that any infinite query data is reset to show only the first page, removing any
7
+ * previously loaded subsequent pages.
8
+ *
9
+ * @param queryClient - The TanStack Query client instance used to manage queries
10
+ * @param options - The invalidate query filters that specify which queries to invalidate
11
+ * @returns The result of the invalidateQueries operation, or undefined if no queryKey is provided
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * // Invalidate user queries and reset to first page only
16
+ * invalidateQueriesWithFirstPage(queryClient, {
17
+ * queryKey: ['users']
18
+ * });
19
+ * ```
20
+ */
21
+ export declare function invalidateQueriesWithFirstPage(queryClient: QueryClient, options: InvalidateQueryFilters): Promise<void> | undefined;
@@ -0,0 +1,13 @@
1
+ function invalidateQueriesWithFirstPage(queryClient, options) {
2
+ if (options.queryKey)
3
+ return queryClient.setQueriesData({
4
+ queryKey: options.queryKey
5
+ }, (oldData) => oldData != null && oldData.pages ? {
6
+ ...oldData,
7
+ pages: [oldData.pages[0]],
8
+ pageParams: [oldData.pageParams[0]]
9
+ } : oldData), queryClient.invalidateQueries(options);
10
+ }
11
+ export {
12
+ invalidateQueriesWithFirstPage
13
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edifice.io/react",
3
- "version": "2.4.2-develop-pedago.20251118152821",
3
+ "version": "2.4.2-develop-b2school-actualites.20251119110458",
4
4
  "description": "Edifice React Library",
5
5
  "keywords": [
6
6
  "react",
@@ -131,9 +131,9 @@
131
131
  "react-slugify": "^3.0.3",
132
132
  "swiper": "^10.1.0",
133
133
  "ua-parser-js": "^1.0.36",
134
- "@edifice.io/bootstrap": "2.4.2-develop-pedago.20251118152821",
135
- "@edifice.io/tiptap-extensions": "2.4.2-develop-pedago.20251118152821",
136
- "@edifice.io/utilities": "2.4.2-develop-pedago.20251118152821"
134
+ "@edifice.io/bootstrap": "2.4.2-develop-b2school-actualites.20251119110458",
135
+ "@edifice.io/utilities": "2.4.2-develop-b2school-actualites.20251119110458",
136
+ "@edifice.io/tiptap-extensions": "2.4.2-develop-b2school-actualites.20251119110458"
137
137
  },
138
138
  "devDependencies": {
139
139
  "@babel/plugin-transform-react-pure-annotations": "^7.23.3",
@@ -164,8 +164,8 @@
164
164
  "vite": "^5.4.11",
165
165
  "vite-plugin-dts": "^4.1.0",
166
166
  "vite-tsconfig-paths": "^5.0.1",
167
- "@edifice.io/client": "2.4.2-develop-pedago.20251118152821",
168
- "@edifice.io/config": "2.4.2-develop-pedago.20251118152821"
167
+ "@edifice.io/client": "2.4.2-develop-b2school-actualites.20251119110458",
168
+ "@edifice.io/config": "2.4.2-develop-b2school-actualites.20251119110458"
169
169
  },
170
170
  "peerDependencies": {
171
171
  "@react-spring/web": "^9.7.5",