@scaleflex/widget-explorer 4.1.0 → 4.3.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.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,28 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [4.3.0](https://code.scaleflex.cloud/scaleflex/widget/compare/v4.1.0...v4.3.0) (2025-10-02)
7
+
8
+
9
+ ### Features
10
+
11
+ * add `hideTopBarAddFolderButton` option and implement new folder modal functionality in the explorer component ([7129309](https://code.scaleflex.cloud/scaleflex/widget/commits/712930995f6dfd4a0d874c0638dde61065fd0683))
12
+
13
+
14
+
15
+
16
+
17
+ # [4.2.0](https://code.scaleflex.cloud/scaleflex/widget/compare/v4.1.0...v4.2.0) (2025-10-02)
18
+
19
+
20
+ ### Features
21
+
22
+ * add `hideTopBarAddFolderButton` option and implement new folder modal functionality in the explorer component ([7129309](https://code.scaleflex.cloud/scaleflex/widget/commits/712930995f6dfd4a0d874c0638dde61065fd0683))
23
+
24
+
25
+
26
+
27
+
6
28
  # [4.1.0](https://code.scaleflex.cloud/scaleflex/widget/compare/v4.0.8...v4.1.0) (2025-10-02)
7
29
 
8
30
 
package/README.md CHANGED
@@ -1198,6 +1198,13 @@ If `true` force hides the manual sub-tab of variations tab in file window.
1198
1198
 
1199
1199
  If `true` shows the add preset button inside the automatic tab if the user allowed to add.
1200
1200
 
1201
+ ### `hideTopBarAddFolderButton` ![asset-manager-supported]
1202
+
1203
+ <u>Type:</u> `boolean`.
1204
+
1205
+ <u>Default:</u> `false`
1206
+
1207
+ If `true` hides the add folder button on the topright.
1201
1208
 
1202
1209
  ## Events
1203
1210
 
@@ -8,6 +8,8 @@ import { memo, useCallback, useEffect, useRef } from 'react';
8
8
  import { useSelector, useDispatch } from 'react-redux';
9
9
  import { useUpdateEffect } from '@scaleflex/widget-common/lib/hooks';
10
10
  import Drawer from '@scaleflex/widget-explorer/lib/components/Drawer';
11
+ import { PlusOutline } from '@scaleflex/icons';
12
+ import { Button } from '@scaleflex/ui/core';
11
13
  import { useExplorer, useIsSmallScreen } from '../../hooks';
12
14
  import { selectIsDetailsViewOpened, detailsViewToggled, selectFileWindowFor } from '../../slices/panels.slice';
13
15
  import AssetsList from '../AssetsList';
@@ -27,8 +29,11 @@ import TopBarUploadButton from '../common/TopBarUploadButton';
27
29
  import { selectIsDraggingOver } from '../../slices/common.slice';
28
30
  import { DETAILS_SIDEBAR_WIDTHS } from '../Details/Details.constants';
29
31
  import { selectIsSearchFetchType } from '../../slices/search.slice';
32
+ import { useAddNewFolderModal } from '../Modals';
30
33
  import DnD from '../DnD';
31
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
34
+ import { selectIsUserPermittedTo } from '@scaleflex/widget-core/lib/slices/user.slice';
35
+ import { PERMISSIONS } from '@scaleflex/widget-utils/lib/constants';
36
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
32
37
  var EMPTY_FOLDERS_VIEW_PLACEHOLDER_DATA = {
33
38
  titleI18nKey: 'explorerFoldersViewEmptyTitle',
34
39
  hintI18nKeys: ['explorerFoldersViewEmptyHint1', 'explorerFoldersViewEmptyHint2']
@@ -40,6 +45,7 @@ var FoldersView = function FoldersView() {
40
45
  i18n = _useExplorer.i18n,
41
46
  requestCloseModal = _useExplorer.requestCloseModal;
42
47
  var isWidgetSmallSize = useIsSmallScreen();
48
+ var triggerAddNewFolderModal = useAddNewFolderModal();
43
49
  var isSearchFetchType = useSelector(selectIsSearchFetchType);
44
50
  var isDetailsViewOpened = useSelector(selectIsDetailsViewOpened);
45
51
  var isFoldersTreeOpened = useSelector(selectIsFoldersTreeOpened);
@@ -57,6 +63,9 @@ var FoldersView = function FoldersView() {
57
63
  var foldersSortOrder = useSelector(selectFoldersSortOrder);
58
64
  var filesSortBy = useSelector(selectFilesSortedBy);
59
65
  var filesSortOrder = useSelector(selectFilesSortOrder);
66
+ var isAllowedToCreateFolder = useSelector(function (state) {
67
+ return selectIsUserPermittedTo(state, PERMISSIONS.FOLDER_CREATE);
68
+ });
60
69
  var isFilesAndFoldersSortDifferent = useSelector(function (state) {
61
70
  return foldersSortedBy !== filesSortBy || foldersSortOrder !== filesSortOrder;
62
71
  });
@@ -68,7 +77,8 @@ var FoldersView = function FoldersView() {
68
77
  ExploreViewComponent = opts.ExploreViewComponent,
69
78
  hideLeftSideBar = opts.hideLeftSideBar,
70
79
  useAssetsPicker = opts.useAssetsPicker,
71
- assetsPickerModelTitle = opts.assetsPickerModelTitle;
80
+ assetsPickerModelTitle = opts.assetsPickerModelTitle,
81
+ hideTopBarAddFolderButton = opts.hideTopBarAddFolderButton;
72
82
  useEffect(function () {
73
83
  offsetRef.current = filesOffset;
74
84
  }, [filesOffset]);
@@ -176,8 +186,24 @@ var FoldersView = function FoldersView() {
176
186
  skipPendingDispatch: false
177
187
  }));
178
188
  };
189
+ var renderAddFolderButton = function renderAddFolderButton() {
190
+ return /*#__PURE__*/_jsx(Button, {
191
+ color: "secondary",
192
+ startIcon: function startIcon(props) {
193
+ return /*#__PURE__*/_jsx(PlusOutline, _objectSpread({}, props));
194
+ },
195
+ size: "md",
196
+ onClick: function onClick() {
197
+ return triggerAddNewFolderModal();
198
+ },
199
+ "data-testid": "add-folder-button",
200
+ children: i18n('explorerFoldersViewTopBarNewFolderButton')
201
+ });
202
+ };
179
203
  var renderTopBarRightComponent = function renderTopBarRightComponent() {
180
- return /*#__PURE__*/_jsx(TopBarUploadButton, {});
204
+ return /*#__PURE__*/_jsxs(_Fragment, {
205
+ children: [isAllowedToCreateFolder && !hideTopBarAddFolderButton && renderAddFolderButton(), /*#__PURE__*/_jsx(TopBarUploadButton, {})]
206
+ });
181
207
  };
182
208
  var handleRefreshFolder = function handleRefreshFolder() {
183
209
  if (!currentFolderPath) {
@@ -0,0 +1,99 @@
1
+ import { useDispatch } from 'react-redux';
2
+ import { useCallback } from 'react';
3
+ import { AddFolder } from '@scaleflex/icons';
4
+ import { useTheme } from '@scaleflex/ui/theme/hooks';
5
+ import { useModal } from '@scaleflex/widget-core/lib/hooks';
6
+ import { PC } from '@scaleflex/widget-common';
7
+ import handlePromise from '@scaleflex/widget-utils/lib/handlePromise';
8
+ import { checkFileOrFolderNameValidation } from '@scaleflex/widget-utils/lib/checkFileOrFolderNameValidation';
9
+ import { InputGroup } from '@scaleflex/ui/core';
10
+ import { useExplorerI18n, useExplorerInformer } from '../../../hooks';
11
+ import { addNewFolder } from '../../../slices/folders.slice';
12
+ import { jsx as _jsx } from "react/jsx-runtime";
13
+ export var useAddNewFolderModal = function useAddNewFolderModal() {
14
+ var dispatch = useDispatch();
15
+ var toggleModal = useModal();
16
+ var theme = useTheme();
17
+ var i18n = useExplorerI18n();
18
+ var info = useExplorerInformer();
19
+
20
+ // If no path is provided, then the folder will be created in the current folder.
21
+ var triggerAddNewFolderModal = useCallback(function () {
22
+ var toFolderPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
23
+ var addFolderHandler = function addFolderHandler(_ref) {
24
+ var data = _ref.data,
25
+ closeModal = _ref.closeModal,
26
+ setIsModalLoading = _ref.setIsModalLoading;
27
+ var folderName = data.folderName;
28
+ if (folderName) {
29
+ setIsModalLoading(true);
30
+ handlePromise(dispatch(addNewFolder({
31
+ path: toFolderPath,
32
+ name: folderName
33
+ })), function () {
34
+ closeModal();
35
+ info(i18n('explorerFolderCreatedInfo'), 'success', 5000);
36
+ }, undefined, function () {
37
+ setIsModalLoading(false);
38
+ });
39
+ } else {
40
+ info(i18n('explorerFolderNameRequiredInfo'), 'warning', 5000);
41
+ }
42
+ };
43
+ toggleModal({
44
+ icon: /*#__PURE__*/_jsx(AddFolder, {
45
+ color: theme.palette[PC.AccentPrimary],
46
+ width: 29,
47
+ height: 29
48
+ }),
49
+ showTitleLabel: true,
50
+ disableAutoClose: true,
51
+ title: i18n('explorerModelAddFolderTitle'),
52
+ content: function content(_ref2) {
53
+ var updateData = _ref2.updateData,
54
+ data = _ref2.data,
55
+ setPrimaryButtonDisabled = _ref2.setPrimaryButtonDisabled;
56
+ return /*#__PURE__*/_jsx(InputGroup, {
57
+ onChange: function onChange(_ref3) {
58
+ var target = _ref3.target;
59
+ var error = '';
60
+ if (checkFileOrFolderNameValidation(target.value)) {
61
+ error = i18n('mutualizedFolderInvalidNameError');
62
+ }
63
+ updateData({
64
+ folderName: target.value,
65
+ error: error
66
+ });
67
+ setPrimaryButtonDisabled(Boolean(error) || !target.value);
68
+ },
69
+ error: Boolean(data.error),
70
+ hint: data.error,
71
+ label: i18n('explorerModelNewFolderName'),
72
+ placeholder: i18n('explorerModelNewFolderPlaceholder'),
73
+ value: data.folderName || '',
74
+ fullWidth: true,
75
+ focusOnMount: true
76
+ });
77
+ },
78
+ buttonPrimaryLabel: i18n('explorerModelAddLabel'),
79
+ buttonSecondaryBg: 'basic',
80
+ onButtonPrimaryClick: addFolderHandler,
81
+ enterKeySubmits: true,
82
+ modalStyle: {
83
+ maxWidth: 400
84
+ },
85
+ modalFooterStyle: {
86
+ flexDirection: 'row'
87
+ },
88
+ modalSecondaryButton: {
89
+ width: 170
90
+ },
91
+ modalSecondaryButtonColor: 'basic',
92
+ modalPrimaryButton: {
93
+ width: 170
94
+ },
95
+ disablePrimaryButton: true
96
+ });
97
+ }, [i18n, theme]);
98
+ return triggerAddNewFolderModal;
99
+ };
@@ -0,0 +1 @@
1
+ export { useAddNewFolderModal } from './AddNewFolder.hooks';
@@ -1,4 +1,5 @@
1
1
  export { default } from './Modals';
2
+ export * from './AddNewFolder';
2
3
  export * from './DeleteItems';
3
4
  export * from './DeleteModal';
4
5
  export * from './DownloadConsent';
@@ -1356,5 +1356,6 @@ export default {
1356
1356
  explorerFileWindowAddPresetDescPlaceholder: 'Enter description here',
1357
1357
  explorerFileWindowAddPresetDescLabel: 'Description',
1358
1358
  explorerFileWindowPresetAddedInfo: 'Preset is added!',
1359
- explorerFileWindowAddPresetNameRegexError: '{ , } , | , \\ , ^ , ~ , @ , spaces , ` and , characters are not allowed'
1359
+ explorerFileWindowAddPresetNameRegexError: '{ , } , | , \\ , ^ , ~ , @ , spaces , ` and , characters are not allowed',
1360
+ explorerFoldersViewTopBarNewFolderButton: 'Add folder'
1360
1361
  };
package/lib/index.js CHANGED
@@ -1396,7 +1396,8 @@ var Explorer = /*#__PURE__*/function (_Plugin) {
1396
1396
  hideMetadataTab: false,
1397
1397
  hideFileSpecsMetadataFields: false,
1398
1398
  variationsHideManualSubTab: false,
1399
- variationsShowAddPresetButton: false
1399
+ variationsShowAddPresetButton: false,
1400
+ hideTopBarAddFolderButton: false
1400
1401
  };
1401
1402
 
1402
1403
  // merge default options with the ones set by user
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scaleflex/widget-explorer",
3
- "version": "4.1.0",
3
+ "version": "4.3.0",
4
4
  "description": "Scaleflex explorer for the files uploaded on filerobot, handling them & upload new files.",
5
5
  "main": "lib/index.js",
6
6
  "style": "dist/style.min.css",
@@ -18,12 +18,12 @@
18
18
  "@scaleflex/icons": "^3.0.0-beta.11",
19
19
  "@scaleflex/react-url-builder": "^0.0.72",
20
20
  "@scaleflex/ui": "^3.0.0-beta.11",
21
- "@scaleflex/widget-common": "^4.1.0",
22
- "@scaleflex/widget-icons": "^4.1.0",
23
- "@scaleflex/widget-informer": "^4.1.0",
24
- "@scaleflex/widget-provider-views": "^4.1.0",
25
- "@scaleflex/widget-thumbnail-generator": "^4.1.0",
26
- "@scaleflex/widget-utils": "^4.1.0",
21
+ "@scaleflex/widget-common": "^4.3.0",
22
+ "@scaleflex/widget-icons": "^4.3.0",
23
+ "@scaleflex/widget-informer": "^4.3.0",
24
+ "@scaleflex/widget-provider-views": "^4.3.0",
25
+ "@scaleflex/widget-thumbnail-generator": "^4.3.0",
26
+ "@scaleflex/widget-utils": "^4.3.0",
27
27
  "@transloadit/prettier-bytes": "0.1.0",
28
28
  "akamai-filerobot-converter": "^0.1.6",
29
29
  "classnames": "^2.2.6",
@@ -51,5 +51,5 @@
51
51
  "react-konva": ">=19.0.3"
52
52
  },
53
53
  "license": "MIT",
54
- "gitHead": "471120d67066617a0d8824eae11b07d1f2259473"
54
+ "gitHead": "712930995f6dfd4a0d874c0638dde61065fd0683"
55
55
  }