diff --git a/packages/admin/src/PrismaTable/EditRecord.tsx b/packages/admin/src/PrismaTable/EditRecord.tsx index ff0afae7..bc9cdf6b 100644 --- a/packages/admin/src/PrismaTable/EditRecord.tsx +++ b/packages/admin/src/PrismaTable/EditRecord.tsx @@ -87,7 +87,7 @@ const EditRecord: React.FC = ({ model={field.type} inEdit filter={{ [model]: record[modelObject.idField] }} - parent={{ name: model, value: record }} + parent={{ name: model, value: record, field: field.name }} /> ); diff --git a/packages/admin/src/PrismaTable/QueryDocument.ts b/packages/admin/src/PrismaTable/QueryDocument.ts index 7975a135..5b86c92b 100644 --- a/packages/admin/src/PrismaTable/QueryDocument.ts +++ b/packages/admin/src/PrismaTable/QueryDocument.ts @@ -18,28 +18,30 @@ const getFields = ( ) { if (field.kind !== 'object') { fieldsString += `${field.name} `; - } else if (!field.list) { + } else if (!(field.list && !update)) { const fieldModel = models.find((item) => item.id === field.type); if (fieldModel) { fieldsString += `${field.name} {${fieldModel.idField} `; - fieldModel.displayFields.forEach((item) => { - const splitItems = item.split('.'); - for (let i = 0; i < splitItems.length; i++) { - if (i + 1 < splitItems.length) { - fieldsString += `${splitItems[i]} { `; - } else if ( - !( - splitItems.length === 1 && - splitItems[i] === fieldModel.idField - ) - ) { - fieldsString += `${splitItems[i]} `; + if (!field.list) { + fieldModel.displayFields.forEach((item) => { + const splitItems = item.split('.'); + for (let i = 0; i < splitItems.length; i++) { + if (i + 1 < splitItems.length) { + fieldsString += `${splitItems[i]} { `; + } else if ( + !( + splitItems.length === 1 && + splitItems[i] === fieldModel.idField + ) + ) { + fieldsString += `${splitItems[i]} `; + } } - } - for (let i = 1; i < splitItems.length; i++) { - fieldsString += `} `; - } - }); + for (let i = 1; i < splitItems.length; i++) { + fieldsString += `} `; + } + }); + } fieldsString += '} '; } } diff --git a/packages/admin/src/PrismaTable/Table/ListConnect.tsx b/packages/admin/src/PrismaTable/Table/ListConnect.tsx new file mode 100644 index 00000000..6d8ec387 --- /dev/null +++ b/packages/admin/src/PrismaTable/Table/ListConnect.tsx @@ -0,0 +1,38 @@ +import React from 'react'; +import { Button } from '@paljs/ui/Button'; +import { useListConnectToOne } from '../useListConnectToOne'; +import { SchemaModel } from '@paljs/types'; +import { Spinner } from '@paljs/ui'; + +interface ListConnectProps { + parent: { name: string; value: any; field: string }; + row: any; + model: SchemaModel; +} +export const ListConnect: React.FC = ({ + parent, + row, + model, +}) => { + const { listConnectToOne, updateLoading } = useListConnectToOne(parent); + + const rowId = row.original[model.idField]; + + const isConnected = !!parent.value[parent.field].find( + (r: any) => r[model.idField] === rowId, + ); + + return ( + + + + ); +}; diff --git a/packages/admin/src/PrismaTable/Table/index.tsx b/packages/admin/src/PrismaTable/Table/index.tsx index 5c330067..bf63f1f9 100644 --- a/packages/admin/src/PrismaTable/Table/index.tsx +++ b/packages/admin/src/PrismaTable/Table/index.tsx @@ -15,6 +15,7 @@ import { TableContext } from '../Context'; import Spinner from '@paljs/ui/Spinner'; import Tooltip from '@paljs/ui/Tooltip'; import { Checkbox } from '@paljs/ui'; +import { ListConnect } from './ListConnect'; interface TableProps { inEdit?: boolean; @@ -28,6 +29,7 @@ interface TableProps { filterHandler: (filters: { id: string; value: any }[]) => void; onAction: (action: 'create' | 'delete' | 'connect', value?: unknown) => void; connect?: any; + parent?: { name: string; value: any; field: string }; } export const Table: React.FC = ({ @@ -42,6 +44,7 @@ export const Table: React.FC = ({ onAction, inEdit, connect, + parent, }) => { const { schema: { models }, @@ -270,7 +273,10 @@ export const Table: React.FC = ({ )} - {!connect && ( + {parent && model && ( + + )} + {!connect && !parent && ( = ({ )} - {actions.delete && !connect && ( + {actions.delete && !connect && !parent && ( = ({ /> ) : ( { + const { + schema: { models }, + } = useContext(TableContext); + const [updateModel, { loading: updateLoading }] = useMutation( + mutationDocument(models, parent.name, 'update'), + ); + + const modelObject = models.find((m) => m.id === parent.name); + + const listConnectToOne = ( + fieldModel: SchemaModel, + fieldId: any, + connect = true, + ) => { + if (modelObject) { + updateModel({ + variables: { + where: { + [modelObject.idField]: parent.value[modelObject.idField], + }, + data: { + [parent.field]: { + [connect ? 'connect' : 'disconnect']: { + [fieldModel.idField]: fieldId, + }, + }, + }, + }, + }); + } + }; + + return { + listConnectToOne, + updateLoading, + }; +};