@blaze-cms/plugin-data-ui 0.133.0-admin-updates.0 → 0.133.0-project-admin-customisations.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 (123) hide show
  1. package/CHANGELOG.md +27 -1
  2. package/README.md +42 -0
  3. package/lib/components/EntityDataListing/EntityDataListing.js +3 -24
  4. package/lib/components/EntityDataListing/EntityDataListing.js.map +1 -1
  5. package/lib/components/EntityManager/Entity/EntitiyNavLinks/EntityNavLinks.js +39 -0
  6. package/lib/components/EntityManager/Entity/EntitiyNavLinks/EntityNavLinks.js.map +1 -0
  7. package/lib/components/EntityManager/Entity/EntitiyNavLinks/index.js +12 -0
  8. package/lib/components/EntityManager/Entity/EntitiyNavLinks/index.js.map +1 -0
  9. package/lib/components/EntityManager/Entity/Entity.js +16 -3
  10. package/lib/components/EntityManager/Entity/Entity.js.map +1 -1
  11. package/lib/components/EntityManager/Entity/SideBarRelations/container/CustomSidebarInfoContainer.js +44 -0
  12. package/lib/components/EntityManager/Entity/SideBarRelations/container/CustomSidebarInfoContainer.js.map +1 -0
  13. package/lib/components/EntityManager/Entity/SideBarRelations/helpers/build-dynamic-query.js +32 -0
  14. package/lib/components/EntityManager/Entity/SideBarRelations/helpers/build-dynamic-query.js.map +1 -0
  15. package/lib/components/EntityManager/Entity/SideBarRelations/hooks/useCustomSidebarData.js +45 -0
  16. package/lib/components/EntityManager/Entity/SideBarRelations/hooks/useCustomSidebarData.js.map +1 -0
  17. package/lib/components/EntityManager/Entity/SideBarRelations/index.js +12 -2
  18. package/lib/components/EntityManager/Entity/SideBarRelations/index.js.map +1 -1
  19. package/lib/components/EntityManager/Entity/SideBarRelations/presentational/CustomSidebarInfo.js +38 -0
  20. package/lib/components/EntityManager/Entity/SideBarRelations/presentational/CustomSidebarInfo.js.map +1 -0
  21. package/lib/components/InfoBoxes/InfoBoxes.js +36 -0
  22. package/lib/components/InfoBoxes/InfoBoxes.js.map +1 -0
  23. package/lib/components/InfoBoxes/container/InfoBoxContainer.js +44 -0
  24. package/lib/components/InfoBoxes/container/InfoBoxContainer.js.map +1 -0
  25. package/lib/components/InfoBoxes/helpers/build-dynamic-query.js +25 -0
  26. package/lib/components/InfoBoxes/helpers/build-dynamic-query.js.map +1 -0
  27. package/lib/components/InfoBoxes/hooks/useData.js +42 -0
  28. package/lib/components/InfoBoxes/hooks/useData.js.map +1 -0
  29. package/lib/components/InfoBoxes/hooks/useInfoBox.js +26 -0
  30. package/lib/components/InfoBoxes/hooks/useInfoBox.js.map +1 -0
  31. package/lib/components/InfoBoxes/index.js +12 -0
  32. package/lib/components/InfoBoxes/index.js.map +1 -0
  33. package/lib/components/InfoBoxes/presentational/InfoBox.js +46 -0
  34. package/lib/components/InfoBoxes/presentational/InfoBox.js.map +1 -0
  35. package/lib/components/ListingTable/ListingTable.js +113 -80
  36. package/lib/components/ListingTable/ListingTable.js.map +1 -1
  37. package/lib/components/ListingTable/ListingTableContent/ListingTableContent.js +8 -20
  38. package/lib/components/ListingTable/ListingTableContent/ListingTableContent.js.map +1 -1
  39. package/lib/components/ListingTable/mappers/populate-rows.js +92 -26
  40. package/lib/components/ListingTable/mappers/populate-rows.js.map +1 -1
  41. package/lib/components/ListingTable/service/index.js +73 -11
  42. package/lib/components/ListingTable/service/index.js.map +1 -1
  43. package/lib/index.js +3 -11
  44. package/lib/index.js.map +1 -1
  45. package/lib/utils/add-content-menu-items.js +64 -13
  46. package/lib/utils/add-content-menu-items.js.map +1 -1
  47. package/lib/utils/build-listing-query.js +11 -2
  48. package/lib/utils/build-listing-query.js.map +1 -1
  49. package/lib/utils/get-default-query-params.js +3 -4
  50. package/lib/utils/get-default-query-params.js.map +1 -1
  51. package/lib-es/components/EntityDataListing/EntityDataListing.js +3 -14
  52. package/lib-es/components/EntityDataListing/EntityDataListing.js.map +1 -1
  53. package/lib-es/components/EntityManager/Entity/EntitiyNavLinks/EntityNavLinks.js +30 -0
  54. package/lib-es/components/EntityManager/Entity/EntitiyNavLinks/EntityNavLinks.js.map +1 -0
  55. package/lib-es/components/EntityManager/Entity/EntitiyNavLinks/index.js +3 -0
  56. package/lib-es/components/EntityManager/Entity/EntitiyNavLinks/index.js.map +1 -0
  57. package/lib-es/components/EntityManager/Entity/Entity.js +16 -3
  58. package/lib-es/components/EntityManager/Entity/Entity.js.map +1 -1
  59. package/lib-es/components/EntityManager/Entity/SideBarRelations/container/CustomSidebarInfoContainer.js +30 -0
  60. package/lib-es/components/EntityManager/Entity/SideBarRelations/container/CustomSidebarInfoContainer.js.map +1 -0
  61. package/lib-es/components/EntityManager/Entity/SideBarRelations/helpers/build-dynamic-query.js +26 -0
  62. package/lib-es/components/EntityManager/Entity/SideBarRelations/helpers/build-dynamic-query.js.map +1 -0
  63. package/lib-es/components/EntityManager/Entity/SideBarRelations/hooks/useCustomSidebarData.js +39 -0
  64. package/lib-es/components/EntityManager/Entity/SideBarRelations/hooks/useCustomSidebarData.js.map +1 -0
  65. package/lib-es/components/EntityManager/Entity/SideBarRelations/index.js +12 -2
  66. package/lib-es/components/EntityManager/Entity/SideBarRelations/index.js.map +1 -1
  67. package/lib-es/components/EntityManager/Entity/SideBarRelations/presentational/CustomSidebarInfo.js +24 -0
  68. package/lib-es/components/EntityManager/Entity/SideBarRelations/presentational/CustomSidebarInfo.js.map +1 -0
  69. package/lib-es/components/InfoBoxes/InfoBoxes.js +28 -0
  70. package/lib-es/components/InfoBoxes/InfoBoxes.js.map +1 -0
  71. package/lib-es/components/InfoBoxes/container/InfoBoxContainer.js +30 -0
  72. package/lib-es/components/InfoBoxes/container/InfoBoxContainer.js.map +1 -0
  73. package/lib-es/components/InfoBoxes/helpers/build-dynamic-query.js +25 -0
  74. package/lib-es/components/InfoBoxes/helpers/build-dynamic-query.js.map +1 -0
  75. package/lib-es/components/InfoBoxes/hooks/useData.js +37 -0
  76. package/lib-es/components/InfoBoxes/hooks/useData.js.map +1 -0
  77. package/lib-es/components/InfoBoxes/hooks/useInfoBox.js +19 -0
  78. package/lib-es/components/InfoBoxes/hooks/useInfoBox.js.map +1 -0
  79. package/lib-es/components/InfoBoxes/index.js +3 -0
  80. package/lib-es/components/InfoBoxes/index.js.map +1 -0
  81. package/lib-es/components/InfoBoxes/presentational/InfoBox.js +31 -0
  82. package/lib-es/components/InfoBoxes/presentational/InfoBox.js.map +1 -0
  83. package/lib-es/components/ListingTable/ListingTable.js +46 -49
  84. package/lib-es/components/ListingTable/ListingTable.js.map +1 -1
  85. package/lib-es/components/ListingTable/ListingTableContent/ListingTableContent.js +11 -19
  86. package/lib-es/components/ListingTable/ListingTableContent/ListingTableContent.js.map +1 -1
  87. package/lib-es/components/ListingTable/mappers/populate-rows.js +76 -24
  88. package/lib-es/components/ListingTable/mappers/populate-rows.js.map +1 -1
  89. package/lib-es/components/ListingTable/service/index.js +65 -7
  90. package/lib-es/components/ListingTable/service/index.js.map +1 -1
  91. package/lib-es/index.js +1 -9
  92. package/lib-es/index.js.map +1 -1
  93. package/lib-es/utils/add-content-menu-items.js +49 -5
  94. package/lib-es/utils/add-content-menu-items.js.map +1 -1
  95. package/lib-es/utils/build-listing-query.js +10 -1
  96. package/lib-es/utils/build-listing-query.js.map +1 -1
  97. package/lib-es/utils/get-default-query-params.js +1 -3
  98. package/lib-es/utils/get-default-query-params.js.map +1 -1
  99. package/package.json +10 -9
  100. package/src/components/EntityDataListing/EntityDataListing.js +3 -12
  101. package/src/components/EntityManager/Entity/EntitiyNavLinks/EntityNavLinks.js +26 -0
  102. package/src/components/EntityManager/Entity/EntitiyNavLinks/index.js +3 -0
  103. package/src/components/EntityManager/Entity/Entity.js +10 -1
  104. package/src/components/EntityManager/Entity/SideBarRelations/container/CustomSidebarInfoContainer.js +22 -0
  105. package/src/components/EntityManager/Entity/SideBarRelations/helpers/build-dynamic-query.js +33 -0
  106. package/src/components/EntityManager/Entity/SideBarRelations/hooks/useCustomSidebarData.js +28 -0
  107. package/src/components/EntityManager/Entity/SideBarRelations/index.js +34 -16
  108. package/src/components/EntityManager/Entity/SideBarRelations/presentational/CustomSidebarInfo.js +33 -0
  109. package/src/components/InfoBoxes/InfoBoxes.js +24 -0
  110. package/src/components/InfoBoxes/container/InfoBoxContainer.js +22 -0
  111. package/src/components/InfoBoxes/helpers/build-dynamic-query.js +25 -0
  112. package/src/components/InfoBoxes/hooks/useData.js +20 -0
  113. package/src/components/InfoBoxes/hooks/useInfoBox.js +13 -0
  114. package/src/components/InfoBoxes/index.js +3 -0
  115. package/src/components/InfoBoxes/presentational/InfoBox.js +34 -0
  116. package/src/components/ListingTable/ListingTable.js +57 -38
  117. package/src/components/ListingTable/ListingTableContent/ListingTableContent.js +8 -22
  118. package/src/components/ListingTable/mappers/populate-rows.js +83 -18
  119. package/src/components/ListingTable/service/index.js +42 -5
  120. package/src/index.js +1 -8
  121. package/src/utils/add-content-menu-items.js +45 -3
  122. package/src/utils/build-listing-query.js +11 -1
  123. package/src/utils/get-default-query-params.js +1 -1
@@ -0,0 +1,22 @@
1
+ import PropTypes from 'prop-types';
2
+ import React from 'react';
3
+ import useCustomSidebarData from '../hooks/useCustomSidebarData';
4
+ import CustomSidebarInfo from '../presentational/CustomSidebarInfo';
5
+
6
+ const CustomSibebarInfoContainer = ({ id, schema, displayProperties }) => {
7
+ const { data } = useCustomSidebarData({ id, schema, displayProperties });
8
+
9
+ if (!data || !Object.keys(data) || Object.keys(data).length === 0) return null;
10
+
11
+ const items = Object.values(data).flatMap(item => Object.values(item));
12
+
13
+ return <CustomSidebarInfo items={items} customSidebarInfoKey={displayProperties.key} />;
14
+ };
15
+
16
+ export default CustomSibebarInfoContainer;
17
+
18
+ CustomSibebarInfoContainer.propTypes = {
19
+ id: PropTypes.string.isRequired,
20
+ displayProperties: PropTypes.object.isRequired,
21
+ schema: PropTypes.object.isRequired
22
+ };
@@ -0,0 +1,33 @@
1
+ import { gql } from '@apollo/client';
2
+ import { BlazeError } from '@blaze-cms/core-errors';
3
+
4
+ export default function buildDynamicQuery({ id, schema, displayProperties }) {
5
+ if (!schema || !schema.actions || !schema.actions.get || !schema.properties) {
6
+ throw new BlazeError(
7
+ 'DataEntity query requires get action, properties and fields from entity schema'
8
+ );
9
+ }
10
+
11
+ if (
12
+ displayProperties.adminMainInfoProperty &&
13
+ Array.isArray(displayProperties.adminMainInfoProperty)
14
+ ) {
15
+ const fields = displayProperties.adminMainInfoProperty.map(
16
+ infoProperty =>
17
+ `${infoProperty} {
18
+ label
19
+ value
20
+ }`
21
+ );
22
+
23
+ return gql`query getInfoBoxData($id: String!){
24
+ ${schema.actions.get}( id: $id ) {
25
+ id
26
+ ${fields.map(field => field)}
27
+ __typename
28
+ }
29
+ }`;
30
+ }
31
+
32
+ return null;
33
+ }
@@ -0,0 +1,28 @@
1
+ import ProptTypes from 'prop-types';
2
+ import { useQuery, gql } from '@apollo/client';
3
+ import buildDynamicQuery from '../helpers/build-dynamic-query';
4
+
5
+ const useCustomSidebarData = ({ id, schema, displayProperties }) => {
6
+ const query = buildDynamicQuery({ id, schema, displayProperties });
7
+
8
+ const customSidebarInfoQuery =
9
+ query ||
10
+ gql`
11
+ query {
12
+ __typename
13
+ }
14
+ `;
15
+
16
+ const { data = {}, loading, error } = useQuery(customSidebarInfoQuery, {
17
+ variables: { id },
18
+ skip: !query
19
+ });
20
+
21
+ return { data: data.__typename !== 'Query' ? data : null, loading, error };
22
+ };
23
+
24
+ export default useCustomSidebarData;
25
+
26
+ useCustomSidebarData.propTypes = {
27
+ displayProperties: ProptTypes.object.isRequired
28
+ };
@@ -7,6 +7,8 @@ import { formFieldTypes } from '@blaze-cms/react-form-builder';
7
7
  import classnames from 'classnames';
8
8
  import { VersionsList } from '@blaze-cms/versioning-ui';
9
9
  import { PUBLISHED, UNPUBLISHED } from '../../../../constants';
10
+ import CustomSidebarInfoContainer from './container/CustomSidebarInfoContainer';
11
+ import EntityNavLinks from '../EntitiyNavLinks';
10
12
 
11
13
  const SideBarRelations = ({ schema, onChange, formData, entity }) => {
12
14
  const { relation: RelationComponent } = formFieldTypes;
@@ -18,7 +20,9 @@ const SideBarRelations = ({ schema, onChange, formData, entity }) => {
18
20
  status
19
21
  } = formData;
20
22
  const client = useApolloClient();
23
+
21
24
  const [relationsComponents, setRelationsComponents] = useState(null);
25
+
22
26
  useEffect(
23
27
  () => {
24
28
  (async () => {
@@ -64,28 +68,42 @@ const SideBarRelations = ({ schema, onChange, formData, entity }) => {
64
68
  return (
65
69
  <div className="sidebar" data-testid="sideBarRelations-main-div">
66
70
  <div className="sidebar__content">
67
- {formattedCreated && (
68
- <div className="sidebar__status">
69
- <div className="sidebar__status__wrapper">
70
- <b>Status</b>
71
- <span className={statusClassName}>{formattedStatus}</span>
71
+ <div className="sidebar__status">
72
+ {formattedCreated && (
73
+ <div className="sidebar__top">
74
+ <div className="sidebar__status__wrapper">
75
+ <b>Status</b>
76
+ <span className={statusClassName}>{formattedStatus}</span>
77
+ </div>
78
+ {formattedStatus === PUBLISHED && (
79
+ <p>
80
+ {formattedStatus} on: <span> {formattedPublished}</span>
81
+ </p>
82
+ )}
72
83
  </div>
73
- {formattedStatus === PUBLISHED && (
84
+ )}
85
+
86
+ {!schema.displayProperties.adminMainInfoProperty && (
87
+ <>
74
88
  <p>
75
- {formattedStatus} on: <span> {formattedPublished}</span>
89
+ Created: <span>{formattedCreated}</span>
76
90
  </p>
77
- )}
91
+ <p>
92
+ Updated: <span>{formattedUpdated}</span>
93
+ </p>
94
+ </>
95
+ )}
78
96
 
79
- <p>
80
- Created: <span>{formattedCreated}</span>
81
- </p>
82
- <p>
83
- Updated: <span>{formattedUpdated}</span>
84
- </p>
85
- </div>
86
- )}
97
+ <CustomSidebarInfoContainer
98
+ id={itemId}
99
+ schema={schema}
100
+ displayProperties={schema.displayProperties}
101
+ />
102
+ </div>
87
103
 
88
104
  <VersionsList itemEntity={itemEntity} itemId={itemId} interfaces={interfaces} />
105
+ <EntityNavLinks schema={schema} />
106
+
89
107
  {relationsComponents &&
90
108
  relationsComponents.map(({ id, staticData, schema: entitySchema }) => (
91
109
  <RelationComponent
@@ -0,0 +1,33 @@
1
+ import PropTypes from 'prop-types';
2
+ import React from 'react';
3
+
4
+ const CustomSidebarInfo = ({ items, customSidebarInfoKey }) => {
5
+ if (!items) return null;
6
+
7
+ const customSidebarInfoItems = items.map(item =>
8
+ Object.values(item)
9
+ .map(info => {
10
+ if (!info.label || !info.value) return null;
11
+
12
+ return (
13
+ <p>
14
+ {info.label}: <span>{info.value}</span>
15
+ </p>
16
+ );
17
+ })
18
+ .filter(Boolean)
19
+ );
20
+
21
+ return (
22
+ <div className="custom-sidebar-info" key={customSidebarInfoKey}>
23
+ <div className="custom-sidebar-info--container">{customSidebarInfoItems}</div>
24
+ </div>
25
+ );
26
+ };
27
+
28
+ export default CustomSidebarInfo;
29
+
30
+ CustomSidebarInfo.propTypes = {
31
+ customSidebarInfoKey: PropTypes.string.isRequired,
32
+ items: PropTypes.array.isRequired
33
+ };
@@ -0,0 +1,24 @@
1
+ import PropTypes from 'prop-types';
2
+ import React from 'react';
3
+ import InfoBoxContainer from './container/InfoBoxContainer';
4
+
5
+ const InfoBoxes = ({ id, schema }) => {
6
+ const {
7
+ displayProperties: { adminInfoBoxes = [] }
8
+ } = schema;
9
+
10
+ if (adminInfoBoxes.length <= 0) {
11
+ return null;
12
+ }
13
+
14
+ return adminInfoBoxes.map(infoBox => (
15
+ <InfoBoxContainer id={id} schema={schema} key={infoBox.key} infoBox={infoBox} />
16
+ ));
17
+ };
18
+
19
+ export default InfoBoxes;
20
+
21
+ InfoBoxes.propTypes = {
22
+ id: PropTypes.string.isRequired,
23
+ schema: PropTypes.object.isRequired
24
+ };
@@ -0,0 +1,22 @@
1
+ import PropTypes from 'prop-types';
2
+ import React from 'react';
3
+ import useData from '../hooks/useData';
4
+ import InfoBox from '../presentational/InfoBox';
5
+
6
+ const InfoBoxContainer = ({ id, schema, infoBox }) => {
7
+ const { data } = useData({ id, schema, infoBox });
8
+
9
+ if (!data || !Object.keys(data) || Object.keys(data).length === 0) return null;
10
+
11
+ const items = Object.values(data).flatMap(item => Object.values(item));
12
+
13
+ return <InfoBox items={items} infoBoxKey={infoBox.key} />;
14
+ };
15
+
16
+ export default InfoBoxContainer;
17
+
18
+ InfoBoxContainer.propTypes = {
19
+ id: PropTypes.string.isRequired,
20
+ infoBox: PropTypes.object.isRequired,
21
+ schema: PropTypes.object.isRequired
22
+ };
@@ -0,0 +1,25 @@
1
+ import { gql } from '@apollo/client';
2
+ import { BlazeError } from '@blaze-cms/core-errors';
3
+
4
+ export default function buildDynamicQuery({ id, schema, infoBox }) {
5
+ if (!schema || !schema.actions || !schema.actions.get || !schema.properties) {
6
+ throw new BlazeError(
7
+ 'DataEntity query requires get action, properties and fields from entity schema'
8
+ );
9
+ }
10
+
11
+ const fields = `${infoBox.property} {
12
+ label
13
+ value
14
+ }`;
15
+
16
+ return {
17
+ query: gql`query getInfoBoxData($id: String!){
18
+ ${schema.actions.get}( id: $id ) {
19
+ id
20
+ ${fields}
21
+ __typename
22
+ }
23
+ }`
24
+ };
25
+ }
@@ -0,0 +1,20 @@
1
+ import { useQuery, gql } from '@apollo/client';
2
+ import useInfoBoxData from './useInfoBox';
3
+
4
+ function useData({ id, schema, infoBox }) {
5
+ const { query } = useInfoBoxData({ id, schema, infoBox });
6
+
7
+ const infoBoxQuery =
8
+ query ||
9
+ gql`
10
+ query {
11
+ __typename
12
+ }
13
+ `;
14
+
15
+ const { data = {}, loading, error } = useQuery(infoBoxQuery, { variables: { id }, skip: !query });
16
+
17
+ return { data: data.__typename !== 'Query' ? data : null, loading, error };
18
+ }
19
+
20
+ export default useData;
@@ -0,0 +1,13 @@
1
+ import buildDynamicQuery from '../helpers/build-dynamic-query';
2
+
3
+ function useInfoBox({ id, schema, infoBox }) {
4
+ const { query } = buildDynamicQuery({
5
+ id,
6
+ schema,
7
+ infoBox
8
+ });
9
+
10
+ return { query: query || null };
11
+ }
12
+
13
+ export default useInfoBox;
@@ -0,0 +1,3 @@
1
+ import InfoBoxes from './InfoBoxes';
2
+
3
+ export default InfoBoxes;
@@ -0,0 +1,34 @@
1
+ import PropTypes from 'prop-types';
2
+ import React from 'react';
3
+
4
+ const InfoBox = ({ items, infoBoxKey }) => {
5
+ if (!items) return null;
6
+
7
+ const infoBoxItems = items.map(item =>
8
+ Object.values(item)
9
+ .map(info => {
10
+ if (!info.label || !info.value) return null;
11
+
12
+ return (
13
+ <div className="info-box--item" key={`${infoBoxKey}-${info.label.toLowerCase()}`}>
14
+ <div className="info-box--label">{info.label}: </div>
15
+ <div className="info-box--value">{info.value}</div>
16
+ </div>
17
+ );
18
+ })
19
+ .filter(Boolean)
20
+ );
21
+
22
+ return (
23
+ <div className="info-box" key={infoBoxKey}>
24
+ <div className="info-box--container">{infoBoxItems}</div>
25
+ </div>
26
+ );
27
+ };
28
+
29
+ export default InfoBox;
30
+
31
+ InfoBox.propTypes = {
32
+ infoBoxKey: PropTypes.string.isRequired,
33
+ items: PropTypes.array.isRequired
34
+ };
@@ -3,27 +3,27 @@ import React, { useEffect, useState, Fragment } from 'react';
3
3
  import PropTypes from 'prop-types';
4
4
  import { withRouter, Link } from 'react-router-dom';
5
5
  import More from '@blaze-react/more';
6
- import { MainContext, useMainContext } from '@blaze-cms/admin-ui-utils';
7
6
  import { PageHeader, DeleteAction } from '@blaze-cms/admin';
8
7
  import { useToasts } from '@blaze-react/toaster';
8
+ import { RenderHook } from '@blaze-cms/plugin-render-hooks-ui';
9
9
  import ListingTableContent from './ListingTableContent';
10
10
  import availableActions from '../EntityManager/Entity/actions-handlers';
11
11
  import { fetchData } from './service';
12
- import { populateRows, formatRows } from './mappers/populate-rows';
12
+ import { populateRows, formatRows, getParsedRowData } from './mappers/populate-rows';
13
13
  import { getDefaultQueryParams } from '../../utils/get-default-query-params';
14
14
 
15
15
  const OVER_SCAN_BUFFER = 10;
16
16
 
17
- const ListingTable = ({ match, entitySchema, selectedMenuItem }) => {
17
+ const ListingTable = ({ match, entitySchema }) => {
18
18
  const [tableData, setTableData] = useState({});
19
19
  const [modalStatus, setModalStatus] = useState(false);
20
20
  const [itemToDelete, setItemToDelete] = useState({});
21
21
  const [previousSchema, setPreviousSchema] = useState({ id: null });
22
22
  const [scrollToIndex, setScrollToIndex] = useState(0);
23
23
  const [verifiedRanges, setVerifiedRanges] = useState([]);
24
- const queryParamsDefault = getDefaultQueryParams({ schema: entitySchema });
24
+ const queryParamsDefault = getDefaultQueryParams(entitySchema);
25
25
  const [queryParams, setQueryParams] = useState(queryParamsDefault);
26
- const { menuItems, setMenuItems } = useMainContext(MainContext);
26
+ const [listFilters, setListFilters] = useState([]);
27
27
  const client = useApolloClient();
28
28
  const { addToast } = useToasts();
29
29
 
@@ -34,20 +34,7 @@ const ListingTable = ({ match, entitySchema, selectedMenuItem }) => {
34
34
  entitySchema.id !== previousSchema.id ||
35
35
  (previousSchema.id === null && entitySchema.id)
36
36
  ) {
37
- const data = await fetchData({
38
- client,
39
- querySettings: {
40
- entitySchema,
41
- queryParams: queryParamsDefault
42
- }
43
- });
44
- const populatedTable = populateRows({
45
- toggleModal,
46
- url: match.url,
47
- entitySchema,
48
- rows: data
49
- });
50
- setTableData(populatedTable);
37
+ await doQuery();
51
38
  setPreviousSchema({ id: entitySchema.id });
52
39
  }
53
40
  })();
@@ -55,18 +42,33 @@ const ListingTable = ({ match, entitySchema, selectedMenuItem }) => {
55
42
  [client, entitySchema, match.url, previousSchema.id, queryParams] // eslint-disable-line react-hooks/exhaustive-deps
56
43
  );
57
44
 
58
- const onCloseCardPrompt = () => {
59
- const updatedSelectedMenuItem = {
60
- ...selectedMenuItem,
61
- isDisplayedPrompt: false
62
- };
63
- const [{ header, items }] = menuItems;
64
- const updatedItems = items.map(
65
- item => (item.name === selectedMenuItem.name ? updatedSelectedMenuItem : item)
66
- );
67
- setMenuItems([{ header, items: updatedItems }]);
45
+ const doQuery = async (filters = listFilters) => {
46
+ const data = await fetchData({
47
+ client,
48
+ querySettings: {
49
+ entitySchema,
50
+ queryParams: queryParamsDefault
51
+ },
52
+ listFilters: filters
53
+ });
54
+
55
+ const populatedTable = populateRows({
56
+ toggleModal,
57
+ url: match.url,
58
+ entitySchema,
59
+ rows: data
60
+ });
61
+
62
+ setTableData(populatedTable);
63
+ };
64
+
65
+ const updateListingFilters = async filters => {
66
+ await doQuery(filters);
67
+ setListFilters(filters);
68
68
  };
69
69
 
70
+ const onCloseCardPrompt = () => null;
71
+
70
72
  const toggleModal = item => {
71
73
  setModalStatus(!!item);
72
74
  setItemToDelete(item || {});
@@ -107,15 +109,22 @@ const ListingTable = ({ match, entitySchema, selectedMenuItem }) => {
107
109
  querySettings: {
108
110
  entitySchema,
109
111
  queryParams: sortQueryParams
110
- }
112
+ },
113
+ listFilters
111
114
  });
112
- const { columns } = tableData;
115
+ const { columns, isEnquiry } = tableData;
113
116
  const [firstColumn] = columns;
114
117
 
115
118
  setTableData({
116
119
  ...tableData,
117
120
  appliedSort: { [property]: direction },
118
- rows: formatRows({ rows: data, url: match.url, toggleModal, firstColumn })
121
+ rows: formatRows({
122
+ rows: getParsedRowData(data),
123
+ url: match.url,
124
+ toggleModal,
125
+ firstColumn,
126
+ isEnquiry
127
+ })
119
128
  });
120
129
  };
121
130
 
@@ -133,11 +142,17 @@ const ListingTable = ({ match, entitySchema, selectedMenuItem }) => {
133
142
  querySettings: {
134
143
  entitySchema,
135
144
  queryParams: updatedQueryParams
136
- }
145
+ },
146
+ listFilters
137
147
  });
138
148
  const updatedRows = [
139
149
  ...tableData.rows,
140
- ...formatRows({ rows: data, url: match.url, toggleModal })
150
+ ...formatRows({
151
+ rows: getParsedRowData(data),
152
+ url: match.url,
153
+ toggleModal,
154
+ isEnquiry: tableData.isEnquiry
155
+ })
141
156
  ];
142
157
 
143
158
  setVerifiedRanges([...verifiedRanges, loadIndex]);
@@ -151,6 +166,7 @@ const ListingTable = ({ match, entitySchema, selectedMenuItem }) => {
151
166
  };
152
167
 
153
168
  if (!tableData || !tableData.rows) return 'loading';
169
+ const showAddButton = !!tableData.rows.length && !tableData.isEnquiry;
154
170
 
155
171
  return (
156
172
  <div className="page">
@@ -162,7 +178,7 @@ const ListingTable = ({ match, entitySchema, selectedMenuItem }) => {
162
178
  />
163
179
  )}
164
180
  <PageHeader title={entitySchema.displayName} subtitle="">
165
- {(!selectedMenuItem.isDisplayedPrompt || !!tableData.rows.length) && (
181
+ {showAddButton && (
166
182
  <Fragment>
167
183
  <Link
168
184
  data-testid="addEntity"
@@ -181,13 +197,17 @@ const ListingTable = ({ match, entitySchema, selectedMenuItem }) => {
181
197
  </Fragment>
182
198
  )}
183
199
  </PageHeader>
200
+ <RenderHook
201
+ hookKey="entity:listing:main:top"
202
+ schema={entitySchema}
203
+ setListFilters={updateListingFilters}
204
+ />
184
205
  <ListingTableContent
185
206
  overScanBuffer={OVER_SCAN_BUFFER}
186
207
  onSort={handleSort}
187
208
  onRenderItems={handleRenderedItems}
188
209
  tableData={tableData}
189
210
  onCloseCardPrompt={onCloseCardPrompt}
190
- selectedMenuItem={selectedMenuItem}
191
211
  scrollToIndex={scrollToIndex}
192
212
  />
193
213
  </div>
@@ -195,8 +215,7 @@ const ListingTable = ({ match, entitySchema, selectedMenuItem }) => {
195
215
  };
196
216
  ListingTable.propTypes = {
197
217
  entitySchema: PropTypes.object.isRequired,
198
- match: PropTypes.object.isRequired,
199
- selectedMenuItem: PropTypes.object.isRequired
218
+ match: PropTypes.object.isRequired
200
219
  };
201
220
 
202
221
  export default withRouter(ListingTable);
@@ -1,15 +1,11 @@
1
1
  import React from 'react';
2
2
  import Table from '@blaze-react/table';
3
3
  import PropTypes from 'prop-types';
4
- import { CardPrompt } from '@blaze-cms/admin';
5
- import { Link, withRouter } from 'react-router-dom';
4
+ import { withRouter } from 'react-router-dom';
6
5
 
7
6
  const ListingTableContent = ({
8
7
  tableData,
9
8
  handleSelect,
10
- onCloseCardPrompt,
11
- selectedMenuItem,
12
- match,
13
9
  onSort,
14
10
  onClickRow,
15
11
  overScanBuffer,
@@ -17,12 +13,14 @@ const ListingTableContent = ({
17
13
  scrollToIndex
18
14
  }) => {
19
15
  const displayTable = tableData && tableData.rows && !!tableData.rows.length;
16
+ const { isEnquiry } = tableData;
17
+ const className = `page__content${isEnquiry ? ' array-table' : ''}`;
20
18
 
21
19
  return (
22
20
  <>
23
- {displayTable ? (
21
+ {displayTable && (
24
22
  <>
25
- <div className="page__content">
23
+ <div className={className}>
26
24
  <Table
27
25
  scrollToIndex={scrollToIndex}
28
26
  onSort={onSort}
@@ -30,23 +28,12 @@ const ListingTableContent = ({
30
28
  overScanBuffer={overScanBuffer}
31
29
  onRenderItems={onRenderItems}
32
30
  data={tableData}
33
- checkboxes
31
+ checkboxes={!isEnquiry}
34
32
  onSelect={handleSelect}
35
33
  data-testid="listing-table-content"
36
34
  />
37
35
  </div>
38
36
  </>
39
- ) : (
40
- selectedMenuItem.isDisplayedPrompt && (
41
- <CardPrompt onClose={onCloseCardPrompt} data-testid="card-prompt">
42
- <Link
43
- className="button button--rounded button--cta"
44
- to={`${match.url}/create`}
45
- data-testid="add-button">
46
- Add
47
- </Link>
48
- </CardPrompt>
49
- )
50
37
  )}
51
38
  </>
52
39
  );
@@ -54,8 +41,6 @@ const ListingTableContent = ({
54
41
 
55
42
  ListingTableContent.propTypes = {
56
43
  tableData: PropTypes.object.isRequired,
57
- onCloseCardPrompt: PropTypes.func.isRequired,
58
- selectedMenuItem: PropTypes.object.isRequired,
59
44
  match: PropTypes.shape({
60
45
  url: PropTypes.string
61
46
  }).isRequired,
@@ -73,7 +58,8 @@ ListingTableContent.defaultProps = {
73
58
  onClickRow: () => {},
74
59
  overScanBuffer: 0,
75
60
  scrollToIndex: 0,
76
- onRenderItems: () => {}
61
+ onRenderItems: () => {},
62
+ selectedMenuItem: null
77
63
  };
78
64
 
79
65
  export default withRouter(ListingTableContent);