fix: the sub-table records can not be modified and deleted
This commit is contained in:
		
							parent
							
								
									5308210991
								
							
						
					
					
						commit
						1326e024ab
					
				| @ -44,8 +44,8 @@ export class TableFieldResource { | ||||
| 
 | ||||
|   async list(options) { | ||||
|     this.field.data = this.field.data || {}; | ||||
|     if (this.field?.data?.dataSource?.length) { | ||||
|       console.log('list', this.field.data.dataSource); | ||||
|     if (this.field.data.changed) { | ||||
|       console.log('list.dataSource', this.field.data.dataSource); | ||||
|       return { | ||||
|         data: { | ||||
|           data: this.field.data.dataSource, | ||||
| @ -85,12 +85,14 @@ export class TableFieldResource { | ||||
|     console.log('create', options); | ||||
|     const { values } = options; | ||||
|     this.field.data.dataSource.push(values); | ||||
|     this.field.data.changed = true; | ||||
|   } | ||||
| 
 | ||||
|   async update(options) { | ||||
|     console.log('update', options); | ||||
|     const { filterByTk, values } = options; | ||||
|     this.field.data.dataSource[filterByTk] = values; | ||||
|     this.field.data.changed = true; | ||||
|   } | ||||
| 
 | ||||
|   async destroy(options) { | ||||
| @ -102,6 +104,7 @@ export class TableFieldResource { | ||||
|     this.field.data.dataSource = this.field.data.dataSource.filter((item, index) => { | ||||
|       return !filterByTk.includes(index); | ||||
|     }); | ||||
|     this.field.data.changed = true; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -5,6 +5,7 @@ import { useHistory } from 'react-router-dom'; | ||||
| import { useActionContext } from '../../schema-component'; | ||||
| import { useBlockRequestContext, useFilterByTk } from '../BlockProvider'; | ||||
| import { useFormBlockContext } from '../FormBlockProvider'; | ||||
| import { TableFieldResource } from '../TableFieldProvider'; | ||||
| 
 | ||||
| export const usePickActionProps = () => { | ||||
|   const form = useForm(); | ||||
| @ -75,13 +76,14 @@ export const useUpdateActionProps = () => { | ||||
|   return { | ||||
|     async onClick() { | ||||
|       await form.submit(); | ||||
| 
 | ||||
|       await resource.update({ | ||||
|         filterByTk, | ||||
|         values: form.values, | ||||
|       }); | ||||
|       __parent?.service?.refresh?.(); | ||||
|       __parent?.__parent?.service?.refresh?.(); | ||||
|       if (!(resource instanceof TableFieldResource)) { | ||||
|         __parent?.__parent?.service?.refresh?.(); | ||||
|       } | ||||
|       setVisible?.(false); | ||||
|     }, | ||||
|   }; | ||||
| @ -111,6 +113,7 @@ export const useBulkDestroyActionProps = () => { | ||||
|       await resource.destroy({ | ||||
|         filterByTk: field.data?.selectedRowKeys, | ||||
|       }); | ||||
|       field.data.selectedRowKeys = []; | ||||
|       service?.refresh?.(); | ||||
|     }, | ||||
|   }; | ||||
|  | ||||
| @ -1,14 +1,15 @@ | ||||
| import { Collection } from '@nocobase/database'; | ||||
| import { Plugin } from '@nocobase/server'; | ||||
| import lodash from 'lodash'; | ||||
| import path from 'path'; | ||||
| import { CollectionRepository } from '.'; | ||||
| import { | ||||
|   afterCreateForReverseField, | ||||
|   beforeCreateForChildrenCollection, | ||||
|   beforeCreateForReverseField, | ||||
|   beforeInitOptions, | ||||
|   beforeInitOptions | ||||
| } from './hooks'; | ||||
| import { CollectionModel, FieldModel } from './models'; | ||||
| import lodash from 'lodash'; | ||||
| 
 | ||||
| export class CollectionManagerPlugin extends Plugin { | ||||
|   async beforeLoad() { | ||||
| @ -78,6 +79,42 @@ export class CollectionManagerPlugin extends Plugin { | ||||
|       await next(); | ||||
|     }); | ||||
| 
 | ||||
|     this.app.resourcer.use(async (ctx, next) => { | ||||
|       const { resourceName, actionName } = ctx.action; | ||||
|       if (actionName === 'update') { | ||||
|         const { updateAssociationValues = [] } = ctx.action.params; | ||||
|         const [collectionName, associationName] = resourceName.split('.'); | ||||
|         if (!associationName) { | ||||
|           const collection: Collection = ctx.db.getCollection(collectionName); | ||||
|           if (collection) { | ||||
|             for (const [, field] of collection.fields) { | ||||
|               if (field.options.interface === 'subTable') { | ||||
|                 updateAssociationValues.push(field.name); | ||||
|               } | ||||
|             } | ||||
|           } | ||||
|         } else { | ||||
|           const association = ctx.db.getCollection(collectionName)?.getField?.(associationName); | ||||
|           if (association?.target) { | ||||
|             const collection: Collection = ctx.db.getCollection(association?.target); | ||||
|             if (collection) { | ||||
|               for (const [, field] of collection.fields) { | ||||
|                 if (field.options.interface === 'subTable') { | ||||
|                   updateAssociationValues.push(field.name); | ||||
|                 } | ||||
|               } | ||||
|             } | ||||
|           } | ||||
|         } | ||||
|         if (updateAssociationValues.length) { | ||||
|           ctx.action.mergeParams({ | ||||
|             updateAssociationValues, | ||||
|           }); | ||||
|         } | ||||
|       } | ||||
|       await next(); | ||||
|     }); | ||||
| 
 | ||||
|     this.app.acl.skip('collections', 'list', 'logged-in'); | ||||
|   } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user