@seafile/seafile-database 0.0.21 → 0.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist/api/api.js +21 -27
  2. package/dist/common/components/file-tag/index.js +2 -2
  3. package/dist/common/utils/icon-utils.js +2 -9
  4. package/dist/common/utils/utils.js +0 -28
  5. package/dist/components/cell-editors/index.js +2 -2
  6. package/dist/components/cell-editors/multiple-select-editor/index.js +2 -2
  7. package/dist/components/cell-editors/single-select-editor/index.js +2 -2
  8. package/dist/components/cell-editors/tags-editor/index.js +2 -1
  9. package/dist/components/context-menu/index.js +2 -2
  10. package/dist/components/data-process-setter/filter-setter.js +2 -1
  11. package/dist/components/data-process-setter/manage-setter.js +2 -1
  12. package/dist/components/data-process-setter/sort-setter.js +2 -2
  13. package/dist/components/icons/index.js +1 -14
  14. package/dist/components/image-previewer/_hooks/metadata-details.js +1 -1
  15. package/dist/components/image-previewer/_hooks/metadata-status.js +2 -2
  16. package/dist/components/image-previewer/image-detail/index.js +1 -1
  17. package/dist/components/image-previewer/index.js +2 -2
  18. package/dist/components/popover/groupbys-popover/index.js +5 -5
  19. package/dist/components/searcher/index.js +3 -3
  20. package/dist/components/view-toolbar/index.css +1 -54
  21. package/dist/components/view-toolbar/index.js +48 -40
  22. package/dist/components/view-toolbar/rows-toolbar/index.js +2 -2
  23. package/dist/components/view-toolbar/table-view-toolbar/index.js +1 -1
  24. package/dist/components/view-toolbar/views/all-views/index.css +85 -0
  25. package/dist/components/view-toolbar/views/all-views/index.js +165 -0
  26. package/dist/components/view-toolbar/views/index.css +22 -0
  27. package/dist/components/view-toolbar/views/index.js +215 -0
  28. package/dist/components/view-toolbar/views/view-item/index.css +83 -0
  29. package/dist/components/view-toolbar/views/view-item/index.js +159 -0
  30. package/dist/constants/event-bus-type.js +1 -3
  31. package/dist/constants/view/index.js +2 -32
  32. package/dist/context.js +34 -79
  33. package/dist/database.js +18 -11
  34. package/dist/global-settings.js +1 -3
  35. package/dist/hooks/{file-repo-context.js → app-context.js} +20 -25
  36. package/dist/hooks/collaborators.js +3 -9
  37. package/dist/hooks/index.js +14 -14
  38. package/dist/hooks/metadata.js +47 -45
  39. package/dist/hooks/tagsData.js +2 -8
  40. package/dist/hooks/viewsData.js +114 -0
  41. package/dist/index.js +3 -3
  42. package/dist/locale/en.js +1 -6
  43. package/dist/locale/zh_CN.js +1 -6
  44. package/dist/store/data-processor.js +0 -1
  45. package/dist/views/index.js +3 -5
  46. package/dist/views/table/editors/editor-container/index.js +2 -2
  47. package/dist/views/table/formatters/file-name.js +3 -3
  48. package/dist/views/table/index.js +3 -2
  49. package/dist/views/table/table-main/index.js +2 -2
  50. package/dist/views/table/table-main/rows/row/cell/formatter.js +2 -2
  51. package/dist/views/table/table-main/rows/row/cell/index.js +2 -2
  52. package/dist/views/table/table-main/rows-header/cell/dropdown-menu/index.js +1 -1
  53. package/dist/views/table/table-main/rows-header/cell/index.js +1 -1
  54. package/dist/views/table/table-main/rows-header/index.js +2 -2
  55. package/package.json +1 -1
  56. package/dist/assets/css/dropdown-menu.css +0 -96
  57. package/dist/components/dialogs/custom-modal-header/index.css +0 -34
  58. package/dist/components/dialogs/custom-modal-header/index.js +0 -34
  59. package/dist/components/dialogs/insert-view-dialog.js +0 -104
  60. package/dist/components/icons/arrow-down-icon.js +0 -19
  61. package/dist/components/icons/arrow-up-icon.js +0 -19
  62. package/dist/components/icons/close-icon.js +0 -23
  63. package/dist/components/icons/set-up-icon.js +0 -22
  64. package/dist/components/view-toolbar/card-view-toolbar/index.js +0 -89
  65. package/dist/components/view-toolbar/view-items/index.css +0 -55
  66. package/dist/components/view-toolbar/view-items/index.js +0 -98
  67. package/dist/components/view-toolbar/view-items/views-popover.js +0 -80
  68. package/dist/file-base.js +0 -31
  69. package/dist/hooks/file-view-context.js +0 -69
  70. package/dist/views/card/card-items/card-item/formatter.js +0 -45
  71. package/dist/views/card/card-items/card-item/index.css +0 -234
  72. package/dist/views/card/card-items/card-item/index.js +0 -206
  73. package/dist/views/card/card-items/index.css +0 -31
  74. package/dist/views/card/card-items/index.js +0 -189
  75. package/dist/views/card/context-menu/index.js +0 -165
  76. package/dist/views/card/index.js +0 -64
  77. package/dist/views/card/settings/index.css +0 -68
  78. package/dist/views/card/settings/index.js +0 -143
@@ -9,25 +9,22 @@ exports.default = void 0;
9
9
  var _react = _interopRequireWildcard(require("react"));
10
10
  var _constants = require("../../constants");
11
11
  var _hooks = require("../../hooks");
12
- var _iconButton = _interopRequireDefault(require("../icon-button"));
13
- var _cardViewToolbar = _interopRequireDefault(require("./card-view-toolbar"));
12
+ var _appContext = require("../../hooks/app-context");
13
+ var _row = require("../../utils/row");
14
+ var _rowsToolbar = _interopRequireDefault(require("./rows-toolbar"));
14
15
  var _tableViewToolbar = _interopRequireDefault(require("./table-view-toolbar"));
15
- var _viewItems = _interopRequireDefault(require("./view-items"));
16
+ var _views = _interopRequireDefault(require("./views"));
16
17
  require("./index.css");
17
18
  const ViewToolBar = _ref => {
18
19
  let {
19
20
  fixedColumnCount,
20
21
  tools = _constants.VIEW_TOOLS,
21
- createRowsTools = null
22
+ createRowsTools = null,
23
+ toggleView
22
24
  } = _ref;
23
25
  const {
24
- fileRepo,
25
26
  context
26
- } = (0, _hooks.useFileRepoContext)();
27
- const {
28
- views,
29
- currentViewId
30
- } = (0, _hooks.useViewContext)();
27
+ } = (0, _appContext.useAppContext)();
31
28
  const {
32
29
  collaborators
33
30
  } = (0, _hooks.useCollaborators)();
@@ -39,40 +36,58 @@ const ViewToolBar = _ref => {
39
36
  modifyRowHeight,
40
37
  modifyHiddenColumns,
41
38
  modifyColumnOrder,
42
- searchRows
39
+ searchRows,
40
+ deleteRows,
41
+ modifyRows,
42
+ updateLocalRow
43
43
  } = (0, _hooks.useMetadata)();
44
+ const {
45
+ selectedRowIds
46
+ } = (0, _hooks.useSelectedRows)();
44
47
  const selectNone = (0, _react.useCallback)(event => {
45
48
  event && event.stopPropagation();
46
49
  event && event.nativeEvent && event.nativeEvent.stopImmediatePropagation();
47
50
  context.eventBus.dispatch(_constants.EVENT_BUS_TYPE.SELECT_NONE);
48
- }, [context.eventBus]);
51
+ }, []);
49
52
  const onHeaderClick = (0, _react.useCallback)(() => {
50
53
  selectNone();
51
54
  }, [selectNone]);
52
- const viewType = (0, _react.useMemo)(() => {
53
- const view = views.find(view => view._id === currentViewId);
54
- return view.type;
55
- }, [currentViewId, views]);
56
- return /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
57
- className: "sea-metadata-view-ribbon multiple-view",
55
+ const renderLeftTools = (0, _react.useCallback)(view => {
56
+ if (selectedRowIds.length > 0 && tools.includes(_constants.VIEW_TOOL.ROWS_TOOLS)) {
57
+ const rows = (0, _row.getRowsByIds)(metadata, selectedRowIds);
58
+ return /*#__PURE__*/_react.default.createElement(_rowsToolbar.default, {
59
+ rows: rows,
60
+ columns: (metadata === null || metadata === void 0 ? void 0 : metadata.columns) || [],
61
+ selectNone: selectNone,
62
+ deleteRows: deleteRows,
63
+ modifyRows: modifyRows,
64
+ updateLocalRow: updateLocalRow,
65
+ createTools: createRowsTools
66
+ });
67
+ }
68
+ if (tools.includes(_constants.VIEW_TOOL.VIEWS)) {
69
+ return /*#__PURE__*/_react.default.createElement(_views.default, {
70
+ view: view,
71
+ toggleView: toggleView
72
+ });
73
+ }
74
+ return /*#__PURE__*/_react.default.createElement("div", {
75
+ className: "sea-metadata-views"
76
+ });
77
+ }, [selectedRowIds, tools, metadata, selectNone, deleteRows, modifyRows, updateLocalRow, createRowsTools, toggleView]);
78
+ const view = metadata === null || metadata === void 0 ? void 0 : metadata.view;
79
+ const viewType = view === null || view === void 0 ? void 0 : view.type;
80
+ const readOnly = view && context.canModifyView ? !context.canModifyView(view) : true;
81
+ return /*#__PURE__*/_react.default.createElement("div", {
82
+ className: "sea-metadata-view-ribbon",
58
83
  onClick: onHeaderClick
59
- }, /*#__PURE__*/_react.default.createElement("div", {
60
- className: "sea-metadata-base-operations"
61
- }, /*#__PURE__*/_react.default.createElement("div", {
62
- className: "base-name mr-2"
63
- }, fileRepo.name), /*#__PURE__*/_react.default.createElement("div", {
64
- className: "base-operations__ops"
65
- }, /*#__PURE__*/_react.default.createElement(_iconButton.default, {
66
- size: 24,
67
- icon: 'more'
68
- }))), /*#__PURE__*/_react.default.createElement("div", {
69
- className: "sea-metadata-view-tools-container"
70
- }, /*#__PURE__*/_react.default.createElement(_viewItems.default, null), /*#__PURE__*/_react.default.createElement("div", {
84
+ }, renderLeftTools(view), /*#__PURE__*/_react.default.createElement("div", {
71
85
  className: "sea-metadata-view-tools"
72
- }, viewType === _constants.VIEW_TYPE.TABLE && /*#__PURE__*/_react.default.createElement(_tableViewToolbar.default, {
86
+ }, view && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, viewType === _constants.VIEW_TYPE.TABLE && /*#__PURE__*/_react.default.createElement(_tableViewToolbar.default, {
87
+ readOnly: readOnly,
73
88
  tools: tools,
74
89
  fixedColumnCount: fixedColumnCount,
75
- view: metadata === null || metadata === void 0 ? void 0 : metadata.view,
90
+ view: view,
76
91
  collaborators: collaborators,
77
92
  modifyFilters: modifyFilters,
78
93
  modifySorts: modifySorts,
@@ -81,13 +96,6 @@ const ViewToolBar = _ref => {
81
96
  modifyHiddenColumns: modifyHiddenColumns,
82
97
  modifyColumnOrder: modifyColumnOrder,
83
98
  searchRows: searchRows
84
- }), viewType === _constants.VIEW_TYPE.CARD && /*#__PURE__*/_react.default.createElement(_cardViewToolbar.default, {
85
- isCustomPermission: true,
86
- readOnly: false,
87
- view: metadata === null || metadata === void 0 ? void 0 : metadata.view,
88
- collaborators: collaborators,
89
- modifyFilters: modifyFilters,
90
- modifySorts: modifySorts
91
- })))));
99
+ }))));
92
100
  };
93
101
  var _default = exports.default = ViewToolBar;
@@ -12,7 +12,7 @@ var _components = require("../../../common/components");
12
12
  var _typeDetection = require("../../../common/utils/type-detection");
13
13
  var _iconButton = _interopRequireDefault(require("../../icon-button"));
14
14
  var _icons = _interopRequireDefault(require("../../icons"));
15
- var _hooks = require("../../../hooks");
15
+ var _appContext = require("../../../hooks/app-context");
16
16
  var _translate = _interopRequireDefault(require("../../../lang/translate"));
17
17
  const RowsToolbar = _ref => {
18
18
  let {
@@ -26,7 +26,7 @@ const RowsToolbar = _ref => {
26
26
  } = _ref;
27
27
  const {
28
28
  context
29
- } = (0, _hooks.useFileRepoContext)();
29
+ } = (0, _appContext.useAppContext)();
30
30
  const [isOpen, setIsOpen] = (0, _react.useState)(false);
31
31
  const [isSubOpen, setIsSubOpen] = (0, _react.useState)(false);
32
32
  const [subMenuKey, setSubMenuKey] = (0, _react.useState)('');
@@ -72,7 +72,7 @@ const TableViewToolbar = _ref => {
72
72
  wrapperClass: "sea-metadata-view-tool-hide-column mr-2",
73
73
  target: `sea-metadata-hide-column-popover-${view._id}`,
74
74
  readOnly: readOnly,
75
- columns: viewColumns === null || viewColumns === void 0 ? void 0 : viewColumns.slice(fixedColumnCount),
75
+ columns: viewColumns.slice(fixedColumnCount),
76
76
  hiddenColumns: view.hidden_columns || [],
77
77
  modifyHiddenColumns: modifyHiddenColumns,
78
78
  modifyColumnOrder: modifyColumnOrder
@@ -0,0 +1,85 @@
1
+ @import url('../view-item/index.css');
2
+
3
+ .sea-metadata-views .sea-metadata-all-views-container {
4
+ padding: 0 8px;
5
+ }
6
+
7
+ .sea-metadata-views .sea-metadata-all-views-container .sea-metadata-view-item {
8
+ height: 24px;
9
+ padding: 2px 4px;
10
+ border-radius: 3px;
11
+ }
12
+
13
+ .sea-metadata-views .sea-metadata-all-views-container .sea-metadata-view-item:hover {
14
+ background-color: #efefef;
15
+ }
16
+
17
+ .sea-metadata-views .sea-metadata-all-views-container .sea-metadata-view-item.active::before {
18
+ display: none;
19
+ }
20
+
21
+ .sea-metadata-views .sea-metadata-all-views-container .sea-qa-icon-svg-down {
22
+ width: 1rem !important;
23
+ height: 1rem !important;
24
+ color: #666;
25
+ }
26
+
27
+ .sea-metadata-views .sea-metadata-all-views-container .sea-metadata-view-item {
28
+ width: 24px;
29
+ height: 24px;
30
+ padding: 4px 6px;
31
+ }
32
+
33
+ .sea-metadata-view-dropdown-menu .all-views-search-wrapper {
34
+ padding: 8px 16px;
35
+ }
36
+
37
+ .sea-metadata-view-dropdown-menu .all-views-list-wrapper {
38
+ max-height: 240px;
39
+ min-height: 100px;
40
+ overflow-y: auto;
41
+ width: 300px;
42
+ }
43
+
44
+ .all-views-list-wrapper .dropdown-item.view-item {
45
+ display: flex;
46
+ justify-content: space-between;
47
+ align-items: center;
48
+ position: relative;
49
+ }
50
+
51
+ .all-views-list-wrapper .dropdown-item.view-item.sea-metadata-view-item-next-position-before::before {
52
+ content: '';
53
+ border: 0.5px solid #555;
54
+ border-radius: 1px;
55
+ position: absolute;
56
+ top: 0px;
57
+ left: 0px;
58
+ width: 100%;
59
+ }
60
+
61
+ .all-views-list-wrapper .dropdown-item.view-item.sea-metadata-view-item-next-position-after::after {
62
+ content: '';
63
+ border: 0.5px solid #555;
64
+ border-radius: 1px;
65
+ position: absolute;
66
+ bottom: 0px;
67
+ left: 0px;
68
+ width: 100%;
69
+ }
70
+
71
+ .all-views-list-wrapper .dropdown-item.view-item .view-item-left .sea-qa-icon-svg:hover {
72
+ cursor: grab;
73
+ }
74
+
75
+ .all-views-list-wrapper .dropdown-item.view-item .view-item-right .sea-qa-icon-svg {
76
+ margin-right: 0;
77
+ }
78
+
79
+ .all-views-list-wrapper .all-views-empty-tip {
80
+ padding-left: 16px;
81
+ }
82
+
83
+ .all-views-list-wrapper .tip-default {
84
+ font-size: 14px;
85
+ }
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _react = require("react");
9
+ var _classnames = _interopRequireDefault(require("classnames"));
10
+ var _components = require("../../../../common/components");
11
+ var _icons = _interopRequireDefault(require("../../../icons"));
12
+ var _keyCodes = require("../../../../constants/keyCodes");
13
+ var _translate = _interopRequireDefault(require("../../../../lang/translate"));
14
+ require("./index.css");
15
+ const AllViews = _ref => {
16
+ let {
17
+ viewID,
18
+ allViews = [],
19
+ isSelected,
20
+ onMove,
21
+ toggleView
22
+ } = _ref;
23
+ const [isShowDropdownMenu, setIsShowDropdownMenu] = (0, _react.useState)(false);
24
+ const [dropRelativePosition, setDropRelativePosition] = (0, _react.useState)('');
25
+ const [currentOverViewId, setCurrentOverViewId] = (0, _react.useState)('');
26
+ const [searchValue, setSearchValue] = (0, _react.useState)('');
27
+ const viewRef = (0, _react.useRef)(null);
28
+ const menuStyle = (0, _react.useRef)({});
29
+ const enteredCounter = (0, _react.useRef)(0);
30
+ const onDragStart = (0, _react.useCallback)((event, viewId) => {
31
+ event.stopPropagation();
32
+ event.dataTransfer.setDragImage(event.target.parentNode, 10, 10);
33
+ event.dataTransfer.effectAllowed = 'move';
34
+ event.dataTransfer.setData('text/plain', viewId);
35
+ }, []);
36
+ const onDragEnter = (0, _react.useCallback)(event => {
37
+ event.stopPropagation();
38
+ enteredCounter.current = enteredCounter.current + 1;
39
+ }, []);
40
+ const onDragOver = (0, _react.useCallback)((event, viewId) => {
41
+ if (event.dataTransfer.dropEffect === 'copy') return;
42
+ event.stopPropagation();
43
+ event.preventDefault();
44
+ event.dataTransfer.dropEffect = 'move';
45
+ const dropRelativePosition = event.nativeEvent.offsetY <= event.target.clientHeight / 2 ? 'before' : 'after';
46
+ setDropRelativePosition(dropRelativePosition);
47
+ setCurrentOverViewId(viewId);
48
+ }, []);
49
+ const onDragLeave = (0, _react.useCallback)(event => {
50
+ event.stopPropagation();
51
+ enteredCounter.current = enteredCounter.current - 1;
52
+ if (!enteredCounter.current === 0) return;
53
+ setDropRelativePosition('');
54
+ setCurrentOverViewId('');
55
+ }, []);
56
+ const onDrop = (0, _react.useCallback)((event, viewId) => {
57
+ event.stopPropagation();
58
+ event.preventDefault();
59
+ enteredCounter.current = 0;
60
+ const moveViewID = event.dataTransfer.getData('text/plain');
61
+ if (moveViewID !== viewId) {
62
+ onMove && onMove(moveViewID, viewId, dropRelativePosition);
63
+ }
64
+ setDropRelativePosition('');
65
+ setCurrentOverViewId('');
66
+ }, [dropRelativePosition, onMove]);
67
+ const openDropdownMenu = (0, _react.useCallback)(() => {
68
+ const {
69
+ left,
70
+ bottom
71
+ } = viewRef.current.getBoundingClientRect();
72
+ menuStyle.current = {
73
+ left,
74
+ top: bottom + 12
75
+ }; // 12 is (view item height) - (all views button height)
76
+ setIsShowDropdownMenu(true);
77
+ }, []);
78
+ const closeDropdown = (0, _react.useCallback)(() => {
79
+ setIsShowDropdownMenu(false);
80
+ setSearchValue('');
81
+ }, []);
82
+ const views = (0, _react.useMemo)(() => {
83
+ if (searchValue) {
84
+ return allViews.filter(v => v.name.toLowerCase().includes(searchValue.toLowerCase()));
85
+ }
86
+ return allViews;
87
+ }, [allViews, searchValue]);
88
+ const onKeyDown = (0, _react.useCallback)(event => {
89
+ if (event.keyCode === _keyCodes.KeyCodes.ChineseInputMethod || event.keyCode === _keyCodes.KeyCodes.LeftArrow || event.keyCode === _keyCodes.KeyCodes.RightArrow) {
90
+ event.stopPropagation();
91
+ }
92
+ }, []);
93
+ const onSearchValueChange = (0, _react.useCallback)(newSearchValue => {
94
+ if (searchValue === newSearchValue) return;
95
+ setSearchValue(newSearchValue);
96
+ }, [searchValue]);
97
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
98
+ className: "sea-metadata-view-container sea-metadata-all-views-container",
99
+ onClick: openDropdownMenu
100
+ }, /*#__PURE__*/React.createElement("div", {
101
+ className: (0, _classnames.default)('sea-metadata-view-item', {
102
+ 'active': isSelected
103
+ }),
104
+ ref: viewRef
105
+ }, /*#__PURE__*/React.createElement("div", {
106
+ className: "sea-metadata-view-item-operation-down"
107
+ }, /*#__PURE__*/React.createElement(_icons.default, {
108
+ symbol: "down"
109
+ })))), isShowDropdownMenu && /*#__PURE__*/React.createElement(_components.ClickOutside, {
110
+ onClickOutside: closeDropdown
111
+ }, /*#__PURE__*/React.createElement("div", {
112
+ className: "sea-qa-dropdown-menu dropdown-menu position-fixed sea-metadata-view-dropdown-menu",
113
+ style: menuStyle.current
114
+ }, /*#__PURE__*/React.createElement("div", {
115
+ className: "all-views-search-wrapper"
116
+ }, /*#__PURE__*/React.createElement(_components.SearchInput, {
117
+ autoFocus: true,
118
+ isShowSearchIcon: true,
119
+ value: searchValue,
120
+ size: 28,
121
+ placeholder: _translate.default.gettext('Search view'),
122
+ onKeyDown: onKeyDown,
123
+ onChange: onSearchValueChange
124
+ })), /*#__PURE__*/React.createElement("div", {
125
+ className: "all-views-list-wrapper"
126
+ }, views.map(view => {
127
+ return /*#__PURE__*/React.createElement("div", {
128
+ key: view._id,
129
+ onClick: () => {
130
+ toggleView(view._id);
131
+ },
132
+ className: (0, _classnames.default)('dropdown-item sea-qa-dropdown-item view-item', {
133
+ 'sea-metadata-view-item-next-position-before': dropRelativePosition === 'before' && currentOverViewId === view._id,
134
+ 'sea-metadata-view-item-next-position-after': dropRelativePosition === 'after' && currentOverViewId === view._id
135
+ }),
136
+ onDragStart: event => {
137
+ onDragStart(event, view._id);
138
+ },
139
+ onDragEnter: onDragEnter,
140
+ onDragOver: event => {
141
+ onDragOver(event, view._id);
142
+ },
143
+ onDragLeave: event => {
144
+ onDragLeave(event, view._id);
145
+ },
146
+ onDrop: event => {
147
+ onDrop(event, view._id);
148
+ }
149
+ }, /*#__PURE__*/React.createElement("span", {
150
+ className: "view-item-left",
151
+ draggable: true
152
+ }, /*#__PURE__*/React.createElement(_icons.default, {
153
+ symbol: "drag"
154
+ }), view.name), /*#__PURE__*/React.createElement("span", {
155
+ className: "view-item-right"
156
+ }, view._id === viewID && /*#__PURE__*/React.createElement(_icons.default, {
157
+ symbol: "check"
158
+ })));
159
+ }), views.length === 0 && /*#__PURE__*/React.createElement("div", {
160
+ className: "all-views-empty-tip"
161
+ }, /*#__PURE__*/React.createElement("div", {
162
+ className: "tip-default"
163
+ }, _translate.default.gettext('No results')))))));
164
+ };
165
+ var _default = exports.default = AllViews;
@@ -0,0 +1,22 @@
1
+ .sea-metadata-views {
2
+ height: 100%;
3
+ flex: 1;
4
+ display: flex;
5
+ align-items: center;
6
+ padding: 0 8px 0 16px;
7
+ overflow: hidden;
8
+ }
9
+
10
+ .sea-metadata-views .sea-metadata-views-nav-container {
11
+ height: 100%;
12
+ margin-right: 8px;
13
+ overflow-x: scroll;
14
+ overflow-y: hidden;
15
+ position: relative;
16
+ scrollbar-width: none;
17
+ display: inline-flex;
18
+ }
19
+
20
+ .sea-metadata-views .sea-metadata-views-nav-scroll-btns .scroll-active {
21
+ background-color: #efefef;
22
+ }
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _react = require("react");
9
+ var _classnames = _interopRequireDefault(require("classnames"));
10
+ var _components = require("../../../common/components");
11
+ var _typeDetection = require("../../../common/utils/type-detection");
12
+ var _iconButton = _interopRequireDefault(require("../../icon-button"));
13
+ var _hooks = require("../../../hooks");
14
+ var _appContext = require("../../../hooks/app-context");
15
+ var _translate = _interopRequireDefault(require("../../../lang/translate"));
16
+ var _allViews = _interopRequireDefault(require("./all-views"));
17
+ var _viewItem = _interopRequireDefault(require("./view-item"));
18
+ require("./index.css");
19
+ const Views = _ref => {
20
+ var _getViewById;
21
+ let {
22
+ view,
23
+ toggleView
24
+ } = _ref;
25
+ const {
26
+ context
27
+ } = (0, _appContext.useAppContext)();
28
+ const [canScrollPrev, setCanScrollPrev] = (0, _react.useState)(false);
29
+ const [canScrollNext, setCanScrollNext] = (0, _react.useState)(false);
30
+ const [canViewsScroll, setViewsScroll] = (0, _react.useState)(true);
31
+ const [isShowViewNameDialog, setIsShowViewNameDialog] = (0, _react.useState)(false);
32
+ const isRenameRef = (0, _react.useRef)(false);
33
+ const viewsNavContainerRef = (0, _react.useRef)(null);
34
+ const {
35
+ isLoading,
36
+ viewsData,
37
+ viewID,
38
+ insertView,
39
+ modifyView,
40
+ moveView,
41
+ duplicateView,
42
+ deleteView,
43
+ getViewById
44
+ } = (0, _hooks.useViewsData)();
45
+ const allViews = (0, _react.useMemo)(() => {
46
+ if (isLoading) return [];
47
+ const {
48
+ navigation,
49
+ views
50
+ } = viewsData;
51
+ if (!navigation || !views) return [];
52
+ return navigation.map(n => views.find(v => v._id === n._id));
53
+ }, [isLoading, viewsData]);
54
+ const isSelected = (0, _react.useMemo)(() => {
55
+ if (viewID && !allViews.find(v => v._id === viewID)) return true;
56
+ return false;
57
+ }, [allViews, viewID]);
58
+ const openViewNameDialog = (0, _react.useCallback)(isRename => {
59
+ isRenameRef.current = Boolean(isRename);
60
+ setIsShowViewNameDialog(true);
61
+ }, []);
62
+ const closeViewNameDialog = (0, _react.useCallback)(() => {
63
+ isRenameRef.current = false;
64
+ setIsShowViewNameDialog(false);
65
+ }, []);
66
+ const checkAvailableScrollType = (0, _react.useCallback)(() => {
67
+ let {
68
+ offsetWidth,
69
+ scrollWidth,
70
+ scrollLeft
71
+ } = viewsNavContainerRef.current;
72
+ let _canScrollPrev = false;
73
+ let _canScrollNext = false;
74
+ if (scrollLeft > 0) {
75
+ _canScrollPrev = true;
76
+ }
77
+ if (scrollLeft + offsetWidth + 1 < scrollWidth) {
78
+ _canScrollNext = true;
79
+ }
80
+ if (_canScrollPrev !== canScrollPrev || _canScrollNext !== canScrollNext) {
81
+ setCanScrollPrev(_canScrollPrev);
82
+ setCanScrollNext(_canScrollNext);
83
+ }
84
+ }, [canScrollPrev, canScrollNext]);
85
+ const isContainerOverflowing = (0, _react.useCallback)(() => {
86
+ if (!viewsNavContainerRef.current) {
87
+ return false;
88
+ }
89
+ const container = viewsNavContainerRef.current;
90
+ const containerWidth = container.offsetWidth;
91
+ const childrenTotalWidth = container.scrollWidth;
92
+ return childrenTotalWidth > containerWidth;
93
+ }, []);
94
+ (0, _react.useEffect)(() => {
95
+ setViewsScroll(isContainerOverflowing());
96
+ const handleResize = () => {
97
+ setViewsScroll(isContainerOverflowing());
98
+ };
99
+ window.addEventListener('resize', handleResize);
100
+ return () => window.removeEventListener('resize', handleResize);
101
+ }, [isContainerOverflowing]);
102
+ const onScroll = (0, _react.useCallback)(() => {
103
+ checkAvailableScrollType();
104
+ }, [checkAvailableScrollType]);
105
+ const onWheel = (0, _react.useCallback)(event => {
106
+ const {
107
+ wheelDeltaX,
108
+ wheelDeltaY
109
+ } = event.nativeEvent;
110
+ // Mouse wheel scrolls, wheelDeltaY is not 0, wheelDeltaX is 0 (scroll up and down)
111
+ if (wheelDeltaY !== 0 && wheelDeltaX === 0) {
112
+ let tablesScrollLeft = viewsNavContainerRef.current.scrollLeft - wheelDeltaY;
113
+ if (tablesScrollLeft <= 0 && viewsNavContainerRef.current.scrollLeft > 0) {
114
+ viewsNavContainerRef.current.scrollLeft = 0;
115
+ return;
116
+ }
117
+ if (tablesScrollLeft > 0 && tablesScrollLeft < viewsNavContainerRef.current.clientWidth) {
118
+ viewsNavContainerRef.current.scrollLeft = tablesScrollLeft;
119
+ }
120
+ }
121
+ }, []);
122
+ const onScrollControlClick = (0, _react.useCallback)(type => {
123
+ const {
124
+ offsetWidth,
125
+ scrollWidth,
126
+ scrollLeft
127
+ } = viewsNavContainerRef.current;
128
+ let targetScrollLeft;
129
+ if (type === 'left') {
130
+ if (scrollLeft === 0) return;
131
+ targetScrollLeft = Math.max(scrollLeft - offsetWidth, 0);
132
+ } else if (type === 'right') {
133
+ if (scrollLeft + offsetWidth === scrollWidth) return;
134
+ targetScrollLeft = Math.min(scrollLeft + offsetWidth, scrollWidth - offsetWidth);
135
+ }
136
+ let timer = null;
137
+ const startScrollLeft = scrollLeft;
138
+ const distance = targetScrollLeft - startScrollLeft;
139
+ const stepCount = 20;
140
+ let currentStep = 0;
141
+ timer = setInterval(() => {
142
+ currentStep++;
143
+ const progress = currentStep / stepCount;
144
+ const easeProgress = 1 - Math.pow(1 - progress, 3);
145
+ const newScrollLeft = startScrollLeft + distance * easeProgress;
146
+ viewsNavContainerRef.current.scrollLeft = newScrollLeft;
147
+ if (currentStep >= stepCount) {
148
+ viewsNavContainerRef.current.scrollLeft = targetScrollLeft;
149
+ clearInterval(timer);
150
+ }
151
+ }, 16);
152
+ }, []);
153
+ (0, _react.useEffect)(() => {
154
+ checkAvailableScrollType();
155
+ }, [allViews, checkAvailableScrollType]);
156
+ const deleteAble = allViews.length > 1 && context.canDeleteView();
157
+ const moveAble = context.canMoveView();
158
+ const duplicateAble = context.canDuplicateView();
159
+ const modifyAble = context.canModifyView();
160
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
161
+ className: "sea-metadata-views"
162
+ }, /*#__PURE__*/React.createElement("div", {
163
+ className: "sea-metadata-views-nav-container",
164
+ ref: viewsNavContainerRef,
165
+ onScroll: onScroll,
166
+ onWheel: onWheel
167
+ }, allViews.map(v => {
168
+ const isSelect = (0, _typeDetection.isFunction)(toggleView) && v._id === viewID;
169
+ return /*#__PURE__*/React.createElement(_viewItem.default, {
170
+ key: v._id,
171
+ isSelect: isSelect,
172
+ view: v,
173
+ modifyAble: modifyAble,
174
+ deleteAble: deleteAble,
175
+ moveAble: moveAble,
176
+ duplicateAble: duplicateAble,
177
+ onSelect: toggleView,
178
+ onModify: () => openViewNameDialog(true),
179
+ onMove: moveView,
180
+ onDelete: deleteView,
181
+ onDuplicate: duplicateView
182
+ });
183
+ })), canViewsScroll && /*#__PURE__*/React.createElement("div", {
184
+ className: "sea-metadata-views-nav-scroll-btns d-flex align-items-center mr-2"
185
+ }, /*#__PURE__*/React.createElement(_allViews.default, {
186
+ viewID: viewID,
187
+ allViews: allViews,
188
+ isSelected: isSelected,
189
+ onMove: moveView,
190
+ toggleView: toggleView
191
+ }), /*#__PURE__*/React.createElement(_iconButton.default, {
192
+ icon: "left",
193
+ className: (0, _classnames.default)('scroll-control-btn scroll-prev', {
194
+ 'scroll-active': canScrollPrev
195
+ }),
196
+ onClick: () => onScrollControlClick('left')
197
+ }), /*#__PURE__*/React.createElement(_iconButton.default, {
198
+ icon: "right",
199
+ className: (0, _classnames.default)('scroll-control-btn scroll-next ml-2', {
200
+ 'scroll-active': canScrollNext
201
+ }),
202
+ onClick: () => onScrollControlClick('right')
203
+ })), context.canInsertView() && /*#__PURE__*/React.createElement(_iconButton.default, {
204
+ icon: "add",
205
+ onClick: () => openViewNameDialog()
206
+ })), isShowViewNameDialog && /*#__PURE__*/React.createElement(_components.CustomizeNameDialog, {
207
+ title: isRenameRef.current ? _translate.default.gettext('Rename view') : _translate.default.gettext('New view'),
208
+ value: isRenameRef.current ? ((_getViewById = getViewById(view._id)) === null || _getViewById === void 0 ? void 0 : _getViewById.name) || '' : '',
209
+ onToggle: closeViewNameDialog,
210
+ onSubmit: isRenameRef.current ? name => modifyView(view._id, {
211
+ name
212
+ }) : insertView
213
+ }));
214
+ };
215
+ var _default = exports.default = Views;