@bigbinary/neeto-folders-frontend 2.0.37 → 2.0.38

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