Zeke Zhang 80caec7050
feat: adjust menu of add new (#3884)
* feat: adjust menu of add new

* fix: fix known bugs

* fix: fix known bugs

* chore: fix e2e

* chore: rename

* chore: add translation

* chore: add translation

* chore: make test more stable

* test: add e2e

* refactor: extract templates

* chore: make e2e more stable
2024-04-01 17:14:19 +08:00

77 lines
3.0 KiB
TypeScript

import { Plugin, canMakeAssociationBlock, useCollection } from '@nocobase/client';
import { generateNTemplate } from '../locale';
import { CalendarV2 } from './calendar';
import { calendarBlockSettings } from './calendar/Calender.Settings';
import { CalendarCollectionTemplate } from './collection-templates/calendar';
import { CalendarBlockProvider, useCalendarBlockProps } from './schema-initializer/CalendarBlockProvider';
import {
CalendarActionInitializers_deprecated,
CalendarFormActionInitializers,
calendarActionInitializers,
deleteEventActionInitializer,
} from './schema-initializer/initializers';
import {
CalendarBlockInitializer,
RecordAssociationCalendarBlockInitializer,
useCreateAssociationCalendarBlock,
} from './schema-initializer/items';
import { useMemo } from 'react';
import { useCalendarBlockDecoratorProps } from './hooks/useCalendarBlockDecoratorProps';
export class PluginCalendarClient extends Plugin {
async load() {
this.app.dataSourceManager.addCollectionTemplates([CalendarCollectionTemplate]);
this.app.schemaInitializerManager.addItem('page:addBlock', 'dataBlocks.calendar', {
title: generateNTemplate('Calendar'),
Component: 'CalendarBlockInitializer',
});
this.app.schemaInitializerManager.addItem('popup:common:addBlock', 'dataBlocks.calendar', {
title: generateNTemplate('Calendar'),
Component: 'CalendarBlockInitializer',
useVisible() {
const collection = useCollection();
return useMemo(
() =>
collection.fields.some(
(field) => canMakeAssociationBlock(field) && ['hasMany', 'belongsToMany'].includes(field.type),
),
[collection.fields],
);
},
useComponentProps() {
const { createAssociationCalendarBlock } = useCreateAssociationCalendarBlock();
return {
onlyCurrentDataSource: true,
filterCollections({ associationField }) {
if (associationField) {
return ['hasMany', 'belongsToMany'].includes(associationField.type);
}
return false;
},
createBlockSchema: createAssociationCalendarBlock,
showAssociationFields: true,
hideSearch: true,
};
},
});
this.app.addComponents({
CalendarBlockProvider,
CalendarBlockInitializer: CalendarBlockInitializer as any,
RecordAssociationCalendarBlockInitializer,
CalendarV2,
});
this.app.addScopes({ useCalendarBlockProps, useCalendarBlockDecoratorProps });
this.schemaSettingsManager.add(calendarBlockSettings);
this.app.schemaInitializerManager.add(CalendarActionInitializers_deprecated);
this.app.schemaInitializerManager.add(calendarActionInitializers);
this.app.schemaInitializerManager.add(CalendarFormActionInitializers);
this.app.schemaInitializerManager
.get('details:configureActions')
.add('enableActions.deleteEvent', deleteEventActionInitializer);
}
}
export default PluginCalendarClient;