@blaze-cms/plugin-data-ui 0.147.0-rc-eagle.2 → 0.147.0-rc-eagle.6

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.
Files changed (35) hide show
  1. package/README.md +9 -2
  2. package/lib/components/EntityManager/Entity/Entity.js.map +1 -1
  3. package/lib/components/ListingTable/SearchFilter/RelationMultiSelectFilter.js +181 -0
  4. package/lib/components/ListingTable/SearchFilter/RelationMultiSelectFilter.js.map +1 -0
  5. package/lib/components/ListingTable/SearchFilter/SearchContainer.js +338 -49
  6. package/lib/components/ListingTable/SearchFilter/SearchContainer.js.map +1 -1
  7. package/lib/components/ListingTable/SearchFilter/SearchFilter.js +6 -2
  8. package/lib/components/ListingTable/SearchFilter/SearchFilter.js.map +1 -1
  9. package/lib/components/ListingTable/SearchFilter/helpers.js +41 -8
  10. package/lib/components/ListingTable/SearchFilter/helpers.js.map +1 -1
  11. package/lib/index.js +7 -0
  12. package/lib/index.js.map +1 -1
  13. package/lib/utils/get-default-query-params.js +17 -5
  14. package/lib/utils/get-default-query-params.js.map +1 -1
  15. package/lib-es/components/EntityManager/Entity/Entity.js.map +1 -1
  16. package/lib-es/components/ListingTable/SearchFilter/RelationMultiSelectFilter.js +173 -0
  17. package/lib-es/components/ListingTable/SearchFilter/RelationMultiSelectFilter.js.map +1 -0
  18. package/lib-es/components/ListingTable/SearchFilter/SearchContainer.js +340 -51
  19. package/lib-es/components/ListingTable/SearchFilter/SearchContainer.js.map +1 -1
  20. package/lib-es/components/ListingTable/SearchFilter/SearchFilter.js +7 -3
  21. package/lib-es/components/ListingTable/SearchFilter/SearchFilter.js.map +1 -1
  22. package/lib-es/components/ListingTable/SearchFilter/helpers.js +39 -8
  23. package/lib-es/components/ListingTable/SearchFilter/helpers.js.map +1 -1
  24. package/lib-es/index.js +1 -0
  25. package/lib-es/index.js.map +1 -1
  26. package/lib-es/utils/get-default-query-params.js +17 -5
  27. package/lib-es/utils/get-default-query-params.js.map +1 -1
  28. package/package.json +11 -12
  29. package/src/components/EntityManager/Entity/Entity.js +2 -3
  30. package/src/components/ListingTable/SearchFilter/RelationMultiSelectFilter.js +160 -0
  31. package/src/components/ListingTable/SearchFilter/SearchContainer.js +396 -71
  32. package/src/components/ListingTable/SearchFilter/SearchFilter.js +5 -2
  33. package/src/components/ListingTable/SearchFilter/helpers.js +55 -8
  34. package/src/index.js +2 -0
  35. package/src/utils/get-default-query-params.js +21 -9
@@ -1,10 +1,11 @@
1
1
  import React, { useMemo } from 'react';
2
2
  import PropTypes from 'prop-types';
3
- import { getKeywordSearchFilters, findSelectFilters } from './helpers';
3
+ import { getKeywordSearchFilters, findSelectFilters, findMultiSelectFilters } from './helpers';
4
4
  import SearchContainer from './SearchContainer';
5
5
  const SearchFilter = ({
6
6
  schema,
7
- setListFilters
7
+ setListFilters,
8
+ values
8
9
  }) => {
9
10
  const {
10
11
  displayProperties = {}
@@ -20,6 +21,7 @@ const SearchFilter = ({
20
21
  } = displayProperties;
21
22
  const keywordFiltersToUse = useMemo(() => getKeywordSearchFilters(schema), [schema]);
22
23
  const selectFiltersToDisplay = useMemo(() => findSelectFilters(schema), [schema]);
24
+ const multiSelectFiltersToDisplay = useMemo(() => findMultiSelectFilters(schema), [schema]);
23
25
  if (disableListingFilter) return null;
24
26
  const canSearch = source === 'search' && (keywordFiltersToUse.length > 0 || selectFiltersToDisplay.length > 0);
25
27
  if (!canSearch) return null;
@@ -29,7 +31,9 @@ const SearchFilter = ({
29
31
  setListFilters: setListFilters,
30
32
  keywordFiltersToUse: keywordFiltersToUse,
31
33
  selectFiltersToDisplay: selectFiltersToDisplay,
32
- schema: schema
34
+ multiSelectFiltersToDisplay: multiSelectFiltersToDisplay,
35
+ schema: schema,
36
+ values: values
33
37
  });
34
38
  };
35
39
  SearchFilter.propTypes = {
@@ -1 +1 @@
1
- {"version":3,"file":"SearchFilter.js","names":["React","useMemo","PropTypes","getKeywordSearchFilters","findSelectFilters","SearchContainer","SearchFilter","schema","setListFilters","displayProperties","adminListings","dataSource","source","index","disableListingFilter","keywordFiltersToUse","selectFiltersToDisplay","canSearch","length","createElement","key","id","propTypes","func","isRequired","object"],"sources":["../../../../src/components/ListingTable/SearchFilter/SearchFilter.js"],"sourcesContent":["import React, { useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport { getKeywordSearchFilters, findSelectFilters } from './helpers';\nimport SearchContainer from './SearchContainer';\n\nconst SearchFilter = ({ schema, setListFilters }) => {\n const { displayProperties = {} } = schema || {};\n const {\n adminListings: { dataSource: { source, index } = {}, disableListingFilter = false } = {}\n } = displayProperties;\n\n const keywordFiltersToUse = useMemo(() => getKeywordSearchFilters(schema), [schema]);\n const selectFiltersToDisplay = useMemo(() => findSelectFilters(schema), [schema]);\n\n if (disableListingFilter) return null;\n\n const canSearch =\n source === 'search' && (keywordFiltersToUse.length > 0 || selectFiltersToDisplay.length > 0);\n if (!canSearch) return null;\n\n return (\n <SearchContainer\n index={index}\n key={schema.id}\n setListFilters={setListFilters}\n keywordFiltersToUse={keywordFiltersToUse}\n selectFiltersToDisplay={selectFiltersToDisplay}\n schema={schema}\n />\n );\n};\n\nSearchFilter.propTypes = {\n setListFilters: PropTypes.func.isRequired,\n schema: PropTypes.object.isRequired\n};\n\nexport default SearchFilter;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,OAAO,QAAQ,OAAO;AACtC,OAAOC,SAAS,MAAM,YAAY;AAClC,SAASC,uBAAuB,EAAEC,iBAAiB,QAAQ,WAAW;AACtE,OAAOC,eAAe,MAAM,mBAAmB;AAE/C,MAAMC,YAAY,GAAGA,CAAC;EAAEC,MAAM;EAAEC;AAAe,CAAC,KAAK;EACnD,MAAM;IAAEC,iBAAiB,GAAG,CAAC;EAAE,CAAC,GAAGF,MAAM,IAAI,CAAC,CAAC;EAC/C,MAAM;IACJG,aAAa,EAAE;MAAEC,UAAU,EAAE;QAAEC,MAAM;QAAEC;MAAM,CAAC,GAAG,CAAC,CAAC;MAAEC,oBAAoB,GAAG;IAAM,CAAC,GAAG,CAAC;EACzF,CAAC,GAAGL,iBAAiB;EAErB,MAAMM,mBAAmB,GAAGd,OAAO,CAAC,MAAME,uBAAuB,CAACI,MAAM,CAAC,EAAE,CAACA,MAAM,CAAC,CAAC;EACpF,MAAMS,sBAAsB,GAAGf,OAAO,CAAC,MAAMG,iBAAiB,CAACG,MAAM,CAAC,EAAE,CAACA,MAAM,CAAC,CAAC;EAEjF,IAAIO,oBAAoB,EAAE,OAAO,IAAI;EAErC,MAAMG,SAAS,GACbL,MAAM,KAAK,QAAQ,KAAKG,mBAAmB,CAACG,MAAM,GAAG,CAAC,IAAIF,sBAAsB,CAACE,MAAM,GAAG,CAAC,CAAC;EAC9F,IAAI,CAACD,SAAS,EAAE,OAAO,IAAI;EAE3B,oBACEjB,KAAA,CAAAmB,aAAA,CAACd,eAAe;IACdQ,KAAK,EAAEA,KAAM;IACbO,GAAG,EAAEb,MAAM,CAACc,EAAG;IACfb,cAAc,EAAEA,cAAe;IAC/BO,mBAAmB,EAAEA,mBAAoB;IACzCC,sBAAsB,EAAEA,sBAAuB;IAC/CT,MAAM,EAAEA;EAAO,CAChB,CAAC;AAEN,CAAC;AAEDD,YAAY,CAACgB,SAAS,GAAG;EACvBd,cAAc,EAAEN,SAAS,CAACqB,IAAI,CAACC,UAAU;EACzCjB,MAAM,EAAEL,SAAS,CAACuB,MAAM,CAACD;AAC3B,CAAC;AAED,eAAelB,YAAY","ignoreList":[]}
1
+ {"version":3,"file":"SearchFilter.js","names":["React","useMemo","PropTypes","getKeywordSearchFilters","findSelectFilters","findMultiSelectFilters","SearchContainer","SearchFilter","schema","setListFilters","values","displayProperties","adminListings","dataSource","source","index","disableListingFilter","keywordFiltersToUse","selectFiltersToDisplay","multiSelectFiltersToDisplay","canSearch","length","createElement","key","id","propTypes","func","isRequired","object"],"sources":["../../../../src/components/ListingTable/SearchFilter/SearchFilter.js"],"sourcesContent":["import React, { useMemo } from 'react';\nimport PropTypes from 'prop-types';\nimport { getKeywordSearchFilters, findSelectFilters, findMultiSelectFilters } from './helpers';\nimport SearchContainer from './SearchContainer';\n\nconst SearchFilter = ({ schema, setListFilters, values }) => {\n const { displayProperties = {} } = schema || {};\n const {\n adminListings: { dataSource: { source, index } = {}, disableListingFilter = false } = {}\n } = displayProperties;\n\n const keywordFiltersToUse = useMemo(() => getKeywordSearchFilters(schema), [schema]);\n const selectFiltersToDisplay = useMemo(() => findSelectFilters(schema), [schema]);\n const multiSelectFiltersToDisplay = useMemo(() => findMultiSelectFilters(schema), [schema]);\n\n if (disableListingFilter) return null;\n\n const canSearch =\n source === 'search' && (keywordFiltersToUse.length > 0 || selectFiltersToDisplay.length > 0);\n if (!canSearch) return null;\n\n return (\n <SearchContainer\n index={index}\n key={schema.id}\n setListFilters={setListFilters}\n keywordFiltersToUse={keywordFiltersToUse}\n selectFiltersToDisplay={selectFiltersToDisplay}\n multiSelectFiltersToDisplay={multiSelectFiltersToDisplay}\n schema={schema}\n values={values}\n />\n );\n};\n\nSearchFilter.propTypes = {\n setListFilters: PropTypes.func.isRequired,\n schema: PropTypes.object.isRequired\n};\n\nexport default SearchFilter;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,OAAO,QAAQ,OAAO;AACtC,OAAOC,SAAS,MAAM,YAAY;AAClC,SAASC,uBAAuB,EAAEC,iBAAiB,EAAEC,sBAAsB,QAAQ,WAAW;AAC9F,OAAOC,eAAe,MAAM,mBAAmB;AAE/C,MAAMC,YAAY,GAAGA,CAAC;EAAEC,MAAM;EAAEC,cAAc;EAAEC;AAAO,CAAC,KAAK;EAC3D,MAAM;IAAEC,iBAAiB,GAAG,CAAC;EAAE,CAAC,GAAGH,MAAM,IAAI,CAAC,CAAC;EAC/C,MAAM;IACJI,aAAa,EAAE;MAAEC,UAAU,EAAE;QAAEC,MAAM;QAAEC;MAAM,CAAC,GAAG,CAAC,CAAC;MAAEC,oBAAoB,GAAG;IAAM,CAAC,GAAG,CAAC;EACzF,CAAC,GAAGL,iBAAiB;EAErB,MAAMM,mBAAmB,GAAGhB,OAAO,CAAC,MAAME,uBAAuB,CAACK,MAAM,CAAC,EAAE,CAACA,MAAM,CAAC,CAAC;EACpF,MAAMU,sBAAsB,GAAGjB,OAAO,CAAC,MAAMG,iBAAiB,CAACI,MAAM,CAAC,EAAE,CAACA,MAAM,CAAC,CAAC;EACjF,MAAMW,2BAA2B,GAAGlB,OAAO,CAAC,MAAMI,sBAAsB,CAACG,MAAM,CAAC,EAAE,CAACA,MAAM,CAAC,CAAC;EAE3F,IAAIQ,oBAAoB,EAAE,OAAO,IAAI;EAErC,MAAMI,SAAS,GACbN,MAAM,KAAK,QAAQ,KAAKG,mBAAmB,CAACI,MAAM,GAAG,CAAC,IAAIH,sBAAsB,CAACG,MAAM,GAAG,CAAC,CAAC;EAC9F,IAAI,CAACD,SAAS,EAAE,OAAO,IAAI;EAE3B,oBACEpB,KAAA,CAAAsB,aAAA,CAAChB,eAAe;IACdS,KAAK,EAAEA,KAAM;IACbQ,GAAG,EAAEf,MAAM,CAACgB,EAAG;IACff,cAAc,EAAEA,cAAe;IAC/BQ,mBAAmB,EAAEA,mBAAoB;IACzCC,sBAAsB,EAAEA,sBAAuB;IAC/CC,2BAA2B,EAAEA,2BAA4B;IACzDX,MAAM,EAAEA,MAAO;IACfE,MAAM,EAAEA;EAAO,CAChB,CAAC;AAEN,CAAC;AAEDH,YAAY,CAACkB,SAAS,GAAG;EACvBhB,cAAc,EAAEP,SAAS,CAACwB,IAAI,CAACC,UAAU;EACzCnB,MAAM,EAAEN,SAAS,CAAC0B,MAAM,CAACD;AAC3B,CAAC;AAED,eAAepB,YAAY","ignoreList":[]}
@@ -11,14 +11,30 @@ const updateListFilters = (searchTerm, selectedFilters, setListFilters, fields =
11
11
  });
12
12
  }
13
13
  Object.entries(selectedFilters).forEach(([filterKey, filterValue]) => {
14
- if (!filterValue || filterValue === DEFAULT_FILTER_OPTION_LABEL) return;
15
- filters.push({
16
- match: {
17
- [`${filterKey}.keyword`]: {
18
- query: filterValue
19
- }
14
+ const isEmptyArray = Array.isArray(filterValue) && filterValue.length === 0;
15
+ if (filterValue == null || filterValue === '' || filterValue === DEFAULT_FILTER_OPTION_LABEL || isEmptyArray) return;
16
+ const field = `${filterKey}.keyword`;
17
+ if (Array.isArray(filterValue)) {
18
+ if (filterValue.length > 1) {
19
+ filters.push({
20
+ terms: {
21
+ [field]: filterValue
22
+ }
23
+ });
24
+ } else {
25
+ filters.push({
26
+ term: {
27
+ [field]: filterValue[0]
28
+ }
29
+ });
20
30
  }
21
- });
31
+ } else {
32
+ filters.push({
33
+ term: {
34
+ [field]: filterValue
35
+ }
36
+ });
37
+ }
22
38
  });
23
39
  setListFilters(filters);
24
40
  };
@@ -43,7 +59,18 @@ const findSelectFilters = schema => {
43
59
  const dynamicPropertySelects = Object.entries(dynamicProperties).filter(isFilterSelectItem);
44
60
  return [...propertySelects, ...dynamicPropertySelects];
45
61
  };
62
+ const findMultiSelectFilters = schema => {
63
+ if (!schema || !schema.properties) return [];
64
+ const {
65
+ properties = {},
66
+ dynamicProperties = {}
67
+ } = schema;
68
+ const propertyMultiSelect = Object.entries(properties).filter(isFilterMultiSelectItems);
69
+ const dynamicPropertyMultiSelect = Object.entries(dynamicProperties).filter(isFilterMultiSelectItems);
70
+ return [...propertyMultiSelect, ...dynamicPropertyMultiSelect];
71
+ };
46
72
  const isFilterSelectItem = ([, item]) => item.adminListingOptions && item.adminListingOptions.filterType === 'select';
73
+ const isFilterMultiSelectItems = ([, item]) => item.adminListingOptions && item.adminListingOptions.filterType === 'multiSelect';
47
74
  const buildQueryFields = (selectFilters, entityId) => {
48
75
  if (!Array.isArray(selectFilters) || selectFilters.length === 0) {
49
76
  return {
@@ -92,5 +119,9 @@ const buildQueryFields = (selectFilters, entityId) => {
92
119
  rawQuery
93
120
  };
94
121
  };
95
- export { buildQueryFields, updateListFilters, getKeywordSearchFilters, findSelectFilters };
122
+ const getTidyLabel = (value, tidy) => {
123
+ if (!tidy) return value;
124
+ return value.split(/[\s_-]+/).map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' ');
125
+ };
126
+ export { buildQueryFields, updateListFilters, getKeywordSearchFilters, findSelectFilters, findMultiSelectFilters, getTidyLabel };
96
127
  //# sourceMappingURL=helpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","names":["DEFAULT_FILTER_OPTION_LABEL","updateListFilters","searchTerm","selectedFilters","setListFilters","fields","filters","push","simple_query_string","query","default_operator","map","field","Object","entries","forEach","filterKey","filterValue","match","getKeywordSearchFilters","schema","properties","dynamicProperties","propertyKeyword","filter","isFilterKeywordItem","dynamicPropertyKeywords","item","adminListingOptions","includeInKeywordSeach","findSelectFilters","propertySelects","isFilterSelectItem","dynamicPropertySelects","filterType","buildQueryFields","selectFilters","entityId","Array","isArray","length","gqlFields","rawQuery","aggs","property","details","terms","size","order","_key","docType","rawQueryObject","bool","must","JSON","stringify"],"sources":["../../../../src/components/ListingTable/SearchFilter/helpers.js"],"sourcesContent":["import { DEFAULT_FILTER_OPTION_LABEL } from '../../../constants';\n\nconst updateListFilters = (searchTerm, selectedFilters, setListFilters, fields = []) => {\n const filters = [];\n\n if (searchTerm) {\n filters.push({\n simple_query_string: {\n query: `${searchTerm}`,\n default_operator: 'AND',\n fields: fields.map(field => field)\n }\n });\n }\n\n Object.entries(selectedFilters).forEach(([filterKey, filterValue]) => {\n if (!filterValue || filterValue === DEFAULT_FILTER_OPTION_LABEL) return;\n filters.push({\n match: {\n [`${filterKey}.keyword`]: {\n query: filterValue\n }\n }\n });\n });\n\n setListFilters(filters);\n};\n\nconst getKeywordSearchFilters = schema => {\n if (!schema || !schema.properties) return [];\n\n const { properties = {}, dynamicProperties = {} } = schema;\n\n const propertyKeyword = Object.entries(properties).filter(isFilterKeywordItem);\n const dynamicPropertyKeywords = Object.entries(dynamicProperties).filter(isFilterKeywordItem);\n\n return [...propertyKeyword, ...dynamicPropertyKeywords];\n};\n\nconst isFilterKeywordItem = ([, item]) =>\n item.adminListingOptions && item.adminListingOptions.includeInKeywordSeach === true;\n\nconst findSelectFilters = schema => {\n if (!schema || !schema.properties) return [];\n\n const { properties = {}, dynamicProperties = {} } = schema;\n\n const propertySelects = Object.entries(properties).filter(isFilterSelectItem);\n const dynamicPropertySelects = Object.entries(dynamicProperties).filter(isFilterSelectItem);\n\n return [...propertySelects, ...dynamicPropertySelects];\n};\n\nconst isFilterSelectItem = ([, item]) =>\n item.adminListingOptions && item.adminListingOptions.filterType === 'select';\n\nconst buildQueryFields = (selectFilters, entityId) => {\n if (!Array.isArray(selectFilters) || selectFilters.length === 0) {\n return { gqlFields: '', rawQuery: '{}' };\n }\n\n const aggs = {};\n selectFilters.forEach(([property, details]) => {\n aggs[property] = {\n terms: {\n field: `${property}.keyword`, // todo: handle different field types\n size: 1000, // todo: customise size\n order: {\n _key: 'asc'\n }\n }\n };\n });\n\n const docType = entityId;\n const rawQueryObject = {\n size: 0,\n query: {\n bool: {\n filter: {\n bool: {\n must: [{ match: { docType } }]\n }\n }\n }\n },\n aggs\n };\n const rawQuery = JSON.stringify(rawQueryObject);\n\n const gqlFields = `\n rawResults\n `;\n\n return { gqlFields, rawQuery };\n};\n\nexport { buildQueryFields, updateListFilters, getKeywordSearchFilters, findSelectFilters };\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"helpers.js","names":["DEFAULT_FILTER_OPTION_LABEL","updateListFilters","searchTerm","selectedFilters","setListFilters","fields","filters","push","simple_query_string","query","default_operator","map","field","Object","entries","forEach","filterKey","filterValue","isEmptyArray","Array","isArray","length","terms","term","getKeywordSearchFilters","schema","properties","dynamicProperties","propertyKeyword","filter","isFilterKeywordItem","dynamicPropertyKeywords","item","adminListingOptions","includeInKeywordSeach","findSelectFilters","propertySelects","isFilterSelectItem","dynamicPropertySelects","findMultiSelectFilters","propertyMultiSelect","isFilterMultiSelectItems","dynamicPropertyMultiSelect","filterType","buildQueryFields","selectFilters","entityId","gqlFields","rawQuery","aggs","property","details","size","order","_key","docType","rawQueryObject","bool","must","match","JSON","stringify","getTidyLabel","value","tidy","split","word","charAt","toUpperCase","slice","join"],"sources":["../../../../src/components/ListingTable/SearchFilter/helpers.js"],"sourcesContent":["import { DEFAULT_FILTER_OPTION_LABEL } from '../../../constants';\n\nconst updateListFilters = (searchTerm, selectedFilters, setListFilters, fields = []) => {\n const filters = [];\n\n if (searchTerm) {\n filters.push({\n simple_query_string: {\n query: `${searchTerm}`,\n default_operator: 'AND',\n fields: fields.map(field => field)\n }\n });\n }\n\n Object.entries(selectedFilters).forEach(([filterKey, filterValue]) => {\n const isEmptyArray = Array.isArray(filterValue) && filterValue.length === 0;\n if (\n filterValue == null ||\n filterValue === '' ||\n filterValue === DEFAULT_FILTER_OPTION_LABEL ||\n isEmptyArray\n )\n return;\n\n const field = `${filterKey}.keyword`;\n\n if (Array.isArray(filterValue)) {\n if (filterValue.length > 1) {\n filters.push({\n terms: { [field]: filterValue }\n });\n } else {\n filters.push({\n term: { [field]: filterValue[0] }\n });\n }\n } else {\n filters.push({\n term: { [field]: filterValue }\n });\n }\n });\n\n setListFilters(filters);\n};\n\nconst getKeywordSearchFilters = schema => {\n if (!schema || !schema.properties) return [];\n\n const { properties = {}, dynamicProperties = {} } = schema;\n\n const propertyKeyword = Object.entries(properties).filter(isFilterKeywordItem);\n const dynamicPropertyKeywords = Object.entries(dynamicProperties).filter(isFilterKeywordItem);\n\n return [...propertyKeyword, ...dynamicPropertyKeywords];\n};\n\nconst isFilterKeywordItem = ([, item]) =>\n item.adminListingOptions && item.adminListingOptions.includeInKeywordSeach === true;\n\nconst findSelectFilters = schema => {\n if (!schema || !schema.properties) return [];\n\n const { properties = {}, dynamicProperties = {} } = schema;\n\n const propertySelects = Object.entries(properties).filter(isFilterSelectItem);\n const dynamicPropertySelects = Object.entries(dynamicProperties).filter(isFilterSelectItem);\n\n return [...propertySelects, ...dynamicPropertySelects];\n};\n\nconst findMultiSelectFilters = schema => {\n if (!schema || !schema.properties) return [];\n\n const { properties = {}, dynamicProperties = {} } = schema;\n const propertyMultiSelect = Object.entries(properties).filter(isFilterMultiSelectItems);\n const dynamicPropertyMultiSelect =\n Object.entries(dynamicProperties).filter(isFilterMultiSelectItems);\n return [...propertyMultiSelect, ...dynamicPropertyMultiSelect];\n};\n\nconst isFilterSelectItem = ([, item]) =>\n item.adminListingOptions && item.adminListingOptions.filterType === 'select';\n\nconst isFilterMultiSelectItems = ([, item]) =>\n item.adminListingOptions && item.adminListingOptions.filterType === 'multiSelect';\n\nconst buildQueryFields = (selectFilters, entityId) => {\n if (!Array.isArray(selectFilters) || selectFilters.length === 0) {\n return { gqlFields: '', rawQuery: '{}' };\n }\n\n const aggs = {};\n selectFilters.forEach(([property, details]) => {\n aggs[property] = {\n terms: {\n field: `${property}.keyword`, // todo: handle different field types\n size: 1000, // todo: customise size\n order: {\n _key: 'asc'\n }\n }\n };\n });\n\n const docType = entityId;\n const rawQueryObject = {\n size: 0,\n query: {\n bool: {\n filter: {\n bool: {\n must: [{ match: { docType } }]\n }\n }\n }\n },\n aggs\n };\n const rawQuery = JSON.stringify(rawQueryObject);\n\n const gqlFields = `\n rawResults\n `;\n\n return { gqlFields, rawQuery };\n};\n\nconst getTidyLabel = (value, tidy) => {\n if (!tidy) return value;\n\n return value\n .split(/[\\s_-]+/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n};\n\nexport {\n buildQueryFields,\n updateListFilters,\n getKeywordSearchFilters,\n findSelectFilters,\n findMultiSelectFilters,\n getTidyLabel\n};\n"],"mappings":"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","ignoreList":[]}
package/lib-es/index.js CHANGED
@@ -14,6 +14,7 @@ import EntityManager from './components/EntityManager';
14
14
  // () => import(/* webpackChunkName: 'EntityManager' */ './components/EntityManager')
15
15
  // );
16
16
 
17
+ export { default as SearchFilter } from './components/ListingTable/SearchFilter/SearchFilter';
17
18
  export default async function load(app) {
18
19
  app.events.once('admin:menu:config:load', getAddContentMenuItems(app));
19
20
  app.events.once('load:custom:field:type', addFieldType => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["getFormBuilderLookup","formFieldTypes","pkg","DATA_LISTING_PREFIX","PLUGIN_NAME","getAddContentMenuItems","UserIcon","TaxonomyIcon","ContentIcon","SettingsIcon","EntityDataListing","EntityManager","load","app","events","once","addFieldType","Object","keys","forEach","type","component","emitAsync","addConfig","main","items","content","label","loadOpen","icon","order","taxonomy","user","settings","entityDataListingRoute","path","key","exact","editEntityRoute","addEntityRoute","addRoute","name","version","pluginName"],"sources":["../src/index.js"],"sourcesContent":["import { getFormBuilderLookup, formFieldTypes } from '@blaze-cms/react-form-builder';\nimport pkg from '../package.json';\nimport { DATA_LISTING_PREFIX, PLUGIN_NAME } from './constants';\nimport getAddContentMenuItems from './utils/add-content-menu-items';\nimport { UserIcon, TaxonomyIcon, ContentIcon, SettingsIcon } from './icons';\nimport EntityDataListing from './components/EntityDataListing';\nimport EntityManager from './components/EntityManager';\n\n// todo: renable lazy loading after bundler optimisations, currently they are too slow in dev mode\n// const EntityDataListing = React.lazy(\n// () => import(/* webpackChunkName: 'EntityDataListing' */ './components/EntityDataListing')\n// );\n// const EntityManager = React.lazy(\n// () => import(/* webpackChunkName: 'EntityManager' */ './components/EntityManager')\n// );\n\nexport default async function load(app) {\n app.events.once('admin:menu:config:load', getAddContentMenuItems(app));\n\n app.events.once('load:custom:field:type', addFieldType => {\n Object.keys(formFieldTypes).forEach(type => {\n addFieldType({ type, component: formFieldTypes[type] });\n });\n });\n\n app.events.once('plugin:data-ui:load:loaded', async () => {\n await app.events.emitAsync('load:custom:field:type', getFormBuilderLookup.addFieldType);\n });\n\n app.events.once('admin:menu:config:load', ({ addConfig }) => {\n addConfig({\n main: {\n items: {\n content: {\n label: 'content',\n loadOpen: true,\n items: {},\n icon: ContentIcon,\n order: 10\n },\n taxonomy: {\n label: 'Taxonomy',\n items: {},\n icon: TaxonomyIcon,\n order: 40\n },\n user: {\n label: 'User',\n items: {},\n icon: UserIcon,\n order: 90\n },\n settings: {\n label: 'Settings',\n items: {},\n icon: SettingsIcon,\n order: 100\n }\n }\n }\n });\n });\n\n const entityDataListingRoute = {\n path: `${DATA_LISTING_PREFIX}/:entityIdentifier`,\n key: 'entityDataListing',\n component: EntityDataListing,\n exact: true\n };\n\n const editEntityRoute = {\n path: `${DATA_LISTING_PREFIX}/:entityIdentifier/:action/:id`,\n key: 'editEntity',\n component: EntityManager,\n exact: true\n };\n\n const addEntityRoute = {\n path: `${DATA_LISTING_PREFIX}/:entityIdentifier/:action`,\n key: 'createEntity',\n component: EntityManager,\n exact: true\n };\n\n app.addRoute(entityDataListingRoute);\n app.addRoute(editEntityRoute);\n app.addRoute(addEntityRoute);\n\n return {\n name: PLUGIN_NAME,\n version: pkg.version\n };\n}\n\nload.pluginName = PLUGIN_NAME;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["getFormBuilderLookup","formFieldTypes","pkg","DATA_LISTING_PREFIX","PLUGIN_NAME","getAddContentMenuItems","UserIcon","TaxonomyIcon","ContentIcon","SettingsIcon","EntityDataListing","EntityManager","default","SearchFilter","load","app","events","once","addFieldType","Object","keys","forEach","type","component","emitAsync","addConfig","main","items","content","label","loadOpen","icon","order","taxonomy","user","settings","entityDataListingRoute","path","key","exact","editEntityRoute","addEntityRoute","addRoute","name","version","pluginName"],"sources":["../src/index.js"],"sourcesContent":["import { getFormBuilderLookup, formFieldTypes } from '@blaze-cms/react-form-builder';\nimport pkg from '../package.json';\nimport { DATA_LISTING_PREFIX, PLUGIN_NAME } from './constants';\nimport getAddContentMenuItems from './utils/add-content-menu-items';\nimport { UserIcon, TaxonomyIcon, ContentIcon, SettingsIcon } from './icons';\nimport EntityDataListing from './components/EntityDataListing';\nimport EntityManager from './components/EntityManager';\n\n// todo: renable lazy loading after bundler optimisations, currently they are too slow in dev mode\n// const EntityDataListing = React.lazy(\n// () => import(/* webpackChunkName: 'EntityDataListing' */ './components/EntityDataListing')\n// );\n// const EntityManager = React.lazy(\n// () => import(/* webpackChunkName: 'EntityManager' */ './components/EntityManager')\n// );\n\nexport { default as SearchFilter } from './components/ListingTable/SearchFilter/SearchFilter';\n\nexport default async function load(app) {\n app.events.once('admin:menu:config:load', getAddContentMenuItems(app));\n\n app.events.once('load:custom:field:type', addFieldType => {\n Object.keys(formFieldTypes).forEach(type => {\n addFieldType({ type, component: formFieldTypes[type] });\n });\n });\n\n app.events.once('plugin:data-ui:load:loaded', async () => {\n await app.events.emitAsync('load:custom:field:type', getFormBuilderLookup.addFieldType);\n });\n\n app.events.once('admin:menu:config:load', ({ addConfig }) => {\n addConfig({\n main: {\n items: {\n content: {\n label: 'content',\n loadOpen: true,\n items: {},\n icon: ContentIcon,\n order: 10\n },\n taxonomy: {\n label: 'Taxonomy',\n items: {},\n icon: TaxonomyIcon,\n order: 40\n },\n user: {\n label: 'User',\n items: {},\n icon: UserIcon,\n order: 90\n },\n settings: {\n label: 'Settings',\n items: {},\n icon: SettingsIcon,\n order: 100\n }\n }\n }\n });\n });\n\n const entityDataListingRoute = {\n path: `${DATA_LISTING_PREFIX}/:entityIdentifier`,\n key: 'entityDataListing',\n component: EntityDataListing,\n exact: true\n };\n\n const editEntityRoute = {\n path: `${DATA_LISTING_PREFIX}/:entityIdentifier/:action/:id`,\n key: 'editEntity',\n component: EntityManager,\n exact: true\n };\n\n const addEntityRoute = {\n path: `${DATA_LISTING_PREFIX}/:entityIdentifier/:action`,\n key: 'createEntity',\n component: EntityManager,\n exact: true\n };\n\n app.addRoute(entityDataListingRoute);\n app.addRoute(editEntityRoute);\n app.addRoute(addEntityRoute);\n\n return {\n name: PLUGIN_NAME,\n version: pkg.version\n };\n}\n\nload.pluginName = PLUGIN_NAME;\n"],"mappings":"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","ignoreList":[]}
@@ -1,16 +1,28 @@
1
1
  const getDefaultQueryParams = schema => {
2
2
  const updated = schema.properties && schema.properties.updated;
3
3
  const {
4
- adminDefaultListingFilter: where
4
+ adminDefaultListingFilter: where,
5
+ adminListings: {
6
+ defaultSort
7
+ } = {}
5
8
  } = schema.displayProperties || {};
9
+ let sort = [];
10
+ if (defaultSort === null || defaultSort === void 0 ? void 0 : defaultSort.property) {
11
+ sort = [{
12
+ property: defaultSort.property,
13
+ direction: defaultSort.direction || 'asc'
14
+ }];
15
+ } else if (updated) {
16
+ sort = [{
17
+ property: 'updated',
18
+ direction: 'desc'
19
+ }];
20
+ }
6
21
  return {
7
22
  where,
8
23
  limit: 10,
9
24
  offset: 0,
10
- sort: updated ? [{
11
- property: 'updated',
12
- direction: 'desc'
13
- }] : []
25
+ sort
14
26
  };
15
27
  };
16
28
  export { getDefaultQueryParams };
@@ -1 +1 @@
1
- {"version":3,"file":"get-default-query-params.js","names":["getDefaultQueryParams","schema","updated","properties","adminDefaultListingFilter","where","displayProperties","limit","offset","sort","property","direction"],"sources":["../../src/utils/get-default-query-params.js"],"sourcesContent":["const getDefaultQueryParams = schema => {\n const updated = schema.properties && schema.properties.updated;\n const { adminDefaultListingFilter: where } = schema.displayProperties || {};\n\n return {\n where,\n limit: 10,\n offset: 0,\n sort: updated\n ? [\n {\n property: 'updated',\n direction: 'desc'\n }\n ]\n : []\n };\n};\n\nexport { getDefaultQueryParams };\n"],"mappings":"AAAA,MAAMA,qBAAqB,GAAGC,MAAM,IAAI;EACtC,MAAMC,OAAO,GAAGD,MAAM,CAACE,UAAU,IAAIF,MAAM,CAACE,UAAU,CAACD,OAAO;EAC9D,MAAM;IAAEE,yBAAyB,EAAEC;EAAM,CAAC,GAAGJ,MAAM,CAACK,iBAAiB,IAAI,CAAC,CAAC;EAE3E,OAAO;IACLD,KAAK;IACLE,KAAK,EAAE,EAAE;IACTC,MAAM,EAAE,CAAC;IACTC,IAAI,EAAEP,OAAO,GACT,CACE;MACEQ,QAAQ,EAAE,SAAS;MACnBC,SAAS,EAAE;IACb,CAAC,CACF,GACD;EACN,CAAC;AACH,CAAC;AAED,SAASX,qBAAqB","ignoreList":[]}
1
+ {"version":3,"file":"get-default-query-params.js","names":["getDefaultQueryParams","schema","updated","properties","adminDefaultListingFilter","where","adminListings","defaultSort","displayProperties","sort","property","direction","limit","offset"],"sources":["../../src/utils/get-default-query-params.js"],"sourcesContent":["const getDefaultQueryParams = schema => {\n const updated = schema.properties && schema.properties.updated;\n const { adminDefaultListingFilter: where, adminListings: { defaultSort } = {} } =\n schema.displayProperties || {};\n\n let sort = [];\n\n if (defaultSort?.property) {\n sort = [\n {\n property: defaultSort.property,\n direction: defaultSort.direction || 'asc'\n }\n ];\n } else if (updated) {\n sort = [\n {\n property: 'updated',\n direction: 'desc'\n }\n ];\n }\n\n return {\n where,\n limit: 10,\n offset: 0,\n sort\n };\n};\n\nexport { getDefaultQueryParams };\n"],"mappings":"AAAA,MAAMA,qBAAqB,GAAGC,MAAM,IAAI;EACtC,MAAMC,OAAO,GAAGD,MAAM,CAACE,UAAU,IAAIF,MAAM,CAACE,UAAU,CAACD,OAAO;EAC9D,MAAM;IAAEE,yBAAyB,EAAEC,KAAK;IAAEC,aAAa,EAAE;MAAEC;IAAY,CAAC,GAAG,CAAC;EAAE,CAAC,GAC7EN,MAAM,CAACO,iBAAiB,IAAI,CAAC,CAAC;EAEhC,IAAIC,IAAI,GAAG,EAAE;EAEb,IAAIF,WAAW,aAAXA,WAAW,uBAAXA,WAAW,CAAEG,QAAQ,EAAE;IACzBD,IAAI,GAAG,CACL;MACEC,QAAQ,EAAEH,WAAW,CAACG,QAAQ;MAC9BC,SAAS,EAAEJ,WAAW,CAACI,SAAS,IAAI;IACtC,CAAC,CACF;EACH,CAAC,MAAM,IAAIT,OAAO,EAAE;IAClBO,IAAI,GAAG,CACL;MACEC,QAAQ,EAAE,SAAS;MACnBC,SAAS,EAAE;IACb,CAAC,CACF;EACH;EAEA,OAAO;IACLN,KAAK;IACLO,KAAK,EAAE,EAAE;IACTC,MAAM,EAAE,CAAC;IACTJ;EACF,CAAC;AACH,CAAC;AAED,SAAST,qBAAqB","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blaze-cms/plugin-data-ui",
3
- "version": "0.147.0-rc-eagle.2",
3
+ "version": "0.147.0-rc-eagle.6",
4
4
  "description": "Blaze plugin data ui",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib-es/index.js",
@@ -32,16 +32,16 @@
32
32
  },
33
33
  "license": "GPL-3.0",
34
34
  "dependencies": {
35
- "@blaze-cms/admin-ui-utils": "0.147.0-rc-eagle.2",
36
- "@blaze-cms/core-errors": "0.147.0-rc-eagle.2",
37
- "@blaze-cms/plugin-render-hooks-ui": "0.147.0-rc-eagle.2",
38
- "@blaze-cms/react-form-builder": "0.147.0-rc-eagle.2",
39
- "@blaze-cms/react-page-builder": "0.147.0-rc-eagle.2",
40
- "@blaze-cms/setup-ui": "0.147.0-rc-eagle.2",
41
- "@blaze-cms/versioning-ui": "0.147.0-rc-eagle.2",
35
+ "@blaze-cms/admin-ui-utils": "0.147.0-rc-eagle.6",
36
+ "@blaze-cms/core-errors": "0.147.0-rc-eagle.4",
37
+ "@blaze-cms/plugin-render-hooks-ui": "0.147.0-rc-eagle.6",
38
+ "@blaze-cms/react-form-builder": "0.147.0-rc-eagle.6",
39
+ "@blaze-cms/react-page-builder": "0.147.0-rc-eagle.6",
40
+ "@blaze-cms/setup-ui": "0.147.0-rc-eagle.4",
41
+ "@blaze-cms/versioning-ui": "0.147.0-rc-eagle.6",
42
42
  "@blaze-react/button": "0.8.0-alpha.82",
43
43
  "@blaze-react/more": "0.5.19",
44
- "@blaze-react/multiselect": "0.8.0-alpha.103",
44
+ "@blaze-react/multiselect": "0.8.0-alpha.108",
45
45
  "@blaze-react/pagination": "0.8.0-alpha.76",
46
46
  "@blaze-react/select": "0.8.0-alpha.100",
47
47
  "@blaze-react/tab": "^0.7.0",
@@ -57,11 +57,10 @@
57
57
  "lodash.unionby": "^4.8.0",
58
58
  "lodash.upperfirst": "^4.3.1",
59
59
  "react-helmet": "^6.1.0",
60
- "regenerator-runtime": "^0.13.3",
61
60
  "uuid": "^3.3.3"
62
61
  },
63
62
  "devDependencies": {
64
- "@blaze-cms/core-ui": "0.147.0-rc-eagle.2"
63
+ "@blaze-cms/core-ui": "0.147.0-rc-eagle.4"
65
64
  },
66
65
  "peerDependencies": {
67
66
  "@apollo/client": "3.x",
@@ -73,5 +72,5 @@
73
72
  "lib/*",
74
73
  "lib-es/*"
75
74
  ],
76
- "gitHead": "156a1560d7bc2bbd57b5b51fdf11098349bb26f5"
75
+ "gitHead": "bcec507f4cd89a2573e960c326852e44b103feb0"
77
76
  }
@@ -490,9 +490,8 @@ const Entity = ({
490
490
  </div>
491
491
 
492
492
  <div
493
- className={`column column--one-third page-sidebar page-sidebar--relations${
494
- !isRightSidebarOpen ? ' sidebar--collapsed' : ''
495
- }`}>
493
+ className={`column column--one-third page-sidebar page-sidebar--relations${!isRightSidebarOpen ? ' sidebar--collapsed' : ''
494
+ }`}>
496
495
  {showSideBarRelations && (
497
496
  <SideBarRelations
498
497
  entity={entity}
@@ -0,0 +1,160 @@
1
+ import React, { useState, useEffect, useMemo } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import MultiSelect from '@blaze-react/multiselect';
4
+ import debounce from 'lodash.debounce';
5
+ import unionBy from 'lodash.unionby';
6
+ import { useApolloClient } from '@apollo/client';
7
+ import {
8
+ getQuery,
9
+ getDynamicQuery,
10
+ getAdminRecordSearch,
11
+ buildLabel
12
+ } from '@blaze-cms/admin-ui-utils';
13
+
14
+ const DEBOUNCE_TIME = 500;
15
+ const SEARCH_LOAD_OFFSET = 10;
16
+ const SELECTION_LIMIT = 10;
17
+
18
+ const shouldLoadMore = (searchTerm, stopIndex, currentDataLength) =>
19
+ searchTerm &&
20
+ stopIndex > SEARCH_LOAD_OFFSET &&
21
+ stopIndex >= currentDataLength - SEARCH_LOAD_OFFSET;
22
+
23
+ const RelationMultiSelectFilter = ({ id, label, entityIdentifier, selectedIds, onChange }) => {
24
+ const client = useApolloClient();
25
+ const [schema, setSchema] = useState(null);
26
+ const [data, setData] = useState([]);
27
+ const [searchTerm, setSearchTerm] = useState('');
28
+
29
+ const { displayProperties } = schema || {};
30
+
31
+ useEffect(() => {
32
+ let active = true;
33
+ (async () => {
34
+ try {
35
+ const { data: { getEntitySchemas = [] } = {} } = await client.query({
36
+ query: getQuery('GET_ENTITY_SCHEMA'),
37
+ variables: { identifier: entityIdentifier }
38
+ });
39
+ const [relationSchema] = getEntitySchemas;
40
+ if (active && relationSchema) setSchema(relationSchema);
41
+ } catch {
42
+ if (active) setSchema(null);
43
+ }
44
+ })();
45
+ return () => {
46
+ active = false;
47
+ };
48
+ }, [client, entityIdentifier]);
49
+
50
+ useEffect(() => {
51
+ if (!schema || !selectedIds.length) return undefined;
52
+ let active = true;
53
+ (async () => {
54
+ try {
55
+ const { data: { result = [] } = {} } = await client.query({
56
+ query: getDynamicQuery('GET_ALL_ENTITIES')(schema),
57
+ variables: {
58
+ where: { id: { _in: selectedIds } },
59
+ sort: [{ property: 'name', direction: 'asc' }]
60
+ }
61
+ });
62
+ if (active && result.length) setData(prev => unionBy([...prev, ...result], 'id'));
63
+ } catch {
64
+ // ignore - selected chips will fall back to id-only display
65
+ }
66
+ })();
67
+ return () => {
68
+ active = false;
69
+ };
70
+ // eslint-disable-next-line react-hooks/exhaustive-deps
71
+ }, [schema]);
72
+
73
+ const onSearch = useMemo(
74
+ () => (schema ? getAdminRecordSearch(schema, client) : null),
75
+ [schema, client]
76
+ );
77
+
78
+ const currentData = useMemo(
79
+ () =>
80
+ data.map(option => {
81
+ const checked = selectedIds.includes(option.id);
82
+ return {
83
+ ...option,
84
+ checked,
85
+ show: true,
86
+ name: buildLabel(displayProperties, option)
87
+ };
88
+ }),
89
+ [data, selectedIds, displayProperties]
90
+ );
91
+
92
+ const interceptOnSearchChange = debounce(async ({ value }) => {
93
+ setSearchTerm(value);
94
+ if (!onSearch) return;
95
+ const result = await onSearch({ event: { value }, currentValue: selectedIds });
96
+ if (!result) return;
97
+ setData(prev => {
98
+ const selected = prev.filter(item => selectedIds.includes(item.id));
99
+ const newOnes = result.filter(item => !selectedIds.includes(item.id));
100
+ return unionBy([...selected, ...newOnes], 'id');
101
+ });
102
+ }, DEBOUNCE_TIME);
103
+
104
+ const scrollHook = debounce(async ({ stopIndex }) => {
105
+ if (!onSearch) return;
106
+ const currentDataLength = data.length - selectedIds.length;
107
+ if (!shouldLoadMore(searchTerm, stopIndex, currentDataLength)) return;
108
+ const result = await onSearch({
109
+ event: { value: searchTerm },
110
+ currentValue: selectedIds,
111
+ currentOffset: currentDataLength
112
+ });
113
+ if (!result || !result.length) return;
114
+ setData(prev => unionBy([...prev, ...result], 'id'));
115
+ }, DEBOUNCE_TIME);
116
+
117
+ const onItemsRenderedIntercept = async event => {
118
+ if (!onSearch) return;
119
+ scrollHook(event);
120
+ };
121
+
122
+ const getSelected = ({
123
+ event: {
124
+ target: { value }
125
+ }
126
+ }) => {
127
+ onChange(id, value);
128
+ };
129
+
130
+ return (
131
+ <MultiSelect
132
+ label={label}
133
+ name={id}
134
+ data={{ data: currentData, filterBy: ['name'], identification: 'id', keyValue: 'name' }}
135
+ limit={SELECTION_LIMIT}
136
+ onChange={interceptOnSearchChange}
137
+ getSelected={getSelected}
138
+ onItemsRendered={onItemsRenderedIntercept}
139
+ required={false}
140
+ checkedPreviewCount={1}
141
+ formatMoreLabel={count => `${count} more`}
142
+ isDynamic
143
+ />
144
+ );
145
+ };
146
+
147
+ RelationMultiSelectFilter.propTypes = {
148
+ id: PropTypes.string.isRequired,
149
+ label: PropTypes.string,
150
+ entityIdentifier: PropTypes.string.isRequired,
151
+ selectedIds: PropTypes.array,
152
+ onChange: PropTypes.func.isRequired
153
+ };
154
+
155
+ RelationMultiSelectFilter.defaultProps = {
156
+ label: '',
157
+ selectedIds: []
158
+ };
159
+
160
+ export default RelationMultiSelectFilter;