From 3f7d1df1ff7dffda866f5dcb2d1c8e4c4eef4281 Mon Sep 17 00:00:00 2001 From: Ahmed Elywa Date: Fri, 25 Aug 2023 22:27:17 +0300 Subject: [PATCH] [admin] fix table filter and sort to work with prisma v5 --- packages/admin/package.json | 5 +- packages/admin/src/PrismaTable/Form/index.tsx | 4 +- .../admin/src/PrismaTable/Form/useActions.ts | 1 - .../admin/src/PrismaTable/Table/Filters.tsx | 52 ++- .../admin/src/PrismaTable/Table/index.tsx | 37 +- .../src/PrismaTable/Table/useFilterAndSort.ts | 57 ++- .../admin/src/PrismaTable/dynamicTable.tsx | 13 + packages/admin/src/types.ts | 2 +- packages/admin/tailwind.config.js | 1 - pnpm-lock.yaml | 416 +++++++----------- 10 files changed, 261 insertions(+), 327 deletions(-) diff --git a/packages/admin/package.json b/packages/admin/package.json index 44493c81..87041658 100644 --- a/packages/admin/package.json +++ b/packages/admin/package.json @@ -20,7 +20,7 @@ "build:es": "node ./scripts/build es", "build:copy-files": "node ./scripts/copyFiles", "build:types": "tsc -p tsconfig.build.json", - "build:css": "cross-env NODE_ENV=production tailwindcss-cli build -o ./dist/style.css" + "build:css": "cross-env NODE_ENV=production tailwindcss build -o ./dist/style.css" }, "dependencies": { "@headlessui/react": "^1.5.0", @@ -55,8 +55,7 @@ "postcss": "^8.4.6", "react": "17.0.2", "react-dom": "17.0.2", - "tailwindcss": "3.0.23", - "tailwindcss-cli": "^0.1.2", + "tailwindcss": "3.3.3", "typescript": "5.1.6", "yargs": "^17.3.1" }, diff --git a/packages/admin/src/PrismaTable/Form/index.tsx b/packages/admin/src/PrismaTable/Form/index.tsx index a1f95b79..224f394d 100644 --- a/packages/admin/src/PrismaTable/Form/index.tsx +++ b/packages/admin/src/PrismaTable/Form/index.tsx @@ -83,8 +83,8 @@ const Form: React.FC = ({ action, model: modelName, data, onCancel, o return (
{lang[action] + ' ' + model.name} diff --git a/packages/admin/src/PrismaTable/Form/useActions.ts b/packages/admin/src/PrismaTable/Form/useActions.ts index b58ecb65..327c9119 100644 --- a/packages/admin/src/PrismaTable/Form/useActions.ts +++ b/packages/admin/src/PrismaTable/Form/useActions.ts @@ -71,7 +71,6 @@ const useActions = (model: AdminSchemaModel, data: any, action: FormProps['actio if (field?.update) { if (field.kind === 'object') { const fieldModel = models.find((item) => item.id === field.type)!; - console.log(newData); if ((newData[key] && !data[key]) || (newData[key] && newData[key] !== data[key][fieldModel.idField])) { const editField = fieldModel.fields.find((item) => item.name === fieldModel.idField)!; updateData[key] = { diff --git a/packages/admin/src/PrismaTable/Table/Filters.tsx b/packages/admin/src/PrismaTable/Table/Filters.tsx index c25a71f4..b0ef34a5 100644 --- a/packages/admin/src/PrismaTable/Table/Filters.tsx +++ b/packages/admin/src/PrismaTable/Table/Filters.tsx @@ -9,6 +9,8 @@ import { TableContext } from '../Context'; import { SearchCircleIcon, TrashIcon } from '@heroicons/react/solid'; import { buttonClasses, classNames, inputClasses } from '../../components/css'; import { randString } from './utils'; +import { getDate } from '../Form/getDate'; +import { data } from 'autoprefixer'; interface Option { id: any; @@ -27,13 +29,19 @@ interface FilterProps { filters: { id: string; value: any }[]; } +const removeByIndexWithSplice = (array: any[], index: number) => { + const newArr = array.slice(); // create a copy of the original array + newArr.splice(index, 1); // remove the item at the specified index + return newArr; // return the modified array +}; + export const Filter: React.FC = ({ model, setAllFilters, filters }) => { const [state, setState] = useState(filters.map(() => randString(10))); const { lang } = useContext(TableContext); const deleteFilter = (index: number) => { - setState([...state.filter((_, i) => i !== index)]); - setAllFilters([...filters.filter((_, i) => i !== index)]); + setState(removeByIndexWithSplice(state, index)); + setAllFilters(removeByIndexWithSplice(filters, index)); }; return ( @@ -46,13 +54,18 @@ export const Filter: React.FC = ({ model, setAllFilters, filters }) deleteFilter={() => deleteFilter(index)} filter={filters[index]} setFilter={({ id, value }) => { + // Deep clone filters to break references + const newFilters = JSON.parse(JSON.stringify(filters)); + if (!value) { - setAllFilters([...filters.filter((item) => item.id !== id)]); - } else { - const newFilters = [...filters]; - newFilters[index] = { id, value }; - setAllFilters(newFilters); + setAllFilters(removeByIndexWithSplice(newFilters, index)); + return; } + + newFilters[index] = { id, value: { ...value } }; + + // Update the filters state + setAllFilters(newFilters); }} /> ))} @@ -99,9 +112,9 @@ const FilterRow: React.FC = ({ model, filter, setFilter, index, }; let filterComponent; if (getField.kind === 'enum') { - filterComponent = ; + filterComponent = ; } else if (getField.kind === 'object') { - filterComponent = ; + filterComponent = ; } else { switch (getField.type) { case 'Int': @@ -110,10 +123,10 @@ const FilterRow: React.FC = ({ model, filter, setFilter, index, case 'Float': case 'DateTime': case 'String': - filterComponent = ; + filterComponent = ; break; case 'Boolean': - filterComponent = ; + filterComponent = ; break; } } @@ -168,6 +181,12 @@ const DefaultFilter: React.FC = ({ filterValue, setFilter const [option, setOption] = useState