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

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.
@@ -35,6 +35,7 @@ var _Array$isArray = require('@babel/runtime-corejs3/core-js-stable/array/is-arr
35
35
  var _Set = require('@babel/runtime-corejs3/core-js-stable/set');
36
36
  var _sortInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/sort');
37
37
  var _indexOfInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/index-of');
38
+ var _trimInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/trim');
38
39
  var moment = require('moment');
39
40
  var _findInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/find');
40
41
  var _everyInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/every');
@@ -44,11 +45,9 @@ var actionsGlobal = require('@commercetools-frontend/actions-global');
44
45
  var constants = require('@commercetools-frontend/constants');
45
46
  var _styled = require('@emotion/styled/base');
46
47
  var _includesInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/includes');
47
- var _trimInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/trim');
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');
@@ -75,12 +74,12 @@ var _Array$isArray__default = /*#__PURE__*/_interopDefault(_Array$isArray);
75
74
  var _Set__default = /*#__PURE__*/_interopDefault(_Set);
76
75
  var _sortInstanceProperty__default = /*#__PURE__*/_interopDefault(_sortInstanceProperty);
77
76
  var _indexOfInstanceProperty__default = /*#__PURE__*/_interopDefault(_indexOfInstanceProperty);
77
+ var _trimInstanceProperty__default = /*#__PURE__*/_interopDefault(_trimInstanceProperty);
78
78
  var moment__default = /*#__PURE__*/_interopDefault(moment);
79
79
  var _findInstanceProperty__default = /*#__PURE__*/_interopDefault(_findInstanceProperty);
80
80
  var _everyInstanceProperty__default = /*#__PURE__*/_interopDefault(_everyInstanceProperty);
81
81
  var _styled__default = /*#__PURE__*/_interopDefault(_styled);
82
82
  var _includesInstanceProperty__default = /*#__PURE__*/_interopDefault(_includesInstanceProperty);
83
- var _trimInstanceProperty__default = /*#__PURE__*/_interopDefault(_trimInstanceProperty);
84
83
  var throttle__default = /*#__PURE__*/_interopDefault(throttle);
85
84
  var get__default = /*#__PURE__*/_interopDefault(get);
86
85
 
@@ -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,27 @@ 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
+ var _context3;
562
+ if (!filters) {
563
+ return false;
564
+ }
565
+ return filters.where !== undefined && _trimInstanceProperty__default["default"](_context3 = filters.where).call(_context3) !== '';
566
+ }
567
+ function getInitialExportType(args) {
568
+ var _args$selectedResourc, _args$filters;
569
+ if ((_args$selectedResourc = args.selectedResourceIds) !== null && _args$selectedResourc !== void 0 && _args$selectedResourc.length) {
570
+ return EXPORT_TYPES.SELECTED;
571
+ }
572
+ if ((_args$filters = args.filters) !== null && _args$filters !== void 0 && _args$filters.total) {
573
+ return EXPORT_TYPES.FILTERED;
574
+ }
575
+ return EXPORT_TYPES.ALL;
549
576
  }
550
577
 
551
578
  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 +725,7 @@ const useInitialValues = props => {
698
725
  groups = updateFieldGroupsWithIsExpandedValue(groups, cachedExpandedGroups[props.resourceType] || {});
699
726
  return {
700
727
  outputFormat: props.outputFormat,
701
- fileName: "".concat(resourceTypeToFileName({
702
- resourceType: props.resourceType,
703
- isUpperCase: true,
704
- isPlural: true
705
- })),
728
+ fileName: "".concat(resourceTypeToFileName(props.resourceType)),
706
729
  locales: [locale],
707
730
  groups: updateFieldGroupWithAdditionalFieldExtensions(groups)
708
731
  };
@@ -773,7 +796,13 @@ const useStartExportOperation = props => {
773
796
  const startExportOperation = async values => {
774
797
  try {
775
798
  const fields = extractFieldsFromGroups(values.groups);
776
- const filters = tmpBuildFilters(props.selectedResourceIds);
799
+ let filters = undefined;
800
+ if (props.exportType === EXPORT_TYPES.SELECTED) filters = buildSelectedExportFilters(props.selectedResourceIds);
801
+ if (props.exportType === EXPORT_TYPES.FILTERED) {
802
+ filters = props.filters.where;
803
+ // TODO: handle search query when Export API supports it
804
+ // filters = props.filters.where || props.filters.searchQuery
805
+ }
777
806
  const response = await createExportOperation({
778
807
  projectKey,
779
808
  resourceType: props.resourceType,
@@ -781,7 +810,7 @@ const useStartExportOperation = props => {
781
810
  fileFormat: values.outputFormat,
782
811
  locales: values.locales,
783
812
  fields,
784
- filters,
813
+ filters: typeof filters === 'string' ? [filters] : undefined,
785
814
  asyncDispatchFn: asyncDispatch
786
815
  });
787
816
  switch (response.state) {
@@ -824,19 +853,21 @@ const useStartExportOperation = props => {
824
853
  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
854
  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
855
  function ExportScopeSection() {
827
- var _originalSelectedReso;
856
+ const intl = reactIntl.useIntl();
828
857
  const _useExportResourcesCo = useExportResourcesContext(),
829
858
  exportType = _useExportResourcesCo.exportType,
830
859
  totalResourcesCount = _useExportResourcesCo.totalResourcesCount,
831
- originalSelectedResourceIds = _useExportResourcesCo.originalSelectedResourceIds,
832
- onScopeChange = _useExportResourcesCo.onScopeChange,
860
+ filters = _useExportResourcesCo.filters,
861
+ selectedResourceIds = _useExportResourcesCo.selectedResourceIds,
862
+ hasFilters = _useExportResourcesCo.hasFilters,
863
+ setExportType = _useExportResourcesCo.setExportType,
833
864
  resourceType = _useExportResourcesCo.resourceType;
834
865
  return jsxRuntime.jsx(uiKit.Spacings.Stack, {
835
866
  scale: "m",
836
867
  children: jsxRuntime.jsxs(uiKit.RadioInput.Group, {
837
868
  value: exportType,
838
869
  onChange: e => {
839
- onScopeChange(e.target.value);
870
+ setExportType(e.target.value);
840
871
  },
841
872
  direction: "stack",
842
873
  directionProps: {
@@ -847,18 +878,29 @@ function ExportScopeSection() {
847
878
  children: jsxRuntime.jsx(uiKit.Text.Body, {
848
879
  intlMessage: _objectSpread$5(_objectSpread$5({}, resourceTypeMessages[resourceType].exportScopeAll), {}, {
849
880
  values: {
850
- total: new Intl.NumberFormat().format(totalResourcesCount)
881
+ total: intl.formatNumber(totalResourcesCount)
851
882
  }
852
883
  })
853
884
  })
885
+ }), filters && jsxRuntime.jsx(uiKit.RadioInput.Option, {
886
+ value: EXPORT_TYPES.FILTERED,
887
+ isDisabled: !filters.total,
888
+ children: jsxRuntime.jsx(uiKit.Text.Body, {
889
+ tone: !hasFilters ? 'tertiary' : undefined,
890
+ intlMessage: filters.total ? _objectSpread$5(_objectSpread$5({}, resourceTypeMessages[resourceType].exportScopeFiltered), {}, {
891
+ values: {
892
+ total: intl.formatNumber(filters.total)
893
+ }
894
+ }) : messages.exportScopeFilteredWithoutCount
895
+ })
854
896
  }), jsxRuntime.jsx(uiKit.RadioInput.Option, {
855
897
  value: EXPORT_TYPES.SELECTED,
856
- isDisabled: !(originalSelectedResourceIds !== null && originalSelectedResourceIds !== void 0 && originalSelectedResourceIds.length),
898
+ isDisabled: !(selectedResourceIds !== null && selectedResourceIds !== void 0 && selectedResourceIds.length),
857
899
  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), {}, {
900
+ tone: !(selectedResourceIds !== null && selectedResourceIds !== void 0 && selectedResourceIds.length) ? 'tertiary' : undefined,
901
+ intlMessage: selectedResourceIds !== null && selectedResourceIds !== void 0 && selectedResourceIds.length ? _objectSpread$5(_objectSpread$5({}, resourceTypeMessages[resourceType].exportScopeSelected), {}, {
860
902
  values: {
861
- total: new Intl.NumberFormat().format((_originalSelectedReso = originalSelectedResourceIds === null || originalSelectedResourceIds === void 0 ? void 0 : originalSelectedResourceIds.length) !== null && _originalSelectedReso !== void 0 ? _originalSelectedReso : 0)
903
+ total: intl.formatNumber(selectedResourceIds.length)
862
904
  }
863
905
  }) : messages.exportScopeSelectedWithoutCount
864
906
  })
@@ -1481,20 +1523,21 @@ const ExportResourcesContext = /*#__PURE__*/React.createContext();
1481
1523
  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
1524
  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
1525
  const ExportResourcesProvider = props => {
1484
- var _props$selectedResour;
1485
1526
  const initialValues = useInitialValues(props);
1486
1527
  const _React$useState = React__default["default"].useState(1),
1487
1528
  _React$useState2 = _slicedToArray(_React$useState, 2),
1488
1529
  currentStep = _React$useState2[0],
1489
1530
  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
- }),
1531
+ const _React$useState3 = React__default["default"].useState(getInitialExportType({
1532
+ selectedResourceIds: props.selectedResourceIds,
1533
+ filters: props.filters
1534
+ })),
1494
1535
  _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)),
1536
+ exportType = _React$useState4[0],
1537
+ setExportType = _React$useState4[1];
1538
+ const _useStartExportOperat = useStartExportOperation(_objectSpread$1(_objectSpread$1({}, props), {}, {
1539
+ exportType
1540
+ })),
1498
1541
  startExportOperation = _useStartExportOperat.startExportOperation;
1499
1542
  const onSubmit = async values => {
1500
1543
  if (currentStep === 1) {
@@ -1503,19 +1546,6 @@ const ExportResourcesProvider = props => {
1503
1546
  startExportOperation(values);
1504
1547
  }
1505
1548
  };
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
1549
  const formik$1 = formik.useFormik({
1520
1550
  initialValues,
1521
1551
  validate: values => validate({
@@ -1534,11 +1564,12 @@ const ExportResourcesProvider = props => {
1534
1564
  setCurrentStep,
1535
1565
  onClose: props.onClose,
1536
1566
  resourceType: props.resourceType,
1537
- exportType: scope.exportType,
1567
+ exportType: exportType,
1538
1568
  totalResourcesCount: props.totalResourcesCount,
1539
- selectedResourceIds: scope.selectedResourceIds,
1540
- originalSelectedResourceIds: props.selectedResourceIds,
1541
- onScopeChange
1569
+ selectedResourceIds: props.selectedResourceIds,
1570
+ filters: props.filters,
1571
+ hasFilters: hasFilters(props.filters),
1572
+ setExportType
1542
1573
  },
1543
1574
  children: props.children
1544
1575
  });