refactor: @hera/plugin-core, departments-plugin (#979)

Reviewed-on: daoyoucloud/tachybase#979
Co-authored-by: bai.zixv <bai.zixv@foxmail.com>
Co-committed-by: bai.zixv <bai.zixv@foxmail.com>
This commit is contained in:
bai.zixv 2024-05-28 10:43:58 +08:00 committed by sealday
parent 84608f9a3e
commit 236c308d23
246 changed files with 6531 additions and 2891 deletions

View File

@ -1,5 +1,5 @@
import { SchemaSettingOptions, SchemaSettingsItemType, SchemaSettingsItemTypeWithoutName } from './types';
import { defaultSettingItems } from './SchemaSettingsDefaults';
import { SchemaSettingOptions, SchemaSettingsItemType, SchemaSettingsItemTypeWithoutName } from './types';
export class SchemaSettings<T = {}> {
options: SchemaSettingOptions<T>;

View File

@ -1,4 +1,4 @@
import React, { FC, ReactNode, createContext, useContext, useMemo } from 'react';
import React, { createContext, FC, ReactNode, useContext, useMemo } from 'react';
import { ACLCollectionProvider } from '../../acl/ACLProvider';
import { UseRequestOptions, UseRequestService } from '../../api-client';
@ -6,9 +6,9 @@ import { withDynamicSchemaProps } from '../../application/hoc';
import { Designable, useDesignable } from '../../schema-component';
import { AssociationProvider, CollectionManagerProvider, CollectionOptions, CollectionProvider } from '../collection';
import { CollectionRecord } from '../collection-record';
import { ConfigSettingProvider } from './context/ConfigSetting.provider';
import { BlockRequestProvider } from './DataBlockRequestProvider';
import { DataBlockResourceProvider } from './DataBlockResourceProvider';
import { ConfigSettingProvider } from './context/ConfigSetting.provider';
export interface AllDataBlockProps {
collection: string | CollectionOptions;

View File

@ -1,7 +1,9 @@
import { useCallback, useEffect, useState } from 'react';
import { Schema, useFieldSchema } from '@tachybase/schema';
import { flatten, getValuesByPath } from '@tachybase/utils/client';
import _ from 'lodash';
import { useCallback, useEffect, useState } from 'react';
import { FilterTarget, findFilterTargets } from '../block-provider/hooks';
import {
Collection_deprecated,

View File

@ -1,21 +1,22 @@
import { useContextConfigSetting } from '@tachybase/client';
import { ArrayCollapse, FormLayout } from '@tachybase/components';
import { Field } from '@tachybase/schema';
import { ISchema, useField, useFieldSchema } from '@tachybase/schema';
import { Field, ISchema, useField, useFieldSchema } from '@tachybase/schema';
import _ from 'lodash';
import { useTranslation } from 'react-i18next';
import { useApp, useSchemaToolbar } from '../../../../application';
import { SchemaSettings } from '../../../../application/schema-settings/SchemaSettings';
import { useFormBlockContext } from '../../../../block-provider';
import { useCollectionManager_deprecated, useCollection_deprecated } from '../../../../collection-manager';
import { useCollection_deprecated, useCollectionManager_deprecated } from '../../../../collection-manager';
import { useFieldComponentName } from '../../../../common/useFieldComponentName';
import { useDesignable, useValidateSchema } from '../../../../schema-component';
import { useIsFormReadPretty } from '../../../../schema-component/antd/form-item/FormItem.Settings';
import { getTempFieldState } from '../../../../schema-component/antd/form-v2/utils';
import { isPatternDisabled } from '../../../../schema-settings';
import { useIsAllowToSetDefaultValue } from '../../../../schema-settings/hooks/useIsAllowToSetDefaultValue';
import { ActionType } from '../../../../schema-settings/LinkageRules/type';
import { SchemaSettingsDefaultValue } from '../../../../schema-settings/SchemaSettingsDefaultValue';
import { useIsAllowToSetDefaultValue } from '../../../../schema-settings/hooks/useIsAllowToSetDefaultValue';
import { useContextConfigSetting } from '@tachybase/client';
export const fieldSettingsFormItem = new SchemaSettings({
name: 'fieldSettings:FormItem',

View File

@ -1,9 +1,10 @@
import { ArrayItems } from '@tachybase/components';
import { ISchema } from '@tachybase/schema';
import { useField, useFieldSchema } from '@tachybase/schema';
import _ from 'lodash';
import { useMemo } from 'react';
import { ArrayItems } from '@tachybase/components';
import { ISchema, useField, useFieldSchema } from '@tachybase/schema';
import _ from 'lodash';
import { useTranslation } from 'react-i18next';
import { SchemaSettings } from '../../../../application/schema-settings/SchemaSettings';
import { useFormBlockContext } from '../../../../block-provider';
import { useCollection_deprecated, useSortFields } from '../../../../collection-manager';
@ -16,9 +17,9 @@ import {
screenSizeTitleMaps,
} from '../../../../schema-component/antd/grid-card/options';
import { SchemaSettingsTemplate } from '../../../../schema-settings';
import { columnCountMarks } from './utils';
import { SchemaSettingsDataScope } from '../../../../schema-settings/SchemaSettingsDataScope';
import { setDataLoadingModeSettingsItem } from '../details-multi/setDataLoadingModeSettingsItem';
import { columnCountMarks } from './utils';
export const gridCardBlockSettings = new SchemaSettings({
name: 'blockSettings:gridCard',

View File

@ -1,8 +1,11 @@
import { Field, useField, useFieldSchema } from '@tachybase/schema';
import { SchemaSettings } from '../../../../application/schema-settings/SchemaSettings';
import { useColumnSchema } from '../../../../schema-component/antd/table-v2/Table.Column.Decorator';
import { useDesignable } from '../../../../schema-component';
import { useTranslation } from 'react-i18next';
import { SchemaSettings } from '../../../../application/schema-settings/SchemaSettings';
import { useDesignable } from '../../../../schema-component';
import { useColumnSchema } from '../../../../schema-component/antd/table-v2/Table.Column.Decorator';
export const checkboxComponentFieldSettings = new SchemaSettings({
name: 'fieldSettings:component:Checkbox',
items: [

View File

@ -1,10 +1,11 @@
import { observer, RecursionField, useField, useFieldSchema } from '@tachybase/schema';
import React from 'react';
import { observer, RecursionField, useField, useFieldSchema } from '@tachybase/schema';
import { useActionContext } from '.';
import { ActionDrawer } from './Action.Drawer';
import { ActionSheet } from './Action.Sheet';
import { ActionModal } from './Action.Modal';
import { ActionPage } from './Action.Page';
import { ActionSheet } from './Action.Sheet';
import { ComposedActionDrawer } from './types';
export const ActionContainer: ComposedActionDrawer = observer(

View File

@ -1,6 +1,8 @@
import { Schema } from '@tachybase/schema';
import { DrawerProps, ModalProps } from 'antd';
import React, { createContext } from 'react';
import { Schema } from '@tachybase/schema';
import { DrawerProps, ModalProps } from 'antd';
import { useActionContext } from './hooks';
export const ActionContext = createContext<ActionContextProps>({});

View File

@ -1,8 +1,10 @@
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { CloseCircleFilled } from '@ant-design/icons';
import { Tag, TreeSelect } from 'antd';
import type { DefaultOptionType, TreeSelectProps } from 'rc-tree-select/es/TreeSelect';
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { useTranslation } from 'react-i18next';
import {
CollectionFieldOptions_deprecated,
parseCollectionName,

View File

@ -1,15 +1,25 @@
import { LoadingOutlined, PlusOutlined } from '@ant-design/icons';
import { onFieldInputValueChange } from '@tachybase/schema';
import { RecursionField, connect, mapProps, observer, useField, useFieldSchema, useForm } from '@tachybase/schema';
import { uid } from '@tachybase/schema';
import { Space, message } from 'antd';
import { isFunction } from 'mathjs';
import React, { useEffect, useMemo, useState } from 'react';
import {
connect,
mapProps,
observer,
onFieldInputValueChange,
RecursionField,
uid,
useField,
useFieldSchema,
useForm,
} from '@tachybase/schema';
import { LoadingOutlined, PlusOutlined } from '@ant-design/icons';
import { message, Space } from 'antd';
import { isFunction } from 'mathjs';
import { useTranslation } from 'react-i18next';
import { RecordProvider, useAPIClient, useApp, useCollectionRecordData } from '../../../';
import { isVariable } from '../../../variables/utils/isVariable';
import { getInnermostKeyAndValue } from '../../common/utils/uitls';
import { RemoteSelectProps, RemoteSelect } from '../remote-select';
import { RemoteSelect, RemoteSelectProps } from '../remote-select';
import useServiceOptions, { useAssociationFieldContext } from './hooks';
export type AssociationSelectProps<P = any> = RemoteSelectProps<P> & {

View File

@ -1,13 +1,14 @@
import React from 'react';
import { connect, isValid, mapProps, mapReadPretty, useField } from '@tachybase/schema';
import { CheckOutlined, CloseOutlined } from '@ant-design/icons';
import { connect, mapProps, mapReadPretty, useField } from '@tachybase/schema';
import { isValid } from '@tachybase/schema';
import { Checkbox as AntdCheckbox, Radio, Tag } from 'antd';
import type { CheckboxGroupProps, CheckboxProps } from 'antd/es/checkbox';
import uniq from 'lodash/uniq';
import React from 'react';
import { useTranslation } from 'react-i18next';
import { useCollectionField } from '../../../data-source/collection-field/CollectionFieldProvider';
import { EllipsisWithTooltip } from '../input/EllipsisWithTooltip';
import { useTranslation } from 'react-i18next';
type ComposedCheckbox = React.ForwardRefExoticComponent<
Pick<Partial<any>, string | number | symbol> & React.RefAttributes<unknown>

View File

@ -1,11 +1,11 @@
import { FormLayout } from '@tachybase/components';
import { createForm } from '@tachybase/schema';
import { FormContext, useField, useFieldSchema } from '@tachybase/schema';
import React, { createContext, useContext, useEffect, useMemo } from 'react';
import { BlockProvider, useBlockRequestContext, useParsedFilter } from '../../../block-provider';
import useStyles from './GridCard.Decorator.style';
import { useGridCardBlockParams } from '../../../modules/blocks/data-blocks/grid-card/hooks/useGridCardBlockParams';
import { FormLayout } from '@tachybase/components';
import { createForm, FormContext, useField, useFieldSchema } from '@tachybase/schema';
import { withDynamicSchemaProps } from '../../../application/hoc/withDynamicSchemaProps';
import { BlockProvider, useBlockRequestContext, useParsedFilter } from '../../../block-provider';
import { useGridCardBlockParams } from '../../../modules/blocks/data-blocks/grid-card/hooks/useGridCardBlockParams';
import useStyles from './GridCard.Decorator.style';
export const GridCardBlockContext = createContext<any>({});
GridCardBlockContext.displayName = 'GridCardBlockContext';

View File

@ -1,8 +1,10 @@
import React, { ReactNode, useEffect, useRef, useState } from 'react';
import { getScrollParent, merge } from '@tachybase/utils/client';
import { useLockFn, useThrottleFn } from 'ahooks';
import { Spin } from 'antd';
import React, { ReactNode, useEffect, useRef, useState } from 'react';
import { useTranslation } from 'react-i18next';
import useStyles from './style';
function isWindow(element: any | Window): element is Window {

View File

@ -1,7 +1,7 @@
import { createForm } from '@tachybase/schema';
import { Schema } from '@tachybase/schema';
// import { Spin } from 'antd';
import React, { PropsWithChildren, useMemo } from 'react';
import { createForm, Schema } from '@tachybase/schema';
import { useRequest } from '../../api-client';
import { useSchemaComponentContext } from '../hooks';
import { FormProvider } from './FormProvider';

View File

@ -1,7 +1,9 @@
import { useField, useFieldSchema } from '@tachybase/schema';
import { Select } from 'antd';
import React from 'react';
import { useField, useFieldSchema } from '@tachybase/schema';
import { Select } from 'antd';
import { useTranslation } from 'react-i18next';
import { SchemaInitializerItem, SchemaInitializerSelect } from '../application';
import { useDesignable } from '../schema-component';
import { SchemaSettingsSelectItem } from '../schema-settings';

View File

@ -39,21 +39,21 @@ import { filterCollapseItemFieldSettings } from '../modules/blocks/filter-blocks
import { filterFormBlockSettings } from '../modules/blocks/filter-blocks/form/filterFormBlockSettings';
import { filterFormItemFieldSettings } from '../modules/blocks/filter-blocks/form/filterFormItemFieldSettings';
import { markdownBlockSettings } from '../modules/blocks/other-blocks/markdown/markdownBlockSettings';
import { cascadeSelectComponentFieldSettings } from '../modules/fields/component/CascadeSelect/cascadeSelectComponentFieldSettings';
import { cascaderComponentFieldSettings } from '../modules/fields/component/Cascader/cascaderComponentFieldSettings';
import { cascadeSelectComponentFieldSettings } from '../modules/fields/component/CascadeSelect/cascadeSelectComponentFieldSettings';
import { checkboxComponentFieldSettings } from '../modules/fields/component/Checkbox/checkboxComponentFieldSettings';
import { datePickerComponentFieldSettings } from '../modules/fields/component/DatePicker/datePickerComponentFieldSettings';
import { drawerSubTableComponentFieldSettings } from '../modules/fields/component/DrawerSubTable/drawerSubTableComponentFieldSettings';
import { fileManagerComponentFieldSettings } from '../modules/fields/component/FileManager/fileManagerComponentFieldSettings';
import { uploadAttachmentComponentFieldSettings } from '../modules/fields/component/FileManager/uploadAttachmentComponentFieldSettings';
import { inputNumberComponentFieldSettings } from '../modules/fields/component/InputNumber/inputNumberComponentFieldSettings';
import { subformComponentFieldSettings } from '../modules/fields/component/Nester/subformComponentFieldSettings';
import { recordPickerComponentFieldSettings } from '../modules/fields/component/Picker/recordPickerComponentFieldSettings';
import { subformPopoverComponentFieldSettings } from '../modules/fields/component/PopoverNester/subformPopoverComponentFieldSettings';
import { drawerSubTableComponentFieldSettings } from '../modules/fields/component/DrawerSubTable/drawerSubTableComponentFieldSettings';
import { selectComponentFieldSettings } from '../modules/fields/component/Select/selectComponentFieldSettings';
import { subTablePopoverComponentFieldSettings } from '../modules/fields/component/SubTable/subTablePopoverComponentFieldSettings';
import { tagComponentFieldSettings } from '../modules/fields/component/Tag/tagComponentFieldSettings';
import { unixTimestampComponentFieldSettings } from '../modules/fields/component/UnixTimestamp/unixTimestampComponentFieldSettings';
import { inputNumberComponentFieldSettings } from '../modules/fields/component/InputNumber/inputNumberComponentFieldSettings';
import { checkboxComponentFieldSettings } from '../modules/fields/component/Checkbox/checkboxComponentFieldSettings';
export class SchemaSettingsPlugin extends Plugin {
async load() {

View File

@ -1,4 +1,5 @@
import lodash from 'lodash';
import { dayjs } from './dayjs';
export * from './collections-graph';

View File

@ -1,6 +1,7 @@
import { SchemaInitializerItem, useSchemaInitializer, useSchemaInitializerItem } from '@tachybase/client';
import React from 'react';
import { SchemaInitializerItem, useSchemaInitializer, useSchemaInitializerItem } from '@tachybase/client';
import { ISchema } from '@tachybase/schema';
import { CalendarOutline } from 'antd-mobile-icons';
export const ApprovalBlockInitializer = () => {

View File

@ -1,13 +1,15 @@
import React, { useMemo } from 'react';
import { createStyles, useCurrentUserContext } from '@tachybase/client';
import { EXECUTION_STATUS } from '@tachybase/plugin-workflow/client';
import { dayjs } from '@tachybase/utils/client';
import { Space, Steps, Tag } from 'antd-mobile';
import _ from 'lodash';
import React, { useMemo } from 'react';
import { APPROVAL_ACTION_STATUS, APPROVAL_STATUS, ApprovalStatusEnums, approvalStatusOptions } from '../constants';
import { lang, usePluginTranslation, useTranslation } from '../locale';
import { useContextApprovalExecution } from '../context/ApprovalExecution';
import { ContextWithActionEnabled } from '../context/WithActionEnabled';
import { Space, Steps, Tag } from 'antd-mobile';
import { dayjs } from '@tachybase/utils/client';
import { lang, usePluginTranslation, useTranslation } from '../locale';
export const ApprovalProcess = (props) => {
const { t } = usePluginTranslation();

View File

@ -1,8 +1,9 @@
import React, { useState } from 'react';
import { observer } from '@tachybase/schema';
import { dayjs } from '@tachybase/utils/client';
import { AutoCenter, Button, DatePicker, Grid, Popup, Space, Toast } from 'antd-mobile';
import { DownOutline } from 'antd-mobile-icons';
import React, { useState } from 'react';
export const ApprovalReachDataType = observer((props) => {
const { changeFilter, filter } = props as any;

View File

@ -1,8 +1,10 @@
import React, { useEffect, useState } from 'react';
import { useAPIClient } from '@tachybase/client';
import { observer, useFieldSchema } from '@tachybase/schema';
import { Picker, Space } from 'antd-mobile';
import { DownOutline } from 'antd-mobile-icons';
import React, { useEffect, useState } from 'react';
import { useTranslation } from '../locale';
export const ApprovalTemplateType = observer((props) => {

View File

@ -1,5 +1,6 @@
import { JOB_STATUS } from '@tachybase/plugin-workflow/client';
import { NAMESPACE, lang, tval } from './locale';
import { lang, NAMESPACE, tval } from './locale';
/**显示状态 */
export const APPROVAL_STATUS = {

View File

@ -1,4 +1,5 @@
import { createContext, useContext } from 'react';
import { ApprovalExecution } from '../todos/interface/interface';
export const ContextApprovalExecution = createContext<Partial<ApprovalExecution>>({});

View File

@ -1,4 +1,4 @@
import React from 'react';
import React, { Fragment, useContext, useMemo, useRef } from 'react';
import {
BlockRequestContext_deprecated,
CollectionProvider_deprecated,
@ -11,8 +11,8 @@ import {
useAssociationNames,
useDesignable,
} from '@tachybase/client';
import { RecursionField, createForm, useField, useFieldSchema } from '@tachybase/schema';
import { Fragment, useContext, useMemo, useRef } from 'react';
import { createForm, RecursionField, useField, useFieldSchema } from '@tachybase/schema';
import { useContextApprovalExecution } from './ApprovalExecution';
export const FormBlockProvider = (props) => {

View File

@ -1,5 +1,5 @@
import { SchemaComponentContext, useSchemaComponentContext } from '@tachybase/client';
import React from 'react';
import { SchemaComponentContext, useSchemaComponentContext } from '@tachybase/client';
export function SchemaComponentContextProvider({ designable, children }) {
const schemaComponentContext = useSchemaComponentContext();

View File

@ -1,13 +1,14 @@
import { Plugin } from '@tachybase/client';
import { ApprovalBlockInitializer } from './ApprovalBlockInitializer';
import { ApprovalSettings } from './ApprovalSettings';
import { TodosBlock } from './todos/TodosBlock';
import { InitiationsBlock } from './initiations/InitiationsBlock';
import { LauncherActionConfigInitializer } from './initiations/config/LauncherActionConfig';
import { ViewActionTodosContent } from './todos/component/ViewActionTodosContent';
import { ViewActionUserInitiationsContent } from './initiations/component/ViewActionUserInitiationsContent';
import { ApprovalProcess } from './component/ApprovalProcess.view';
import { ViewActionInitiationsContent } from './initiations/component/ViewActionInitiationsContent';
import { ViewActionUserInitiationsContent } from './initiations/component/ViewActionUserInitiationsContent';
import { LauncherActionConfigInitializer } from './initiations/config/LauncherActionConfig';
import { InitiationsBlock } from './initiations/InitiationsBlock';
import { ViewActionTodosContent } from './todos/component/ViewActionTodosContent';
import { TodosBlock } from './todos/TodosBlock';
class PluginApproval extends Plugin {
async load() {

View File

@ -1,11 +1,13 @@
import { useAPIClient, useCurrentUserContext } from '@tachybase/client';
import { Badge, Empty, List, Space, Tag } from 'antd-mobile';
import React, { useContext, useEffect, useState } from 'react';
import { useDeepCompareEffect } from 'ahooks';
import { ApprovalPriorityType, ApprovalStatusEnums } from '../../constants';
import { useNavigate } from 'react-router-dom';
import { useTranslation } from '../../locale';
import { useAPIClient, useCurrentUserContext } from '@tachybase/client';
import { observer } from '@tachybase/schema';
import { useDeepCompareEffect } from 'ahooks';
import { Badge, Empty, List, Space, Tag } from 'antd-mobile';
import { useNavigate } from 'react-router-dom';
import { ApprovalPriorityType, ApprovalStatusEnums } from '../../constants';
import { useTranslation } from '../../locale';
import { InitiationsBlockContext } from '../InitiationsBlock';
export const ApprovalItem = observer((props) => {

View File

@ -1,8 +1,10 @@
import React, { useState } from 'react';
import { observer, useFieldSchema } from '@tachybase/schema';
import { Picker, Space } from 'antd-mobile';
import { DownOutline } from 'antd-mobile-icons';
import React, { useState } from 'react';
import { useTranslation } from '../../locale';
import { observer, useFieldSchema } from '@tachybase/schema';
export const ApprovalStatus = observer((props) => {
const { changeFilter, filter } = props as any;

View File

@ -1,11 +1,14 @@
import { BlockItem } from '@tachybase/client';
import { Space } from 'antd-mobile';
import React, { useState } from 'react';
import { BlockItem } from '@tachybase/client';
import { observer } from '@tachybase/schema';
import { ApprovalTemplateType } from '../../component/ApprovalTemplateType';
import { ApprovalStatus } from './ApprovalStatus';
import { ApprovalItem } from './ApprovalItem';
import { Space } from 'antd-mobile';
import { ApprovalReachDataType } from '../../component/ApprovalReachDataType';
import { ApprovalTemplateType } from '../../component/ApprovalTemplateType';
import { ApprovalItem } from './ApprovalItem';
import { ApprovalStatus } from './ApprovalStatus';
import '../../style/style.css';
export const UserInitiationsItem = observer((props) => {

View File

@ -1,7 +1,8 @@
import { SchemaInitializer } from '@tachybase/client';
import { LauncherActionConfigComponent } from './LauncherActionConfigComponent';
import { NAMESPACE } from '../../locale';
import { APPROVAL_ACTION_STATUS, APPROVAL_STATUS } from '../../constants';
import { NAMESPACE } from '../../locale';
import { LauncherActionConfigComponent } from './LauncherActionConfigComponent';
// 区块-配置操作
export const LauncherActionConfigInitializer = new SchemaInitializer({

View File

@ -1,5 +1,5 @@
import { ActionInitializer, useSchemaInitializerItem } from '@tachybase/client';
import React from 'react';
import { ActionInitializer, useSchemaInitializerItem } from '@tachybase/client';
// 区块-配置操作
export const LauncherActionConfigComponent = () => {

View File

@ -1,6 +1,8 @@
import { useAPIClient, useActionContext } from '@tachybase/client';
import { useActionContext, useAPIClient } from '@tachybase/client';
import { useField } from '@tachybase/schema';
import _ from 'lodash';
import { useContextApprovalExecution } from '../../context/ApprovalExecution';
export function useDestroyAction() {

View File

@ -1,9 +1,10 @@
import { useEffect } from 'react';
import { useCurrentUserContext } from '@tachybase/client';
import { useFlowContext } from '@tachybase/plugin-workflow/client';
import { useForm } from '@tachybase/schema';
import { useEffect } from 'react';
import { useContextApprovalExecution } from '../../context/ApprovalExecution';
import { ApprovalStatusEnums } from '../../constants';
import { useContextApprovalExecution } from '../../context/ApprovalExecution';
export function useFormBlockProps() {
const { approval, id } = useContextApprovalExecution();

View File

@ -1,9 +1,11 @@
import { useAPIClient, useActionContext } from '@tachybase/client';
import { useActionContext, useAPIClient } from '@tachybase/client';
import { useField, useForm } from '@tachybase/schema';
import { Toast } from 'antd-mobile';
import _ from 'lodash';
import { useContextApprovalExecution } from '../../context/ApprovalExecution';
import { useContextApprovalStatus } from '../provider/ApplyActionStatus';
import { Toast } from 'antd-mobile';
export function useUpdateSubmit() {
const from = useForm();

View File

@ -1,8 +1,10 @@
import { useAPIClient, useActionContext } from '@tachybase/client';
import { useActionContext, useAPIClient } from '@tachybase/client';
import { useField } from '@tachybase/schema';
import { useContextApprovalExecution } from '../../context/ApprovalExecution';
import { Toast } from 'antd-mobile';
import { useContextApprovalExecution } from '../../context/ApprovalExecution';
// 撤回
export function useWithdrawAction() {
const field = useField();

View File

@ -1,6 +1,7 @@
import { useCurrentUserContext } from '@tachybase/client';
import { useContextApprovalExecution } from '../../context/ApprovalExecution';
import { APPROVAL_ACTION_STATUS } from '../../constants';
import { useContextApprovalExecution } from '../../context/ApprovalExecution';
export function ActionBarProvider(props) {
const { data } = useCurrentUserContext();

View File

@ -1,7 +1,7 @@
import React, { useContext } from 'react';
import React, { createContext, useContext } from 'react';
import { useCurrentUserContext } from '@tachybase/client';
import { useFlowContext } from '@tachybase/plugin-workflow/client';
import { createContext } from 'react';
import { APPROVAL_ACTION_STATUS } from '../../constants';
import { useContextApprovalExecution } from '../../context/ApprovalExecution';

View File

@ -1,4 +1,5 @@
import { useCurrentUserContext } from '@tachybase/client';
import { APPROVAL_ACTION_STATUS } from '../../constants';
import { useContextApprovalExecution } from '../../context/ApprovalExecution';

View File

@ -1,4 +1,4 @@
import { tval as nTval, i18n } from '@tachybase/client';
import { i18n, tval as nTval } from '@tachybase/client';
export const NAMESPACE = '@hera/plugin-approval-mobile';

View File

@ -1,18 +1,22 @@
import { BlockItem, ExtendCollectionsProvider } from '@tachybase/client';
import { SearchBar, Space, Tabs } from 'antd-mobile';
import React, { useEffect, useState } from 'react';
import { TabApplicantType } from './component/TabApplicantType';
import { TabApprovalType } from './component/TabApprovalType';
import { TabApprovalItem } from './component/TabApprovalItem';
import { BlockItem, ExtendCollectionsProvider } from '@tachybase/client';
import { observer } from '@tachybase/schema';
import { SearchBar, Space, Tabs } from 'antd-mobile';
import { TabApplicantType } from './component/TabApplicantType';
import { TabApprovalItem } from './component/TabApprovalItem';
import { TabApprovalType } from './component/TabApprovalType';
import '../style/style.css';
import { CollectionApprovals } from '../collection/Approvals.collection';
import { CollectionApprovalTodos } from '../collection/ApprovalTodos';
import { CollectionFlowNodes } from '../collection/FlowNodes.collection';
import { CollectionWorkflows } from '../collection/Workflows.collection';
import { ApprovalReachDataType } from '../component/ApprovalReachDataType';
import { ApprovalTemplateType } from '../component/ApprovalTemplateType';
import { PendingStatus, ProcessedStatus } from '../constants';
import { CollectionWorkflows } from '../collection/Workflows.collection';
import { CollectionFlowNodes } from '../collection/FlowNodes.collection';
import { CollectionApprovals } from '../collection/Approvals.collection';
import { CollectionApprovalTodos } from '../collection/ApprovalTodos';
export const TodosBlock = observer((props) => {
const [filter, setFilter] = useState({

View File

@ -1,8 +1,10 @@
import React, { useEffect, useState } from 'react';
import { useAPIClient } from '@tachybase/client';
import { observer, useFieldSchema } from '@tachybase/schema';
import { Picker, Space } from 'antd-mobile';
import { DownOutline } from 'antd-mobile-icons';
import React, { useEffect, useState } from 'react';
import { useTranslation } from '../../locale';
export const TabApplicantType = observer((props) => {

View File

@ -1,8 +1,10 @@
import React, { useState } from 'react';
import { observer } from '@tachybase/schema';
import { Picker, Space } from 'antd-mobile';
import { DownOutline } from 'antd-mobile-icons';
import React, { useState } from 'react';
import { ProcessedStatus, approvalStatusOptions } from '../../constants';
import { approvalStatusOptions, ProcessedStatus } from '../../constants';
import { useTranslation } from '../../locale';
export const TabApprovalType = observer((props) => {

View File

@ -1,5 +1,6 @@
import { useFormBlockContext } from '@tachybase/client';
import { useEffect } from 'react';
import { useFormBlockContext } from '@tachybase/client';
import { useContextApprovalExecution } from '../../context/ApprovalExecution';
export function useApprovalDetailBlockProps() {

View File

@ -1,6 +1,8 @@
import { useAPIClient, useActionContext } from '@tachybase/client';
import { useActionContext, useAPIClient } from '@tachybase/client';
import { useField } from '@tachybase/schema';
import _ from 'lodash';
import { useContextApprovalExecution } from '../../context/ApprovalExecution';
export function useDestroyAction() {

View File

@ -1,8 +1,9 @@
import { useEffect } from 'react';
import { useCurrentUserContext } from '@tachybase/client';
import { useForm } from '@tachybase/schema';
import { useEffect } from 'react';
import { useContextApprovalExecution } from '../../context/ApprovalExecution';
import { ApprovalStatusEnumDict } from '../../constants';
import { useContextApprovalExecution } from '../../context/ApprovalExecution';
export function useFormBlockProps() {
const { approval, id, workflow } = useContextApprovalExecution();

View File

@ -1,8 +1,10 @@
import { useAPIClient, useActionContext } from '@tachybase/client';
import { useActionContext, useAPIClient } from '@tachybase/client';
import { useField, useForm } from '@tachybase/schema';
import { Toast } from 'antd-mobile';
import { useContextApprovalExecution } from '../../context/ApprovalExecution';
import { useContextApprovalAction } from '../provider/ApprovalAction';
import { Toast } from 'antd-mobile';
export function useSubmit() {
const field = useField();

View File

@ -1,9 +1,11 @@
import React from 'react';
import { ActionBarProvider as ClientActionBarProvider, useCompile } from '@tachybase/client';
import { str2moment } from '@tachybase/utils/client';
import { Space, Tag } from 'antd';
import { useContextApprovalExecution } from '../../context/ApprovalExecution';
import { approvalStatusOptions } from '../../constants';
import { useContextApprovalExecution } from '../../context/ApprovalExecution';
export function ActionBarProvider(props) {
const { status } = useContextApprovalExecution();

View File

@ -1,6 +1,6 @@
import React, { useContext } from 'react';
import React, { createContext, useContext } from 'react';
import { useCurrentUserContext } from '@tachybase/client';
import { createContext } from 'react';
import { APPROVAL_ACTION_STATUS } from '../../constants';
import { useContextApprovalExecution } from '../../context/ApprovalExecution';

View File

@ -1,5 +1,5 @@
import React, { useContext } from 'react';
import { createContext } from 'react';
import React, { createContext, useContext } from 'react';
import { useContextApprovalExecution } from '../../context/ApprovalExecution';
export interface ApprovalAction {

View File

@ -1,3 +1,4 @@
import React, { Fragment, useContext, useMemo, useRef } from 'react';
import {
BlockRequestContext_deprecated,
FormActiveFieldsProvider,
@ -8,9 +9,10 @@ import {
useCurrentUserContext,
useDesignable,
} from '@tachybase/client';
import { RecursionField, createForm, useField, useFieldSchema } from '@tachybase/schema';
import { createForm, RecursionField, useField, useFieldSchema } from '@tachybase/schema';
import _ from 'lodash';
import React, { Fragment, useContext, useMemo, useRef } from 'react';
import { useContextApprovalExecution } from '../../context/ApprovalExecution';
export function ApprovalFormBlockDecorator(props) {

View File

@ -1,4 +1,5 @@
import { useCurrentUserContext } from '@tachybase/client';
import { APPROVAL_ACTION_STATUS } from '../../constants';
import { useContextApprovalExecution } from '../../context/ApprovalExecution';

View File

@ -1,4 +1,5 @@
import { Plugin } from '@tachybase/client';
import PluginApproval from './approval';
export class PluginApprovalMobileClient extends Plugin {

View File

@ -1,4 +1,4 @@
import React from 'react';
import React, { Fragment, useContext, useMemo, useRef } from 'react';
import {
BlockRequestContext_deprecated,
CollectionProvider_deprecated,
@ -11,8 +11,8 @@ import {
useAssociationNames,
useDesignable,
} from '@tachybase/client';
import { RecursionField, createForm, useField, useFieldSchema } from '@tachybase/schema';
import { Fragment, useContext, useMemo, useRef } from 'react';
import { createForm, RecursionField, useField, useFieldSchema } from '@tachybase/schema';
import { useContextApprovalExecution } from '../usage/approval-block/common/ApprovalExecution.provider';
export const FormBlockProvider = (props) => {

View File

@ -1,5 +1,6 @@
import { useActionContext } from '@tachybase/client';
import React from 'react';
import { useActionContext } from '@tachybase/client';
import { ConfigButtonView } from '../../trigger/ConfigButton.view';
import { ContextApproverConfig } from '../Pd.ContextApproverConfig';

View File

@ -1,8 +1,9 @@
import { Plugin } from '@tachybase/client';
import PluginWorkflow from '@tachybase/plugin-workflow/client';
import { ApprovalInstruction } from './node.ApprovalInstruction';
import { ApproverActionConfigInitializer } from './approver-interface/Iz.ApproverActionConfig';
import { ApproverAddBlockInitializer } from './approver-interface/Iz.ApproverAddBlock';
import { ApprovalInstruction } from './node.ApprovalInstruction';
export class KitApprovalInstruction extends Plugin {
async load() {

View File

@ -1,4 +1,5 @@
import { Plugin } from '@tachybase/client';
import { KitApprovalInstruction } from './instruction/plugin';
import { KitApprovalTrigger } from './trigger/plugin';

View File

@ -1,6 +1,8 @@
import { ActionContextProvider } from '@tachybase/client';
import { Button } from 'antd';
import React, { useState } from 'react';
import { ActionContextProvider } from '@tachybase/client';
import { Button } from 'antd';
import { useTranslation } from '../../locale';
// 发起人操作界面->进入配置按钮

View File

@ -1,5 +1,5 @@
import { ActionInitializer, useSchemaInitializerItem } from '@tachybase/client';
import React from 'react';
import { ActionInitializer, useSchemaInitializerItem } from '@tachybase/client';
// 区块-配置操作
export const LauncherActionConfigComponent = () => {

View File

@ -1,6 +1,7 @@
import { SchemaInitializer } from '@tachybase/client';
import { NAMESPACE } from '../../../locale';
import { APPROVAL_STATUS } from '../../../constants';
import { NAMESPACE } from '../../../locale';
import { LauncherActionConfigComponent } from './LauncherActionConfig.component';
// 区块-配置操作

View File

@ -1,4 +1,5 @@
import { SchemaInitializer, gridRowColWrap } from '@tachybase/client';
import { gridRowColWrap, SchemaInitializer } from '@tachybase/client';
import { NAMESPACE } from '../../../locale';
import { LauncherAddBlockButtonComponent } from './LauncherBlockButton.component';

View File

@ -1,16 +1,16 @@
import React from 'react';
import {
SchemaInitializerItem,
createFormBlockSchema,
SchemaInitializerItem,
useCollection_deprecated,
useRecordCollectionDataSourceItems,
useSchemaInitializer,
useSchemaInitializerItem,
useSchemaTemplateManager,
} from '@tachybase/client';
import { APPROVAL_STATUS, flatSchemaArray } from '../../../constants';
import { NAMESPACE } from '../../../locale';
import { flatSchemaArray } from '../../../constants';
import { APPROVAL_STATUS } from '../../../constants';
// 创建区块-Initializer的component
export const LauncherAddBlockButtonComponent = () => {

View File

@ -1,3 +1,4 @@
import React, { useContext } from 'react';
import {
SchemaComponent,
SchemaComponentContext,
@ -8,8 +9,8 @@ import {
} from '@tachybase/client';
import { useFlowContext } from '@tachybase/plugin-workflow/client';
import { uid } from '@tachybase/utils/client';
import { Spin } from 'antd';
import React, { useContext } from 'react';
// 发起人操作界面-创建区块
export const SchemaAddBlock = ({ value, onChange }) => {

View File

@ -1,5 +1,6 @@
import { Plugin } from '@tachybase/client';
import PluginWorkflow from '@tachybase/plugin-workflow/client';
import { ApprovalTrigger } from './Approval.trigger';
import { LauncherActionConfigInitializer } from './launcher-interface/LauncherActionConfig.initializer';
import { LauncherAddBlockButtonIntializer } from './launcher-interface/LauncherAddBlockButton.initializer';

View File

@ -1,11 +1,12 @@
import { Plugin } from '@tachybase/client';
import { TableOutlined } from '@ant-design/icons';
import { SchemaInitializerItem, useSchemaInitializer, useSchemaInitializerItem } from '@tachybase/client';
import { uid } from '@tachybase/utils/client';
import React from 'react';
import { Plugin, SchemaInitializerItem, useSchemaInitializer, useSchemaInitializerItem } from '@tachybase/client';
import { uid } from '@tachybase/utils/client';
import { TableOutlined } from '@ant-design/icons';
import { NAMESPACE } from '../../locale';
import { ApprovalBlockLaunch } from './launch/VC.ApprovalBlockLaunch';
import { ApprovalBlockProvider } from './ApprovalBlock.provider';
import { ApprovalBlockLaunch } from './launch/VC.ApprovalBlockLaunch';
import { ApprovalBlockTodos } from './todos/VC.ApprovalBlockTodos';
export class SCApprovalBlock extends Plugin {

View File

@ -1,5 +1,5 @@
import { FlowContext } from '@tachybase/plugin-workflow/client';
import React, { useContext } from 'react';
import { FlowContext } from '@tachybase/plugin-workflow/client';
export function useFlowContext() {
return useContext(FlowContext);

View File

@ -1,5 +1,5 @@
import { SchemaComponentContext, useSchemaComponentContext } from '@tachybase/client';
import React from 'react';
import { SchemaComponentContext, useSchemaComponentContext } from '@tachybase/client';
export function SchemaComponentContextProvider({ designable, children }) {
const schemaComponentContext = useSchemaComponentContext();

View File

@ -1,7 +1,8 @@
import { useCurrentUserContext } from '@tachybase/client';
import { useContextApprovalExecution } from '../common/ApprovalExecution.provider';
import { useApproval } from '../../approval-common/ApprovalData.provider';
import { APPROVAL_STATUS } from '../../../constants';
import { useApproval } from '../../approval-common/ApprovalData.provider';
import { useContextApprovalExecution } from '../common/ApprovalExecution.provider';
export function ActionBarProvider(props) {
const { data } = useCurrentUserContext();

View File

@ -1,9 +1,9 @@
import React, { useContext } from 'react';
import React, { createContext, useContext } from 'react';
import { useCurrentUserContext } from '@tachybase/client';
import { useFlowContext } from '@tachybase/plugin-workflow/client';
import { createContext } from 'react';
import { useApproval } from '../../approval-common/ApprovalData.provider';
import { APPROVAL_STATUS } from '../../../constants';
import { useApproval } from '../../approval-common/ApprovalData.provider';
const ContextApprovalStatus = createContext(APPROVAL_STATUS.SUBMITTED);

View File

@ -1,5 +1,6 @@
import { useCurrentUserContext } from '@tachybase/client';
import { useFlowContext } from '@tachybase/plugin-workflow/client';
import { APPROVAL_STATUS } from '../../../constants';
import { useApproval } from '../../approval-common/ApprovalData.provider';

View File

@ -1,4 +1,4 @@
import React from 'react';
import React, { useContext } from 'react';
import {
RemoteSchemaComponent,
SchemaComponent,
@ -9,22 +9,23 @@ import {
} from '@tachybase/client';
import { DetailsBlockProvider, FlowContext } from '@tachybase/plugin-workflow/client';
import { useForm } from '@tachybase/schema';
import { Result, Spin } from 'antd';
import { useContext } from 'react';
import { NAMESPACE } from '../../../locale';
import { FormBlockProvider } from '../../../common/Pd.FormBlock';
import { ContextApprovalExecution } from '../common/ApprovalExecution.provider';
import { NAMESPACE } from '../../../locale';
import { ApprovalContext } from '../../approval-common/ApprovalData.provider';
import { ContextWithActionEnabled } from '../../approval-common/WithActionEnabled.provider';
import { ContextApprovalExecution } from '../common/ApprovalExecution.provider';
import { FlowContextProvider } from '../common/FlowContext.provider';
import { SchemaComponentContextProvider } from '../common/SchemaComponent.provider';
import { useDestroyAction } from './hooks/useDestroyAction';
import { useFormBlockProps } from './hooks/useFormBlockProps';
import { useSubmit } from './hooks/useSubmit';
import { useWithdrawAction } from './hooks/useWithdrawAction';
import { useDestroyAction } from './hooks/useDestroyAction';
import { ActionBarProvider } from './Pd.ActionBar';
import { WithdrawActionProvider } from './Pd.WithdrawAction';
import { SchemaComponentContextProvider } from '../common/SchemaComponent.provider';
import { ApplyActionStatusProvider } from './Pd.ApplyActionStatus';
import { FlowContextProvider } from '../common/FlowContext.provider';
import { WithdrawActionProvider } from './Pd.WithdrawAction';
export const ViewActionLaunchContent = () => {
const { id } = useRecord();

View File

@ -1,8 +1,10 @@
import { useAPIClient, useActionContext } from '@tachybase/client';
import { useActionContext, useAPIClient } from '@tachybase/client';
import { useField } from '@tachybase/schema';
import { useApproval } from '../../../approval-common/ApprovalData.provider';
import _ from 'lodash';
import { useApproval } from '../../../approval-common/ApprovalData.provider';
export function useDestroyAction() {
const field = useField();
const { setVisible, setSubmitted } = useActionContext() as any;

View File

@ -1,10 +1,11 @@
import { useEffect } from 'react';
import { useCurrentUserContext } from '@tachybase/client';
import { useFlowContext } from '@tachybase/plugin-workflow/client';
import { useForm } from '@tachybase/schema';
import { useEffect } from 'react';
import { useContextApprovalExecution } from '../../common/ApprovalExecution.provider';
import { useApproval } from '../../../approval-common/ApprovalData.provider';
import { ApprovalStatusEnumDict } from '../../../../constants';
import { useApproval } from '../../../approval-common/ApprovalData.provider';
import { useContextApprovalExecution } from '../../common/ApprovalExecution.provider';
export function useFormBlockProps() {
const approval = useApproval() as any;

View File

@ -1,7 +1,9 @@
import { useAPIClient, useActionContext } from '@tachybase/client';
import { useActionContext, useAPIClient } from '@tachybase/client';
import { useFlowContext } from '@tachybase/plugin-workflow/client';
import { useField, useForm } from '@tachybase/schema';
import _ from 'lodash';
import { useApproval } from '../../../approval-common/ApprovalData.provider';
import { useContextApprovalStatus } from '../Pd.ApplyActionStatus';

View File

@ -1,5 +1,6 @@
import { useAPIClient, useActionContext } from '@tachybase/client';
import { useActionContext, useAPIClient } from '@tachybase/client';
import { useField } from '@tachybase/schema';
import { useApproval } from '../../../approval-common/ApprovalData.provider';
// 撤回

View File

@ -1,4 +1,5 @@
import { createContext, useContext } from 'react';
export interface Approval {
id: number;
collectionName: string;

View File

@ -1,3 +1,4 @@
import React, { useContext } from 'react';
import {
RemoteSchemaComponent,
SchemaComponent,
@ -7,9 +8,10 @@ import {
useRequest,
} from '@tachybase/client';
import { DetailsBlockProvider, ExecutionContextProvider } from '@tachybase/plugin-workflow/client';
import { Result, Spin } from 'antd';
import _ from 'lodash';
import React, { useContext } from 'react';
import { FormBlockProvider } from '../../../common/Pd.FormBlock';
import { NAMESPACE, useTranslation } from '../../../locale';
import { ApprovalContext } from '../../approval-common/ApprovalData.provider';
@ -17,12 +19,12 @@ import { ContextWithActionEnabled } from '../../approval-common/WithActionEnable
import { ContextApprovalExecution } from '../common/ApprovalExecution.provider';
import { SchemaComponentContextProvider } from '../common/SchemaComponent.provider';
import { ApprovalFormBlockDecorator } from './Dt.ApprovalFormBlock';
import { ActionBarProvider } from './Pd.ActionBarProvider';
import { ApprovalActionProvider } from './Pd.ApprovalAction';
import { ContextApprovalExecutions } from './Pd.ApprovalExecutions';
import { useApprovalDetailBlockProps } from './hooks/useApprovalDetailBlockProps';
import { useApprovalFormBlockProps } from './hooks/useApprovalFormBlockProps';
import { useSubmit } from './hooks/useSubmit';
import { ActionBarProvider } from './Pd.ActionBarProvider';
import { ApprovalActionProvider } from './Pd.ApprovalAction';
import { ContextApprovalExecutions } from './Pd.ApprovalExecutions';
// 审批-待办-查看: 内容
export const ViewActionTodosContent = () => {

View File

@ -1,5 +1,6 @@
import { useRecord } from '@tachybase/client';
import React, { createContext, useContext } from 'react';
import { useRecord } from '@tachybase/client';
import { Approval } from '../approval-block/todos/Pd.ApprovalExecutions';
export const ApprovalContext = createContext<Partial<Approval>>({});

View File

@ -1,13 +1,15 @@
import React, { useMemo } from 'react';
import { createStyles, useCurrentUserContext } from '@tachybase/client';
import { EXECUTION_STATUS } from '@tachybase/plugin-workflow/client';
import { Space, Table } from 'antd';
import _ from 'lodash';
import React, { useMemo } from 'react';
import { APPROVAL_ACTION_STATUS, APPROVAL_STATUS } from '../../constants';
import { lang, usePluginTranslation } from '../../locale';
import { useApproval } from './ApprovalData.provider';
import { ContextWithActionEnabled } from './WithActionEnabled.provider';
import { getAntdTableColumns } from './process-columns/columns';
import { ContextWithActionEnabled } from './WithActionEnabled.provider';
// 审批(发起/待办)区块-查看-审批处理
export const ApprovalProcess = (props) => {

View File

@ -1,8 +1,9 @@
import { DatePicker, InputReadPretty, RecordProvider, useCurrentUserContext } from '@tachybase/client';
import React, { useContext } from 'react';
import { ContextWithActionEnabled } from '../WithActionEnabled.provider';
import { DatePicker, InputReadPretty, RecordProvider, useCurrentUserContext } from '@tachybase/client';
import { ViewActionLaunch } from '../../approval-block/launch/VC.ViewActionLaunch';
import { ViewActionTodos } from '../../approval-block/todos/VC.ViewActionTodos';
import { ContextWithActionEnabled } from '../WithActionEnabled.provider';
// Component开头的是,不知道起什么名字合适的
export function renderColumnDetail(e, props, exist) {

View File

@ -1,14 +1,15 @@
import React, { useMemo } from 'react';
import {
CollectionProvider_deprecated,
ExtendCollectionsProvider,
List,
joinCollectionName,
List,
useCollection_deprecated,
useRecord,
} from '@tachybase/client';
import React, { useMemo } from 'react';
import { CollectionApprovals } from '../approval-common/Approvals.collection';
import { CollectionApprovalTodos } from '../../common/Cn.ApprovalTodos';
import { CollectionApprovals } from '../approval-common/Approvals.collection';
import { CollectionFlowNodes } from '../approval-common/FlowNodes.collection';
import { CollectionWorkflows } from '../approval-common/Workflows.collection';

View File

@ -1,7 +1,8 @@
import { AuditOutlined } from '@ant-design/icons';
import React from 'react';
import { SchemaInitializerItem, useSchemaInitializer, useSchemaInitializerItem } from '@tachybase/client';
import { uid } from '@tachybase/utils/client';
import React from 'react';
import { AuditOutlined } from '@ant-design/icons';
// 初始化器,创建区块-相关审批
export function RecordApprovalsInitializer() {

View File

@ -1,5 +1,6 @@
import { SchemaComponent } from '@tachybase/client';
import React from 'react';
import { SchemaComponent } from '@tachybase/client';
import { ApprovalRecordStatusColumn } from '../approval-common/approval-columns/column.status';
import { UserColumn } from '../approval-common/approval-columns/column.user';
import { WorkflowColumn } from '../approval-common/approval-columns/column.workflow';

View File

@ -1,14 +1,19 @@
import React, { forwardRef, useEffect, useImperativeHandle, useState } from 'react';
import { Spin, Tag } from 'antd';
import { LoadingOutlined } from '@ant-design/icons';
import { Document, Page, pdfjs } from 'react-pdf';
import { Spin, Tag } from 'antd';
import { saveAs } from 'file-saver';
import { Document, Page, pdfjs } from 'react-pdf';
import 'react-pdf/dist/Page/AnnotationLayer.css';
import 'react-pdf/dist/Page/TextLayer.css';
import { uid } from '@tachybase/schema';
import { css, useRequest } from '@tachybase/client';
import { uid } from '@tachybase/schema';
import { TransformComponent, TransformWrapper } from 'react-zoom-pan-pinch';
import { useTranslation } from '../locale';
import { TransformWrapper, TransformComponent } from 'react-zoom-pan-pinch';
const options = {
cMapUrl: '/cmaps/',

View File

@ -0,0 +1,10 @@
// 1. 拆解 refined 文件, 根据归类原则
// 2. 反编译文件
// 3. 根据功能进行归类, 根据就近原则
## 1. 拆解 refined 文件, 根据归类原则
// 完成
## 2. 反编译文件
// 正在进行中
// 备份代码, 可查看标签 backup-dev-20240527-departments
## 3. 根据功能进行归类, 根据就近原则

View File

@ -0,0 +1,91 @@
// 数据表-部门
export const collectionDepartments = {
name: 'departments',
fields: [
{
interface: 'id',
type: 'bigInt',
name: 'id',
primaryKey: true,
autoIncrement: true,
uiSchema: {
type: 'id',
title: '{{t("ID")}}',
},
},
{
interface: 'input',
type: 'string',
name: 'title',
uiSchema: {
type: 'string',
title: '{{t("Department name")}}',
'x-component': 'Input',
required: true,
},
},
{
interface: 'm2o',
type: 'belongsTo',
name: 'parent',
collectionName: 'departments',
foreignKey: 'parentId',
target: 'departments',
targetKey: 'id',
treeParent: true,
uiSchema: {
title: '{{t("Superior department")}}',
'x-component': 'DepartmentSelect',
},
},
{
interface: 'm2m',
type: 'belongsToMany',
name: 'roles',
target: 'roles',
collectionName: 'departments',
through: 'departmentsRoles',
foreignKey: 'departmentId',
otherKey: 'roleName',
targetKey: 'name',
sourceKey: 'id',
uiSchema: {
title: '{{t("Roles")}}',
'x-component': 'AssociationField',
'x-component-props': {
multiple: true,
fieldNames: {
label: 'title',
value: 'name',
},
},
},
},
{
interface: 'm2m',
type: 'belongsToMany',
name: 'owners',
collectionName: 'departments',
target: 'users',
through: 'departmentsUsers',
foreignKey: 'departmentId',
otherKey: 'userId',
targetKey: 'id',
sourceKey: 'id',
scope: {
isOwner: true,
},
uiSchema: {
title: '{{t("Owners")}}',
'x-component': 'AssociationField',
'x-component-props': {
multiple: true,
fieldNames: {
label: 'nickname',
value: 'id',
},
},
},
},
],
};

View File

@ -0,0 +1,132 @@
// 数据表-用户
export const collectionUsers = {
name: 'users',
fields: [
{
interface: 'id',
type: 'bigInt',
name: 'id',
primaryKey: true,
autoIncrement: true,
allowNull: false,
uiSchema: {
type: 'number',
title: '{{t("ID")}}',
'x-component': 'InputNumber',
'x-read-pretty': true,
},
},
{
interface: 'input',
type: 'string',
name: 'nickname',
uiSchema: {
type: 'string',
title: '{{t("Nickname")}}',
'x-component': 'Input',
},
},
{
interface: 'input',
type: 'string',
name: 'username',
unique: true,
uiSchema: {
type: 'string',
title: '{{t("Username")}}',
'x-component': 'Input',
'x-validator': {
username: true,
},
required: true,
},
},
{
interface: 'email',
type: 'string',
name: 'email',
unique: true,
uiSchema: {
type: 'string',
title: '{{t("Email")}}',
'x-component': 'Input',
'x-validator': 'email',
required: true,
},
},
{
interface: 'phone',
type: 'string',
name: 'phone',
unique: true,
uiSchema: {
type: 'string',
title: '{{t("Phone")}}',
'x-component': 'Input',
'x-validator': 'phone',
required: true,
},
},
{
interface: 'm2m',
type: 'belongsToMany',
name: 'roles',
target: 'roles',
foreignKey: 'userId',
otherKey: 'roleName',
onDelete: 'CASCADE',
sourceKey: 'id',
targetKey: 'name',
through: 'rolesUsers',
uiSchema: {
type: 'array',
title: '{{t("Roles")}}',
'x-component': 'AssociationField',
'x-component-props': {
multiple: true,
fieldNames: {
label: 'title',
value: 'name',
},
},
},
},
{
interface: 'm2m',
type: 'belongsToMany',
name: 'departments',
target: 'departments',
foreignKey: 'userId',
otherKey: 'departmentId',
onDelete: 'CASCADE',
sourceKey: 'id',
targetKey: 'id',
through: 'departmentsUsers',
uiSchema: {
type: 'array',
title: '{{t("Departments")}}',
'x-component': 'DepartmentField',
},
},
{
interface: 'm2m',
type: 'belongsToMany',
name: 'mainDepartment',
target: 'departments',
foreignKey: 'userId',
otherKey: 'departmentId',
onDelete: 'CASCADE',
sourceKey: 'id',
targetKey: 'id',
through: 'departmentsUsers',
throughScope: {
isMain: true,
},
uiSchema: {
type: 'array',
title: '{{t("Main department")}}',
'x-component': 'DepartmentField',
},
},
],
};

View File

@ -0,0 +1,59 @@
import { SchemaComponent, useAPIClient, useResourceActionContext } from '@tachybase/client';
import { useContext, useRef } from 'react';
import { contextK } from '../context/contextK';
import { k } from '../others/k';
import { schemaAddMembers } from '../schema/addMembers.schema';
import React from 'react';
export const AddMembersNnt = () => {
const { department, useAddMembersAction, handleSelect } = useAction();
return (
<SchemaComponent
scope={{
useAddMembersAction,
department,
handleSelect,
}}
schema={schemaAddMembers}
/>
);
};
function useAction() {
const { department } = useContext(contextK);
const { refresh } = useResourceActionContext();
const ref = useRef([]);
const api = useAPIClient();
const useAddMembersAction = () => ({
run() {
return k(this, null, function* () {
const x = ref.current;
x != null &&
x.length &&
(yield api.resource('departments.members', department.id).add({ values: x }), (ref.current = []), refresh());
});
},
});
const useAddMembersAction2 = () => ({
async run() {
const x = ref.current;
if (x?.length > 0) {
await api.resource('departments.members', department.id).add({ values: x });
ref.current = [];
refresh();
}
},
});
const handleSelect = (val) => {
ref.current = val;
};
return {
department,
useAddMembersAction,
handleSelect,
};
}

View File

@ -0,0 +1,16 @@
import { CollectionProvider_deprecated, ResourceActionContext } from '@tachybase/client';
import React from 'react';
import { collectionDepartments } from '../collections/departments.collection';
import { useContextK } from '../context/contextK';
export const CeComponent = ({ children }) => {
const context = useContextK();
const { departmentsResource } = context;
const { service } = departmentsResource || {};
return (
<ResourceActionContext.Provider value={{ ...service }}>
<CollectionProvider_deprecated collection={collectionDepartments}>{children}</CollectionProvider_deprecated>
</ResourceActionContext.Provider>
);
};

View File

@ -0,0 +1,21 @@
import { CollectionProvider_deprecated, ResourceActionContext } from '@tachybase/client';
import React, { useContext } from 'react';
// import { jsx } from 'react/jsx-runtime';
import { collectionUsers } from '../collections/users.collection';
import { contextK } from '../context/contextK';
export const BeComponent = ({ children }) => {
const { usersResource } = useContext(contextK);
const { service } = usersResource || {};
return (
<ResourceActionContext.Provider value={{ ...service }}>
<CollectionProvider_deprecated collection={collectionUsers}>{children}</CollectionProvider_deprecated>
</ResourceActionContext.Provider>
);
// return jsx(ResourceActionContext.Provider, {
// value: { ...o },
// children: jsx(CollectionProvider_deprecated, { collection: collectionUsers, children: e.children }),
// });
};

View File

@ -0,0 +1,124 @@
import { UserOutlined } from '@ant-design/icons';
import { ActionContextProvider, RecordProvider, SchemaComponent, SchemaComponentOptions } from '@tachybase/client';
import { Button, Divider, Row, theme } from 'antd';
import React, { useContext, useState } from 'react';
import { useTranslation } from '../../../locale';
import { contextK } from '../context/contextK';
import { ContextNProvider } from '../context/contextN';
import { useCreateDepartment } from '../hooks/useCreateDepartment';
import { useHooksG } from '../hooks/useHooksG';
import { useUpdateDepartmentLe } from '../hooks/useUpdateDepartmentLe';
import { ComponentSe } from './ComponentSe';
import { ComponentX } from './ComponentX';
import { ComponentXxe } from './ComponentXxe';
import { DepartmentOwnersField } from './DepartmentOwnersField';
interface drawerState {
node?: object;
schema?: object;
}
export const ComponentEEE = () => {
const { t: tval } = useTranslation();
const [visible, setVisible] = useState(false);
const [drawer, setDrawer] = useState<drawerState>({});
const { department, setDepartment } = useContext(contextK);
const { token } = theme.useToken();
const m = useHooksG({
label: ({ node }) => <ComponentX.Item node={node} setVisible={setVisible} setDrawer={setDrawer} />,
});
return (
<SchemaComponentOptions
scope={{
useCreateDepartment,
useUpdateDepartment: useUpdateDepartmentLe,
}}
>
<ContextNProvider value={m}>
<Row>
<ComponentSe />
<Button
type="text"
icon={<UserOutlined />}
style={{
textAlign: 'left',
marginBottom: '5px',
background: department ? '' : token.colorBgTextHover,
}}
onClick={() => {
setDepartment(null);
}}
block={true}
>
{tval('All users')}
</Button>
<ComponentXxe />
</Row>
<Divider style={{ margin: '12px 0' }} />
<ComponentX />
<ActionContextProvider
value={{
visible: visible,
setVisible: setVisible,
}}
>
<RecordProvider record={drawer.node || {}}>
<SchemaComponent
scope={{
t: tval,
}}
components={{
DepartmentOwnersField,
}}
schema={drawer.schema || {}}
/>
</RecordProvider>
</ActionContextProvider>
</ContextNProvider>
</SchemaComponentOptions>
);
// return jsx(SchemaComponentOptions, {
// scope: {
// useCreateDepartment: useCreateDepartment,
// useUpdateDepartment: useUpdateDepartmentLe,
// },
// children: jsxs(contextN.Provider, {
// value: m,
// children: [
// jsxs(Row, {
// children: [
// jsx(ComponentSe, {}),
// jsx(Button, {
// type: 'text',
// icon: jsx(UserOutlined, {}),
// style: { textAlign: 'left', marginBottom: '5px', background: c ? '' : x.colorBgTextHover },
// onClick: () => {
// i(null);
// },
// block: true,
// children: e('All users'),
// }),
// jsx(ComponentXxe, {}),
// ],
// }),
// jsx(Divider, { style: { margin: '12px 0' } }),
// jsx(ComponentX, {}),
// jsx(ActionContextProvider, {
// value: { visible: t, setVisible: o },
// children: jsx(RecordProvider, {
// record: a.node || {},
// children: jsx(SchemaComponent, {
// scope: { t: e },
// components: { DepartmentOwnersField: DepartmentOwnersField },
// schema: a.schema || {},
// }),
// }),
// }),
// ],
// }),
// });
};

View File

@ -0,0 +1,95 @@
import { SchemaComponent, useResourceActionContext } from '@tachybase/client';
import { useContext, useEffect, useMemo, Fragment } from 'react';
import { jsx, jsxs } from 'react/jsx-runtime';
import { useTranslation } from '../../../locale';
import { contextK } from '../context/contextK';
import { useFilterActionPropsZ } from '../scopes/useFilterActionPropsZ';
import { DepartmentFieldYe } from './DepartmentFieldYe';
import { IsOwnerFieldQe } from './IsOwnerFieldQe';
import { UserDepartmentsFieldOot } from './UserDepartmentsFieldOot';
import { AddMembersNnt } from './AddMembersNnt';
import { useShowTotal } from '../hooks/useShowTotal';
import { useMembersDataSource } from '../hooks/useMembersDataSource';
import { useBulkRemoveMembersAction } from '../hooks/useBulkRemoveMembersAction';
import { useRemoveMemberAction } from '../hooks/useRemoveMemberAction';
import { getSchemaHe } from '../schema/getSchemaHe';
import { schemaZe } from '../schema/schemaZe';
import { schemaWe } from '../schema/schemaWe';
import React from 'react';
export const ComponentIit = () => {
const { t: tval } = useTranslation();
const { department, user } = useContext(contextK);
const { data, setState } = useResourceActionContext();
const MemberActions = () => (department ? <SchemaComponent schema={schemaZe} /> : null);
const RowRemoveAction = () =>
department ? (
<SchemaComponent
scope={{
useRemoveMemberAction: useRemoveMemberAction,
}}
schema={schemaWe}
/>
) : null;
const schema = useMemo(() => getSchemaHe(department, user), [department, user]);
useEffect(() => {
setState?.({
selectedRowKeys: [],
});
}, [data, setState]);
return (
<>
<h2>{user ? tval('Search results') : tval(department?.title ?? 'All users')}</h2>
<SchemaComponent
scope={{
useBulkRemoveMembersAction: useBulkRemoveMembersAction,
useMembersDataSource: useMembersDataSource,
t: tval,
useShowTotal: useShowTotal,
useFilterActionProps: useFilterActionPropsZ,
}}
components={{
MemberActions: MemberActions,
AddMembers: AddMembersNnt,
RowRemoveAction: RowRemoveAction,
DepartmentField: DepartmentFieldYe,
IsOwnerField: IsOwnerFieldQe,
UserDepartmentsField: UserDepartmentsFieldOot,
}}
schema={schema}
/>
</>
);
// return jsxs(Fragment, {
// children: [
// o
// ? jsx('h2', { children: e('Search results') })
// : jsx('h2', {
// children: e((t == null ? void 0 : t.title) || 'All users'),
// }),
// jsx(SchemaComponent, {
// scope: {
// useBulkRemoveMembersAction: useBulkRemoveMembersAction,
// useMembersDataSource: useMembersDataSource,
// t: e,
// useShowTotal: useShowTotal,
// useFilterActionProps: useFilterActionPropsZ,
// },
// components: {
// MemberActions: c,
// AddMembers: AddMembersNnt,
// RowRemoveAction: i,
// DepartmentField: DepartmentFieldYe,
// IsOwnerField: IsOwnerFieldQe,
// UserDepartmentsField: UserDepartmentsFieldOot,
// },
// schema: x,
// }),
// ],
// });
};

View File

@ -0,0 +1,112 @@
import { useField } from '@tachybase/schema';
import { TreeSelect } from 'antd';
import React, { useEffect, useState } from 'react';
// import { jsx } from 'react/jsx-runtime';
import { k } from '../others/k';
import { getDepartmentStr } from '../utils/getDepartmentStr';
interface tempField {
value?: any;
setValue: Function;
}
interface IState {
label?: object;
value?: object;
}
// 编辑部门-上级部门选择器
export const ComponentLle = (props) => {
const field = useField<tempField>();
const [value, setValue] = useState<IState>({ label: null, value: null });
const {
treeData: treeData,
initData: initData,
getByKeyword: getByKeyword,
loadData: loadData,
loadedKeys: loadedKeys,
setLoadedKeys: setLoadedKeys,
originData: originData,
} = props;
const onSearch = (h) =>
k(this, null, function* () {
if (!h) {
initData(originData);
return;
}
yield getByKeyword(h);
});
// const b = useCallback((h) => {
// const F = h.title,
// C = h.parent;
// return C ? b(C) + ' / ' + F : F;
// }, []);
useEffect(() => {
initData(originData);
}, [originData, initData]);
useEffect(() => {
if (!field.value) {
setValue({ label: null, value: null });
return;
}
setValue({
label: getDepartmentStr(field.value) || field.value.label,
value: field.value.id,
});
}, [field.value, getDepartmentStr]);
// return null;
return (
<TreeSelect
value={value}
onSelect={(h, currValue) => {
field.setValue(currValue);
}}
onChange={(h) => {
h || field.setValue(null);
}}
treeData={treeData}
treeLoadedKeys={loadedKeys}
onTreeLoad={(keys) => setLoadedKeys(keys)}
loadData={(value) => loadData({ key: value.id, children: value.children })}
fieldNames={{ value: 'id' }}
showSearch={true}
allowClear={true}
treeNodeFilterProp={'title'}
onSearch={onSearch}
labelInValue={true}
/>
);
// return (
// useEffect(() => {
// c(d);
// }, [d, c]),
// useEffect(() => {
// if (!t.value) {
// a({ label: null, value: null });
// return;
// }
// a({ label: b(t.value) || t.value.label, value: t.value.id });
// }, [t.value, b]),
// jsx(TreeSelect, {
// value: o,
// onSelect: (h, F) => {
// t.setValue(F);
// },
// onChange: (h) => {
// h || t.setValue(null);
// },
// treeData: r,
// treeLoadedKeys: m,
// onTreeLoad: (h) => g(h),
// loadData: (h) => x({ key: h.id, children: h.children }),
// fieldNames: { value: 'id' },
// showSearch: true,
// allowClear: true,
// treeNodeFilterProp: 'title',
// onSearch: A,
// labelInValue: true,
// })
// );
};

View File

@ -0,0 +1,148 @@
import { createStyles, useAPIClient, useRequest } from '@tachybase/client';
import { Button, Dropdown, Empty, Input, theme } from 'antd';
import { useContext, useState } from 'react';
import { jsx, jsxs } from 'react/jsx-runtime';
import { useTranslation } from '../../../locale';
import { contextK } from '../context/contextK';
const createStyleAe = createStyles(({ css }) => ({
searchDropdown: css`
.ant-dropdown-menu {
max-height: 500px;
overflow-y: scroll;
}
`,
}));
export const ComponentSe = () => {
const { t: e } = useTranslation();
const { token: t } = theme.useToken();
const { setDepartment: setDepartment, setUser: setUser } = useContext(contextK);
const [r, c] = useState(false);
const [i, x] = useState('');
const [m, g] = useState([]);
const [d, A] = useState([]);
const [b, h] = useState(true);
const [F, C] = useState(true);
const { styles } = createStyleAe();
const l = 10;
const api = useAPIClient();
const data = useRequest(
(M) =>
api
.resource('departments')
.aggregateSearch(M)
.then((P) => {
var q;
return (q = P == null ? void 0 : P.data) == null ? void 0 : q.data;
}),
{
manual: true,
onSuccess: (M, P) => {
const {
values: { type: q },
} = P[0] || {};
M &&
((!q || q === 'user') && M.users.length < l && h(false),
(!q || q === 'department') && M.departments.length < l && C(false),
g((se) => [...se, ...M.users]),
A((se) => [...se, ...M.departments]));
},
},
);
const { run: S } = data;
const O = (M) => {
x(M), g([]), A([]), h(true), C(true), M && (S({ values: { keyword: M, limit: l } }), c(true));
};
const $ = (M) => {
M.target.value || (setUser(null), x(''), c(false), data.mutate({}), g([]), A([]));
};
const W = (M) => {
const P = M.title,
q = M.parent;
return q ? W(q) + ' / ' + P : P;
};
const H = (M) =>
jsx(Button, {
type: 'link',
style: { padding: '0 8px' },
onClick: (P) => {
c(true), S({ values: { keyword: i, limit: l, ...M } });
},
children: e('Load more'),
});
const J = () => {
const M = [];
return !m.length && !d.length
? [
{
key: '0',
label: jsx(Empty, {
description: e('No results'),
image: Empty.PRESENTED_IMAGE_SIMPLE,
}),
disabled: true,
},
]
: (m.length &&
(M.push({
key: '0',
type: 'group',
label: e('Users'),
children: m.map((P) => ({
key: P.username,
label: jsxs('div', {
onClick: () => setUser(P),
children: [
jsx('div', { children: P.nickname || P.username }),
jsx('div', {
style: { fontSize: t.fontSizeSM, color: t.colorTextDescription },
children: `${P.username}${P.phone ? ' | ' + P.phone : ''}${P.email ? ' | ' + P.email : ''}`,
}),
],
}),
})),
}),
b &&
M.push({
type: 'group',
key: '0-loadMore',
label: jsx(H, { type: 'user', last: m[m.length - 1].id }),
})),
d.length &&
(M.push({
key: '1',
type: 'group',
label: e('Departments'),
children: d.map((P) => ({
key: P.id,
label: jsx('div', { onClick: () => setDepartment(P), children: W(P) }),
})),
}),
F &&
M.push({
type: 'group',
key: '1-loadMore',
label: jsx(H, { type: 'department', last: d[d.length - 1].id }),
})),
M);
};
return jsx(Dropdown, {
menu: { items: J() },
overlayClassName: styles.searchDropdown,
trigger: ['click'],
open: r,
onOpenChange: (M) => c(M),
children: jsx(Input.Search, {
allowClear: true,
onClick: () => {
i || c(false);
},
onFocus: () => setDepartment(null),
onSearch: O,
onChange: $,
placeholder: e('Search for departments, users'),
style: { marginBottom: '20px' },
}),
});
};

View File

@ -0,0 +1,161 @@
import { MoreOutlined } from '@ant-design/icons';
import { css, useAPIClient, useResourceActionContext } from '@tachybase/client';
import { App, Dropdown, Empty, Tree } from 'antd';
import { useContext, useEffect } from 'react';
import { jsx, jsxs } from 'react/jsx-runtime';
import { useTranslation } from '../../../locale';
import { contextK } from '../context/contextK';
import { k } from '../others/k';
import { schemaHhe } from '../schema/schemaHhe';
import { schemaYye } from '../schema/schemaYye';
import { contextN } from '../context/contextN';
export const ComponentX = () => {
const { data: e, loading: t } = useResourceActionContext();
const { department, setDepartment, setUser } = useContext(contextK);
const { treeData, nodeMap, loadData, loadedKeys, setLoadedKeys, initData, expandedKeys, setExpandedKeys } =
useContext(contextN);
const h = (v) => {
if (!v.length) return;
const l = nodeMap[v[0]];
setDepartment(l);
setUser(null);
};
const F = (v) => {
setExpandedKeys(v);
};
const C = (v) => {
setLoadedKeys(v);
};
useEffect(() => {
initData(e == null ? void 0 : e.data);
}, [e, initData, t]);
useEffect(() => {
if (!department) return;
const v = (u) => (u.parent ? [u.parent.id, ...v(u.parent)] : []),
l = v(department);
setExpandedKeys((u) => Array.from(new Set([...u, ...l])));
}, [department, setExpandedKeys]);
return jsx('div', {
className: css`
height: 57vh;
overflow: auto;
.ant-tree-node-content-wrapper {
overflow: hidden;
}
`,
children:
treeData != null && treeData.length
? jsx(Tree.DirectoryTree, {
loadData: loadData,
treeData: treeData,
loadedKeys: loadedKeys,
onSelect: h,
selectedKeys: [department == null ? void 0 : department.id],
onExpand: F,
onLoad: C,
expandedKeys: expandedKeys,
expandAction: false,
showIcon: false,
fieldNames: { key: 'id' },
})
: jsx(Empty, { image: Empty.PRESENTED_IMAGE_SIMPLE }),
});
// return (
// useEffect(() => {
// initData(e == null ? void 0 : e.data);
// }, [e, initData, t]),
// useEffect(() => {
// if (!department) return;
// const v = (u) => (u.parent ? [u.parent.id, ...v(u.parent)] : []),
// l = v(department);
// setExpandedKeys((u) => Array.from(new Set([...u, ...l])));
// }, [department, setExpandedKeys]),
// jsx('div', {
// className: css`
// height: 57vh;
// overflow: auto;
// .ant-tree-node-content-wrapper {
// overflow: hidden;
// }
// `,
// children:
// treeData != null && treeData.length
// ? jsx(Tree.DirectoryTree, {
// loadData: loadData,
// treeData: treeData,
// loadedKeys: loadedKeys,
// onSelect: h,
// selectedKeys: [department == null ? void 0 : department.id],
// onExpand: F,
// onLoad: C,
// expandedKeys: expandedKeys,
// expandAction: false,
// showIcon: false,
// fieldNames: { key: 'id' },
// })
// : jsx(Empty, { image: Empty.PRESENTED_IMAGE_SIMPLE }),
// })
// );
};
ComponentX.Item = function ({ node: t, setVisible: o, setDrawer: a }) {
const { t: r } = useTranslation(),
{ refreshAsync: c } = useResourceActionContext(),
{ setLoadedKeys: i, expandedKeys: x, setExpandedKeys: m } = useContext(contextN),
{ modal: g, message: d } = App.useApp(),
A = useAPIClient(),
b = () => {
g.confirm({
title: r('Delete'),
content: r('Are you sure you want to delete it?'),
onOk: () =>
k(this, null, function* () {
yield A.resource('departments').destroy({ filterByTk: t.id }),
d.success(r('Deleted successfully')),
m((v) => v.filter((l) => l !== t.id));
const C = [...x];
i([]), m([]), yield c(), m(C);
}),
});
},
h = (C) => {
a({ schema: C, node: t }), o(true);
},
F = ({ key: C, domEvent: v }) => {
switch ((v.stopPropagation(), C)) {
case 'new-sub':
h(schemaYye);
break;
case 'edit':
h(schemaHhe);
break;
case 'delete':
b();
}
};
return jsxs('div', {
style: { display: 'flex', justifyContent: 'space-between', overflow: 'hidden' },
children: [
jsx('div', {
style: { overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' },
children: t.title,
}),
jsx(Dropdown, {
menu: {
items: [
{ label: r('New sub department'), key: 'new-sub' },
{ label: r('Edit department'), key: 'edit' },
{ label: r('Delete department'), key: 'delete' },
],
onClick: F,
},
children: jsx('div', {
style: { marginLeft: '15px' },
children: jsx(MoreOutlined, {}),
}),
}),
],
});
};

View File

@ -0,0 +1,59 @@
import { SchemaComponent } from '@tachybase/client';
import { jsx } from 'react/jsx-runtime';
import { useTranslation } from '../../../locale';
export const ComponentXxe = () => {
const { t: e } = useTranslation();
return jsx(SchemaComponent, {
scope: { t: e },
schema: {
type: 'void',
properties: {
newDepartment: {
type: 'void',
title: e('New department'),
'x-component': 'Action',
'x-component-props': { type: 'text', icon: 'PlusOutlined', style: { width: '100%', textAlign: 'left' } },
properties: {
drawer: {
type: 'void',
'x-component': 'Action.Drawer',
'x-decorator': 'Form',
title: e('New department'),
properties: {
title: { 'x-component': 'CollectionField', 'x-decorator': 'FormItem', required: true },
parent: {
'x-component': 'CollectionField',
'x-decorator': 'FormItem',
'x-collection-field': 'departments.parent',
'x-component-props': { component: 'DepartmentSelect' },
},
roles: {
'x-component': 'CollectionField',
'x-decorator': 'FormItem',
'x-collection-field': 'departments.roles',
},
footer: {
type: 'void',
'x-component': 'Action.Drawer.Footer',
properties: {
cancel: {
title: '{{t("Cancel")}}',
'x-component': 'Action',
'x-component-props': { useAction: '{{ cm.useCancelAction }}' },
},
submit: {
title: '{{t("Submit")}}',
'x-component': 'Action',
'x-component-props': { type: 'primary', useAction: '{{ useCreateDepartment }}' },
},
},
},
},
},
},
},
},
},
});
};

View File

@ -0,0 +1,3 @@
import React from 'react';
export const ContextR = React.createContext({});

View File

@ -0,0 +1,72 @@
import { EllipsisWithTooltip } from '@tachybase/client';
import { useField } from '@tachybase/schema';
import React, { useContext } from 'react';
// import { jsx, jsxs } from 'react/jsx-runtime';
import { contextK } from '../context/contextK';
import { getDepartmentStr } from '../utils/getDepartmentStr';
export const DepartmentFieldYe = () => {
const { setDepartment } = useContext(contextK);
const field = useField<{ value: Array<any> }>();
const fieldValues = field.value || [];
const department = fieldValues.reduce((acc, curr) => {
acc[curr.id] = curr;
return acc;
}, {});
return (
<EllipsisWithTooltip ellipsis={true}>
{fieldValues.map((currFieldValue, index) => (
<span key={index}>
<a
onClick={(event) => {
event.preventDefault();
setDepartment(department[currFieldValue.id]);
}}
>
{getDepartmentStr(currFieldValue)}
</a>
{index !== fieldValues.length - 1 ? <span style={{ marginRight: 4, color: '#aaa' }}>,</span> : ''}
</span>
))}
</EllipsisWithTooltip>
);
// const children2 = fieldValues.map((currFieldValue, index) => {
// return (
// <span key={index}>
// <a
// onClick={(x) => {
// x.preventDefault(), setDepartment(department[currFieldValue.id]);
// }}
// >
// {getDepartmentStr(currFieldValue)}
// </a>
// {index !== fieldValues.length - 1 ? <span style={{ marginRight: 4, color: '#aaa' }}>,</span> : ''}
// </span>
// );
// });
// const children = fieldValues.map((currFieldValue, index) =>
// jsxs(
// 'span',
// {
// children: [
// jsx('a', {
// onClick: (x) => {
// x.preventDefault(), setDepartment(department[currFieldValue.id]);
// },
// children: getDepartmentStr(currFieldValue),
// }),
// index !== fieldValues.length - 1
// ? jsx('span', { style: { marginRight: 4, color: '#aaa' }, children: ',' })
// : '',
// ],
// },
// index,
// ),
// );
// return jsx(EllipsisWithTooltip, { ellipsis: true, children: children });
};

View File

@ -0,0 +1,59 @@
import { SchemaComponentOptions } from '@tachybase/client';
import { Col, Row } from 'antd';
// import { jsx, jsxs } from 'react/jsx-runtime';
import React from 'react';
import { useFilterActionPropsZ } from '../scopes/useFilterActionPropsZ';
import { CeComponent } from './CeComponent';
import { BeComponent } from './ComponentBe';
import { ComponentEEE } from './ComponentEEE';
import { ComponentIit } from './ComponentIit';
import { DepartmentSelect } from './DepartmentSelect';
import { SuperiorDepartmentSelect } from './SuperiorDepartmentSelect';
export const DepartmentManagement = () => {
return (
<SchemaComponentOptions
components={{ SuperiorDepartmentSelect, DepartmentSelect }}
scope={{ useFilterActionProps: useFilterActionPropsZ }}
>
<Row gutter={48} style={{ flexWrap: 'nowrap' }}>
<Col span={6} style={{ borderRight: '1px solid #eee', minWidth: '300px' }}>
<CeComponent>
<ComponentEEE />
</CeComponent>
</Col>
<Col flex="auto" style={{ overflow: 'hidden' }}>
<BeComponent>
<ComponentIit />
</BeComponent>
</Col>
</Row>
</SchemaComponentOptions>
);
// return jsx(SchemaComponentOptions, {
// components: {
// SuperiorDepartmentSelect: SuperiorDepartmentSelect,
// DepartmentSelect: DepartmentSelect,
// },
// scope: {
// useFilterActionProps: useFilterActionPropsZ,
// },
// children: jsxs(Row, {
// gutter: 48,
// style: { flexWrap: 'nowrap' },
// children: [
// jsx(Col, {
// span: 6,
// style: { borderRight: '1px solid #eee', minWidth: '300px' },
// children: jsx(CeComponent, { children: jsx(ComponentEEE, {}) }),
// }),
// jsx(Col, {
// flex: 'auto',
// style: { overflow: 'hidden' },
// children: jsx(BeComponent, { children: jsx(ComponentIit, {}) }),
// }),
// ],
// }),
// });
};

View File

@ -0,0 +1,71 @@
import {
ResourceActionProvider,
SchemaComponent,
ActionContextProvider,
useActionContext,
useRecord,
} from '@tachybase/client';
import { useField } from '@tachybase/schema';
import { Select } from 'antd';
import { useEffect, useRef, useState } from 'react';
import { jsx, jsxs } from 'react/jsx-runtime';
import { schemaFfe } from '../schema/schemaFfe';
export const DepartmentOwnersField = () => {
const [e, t] = useState(false),
o = useRecord(),
a = useField(),
[r, c] = useState([]),
i = useRef([]),
x = (d, A) => {
i.current = A;
},
m = () => {
const { setVisible: d } = useActionContext();
return {
run() {
const A = a.value || [];
a.setValue([...A, ...i.current]), (i.current = []), d(false);
},
};
};
useEffect(() => {
a.value && c(a.value.map((d) => ({ value: d.id, label: d.nickname || d.username })));
}, [a.value]);
const g = (d) => {
var A;
return jsx(ResourceActionProvider, {
collection: 'users',
request: {
resource: `departments/${o.id}/members`,
action: 'list',
params: { filter: (A = a.value) != null && A.length ? { id: { $notIn: a.value.map((b) => b.id) } } : {} },
},
children: d.children,
});
};
return jsxs(ActionContextProvider, {
value: { visible: e, setVisible: t },
children: [
jsx(Select, {
open: false,
onChange: (d) => {
if (!d) {
a.setValue([]);
return;
}
a.setValue(d.map(({ label: A, value: b }) => ({ id: b, nickname: A })));
},
mode: 'multiple',
value: r,
labelInValue: true,
onDropdownVisibleChange: (d) => t(d),
}),
jsx(SchemaComponent, {
schema: schemaFfe,
components: { RequestProvider: g },
scope: { department: o, handleSelect: x, useSelectOwners: m },
}),
],
});
};

View File

@ -0,0 +1,16 @@
import { useContext } from 'react';
import { jsx } from 'react/jsx-runtime';
import { T } from '../others/T';
import { y } from '../others/y';
import { contextK } from '../context/contextK';
import { ComponentLle } from './ComponentLle';
import { useHooksG } from '../hooks/useHooksG';
export const DepartmentSelect = () => {
const e = useHooksG(),
{ departmentsResource: t } = useContext(contextK),
{
service: { data: o },
} = t || {};
return jsx(ComponentLle, T(y({}, e), { originData: o == null ? void 0 : o.data }));
};

Some files were not shown because too many files have changed in this diff Show More