@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.
- package/README.md +9 -2
- package/lib/components/EntityManager/Entity/Entity.js.map +1 -1
- package/lib/components/ListingTable/SearchFilter/RelationMultiSelectFilter.js +181 -0
- package/lib/components/ListingTable/SearchFilter/RelationMultiSelectFilter.js.map +1 -0
- package/lib/components/ListingTable/SearchFilter/SearchContainer.js +338 -49
- package/lib/components/ListingTable/SearchFilter/SearchContainer.js.map +1 -1
- package/lib/components/ListingTable/SearchFilter/SearchFilter.js +6 -2
- package/lib/components/ListingTable/SearchFilter/SearchFilter.js.map +1 -1
- package/lib/components/ListingTable/SearchFilter/helpers.js +41 -8
- package/lib/components/ListingTable/SearchFilter/helpers.js.map +1 -1
- package/lib/index.js +7 -0
- package/lib/index.js.map +1 -1
- package/lib/utils/get-default-query-params.js +17 -5
- package/lib/utils/get-default-query-params.js.map +1 -1
- package/lib-es/components/EntityManager/Entity/Entity.js.map +1 -1
- package/lib-es/components/ListingTable/SearchFilter/RelationMultiSelectFilter.js +173 -0
- package/lib-es/components/ListingTable/SearchFilter/RelationMultiSelectFilter.js.map +1 -0
- package/lib-es/components/ListingTable/SearchFilter/SearchContainer.js +340 -51
- package/lib-es/components/ListingTable/SearchFilter/SearchContainer.js.map +1 -1
- package/lib-es/components/ListingTable/SearchFilter/SearchFilter.js +7 -3
- package/lib-es/components/ListingTable/SearchFilter/SearchFilter.js.map +1 -1
- package/lib-es/components/ListingTable/SearchFilter/helpers.js +39 -8
- package/lib-es/components/ListingTable/SearchFilter/helpers.js.map +1 -1
- package/lib-es/index.js +1 -0
- package/lib-es/index.js.map +1 -1
- package/lib-es/utils/get-default-query-params.js +17 -5
- package/lib-es/utils/get-default-query-params.js.map +1 -1
- package/package.json +11 -12
- package/src/components/EntityManager/Entity/Entity.js +2 -3
- package/src/components/ListingTable/SearchFilter/RelationMultiSelectFilter.js +160 -0
- package/src/components/ListingTable/SearchFilter/SearchContainer.js +396 -71
- package/src/components/ListingTable/SearchFilter/SearchFilter.js +5 -2
- package/src/components/ListingTable/SearchFilter/helpers.js +55 -8
- package/src/index.js +2 -0
- 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
|
-
|
|
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;
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
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","
|
|
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 => {
|
package/lib-es/index.js.map
CHANGED
|
@@ -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":"AAAA,SAASA,oBAAoB,EAAEC,cAAc,QAAQ,+BAA+B;AACpF,OAAOC,GAAG,MAAM,iBAAiB;AACjC,SAASC,mBAAmB,EAAEC,WAAW,QAAQ,aAAa;AAC9D,OAAOC,sBAAsB,MAAM,gCAAgC;AACnE,SAASC,QAAQ,EAAEC,YAAY,EAAEC,WAAW,EAAEC,YAAY,QAAQ,SAAS;AAC3E,OAAOC,iBAAiB,MAAM,gCAAgC;AAC9D,OAAOC,aAAa,MAAM,4BAA4B;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,eAAe,eAAeC,IAAIA,CAACC,GAAG,EAAE;EACtCA,GAAG,CAACC,MAAM,CAACC,IAAI,CAAC,wBAAwB,
|
|
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
|
|
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","
|
|
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.
|
|
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.
|
|
36
|
-
"@blaze-cms/core-errors": "0.147.0-rc-eagle.
|
|
37
|
-
"@blaze-cms/plugin-render-hooks-ui": "0.147.0-rc-eagle.
|
|
38
|
-
"@blaze-cms/react-form-builder": "0.147.0-rc-eagle.
|
|
39
|
-
"@blaze-cms/react-page-builder": "0.147.0-rc-eagle.
|
|
40
|
-
"@blaze-cms/setup-ui": "0.147.0-rc-eagle.
|
|
41
|
-
"@blaze-cms/versioning-ui": "0.147.0-rc-eagle.
|
|
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.
|
|
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.
|
|
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": "
|
|
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
|
-
|
|
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;
|