@blaze-cms/plugin-data-ui 0.146.0-rc-eagle.0 → 0.146.0-rc-eagle-3.0

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 (195) hide show
  1. package/CHANGELOG.md +10 -1
  2. package/README.md +9 -2
  3. package/lib/components/EntityManager/Entity/Entity.js +3 -2
  4. package/lib/components/EntityManager/Entity/Entity.js.map +1 -1
  5. package/lib/components/EntityManager/Entity/SideBarRelations/index.js +2 -1
  6. package/lib/components/EntityManager/Entity/SideBarRelations/index.js.map +1 -1
  7. package/lib/components/EntityManager/Entity/actions-handlers/create/submit.js +4 -15
  8. package/lib/components/EntityManager/Entity/actions-handlers/create/submit.js.map +1 -1
  9. package/lib/components/EntityManager/EntityManager.js +2 -1
  10. package/lib/components/EntityManager/EntityManager.js.map +1 -1
  11. package/lib/components/EntityManager/utils/entity.js +2 -3
  12. package/lib/components/EntityManager/utils/entity.js.map +1 -1
  13. package/lib/components/InfoBoxes/container/InfoBoxContainer.js +2 -1
  14. package/lib/components/InfoBoxes/container/InfoBoxContainer.js.map +1 -1
  15. package/lib/components/ListingTable/ListingTable.js +2 -1
  16. package/lib/components/ListingTable/ListingTable.js.map +1 -1
  17. package/lib/components/ListingTable/ListingTableContent/ListingTableContent.js +2 -1
  18. package/lib/components/ListingTable/ListingTableContent/ListingTableContent.js.map +1 -1
  19. package/lib/components/ListingTable/SearchFilter/RelationMultiSelectFilter.js +182 -0
  20. package/lib/components/ListingTable/SearchFilter/RelationMultiSelectFilter.js.map +1 -0
  21. package/lib/components/ListingTable/SearchFilter/SearchContainer.js +340 -50
  22. package/lib/components/ListingTable/SearchFilter/SearchContainer.js.map +1 -1
  23. package/lib/components/ListingTable/SearchFilter/SearchFilter.js +8 -3
  24. package/lib/components/ListingTable/SearchFilter/SearchFilter.js.map +1 -1
  25. package/lib/components/ListingTable/SearchFilter/helpers.js +41 -8
  26. package/lib/components/ListingTable/SearchFilter/helpers.js.map +1 -1
  27. package/lib/components/Tabs/index.js +2 -1
  28. package/lib/components/Tabs/index.js.map +1 -1
  29. package/lib/index.js +7 -0
  30. package/lib/index.js.map +1 -1
  31. package/lib/utils/build-create-entity-mutation.js +3 -19
  32. package/lib/utils/build-create-entity-mutation.js.map +1 -1
  33. package/lib/utils/get-default-query-params.js +17 -5
  34. package/lib/utils/get-default-query-params.js.map +1 -1
  35. package/lib-es/components/EntityDataListing/EntityDataListing.js +33 -0
  36. package/lib-es/components/EntityDataListing/EntityDataListing.js.map +1 -0
  37. package/lib-es/components/EntityDataListing/index.js +3 -0
  38. package/lib-es/components/EntityDataListing/index.js.map +1 -0
  39. package/lib-es/components/EntityManager/Entity/EntitiyNavLinks/EntityNavLinks.js +30 -0
  40. package/lib-es/components/EntityManager/Entity/EntitiyNavLinks/EntityNavLinks.js.map +1 -0
  41. package/lib-es/components/EntityManager/Entity/EntitiyNavLinks/index.js +3 -0
  42. package/lib-es/components/EntityManager/Entity/EntitiyNavLinks/index.js.map +1 -0
  43. package/lib-es/components/EntityManager/Entity/Entity.js +453 -0
  44. package/lib-es/components/EntityManager/Entity/Entity.js.map +1 -0
  45. package/lib-es/components/EntityManager/Entity/EntityHeader/EntityHeader.js +103 -0
  46. package/lib-es/components/EntityManager/Entity/EntityHeader/EntityHeader.js.map +1 -0
  47. package/lib-es/components/EntityManager/Entity/EntityHeader/HeaderPreviewButton/HeaderPreviewButton.js +47 -0
  48. package/lib-es/components/EntityManager/Entity/EntityHeader/HeaderPreviewButton/HeaderPreviewButton.js.map +1 -0
  49. package/lib-es/components/EntityManager/Entity/EntityHeader/HeaderPreviewButton/index.js +3 -0
  50. package/lib-es/components/EntityManager/Entity/EntityHeader/HeaderPreviewButton/index.js.map +1 -0
  51. package/lib-es/components/EntityManager/Entity/EntityHeader/index.js +3 -0
  52. package/lib-es/components/EntityManager/Entity/EntityHeader/index.js.map +1 -0
  53. package/lib-es/components/EntityManager/Entity/SideBarRelations/container/CustomSidebarInfoContainer.js +30 -0
  54. package/lib-es/components/EntityManager/Entity/SideBarRelations/container/CustomSidebarInfoContainer.js.map +1 -0
  55. package/lib-es/components/EntityManager/Entity/SideBarRelations/helpers/build-dynamic-query.js +29 -0
  56. package/lib-es/components/EntityManager/Entity/SideBarRelations/helpers/build-dynamic-query.js.map +1 -0
  57. package/lib-es/components/EntityManager/Entity/SideBarRelations/hooks/useCustomSidebarData.js +49 -0
  58. package/lib-es/components/EntityManager/Entity/SideBarRelations/hooks/useCustomSidebarData.js.map +1 -0
  59. package/lib-es/components/EntityManager/Entity/SideBarRelations/index.js +136 -0
  60. package/lib-es/components/EntityManager/Entity/SideBarRelations/index.js.map +1 -0
  61. package/lib-es/components/EntityManager/Entity/SideBarRelations/presentational/CustomSidebarInfo.js +36 -0
  62. package/lib-es/components/EntityManager/Entity/SideBarRelations/presentational/CustomSidebarInfo.js.map +1 -0
  63. package/lib-es/components/EntityManager/Entity/actions-handlers/create/index.js +5 -0
  64. package/lib-es/components/EntityManager/Entity/actions-handlers/create/index.js.map +1 -0
  65. package/lib-es/components/EntityManager/Entity/actions-handlers/create/submit.js +36 -0
  66. package/lib-es/components/EntityManager/Entity/actions-handlers/create/submit.js.map +1 -0
  67. package/lib-es/components/EntityManager/Entity/actions-handlers/delete/delete.js +32 -0
  68. package/lib-es/components/EntityManager/Entity/actions-handlers/delete/delete.js.map +1 -0
  69. package/lib-es/components/EntityManager/Entity/actions-handlers/delete/index.js +5 -0
  70. package/lib-es/components/EntityManager/Entity/actions-handlers/delete/index.js.map +1 -0
  71. package/lib-es/components/EntityManager/Entity/actions-handlers/index.js +12 -0
  72. package/lib-es/components/EntityManager/Entity/actions-handlers/index.js.map +1 -0
  73. package/lib-es/components/EntityManager/Entity/actions-handlers/shared/index.js +5 -0
  74. package/lib-es/components/EntityManager/Entity/actions-handlers/shared/index.js.map +1 -0
  75. package/lib-es/components/EntityManager/Entity/actions-handlers/shared/publish.js +39 -0
  76. package/lib-es/components/EntityManager/Entity/actions-handlers/shared/publish.js.map +1 -0
  77. package/lib-es/components/EntityManager/Entity/actions-handlers/update/index.js +5 -0
  78. package/lib-es/components/EntityManager/Entity/actions-handlers/update/index.js.map +1 -0
  79. package/lib-es/components/EntityManager/Entity/actions-handlers/update/submit.js +53 -0
  80. package/lib-es/components/EntityManager/Entity/actions-handlers/update/submit.js.map +1 -0
  81. package/lib-es/components/EntityManager/Entity/index.js +3 -0
  82. package/lib-es/components/EntityManager/Entity/index.js.map +1 -0
  83. package/lib-es/components/EntityManager/EntityManager.js +133 -0
  84. package/lib-es/components/EntityManager/EntityManager.js.map +1 -0
  85. package/lib-es/components/EntityManager/index.js +3 -0
  86. package/lib-es/components/EntityManager/index.js.map +1 -0
  87. package/lib-es/components/EntityManager/utils/RecordEditContext/index.js +6 -0
  88. package/lib-es/components/EntityManager/utils/RecordEditContext/index.js.map +1 -0
  89. package/lib-es/components/EntityManager/utils/data-mappers.js +55 -0
  90. package/lib-es/components/EntityManager/utils/data-mappers.js.map +1 -0
  91. package/lib-es/components/EntityManager/utils/entity.js +69 -0
  92. package/lib-es/components/EntityManager/utils/entity.js.map +1 -0
  93. package/lib-es/components/EntityManager/utils/entityAvailableActions.js +56 -0
  94. package/lib-es/components/EntityManager/utils/entityAvailableActions.js.map +1 -0
  95. package/lib-es/components/EntityManager/utils/is-form-empty.js +9 -0
  96. package/lib-es/components/EntityManager/utils/is-form-empty.js.map +1 -0
  97. package/lib-es/components/EntityManager/utils/query.js +23 -0
  98. package/lib-es/components/EntityManager/utils/query.js.map +1 -0
  99. package/lib-es/components/InfoBoxes/InfoBoxTooltip.js +36 -0
  100. package/lib-es/components/InfoBoxes/InfoBoxTooltip.js.map +1 -0
  101. package/lib-es/components/InfoBoxes/InfoBoxes.js +28 -0
  102. package/lib-es/components/InfoBoxes/InfoBoxes.js.map +1 -0
  103. package/lib-es/components/InfoBoxes/container/InfoBoxContainer.js +38 -0
  104. package/lib-es/components/InfoBoxes/container/InfoBoxContainer.js.map +1 -0
  105. package/lib-es/components/InfoBoxes/helpers/build-dynamic-query.js +28 -0
  106. package/lib-es/components/InfoBoxes/helpers/build-dynamic-query.js.map +1 -0
  107. package/lib-es/components/InfoBoxes/hooks/useData.js +39 -0
  108. package/lib-es/components/InfoBoxes/hooks/useData.js.map +1 -0
  109. package/lib-es/components/InfoBoxes/hooks/useInfoBox.js +17 -0
  110. package/lib-es/components/InfoBoxes/hooks/useInfoBox.js.map +1 -0
  111. package/lib-es/components/InfoBoxes/index.js +3 -0
  112. package/lib-es/components/InfoBoxes/index.js.map +1 -0
  113. package/lib-es/components/InfoBoxes/presentational/InfoBox.js +40 -0
  114. package/lib-es/components/InfoBoxes/presentational/InfoBox.js.map +1 -0
  115. package/lib-es/components/InfoBoxes/presentational/InfoBoxLabel.js +12 -0
  116. package/lib-es/components/InfoBoxes/presentational/InfoBoxLabel.js.map +1 -0
  117. package/lib-es/components/InfoBoxes/presentational/InfoBoxValue.js +30 -0
  118. package/lib-es/components/InfoBoxes/presentational/InfoBoxValue.js.map +1 -0
  119. package/lib-es/components/ListingTable/ListingTable.js +208 -0
  120. package/lib-es/components/ListingTable/ListingTable.js.map +1 -0
  121. package/lib-es/components/ListingTable/ListingTableContent/ListingTableContent.js +72 -0
  122. package/lib-es/components/ListingTable/ListingTableContent/ListingTableContent.js.map +1 -0
  123. package/lib-es/components/ListingTable/ListingTableContent/index.js +3 -0
  124. package/lib-es/components/ListingTable/ListingTableContent/index.js.map +1 -0
  125. package/lib-es/components/ListingTable/SearchFilter/RelationMultiSelectFilter.js +173 -0
  126. package/lib-es/components/ListingTable/SearchFilter/RelationMultiSelectFilter.js.map +1 -0
  127. package/lib-es/components/ListingTable/SearchFilter/SearchContainer.js +496 -0
  128. package/lib-es/components/ListingTable/SearchFilter/SearchContainer.js.map +1 -0
  129. package/lib-es/components/ListingTable/SearchFilter/SearchFilter.js +44 -0
  130. package/lib-es/components/ListingTable/SearchFilter/SearchFilter.js.map +1 -0
  131. package/lib-es/components/ListingTable/SearchFilter/helpers.js +127 -0
  132. package/lib-es/components/ListingTable/SearchFilter/helpers.js.map +1 -0
  133. package/lib-es/components/ListingTable/SearchFilter/querys.js +8 -0
  134. package/lib-es/components/ListingTable/SearchFilter/querys.js.map +1 -0
  135. package/lib-es/components/ListingTable/TableActions/TableActions.js +34 -0
  136. package/lib-es/components/ListingTable/TableActions/TableActions.js.map +1 -0
  137. package/lib-es/components/ListingTable/TableActions/index.js +3 -0
  138. package/lib-es/components/ListingTable/TableActions/index.js.map +1 -0
  139. package/lib-es/components/ListingTable/index.js +3 -0
  140. package/lib-es/components/ListingTable/index.js.map +1 -0
  141. package/lib-es/components/ListingTable/mappers/populate-rows.js +140 -0
  142. package/lib-es/components/ListingTable/mappers/populate-rows.js.map +1 -0
  143. package/lib-es/components/ListingTable/service/index.js +87 -0
  144. package/lib-es/components/ListingTable/service/index.js.map +1 -0
  145. package/lib-es/components/Tabs/index.js +38 -0
  146. package/lib-es/components/Tabs/index.js.map +1 -0
  147. package/lib-es/components/hooks/useCallbackDebounce.js +12 -0
  148. package/lib-es/components/hooks/useCallbackDebounce.js.map +1 -0
  149. package/lib-es/constants.js +42 -0
  150. package/lib-es/constants.js.map +1 -0
  151. package/lib-es/icons/ContentIcon.js +80 -0
  152. package/lib-es/icons/ContentIcon.js.map +1 -0
  153. package/lib-es/icons/SettingsIcon.js +36 -0
  154. package/lib-es/icons/SettingsIcon.js.map +1 -0
  155. package/lib-es/icons/TaxonomyIcon.js +60 -0
  156. package/lib-es/icons/TaxonomyIcon.js.map +1 -0
  157. package/lib-es/icons/UsersIcon.js +33 -0
  158. package/lib-es/icons/UsersIcon.js.map +1 -0
  159. package/lib-es/icons/index.js +6 -0
  160. package/lib-es/icons/index.js.map +1 -0
  161. package/lib-es/index.js +93 -0
  162. package/lib-es/index.js.map +1 -0
  163. package/lib-es/utils/add-content-menu-items.js +72 -0
  164. package/lib-es/utils/add-content-menu-items.js.map +1 -0
  165. package/lib-es/utils/build-create-entity-mutation.js +7 -0
  166. package/lib-es/utils/build-create-entity-mutation.js.map +1 -0
  167. package/lib-es/utils/build-delete-entity-mutation.js +18 -0
  168. package/lib-es/utils/build-delete-entity-mutation.js.map +1 -0
  169. package/lib-es/utils/build-listing-query.js +28 -0
  170. package/lib-es/utils/build-listing-query.js.map +1 -0
  171. package/lib-es/utils/build-update-data-query.js +24 -0
  172. package/lib-es/utils/build-update-data-query.js.map +1 -0
  173. package/lib-es/utils/build-update-publish-unpublish-mutation.js +22 -0
  174. package/lib-es/utils/build-update-publish-unpublish-mutation.js.map +1 -0
  175. package/lib-es/utils/get-default-query-params.js +29 -0
  176. package/lib-es/utils/get-default-query-params.js.map +1 -0
  177. package/lib-es/utils/hoc/withContext.js +8 -0
  178. package/lib-es/utils/hoc/withContext.js.map +1 -0
  179. package/lib-es/utils/hooks/useToggle.js +8 -0
  180. package/lib-es/utils/hooks/useToggle.js.map +1 -0
  181. package/lib-es/utils/index.js +3 -0
  182. package/lib-es/utils/index.js.map +1 -0
  183. package/package.json +16 -12
  184. package/src/components/EntityManager/Entity/Entity.js +1 -1
  185. package/src/components/EntityManager/Entity/actions-handlers/create/submit.js +4 -11
  186. package/src/components/EntityManager/utils/entity.js +4 -10
  187. package/src/components/ListingTable/SearchFilter/RelationMultiSelectFilter.js +160 -0
  188. package/src/components/ListingTable/SearchFilter/SearchContainer.js +396 -71
  189. package/src/components/ListingTable/SearchFilter/SearchFilter.js +5 -2
  190. package/src/components/ListingTable/SearchFilter/helpers.js +55 -8
  191. package/src/index.js +2 -0
  192. package/src/utils/build-create-entity-mutation.js +5 -28
  193. package/src/utils/get-default-query-params.js +21 -9
  194. package/babel.config.js +0 -3
  195. package/jest.config.js +0 -5
@@ -9,28 +9,55 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
9
9
  var _react = _interopRequireWildcard(require("react"));
10
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
11
11
  var _select = _interopRequireDefault(require("@blaze-react/select"));
12
+ var _multiselect = _interopRequireDefault(require("@blaze-react/multiselect"));
13
+ var _lodash = _interopRequireDefault(require("lodash.debounce"));
14
+ var _lodash2 = _interopRequireDefault(require("lodash.unionby"));
12
15
  var _client = require("@apollo/client");
13
16
  var _adminUiUtils = require("@blaze-cms/admin-ui-utils");
17
+ var _utils = require("@blaze-cms/utils");
14
18
  var _bs = require("react-icons/bs");
15
19
  var _helpers = require("./helpers");
20
+ var _RelationMultiSelectFilter = _interopRequireDefault(require("./RelationMultiSelectFilter"));
16
21
  var _querys = require("./querys");
17
22
  var _constants = require("../../../constants");
18
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
23
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
24
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
19
25
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
20
26
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
21
27
  const SearchContainer = ({
22
28
  setListFilters,
23
29
  keywordFiltersToUse = [],
24
30
  selectFiltersToDisplay = [],
31
+ multiSelectFiltersToDisplay = [],
25
32
  schema,
26
- index
33
+ index,
34
+ values
27
35
  }) => {
28
- const apolloClient = (0, _client.useApolloClient)();
36
+ const client = (0, _client.useApolloClient)();
29
37
  const [searchTerm, setSearchTerm] = (0, _react.useState)('');
30
38
  const [selectedFilters, setSelectedFilters] = (0, _react.useState)({});
31
39
  const [selectOptions, setSelectOptions] = (0, _react.useState)([]);
40
+ const [multiSelectOptions, setMultiSelectOptions] = (0, _react.useState)([]);
41
+ const [allEntitySchemas, setAllEntitySchemas] = (0, _react.useState)([]);
32
42
  const displaySearchFilter = keywordFiltersToUse.length > 0;
33
43
  const displaySelectFilters = selectFiltersToDisplay.length > 0;
44
+ const displayMultiSelectFilters = multiSelectFiltersToDisplay.length > 0;
45
+ const displayAggregations = displaySelectFilters || displayMultiSelectFilters;
46
+ (0, _react.useEffect)(() => {
47
+ (async () => {
48
+ try {
49
+ const all = await (0, _adminUiUtils.fetchAllEntities)({
50
+ client
51
+ });
52
+ setAllEntitySchemas(all || []);
53
+ } catch (error) {
54
+ setAllEntitySchemas([]);
55
+ }
56
+ })();
57
+ }, [client]);
58
+ const multiSelectPropertySet = (0, _react.useMemo)(() => new Set(multiSelectFiltersToDisplay.map(([property]) => property)), [multiSelectFiltersToDisplay]);
59
+ const relationMultiSelectFilters = (0, _react.useMemo)(() => multiSelectFiltersToDisplay.filter(([, config]) => config && config.relation), [multiSelectFiltersToDisplay]);
60
+ const nonRelationMultiSelectFilters = (0, _react.useMemo)(() => multiSelectFiltersToDisplay.filter(([, config]) => !config || !config.relation), [multiSelectFiltersToDisplay]);
34
61
  const {
35
62
  keywordSearchProperties,
36
63
  keywordSearchLabels
@@ -51,19 +78,60 @@ const SearchContainer = ({
51
78
  const {
52
79
  gqlFields,
53
80
  rawQuery
54
- } = (0, _react.useMemo)(() => (0, _helpers.buildQueryFields)(selectFiltersToDisplay, schema.id), [selectFiltersToDisplay, schema.id]);
55
- const action = displaySelectFilters ? (0, _adminUiUtils.getDynamicQuery)('ADMIN_SEARCH')([schema], gqlFields, false, index) : _querys.NOOP_QUERY;
81
+ } = (0, _react.useMemo)(() => (0, _helpers.buildQueryFields)([...selectFiltersToDisplay, ...nonRelationMultiSelectFilters], schema.id), [selectFiltersToDisplay, nonRelationMultiSelectFilters, schema.id]);
82
+ const action = displayAggregations ? (0, _adminUiUtils.getDynamicQuery)('ADMIN_SEARCH')([schema], gqlFields, false, index) : _querys.NOOP_QUERY;
56
83
  const {
57
84
  data
58
85
  } = (0, _client.useQuery)(action, {
59
- skip: !displaySelectFilters,
86
+ skip: !displayAggregations,
60
87
  variables: {
61
88
  where: rawQuery,
62
89
  limit: 0
63
90
  },
64
91
  fetchPolicy: 'cache-and-network'
65
92
  });
66
- const filterData = (0, _react.useMemo)(() => {
93
+ const buildRelationsIndex = (0, _react.useCallback)(schemaObj => {
94
+ const items = [];
95
+ if (schemaObj.properties) {
96
+ Object.entries(schemaObj.properties).forEach(([propName, definition]) => {
97
+ const {
98
+ relation
99
+ } = definition || {};
100
+ if (!relation) return;
101
+ const {
102
+ localField: relationLocalField,
103
+ entityIdentifier
104
+ } = relation;
105
+ const localField = relationLocalField || propName;
106
+ if (localField) items.push({
107
+ localField,
108
+ entityIdentifier
109
+ });
110
+ });
111
+ }
112
+ if (Array.isArray(schemaObj.relations)) {
113
+ schemaObj.relations.forEach(relation => {
114
+ if (!relation.localField) return;
115
+ const {
116
+ localField,
117
+ entityIdentifier
118
+ } = relation;
119
+ items.push({
120
+ localField,
121
+ entityIdentifier
122
+ });
123
+ });
124
+ }
125
+ const byKey = new Map();
126
+ items.forEach(item => {
127
+ const key = `${item.localField}|${item.entityIdentifier || ''}`;
128
+ if (!byKey.has(key)) byKey.set(key, item);
129
+ });
130
+ return Array.from(byKey.values());
131
+ }, []);
132
+ const relationsIndex = (0, _react.useMemo)(() => buildRelationsIndex(schema), [schema, buildRelationsIndex]);
133
+ const stringTypeProps = (0, _react.useMemo)(() => (0, _utils.getStringTypeProps)(schema.id, relationsIndex, allEntitySchemas), [schema.id, relationsIndex, allEntitySchemas]);
134
+ const aggregationsData = (0, _react.useMemo)(() => {
67
135
  const {
68
136
  searchResults: {
69
137
  rawResults: {
@@ -71,48 +139,61 @@ const SearchContainer = ({
71
139
  } = {}
72
140
  } = {}
73
141
  } = data || {};
74
- const proccessedData = [];
142
+ const processed = [];
75
143
  Object.entries(aggregations).forEach(([key, {
76
144
  buckets
77
145
  }]) => {
78
- proccessedData.push(Array.isArray(buckets) ? [key, buckets.map(b => b.key).filter(Boolean)] : []);
146
+ processed.push(Array.isArray(buckets) ? [key, buckets.map(bucket => bucket.key).filter(Boolean)] : []);
79
147
  });
80
- return proccessedData;
148
+ return processed;
81
149
  }, [data]);
150
+ const findFilterConfig = (0, _react.useCallback)(property => {
151
+ var _selectFiltersToDispl, _multiSelectFiltersTo;
152
+ return ((_selectFiltersToDispl = selectFiltersToDisplay.find(([prop]) => prop === property)) === null || _selectFiltersToDispl === void 0 ? void 0 : _selectFiltersToDispl[1]) || ((_multiSelectFiltersTo = multiSelectFiltersToDisplay.find(([prop]) => prop === property)) === null || _multiSelectFiltersTo === void 0 ? void 0 : _multiSelectFiltersTo[1]);
153
+ }, [selectFiltersToDisplay, multiSelectFiltersToDisplay]);
82
154
  (0, _react.useEffect)(() => {
83
- if (!filterData.length) {
155
+ if (!aggregationsData.length) {
84
156
  setSelectOptions([]);
157
+ setMultiSelectOptions([]);
85
158
  return;
86
159
  }
87
160
  (async () => {
88
- const results = await Promise.all(filterData.map(async ([property, ids]) => {
161
+ const results = await Promise.all(aggregationsData.map(async ([property, ids]) => {
89
162
  try {
90
- if (!ids || !ids.length) return {};
91
- const [, selectionDetails] = selectFiltersToDisplay.find(([selectProperty]) => selectProperty === property) || [];
92
- if (!selectionDetails) return null;
93
- if (!selectionDetails.relation) {
163
+ if (!ids || !ids.length) return null;
164
+ const config = findFilterConfig(property);
165
+ if (!config) return null;
166
+ const {
167
+ adminListingOptions: {
168
+ tidyLabel
169
+ } = {}
170
+ } = config;
171
+ if (!config.relation) {
172
+ const baseOptions = ids.map(value => [value, (0, _helpers.getTidyLabel)(value, tidyLabel)]);
94
173
  return {
95
- id: property,
96
- label: selectionDetails.label,
97
- options: ids.map(value => [value, value])
174
+ property,
175
+ label: config.label,
176
+ type: multiSelectPropertySet.has(property) ? 'multi' : 'single',
177
+ options: baseOptions,
178
+ selected: values && values[property]
98
179
  };
99
180
  }
100
- const query = (0, _adminUiUtils.getQuery)('GET_ENTITY_SCHEMA');
181
+ const schemaQuery = (0, _adminUiUtils.getQuery)('GET_ENTITY_SCHEMA');
101
182
  const {
102
183
  data: {
103
184
  getEntitySchemas: [relationSchema]
104
185
  }
105
- } = await apolloClient.query({
106
- query,
186
+ } = await client.query({
187
+ query: schemaQuery,
107
188
  variables: {
108
- identifier: selectionDetails.relation.entityIdentifier
189
+ identifier: config.relation.entityIdentifier
109
190
  }
110
191
  });
111
192
  const {
112
193
  data: {
113
194
  result: selected = []
114
195
  }
115
- } = await apolloClient.query({
196
+ } = await client.query({
116
197
  query: (0, _adminUiUtils.getDynamicQuery)('GET_ALL_ENTITIES')(relationSchema),
117
198
  variables: {
118
199
  where: {
@@ -127,45 +208,183 @@ const SearchContainer = ({
127
208
  }
128
209
  })
129
210
  // eslint-disable-next-line no-console
130
- .catch(e => console.error(e));
211
+ .catch(error => console.error(error));
212
+ const baseOptions = selected.map(item => [item.id, (0, _helpers.getTidyLabel)(item.name, tidyLabel)]);
131
213
  return {
132
- id: property,
133
- label: selectionDetails.label,
134
- options: selected.map(item => [item.id, item.name])
214
+ property,
215
+ label: config.label || config.relation.label,
216
+ type: multiSelectPropertySet.has(property) ? 'multi' : 'single',
217
+ options: baseOptions,
218
+ selected: values && values[property]
135
219
  };
136
220
  } catch {
137
221
  return null;
138
222
  }
139
223
  }));
140
- setSelectOptions(results.filter(Boolean));
224
+ const valid = results.filter(Boolean);
225
+ setSelectOptions(valid.filter(option => option.type === 'single').map(({
226
+ property,
227
+ label,
228
+ options,
229
+ selected
230
+ }) => ({
231
+ id: property,
232
+ label,
233
+ options,
234
+ selected
235
+ })));
236
+ setMultiSelectOptions(valid.filter(option => option.type === 'multi').map(({
237
+ property,
238
+ label,
239
+ options,
240
+ selected
241
+ }) => ({
242
+ id: property,
243
+ label,
244
+ items: options.map(([id, name]) => ({
245
+ id,
246
+ name
247
+ })),
248
+ selected
249
+ })));
141
250
  })();
142
- }, [apolloClient, filterData, schema, selectFiltersToDisplay]);
251
+ }, [client, aggregationsData, findFilterConfig, multiSelectPropertySet, values]);
143
252
  const updateFilters = (0, _react.useCallback)((term, filters) => (0, _helpers.updateListFilters)(term, filters, setListFilters, keywordSearchProperties), [setListFilters, keywordSearchProperties]);
253
+ const debouncedUpdateFilters = (0, _react.useMemo)(() => (0, _lodash.default)((term, filters) => updateFilters(term, filters), 300), [updateFilters]);
254
+ (0, _react.useEffect)(() => () => debouncedUpdateFilters.cancel(), [debouncedUpdateFilters]);
144
255
  const handleSearch = (0, _react.useCallback)(() => updateFilters(searchTerm, selectedFilters), [searchTerm, selectedFilters, updateFilters]);
145
- const handleSearchChange = (0, _react.useCallback)(e => setSearchTerm(e.target.value), []);
146
- const handleEnterKey = (0, _react.useCallback)(e => {
147
- if (e.key === _constants.ENTER_KEY) handleSearch();
256
+ const handleSearchChange = (0, _react.useCallback)(({
257
+ target: {
258
+ value
259
+ }
260
+ }) => setSearchTerm(value), []);
261
+ const handleEnterKey = (0, _react.useCallback)(({
262
+ key
263
+ }) => {
264
+ if (key === _constants.ENTER_KEY) handleSearch();
148
265
  }, [handleSearch]);
149
266
  const handleReset = (0, _react.useCallback)(() => {
150
267
  setSearchTerm('');
151
- setSelectedFilters(Object.keys(selectedFilters).reduce((acc, key) => _objectSpread(_objectSpread({}, acc), {}, {
152
- [key]: _constants.DEFAULT_FILTER_OPTION_LABEL
153
- }), {}));
268
+ debouncedUpdateFilters.cancel();
269
+ setSelectedFilters(prev => Object.keys(prev).reduce((acc, key) => {
270
+ acc[key] = multiSelectPropertySet.has(key) ? [] : _constants.DEFAULT_FILTER_OPTION_LABEL;
271
+ return acc;
272
+ }, {}));
154
273
  updateFilters('', {});
155
- }, [selectedFilters, updateFilters]);
156
- const handleSelect = (0, _react.useCallback)((property, event) => {
157
- const {
158
- value
159
- } = event;
274
+ }, [multiSelectPropertySet, updateFilters, debouncedUpdateFilters]);
275
+ const handleSelect = (0, _react.useCallback)((property, {
276
+ value
277
+ }) => {
160
278
  const next = _objectSpread(_objectSpread({}, selectedFilters), {}, {
161
279
  [property]: value
162
280
  });
163
281
  setSelectedFilters(next);
164
- updateFilters(searchTerm, next);
165
- }, [searchTerm, selectedFilters, updateFilters]);
282
+ debouncedUpdateFilters(searchTerm, next);
283
+ }, [searchTerm, selectedFilters, debouncedUpdateFilters]);
284
+ const handleMultiSelect = (0, _react.useCallback)((property, ids) => {
285
+ const next = _objectSpread(_objectSpread({}, selectedFilters), {}, {
286
+ [property]: ids
287
+ });
288
+ setSelectedFilters(next);
289
+ debouncedUpdateFilters(searchTerm, next);
290
+ }, [searchTerm, selectedFilters, debouncedUpdateFilters]);
291
+ const findRelationByLocalField = (0, _react.useCallback)(localField => relationsIndex.find(relation => relation.localField === localField), [relationsIndex]);
292
+ const resolveAggProp = (0, _react.useCallback)((property, config) => {
293
+ if (!config.relation) return property;
294
+ if (property.includes('.')) return property;
295
+ const localField = config.relation.localField || property;
296
+ return `${localField}.name`;
297
+ }, []);
298
+ const resolveEntityIdentifier = (0, _react.useCallback)((property, config) => {
299
+ if (!config.relation) return undefined;
300
+ if (config.relation.entityIdentifier) return config.relation.entityIdentifier;
301
+ const localField = property.includes('.') ? property.split('.')[0] : config.relation.localField || property;
302
+ return findRelationByLocalField(localField).entityIdentifier;
303
+ }, [findRelationByLocalField]);
304
+ const addEntitySuffixIfNeeded = (0, _react.useCallback)((aggProp, entityIdentifier, config) => {
305
+ if (!config.relation || !entityIdentifier) return aggProp;
306
+ return `${aggProp}/${entityIdentifier}`;
307
+ }, []);
308
+ const makeOnSearchChange = (0, _react.useCallback)(property => async ({
309
+ event: {
310
+ value
311
+ },
312
+ currentOffset
313
+ }) => {
314
+ try {
315
+ var _config$relation, _aggregations$key, _multiSelectOptions$f;
316
+ if (!value || currentOffset) return [];
317
+ const config = findFilterConfig(property);
318
+ if (!config) return [];
319
+ let aggProp = resolveAggProp(property, config);
320
+ if (config.relation && !config.relation.localField && !property.includes('.')) {
321
+ const matchingRelation = findRelationByLocalField(property);
322
+ if (matchingRelation.localField) aggProp = `${matchingRelation.localField}.name`;
323
+ }
324
+ const entityIdentifier = resolveEntityIdentifier(property, config) || ((_config$relation = config.relation) === null || _config$relation === void 0 ? void 0 : _config$relation.entityIdentifier);
325
+ const filterByEntry = addEntitySuffixIfNeeded(aggProp, entityIdentifier, config);
326
+ const currentValues = {
327
+ entity: schema.id,
328
+ filterByProperty: [filterByEntry]
329
+ };
330
+ const aggregations = await (0, _adminUiUtils.fetchFilterByDataFromElastic)(client, currentValues, relationsIndex, stringTypeProps, value);
331
+ const key = aggProp;
332
+ const buckets = (aggregations === null || aggregations === void 0 ? void 0 : (_aggregations$key = aggregations[key]) === null || _aggregations$key === void 0 ? void 0 : _aggregations$key.buckets) || [];
333
+ let items = [];
334
+ if (config.relation) {
335
+ const names = buckets.map(bucket => bucket.key).filter(Boolean);
336
+ if (names.length) {
337
+ const schemaQuery = (0, _adminUiUtils.getQuery)('GET_ENTITY_SCHEMA');
338
+ const {
339
+ data: {
340
+ getEntitySchemas: [relationSchema]
341
+ }
342
+ } = await client.query({
343
+ query: schemaQuery,
344
+ variables: {
345
+ identifier: entityIdentifier
346
+ }
347
+ });
348
+ const {
349
+ data: {
350
+ result: selected = []
351
+ }
352
+ } = await client.query({
353
+ query: (0, _adminUiUtils.getDynamicQuery)('GET_ALL_ENTITIES')(relationSchema),
354
+ variables: {
355
+ where: {
356
+ name: {
357
+ _in: names
358
+ }
359
+ },
360
+ sort: [{
361
+ property: 'name',
362
+ direction: 'asc'
363
+ }]
364
+ }
365
+ })
366
+ // eslint-disable-next-line no-console
367
+ .catch(error => console.error(error));
368
+ items = selected.map(item => ({
369
+ id: item.id,
370
+ name: item.name
371
+ }));
372
+ }
373
+ } else {
374
+ items = buckets.map(bucket => ({
375
+ id: bucket.key,
376
+ name: bucket.key
377
+ })).filter(option => option.id != null);
378
+ }
379
+ const existingItems = ((_multiSelectOptions$f = multiSelectOptions.find(opt => opt.id === property)) === null || _multiSelectOptions$f === void 0 ? void 0 : _multiSelectOptions$f.items) || [];
380
+ return (0, _lodash2.default)(items, existingItems, 'id');
381
+ } catch (error) {
382
+ return [];
383
+ }
384
+ }, [client, schema.id, relationsIndex, stringTypeProps, multiSelectOptions, findFilterConfig, resolveAggProp, resolveEntityIdentifier, addEntitySuffixIfNeeded, findRelationByLocalField]);
166
385
  const placeholderText = `Search ${keywordSearchLabels.join(', ')}`;
167
386
  return /*#__PURE__*/_react.default.createElement("div", {
168
- className: "search-container"
387
+ className: "search-container ms-filter"
169
388
  }, displaySearchFilter && /*#__PURE__*/_react.default.createElement("div", {
170
389
  className: "search-container__search-input-container"
171
390
  }, /*#__PURE__*/_react.default.createElement("input", {
@@ -181,18 +400,87 @@ const SearchContainer = ({
181
400
  }, /*#__PURE__*/_react.default.createElement(_bs.BsSearch, null))), displaySelectFilters && selectOptions.map(({
182
401
  id,
183
402
  options,
184
- label
185
- }) => /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, options && !!options.length && /*#__PURE__*/_react.default.createElement("div", {
186
- className: "search-container__select-wrapper"
403
+ label,
404
+ selected
405
+ }) => options && options.length ? /*#__PURE__*/_react.default.createElement("div", {
406
+ className: "search-container__select-wrapper",
407
+ key: `select-${id}`
187
408
  }, /*#__PURE__*/_react.default.createElement(_select.default, {
188
409
  label: label,
189
410
  id: id,
190
411
  name: id,
191
- onChange: event => handleSelect(id, event),
412
+ onChange: ({
413
+ value
414
+ }) => handleSelect(id, {
415
+ value
416
+ }),
192
417
  options: options,
193
- value: selectedFilters[id],
418
+ value: selectedFilters[id] !== undefined ? selectedFilters[id] : selected,
194
419
  defaultTextValue: _constants.DEFAULT_FILTER_OPTION_LABEL
195
- })))), /*#__PURE__*/_react.default.createElement("div", {
420
+ })) : null), displayMultiSelectFilters && multiSelectOptions.map(({
421
+ id,
422
+ label,
423
+ items
424
+ }) => {
425
+ const selectedIds = selectedFilters[id] ? selectedFilters[id] : [];
426
+ const multiSelectData = {
427
+ filterBy: ['name'],
428
+ identification: 'id',
429
+ keyValue: 'name',
430
+ data: items.map(({
431
+ id: itemId,
432
+ name
433
+ }) => ({
434
+ id: itemId,
435
+ name,
436
+ description: '',
437
+ checked: selectedIds.includes(itemId),
438
+ show: true
439
+ }))
440
+ };
441
+ return /*#__PURE__*/_react.default.createElement("div", {
442
+ className: "search-container__select-wrapper",
443
+ key: `multiselect-${id}`
444
+ }, /*#__PURE__*/_react.default.createElement(_multiselect.default, {
445
+ onChange: ({
446
+ value,
447
+ currentOffset
448
+ }) => makeOnSearchChange(id)({
449
+ event: {
450
+ value
451
+ },
452
+ currentOffset
453
+ }),
454
+ name: id,
455
+ label: label,
456
+ data: multiSelectData,
457
+ limit: 10,
458
+ getSelected: ({
459
+ event: {
460
+ target: {
461
+ value
462
+ }
463
+ }
464
+ }) => handleMultiSelect(id, value),
465
+ required: false,
466
+ checkedPreviewCount: 1,
467
+ formatMoreLabel: n => `${n} more`
468
+ }));
469
+ }), relationMultiSelectFilters.map(([property, config]) => {
470
+ var _config$relation2;
471
+ const entityIdentifier = resolveEntityIdentifier(property, config) || ((_config$relation2 = config.relation) === null || _config$relation2 === void 0 ? void 0 : _config$relation2.entityIdentifier);
472
+ if (!entityIdentifier) return null;
473
+ return /*#__PURE__*/_react.default.createElement("div", {
474
+ className: "search-container__select-wrapper",
475
+ key: `relation-multiselect-${property}`
476
+ }, /*#__PURE__*/_react.default.createElement(_RelationMultiSelectFilter.default, {
477
+ id: property,
478
+ label: config.label || config.relation.label,
479
+ entityIdentifier: entityIdentifier,
480
+ selectedIds: selectedFilters[property] || [],
481
+ onChange: handleMultiSelect
482
+ }));
483
+ }), /*#__PURE__*/_react.default.createElement("div", {
196
484
  className: "search-container__reset-button"
197
485
  }, /*#__PURE__*/_react.default.createElement("span", {
198
486
  role: "button",
@@ -203,12 +491,14 @@ SearchContainer.propTypes = {
203
491
  setListFilters: _propTypes.default.func.isRequired,
204
492
  keywordFiltersToUse: _propTypes.default.array,
205
493
  selectFiltersToDisplay: _propTypes.default.array,
494
+ multiSelectFiltersToDisplay: _propTypes.default.array,
206
495
  schema: _propTypes.default.object.isRequired,
207
496
  index: _propTypes.default.string
208
497
  };
209
498
  SearchContainer.defaultProps = {
210
499
  keywordFiltersToUse: [],
211
500
  selectFiltersToDisplay: [],
501
+ multiSelectFiltersToDisplay: [],
212
502
  index: 'admin'
213
503
  };
214
504
  var _default = exports.default = SearchContainer;