refactor: workflow/webhook/department (#1207)

Reviewed-on: daoyoucloud/tachybase#1207
This commit is contained in:
sealday 2024-06-19 13:23:49 +08:00
parent 509bcc29a8
commit 35f23d4b7c
190 changed files with 1203 additions and 3244 deletions

View File

@ -10,26 +10,26 @@ export class RedisBloomFilter implements BloomFilter {
} }
getStore() { getStore() {
return this.cache.store.store as RedisStore; return this.cache.store.store;
} }
async reserve(key: string, errorRate: number, capacity: number) { async reserve(key: string, errorRate: number, capacity: number) {
const store = this.getStore(); const store = this.getStore() as RedisStore;
await store.client.bf.reserve(key, errorRate, capacity); await store.client.bf.reserve(key, errorRate, capacity);
} }
async add(key: string, value: string) { async add(key: string, value: string) {
const store = this.getStore(); const store = this.getStore() as RedisStore;
await store.client.bf.add(key, value); await store.client.bf.add(key, value);
} }
async mAdd(key: string, values: string[]) { async mAdd(key: string, values: string[]) {
const store = this.getStore(); const store = this.getStore() as RedisStore;
await store.client.bf.mAdd(key, values); await store.client.bf.mAdd(key, values);
} }
async exists(key: string, value: string) { async exists(key: string, value: string) {
const store = this.getStore(); const store = this.getStore() as RedisStore;
return await store.client.bf.exists(key, value); return await store.client.bf.exists(key, value);
} }
} }

View File

@ -1,13 +1,3 @@
import { Plugin } from '@tachybase/client'; import { Plugin } from '@tachybase/client';
import KitApprovalConfiguration from './configuration/plugin'; export default class PluginApproval extends Plugin {}
import { KitApprovalUsage } from './usage/plugin';
export default class PluginApproval extends Plugin {
async afterAdd() {
this.pm.add(KitApprovalConfiguration);
this.pm.add(KitApprovalUsage);
}
async beforeLoad() {}
async load() {}
}

View File

@ -1,46 +1,5 @@
import path from 'path';
import WorkflowPlugin from '@tachybase/plugin-workflow';
import { Plugin } from '@tachybase/server'; import { Plugin } from '@tachybase/server';
import { init } from './actions'; export class PluginWorkflowApproval extends Plugin {}
import ApprovalInstruction from './ApprovalInstruction';
import ApprovalTrigger from './ApprovalTrigger';
export class PluginWorkflowApproval extends Plugin {
workflow;
afterAdd() {}
beforeLoad() {
this.app.on('afterLoadPlugin', (plugin) => {
if (!(plugin instanceof WorkflowPlugin)) {
return;
}
this.workflow = plugin;
plugin.triggers.register('approval', new ApprovalTrigger(plugin));
plugin.instructions.register('approval', new ApprovalInstruction(plugin));
});
}
async load() {
const { db } = this;
db.addMigrations({
namespace: 'approval',
directory: path.resolve(__dirname, 'migrations'),
context: {
plugin: this,
},
});
await db.import({
directory: path.resolve(__dirname, 'collections'),
});
init(this);
this.app.acl.allow('workflows', ['listApprovalFlows'], 'loggedIn');
this.app.acl.allow('approvals', '*', 'loggedIn');
this.app.acl.allow('approvalExecutions', ['get'], 'loggedIn');
this.app.acl.allow('approvalRecords', ['get', 'list', 'listCentralized', 'submit'], 'loggedIn');
}
async install(options) {}
async afterEnable() {}
async afterDisable() {}
async remove() {}
}
export default PluginWorkflowApproval; export default PluginWorkflowApproval;

View File

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

View File

@ -1,8 +1,6 @@
import React, { Fragment, useContext, useEffect, useMemo } from 'react'; import React, { useContext, useEffect, useMemo } from 'react';
import { SchemaComponent, useResourceActionContext } from '@tachybase/client'; import { SchemaComponent, useResourceActionContext } from '@tachybase/client';
import { jsx, jsxs } from 'react/jsx-runtime';
import { useTranslation } from '../../../locale'; import { useTranslation } from '../../../locale';
import { DepartmentsContext } from '../context/DepartmentsContext'; import { DepartmentsContext } from '../context/DepartmentsContext';
import { useBulkRemoveMembersAction } from '../hooks/useBulkRemoveMembersAction'; import { useBulkRemoveMembersAction } from '../hooks/useBulkRemoveMembersAction';
@ -15,7 +13,7 @@ import { schemaZe } from '../schema/schemaZe';
import { useFilterActionPropsZ } from '../scopes/useFilterActionPropsZ'; import { useFilterActionPropsZ } from '../scopes/useFilterActionPropsZ';
import { AddMembers } from './AddMembers'; import { AddMembers } from './AddMembers';
import { DepartmentFieldYe } from './DepartmentFieldYe'; import { DepartmentFieldYe } from './DepartmentFieldYe';
import { IsOwnerFieldQe } from './IsOwnerFieldQe'; import { IsOwnerField } from './IsOwnerField';
import { UserDepartmentsFieldOot } from './UserDepartmentsFieldOot'; import { UserDepartmentsFieldOot } from './UserDepartmentsFieldOot';
export const ComponentIit = () => { export const ComponentIit = () => {
@ -58,39 +56,11 @@ export const ComponentIit = () => {
AddMembers: AddMembers, AddMembers: AddMembers,
RowRemoveAction: RowRemoveAction, RowRemoveAction: RowRemoveAction,
DepartmentField: DepartmentFieldYe, DepartmentField: DepartmentFieldYe,
IsOwnerField: IsOwnerFieldQe, IsOwnerField: IsOwnerField,
UserDepartmentsField: UserDepartmentsFieldOot, UserDepartmentsField: UserDepartmentsFieldOot,
}} }}
schema={schema} 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

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

View File

@ -4,10 +4,10 @@ import { uid } from '@tachybase/schema';
import { DepartmentManagement } from './DepartmentManagement'; import { DepartmentManagement } from './DepartmentManagement';
export const MmtComponent = () => { export const DepartmentManagementComponent = () => {
return ( return (
<SchemaComponent <SchemaComponent
components={{ DepartmentManagement: DepartmentManagement }} components={{ DepartmentManagement }}
schema={{ schema={{
type: 'void', type: 'void',
properties: { properties: {
@ -20,16 +20,4 @@ export const MmtComponent = () => {
}} }}
/> />
); );
// return jsx(SchemaComponent, {
// components: {
// DepartmentManagement: DepartmentManagement,
// },
// schema: {
// type: 'void',
// properties: {
// [uid()]: { type: 'void', 'x-decorator': 'CardItem', 'x-component': 'DepartmentManagement' },
// },
// },
// });
}; };

View File

@ -4,9 +4,9 @@ import { RolesManagerContext } from '@tachybase/plugin-acl/client';
import { useTranslation } from '../../../locale'; import { useTranslation } from '../../../locale';
import { collectionDepartments } from '../collections/departments.collection'; import { collectionDepartments } from '../collections/departments.collection';
import { useAddDepartmentsGgt } from '../hooks/useAddDepartmentsGgt'; import { useAddDepartments } from '../hooks/useAddDepartments';
import { useBulkRemoveDepartmentsYyt } from '../hooks/useBulkRemoveDepartmentsYyt'; import { useBulkRemoveDepartmentsYyt } from '../hooks/useBulkRemoveDepartmentsYyt';
import { useDataSourceFt } from '../hooks/useDataSourceFt'; import { useDataSource2 } from '../hooks/useDataSource2';
import { useDisabledVvt } from '../hooks/useDisabledVvt'; import { useDisabledVvt } from '../hooks/useDisabledVvt';
import { useRemoveDepartmentXxt } from '../hooks/useRemoveDepartmentXxt'; import { useRemoveDepartmentXxt } from '../hooks/useRemoveDepartmentXxt';
import { getSchemaDdt } from '../schema/getSchemaDdt'; import { getSchemaDdt } from '../schema/getSchemaDdt';
@ -40,9 +40,9 @@ export const Departments = () => {
t, t,
useRemoveDepartment: useRemoveDepartmentXxt, useRemoveDepartment: useRemoveDepartmentXxt,
useBulkRemoveDepartments: useBulkRemoveDepartmentsYyt, useBulkRemoveDepartments: useBulkRemoveDepartmentsYyt,
useDataSource: useDataSourceFt, useDataSource: useDataSource2,
useDisabled: useDisabledVvt, useDisabled: useDisabledVvt,
useAddDepartments: useAddDepartmentsGgt, useAddDepartments,
}} }}
></SchemaComponent> ></SchemaComponent>
</CollectionProvider_deprecated> </CollectionProvider_deprecated>

View File

@ -10,7 +10,7 @@ import { useDepTree2 } from '../hooks/useDepTree2';
import { T } from '../others/T'; import { T } from '../others/T';
import { y } from '../others/y'; import { y } from '../others/y';
import { getDepartmentStr } from '../utils/getDepartmentStr'; import { getDepartmentStr } from '../utils/getDepartmentStr';
import { ContextR } from './ContextR'; import { FilterKeysContext } from '../context/FilterKeysContext';
const Ze = () => ({ disabled: () => false }); const Ze = () => ({ disabled: () => false });
export const InternalDepartmentTableRe = ({ useDisabled: e = Ze }) => { export const InternalDepartmentTableRe = ({ useDisabled: e = Ze }) => {
@ -22,7 +22,7 @@ export const InternalDepartmentTableRe = ({ useDisabled: e = Ze }) => {
{ treeData: d, initData: A, loadData: b } = useDepTree2({ resource: x, resourceOf: m, params: g }), { treeData: d, initData: A, loadData: b } = useDepTree2({ resource: x, resourceOf: m, params: g }),
h = useField(), h = useField(),
{ disabled: F } = e(), { disabled: F } = e(),
{ hasFilter: C, expandedKeys: v, setExpandedKeys: l } = useContext(ContextR); { hasFilter: C, expandedKeys: v, setExpandedKeys: l } = useContext(FilterKeysContext);
useEffect(() => { useEffect(() => {
C || A(r == null ? void 0 : r.data); C || A(r == null ? void 0 : r.data);
}, [r, A, c, C]); }, [r, A, c, C]);

View File

@ -0,0 +1,10 @@
import React, { useContext } from 'react';
import { Checkbox, useRecord } from '@tachybase/client';
import { DepartmentsContext } from '../context/DepartmentsContext';
export const IsOwnerField = () => {
const { department } = useContext(DepartmentsContext);
const dep = useRecord().departments?.find((d) => d?.id === department?.id);
return <Checkbox.ReadPretty value={dep?.departmentsUsers.isOwner} />;
};

View File

@ -1,12 +0,0 @@
import { useContext } from 'react';
import { Checkbox, useRecord } from '@tachybase/client';
import { jsx } from 'react/jsx-runtime';
import { DepartmentsContext } from '../context/DepartmentsContext';
export const IsOwnerFieldQe = () => {
const { department: e } = useContext(DepartmentsContext),
o = (useRecord().departments || []).find((a) => (a == null ? void 0 : a.id) === (e == null ? void 0 : e.id));
return jsx(Checkbox.ReadPretty, { value: o == null ? void 0 : o.departmentsUsers.isOwner });
};

View File

@ -2,7 +2,7 @@ import React, { useEffect, useState } from 'react';
import { CollectionProvider_deprecated, ResourceActionContext } from '@tachybase/client'; import { CollectionProvider_deprecated, ResourceActionContext } from '@tachybase/client';
import { collectionDepartments } from '../collections/departments.collection'; import { collectionDepartments } from '../collections/departments.collection';
import { ContextR } from './ContextR'; import { FilterKeysContext } from '../context/FilterKeysContext';
export const RequestProvider = (prop) => { export const RequestProvider = (prop) => {
const [expandedKeys, setExpandedKeys] = useState([]); const [expandedKeys, setExpandedKeys] = useState([]);
@ -15,9 +15,9 @@ export const RequestProvider = (prop) => {
return ( return (
<ResourceActionContext.Provider value={service}> <ResourceActionContext.Provider value={service}>
<CollectionProvider_deprecated collection={collectionDepartments}> <CollectionProvider_deprecated collection={collectionDepartments}>
<ContextR.Provider value={{ expandedKeys, setExpandedKeys, hasFilter, setHasFilter }}> <FilterKeysContext.Provider value={{ expandedKeys, setExpandedKeys, hasFilter, setHasFilter }}>
{prop.children} {prop.children}
</ContextR.Provider> </FilterKeysContext.Provider>
</CollectionProvider_deprecated> </CollectionProvider_deprecated>
</ResourceActionContext.Provider> </ResourceActionContext.Provider>
); );

View File

@ -1,4 +1,4 @@
import { Fragment, useState } from 'react'; import React, { Fragment, useState } from 'react';
import { import {
ActionContextProvider, ActionContextProvider,
SchemaComponent, SchemaComponent,
@ -7,14 +7,14 @@ import {
useRequest, useRequest,
useResourceActionContext, useResourceActionContext,
} from '@tachybase/client'; } from '@tachybase/client';
import { useField, useForm } from '@tachybase/schema'; import { Field, useField, useForm } from '@tachybase/schema';
import { MoreOutlined, PlusOutlined } from '@ant-design/icons'; import { MoreOutlined, PlusOutlined } from '@ant-design/icons';
import { App, Button, Dropdown, Tag } from 'antd'; import { App, Button, Dropdown, Tag } from 'antd';
import { jsx, jsxs } from 'react/jsx-runtime'; import { jsx, jsxs } from 'react/jsx-runtime';
import { useTranslation } from '../../../locale'; import { useTranslation } from '../../../locale';
import { useDataSourceTtt } from '../hooks/useDataSourceTtt'; import { useDataSource } from '../hooks/useDataSource';
import { k } from '../others/k'; import { k } from '../others/k';
import { T } from '../others/T'; import { T } from '../others/T';
import { y } from '../others/y'; import { y } from '../others/y';
@ -23,129 +23,128 @@ import { getDepartmentStr } from '../utils/getDepartmentStr';
import { DepartmentTablePpe } from './DepartmentTablePpe'; import { DepartmentTablePpe } from './DepartmentTablePpe';
export const UserDepartmentsFieldOot = () => { export const UserDepartmentsFieldOot = () => {
const { modal: e, message: t } = App.useApp(), const { modal, message } = App.useApp();
{ t: o } = useTranslation(), const { t } = useTranslation();
[a, r] = useState(false), const [visible, setVisible] = useState(false);
c = useRecord(), const user = useRecord();
i = useField(), const field = useField<Field>();
{ refresh: x } = useResourceActionContext(), const { refresh: x } = useResourceActionContext();
m = (l) => const m = (l) =>
l != null && l.length l != null && l.length
? l.map((u) => { ? l.map((u) => {
var f, S; return {
return T(y({}, u), { ...u,
isMain: (f = u.departmentsUsers) == null ? void 0 : f.isMain, isMain: u.departmentsUsers?.isMain,
isOwner: (S = u.departmentsUsers) == null ? void 0 : S.isOwner, isOwner: u.departmentsUsers?.isOwner,
title: getDepartmentStr(u), title: getDepartmentStr(u),
}); };
}) })
: [], : [];
g = useAPIClient(); const api = useAPIClient();
useRequest( useRequest(
() => () =>
g api
.resource('users.departments', c.id) .resource('users.departments', user.id)
.list({ appends: ['parent(recursively=true)'], pagination: false }) .list({ appends: ['parent(recursively=true)'], pagination: false })
.then((l) => { .then((result) => {
var f; const u = m(result?.data?.data);
const u = m((f = l == null ? void 0 : l.data) == null ? void 0 : f.data); field.setValue(u);
i.setValue(u);
}), }),
{ ready: c.id }, { ready: user.id },
); );
const d = () => { const useAddDepartments = () => {
const l = useAPIClient(), const api = useAPIClient();
u = useForm(), const form = useForm();
{ departments: f } = u.values || {}; const { departments: f } = form.values || {};
return { return {
run() { run() {
return k(this, null, function* () { return k(this, null, function* () {
yield l.resource('users.departments', c.id).add({ values: f.map((O) => O.id) }), yield api.resource('users.departments', user.id).add({ values: f.map((O) => O.id) }),
u.reset(), form.reset(),
i.setValue([ field.setValue([
...i.value, ...field.value,
...f.map((O, $) => ...f.map((O, $) =>
T(y({}, O), { isMain: $ === 0 && i.value.length === 0, title: getDepartmentStr(O) }), T(y({}, O), { isMain: $ === 0 && field.value.length === 0, title: getDepartmentStr(O) }),
),
]),
r(false),
x();
});
},
};
},
A = (l) => {
e.confirm({
title: o('Remove department'),
content: o('Are you sure you want to remove it?'),
onOk: () =>
k(this, null, function* () {
yield g.resource('users.departments', c.id).remove({ values: [l.id] }),
t.success(o('Deleted successfully')),
i.setValue(
i.value
.filter((u) => u.id !== l.id)
.map((u, f) => T(y({}, u), { isMain: (l.isMain && f === 0) || u.isMain })),
), ),
x(); ]),
}), setVisible(false),
}); x();
}, });
b = (l) => },
k(this, null, function* () { };
yield g.resource('users').setMainDepartment({ values: { userId: c.id, departmentId: l.id } }), };
t.success(o('Set successfully')), const A = (l) => {
i.setValue(i.value.map((u) => T(y({}, u), { isMain: u.id === l.id }))), modal.confirm({
x(); title: t('Remove department'),
}), content: t('Are you sure you want to remove it?'),
h = (l) => onOk: () =>
k(this, null, function* () { k(this, null, function* () {
yield g.resource('departments').setOwner({ values: { userId: c.id, departmentId: l.id } }), yield api.resource('users.departments', user.id).remove({ values: [l.id] }),
t.success(o('Set successfully')), message.success(t('Deleted successfully')),
i.setValue(i.value.map((u) => T(y({}, u), { isOwner: u.id === l.id ? true : u.isOwner }))), field.setValue(
x(); field.value
}), .filter((u) => u.id !== l.id)
F = (l) => .map((u, f) => T(y({}, u), { isMain: (l.isMain && f === 0) || u.isMain })),
k(this, null, function* () { ),
yield g.resource('departments').removeOwner({ values: { userId: c.id, departmentId: l.id } }), x();
t.success(o('Set successfully')), }),
i.setValue(i.value.map((u) => T(y({}, u), { isOwner: u.id === l.id ? false : u.isOwner }))), });
x(); };
}), const b = (l) =>
C = (l, u) => { k(this, null, function* () {
switch (l) { yield api.resource('users').setMainDepartment({ values: { userId: user.id, departmentId: l.id } }),
case 'setMain': message.success(t('Set successfully')),
b(u); field.setValue(field.value.map((u) => T(y({}, u), { isMain: u.id === l.id }))),
break; x();
case 'setOwner': });
h(u); const h = (l) =>
break; k(this, null, function* () {
case 'removeOwner': yield api.resource('departments').setOwner({ values: { userId: user.id, departmentId: l.id } }),
F(u); message.success(t('Set successfully')),
break; field.setValue(field.value.map((u) => T(y({}, u), { isOwner: u.id === l.id ? true : u.isOwner }))),
case 'remove': x();
A(u); });
} const F = (l) =>
}, k(this, null, function* () {
v = () => ({ disabled: (l) => i.value.some((u) => u.id === l.id) }); yield api.resource('departments').removeOwner({ values: { userId: user.id, departmentId: l.id } }),
message.success(t('Set successfully')),
field.setValue(field.value.map((u) => T(y({}, u), { isOwner: u.id === l.id ? false : u.isOwner }))),
x();
});
const C = (l, u) => {
switch (l) {
case 'setMain':
b(u);
break;
case 'setOwner':
h(u);
break;
case 'removeOwner':
F(u);
break;
case 'remove':
A(u);
}
};
const useDisabled = () => ({ disabled: (l) => field.value.some((u) => u.id === l.id) });
return jsxs(ActionContextProvider, { return jsxs(ActionContextProvider, {
value: { visible: a, setVisible: r }, value: { visible: visible, setVisible: setVisible },
children: [ children: [
jsxs(Fragment, { jsxs(Fragment, {
children: [ children: [
((i == null ? void 0 : i.value) || []).map((l) => (field?.value || []).map((l) =>
jsxs( jsxs(
Tag, Tag,
{ {
style: { padding: '5px 8px', background: 'transparent', marginBottom: '5px' }, style: { padding: '5px 8px', background: 'transparent', marginBottom: '5px' },
children: [ children: [
jsx('span', { style: { marginRight: '5px' }, children: l.title }), jsx('span', { style: { marginRight: '5px' }, children: l.title }),
l.isMain ? jsx(Tag, { color: 'processing', bordered: false, children: o('Main') }) : '', l.isMain ? jsx(Tag, { color: 'processing', bordered: false, children: t('Main') }) : '',
jsx(Dropdown, { jsx(Dropdown, {
menu: { menu: {
items: [ items: [
...(l.isMain ? [] : [{ label: o('Set as main department'), key: 'setMain' }]), ...(l.isMain ? [] : [{ label: t('Set as main department'), key: 'setMain' }]),
{ label: o('Remove'), key: 'remove' }, { label: t('Remove'), key: 'remove' },
], ],
onClick: ({ key: u }) => C(u, l), onClick: ({ key: u }) => C(u, l),
}, },
@ -159,21 +158,22 @@ export const UserDepartmentsFieldOot = () => {
l.id, l.id,
), ),
), ),
jsx(Button, { icon: jsx(PlusOutlined, {}), onClick: () => r(true) }), <Button key={1} icon={<PlusOutlined />} onClick={() => setVisible(true)} />,
], ],
}), }),
jsx(SchemaComponent, { <SchemaComponent
schema: schemaJe, key={2}
components: { schema={schemaJe}
components={{
DepartmentTable: DepartmentTablePpe, DepartmentTable: DepartmentTablePpe,
}, }}
scope: { scope={{
user: c, user,
useDataSource: useDataSourceTtt, useDataSource,
useAddDepartments: d, useAddDepartments,
useDisabled: v, useDisabled,
}, }}
}), />,
], ],
}); });
}; };

View File

@ -0,0 +1,10 @@
import React from 'react';
export interface FilterKeysContextProps {
expandedKeys: any[];
setExpandedKeys: any;
hasFilter: any;
setHasFilter: any;
}
export const FilterKeysContext = React.createContext<Partial<FilterKeysContextProps>>({});

View File

@ -0,0 +1,21 @@
import { useContext } from 'react';
import { useActionContext, useAPIClient, useResourceActionContext } from '@tachybase/client';
import { RolesManagerContext } from '@tachybase/plugin-acl/client';
import { useForm } from '@tachybase/schema';
export const useAddDepartments = () => {
const { role } = useContext(RolesManagerContext);
const api = useAPIClient();
const form = useForm();
const { setVisible } = useActionContext();
const { refresh } = useResourceActionContext();
const { departments: departments } = form.values || {};
return {
async run() {
await api.resource('roles.departments', role.name).add({ values: departments.map((dep) => dep.id) });
form.reset();
setVisible(false);
refresh();
},
};
};

View File

@ -1,22 +0,0 @@
import { useContext } from 'react';
import { useActionContext, useAPIClient, useResourceActionContext } from '@tachybase/client';
import { RolesManagerContext } from '@tachybase/plugin-acl/client';
import { useForm } from '@tachybase/schema';
import { k } from '../others/k';
export const useAddDepartmentsGgt = () => {
const { role: e } = useContext(RolesManagerContext),
t = useAPIClient(),
o = useForm(),
{ setVisible: a } = useActionContext(),
{ refresh: r } = useResourceActionContext(),
{ departments: c } = o.values || {};
return {
run() {
return k(this, null, function* () {
yield t.resource('roles.departments', e.name).add({ values: c.map((x) => x.id) }), o.reset(), a(false), r();
});
},
};
};

View File

@ -0,0 +1,11 @@
import { useRequest } from '@tachybase/client';
export const useDataSource = (props) => {
const params = {
resource: 'departments',
action: 'list',
params: { appends: ['parent(recursively=true)'], sort: ['createdAt'] },
};
const service = useRequest(params, props);
return { ...service, defaultRequest: params };
};

View File

@ -0,0 +1,11 @@
import { useRequest } from '@tachybase/client';
export const useDataSource2 = (props) => {
const params = {
resource: 'departments',
action: 'list',
params: { appends: ['roles', 'parent(recursively=true)'], sort: ['createdAt'] },
};
const service = useRequest(params, props);
return { ...service, defaultRequest: params };
};

View File

@ -1,14 +0,0 @@
import { useRequest } from '@tachybase/client';
import { T } from '../others/T';
import { y } from '../others/y';
export const useDataSourceFt = (e) => {
const t = {
resource: 'departments',
action: 'list',
params: { appends: ['roles', 'parent(recursively=true)'], sort: ['createdAt'] },
},
o = useRequest(t, e);
return T(y({}, o), { defaultRequest: t });
};

View File

@ -1,14 +0,0 @@
import { useRequest } from '@tachybase/client';
import { T } from '../others/T';
import { y } from '../others/y';
export const useDataSourceTtt = (e) => {
const t = {
resource: 'departments',
action: 'list',
params: { appends: ['parent(recursively=true)'], sort: ['createdAt'] },
},
o = useRequest(t, e);
return T(y({}, o), { defaultRequest: t });
};

View File

@ -1,11 +1,11 @@
import React from 'react'; import React from 'react';
import { Plugin, SchemaComponentContext, useSchemaComponentContext } from '@tachybase/client'; import { Plugin, SchemaComponentContext, useSchemaComponentContext } from '@tachybase/client';
import PluginACLClient from '@tachybase/plugin-acl/client'; import { PluginACLClient } from '@tachybase/plugin-acl/client';
import { tval } from '../../locale'; import { tval } from '../../locale';
import { Departments } from './components/Departments'; import { Departments } from './components/Departments';
import { DepartmentsProvider } from './components/DepartmentsProvider'; import { DepartmentsProvider } from './components/DepartmentsProvider';
import { MmtComponent } from './components/MmtComponent'; import { DepartmentManagementComponent } from './components/DepartmentManagementComponent';
import { UserDepartmentsField } from './components/UserDepartmentsField'; import { UserDepartmentsField } from './components/UserDepartmentsField';
import { DepartmentOwnersFieldSetting } from './settings/DepartmentOwnersFieldSetting'; import { DepartmentOwnersFieldSetting } from './settings/DepartmentOwnersFieldSetting';
import { UserDepartmentsFieldSetting } from './settings/UserDepartmentsFieldSetting'; import { UserDepartmentsFieldSetting } from './settings/UserDepartmentsFieldSetting';
@ -29,7 +29,7 @@ export class DepartmentsPlugin extends Plugin {
return ( return (
<SchemaComponentContext.Provider value={{ ...context, designable: false }}> <SchemaComponentContext.Provider value={{ ...context, designable: false }}>
<DepartmentsProvider> <DepartmentsProvider>
<MmtComponent /> <DepartmentManagementComponent />
</DepartmentsProvider> </DepartmentsProvider>
</SchemaComponentContext.Provider> </SchemaComponentContext.Provider>
); );

View File

@ -9,10 +9,10 @@ import {
import { useField } from '@tachybase/schema'; import { useField } from '@tachybase/schema';
import { useTranslation } from '../../../locale'; import { useTranslation } from '../../../locale';
import { ContextR } from '../components/ContextR'; import { FilterKeysContext } from '../context/FilterKeysContext';
export const useFilterActionPropsXe = () => { export const useFilterActionPropsXe = () => {
const { setHasFilter, setExpandedKeys } = useContext(ContextR); const { setHasFilter, setExpandedKeys } = useContext(FilterKeysContext);
const { t } = useTranslation(); const { t } = useTranslation();
const collection = useContext(CollectionContext); const collection = useContext(CollectionContext);
const options = useFilterFieldOptions(collection.fields); const options = useFilterFieldOptions(collection.fields);

View File

@ -310,12 +310,21 @@ export const InternalAdminLayout = () => {
</div> </div>
</Layout.Header> </Layout.Header>
{params.name && ( {params.name && (
<Layout.Sider theme={'light'} ref={sideMenuRef} style={{ height: '100vh' }}> <Layout.Sider
theme={'light'}
ref={sideMenuRef}
style={{ height: '100vh' }}
className={css`
.ant-layout-sider-children {
display: flex;
flex-direction: column;
}
`}
>
<header <header
className={css` className={css`
flex-shrink: 0;
height: var(--tb-header-height); height: var(--tb-header-height);
line-height: var(--tb-header-height); width: 100%;
background: transparent; background: transparent;
pointer-events: none; pointer-events: none;
`} `}

View File

@ -3,7 +3,6 @@ import { Application } from '@tachybase/client';
import { tval } from '../locale'; import { tval } from '../locale';
import { LinkManager } from './LinkManager'; import { LinkManager } from './LinkManager';
import { Configuration } from './TokenConfiguration'; import { Configuration } from './TokenConfiguration';
import { WebhookManager } from './WebhookManager';
export * from './LinkManager'; export * from './LinkManager';
export * from './TokenConfiguration'; export * from './TokenConfiguration';
@ -15,11 +14,6 @@ export class PluginSettingsHelper {
title: tval('Hera integration'), title: tval('Hera integration'),
icon: 'HomeOutlined', icon: 'HomeOutlined',
}); });
this.app.pluginSettingsManager.add('hera.webhook', {
title: tval('Webhook manager'),
icon: 'ShareAltOutlined',
Component: WebhookManager,
});
this.app.pluginSettingsManager.add('hera.token', { this.app.pluginSettingsManager.add('hera.token', {
title: tval('Third-party integration configuration'), title: tval('Third-party integration configuration'),
icon: 'ShareAltOutlined', icon: 'ShareAltOutlined',

View File

@ -5,4 +5,3 @@ export * from './link-manager-controller';
export * from './system-message-controller'; export * from './system-message-controller';
export * from './departments'; export * from './departments';
export * from './users'; export * from './users';
export * from './webhooks';

View File

@ -3,7 +3,6 @@ import { Plugin } from '@tachybase/server';
export class GraphCollectionManagerPlugin extends Plugin { export class GraphCollectionManagerPlugin extends Plugin {
async load() { async load() {
await this.importCollections(path.resolve(__dirname, 'collections'));
this.app.acl.allow('graphPositions', '*'); this.app.acl.allow('graphPositions', '*');
} }
} }

View File

@ -1,13 +1,5 @@
import { Plugin } from '@tachybase/client'; import { Plugin } from '@tachybase/client';
import { KitConfiguration } from './configuration/kit'; class PluginWorkflowNoticeClient extends Plugin {}
import { KitUsage } from './usage/kit';
class PluginWorkflowNoticeClient extends Plugin {
async afterAdd() {
await this.app.pm.add(KitConfiguration);
await this.app.pm.add(KitUsage);
}
}
export default PluginWorkflowNoticeClient; export default PluginWorkflowNoticeClient;

View File

@ -1,49 +1,5 @@
import path from 'path';
import WorkflowPlugin from '@tachybase/plugin-workflow';
import { Plugin } from '@tachybase/server'; import { Plugin } from '@tachybase/server';
import { COLLECTION_NOTICE_NAME, NOTICE_INSTRUCTION_NAMESPACE } from '../common/constants'; export class PluginWorkflowNoticeServer extends Plugin {}
import { init } from './actions';
import { COLLECTION_WORKFLOWS_NAME } from './collections/workflowNotice';
import NoticeInstruction from './NoticeInstruction';
export class PluginWorkflowNoticeServer extends Plugin {
workflow;
async afterAdd() {}
async beforeLoad() {
this.app.on('afterLoadPlugin', (plugin) => {
if (!(plugin instanceof WorkflowPlugin)) {
return;
}
this.workflow = plugin;
plugin.instructions.register(NOTICE_INSTRUCTION_NAMESPACE, new NoticeInstruction(plugin));
});
}
async load() {
const { db } = this;
db.addMigrations({
namespace: NOTICE_INSTRUCTION_NAMESPACE,
directory: path.resolve(__dirname, 'migrations'),
context: {
plugin: this,
},
});
await db.import({
directory: path.resolve(__dirname, 'collections'),
});
init(this);
this.app.acl.allow(COLLECTION_WORKFLOWS_NAME, ['listWorkflowNoticeFlows'], 'loggedIn');
this.app.acl.allow(COLLECTION_NOTICE_NAME, ['get', 'list', 'listCentralized', 'submit'], 'loggedIn');
}
async install() {}
async afterEnable() {}
async afterDisable() {}
async remove() {}
}
export default PluginWorkflowNoticeServer; export default PluginWorkflowNoticeServer;

View File

@ -17,11 +17,14 @@
}, },
"devDependencies": { "devDependencies": {
"@ant-design/icons": "~5.3.7", "@ant-design/icons": "~5.3.7",
"@codemirror/autocomplete": "^6.16.2",
"@codemirror/lang-javascript": "^6.2.2",
"@tachybase/components": "workspace:*", "@tachybase/components": "workspace:*",
"@tachybase/plugin-workflow-test": "workspace:*", "@tachybase/plugin-workflow-test": "workspace:*",
"@types/ejs": "^3.1.1", "@types/ejs": "^3.1.1",
"@types/file-saver": "^2.0.7", "@types/file-saver": "^2.0.7",
"@types/lodash": "^4.17.5", "@types/lodash": "^4.17.5",
"@uiw/react-codemirror": "^4.22.2",
"antd": "5.18.1", "antd": "5.18.1",
"axios": "^1.6.2", "axios": "^1.6.2",
"cron-parser": "4.4.0", "cron-parser": "4.4.0",

View File

@ -6,6 +6,7 @@ import { ExecutionPage } from './ExecutionPage';
import { PluginActionTrigger } from './features/action-trigger'; import { PluginActionTrigger } from './features/action-trigger';
import { PluginAggregate } from './features/aggregate'; import { PluginAggregate } from './features/aggregate';
import { PluginAPIRegularClient } from './features/api-regular'; import { PluginAPIRegularClient } from './features/api-regular';
import PluginApproval from './features/approval';
import { PluginDelay } from './features/delay'; import { PluginDelay } from './features/delay';
import { PluginDaynamicCalculation } from './features/dynamic-calculation'; import { PluginDaynamicCalculation } from './features/dynamic-calculation';
import { PluginWorkflowInterceptor } from './features/interceptor'; import { PluginWorkflowInterceptor } from './features/interceptor';
@ -13,6 +14,7 @@ import PluginWorkflowJSParseClient from './features/js-parse';
import PluginWorkflowJsonParseClient from './features/json-parse'; import PluginWorkflowJsonParseClient from './features/json-parse';
import { PluginLoop } from './features/loop'; import { PluginLoop } from './features/loop';
import { PluginManual } from './features/manual'; import { PluginManual } from './features/manual';
import PluginWorkflowNoticeClient from './features/notice';
import { PluginOmniTrigger } from './features/omni-trigger'; import { PluginOmniTrigger } from './features/omni-trigger';
import { PluginParallel } from './features/parallel'; import { PluginParallel } from './features/parallel';
import { PluginRequest } from './features/request'; import { PluginRequest } from './features/request';
@ -20,6 +22,7 @@ import { PluginResponse } from './features/response';
import { PluginSql } from './features/sql'; import { PluginSql } from './features/sql';
import { PluginTriggerInstruction } from './features/trigger-instruction/plugin'; import { PluginTriggerInstruction } from './features/trigger-instruction/plugin';
import { PluginVariables } from './features/variables'; import { PluginVariables } from './features/variables';
import { PluginWebhook } from './features/webhook/plugin';
import { NAMESPACE } from './locale'; import { NAMESPACE } from './locale';
import { Instruction } from './nodes'; import { Instruction } from './nodes';
import CalculationInstruction from './nodes/calculation'; import CalculationInstruction from './nodes/calculation';
@ -91,6 +94,9 @@ export class PluginWorkflow extends Plugin {
await this.pm.add(PluginResponse); await this.pm.add(PluginResponse);
await this.pm.add(PluginOmniTrigger); await this.pm.add(PluginOmniTrigger);
await this.pm.add(PluginTriggerInstruction); await this.pm.add(PluginTriggerInstruction);
await this.pm.add(PluginApproval);
await this.pm.add(PluginWorkflowNoticeClient);
await this.pm.add(PluginWebhook);
} }
async load() { async load() {

View File

@ -0,0 +1,95 @@
import React from 'react';
import { connect } from '@tachybase/schema';
import { autocompletion } from '@codemirror/autocomplete';
import { javascript } from '@codemirror/lang-javascript';
import CM from '@uiw/react-codemirror';
// 定义全局对象和子对象的补全项
const globalVariables = [
{
label: 'ctx',
type: 'variable',
info: 'Global context object',
apply: (view, completion, from, to) => {
view.dispatch({
changes: { from, to, insert: completion.label },
selection: { anchor: from + completion.label.length },
});
},
},
];
const ctxProperties = [
{ label: 'body', type: 'variable', info: 'pass to workflow or response to user' },
{ label: 'request', type: 'variable', info: 'ctx.request' },
{ label: 'action', type: 'variable', info: 'ctx.action' },
];
const requestProperties = [
{ label: 'header', type: 'variable', info: 'ctx.request.header' },
{ label: 'query', type: 'variable', info: 'ctx.request.query' },
{ label: 'body', type: 'variable', info: 'ctx.request.body' },
{ label: 'method', type: 'variable', info: 'ctx.request.method' },
];
const actionProperties = [
{ label: 'filter', type: 'variable', info: 'ctx.action.filter' },
{ label: 'fields', type: 'variable', info: 'ctx.action.fields' },
{ label: 'except', type: 'variable', info: 'ctx.action.except' },
{ label: 'appends', type: 'variable', info: 'ctx.action.appends' },
{ label: 'sort', type: 'variable', info: 'ctx.action.sort' },
{ label: 'paginate', type: 'variable', info: 'ctx.action.paginate' },
{ label: 'page', type: 'variable', info: 'ctx.action.page' },
{ label: 'pageSize', type: 'variable', info: 'ctx.action.pageSize' },
];
const completionSource = (context) => {
const word = context.matchBefore(/\w*/);
if (word.from === word.to && !context.explicit) return null;
if (context.state.sliceDoc(word.from - 4, word.from) === 'ctx.') {
return {
from: word.from,
options: ctxProperties,
validFor: /^\w*$/,
};
} else if (context.state.sliceDoc(word.from - 8, word.from) === 'ctx.request.') {
return {
from: word.from,
options: requestProperties,
validFor: /^\w*$/,
};
} else if (context.state.sliceDoc(word.from - 7, word.from) === 'ctx.action.') {
return {
from: word.from,
options: actionProperties,
validFor: /^\w*$/,
};
} else if (context.explicit && word.text.length === 0) {
return {
from: word.from,
options: globalVariables,
validFor: /^\w*$/,
};
}
return null;
};
export const CodeMirror = connect(({ value, onChange, ...otherProps }) => {
return (
<CM
value={value || ''}
onChange={onChange}
{...otherProps}
extensions={[
javascript({ jsx: true }),
autocompletion({
override: [completionSource],
}),
]}
height="300px"
></CM>
);
});

View File

@ -1,9 +1,12 @@
import React from 'react'; import React from 'react';
import { useCompile } from '@tachybase/client'; import { useCompile } from '@tachybase/client';
import { Branch, NodeDefaultView, useFlowContext, useStyles } from '@tachybase/plugin-workflow/client';
import { Tag } from 'antd'; import { Tag } from 'antd';
import { Branch } from '../../../../Branch';
import { useFlowContext } from '../../../../FlowContext';
import { NodeDefaultView } from '../../../../nodes';
import useStyles from '../../../../style';
import { APPROVAL_ACTION_STATUS, approvalStatusConfigObj } from '../../constants'; import { APPROVAL_ACTION_STATUS, approvalStatusConfigObj } from '../../constants';
// 审批节点组件 // 审批节点组件

View File

@ -1,10 +1,10 @@
import React, { useCallback, useState } from 'react'; import React, { useCallback, useState } from 'react';
import { ArrayItems } from '@tachybase/components'; import { ArrayItems } from '@tachybase/components';
import { useWorkflowExecuted } from '@tachybase/plugin-workflow/client';
import { PlusOutlined } from '@ant-design/icons'; import { PlusOutlined } from '@ant-design/icons';
import { Button, Popover, Space } from 'antd'; import { Button, Popover, Space } from 'antd';
import { useWorkflowExecuted } from '../../../../../hooks';
import { useTranslation } from '../../../locale'; import { useTranslation } from '../../../locale';
// 添加审批人(选择/查询) // 添加审批人(选择/查询)

View File

@ -1,8 +1,10 @@
import { default as React } from 'react'; import { default as React } from 'react';
import { RemoteSelect, SchemaComponent, useCollectionFilterOptions, useToken, Variable } from '@tachybase/client'; import { RemoteSelect, SchemaComponent, useCollectionFilterOptions, useToken, Variable } from '@tachybase/client';
import { FilterDynamicComponent, useWorkflowVariableOptions } from '@tachybase/plugin-workflow/client';
import { useField } from '@tachybase/schema'; import { useField } from '@tachybase/schema';
import { FilterDynamicComponent } from '../../../../../components';
import { useWorkflowVariableOptions } from '../../../../../variable';
// 添加审批人-选择器 // 添加审批人-选择器
export const AssigneesSelect = (props) => { export const AssigneesSelect = (props) => {
if (typeof props.value === 'object' && props.value) { if (typeof props.value === 'object' && props.value) {

View File

@ -1,11 +1,9 @@
import { gridRowColWrap, SchemaInitializer, usePlugin } from '@tachybase/client'; import { gridRowColWrap, SchemaInitializer, usePlugin } from '@tachybase/client';
import PluginWorkflow, {
useAvailableUpstreams,
useFlowContext,
useNodeContext,
useTrigger,
} from '@tachybase/plugin-workflow/client';
import { useFlowContext } from '../../../../../FlowContext';
import { useAvailableUpstreams, useNodeContext } from '../../../../../nodes';
import { PluginWorkflow } from '../../../../../Plugin';
import { useTrigger } from '../../../../../triggers';
import { NAMESPACE } from '../../../locale'; import { NAMESPACE } from '../../../locale';
import { ApproverAddBlockComponent } from './VC.ApproverAddBlock'; import { ApproverAddBlockComponent } from './VC.ApproverAddBlock';
import { ApproverAddBlockKit } from './VC.ApproverAddBlockKit'; import { ApproverAddBlockKit } from './VC.ApproverAddBlockKit';

View File

@ -8,10 +8,11 @@ import {
useSchemaInitializerItem, useSchemaInitializerItem,
useSchemaTemplateManager, useSchemaTemplateManager,
} from '@tachybase/client'; } from '@tachybase/client';
import { useFlowContext } from '@tachybase/plugin-workflow/client';
import _ from 'lodash'; import _ from 'lodash';
import { useFlowContext } from '../../../../../FlowContext';
export const ApproverAddBlockComponent = () => { export const ApproverAddBlockComponent = () => {
const { workflow } = useFlowContext(); const { workflow } = useFlowContext();
const [dataSourceName, collection] = parseCollectionName(workflow.config.collection); const [dataSourceName, collection] = parseCollectionName(workflow.config.collection);

View File

@ -1,11 +1,11 @@
import { default as React, useCallback, useContext } from 'react'; import { default as React, useCallback, useContext } from 'react';
import { SchemaComponent, useAPIClient, useFormBlockContext, useRequest } from '@tachybase/client'; import { SchemaComponent, useAPIClient, useFormBlockContext, useRequest } from '@tachybase/client';
import { DetailsBlockProvider, SimpleDesigner } from '@tachybase/plugin-workflow/client';
import { useForm } from '@tachybase/schema'; import { useForm } from '@tachybase/schema';
import { uid } from '@tachybase/utils/client'; import { uid } from '@tachybase/utils/client';
import { Spin } from 'antd'; import { Spin } from 'antd';
import { DetailsBlockProvider, SimpleDesigner } from '../../../../../components';
import { FormBlockProvider } from '../../../common/Pd.FormBlock'; import { FormBlockProvider } from '../../../common/Pd.FormBlock';
import { flatSchemaArray } from '../../../constants'; import { flatSchemaArray } from '../../../constants';
import { ContextApproverConfig } from '../Pd.ContextApproverConfig'; import { ContextApproverConfig } from '../Pd.ContextApproverConfig';

View File

@ -6,9 +6,9 @@ import {
SchemaComponent, SchemaComponent,
SchemaComponentContext, SchemaComponentContext,
} from '@tachybase/client'; } from '@tachybase/client';
import { useFlowContext } from '@tachybase/plugin-workflow/client';
import { uid } from '@tachybase/utils/client'; import { uid } from '@tachybase/utils/client';
import { useFlowContext } from '../../../../../FlowContext';
import { CollectionApprovalTodos } from '../../../common/Cn.ApprovalTodos'; import { CollectionApprovalTodos } from '../../../common/Cn.ApprovalTodos';
import { NAMESPACE } from '../../../locale'; import { NAMESPACE } from '../../../locale';
import { ApproverBlock } from './VC.ApproverBlock'; import { ApproverBlock } from './VC.ApproverBlock';

View File

@ -1,9 +1,10 @@
import React from 'react'; import React from 'react';
import { css } from '@tachybase/client'; import { css } from '@tachybase/client';
import { ArrayItems } from '@tachybase/components'; import { ArrayItems } from '@tachybase/components';
import { Instruction, RadioWithTooltip } from '@tachybase/plugin-workflow/client';
import { uid } from '@tachybase/utils/client'; import { uid } from '@tachybase/utils/client';
import { RadioWithTooltip } from '../../../../components';
import { Instruction } from '../../../../nodes';
import { APPROVAL_ACTION_STATUS } from '../../constants'; import { APPROVAL_ACTION_STATUS } from '../../constants';
import { NAMESPACE } from '../../locale'; import { NAMESPACE } from '../../locale';
import { AssigneesAddition } from './approval-config/VC.AssigneesAddition'; import { AssigneesAddition } from './approval-config/VC.AssigneesAddition';

View File

@ -1,6 +1,6 @@
import { Plugin } from '@tachybase/client'; import { Plugin } from '@tachybase/client';
import PluginWorkflow from '@tachybase/plugin-workflow/client';
import { PluginWorkflow } from '../../../../Plugin';
import { ApproverActionConfigInitializer } from './approver-interface/Iz.ApproverActionConfig'; import { ApproverActionConfigInitializer } from './approver-interface/Iz.ApproverActionConfig';
import { ApproverAddBlockInitializer } from './approver-interface/Iz.ApproverAddBlock'; import { ApproverAddBlockInitializer } from './approver-interface/Iz.ApproverAddBlock';
import { ApprovalInstruction } from './node.ApprovalInstruction'; import { ApprovalInstruction } from './node.ApprovalInstruction';

View File

@ -1,14 +1,10 @@
import { SchemaInitializerItemType, useCollectionManager_deprecated, useCompile } from '@tachybase/client'; import { SchemaInitializerItemType, useCollectionManager_deprecated, useCompile } from '@tachybase/client';
import {
CollectionBlockInitializer,
getCollectionFieldOptions,
RadioWithTooltip,
Trigger,
UseVariableOptions,
useWorkflowAnyExecuted,
} from '@tachybase/plugin-workflow/client';
import { useForm } from '@tachybase/schema'; import { useForm } from '@tachybase/schema';
import { CollectionBlockInitializer, RadioWithTooltip } from '../../../../components';
import { useWorkflowAnyExecuted } from '../../../../hooks';
import { Trigger } from '../../../../triggers';
import { getCollectionFieldOptions, UseVariableOptions } from '../../../../variable';
import { NAMESPACE, tval, usePluginTranslation } from '../../locale'; import { NAMESPACE, tval, usePluginTranslation } from '../../locale';
import { ConfigButtonView } from './ConfigButton.view'; import { ConfigButtonView } from './ConfigButton.view';
import { LauncherInterface } from './launcher-interface/LauncherInterface.schema'; import { LauncherInterface } from './launcher-interface/LauncherInterface.schema';

View File

@ -7,11 +7,12 @@ import {
useFormBlockProps, useFormBlockProps,
useRequest, useRequest,
} from '@tachybase/client'; } from '@tachybase/client';
import { useFlowContext } from '@tachybase/plugin-workflow/client';
import { uid } from '@tachybase/utils/client'; import { uid } from '@tachybase/utils/client';
import { Spin } from 'antd'; import { Spin } from 'antd';
import { useFlowContext } from '../../../../../FlowContext';
// 发起人操作界面-创建区块 // 发起人操作界面-创建区块
export const SchemaAddBlock = ({ value, onChange }) => { export const SchemaAddBlock = ({ value, onChange }) => {
const api = useAPIClient(); const api = useAPIClient();

View File

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

View File

@ -1,5 +1,4 @@
import { JOB_STATUS } from '@tachybase/plugin-workflow/client'; import { JOB_STATUS } from '../../constants';
import { lang, NAMESPACE } from './locale'; import { lang, NAMESPACE } from './locale';
// 审批状态 // 审批状态

View File

@ -0,0 +1,15 @@
import { Plugin } from '@tachybase/client';
import KitApprovalConfiguration from './configuration/plugin';
import { KitApprovalUsage } from './usage/plugin';
export class PluginApproval extends Plugin {
async afterAdd() {
this.pm.add(KitApprovalConfiguration);
this.pm.add(KitApprovalUsage);
}
async beforeLoad() {}
async load() {}
}
export default PluginApproval;

View File

@ -1,6 +1,6 @@
import { i18n, tval as nTval } from '@tachybase/client'; import { i18n, tval as nTval } from '@tachybase/client';
export const NAMESPACE = '@hera/plugin-approval'; export const NAMESPACE = 'workflow';
export function usePluginTranslation(): any { export function usePluginTranslation(): any {
return useTranslation(); return useTranslation();

View File

@ -1,9 +1,6 @@
import React, { useContext } from 'react'; import React from 'react';
import { FlowContext } from '@tachybase/plugin-workflow/client';
export function useFlowContext() { import { FlowContext } from '../../../../../FlowContext';
return useContext(FlowContext);
}
export function FlowContextProvider({ workflow = undefined, children, value }) { export function FlowContextProvider({ workflow = undefined, children, value }) {
return <FlowContext.Provider value={{ workflow, ...value }}>{children}</FlowContext.Provider>; return <FlowContext.Provider value={{ workflow, ...value }}>{children}</FlowContext.Provider>;

View File

@ -1,7 +1,7 @@
import React, { createContext, useContext } from 'react'; import React, { createContext, useContext } from 'react';
import { useCurrentUserContext } from '@tachybase/client'; import { useCurrentUserContext } from '@tachybase/client';
import { useFlowContext } from '@tachybase/plugin-workflow/client';
import { useFlowContext } from '../../../../../FlowContext';
import { APPROVAL_STATUS } from '../../../constants'; import { APPROVAL_STATUS } from '../../../constants';
import { useApproval } from '../../approval-common/ApprovalData.provider'; import { useApproval } from '../../approval-common/ApprovalData.provider';

View File

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

View File

@ -7,11 +7,11 @@ import {
useRecord, useRecord,
useRequest, useRequest,
} from '@tachybase/client'; } from '@tachybase/client';
import { DetailsBlockProvider, FlowContext } from '@tachybase/plugin-workflow/client';
import { useForm } from '@tachybase/schema'; import { useForm } from '@tachybase/schema';
import { Result, Spin } from 'antd'; import { Result, Spin } from 'antd';
import { DetailsBlockProvider } from '../../../../../components';
import { FormBlockProvider } from '../../../common/Pd.FormBlock'; import { FormBlockProvider } from '../../../common/Pd.FormBlock';
import { NAMESPACE } from '../../../locale'; import { NAMESPACE } from '../../../locale';
import { ApprovalContext } from '../../approval-common/ApprovalData.provider'; import { ApprovalContext } from '../../approval-common/ApprovalData.provider';

View File

@ -5,9 +5,9 @@ import {
useBlockRequestContext, useBlockRequestContext,
useCollection_deprecated, useCollection_deprecated,
} from '@tachybase/client'; } from '@tachybase/client';
import { useFlowContext } from '@tachybase/plugin-workflow/client';
import { useField, useForm } from '@tachybase/schema'; import { useField, useForm } from '@tachybase/schema';
import { useFlowContext } from '../../../../../../../FlowContext';
import { useContextApprovalStatus } from '../Pd.ActionStatus'; import { useContextApprovalStatus } from '../Pd.ActionStatus';
export function useSubmit() { export function useSubmit() {

View File

@ -1,8 +1,8 @@
import { useEffect } from 'react'; import { useEffect } from 'react';
import { useCurrentUserContext } from '@tachybase/client'; import { useCurrentUserContext } from '@tachybase/client';
import { useFlowContext } from '@tachybase/plugin-workflow/client';
import { useForm } from '@tachybase/schema'; import { useForm } from '@tachybase/schema';
import { useFlowContext } from '../../../../../../FlowContext';
import { ApprovalStatusEnumDict } from '../../../../constants'; import { ApprovalStatusEnumDict } from '../../../../constants';
import { useApproval } from '../../../approval-common/ApprovalData.provider'; import { useApproval } from '../../../approval-common/ApprovalData.provider';
import { useContextApprovalExecution } from '../../common/ApprovalExecution.provider'; import { useContextApprovalExecution } from '../../common/ApprovalExecution.provider';

View File

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

View File

@ -11,11 +11,11 @@ import {
useCurrentUserContext, useCurrentUserContext,
useDesignable, useDesignable,
} from '@tachybase/client'; } from '@tachybase/client';
import { useFlowContext } from '@tachybase/plugin-workflow/client';
import { createForm, RecursionField, useField, useFieldSchema } from '@tachybase/schema'; import { createForm, RecursionField, useField, useFieldSchema } from '@tachybase/schema';
import _ from 'lodash'; import _ from 'lodash';
import { useFlowContext } from '../../../../../FlowContext';
import { useContextApprovalExecutions } from './Pd.ApprovalExecutions'; import { useContextApprovalExecutions } from './Pd.ApprovalExecutions';
export function ApprovalFormBlockDecorator(props) { export function ApprovalFormBlockDecorator(props) {

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