@commercetools-frontend-extensions/export-resources-modal 4.3.5 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -48,7 +48,6 @@ var _trimInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/insta
48
48
  var throttle = require('lodash/throttle');
49
49
  var react = require('@emotion/react');
50
50
  var get = require('lodash/get');
51
- require('prop-types');
52
51
  var formik = require('formik');
53
52
  var sentry = require('@commercetools-frontend/sentry');
54
53
  var i18n = require('@commercetools-frontend/i18n');
@@ -112,6 +111,11 @@ var messages = reactIntl.defineMessages({
112
111
  description: 'Label for the inventories modal title',
113
112
  defaultMessage: 'Export inventories'
114
113
  },
114
+ 'modalTitle.discount-code': {
115
+ id: 'ExportResourcesModal.modalTitle.discountCode',
116
+ description: 'Label for the discount codes modal title',
117
+ defaultMessage: 'Export discount codes'
118
+ },
115
119
  outputFormat: {
116
120
  id: 'ExportResourcesModal.outputFormat',
117
121
  description: 'File format like (csv, xls, ...etc)',
@@ -261,11 +265,31 @@ var messages = reactIntl.defineMessages({
261
265
  description: 'Label for Export Selected inventories',
262
266
  defaultMessage: 'Export selected: {total} inventories'
263
267
  },
268
+ exportScopeAllDiscountCodes: {
269
+ id: 'ExportResourcesModal.exportScopeAllDiscountCodes',
270
+ description: 'Label for Export All discount codes',
271
+ defaultMessage: 'Export all: {total} discount codes'
272
+ },
273
+ exportScopeSelectedDiscountCodes: {
274
+ id: 'ExportResourcesModal.exportScopeSelectedDiscountCodes',
275
+ description: 'Label for Export Selected discount codes',
276
+ defaultMessage: 'Export selected: {total} discount codes'
277
+ },
278
+ exportScopeFilteredDiscountCodes: {
279
+ id: 'ExportResourcesModal.exportScopeFilteredDiscountCodes',
280
+ description: 'Label for Export Selected discount codes',
281
+ defaultMessage: 'Export filtered: {total} discount codes'
282
+ },
264
283
  exportScopeSelectedWithoutCount: {
265
284
  id: 'ExportResourcesModal.exportScopeSelectedWithoutCount',
266
285
  description: 'Label for Export Selected without count',
267
286
  defaultMessage: 'Export selected'
268
287
  },
288
+ exportScopeFilteredWithoutCount: {
289
+ id: 'ExportResourcesModal.exportScopeFilteredWithoutCount',
290
+ description: 'Label for Export Filtered without count',
291
+ defaultMessage: 'Export filtered'
292
+ },
269
293
  exportSettings: {
270
294
  id: 'ExportResourcesModal.exportSettings',
271
295
  description: 'Label for Export Settings',
@@ -431,8 +455,7 @@ const EXPORT_TYPES = {
431
455
  const EXPORTABLE_RESOURCES = {
432
456
  CATEGORY: 'category',
433
457
  PRODUCT: 'product',
434
- // TODO: remove this and its usage
435
- DISCOUNT_CODE: 'discountCode',
458
+ DISCOUNT_CODE: 'discount-code',
436
459
  INVENTORY_ENTRY: 'inventory-entry'
437
460
  };
438
461
 
@@ -449,47 +472,39 @@ const OUTPUT_FORMAT_OPTIONS = [{
449
472
  }];
450
473
 
451
474
  const resourceTypeMessages = {
452
- category: {
475
+ [EXPORTABLE_RESOURCES.CATEGORY]: {
453
476
  exportScopeAll: messages.exportScopeAllCategories,
454
477
  exportScopeSelected: messages.exportScopeSelectedCategories
455
478
  },
456
- product: {
479
+ [EXPORTABLE_RESOURCES.PRODUCT]: {
457
480
  exportScopeAll: messages.exportScopeAllProducts,
458
481
  exportScopeSelected: messages.exportScopeSelectedProducts
459
482
  },
460
- 'inventory-entry': {
483
+ [EXPORTABLE_RESOURCES.INVENTORY_ENTRY]: {
461
484
  exportScopeAll: messages.exportScopeAllInventories,
462
485
  exportScopeSelected: messages.exportScopeSelectedInventories
486
+ },
487
+ [EXPORTABLE_RESOURCES.DISCOUNT_CODE]: {
488
+ exportScopeAll: messages.exportScopeAllDiscountCodes,
489
+ exportScopeSelected: messages.exportScopeSelectedDiscountCodes,
490
+ exportScopeFiltered: messages.exportScopeFilteredDiscountCodes
463
491
  }
464
492
  };
465
493
 
466
- function resourceTypeToFileName(_ref) {
494
+ function resourceTypeToFileName(resourceType) {
467
495
  var _context;
468
- let resourceType = _ref.resourceType,
469
- _ref$isUpperCase = _ref.isUpperCase,
470
- isUpperCase = _ref$isUpperCase === void 0 ? false : _ref$isUpperCase,
471
- _ref$isPlural = _ref.isPlural,
472
- isPlural = _ref$isPlural === void 0 ? false : _ref$isPlural;
473
496
  const todayFormatted = moment__default["default"]().format('DD-MM-YY_HH-mm');
474
- let displayName;
475
- switch (resourceType) {
476
- case EXPORTABLE_RESOURCES.CATEGORY:
477
- displayName = isPlural ? 'Categories' : 'Category';
478
- break;
479
- case EXPORTABLE_RESOURCES.PRODUCT:
480
- displayName = isPlural ? 'Products' : 'Product';
481
- break;
482
- case EXPORTABLE_RESOURCES.DISCOUNT_CODE:
483
- displayName = isPlural ? 'Discount Codes' : 'Discount Code';
484
- break;
485
- case EXPORTABLE_RESOURCES.INVENTORY_ENTRY:
486
- displayName = isPlural ? 'Inventories' : 'Inventory';
487
- break;
488
- default:
489
- throw new UnexpectedResourceTypeError(resourceType);
497
+ const resourceTypeMap = {
498
+ [EXPORTABLE_RESOURCES.CATEGORY]: 'Categories',
499
+ [EXPORTABLE_RESOURCES.PRODUCT]: 'Products',
500
+ [EXPORTABLE_RESOURCES.DISCOUNT_CODE]: 'Discount_Codes',
501
+ [EXPORTABLE_RESOURCES.INVENTORY_ENTRY]: 'Inventories'
502
+ };
503
+ const displayName = resourceTypeMap[resourceType];
504
+ if (!displayName) {
505
+ throw new UnexpectedResourceTypeError(resourceType);
490
506
  }
491
- const result = isUpperCase ? displayName : displayName.toLowerCase();
492
- return _concatInstanceProperty__default["default"](_context = "".concat(result, "_Export_")).call(_context, todayFormatted);
507
+ return _concatInstanceProperty__default["default"](_context = "".concat(displayName, "_Export_")).call(_context, todayFormatted);
493
508
  }
494
509
  function mapLocalesToOptions(locales) {
495
510
  return _mapInstanceProperty__default["default"](locales).call(locales, locale => ({
@@ -521,9 +536,9 @@ const extractFieldNamesAndAdditionalFieldExtensions = fields => {
521
536
  }, []);
522
537
  return [...new _Set__default["default"](result)];
523
538
  };
524
- function sortFieldsByFieldOrder(_ref2) {
525
- let fields = _ref2.fields,
526
- fieldOrder = _ref2.fieldOrder;
539
+ function sortFieldsByFieldOrder(_ref) {
540
+ let fields = _ref.fields,
541
+ fieldOrder = _ref.fieldOrder;
527
542
  if (isFilledArray(fieldOrder)) {
528
543
  return _sortInstanceProperty__default["default"](fields).call(fields, (a, b) => {
529
544
  let orderA = _indexOfInstanceProperty__default["default"](fieldOrder).call(fieldOrder, a) !== -1 ? _indexOfInstanceProperty__default["default"](fieldOrder).call(fieldOrder, a) : _indexOfInstanceProperty__default["default"](fieldOrder).call(fieldOrder, a.split('.')[0]);
@@ -537,15 +552,29 @@ function sortFieldsByFieldOrder(_ref2) {
537
552
  }
538
553
  return fields;
539
554
  }
540
-
541
- // TODO: remove this function when filters are passed directly from parent views
542
- // This function is temporary and will be removed in the future
543
- // Later, filters will be passed directly from parent views (category, product...) instead of being built within the Export resources modal
544
- // The `selectedResourceIds` prop will also be removed
545
- function tmpBuildFilters(selectedResourceIds) {
555
+ function buildSelectedExportFilters(selectedResourceIds) {
546
556
  if (!selectedResourceIds || (selectedResourceIds === null || selectedResourceIds === void 0 ? void 0 : selectedResourceIds.length) === 0) return undefined;
547
557
  const formattedIds = _mapInstanceProperty__default["default"](selectedResourceIds).call(selectedResourceIds, id => "\"".concat(id, "\"")).join(', ');
548
- return ["id in (".concat(formattedIds, ")")];
558
+ return "id in (".concat(formattedIds, ")");
559
+ }
560
+ function hasFilters(filters) {
561
+ if (!filters) {
562
+ return false;
563
+ }
564
+ if (_Array$isArray__default["default"](filters)) {
565
+ return filters.length > 0;
566
+ }
567
+ return _Object$keys__default["default"](filters).length > 0;
568
+ }
569
+ function getInitialExportType(args) {
570
+ var _args$selectedResourc, _args$filters;
571
+ if ((_args$selectedResourc = args.selectedResourceIds) !== null && _args$selectedResourc !== void 0 && _args$selectedResourc.length) {
572
+ return EXPORT_TYPES.SELECTED;
573
+ }
574
+ if ((_args$filters = args.filters) !== null && _args$filters !== void 0 && _args$filters.total) {
575
+ return EXPORT_TYPES.FILTERED;
576
+ }
577
+ return EXPORT_TYPES.ALL;
549
578
  }
550
579
 
551
580
  function ownKeys$6(e, r) { var t = _Object$keys__default["default"](e); if (_Object$getOwnPropertySymbols__default["default"]) { var o = _Object$getOwnPropertySymbols__default["default"](e); r && (o = _filterInstanceProperty__default["default"](o).call(o, function (r) { return _Object$getOwnPropertyDescriptor__default["default"](e, r).enumerable; })), t.push.apply(t, o); } return t; }
@@ -698,11 +727,7 @@ const useInitialValues = props => {
698
727
  groups = updateFieldGroupsWithIsExpandedValue(groups, cachedExpandedGroups[props.resourceType] || {});
699
728
  return {
700
729
  outputFormat: props.outputFormat,
701
- fileName: "".concat(resourceTypeToFileName({
702
- resourceType: props.resourceType,
703
- isUpperCase: true,
704
- isPlural: true
705
- })),
730
+ fileName: "".concat(resourceTypeToFileName(props.resourceType)),
706
731
  locales: [locale],
707
732
  groups: updateFieldGroupWithAdditionalFieldExtensions(groups)
708
733
  };
@@ -773,7 +798,13 @@ const useStartExportOperation = props => {
773
798
  const startExportOperation = async values => {
774
799
  try {
775
800
  const fields = extractFieldsFromGroups(values.groups);
776
- const filters = tmpBuildFilters(props.selectedResourceIds);
801
+ let filters = undefined;
802
+ if (props.exportType === EXPORT_TYPES.SELECTED) filters = buildSelectedExportFilters(props.selectedResourceIds);
803
+ if (props.exportType === EXPORT_TYPES.FILTERED) {
804
+ filters = props.filters.where;
805
+ // TODO: handle search query when Export API supports it
806
+ // filters = props.filters.where || props.filters.searchQuery
807
+ }
777
808
  const response = await createExportOperation({
778
809
  projectKey,
779
810
  resourceType: props.resourceType,
@@ -781,7 +812,7 @@ const useStartExportOperation = props => {
781
812
  fileFormat: values.outputFormat,
782
813
  locales: values.locales,
783
814
  fields,
784
- filters,
815
+ filters: typeof filters === 'string' ? [filters] : undefined,
785
816
  asyncDispatchFn: asyncDispatch
786
817
  });
787
818
  switch (response.state) {
@@ -824,19 +855,21 @@ const useStartExportOperation = props => {
824
855
  function ownKeys$5(e, r) { var t = _Object$keys__default["default"](e); if (_Object$getOwnPropertySymbols__default["default"]) { var o = _Object$getOwnPropertySymbols__default["default"](e); r && (o = _filterInstanceProperty__default["default"](o).call(o, function (r) { return _Object$getOwnPropertyDescriptor__default["default"](e, r).enumerable; })), t.push.apply(t, o); } return t; }
825
856
  function _objectSpread$5(e) { for (var r = 1; r < arguments.length; r++) { var _context, _context2; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty__default["default"](_context = ownKeys$5(Object(t), !0)).call(_context, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors__default["default"] ? _Object$defineProperties__default["default"](e, _Object$getOwnPropertyDescriptors__default["default"](t)) : _forEachInstanceProperty__default["default"](_context2 = ownKeys$5(Object(t))).call(_context2, function (r) { _Object$defineProperty__default["default"](e, r, _Object$getOwnPropertyDescriptor__default["default"](t, r)); }); } return e; }
826
857
  function ExportScopeSection() {
827
- var _originalSelectedReso;
858
+ const intl = reactIntl.useIntl();
828
859
  const _useExportResourcesCo = useExportResourcesContext(),
829
860
  exportType = _useExportResourcesCo.exportType,
830
861
  totalResourcesCount = _useExportResourcesCo.totalResourcesCount,
831
- originalSelectedResourceIds = _useExportResourcesCo.originalSelectedResourceIds,
832
- onScopeChange = _useExportResourcesCo.onScopeChange,
862
+ filters = _useExportResourcesCo.filters,
863
+ selectedResourceIds = _useExportResourcesCo.selectedResourceIds,
864
+ hasFilters = _useExportResourcesCo.hasFilters,
865
+ setExportType = _useExportResourcesCo.setExportType,
833
866
  resourceType = _useExportResourcesCo.resourceType;
834
867
  return jsxRuntime.jsx(uiKit.Spacings.Stack, {
835
868
  scale: "m",
836
869
  children: jsxRuntime.jsxs(uiKit.RadioInput.Group, {
837
870
  value: exportType,
838
871
  onChange: e => {
839
- onScopeChange(e.target.value);
872
+ setExportType(e.target.value);
840
873
  },
841
874
  direction: "stack",
842
875
  directionProps: {
@@ -847,18 +880,29 @@ function ExportScopeSection() {
847
880
  children: jsxRuntime.jsx(uiKit.Text.Body, {
848
881
  intlMessage: _objectSpread$5(_objectSpread$5({}, resourceTypeMessages[resourceType].exportScopeAll), {}, {
849
882
  values: {
850
- total: new Intl.NumberFormat().format(totalResourcesCount)
883
+ total: intl.formatNumber(totalResourcesCount)
851
884
  }
852
885
  })
853
886
  })
887
+ }), filters && jsxRuntime.jsx(uiKit.RadioInput.Option, {
888
+ value: EXPORT_TYPES.FILTERED,
889
+ isDisabled: !filters.total,
890
+ children: jsxRuntime.jsx(uiKit.Text.Body, {
891
+ tone: !hasFilters ? 'tertiary' : undefined,
892
+ intlMessage: filters.total ? _objectSpread$5(_objectSpread$5({}, resourceTypeMessages[resourceType].exportScopeFiltered), {}, {
893
+ values: {
894
+ total: intl.formatNumber(filters.total)
895
+ }
896
+ }) : messages.exportScopeFilteredWithoutCount
897
+ })
854
898
  }), jsxRuntime.jsx(uiKit.RadioInput.Option, {
855
899
  value: EXPORT_TYPES.SELECTED,
856
- isDisabled: !(originalSelectedResourceIds !== null && originalSelectedResourceIds !== void 0 && originalSelectedResourceIds.length),
900
+ isDisabled: !(selectedResourceIds !== null && selectedResourceIds !== void 0 && selectedResourceIds.length),
857
901
  children: jsxRuntime.jsx(uiKit.Text.Body, {
858
- tone: !(originalSelectedResourceIds !== null && originalSelectedResourceIds !== void 0 && originalSelectedResourceIds.length) ? 'tertiary' : undefined,
859
- intlMessage: originalSelectedResourceIds !== null && originalSelectedResourceIds !== void 0 && originalSelectedResourceIds.length ? _objectSpread$5(_objectSpread$5({}, resourceTypeMessages[resourceType].exportScopeSelected), {}, {
902
+ tone: !(selectedResourceIds !== null && selectedResourceIds !== void 0 && selectedResourceIds.length) ? 'tertiary' : undefined,
903
+ intlMessage: selectedResourceIds !== null && selectedResourceIds !== void 0 && selectedResourceIds.length ? _objectSpread$5(_objectSpread$5({}, resourceTypeMessages[resourceType].exportScopeSelected), {}, {
860
904
  values: {
861
- total: new Intl.NumberFormat().format((_originalSelectedReso = originalSelectedResourceIds === null || originalSelectedResourceIds === void 0 ? void 0 : originalSelectedResourceIds.length) !== null && _originalSelectedReso !== void 0 ? _originalSelectedReso : 0)
905
+ total: intl.formatNumber(selectedResourceIds.length)
862
906
  }
863
907
  }) : messages.exportScopeSelectedWithoutCount
864
908
  })
@@ -1481,20 +1525,21 @@ const ExportResourcesContext = /*#__PURE__*/React.createContext();
1481
1525
  function ownKeys$1(e, r) { var t = _Object$keys__default["default"](e); if (_Object$getOwnPropertySymbols__default["default"]) { var o = _Object$getOwnPropertySymbols__default["default"](e); r && (o = _filterInstanceProperty__default["default"](o).call(o, function (r) { return _Object$getOwnPropertyDescriptor__default["default"](e, r).enumerable; })), t.push.apply(t, o); } return t; }
1482
1526
  function _objectSpread$1(e) { for (var r = 1; r < arguments.length; r++) { var _context, _context2; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty__default["default"](_context = ownKeys$1(Object(t), !0)).call(_context, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors__default["default"] ? _Object$defineProperties__default["default"](e, _Object$getOwnPropertyDescriptors__default["default"](t)) : _forEachInstanceProperty__default["default"](_context2 = ownKeys$1(Object(t))).call(_context2, function (r) { _Object$defineProperty__default["default"](e, r, _Object$getOwnPropertyDescriptor__default["default"](t, r)); }); } return e; }
1483
1527
  const ExportResourcesProvider = props => {
1484
- var _props$selectedResour;
1485
1528
  const initialValues = useInitialValues(props);
1486
1529
  const _React$useState = React__default["default"].useState(1),
1487
1530
  _React$useState2 = _slicedToArray(_React$useState, 2),
1488
1531
  currentStep = _React$useState2[0],
1489
1532
  setCurrentStep = _React$useState2[1];
1490
- const _React$useState3 = React__default["default"].useState({
1491
- exportType: (_props$selectedResour = props.selectedResourceIds) !== null && _props$selectedResour !== void 0 && _props$selectedResour.length ? EXPORT_TYPES.SELECTED : EXPORT_TYPES.ALL,
1492
- selectedResourceIds: props.selectedResourceIds
1493
- }),
1533
+ const _React$useState3 = React__default["default"].useState(getInitialExportType({
1534
+ selectedResourceIds: props.selectedResourceIds,
1535
+ filters: props.filters
1536
+ })),
1494
1537
  _React$useState4 = _slicedToArray(_React$useState3, 2),
1495
- scope = _React$useState4[0],
1496
- setScope = _React$useState4[1];
1497
- const _useStartExportOperat = useStartExportOperation(_objectSpread$1(_objectSpread$1({}, props), scope)),
1538
+ exportType = _React$useState4[0],
1539
+ setExportType = _React$useState4[1];
1540
+ const _useStartExportOperat = useStartExportOperation(_objectSpread$1(_objectSpread$1({}, props), {}, {
1541
+ exportType
1542
+ })),
1498
1543
  startExportOperation = _useStartExportOperat.startExportOperation;
1499
1544
  const onSubmit = async values => {
1500
1545
  if (currentStep === 1) {
@@ -1503,19 +1548,6 @@ const ExportResourcesProvider = props => {
1503
1548
  startExportOperation(values);
1504
1549
  }
1505
1550
  };
1506
- const onScopeChange = value => {
1507
- if (value === EXPORT_TYPES.ALL) {
1508
- setScope({
1509
- exportType: value,
1510
- selectedResourceIds: []
1511
- });
1512
- } else {
1513
- setScope({
1514
- exportType: value,
1515
- selectedResourceIds: props.selectedResourceIds
1516
- });
1517
- }
1518
- };
1519
1551
  const formik$1 = formik.useFormik({
1520
1552
  initialValues,
1521
1553
  validate: values => validate({
@@ -1534,11 +1566,12 @@ const ExportResourcesProvider = props => {
1534
1566
  setCurrentStep,
1535
1567
  onClose: props.onClose,
1536
1568
  resourceType: props.resourceType,
1537
- exportType: scope.exportType,
1569
+ exportType: exportType,
1538
1570
  totalResourcesCount: props.totalResourcesCount,
1539
- selectedResourceIds: scope.selectedResourceIds,
1540
- originalSelectedResourceIds: props.selectedResourceIds,
1541
- onScopeChange
1571
+ selectedResourceIds: props.selectedResourceIds,
1572
+ filters: props.filters,
1573
+ hasFilters: hasFilters(props.filters),
1574
+ setExportType
1542
1575
  },
1543
1576
  children: props.children
1544
1577
  });