@bigbinary/neeto-folders-frontend 1.1.0

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,926 @@
1
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
2
+ import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
3
+ import _regeneratorRuntime from '@babel/runtime/regenerator';
4
+ import { shallow } from 'zustand/shallow';
5
+ import { useQueryParams, useStateWithDependency } from '@bigbinary/neeto-commons-frontend/react-utils';
6
+ import { buildUrl } from '@bigbinary/neeto-commons-frontend/utils';
7
+ import Alert from '@bigbinary/neetoui/Alert';
8
+ import { useTranslation, Trans } from 'react-i18next';
9
+ import { useHistory, Link, NavLink } from 'react-router-dom';
10
+ import { c as useFolderStore, d as useDestroyFolder, a as useFolders, i as isActiveFolder, e as useFetchFolders, f as useCreateFolder, g as useUpdateFolder, h as useReorderFolders, D as DEFAULT_CONFIG, u as useFolder, b as useFolderActions, j as getActiveFolderId } from './useFolderActions-AZ7a_96r.js';
11
+ import { p as pathToFolder, t as treeToMap, m as measureDepth, a as mapToTree } from './pathUtils-B2uokQlx.js';
12
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
13
+ import Pane from '@bigbinary/neetoui/Pane';
14
+ import { useMemo, forwardRef, createElement, useState, useEffect, startTransition } from 'react';
15
+ import { Formik, Form } from 'formik';
16
+ import Typography from '@bigbinary/neetoui/Typography';
17
+ import Input from '@bigbinary/neetoui/formik/Input';
18
+ import Select from '@bigbinary/neetoui/formik/Select';
19
+ import ActionBlock from '@bigbinary/neetoui/formik/ActionBlock';
20
+ import { pipe, values, prop, isEmpty, assoc } from 'ramda';
21
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
22
+ import Button from '@bigbinary/neetoui/Button';
23
+ import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
24
+ import classNames from 'classnames';
25
+ import { noop, isNotPresent } from '@bigbinary/neeto-cist';
26
+ import Radio from '@bigbinary/neetoui/Radio';
27
+ import Tooltip from '@bigbinary/neetoui/Tooltip';
28
+ import { useDraggable, useDroppable, DndContext, DragOverlay } from '@dnd-kit/core';
29
+ import Folder from '@bigbinary/neeto-icons/Folder';
30
+ import Toastr from '@bigbinary/neetoui/Toastr';
31
+ import { createPortal } from 'react-dom';
32
+ import MoreDropdown from '@bigbinary/neeto-molecules/MoreDropdown';
33
+ import Checkbox from '@bigbinary/neetoui/Checkbox';
34
+ import Tree from '@bigbinary/neetoui/Tree';
35
+ import 'i18next';
36
+ import '@tanstack/react-query';
37
+ import './constants.js';
38
+ import 'zustand';
39
+
40
+ 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; }
41
+ 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), !0).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; }
42
+ var FoldersAlerts = function FoldersAlerts(_ref) {
43
+ var config = _ref.config;
44
+ var _useFolderStore = useFolderStore(function (store) {
45
+ return {
46
+ setFolderState: store["setFolderState"]
47
+ };
48
+ }, shallow),
49
+ setFolderState = _useFolderStore.setFolderState;
50
+ var queryParams = useQueryParams({
51
+ toCamelCase: false
52
+ });
53
+ var history = useHistory();
54
+ var _useTranslation = useTranslation(),
55
+ t = _useTranslation.t;
56
+ var _useFolderStore2 = useFolderStore(function (store) {
57
+ var _store$alertState, _store$alertState2;
58
+ return {
59
+ type: (_store$alertState = store["alertState"]) === null || _store$alertState === void 0 ? void 0 : _store$alertState["type"],
60
+ item: (_store$alertState2 = store["alertState"]) === null || _store$alertState2 === void 0 ? void 0 : _store$alertState2["item"]
61
+ };
62
+ }, shallow),
63
+ type = _useFolderStore2.type,
64
+ item = _useFolderStore2.item;
65
+ var _useDestroyFolder = useDestroyFolder(config),
66
+ destroyFolder = _useDestroyFolder.mutateAsync,
67
+ isLoading = _useDestroyFolder.isLoading;
68
+ var _useFolders = useFolders(config),
69
+ folders = _useFolders.folders;
70
+ var onClose = function onClose() {
71
+ return setFolderState({
72
+ alertState: null
73
+ });
74
+ };
75
+ var alertProps = {
76
+ isOpen: !!type,
77
+ isSubmitting: isLoading,
78
+ onClose: onClose
79
+ };
80
+ var onConfirmDelete = /*#__PURE__*/function () {
81
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
82
+ var path, parent;
83
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
84
+ while (1) switch (_context.prev = _context.next) {
85
+ case 0:
86
+ _context.next = 2;
87
+ return destroyFolder(item.id);
88
+ case 2:
89
+ onClose();
90
+ if (!(!isActiveFolder(item.sid) || !folders)) {
91
+ _context.next = 5;
92
+ break;
93
+ }
94
+ return _context.abrupt("return");
95
+ case 5:
96
+ path = pathToFolder(folders, item.id);
97
+ parent = path[path.length - 2];
98
+ if (parent) {
99
+ _context.next = 9;
100
+ break;
101
+ }
102
+ return _context.abrupt("return");
103
+ case 9:
104
+ history.replace(buildUrl(config.folderPath, _objectSpread$9(_objectSpread$9({}, queryParams), {}, {
105
+ folderId: parent.sid
106
+ })));
107
+ case 10:
108
+ case "end":
109
+ return _context.stop();
110
+ }
111
+ }, _callee);
112
+ }));
113
+ return function onConfirmDelete() {
114
+ return _ref2.apply(this, arguments);
115
+ };
116
+ }();
117
+ if (type === "delete") {
118
+ alertProps.title = t("deleteFolder.title");
119
+ alertProps.message = /*#__PURE__*/jsx(Trans, {
120
+ i18nKey: "deleteFolder.info",
121
+ values: item
122
+ });
123
+ if (config.customizeAlerts) config.customizeAlerts(type, item, alertProps);
124
+ alertProps.onSubmit = onConfirmDelete;
125
+ }
126
+ return /*#__PURE__*/jsx(Alert, _objectSpread$9({}, alertProps));
127
+ };
128
+
129
+ var flattenTree = pipe(treeToMap, values);
130
+ var AddEditPane = function AddEditPane(_ref) {
131
+ var config = _ref.config,
132
+ onClose = _ref.onClose;
133
+ var _useFolderStore = useFolderStore(function (store) {
134
+ var _store$paneState, _store$paneState2;
135
+ return {
136
+ type: (_store$paneState = store["paneState"]) === null || _store$paneState === void 0 ? void 0 : _store$paneState["type"],
137
+ item: (_store$paneState2 = store["paneState"]) === null || _store$paneState2 === void 0 ? void 0 : _store$paneState2["item"]
138
+ };
139
+ }, shallow),
140
+ type = _useFolderStore.type,
141
+ item = _useFolderStore.item;
142
+ var _useFetchFolders = useFetchFolders(config),
143
+ folders = _useFetchFolders.data;
144
+ var _useCreateFolder = useCreateFolder(config),
145
+ createFolder = _useCreateFolder.mutate;
146
+ var _useUpdateFolder = useUpdateFolder(config),
147
+ updateFolder = _useUpdateFolder.mutateAsync;
148
+ var _useTranslation = useTranslation(),
149
+ t = _useTranslation.t;
150
+ var isEditing = type === "edit" && item;
151
+ var initialValues = isEditing ? item : {
152
+ name: "",
153
+ parentId: null
154
+ };
155
+ var folderOptions = useMemo(function () {
156
+ return flattenTree(folders);
157
+ }, [folders]);
158
+ var onSubmitForm = /*#__PURE__*/function () {
159
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(values) {
160
+ var payload;
161
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
162
+ while (1) switch (_context.prev = _context.next) {
163
+ case 0:
164
+ payload = {
165
+ name: values.name,
166
+ parent_id: values.parentId
167
+ };
168
+ if (!isEditing) {
169
+ _context.next = 6;
170
+ break;
171
+ }
172
+ _context.next = 4;
173
+ return updateFolder({
174
+ id: item.id,
175
+ payload: payload
176
+ });
177
+ case 4:
178
+ _context.next = 8;
179
+ break;
180
+ case 6:
181
+ _context.next = 8;
182
+ return createFolder(payload);
183
+ case 8:
184
+ onClose();
185
+ case 9:
186
+ case "end":
187
+ return _context.stop();
188
+ }
189
+ }, _callee);
190
+ }));
191
+ return function onSubmitForm(_x) {
192
+ return _ref2.apply(this, arguments);
193
+ };
194
+ }();
195
+ return /*#__PURE__*/jsxs(Fragment, {
196
+ children: [/*#__PURE__*/jsx(Pane.Header, {
197
+ children: /*#__PURE__*/jsx(Typography, {
198
+ style: "h2",
199
+ children: isEditing ? t("folders.edit") : t("folders.add")
200
+ })
201
+ }), /*#__PURE__*/jsx(Formik, {
202
+ initialValues: initialValues,
203
+ onSubmit: onSubmitForm,
204
+ children: function children(_ref3) {
205
+ var setFieldValue = _ref3.setFieldValue;
206
+ return /*#__PURE__*/jsxs(Fragment, {
207
+ children: [/*#__PURE__*/jsx(Pane.Body, {
208
+ children: /*#__PURE__*/jsxs(Form, {
209
+ className: "w-full space-y-5",
210
+ children: [/*#__PURE__*/jsx(Input, {
211
+ label: t("folders.name"),
212
+ name: "name"
213
+ }), /*#__PURE__*/jsxs("div", {
214
+ children: [/*#__PURE__*/jsx(Select, {
215
+ isClearable: true,
216
+ filterOption: function filterOption(_ref4) {
217
+ var value = _ref4.value;
218
+ return value !== initialValues.id;
219
+ },
220
+ getOptionLabel: prop("name"),
221
+ getOptionValue: prop("id"),
222
+ label: t("createFolder.parentTitle"),
223
+ name: "parentId",
224
+ options: folderOptions,
225
+ onChange: function onChange(option) {
226
+ return setFieldValue("parentId", option ? option.id : null);
227
+ }
228
+ }), /*#__PURE__*/jsx(Typography, {
229
+ style: "nano",
230
+ children: t("createFolder.parentInfo")
231
+ })]
232
+ })]
233
+ })
234
+ }), /*#__PURE__*/jsx(Pane.Footer, {
235
+ children: /*#__PURE__*/jsx(ActionBlock, {
236
+ cancelButtonProps: {
237
+ onClick: onClose
238
+ }
239
+ })
240
+ })]
241
+ });
242
+ }
243
+ })]
244
+ });
245
+ };
246
+
247
+ var _excluded$3 = ["icon", "itemLabel", "folder", "depth", "className", "onClick"];
248
+ 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; }
249
+ 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), !0).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; }
250
+ var indentSize = 30;
251
+ var Node = function Node(_ref, ref) {
252
+ var _folder$children$leng, _folder$children;
253
+ var _ref$icon = _ref.icon,
254
+ icon = _ref$icon === void 0 ? null : _ref$icon,
255
+ itemLabel = _ref.itemLabel,
256
+ folder = _ref.folder,
257
+ depth = _ref.depth,
258
+ className = _ref.className,
259
+ onClick = _ref.onClick,
260
+ rest = _objectWithoutProperties(_ref, _excluded$3);
261
+ var _useTranslation = useTranslation(),
262
+ t = _useTranslation.t;
263
+ var metaInfo = [];
264
+ 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;
265
+ childCount > 0 && metaInfo.push(t("folders.subfolderCount", {
266
+ count: childCount
267
+ }));
268
+ folder.itemCount > 0 && metaInfo.push("".concat(folder.itemCount, " ").concat(itemLabel));
269
+ return /*#__PURE__*/jsxs("div", {
270
+ className: "flex",
271
+ children: [Array.from({
272
+ length: depth
273
+ }).map(function (_, index) {
274
+ return /*#__PURE__*/jsx("span", {
275
+ className: "relative border-l",
276
+ style: {
277
+ width: indentSize,
278
+ left: Math.round(indentSize / 2)
279
+ }
280
+ }, index);
281
+ }), /*#__PURE__*/jsxs("div", _objectSpread$8(_objectSpread$8({}, _objectSpread$8(_objectSpread$8({}, rest), {}, {
282
+ onClick: onClick,
283
+ ref: ref
284
+ })), {}, {
285
+ className: classNames("relative my-1 flex cursor-pointer items-center px-2 py-1", className),
286
+ children: [icon, /*#__PURE__*/jsxs("div", {
287
+ className: "ml-2",
288
+ children: [/*#__PURE__*/jsx(Typography, {
289
+ style: "body3",
290
+ weight: "medium",
291
+ children: folder.name
292
+ }), /*#__PURE__*/jsx(Typography, {
293
+ className: "relative -top-0.5",
294
+ style: "nano",
295
+ weight: "normal",
296
+ children: metaInfo.join(" . ")
297
+ })]
298
+ })]
299
+ }))]
300
+ });
301
+ };
302
+ var Node$1 = /*#__PURE__*/forwardRef(Node);
303
+
304
+ var _excluded$2 = ["folder", "item", "depth", "maxDepth", "disabled"];
305
+ 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; }
306
+ 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), !0).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; }
307
+ var _SelectableNode = function SelectableNode(_ref) {
308
+ var folder = _ref.folder,
309
+ item = _ref.item,
310
+ _ref$depth = _ref.depth,
311
+ depth = _ref$depth === void 0 ? 0 : _ref$depth,
312
+ maxDepth = _ref.maxDepth,
313
+ disabled = _ref.disabled,
314
+ rest = _objectWithoutProperties(_ref, _excluded$2);
315
+ var selection = rest.selection,
316
+ onSelect = rest.onSelect;
317
+ var _useTranslation = useTranslation(),
318
+ t = _useTranslation.t;
319
+ var isDisabled = disabled || (item === null || item === void 0 ? void 0 : item.id) === folder.id || depth > maxDepth;
320
+ var renderChildren = function renderChildren() {
321
+ if (isNotPresent(folder.children)) return null;
322
+ return folder.children.map(function (child) {
323
+ return /*#__PURE__*/createElement(_SelectableNode, _objectSpread$7(_objectSpread$7({}, _objectSpread$7(_objectSpread$7({}, rest), {}, {
324
+ item: item,
325
+ maxDepth: maxDepth
326
+ })), {}, {
327
+ depth: depth + 1,
328
+ disabled: isDisabled,
329
+ folder: child,
330
+ key: child.id
331
+ }));
332
+ });
333
+ };
334
+ return /*#__PURE__*/jsx(Tooltip, {
335
+ content: t("moveToFolder.notAllowed"),
336
+ disabled: !isDisabled,
337
+ position: "top",
338
+ children: /*#__PURE__*/jsxs("div", {
339
+ className: classNames({
340
+ "opacity-40": isDisabled
341
+ }),
342
+ children: [/*#__PURE__*/jsx(Node$1, _objectSpread$7(_objectSpread$7({}, _objectSpread$7(_objectSpread$7({}, rest), {}, {
343
+ depth: depth,
344
+ folder: folder
345
+ })), {}, {
346
+ icon: /*#__PURE__*/jsx(Radio.Item, {
347
+ readOnly: true,
348
+ checked: selection === folder.id,
349
+ name: "move-folder-option"
350
+ }),
351
+ onClick: isDisabled ? noop : function () {
352
+ return onSelect(folder);
353
+ }
354
+ })), renderChildren()]
355
+ })
356
+ });
357
+ };
358
+
359
+ 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; }
360
+ 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), !0).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; }
361
+ var PaneBody = function PaneBody(_ref) {
362
+ var item = _ref.item,
363
+ config = _ref.config,
364
+ submitButtonProps = _ref.submitButtonProps,
365
+ cancelButtonProps = _ref.cancelButtonProps,
366
+ removeButtonProps = _ref.removeButtonProps,
367
+ onSubmit = _ref.onSubmit,
368
+ onClose = _ref.onClose,
369
+ onRemove = _ref.onRemove;
370
+ var _useState = useState(null),
371
+ _useState2 = _slicedToArray(_useState, 2),
372
+ selection = _useState2[0],
373
+ setSelection = _useState2[1];
374
+ var _useFolderStore = useFolderStore(function (store) {
375
+ return {
376
+ setFolderState: store["setFolderState"]
377
+ };
378
+ }, shallow),
379
+ setFolderState = _useFolderStore.setFolderState;
380
+ var _useFetchFolders = useFetchFolders(config),
381
+ _useFetchFolders$data = _useFetchFolders.data,
382
+ folders = _useFetchFolders$data === void 0 ? [] : _useFetchFolders$data;
383
+ var _useTranslation = useTranslation(),
384
+ t = _useTranslation.t;
385
+ var folderDepth = 0;
386
+ if (item) {
387
+ // If item is a folder, measure the current depth from current folder to longest leaf.
388
+ var foldersMap = treeToMap(folders);
389
+ var folder = foldersMap[item.id];
390
+ if (folder) folderDepth = measureDepth(folder);
391
+ }
392
+ var maxDepth = config.maxDepth - folderDepth;
393
+ var onAddFolder = function onAddFolder() {
394
+ setFolderState({
395
+ paneState: {
396
+ type: "add",
397
+ item: null
398
+ }
399
+ });
400
+ };
401
+ return /*#__PURE__*/jsxs(Fragment, {
402
+ children: [/*#__PURE__*/jsxs(Pane.Header, {
403
+ className: "flex items-center justify-between",
404
+ children: [/*#__PURE__*/jsx(Typography, {
405
+ style: "h2",
406
+ children: t("moveToFolder.title")
407
+ }), /*#__PURE__*/jsx(Button, {
408
+ className: "mr-2",
409
+ label: t("folders.add"),
410
+ style: "link",
411
+ onClick: onAddFolder
412
+ })]
413
+ }), /*#__PURE__*/jsx(Pane.Body, {
414
+ children: folders.map(function (folder) {
415
+ return /*#__PURE__*/createElement(_SelectableNode, {
416
+ folder: folder,
417
+ item: item,
418
+ maxDepth: maxDepth,
419
+ selection: selection,
420
+ disabled: (item === null || item === void 0 ? void 0 : item.id) === folder.id || maxDepth <= 0,
421
+ itemLabel: config.itemLabel,
422
+ key: folder.id,
423
+ onSelect: function onSelect(folder) {
424
+ return setSelection(folder.id);
425
+ }
426
+ });
427
+ })
428
+ }), /*#__PURE__*/jsxs(Pane.Footer, {
429
+ className: "space-x-2",
430
+ children: [/*#__PURE__*/jsxs("div", {
431
+ className: "flex flex-1 space-x-2",
432
+ children: [/*#__PURE__*/jsx(Button, _objectSpread$6({
433
+ disabled: !selection,
434
+ label: t("common.save"),
435
+ style: "primary",
436
+ onClick: function onClick() {
437
+ return onSubmit(selection);
438
+ }
439
+ }, submitButtonProps)), /*#__PURE__*/jsx(Button, _objectSpread$6({
440
+ label: t("common.cancel"),
441
+ style: "text",
442
+ onClick: onClose
443
+ }, cancelButtonProps))]
444
+ }), onRemove && /*#__PURE__*/jsx(Button, _objectSpread$6({
445
+ label: t("moveToFolder.remove"),
446
+ style: "tertiary",
447
+ onClick: onRemove
448
+ }, removeButtonProps))]
449
+ })]
450
+ });
451
+ };
452
+
453
+ var MoveFolderPane = function MoveFolderPane(_ref) {
454
+ var config = _ref.config,
455
+ onClose = _ref.onClose;
456
+ var _useFolderStore = useFolderStore(function (store) {
457
+ var _store$paneState;
458
+ return {
459
+ item: (_store$paneState = store["paneState"]) === null || _store$paneState === void 0 ? void 0 : _store$paneState["item"]
460
+ };
461
+ }, shallow),
462
+ item = _useFolderStore.item;
463
+ var _useUpdateFolder = useUpdateFolder(config),
464
+ updateFolder = _useUpdateFolder.mutate;
465
+ var onSaveSelection = function onSaveSelection(parentId) {
466
+ var payload = {
467
+ id: item.id,
468
+ parentId: parentId
469
+ };
470
+ updateFolder({
471
+ id: item.id,
472
+ payload: payload
473
+ }, {
474
+ onSuccess: onClose
475
+ });
476
+ };
477
+ return /*#__PURE__*/jsx(PaneBody, {
478
+ config: config,
479
+ item: item,
480
+ onClose: onClose,
481
+ onSubmit: onSaveSelection
482
+ });
483
+ };
484
+
485
+ var _excluded$1 = ["folder", "depth"];
486
+ 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; }
487
+ 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), !0).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; }
488
+ var _DraggableNode = function DraggableNode(_ref) {
489
+ var folder = _ref.folder,
490
+ _ref$depth = _ref.depth,
491
+ depth = _ref$depth === void 0 ? 0 : _ref$depth,
492
+ rest = _objectWithoutProperties(_ref, _excluded$1);
493
+ var _useDraggable = useDraggable({
494
+ id: "draggable-item--".concat(folder.id),
495
+ data: folder,
496
+ disabled: depth <= 0
497
+ }),
498
+ isDragging = _useDraggable.isDragging,
499
+ attributes = _useDraggable.attributes,
500
+ listeners = _useDraggable.listeners,
501
+ setDraggableRef = _useDraggable.setNodeRef;
502
+ var _useDroppable = useDroppable({
503
+ id: "droppable-item--".concat(folder.id),
504
+ data: folder,
505
+ disabled: isDragging
506
+ }),
507
+ isOver = _useDroppable.isOver,
508
+ setDroppableRef = _useDroppable.setNodeRef;
509
+ var renderChildren = function renderChildren() {
510
+ if (isNotPresent(folder.children) || isDragging) return null;
511
+ return folder.children.map(function (child) {
512
+ return /*#__PURE__*/createElement(_DraggableNode, _objectSpread$5(_objectSpread$5({}, rest), {}, {
513
+ depth: depth + 1,
514
+ folder: child,
515
+ key: child.id
516
+ }));
517
+ });
518
+ };
519
+ return /*#__PURE__*/jsxs("div", {
520
+ children: [/*#__PURE__*/jsx(Node$1, _objectSpread$5(_objectSpread$5(_objectSpread$5({}, rest), {}, {
521
+ className: classNames({
522
+ "neeto-ui-bg-gray-100 opacity-50 ": isDragging,
523
+ "neeto-ui-border-primary-500 border": isOver,
524
+ "border border-transparent": !isOver
525
+ })
526
+ }, _objectSpread$5(_objectSpread$5({
527
+ depth: depth,
528
+ folder: folder
529
+ }, attributes), listeners)), {}, {
530
+ ref: function ref(_ref2) {
531
+ setDroppableRef(_ref2);
532
+ setDraggableRef(_ref2);
533
+ }
534
+ })), renderChildren()]
535
+ });
536
+ };
537
+
538
+ 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; }
539
+ 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), !0).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; }
540
+ var ReorderFoldersPane = function ReorderFoldersPane(_ref) {
541
+ var config = _ref.config,
542
+ onClose = _ref.onClose;
543
+ var _useState = useState(null),
544
+ _useState2 = _slicedToArray(_useState, 2),
545
+ dragItem = _useState2[0],
546
+ setDragItem = _useState2[1];
547
+ var _useState3 = useState({}),
548
+ _useState4 = _slicedToArray(_useState3, 2),
549
+ changes = _useState4[0],
550
+ setChanges = _useState4[1];
551
+ var _useTranslation = useTranslation(),
552
+ t = _useTranslation.t;
553
+ var _useFetchFolders = useFetchFolders(config),
554
+ folders = _useFetchFolders.data;
555
+ var _useReorderFolders = useReorderFolders(config),
556
+ reorderFolders = _useReorderFolders.mutate;
557
+ var _useStateWithDependen = useStateWithDependency(function () {
558
+ return {
559
+ name: "/",
560
+ id: null,
561
+ children: folders
562
+ };
563
+ }, [folders]),
564
+ _useStateWithDependen2 = _slicedToArray(_useStateWithDependen, 2),
565
+ tree = _useStateWithDependen2[0],
566
+ setTree = _useStateWithDependen2[1];
567
+ var onDragEnd = function onDragEnd(_ref2) {
568
+ var _activeFolder$meta$pa;
569
+ var active = _ref2.active,
570
+ over = _ref2.over;
571
+ setDragItem(null);
572
+ if (!over) return;
573
+ var foldersMap = treeToMap(tree);
574
+ var activeFolder = foldersMap[active.data.current.id];
575
+ var overFolder = foldersMap[over.data.current.id];
576
+
577
+ // Check moving inside same directory
578
+ if (((_activeFolder$meta$pa = activeFolder.meta.parent) === null || _activeFolder$meta$pa === void 0 ? void 0 : _activeFolder$meta$pa.id) === overFolder.id) return;
579
+
580
+ // Check moving to a folder with depth greater than the allowed limit.
581
+ // maxDepth + 1 due to extra root node added for the tree
582
+ var activeDepth = measureDepth(activeFolder);
583
+ var overDepth = overFolder.meta.depth;
584
+ if (activeDepth + overDepth >= config.maxDepth + 1) {
585
+ Toastr.error(t("moveToFolder.depthExceeded", {
586
+ maxDepth: config.maxDepth
587
+ }));
588
+ return;
589
+ }
590
+ activeFolder.meta.parent = overFolder;
591
+ var newTree = mapToTree(foldersMap);
592
+ setTree(newTree);
593
+ setChanges(assoc(activeFolder.id, overFolder.id));
594
+ };
595
+ var onSubmit = function onSubmit() {
596
+ var payload = {
597
+ changes: changes
598
+ };
599
+ reorderFolders(payload, {
600
+ onSuccess: onClose
601
+ });
602
+ };
603
+ var nodeProps = {
604
+ icon: /*#__PURE__*/jsx(Folder, {}),
605
+ itemLabel: config.itemLabel
606
+ };
607
+ return /*#__PURE__*/jsxs(Fragment, {
608
+ children: [/*#__PURE__*/jsx(Pane.Header, {
609
+ children: /*#__PURE__*/jsx(Typography, {
610
+ style: "h2",
611
+ children: t("reorderFolder.title")
612
+ })
613
+ }), /*#__PURE__*/jsxs(DndContext, {
614
+ onDragEnd: onDragEnd,
615
+ onDragStart: function onDragStart(_ref3) {
616
+ var active = _ref3.active;
617
+ return setDragItem(active.data.current);
618
+ },
619
+ children: [/*#__PURE__*/jsx(Pane.Body, {
620
+ children: /*#__PURE__*/createElement(_DraggableNode, _objectSpread$4(_objectSpread$4({}, nodeProps), {}, {
621
+ folder: tree,
622
+ key: tree.id
623
+ }))
624
+ }), /*#__PURE__*/jsxs(Pane.Footer, {
625
+ className: "space-x-2",
626
+ children: [/*#__PURE__*/jsx(Button, {
627
+ disabled: isEmpty(changes),
628
+ label: t("common.save"),
629
+ style: "primary",
630
+ onClick: onSubmit
631
+ }), /*#__PURE__*/jsx(Button, {
632
+ label: t("common.cancel"),
633
+ style: "text",
634
+ onClick: onClose
635
+ })]
636
+ }), /*#__PURE__*/createPortal(/*#__PURE__*/jsx(DragOverlay, {
637
+ zIndex: 99999,
638
+ children: dragItem && /*#__PURE__*/jsx(Node$1, _objectSpread$4(_objectSpread$4({}, nodeProps), {}, {
639
+ className: "neeto-ui-bg-gray-200",
640
+ depth: 0,
641
+ folder: dragItem
642
+ }))
643
+ }), document.body)]
644
+ })]
645
+ });
646
+ };
647
+
648
+ 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; }
649
+ 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), !0).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; }
650
+ var FoldersPane = function FoldersPane(_ref) {
651
+ var configProps = _ref.config;
652
+ var config = _objectSpread$3(_objectSpread$3({}, DEFAULT_CONFIG), configProps);
653
+ var _useFolderStore = useFolderStore(function (store) {
654
+ return {
655
+ setFolderState: store["setFolderState"]
656
+ };
657
+ }, shallow),
658
+ setFolderState = _useFolderStore.setFolderState;
659
+ var _useFolderStore2 = useFolderStore(function (store) {
660
+ var _store$paneState;
661
+ return {
662
+ type: (_store$paneState = store["paneState"]) === null || _store$paneState === void 0 ? void 0 : _store$paneState["type"]
663
+ };
664
+ }, shallow),
665
+ type = _useFolderStore2.type;
666
+ var onClose = function onClose() {
667
+ return setFolderState({
668
+ paneState: null
669
+ });
670
+ };
671
+ var commonProps = {
672
+ config: config,
673
+ onClose: onClose
674
+ };
675
+ return /*#__PURE__*/jsxs(Pane, {
676
+ onClose: onClose,
677
+ isOpen: !!type,
678
+ children: [(type === "edit" || type === "add") && /*#__PURE__*/jsx(AddEditPane, _objectSpread$3({}, commonProps)), type === "move" && /*#__PURE__*/jsx(MoveFolderPane, _objectSpread$3({}, commonProps)), type === "reorder" && /*#__PURE__*/jsx(ReorderFoldersPane, _objectSpread$3({}, commonProps))]
679
+ });
680
+ };
681
+
682
+ var FoldersContext = function FoldersContext(_ref) {
683
+ var config = _ref.config,
684
+ children = _ref.children;
685
+ return /*#__PURE__*/jsxs(Fragment, {
686
+ children: [children, /*#__PURE__*/jsx(FoldersPane, {
687
+ config: config
688
+ }), /*#__PURE__*/jsx(FoldersAlerts, {
689
+ config: config
690
+ })]
691
+ });
692
+ };
693
+
694
+ var FolderTile = function FolderTile(_ref) {
695
+ var _folder$children$leng, _folder$children;
696
+ var isSelected = _ref.isSelected,
697
+ link = _ref.link,
698
+ itemLabel = _ref.itemLabel,
699
+ folder = _ref.folder,
700
+ actions = _ref.actions,
701
+ onSelect = _ref.onSelect;
702
+ var _useTranslation = useTranslation(),
703
+ t = _useTranslation.t;
704
+ var actionCallback = function actionCallback(callback) {
705
+ return function (event) {
706
+ event.preventDefault();
707
+ callback(folder);
708
+ };
709
+ };
710
+ var menuItems = [{
711
+ key: "edit",
712
+ label: t("common.edit"),
713
+ onClick: actionCallback(actions.onEdit)
714
+ }, {
715
+ key: "move",
716
+ label: t("common.move"),
717
+ onClick: actionCallback(actions.onMove)
718
+ }, {
719
+ key: "delete",
720
+ label: t("common.delete"),
721
+ onClick: actionCallback(actions.onDelete)
722
+ }];
723
+ var metaInfo = [];
724
+ 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;
725
+ childCount > 0 && metaInfo.push(t("folders.subfolderCount", {
726
+ count: childCount
727
+ }));
728
+ metaInfo.push("".concat(folder.itemCount || 0, " ").concat(itemLabel));
729
+ return /*#__PURE__*/jsxs(Link, {
730
+ className: "neeto-ui-bg-gray-100 neeto-ui-rounded-md m-2 w-64 border p-3",
731
+ to: link,
732
+ children: [/*#__PURE__*/jsxs("div", {
733
+ className: "mb-1 flex items-center justify-between",
734
+ children: [/*#__PURE__*/jsxs("div", {
735
+ className: "flex items-center",
736
+ children: [/*#__PURE__*/jsx(Checkbox, {
737
+ checked: isSelected,
738
+ className: "mr-2",
739
+ name: folder.id,
740
+ onChange: function onChange(event) {
741
+ return onSelect(folder, event.target.checked);
742
+ },
743
+ onClick: function onClick(event) {
744
+ return event.stopPropagation();
745
+ }
746
+ }), /*#__PURE__*/jsx(Tooltip, {
747
+ content: folder.name,
748
+ delay: [300, 0],
749
+ children: /*#__PURE__*/jsx(Typography, {
750
+ className: "line-clamp-1",
751
+ style: "body1",
752
+ weight: "medium",
753
+ children: folder.name
754
+ })
755
+ })]
756
+ }), /*#__PURE__*/jsx(MoreDropdown, {
757
+ menuItems: menuItems,
758
+ dropdownProps: {
759
+ onClick: function onClick(event) {
760
+ return event.preventDefault();
761
+ }
762
+ }
763
+ })]
764
+ }), /*#__PURE__*/jsx(Typography, {
765
+ className: "ml-6",
766
+ style: "body3",
767
+ children: metaInfo.join(" . ")
768
+ })]
769
+ });
770
+ };
771
+
772
+ 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; }
773
+ 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), !0).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; }
774
+ var FoldersList = function FoldersList(_ref) {
775
+ var _ref$selection = _ref.selection,
776
+ selection = _ref$selection === void 0 ? [] : _ref$selection,
777
+ configProps = _ref.config,
778
+ onSelect = _ref.onSelect;
779
+ var config = _objectSpread$2(_objectSpread$2({}, DEFAULT_CONFIG), configProps);
780
+ var params = useQueryParams({
781
+ toCamelCase: false
782
+ });
783
+ var _useTranslation = useTranslation(),
784
+ t = _useTranslation.t;
785
+ var _useFolders = useFolders(config),
786
+ folders = _useFolders.folders;
787
+ var _useFolder = useFolder(config),
788
+ folderId = _useFolder.folderId,
789
+ folder = _useFolder.folder;
790
+ var actions = useFolderActions(config);
791
+ var subFolders = folderId ? folder === null || folder === void 0 ? void 0 : folder.children : folders;
792
+ if (isNotPresent(subFolders)) return null;
793
+ return /*#__PURE__*/jsxs(FoldersContext, {
794
+ config: config,
795
+ children: [/*#__PURE__*/jsx(Typography, {
796
+ className: "mb-2 mt-2",
797
+ style: "h4",
798
+ children: t("folders.title")
799
+ }), /*#__PURE__*/jsx("div", {
800
+ className: "mb-6 flex flex-wrap justify-items-center",
801
+ children: subFolders.map(function (folder) {
802
+ return /*#__PURE__*/createElement(FolderTile, {
803
+ actions: actions,
804
+ folder: folder,
805
+ onSelect: onSelect,
806
+ isSelected: selection.includes(folder.id),
807
+ itemLabel: config.itemLabel,
808
+ key: folder.id,
809
+ link: buildUrl(config.folderPath, _objectSpread$2(_objectSpread$2({}, params), {}, {
810
+ folderId: folder.sid
811
+ }))
812
+ });
813
+ })
814
+ })]
815
+ });
816
+ };
817
+
818
+ var _excluded = ["isOpen", "onClose"];
819
+ 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; }
820
+ 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), !0).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; }
821
+ var MoveToFolderPane = function MoveToFolderPane(_ref) {
822
+ var isOpen = _ref.isOpen,
823
+ onClose = _ref.onClose,
824
+ rest = _objectWithoutProperties(_ref, _excluded);
825
+ return /*#__PURE__*/jsx(Pane, {
826
+ isOpen: isOpen,
827
+ onClose: onClose,
828
+ children: /*#__PURE__*/jsx(PaneBody, _objectSpread$1({}, _objectSpread$1(_objectSpread$1({}, rest), {}, {
829
+ onClose: onClose
830
+ })))
831
+ });
832
+ };
833
+
834
+ var FolderNode = function FolderNode(_ref) {
835
+ var _isActive = _ref.isActive,
836
+ folder = _ref.folder,
837
+ link = _ref.link;
838
+ return /*#__PURE__*/jsx(NavLink, {
839
+ activeClassName: "active",
840
+ className: "block",
841
+ isActive: function isActive() {
842
+ return _isActive;
843
+ },
844
+ to: link,
845
+ children: /*#__PURE__*/jsx(Tooltip, {
846
+ content: folder.name,
847
+ delay: [300, 0],
848
+ children: /*#__PURE__*/jsx(Typography, {
849
+ className: "line-clamp-1",
850
+ component: "span",
851
+ style: "body2",
852
+ children: folder.name
853
+ })
854
+ })
855
+ });
856
+ };
857
+
858
+ 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; }
859
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).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; }
860
+ var FoldersTree = function FoldersTree(_ref) {
861
+ var configProps = _ref.config;
862
+ var config = _objectSpread(_objectSpread({}, DEFAULT_CONFIG), configProps);
863
+ var _useState = useState([]),
864
+ _useState2 = _slicedToArray(_useState, 2),
865
+ expandedKeys = _useState2[0],
866
+ setExpandedKeys = _useState2[1];
867
+ var _useTranslation = useTranslation(),
868
+ t = _useTranslation.t;
869
+ var params = useQueryParams({
870
+ toCamelCase: false
871
+ });
872
+ var activeFolderSid = getActiveFolderId(config);
873
+ var _useFetchFolders = useFetchFolders(config),
874
+ folders = _useFetchFolders.data;
875
+ var updateExpandedKeys = function updateExpandedKeys() {
876
+ var _activeFolder$meta;
877
+ if (!folders) return;
878
+ // When active folder changes from external sources, update expanded keys to auto expand tree.
879
+ var expandedKeys = [];
880
+ var map = treeToMap(folders, "sid");
881
+ var activeFolder = map[activeFolderSid];
882
+ 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;
883
+ if (parentSid) expandedKeys.push(parentSid);
884
+ setExpandedKeys(expandedKeys);
885
+ };
886
+ useEffect(function () {
887
+ // Non urgent update.
888
+ startTransition(updateExpandedKeys);
889
+ }, [activeFolderSid, folders]);
890
+ if (isNotPresent(folders)) {
891
+ return /*#__PURE__*/jsx(Typography, {
892
+ className: "w-full text-center",
893
+ style: "body2",
894
+ weight: "semibold",
895
+ children: t("folders.noFolders")
896
+ });
897
+ }
898
+ return /*#__PURE__*/jsx(Tree, {
899
+ expandedKeys: expandedKeys,
900
+ autoExpandParent: true,
901
+ blockNode: true,
902
+ showLine: true,
903
+ componentToken: {
904
+ titleHeight: 25,
905
+ indentSize: 25
906
+ },
907
+ fieldNames: {
908
+ key: "sid"
909
+ },
910
+ selectedKeys: [activeFolderSid],
911
+ treeData: folders,
912
+ titleRender: function titleRender(folder) {
913
+ return /*#__PURE__*/jsx(FolderNode, {
914
+ folder: folder,
915
+ isActive: folder.sid === activeFolderSid,
916
+ link: buildUrl(config.folderPath, _objectSpread(_objectSpread({}, params), {}, {
917
+ folderId: folder.sid
918
+ }))
919
+ });
920
+ },
921
+ onExpand: setExpandedKeys
922
+ });
923
+ };
924
+
925
+ export { FoldersContext, FoldersList, FoldersTree, MoveToFolderPane };
926
+ //# sourceMappingURL=components.js.map