@bigbinary/neeto-folders-frontend 2.0.37 → 2.0.39

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 (34) hide show
  1. package/dist/.ready +1 -1
  2. package/dist/cjs/components.js +47 -92
  3. package/dist/cjs/components.js.map +1 -1
  4. package/dist/cjs/hooks.js +3 -3
  5. package/dist/cjs/utils.js +3 -3
  6. package/dist/cjs/v2/components.js +1860 -0
  7. package/dist/cjs/v2/components.js.map +1 -0
  8. package/dist/components.js +36 -81
  9. package/dist/components.js.map +1 -1
  10. package/dist/hooks.js +3 -3
  11. package/dist/{index-BkzhP3-H.js → index-BfobK2xL.js} +2 -2
  12. package/dist/{index-BkzhP3-H.js.map → index-BfobK2xL.js.map} +1 -1
  13. package/dist/{index-Dn0REquw.js → index-BuO0HoGs.js} +2 -2
  14. package/dist/{index-Dn0REquw.js.map → index-BuO0HoGs.js.map} +1 -1
  15. package/dist/inject-css-Bkrn7lFS.js +77 -0
  16. package/dist/inject-css-Bkrn7lFS.js.map +1 -0
  17. package/dist/inject-css-D3Ee0dJK.js +82 -0
  18. package/dist/inject-css-D3Ee0dJK.js.map +1 -0
  19. package/dist/{internal-DKHdgJas.js → internal-DAkDv0P1.js} +3 -3
  20. package/dist/internal-DAkDv0P1.js.map +1 -0
  21. package/dist/{internal-DUPKoXC_.js → internal-UIifJzTd.js} +2 -2
  22. package/dist/internal-UIifJzTd.js.map +1 -0
  23. package/dist/{useFolderActions-B_2AW8DZ.js → useFolderActions-DCKQrv0G.js} +3 -2
  24. package/dist/useFolderActions-DCKQrv0G.js.map +1 -0
  25. package/dist/{useFolderActions-DHvX75jy.js → useFolderActions-DImaQ3gr.js} +3 -2
  26. package/dist/useFolderActions-DImaQ3gr.js.map +1 -0
  27. package/dist/utils.js +3 -3
  28. package/dist/v2/components.js +1851 -0
  29. package/dist/v2/components.js.map +1 -0
  30. package/package.json +27 -18
  31. package/dist/internal-DKHdgJas.js.map +0 -1
  32. package/dist/internal-DUPKoXC_.js.map +0 -1
  33. package/dist/useFolderActions-B_2AW8DZ.js.map +0 -1
  34. package/dist/useFolderActions-DHvX75jy.js.map +0 -1
@@ -0,0 +1,1851 @@
1
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
2
+ import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
3
+ import { shallow } from 'zustand/shallow';
4
+ import { Alert, Sheet, Spinner, Typography, RadioGroup, Button, Toastr, Checkbox, Tree } from '@bigbinary/neeto-atoms';
5
+ import { useQueryClient } from '@tanstack/react-query';
6
+ import { useQueryParams, useStateWithDependency } from '@bigbinary/neeto-commons-frontend/v2/react-utils';
7
+ import { buildUrl, showThumbsUpToastr } from '@bigbinary/neeto-commons-frontend/v2/utils';
8
+ import { Trans } from 'react-i18next';
9
+ import { useHistory, Link, NavLink } from 'react-router-dom';
10
+ import { c as useFolderStore, d as useDestroyFolder, b as useFolders, e as useFetchFolders, f as useCreateFolder, g as useUpdateFolder, h as useReorderFolders, D as DEFAULT_CONFIG, u as useFolder, a as useFolderActions } from '../useFolderActions-DCKQrv0G.js';
11
+ import { u as useTranslation, R as REORDER_TREE_INDENT_WIDTH, c as closestCenter, n } from '../inject-css-Bkrn7lFS.js';
12
+ import { QUERY_KEYS } from '../constants.js';
13
+ import { p as pathToFolder, t as treeToMap, m as measureDepth, a as mapToTree, b as mapToSortedTree } from '../index-BfobK2xL.js';
14
+ import { a as isActiveFolder, g as getActiveFolderId, t as toastApiError, i as isArray } from '../internal-UIifJzTd.js';
15
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
16
+ import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
17
+ import React, { createElement, useMemo, forwardRef, useState, useEffect, useId, useRef, startTransition } from 'react';
18
+ import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
19
+ import _regeneratorRuntime from '@babel/runtime/regenerator';
20
+ import { Textarea, Switch, Input, Form, ActionBlock, TreeSelect as TreeSelect$1 } from '@bigbinary/neeto-atoms/formik';
21
+ import { t } from 'i18next';
22
+ import { object, string } from 'yup';
23
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
24
+ import useHotkeys from '@bigbinary/neeto-hotkeys';
25
+ import { hyphenate, isNotPresent, noop, isNotEmpty } from '@bigbinary/neeto-cist';
26
+ import { isEmpty, assoc } from 'ramda';
27
+ import classNames from 'classnames';
28
+ import { useDraggable, useDroppable, DndContext, DragOverlay, useSensors, useSensor, PointerSensor } from '@dnd-kit/core';
29
+ import { GripVertical, Lock, Plus } from 'lucide-react';
30
+ import { createPortal } from 'react-dom';
31
+ import { snapCenterToCursor } from '@dnd-kit/modifiers';
32
+ import MoreDropdown from '@bigbinary/neeto-molecules/v2/MoreDropdown';
33
+ import { useFormikContext } from 'formik';
34
+ import '@bigbinary/neeto-commons-frontend/react-utils';
35
+ import 'zustand';
36
+
37
+ function ownKeys$l(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
38
+ function _objectSpread$l(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$l(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$l(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
39
+ var FoldersAlerts = function FoldersAlerts(_ref) {
40
+ var config = _ref.config;
41
+ var _useFolderStore = useFolderStore(function (store) {
42
+ return {
43
+ setFolderState: store["setFolderState"]
44
+ };
45
+ }, shallow),
46
+ setFolderState = _useFolderStore.setFolderState;
47
+ var queryParams = useQueryParams({
48
+ toCamelCase: false
49
+ });
50
+ var queryClient = useQueryClient();
51
+ var history = useHistory();
52
+ var _useTranslation = useTranslation(config),
53
+ t = _useTranslation.t;
54
+ var _useFolderStore2 = useFolderStore(function (store) {
55
+ var _store$alertState, _store$alertState2;
56
+ return {
57
+ type: (_store$alertState = store["alertState"]) === null || _store$alertState === void 0 ? void 0 : _store$alertState["type"],
58
+ item: (_store$alertState2 = store["alertState"]) === null || _store$alertState2 === void 0 ? void 0 : _store$alertState2["item"]
59
+ };
60
+ }, shallow),
61
+ type = _useFolderStore2.type,
62
+ item = _useFolderStore2.item;
63
+ var _useDestroyFolder = useDestroyFolder(config),
64
+ destroyFolder = _useDestroyFolder.mutateAsync,
65
+ isPending = _useDestroyFolder.isPending;
66
+ var _useFolders = useFolders(config),
67
+ folders = _useFolders.folders;
68
+ var onClose = function onClose() {
69
+ return setFolderState({
70
+ alertState: null
71
+ });
72
+ };
73
+ var alertProps = {
74
+ isOpen: !!type,
75
+ isSubmitting: isPending,
76
+ onClose: onClose
77
+ };
78
+ var onConfirmDelete = function onConfirmDelete() {
79
+ var onSuccess = function onSuccess() {
80
+ var _config$onUpdateSucce;
81
+ var isActive = isActiveFolder(config, item.sid);
82
+ // Invalidates items and folder details. Refetch only if not active folder.
83
+ var invalidationKeys = [].concat(_toConsumableArray(config.invalidationKeys), [[QUERY_KEYS.FOLDERS, config.type, QUERY_KEYS.DETAILS]]);
84
+ invalidationKeys.forEach(function (queryKey) {
85
+ queryClient.invalidateQueries({
86
+ refetchType: isActive ? "none" : "active",
87
+ queryKey: queryKey
88
+ });
89
+ });
90
+ if (isActive && folders) {
91
+ var path = pathToFolder(folders, item.id);
92
+ var parent = path[path.length - 2];
93
+ var redirectUrl = parent ? buildUrl(config.folderPath, _objectSpread$l(_objectSpread$l({}, queryParams), {}, {
94
+ folderId: parent.sid
95
+ })) : "/";
96
+ history.replace(redirectUrl);
97
+ }
98
+ (_config$onUpdateSucce = config.onUpdateSuccess) === null || _config$onUpdateSucce === void 0 || _config$onUpdateSucce.call(config);
99
+ };
100
+ destroyFolder(item.id, {
101
+ onSuccess: onSuccess,
102
+ onSettled: onClose
103
+ });
104
+ };
105
+ if (type === "delete") {
106
+ alertProps.title = t("deleteFolder.title");
107
+ alertProps.message = /*#__PURE__*/jsx(Trans, {
108
+ i18nKey: "deleteFolder.info",
109
+ values: item
110
+ });
111
+ if (config.customizeAlerts) config.customizeAlerts(type, item, alertProps);
112
+ alertProps.onSubmit = onConfirmDelete;
113
+ }
114
+ return /*#__PURE__*/jsx(Alert, _objectSpread$l({}, alertProps));
115
+ };
116
+
117
+ var FORM_VALIDATION_SCHEMA = object().shape({
118
+ name: string().required(t("errors.blank", {
119
+ entity: t("common.name")
120
+ }))
121
+ });
122
+
123
+ var _excluded$7 = ["type"];
124
+ function ownKeys$k(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
125
+ function _objectSpread$k(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$k(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$k(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
126
+ var typeComponentMap = {
127
+ string: Input,
128
+ "boolean": Switch,
129
+ textarea: Textarea
130
+ };
131
+ var ExtraAttributes = function ExtraAttributes(_ref) {
132
+ var attributes = _ref.attributes;
133
+ if (!Array.isArray(attributes)) return null;
134
+ return attributes.map(function (_ref2) {
135
+ var type = _ref2.type,
136
+ rest = _objectWithoutProperties(_ref2, _excluded$7);
137
+ var Component = typeComponentMap[type];
138
+ if (!Component) return null;
139
+ return /*#__PURE__*/createElement(Component, _objectSpread$k(_objectSpread$k({}, rest), {}, {
140
+ key: rest.name
141
+ }));
142
+ });
143
+ };
144
+
145
+ var createInitialValues = function createInitialValues(defaults, extraAttrs) {
146
+ var values = {
147
+ name: "",
148
+ parentId: defaults.parentId || null
149
+ };
150
+ extraAttrs === null || extraAttrs === void 0 || extraAttrs.forEach(function (_ref) {
151
+ var name = _ref.name,
152
+ defaultValue = _ref.defaultValue;
153
+ values[name] = defaultValue;
154
+ });
155
+ return values;
156
+ };
157
+ var createPayload = function createPayload(values, extraAttrs) {
158
+ var payload = {
159
+ name: values.name,
160
+ parentId: values.parentId || ""
161
+ };
162
+ extraAttrs === null || extraAttrs === void 0 || extraAttrs.forEach(function (_ref2) {
163
+ var name = _ref2.name;
164
+ payload[name] = values[name];
165
+ });
166
+ return payload;
167
+ };
168
+ var filterExtraAttributes = function filterExtraAttributes(attributes, isEditing) {
169
+ if (!attributes || !Array.isArray(attributes)) return [];
170
+ return attributes.filter(function (attribute) {
171
+ if (isEditing) {
172
+ return attribute.isEditAttribute !== false;
173
+ }
174
+ return attribute.isCreateAttribute !== false;
175
+ });
176
+ };
177
+
178
+ var AddEditPane = function AddEditPane(_ref) {
179
+ var _config$addEditValida;
180
+ var setFocusField = _ref.setFocusField,
181
+ config = _ref.config,
182
+ onClose = _ref.onClose,
183
+ folderSid = _ref.folderSid;
184
+ var _useTranslation = useTranslation(config),
185
+ t = _useTranslation.t;
186
+ var _useFolderStore = useFolderStore(function (store) {
187
+ var _store$paneState, _store$paneState2;
188
+ return {
189
+ type: (_store$paneState = store["paneState"]) === null || _store$paneState === void 0 ? void 0 : _store$paneState["type"],
190
+ item: (_store$paneState2 = store["paneState"]) === null || _store$paneState2 === void 0 ? void 0 : _store$paneState2["item"]
191
+ };
192
+ }, shallow),
193
+ type = _useFolderStore.type,
194
+ item = _useFolderStore.item;
195
+ var _useFolderStore2 = useFolderStore(function (store) {
196
+ return {
197
+ setFolderState: store["setFolderState"]
198
+ };
199
+ }, shallow),
200
+ setFolderState = _useFolderStore2.setFolderState;
201
+ var _useFetchFolders = useFetchFolders(config),
202
+ isFetching = _useFetchFolders.isFetching;
203
+ var _useCreateFolder = useCreateFolder(config),
204
+ createFolder = _useCreateFolder.mutate;
205
+ var _useUpdateFolder = useUpdateFolder(config),
206
+ updateFolder = _useUpdateFolder.mutateAsync;
207
+ var isEditing = type === "edit" && item;
208
+ var activeFolderSid = folderSid || getActiveFolderId(config);
209
+ var extraAttributes = config.extraAttributes;
210
+ var filteredExtraAttributes = useMemo(function () {
211
+ return filterExtraAttributes(extraAttributes, isEditing);
212
+ }, [extraAttributes, isEditing]);
213
+ var handleError = function handleError(setStatus, error) {
214
+ var response = error.response;
215
+ if (response && response.data && response.data.errors) {
216
+ setStatus(response.data.errors);
217
+ }
218
+ };
219
+ var onSubmitForm = /*#__PURE__*/function () {
220
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(values, _ref2) {
221
+ var setStatus, payload, reactQueryOptions, config;
222
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
223
+ while (1) switch (_context.prev = _context.next) {
224
+ case 0:
225
+ setStatus = _ref2.setStatus;
226
+ payload = createPayload(values, filteredExtraAttributes);
227
+ reactQueryOptions = {
228
+ onSuccess: function onSuccess(_ref4) {
229
+ var id = _ref4.id,
230
+ sid = _ref4.sid;
231
+ if (isEditing && sid !== item.sid) {
232
+ var newPath = window.location.pathname.replace(activeFolderSid, sid);
233
+ window.location.href = newPath;
234
+ } else if (!isEditing) {
235
+ setFolderState({
236
+ lastCreatedFolderId: id
237
+ });
238
+ }
239
+ showThumbsUpToastr();
240
+ onClose();
241
+ },
242
+ onError: function onError(error) {
243
+ return handleError(setStatus, error);
244
+ }
245
+ };
246
+ config = {
247
+ showToastr: false
248
+ };
249
+ if (!isEditing) {
250
+ _context.next = 9;
251
+ break;
252
+ }
253
+ _context.next = 7;
254
+ return updateFolder({
255
+ id: item.id,
256
+ payload: payload,
257
+ config: config,
258
+ initialSlug: item.sid
259
+ }, reactQueryOptions);
260
+ case 7:
261
+ _context.next = 11;
262
+ break;
263
+ case 9:
264
+ _context.next = 11;
265
+ return createFolder({
266
+ payload: payload,
267
+ config: config
268
+ }, reactQueryOptions);
269
+ case 11:
270
+ case "end":
271
+ return _context.stop();
272
+ }
273
+ }, _callee);
274
+ }));
275
+ return function onSubmitForm(_x, _x2) {
276
+ return _ref3.apply(this, arguments);
277
+ };
278
+ }();
279
+ var initialValues = useMemo(function () {
280
+ return isEditing ? item : createInitialValues({}, filteredExtraAttributes);
281
+ }, [isEditing, item, filteredExtraAttributes]);
282
+ if (isFetching) {
283
+ return /*#__PURE__*/jsx(Sheet.Body, {
284
+ className: "flex items-center justify-center",
285
+ children: /*#__PURE__*/jsx(Spinner, {})
286
+ });
287
+ }
288
+ return /*#__PURE__*/jsxs(Fragment, {
289
+ children: [/*#__PURE__*/jsx(Sheet.Header, {
290
+ children: /*#__PURE__*/jsx(Sheet.Title, {
291
+ children: isEditing ? t("folders.edit") : t("folders.add")
292
+ })
293
+ }), /*#__PURE__*/jsx(Form, {
294
+ className: "flex flex-grow flex-col",
295
+ formikProps: {
296
+ initialValues: initialValues,
297
+ enableReinitialize: true,
298
+ validationSchema: ((_config$addEditValida = config.addEditValidationSchema) === null || _config$addEditValida === void 0 ? void 0 : _config$addEditValida.call(config, isEditing)) || FORM_VALIDATION_SCHEMA,
299
+ onSubmit: onSubmitForm
300
+ },
301
+ children: function children(_ref5) {
302
+ var dirty = _ref5.dirty;
303
+ return /*#__PURE__*/jsxs(Fragment, {
304
+ children: [/*#__PURE__*/jsx(Sheet.Body, {
305
+ className: "pb-6",
306
+ children: /*#__PURE__*/jsxs("div", {
307
+ className: "w-full space-y-5",
308
+ children: [/*#__PURE__*/jsx(Input, {
309
+ required: true,
310
+ label: t("folders.name"),
311
+ name: "name",
312
+ ref: setFocusField
313
+ }), /*#__PURE__*/jsx(ExtraAttributes, {
314
+ attributes: filteredExtraAttributes
315
+ }), /*#__PURE__*/jsxs("div", {
316
+ children: [/*#__PURE__*/jsx(TreeSelect, {
317
+ config: config,
318
+ allowClear: true,
319
+ showSearch: true,
320
+ initialValue: folderSid,
321
+ label: t("createFolder.parentTitle"),
322
+ name: "parentId"
323
+ }), /*#__PURE__*/jsx(Typography, {
324
+ className: "mt-1",
325
+ variant: "body3",
326
+ children: t("createFolder.parentInfo")
327
+ })]
328
+ })]
329
+ })
330
+ }), /*#__PURE__*/jsx(Sheet.Footer, {
331
+ children: /*#__PURE__*/jsx(ActionBlock, {
332
+ cancelButtonProps: {
333
+ onClick: onClose
334
+ },
335
+ submitButtonProps: {
336
+ disabled: !dirty
337
+ }
338
+ })
339
+ })]
340
+ });
341
+ }
342
+ })]
343
+ });
344
+ };
345
+
346
+ var _excluded$6 = ["icon", "itemLabel", "folder", "folderLabel", "depth", "hideTreeIndent", "className", "onClick"];
347
+ function ownKeys$j(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
348
+ function _objectSpread$j(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$j(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$j(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
349
+ var Node$2 = function Node(_ref, ref) {
350
+ var _folder$children$leng, _folder$children;
351
+ var _ref$icon = _ref.icon,
352
+ icon = _ref$icon === void 0 ? null : _ref$icon,
353
+ itemLabel = _ref.itemLabel,
354
+ folder = _ref.folder,
355
+ folderLabel = _ref.folderLabel,
356
+ depth = _ref.depth,
357
+ _ref$hideTreeIndent = _ref.hideTreeIndent,
358
+ hideTreeIndent = _ref$hideTreeIndent === void 0 ? false : _ref$hideTreeIndent,
359
+ className = _ref.className,
360
+ onClick = _ref.onClick,
361
+ rest = _objectWithoutProperties(_ref, _excluded$6);
362
+ var metaInfo = [];
363
+ var childCount = (_folder$children$leng = (_folder$children = folder.children) === null || _folder$children === void 0 ? void 0 : _folder$children.length) !== null && _folder$children$leng !== void 0 ? _folder$children$leng : 0;
364
+ childCount > 0 && metaInfo.push("".concat(childCount, " ").concat(folderLabel).toLowerCase());
365
+ folder.itemCount > 0 && metaInfo.push("".concat(folder.itemCount, " ").concat(itemLabel).toLowerCase());
366
+ return /*#__PURE__*/jsxs("div", {
367
+ className: "flex w-full min-w-0",
368
+ children: [!hideTreeIndent && Array.from({
369
+ length: depth + 1
370
+ }).map(function (_, index) {
371
+ return /*#__PURE__*/jsx("span", {
372
+ className: "border-border relative h-full flex-shrink-0 border-s",
373
+ style: {
374
+ width: REORDER_TREE_INDENT_WIDTH,
375
+ insetInlineStart: Math.round(REORDER_TREE_INDENT_WIDTH / 2)
376
+ },
377
+ children: index === depth && /*#__PURE__*/jsx("span", {
378
+ "aria-hidden": true,
379
+ className: "border-border absolute border-t",
380
+ style: {
381
+ insetInlineStart: 0,
382
+ top: "50%",
383
+ width: Math.round(REORDER_TREE_INDENT_WIDTH / 2)
384
+ }
385
+ })
386
+ }, index);
387
+ }), /*#__PURE__*/jsxs("div", _objectSpread$j(_objectSpread$j({}, _objectSpread$j(_objectSpread$j({}, rest), {}, {
388
+ onClick: onClick,
389
+ ref: ref
390
+ })), {}, {
391
+ "data-testid": "".concat(hyphenate(folder.name), "-folder-node"),
392
+ className: classNames("relative my-1 flex cursor-pointer items-center px-2 py-1", className),
393
+ children: [icon, /*#__PURE__*/jsxs("div", {
394
+ className: "ms-2 flex items-baseline gap-2",
395
+ children: [/*#__PURE__*/jsx(Typography, {
396
+ variant: "body1",
397
+ weight: "medium",
398
+ children: folder.name
399
+ }), metaInfo.length > 0 && /*#__PURE__*/jsx(Typography, {
400
+ className: "text-muted-foreground",
401
+ variant: "body3",
402
+ weight: "normal",
403
+ children: metaInfo.join(" . ")
404
+ })]
405
+ })]
406
+ }))]
407
+ });
408
+ };
409
+ var Node$1 = /*#__PURE__*/forwardRef(Node$2);
410
+
411
+ var _excluded$5 = ["folder", "item", "depth", "maxDepth", "disabled", "config"];
412
+ function ownKeys$i(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
413
+ function _objectSpread$i(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$i(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$i(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
414
+ var _SelectableNode = function SelectableNode(_ref) {
415
+ var _folder$children$leng, _folder$children;
416
+ var folder = _ref.folder,
417
+ item = _ref.item,
418
+ _ref$depth = _ref.depth,
419
+ depth = _ref$depth === void 0 ? 0 : _ref$depth,
420
+ maxDepth = _ref.maxDepth,
421
+ disabled = _ref.disabled,
422
+ config = _ref.config,
423
+ rest = _objectWithoutProperties(_ref, _excluded$5);
424
+ var selection = rest.selection,
425
+ onSelect = rest.onSelect;
426
+ var _useTranslation = useTranslation(config),
427
+ t = _useTranslation.t;
428
+ var isDisabled = disabled || (item === null || item === void 0 ? void 0 : item.id) === folder.id || depth >= maxDepth;
429
+ var itemLabel = config.labels[folder.itemCount > 1 ? "items" : "item"];
430
+ var folderLabel = config.labels[((_folder$children$leng = (_folder$children = folder.children) === null || _folder$children === void 0 ? void 0 : _folder$children.length) !== null && _folder$children$leng !== void 0 ? _folder$children$leng : 0) > 1 ? "folders" : "folder"];
431
+ var renderChildren = function renderChildren() {
432
+ if (isNotPresent(folder.children)) return null;
433
+ return folder.children.map(function (child) {
434
+ return /*#__PURE__*/createElement(_SelectableNode, _objectSpread$i(_objectSpread$i({}, _objectSpread$i(_objectSpread$i({}, rest), {}, {
435
+ config: config,
436
+ item: item,
437
+ maxDepth: maxDepth
438
+ })), {}, {
439
+ depth: depth + 1,
440
+ disabled: isDisabled,
441
+ folder: child,
442
+ key: child.id
443
+ }));
444
+ });
445
+ };
446
+ return /*#__PURE__*/jsxs("div", {
447
+ "aria-disabled": isDisabled,
448
+ title: isDisabled ? t("moveToFolder.notAllowed") : undefined,
449
+ className: classNames("flex flex-col w-full min-w-0", {
450
+ "opacity-60": isDisabled
451
+ }),
452
+ children: [/*#__PURE__*/jsx(Node$1, _objectSpread$i(_objectSpread$i({}, _objectSpread$i(_objectSpread$i({}, rest), {}, {
453
+ depth: depth,
454
+ folder: folder,
455
+ folderLabel: folderLabel,
456
+ itemLabel: itemLabel
457
+ })), {}, {
458
+ icon: /*#__PURE__*/jsx(RadioGroup.Item, {
459
+ readOnly: true,
460
+ checked: selection === folder.id,
461
+ "data-testid": "".concat(hyphenate(folder.name), "-folder-option"),
462
+ name: "move-folder-option"
463
+ }),
464
+ onClick: isDisabled ? noop : function () {
465
+ return onSelect(folder);
466
+ }
467
+ })), renderChildren()]
468
+ });
469
+ };
470
+
471
+ function ownKeys$h(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
472
+ function _objectSpread$h(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$h(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$h(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
473
+ var createTree = function createTree(folders, isRootEnabled) {
474
+ return isRootEnabled ? [{
475
+ name: "/",
476
+ id: null,
477
+ children: folders
478
+ }] : folders;
479
+ };
480
+ var PaneBody = function PaneBody(_ref) {
481
+ var _ref$isRootEnabled = _ref.isRootEnabled,
482
+ isRootEnabled = _ref$isRootEnabled === void 0 ? true : _ref$isRootEnabled,
483
+ item = _ref.item,
484
+ config = _ref.config,
485
+ submitButtonProps = _ref.submitButtonProps,
486
+ cancelButtonProps = _ref.cancelButtonProps,
487
+ removeButtonProps = _ref.removeButtonProps,
488
+ onSubmit = _ref.onSubmit,
489
+ onClose = _ref.onClose,
490
+ onRemove = _ref.onRemove,
491
+ parentId = _ref.parentId;
492
+ var parent = (item === null || item === void 0 ? void 0 : item.parentId) || parentId || null;
493
+ var _useState = useState(parent),
494
+ _useState2 = _slicedToArray(_useState, 2),
495
+ selection = _useState2[0],
496
+ setSelection = _useState2[1];
497
+ var _useFolderStore = useFolderStore(function (store) {
498
+ return {
499
+ setFolderState: store["setFolderState"]
500
+ };
501
+ }, shallow),
502
+ setFolderState = _useFolderStore.setFolderState;
503
+ var _useFetchFolders = useFetchFolders(config),
504
+ _useFetchFolders$data = _useFetchFolders.data,
505
+ folders = _useFetchFolders$data === void 0 ? [] : _useFetchFolders$data,
506
+ isFetching = _useFetchFolders.isFetching;
507
+ var _useTranslation = useTranslation(config),
508
+ t = _useTranslation.t;
509
+ var _useFolderStore2 = useFolderStore(function (store) {
510
+ var _store$paneState;
511
+ return {
512
+ type: (_store$paneState = store["paneState"]) === null || _store$paneState === void 0 ? void 0 : _store$paneState["type"]
513
+ };
514
+ }, shallow),
515
+ type = _useFolderStore2.type;
516
+ var tree = useMemo(function () {
517
+ return createTree(folders, isRootEnabled);
518
+ }, [folders, isRootEnabled]);
519
+ var maxDepth = Number.POSITIVE_INFINITY;
520
+ if (item) {
521
+ // If item is a folder, measure the current depth from current folder to longest leaf.
522
+ var foldersMap = treeToMap(folders);
523
+ var folder = foldersMap[item.id];
524
+ if (folder) {
525
+ var folderDepth = measureDepth(folder) + 1; // +1 for own depth;
526
+ maxDepth = config.maxDepth - folderDepth;
527
+ if (isRootEnabled) maxDepth += 1; // +1 for root folder.
528
+ }
529
+ }
530
+ var onAddFolder = function onAddFolder() {
531
+ setFolderState({
532
+ paneState: {
533
+ type: "add",
534
+ item: null
535
+ }
536
+ });
537
+ };
538
+ var _useFolderStore3 = useFolderStore(function (store) {
539
+ var _store$lastCreatedFol;
540
+ return {
541
+ lastCreatedFolderId: (_store$lastCreatedFol = store["lastCreatedFolderId"]) === null || _store$lastCreatedFol === void 0 ? void 0 : _store$lastCreatedFol["lastCreatedFolderId"]
542
+ };
543
+ }, shallow),
544
+ lastCreatedFolderId = _useFolderStore3.lastCreatedFolderId;
545
+ useEffect(function () {
546
+ if (lastCreatedFolderId == null) return;
547
+ setSelection(lastCreatedFolderId);
548
+ setFolderState({
549
+ lastCreatedFolderId: null
550
+ });
551
+ }, [lastCreatedFolderId]);
552
+ useHotkeys(["command+enter", "enter"], function () {
553
+ return onSubmit(selection);
554
+ }, {
555
+ mode: "global",
556
+ enabled: !!type
557
+ });
558
+ if (isFetching) {
559
+ return /*#__PURE__*/jsx(Sheet.Body, {
560
+ className: "flex items-center justify-center",
561
+ children: /*#__PURE__*/jsx(Spinner, {})
562
+ });
563
+ }
564
+ return /*#__PURE__*/jsxs(Fragment, {
565
+ children: [/*#__PURE__*/jsxs(Sheet.Header, {
566
+ className: "flex items-center justify-between",
567
+ children: [/*#__PURE__*/jsx(Sheet.Title, {
568
+ children: t("moveToFolder.title")
569
+ }), /*#__PURE__*/jsx(Button, {
570
+ className: "me-2",
571
+ "data-testid": "add-new-folder-button",
572
+ label: t("folders.add"),
573
+ variant: "link",
574
+ onClick: onAddFolder
575
+ })]
576
+ }), /*#__PURE__*/jsx(Sheet.Body, {
577
+ className: "pb-6",
578
+ children: tree.map(function (folder) {
579
+ return /*#__PURE__*/createElement(_SelectableNode, {
580
+ config: config,
581
+ folder: folder,
582
+ item: item,
583
+ maxDepth: maxDepth,
584
+ selection: selection,
585
+ disabled: (item === null || item === void 0 ? void 0 : item.id) === folder.id || maxDepth <= 0,
586
+ key: folder.id,
587
+ onSelect: function onSelect(folder) {
588
+ return setSelection(folder.id);
589
+ }
590
+ });
591
+ })
592
+ }), /*#__PURE__*/jsxs(Sheet.Footer, {
593
+ className: "space-x-2",
594
+ children: [/*#__PURE__*/jsxs("div", {
595
+ className: "flex flex-1 space-x-2",
596
+ children: [/*#__PURE__*/jsx(Button, _objectSpread$h(_objectSpread$h({
597
+ label: t("common.save"),
598
+ variant: "default",
599
+ onClick: function onClick() {
600
+ return onSubmit(selection);
601
+ }
602
+ }, submitButtonProps), {}, {
603
+ "data-testid": "save-changes-button",
604
+ disabled: selection === parent || (submitButtonProps === null || submitButtonProps === void 0 ? void 0 : submitButtonProps.disabled)
605
+ })), /*#__PURE__*/jsx(Button, _objectSpread$h(_objectSpread$h({
606
+ label: t("common.cancel"),
607
+ variant: "ghost",
608
+ onClick: onClose
609
+ }, cancelButtonProps), {}, {
610
+ "data-testid": "cancel-button"
611
+ }))]
612
+ }), onRemove && /*#__PURE__*/jsx(Button, _objectSpread$h(_objectSpread$h({
613
+ label: t("moveToFolder.remove"),
614
+ variant: "outline",
615
+ onClick: onRemove
616
+ }, removeButtonProps), {}, {
617
+ "data-testid": "remove-from-folder-button"
618
+ }))]
619
+ })]
620
+ });
621
+ };
622
+
623
+ var MoveFolderPane = function MoveFolderPane(_ref) {
624
+ var config = _ref.config,
625
+ onClose = _ref.onClose;
626
+ var _useFolderStore = useFolderStore(function (store) {
627
+ var _store$paneState;
628
+ return {
629
+ item: (_store$paneState = store["paneState"]) === null || _store$paneState === void 0 ? void 0 : _store$paneState["item"]
630
+ };
631
+ }, shallow),
632
+ item = _useFolderStore.item;
633
+ var _useUpdateFolder = useUpdateFolder(config),
634
+ isPending = _useUpdateFolder.isPending,
635
+ updateFolder = _useUpdateFolder.mutate;
636
+ var onSaveSelection = function onSaveSelection(parentId) {
637
+ var payload = {
638
+ id: item.id,
639
+ parentId: parentId
640
+ };
641
+ updateFolder({
642
+ id: item.id,
643
+ payload: payload,
644
+ config: {
645
+ showToastr: false
646
+ }
647
+ }, {
648
+ onSuccess: function onSuccess() {
649
+ var _config$onUpdateSucce;
650
+ onClose();
651
+ (_config$onUpdateSucce = config.onUpdateSuccess) === null || _config$onUpdateSucce === void 0 || _config$onUpdateSucce.call(config);
652
+ },
653
+ onError: toastApiError
654
+ });
655
+ };
656
+ return /*#__PURE__*/jsx(PaneBody, {
657
+ config: config,
658
+ item: item,
659
+ onClose: onClose,
660
+ submitButtonProps: {
661
+ loading: isPending,
662
+ disabled: isPending
663
+ },
664
+ onSubmit: onSaveSelection
665
+ });
666
+ };
667
+
668
+ var _excluded$4 = ["folder", "depth", "config", "folderLabel", "itemLabel"];
669
+ function ownKeys$g(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
670
+ function _objectSpread$g(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$g(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$g(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
671
+ var _DraggableNode$1 = function DraggableNode(_ref) {
672
+ var folder = _ref.folder,
673
+ _ref$depth = _ref.depth,
674
+ depth = _ref$depth === void 0 ? 0 : _ref$depth,
675
+ config = _ref.config,
676
+ folderLabel = _ref.folderLabel,
677
+ itemLabel = _ref.itemLabel,
678
+ rest = _objectWithoutProperties(_ref, _excluded$4);
679
+ var _useDraggable = useDraggable({
680
+ id: "draggable-item--".concat(folder.id),
681
+ data: folder,
682
+ disabled: depth <= 0
683
+ }),
684
+ isDragging = _useDraggable.isDragging,
685
+ attributes = _useDraggable.attributes,
686
+ listeners = _useDraggable.listeners,
687
+ setDraggableRef = _useDraggable.setNodeRef;
688
+ var _useDroppable = useDroppable({
689
+ id: "droppable-item--".concat(folder.id),
690
+ data: folder,
691
+ disabled: isDragging
692
+ }),
693
+ isOver = _useDroppable.isOver,
694
+ setDroppableRef = _useDroppable.setNodeRef;
695
+ var renderChildren = function renderChildren() {
696
+ if (isNotPresent(folder.children) || isDragging) return null;
697
+ return folder.children.map(function (child) {
698
+ var _child$children$lengt, _child$children;
699
+ return /*#__PURE__*/createElement(_DraggableNode$1, _objectSpread$g(_objectSpread$g({}, _objectSpread$g(_objectSpread$g({}, rest), {}, {
700
+ config: config
701
+ })), {}, {
702
+ depth: depth + 1,
703
+ folder: child,
704
+ itemLabel: config.labels[(child === null || child === void 0 ? void 0 : child.itemCount) > 1 ? "items" : "item"],
705
+ key: child.id,
706
+ folderLabel: config.labels[((_child$children$lengt = child === null || child === void 0 || (_child$children = child.children) === null || _child$children === void 0 ? void 0 : _child$children.length) !== null && _child$children$lengt !== void 0 ? _child$children$lengt : 0) > 1 ? "folders" : "folder"]
707
+ }));
708
+ });
709
+ };
710
+ return /*#__PURE__*/jsxs(Fragment, {
711
+ children: [/*#__PURE__*/jsx(Node$1, _objectSpread$g(_objectSpread$g(_objectSpread$g({}, rest), {}, {
712
+ className: classNames({
713
+ "neeto-ui-rounded-lg hover:bg-muted w-full min-w-0 cursor-move transition-colors": true,
714
+ "bg-muted opacity-50": isDragging,
715
+ "border-primary border": isOver,
716
+ "border border-transparent": !isOver
717
+ })
718
+ }, _objectSpread$g(_objectSpread$g(_objectSpread$g({
719
+ depth: depth,
720
+ folder: folder
721
+ }, attributes), listeners), {}, {
722
+ folderLabel: folderLabel,
723
+ itemLabel: itemLabel
724
+ })), {}, {
725
+ ref: function ref(_ref2) {
726
+ setDroppableRef(_ref2);
727
+ setDraggableRef(_ref2);
728
+ }
729
+ })), renderChildren()]
730
+ });
731
+ };
732
+
733
+ function ownKeys$f(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
734
+ function _objectSpread$f(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$f(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$f(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
735
+ var RearrangeFoldersPane = function RearrangeFoldersPane(_ref) {
736
+ var _tree$children$length, _tree$children, _dragItem$children$le, _dragItem$children;
737
+ var config = _ref.config,
738
+ onClose = _ref.onClose;
739
+ var _useState = useState(null),
740
+ _useState2 = _slicedToArray(_useState, 2),
741
+ dragItem = _useState2[0],
742
+ setDragItem = _useState2[1];
743
+ var _useState3 = useState({}),
744
+ _useState4 = _slicedToArray(_useState3, 2),
745
+ changes = _useState4[0],
746
+ setChanges = _useState4[1];
747
+ var _useTranslation = useTranslation(config),
748
+ t = _useTranslation.t;
749
+ var _useFetchFolders = useFetchFolders(config),
750
+ folders = _useFetchFolders.data,
751
+ isFetching = _useFetchFolders.isFetching;
752
+ var _useReorderFolders = useReorderFolders(config),
753
+ reorderFolders = _useReorderFolders.mutate;
754
+ var _useFolderStore = useFolderStore(function (store) {
755
+ var _store$paneState;
756
+ return {
757
+ type: (_store$paneState = store["paneState"]) === null || _store$paneState === void 0 ? void 0 : _store$paneState["type"]
758
+ };
759
+ }, shallow),
760
+ type = _useFolderStore.type;
761
+ var _useStateWithDependen = useStateWithDependency(function () {
762
+ return {
763
+ name: "/",
764
+ id: null,
765
+ children: folders
766
+ };
767
+ }, [folders]),
768
+ _useStateWithDependen2 = _slicedToArray(_useStateWithDependen, 2),
769
+ tree = _useStateWithDependen2[0],
770
+ setTree = _useStateWithDependen2[1];
771
+ var onDragEnd = function onDragEnd(_ref2) {
772
+ var _activeFolder$meta$pa;
773
+ var active = _ref2.active,
774
+ over = _ref2.over;
775
+ setDragItem(null);
776
+ if (!over) return;
777
+ var foldersMap = treeToMap(tree);
778
+ var activeFolder = foldersMap[active.data.current.id];
779
+ var overFolder = foldersMap[over.data.current.id];
780
+
781
+ // Check moving inside same directory
782
+ if (((_activeFolder$meta$pa = activeFolder.meta.parent) === null || _activeFolder$meta$pa === void 0 ? void 0 : _activeFolder$meta$pa.id) === overFolder.id) return;
783
+
784
+ // Check moving to a folder with depth greater than the allowed limit.
785
+ // maxDepth + 1 due to extra root node added for the tree
786
+ var activeDepth = measureDepth(activeFolder);
787
+ var overDepth = overFolder.meta.depth;
788
+ if (activeDepth + overDepth >= config.maxDepth + 1) {
789
+ Toastr.error(t("moveToFolder.depthExceeded", {
790
+ maxDepth: config.maxDepth
791
+ }));
792
+ return;
793
+ }
794
+ activeFolder.meta.parent = overFolder;
795
+ var newTree = mapToTree(foldersMap);
796
+ setTree(newTree);
797
+ setChanges(assoc(activeFolder.id, overFolder.id));
798
+ };
799
+ var onSubmit = function onSubmit() {
800
+ var payload = {
801
+ changes: changes
802
+ };
803
+ reorderFolders(payload, {
804
+ onSuccess: function onSuccess() {
805
+ var _config$onUpdateSucce;
806
+ onClose();
807
+ (_config$onUpdateSucce = config.onUpdateSuccess) === null || _config$onUpdateSucce === void 0 || _config$onUpdateSucce.call(config);
808
+ }
809
+ });
810
+ };
811
+ useHotkeys(["command+enter", "enter"], onSubmit, {
812
+ mode: "global",
813
+ enabled: !!type
814
+ });
815
+ var nodeProps = {
816
+ icon: /*#__PURE__*/jsx(GripVertical, {
817
+ className: "text-muted-foreground relative -start-[0.3125rem] flex-shrink-0"
818
+ })
819
+ };
820
+ if (isFetching) {
821
+ return /*#__PURE__*/jsx(Sheet.Body, {
822
+ className: "flex items-center justify-center",
823
+ children: /*#__PURE__*/jsx(Spinner, {})
824
+ });
825
+ }
826
+ return /*#__PURE__*/jsxs(Fragment, {
827
+ children: [/*#__PURE__*/jsx(Sheet.Header, {
828
+ children: /*#__PURE__*/jsx(Sheet.Title, {
829
+ children: t("reorderFolder.title")
830
+ })
831
+ }), /*#__PURE__*/jsxs(DndContext, {
832
+ onDragEnd: onDragEnd,
833
+ onDragStart: function onDragStart(_ref3) {
834
+ var active = _ref3.active;
835
+ return setDragItem(active.data.current);
836
+ },
837
+ children: [/*#__PURE__*/jsx(Sheet.Body, {
838
+ className: "pb-6",
839
+ children: /*#__PURE__*/createElement(_DraggableNode$1, _objectSpread$f(_objectSpread$f({}, _objectSpread$f(_objectSpread$f({}, nodeProps), {}, {
840
+ config: config
841
+ })), {}, {
842
+ folder: tree,
843
+ itemLabel: config.labels[(tree === null || tree === void 0 ? void 0 : tree.itemCount) > 1 ? "items" : "item"],
844
+ key: tree.id,
845
+ folderLabel: config.labels[((_tree$children$length = tree === null || tree === void 0 || (_tree$children = tree.children) === null || _tree$children === void 0 ? void 0 : _tree$children.length) !== null && _tree$children$length !== void 0 ? _tree$children$length : 0) > 1 ? "folders" : "folder"]
846
+ }))
847
+ }), /*#__PURE__*/jsxs(Sheet.Footer, {
848
+ className: "gap-2",
849
+ children: [/*#__PURE__*/jsx(Button, {
850
+ disabled: isEmpty(changes),
851
+ label: t("common.save"),
852
+ variant: "default",
853
+ onClick: onSubmit
854
+ }), /*#__PURE__*/jsx(Button, {
855
+ label: t("common.cancel"),
856
+ variant: "ghost",
857
+ onClick: onClose
858
+ })]
859
+ }), /*#__PURE__*/createPortal(/*#__PURE__*/jsx(DragOverlay, {
860
+ zIndex: 99999,
861
+ children: dragItem && /*#__PURE__*/jsx(Node$1, _objectSpread$f(_objectSpread$f({
862
+ hideTreeIndent: true
863
+ }, nodeProps), {}, {
864
+ className: "bg-muted",
865
+ depth: 0,
866
+ folder: dragItem,
867
+ folderLabel: config.labels[((_dragItem$children$le = dragItem === null || dragItem === void 0 || (_dragItem$children = dragItem.children) === null || _dragItem$children === void 0 ? void 0 : _dragItem$children.length) !== null && _dragItem$children$le !== void 0 ? _dragItem$children$le : 0) > 1 ? "folders" : "folder"],
868
+ itemLabel: config.labels[(dragItem === null || dragItem === void 0 ? void 0 : dragItem.itemCount) > 1 ? "items" : "item"]
869
+ }))
870
+ }), document.body)]
871
+ })]
872
+ });
873
+ };
874
+
875
+ var PlaceholderNode = function PlaceholderNode(_ref) {
876
+ var folder = _ref.folder,
877
+ dragState = _ref.dragState;
878
+ var overItem = dragState.overItem;
879
+ var id = useId();
880
+ var isOver = id === (overItem === null || overItem === void 0 ? void 0 : overItem.id);
881
+ var depth = folder.meta.depth + 1;
882
+ var meta = {
883
+ parent: folder,
884
+ index: -1,
885
+ depth: depth
886
+ };
887
+ var _useDroppable = useDroppable({
888
+ id: "droppable-placeholder--".concat(folder.name),
889
+ data: {
890
+ id: id,
891
+ meta: meta
892
+ }
893
+ }),
894
+ setDroppableRef = _useDroppable.setNodeRef;
895
+ return /*#__PURE__*/jsxs("div", {
896
+ className: "flex w-full",
897
+ children: [/*#__PURE__*/jsx("div", {
898
+ style: {
899
+ width: REORDER_TREE_INDENT_WIDTH * (depth + 1)
900
+ }
901
+ }), /*#__PURE__*/jsx("div", {
902
+ ref: setDroppableRef,
903
+ className: classNames({
904
+ "min-w-0 flex-1 transition-colors": true,
905
+ "border-primary border-b-2": isOver
906
+ })
907
+ })]
908
+ });
909
+ };
910
+
911
+ var _excluded$3 = ["folder", "config", "dragState", "folderLabel", "itemLabel"];
912
+ function ownKeys$e(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
913
+ function _objectSpread$e(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$e(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$e(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
914
+ var _DraggableNode = function DraggableNode(_ref) {
915
+ var _overItem$meta$parent;
916
+ var folder = _ref.folder,
917
+ config = _ref.config,
918
+ dragState = _ref.dragState,
919
+ folderLabel = _ref.folderLabel,
920
+ itemLabel = _ref.itemLabel,
921
+ rest = _objectWithoutProperties(_ref, _excluded$3);
922
+ var overItem = dragState.overItem;
923
+ var isOverItem = folder.id === (overItem === null || overItem === void 0 ? void 0 : overItem.id);
924
+ var isOverParent = folder.id === (overItem === null || overItem === void 0 || (_overItem$meta$parent = overItem.meta.parent) === null || _overItem$meta$parent === void 0 ? void 0 : _overItem$meta$parent.id);
925
+ var isRoot = folder.meta.depth <= 0;
926
+ var _useDraggable = useDraggable({
927
+ id: "draggable-item--".concat(folder.id),
928
+ data: folder,
929
+ disabled: isRoot
930
+ }),
931
+ isDragging = _useDraggable.isDragging,
932
+ attributes = _useDraggable.attributes,
933
+ listeners = _useDraggable.listeners,
934
+ setDraggableRef = _useDraggable.setNodeRef;
935
+ var _useDroppable = useDroppable({
936
+ id: "droppable-item--".concat(folder.id),
937
+ data: folder,
938
+ disabled: isRoot || isDragging
939
+ }),
940
+ setDroppableRef = _useDroppable.setNodeRef;
941
+ var renderChildren = function renderChildren() {
942
+ if (isDragging) return null;
943
+ return /*#__PURE__*/jsxs(React.Fragment, {
944
+ children: [/*#__PURE__*/jsx(PlaceholderNode, {
945
+ dragState: dragState,
946
+ folder: folder
947
+ }), isArray(folder.children) && folder.children.map(function (child) {
948
+ var _child$children$lengt, _child$children;
949
+ return /*#__PURE__*/createElement(_DraggableNode, _objectSpread$e(_objectSpread$e({}, _objectSpread$e(_objectSpread$e({}, rest), {}, {
950
+ config: config,
951
+ dragState: dragState
952
+ })), {}, {
953
+ depth: child.meta.depth,
954
+ folder: child,
955
+ itemLabel: config.labels[(child === null || child === void 0 ? void 0 : child.itemCount) > 1 ? "items" : "item"],
956
+ key: child.id,
957
+ folderLabel: config.labels[((_child$children$lengt = child === null || child === void 0 || (_child$children = child.children) === null || _child$children === void 0 ? void 0 : _child$children.length) !== null && _child$children$lengt !== void 0 ? _child$children$lengt : 0) > 1 ? "folders" : "folder"]
958
+ }));
959
+ })]
960
+ }, "".concat(folder.id, "--container"));
961
+ };
962
+ return /*#__PURE__*/jsxs(Fragment, {
963
+ children: [/*#__PURE__*/jsx(Node$1, _objectSpread$e(_objectSpread$e({
964
+ depth: folder.meta.depth
965
+ }, _objectSpread$e(_objectSpread$e(_objectSpread$e(_objectSpread$e({}, rest), {}, {
966
+ folder: folder
967
+ }, attributes), listeners), {}, {
968
+ folderLabel: folderLabel,
969
+ itemLabel: itemLabel
970
+ })), {}, {
971
+ className: classNames({
972
+ "hover:bg-muted w-full cursor-move transition-colors": true,
973
+ "bg-muted opacity-50": isDragging,
974
+ "bg-accent": isOverParent,
975
+ "border-primary border-b-2": isOverItem
976
+ }),
977
+ ref: function ref(_ref2) {
978
+ setDroppableRef(_ref2);
979
+ setDraggableRef(_ref2);
980
+ }
981
+ })), renderChildren()]
982
+ });
983
+ };
984
+
985
+ function ownKeys$d(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
986
+ function _objectSpread$d(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$d(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$d(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
987
+ var initialDragState = {
988
+ activeItem: null,
989
+ overItem: null
990
+ };
991
+ var sensorConfig$1 = {
992
+ activationConstraint: {
993
+ distance: 8
994
+ }
995
+ };
996
+ var measuringConfig = {
997
+ droppable: {
998
+ frequency: 500
999
+ }
1000
+ };
1001
+
1002
+ // Reorder with support for position adjustment
1003
+ var ReorderFoldersPane = function ReorderFoldersPane(_ref) {
1004
+ var _tree$children$length, _tree$children, _dragState$activeItem, _dragState$activeItem2, _dragState$activeItem3;
1005
+ var config = _ref.config,
1006
+ onClose = _ref.onClose;
1007
+ var _useState = useState(initialDragState),
1008
+ _useState2 = _slicedToArray(_useState, 2),
1009
+ dragState = _useState2[0],
1010
+ setDragState = _useState2[1];
1011
+ var _useState3 = useState({}),
1012
+ _useState4 = _slicedToArray(_useState3, 2),
1013
+ changes = _useState4[0],
1014
+ setChanges = _useState4[1];
1015
+ var _useTranslation = useTranslation(config),
1016
+ t = _useTranslation.t;
1017
+ var _useFetchFolders = useFetchFolders(config),
1018
+ folders = _useFetchFolders.data,
1019
+ isFetching = _useFetchFolders.isFetching;
1020
+ var _useReorderFolders = useReorderFolders(config),
1021
+ reorderFolders = _useReorderFolders.mutate;
1022
+ var sensors = useSensors(useSensor(PointerSensor, sensorConfig$1));
1023
+ var _useFolderStore = useFolderStore(function (store) {
1024
+ var _store$paneState;
1025
+ return {
1026
+ type: (_store$paneState = store["paneState"]) === null || _store$paneState === void 0 ? void 0 : _store$paneState["type"]
1027
+ };
1028
+ }, shallow),
1029
+ type = _useFolderStore.type;
1030
+ var _useStateWithDependen = useStateWithDependency(function () {
1031
+ return {
1032
+ name: "/",
1033
+ id: null,
1034
+ children: folders
1035
+ };
1036
+ }, [folders]),
1037
+ _useStateWithDependen2 = _slicedToArray(_useStateWithDependen, 2),
1038
+ baseTree = _useStateWithDependen2[0],
1039
+ setBaseTree = _useStateWithDependen2[1];
1040
+
1041
+ // Decorates tree with meta info. Can be optimized when needed.
1042
+ var tree = useMemo(function () {
1043
+ return mapToSortedTree(treeToMap(baseTree));
1044
+ }, [baseTree]);
1045
+ var onDragEnd = function onDragEnd(_ref2) {
1046
+ var active = _ref2.active,
1047
+ over = _ref2.over;
1048
+ setDragState(initialDragState);
1049
+ if (!over) return;
1050
+ var foldersMap = treeToMap(tree);
1051
+ var activeFolder = foldersMap[active.data.current.id];
1052
+ var targetFolder = foldersMap[over.data.current.meta.parent.id];
1053
+ var targetIndex = over.data.current.meta.index + 1; // `index` starts from -1 with placeholder
1054
+
1055
+ // Guards: Check moving inside invalid directories.
1056
+ if (!targetFolder || activeFolder.id === targetFolder.id) return;
1057
+ if (activeFolder.meta.parent.id === targetFolder.id && activeFolder.meta.index === targetIndex) {
1058
+ return;
1059
+ }
1060
+
1061
+ // Check moving to a folder with depth greater than the allowed limit.
1062
+ // maxDepth + 1 due to extra root node added for the tree
1063
+ var srcDepth = measureDepth(activeFolder);
1064
+ var dstDepth = targetFolder.meta.depth;
1065
+ if (srcDepth + dstDepth >= config.maxDepth + 1) {
1066
+ Toastr.error(t("moveToFolder.depthExceeded", {
1067
+ maxDepth: config.maxDepth
1068
+ }));
1069
+ return;
1070
+ }
1071
+ activeFolder.meta.parent = targetFolder;
1072
+ activeFolder.meta.__index = targetIndex;
1073
+ var newTree = mapToSortedTree(foldersMap);
1074
+ setBaseTree(newTree);
1075
+ setChanges(assoc(activeFolder.id, {
1076
+ parentId: targetFolder.id,
1077
+ index: targetIndex
1078
+ }));
1079
+ };
1080
+ var onSubmit = function onSubmit() {
1081
+ var payload = {
1082
+ changes: changes
1083
+ };
1084
+ reorderFolders(payload, {
1085
+ onSuccess: function onSuccess() {
1086
+ var _config$onUpdateSucce;
1087
+ onClose();
1088
+ (_config$onUpdateSucce = config.onUpdateSuccess) === null || _config$onUpdateSucce === void 0 || _config$onUpdateSucce.call(config);
1089
+ }
1090
+ });
1091
+ };
1092
+ useHotkeys(["command+enter", "enter"], onSubmit, {
1093
+ mode: "global",
1094
+ enabled: !!type
1095
+ });
1096
+ var nodeProps = {
1097
+ icon: /*#__PURE__*/jsx(GripVertical, {
1098
+ className: "text-muted-foreground relative -start-[0.3125rem] flex-shrink-0"
1099
+ })
1100
+ };
1101
+ if (isFetching) {
1102
+ return /*#__PURE__*/jsx(Sheet.Body, {
1103
+ className: "flex items-center justify-center",
1104
+ children: /*#__PURE__*/jsx(Spinner, {})
1105
+ });
1106
+ }
1107
+ return /*#__PURE__*/jsxs(Fragment, {
1108
+ children: [/*#__PURE__*/jsx(Sheet.Header, {
1109
+ children: /*#__PURE__*/jsx(Sheet.Title, {
1110
+ children: t("reorderFolder.title")
1111
+ })
1112
+ }), /*#__PURE__*/jsxs(DndContext, {
1113
+ onDragEnd: onDragEnd,
1114
+ sensors: sensors,
1115
+ collisionDetection: closestCenter(dragState),
1116
+ measuring: measuringConfig,
1117
+ onDragOver: function onDragOver(_ref3) {
1118
+ var over = _ref3.over;
1119
+ setDragState(assoc("overItem", over === null || over === void 0 ? void 0 : over.data.current));
1120
+ },
1121
+ onDragStart: function onDragStart(_ref4) {
1122
+ var active = _ref4.active;
1123
+ setDragState(assoc("activeItem", active.data.current));
1124
+ },
1125
+ children: [/*#__PURE__*/jsx(Sheet.Body, {
1126
+ className: "pb-6",
1127
+ children: /*#__PURE__*/createElement(_DraggableNode, _objectSpread$d(_objectSpread$d({}, _objectSpread$d(_objectSpread$d({}, nodeProps), {}, {
1128
+ config: config,
1129
+ dragState: dragState
1130
+ })), {}, {
1131
+ folder: tree,
1132
+ itemLabel: config.labels[(tree === null || tree === void 0 ? void 0 : tree.itemCount) > 1 ? "items" : "item"],
1133
+ key: tree.id,
1134
+ folderLabel: config.labels[((_tree$children$length = tree === null || tree === void 0 || (_tree$children = tree.children) === null || _tree$children === void 0 ? void 0 : _tree$children.length) !== null && _tree$children$length !== void 0 ? _tree$children$length : 0) > 1 ? "folders" : "folder"]
1135
+ }))
1136
+ }), /*#__PURE__*/jsxs(Sheet.Footer, {
1137
+ className: "gap-2",
1138
+ children: [/*#__PURE__*/jsx(Button, {
1139
+ disabled: isEmpty(changes),
1140
+ label: t("common.save"),
1141
+ variant: "default",
1142
+ onClick: onSubmit
1143
+ }), /*#__PURE__*/jsx(Button, {
1144
+ label: t("common.cancel"),
1145
+ variant: "ghost",
1146
+ onClick: onClose
1147
+ })]
1148
+ }), /*#__PURE__*/createPortal(/*#__PURE__*/jsx(DragOverlay, {
1149
+ zIndex: 99999,
1150
+ children: dragState && /*#__PURE__*/jsx(Node$1, _objectSpread$d(_objectSpread$d({
1151
+ hideTreeIndent: true
1152
+ }, nodeProps), {}, {
1153
+ className: "bg-muted ps-4 pe-12",
1154
+ depth: 0,
1155
+ folder: dragState.activeItem,
1156
+ folderLabel: config.labels[((_dragState$activeItem = (_dragState$activeItem2 = dragState.activeItem) === null || _dragState$activeItem2 === void 0 || (_dragState$activeItem2 = _dragState$activeItem2.children) === null || _dragState$activeItem2 === void 0 ? void 0 : _dragState$activeItem2.length) !== null && _dragState$activeItem !== void 0 ? _dragState$activeItem : 0) > 1 ? "folders" : "folder"],
1157
+ itemLabel: config.labels[((_dragState$activeItem3 = dragState.activeItem) === null || _dragState$activeItem3 === void 0 ? void 0 : _dragState$activeItem3.itemCount) > 1 ? "items" : "item"]
1158
+ }))
1159
+ }), document.body)]
1160
+ })]
1161
+ });
1162
+ };
1163
+
1164
+ var _excluded$2 = ["type"];
1165
+ function ownKeys$c(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
1166
+ function _objectSpread$c(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$c(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$c(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
1167
+ var FoldersPane = function FoldersPane(_ref) {
1168
+ var configProps = _ref.config;
1169
+ var config = _objectSpread$c(_objectSpread$c({}, DEFAULT_CONFIG), configProps);
1170
+ var setFocusField = useRef(null);
1171
+ var _useFolderStore = useFolderStore(function (store) {
1172
+ return {
1173
+ paneState: store["paneState"],
1174
+ setFolderState: store["setFolderState"]
1175
+ };
1176
+ }, shallow),
1177
+ paneState = _useFolderStore.paneState,
1178
+ setFolderState = _useFolderStore.setFolderState;
1179
+ var _ref2 = paneState || {},
1180
+ type = _ref2.type,
1181
+ rest = _objectWithoutProperties(_ref2, _excluded$2);
1182
+ var onClose = function onClose() {
1183
+ return setFolderState({
1184
+ paneState: null
1185
+ });
1186
+ };
1187
+ var commonProps = _objectSpread$c({
1188
+ config: config,
1189
+ onClose: onClose
1190
+ }, rest);
1191
+ var ReorderPaneComponent = config.reorderMode === "reorder" ? ReorderFoldersPane : RearrangeFoldersPane;
1192
+ return /*#__PURE__*/jsxs(Sheet, {
1193
+ onClose: onClose,
1194
+ initialFocusRef: setFocusField,
1195
+ isOpen: !!type,
1196
+ children: [(type === "edit" || type === "add") && /*#__PURE__*/jsx(AddEditPane, _objectSpread$c({}, _objectSpread$c({
1197
+ setFocusField: setFocusField
1198
+ }, commonProps))), type === "move" && /*#__PURE__*/jsx(MoveFolderPane, _objectSpread$c({}, commonProps)), type === "reorder" && /*#__PURE__*/jsx(ReorderPaneComponent, _objectSpread$c({}, commonProps))]
1199
+ });
1200
+ };
1201
+
1202
+ var FoldersContext = function FoldersContext(_ref) {
1203
+ var config = _ref.config,
1204
+ children = _ref.children;
1205
+ return /*#__PURE__*/jsxs(Fragment, {
1206
+ children: [children, /*#__PURE__*/jsx(FoldersPane, {
1207
+ config: config
1208
+ }), /*#__PURE__*/jsx(FoldersAlerts, {
1209
+ config: config
1210
+ })]
1211
+ });
1212
+ };
1213
+
1214
+ function ownKeys$b(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
1215
+ function _objectSpread$b(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$b(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$b(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
1216
+ var FolderTile = function FolderTile(_ref) {
1217
+ var _folder$children$leng, _folder$children, _folder$children$leng2, _folder$children2;
1218
+ var _ref$isPreview = _ref.isPreview,
1219
+ isPreview = _ref$isPreview === void 0 ? false : _ref$isPreview,
1220
+ isSelected = _ref.isSelected,
1221
+ link = _ref.link,
1222
+ folder = _ref.folder,
1223
+ actions = _ref.actions,
1224
+ config = _ref.config,
1225
+ onSelect = _ref.onSelect;
1226
+ var _useTranslation = useTranslation(config),
1227
+ t = _useTranslation.t;
1228
+ var droppable = useDroppable({
1229
+ id: "droppable-item--".concat(folder.id),
1230
+ data: folder,
1231
+ disabled: isPreview
1232
+ });
1233
+ var draggable = useDraggable({
1234
+ id: "draggable-item--".concat(folder.id),
1235
+ data: _objectSpread$b(_objectSpread$b({}, folder), {}, {
1236
+ type: DEFAULT_CONFIG.type
1237
+ }),
1238
+ disabled: isPreview
1239
+ });
1240
+ var actionCallback = function actionCallback(callback) {
1241
+ return function (event) {
1242
+ event.preventDefault();
1243
+ callback(folder);
1244
+ };
1245
+ };
1246
+ var menuItems = [{
1247
+ key: "edit",
1248
+ label: t("common.edit"),
1249
+ onClick: actionCallback(actions.onEdit)
1250
+ }, {
1251
+ key: "move",
1252
+ label: t("common.moveToFolder"),
1253
+ onClick: actionCallback(actions.onMove)
1254
+ }, {
1255
+ key: "delete",
1256
+ label: t("common.delete"),
1257
+ onClick: actionCallback(actions.onDelete)
1258
+ }];
1259
+ var metaInfo = [];
1260
+ var childCount = (_folder$children$leng = (_folder$children = folder.children) === null || _folder$children === void 0 ? void 0 : _folder$children.length) !== null && _folder$children$leng !== void 0 ? _folder$children$leng : 0;
1261
+ var itemLabel = config.labels[folder.itemCount > 1 ? "items" : "item"];
1262
+ var folderLabel = config.labels[((_folder$children$leng2 = (_folder$children2 = folder.children) === null || _folder$children2 === void 0 ? void 0 : _folder$children2.length) !== null && _folder$children$leng2 !== void 0 ? _folder$children$leng2 : 0) > 1 ? "folders" : "folder"];
1263
+ childCount > 0 && metaInfo.push("".concat(childCount, " ").concat(folderLabel).toLowerCase());
1264
+ metaInfo.push("".concat(folder.itemCount || 0, " ").concat(itemLabel).toLowerCase());
1265
+ return /*#__PURE__*/jsxs(Link, _objectSpread$b(_objectSpread$b(_objectSpread$b(_objectSpread$b(_objectSpread$b({
1266
+ "data-testid": "".concat(hyphenate(folder.name), "-folder-tile"),
1267
+ to: link,
1268
+ className: classNames("bg-muted border-border neeto-ui-rounded-md hover:border-primary relative flex max-w-full items-start gap-2 border-2 p-3 transition-colors ease-in", {
1269
+ "bg-accent": droppable.isOver,
1270
+ "opacity-50": draggable.isDragging,
1271
+ "scale-75": isPreview
1272
+ })
1273
+ }, droppable.attributes), droppable.listeners), draggable.attributes), draggable.listeners), {}, {
1274
+ ref: function ref(_ref2) {
1275
+ droppable.setNodeRef(_ref2);
1276
+ draggable.setNodeRef(_ref2);
1277
+ },
1278
+ children: [/*#__PURE__*/jsx(Checkbox, {
1279
+ checked: isSelected,
1280
+ className: "m-0 flex-shrink-0 flex-grow-0 pt-0.5",
1281
+ name: folder.id,
1282
+ onCheckedChange: function onCheckedChange(checked) {
1283
+ return onSelect(folder, checked);
1284
+ },
1285
+ onClick: function onClick(event) {
1286
+ return event.stopPropagation();
1287
+ }
1288
+ }), /*#__PURE__*/jsxs("span", {
1289
+ className: "flex min-w-0 flex-grow flex-col gap-2",
1290
+ children: [/*#__PURE__*/jsx(Typography, {
1291
+ className: "-mt-0.5 line-clamp-2 break-words pe-8",
1292
+ "data-testid": "folder-name",
1293
+ title: folder.name,
1294
+ variant: "body1",
1295
+ weight: "medium",
1296
+ children: folder.name
1297
+ }), /*#__PURE__*/jsx(Typography, {
1298
+ className: "text-muted-foreground",
1299
+ variant: "body3",
1300
+ children: metaInfo.join(" . ")
1301
+ })]
1302
+ }), /*#__PURE__*/jsx(MoreDropdown, {
1303
+ menuItems: menuItems,
1304
+ dropdownButtonProps: {
1305
+ className: "absolute end-2 top-2"
1306
+ },
1307
+ dropdownProps: {
1308
+ onClick: function onClick(event) {
1309
+ return event.preventDefault();
1310
+ }
1311
+ }
1312
+ })]
1313
+ }));
1314
+ };
1315
+
1316
+ var sensorConfig = {
1317
+ activationConstraint: {
1318
+ distance: 8
1319
+ }
1320
+ };
1321
+ var FoldersDnd = function FoldersDnd(_ref) {
1322
+ var config = _ref.config,
1323
+ children = _ref.children,
1324
+ onDropItem = _ref.onDrop,
1325
+ renderItemOverlay = _ref.renderOverlay;
1326
+ var _useState = useState(null),
1327
+ _useState2 = _slicedToArray(_useState, 2),
1328
+ dragItem = _useState2[0],
1329
+ setDragItem = _useState2[1];
1330
+ var _useUpdateFolder = useUpdateFolder(config),
1331
+ updateFolder = _useUpdateFolder.mutate;
1332
+ var sensors = useSensors(useSensor(PointerSensor, sensorConfig));
1333
+ var onDropFolder = function onDropFolder(folder, parent) {
1334
+ if (!folder || !parent || folder.id === parent.id) return;
1335
+ updateFolder({
1336
+ id: folder.id,
1337
+ payload: {
1338
+ id: folder.id,
1339
+ parentId: parent.id
1340
+ },
1341
+ initialSlug: folder.sid,
1342
+ config: {
1343
+ showToastr: false
1344
+ }
1345
+ }, {
1346
+ onError: toastApiError
1347
+ });
1348
+ };
1349
+ var handleDragStart = function handleDragStart(_ref2) {
1350
+ var active = _ref2.active;
1351
+ setDragItem(active.data.current);
1352
+ };
1353
+ var handleDragEnd = function handleDragEnd(_ref3) {
1354
+ var active = _ref3.active,
1355
+ over = _ref3.over;
1356
+ setDragItem(null);
1357
+ if (!active || !over) return;
1358
+ if (active.data.current.type === DEFAULT_CONFIG.type) {
1359
+ onDropFolder(active.data.current, over.data.current);
1360
+ } else onDropItem(active.data.current, over.data.current);
1361
+ };
1362
+ var renderFolderOverlay = function renderFolderOverlay(dragItem) {
1363
+ return /*#__PURE__*/jsx(FolderTile, {
1364
+ config: config,
1365
+ isPreview: true,
1366
+ actions: {},
1367
+ folder: dragItem,
1368
+ onSelect: noop
1369
+ });
1370
+ };
1371
+ return /*#__PURE__*/jsxs(DndContext, {
1372
+ sensors: sensors,
1373
+ onDragEnd: handleDragEnd,
1374
+ onDragStart: handleDragStart,
1375
+ children: [children, /*#__PURE__*/jsx(DragOverlay, {
1376
+ dropAnimation: null,
1377
+ modifiers: [snapCenterToCursor],
1378
+ children: dragItem && (dragItem.type !== DEFAULT_CONFIG.type ? renderItemOverlay(dragItem) : renderFolderOverlay(dragItem))
1379
+ })]
1380
+ });
1381
+ };
1382
+
1383
+ function ownKeys$a(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
1384
+ function _objectSpread$a(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$a(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$a(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
1385
+ var FoldersList = function FoldersList(_ref) {
1386
+ var _ref$selection = _ref.selection,
1387
+ selection = _ref$selection === void 0 ? [] : _ref$selection,
1388
+ configProps = _ref.config,
1389
+ onSelect = _ref.onSelect;
1390
+ var config = _objectSpread$a(_objectSpread$a({}, DEFAULT_CONFIG), configProps);
1391
+ var params = useQueryParams();
1392
+ var _useTranslation = useTranslation(config),
1393
+ t = _useTranslation.t;
1394
+ var _useFolders = useFolders(config),
1395
+ folders = _useFolders.folders;
1396
+ var _useFolder = useFolder(config),
1397
+ folderId = _useFolder.folderId,
1398
+ folder = _useFolder.folder;
1399
+ var actions = useFolderActions(config);
1400
+ var subFolders = folderId ? folder === null || folder === void 0 ? void 0 : folder.children : folders;
1401
+ if (isNotPresent(subFolders) || !Array.isArray(subFolders)) return null;
1402
+ return /*#__PURE__*/jsxs(Fragment, {
1403
+ children: [/*#__PURE__*/jsx(Typography, {
1404
+ className: "my-3",
1405
+ variant: "h4",
1406
+ children: t("folders.title")
1407
+ }), /*#__PURE__*/jsx("div", {
1408
+ className: "neeto-folders-grid-view-wrapper mb-10 grid w-full gap-4",
1409
+ "data-testid": "folders-list",
1410
+ children: subFolders.map(function (folder) {
1411
+ return /*#__PURE__*/createElement(FolderTile, {
1412
+ actions: actions,
1413
+ config: config,
1414
+ folder: folder,
1415
+ onSelect: onSelect,
1416
+ isSelected: selection.includes(folder.id),
1417
+ key: folder.id,
1418
+ link: buildUrl(config.folderPath, _objectSpread$a(_objectSpread$a({}, params), {}, {
1419
+ folderId: folder.sid
1420
+ }))
1421
+ });
1422
+ })
1423
+ })]
1424
+ });
1425
+ };
1426
+
1427
+ function ownKeys$9(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
1428
+ function _objectSpread$9(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$9(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$9(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
1429
+ var DraggableWrapper = function DraggableWrapper(_ref) {
1430
+ var data = _ref.data,
1431
+ _ref$id = _ref.id,
1432
+ id = _ref$id === void 0 ? data.id : _ref$id,
1433
+ children = _ref.children;
1434
+ var draggable = useDraggable({
1435
+ id: "folders-list-draggable-item--".concat(id),
1436
+ data: data
1437
+ });
1438
+ return /*#__PURE__*/jsx("div", _objectSpread$9(_objectSpread$9(_objectSpread$9({
1439
+ className: classNames({
1440
+ "opacity-50": draggable.isDragging
1441
+ })
1442
+ }, draggable.attributes), draggable.listeners), {}, {
1443
+ ref: draggable.setNodeRef,
1444
+ children: children
1445
+ }));
1446
+ };
1447
+
1448
+ var _excluded$1 = ["isOpen", "onClose"];
1449
+ function ownKeys$8(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
1450
+ function _objectSpread$8(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$8(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$8(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
1451
+ var MoveToFolderPane = function MoveToFolderPane(_ref) {
1452
+ var isOpen = _ref.isOpen,
1453
+ onClose = _ref.onClose,
1454
+ rest = _objectWithoutProperties(_ref, _excluded$1);
1455
+ return /*#__PURE__*/jsx(Sheet, {
1456
+ isOpen: isOpen,
1457
+ onClose: onClose,
1458
+ children: /*#__PURE__*/jsx(PaneBody, _objectSpread$8({}, _objectSpread$8(_objectSpread$8({}, rest), {}, {
1459
+ onClose: onClose
1460
+ })))
1461
+ });
1462
+ };
1463
+
1464
+ function ownKeys$7(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
1465
+ function _objectSpread$7(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$7(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$7(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
1466
+ var FolderIcon = function FolderIcon(props) {
1467
+ return /*#__PURE__*/jsx("svg", _objectSpread$7(_objectSpread$7({
1468
+ fill: "none",
1469
+ height: props.size,
1470
+ viewBox: "0 0 16 16",
1471
+ width: props.size,
1472
+ xmlns: "http://www.w3.org/2000/svg"
1473
+ }, props), {}, {
1474
+ children: /*#__PURE__*/jsx("path", {
1475
+ d: "M3.202 12.798h9.6c.882 0 1.6-.717 1.6-1.6v-6c0-.882-.718-1.6-1.6-1.6H9.069a.8.8 0 0 1-.48-.16l-.96-.72a1.6 1.6 0 0 0-.96-.32H3.202c-.883 0-1.6.718-1.6 1.6v7.2c0 .883.717 1.6 1.6 1.6",
1476
+ fill: "currentColor"
1477
+ })
1478
+ }));
1479
+ };
1480
+
1481
+ function ownKeys$6(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
1482
+ function _objectSpread$6(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$6(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$6(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
1483
+ var FolderIconOpen = function FolderIconOpen(props) {
1484
+ return /*#__PURE__*/jsx("svg", _objectSpread$6(_objectSpread$6({
1485
+ fill: "none",
1486
+ height: props.size,
1487
+ viewBox: "0 0 16 16",
1488
+ width: props.size,
1489
+ xmlns: "http://www.w3.org/2000/svg"
1490
+ }, props), {}, {
1491
+ children: /*#__PURE__*/jsx("path", {
1492
+ d: "m2.2 7.24-.59 1.765V4c0-.882.717-1.6 1.6-1.6h3.467c.345 0 .682.113.96.32l.96.72c.137.105.307.16.48.16h2.932c.883 0 1.6.718 1.6 1.6v.4H4.474c-1.032 0-1.95.66-2.277 1.64zm10.544 5.56h-9.47c-.82 0-1.397-.802-1.137-1.58l1.2-3.6c.162-.49.622-.82 1.137-.82h9.47c.82 0 1.398.803 1.138 1.58l-1.2 3.6c-.163.49-.623.82-1.138.82",
1493
+ fill: "currentColor"
1494
+ })
1495
+ }));
1496
+ };
1497
+
1498
+ var Node = function Node(_ref) {
1499
+ var _isActive = _ref.isActive,
1500
+ isExpanded = _ref.isExpanded,
1501
+ node = _ref.node,
1502
+ link = _ref.link,
1503
+ config = _ref.config;
1504
+ var _useTranslation = useTranslation(),
1505
+ t = _useTranslation.t;
1506
+ var isPrivate = node.isPrivate,
1507
+ name = node.name,
1508
+ _node$isFolder = node.isFolder,
1509
+ isFolder = _node$isFolder === void 0 ? true : _node$isFolder;
1510
+ var _ref2 = isFolder ? config.folderActions : config.itemActions,
1511
+ _ref2$getMoreActions = _ref2.getMoreActions,
1512
+ getMoreActions = _ref2$getMoreActions === void 0 ? noop : _ref2$getMoreActions,
1513
+ _ref2$getAddActions = _ref2.getAddActions,
1514
+ getAddActions = _ref2$getAddActions === void 0 ? noop : _ref2$getAddActions;
1515
+ var moreActions = getMoreActions(node) || [];
1516
+ var addActions = getAddActions(node) || [];
1517
+ var hasMoreActions = isNotEmpty(moreActions);
1518
+ var hasAddActions = isNotEmpty(addActions);
1519
+ var hasAnyActions = hasMoreActions || hasAddActions;
1520
+ return /*#__PURE__*/jsx(NavLink, {
1521
+ activeClassName: "active",
1522
+ className: "neeto-sidebar-folders-tree__folder-node",
1523
+ isActive: function isActive() {
1524
+ return _isActive;
1525
+ },
1526
+ to: link,
1527
+ children: /*#__PURE__*/jsxs("div", {
1528
+ className: "flex items-center justify-between w-full group relative",
1529
+ "data-testid": "".concat(hyphenate(name), "-").concat(isFolder ? "folder" : "item", "-sublink"),
1530
+ title: "",
1531
+ children: [isFolder && (isExpanded ? /*#__PURE__*/jsx(FolderIconOpen, {
1532
+ className: "flex-shrink-0 me-1",
1533
+ size: 16
1534
+ }) : /*#__PURE__*/jsx(FolderIcon, {
1535
+ className: "flex-shrink-0 me-1",
1536
+ size: 16
1537
+ })), /*#__PURE__*/jsxs("div", {
1538
+ className: "flex items-center min-w-0 flex-1",
1539
+ children: [/*#__PURE__*/jsx(Typography, {
1540
+ as: "span",
1541
+ className: "line-clamp-1 block truncate ps-0.5",
1542
+ title: name,
1543
+ variant: "body2",
1544
+ children: name
1545
+ }), isPrivate && /*#__PURE__*/jsx("span", {
1546
+ title: t("common.private"),
1547
+ children: /*#__PURE__*/jsx(Lock, {
1548
+ className: "flex-shrink-0 ms-1",
1549
+ size: 16
1550
+ })
1551
+ })]
1552
+ }), hasAnyActions && /*#__PURE__*/jsxs("div", {
1553
+ className: "flex items-center gap-0.5 py-0.5 absolute end-0 top-0 h-full neeto-sidebar-folders-tree__folder-node-actions neeto-ui-rounded-md ps-2",
1554
+ onClick: function onClick(e) {
1555
+ e.preventDefault();
1556
+ e.stopPropagation();
1557
+ },
1558
+ children: [hasAddActions && /*#__PURE__*/jsx(MoreDropdown, {
1559
+ menuItems: addActions,
1560
+ dropdownButtonProps: {
1561
+ icon: Plus,
1562
+ size: "icon",
1563
+ tooltipProps: {
1564
+ content: "Add",
1565
+ position: "top"
1566
+ },
1567
+ className: "opacity-0 group-hover:opacity-100 transition-opacity neeto-sidebar-folders-tree__action-button size-5"
1568
+ }
1569
+ }), hasMoreActions && /*#__PURE__*/jsx(MoreDropdown, {
1570
+ menuItems: moreActions,
1571
+ dropdownButtonProps: {
1572
+ size: "icon",
1573
+ className: "opacity-0 group-hover:opacity-100 transition-opacity neeto-sidebar-folders-tree__action-button size-5"
1574
+ }
1575
+ })]
1576
+ })]
1577
+ })
1578
+ });
1579
+ };
1580
+
1581
+ function ownKeys$5(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
1582
+ function _objectSpread$5(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$5(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$5(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
1583
+ var DownIcon = function DownIcon(props) {
1584
+ return /*#__PURE__*/jsx("svg", _objectSpread$5(_objectSpread$5({
1585
+ fill: "none",
1586
+ height: "6",
1587
+ viewBox: "0 0 6 6",
1588
+ width: "6",
1589
+ xmlns: "http://www.w3.org/2000/svg"
1590
+ }, props), {}, {
1591
+ children: /*#__PURE__*/jsx("path", {
1592
+ d: "M3.803 5.475a.35.35 0 0 1-.606 0l-2.425-4.2A.35.35 0 0 1 1.075.75h4.85a.35.35 0 0 1 .303.525z",
1593
+ fill: "currentColor"
1594
+ })
1595
+ }));
1596
+ };
1597
+
1598
+ function ownKeys$4(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
1599
+ function _objectSpread$4(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$4(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$4(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
1600
+ var RightIcon = function RightIcon(props) {
1601
+ return /*#__PURE__*/jsx("svg", _objectSpread$4(_objectSpread$4({
1602
+ fill: "none",
1603
+ height: "6",
1604
+ viewBox: "0 0 6 6",
1605
+ width: "6",
1606
+ xmlns: "http://www.w3.org/2000/svg"
1607
+ }, props), {}, {
1608
+ children: /*#__PURE__*/jsx("path", {
1609
+ d: "M5.475 2.697a.35.35 0 0 1 0 .606l-4.2 2.425a.35.35 0 0 1-.525-.303V.575a.35.35 0 0 1 .525-.303z",
1610
+ fill: "currentColor"
1611
+ })
1612
+ }));
1613
+ };
1614
+
1615
+ var SwitcherIcon = function SwitcherIcon(_ref) {
1616
+ var expanded = _ref.expanded;
1617
+ return expanded ? /*#__PURE__*/jsx(DownIcon, {
1618
+ className: "relative",
1619
+ size: 16
1620
+ }) : /*#__PURE__*/jsx(RightIcon, {
1621
+ className: "relative",
1622
+ size: 16
1623
+ });
1624
+ };
1625
+
1626
+ function ownKeys$3(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
1627
+ function _objectSpread$3(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$3(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$3(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
1628
+ var splitItemsByFolder = function splitItemsByFolder(items) {
1629
+ return items.reduce(function (acc, item) {
1630
+ var value = _objectSpread$3(_objectSpread$3({}, item), {}, {
1631
+ isFolder: false,
1632
+ isLeaf: true
1633
+ });
1634
+ if (item.folderId) {
1635
+ if (!acc.itemsByFolderId[item.folderId]) {
1636
+ acc.itemsByFolderId[item.folderId] = [];
1637
+ }
1638
+ acc.itemsByFolderId[item.folderId].push(_objectSpread$3({}, value));
1639
+ } else {
1640
+ acc.rootItems.push(value);
1641
+ }
1642
+ return acc;
1643
+ }, {
1644
+ itemsByFolderId: {},
1645
+ rootItems: []
1646
+ });
1647
+ };
1648
+ var _appendItemsToFolders = function appendItemsToFolders(folders, itemsByFolderId) {
1649
+ return folders.map(function (folder) {
1650
+ return _objectSpread$3(_objectSpread$3({}, folder), {}, {
1651
+ isFolder: true,
1652
+ isLeaf: false,
1653
+ children: [].concat(_toConsumableArray(_appendItemsToFolders(folder.children || [], itemsByFolderId)), _toConsumableArray(itemsByFolderId[folder.id] || []))
1654
+ });
1655
+ });
1656
+ };
1657
+ var buildTreeWithItems = function buildTreeWithItems(folders, _ref) {
1658
+ var items = _ref.items;
1659
+ if (!items || !folders) return folders;
1660
+ var _splitItemsByFolder = splitItemsByFolder(items),
1661
+ itemsByFolderId = _splitItemsByFolder.itemsByFolderId,
1662
+ rootItems = _splitItemsByFolder.rootItems;
1663
+ var foldersWithItems = _appendItemsToFolders(folders, itemsByFolderId);
1664
+ return [].concat(_toConsumableArray(foldersWithItems), _toConsumableArray(rootItems));
1665
+ };
1666
+
1667
+ // neeto-atoms Tree (react-arborist based) requires `key`/`title` on every node
1668
+ // and has no `fieldNames` prop, unlike neetoui's antd Tree which used
1669
+ // fieldNames={{ key: "sid" }}. Map them in while preserving the original fields
1670
+ // (sid, link, meta, isFolder, isPrivate, …) so titleRender/onExpand keep working.
1671
+ var _toAtomsTreeData = function toAtomsTreeData() {
1672
+ var nodes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
1673
+ return nodes.map(function (node) {
1674
+ return _objectSpread$3(_objectSpread$3({}, node), {}, {
1675
+ key: node.sid,
1676
+ title: node.name,
1677
+ children: node.children ? _toAtomsTreeData(node.children) : undefined
1678
+ });
1679
+ });
1680
+ };
1681
+
1682
+ function ownKeys$2(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
1683
+ function _objectSpread$2(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$2(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$2(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
1684
+ var FoldersTree = function FoldersTree(_ref) {
1685
+ var configProps = _ref.config;
1686
+ var config = _objectSpread$2(_objectSpread$2({}, DEFAULT_CONFIG), configProps);
1687
+ var _useState = useState(new Set()),
1688
+ _useState2 = _slicedToArray(_useState, 2),
1689
+ expandedKeysSet = _useState2[0],
1690
+ setExpandedKeysSet = _useState2[1];
1691
+ var expandedKeys = Array.from(expandedKeysSet);
1692
+ var _useTranslation = useTranslation(config),
1693
+ t = _useTranslation.t;
1694
+ var params = useQueryParams({
1695
+ toCamelCase: false
1696
+ });
1697
+ var activeFolderSid = getActiveFolderId(config);
1698
+ var _useFetchFolders = useFetchFolders(config),
1699
+ folders = _useFetchFolders.data;
1700
+ var treeData = useMemo(function () {
1701
+ return _toAtomsTreeData(buildTreeWithItems(folders, config));
1702
+ }, [folders, config.items]);
1703
+ var updateExpandedKeys = function updateExpandedKeys() {
1704
+ var _activeFolder$meta;
1705
+ if (!treeData) return;
1706
+ // When active folder changes from external sources, update expanded keys to auto expand tree.
1707
+ var updatedExpandedKeys = new Set(expandedKeysSet);
1708
+ var map = treeToMap(treeData, "sid");
1709
+ var activeFolder = map[activeFolderSid];
1710
+ var parentSid = activeFolder === null || activeFolder === void 0 || (_activeFolder$meta = activeFolder.meta) === null || _activeFolder$meta === void 0 || (_activeFolder$meta = _activeFolder$meta.parent) === null || _activeFolder$meta === void 0 ? void 0 : _activeFolder$meta.sid;
1711
+ if (parentSid && !expandedKeysSet.has(parentSid)) {
1712
+ updatedExpandedKeys.add(parentSid);
1713
+ }
1714
+ };
1715
+ var handleExpand = function handleExpand(keys, _ref2) {
1716
+ var expanded = _ref2.expanded,
1717
+ node = _ref2.node;
1718
+ var keysSet = new Set(keys);
1719
+ if (!expanded) {
1720
+ var _removeChildKeys = function removeChildKeys() {
1721
+ var children = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
1722
+ children.forEach(function (child) {
1723
+ keysSet["delete"](child.sid);
1724
+ _removeChildKeys(child.children);
1725
+ });
1726
+ };
1727
+ _removeChildKeys(node.children);
1728
+ }
1729
+ setExpandedKeysSet(keysSet);
1730
+ };
1731
+ useEffect(function () {
1732
+ // Non urgent update.
1733
+ startTransition(updateExpandedKeys);
1734
+ }, [activeFolderSid, treeData]);
1735
+ if (isNotPresent(treeData)) {
1736
+ return /*#__PURE__*/jsx(Typography, {
1737
+ className: "w-full text-center",
1738
+ variant: "body2",
1739
+ weight: "semibold",
1740
+ children: t("folders.noFolders")
1741
+ });
1742
+ }
1743
+ return /*#__PURE__*/jsx(Tree, {
1744
+ expandedKeys: expandedKeys,
1745
+ treeData: treeData,
1746
+ autoExpandParent: true,
1747
+ blockNode: true,
1748
+ className: "neeto-sidebar-folders-tree",
1749
+ indent: 20,
1750
+ rowHeight: 24,
1751
+ selectedKeys: [activeFolderSid],
1752
+ showLine: false,
1753
+ switcherIcon: SwitcherIcon,
1754
+ titleRender: function titleRender(node) {
1755
+ return /*#__PURE__*/jsx(Node, {
1756
+ config: config,
1757
+ node: node,
1758
+ isActive: node.sid === activeFolderSid,
1759
+ isExpanded: expandedKeysSet.has(node.sid),
1760
+ link: node.link || buildUrl(config.folderPath, _objectSpread$2(_objectSpread$2({}, params), {}, {
1761
+ folderId: node.sid
1762
+ }))
1763
+ });
1764
+ },
1765
+ onExpand: handleExpand
1766
+ });
1767
+ };
1768
+
1769
+ function ownKeys$1(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
1770
+ function _objectSpread$1(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$1(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$1(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
1771
+ // neeto-atoms TreeSelect expects nested treeData ({ key, title, children }) and
1772
+ // has no `treeDataSimpleMode`, unlike neetoui's antd TreeSelect which consumed a
1773
+ // flat list keyed by pId. Build the nested shape directly from the folders tree,
1774
+ // pruning folders at/below maxDepth (and their subtrees).
1775
+ //
1776
+ // Depth is derived structurally from the recursion level (roots = 0), matching
1777
+ // treeToMap/walkTree — the raw `folders` from the API don't carry a computed
1778
+ // `meta.depth`; v1 only had it because it passed the treeToMap'd map.
1779
+ var _createFolderOptions = function createFolderOptions(folders, config) {
1780
+ var depth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
1781
+ if (depth >= config.maxDepth) return [];
1782
+ return (folders !== null && folders !== void 0 ? folders : []).map(function (folder) {
1783
+ var children = _createFolderOptions(folder.children, config, depth + 1);
1784
+ return _objectSpread$1({
1785
+ key: folder.id,
1786
+ title: folder.name
1787
+ }, children.length > 0 && {
1788
+ children: children
1789
+ });
1790
+ });
1791
+ };
1792
+
1793
+ var _excluded = ["label", "name", "placeholder", "disabled", "required", "showSearch", "allowClear", "config", "initialValue"];
1794
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
1795
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
1796
+ var TreeSelect = /*#__PURE__*/forwardRef(function (_ref, ref) {
1797
+ var _ref$label = _ref.label,
1798
+ label = _ref$label === void 0 ? "" : _ref$label,
1799
+ name = _ref.name,
1800
+ _ref$placeholder = _ref.placeholder,
1801
+ placeholder = _ref$placeholder === void 0 ? "" : _ref$placeholder,
1802
+ _ref$disabled = _ref.disabled,
1803
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
1804
+ _ref$required = _ref.required,
1805
+ required = _ref$required === void 0 ? false : _ref$required,
1806
+ _ref$showSearch = _ref.showSearch,
1807
+ showSearch = _ref$showSearch === void 0 ? true : _ref$showSearch,
1808
+ _ref$allowClear = _ref.allowClear,
1809
+ allowClear = _ref$allowClear === void 0 ? false : _ref$allowClear,
1810
+ config = _ref.config,
1811
+ initialValue = _ref.initialValue,
1812
+ otherProps = _objectWithoutProperties(_ref, _excluded);
1813
+ var _useFetchFolders = useFetchFolders(config),
1814
+ folders = _useFetchFolders.data;
1815
+ var _useFormikContext = useFormikContext(),
1816
+ values = _useFormikContext.values,
1817
+ setFieldValue = _useFormikContext.setFieldValue;
1818
+ var foldersMap = useMemo(function () {
1819
+ return folders ? treeToMap(folders, "sid") : null;
1820
+ }, [folders]);
1821
+ var activeFolderSid = initialValue || getActiveFolderId(config);
1822
+ var activeFolder = foldersMap[activeFolderSid];
1823
+ var isValidParent = (activeFolder === null || activeFolder === void 0 ? void 0 : activeFolder.meta.depth) < config.maxDepth;
1824
+ var parentId = isValidParent ? activeFolder.id : null;
1825
+ useEffect(function () {
1826
+ if (values.name !== "") return;
1827
+ setFieldValue(name, parentId);
1828
+ }, [parentId, name]);
1829
+ var folderOptions = useMemo(function () {
1830
+ return _createFolderOptions(folders !== null && folders !== void 0 ? folders : [], config);
1831
+ }, [folders]);
1832
+ return /*#__PURE__*/jsx(TreeSelect$1, _objectSpread({
1833
+ isClearable: allowClear,
1834
+ isDisabled: disabled,
1835
+ isSearchable: showSearch,
1836
+ treeData: folderOptions
1837
+ }, _objectSpread({
1838
+ label: label,
1839
+ name: name,
1840
+ placeholder: placeholder,
1841
+ ref: ref,
1842
+ required: required
1843
+ }, otherProps)));
1844
+ });
1845
+ TreeSelect.displayName = "TreeSelect";
1846
+
1847
+ var css = ".neeto-sidebar-folders-tree__folder-node{color:inherit!important}.neeto-sidebar-folders-tree.ant-tree .ant-tree-node-content-wrapper{min-width:0;padding-inline:2px!important}.neeto-sidebar-folders-tree.ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected{background-color:rgb(var(--neeto-ui-gray-100));color:rgb(var(--neeto-ui-accent-800))!important;font-weight:500}.neeto-sidebar-folders-tree.ant-tree .ant-tree-switcher{margin-inline-end:0}.neeto-sidebar-folders-tree.ant-tree .ant-tree-switcher .ant-tree-switcher-icon{position:relative}.neeto-folders-grid-view-wrapper{grid-template-columns:repeat(auto-fill,minmax(256px,1fr))}.neeto-sidebar-folders-tree.ant-tree .ant-tree-node-content-wrapper:hover .neeto-sidebar-folders-tree__folder-node-actions{background-image:linear-gradient(90deg,rgba(var(--neeto-ui-gray-100),.5) 0,rgba(var(--neeto-ui-gray-100),1) 25%)}.neeto-sidebar-folders-tree.ant-tree .ant-tree-treenode{margin-bottom:6px}.neeto-sidebar-folders-tree.ant-tree .ant-tree-treenode:before{height:6px}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwcC9qYXZhc2NyaXB0L3NyYy92Mi9jb21wb25lbnRzL25lZXRvLWZvbGRlcnMtbmFuby5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlDQUNFLHVCQUNGLENBRUEsb0VBRUUsV0FBQSxDQURBLDRCQUVGLENBRUEsMkZBRUUsOENBQUEsQ0FEQSwrQ0FBQSxDQUVBLGVBQ0YsQ0FFQSx3REFDRSxtQkFDRixDQUVBLGdGQUNFLGlCQUNGLENBRUEsaUNBQ0UseURBQ0YsQ0FFQSwySEFDRSxnSEFDRixDQUVBLHdEQUNFLGlCQUNGLENBRUEsK0RBQ0UsVUFDRiIsInNvdXJjZXNDb250ZW50IjpbIi5uZWV0by1zaWRlYmFyLWZvbGRlcnMtdHJlZV9fZm9sZGVyLW5vZGUge1xuICBjb2xvcjogaW5oZXJpdCAhaW1wb3J0YW50O1xufVxuXG4ubmVldG8tc2lkZWJhci1mb2xkZXJzLXRyZWUuYW50LXRyZWUgLmFudC10cmVlLW5vZGUtY29udGVudC13cmFwcGVyIHtcbiAgcGFkZGluZy1pbmxpbmU6IDJweCAhaW1wb3J0YW50O1xuICBtaW4td2lkdGg6IDA7XG59XG5cbi5uZWV0by1zaWRlYmFyLWZvbGRlcnMtdHJlZS5hbnQtdHJlZSAuYW50LXRyZWUtbm9kZS1jb250ZW50LXdyYXBwZXIuYW50LXRyZWUtbm9kZS1zZWxlY3RlZCB7XG4gIGNvbG9yOiByZ2IodmFyKC0tbmVldG8tdWktYWNjZW50LTgwMCkpICFpbXBvcnRhbnQ7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYih2YXIoLS1uZWV0by11aS1ncmF5LTEwMCkpO1xuICBmb250LXdlaWdodDogNTAwO1xufVxuXG4ubmVldG8tc2lkZWJhci1mb2xkZXJzLXRyZWUuYW50LXRyZWUgLmFudC10cmVlLXN3aXRjaGVyIHtcbiAgbWFyZ2luLWlubGluZS1lbmQ6IDA7XG59XG5cbi5uZWV0by1zaWRlYmFyLWZvbGRlcnMtdHJlZS5hbnQtdHJlZSAuYW50LXRyZWUtc3dpdGNoZXIgLmFudC10cmVlLXN3aXRjaGVyLWljb24ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5uZWV0by1mb2xkZXJzLWdyaWQtdmlldy13cmFwcGVyIHtcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgoMjU2cHgsIDFmcikpO1xufVxuXG4ubmVldG8tc2lkZWJhci1mb2xkZXJzLXRyZWUuYW50LXRyZWUgLmFudC10cmVlLW5vZGUtY29udGVudC13cmFwcGVyOmhvdmVyIC5uZWV0by1zaWRlYmFyLWZvbGRlcnMtdHJlZV9fZm9sZGVyLW5vZGUtYWN0aW9ucyB7XG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgcmdiYSh2YXIoLS1uZWV0by11aS1ncmF5LTEwMCksIC41KSAwLCByZ2JhKHZhcigtLW5lZXRvLXVpLWdyYXktMTAwKSwgMSkgMjUlKTtcbn1cblxuLm5lZXRvLXNpZGViYXItZm9sZGVycy10cmVlLmFudC10cmVlIC5hbnQtdHJlZS10cmVlbm9kZSB7XG4gIG1hcmdpbi1ib3R0b206IDZweDtcbn1cblxuLm5lZXRvLXNpZGViYXItZm9sZGVycy10cmVlLmFudC10cmVlIC5hbnQtdHJlZS10cmVlbm9kZTo6YmVmb3JlIHtcbiAgaGVpZ2h0OiA2cHg7XG59XG4iXX0= */";
1848
+ n(css,{});
1849
+
1850
+ export { AddEditPane, DraggableWrapper, FoldersContext, FoldersDnd, FoldersList, FoldersTree, MoveToFolderPane, TreeSelect };
1851
+ //# sourceMappingURL=components.js.map