@seafile/seafile-database 0.0.19 → 0.0.21

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 +27 -21
  2. package/dist/assets/css/dropdown-menu.css +96 -0
  3. package/dist/common/components/file-tag/index.js +2 -2
  4. package/dist/common/utils/icon-utils.js +9 -2
  5. package/dist/common/utils/utils.js +28 -0
  6. package/dist/components/cell-editors/index.js +2 -2
  7. package/dist/components/cell-editors/multiple-select-editor/index.js +2 -2
  8. package/dist/components/cell-editors/single-select-editor/index.js +2 -2
  9. package/dist/components/cell-editors/tags-editor/index.js +1 -2
  10. package/dist/components/context-menu/index.js +2 -2
  11. package/dist/components/data-process-setter/filter-setter.js +1 -2
  12. package/dist/components/data-process-setter/manage-setter.js +1 -2
  13. package/dist/components/data-process-setter/sort-setter.js +2 -2
  14. package/dist/components/dialogs/custom-modal-header/index.css +34 -0
  15. package/dist/components/dialogs/custom-modal-header/index.js +34 -0
  16. package/dist/components/dialogs/insert-view-dialog.js +104 -0
  17. package/dist/components/icons/arrow-down-icon.js +19 -0
  18. package/dist/components/icons/arrow-up-icon.js +19 -0
  19. package/dist/components/icons/close-icon.js +23 -0
  20. package/dist/components/icons/index.js +14 -1
  21. package/dist/components/icons/set-up-icon.js +22 -0
  22. package/dist/components/image-previewer/_hooks/metadata-details.js +1 -1
  23. package/dist/components/image-previewer/_hooks/metadata-status.js +2 -2
  24. package/dist/components/image-previewer/image-detail/index.js +1 -1
  25. package/dist/components/image-previewer/index.js +2 -2
  26. package/dist/components/popover/groupbys-popover/index.js +5 -5
  27. package/dist/components/searcher/index.js +3 -3
  28. package/dist/components/view-toolbar/card-view-toolbar/index.js +89 -0
  29. package/dist/components/view-toolbar/index.css +54 -1
  30. package/dist/components/view-toolbar/index.js +40 -48
  31. package/dist/components/view-toolbar/rows-toolbar/index.js +2 -2
  32. package/dist/components/view-toolbar/table-view-toolbar/index.js +1 -1
  33. package/dist/components/view-toolbar/view-items/index.css +55 -0
  34. package/dist/components/view-toolbar/view-items/index.js +98 -0
  35. package/dist/components/view-toolbar/view-items/views-popover.js +80 -0
  36. package/dist/constants/event-bus-type.js +3 -1
  37. package/dist/constants/view/index.js +32 -2
  38. package/dist/context.js +89 -34
  39. package/dist/database.js +11 -18
  40. package/dist/file-base.js +31 -0
  41. package/dist/global-settings.js +3 -1
  42. package/dist/hooks/collaborators.js +9 -3
  43. package/dist/hooks/{app-context.js → file-repo-context.js} +25 -20
  44. package/dist/hooks/file-view-context.js +69 -0
  45. package/dist/hooks/index.js +14 -14
  46. package/dist/hooks/metadata.js +45 -47
  47. package/dist/hooks/tagsData.js +8 -2
  48. package/dist/index.js +3 -3
  49. package/dist/locale/en.js +6 -1
  50. package/dist/locale/zh_CN.js +6 -1
  51. package/dist/store/data-processor.js +1 -0
  52. package/dist/views/card/card-items/card-item/formatter.js +45 -0
  53. package/dist/views/card/card-items/card-item/index.css +234 -0
  54. package/dist/views/card/card-items/card-item/index.js +206 -0
  55. package/dist/views/card/card-items/index.css +31 -0
  56. package/dist/views/card/card-items/index.js +189 -0
  57. package/dist/views/card/context-menu/index.js +165 -0
  58. package/dist/views/card/index.js +64 -0
  59. package/dist/views/card/settings/index.css +68 -0
  60. package/dist/views/card/settings/index.js +143 -0
  61. package/dist/views/index.js +5 -3
  62. package/dist/views/table/editors/editor-container/index.js +2 -2
  63. package/dist/views/table/formatters/file-name.js +3 -3
  64. package/dist/views/table/index.js +2 -3
  65. package/dist/views/table/table-main/index.js +2 -2
  66. package/dist/views/table/table-main/rows/row/cell/formatter.js +2 -2
  67. package/dist/views/table/table-main/rows/row/cell/index.js +2 -2
  68. package/dist/views/table/table-main/rows-header/cell/dropdown-menu/index.js +1 -1
  69. package/dist/views/table/table-main/rows-header/cell/index.js +1 -1
  70. package/dist/views/table/table-main/rows-header/index.js +2 -2
  71. package/package.json +5 -2
  72. package/dist/components/view-toolbar/views/all-views/index.css +0 -85
  73. package/dist/components/view-toolbar/views/all-views/index.js +0 -165
  74. package/dist/components/view-toolbar/views/index.css +0 -22
  75. package/dist/components/view-toolbar/views/index.js +0 -215
  76. package/dist/components/view-toolbar/views/view-item/index.css +0 -83
  77. package/dist/components/view-toolbar/views/view-item/index.js +0 -159
  78. package/dist/hooks/viewsData.js +0 -154
@@ -0,0 +1,234 @@
1
+ .sf-metadata-card-item {
2
+ min-width: 0;
3
+ height: fit-content;
4
+ background: #f9f9f9;
5
+ border: 1px solid var(--bs-border-secondary-color);
6
+ border-radius: 6px;
7
+ box-shadow: 0 2px 6px rgba(0, 0, 0, .08);
8
+ display: flex;
9
+ flex-direction: column;
10
+ overflow: hidden;
11
+ user-select: none;
12
+ transition: box-shadow .15s ease, border-color .15s ease, background-color .15s ease;
13
+ cursor: pointer;
14
+ }
15
+
16
+ .sf-metadata-card-item.selected {
17
+ border-color: #ff9800;
18
+ }
19
+
20
+ .sf-metadata-card-item:hover {
21
+ box-shadow: 0 0 6px #0000002e;
22
+ }
23
+
24
+ .sf-metadata-card-item-image-container {
25
+ position: relative;
26
+ width: 100%;
27
+ overflow: hidden;
28
+ min-height: 150px;
29
+ border-bottom: 1px solid var(--bs-border-secondary-color);
30
+ }
31
+
32
+ /* Use pseudo-element to establish aspect ratio (3:2) so height is always reserved */
33
+ .sf-metadata-card-item-image-container::before {
34
+ content: '';
35
+ display: block;
36
+ padding-top: 66.6667%;
37
+ }
38
+
39
+ .sf-metadata-card-item-image-container .sf-metadata-card-item-image {
40
+ width: 100%;
41
+ height: 100%;
42
+ position: absolute;
43
+ top: 0;
44
+ left: 0;
45
+ object-fit: contain;
46
+ object-position: center;
47
+ }
48
+
49
+ .sf-metadata-card-item-image-scroll-wrapper {
50
+ position: absolute;
51
+ left: 0;
52
+ top: 0;
53
+ width: 100%;
54
+ height: 100%;
55
+ padding: 16px;
56
+ overflow-y: auto;
57
+ overflow-x: hidden;
58
+ scrollbar-width: thin;
59
+ scrollbar-color: transparent transparent;
60
+ }
61
+
62
+ .sf-metadata-card-item-image-scroll-wrapper.show-scrollbar {
63
+ scrollbar-color: rgba(0, 0, 0, 0.2) transparent;
64
+ }
65
+
66
+ [data-bs-theme="dark"] .sf-metadata-card-item-image-scroll-wrapper.show-scrollbar {
67
+ scrollbar-color: rgba(255, 255, 255, 0.2) transparent;
68
+ }
69
+
70
+ .sf-metadata-card-item-image-scroll-wrapper::-webkit-scrollbar {
71
+ width: 6px;
72
+ }
73
+
74
+ .sf-metadata-card-item-image-scroll-wrapper::-webkit-scrollbar-track {
75
+ background: transparent;
76
+ }
77
+
78
+ .sf-metadata-card-item-image-scroll-wrapper::-webkit-scrollbar-thumb {
79
+ background: transparent;
80
+ border-radius: 3px;
81
+ }
82
+
83
+ .sf-metadata-card-item-image-scroll-wrapper.show-scrollbar::-webkit-scrollbar-thumb {
84
+ background: rgba(0, 0, 0, 0.2);
85
+ }
86
+
87
+ .sf-metadata-card-item-image-scroll-wrapper.show-scrollbar::-webkit-scrollbar-thumb:hover {
88
+ background: rgba(0, 0, 0, 0.3);
89
+ }
90
+
91
+ [data-bs-theme="dark"] .sf-metadata-card-item-image-scroll-wrapper.show-scrollbar::-webkit-scrollbar-thumb {
92
+ background: rgba(255, 255, 255, 0.2);
93
+ }
94
+
95
+ [data-bs-theme="dark"] .sf-metadata-card-item-image-scroll-wrapper.show-scrollbar::-webkit-scrollbar-thumb:hover {
96
+ background: rgba(255, 255, 255, 0.3);
97
+ }
98
+
99
+ .sf-metadata-card-item-image-scroll-wrapper .sf-metadata-card-item-doc-thumbnail {
100
+ width: 100%;
101
+ height: auto;
102
+ display: block;
103
+ object-fit: contain;
104
+ object-position: top center;
105
+ }
106
+
107
+ .sf-metadata-card-item-text-container {
108
+ padding: 12px 16px 16px;
109
+ background-color: var(--bs-body-bg);
110
+ }
111
+
112
+ .sf-metadata-card-item-text-container .sf-metadata-file-name {
113
+ font-weight: 500;
114
+ }
115
+
116
+ .sf-metadata-card-item-text-container .sf-metadata-card-last-modified-info {
117
+ width: 100%;
118
+ display: flex;
119
+ justify-content: space-between;
120
+ align-items: center;
121
+ }
122
+
123
+ .sf-metadata-card-item-text-container .sf-metadata-card-last-modified-info .collaborator-item {
124
+ color: var(--bs-body-color);
125
+ background-color: transparent;
126
+ padding: 0;
127
+ }
128
+
129
+ .sf-metadata-card-item-text-container .sf-metadata-card-last-modified-info .ctime-formatter {
130
+ color: #666;
131
+ flex-shrink: 0;
132
+ }
133
+
134
+ .sf-metadata-card-item .sf-metadata-card-item-field {
135
+ margin-top: 10px;
136
+ }
137
+
138
+ .sf-metadata-card-item .sf-metadata-card-item-field-name {
139
+ display: block;
140
+ color: #666;
141
+ font-size: 12px;
142
+ margin-bottom: 4px;
143
+ }
144
+
145
+ .sf-metadata-card-item .sf-metadata-card-item-field .sf-metadata-record-cell-empty {
146
+ display: inline-block;
147
+ background-color: #f0f0f0;
148
+ border-radius: 4px;
149
+ height: 8px;
150
+ width: 20px;
151
+ }
152
+
153
+ .sf-metadata-card-item .sf-metadata-ui {
154
+ overflow: hidden;
155
+ text-overflow: ellipsis;
156
+ white-space: nowrap;
157
+ line-height: 1.2;
158
+ font-size: 13px;
159
+ }
160
+
161
+ .sf-metadata-card-item .sf-metadata-date-formatter,
162
+ .sf-metadata-card-item .sf-metadata-number-formatter {
163
+ text-align: left;
164
+ }
165
+
166
+ .sf-metadata-card-item .sf-metadata-text-formatter {
167
+ overflow: hidden;
168
+ text-overflow: ellipsis;
169
+ white-space: nowrap;
170
+ }
171
+
172
+ .sf-metadata-card-item .file-name-formatter {
173
+ margin-bottom: 8px;
174
+ }
175
+
176
+ .sf-metadata-card-item .file-name-formatter .sf-metadata-file-icon {
177
+ transform: translateY(-1px);
178
+ max-width: 100%;
179
+ height: auto;
180
+ }
181
+
182
+ .sf-metadata-card-item .sf-metadata-card-item-field .collaborators-formatter {
183
+ display: flex;
184
+ flex-wrap: wrap;
185
+ }
186
+
187
+ .sf-metadata-card-item .sf-metadata-card-item-field .collaborators-formatter .collaborator-item {
188
+ margin-top: 2px;
189
+ margin-bottom: 2px;
190
+ }
191
+
192
+ .sf-metadata-card-item .sf-metadata-card-item-field .sf-metadata-checkbox-formatter {
193
+ justify-content: flex-start;
194
+ padding-left: 2px;
195
+ }
196
+
197
+ .sf-metadata-card-item .sf-metadata-card-item-field .sf-metadata-multiple-select-formatter {
198
+ flex-wrap: wrap;
199
+ }
200
+
201
+ .sf-metadata-card-item .sf-metadata-card-item-field .sf-metadata-multiple-select-formatter .sf-metadata-ui-select-option {
202
+ margin-top: 2px;
203
+ margin-bottom: 2px;
204
+ }
205
+
206
+ .sf-metadata-view-card-items-container-text-wrap .sf-metadata-card-item-field .text-formatter {
207
+ white-space: normal;
208
+ max-height: 68px;
209
+ }
210
+
211
+ .sf-metadata-card-item .long-text-formatter,
212
+ .sf-metadata-view-card-items-container-text-wrap .sf-metadata-card-item-field .long-text-formatter {
213
+ display: -webkit-box;
214
+ -webkit-box-orient: vertical;
215
+ -webkit-line-clamp: 2;
216
+ line-clamp: 2;
217
+ overflow: hidden;
218
+ line-height: 1.5;
219
+ white-space: normal;
220
+ }
221
+
222
+ [data-bs-theme="dark"] .sf-metadata-card-item {
223
+ background-color: rgba(19, 19, 19, 1);
224
+ border-color: var(--bs-border-secondary-color);
225
+ }
226
+
227
+ [data-bs-theme="dark"] .sf-metadata-card-item.selected {
228
+ border-color: #ff9800;
229
+ }
230
+
231
+ [data-bs-theme="dark"] .sf-metadata-card-item:hover {
232
+ box-shadow: none;
233
+ border-color: rgba(255, 255, 255, 0.2);
234
+ }
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+ var _react = _interopRequireWildcard(require("react"));
10
+ var _classnames = _interopRequireDefault(require("classnames"));
11
+ var _iconUtils = require("../../../../common/utils/icon-utils");
12
+ var _utils = require("../../../../common/utils/utils");
13
+ var _globalSettings = _interopRequireDefault(require("../../../../global-settings"));
14
+ var _hooks = require("../../../../hooks");
15
+ var _cell = require("../../../../utils/cell");
16
+ var _row = require("../../../../utils/row");
17
+ var _formatter = _interopRequireDefault(require("./formatter"));
18
+ require("./index.css");
19
+ const CardItem = _ref => {
20
+ let {
21
+ isSelected,
22
+ record,
23
+ tagsData,
24
+ fileNameColumn,
25
+ mtimeColumn,
26
+ modifierColumn,
27
+ displayColumns,
28
+ displayEmptyValue,
29
+ displayColumnName,
30
+ onOpenFile,
31
+ onSelectCard,
32
+ onContextMenu
33
+ } = _ref;
34
+ const {
35
+ context
36
+ } = (0, _hooks.useFileRepoContext)();
37
+ const [isUsingIcon, setIsUsingIcon] = (0, _react.useState)(false);
38
+ const [showScrollbar, setShowScrollbar] = (0, _react.useState)(false);
39
+ const imgRef = (0, _react.useRef)(null);
40
+ const containerRef = (0, _react.useRef)(null);
41
+ const hoverTimerRef = (0, _react.useRef)(null);
42
+ const fileNameValue = (0, _cell.getCellValueByColumn)(record, fileNameColumn);
43
+ const mtimeValue = (0, _cell.getCellValueByColumn)(record, mtimeColumn);
44
+ const modifierValue = (0, _cell.getCellValueByColumn)(record, modifierColumn);
45
+
46
+ // for the big image
47
+ const parentDir = (0, _react.useMemo)(() => (0, _cell.getParentDirFromRecord)(record), [record]);
48
+ const isDir = (0, _react.useMemo)(() => (0, _row.checkIsDir)(record), [record]);
49
+ const shouldUseThumbnail = (0, _react.useMemo)(() => {
50
+ if (isDir) return false;
51
+ const value = fileNameValue;
52
+ const enableSeadoc = _globalSettings.default.getSetting('enableSeadoc');
53
+ const enableThumbnailServer = _globalSettings.default.getSetting('enableThumbnailServer');
54
+ return _utils.Utils.imageCheck(value) || _utils.Utils.pdfCheck(value) || _utils.Utils.videoCheck(value) || _utils.Utils.isEditableSdocFile(value, enableSeadoc) && enableThumbnailServer;
55
+ }, [isDir, fileNameValue]);
56
+ const isDocumentFile = (0, _react.useMemo)(() => {
57
+ if (!shouldUseThumbnail || isUsingIcon) return false;
58
+ const value = fileNameValue;
59
+ const enableSeadoc = _globalSettings.default.getSetting('enableSeadoc');
60
+ return _utils.Utils.pdfCheck(value) || _utils.Utils.isEditableSdocFile(value, enableSeadoc);
61
+ }, [shouldUseThumbnail, fileNameValue, isUsingIcon]);
62
+ const imageURLs = (0, _react.useMemo)(() => {
63
+ if (isDir) {
64
+ const iconURL = (0, _iconUtils.getFolderIconUrl)();
65
+ return {
66
+ URL: iconURL,
67
+ iconURL: iconURL
68
+ };
69
+ }
70
+ const value = fileNameValue;
71
+ const fileIconURL = (0, _iconUtils.getFileIconUrl)(value);
72
+ if (shouldUseThumbnail) {
73
+ const path = _utils.Utils.encodePath(_utils.Utils.joinPath(parentDir, value));
74
+ const siteRoot = _globalSettings.default.getSetting('siteRoot');
75
+ const thumbnailSizeForOriginal = _globalSettings.default.getSetting('thumbnailSizeForOriginal');
76
+ const repoID = context.getViewSetting('repoID');
77
+ const thumbnailURL = `${siteRoot}thumbnail/${repoID}/${thumbnailSizeForOriginal}${path}?mtime=${(0, _cell.getFileMTimeFromRecord)(record)}`;
78
+ return {
79
+ URL: thumbnailURL,
80
+ iconURL: fileIconURL
81
+ };
82
+ }
83
+ return {
84
+ URL: fileIconURL,
85
+ iconURL: fileIconURL
86
+ };
87
+ }, [isDir, fileNameValue, shouldUseThumbnail, parentDir, context, record]);
88
+ const onLoadError = (0, _react.useCallback)(() => {
89
+ setIsUsingIcon(true);
90
+ imgRef.current.src = imageURLs.iconURL;
91
+ }, [imageURLs]);
92
+ const handleClickCard = (0, _react.useCallback)(event => {
93
+ event.preventDefault();
94
+ event.stopPropagation();
95
+ event.nativeEvent.stopImmediatePropagation();
96
+ onSelectCard(record);
97
+ }, [record, onSelectCard]);
98
+ const handleFilenameClick = (0, _react.useCallback)(event => {
99
+ event.stopPropagation();
100
+ event.nativeEvent.stopImmediatePropagation();
101
+ const canPreview = context.canPreview();
102
+ if (!canPreview) return;
103
+ onOpenFile(record);
104
+ }, [context, onOpenFile, record]);
105
+ const handleImageContainerMouseEnter = (0, _react.useCallback)(() => {
106
+ if (!isDocumentFile) return;
107
+ if (hoverTimerRef.current) {
108
+ clearTimeout(hoverTimerRef.current);
109
+ }
110
+ hoverTimerRef.current = setTimeout(() => {
111
+ setShowScrollbar(true);
112
+ }, 500);
113
+ }, [isDocumentFile]);
114
+ const handleImageContainerMouseLeave = (0, _react.useCallback)(() => {
115
+ if (hoverTimerRef.current) {
116
+ clearTimeout(hoverTimerRef.current);
117
+ hoverTimerRef.current = null;
118
+ }
119
+ setShowScrollbar(false);
120
+ }, []);
121
+ const handleImageContainerScroll = (0, _react.useCallback)(event => {
122
+ event.stopPropagation();
123
+ }, []);
124
+ const scrollable = isDocumentFile && !isUsingIcon;
125
+ return /*#__PURE__*/_react.default.createElement("article", {
126
+ "data-id": record._id,
127
+ className: (0, _classnames.default)('sf-metadata-card-item', {
128
+ 'selected': isSelected
129
+ }),
130
+ onClick: handleClickCard,
131
+ onContextMenu: onContextMenu,
132
+ tabIndex: "0",
133
+ onKeyDown: _utils.Utils.onKeyDown
134
+ }, /*#__PURE__*/_react.default.createElement("div", {
135
+ ref: containerRef,
136
+ className: "sf-metadata-card-item-image-container",
137
+ onMouseEnter: handleImageContainerMouseEnter,
138
+ onMouseLeave: handleImageContainerMouseLeave
139
+ }, scrollable ? /*#__PURE__*/_react.default.createElement("div", {
140
+ className: (0, _classnames.default)('sf-metadata-card-item-image-scroll-wrapper', {
141
+ 'show-scrollbar': showScrollbar
142
+ }),
143
+ onScroll: handleImageContainerScroll
144
+ }, /*#__PURE__*/_react.default.createElement("img", {
145
+ loading: "lazy",
146
+ className: "sf-metadata-card-item-doc-thumbnail",
147
+ ref: imgRef,
148
+ src: imageURLs.URL,
149
+ onError: onLoadError,
150
+ alt: ""
151
+ })) : /*#__PURE__*/_react.default.createElement("img", {
152
+ loading: "lazy",
153
+ className: "sf-metadata-card-item-image",
154
+ ref: imgRef,
155
+ src: imageURLs.URL,
156
+ onError: onLoadError,
157
+ alt: ""
158
+ })), /*#__PURE__*/_react.default.createElement("div", {
159
+ className: "sf-metadata-card-item-text-container"
160
+ }, /*#__PURE__*/_react.default.createElement(_formatter.default, {
161
+ value: fileNameValue,
162
+ column: fileNameColumn,
163
+ record: record,
164
+ hideIcon: true,
165
+ onFileNameClick: handleFilenameClick,
166
+ tagsData: tagsData
167
+ }), /*#__PURE__*/_react.default.createElement("div", {
168
+ className: "sf-metadata-card-last-modified-info"
169
+ }, /*#__PURE__*/_react.default.createElement(_formatter.default, {
170
+ value: modifierValue,
171
+ column: modifierColumn,
172
+ record: record,
173
+ tagsData: tagsData
174
+ }), /*#__PURE__*/_react.default.createElement(_formatter.default, {
175
+ value: mtimeValue,
176
+ format: "relativeTime",
177
+ column: mtimeColumn,
178
+ record: record,
179
+ tagsData: tagsData
180
+ })), displayColumns.map(column => {
181
+ const value = (0, _cell.getCellValueByColumn)(record, column);
182
+ if (!displayEmptyValue && !(0, _cell.isValidCellValue)(value)) {
183
+ if (displayColumnName) {
184
+ return /*#__PURE__*/_react.default.createElement("div", {
185
+ className: "sf-metadata-card-item-field",
186
+ key: column.key
187
+ }, /*#__PURE__*/_react.default.createElement("span", {
188
+ className: "sf-metadata-card-item-field-name"
189
+ }, column.name));
190
+ }
191
+ return null;
192
+ }
193
+ return /*#__PURE__*/_react.default.createElement("div", {
194
+ className: "sf-metadata-card-item-field",
195
+ key: column.key
196
+ }, displayColumnName && /*#__PURE__*/_react.default.createElement("span", {
197
+ className: "sf-metadata-card-item-field-name"
198
+ }, column.name), /*#__PURE__*/_react.default.createElement(_formatter.default, {
199
+ value: value,
200
+ column: column,
201
+ record: record,
202
+ tagsData: tagsData
203
+ }));
204
+ })));
205
+ };
206
+ var _default = exports.default = CardItem;
@@ -0,0 +1,31 @@
1
+ .sf-metadata-view-card-items-container {
2
+ height: auto;
3
+ --sf-card-min-width: 240px;
4
+ --sf-card-max-width: 1fr;
5
+ --sf-card-gap: 20px;
6
+ padding: 20px;
7
+ display: grid;
8
+ grid-template-columns: repeat(auto-fill, minmax(var(--sf-card-min-width), var(--sf-card-max-width)));
9
+ gap: var(--sf-card-gap);
10
+ align-content: start;
11
+ }
12
+
13
+ @media (max-width: 1200px) {
14
+ .sf-metadata-view-card-items-container {
15
+ --sf-card-min-width: 210px;
16
+ }
17
+ }
18
+
19
+ @media (max-width: 900px) {
20
+ .sf-metadata-view-card-items-container {
21
+ --sf-card-min-width: 190px;
22
+ }
23
+ }
24
+
25
+ @media (max-width: 600px) {
26
+ .sf-metadata-view-card-items-container {
27
+ --sf-card-min-width: 160px;
28
+ padding: 12px;
29
+ --sf-card-gap: 12px;
30
+ }
31
+ }
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+ var _react = _interopRequireWildcard(require("react"));
10
+ var _classnames = _interopRequireDefault(require("classnames"));
11
+ var _emptyTip = _interopRequireDefault(require("../../../common/components/empty-tip"));
12
+ var _imagePreviewer = _interopRequireDefault(require("../../../components/image-previewer"));
13
+ var _constants = require("../../../constants");
14
+ var _hooks = require("../../../hooks");
15
+ var _translate = _interopRequireDefault(require("../../../lang/translate"));
16
+ var _cell = require("../../../utils/cell");
17
+ var _file = require("../../../utils/file");
18
+ var _row = require("../../../utils/row");
19
+ var _cardItem = _interopRequireDefault(require("./card-item"));
20
+ require("./index.css");
21
+ // import ContextMenu from '../context-menu';
22
+
23
+ const CardItems = _ref => {
24
+ let {
25
+ modifyRecord,
26
+ deleteRecords,
27
+ modifyColumnData,
28
+ onCloseSettings
29
+ } = _ref;
30
+ const {
31
+ context
32
+ } = (0, _hooks.useFileRepoContext)();
33
+ const {
34
+ tagsData
35
+ } = (0, _hooks.useTagsData)();
36
+ const {
37
+ metadata,
38
+ isDirentDetailShow,
39
+ updateCurrentDirent,
40
+ updateSelectedRecordIds
41
+ } = (0, _hooks.useMetadata)();
42
+ const containerRef = (0, _react.useRef)(null);
43
+ const currentImageRef = (0, _react.useRef)(null);
44
+ const [selectedCard, setSelectedCard] = (0, _react.useState)('');
45
+ const [isImagePreviewerVisible, setImagePreviewerVisible] = (0, _react.useState)(false);
46
+ const repoID = context.getViewSetting('repoID');
47
+ const repoInfo = context.getViewSetting('repoInfo');
48
+ (0, _react.useEffect)(() => {
49
+ const unsubscribe = context.eventBus.subscribe(_constants.EVENT_BUS_TYPE.UPDATE_SELECTED_RECORD_IDS, ids => {
50
+ setSelectedCard(Array.isArray(ids) ? ids[0] : null);
51
+ });
52
+ return () => {
53
+ unsubscribe && unsubscribe();
54
+ };
55
+ }, [context.eventBus]);
56
+ const fileNameColumn = (0, _react.useMemo)(() => {
57
+ return metadata.key_column_map[_constants.PRIVATE_COLUMN_KEY.FILE_NAME];
58
+ }, [metadata.key_column_map]);
59
+ const mtimeColumn = (0, _react.useMemo)(() => {
60
+ return metadata.key_column_map[_constants.PRIVATE_COLUMN_KEY.FILE_MTIME];
61
+ }, [metadata.key_column_map]);
62
+ const modifierColumn = (0, _react.useMemo)(() => {
63
+ return metadata.key_column_map[_constants.PRIVATE_COLUMN_KEY.FILE_MODIFIER];
64
+ }, [metadata.key_column_map]);
65
+ const displayColumns = (0, _react.useMemo)(() => {
66
+ const displayColumnsConfig = metadata.view.settings[_constants.CARD_SETTINGS_KEYS.COLUMNS];
67
+ if (!displayColumnsConfig) return [];
68
+ return displayColumnsConfig.filter(config => config.shown).map(config => metadata.key_column_map[config.key]);
69
+ }, [metadata.key_column_map, metadata.view.settings]);
70
+ const displayEmptyValue = (0, _react.useMemo)(() => !metadata.view.settings[_constants.CARD_SETTINGS_KEYS.HIDE_EMPTY_VALUE], [metadata.view.settings]);
71
+ const displayColumnName = (0, _react.useMemo)(() => metadata.view.settings[_constants.CARD_SETTINGS_KEYS.SHOW_COLUMN_NAME], [metadata.view.settings]);
72
+ const textWrap = (0, _react.useMemo)(() => metadata.view.settings[_constants.CARD_SETTINGS_KEYS.TEXT_WRAP], [metadata.view.settings]);
73
+ const records = (0, _react.useMemo)(() => {
74
+ const {
75
+ rows
76
+ } = metadata;
77
+ return rows || [];
78
+ }, [metadata]);
79
+ const onOpenFile = (0, _react.useCallback)(record => {
80
+ const repoID = context.getViewSetting('repoID');
81
+ const canPreview = context.canPreview();
82
+ if (!canPreview) return;
83
+ (0, _file.openFile)(record, repoID, () => {
84
+ currentImageRef.current = record;
85
+ setImagePreviewerVisible(true);
86
+ });
87
+ }, [context]);
88
+ const closeImagePreviewer = (0, _react.useCallback)(() => {
89
+ currentImageRef.current = null;
90
+ setImagePreviewerVisible(false);
91
+ }, []);
92
+ const handleUpdateCurrentDirent = (0, _react.useCallback)(record => {
93
+ if (!record) return;
94
+ const recordId = (0, _cell.getRecordIdFromRecord)(record);
95
+ const name = (0, _cell.getFileNameFromRecord)(record);
96
+ const path = (0, _cell.getParentDirFromRecord)(record);
97
+ const isDir = (0, _row.checkIsDir)(record);
98
+ updateCurrentDirent && updateCurrentDirent({
99
+ id: recordId,
100
+ type: isDir ? 'dir' : 'file',
101
+ mtime: '',
102
+ name,
103
+ path,
104
+ file_tags: []
105
+ });
106
+ setSelectedCard(recordId);
107
+ updateSelectedRecordIds([recordId]);
108
+ }, [updateCurrentDirent, updateSelectedRecordIds]);
109
+ const onSelectCard = (0, _react.useCallback)(record => {
110
+ const recordId = (0, _cell.getRecordIdFromRecord)(record);
111
+ if (selectedCard === recordId) return;
112
+ handleUpdateCurrentDirent(record);
113
+ onCloseSettings();
114
+ }, [selectedCard, onCloseSettings, handleUpdateCurrentDirent]);
115
+ const handleClickOutside = (0, _react.useCallback)(event => {
116
+ setSelectedCard(null);
117
+ updateSelectedRecordIds([]);
118
+ updateCurrentDirent();
119
+ }, [updateCurrentDirent, updateSelectedRecordIds]);
120
+ const onContextMenu = (0, _react.useCallback)((event, recordId) => {
121
+ event.preventDefault();
122
+ if (selectedCard === recordId) return;
123
+ const record = (0, _row.getRowById)(metadata, recordId);
124
+ handleUpdateCurrentDirent(record);
125
+ }, [metadata, selectedCard, handleUpdateCurrentDirent]);
126
+ const onDeleteRecords = (0, _react.useCallback)(recordIds => {
127
+ deleteRecords(recordIds, {
128
+ success_callback: () => {
129
+ setSelectedCard(null);
130
+ updateSelectedRecordIds([]);
131
+ updateCurrentDirent();
132
+ }
133
+ });
134
+ }, [deleteRecords, updateCurrentDirent, updateSelectedRecordIds]);
135
+ const onRename = (0, _react.useCallback)((rowId, updates, oldRowData, originalUpdates, originalOldRowData, _ref2) => {
136
+ let {
137
+ success_callback
138
+ } = _ref2;
139
+ modifyRecord(rowId, updates, oldRowData, originalUpdates, originalOldRowData, {
140
+ success_callback: operation => {
141
+ success_callback && success_callback(operation);
142
+ const record = (0, _row.getRowById)(metadata, rowId);
143
+ handleUpdateCurrentDirent(record);
144
+ }
145
+ });
146
+ }, [metadata, modifyRecord, handleUpdateCurrentDirent]);
147
+ (0, _react.useEffect)(() => {
148
+ if (!isDirentDetailShow) {
149
+ setSelectedCard(null);
150
+ updateSelectedRecordIds([]);
151
+ }
152
+ }, [isDirentDetailShow, updateSelectedRecordIds]);
153
+ if (records.length === 0) {
154
+ return /*#__PURE__*/_react.default.createElement(_emptyTip.default, {
155
+ text: _translate.default.gettext('No items')
156
+ });
157
+ }
158
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
159
+ ref: containerRef,
160
+ className: (0, _classnames.default)('sf-metadata-view-card-items-container', {
161
+ 'sf-metadata-view-card-items-container-text-wrap': textWrap
162
+ }),
163
+ onClick: handleClickOutside
164
+ }, records.map((record, index) => {
165
+ const isSelected = selectedCard === record._id;
166
+ return /*#__PURE__*/_react.default.createElement(_cardItem.default, {
167
+ key: index,
168
+ isSelected: isSelected,
169
+ record: record,
170
+ tagsData: tagsData,
171
+ fileNameColumn: fileNameColumn,
172
+ mtimeColumn: mtimeColumn,
173
+ modifierColumn: modifierColumn,
174
+ displayColumns: displayColumns,
175
+ displayEmptyValue: displayEmptyValue,
176
+ displayColumnName: displayColumnName,
177
+ onOpenFile: onOpenFile,
178
+ onSelectCard: onSelectCard,
179
+ onContextMenu: e => onContextMenu(e, record._id)
180
+ });
181
+ })), isImagePreviewerVisible && /*#__PURE__*/_react.default.createElement(_imagePreviewer.default, {
182
+ repoID: repoID,
183
+ repoInfo: repoInfo,
184
+ record: currentImageRef.current,
185
+ table: metadata,
186
+ closeImagePopup: closeImagePreviewer
187
+ }));
188
+ };
189
+ var _default = exports.default = CardItems;