@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 +1 -1
- package/dist/commercetools-frontend-extensions-export-resources-modal.cjs.dev.js +21 -9
- package/dist/commercetools-frontend-extensions-export-resources-modal.cjs.prod.js +21 -9
- package/dist/commercetools-frontend-extensions-export-resources-modal.esm.js +21 -9
- package/dist/declarations/src/@types/export-resources-modal-types.d.ts +2 -1
- package/package.json +1 -1
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
package/package.json
CHANGED