import React, { useMemo } from "react"; import PropTypes from "prop-types"; import styled from "styled-components"; import { Button, Empty } from "antd"; import { getDisplay } from "../../MetaInputs"; import Card from "./utils/Card"; import SortableList from "./utils/SortableList"; import filterPages from "./utils/filterPages"; import applySequence from "./utils/applySequence"; const CreateBtn = styled(Button)` margin-top: 1.25em; `; export default function ListView({ dataSource, onPageCreate, onPageDelete, onPageSelect, onSequenceChange, filters, showProperties, sequence, properties, }) { const createEmptyPage = () => { onPageCreate({ title: "Untitled" }); }; const getProperties = (pageMeta) => properties .filter((property) => showProperties.indexOf(property.id) > -1) .filter((property) => pageMeta[property.id]) .map((property) => ({ Display: getDisplay(property.type), property, value: pageMeta[property.id], })); const pages = useMemo( () => applySequence(filterPages(dataSource, filters, properties), sequence), [dataSource, filters, properties, sequence] ); const updateSequence = ({ startIndex, endIndex }) => { const newSequence = pages.map((page) => page.id); const droppedPageId = newSequence[startIndex]; newSequence.splice(startIndex, 1); newSequence.splice(endIndex, 0, droppedPageId); onSequenceChange(newSequence); }; return ( <div> <SortableList items={pages} onSort={updateSequence}> {(page, restProps) => ( <Card // eslint-disable-next-line react/jsx-props-no-spreading {...restProps} onClick={() => onPageSelect(page.id)} title={page.title} properties={getProperties(page.meta)} onDelete={() => onPageDelete(page.id)} /> )} </SortableList> {pages.length === 0 ? ( <Empty image={Empty.PRESENTED_IMAGE_SIMPLE}> <Button onClick={createEmptyPage}>Create Now</Button> </Empty> ) : ( <CreateBtn onClick={createEmptyPage} type="dashed"> Create Page </CreateBtn> )} </div> ); } ListView.propTypes = { dataSource: PropTypes.arrayOf(PropTypes.object).isRequired, filters: PropTypes.arrayOf(PropTypes.object).isRequired, showProperties: PropTypes.arrayOf(PropTypes.string).isRequired, sorts: PropTypes.arrayOf(PropTypes.object).isRequired, sequence: PropTypes.arrayOf(PropTypes.string).isRequired, properties: PropTypes.arrayOf(PropTypes.object).isRequired, onPageCreate: PropTypes.func.isRequired, onPageDelete: PropTypes.func.isRequired, onPageSelect: PropTypes.func.isRequired, onSequenceChange: PropTypes.func.isRequired, };