feat: generate linkTo pair field
This commit is contained in:
		
							parent
							
								
									94c386e7aa
								
							
						
					
					
						commit
						976bc5d66e
					
				@ -39,17 +39,17 @@ export default {
 | 
				
			|||||||
        showInForm: true,
 | 
					        showInForm: true,
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    // {
 | 
				
			||||||
      interface: 'linkTo',
 | 
					    //   interface: 'linkTo',
 | 
				
			||||||
      title: '书籍',
 | 
					    //   title: '书籍',
 | 
				
			||||||
      target: 'books',
 | 
					    //   target: 'books',
 | 
				
			||||||
      labelField: 'name',
 | 
					    //   labelField: 'name',
 | 
				
			||||||
      component: {
 | 
					    //   component: {
 | 
				
			||||||
        showInTable: true,
 | 
					    //     showInTable: true,
 | 
				
			||||||
        showInDetail: true,
 | 
					    //     showInDetail: true,
 | 
				
			||||||
        showInForm: true,
 | 
					    //     showInForm: true,
 | 
				
			||||||
      },
 | 
					    //   },
 | 
				
			||||||
    },
 | 
					    // },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      interface: 'createdBy',
 | 
					      interface: 'createdBy',
 | 
				
			||||||
      title: '创建人',
 | 
					      title: '创建人',
 | 
				
			||||||
 | 
				
			|||||||
@ -17,17 +17,17 @@ export default {
 | 
				
			|||||||
        showInForm: true,
 | 
					        showInForm: true,
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    {
 | 
					    // {
 | 
				
			||||||
      interface: 'linkTo',
 | 
					    //   interface: 'linkTo',
 | 
				
			||||||
      title: '作者',
 | 
					    //   title: '作者',
 | 
				
			||||||
      target: 'authors',
 | 
					    //   target: 'authors',
 | 
				
			||||||
      labelField: 'name',
 | 
					    //   labelField: 'name',
 | 
				
			||||||
      component: {
 | 
					    //   component: {
 | 
				
			||||||
        showInTable: true,
 | 
					    //     showInTable: true,
 | 
				
			||||||
        showInDetail: true,
 | 
					    //     showInDetail: true,
 | 
				
			||||||
        showInForm: true,
 | 
					    //     showInForm: true,
 | 
				
			||||||
      },
 | 
					    //   },
 | 
				
			||||||
    },
 | 
					    // },
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
      interface: 'createdBy',
 | 
					      interface: 'createdBy',
 | 
				
			||||||
      title: '创建人',
 | 
					      title: '创建人',
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,5 @@
 | 
				
			|||||||
import FieldModel from '../models/field';
 | 
					import FieldModel from '../models/field';
 | 
				
			||||||
 | 
					import { BELONGSTO, BELONGSTOMANY, HASMANY } from '@nocobase/database';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default async function (model: FieldModel, options: any = {}) {
 | 
					export default async function (model: FieldModel, options: any = {}) {
 | 
				
			||||||
  const { migrate = true } = options;
 | 
					  const { migrate = true } = options;
 | 
				
			||||||
@ -16,4 +17,5 @@ export default async function (model: FieldModel, options: any = {}) {
 | 
				
			|||||||
  if (migrate) {
 | 
					  if (migrate) {
 | 
				
			||||||
    await model.migrate(options);
 | 
					    await model.migrate(options);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  await model.generatePairField(options);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -5,4 +5,5 @@ export default async function (model: FieldModel, options: any = {}) {
 | 
				
			|||||||
  if (migrate) {
 | 
					  if (migrate) {
 | 
				
			||||||
    await model.migrate(options);
 | 
					    await model.migrate(options);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  await model.generatePairField(options);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -331,6 +331,7 @@ export const linkTo = {
 | 
				
			|||||||
  options: {
 | 
					  options: {
 | 
				
			||||||
    interface: 'linkTo',
 | 
					    interface: 'linkTo',
 | 
				
			||||||
    multiple: true, // 可能影响 type
 | 
					    multiple: true, // 可能影响 type
 | 
				
			||||||
 | 
					    paired: false,
 | 
				
			||||||
    type: 'belongsToMany',
 | 
					    type: 'belongsToMany',
 | 
				
			||||||
    // name,
 | 
					    // name,
 | 
				
			||||||
    // target: '关联表', // 用户会输入
 | 
					    // target: '关联表', // 用户会输入
 | 
				
			||||||
 | 
				
			|||||||
@ -6,6 +6,7 @@ import { merge } from '../utils';
 | 
				
			|||||||
import { BuildOptions } from 'sequelize';
 | 
					import { BuildOptions } from 'sequelize';
 | 
				
			||||||
import { SaveOptions, Utils } from 'sequelize';
 | 
					import { SaveOptions, Utils } from 'sequelize';
 | 
				
			||||||
import { generateCollectionName } from './collection';
 | 
					import { generateCollectionName } from './collection';
 | 
				
			||||||
 | 
					import { BELONGSTO, BELONGSTOMANY, HASMANY } from '@nocobase/database';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface FieldImportOptions extends SaveOptions {
 | 
					interface FieldImportOptions extends SaveOptions {
 | 
				
			||||||
  parentId?: number;
 | 
					  parentId?: number;
 | 
				
			||||||
@ -34,6 +35,7 @@ export class FieldModel extends BaseModel {
 | 
				
			|||||||
        // 关系字段如果没有 name,相关参数都随机生成
 | 
					        // 关系字段如果没有 name,相关参数都随机生成
 | 
				
			||||||
        if (!data.name) {
 | 
					        if (!data.name) {
 | 
				
			||||||
          data.name = generateFieldName();
 | 
					          data.name = generateFieldName();
 | 
				
			||||||
 | 
					          data.paired = true;
 | 
				
			||||||
          // 通用,关系表
 | 
					          // 通用,关系表
 | 
				
			||||||
          if (!data.target) {
 | 
					          if (!data.target) {
 | 
				
			||||||
            data.target  = generateCollectionName();
 | 
					            data.target  = generateCollectionName();
 | 
				
			||||||
@ -75,6 +77,91 @@ export class FieldModel extends BaseModel {
 | 
				
			|||||||
    this.set('name', generateFieldName());
 | 
					    this.set('name', generateFieldName());
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  async generatePairField(options) {
 | 
				
			||||||
 | 
					    const {interface: control, paired, type, target, sourceKey, targetKey, foreignKey, otherKey, through, collection_name} = this.get();
 | 
				
			||||||
 | 
					    if (control !== 'linkTo' || type !== 'belongsToMany' || !collection_name || !paired) {
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (!this.database.isDefined(target)) {
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    const targetTable = this.database.getTable(target);
 | 
				
			||||||
 | 
					    const Field = FieldModel;
 | 
				
			||||||
 | 
					    let labelField = 'id';
 | 
				
			||||||
 | 
					    const targetField = await Field.findOne({
 | 
				
			||||||
 | 
					      ...options,
 | 
				
			||||||
 | 
					      where: {
 | 
				
			||||||
 | 
					        type: 'string',
 | 
				
			||||||
 | 
					        collection_name: target,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      order: [['sort', 'asc']],
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    if (targetField) {
 | 
				
			||||||
 | 
					      labelField = targetField.get('name');
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    const collection = await this.getCollection();
 | 
				
			||||||
 | 
					    let targetOptions:any = {
 | 
				
			||||||
 | 
					      ...types.linkTo.options,
 | 
				
			||||||
 | 
					      interface: 'linkTo',
 | 
				
			||||||
 | 
					      title: collection.get('title'),
 | 
				
			||||||
 | 
					      collection_name: target,
 | 
				
			||||||
 | 
					      options: {
 | 
				
			||||||
 | 
					        paired: true,
 | 
				
			||||||
 | 
					        target: collection_name,
 | 
				
			||||||
 | 
					        labelField,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      component: {
 | 
				
			||||||
 | 
					        showInTable: true,
 | 
				
			||||||
 | 
					        showInForm: true,
 | 
				
			||||||
 | 
					        showInDetail: true,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    // 暂时不处理 hasone
 | 
				
			||||||
 | 
					    switch (type) {
 | 
				
			||||||
 | 
					      case 'hasMany':
 | 
				
			||||||
 | 
					        targetOptions.type = 'belongsTo';
 | 
				
			||||||
 | 
					        targetOptions.options.targetKey = sourceKey;
 | 
				
			||||||
 | 
					        targetOptions.options.foreignKey = foreignKey;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case 'belongsTo':
 | 
				
			||||||
 | 
					        targetOptions.type = 'hasMany';
 | 
				
			||||||
 | 
					        targetOptions.options.sourceKey = targetKey;
 | 
				
			||||||
 | 
					        targetOptions.options.foreignKey = foreignKey;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					      case 'belongsToMany':
 | 
				
			||||||
 | 
					        targetOptions.type = 'belongsToMany';
 | 
				
			||||||
 | 
					        targetOptions.options.sourceKey = targetKey;
 | 
				
			||||||
 | 
					        targetOptions.options.foreignKey = otherKey;
 | 
				
			||||||
 | 
					        targetOptions.options.targetKey = sourceKey;
 | 
				
			||||||
 | 
					        targetOptions.options.otherKey = foreignKey;
 | 
				
			||||||
 | 
					        targetOptions.options.through = through;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    const associations = targetTable.getAssociations();
 | 
				
			||||||
 | 
					    // console.log(associations);
 | 
				
			||||||
 | 
					    for (const association of associations.values()) {
 | 
				
			||||||
 | 
					      if (association instanceof BELONGSTOMANY) {
 | 
				
			||||||
 | 
					        if (
 | 
				
			||||||
 | 
					          association.options.foreignKey === otherKey 
 | 
				
			||||||
 | 
					          && association.options.sourceKey === targetKey 
 | 
				
			||||||
 | 
					          && association.options.otherKey === foreignKey 
 | 
				
			||||||
 | 
					          && association.options.targetKey === sourceKey 
 | 
				
			||||||
 | 
					          && association.options.through === through
 | 
				
			||||||
 | 
					        ) {
 | 
				
			||||||
 | 
					          return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      // if (association instanceof BELONGSTO) {
 | 
				
			||||||
 | 
					      //   continue;
 | 
				
			||||||
 | 
					      // }
 | 
				
			||||||
 | 
					      // if (association instanceof HASMANY) {
 | 
				
			||||||
 | 
					      //   continue;
 | 
				
			||||||
 | 
					      // }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    const f = await Field.create(targetOptions, options);
 | 
				
			||||||
 | 
					    console.log({targetOptions}, f.get('options'));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  setInterface(value) {
 | 
					  setInterface(value) {
 | 
				
			||||||
    const { options } = types[value];
 | 
					    const { options } = types[value];
 | 
				
			||||||
    let args = [];
 | 
					    let args = [];
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user