@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.
- package/CHANGELOG.md +27 -1
- package/README.md +42 -0
- package/lib/components/EntityDataListing/EntityDataListing.js +3 -24
- package/lib/components/EntityDataListing/EntityDataListing.js.map +1 -1
- package/lib/components/EntityManager/Entity/EntitiyNavLinks/EntityNavLinks.js +39 -0
- package/lib/components/EntityManager/Entity/EntitiyNavLinks/EntityNavLinks.js.map +1 -0
- package/lib/components/EntityManager/Entity/EntitiyNavLinks/index.js +12 -0
- package/lib/components/EntityManager/Entity/EntitiyNavLinks/index.js.map +1 -0
- package/lib/components/EntityManager/Entity/Entity.js +16 -3
- package/lib/components/EntityManager/Entity/Entity.js.map +1 -1
- package/lib/components/EntityManager/Entity/SideBarRelations/container/CustomSidebarInfoContainer.js +44 -0
- package/lib/components/EntityManager/Entity/SideBarRelations/container/CustomSidebarInfoContainer.js.map +1 -0
- package/lib/components/EntityManager/Entity/SideBarRelations/helpers/build-dynamic-query.js +32 -0
- package/lib/components/EntityManager/Entity/SideBarRelations/helpers/build-dynamic-query.js.map +1 -0
- package/lib/components/EntityManager/Entity/SideBarRelations/hooks/useCustomSidebarData.js +45 -0
- package/lib/components/EntityManager/Entity/SideBarRelations/hooks/useCustomSidebarData.js.map +1 -0
- package/lib/components/EntityManager/Entity/SideBarRelations/index.js +12 -2
- package/lib/components/EntityManager/Entity/SideBarRelations/index.js.map +1 -1
- package/lib/components/EntityManager/Entity/SideBarRelations/presentational/CustomSidebarInfo.js +38 -0
- package/lib/components/EntityManager/Entity/SideBarRelations/presentational/CustomSidebarInfo.js.map +1 -0
- package/lib/components/InfoBoxes/InfoBoxes.js +36 -0
- package/lib/components/InfoBoxes/InfoBoxes.js.map +1 -0
- package/lib/components/InfoBoxes/container/InfoBoxContainer.js +44 -0
- package/lib/components/InfoBoxes/container/InfoBoxContainer.js.map +1 -0
- package/lib/components/InfoBoxes/helpers/build-dynamic-query.js +25 -0
- package/lib/components/InfoBoxes/helpers/build-dynamic-query.js.map +1 -0
- package/lib/components/InfoBoxes/hooks/useData.js +42 -0
- package/lib/components/InfoBoxes/hooks/useData.js.map +1 -0
- package/lib/components/InfoBoxes/hooks/useInfoBox.js +26 -0
- package/lib/components/InfoBoxes/hooks/useInfoBox.js.map +1 -0
- package/lib/components/InfoBoxes/index.js +12 -0
- package/lib/components/InfoBoxes/index.js.map +1 -0
- package/lib/components/InfoBoxes/presentational/InfoBox.js +46 -0
- package/lib/components/InfoBoxes/presentational/InfoBox.js.map +1 -0
- package/lib/components/ListingTable/ListingTable.js +113 -80
- package/lib/components/ListingTable/ListingTable.js.map +1 -1
- package/lib/components/ListingTable/ListingTableContent/ListingTableContent.js +8 -20
- package/lib/components/ListingTable/ListingTableContent/ListingTableContent.js.map +1 -1
- package/lib/components/ListingTable/mappers/populate-rows.js +92 -26
- package/lib/components/ListingTable/mappers/populate-rows.js.map +1 -1
- package/lib/components/ListingTable/service/index.js +73 -11
- package/lib/components/ListingTable/service/index.js.map +1 -1
- package/lib/index.js +3 -11
- package/lib/index.js.map +1 -1
- package/lib/utils/add-content-menu-items.js +64 -13
- package/lib/utils/add-content-menu-items.js.map +1 -1
- package/lib/utils/build-listing-query.js +11 -2
- package/lib/utils/build-listing-query.js.map +1 -1
- package/lib/utils/get-default-query-params.js +3 -4
- package/lib/utils/get-default-query-params.js.map +1 -1
- package/lib-es/components/EntityDataListing/EntityDataListing.js +3 -14
- package/lib-es/components/EntityDataListing/EntityDataListing.js.map +1 -1
- package/lib-es/components/EntityManager/Entity/EntitiyNavLinks/EntityNavLinks.js +30 -0
- package/lib-es/components/EntityManager/Entity/EntitiyNavLinks/EntityNavLinks.js.map +1 -0
- package/lib-es/components/EntityManager/Entity/EntitiyNavLinks/index.js +3 -0
- package/lib-es/components/EntityManager/Entity/EntitiyNavLinks/index.js.map +1 -0
- package/lib-es/components/EntityManager/Entity/Entity.js +16 -3
- package/lib-es/components/EntityManager/Entity/Entity.js.map +1 -1
- package/lib-es/components/EntityManager/Entity/SideBarRelations/container/CustomSidebarInfoContainer.js +30 -0
- package/lib-es/components/EntityManager/Entity/SideBarRelations/container/CustomSidebarInfoContainer.js.map +1 -0
- package/lib-es/components/EntityManager/Entity/SideBarRelations/helpers/build-dynamic-query.js +26 -0
- package/lib-es/components/EntityManager/Entity/SideBarRelations/helpers/build-dynamic-query.js.map +1 -0
- package/lib-es/components/EntityManager/Entity/SideBarRelations/hooks/useCustomSidebarData.js +39 -0
- package/lib-es/components/EntityManager/Entity/SideBarRelations/hooks/useCustomSidebarData.js.map +1 -0
- package/lib-es/components/EntityManager/Entity/SideBarRelations/index.js +12 -2
- package/lib-es/components/EntityManager/Entity/SideBarRelations/index.js.map +1 -1
- package/lib-es/components/EntityManager/Entity/SideBarRelations/presentational/CustomSidebarInfo.js +24 -0
- package/lib-es/components/EntityManager/Entity/SideBarRelations/presentational/CustomSidebarInfo.js.map +1 -0
- package/lib-es/components/InfoBoxes/InfoBoxes.js +28 -0
- package/lib-es/components/InfoBoxes/InfoBoxes.js.map +1 -0
- package/lib-es/components/InfoBoxes/container/InfoBoxContainer.js +30 -0
- package/lib-es/components/InfoBoxes/container/InfoBoxContainer.js.map +1 -0
- package/lib-es/components/InfoBoxes/helpers/build-dynamic-query.js +25 -0
- package/lib-es/components/InfoBoxes/helpers/build-dynamic-query.js.map +1 -0
- package/lib-es/components/InfoBoxes/hooks/useData.js +37 -0
- package/lib-es/components/InfoBoxes/hooks/useData.js.map +1 -0
- package/lib-es/components/InfoBoxes/hooks/useInfoBox.js +19 -0
- package/lib-es/components/InfoBoxes/hooks/useInfoBox.js.map +1 -0
- package/lib-es/components/InfoBoxes/index.js +3 -0
- package/lib-es/components/InfoBoxes/index.js.map +1 -0
- package/lib-es/components/InfoBoxes/presentational/InfoBox.js +31 -0
- package/lib-es/components/InfoBoxes/presentational/InfoBox.js.map +1 -0
- package/lib-es/components/ListingTable/ListingTable.js +46 -49
- package/lib-es/components/ListingTable/ListingTable.js.map +1 -1
- package/lib-es/components/ListingTable/ListingTableContent/ListingTableContent.js +11 -19
- package/lib-es/components/ListingTable/ListingTableContent/ListingTableContent.js.map +1 -1
- package/lib-es/components/ListingTable/mappers/populate-rows.js +76 -24
- package/lib-es/components/ListingTable/mappers/populate-rows.js.map +1 -1
- package/lib-es/components/ListingTable/service/index.js +65 -7
- package/lib-es/components/ListingTable/service/index.js.map +1 -1
- package/lib-es/index.js +1 -9
- package/lib-es/index.js.map +1 -1
- package/lib-es/utils/add-content-menu-items.js +49 -5
- package/lib-es/utils/add-content-menu-items.js.map +1 -1
- package/lib-es/utils/build-listing-query.js +10 -1
- package/lib-es/utils/build-listing-query.js.map +1 -1
- package/lib-es/utils/get-default-query-params.js +1 -3
- package/lib-es/utils/get-default-query-params.js.map +1 -1
- package/package.json +10 -9
- package/src/components/EntityDataListing/EntityDataListing.js +3 -12
- package/src/components/EntityManager/Entity/EntitiyNavLinks/EntityNavLinks.js +26 -0
- package/src/components/EntityManager/Entity/EntitiyNavLinks/index.js +3 -0
- package/src/components/EntityManager/Entity/Entity.js +10 -1
- package/src/components/EntityManager/Entity/SideBarRelations/container/CustomSidebarInfoContainer.js +22 -0
- package/src/components/EntityManager/Entity/SideBarRelations/helpers/build-dynamic-query.js +33 -0
- package/src/components/EntityManager/Entity/SideBarRelations/hooks/useCustomSidebarData.js +28 -0
- package/src/components/EntityManager/Entity/SideBarRelations/index.js +34 -16
- package/src/components/EntityManager/Entity/SideBarRelations/presentational/CustomSidebarInfo.js +33 -0
- package/src/components/InfoBoxes/InfoBoxes.js +24 -0
- package/src/components/InfoBoxes/container/InfoBoxContainer.js +22 -0
- package/src/components/InfoBoxes/helpers/build-dynamic-query.js +25 -0
- package/src/components/InfoBoxes/hooks/useData.js +20 -0
- package/src/components/InfoBoxes/hooks/useInfoBox.js +13 -0
- package/src/components/InfoBoxes/index.js +3 -0
- package/src/components/InfoBoxes/presentational/InfoBox.js +34 -0
- package/src/components/ListingTable/ListingTable.js +57 -38
- package/src/components/ListingTable/ListingTableContent/ListingTableContent.js +8 -22
- package/src/components/ListingTable/mappers/populate-rows.js +83 -18
- package/src/components/ListingTable/service/index.js +42 -5
- package/src/index.js +1 -8
- package/src/utils/add-content-menu-items.js +45 -3
- package/src/utils/build-listing-query.js +11 -1
- package/src/utils/get-default-query-params.js +1 -1
package/src/components/EntityManager/Entity/SideBarRelations/container/CustomSidebarInfoContainer.js
ADDED
|
@@ -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
|
-
|
|
68
|
-
|
|
69
|
-
<div className="
|
|
70
|
-
<
|
|
71
|
-
|
|
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
|
-
|
|
84
|
+
)}
|
|
85
|
+
|
|
86
|
+
{!schema.displayProperties.adminMainInfoProperty && (
|
|
87
|
+
<>
|
|
74
88
|
<p>
|
|
75
|
-
|
|
89
|
+
Created: <span>{formattedCreated}</span>
|
|
76
90
|
</p>
|
|
77
|
-
|
|
91
|
+
<p>
|
|
92
|
+
Updated: <span>{formattedUpdated}</span>
|
|
93
|
+
</p>
|
|
94
|
+
</>
|
|
95
|
+
)}
|
|
78
96
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
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
|
package/src/components/EntityManager/Entity/SideBarRelations/presentational/CustomSidebarInfo.js
ADDED
|
@@ -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,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
|
|
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(
|
|
24
|
+
const queryParamsDefault = getDefaultQueryParams(entitySchema);
|
|
25
25
|
const [queryParams, setQueryParams] = useState(queryParamsDefault);
|
|
26
|
-
const
|
|
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
|
-
|
|
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
|
|
59
|
-
const
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
);
|
|
67
|
-
|
|
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({
|
|
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({
|
|
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
|
-
{
|
|
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 {
|
|
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=
|
|
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);
|