Created DynamicTable component

Signed-off-by: soupette <cyril@strapi.io>
This commit is contained in:
soupette 2021-09-13 07:52:06 +02:00
parent e318705ba0
commit 16d2b4dc6d
2 changed files with 69 additions and 22 deletions

View File

@ -0,0 +1,54 @@
import React, { useMemo } from 'react';
import PropTypes from 'prop-types';
import { DynamicTable as Table, useStrapiApp } from '@strapi/helper-plugin';
import { INJECT_COLUMN_IN_TABLE } from '../../../exposedHooks';
const DynamicTable = ({ canDelete, contentTypeName, isLoading, layout, rows }) => {
const { runHookWaterfall } = useStrapiApp();
const tableHeaders = useMemo(() => {
const headers = runHookWaterfall(INJECT_COLUMN_IN_TABLE, {
displayedHeaders: layout.contentType.layouts.list,
layout,
});
return headers.displayedHeaders;
}, [runHookWaterfall, layout]);
return (
<Table
contentType={contentTypeName}
isLoading={isLoading}
headers={tableHeaders}
// rows={data}
rows={rows}
withBulkActions
withMainAction={canDelete}
>
{/* TODO */}
</Table>
);
};
DynamicTable.propTypes = {
canDelete: PropTypes.bool.isRequired,
contentTypeName: PropTypes.string.isRequired,
isLoading: PropTypes.bool.isRequired,
layout: PropTypes.exact({
components: PropTypes.object.isRequired,
contentType: PropTypes.shape({
attributes: PropTypes.object.isRequired,
metadatas: PropTypes.object.isRequired,
info: PropTypes.shape({ label: PropTypes.string.isRequired }).isRequired,
layouts: PropTypes.shape({
list: PropTypes.array.isRequired,
editRelations: PropTypes.array,
}).isRequired,
options: PropTypes.object.isRequired,
settings: PropTypes.object.isRequired,
}).isRequired,
}).isRequired,
rows: PropTypes.array.isRequired,
};
export default DynamicTable;

View File

@ -1,4 +1,4 @@
import React, { memo, useCallback, useEffect, useMemo, useRef } from 'react'; import React, { memo, useCallback, useEffect, useRef } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { bindActionCreators, compose } from 'redux'; import { bindActionCreators, compose } from 'redux';
@ -12,7 +12,7 @@ import { useHistory, useLocation } from 'react-router-dom';
import isEqual from 'react-fast-compare'; import isEqual from 'react-fast-compare';
import { stringify } from 'qs'; import { stringify } from 'qs';
import { import {
DynamicTable, // DynamicTable,
NoPermissions, NoPermissions,
// CheckPermissions, // CheckPermissions,
// PopUpWarning, // PopUpWarning,
@ -20,7 +20,6 @@ import {
useQueryParams, useQueryParams,
useNotification, useNotification,
useRBACProvider, useRBACProvider,
useStrapiApp,
useTracking, useTracking,
} from '@strapi/helper-plugin'; } from '@strapi/helper-plugin';
import { Main } from '@strapi/parts/Main'; import { Main } from '@strapi/parts/Main';
@ -31,7 +30,7 @@ import Add from '@strapi/icons/Add';
import axios from 'axios'; import axios from 'axios';
import { axiosInstance } from '../../../core/utils'; import { axiosInstance } from '../../../core/utils';
// import { InjectionZone } from '../../../shared/components'; // import { InjectionZone } from '../../../shared/components';
import { INJECT_COLUMN_IN_TABLE } from '../../../exposedHooks'; import DynamicTable from '../../components/DynamicTable';
// import permissions from '../../../permissions'; // import permissions from '../../../permissions';
import { import {
// formatFiltersFromQuery, // formatFiltersFromQuery,
@ -92,7 +91,6 @@ function ListView({
// toggleModalDelete, // toggleModalDelete,
// toggleModalDeleteAll, // toggleModalDeleteAll,
data, data,
displayedHeaders,
getData, getData,
getDataSucceeded, getDataSucceeded,
isLoading, isLoading,
@ -109,7 +107,7 @@ function ListView({
// // settings: { bulkable: isBulkable, filterable: isFilterable, searchable: isSearchable }, // // settings: { bulkable: isBulkable, filterable: isFilterable, searchable: isSearchable },
// }, // },
// } = layout; // } = layout;
console.log({ data });
const toggleNotification = useNotification(); const toggleNotification = useNotification();
const { trackUsage } = useTracking(); const { trackUsage } = useTracking();
const { refetchPermissions } = useRBACProvider(); const { refetchPermissions } = useRBACProvider();
@ -119,13 +117,13 @@ function ListView({
useFocusWhenNavigate(); useFocusWhenNavigate();
const { runHookWaterfall } = useStrapiApp(); // const { runHookWaterfall } = useStrapiApp();
const tableHeaders = useMemo(() => { // const tableHeaders = useMemo(() => {
const headers = runHookWaterfall(INJECT_COLUMN_IN_TABLE, { displayedHeaders, layout }); // const headers = runHookWaterfall(INJECT_COLUMN_IN_TABLE, { displayedHeaders, layout });
return headers.displayedHeaders; // return headers.displayedHeaders;
}, [runHookWaterfall, displayedHeaders, layout]); // }, [runHookWaterfall, displayedHeaders, layout]);
// const [{ query }, setQuery] = useQueryParams(); // const [{ query }, setQuery] = useQueryParams();
const [{ query }] = useQueryParams(); const [{ query }] = useQueryParams();
@ -139,6 +137,7 @@ function ListView({
// const [idToDelete, setIdToDelete] = useState(null); // const [idToDelete, setIdToDelete] = useState(null);
const contentType = layout.contentType; const contentType = layout.contentType;
const hasDraftAndPublish = get(contentType, 'options.draftAndPublish', false); const hasDraftAndPublish = get(contentType, 'options.draftAndPublish', false);
// TODO
// const allAllowedHeaders = useMemo(() => getAllAllowedHeaders(attributes), [attributes]); // const allAllowedHeaders = useMemo(() => getAllAllowedHeaders(attributes), [attributes]);
// const filters = useMemo(() => { // const filters = useMemo(() => {
@ -148,10 +147,6 @@ function ListView({
// const sort = query.sort; // const sort = query.sort;
// const _q = query._q || ''; // const _q = query._q || '';
// const firstSortableHeader = useMemo(() => getFirstSortableHeader(displayedHeaders), [
// displayedHeaders,
// ]);
// Using a ref to avoid requests being fired multiple times on slug on change // Using a ref to avoid requests being fired multiple times on slug on change
// We need it because the hook as mulitple dependencies so it may run before the permissions have checked // We need it because the hook as mulitple dependencies so it may run before the permissions have checked
const requestUrlRef = useRef(''); const requestUrlRef = useRef('');
@ -399,13 +394,12 @@ function ListView({
<ContentLayout> <ContentLayout>
{canRead ? ( {canRead ? (
<DynamicTable <DynamicTable
contentType={headerLayoutTitle} canDelete={canDelete}
contentTypeName={headerLayoutTitle}
isLoading={isLoading} isLoading={isLoading}
headers={tableHeaders} // FIXME: remove the layout props drilling
// rows={data} layout={layout}
rows={[]} rows={data}
withBulkActions
withMainAction={canDelete}
> >
{/* TODO */} {/* TODO */}
</DynamicTable> </DynamicTable>
@ -568,7 +562,6 @@ ListView.propTypes = {
canDelete: PropTypes.bool.isRequired, canDelete: PropTypes.bool.isRequired,
canRead: PropTypes.bool.isRequired, canRead: PropTypes.bool.isRequired,
// canUpdate: PropTypes.bool.isRequired, // canUpdate: PropTypes.bool.isRequired,
displayedHeaders: PropTypes.array.isRequired,
data: PropTypes.array.isRequired, data: PropTypes.array.isRequired,
// didDeleteData: PropTypes.bool.isRequired, // didDeleteData: PropTypes.bool.isRequired,
// entriesToDelete: PropTypes.array.isRequired, // entriesToDelete: PropTypes.array.isRequired,