diff --git a/packages/core/client/package.json b/packages/core/client/package.json index 1c22be399..28056bcf5 100644 --- a/packages/core/client/package.json +++ b/packages/core/client/package.json @@ -33,7 +33,6 @@ "antd-style": "3.4.5", "axios": "^0.26.1", "classnames": "^2.3.1", - "cron-parser": "^4.6.0", "cronstrue": "^2.11.0", "file-saver": "^2.0.5", "flat": "^5.0.2", @@ -45,7 +44,6 @@ "mathjs": "^10.6.0", "mermaid": "9.4.3", "react-beautiful-dnd": "^13.1.0", - "react-big-calendar": "^1.8.1", "react-drag-listview": "^0.1.9", "react-error-boundary": "^4.0.10", "react-helmet": "^6.1.0", @@ -58,7 +56,6 @@ "react-router-dom": "^6.11.2", "react-to-print": "^2.14.7", "sanitize-html": "2.10.0", - "solarlunar-es": "^1.0.9", "use-deep-compare-effect": "^1.8.1" }, "peerDependencies": { diff --git a/packages/core/client/src/block-provider/BlockSchemaComponentProvider.tsx b/packages/core/client/src/block-provider/BlockSchemaComponentProvider.tsx index 7f2d948ff..5192b1208 100644 --- a/packages/core/client/src/block-provider/BlockSchemaComponentProvider.tsx +++ b/packages/core/client/src/block-provider/BlockSchemaComponentProvider.tsx @@ -2,22 +2,20 @@ import React from 'react'; import { Plugin } from '../application/Plugin'; import { SchemaComponentOptions } from '../schema-component'; import { RecordLink, useParamsFromRecord, useSourceIdFromParentRecord, useSourceIdFromRecord } from './BlockProvider'; -import { CalendarBlockProvider, useCalendarBlockProps } from './CalendarBlockProvider'; import { DetailsBlockProvider, useDetailsBlockProps } from './DetailsBlockProvider'; import { FilterFormBlockProvider } from './FilterFormBlockProvider'; import { FormBlockProvider, useFormBlockProps } from './FormBlockProvider'; import { FormFieldProvider, useFormFieldProps } from './FormFieldProvider'; -import * as bp from './hooks'; import { TableBlockProvider, useTableBlockProps } from './TableBlockProvider'; import { TableFieldProvider, useTableFieldProps } from './TableFieldProvider'; import { TableSelectorProvider, useTableSelectorProps } from './TableSelectorProvider'; +import * as bp from './hooks'; // TODO: delete this, replaced by `BlockSchemaComponentPlugin` export const BlockSchemaComponentProvider: React.FC = (props) => { return ( { useSourceIdFromRecord, useSourceIdFromParentRecord, useParamsFromRecord, - useCalendarBlockProps, useFormBlockProps, useFormFieldProps, useDetailsBlockProps, @@ -54,7 +51,6 @@ export class BlockSchemaComponentPlugin extends Plugin { addComponents() { this.app.addComponents({ - CalendarBlockProvider, TableFieldProvider, TableBlockProvider, TableSelectorProvider, @@ -72,7 +68,6 @@ export class BlockSchemaComponentPlugin extends Plugin { useSourceIdFromRecord, useSourceIdFromParentRecord, useParamsFromRecord, - useCalendarBlockProps, useFormBlockProps, useFormFieldProps, useDetailsBlockProps, diff --git a/packages/core/client/src/block-provider/index.tsx b/packages/core/client/src/block-provider/index.tsx index 605a906d8..2ba66d408 100644 --- a/packages/core/client/src/block-provider/index.tsx +++ b/packages/core/client/src/block-provider/index.tsx @@ -1,6 +1,5 @@ export * from './BlockProvider'; export * from './BlockSchemaComponentProvider'; -export * from './CalendarBlockProvider'; export * from './FilterFormBlockProvider'; export * from './FormBlockProvider'; export * from './SharedFilterProvider'; diff --git a/packages/core/client/src/collection-manager/templates/index.tsx b/packages/core/client/src/collection-manager/templates/index.tsx index 94154160a..0daa8dcfa 100644 --- a/packages/core/client/src/collection-manager/templates/index.tsx +++ b/packages/core/client/src/collection-manager/templates/index.tsx @@ -1,4 +1,3 @@ -export * from './calendar'; export * from './general'; export * from './tree'; export * from './expression'; diff --git a/packages/core/client/src/schema-component/antd/index.ts b/packages/core/client/src/schema-component/antd/index.ts index f496c14e8..00297a5b4 100644 --- a/packages/core/client/src/schema-component/antd/index.ts +++ b/packages/core/client/src/schema-component/antd/index.ts @@ -4,7 +4,6 @@ export * from './association-field'; export * from './association-select'; export * from './auto-complete'; export * from './block-item'; -export * from './calendar'; export * from './card-item'; export * from './cascader'; export * from './checkbox'; @@ -49,5 +48,6 @@ export * from './time-picker'; export * from './tree-select'; export * from './upload'; export * from './variable'; +export { genStyleHook } from './__builtins__'; import './index.less'; diff --git a/packages/core/client/src/schema-initializer/buttons/BlockInitializers.tsx b/packages/core/client/src/schema-initializer/buttons/BlockInitializers.tsx index 6a47f9bc9..ecc56dda5 100644 --- a/packages/core/client/src/schema-initializer/buttons/BlockInitializers.tsx +++ b/packages/core/client/src/schema-initializer/buttons/BlockInitializers.tsx @@ -1,5 +1,5 @@ -import { gridRowColWrap } from '../utils'; import { SchemaInitializer } from '../../application/schema-initializer/SchemaInitializer'; +import { gridRowColWrap } from '../utils'; export const blockInitializers = new SchemaInitializer({ name: 'BlockInitializers', @@ -37,11 +37,6 @@ export const blockInitializers = new SchemaInitializer({ title: '{{t("Grid Card")}}', Component: 'GridCardBlockInitializer', }, - { - name: 'calendar', - title: '{{t("Calendar")}}', - Component: 'CalendarBlockInitializer', - }, ], }, { diff --git a/packages/core/client/src/schema-initializer/buttons/RecordBlockInitializers.tsx b/packages/core/client/src/schema-initializer/buttons/RecordBlockInitializers.tsx index ca35a986a..bcb9973f8 100644 --- a/packages/core/client/src/schema-initializer/buttons/RecordBlockInitializers.tsx +++ b/packages/core/client/src/schema-initializer/buttons/RecordBlockInitializers.tsx @@ -97,6 +97,7 @@ const useRelationFields = () => { field, Component: 'RecordAssociationFormBlockInitializer', }, + // TODO: This one should be append in the calendar plugin { name: `${field.name}_calendar`, type: 'item', diff --git a/packages/core/client/src/schema-initializer/buttons/index.ts b/packages/core/client/src/schema-initializer/buttons/index.ts index 186a8aa66..10700873f 100644 --- a/packages/core/client/src/schema-initializer/buttons/index.ts +++ b/packages/core/client/src/schema-initializer/buttons/index.ts @@ -1,6 +1,4 @@ export * from './BlockInitializers'; -export * from './CalendarActionInitializers'; -export * from './CalendarFormActionInitializers'; export * from './CreateFormBlockInitializers'; export * from './CusomeizeCreateFormBlockInitializers'; export * from './CustomFormItemInitializers'; diff --git a/packages/core/client/src/schema-initializer/index.ts b/packages/core/client/src/schema-initializer/index.ts index 6df3802a6..24c718d9e 100644 --- a/packages/core/client/src/schema-initializer/index.ts +++ b/packages/core/client/src/schema-initializer/index.ts @@ -1,6 +1,36 @@ +import { Plugin } from '../application/Plugin'; +import { + blockInitializers, + bulkEditFormActionInitializers, + createFormActionInitializers, + createFormBlockInitializers, + cusomeizeCreateFormBlockInitializers, + customFormItemInitializers, + detailsActionInitializers, + filterFormActionInitializers, + filterFormItemInitializers, + formActionInitializers, + formItemInitializers, + gridCardActionInitializers, + gridCardItemActionInitializers, + listActionInitializers, + listItemActionInitializers, + readPrettyFormActionInitializers, + readPrettyFormItemInitializers, + recordBlockInitializers, + recordFormBlockInitializers, + subTableActionInitializers, + tabPaneInitializers, + tabPaneInitializersForBulkEditFormBlock, + tabPaneInitializersForRecordBlock, + tableActionColumnInitializers, + tableActionInitializers, + tableColumnInitializers, + tableSelectorInitializers, + updateFormActionInitializers, +} from './buttons'; import * as initializerComponents from './components'; import * as items from './items'; -export { useCurrentSchema } from './utils'; export * from './buttons'; export * from './items'; export { @@ -10,51 +40,18 @@ export { createTableBlockSchema, gridRowColWrap, itemsMerge, - useCollectionDataSourceItemsV2, + useAssociatedFormItemInitializerFields, useAssociatedTableColumnInitializerFields, useCollectionDataSourceItems, + useCollectionDataSourceItemsV2, + useCurrentSchema, + useFormItemInitializerFields, useInheritsTableColumnInitializerFields, useRecordCollectionDataSourceItems, - useTableColumnInitializerFields, useRemoveGridFormItem, - useAssociatedFormItemInitializerFields, - useFormItemInitializerFields, + useTableColumnInitializerFields } from './utils'; -import { Plugin } from '../application/Plugin'; -import { - calendarActionInitializers, - calendarFormActionInitializers, - createFormBlockInitializers, - cusomeizeCreateFormBlockInitializers, - customFormItemInitializers, - filterFormActionInitializers, - createFormActionInitializers, - updateFormActionInitializers, - bulkEditFormActionInitializers, - filterFormItemInitializers, - gridCardActionInitializers, - gridCardItemActionInitializers, - listActionInitializers, - listItemActionInitializers, - recordBlockInitializers, - recordFormBlockInitializers, - subTableActionInitializers, - tableSelectorInitializers, - tabPaneInitializers, - tabPaneInitializersForRecordBlock, - tabPaneInitializersForBulkEditFormBlock, - blockInitializers, - tableActionColumnInitializers, - tableActionInitializers, - tableColumnInitializers, - formItemInitializers, - formActionInitializers, - readPrettyFormItemInitializers, - detailsActionInitializers, - readPrettyFormActionInitializers, -} from './buttons'; - export class SchemaInitializerPlugin extends Plugin { async load() { this.app.addComponents({ @@ -71,8 +68,6 @@ export class SchemaInitializerPlugin extends Plugin { this.app.schemaInitializerManager.add(detailsActionInitializers); this.app.schemaInitializerManager.add(readPrettyFormItemInitializers); this.app.schemaInitializerManager.add(readPrettyFormActionInitializers); - this.app.schemaInitializerManager.add(calendarActionInitializers); - this.app.schemaInitializerManager.add(calendarFormActionInitializers); this.app.schemaInitializerManager.add(createFormBlockInitializers); this.app.schemaInitializerManager.add(cusomeizeCreateFormBlockInitializers); this.app.schemaInitializerManager.add(customFormItemInitializers); diff --git a/packages/core/client/src/schema-initializer/items/index.tsx b/packages/core/client/src/schema-initializer/items/index.tsx index 4a44a2bc1..39e488556 100644 --- a/packages/core/client/src/schema-initializer/items/index.tsx +++ b/packages/core/client/src/schema-initializer/items/index.tsx @@ -7,7 +7,6 @@ export * from './ActionInitializer'; export * from './BlockInitializer'; export * from './BulkDestroyActionInitializer'; export * from './BulkEditSubmitActionInitializer'; -export * from './CalendarBlockInitializer'; export * from './CollectionFieldInitializer'; export * from './CreateActionInitializer'; export * from './CreateChildInitializer'; @@ -34,7 +33,6 @@ export * from './MarkdownBlockInitializer'; export * from './RecordAssociationBlockInitializer'; export * from './RecordAssociationGridCardBlockInitializer'; export * from './RecordAssociationListBlockInitializer'; -export * from './RecordAssociationCalendarBlockInitializer'; export * from './RecordAssociationDetailsBlockInitializer'; export * from './RecordAssociationFormBlockInitializer'; export * from './RecordFormBlockInitializer'; diff --git a/packages/core/client/src/schema-initializer/utils.ts b/packages/core/client/src/schema-initializer/utils.ts index 8cc013035..4d70177e9 100644 --- a/packages/core/client/src/schema-initializer/utils.ts +++ b/packages/core/client/src/schema-initializer/utils.ts @@ -1499,99 +1499,6 @@ export const createTableSelectorSchema = (options) => { return schema; }; -export const createCalendarBlockSchema = (options) => { - const { collection, resource, fieldNames, ...others } = options; - const schema: ISchema = { - type: 'void', - 'x-acl-action': `${resource || collection}:list`, - 'x-decorator': 'CalendarBlockProvider', - 'x-decorator-props': { - collection: collection, - resource: resource || collection, - action: 'list', - fieldNames: { - id: 'id', - ...fieldNames, - }, - params: { - paginate: false, - }, - ...others, - }, - 'x-designer': 'CalendarV2.Designer', - 'x-component': 'CardItem', - properties: { - [uid()]: { - type: 'void', - 'x-component': 'CalendarV2', - 'x-component-props': { - useProps: '{{ useCalendarBlockProps }}', - }, - properties: { - toolBar: { - type: 'void', - 'x-component': 'CalendarV2.ActionBar', - 'x-component-props': { - style: { - marginBottom: 24, - }, - }, - 'x-initializer': 'CalendarActionInitializers', - properties: {}, - }, - event: { - type: 'void', - 'x-component': 'CalendarV2.Event', - properties: { - drawer: { - type: 'void', - 'x-component': 'Action.Drawer', - 'x-component-props': { - className: 'nb-action-popup', - }, - title: '{{ t("View record") }}', - properties: { - tabs: { - type: 'void', - 'x-component': 'Tabs', - 'x-component-props': {}, - 'x-initializer': 'TabPaneInitializers', - 'x-initializer-props': { - gridInitializer: 'RecordBlockInitializers', - }, - properties: { - tab1: { - type: 'void', - title: '{{t("Details")}}', - 'x-component': 'Tabs.TabPane', - 'x-designer': 'Tabs.Designer', - 'x-component-props': {}, - properties: { - grid: { - type: 'void', - 'x-component': 'Grid', - 'x-initializer-props': { - actionInitializers: 'CalendarFormActionInitializers', - }, - 'x-initializer': 'RecordBlockInitializers', - properties: {}, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }; - - return schema; -}; - const getChildren = ({ collections, getCollectionFields, diff --git a/packages/plugins/@nocobase/plugin-calendar/.npmignore b/packages/plugins/@nocobase/plugin-calendar/.npmignore new file mode 100644 index 000000000..c593fe9df --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/.npmignore @@ -0,0 +1,2 @@ +/node_modules +/src \ No newline at end of file diff --git a/packages/plugins/@nocobase/plugin-calendar/LICENSE b/packages/plugins/@nocobase/plugin-calendar/LICENSE new file mode 100644 index 000000000..0ad25db4b --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/packages/plugins/@nocobase/plugin-calendar/README.md b/packages/plugins/@nocobase/plugin-calendar/README.md new file mode 100644 index 000000000..5393e68a6 --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/README.md @@ -0,0 +1,6 @@ +# calendar + +English | [中文](./README.zh-CN.md) + + +## Introduction diff --git a/packages/plugins/@nocobase/plugin-calendar/README.zh-CN.md b/packages/plugins/@nocobase/plugin-calendar/README.zh-CN.md new file mode 100644 index 000000000..3d2563288 --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/README.zh-CN.md @@ -0,0 +1,5 @@ +# 日历 + +[English](./README.md) | 中文 + +## 简介 \ No newline at end of file diff --git a/packages/plugins/@nocobase/plugin-calendar/client.d.ts b/packages/plugins/@nocobase/plugin-calendar/client.d.ts new file mode 100644 index 000000000..6c459cbac --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/client.d.ts @@ -0,0 +1,2 @@ +export * from './dist/client'; +export { default } from './dist/client'; diff --git a/packages/plugins/@nocobase/plugin-calendar/client.js b/packages/plugins/@nocobase/plugin-calendar/client.js new file mode 100644 index 000000000..b6e3be70e --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/client.js @@ -0,0 +1 @@ +module.exports = require('./dist/client/index.js'); diff --git a/packages/plugins/@nocobase/plugin-calendar/package.json b/packages/plugins/@nocobase/plugin-calendar/package.json new file mode 100644 index 000000000..07ff13b5a --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/package.json @@ -0,0 +1,37 @@ +{ + "name": "@nocobase/plugin-calendar", + "version": "0.18.0-alpha.1", + "displayName": "Calendar", + "displayName.zh-CN": "日历", + "description": "Provide calendar template and block", + "description.zh-CN": "提供日历模板和区块", + "license": "AGPL-3.0", + "main": "./dist/server/index.js", + "types": "./dist/server/index.d.ts", + "devDependencies": { + "react-big-calendar": "^1.8.1", + "@ant-design/icons": "5.x", + "@formily/antd-v5": "1.x", + "@formily/react": "2.x", + "@formily/shared": "2.x", + "@formily/core": "2.x", + "lodash": "^4.17.21", + "react": "^18.2.0", + "dayjs": "^1.11.8", + "antd-style": "3.4.5", + "cron-parser": "4.4.0", + "react-js-cron": "^3.1.0", + "solarlunar-es": "^1.0.9", + "antd": "5.x" + }, + "peerDependencies": { + "@nocobase/client": "0.x", + "@nocobase/database": "0.x", + "@nocobase/server": "0.x" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/nocobase/nocobase.git", + "directory": "packages/plugins/calendar" + } +} diff --git a/packages/plugins/@nocobase/plugin-calendar/server.d.ts b/packages/plugins/@nocobase/plugin-calendar/server.d.ts new file mode 100644 index 000000000..0b9baefe6 --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/server.d.ts @@ -0,0 +1,3 @@ +// @ts-nocheck +export * from './dist/server'; +export { default } from './dist/server'; diff --git a/packages/plugins/@nocobase/plugin-calendar/server.js b/packages/plugins/@nocobase/plugin-calendar/server.js new file mode 100644 index 000000000..972842039 --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/server.js @@ -0,0 +1 @@ +module.exports = require('./dist/server/index.js'); diff --git a/packages/core/client/src/schema-component/antd/calendar/__tests__/calendar.test.tsx b/packages/plugins/@nocobase/plugin-calendar/src/client/__tests__/calendar.test.tsx similarity index 66% rename from packages/core/client/src/schema-component/antd/calendar/__tests__/calendar.test.tsx rename to packages/plugins/@nocobase/plugin-calendar/src/client/__tests__/calendar.test.tsx index d81f65c4a..ec2538f5e 100644 --- a/packages/core/client/src/schema-component/antd/calendar/__tests__/calendar.test.tsx +++ b/packages/plugins/@nocobase/plugin-calendar/src/client/__tests__/calendar.test.tsx @@ -1,28 +1,27 @@ import { render, screen, waitFor } from '@nocobase/test/client'; import dayjs from 'dayjs'; import React from 'react'; -import App1 from '../demos/demo1'; -import App2 from '../demos/demo2'; +import App1 from '../calendar/demos/demo1'; +import App2 from '../calendar/demos/demo2'; describe('Calendar', () => { - it('basic', async () => { + it('basic', () => { render(); - await waitFor(() => { - const currentDate = dayjs().format('YYYY-M'); + const currentDate = dayjs().format('YYYY-M'); + waitFor(() => { expect(screen.getByText('Today')).toBeInTheDocument(); expect(screen.getByText(currentDate)).toBeInTheDocument(); expect(screen.getByText('Month')).toBeInTheDocument(); }); }); - it('use CalendarBlockProvider', async () => { + it('use CalendarBlockProvider', () => { render(); - await waitFor(() => { - const currentDate = dayjs().format('YYYY-M'); - + const currentDate = dayjs().format('YYYY-M'); + waitFor(() => { expect(screen.getByText('Today')).toBeInTheDocument(); expect(screen.getByText(currentDate)).toBeInTheDocument(); expect(screen.getByText('Month')).toBeInTheDocument(); diff --git a/packages/core/client/src/schema-component/antd/calendar/Calendar.Designer.tsx b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/Calendar.Designer.tsx similarity index 91% rename from packages/core/client/src/schema-component/antd/calendar/Calendar.Designer.tsx rename to packages/plugins/@nocobase/plugin-calendar/src/client/calendar/Calendar.Designer.tsx index d47e1a264..935ea4419 100644 --- a/packages/core/client/src/schema-component/antd/calendar/Calendar.Designer.tsx +++ b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/Calendar.Designer.tsx @@ -1,22 +1,27 @@ import { useField, useFieldSchema } from '@formily/react'; import React from 'react'; -import { useTranslation } from 'react-i18next'; -import { FixedBlockDesignerItem, removeNullCondition, useDesignable } from '../..'; -import { useCalendarBlockContext, useFormBlockContext } from '../../../block-provider'; -import { useCollection, useCollectionManager } from '../../../collection-manager'; -import { RecordProvider, useRecord } from '../../../record-provider'; +import { useCalendarBlockContext } from '../schema-initializer/CalendarBlockProvider'; import { + useFormBlockContext, + useCollection, + useCollectionManager, + useDesignable, + useSchemaTemplate, + useRecord, + RecordProvider, GeneralSchemaDesigner, + FixedBlockDesignerItem, + removeNullCondition, SchemaSettingsBlockTitleItem, + SchemaSettingsSelectItem, + SchemaSettingsSwitchItem, SchemaSettingsCascaderItem, SchemaSettingsDataScope, SchemaSettingsDivider, - SchemaSettingsRemove, - SchemaSettingsSelectItem, - SchemaSettingsSwitchItem, SchemaSettingsTemplate, -} from '../../../schema-settings'; -import { useSchemaTemplate } from '../../../schema-templates'; + SchemaSettingsRemove, +} from '@nocobase/client'; +import { useTranslation } from '../../locale'; export const CalendarDesigner = () => { const field = useField(); diff --git a/packages/core/client/src/schema-component/antd/calendar/Calendar.tsx b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/Calendar.tsx similarity index 93% rename from packages/core/client/src/schema-component/antd/calendar/Calendar.tsx rename to packages/plugins/@nocobase/plugin-calendar/src/client/calendar/Calendar.tsx index 7721e54e4..f3b182c21 100644 --- a/packages/core/client/src/schema-component/antd/calendar/Calendar.tsx +++ b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/Calendar.tsx @@ -8,17 +8,14 @@ import get from 'lodash/get'; import React, { useCallback, useMemo, useState } from 'react'; import { Calendar as BigCalendar, View, dayjsLocalizer } from 'react-big-calendar'; import * as dates from 'react-big-calendar/lib/utils/dates'; -import { useTranslation } from 'react-i18next'; -import { RecordProvider } from '../../../'; -import { i18n } from '../../../i18n'; -import { useProps } from '../../hooks/useProps'; -import { ActionContextProvider } from '../action'; import Header from './components/Header'; import { CalendarToolbarContext } from './context'; import GlobalStyle from './global.style'; import useStyle from './style'; import type { ToolbarProps } from './types'; import { formatDate } from './utils'; +import { ActionContextProvider, RecordProvider, useProps, i18n } from '@nocobase/client'; +import { i18nt, useTranslation } from '../../locale'; const Weeks = ['month', 'week', 'day'] as View[]; const localizer = dayjsLocalizer(dayjs); @@ -209,17 +206,17 @@ export const Calendar: any = observer( ), - today: i18n.t('Today'), - month: i18n.t('Month'), - week: i18n.t('Week'), - work_week: i18n.t('Work week'), - day: i18n.t('Day'), - agenda: i18n.t('Agenda'), - date: i18n.t('Date'), - time: i18n.t('Time'), - event: i18n.t('Event'), - noEventsInRange: i18n.t('None'), - showMore: (count) => i18n.t('{{count}} more items', { count }), + today: i18nt('Today'), + month: i18nt('Month'), + week: i18nt('Week'), + work_week: i18nt('Work week'), + day: i18nt('Day'), + agenda: i18nt('Agenda'), + date: i18nt('Date'), + time: i18nt('Time'), + event: i18nt('Event'), + noEventsInRange: i18nt('None'), + showMore: (count) => i18nt('{{count}} more items', { count }), }; return wrapSSR( diff --git a/packages/core/client/src/schema-component/antd/calendar/DeleteEvent.tsx b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/DeleteEvent.tsx similarity index 90% rename from packages/core/client/src/schema-component/antd/calendar/DeleteEvent.tsx rename to packages/plugins/@nocobase/plugin-calendar/src/client/calendar/DeleteEvent.tsx index a18fc8cfd..fdadf924f 100644 --- a/packages/core/client/src/schema-component/antd/calendar/DeleteEvent.tsx +++ b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/DeleteEvent.tsx @@ -3,12 +3,10 @@ import { Modal, Radio, Space, Typography } from 'antd'; import dayjs from 'dayjs'; import React, { useContext, useState } from 'react'; import { createPortal } from 'react-dom'; -import { useTranslation } from 'react-i18next'; -import { useBlockRequestContext, useFilterByTk } from '../../../block-provider'; -import { useRecord } from '../../../record-provider'; -import { useActionContext } from '../action'; import { DeleteEventContext } from './Calendar'; import { formatDate } from './utils'; +import { useActionContext, useRecord, useFilterByTk, useBlockRequestContext } from '@nocobase/client'; +import { useTranslation } from '../../locale'; const { Text } = Typography; export const DeleteEvent = observer( diff --git a/packages/core/client/src/schema-component/antd/calendar/Event.tsx b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/Event.tsx similarity index 100% rename from packages/core/client/src/schema-component/antd/calendar/Event.tsx rename to packages/plugins/@nocobase/plugin-calendar/src/client/calendar/Event.tsx diff --git a/packages/core/client/src/schema-component/antd/calendar/Nav.tsx b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/Nav.tsx similarity index 93% rename from packages/core/client/src/schema-component/antd/calendar/Nav.tsx rename to packages/plugins/@nocobase/plugin-calendar/src/client/calendar/Nav.tsx index 06d7cc249..53736e9aa 100644 --- a/packages/core/client/src/schema-component/antd/calendar/Nav.tsx +++ b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/Nav.tsx @@ -3,8 +3,8 @@ import { observer } from '@formily/react'; import { Button } from 'antd'; import React, { useContext } from 'react'; import { Navigate } from 'react-big-calendar/dist/react-big-calendar.esm'; -import { useDesignable } from '../../hooks'; import { CalendarToolbarContext } from './context'; +import { useDesignable } from '@nocobase/client'; export const Nav = observer( () => { diff --git a/packages/core/client/src/schema-component/antd/calendar/Title.tsx b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/Title.tsx similarity index 94% rename from packages/core/client/src/schema-component/antd/calendar/Title.tsx rename to packages/plugins/@nocobase/plugin-calendar/src/client/calendar/Title.tsx index 22cfb47f7..6cc05f29c 100644 --- a/packages/core/client/src/schema-component/antd/calendar/Title.tsx +++ b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/Title.tsx @@ -1,9 +1,9 @@ import { observer } from '@formily/react'; import { Button } from 'antd'; import React, { useContext, useMemo } from 'react'; -import { useDesignable } from '../../hooks'; import { CalendarToolbarContext } from './context'; import { getLunarDay } from './utils'; +import { useDesignable } from '@nocobase/client'; export const Title = observer( () => { diff --git a/packages/core/client/src/schema-component/antd/calendar/Today.tsx b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/Today.tsx similarity index 87% rename from packages/core/client/src/schema-component/antd/calendar/Today.tsx rename to packages/plugins/@nocobase/plugin-calendar/src/client/calendar/Today.tsx index ccdc22f03..fa82c8a17 100644 --- a/packages/core/client/src/schema-component/antd/calendar/Today.tsx +++ b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/Today.tsx @@ -2,9 +2,9 @@ import { observer } from '@formily/react'; import { Button } from 'antd'; import React, { useContext } from 'react'; import { Navigate } from 'react-big-calendar/dist/react-big-calendar.esm'; -import { useTranslation } from 'react-i18next'; -import { useDesignable } from '../../hooks'; import { CalendarToolbarContext } from './context'; +import { useDesignable } from '@nocobase/client'; +import { useTranslation } from '../../locale'; export const Today = observer( (props) => { diff --git a/packages/core/client/src/schema-component/antd/calendar/ViewSelect.tsx b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/ViewSelect.tsx similarity index 94% rename from packages/core/client/src/schema-component/antd/calendar/ViewSelect.tsx rename to packages/plugins/@nocobase/plugin-calendar/src/client/calendar/ViewSelect.tsx index 25ed5526e..9db3c1084 100644 --- a/packages/core/client/src/schema-component/antd/calendar/ViewSelect.tsx +++ b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/ViewSelect.tsx @@ -1,8 +1,8 @@ import { observer } from '@formily/react'; import { Select } from 'antd'; import React, { useContext } from 'react'; -import { useDesignable } from '../../hooks'; import { CalendarToolbarContext } from './context'; +import { useDesignable } from '@nocobase/client'; export const ViewSelect = observer( (props) => { diff --git a/packages/core/client/src/schema-component/antd/calendar/components/Header.tsx b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/components/Header.tsx similarity index 100% rename from packages/core/client/src/schema-component/antd/calendar/components/Header.tsx rename to packages/plugins/@nocobase/plugin-calendar/src/client/calendar/components/Header.tsx diff --git a/packages/core/client/src/schema-component/antd/calendar/context.ts b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/context.ts similarity index 100% rename from packages/core/client/src/schema-component/antd/calendar/context.ts rename to packages/plugins/@nocobase/plugin-calendar/src/client/calendar/context.ts diff --git a/packages/core/client/src/schema-component/antd/calendar/demos/collections.ts b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/demos/collections.ts similarity index 100% rename from packages/core/client/src/schema-component/antd/calendar/demos/collections.ts rename to packages/plugins/@nocobase/plugin-calendar/src/client/calendar/demos/collections.ts diff --git a/packages/core/client/src/schema-component/antd/calendar/demos/data.ts b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/demos/data.ts similarity index 100% rename from packages/core/client/src/schema-component/antd/calendar/demos/data.ts rename to packages/plugins/@nocobase/plugin-calendar/src/client/calendar/demos/data.ts diff --git a/packages/core/client/src/schema-component/antd/calendar/demos/defaultValues.ts b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/demos/defaultValues.ts similarity index 100% rename from packages/core/client/src/schema-component/antd/calendar/demos/defaultValues.ts rename to packages/plugins/@nocobase/plugin-calendar/src/client/calendar/demos/defaultValues.ts diff --git a/packages/core/client/src/schema-component/antd/calendar/demos/demo1.tsx b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/demos/demo1.tsx similarity index 100% rename from packages/core/client/src/schema-component/antd/calendar/demos/demo1.tsx rename to packages/plugins/@nocobase/plugin-calendar/src/client/calendar/demos/demo1.tsx diff --git a/packages/core/client/src/schema-component/antd/calendar/demos/demo2.tsx b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/demos/demo2.tsx similarity index 100% rename from packages/core/client/src/schema-component/antd/calendar/demos/demo2.tsx rename to packages/plugins/@nocobase/plugin-calendar/src/client/calendar/demos/demo2.tsx diff --git a/packages/core/client/src/schema-component/antd/calendar/global.style.ts b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/global.style.ts similarity index 100% rename from packages/core/client/src/schema-component/antd/calendar/global.style.ts rename to packages/plugins/@nocobase/plugin-calendar/src/client/calendar/global.style.ts diff --git a/packages/core/client/src/schema-component/antd/calendar/index.md b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/index.md similarity index 100% rename from packages/core/client/src/schema-component/antd/calendar/index.md rename to packages/plugins/@nocobase/plugin-calendar/src/client/calendar/index.md diff --git a/packages/core/client/src/schema-component/antd/calendar/index.ts b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/index.ts similarity index 92% rename from packages/core/client/src/schema-component/antd/calendar/index.ts rename to packages/plugins/@nocobase/plugin-calendar/src/client/calendar/index.ts index 399c3054b..b5ddca3e5 100644 --- a/packages/core/client/src/schema-component/antd/calendar/index.ts +++ b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/index.ts @@ -1,4 +1,4 @@ -import { ActionBar } from '../action'; +import { ActionBar } from '@nocobase/client'; import { Calendar } from './Calendar'; import { CalendarDesigner } from './Calendar.Designer'; import DeleteEvent from './DeleteEvent'; diff --git a/packages/core/client/src/schema-component/antd/calendar/style.ts b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/style.ts similarity index 99% rename from packages/core/client/src/schema-component/antd/calendar/style.ts rename to packages/plugins/@nocobase/plugin-calendar/src/client/calendar/style.ts index 75b7216a4..26b950927 100644 --- a/packages/core/client/src/schema-component/antd/calendar/style.ts +++ b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/style.ts @@ -1,4 +1,4 @@ -import { genStyleHook } from './../__builtins__'; +import { genStyleHook } from '@nocobase/client'; export default genStyleHook('nb-calendar', (token) => { const { componentCls } = token; diff --git a/packages/core/client/src/schema-component/antd/calendar/types.d.ts b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/types.d.ts similarity index 100% rename from packages/core/client/src/schema-component/antd/calendar/types.d.ts rename to packages/plugins/@nocobase/plugin-calendar/src/client/calendar/types.d.ts diff --git a/packages/core/client/src/schema-component/antd/calendar/utils.ts b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/utils.ts similarity index 88% rename from packages/core/client/src/schema-component/antd/calendar/utils.ts rename to packages/plugins/@nocobase/plugin-calendar/src/client/calendar/utils.ts index fd051c9b3..7f7a8f6e1 100644 --- a/packages/core/client/src/schema-component/antd/calendar/utils.ts +++ b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/utils.ts @@ -1,13 +1,13 @@ import dayjs from 'dayjs'; import { get } from 'lodash'; import solarLunar from 'solarlunar-es'; -import { i18n } from '../../../i18n'; +import { i18nt } from '../../locale'; export const toEvents = (data: any[], fieldNames: any) => { return data?.map((item) => { return { id: get(item, fieldNames.id || 'id'), - title: get(item, fieldNames.title) || i18n.t('Untitle'), + title: get(item, fieldNames.title) || i18nt('Untitle'), start: new Date(get(item, fieldNames.start)), end: new Date(get(item, fieldNames.end || fieldNames.start)), }; diff --git a/packages/core/client/src/collection-manager/templates/calendar.tsx b/packages/plugins/@nocobase/plugin-calendar/src/client/collection-templates/calendar.tsx similarity index 69% rename from packages/core/client/src/collection-manager/templates/calendar.tsx rename to packages/plugins/@nocobase/plugin-calendar/src/client/collection-templates/calendar.tsx index f74ec9413..69d143155 100644 --- a/packages/core/client/src/collection-manager/templates/calendar.tsx +++ b/packages/plugins/@nocobase/plugin-calendar/src/client/collection-templates/calendar.tsx @@ -1,9 +1,9 @@ -import { getConfigurableProperties } from './properties'; -import { ICollectionTemplate } from './types'; +import { ICollectionTemplate, getConfigurableProperties } from '@nocobase/client'; +import { generateNTemplate } from '../../locale'; export const calendar: ICollectionTemplate = { name: 'calendar', - title: '{{t("Calendar collection")}}', + title: generateNTemplate('Calendar collection'), order: 2, color: 'orange', default: { @@ -18,24 +18,24 @@ export const calendar: ICollectionTemplate = { type: 'string', uiSchema: { type: 'string', - title: '{{t("Repeats")}}', + title: generateNTemplate('Repeats'), 'x-component': 'CronSet', 'x-component-props': 'allowClear', enum: [ { - label: '{{t("Daily")}}', + label: generateNTemplate('Daily'), value: '0 0 0 * * ?', }, { - label: '{{t("Weekly")}}', + label: generateNTemplate('Weekly'), value: 'every_week', }, { - label: '{{t("Monthly")}}', + label: generateNTemplate('Monthly'), value: 'every_month', }, { - label: '{{t("Yearly")}}', + label: generateNTemplate('Yearly'), value: 'every_year', }, ], diff --git a/packages/plugins/@nocobase/plugin-calendar/src/client/index.tsx b/packages/plugins/@nocobase/plugin-calendar/src/client/index.tsx new file mode 100644 index 000000000..8ab851ddb --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/src/client/index.tsx @@ -0,0 +1,28 @@ +import { Plugin, registerTemplate } from '@nocobase/client'; +import { generateNTemplate } from '../locale'; +import { CalendarV2 } from './calendar'; +import { calendar } from './collection-templates/calendar'; +import { CalendarBlockProvider, useCalendarBlockProps } from './schema-initializer/CalendarBlockProvider'; +import { CalendarActionInitializers, CalendarFormActionInitializers } from './schema-initializer/initializers'; +import { CalendarBlockInitializer, RecordAssociationCalendarBlockInitializer } from './schema-initializer/items'; + +export class PluginCalendarClient extends Plugin { + async load() { + this.app.schemaInitializerManager.addItem('BlockInitializers', 'dataBlocks.calendar', { + title: generateNTemplate('Calendar'), + Component: 'CalendarBlockInitializer', + }); + this.app.addComponents({ + CalendarBlockProvider, + CalendarBlockInitializer, + RecordAssociationCalendarBlockInitializer, + CalendarV2, + }); + this.app.addScopes({ useCalendarBlockProps }); + this.app.schemaInitializerManager.add(CalendarActionInitializers); + this.app.schemaInitializerManager.add(CalendarFormActionInitializers); + registerTemplate('calendar', calendar); + } +} + +export default PluginCalendarClient; diff --git a/packages/core/client/src/block-provider/CalendarBlockProvider.tsx b/packages/plugins/@nocobase/plugin-calendar/src/client/schema-initializer/CalendarBlockProvider.tsx similarity index 89% rename from packages/core/client/src/block-provider/CalendarBlockProvider.tsx rename to packages/plugins/@nocobase/plugin-calendar/src/client/schema-initializer/CalendarBlockProvider.tsx index 9419c86b4..1888f15aa 100644 --- a/packages/core/client/src/block-provider/CalendarBlockProvider.tsx +++ b/packages/plugins/@nocobase/plugin-calendar/src/client/schema-initializer/CalendarBlockProvider.tsx @@ -1,11 +1,8 @@ import { ArrayField } from '@formily/core'; import { useField } from '@formily/react'; +import { useBlockRequestContext, useRecord, useParsedFilter, FixedBlockWrapper, BlockProvider } from '@nocobase/client'; import _ from 'lodash'; import React, { createContext, useContext, useEffect, useMemo } from 'react'; -import { useRecord } from '../record-provider'; -import { FixedBlockWrapper } from '../schema-component'; -import { BlockProvider, useBlockRequestContext } from './BlockProvider'; -import { useParsedFilter } from './hooks'; export const CalendarBlockContext = createContext({}); @@ -25,9 +22,6 @@ const InternalCalendarBlockProvider = (props) => { } }, [JSON.stringify(filter)]); - // if (service.loading) { - // return ; - // } return ( { const { insert } = useSchemaInitializer(); diff --git a/packages/core/client/src/schema-initializer/items/RecordAssociationCalendarBlockInitializer.tsx b/packages/plugins/@nocobase/plugin-calendar/src/client/schema-initializer/items/RecordAssociationCalendarBlockInitializer.tsx similarity index 87% rename from packages/core/client/src/schema-initializer/items/RecordAssociationCalendarBlockInitializer.tsx rename to packages/plugins/@nocobase/plugin-calendar/src/client/schema-initializer/items/RecordAssociationCalendarBlockInitializer.tsx index 2b8f968b1..b223f5f40 100644 --- a/packages/core/client/src/schema-initializer/items/RecordAssociationCalendarBlockInitializer.tsx +++ b/packages/plugins/@nocobase/plugin-calendar/src/client/schema-initializer/items/RecordAssociationCalendarBlockInitializer.tsx @@ -2,14 +2,21 @@ import { TableOutlined } from '@ant-design/icons'; import { FormLayout } from '@formily/antd-v5'; import { SchemaOptionsContext } from '@formily/react'; import React, { useContext } from 'react'; -import { useTranslation } from 'react-i18next'; - -import { useCollectionManager } from '../../collection-manager'; -import { useGlobalTheme } from '../../global-theme'; -import { FormDialog, SchemaComponent, SchemaComponentOptions } from '../../schema-component'; -import { useSchemaTemplateManager } from '../../schema-templates'; -import { createCalendarBlockSchema, useRecordCollectionDataSourceItems } from '../utils'; -import { SchemaInitializerItem, useSchemaInitializer, useSchemaInitializerItem } from '../../application'; +import { + useSchemaTemplateManager, + useCollectionManager, + useGlobalTheme, + SchemaInitializer, + FormDialog, + SchemaComponentOptions, + SchemaComponent, + useRecordCollectionDataSourceItems, + useSchemaInitializerItem, + useSchemaInitializer, + SchemaInitializerItem, +} from '@nocobase/client'; +import { createCalendarBlockSchema } from '../utils'; +import { useTranslation } from '../../../locale'; export const RecordAssociationCalendarBlockInitializer = () => { const itemConfig = useSchemaInitializerItem(); diff --git a/packages/plugins/@nocobase/plugin-calendar/src/client/schema-initializer/items/index.ts b/packages/plugins/@nocobase/plugin-calendar/src/client/schema-initializer/items/index.ts new file mode 100644 index 000000000..e2f62374a --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/src/client/schema-initializer/items/index.ts @@ -0,0 +1,2 @@ +export * from './CalendarBlockInitializer'; +export * from './RecordAssociationCalendarBlockInitializer'; diff --git a/packages/plugins/@nocobase/plugin-calendar/src/client/schema-initializer/utils.ts b/packages/plugins/@nocobase/plugin-calendar/src/client/schema-initializer/utils.ts new file mode 100644 index 000000000..e54c1e8f6 --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/src/client/schema-initializer/utils.ts @@ -0,0 +1,96 @@ +import { ISchema } from '@formily/react'; +import { uid } from '@formily/shared'; +import { generateNTemplate } from '../../locale'; + +export const createCalendarBlockSchema = (options) => { + const { collection, resource, fieldNames, ...others } = options; + const schema: ISchema = { + type: 'void', + 'x-acl-action': `${resource || collection}:list`, + 'x-decorator': 'CalendarBlockProvider', + 'x-decorator-props': { + collection: collection, + resource: resource || collection, + action: 'list', + fieldNames: { + id: 'id', + ...fieldNames, + }, + params: { + paginate: false, + }, + ...others, + }, + 'x-designer': 'CalendarV2.Designer', + 'x-component': 'CardItem', + properties: { + [uid()]: { + type: 'void', + 'x-component': 'CalendarV2', + 'x-component-props': { + useProps: '{{ useCalendarBlockProps }}', + }, + properties: { + toolBar: { + type: 'void', + 'x-component': 'CalendarV2.ActionBar', + 'x-component-props': { + style: { + marginBottom: 24, + }, + }, + 'x-initializer': 'CalendarActionInitializers', + properties: {}, + }, + event: { + type: 'void', + 'x-component': 'CalendarV2.Event', + properties: { + drawer: { + type: 'void', + 'x-component': 'Action.Drawer', + 'x-component-props': { + className: 'nb-action-popup', + }, + title: generateNTemplate('View record'), + properties: { + tabs: { + type: 'void', + 'x-component': 'Tabs', + 'x-component-props': {}, + 'x-initializer': 'TabPaneInitializers', + 'x-initializer-props': { + gridInitializer: 'RecordBlockInitializers', + }, + properties: { + tab1: { + type: 'void', + title: generateNTemplate('Details'), + 'x-component': 'Tabs.TabPane', + 'x-designer': 'Tabs.Designer', + 'x-component-props': {}, + properties: { + grid: { + type: 'void', + 'x-component': 'Grid', + 'x-initializer-props': { + actionInitializers: 'CalendarFormActionInitializers', + }, + 'x-initializer': 'RecordBlockInitializers', + properties: {}, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + }; + console.log(JSON.stringify(schema, null, 2)); + return schema; +}; diff --git a/packages/plugins/@nocobase/plugin-calendar/src/index.ts b/packages/plugins/@nocobase/plugin-calendar/src/index.ts new file mode 100644 index 000000000..7ddad5814 --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/src/index.ts @@ -0,0 +1 @@ +export { default } from './server'; diff --git a/packages/plugins/@nocobase/plugin-calendar/src/locale/en_US.ts b/packages/plugins/@nocobase/plugin-calendar/src/locale/en_US.ts new file mode 100644 index 000000000..a0a1f70d1 --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/src/locale/en_US.ts @@ -0,0 +1,45 @@ +export default { + "Configure calendar": "Configure calendar", + "Title field": "Title field", + "Custom title": "Custom title", + "Show lunar": "Show lunar", + "Start date field": "Start date field", + "End date field": "End date field", + "Work week": "Work week", + "Today": "Today", + "Day": "Day", + "Agenda": "Agenda", + "Date": "Date", + "Time": "Time", + "Event": "Event", + "None": "None", + "Calendar": "Calendar", + "Delete events": "Delete events", + "This event": "This event", + "This and following events": "This and following events", + "All events": "All events", + "Delete this event?": "Delete this event?", + "Delete Event": "Delete Event", + "Calendar collection": "Calendar collection", + "Create calendar block": "Create calendar block", + "Filter": "Filter", + "Configure actions": "Configure actions", + "Enable actions": "Enable actions", + "Turn pages": "Turn pages", + "Select view": "Select view", + "Add new": "Add new", + "View record": "View record", + "Details": "Details", + "Customize": "Customize", + "Popup": "Popup", + "Updated successfully": "Updated successfully", + "Custom request": "Custom request", + "Edit": "Edit", + "Delete": "Delete", + "Print": "Print", + "Daily": "Daily", + "Weekly": "Weekly", + "Monthly": "Monthly", + "Yearly": "Yearly", + "Repeats": "Repeats" +}; diff --git a/packages/plugins/@nocobase/plugin-calendar/src/locale/es_ES.ts b/packages/plugins/@nocobase/plugin-calendar/src/locale/es_ES.ts new file mode 100644 index 000000000..01e916786 --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/src/locale/es_ES.ts @@ -0,0 +1,45 @@ +export default { + "Configure calendar": "Configurar calendario", + "Title field": "Campo de título", + "Custom title": "Título personalizado", + "Show lunar": "Mostrar lunar", + "Start date field": "Campo de fecha de inicio", + "End date field": "Campo de fecha de final", + "Work week": "Semana de trabajo", + "Today": "Hoy", + "Day": "Día", + "Agenda": "Agenda", + "Date": "Fecha", + "Time": "Hora", + "Event": "Evento", + "None": "Ninguno", + "Calendar": "Calendario", + "Delete events": "Borrar eventos", + "This event": "Este evento", + "This and following events": "Este y los siguientes eventos", + "All events": "Todos los eventos", + "Delete this event?": "¿Borrar este evento?", + "Delete Event": "Borrar evento", + "Calendar collection": "Colección de calendarios", + "Create calendar block": "Crear bloque de calendario", + "Filter": "Filtro", + "Configure actions": "Configurar acciones", + "Enable actions": "Activar acciones", + "Turn pages": "Pasar páginas", + "Select view": "Seleccionar vista", + "Add new": "Añadir nuevo", + "View record": "Ver registro", + "Details": "Detalles", + "Customize": "Personalizar", + "Popup": "Popup", + "Updated successfully": "Actualizado correctamente", + "Custom request": "Petición personalizada", + "Edit": "Editar", + "Delete": "Borrar", + "Print": "Imprimir", + "Daily": "Diario", + "Weekly": "Semanal", + "Monthly": "Mensual", + "Yearly": "Anual", + "Repeats": "se repite" +}; diff --git a/packages/plugins/@nocobase/plugin-calendar/src/locale/fr_FR.ts b/packages/plugins/@nocobase/plugin-calendar/src/locale/fr_FR.ts new file mode 100644 index 000000000..2f32f7946 --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/src/locale/fr_FR.ts @@ -0,0 +1,45 @@ +export default { + "Configure calendar": "Configurer le calendrier", + "Title field": "Champ de titre", + "Custom title": "Titre personnalisé", + "Show lunar": "Afficher le calendrier lunaire", + "Start date field": "Champ de date de début", + "End date field": "Champ de date de fin", + "Work week": "Semaine de travail", + "Today": "Aujourd'hui", + "Day": "Jour", + "Agenda": "Agenda", + "Date": "Date", + "Time": "Heure", + "Event": "Événement", + "None": "Aucun", + "Calendar": "Calendrier", + "Delete events": "Supprimer les événements", + "This event": "Cet événement", + "This and following events": "Cet événement et les suivants", + "All events": "Tous les événements", + "Delete this event?": "Supprimer cet événement ?", + "Delete Event": "Supprimer l'événement", + "Calendar collection": "Collection de calendrier", + "Create calendar block": "Créer un bloc de calendrier", + "Filter": "Filtrer", + "Configure actions": "Configurer les actions", + "Enable actions": "Activer les actions", + "Turn pages": "Tourner les pages", + "Select view": "Sélectionner la vue", + "Add new": "Ajouter nouveau", + "View record": "Voir l'enregistrement", + "Details": "Détails", + "Customize": "Personnaliser", + "Popup": "Popup", + "Updated successfully": "Mis à jour avec succès", + "Custom request": "Requête personnalisée", + "Edit": "Modifier", + "Delete": "Supprimer", + "Print": "Imprimer", + "Daily": "Quotidien", + "Weekly": "Hebdomadaire", + "Monthly": "Mensuel", + "Yearly": "Annuel", + "Repeats": "Répétitions" +}; diff --git a/packages/plugins/@nocobase/plugin-calendar/src/locale/index.ts b/packages/plugins/@nocobase/plugin-calendar/src/locale/index.ts new file mode 100644 index 000000000..863344e28 --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/src/locale/index.ts @@ -0,0 +1,16 @@ +import { i18n } from '@nocobase/client'; +import { useTranslation as useT } from 'react-i18next'; + +export const NAMESPACE = 'calendar'; + +export function i18nt(key: string, options: any = {}) { + return i18n.t(key, { ns: NAMESPACE, ...options }); +} + +export function generateNTemplate(key: string) { + return `{{t('${key}', { ns: '${NAMESPACE}' })}}`; +} + +export function useTranslation() { + return useT(NAMESPACE); +} diff --git a/packages/plugins/@nocobase/plugin-calendar/src/locale/ja_JP.ts b/packages/plugins/@nocobase/plugin-calendar/src/locale/ja_JP.ts new file mode 100644 index 000000000..879ff4c7b --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/src/locale/ja_JP.ts @@ -0,0 +1,32 @@ +export default { + "Configure calendar": "カレンダーの設定", + "Title field": "タイトルフィールド", + "Start date field": "開始日フィールド", + "End date field": "終了日フィールド", + "Work week": "稼働日", + "Today": "今日", + "Day": "日", + "Agenda": "アジェンダ", + "Date": "日付", + "Time": "時間", + "Event": "イベント", + "None": "なし", + "Calendar": "カレンダー", + "Calendar collection": "カレンダデータテーブル", + "Create calendar block": "カレンダーブロックの作成", + "Filter": "フィルター", + "Configure actions": "操作の設定", + "Enable actions": "有効な操作", + "Turn pages": "ページをめくる", + "Select view": "ビューの切り替え", + "Add new": "追加", + "View record": "レコードを見る", + "Details": "詳細", + "Customize": "カスタマイズ", + "Popup": "ポップアップ", + "Updated successfully": "更新成功", + "Custom request": "カスタムリクエスト", + "Edit": "編集", + "Delete": "削除", + "Print": "Print" +} diff --git a/packages/plugins/@nocobase/plugin-calendar/src/locale/pt_BR.ts b/packages/plugins/@nocobase/plugin-calendar/src/locale/pt_BR.ts new file mode 100644 index 000000000..11e2db789 --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/src/locale/pt_BR.ts @@ -0,0 +1,42 @@ +export default { + "Configure calendar": "Configurar calendário", + "Title field": "Campo de título", + "Custom title": "Título personalizado", + "Show lunar": "Mostrar calendário lunar", + "Start date field": "Campo de data de início", + "End date field": "Campo de data de término", + "Work week": "Semana de trabalho", + "Today": "Hoje", + "Day": "Dia", + "Agenda": "Agenda", + "Date": "Data", + "Time": "Hora", + "Event": "Evento", + "None": "Nenhum", + "Calendar": "Calendário", + "Delete events": "Excluir eventos", + "This event": "Este evento", + "This and following events": "Este e os próximos eventos", + "All events": "Todos os eventos", + "Delete this event?": "Excluir este evento?", + "Delete Event": "Excluir Evento", + "Calendar collection": "Coleção de calendário", + "Create calendar block": "Criar bloco de calendário", + "Filter": "Filtro", + "Configure actions": "Configurar ações", + "Enable actions": "Ativar ações", + "Turn pages": "Virar páginas", + "Select view": "Selecionar visualização", + "Add new": "Adicionar novo", + "View record": "Visualizar registro", + "Details": "Detalhes", + "Customize": "Customizar", + "Popup": "Pop-up", + "Edit": "Editar", + "Delete": "Excluir", + "Daily": "Diário", + "Weekly": "Semanal", + "Monthly": "Mensal", + "Yearly": "Anual", + "Repeats": "Repete" +} diff --git a/packages/plugins/@nocobase/plugin-calendar/src/locale/ru_RU.ts b/packages/plugins/@nocobase/plugin-calendar/src/locale/ru_RU.ts new file mode 100644 index 000000000..84e737d88 --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/src/locale/ru_RU.ts @@ -0,0 +1,31 @@ +export default { + "Configure calendar": "Настроить календарь", + "Title field": "Поле заголовка", + "Start date field": "Поле даты начала", + "End date field": "Поле даты окончания", + "Work week": "Рабочая неделя", + "Today": "Сегодня", + "Day": "День", + "Agenda": "Расписание", + "Date": "Дата", + "Time": "Время", + "Event": "Событие", + "None": "Ничего", + "Calendar": "Календарь", + "Create calendar block": "Создать блок календаря", + "Filter": "Фильтр", + "Configure actions": "Настройка действий", + "Enable actions": "Разрешить действия", + "Turn pages": "Перелистывать страницы", + "Select view": "Выбрать вид", + "Add new": "Добавить новый", + "View record": "Показать запись", + "Details": "Подробности", + "Customize": "Настроить", + "Popup": "Всплывающий", + "Updated successfully": "Успешно обновлено", + "Custom request": "Пользовательский запрос", + "Edit": "Изменить", + "Delete": "Удалить", + "Print": "Печать" +} diff --git a/packages/plugins/@nocobase/plugin-calendar/src/locale/tr_TR.ts b/packages/plugins/@nocobase/plugin-calendar/src/locale/tr_TR.ts new file mode 100644 index 000000000..b13d86293 --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/src/locale/tr_TR.ts @@ -0,0 +1,31 @@ +export default { + "Configure calendar": "Takvimi yapılandır", + "Title field": "Başlık alanı", + "Start date field": "Başlangıç tarihi alanı", + "End date field": "Bitiş tarihi alanı", + "Work week": "Çalışma Haftası", + "Today": "Bugün", + "Day": "Gün", + "Agenda": "Ajanda", + "Date": "Tarih", + "Time": "Saat", + "Event": "Olay", + "None": "Boş", + "Calendar": "Takvim", + "Create calendar block": "Takvim bloğu oluştur", + "Filter": "Filtre", + "Configure actions": "İşlemleri yapılandır", + "Enable actions": "İşlemleri aktifleştir", + "Turn pages": "Sayfaları çevir", + "Select view": "Görünüm seç", + "Add new": "Yeni Ekle", + "View record": "Görüntüle", + "Details": "Detaylar", + "Customize": "Özelleştir", + "Popup": "Açılır Pencere", + "Updated successfully": "Başarıyla güncellendi", + "Custom request": "Özel istek", + "Edit": "Düzenle", + "Delete": "Sil", + "Print": "Yazdır" +} diff --git a/packages/plugins/@nocobase/plugin-calendar/src/locale/uk_UA.ts b/packages/plugins/@nocobase/plugin-calendar/src/locale/uk_UA.ts new file mode 100644 index 000000000..f7cc367a1 --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/src/locale/uk_UA.ts @@ -0,0 +1,45 @@ +export default { + "Configure calendar": "Налаштувати календар", + "Title field": "Поле заголовка", + "Custom title": "Власний заголовок", + "Show lunar": "Показати місячний календар", + "Start date field": "Поле початкової дати", + "End date field": "Поле кінцевої дати", + "Work week": "Робочий тиждень", + "Today": "Сьогодні", + "Day": "День", + "Agenda": "Порядок денний", + "Date": "Дата", + "Time": "Час", + "Event": "Подія", + "None": "Немає", + "Calendar": "Календар", + "Delete events": "Видалити події", + "This event": "Ця подія", + "This and following events": "Ця та наступні події", + "All events": "Усі події", + "Delete this event?": "Видалити цю подію?", + "Delete Event": "Видалити подію", + "Calendar collection": "Календарна колекція", + "Create calendar block": "Створити блок календаря", + "Filter": "Фільтр", + "Configure actions": "Налаштувати дії", + "Enable actions": "Увімкнути дії", + "Turn pages": "Переключати сторінки", + "Select view": "Вибрати перегляд", + "Add new": "Додати новий", + "View record": "Переглянути запис", + "Details": "Деталі", + "Customize": "Налаштувати", + "Popup": "Спливаюче вікно", + "Updated successfully": "Оновлено успішно", + "Custom request": "Власний запит", + "Edit": "Редагувати", + "Delete": "Видалити", + "Print": "Друк", + "Daily": "Щоденно", + "Weekly": "Щотижня", + "Monthly": "Щомісяця", + "Yearly": "Щороку", + "Repeats": "Повторюється" +}; diff --git a/packages/plugins/@nocobase/plugin-calendar/src/locale/zh-CN.ts b/packages/plugins/@nocobase/plugin-calendar/src/locale/zh-CN.ts new file mode 100644 index 000000000..14b3c2644 --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/src/locale/zh-CN.ts @@ -0,0 +1,46 @@ +export default { + 'Configure calendar': '配置日历', + 'Title field': '标题字段', + 'Custom title': '自定义标题', + 'Show lunar': '展示农历', + 'Start date field': '开始日期字段', + 'End date field': '结束日期字段', + 'Work week': '工作日', + Today: '今天', + Day: '天', + Agenda: '列表', + Date: '日期', + Time: '时间', + Event: '事件', + None: '无', + Calendar: '日历', + 'Delete events': '删除日程', + 'This event': '此日程', + 'This and following events': '此日程及后续日程', + 'All events': '所有日程', + 'Delete this event?': '是否删除这个日程?', + 'Delete Event': '删除日程', + 'Calendar collection': '日历数据表', + 'Create calendar block': '创建日历区块', + Filter: '筛选', + 'Configure actions': '配置操作', + 'Enable actions': '启用操作', + 'Turn pages': '翻页', + 'Select view': '切换视图', + 'Add new': '添加', + 'View record': '查看数据', + 'Details': '详情', + Customize: '自定义', + 'Update record': '更新数据', + 'Popup': '弹窗', + "Updated successfully": "更新成功", + 'Custom request': '自定义请求', + 'Edit': '编辑', + Delete: '删除', + Print: '打印', + Daily: '每天', + Weekly: '每周', + Monthly: '每月', + Yearly: '每年', + Repeats: '重复', +}; diff --git a/packages/plugins/@nocobase/plugin-calendar/src/server/index.ts b/packages/plugins/@nocobase/plugin-calendar/src/server/index.ts new file mode 100644 index 000000000..7ddad5814 --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/src/server/index.ts @@ -0,0 +1 @@ +export { default } from './server'; diff --git a/packages/plugins/@nocobase/plugin-calendar/src/server/server.ts b/packages/plugins/@nocobase/plugin-calendar/src/server/server.ts new file mode 100644 index 000000000..907c44bc6 --- /dev/null +++ b/packages/plugins/@nocobase/plugin-calendar/src/server/server.ts @@ -0,0 +1,3 @@ +import { Plugin } from '@nocobase/server'; + +export default class PluginCalendarServer extends Plugin {} diff --git a/packages/presets/nocobase/package.json b/packages/presets/nocobase/package.json index 092c59a29..fa6da354b 100644 --- a/packages/presets/nocobase/package.json +++ b/packages/presets/nocobase/package.json @@ -14,6 +14,7 @@ "@nocobase/plugin-api-keys": "0.18.0-alpha.1", "@nocobase/plugin-audit-logs": "0.18.0-alpha.1", "@nocobase/plugin-auth": "0.18.0-alpha.1", + "@nocobase/plugin-calendar": "0.18.0-alpha.1", "@nocobase/plugin-cas": "0.18.0-alpha.1", "@nocobase/plugin-charts": "0.18.0-alpha.1", "@nocobase/plugin-china-region": "0.18.0-alpha.1", diff --git a/packages/presets/nocobase/src/server/index.ts b/packages/presets/nocobase/src/server/index.ts index 40e0ec6f6..e4f242747 100644 --- a/packages/presets/nocobase/src/server/index.ts +++ b/packages/presets/nocobase/src/server/index.ts @@ -36,6 +36,7 @@ export class PresetNocoBase extends Plugin { 'auth', 'sms-auth', 'custom-request', + 'calendar', 'action-bulk-update', 'action-bulk-edit', 'gantt',