@commercetools-frontend-extensions/export-resources-modal 4.5.6 → 4.6.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.
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}
@@ -634,11 +634,21 @@ function buildSelectedExportFilters(selectedResourceIds) {
634
634
  const formattedIds = _mapInstanceProperty__default["default"](selectedResourceIds).call(selectedResourceIds, id => `"${id}"`).join(', ');
635
635
  return `id in (${formattedIds})`;
636
636
  }
637
+ function validateFilters(filters) {
638
+ const hasQueryPredicate = 'queryPredicate' in filters;
639
+ const hasSearchQuery = 'searchQuery' in filters;
640
+
641
+ // Ensure only one of `queryPredicate` or `searchQuery` is applied but not both or none
642
+ const validFilterState = hasQueryPredicate && !hasSearchQuery || !hasQueryPredicate && hasSearchQuery;
643
+ return validFilterState;
644
+ }
637
645
  function areFiltersApplied(filters) {
638
646
  if (!filters) {
639
647
  return false;
640
648
  }
641
- return filters.where !== undefined && filters.where?.trim() !== '';
649
+ const hasQueryPredicate = (filters.queryPredicate?.trim() ?? '') !== '';
650
+ const hasSearchQuery = _Object$keys__default["default"](filters.searchQuery ?? {}).length > 0;
651
+ return hasQueryPredicate || hasSearchQuery;
642
652
  }
643
653
  function getInitialExportType(args) {
644
654
  if (args.selectedResourceIds?.length) {
@@ -807,6 +817,7 @@ async function createExportOperation(_ref) {
807
817
  fields = _ref.fields,
808
818
  locales = _ref.locales,
809
819
  filters = _ref.filters,
820
+ where = _ref.where,
810
821
  asyncDispatchFn = _ref.asyncDispatchFn;
811
822
  const uri = `/${projectKey}/export-operations`;
812
823
  const response = await asyncDispatchFn(sdk.actions.post({
@@ -821,6 +832,9 @@ async function createExportOperation(_ref) {
821
832
  fileFormat,
822
833
  fields,
823
834
  locales,
835
+ // Query predicate
836
+ where,
837
+ // Search API filters
824
838
  filters
825
839
  }
826
840
  }));
@@ -859,13 +873,6 @@ const useStartExportOperation = props => {
859
873
  const startExportOperation = async values => {
860
874
  try {
861
875
  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
876
  const response = await createExportOperation({
870
877
  projectKey,
871
878
  resourceType: props.resourceType,
@@ -873,7 +880,8 @@ const useStartExportOperation = props => {
873
880
  fileFormat: values.outputFormat,
874
881
  locales: values.locales,
875
882
  fields,
876
- filters: typeof filters === 'string' ? [filters] : undefined,
883
+ where: props.exportType === EXPORT_TYPES.SELECTED ? buildSelectedExportFilters(props.selectedResourceIds) : props.filters?.queryPredicate || undefined,
884
+ filters: props.filters?.searchQuery || undefined,
877
885
  asyncDispatchFn: asyncDispatch
878
886
  });
879
887
  switch (response.state) {
@@ -1759,6 +1767,10 @@ const ExportResourcesModal = props => {
1759
1767
  locale = _useApplicationContex.locale;
1760
1768
  const messages = useAsyncIntlMessages(locale, loadMessages);
1761
1769
  if (!props.isOpen || messages.isLoading) return null;
1770
+ if (props.filters && !validateFilters(props.filters)) {
1771
+ console.error('Invalid filters prop:', props.filters, 'Filters must contain either `queryPredicate` or `searchQuery`, but not both, and it cannot be empty');
1772
+ return null;
1773
+ }
1762
1774
  return jsxRuntime.jsx(reactIntl.IntlProvider, {
1763
1775
  locale: locale,
1764
1776
  messages: messages.messages,
@@ -634,11 +634,21 @@ function buildSelectedExportFilters(selectedResourceIds) {
634
634
  const formattedIds = _mapInstanceProperty__default["default"](selectedResourceIds).call(selectedResourceIds, id => `"${id}"`).join(', ');
635
635
  return `id in (${formattedIds})`;
636
636
  }
637
+ function validateFilters(filters) {
638
+ const hasQueryPredicate = 'queryPredicate' in filters;
639
+ const hasSearchQuery = 'searchQuery' in filters;
640
+
641
+ // Ensure only one of `queryPredicate` or `searchQuery` is applied but not both or none
642
+ const validFilterState = hasQueryPredicate && !hasSearchQuery || !hasQueryPredicate && hasSearchQuery;
643
+ return validFilterState;
644
+ }
637
645
  function areFiltersApplied(filters) {
638
646
  if (!filters) {
639
647
  return false;
640
648
  }
641
- return filters.where !== undefined && filters.where?.trim() !== '';
649
+ const hasQueryPredicate = (filters.queryPredicate?.trim() ?? '') !== '';
650
+ const hasSearchQuery = _Object$keys__default["default"](filters.searchQuery ?? {}).length > 0;
651
+ return hasQueryPredicate || hasSearchQuery;
642
652
  }
643
653
  function getInitialExportType(args) {
644
654
  if (args.selectedResourceIds?.length) {
@@ -807,6 +817,7 @@ async function createExportOperation(_ref) {
807
817
  fields = _ref.fields,
808
818
  locales = _ref.locales,
809
819
  filters = _ref.filters,
820
+ where = _ref.where,
810
821
  asyncDispatchFn = _ref.asyncDispatchFn;
811
822
  const uri = `/${projectKey}/export-operations`;
812
823
  const response = await asyncDispatchFn(sdk.actions.post({
@@ -821,6 +832,9 @@ async function createExportOperation(_ref) {
821
832
  fileFormat,
822
833
  fields,
823
834
  locales,
835
+ // Query predicate
836
+ where,
837
+ // Search API filters
824
838
  filters
825
839
  }
826
840
  }));
@@ -859,13 +873,6 @@ const useStartExportOperation = props => {
859
873
  const startExportOperation = async values => {
860
874
  try {
861
875
  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
876
  const response = await createExportOperation({
870
877
  projectKey,
871
878
  resourceType: props.resourceType,
@@ -873,7 +880,8 @@ const useStartExportOperation = props => {
873
880
  fileFormat: values.outputFormat,
874
881
  locales: values.locales,
875
882
  fields,
876
- filters: typeof filters === 'string' ? [filters] : undefined,
883
+ where: props.exportType === EXPORT_TYPES.SELECTED ? buildSelectedExportFilters(props.selectedResourceIds) : props.filters?.queryPredicate || undefined,
884
+ filters: props.filters?.searchQuery || undefined,
877
885
  asyncDispatchFn: asyncDispatch
878
886
  });
879
887
  switch (response.state) {
@@ -1726,6 +1734,10 @@ const ExportResourcesModal = props => {
1726
1734
  locale = _useApplicationContex.locale;
1727
1735
  const messages = useAsyncIntlMessages(locale, loadMessages);
1728
1736
  if (!props.isOpen || messages.isLoading) return null;
1737
+ if (props.filters && !validateFilters(props.filters)) {
1738
+ console.error('Invalid filters prop:', props.filters, 'Filters must contain either `queryPredicate` or `searchQuery`, but not both, and it cannot be empty');
1739
+ return null;
1740
+ }
1729
1741
  return jsxRuntime.jsx(reactIntl.IntlProvider, {
1730
1742
  locale: locale,
1731
1743
  messages: messages.messages,
@@ -600,11 +600,21 @@ function buildSelectedExportFilters(selectedResourceIds) {
600
600
  const formattedIds = _mapInstanceProperty(selectedResourceIds).call(selectedResourceIds, id => `"${id}"`).join(', ');
601
601
  return `id in (${formattedIds})`;
602
602
  }
603
+ function validateFilters(filters) {
604
+ const hasQueryPredicate = 'queryPredicate' in filters;
605
+ const hasSearchQuery = 'searchQuery' in filters;
606
+
607
+ // Ensure only one of `queryPredicate` or `searchQuery` is applied but not both or none
608
+ const validFilterState = hasQueryPredicate && !hasSearchQuery || !hasQueryPredicate && hasSearchQuery;
609
+ return validFilterState;
610
+ }
603
611
  function areFiltersApplied(filters) {
604
612
  if (!filters) {
605
613
  return false;
606
614
  }
607
- return filters.where !== undefined && filters.where?.trim() !== '';
615
+ const hasQueryPredicate = (filters.queryPredicate?.trim() ?? '') !== '';
616
+ const hasSearchQuery = _Object$keys(filters.searchQuery ?? {}).length > 0;
617
+ return hasQueryPredicate || hasSearchQuery;
608
618
  }
609
619
  function getInitialExportType(args) {
610
620
  if (args.selectedResourceIds?.length) {
@@ -773,6 +783,7 @@ async function createExportOperation(_ref) {
773
783
  fields = _ref.fields,
774
784
  locales = _ref.locales,
775
785
  filters = _ref.filters,
786
+ where = _ref.where,
776
787
  asyncDispatchFn = _ref.asyncDispatchFn;
777
788
  const uri = `/${projectKey}/export-operations`;
778
789
  const response = await asyncDispatchFn(actions.post({
@@ -787,6 +798,9 @@ async function createExportOperation(_ref) {
787
798
  fileFormat,
788
799
  fields,
789
800
  locales,
801
+ // Query predicate
802
+ where,
803
+ // Search API filters
790
804
  filters
791
805
  }
792
806
  }));
@@ -825,13 +839,6 @@ const useStartExportOperation = props => {
825
839
  const startExportOperation = async values => {
826
840
  try {
827
841
  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
842
  const response = await createExportOperation({
836
843
  projectKey,
837
844
  resourceType: props.resourceType,
@@ -839,7 +846,8 @@ const useStartExportOperation = props => {
839
846
  fileFormat: values.outputFormat,
840
847
  locales: values.locales,
841
848
  fields,
842
- filters: typeof filters === 'string' ? [filters] : undefined,
849
+ where: props.exportType === EXPORT_TYPES.SELECTED ? buildSelectedExportFilters(props.selectedResourceIds) : props.filters?.queryPredicate || undefined,
850
+ filters: props.filters?.searchQuery || undefined,
843
851
  asyncDispatchFn: asyncDispatch
844
852
  });
845
853
  switch (response.state) {
@@ -1725,6 +1733,10 @@ const ExportResourcesModal = props => {
1725
1733
  locale = _useApplicationContex.locale;
1726
1734
  const messages = useAsyncIntlMessages(locale, loadMessages);
1727
1735
  if (!props.isOpen || messages.isLoading) return null;
1736
+ if (props.filters && !validateFilters(props.filters)) {
1737
+ console.error('Invalid filters prop:', props.filters, 'Filters must contain either `queryPredicate` or `searchQuery`, but not both, and it cannot be empty');
1738
+ return null;
1739
+ }
1728
1740
  return jsx(IntlProvider, {
1729
1741
  locale: locale,
1730
1742
  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": "4.5.6",
4
+ "version": "4.6.1",
5
5
  "license": "BSD-3-Clause",
6
6
  "publishConfig": {
7
7
  "access": "public"