@webiny/app-admin 0.0.0-unstable.d65ec29d44 → 0.0.0-unstable.da99e0b846

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 (115) hide show
  1. package/assets/icons/add-18px.svg +1 -1
  2. package/assets/icons/arrow_drop_down-24px.svg +1 -1
  3. package/assets/icons/filter-24px.svg +1 -1
  4. package/assets/icons/highlight-24px.svg +1 -1
  5. package/assets/icons/info.svg +1 -1
  6. package/assets/icons/insert_drive_file-24px.svg +1 -1
  7. package/assets/icons/insert_photo-24px.svg +1 -1
  8. package/assets/icons/label-24px.svg +1 -1
  9. package/assets/icons/round-account_circle-24px.svg +1 -1
  10. package/assets/icons/round-arrow_drop_down-24px.svg +1 -1
  11. package/assets/icons/round-help-24px.svg +1 -1
  12. package/assets/icons/round-settings-24px.svg +1 -1
  13. package/assets/icons/today-24px.svg +1 -1
  14. package/assets/icons/touch_app.svg +1 -1
  15. package/base/Base.js +6 -25
  16. package/base/Base.js.map +1 -1
  17. package/base/plugins/AddGraphQLQuerySelection.js +5 -1
  18. package/base/plugins/AddGraphQLQuerySelection.js.map +1 -1
  19. package/base/ui/FileManager.d.ts +67 -0
  20. package/base/ui/FileManager.js +61 -0
  21. package/base/ui/FileManager.js.map +1 -0
  22. package/components/AppInstaller/AppInstaller.js +2 -34
  23. package/components/AppInstaller/AppInstaller.js.map +1 -1
  24. package/components/AppInstaller/Sidebar.js +2 -12
  25. package/components/AppInstaller/Sidebar.js.map +1 -1
  26. package/components/AppInstaller/styled.d.ts +17 -5
  27. package/components/AppInstaller/useInstaller.d.ts +1 -7
  28. package/components/AppInstaller/useInstaller.js +16 -71
  29. package/components/AppInstaller/useInstaller.js.map +1 -1
  30. package/components/EmptyView.js +1 -1
  31. package/components/EmptyView.js.map +1 -1
  32. package/components/FileManager/BottomInfoBar/SupportedFileTypes.js +14 -0
  33. package/components/FileManager/BottomInfoBar/SupportedFileTypes.js.map +1 -1
  34. package/components/FileManager/BottomInfoBar/UploadStatus.js +9 -0
  35. package/components/FileManager/BottomInfoBar/UploadStatus.js.map +1 -1
  36. package/components/FileManager/BottomInfoBar.js +12 -0
  37. package/components/FileManager/BottomInfoBar.js.map +1 -1
  38. package/components/FileManager/DropFilesHere.js +12 -3
  39. package/components/FileManager/DropFilesHere.js.map +1 -1
  40. package/components/FileManager/File.js +18 -5
  41. package/components/FileManager/File.js.map +1 -1
  42. package/components/FileManager/FileDetails/Name.js +75 -45
  43. package/components/FileManager/FileDetails/Name.js.map +1 -1
  44. package/components/FileManager/FileDetails/Tags.js +138 -85
  45. package/components/FileManager/FileDetails/Tags.js.map +1 -1
  46. package/components/FileManager/FileDetails.js +161 -94
  47. package/components/FileManager/FileDetails.js.map +1 -1
  48. package/components/FileManager/FileManagerContext.js +45 -12
  49. package/components/FileManager/FileManagerContext.js.map +1 -1
  50. package/components/FileManager/FileManagerView.js +295 -185
  51. package/components/FileManager/FileManagerView.js.map +1 -1
  52. package/components/FileManager/LeftSidebar.js +29 -10
  53. package/components/FileManager/LeftSidebar.js.map +1 -1
  54. package/components/FileManager/NoPermissionView.js +13 -0
  55. package/components/FileManager/NoPermissionView.js.map +1 -1
  56. package/components/FileManager/NoResults.js +6 -0
  57. package/components/FileManager/NoResults.js.map +1 -1
  58. package/components/FileManager/getFileTypePlugin.js +15 -9
  59. package/components/FileManager/getFileTypePlugin.js.map +1 -1
  60. package/components/FileManager/getFileUploader.js +5 -0
  61. package/components/FileManager/getFileUploader.js.map +1 -1
  62. package/components/FileManager/graphql.js +14 -3
  63. package/components/FileManager/graphql.js.map +1 -1
  64. package/components/FileManager/outputFileSelectionError.js +14 -0
  65. package/components/FileManager/outputFileSelectionError.js.map +1 -1
  66. package/components/FileManager.js +43 -17
  67. package/components/FileManager.js.map +1 -1
  68. package/components/FloatingActionButton.js +2 -2
  69. package/components/FloatingActionButton.js.map +1 -1
  70. package/components/OverlayLayout/OverlayLayout.js +2 -2
  71. package/components/OverlayLayout/OverlayLayout.js.map +1 -1
  72. package/components/SearchUI.js +2 -2
  73. package/components/SearchUI.js.map +1 -1
  74. package/components/SingleImageUpload.d.ts +1 -1
  75. package/components/SingleImageUpload.js +2 -2
  76. package/components/SingleImageUpload.js.map +1 -1
  77. package/components/SplitView/SplitView.js +1 -0
  78. package/components/SplitView/SplitView.js.map +1 -1
  79. package/components/index.d.ts +1 -1
  80. package/components/index.js +1 -1
  81. package/components/index.js.map +1 -1
  82. package/index.d.ts +2 -3
  83. package/index.js +1 -13
  84. package/index.js.map +1 -1
  85. package/package.json +19 -29
  86. package/plugins/FileManagerFileTypePlugin.js +15 -0
  87. package/plugins/FileManagerFileTypePlugin.js.map +1 -1
  88. package/plugins/fileManager/fileDefault.js +6 -0
  89. package/plugins/fileManager/fileDefault.js.map +1 -1
  90. package/plugins/fileManager/fileImage/DeleteAction.js +40 -16
  91. package/plugins/fileManager/fileImage/DeleteAction.js.map +1 -1
  92. package/plugins/fileManager/fileImage/EditAction.js +58 -22
  93. package/plugins/fileManager/fileImage/EditAction.js.map +1 -1
  94. package/plugins/fileManager/fileImage/index.js +8 -0
  95. package/plugins/fileManager/fileImage/index.js.map +1 -1
  96. package/plugins/fileManager/index.js +2 -0
  97. package/plugins/fileManager/index.js.map +1 -1
  98. package/plugins/globalSearch/SearchBar.js +2 -2
  99. package/plugins/globalSearch/SearchBar.js.map +1 -1
  100. package/plugins/globalSearch/SearchBarDropdown.js +2 -2
  101. package/plugins/globalSearch/SearchBarDropdown.js.map +1 -1
  102. package/plugins/globalSearch/styled.d.ts +13 -4
  103. package/types.d.ts +23 -27
  104. package/types.js.map +1 -1
  105. package/ui/elements/form/FileManagerElement/EmptyStateElementRenderer.js +5 -5
  106. package/ui/elements/form/FileManagerElement/EmptyStateElementRenderer.js.map +1 -1
  107. package/ui/elements/form/FileManagerElement/FileManagerElementRenderer.js +1 -1
  108. package/ui/elements/form/FileManagerElement/FileManagerElementRenderer.js.map +1 -1
  109. package/ui/elements/form/FileManagerElement/styled.d.ts +23 -16
  110. package/ui/views/AdminView/components/Hamburger.js +2 -2
  111. package/ui/views/AdminView/components/Hamburger.js.map +1 -1
  112. package/ui/views/OverlayView/HeaderElement.js +1 -1
  113. package/ui/views/OverlayView/HeaderElement.js.map +1 -1
  114. package/ui/views/OverlayView.js +1 -1
  115. package/ui/views/OverlayView.js.map +1 -1
@@ -1,42 +1,71 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+
4
5
  var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
6
+
5
7
  Object.defineProperty(exports, "__esModule", {
6
8
  value: true
7
9
  });
8
10
  exports.tagWithoutScopePrefix = exports.formatTagAsLabel = exports.default = void 0;
11
+
9
12
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
13
+
10
14
  var _regeneratorRuntime2 = _interopRequireDefault(require("@babel/runtime/helpers/regeneratorRuntime"));
15
+
11
16
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
17
+
12
18
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
19
+
13
20
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
21
+
14
22
  var _react = _interopRequireWildcard(require("react"));
23
+
15
24
  var _classnames = _interopRequireDefault(require("classnames"));
25
+
16
26
  var _emotion = require("emotion");
27
+
17
28
  var _reactHooks = require("@apollo/react-hooks");
29
+
18
30
  var _set = _interopRequireDefault(require("lodash/set"));
31
+
19
32
  var _get = _interopRequireDefault(require("lodash/get"));
33
+
20
34
  var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
35
+
21
36
  var _Chips = require("@webiny/ui/Chips");
37
+
22
38
  var _Button = require("@webiny/ui/Button");
39
+
23
40
  var _AutoComplete = require("@webiny/ui/AutoComplete");
41
+
24
42
  var _Icon = require("@webiny/ui/Icon");
43
+
25
44
  var _form = require("@webiny/form");
45
+
26
46
  var _useSnackbar2 = require("../../../hooks/useSnackbar");
47
+
27
48
  var _FileManagerContext = require("./../FileManagerContext");
49
+
28
50
  var _graphql = require("./../graphql");
51
+
29
52
  var _roundEdit24px = require("./../icons/round-edit-24px.svg");
53
+
30
54
  var _roundLabel24px = require("./../icons/round-label-24px.svg");
55
+
31
56
  var _excluded = ["value"];
32
57
  var SCOPE_SEPARATOR = ":";
58
+
33
59
  var formatTagAsLabel = function formatTagAsLabel(tag, scope) {
34
60
  if (!scope) {
35
61
  return tag;
36
62
  }
63
+
37
64
  return tag.replace("".concat(scope).concat(SCOPE_SEPARATOR), "");
38
65
  };
66
+
39
67
  exports.formatTagAsLabel = formatTagAsLabel;
68
+
40
69
  var tagWithoutScopePrefix = function tagWithoutScopePrefix(tags, scope) {
41
70
  return tags.filter(function (tag) {
42
71
  return tag !== scope;
@@ -44,6 +73,7 @@ var tagWithoutScopePrefix = function tagWithoutScopePrefix(tags, scope) {
44
73
  return formatTagAsLabel(tag, scope);
45
74
  });
46
75
  };
76
+
47
77
  exports.tagWithoutScopePrefix = tagWithoutScopePrefix;
48
78
  var chipsStyle = /*#__PURE__*/(0, _emotion.css)({
49
79
  "&.mdc-chip-set": {
@@ -74,26 +104,33 @@ var actionWrapperStyle = /*#__PURE__*/(0, _emotion.css)({
74
104
  marginRight: 16
75
105
  }
76
106
  }, "label:actionWrapperStyle;");
107
+
77
108
  var Tags = function Tags(_ref) {
78
109
  var file = _ref.file,
79
- canEdit = _ref.canEdit;
110
+ canEdit = _ref.canEdit;
80
111
  var client = (0, _reactHooks.useApolloClient)();
112
+
81
113
  var _useState = (0, _react.useState)(false),
82
- _useState2 = (0, _slicedToArray2.default)(_useState, 2),
83
- editing = _useState2[0],
84
- setEdit = _useState2[1];
114
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
115
+ editing = _useState2[0],
116
+ setEdit = _useState2[1];
117
+
85
118
  var _useState3 = (0, _react.useState)(false),
86
- _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
87
- saving = _useState4[0],
88
- setSaving = _useState4[1];
119
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
120
+ saving = _useState4[0],
121
+ setSaving = _useState4[1];
122
+
89
123
  var _useState5 = (0, _react.useState)(Array.isArray(file.tags) ? (0, _toConsumableArray2.default)(file.tags) : []),
90
- _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
91
- initialTags = _useState6[0],
92
- setInitialTags = _useState6[1];
124
+ _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
125
+ initialTags = _useState6[0],
126
+ setInitialTags = _useState6[1];
127
+
93
128
  var _useSnackbar = (0, _useSnackbar2.useSnackbar)(),
94
- showSnackbar = _useSnackbar.showSnackbar;
129
+ showSnackbar = _useSnackbar.showSnackbar;
130
+
95
131
  var _useFileManager = (0, _FileManagerContext.useFileManager)(),
96
- queryParams = _useFileManager.queryParams;
132
+ queryParams = _useFileManager.queryParams;
133
+
97
134
  var handleEdit = (0, _react.useCallback)(function () {
98
135
  return setEdit(true);
99
136
  }, []);
@@ -107,10 +144,13 @@ var Tags = function Tags(_ref) {
107
144
  var isEditingAllowed = canEdit(file);
108
145
  var renderHeaderContent = (0, _react.useCallback)(function (_ref2) {
109
146
  var data = _ref2.data;
147
+
110
148
  if (editing) {
111
149
  return null;
112
150
  }
151
+
113
152
  var hasTags = data.tags.length > 0;
153
+
114
154
  if (hasTags) {
115
155
  // Render existing tags and "edit tags" action.
116
156
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_Chips.Chips, {
@@ -128,8 +168,9 @@ var Tags = function Tags(_ref) {
128
168
  icon: /*#__PURE__*/_react.default.createElement(_roundEdit24px.ReactComponent, null),
129
169
  onClick: handleEdit
130
170
  }));
131
- }
132
- // Render "add tags" action.
171
+ } // Render "add tags" action.
172
+
173
+
133
174
  return /*#__PURE__*/_react.default.createElement(_Button.ButtonDefault, {
134
175
  className: addTagsStyle,
135
176
  onClick: handleEdit,
@@ -145,91 +186,100 @@ var Tags = function Tags(_ref) {
145
186
  var _ref4 = (0, _asyncToGenerator2.default)( /*#__PURE__*/(0, _regeneratorRuntime2.default)().mark(function _callee(_ref3) {
146
187
  var tags;
147
188
  return (0, _regeneratorRuntime2.default)().wrap(function _callee$(_context) {
148
- while (1) switch (_context.prev = _context.next) {
149
- case 0:
150
- tags = _ref3.tags;
151
- setSaving(true);
152
- client.mutate({
153
- mutation: _graphql.UPDATE_FILE,
154
- variables: {
155
- id: file.id,
156
- data: {
157
- tags: tags
158
- }
159
- },
160
- update: function update(cache, updated) {
161
- var newFileData = (0, _get.default)(updated, "data.fileManager.updateFile.data");
162
-
163
- // 1. Update files list cache
164
- var data = (0, _cloneDeep.default)(cache.readQuery({
165
- query: _graphql.LIST_FILES,
166
- variables: queryParams
167
- }));
168
- if (data) {
169
- data.fileManager.listFiles.data.forEach(function (item) {
170
- if (item.key === newFileData.key) {
171
- item.tags = newFileData.tags;
172
- }
173
- });
174
- }
175
- cache.writeQuery({
176
- query: _graphql.LIST_FILES,
177
- variables: queryParams,
178
- data: data
179
- });
180
- // 2. Update "LIST_TAGS" cache
181
- if (Array.isArray(newFileData.tags)) {
182
- // Get list tags data
183
- var listTagsData = (0, _cloneDeep.default)(cache.readQuery({
184
- query: _graphql.LIST_TAGS,
185
- variables: {
186
- where: (0, _FileManagerContext.getWhere)(queryParams.scope)
187
- }
188
- }));
189
- if (!listTagsData) {
190
- return;
189
+ while (1) {
190
+ switch (_context.prev = _context.next) {
191
+ case 0:
192
+ tags = _ref3.tags;
193
+ setSaving(true);
194
+ client.mutate({
195
+ mutation: _graphql.UPDATE_FILE,
196
+ variables: {
197
+ id: file.id,
198
+ data: {
199
+ tags: tags
191
200
  }
192
- // Add new tag in list
193
- var updatedTagsList = (0, _toConsumableArray2.default)(newFileData.tags);
194
- if (Array.isArray(listTagsData.fileManager.listTags)) {
195
- listTagsData.fileManager.listTags.forEach(function (tag) {
196
- if (!updatedTagsList.includes(tag)) {
197
- updatedTagsList.push(tag);
201
+ },
202
+ update: function update(cache, updated) {
203
+ var newFileData = (0, _get.default)(updated, "data.fileManager.updateFile.data"); // 1. Update files list cache
204
+
205
+ var data = (0, _cloneDeep.default)(cache.readQuery({
206
+ query: _graphql.LIST_FILES,
207
+ variables: queryParams
208
+ }));
209
+
210
+ if (data) {
211
+ data.fileManager.listFiles.data.forEach(function (item) {
212
+ if (item.key === newFileData.key) {
213
+ item.tags = newFileData.tags;
198
214
  }
199
215
  });
200
216
  }
201
- (0, _set.default)(listTagsData, "fileManager.listTags", updatedTagsList);
202
- // Write it to cache
217
+
203
218
  cache.writeQuery({
204
- query: _graphql.LIST_TAGS,
205
- variables: {
206
- where: (0, _FileManagerContext.getWhere)(queryParams.scope)
207
- },
208
- data: listTagsData
209
- });
219
+ query: _graphql.LIST_FILES,
220
+ variables: queryParams,
221
+ data: data
222
+ }); // 2. Update "LIST_TAGS" cache
223
+
224
+ if (Array.isArray(newFileData.tags)) {
225
+ // Get list tags data
226
+ var listTagsData = (0, _cloneDeep.default)(cache.readQuery({
227
+ query: _graphql.LIST_TAGS,
228
+ variables: {
229
+ where: (0, _FileManagerContext.getWhere)(queryParams.scope)
230
+ }
231
+ }));
232
+
233
+ if (!listTagsData) {
234
+ return;
235
+ } // Add new tag in list
236
+
237
+
238
+ var updatedTagsList = (0, _toConsumableArray2.default)(newFileData.tags);
239
+
240
+ if (Array.isArray(listTagsData.fileManager.listTags)) {
241
+ listTagsData.fileManager.listTags.forEach(function (tag) {
242
+ if (!updatedTagsList.includes(tag)) {
243
+ updatedTagsList.push(tag);
244
+ }
245
+ });
246
+ }
247
+
248
+ (0, _set.default)(listTagsData, "fileManager.listTags", updatedTagsList); // Write it to cache
249
+
250
+ cache.writeQuery({
251
+ query: _graphql.LIST_TAGS,
252
+ variables: {
253
+ where: (0, _FileManagerContext.getWhere)(queryParams.scope)
254
+ },
255
+ data: listTagsData
256
+ });
257
+ }
210
258
  }
211
- }
212
- }).then(function () {
213
- setInitialTags(tags);
214
- setSaving(false);
215
- setEdit(false);
216
- showSnackbar("Tags successfully updated.");
217
- });
218
- case 3:
219
- case "end":
220
- return _context.stop();
259
+ }).then(function () {
260
+ setInitialTags(tags);
261
+ setSaving(false);
262
+ setEdit(false);
263
+ showSnackbar("Tags successfully updated.");
264
+ });
265
+
266
+ case 3:
267
+ case "end":
268
+ return _context.stop();
269
+ }
221
270
  }
222
271
  }, _callee);
223
272
  }));
273
+
224
274
  return function (_x) {
225
275
  return _ref4.apply(this, arguments);
226
276
  };
227
277
  }()
228
278
  }, function (_ref5) {
229
279
  var Bind = _ref5.Bind,
230
- data = _ref5.data,
231
- setValue = _ref5.setValue,
232
- submit = _ref5.submit;
280
+ data = _ref5.data,
281
+ setValue = _ref5.setValue,
282
+ submit = _ref5.submit;
233
283
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("li-title", null, /*#__PURE__*/_react.default.createElement(_Icon.Icon, {
234
284
  className: "list-item__icon",
235
285
  icon: /*#__PURE__*/_react.default.createElement(_roundLabel24px.ReactComponent, null)
@@ -245,16 +295,18 @@ var Tags = function Tags(_ref) {
245
295
  /**
246
296
  * If "scope" exists, prefix tag with "scope" if not already.
247
297
  */
298
+
248
299
  if (queryParams.scope && !tagInLowerCase.startsWith(queryParams.scope)) {
249
300
  return "".concat(queryParams.scope).concat(SCOPE_SEPARATOR).concat(tagInLowerCase);
250
301
  }
302
+
251
303
  return tagInLowerCase;
252
304
  });
253
305
  baseOnChange(formattedTags);
254
306
  }
255
307
  }, function (_ref6) {
256
308
  var value = _ref6.value,
257
- bindProps = (0, _objectWithoutProperties2.default)(_ref6, _excluded);
309
+ bindProps = (0, _objectWithoutProperties2.default)(_ref6, _excluded);
258
310
  return /*#__PURE__*/_react.default.createElement(_AutoComplete.MultiAutoComplete, Object.assign({}, bindProps, {
259
311
  value: tagWithoutScopePrefix(value, queryParams.scope),
260
312
  options: allTags,
@@ -282,5 +334,6 @@ var Tags = function Tags(_ref) {
282
334
  }, "Cancel"))));
283
335
  });
284
336
  };
337
+
285
338
  var _default = Tags;
286
339
  exports.default = _default;
@@ -1 +1 @@
1
- {"version":3,"names":["SCOPE_SEPARATOR","formatTagAsLabel","tag","scope","replace","tagWithoutScopePrefix","tags","filter","map","chipsStyle","css","padding","marginLeft","backgroundColor","iconButtonStyle","width","height","addTagsStyle","color","textTransform","letterSpacing","actionWrapperStyle","marginTop","marginRight","Tags","file","canEdit","client","useApolloClient","useState","editing","setEdit","saving","setSaving","Array","isArray","initialTags","setInitialTags","useSnackbar","showSnackbar","useFileManager","queryParams","handleEdit","useCallback","listTagsQuery","useQuery","LIST_TAGS","variables","where","getWhere","listTags","get","allTags","isEditingAllowed","renderHeaderContent","data","hasTags","length","classNames","index","label","name","mutate","mutation","UPDATE_FILE","id","update","cache","updated","newFileData","cloneDeep","readQuery","query","LIST_FILES","fileManager","listFiles","forEach","item","key","writeQuery","listTagsData","updatedTagsList","includes","push","set","then","Bind","setValue","submit","baseOnChange","formattedTags","tagInLowerCase","toLowerCase","startsWith","value","bindProps","ev"],"sources":["Tags.tsx"],"sourcesContent":["import React, { useCallback, useState } from \"react\";\nimport classNames from \"classnames\";\nimport { css } from \"emotion\";\nimport { useApolloClient, useQuery } from \"@apollo/react-hooks\";\nimport set from \"lodash/set\";\nimport get from \"lodash/get\";\nimport cloneDeep from \"lodash/cloneDeep\";\nimport { Chips, Chip } from \"@webiny/ui/Chips\";\nimport { ButtonSecondary, ButtonPrimary, ButtonDefault, IconButton } from \"@webiny/ui/Button\";\nimport { MultiAutoComplete } from \"@webiny/ui/AutoComplete\";\nimport { Icon } from \"@webiny/ui/Icon\";\nimport { Form } from \"@webiny/form\";\nimport { useSnackbar } from \"~/hooks/useSnackbar\";\nimport { getWhere, useFileManager } from \"./../FileManagerContext\";\nimport {\n UPDATE_FILE,\n LIST_FILES,\n LIST_TAGS,\n ListFilesQueryResponse,\n ListFileTagsQueryResponse\n} from \"./../graphql\";\nimport { ReactComponent as EditIcon } from \"./../icons/round-edit-24px.svg\";\nimport { ReactComponent as LabelIcon } from \"./../icons/round-label-24px.svg\";\nimport { FileItem } from \"../types\";\n\nconst SCOPE_SEPARATOR = \":\";\n\nexport const formatTagAsLabel = (tag: string, scope: string | undefined) => {\n if (!scope) {\n return tag;\n }\n return tag.replace(`${scope}${SCOPE_SEPARATOR}`, \"\");\n};\n\nexport const tagWithoutScopePrefix = (tags: string[], scope: string) => {\n return tags.filter(tag => tag !== scope).map(tag => formatTagAsLabel(tag, scope));\n};\n\nconst chipsStyle = css({\n \"&.mdc-chip-set\": {\n padding: 0,\n marginLeft: -4,\n \"& .mdc-chip\": {\n backgroundColor: \"var(--mdc-theme-background)\"\n }\n }\n});\nconst iconButtonStyle = css({\n \"&.mdc-icon-button svg\": {\n width: 20,\n height: 20\n }\n});\nconst addTagsStyle = css({\n \"&.mdc-button:not(:disabled)\": {\n color: \"var(--mdc-theme-text-secondary-on-background)\",\n textTransform: \"capitalize\",\n letterSpacing: \"initial\",\n marginLeft: -8\n }\n});\nconst actionWrapperStyle = css({\n marginTop: 16,\n \"& button:first-child\": {\n marginRight: 16\n }\n});\n\ninterface TagsProps {\n file: FileItem;\n canEdit: (file: FileItem) => boolean;\n}\n\nconst Tags: React.FC<TagsProps> = ({ file, canEdit }) => {\n const client = useApolloClient();\n\n const [editing, setEdit] = useState(false);\n const [saving, setSaving] = useState(false);\n const [initialTags, setInitialTags] = useState(Array.isArray(file.tags) ? [...file.tags] : []);\n const { showSnackbar } = useSnackbar();\n const { queryParams } = useFileManager();\n const handleEdit = useCallback(() => setEdit(true), []);\n const listTagsQuery = useQuery(LIST_TAGS, {\n variables: { where: getWhere(queryParams.scope) }\n });\n const listTags = get(listTagsQuery, \"data.fileManager.listTags\", []);\n const allTags = tagWithoutScopePrefix(listTags, queryParams.scope);\n\n const isEditingAllowed = canEdit(file);\n\n const renderHeaderContent = useCallback(\n ({ data }: { data: { tags: { name: string }[] } }) => {\n if (editing) {\n return null;\n }\n const hasTags = data.tags.length > 0;\n\n if (hasTags) {\n // Render existing tags and \"edit tags\" action.\n return (\n <>\n <Chips className={classNames(\"list-item__content\", chipsStyle)}>\n {data.tags\n .filter(tag => tag !== queryParams.scope)\n .map((tag, index) => {\n const label = typeof tag === \"string\" ? tag : tag.name;\n return (\n <Chip\n key={label + index}\n label={formatTagAsLabel(label, queryParams.scope)}\n />\n );\n })}\n </Chips>\n {isEditingAllowed && (\n <IconButton\n className={iconButtonStyle}\n icon={<EditIcon />}\n onClick={handleEdit}\n />\n )}\n </>\n );\n }\n // Render \"add tags\" action.\n return (\n <ButtonDefault\n className={addTagsStyle}\n onClick={handleEdit}\n disabled={!isEditingAllowed}\n data-testid=\"fm.tags.add\"\n >\n Add tags...\n </ButtonDefault>\n );\n },\n [editing, isEditingAllowed]\n );\n\n return (\n <Form\n data={{\n tags: initialTags\n }}\n onSubmit={async ({ tags }) => {\n setSaving(true);\n client\n .mutate({\n mutation: UPDATE_FILE,\n variables: {\n id: file.id,\n data: { tags }\n },\n update: (cache, updated) => {\n const newFileData: FileItem = get(\n updated,\n \"data.fileManager.updateFile.data\"\n );\n\n // 1. Update files list cache\n const data = cloneDeep(\n cache.readQuery<ListFilesQueryResponse>({\n query: LIST_FILES,\n variables: queryParams\n })\n );\n\n if (data) {\n data.fileManager.listFiles.data.forEach(item => {\n if (item.key === newFileData.key) {\n item.tags = newFileData.tags;\n }\n });\n }\n\n cache.writeQuery({\n query: LIST_FILES,\n variables: queryParams,\n data\n });\n // 2. Update \"LIST_TAGS\" cache\n if (Array.isArray(newFileData.tags)) {\n // Get list tags data\n const listTagsData = cloneDeep(\n cache.readQuery<ListFileTagsQueryResponse>({\n query: LIST_TAGS,\n variables: { where: getWhere(queryParams.scope) }\n })\n );\n if (!listTagsData) {\n return;\n }\n // Add new tag in list\n const updatedTagsList = [...newFileData.tags];\n\n if (Array.isArray(listTagsData.fileManager.listTags)) {\n listTagsData.fileManager.listTags.forEach(tag => {\n if (!updatedTagsList.includes(tag)) {\n updatedTagsList.push(tag);\n }\n });\n }\n\n set(listTagsData, \"fileManager.listTags\", updatedTagsList);\n // Write it to cache\n cache.writeQuery({\n query: LIST_TAGS,\n variables: { where: getWhere(queryParams.scope) },\n data: listTagsData\n });\n }\n }\n })\n .then(() => {\n setInitialTags(tags);\n setSaving(false);\n setEdit(false);\n showSnackbar(\"Tags successfully updated.\");\n });\n }}\n >\n {({ Bind, data, setValue, submit }) => (\n <React.Fragment>\n <li-title>\n <Icon className={\"list-item__icon\"} icon={<LabelIcon />} />\n {renderHeaderContent({\n // TODO @ts-refactor\n // @ts-ignore\n data\n })}\n </li-title>\n {editing && (\n <li-content>\n <Bind\n name={\"tags\"}\n beforeChange={(\n tags: string[],\n baseOnChange: (tags: string[]) => void\n ) => {\n const formattedTags = tags.map(tag => {\n const tagInLowerCase = tag.toLowerCase();\n /**\n * If \"scope\" exists, prefix tag with \"scope\" if not already.\n */\n if (\n queryParams.scope &&\n !tagInLowerCase.startsWith(queryParams.scope)\n ) {\n return `${queryParams.scope}${SCOPE_SEPARATOR}${tagInLowerCase}`;\n }\n return tagInLowerCase;\n });\n baseOnChange(formattedTags);\n }}\n >\n {({ value, ...bindProps }) => (\n <MultiAutoComplete\n {...bindProps}\n value={tagWithoutScopePrefix(value, queryParams.scope)}\n options={allTags}\n placeholder={\"homepage asset\"}\n description={\"Type in a new tag or select an existing one.\"}\n unique={true}\n allowFreeInput={true}\n useSimpleValues={true}\n disabled={saving}\n />\n )}\n </Bind>\n <div className={actionWrapperStyle}>\n <ButtonPrimary\n small\n onClick={ev => {\n submit(ev);\n }}\n data-testid={\"fm.tags.submit\"}\n >\n Submit\n </ButtonPrimary>\n <ButtonSecondary\n small\n onClick={() => {\n setValue(\"tags\", initialTags);\n setEdit(false);\n }}\n >\n Cancel\n </ButtonSecondary>\n </div>\n </li-content>\n )}\n </React.Fragment>\n )}\n </Form>\n );\n};\n\nexport default Tags;\n"],"mappings":"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"}
1
+ {"version":3,"names":["SCOPE_SEPARATOR","formatTagAsLabel","tag","scope","replace","tagWithoutScopePrefix","tags","filter","map","chipsStyle","css","padding","marginLeft","backgroundColor","iconButtonStyle","width","height","addTagsStyle","color","textTransform","letterSpacing","actionWrapperStyle","marginTop","marginRight","Tags","file","canEdit","client","useApolloClient","useState","editing","setEdit","saving","setSaving","Array","isArray","initialTags","setInitialTags","useSnackbar","showSnackbar","useFileManager","queryParams","handleEdit","useCallback","listTagsQuery","useQuery","LIST_TAGS","variables","where","getWhere","listTags","get","allTags","isEditingAllowed","renderHeaderContent","data","hasTags","length","classNames","index","label","name","mutate","mutation","UPDATE_FILE","id","update","cache","updated","newFileData","cloneDeep","readQuery","query","LIST_FILES","fileManager","listFiles","forEach","item","key","writeQuery","listTagsData","updatedTagsList","includes","push","set","then","Bind","setValue","submit","baseOnChange","formattedTags","tagInLowerCase","toLowerCase","startsWith","value","bindProps","ev"],"sources":["Tags.tsx"],"sourcesContent":["import React, { useCallback, useState } from \"react\";\nimport classNames from \"classnames\";\nimport { css } from \"emotion\";\nimport { useApolloClient, useQuery } from \"@apollo/react-hooks\";\nimport set from \"lodash/set\";\nimport get from \"lodash/get\";\nimport cloneDeep from \"lodash/cloneDeep\";\nimport { Chips, Chip } from \"@webiny/ui/Chips\";\nimport { ButtonSecondary, ButtonPrimary, ButtonDefault, IconButton } from \"@webiny/ui/Button\";\nimport { MultiAutoComplete } from \"@webiny/ui/AutoComplete\";\nimport { Icon } from \"@webiny/ui/Icon\";\nimport { Form } from \"@webiny/form\";\nimport { useSnackbar } from \"~/hooks/useSnackbar\";\nimport { getWhere, useFileManager } from \"./../FileManagerContext\";\nimport {\n UPDATE_FILE,\n LIST_FILES,\n LIST_TAGS,\n ListFilesQueryResponse,\n ListFileTagsQueryResponse\n} from \"./../graphql\";\nimport { ReactComponent as EditIcon } from \"./../icons/round-edit-24px.svg\";\nimport { ReactComponent as LabelIcon } from \"./../icons/round-label-24px.svg\";\nimport { FileItem } from \"../types\";\n\nconst SCOPE_SEPARATOR = \":\";\n\nexport const formatTagAsLabel = (tag: string, scope: string | undefined) => {\n if (!scope) {\n return tag;\n }\n return tag.replace(`${scope}${SCOPE_SEPARATOR}`, \"\");\n};\n\nexport const tagWithoutScopePrefix = (tags: string[], scope: string) => {\n return tags.filter(tag => tag !== scope).map(tag => formatTagAsLabel(tag, scope));\n};\n\nconst chipsStyle = css({\n \"&.mdc-chip-set\": {\n padding: 0,\n marginLeft: -4,\n \"& .mdc-chip\": {\n backgroundColor: \"var(--mdc-theme-background)\"\n }\n }\n});\nconst iconButtonStyle = css({\n \"&.mdc-icon-button svg\": {\n width: 20,\n height: 20\n }\n});\nconst addTagsStyle = css({\n \"&.mdc-button:not(:disabled)\": {\n color: \"var(--mdc-theme-text-secondary-on-background)\",\n textTransform: \"capitalize\",\n letterSpacing: \"initial\",\n marginLeft: -8\n }\n});\nconst actionWrapperStyle = css({\n marginTop: 16,\n \"& button:first-child\": {\n marginRight: 16\n }\n});\n\ninterface TagsProps {\n file: FileItem;\n canEdit: (file: FileItem) => boolean;\n}\n\nconst Tags: React.FC<TagsProps> = ({ file, canEdit }) => {\n const client = useApolloClient();\n\n const [editing, setEdit] = useState(false);\n const [saving, setSaving] = useState(false);\n const [initialTags, setInitialTags] = useState(Array.isArray(file.tags) ? [...file.tags] : []);\n const { showSnackbar } = useSnackbar();\n const { queryParams } = useFileManager();\n const handleEdit = useCallback(() => setEdit(true), []);\n const listTagsQuery = useQuery(LIST_TAGS, {\n variables: { where: getWhere(queryParams.scope) }\n });\n const listTags = get(listTagsQuery, \"data.fileManager.listTags\", []);\n const allTags = tagWithoutScopePrefix(listTags, queryParams.scope);\n\n const isEditingAllowed = canEdit(file);\n\n const renderHeaderContent = useCallback(\n ({ data }: { data: { tags: { name: string }[] } }) => {\n if (editing) {\n return null;\n }\n const hasTags = data.tags.length > 0;\n\n if (hasTags) {\n // Render existing tags and \"edit tags\" action.\n return (\n <>\n <Chips className={classNames(\"list-item__content\", chipsStyle)}>\n {data.tags\n .filter(tag => tag !== queryParams.scope)\n .map((tag, index) => {\n const label = typeof tag === \"string\" ? tag : tag.name;\n return (\n <Chip\n key={label + index}\n label={formatTagAsLabel(label, queryParams.scope)}\n />\n );\n })}\n </Chips>\n {isEditingAllowed && (\n <IconButton\n className={iconButtonStyle}\n icon={<EditIcon />}\n onClick={handleEdit}\n />\n )}\n </>\n );\n }\n // Render \"add tags\" action.\n return (\n <ButtonDefault\n className={addTagsStyle}\n onClick={handleEdit}\n disabled={!isEditingAllowed}\n data-testid=\"fm.tags.add\"\n >\n Add tags...\n </ButtonDefault>\n );\n },\n [editing, isEditingAllowed]\n );\n\n return (\n <Form\n data={{\n tags: initialTags\n }}\n onSubmit={async ({ tags }) => {\n setSaving(true);\n client\n .mutate({\n mutation: UPDATE_FILE,\n variables: {\n id: file.id,\n data: { tags }\n },\n update: (cache, updated) => {\n const newFileData: FileItem = get(\n updated,\n \"data.fileManager.updateFile.data\"\n );\n\n // 1. Update files list cache\n const data = cloneDeep(\n cache.readQuery<ListFilesQueryResponse>({\n query: LIST_FILES,\n variables: queryParams\n })\n );\n\n if (data) {\n data.fileManager.listFiles.data.forEach(item => {\n if (item.key === newFileData.key) {\n item.tags = newFileData.tags;\n }\n });\n }\n\n cache.writeQuery({\n query: LIST_FILES,\n variables: queryParams,\n data\n });\n // 2. Update \"LIST_TAGS\" cache\n if (Array.isArray(newFileData.tags)) {\n // Get list tags data\n const listTagsData = cloneDeep(\n cache.readQuery<ListFileTagsQueryResponse>({\n query: LIST_TAGS,\n variables: { where: getWhere(queryParams.scope) }\n })\n );\n if (!listTagsData) {\n return;\n }\n // Add new tag in list\n const updatedTagsList = [...newFileData.tags];\n\n if (Array.isArray(listTagsData.fileManager.listTags)) {\n listTagsData.fileManager.listTags.forEach(tag => {\n if (!updatedTagsList.includes(tag)) {\n updatedTagsList.push(tag);\n }\n });\n }\n\n set(listTagsData, \"fileManager.listTags\", updatedTagsList);\n // Write it to cache\n cache.writeQuery({\n query: LIST_TAGS,\n variables: { where: getWhere(queryParams.scope) },\n data: listTagsData\n });\n }\n }\n })\n .then(() => {\n setInitialTags(tags);\n setSaving(false);\n setEdit(false);\n showSnackbar(\"Tags successfully updated.\");\n });\n }}\n >\n {({ Bind, data, setValue, submit }) => (\n <React.Fragment>\n <li-title>\n <Icon className={\"list-item__icon\"} icon={<LabelIcon />} />\n {renderHeaderContent({\n // TODO @ts-refactor\n // @ts-ignore\n data\n })}\n </li-title>\n {editing && (\n <li-content>\n <Bind\n name={\"tags\"}\n beforeChange={(\n tags: string[],\n baseOnChange: (tags: string[]) => void\n ) => {\n const formattedTags = tags.map(tag => {\n const tagInLowerCase = tag.toLowerCase();\n /**\n * If \"scope\" exists, prefix tag with \"scope\" if not already.\n */\n if (\n queryParams.scope &&\n !tagInLowerCase.startsWith(queryParams.scope)\n ) {\n return `${queryParams.scope}${SCOPE_SEPARATOR}${tagInLowerCase}`;\n }\n return tagInLowerCase;\n });\n baseOnChange(formattedTags);\n }}\n >\n {({ value, ...bindProps }) => (\n <MultiAutoComplete\n {...bindProps}\n value={tagWithoutScopePrefix(value, queryParams.scope)}\n options={allTags}\n placeholder={\"homepage asset\"}\n description={\"Type in a new tag or select an existing one.\"}\n unique={true}\n allowFreeInput={true}\n useSimpleValues={true}\n disabled={saving}\n />\n )}\n </Bind>\n <div className={actionWrapperStyle}>\n <ButtonPrimary\n small\n onClick={ev => {\n submit(ev);\n }}\n data-testid={\"fm.tags.submit\"}\n >\n Submit\n </ButtonPrimary>\n <ButtonSecondary\n small\n onClick={() => {\n setValue(\"tags\", initialTags);\n setEdit(false);\n }}\n >\n Cancel\n </ButtonSecondary>\n </div>\n </li-content>\n )}\n </React.Fragment>\n )}\n </Form>\n );\n};\n\nexport default Tags;\n"],"mappings":"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"}