@commercetools-frontend-extensions/export-resources-modal 0.0.0-canary-20240821150843 → 0.0.0-canary-20240823130607

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
@@ -130,7 +130,7 @@ import ExportResourcesModal from '@commercetools-frontend-extensions/export-reso
130
130
  outputFormat="csv"
131
131
  resourceType="category"
132
132
  filters={{
133
- where: 'key = "category-key"',
133
+ queryPredicate: 'key = "category-key"',
134
134
  total: 20
135
135
  }}
136
136
  totalResourcesCount={143}
@@ -36,6 +36,7 @@ var _Array$isArray = require('@babel/runtime-corejs3/core-js-stable/array/is-arr
36
36
  var _Set = require('@babel/runtime-corejs3/core-js-stable/set');
37
37
  var _sortInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/sort');
38
38
  var _indexOfInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/index-of');
39
+ var _trimInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/trim');
39
40
  var moment = require('moment');
40
41
  var _someInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/some');
41
42
  var _findInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/find');
@@ -73,6 +74,7 @@ var _Array$isArray__default = /*#__PURE__*/_interopDefault(_Array$isArray);
73
74
  var _Set__default = /*#__PURE__*/_interopDefault(_Set);
74
75
  var _sortInstanceProperty__default = /*#__PURE__*/_interopDefault(_sortInstanceProperty);
75
76
  var _indexOfInstanceProperty__default = /*#__PURE__*/_interopDefault(_indexOfInstanceProperty);
77
+ var _trimInstanceProperty__default = /*#__PURE__*/_interopDefault(_trimInstanceProperty);
76
78
  var moment__default = /*#__PURE__*/_interopDefault(moment);
77
79
  var _someInstanceProperty__default = /*#__PURE__*/_interopDefault(_someInstanceProperty);
78
80
  var _findInstanceProperty__default = /*#__PURE__*/_interopDefault(_findInstanceProperty);
@@ -634,11 +636,23 @@ function buildSelectedExportFilters(selectedResourceIds) {
634
636
  const formattedIds = _mapInstanceProperty__default["default"](selectedResourceIds).call(selectedResourceIds, id => `"${id}"`).join(', ');
635
637
  return `id in (${formattedIds})`;
636
638
  }
639
+ function validateFilters(filters) {
640
+ var _context;
641
+ const hasQueryPredicate = typeof filters.queryPredicate === 'string' && _trimInstanceProperty__default["default"](_context = filters.queryPredicate).call(_context) !== '';
642
+ const hasSearchQuery = !!(filters.searchQuery && typeof filters.searchQuery === 'object');
643
+ const hasValidTotal = typeof filters.total === 'number' && filters.total >= 0;
644
+
645
+ // Ensure only one of `queryPredicate` or `searchQuery` is applied
646
+ const onlyOneFilterApplied = hasQueryPredicate && !hasSearchQuery || !hasQueryPredicate && hasSearchQuery;
647
+ return onlyOneFilterApplied && hasValidTotal;
648
+ }
637
649
  function areFiltersApplied(filters) {
638
650
  if (!filters) {
639
651
  return false;
640
652
  }
641
- return filters.where !== undefined && filters.where?.trim() !== '';
653
+ const hasQueryPredicate = (filters.queryPredicate?.trim() ?? '') !== '';
654
+ const hasSearchQuery = _Object$keys__default["default"](filters.searchQuery ?? {}).length > 0;
655
+ return hasQueryPredicate || hasSearchQuery;
642
656
  }
643
657
  function getInitialExportType(args) {
644
658
  if (args.selectedResourceIds?.length) {
@@ -807,6 +821,7 @@ async function createExportOperation(_ref) {
807
821
  fields = _ref.fields,
808
822
  locales = _ref.locales,
809
823
  filters = _ref.filters,
824
+ where = _ref.where,
810
825
  asyncDispatchFn = _ref.asyncDispatchFn;
811
826
  const uri = `/${projectKey}/export-operations`;
812
827
  const response = await asyncDispatchFn(sdk.actions.post({
@@ -821,6 +836,9 @@ async function createExportOperation(_ref) {
821
836
  fileFormat,
822
837
  fields,
823
838
  locales,
839
+ // Query predicate
840
+ where,
841
+ // Search API filters
824
842
  filters
825
843
  }
826
844
  }));
@@ -859,13 +877,6 @@ const useStartExportOperation = props => {
859
877
  const startExportOperation = async values => {
860
878
  try {
861
879
  const fields = extractFieldsFromGroups(values.groups);
862
- let filters = undefined;
863
- if (props.exportType === EXPORT_TYPES.SELECTED) filters = buildSelectedExportFilters(props.selectedResourceIds);
864
- if (props.exportType === EXPORT_TYPES.FILTERED) {
865
- filters = props.filters.where;
866
- // TODO: handle search query when Export API supports it
867
- // filters = props.filters.where || props.filters.searchQuery
868
- }
869
880
  const response = await createExportOperation({
870
881
  projectKey,
871
882
  resourceType: props.resourceType,
@@ -873,7 +884,8 @@ const useStartExportOperation = props => {
873
884
  fileFormat: values.outputFormat,
874
885
  locales: values.locales,
875
886
  fields,
876
- filters: typeof filters === 'string' ? [filters] : undefined,
887
+ where: props.exportType === EXPORT_TYPES.SELECTED ? buildSelectedExportFilters(props.selectedResourceIds) : props.filters?.queryPredicate,
888
+ filters: props.filters?.searchQuery,
877
889
  asyncDispatchFn: asyncDispatch
878
890
  });
879
891
  switch (response.state) {
@@ -1759,6 +1771,10 @@ const ExportResourcesModal = props => {
1759
1771
  locale = _useApplicationContex.locale;
1760
1772
  const messages = useAsyncIntlMessages(locale, loadMessages);
1761
1773
  if (!props.isOpen || messages.isLoading) return null;
1774
+ if (props.filters && !validateFilters(props.filters)) {
1775
+ console.error('Invalid filters prop:', props.filters, 'Filters must have either a valid `queryPredicate` or a valid `searchQuery`, but not both.');
1776
+ return null;
1777
+ }
1762
1778
  return jsxRuntime.jsx(reactIntl.IntlProvider, {
1763
1779
  locale: locale,
1764
1780
  messages: messages.messages,
@@ -36,6 +36,7 @@ var _Array$isArray = require('@babel/runtime-corejs3/core-js-stable/array/is-arr
36
36
  var _Set = require('@babel/runtime-corejs3/core-js-stable/set');
37
37
  var _sortInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/sort');
38
38
  var _indexOfInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/index-of');
39
+ var _trimInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/trim');
39
40
  var moment = require('moment');
40
41
  var _someInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/some');
41
42
  var _findInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/find');
@@ -73,6 +74,7 @@ var _Array$isArray__default = /*#__PURE__*/_interopDefault(_Array$isArray);
73
74
  var _Set__default = /*#__PURE__*/_interopDefault(_Set);
74
75
  var _sortInstanceProperty__default = /*#__PURE__*/_interopDefault(_sortInstanceProperty);
75
76
  var _indexOfInstanceProperty__default = /*#__PURE__*/_interopDefault(_indexOfInstanceProperty);
77
+ var _trimInstanceProperty__default = /*#__PURE__*/_interopDefault(_trimInstanceProperty);
76
78
  var moment__default = /*#__PURE__*/_interopDefault(moment);
77
79
  var _someInstanceProperty__default = /*#__PURE__*/_interopDefault(_someInstanceProperty);
78
80
  var _findInstanceProperty__default = /*#__PURE__*/_interopDefault(_findInstanceProperty);
@@ -634,11 +636,23 @@ function buildSelectedExportFilters(selectedResourceIds) {
634
636
  const formattedIds = _mapInstanceProperty__default["default"](selectedResourceIds).call(selectedResourceIds, id => `"${id}"`).join(', ');
635
637
  return `id in (${formattedIds})`;
636
638
  }
639
+ function validateFilters(filters) {
640
+ var _context;
641
+ const hasQueryPredicate = typeof filters.queryPredicate === 'string' && _trimInstanceProperty__default["default"](_context = filters.queryPredicate).call(_context) !== '';
642
+ const hasSearchQuery = !!(filters.searchQuery && typeof filters.searchQuery === 'object');
643
+ const hasValidTotal = typeof filters.total === 'number' && filters.total >= 0;
644
+
645
+ // Ensure only one of `queryPredicate` or `searchQuery` is applied
646
+ const onlyOneFilterApplied = hasQueryPredicate && !hasSearchQuery || !hasQueryPredicate && hasSearchQuery;
647
+ return onlyOneFilterApplied && hasValidTotal;
648
+ }
637
649
  function areFiltersApplied(filters) {
638
650
  if (!filters) {
639
651
  return false;
640
652
  }
641
- return filters.where !== undefined && filters.where?.trim() !== '';
653
+ const hasQueryPredicate = (filters.queryPredicate?.trim() ?? '') !== '';
654
+ const hasSearchQuery = _Object$keys__default["default"](filters.searchQuery ?? {}).length > 0;
655
+ return hasQueryPredicate || hasSearchQuery;
642
656
  }
643
657
  function getInitialExportType(args) {
644
658
  if (args.selectedResourceIds?.length) {
@@ -807,6 +821,7 @@ async function createExportOperation(_ref) {
807
821
  fields = _ref.fields,
808
822
  locales = _ref.locales,
809
823
  filters = _ref.filters,
824
+ where = _ref.where,
810
825
  asyncDispatchFn = _ref.asyncDispatchFn;
811
826
  const uri = `/${projectKey}/export-operations`;
812
827
  const response = await asyncDispatchFn(sdk.actions.post({
@@ -821,6 +836,9 @@ async function createExportOperation(_ref) {
821
836
  fileFormat,
822
837
  fields,
823
838
  locales,
839
+ // Query predicate
840
+ where,
841
+ // Search API filters
824
842
  filters
825
843
  }
826
844
  }));
@@ -859,13 +877,6 @@ const useStartExportOperation = props => {
859
877
  const startExportOperation = async values => {
860
878
  try {
861
879
  const fields = extractFieldsFromGroups(values.groups);
862
- let filters = undefined;
863
- if (props.exportType === EXPORT_TYPES.SELECTED) filters = buildSelectedExportFilters(props.selectedResourceIds);
864
- if (props.exportType === EXPORT_TYPES.FILTERED) {
865
- filters = props.filters.where;
866
- // TODO: handle search query when Export API supports it
867
- // filters = props.filters.where || props.filters.searchQuery
868
- }
869
880
  const response = await createExportOperation({
870
881
  projectKey,
871
882
  resourceType: props.resourceType,
@@ -873,7 +884,8 @@ const useStartExportOperation = props => {
873
884
  fileFormat: values.outputFormat,
874
885
  locales: values.locales,
875
886
  fields,
876
- filters: typeof filters === 'string' ? [filters] : undefined,
887
+ where: props.exportType === EXPORT_TYPES.SELECTED ? buildSelectedExportFilters(props.selectedResourceIds) : props.filters?.queryPredicate,
888
+ filters: props.filters?.searchQuery,
877
889
  asyncDispatchFn: asyncDispatch
878
890
  });
879
891
  switch (response.state) {
@@ -1726,6 +1738,10 @@ const ExportResourcesModal = props => {
1726
1738
  locale = _useApplicationContex.locale;
1727
1739
  const messages = useAsyncIntlMessages(locale, loadMessages);
1728
1740
  if (!props.isOpen || messages.isLoading) return null;
1741
+ if (props.filters && !validateFilters(props.filters)) {
1742
+ console.error('Invalid filters prop:', props.filters, 'Filters must have either a valid `queryPredicate` or a valid `searchQuery`, but not both.');
1743
+ return null;
1744
+ }
1729
1745
  return jsxRuntime.jsx(reactIntl.IntlProvider, {
1730
1746
  locale: locale,
1731
1747
  messages: messages.messages,
@@ -32,6 +32,7 @@ import _Array$isArray from '@babel/runtime-corejs3/core-js-stable/array/is-array
32
32
  import _Set from '@babel/runtime-corejs3/core-js-stable/set';
33
33
  import _sortInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/sort';
34
34
  import _indexOfInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/index-of';
35
+ import _trimInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/trim';
35
36
  import moment from 'moment';
36
37
  import _someInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/some';
37
38
  import _findInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/find';
@@ -600,11 +601,23 @@ function buildSelectedExportFilters(selectedResourceIds) {
600
601
  const formattedIds = _mapInstanceProperty(selectedResourceIds).call(selectedResourceIds, id => `"${id}"`).join(', ');
601
602
  return `id in (${formattedIds})`;
602
603
  }
604
+ function validateFilters(filters) {
605
+ var _context;
606
+ const hasQueryPredicate = typeof filters.queryPredicate === 'string' && _trimInstanceProperty(_context = filters.queryPredicate).call(_context) !== '';
607
+ const hasSearchQuery = !!(filters.searchQuery && typeof filters.searchQuery === 'object');
608
+ const hasValidTotal = typeof filters.total === 'number' && filters.total >= 0;
609
+
610
+ // Ensure only one of `queryPredicate` or `searchQuery` is applied
611
+ const onlyOneFilterApplied = hasQueryPredicate && !hasSearchQuery || !hasQueryPredicate && hasSearchQuery;
612
+ return onlyOneFilterApplied && hasValidTotal;
613
+ }
603
614
  function areFiltersApplied(filters) {
604
615
  if (!filters) {
605
616
  return false;
606
617
  }
607
- return filters.where !== undefined && filters.where?.trim() !== '';
618
+ const hasQueryPredicate = (filters.queryPredicate?.trim() ?? '') !== '';
619
+ const hasSearchQuery = _Object$keys(filters.searchQuery ?? {}).length > 0;
620
+ return hasQueryPredicate || hasSearchQuery;
608
621
  }
609
622
  function getInitialExportType(args) {
610
623
  if (args.selectedResourceIds?.length) {
@@ -773,6 +786,7 @@ async function createExportOperation(_ref) {
773
786
  fields = _ref.fields,
774
787
  locales = _ref.locales,
775
788
  filters = _ref.filters,
789
+ where = _ref.where,
776
790
  asyncDispatchFn = _ref.asyncDispatchFn;
777
791
  const uri = `/${projectKey}/export-operations`;
778
792
  const response = await asyncDispatchFn(actions.post({
@@ -787,6 +801,9 @@ async function createExportOperation(_ref) {
787
801
  fileFormat,
788
802
  fields,
789
803
  locales,
804
+ // Query predicate
805
+ where,
806
+ // Search API filters
790
807
  filters
791
808
  }
792
809
  }));
@@ -825,13 +842,6 @@ const useStartExportOperation = props => {
825
842
  const startExportOperation = async values => {
826
843
  try {
827
844
  const fields = extractFieldsFromGroups(values.groups);
828
- let filters = undefined;
829
- if (props.exportType === EXPORT_TYPES.SELECTED) filters = buildSelectedExportFilters(props.selectedResourceIds);
830
- if (props.exportType === EXPORT_TYPES.FILTERED) {
831
- filters = props.filters.where;
832
- // TODO: handle search query when Export API supports it
833
- // filters = props.filters.where || props.filters.searchQuery
834
- }
835
845
  const response = await createExportOperation({
836
846
  projectKey,
837
847
  resourceType: props.resourceType,
@@ -839,7 +849,8 @@ const useStartExportOperation = props => {
839
849
  fileFormat: values.outputFormat,
840
850
  locales: values.locales,
841
851
  fields,
842
- filters: typeof filters === 'string' ? [filters] : undefined,
852
+ where: props.exportType === EXPORT_TYPES.SELECTED ? buildSelectedExportFilters(props.selectedResourceIds) : props.filters?.queryPredicate,
853
+ filters: props.filters?.searchQuery,
843
854
  asyncDispatchFn: asyncDispatch
844
855
  });
845
856
  switch (response.state) {
@@ -1725,6 +1736,10 @@ const ExportResourcesModal = props => {
1725
1736
  locale = _useApplicationContex.locale;
1726
1737
  const messages = useAsyncIntlMessages(locale, loadMessages);
1727
1738
  if (!props.isOpen || messages.isLoading) return null;
1739
+ if (props.filters && !validateFilters(props.filters)) {
1740
+ console.error('Invalid filters prop:', props.filters, 'Filters must have either a valid `queryPredicate` or a valid `searchQuery`, but not both.');
1741
+ return null;
1742
+ }
1728
1743
  return jsx(IntlProvider, {
1729
1744
  locale: locale,
1730
1745
  messages: messages.messages,
@@ -33,6 +33,7 @@ export interface ExportResourcesModalShape {
33
33
  }
34
34
  export type ExportType = keyof typeof EXPORT_TYPES;
35
35
  export type Filters = {
36
- where?: string;
36
+ queryPredicate?: string;
37
+ searchQuery?: Record<string, unknown>;
37
38
  total: number;
38
39
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@commercetools-frontend-extensions/export-resources-modal",
3
3
  "description": "Shared export modal for exporting resources",
4
- "version": "0.0.0-canary-20240821150843",
4
+ "version": "0.0.0-canary-20240823130607",
5
5
  "license": "BSD-3-Clause",
6
6
  "publishConfig": {
7
7
  "access": "public"