@bigbinary/neeto-tags-frontend 1.5.5 → 1.5.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # neeto-tags-nano
1
+ # neetoTagsNano
2
2
 
3
3
  This repo acts as the source of truth for the new nano's structure, configs,
4
4
  data etc.
@@ -55,6 +55,9 @@
55
55
  "nameMaxLength": "Name must be less than {{length}} characters.",
56
56
  "nameRequired": "Name is a required field.",
57
57
  "nameMustBeString": "Name must be a string"
58
+ },
59
+ "shortcuts": {
60
+ "addTag": "Add Tags"
58
61
  }
59
62
  }
60
63
  }
package/dist/index.cjs.js CHANGED
@@ -5,13 +5,14 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var React = require('react');
6
6
  var neetoCist = require('@bigbinary/neeto-cist');
7
7
  var constants = require('@bigbinary/neeto-commons-frontend/constants');
8
+ var reactUtils = require('@bigbinary/neeto-commons-frontend/react-utils');
8
9
  var neetoIcons = require('@bigbinary/neeto-icons');
9
10
  var neetoui = require('@bigbinary/neetoui');
10
11
  var ramda = require('ramda');
11
12
  var reactI18next = require('react-i18next');
13
+ var i18next = require('i18next');
12
14
  var classNames = require('classnames');
13
15
  var reactRouterDom = require('react-router-dom');
14
- var reactUtils = require('@bigbinary/neeto-commons-frontend/react-utils');
15
16
  var Container = require('@bigbinary/neeto-molecules/Container');
16
17
  var PageLoader = require('@bigbinary/neeto-molecules/PageLoader');
17
18
  var SubHeader = require('@bigbinary/neeto-molecules/SubHeader');
@@ -20,7 +21,6 @@ var reactQuery = require('react-query');
20
21
  var axios = require('axios');
21
22
  var NeetoHeader = require('@bigbinary/neeto-molecules/Header');
22
23
  var formik = require('@bigbinary/neetoui/formik');
23
- var i18next = require('i18next');
24
24
  var yup = require('yup');
25
25
  var devtools = require('react-query/devtools');
26
26
 
@@ -124,18 +124,70 @@ function _slicedToArray(arr, i) {
124
124
  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
125
125
  }
126
126
 
127
+ var KEYBOARD_SHORTCUTS = {
128
+ addTag: {
129
+ sequence: "t",
130
+ description: i18next.t("neetoTags.shortcuts.addTag")
131
+ }
132
+ };
133
+
127
134
  var e=[],t=[];function n(n,r){if(n&&"undefined"!=typeof document){var a,s=!0===r.prepend?"prepend":"append",d=!0===r.singleTag,i="string"==typeof r.container?document.querySelector(r.container):document.getElementsByTagName("head")[0];if(d){var u=e.indexOf(i);-1===u&&(u=e.push(i)-1,t[u]={}),a=t[u]&&t[u][s]?t[u][s]:t[u][s]=c();}else a=c();65279===n.charCodeAt(0)&&(n=n.substring(1)),a.styleSheet?a.styleSheet.cssText+=n:a.appendChild(document.createTextNode(n));}function c(){var e=document.createElement("style");if(e.setAttribute("type","text/css"),r.attributes)for(var t=Object.keys(r.attributes),n=0;n<t.length;n++)e.setAttribute(t[n],r.attributes[t[n]]);var a="prepend"===s?"afterbegin":"beforeend";return i.insertAdjacentElement(a,e),e}}
128
135
 
129
- var css$1 = ".neeto-chat__metadata-card__spinner{scale:.6}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwcC9qYXZhc2NyaXB0L3NyYy9jb21wb25lbnRzL1RhZ3Mvc3R5bGVzLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0NBQ0UsUUFDRiIsInNvdXJjZXNDb250ZW50IjpbIi5uZWV0by1jaGF0X19tZXRhZGF0YS1jYXJkX19zcGlubmVyIHtcbiAgc2NhbGU6IDAuNjtcbn1cbiJdfQ== */";
136
+ var css$1 = ".neeto-tags__metadata-card__spinner{scale:.6}\n/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwcC9qYXZhc2NyaXB0L3NyYy9jb21wb25lbnRzL1RhZ3Mvc3R5bGVzLnNjc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsb0NBQ0UsUUFDRiIsInNvdXJjZXNDb250ZW50IjpbIi5uZWV0by10YWdzX19tZXRhZGF0YS1jYXJkX19zcGlubmVyIHtcbiAgc2NhbGU6IDAuNjtcbn1cbiJdfQ== */";
130
137
  n(css$1,{});
131
138
 
139
+ var TagsList = function TagsList(_ref) {
140
+ var selectedTags = _ref.selectedTags,
141
+ isDisabled = _ref.isDisabled,
142
+ handleDeleteTag = _ref.handleDeleteTag,
143
+ tagProps = _ref.tagProps;
144
+ return /*#__PURE__*/React__default["default"].createElement("div", {
145
+ className: "neeto-ui-flex neeto-ui-flex-row neeto-ui-flex-wrap neeto-ui-items-start neeto-ui-justify-start gap-2 break-all"
146
+ }, selectedTags === null || selectedTags === void 0 ? void 0 : selectedTags.map(function (tag) {
147
+ return /*#__PURE__*/React__default["default"].createElement(neetoui.Tag, _extends({
148
+ disabled: isDisabled,
149
+ key: tag.value,
150
+ label: tag.label,
151
+ style: "primary",
152
+ className: classNames__default["default"]({
153
+ "cursor-not-allowed opacity-50": isDisabled
154
+ }),
155
+ onClose: function onClose() {
156
+ return !isDisabled && handleDeleteTag(tag);
157
+ }
158
+ }, tagProps));
159
+ }));
160
+ };
161
+
162
+ var TagsSelector = reactUtils.withT(function (_ref) {
163
+ var t = _ref.t,
164
+ defaultMenuIsOpen = _ref.defaultMenuIsOpen,
165
+ tags = _ref.tags,
166
+ onChange = _ref.onChange,
167
+ onCreateOption = _ref.onCreateOption,
168
+ selectProps = _ref.selectProps;
169
+ return /*#__PURE__*/React__default["default"].createElement(neetoui.Select, _extends({
170
+ defaultMenuIsOpen: defaultMenuIsOpen,
171
+ onChange: onChange,
172
+ onCreateOption: onCreateOption,
173
+ autoFocus: true,
174
+ isCreateable: true,
175
+ className: "neeto-ui-mt-4",
176
+ maxLength: 50,
177
+ options: tags,
178
+ placeholder: t("neetoTags.placeholder.selectOrCreateTag")
179
+ }, selectProps));
180
+ });
181
+
132
182
  var Title = function Title(_ref) {
133
183
  var _ref$titleProps = _ref.titleProps,
134
184
  titleProps = _ref$titleProps === void 0 ? {} : _ref$titleProps,
135
185
  title = _ref.title,
136
186
  isUpdating = _ref.isUpdating,
137
187
  setIsTagsDropdownVisible = _ref.setIsTagsDropdownVisible,
138
- showAddTagsOnTitle = _ref.showAddTagsOnTitle;
188
+ showAddTagsOnTitle = _ref.showAddTagsOnTitle,
189
+ isDisabled = _ref.isDisabled,
190
+ isLoading = _ref.isLoading;
139
191
  var _useTranslation = reactI18next.useTranslation(),
140
192
  t = _useTranslation.t;
141
193
  var tagsTitle = title || t("neetoTags.common.tag", constants.PLURAL);
@@ -169,12 +221,13 @@ var Title = function Title(_ref) {
169
221
  weight: "bold"
170
222
  }, titleProps), tagsTitle), /*#__PURE__*/React__default["default"].createElement("div", {
171
223
  className: "inline-flex h-6 items-center"
172
- }, isUpdating && /*#__PURE__*/React__default["default"].createElement(neetoui.Spinner, {
173
- className: "neeto-chat__metadata-card__spinner"
224
+ }, (isUpdating || isLoading) && /*#__PURE__*/React__default["default"].createElement(neetoui.Spinner, {
225
+ className: "neeto-tags__metadata-card__spinner"
174
226
  }), !isUpdating && isCheckIconVisible && /*#__PURE__*/React__default["default"].createElement(neetoIcons.Check, {
175
227
  className: "neeto-ui-text-success-500",
176
228
  size: 20
177
229
  }))), showAddTagsOnTitle && /*#__PURE__*/React__default["default"].createElement(neetoui.Button, {
230
+ disabled: isDisabled,
178
231
  icon: neetoIcons.Settings,
179
232
  size: "15",
180
233
  style: "icon",
@@ -211,16 +264,24 @@ var Tags$2 = function Tags(_ref) {
211
264
  isUpdating = _ref$isUpdating === void 0 ? false : _ref$isUpdating,
212
265
  _ref$showAddTagsOnTit = _ref.showAddTagsOnTitle,
213
266
  showAddTagsOnTitle = _ref$showAddTagsOnTit === void 0 ? true : _ref$showAddTagsOnTit,
267
+ _ref$isLoading = _ref.isLoading,
268
+ isLoading = _ref$isLoading === void 0 ? false : _ref$isLoading,
214
269
  _ref$showTitleBar = _ref.showTitleBar,
215
270
  showTitleBar = _ref$showTitleBar === void 0 ? true : _ref$showTitleBar,
216
271
  _ref$bodyProps = _ref.bodyProps,
217
- bodyProps = _ref$bodyProps === void 0 ? {} : _ref$bodyProps;
272
+ bodyProps = _ref$bodyProps === void 0 ? {} : _ref$bodyProps,
273
+ _ref$isDisabled = _ref.isDisabled,
274
+ isDisabled = _ref$isDisabled === void 0 ? false : _ref$isDisabled;
218
275
  var _useTranslation = reactI18next.useTranslation(),
219
276
  t = _useTranslation.t;
220
277
  var _useState = React.useState(false),
221
278
  _useState2 = _slicedToArray(_useState, 2),
222
279
  isTagsDropdownVisible = _useState2[0],
223
280
  setIsTagsDropdownVisible = _useState2[1];
281
+ reactUtils.useHotKeys(KEYBOARD_SHORTCUTS.addTag.sequence, function (event) {
282
+ event.preventDefault();
283
+ setIsTagsDropdownVisible(true);
284
+ });
224
285
  var tags = React.useMemo(function () {
225
286
  if (!allTags) return [];
226
287
  if (!selectedTags) return allTags;
@@ -249,44 +310,40 @@ var Tags$2 = function Tags(_ref) {
249
310
  };
250
311
  var isAddTagsButtonVisible = !showAddTagsOnTitle && !isTagsDropdownVisible;
251
312
  var isTagsBodyVisible = neetoCist.isNotEmpty(selectedTags) || isTagsDropdownVisible || isAddTagsButtonVisible;
252
- return /*#__PURE__*/React__default["default"].createElement("div", _extends({
253
- className: "neeto-ui-tags-wrapper flex w-full flex-col items-start gap-2"
254
- }, containerProps), showTitleBar && /*#__PURE__*/React__default["default"].createElement(Title, {
313
+ var titleComponentProps = {
314
+ isDisabled: isDisabled,
315
+ isLoading: isLoading,
255
316
  isUpdating: isUpdating,
256
317
  setIsTagsDropdownVisible: setIsTagsDropdownVisible,
257
318
  showAddTagsOnTitle: showAddTagsOnTitle,
258
319
  title: title,
259
320
  titleProps: titleProps
260
- }), isTagsBodyVisible && /*#__PURE__*/React__default["default"].createElement("div", _extends({
261
- className: "neeto-ui-bg-white neeto-ui-border-gray-300 neeto-ui-rounded-lg w-full border p-4"
262
- }, bodyProps), neetoCist.isNotEmpty(selectedTags) && /*#__PURE__*/React__default["default"].createElement("div", {
263
- className: "neeto-ui-flex neeto-ui-flex-row neeto-ui-flex-wrap neeto-ui-items-start neeto-ui-justify-start gap-2 break-all"
264
- }, selectedTags === null || selectedTags === void 0 ? void 0 : selectedTags.map(function (tag, index) {
265
- return /*#__PURE__*/React__default["default"].createElement(neetoui.Tag, _extends({
266
- key: "".concat(index, "-").concat(tag.label),
267
- label: tag.label,
268
- style: "primary",
269
- onClose: function onClose() {
270
- return handleDeleteTag(tag);
271
- }
272
- }, tagProps));
273
- })), isTagsDropdownVisible && /*#__PURE__*/React__default["default"].createElement(neetoui.Select, _extends({
274
- autoFocus: true,
275
- isCreateable: true,
276
- className: "neeto-ui-mt-4",
321
+ };
322
+ var tagsListProps = {
323
+ handleDeleteTag: handleDeleteTag,
324
+ isDisabled: isDisabled,
325
+ selectedTags: selectedTags,
326
+ tagProps: tagProps
327
+ };
328
+ var tagsSelectorProps = {
277
329
  defaultMenuIsOpen: showAddTagsOnTitle,
278
- maxLength: 50,
279
- options: tags,
280
- placeholder: t("neetoTags.placeholder.selectOrCreateTag"),
330
+ tags: tags,
281
331
  onChange: function onChange(event) {
282
332
  return handleAddExistingTag(event);
283
333
  },
284
334
  onCreateOption: function onCreateOption(event) {
285
335
  setIsTagsDropdownVisible(false);
286
336
  onTagCreate(event);
287
- }
288
- }, selectProps)), isAddTagsButtonVisible && /*#__PURE__*/React__default["default"].createElement(neetoui.Button, _extends({
337
+ },
338
+ selectProps: selectProps
339
+ };
340
+ return /*#__PURE__*/React__default["default"].createElement("div", _extends({
341
+ className: "neeto-ui-tags-wrapper flex w-full flex-col items-start gap-2"
342
+ }, containerProps), showTitleBar && /*#__PURE__*/React__default["default"].createElement(Title, titleComponentProps), isTagsBodyVisible && /*#__PURE__*/React__default["default"].createElement("div", _extends({
343
+ className: "neeto-ui-bg-white neeto-ui-border-gray-300 neeto-ui-rounded-lg w-full border p-4"
344
+ }, bodyProps), neetoCist.isNotEmpty(selectedTags) && /*#__PURE__*/React__default["default"].createElement(TagsList, tagsListProps), isTagsDropdownVisible && /*#__PURE__*/React__default["default"].createElement(TagsSelector, tagsSelectorProps), isAddTagsButtonVisible && /*#__PURE__*/React__default["default"].createElement(neetoui.Button, _extends({
289
345
  className: "neeto-ui-mt-4",
346
+ disabled: isDisabled,
290
347
  icon: neetoIcons.Plus,
291
348
  label: t("neetoTags.button.addTag", constants.SINGULAR),
292
349
  size: "small",
@@ -501,9 +558,6 @@ var Header = function Header(_ref) {
501
558
  tagsMergable = _ref$tagsMergable === void 0 ? false : _ref$tagsMergable,
502
559
  setPaneType = _ref.setPaneType,
503
560
  setSelectedTag = _ref.setSelectedTag,
504
- _ref$searchTerm = _ref.searchTerm,
505
- searchTerm = _ref$searchTerm === void 0 ? "" : _ref$searchTerm,
506
- setSearchTerm = _ref.setSearchTerm,
507
561
  _ref$goToFirstPage = _ref.goToFirstPage,
508
562
  goToFirstPage = _ref$goToFirstPage === void 0 ? neetoCist.noop : _ref$goToFirstPage,
509
563
  _ref$tagsPath = _ref.tagsPath,
@@ -512,6 +566,9 @@ var Header = function Header(_ref) {
512
566
  var _useTranslation = reactI18next.useTranslation(),
513
567
  t = _useTranslation.t;
514
568
  var history = reactRouterDom.useHistory();
569
+ var resetPage = reactUtils.useFuncDebounce(function () {
570
+ return goToFirstPage();
571
+ });
515
572
  var ActionBlock = function ActionBlock() {
516
573
  return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, tagsMergable && /*#__PURE__*/React__default["default"].createElement(neetoui.Button, {
517
574
  "data-cy": "neeto-tags-merge-tags-button",
@@ -529,17 +586,12 @@ var Header = function Header(_ref) {
529
586
  }));
530
587
  };
531
588
  return /*#__PURE__*/React__default["default"].createElement(NeetoHeader__default["default"], {
532
- actionBlock: /*#__PURE__*/React__default["default"].createElement(ActionBlock, null),
533
589
  breadcrumbs: breadcrumbs,
590
+ actionBlock: /*#__PURE__*/React__default["default"].createElement(ActionBlock, null),
534
591
  title: t("neetoTags.common.tag", constants.PLURAL),
535
592
  searchProps: {
536
593
  "data-cy": "neeto-tags-search-text-input-field",
537
- value: searchTerm,
538
- onChange: function onChange(_ref2) {
539
- var value = _ref2.target.value;
540
- value.trim() && goToFirstPage();
541
- setSearchTerm(value);
542
- },
594
+ onChange: resetPage,
543
595
  placeholder: t("neetoTags.placeholder.searchTags")
544
596
  }
545
597
  });
@@ -774,26 +826,24 @@ var Dashboard = function Dashboard(_ref) {
774
826
  _useState2 = _slicedToArray(_useState, 2),
775
827
  selectedTag = _useState2[0],
776
828
  setSelectedTag = _useState2[1];
777
- var _useState3 = React.useState(""),
829
+ var _useState3 = React.useState(constants.DEFAULT_PAGE_INDEX),
778
830
  _useState4 = _slicedToArray(_useState3, 2),
779
- searchTerm = _useState4[0],
780
- setSearchTerm = _useState4[1];
781
- var _useState5 = React.useState(constants.DEFAULT_PAGE_INDEX),
831
+ page = _useState4[0],
832
+ setPage = _useState4[1];
833
+ var _useState5 = React.useState(null),
782
834
  _useState6 = _slicedToArray(_useState5, 2),
783
- page = _useState6[0],
784
- setPage = _useState6[1];
785
- var _useState7 = React.useState(null),
835
+ paneType = _useState6[0],
836
+ setPaneType = _useState6[1];
837
+ var _useState7 = React.useState(false),
786
838
  _useState8 = _slicedToArray(_useState7, 2),
787
- paneType = _useState8[0],
788
- setPaneType = _useState8[1];
789
- var _useState9 = React.useState(false),
790
- _useState10 = _slicedToArray(_useState9, 2),
791
- isDeleteAlertOpen = _useState10[0],
792
- setIsDeleteAlertOpen = _useState10[1];
793
- var debouncedSearchTerm = reactUtils.useDebounce(searchTerm, 500);
839
+ isDeleteAlertOpen = _useState8[0],
840
+ setIsDeleteAlertOpen = _useState8[1];
841
+ var _useQueryParams = reactUtils.useQueryParams(),
842
+ _useQueryParams$searc = _useQueryParams.search_term,
843
+ searchTerm = _useQueryParams$searc === void 0 ? "" : _useQueryParams$searc;
794
844
  var _useFetchTags = useFetchTags({
795
845
  url: tagType.url,
796
- searchTerm: debouncedSearchTerm.trim(),
846
+ searchTerm: searchTerm,
797
847
  pageSize: constants.DEFAULT_PAGE_SIZE,
798
848
  page: page
799
849
  }),
@@ -861,9 +911,7 @@ var Dashboard = function Dashboard(_ref) {
861
911
  breadcrumbs: breadcrumbs,
862
912
  data: data,
863
913
  displayMenu: displayMenu,
864
- searchTerm: searchTerm,
865
914
  setPaneType: setPaneType,
866
- setSearchTerm: setSearchTerm,
867
915
  setSelectedTag: setSelectedTag,
868
916
  tagsMergable: tagsMergable,
869
917
  tagsPath: tagsPath,