-
} />
-
- {title}
+
+ const shouldShowTitle = !onlyIcon;
+
+ if (layout === WorkbenchLayout.Grid) {
+ return (
+
+
} />
+
+ {shouldShowTitle && title}
+
-
- ) : (
-
{title}
- );
+ );
+ }
+
+ return
{shouldShowTitle && title};
}
export const WorkbenchAction = withDynamicSchemaProps((props) => {
- const { className, ...others } = props;
+ const { className, targetComponent, iconColor, ...others } = props;
const { styles, cx } = useStyles() as any;
const fieldSchema = useFieldSchema();
const Component = useComponent(props?.targetComponent) || Action;
@@ -79,9 +83,10 @@ export const WorkbenchAction = withDynamicSchemaProps((props) => {
}
+ title={
}
confirmTitle={fieldSchema.title}
style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}
/>
diff --git a/packages/plugins/@nocobase/plugin-block-workbench/src/client/WorkbenchBlock.tsx b/packages/plugins/@nocobase/plugin-block-workbench/src/client/WorkbenchBlock.tsx
index 88c0584782..9147de8a29 100644
--- a/packages/plugins/@nocobase/plugin-block-workbench/src/client/WorkbenchBlock.tsx
+++ b/packages/plugins/@nocobase/plugin-block-workbench/src/client/WorkbenchBlock.tsx
@@ -52,7 +52,7 @@ const ResponsiveSpace = () => {
return (
{fieldSchema.mapProperties((s, key) => {
- return ;
+ return ;
})}
);
@@ -61,7 +61,7 @@ const ResponsiveSpace = () => {
return (
{fieldSchema.mapProperties((s, key) => {
- return ;
+ return ;
})}
);
@@ -85,6 +85,7 @@ const InternalIcons = () => {
key={key}
prefix={
} />}
onClick={() => {}}
+ style={{ marginTop: '5px' }}
>
diff --git a/packages/plugins/@nocobase/plugin-block-workbench/src/client/workbenchBlockSettings.tsx b/packages/plugins/@nocobase/plugin-block-workbench/src/client/workbenchBlockSettings.tsx
index cbd5fda054..18862dbc11 100644
--- a/packages/plugins/@nocobase/plugin-block-workbench/src/client/workbenchBlockSettings.tsx
+++ b/packages/plugins/@nocobase/plugin-block-workbench/src/client/workbenchBlockSettings.tsx
@@ -15,6 +15,9 @@ import {
SchemaSettingsModalItem,
useOpenModeContext,
SchemaSettingsItemType,
+ useCollection,
+ SchemaSettingsLinkageRules,
+ LinkageRuleCategory,
} from '@nocobase/client';
import { CustomSchemaSettingsBlockTitleItem } from './SchemaSettingsBlockTitleItem';
import React from 'react';
@@ -136,6 +139,17 @@ export const workbenchBlockSettings = new SchemaSettings({
name: 'setTheBlockHeight',
Component: SchemaSettingsBlockHeightItem,
},
+ {
+ name: 'blockLinkageRules',
+ Component: SchemaSettingsLinkageRules,
+ useComponentProps() {
+ const { t } = useTranslation();
+ return {
+ title: t('Block Linkage rules'),
+ category: LinkageRuleCategory.block,
+ };
+ },
+ },
{
name: 'layout',
Component: ActionPanelLayout,
diff --git a/packages/plugins/@nocobase/plugin-calendar/package.json b/packages/plugins/@nocobase/plugin-calendar/package.json
index 8365ba971d..88973f10ab 100644
--- a/packages/plugins/@nocobase/plugin-calendar/package.json
+++ b/packages/plugins/@nocobase/plugin-calendar/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/plugin-calendar",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"displayName": "Calendar",
"displayName.zh-CN": "日历",
"description": "Provides callendar collection template and block for managing date data, typically for date/time related information such as events, appointments, tasks, and so on.",
diff --git a/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/Calender.Settings.tsx b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/Calender.Settings.tsx
index 191ad1e998..53dcea3185 100644
--- a/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/Calender.Settings.tsx
+++ b/packages/plugins/@nocobase/plugin-calendar/src/client/calendar/Calender.Settings.tsx
@@ -25,6 +25,9 @@ import {
useFormBlockContext,
usePopupSettings,
useApp,
+ SchemaSettingsLinkageRules,
+ LinkageRuleCategory,
+ useCollection_deprecated,
} from '@nocobase/client';
import React, { useMemo } from 'react';
import { useTranslation } from '../../locale';
@@ -65,6 +68,19 @@ export const calendarBlockSettings = new SchemaSettings({
name: 'setTheBlockHeight',
Component: SchemaSettingsBlockHeightItem,
},
+ {
+ name: 'blockLinkageRules',
+ Component: SchemaSettingsLinkageRules,
+ useComponentProps() {
+ const { name } = useCollection_deprecated();
+ const { t } = useTranslation();
+ return {
+ collectionName: name,
+ title: t('Block Linkage rules'),
+ category: LinkageRuleCategory.block,
+ };
+ },
+ },
{
name: 'titleField',
Component: SchemaSettingsSelectItem,
diff --git a/packages/plugins/@nocobase/plugin-charts/package.json b/packages/plugins/@nocobase/plugin-charts/package.json
index 99a6c6a143..8702acc8e4 100644
--- a/packages/plugins/@nocobase/plugin-charts/package.json
+++ b/packages/plugins/@nocobase/plugin-charts/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "图表(废弃)",
"description": "The plugin has been deprecated, please use the data visualization plugin instead.",
"description.zh-CN": "已废弃插件,请使用数据可视化插件代替。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"main": "./dist/server/index.js",
"license": "AGPL-3.0",
"devDependencies": {
diff --git a/packages/plugins/@nocobase/plugin-client/package.json b/packages/plugins/@nocobase/plugin-client/package.json
index 63bc66b5f7..4287c50503 100644
--- a/packages/plugins/@nocobase/plugin-client/package.json
+++ b/packages/plugins/@nocobase/plugin-client/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "WEB 客户端",
"description": "Provides a client interface for the NocoBase server",
"description.zh-CN": "为 NocoBase 服务端提供客户端界面",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"main": "./dist/server/index.js",
"license": "AGPL-3.0",
"devDependencies": {
diff --git a/packages/plugins/@nocobase/plugin-collection-sql/package.json b/packages/plugins/@nocobase/plugin-collection-sql/package.json
index 1dff519df6..4362a33605 100644
--- a/packages/plugins/@nocobase/plugin-collection-sql/package.json
+++ b/packages/plugins/@nocobase/plugin-collection-sql/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "数据表: SQL",
"description": "Provides SQL collection template",
"description.zh-CN": "提供 SQL 数据表模板",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"homepage": "https://docs-cn.nocobase.com/handbook/collection-sql",
"homepage.zh-CN": "https://docs-cn.nocobase.com/handbook/collection-sql",
"main": "dist/server/index.js",
diff --git a/packages/plugins/@nocobase/plugin-collection-sql/src/server/sql-collection/sql-collection.ts b/packages/plugins/@nocobase/plugin-collection-sql/src/server/sql-collection/sql-collection.ts
index f34ad946ba..947aaac6d9 100644
--- a/packages/plugins/@nocobase/plugin-collection-sql/src/server/sql-collection/sql-collection.ts
+++ b/packages/plugins/@nocobase/plugin-collection-sql/src/server/sql-collection/sql-collection.ts
@@ -42,7 +42,7 @@ export class SQLCollection extends Collection {
}
unavailableActions(): Array
{
- return ['create', 'update', 'destroy'];
+ return ['create', 'update', 'destroy', 'importXlsx', 'destroyMany', 'updateMany'];
}
public collectionSchema() {
diff --git a/packages/plugins/@nocobase/plugin-collection-tree/package.json b/packages/plugins/@nocobase/plugin-collection-tree/package.json
index 9a8eff1d8d..a0d6081cfa 100644
--- a/packages/plugins/@nocobase/plugin-collection-tree/package.json
+++ b/packages/plugins/@nocobase/plugin-collection-tree/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/plugin-collection-tree",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"displayName": "Collection: Tree",
"displayName.zh-CN": "数据表:树",
"description": "Provides tree collection template",
diff --git a/packages/plugins/@nocobase/plugin-data-source-main/package.json b/packages/plugins/@nocobase/plugin-data-source-main/package.json
index 1384d7db81..ff6ed61010 100644
--- a/packages/plugins/@nocobase/plugin-data-source-main/package.json
+++ b/packages/plugins/@nocobase/plugin-data-source-main/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "数据源:主数据库",
"description": "NocoBase main database, supports relational databases such as PostgreSQL, MySQL, MariaDB and so on.",
"description.zh-CN": "NocoBase 主数据库,支持 PostgreSQL、MySQL、MariaDB 等关系型数据库。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"main": "./dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/data-source-main",
"homepage.zh-CN": "https://docs-cn.nocobase.com/handbook/data-source-main",
diff --git a/packages/plugins/@nocobase/plugin-data-source-manager/package.json b/packages/plugins/@nocobase/plugin-data-source-manager/package.json
index 7e9e9f16d6..6cf2c103c4 100644
--- a/packages/plugins/@nocobase/plugin-data-source-manager/package.json
+++ b/packages/plugins/@nocobase/plugin-data-source-manager/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/plugin-data-source-manager",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"main": "dist/server/index.js",
"displayName": "Data source manager",
"displayName.zh-CN": "数据源管理",
diff --git a/packages/plugins/@nocobase/plugin-data-visualization/package.json b/packages/plugins/@nocobase/plugin-data-visualization/package.json
index acc07c8cfb..e286208e79 100644
--- a/packages/plugins/@nocobase/plugin-data-visualization/package.json
+++ b/packages/plugins/@nocobase/plugin-data-visualization/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/plugin-data-visualization",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"displayName": "Data visualization",
"displayName.zh-CN": "数据可视化",
"description": "Provides data visualization feature, including chart block and chart filter block, support line charts, area charts, bar charts and more than a dozen kinds of charts, you can also extend more chart types.",
diff --git a/packages/plugins/@nocobase/plugin-data-visualization/src/client/__tests__/utils.test.ts b/packages/plugins/@nocobase/plugin-data-visualization/src/client/__tests__/utils.test.ts
deleted file mode 100644
index f05e5d4169..0000000000
--- a/packages/plugins/@nocobase/plugin-data-visualization/src/client/__tests__/utils.test.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- * This file is part of the NocoBase (R) project.
- * Copyright (c) 2020-2024 NocoBase Co., Ltd.
- * Authors: NocoBase Team.
- *
- * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
- * For more information, please refer to: https://www.nocobase.com/agreement.
- */
-
-import { processData } from '../utils';
-
-describe('utils', () => {
- describe('process data', () => {
- it('should process select field', () => {
- expect(
- processData(
- [
- {
- name: 'tag',
- type: 'bigInt',
- interface: 'select',
- uiSchema: {
- type: 'string',
- enum: [
- {
- value: '1',
- label: 'Yes',
- },
- {
- value: '2',
- label: 'No',
- },
- ],
- },
- label: 'Tag',
- value: 'tag',
- key: 'tag',
- },
- ],
- [{ tag: 1 }],
- {},
- ),
- ).toEqual([{ tag: 'Yes' }]);
- });
- it('should not process when aggregating', () => {
- expect(
- processData(
- [
- {
- name: 'tag',
- type: 'bigInt',
- interface: 'select',
- uiSchema: {
- type: 'string',
- enum: [
- {
- value: '1',
- label: 'Yes',
- },
- {
- value: '2',
- label: 'No',
- },
- ],
- },
- label: 'Tag',
- value: 'tag',
- key: 'tag',
- query: {
- field: 'tag',
- aggregation: 'count',
- },
- },
- ],
- [{ tag: 1 }],
- {},
- ),
- ).toEqual([{ tag: 1 }]);
- });
- });
-});
diff --git a/packages/plugins/@nocobase/plugin-data-visualization/src/client/hooks/filter.ts b/packages/plugins/@nocobase/plugin-data-visualization/src/client/hooks/filter.ts
index 38f63266bc..9bcfb4c46d 100644
--- a/packages/plugins/@nocobase/plugin-data-visualization/src/client/hooks/filter.ts
+++ b/packages/plugins/@nocobase/plugin-data-visualization/src/client/hooks/filter.ts
@@ -135,11 +135,10 @@ export const useChartFilter = () => {
'x-decorator': 'ChartFilterFormItem',
'x-data-source': dataSource,
'x-collection-field': `${fieldName}.${field.name}`,
- ...defaultOperator?.schema,
'x-component-props': {
utc: false,
underFilter: true,
- ...field.uiSchema?.['x-component-props'],
+ component: defaultOperator?.schema?.['x-component'],
'filter-operator': defaultOperator,
'data-source': dataSource,
'collection-field': `${fieldName}.${field.name}`,
@@ -195,14 +194,15 @@ export const useChartFilter = () => {
'x-settings': 'chart:filterForm:item',
'x-toolbar': 'ChartFilterItemToolbar',
'x-decorator': 'ChartFilterFormItem',
+ 'x-component': 'CollectionField',
'x-data-source': dataSource,
'x-collection-field': `${fieldName}.${child.name}`,
...child.schema,
title,
- ...defaultOperator?.schema,
'x-component-props': {
utc: false,
underFilter: true,
+ component: defaultOperator?.schema?.['x-component'],
'filter-operator': defaultOperator,
'data-source': dataSource,
'collection-field': `${fieldName}.${child.name}`,
diff --git a/packages/plugins/@nocobase/plugin-data-visualization/src/client/hooks/query.ts b/packages/plugins/@nocobase/plugin-data-visualization/src/client/hooks/query.ts
index ae50ff8b42..eb92c1d047 100644
--- a/packages/plugins/@nocobase/plugin-data-visualization/src/client/hooks/query.ts
+++ b/packages/plugins/@nocobase/plugin-data-visualization/src/client/hooks/query.ts
@@ -14,6 +14,7 @@ import {
DEFAULT_DATA_SOURCE_KEY,
useACLRoleContext,
useDataSourceManager,
+ usePlugin,
} from '@nocobase/client';
import { useContext, useMemo } from 'react';
import { useTranslation } from 'react-i18next';
@@ -21,7 +22,8 @@ import { ChartConfigContext } from '../configure';
import formatters from '../configure/formatters';
import { useChartsTranslation } from '../locale';
import { ChartRendererContext } from '../renderer';
-import { getField, getSelectedFields, parseField, processData } from '../utils';
+import { getField, getSelectedFields, parseField } from '../utils';
+import PluginDataVisualiztionClient from '..';
export type FieldOption = {
value: string;
@@ -226,12 +228,36 @@ export const useOrderReaction = (defaultOptions: any[], fields: FieldOption[]) =
};
export const useData = (data?: any[], dataSource?: string, collection?: string) => {
- const { t } = useChartsTranslation();
const { service, query } = useContext(ChartRendererContext);
+ const plugin = usePlugin(PluginDataVisualiztionClient);
const fields = useFieldsWithAssociation(dataSource, collection);
const form = useForm();
- const selectedFields = getSelectedFields(fields, form?.values?.query || query);
- return processData(selectedFields, service?.data || data || [], { t });
+ const selectedFields = getSelectedFields(fields, form?.values?.query || query) as (FieldOption & { query?: any })[];
+ const fieldInterfaceConfigs = plugin.fieldInterfaceConfigs;
+ const formatters = {};
+ for (const field of selectedFields) {
+ if (field?.query?.aggregation) {
+ continue;
+ }
+ const config = fieldInterfaceConfigs[field.interface];
+ if (!config) {
+ continue;
+ }
+ const { valueFormatter } = config;
+ formatters[field.value] = (value: any) => valueFormatter(field, value);
+ }
+ return (service?.data || data || []).map((record: any) => {
+ const processed = {};
+ Object.entries(record).forEach(([key, value]) => {
+ const formatter = formatters[key];
+ if (!formatter) {
+ processed[key] = value;
+ return;
+ }
+ processed[key] = formatter(value);
+ });
+ return processed;
+ });
};
export const useCollectionFieldsOptions = (dataSource: string, collectionName: string, maxDepth = 2, excludes = []) => {
diff --git a/packages/plugins/@nocobase/plugin-data-visualization/src/client/index.tsx b/packages/plugins/@nocobase/plugin-data-visualization/src/client/index.tsx
index 1793841235..596511b67e 100644
--- a/packages/plugins/@nocobase/plugin-data-visualization/src/client/index.tsx
+++ b/packages/plugins/@nocobase/plugin-data-visualization/src/client/index.tsx
@@ -41,10 +41,42 @@ import { useChartRefreshActionProps } from './initializers/RefreshAction';
import { useChartBlockRefreshActionProps } from './initializers/BlockRefreshAction';
import { ChartRendererToolbar, ChartFilterBlockToolbar, ChartFilterItemToolbar } from './toolbar';
import { ChartCardItem } from './block/CardItem';
+import { Schema } from '@formily/react';
+
+type fieldInterfaceConfig = {
+ valueFormatter: (field: any, value: any) => any;
+};
+
+const valueFormatter = (field: any, value: any) => {
+ const options = field.uiSchema?.enum;
+ const parseEnumValues = (options: { label: string; value: string }[], value: any) => {
+ if (Array.isArray(value)) {
+ return value.map((v) => parseEnumValues(options, v));
+ }
+ const option = options.find((option) => option.value === (value?.toString?.() || value));
+ return Schema.compile(option?.label || value, { t: lang });
+ };
+ if (!options || !Array.isArray(options)) {
+ return value;
+ }
+ return parseEnumValues(options, value);
+};
class PluginDataVisualiztionClient extends Plugin {
public charts: ChartGroup = new ChartGroup();
+ fieldInterfaceConfigs: {
+ [fieldInterface: string]: fieldInterfaceConfig;
+ } = {
+ select: { valueFormatter },
+ multipleSelect: { valueFormatter },
+ radioGroup: { valueFormatter },
+ };
+
+ registerFieldInterfaceConfig(key: string, config: fieldInterfaceConfig) {
+ this.fieldInterfaceConfigs[key] = config;
+ }
+
async load() {
this.charts.addGroup('antd', { title: 'Ant Design', charts: antd });
this.charts.addGroup('ant-design-charts', { title: 'Ant Design Charts', charts: g2plot });
diff --git a/packages/plugins/@nocobase/plugin-data-visualization/src/client/settings/chartBlock.tsx b/packages/plugins/@nocobase/plugin-data-visualization/src/client/settings/chartBlock.tsx
index 9ee9bbcc9c..0fcfe79886 100644
--- a/packages/plugins/@nocobase/plugin-data-visualization/src/client/settings/chartBlock.tsx
+++ b/packages/plugins/@nocobase/plugin-data-visualization/src/client/settings/chartBlock.tsx
@@ -14,7 +14,10 @@ import {
SchemaSettingsSwitchItem,
useDesignable,
useToken,
+ SchemaSettingsLinkageRules,
+ LinkageRuleCategory,
} from '@nocobase/client';
+import { useTranslation } from 'react-i18next';
import { useChartsTranslation } from '../locale';
import { useField, useFieldSchema } from '@formily/react';
@@ -25,6 +28,18 @@ export const chartBlockSettings = new SchemaSettings({
name: 'title',
Component: SchemaSettingsBlockTitleItem,
},
+ {
+ name: 'blockLinkageRules',
+ Component: SchemaSettingsLinkageRules,
+ useComponentProps() {
+ const { t } = useTranslation();
+ return {
+ collectionName: name,
+ title: t('Block Linkage rules'),
+ category: LinkageRuleCategory.block,
+ };
+ },
+ },
{
name: 'background',
Component: () => {
diff --git a/packages/plugins/@nocobase/plugin-data-visualization/src/client/settings/chartFilterItem.tsx b/packages/plugins/@nocobase/plugin-data-visualization/src/client/settings/chartFilterItem.tsx
index 81e7d04f28..d4855eface 100644
--- a/packages/plugins/@nocobase/plugin-data-visualization/src/client/settings/chartFilterItem.tsx
+++ b/packages/plugins/@nocobase/plugin-data-visualization/src/client/settings/chartFilterItem.tsx
@@ -56,6 +56,7 @@ function useFieldComponentName(): string {
const map = {
// AssociationField 的 mode 默认值是 Select
AssociationField: 'Select',
+ 'DatePicker.FilterWithPicker': 'DatePicker',
};
const fieldComponentName =
fieldSchema?.['x-component-props']?.['mode'] ||
@@ -163,15 +164,15 @@ const EditOperator = () => {
const setOperatorComponent = (operator: any, component: any, props = {}) => {
const componentProps = field.componentProps || {};
- field.component = component;
field.componentProps = {
...componentProps,
+ component,
'filter-operator': operator,
...props,
};
- fieldSchema['x-component'] = component;
fieldSchema['x-component-props'] = {
...fieldSchema['x-component-props'],
+ component,
'filter-operator': operator,
...props,
};
@@ -179,9 +180,9 @@ const EditOperator = () => {
dn.emit('patch', {
schema: {
'x-uid': fieldSchema['x-uid'],
- 'x-component': component,
'x-component-props': {
...fieldSchema['x-component-props'],
+ component,
'filter-operator': operator,
...props,
},
diff --git a/packages/plugins/@nocobase/plugin-data-visualization/src/client/utils.ts b/packages/plugins/@nocobase/plugin-data-visualization/src/client/utils.ts
index e1f217a8a2..c2a6c9cdc0 100644
--- a/packages/plugins/@nocobase/plugin-data-visualization/src/client/utils.ts
+++ b/packages/plugins/@nocobase/plugin-data-visualization/src/client/utils.ts
@@ -106,40 +106,6 @@ export const getSelectedFields = (fields: FieldOption[], query: QueryProps) => {
return selectedFields;
};
-export const processData = (selectedFields: (FieldOption & { query?: any })[], data: any[], scope: any) => {
- const parseEnum = (field: FieldOption, value: any) => {
- const options = field.uiSchema?.enum as { value: string; label: string }[];
- if (!options || !Array.isArray(options)) {
- return value;
- }
- if (Array.isArray(value)) {
- return value.map((v) => parseEnum(field, v));
- }
- const option = options.find((option) => option.value === (value?.toString?.() || value));
- return Schema.compile(option?.label || value, scope);
- };
- return data.map((record) => {
- const processed = {};
- Object.entries(record).forEach(([key, value]) => {
- const field = selectedFields.find((field) => field.value === key && !field?.query?.aggregation);
- if (!field) {
- processed[key] = value;
- return;
- }
- switch (field.interface) {
- case 'select':
- case 'radioGroup':
- case 'multipleSelect':
- processed[key] = parseEnum(field, value);
- break;
- default:
- processed[key] = value;
- }
- });
- return processed;
- });
-};
-
export const removeUnparsableFilter = (filter: any) => {
if (typeof filter === 'object' && filter !== null) {
if (Array.isArray(filter)) {
diff --git a/packages/plugins/@nocobase/plugin-departments/package.json b/packages/plugins/@nocobase/plugin-departments/package.json
index c2aac785af..e843bcf5ac 100644
--- a/packages/plugins/@nocobase/plugin-departments/package.json
+++ b/packages/plugins/@nocobase/plugin-departments/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "部门",
"description": "Organize users by departments, set hierarchical relationships, link roles to control permissions, and use departments as variables in workflows and expressions.",
"description.zh-CN": "以部门来组织用户,设定上下级关系,绑定角色控制权限,并支持作为变量用于工作流和表达式。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"main": "dist/server/index.js",
"peerDependencies": {
"@nocobase/actions": "1.x",
diff --git a/packages/plugins/@nocobase/plugin-departments/src/server/__tests__/update-department-is-leaf.test.ts b/packages/plugins/@nocobase/plugin-departments/src/server/__tests__/update-department-is-leaf.test.ts
index 3f3803c485..7115d45456 100644
--- a/packages/plugins/@nocobase/plugin-departments/src/server/__tests__/update-department-is-leaf.test.ts
+++ b/packages/plugins/@nocobase/plugin-departments/src/server/__tests__/update-department-is-leaf.test.ts
@@ -64,7 +64,7 @@ describe('update department isLeaf', () => {
expect(record.isLeaf).toBe(false);
});
- it('should update isLeaf when update department', async () => {
+ it.runIf(process.env.DB_DIALECT !== 'sqlite')('should update isLeaf when update department', async () => {
const res = await agent.resource('departments').create({
values: {
title: 'Department',
diff --git a/packages/plugins/@nocobase/plugin-disable-pm-add/package.json b/packages/plugins/@nocobase/plugin-disable-pm-add/package.json
index 474392f852..53a3dde0b1 100644
--- a/packages/plugins/@nocobase/plugin-disable-pm-add/package.json
+++ b/packages/plugins/@nocobase/plugin-disable-pm-add/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/plugin-disable-pm-add",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"main": "./dist/server/index.js",
"peerDependencies": {
"@nocobase/client": "1.x",
diff --git a/packages/plugins/@nocobase/plugin-environment-variables/package.json b/packages/plugins/@nocobase/plugin-environment-variables/package.json
index 8469032bbe..96c448bcdd 100644
--- a/packages/plugins/@nocobase/plugin-environment-variables/package.json
+++ b/packages/plugins/@nocobase/plugin-environment-variables/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/plugin-environment-variables",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"main": "dist/server/index.js",
"peerDependencies": {
"@nocobase/client": "1.x",
diff --git a/packages/plugins/@nocobase/plugin-error-handler/package.json b/packages/plugins/@nocobase/plugin-error-handler/package.json
index 978e9471aa..4f7f8173c9 100644
--- a/packages/plugins/@nocobase/plugin-error-handler/package.json
+++ b/packages/plugins/@nocobase/plugin-error-handler/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "错误处理器",
"description": "Handling application errors and exceptions.",
"description.zh-CN": "处理应用程序中的错误和异常。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "./dist/server/index.js",
"devDependencies": {
diff --git a/packages/plugins/@nocobase/plugin-field-attachment-url/package.json b/packages/plugins/@nocobase/plugin-field-attachment-url/package.json
index 9a53df602e..701a3dc903 100644
--- a/packages/plugins/@nocobase/plugin-field-attachment-url/package.json
+++ b/packages/plugins/@nocobase/plugin-field-attachment-url/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/plugin-field-attachment-url",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"main": "dist/server/index.js",
"displayName": "Collection field: Attachment(URL)",
"displayName.zh-CN": "数据表字段:附件(URL)",
diff --git a/packages/plugins/@nocobase/plugin-field-china-region/package.json b/packages/plugins/@nocobase/plugin-field-china-region/package.json
index 201c9fd0e8..faec40f367 100644
--- a/packages/plugins/@nocobase/plugin-field-china-region/package.json
+++ b/packages/plugins/@nocobase/plugin-field-china-region/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/plugin-field-china-region",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"displayName": "Collection field: administrative divisions of China",
"displayName.zh-CN": "数据表字段:中国行政区划",
"description": "Provides data and field type for administrative divisions of China.",
diff --git a/packages/plugins/@nocobase/plugin-field-formula/package.json b/packages/plugins/@nocobase/plugin-field-formula/package.json
index 8aaaf8b80f..e2f98fbd7c 100644
--- a/packages/plugins/@nocobase/plugin-field-formula/package.json
+++ b/packages/plugins/@nocobase/plugin-field-formula/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "数据表字段:公式",
"description": "Configure and store the results of calculations between multiple field values in the same record, supporting both Math.js and Excel formula functions.",
"description.zh-CN": "可以配置并存储同一条记录的多字段值之间的计算结果,支持 Math.js 和 Excel formula functions 两种引擎",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "./dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/field-formula",
diff --git a/packages/plugins/@nocobase/plugin-field-m2m-array/package.json b/packages/plugins/@nocobase/plugin-field-m2m-array/package.json
index a1212639a6..f876a52bc0 100644
--- a/packages/plugins/@nocobase/plugin-field-m2m-array/package.json
+++ b/packages/plugins/@nocobase/plugin-field-m2m-array/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "数据表字段:多对多 (数组)",
"description": "Allows to create many to many relationships between two models by storing an array of unique keys of the target model.",
"description.zh-CN": "支持通过在数组中存储目标表唯一键的方式建立多对多关系。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"main": "dist/server/index.js",
"peerDependencies": {
"@nocobase/client": "1.x",
diff --git a/packages/plugins/@nocobase/plugin-field-markdown-vditor/package.json b/packages/plugins/@nocobase/plugin-field-markdown-vditor/package.json
index ef9b3401ef..70a6f38999 100644
--- a/packages/plugins/@nocobase/plugin-field-markdown-vditor/package.json
+++ b/packages/plugins/@nocobase/plugin-field-markdown-vditor/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "数据表字段:Markdown(Vditor)",
"description": "Used to store Markdown and render it using Vditor editor, supports common Markdown syntax such as list, code, quote, etc., and supports uploading images, recordings, etc.It also allows for instant rendering, where what you see is what you get.",
"description.zh-CN": "用于存储 Markdown,并使用 Vditor 编辑器渲染,支持常见 Markdown 语法,如列表,代码,引用等,并支持上传图片,录音等。同时可以做到即时渲染,所见即所得。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/field-markdown-vditor",
diff --git a/packages/plugins/@nocobase/plugin-field-sequence/package.json b/packages/plugins/@nocobase/plugin-field-sequence/package.json
index f9f2c794e4..62cbd66981 100644
--- a/packages/plugins/@nocobase/plugin-field-sequence/package.json
+++ b/packages/plugins/@nocobase/plugin-field-sequence/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "数据表字段:自动编码",
"description": "Automatically generate codes based on configured rules, supporting combinations of dates, numbers, and text.",
"description.zh-CN": "根据配置的规则自动生成编码,支持日期、数字、文本的组合。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "./dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/field-sequence",
diff --git a/packages/plugins/@nocobase/plugin-field-sort/package.json b/packages/plugins/@nocobase/plugin-field-sort/package.json
index 25323eb756..5ab676c5bc 100644
--- a/packages/plugins/@nocobase/plugin-field-sort/package.json
+++ b/packages/plugins/@nocobase/plugin-field-sort/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/plugin-field-sort",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"displayName": "Collection field: Sort",
"displayName.zh-CN": "数据表字段:排序",
diff --git a/packages/plugins/@nocobase/plugin-file-manager/package.json b/packages/plugins/@nocobase/plugin-file-manager/package.json
index cfe1d453e8..ae39d35093 100644
--- a/packages/plugins/@nocobase/plugin-file-manager/package.json
+++ b/packages/plugins/@nocobase/plugin-file-manager/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/plugin-file-manager",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"displayName": "File manager",
"displayName.zh-CN": "文件管理器",
"description": "Provides files storage services with files collection template and attachment field.",
@@ -15,15 +15,16 @@
"@formily/core": "2.x",
"@formily/react": "2.x",
"@formily/shared": "2.x",
- "@koa/multer": "^3.0.0",
- "@types/koa-multer": "^1.0.1",
+ "@koa/multer": "^3.1.0",
+ "@types/koa-multer": "^1.0.4",
"@types/multer": "^1.4.5",
"antd": "5.x",
+ "axios": "^1.7.0",
"cos-nodejs-sdk-v5": "^2.11.14",
"koa-static": "^5.0.0",
"mime-match": "^1.0.2",
"mkdirp": "~0.5.4",
- "multer": "^1.4.2",
+ "multer": "^1.4.5-lts.2",
"multer-aliyun-oss": "2.1.3",
"multer-cos": "^1.0.3",
"multer-s3": "^3.0.1",
diff --git a/packages/plugins/@nocobase/plugin-file-manager/src/server/__tests__/server.test.ts b/packages/plugins/@nocobase/plugin-file-manager/src/server/__tests__/server.test.ts
index 4866763b75..7a102d687d 100644
--- a/packages/plugins/@nocobase/plugin-file-manager/src/server/__tests__/server.test.ts
+++ b/packages/plugins/@nocobase/plugin-file-manager/src/server/__tests__/server.test.ts
@@ -8,6 +8,7 @@
*/
import path from 'path';
+import { Readable } from 'stream';
import { getApp } from '.';
import PluginFileManagerServer from '../server';
@@ -177,5 +178,41 @@ describe('file manager > server', () => {
process.env.APP_PUBLIC_PATH = originalPath;
});
});
+
+ describe('getFileStream', () => {
+ it('should get file stream for local storage', async () => {
+ const { body } = await agent.resource('attachments').create({
+ [FILE_FIELD_NAME]: path.resolve(__dirname, './files/text.txt'),
+ });
+
+ const result = await plugin.getFileStream(body.data);
+ expect(result).toHaveProperty('stream');
+ expect(result.stream).toBeInstanceOf(Readable);
+ expect(result).toHaveProperty('contentType');
+ expect(result.contentType).toBe('text/plain');
+ });
+
+ it('should throw error when file not found', async () => {
+ const { body } = await agent.resource('attachments').create({
+ [FILE_FIELD_NAME]: path.resolve(__dirname, './files/text.txt'),
+ });
+
+ // Modify the file path to a non-existent one
+ body.data.path = 'non-existent-path';
+
+ await expect(plugin.getFileStream(body.data)).rejects.toThrow();
+ });
+
+ it('should throw error when storage not found', async () => {
+ const { body } = await agent.resource('attachments').create({
+ [FILE_FIELD_NAME]: path.resolve(__dirname, './files/text.txt'),
+ });
+
+ // Remove storageId to simulate storage not found
+ delete body.data.storageId;
+
+ await expect(plugin.getFileStream(body.data)).rejects.toThrow('File storageId not found');
+ });
+ });
});
});
diff --git a/packages/plugins/@nocobase/plugin-file-manager/src/server/index.ts b/packages/plugins/@nocobase/plugin-file-manager/src/server/index.ts
index 10daee88fe..2390d1852d 100644
--- a/packages/plugins/@nocobase/plugin-file-manager/src/server/index.ts
+++ b/packages/plugins/@nocobase/plugin-file-manager/src/server/index.ts
@@ -11,7 +11,7 @@ import { StorageEngine } from 'multer';
export * from '../constants';
export { AttachmentModel, default, PluginFileManagerServer, StorageModel } from './server';
-
+export { cloudFilenameGetter } from './utils';
export { StorageType } from './storages';
export { StorageEngine };
diff --git a/packages/plugins/@nocobase/plugin-file-manager/src/server/server.ts b/packages/plugins/@nocobase/plugin-file-manager/src/server/server.ts
index f7903a5db9..871459f65f 100644
--- a/packages/plugins/@nocobase/plugin-file-manager/src/server/server.ts
+++ b/packages/plugins/@nocobase/plugin-file-manager/src/server/server.ts
@@ -13,6 +13,7 @@ import { basename } from 'path';
import { Collection, Model, Transactionable } from '@nocobase/database';
import { Plugin } from '@nocobase/server';
import { Registry } from '@nocobase/utils';
+import { Readable } from 'stream';
import { STORAGE_TYPE_ALI_OSS, STORAGE_TYPE_LOCAL, STORAGE_TYPE_S3, STORAGE_TYPE_TX_COS } from '../constants';
import initActions from './actions';
import { AttachmentInterface } from './interfaces/attachment-interface';
@@ -334,6 +335,27 @@ export class PluginFileManagerServer extends Plugin {
}
return !!storage.options?.public;
}
+ async getFileStream(file: AttachmentModel): Promise<{ stream: Readable; contentType?: string }> {
+ if (!file.storageId) {
+ throw new Error('File storageId not found');
+ }
+ const storage = this.storagesCache.get(file.storageId);
+ if (!storage) {
+ throw new Error('[file-manager] no linked or default storage provided');
+ }
+
+ const StorageType = this.storageTypes.get(storage.type);
+ if (!StorageType) {
+ throw new Error(`[file-manager] storage type "${storage.type}" is not defined`);
+ }
+ const storageInstance = new StorageType(storage);
+
+ if (!storageInstance) {
+ throw new Error(`[file-manager] storage type "${storage.type}" is not defined`);
+ }
+
+ return storageInstance.getFileStream(file);
+ }
}
export default PluginFileManagerServer;
diff --git a/packages/plugins/@nocobase/plugin-file-manager/src/server/storages/ali-oss.ts b/packages/plugins/@nocobase/plugin-file-manager/src/server/storages/ali-oss.ts
index d57db86cbd..4465af6c46 100644
--- a/packages/plugins/@nocobase/plugin-file-manager/src/server/storages/ali-oss.ts
+++ b/packages/plugins/@nocobase/plugin-file-manager/src/server/storages/ali-oss.ts
@@ -32,6 +32,7 @@ export default class extends StorageType {
return new createAliOssStorage({
config: this.storage.options,
filename: cloudFilenameGetter(this.storage),
+ timeout: this.storage.options.timeout || 600_000,
});
}
async delete(records: AttachmentModel[]): Promise<[number, AttachmentModel[]]> {
diff --git a/packages/plugins/@nocobase/plugin-file-manager/src/server/storages/index.ts b/packages/plugins/@nocobase/plugin-file-manager/src/server/storages/index.ts
index 6c6cc825d9..47f79dcfe5 100644
--- a/packages/plugins/@nocobase/plugin-file-manager/src/server/storages/index.ts
+++ b/packages/plugins/@nocobase/plugin-file-manager/src/server/storages/index.ts
@@ -7,12 +7,13 @@
* For more information, please refer to: https://www.nocobase.com/agreement.
*/
-import Path from 'path';
-import { StorageEngine } from 'multer';
-import urlJoin from 'url-join';
import { isURL } from '@nocobase/utils';
+import axios, { AxiosRequestConfig } from 'axios';
+import { StorageEngine } from 'multer';
+import Path from 'path';
+import type { Readable } from 'stream';
+import urlJoin from 'url-join';
import { encodeURL, ensureUrlEncoded, getFileKey } from '../utils';
-
export interface StorageModel {
id?: number;
title: string;
@@ -32,6 +33,7 @@ export interface AttachmentModel {
path: string;
url: string;
storageId: number;
+ mimetype: string;
}
export abstract class StorageType {
@@ -85,6 +87,26 @@ export abstract class StorageType {
].filter(Boolean);
return urlJoin(keys);
}
+
+ async getFileStream(file: AttachmentModel): Promise<{ stream: Readable; contentType?: string }> {
+ try {
+ const fileURL = await this.getFileURL(file);
+ const requestOptions: AxiosRequestConfig = {
+ responseType: 'stream',
+ validateStatus: (status) => status === 200,
+ timeout: 30000, // 30 seconds timeout
+ };
+
+ const response = await axios.get(fileURL, requestOptions);
+
+ return {
+ stream: response.data,
+ contentType: response.headers['content-type'],
+ };
+ } catch (err) {
+ throw new Error(`fetch file failed: ${err}`);
+ }
+ }
}
export type StorageClassType = { new (storage: StorageModel): StorageType } & typeof StorageType;
diff --git a/packages/plugins/@nocobase/plugin-file-manager/src/server/storages/local.ts b/packages/plugins/@nocobase/plugin-file-manager/src/server/storages/local.ts
index 0a35462962..c6fe750904 100644
--- a/packages/plugins/@nocobase/plugin-file-manager/src/server/storages/local.ts
+++ b/packages/plugins/@nocobase/plugin-file-manager/src/server/storages/local.ts
@@ -8,10 +8,12 @@
*/
import { isURL } from '@nocobase/utils';
+import fsSync from 'fs';
import fs from 'fs/promises';
import mkdirp from 'mkdirp';
import multer from 'multer';
import path from 'path';
+import type { Readable } from 'stream';
import urlJoin from 'url-join';
import { AttachmentModel, StorageType } from '.';
import { FILE_SIZE_LIMIT_DEFAULT, STORAGE_TYPE_LOCAL } from '../../constants';
@@ -83,4 +85,16 @@ export default class extends StorageType {
}
return urlJoin(process.env.APP_PUBLIC_PATH, url);
}
+
+ async getFileStream(file: AttachmentModel): Promise<{ stream: Readable; contentType?: string }> {
+ // compatible with windows path
+ const filePath = path.join(process.cwd(), 'storage', 'uploads', file.path || '', file.filename);
+ if (await fs.stat(filePath)) {
+ return {
+ stream: fsSync.createReadStream(filePath),
+ contentType: file.mimetype,
+ };
+ }
+ throw new Error(`File not found: ${filePath}`);
+ }
}
diff --git a/packages/plugins/@nocobase/plugin-gantt/package.json b/packages/plugins/@nocobase/plugin-gantt/package.json
index a6e509b5b3..28c3e1e155 100644
--- a/packages/plugins/@nocobase/plugin-gantt/package.json
+++ b/packages/plugins/@nocobase/plugin-gantt/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/plugin-gantt",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"displayName": "Block: Gantt",
"displayName.zh-CN": "区块:甘特图",
"description": "Provides Gantt block.",
diff --git a/packages/plugins/@nocobase/plugin-gantt/src/client/Gantt.Settings.tsx b/packages/plugins/@nocobase/plugin-gantt/src/client/Gantt.Settings.tsx
index 336420ccc3..f10674cabc 100644
--- a/packages/plugins/@nocobase/plugin-gantt/src/client/Gantt.Settings.tsx
+++ b/packages/plugins/@nocobase/plugin-gantt/src/client/Gantt.Settings.tsx
@@ -22,7 +22,10 @@ import {
useCompile,
useDesignable,
useFormBlockContext,
+ SchemaSettingsLinkageRules,
+ LinkageRuleCategory,
} from '@nocobase/client';
+import { useTranslation } from 'react-i18next';
import { useGanttBlockContext } from './GanttBlockProvider';
import { useGanttTranslation, useOptions } from './utils';
@@ -37,6 +40,19 @@ export const oldGanttSettings = new SchemaSettings({
name: 'title',
Component: SchemaSettingsBlockTitleItem,
},
+ {
+ name: 'blockLinkageRules',
+ Component: SchemaSettingsLinkageRules,
+ useComponentProps() {
+ const { name } = useCollection_deprecated();
+ const { t } = useTranslation();
+ return {
+ collectionName: name,
+ title: t('Block Linkage rules'),
+ category: LinkageRuleCategory.block,
+ };
+ },
+ },
{
name: 'titleField',
Component: SchemaSettingsSelectItem,
@@ -277,6 +293,19 @@ export const ganttSettings = new SchemaSettings({
name: 'title',
Component: SchemaSettingsBlockTitleItem,
},
+ {
+ name: 'blockLinkageRules',
+ Component: SchemaSettingsLinkageRules,
+ useComponentProps() {
+ const { name } = useCollection_deprecated();
+ const { t } = useTranslation();
+ return {
+ collectionName: name,
+ title: t('Block Linkage rules'),
+ category: LinkageRuleCategory.block,
+ };
+ },
+ },
{
name: 'titleField',
Component: SchemaSettingsSelectItem,
diff --git a/packages/plugins/@nocobase/plugin-gantt/src/client/components/calendar/calendar.tsx b/packages/plugins/@nocobase/plugin-gantt/src/client/components/calendar/calendar.tsx
index ec81615d9f..4024a5faa8 100644
--- a/packages/plugins/@nocobase/plugin-gantt/src/client/components/calendar/calendar.tsx
+++ b/packages/plugins/@nocobase/plugin-gantt/src/client/components/calendar/calendar.tsx
@@ -52,12 +52,7 @@ export const Calendar: React.FC = ({
const date = dateSetup.dates[i];
const bottomValue = date.getFullYear();
bottomValues.push(
-
+
{bottomValue}
,
);
@@ -98,7 +93,7 @@ export const Calendar: React.FC = ({
key={date.getTime()}
y={headerHeight * 0.8}
x={columnWidth * i + columnWidth * 0.5}
- className={cx('calendarBottomText')}
+ className={styles.calendarBottomText}
>
{quarter}
,
@@ -118,7 +113,7 @@ export const Calendar: React.FC = ({
x1Line={columnWidth * i}
y1Line={0}
y2Line={topDefaultHeight}
- xText={Math.abs(xText)}
+ xText={Math.abs(xText) - 200}
yText={topDefaultHeight * 0.9}
/>,
);
@@ -139,7 +134,7 @@ export const Calendar: React.FC = ({
key={bottomValue + date.getFullYear()}
y={headerHeight * 0.8}
x={columnWidth * i + columnWidth * 0.5}
- className={cx('calendarBottomText')}
+ className={styles.calendarBottomText}
>
{bottomValue}
,
@@ -189,7 +184,7 @@ export const Calendar: React.FC = ({
key={date.getTime()}
y={headerHeight * 0.8}
x={columnWidth * (i + +rtl)}
- className={cx('calendarBottomText')}
+ className={styles.calendarBottomText}
>
{bottomValue}
,
diff --git a/packages/plugins/@nocobase/plugin-gantt/src/client/components/calendar/style.tsx b/packages/plugins/@nocobase/plugin-gantt/src/client/components/calendar/style.tsx
index b222628f6f..306b91e70d 100644
--- a/packages/plugins/@nocobase/plugin-gantt/src/client/components/calendar/style.tsx
+++ b/packages/plugins/@nocobase/plugin-gantt/src/client/components/calendar/style.tsx
@@ -23,6 +23,9 @@ const useStyles = createStyles(({ token, css }) => {
background: ${colorFillAlterSolid};
border-bottom: 1px solid ${token.colorBorderSecondary};
`,
+ calendarBottomText: css`
+ font-size: 11px;
+ `,
nbGanttCalendar: css`
.calendarbottomtext: {
textanchor: middle;
diff --git a/packages/plugins/@nocobase/plugin-gantt/src/client/components/gantt/gantt.tsx b/packages/plugins/@nocobase/plugin-gantt/src/client/components/gantt/gantt.tsx
index 27ad8c0123..4764299ba3 100644
--- a/packages/plugins/@nocobase/plugin-gantt/src/client/components/gantt/gantt.tsx
+++ b/packages/plugins/@nocobase/plugin-gantt/src/client/components/gantt/gantt.tsx
@@ -47,7 +47,7 @@ import { TaskGantt } from './task-gantt';
import { TaskGanttContentProps } from './task-gantt-content';
const getColumnWidth = (dataSetLength: any, clientWidth: any) => {
- const columnWidth = clientWidth / dataSetLength > 50 ? Math.floor(clientWidth / dataSetLength) + 20 : 50;
+ const columnWidth = clientWidth / dataSetLength > 50 ? Math.floor(clientWidth / dataSetLength) + 20 : 60;
return columnWidth;
};
diff --git a/packages/plugins/@nocobase/plugin-graph-collection-manager/package.json b/packages/plugins/@nocobase/plugin-graph-collection-manager/package.json
index a1cbc012ed..e8fccc267e 100644
--- a/packages/plugins/@nocobase/plugin-graph-collection-manager/package.json
+++ b/packages/plugins/@nocobase/plugin-graph-collection-manager/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "可视化数据表管理",
"description": "An ER diagram-like tool. Currently only the Master database is supported.",
"description.zh-CN": "类似 ER 图的工具,目前只支持主数据库。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "./dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/graph-collection-manager",
diff --git a/packages/plugins/@nocobase/plugin-kanban/package.json b/packages/plugins/@nocobase/plugin-kanban/package.json
index a9f66415f9..47e733a85d 100644
--- a/packages/plugins/@nocobase/plugin-kanban/package.json
+++ b/packages/plugins/@nocobase/plugin-kanban/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/plugin-kanban",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"main": "dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/block-kanban",
"homepage.zh-CN": "https://docs-cn.nocobase.com/handbook/block-kanban",
diff --git a/packages/plugins/@nocobase/plugin-kanban/src/client/Kanban.Settings.tsx b/packages/plugins/@nocobase/plugin-kanban/src/client/Kanban.Settings.tsx
index aa6473c554..b39e9c2633 100644
--- a/packages/plugins/@nocobase/plugin-kanban/src/client/Kanban.Settings.tsx
+++ b/packages/plugins/@nocobase/plugin-kanban/src/client/Kanban.Settings.tsx
@@ -21,6 +21,8 @@ import {
useDesignable,
useFormBlockContext,
SchemaSettingsLayoutItem,
+ SchemaSettingsLinkageRules,
+ LinkageRuleCategory,
} from '@nocobase/client';
import { useTranslation } from 'react-i18next';
import { useKanbanBlockContext } from './KanbanBlockProvider';
@@ -36,6 +38,19 @@ export const kanbanSettings = new SchemaSettings({
name: 'setTheBlockHeight',
Component: SchemaSettingsBlockHeightItem,
},
+ {
+ name: 'blockLinkageRules',
+ Component: SchemaSettingsLinkageRules,
+ useComponentProps() {
+ const { name } = useCollection_deprecated();
+ const { t } = useTranslation();
+ return {
+ collectionName: name,
+ title: t('Block Linkage rules'),
+ category: LinkageRuleCategory.block,
+ };
+ },
+ },
{
name: 'dataScope',
Component: SchemaSettingsDataScope,
diff --git a/packages/plugins/@nocobase/plugin-locale-tester/package.json b/packages/plugins/@nocobase/plugin-locale-tester/package.json
index 81c1bedb0b..27c3c432b5 100644
--- a/packages/plugins/@nocobase/plugin-locale-tester/package.json
+++ b/packages/plugins/@nocobase/plugin-locale-tester/package.json
@@ -2,7 +2,7 @@
"name": "@nocobase/plugin-locale-tester",
"displayName": "Locale tester",
"displayName.zh-CN": "翻译测试工具",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"homepage": "https://github.com/nocobase/locales",
"main": "dist/server/index.js",
"peerDependencies": {
diff --git a/packages/plugins/@nocobase/plugin-localization/package.json b/packages/plugins/@nocobase/plugin-localization/package.json
index 4220fcceee..89e213d3ce 100644
--- a/packages/plugins/@nocobase/plugin-localization/package.json
+++ b/packages/plugins/@nocobase/plugin-localization/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/plugin-localization",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"main": "dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/localization-management",
"homepage.zh-CN": "https://docs-cn.nocobase.com/handbook/localization-management",
diff --git a/packages/plugins/@nocobase/plugin-logger/package.json b/packages/plugins/@nocobase/plugin-logger/package.json
index 6bd9c9e82f..e3ce0d8062 100644
--- a/packages/plugins/@nocobase/plugin-logger/package.json
+++ b/packages/plugins/@nocobase/plugin-logger/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "日志",
"description": "Server-side logs, mainly including API request logs and system runtime logs, and allows to package and download log files.",
"description.zh-CN": "服务端日志,主要包括接口请求日志和系统运行日志,并支持打包和下载日志文件。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/logger",
diff --git a/packages/plugins/@nocobase/plugin-map/package.json b/packages/plugins/@nocobase/plugin-map/package.json
index f27a5c27f4..d64f604940 100644
--- a/packages/plugins/@nocobase/plugin-map/package.json
+++ b/packages/plugins/@nocobase/plugin-map/package.json
@@ -2,7 +2,7 @@
"name": "@nocobase/plugin-map",
"displayName": "Block: Map",
"displayName.zh-CN": "区块:地图",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"description": "Map block, support Gaode map and Google map, you can also extend more map types.",
"description.zh-CN": "地图区块,支持高德地图和 Google 地图,你也可以扩展更多地图类型。",
"license": "AGPL-3.0",
diff --git a/packages/plugins/@nocobase/plugin-map/src/client/block/MapBlock.Settings.tsx b/packages/plugins/@nocobase/plugin-map/src/client/block/MapBlock.Settings.tsx
index 1500e2514f..8f9027ebc5 100644
--- a/packages/plugins/@nocobase/plugin-map/src/client/block/MapBlock.Settings.tsx
+++ b/packages/plugins/@nocobase/plugin-map/src/client/block/MapBlock.Settings.tsx
@@ -27,8 +27,11 @@ import {
useDesignable,
useFormBlockContext,
useColumnSchema,
+ SchemaSettingsLinkageRules,
+ LinkageRuleCategory,
} from '@nocobase/client';
import _ from 'lodash';
+import { useTranslation } from 'react-i18next';
import { useMapTranslation } from '../locale';
import { useMapBlockContext } from './MapBlockProvider';
import { findNestedOption } from './utils';
@@ -89,6 +92,19 @@ export const mapBlockSettings = new SchemaSettings({
name: 'setTheBlockHeight',
Component: SchemaSettingsBlockHeightItem,
},
+ {
+ name: 'blockLinkageRules',
+ Component: SchemaSettingsLinkageRules,
+ useComponentProps() {
+ const { name } = useCollection();
+ const { t } = useTranslation();
+ return {
+ collectionName: name,
+ title: t('Block Linkage rules'),
+ category: LinkageRuleCategory.block,
+ };
+ },
+ },
{
name: 'mapField',
Component: SchemaSettingsCascaderItem,
diff --git a/packages/plugins/@nocobase/plugin-mobile-client/package.json b/packages/plugins/@nocobase/plugin-mobile-client/package.json
index f21a37a5cc..5f9d28bec6 100644
--- a/packages/plugins/@nocobase/plugin-mobile-client/package.json
+++ b/packages/plugins/@nocobase/plugin-mobile-client/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/plugin-mobile-client",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"main": "./dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/mobile-client",
"homepage.zh-CN": "https://docs-cn.nocobase.com/handbook/mobile-client",
diff --git a/packages/plugins/@nocobase/plugin-mobile/package.json b/packages/plugins/@nocobase/plugin-mobile/package.json
index 10e32dadc3..ce3657ab90 100644
--- a/packages/plugins/@nocobase/plugin-mobile/package.json
+++ b/packages/plugins/@nocobase/plugin-mobile/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/plugin-mobile",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"main": "dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/mobile",
"homepage.zh-CN": "https://docs-cn.nocobase.com/handbook/mobile",
diff --git a/packages/plugins/@nocobase/plugin-mobile/src/client/ShowTipWhenNoPages.tsx b/packages/plugins/@nocobase/plugin-mobile/src/client/ShowTipWhenNoPages.tsx
index 2233d105ba..6217d92840 100644
--- a/packages/plugins/@nocobase/plugin-mobile/src/client/ShowTipWhenNoPages.tsx
+++ b/packages/plugins/@nocobase/plugin-mobile/src/client/ShowTipWhenNoPages.tsx
@@ -20,7 +20,7 @@ export const ShowTipWhenNoPages: FC = ({ children }) => {
const { designable } = useDesignable();
const { routeList } = useMobileRoutes();
const { t } = usePluginTranslation();
- const isInBlockTemplateSettingsPage = window.location.pathname?.includes('/m/block-templates/');
+ const isInBlockTemplateSettingsPage = window.location.pathname?.includes('/m/block-templates/inherited/');
if (!isInBlockTemplateSettingsPage && (!designable || isMobile) && _.isEmpty(routeList)) {
return (
diff --git a/packages/plugins/@nocobase/plugin-mobile/src/client/pages/dynamic-page/components/MobileDatePicker.tsx b/packages/plugins/@nocobase/plugin-mobile/src/client/pages/dynamic-page/components/MobileDatePicker.tsx
index 70ae6b67c4..e0f88cc014 100644
--- a/packages/plugins/@nocobase/plugin-mobile/src/client/pages/dynamic-page/components/MobileDatePicker.tsx
+++ b/packages/plugins/@nocobase/plugin-mobile/src/client/pages/dynamic-page/components/MobileDatePicker.tsx
@@ -140,8 +140,8 @@ const MobileDateTimePicker = connect(
}}
precision={showTime && picker === 'date' ? getPrecision(timeFormat) : picker === 'date' ? 'day' : picker}
renderLabel={labelRenderer}
- min={minDate || rest.min || new Date(1000, 0, 1)}
- max={maxDate || rest.max || new Date(9999, 11, 31)}
+ min={minDate || rest.min || new Date(1950, 0, 1)}
+ max={maxDate || rest.max || new Date(2050, 11, 31)}
onConfirm={(val) => {
handleConfirm(val);
}}
diff --git a/packages/plugins/@nocobase/plugin-mobile/src/client/pages/dynamic-page/header/navigation-bar/actions/mobile-navigation-bar-action/styles.ts b/packages/plugins/@nocobase/plugin-mobile/src/client/pages/dynamic-page/header/navigation-bar/actions/mobile-navigation-bar-action/styles.ts
index 06751439b7..ee2bdba69d 100644
--- a/packages/plugins/@nocobase/plugin-mobile/src/client/pages/dynamic-page/header/navigation-bar/actions/mobile-navigation-bar-action/styles.ts
+++ b/packages/plugins/@nocobase/plugin-mobile/src/client/pages/dynamic-page/header/navigation-bar/actions/mobile-navigation-bar-action/styles.ts
@@ -29,6 +29,10 @@ export const useStyles = genStyleHook('nb-mobile-navigation-bar-action', (token)
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
+
+ '& > span': {
+ position: 'relative',
+ },
},
'.nb-navigation-bar-action-title': {
fontSize: 17,
diff --git a/packages/plugins/@nocobase/plugin-mock-collections/package.json b/packages/plugins/@nocobase/plugin-mock-collections/package.json
index 9d15142097..cca0c7d848 100644
--- a/packages/plugins/@nocobase/plugin-mock-collections/package.json
+++ b/packages/plugins/@nocobase/plugin-mock-collections/package.json
@@ -2,7 +2,7 @@
"name": "@nocobase/plugin-mock-collections",
"displayName": "mock-collections",
"description": "mock-collections",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"main": "./dist/server/index.js",
"license": "AGPL-3.0",
"peerDependencies": {
diff --git a/packages/plugins/@nocobase/plugin-mock-collections/src/server/collection-templates/index.ts b/packages/plugins/@nocobase/plugin-mock-collections/src/server/collection-templates/index.ts
index 254f1a88c3..f1838da1a2 100644
--- a/packages/plugins/@nocobase/plugin-mock-collections/src/server/collection-templates/index.ts
+++ b/packages/plugins/@nocobase/plugin-mock-collections/src/server/collection-templates/index.ts
@@ -199,7 +199,7 @@ export default {
value: 'formula.js',
label: 'Formula.js',
tooltip: '{{t("Formula.js supports most Microsoft Excel formula functions.")}}',
- link: 'https://formulajs.info/functions/',
+ link: 'https://docs.nocobase.com/handbook/calculation-engines/formula',
},
],
default: 'formula.js',
diff --git a/packages/plugins/@nocobase/plugin-multi-app-manager/package.json b/packages/plugins/@nocobase/plugin-multi-app-manager/package.json
index 982f7e68a4..a6c614e64d 100644
--- a/packages/plugins/@nocobase/plugin-multi-app-manager/package.json
+++ b/packages/plugins/@nocobase/plugin-multi-app-manager/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "多应用管理器",
"description": "Dynamically create multiple apps without separate deployments.",
"description.zh-CN": "无需单独部署即可动态创建多个应用。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "./dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/multi-app-manager",
diff --git a/packages/plugins/@nocobase/plugin-multi-app-share-collection/package.json b/packages/plugins/@nocobase/plugin-multi-app-share-collection/package.json
index 082c9cb898..c857db5ab8 100644
--- a/packages/plugins/@nocobase/plugin-multi-app-share-collection/package.json
+++ b/packages/plugins/@nocobase/plugin-multi-app-share-collection/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "多应用数据表共享",
"description": "",
"description.zh-CN": "",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"main": "./dist/server/index.js",
"devDependencies": {
"@formily/react": "2.x",
diff --git a/packages/plugins/@nocobase/plugin-notification-email/package.json b/packages/plugins/@nocobase/plugin-notification-email/package.json
index 333134ac28..0fedec1c1c 100644
--- a/packages/plugins/@nocobase/plugin-notification-email/package.json
+++ b/packages/plugins/@nocobase/plugin-notification-email/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/plugin-notification-email",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"displayName": "Notification: Email",
"displayName.zh-CN": "通知:电子邮件",
"description": "Used for sending email notifications with built-in SMTP transport.",
diff --git a/packages/plugins/@nocobase/plugin-notification-in-app-message/package.json b/packages/plugins/@nocobase/plugin-notification-in-app-message/package.json
index 9239f2c8ab..af4203f52d 100644
--- a/packages/plugins/@nocobase/plugin-notification-in-app-message/package.json
+++ b/packages/plugins/@nocobase/plugin-notification-in-app-message/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/plugin-notification-in-app-message",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"displayName": "Notification: In-app message",
"displayName.zh-CN": "通知:站内信",
"description": "It supports users in receiving real-time message notifications within the NocoBase application.",
diff --git a/packages/plugins/@nocobase/plugin-notification-in-app-message/src/client/components/mobile/MobileTabBarMessageItem.tsx b/packages/plugins/@nocobase/plugin-notification-in-app-message/src/client/components/mobile/MobileTabBarMessageItem.tsx
index 8531d4a1aa..4233489589 100644
--- a/packages/plugins/@nocobase/plugin-notification-in-app-message/src/client/components/mobile/MobileTabBarMessageItem.tsx
+++ b/packages/plugins/@nocobase/plugin-notification-in-app-message/src/client/components/mobile/MobileTabBarMessageItem.tsx
@@ -7,11 +7,11 @@
* For more information, please refer to: https://www.nocobase.com/agreement.
*/
-import React, { useEffect } from 'react';
import { observer } from '@formily/reactive-react';
-import { useNavigate, useLocation } from 'react-router-dom';
import { MobileTabBarItem } from '@nocobase/plugin-mobile/client';
-import { unreadMsgsCountObs, startMsgSSEStreamWithRetry, updateUnreadMsgsCount } from '../../observables';
+import React, { useEffect } from 'react';
+import { useLocation, useNavigate } from 'react-router-dom';
+import { startMsgSSEStreamWithRetry, unreadMsgsCountObs, updateUnreadMsgsCount } from '../../observables';
const InnerMobileTabBarMessageItem = (props) => {
const navigate = useNavigate();
@@ -19,9 +19,32 @@ const InnerMobileTabBarMessageItem = (props) => {
const onClick = () => {
navigate('/page/in-app-message');
};
+
useEffect(() => {
- startMsgSSEStreamWithRetry();
+ const disposes: Array<() => void> = [];
+ disposes.push(startMsgSSEStreamWithRetry());
+ const disposeAll = () => {
+ while (disposes.length > 0) {
+ const dispose = disposes.pop();
+ dispose && dispose();
+ }
+ };
+
+ const onVisibilityChange = () => {
+ if (document.visibilityState === 'visible') {
+ disposes.push(startMsgSSEStreamWithRetry());
+ } else {
+ disposeAll();
+ }
+ };
+
+ document.addEventListener('visibilitychange', onVisibilityChange);
+ return () => {
+ disposeAll();
+ document.removeEventListener('visibilitychange', onVisibilityChange);
+ };
}, []);
+
const selected = props.url && location.pathname.startsWith(props.url);
return (
diff --git a/packages/plugins/@nocobase/plugin-notification-manager/package.json b/packages/plugins/@nocobase/plugin-notification-manager/package.json
index 6da844123c..583a4a7ba2 100644
--- a/packages/plugins/@nocobase/plugin-notification-manager/package.json
+++ b/packages/plugins/@nocobase/plugin-notification-manager/package.json
@@ -4,7 +4,7 @@
"description": "Provides a unified management service that includes channel configuration, logging, and other features, supporting the configuration of various notification channels, including in-app message and email.",
"displayName.zh-CN": "通知管理",
"description.zh-CN": "提供统一的管理服务,涵盖渠道配置、日志记录等功能,支持多种通知渠道的配置,包括站内信和电子邮件等。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"homepage": "https://docs.nocobase.com/handbook/notification-manager",
"homepage.zh-CN": "https://docs-cn.nocobase.com/handbook/notification-manager",
"main": "dist/server/index.js",
diff --git a/packages/plugins/@nocobase/plugin-notification-manager/src/client/manager/channel/schemas/index.ts b/packages/plugins/@nocobase/plugin-notification-manager/src/client/manager/channel/schemas/index.ts
index a031292bb6..b77e3b5c80 100644
--- a/packages/plugins/@nocobase/plugin-notification-manager/src/client/manager/channel/schemas/index.ts
+++ b/packages/plugins/@nocobase/plugin-notification-manager/src/client/manager/channel/schemas/index.ts
@@ -185,7 +185,6 @@ export const channelsSchema: ISchema = {
'x-component': 'Action.Link',
'x-component-props': {
openMode: 'drawer',
- icon: 'EditOutlined',
},
'x-use-component-props': 'useRecordEditActionProps',
'x-decorator': 'Space',
diff --git a/packages/plugins/@nocobase/plugin-notification-manager/src/client/manager/log/schemas/index.ts b/packages/plugins/@nocobase/plugin-notification-manager/src/client/manager/log/schemas/index.ts
index 054c70254b..84f8fff4dd 100644
--- a/packages/plugins/@nocobase/plugin-notification-manager/src/client/manager/log/schemas/index.ts
+++ b/packages/plugins/@nocobase/plugin-notification-manager/src/client/manager/log/schemas/index.ts
@@ -259,7 +259,6 @@ export const messageLogsManagerSchema: ISchema = {
'x-component': 'Action.Link',
'x-component-props': {
openMode: 'drawer',
- icon: 'EditOutlined',
},
properties: {
drawer: {
diff --git a/packages/plugins/@nocobase/plugin-notifications/package.json b/packages/plugins/@nocobase/plugin-notifications/package.json
index 81b2e58e58..a67bbb592d 100644
--- a/packages/plugins/@nocobase/plugin-notifications/package.json
+++ b/packages/plugins/@nocobase/plugin-notifications/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/plugin-notifications",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"description": "",
"license": "AGPL-3.0",
"main": "./dist/server/index.js",
diff --git a/packages/plugins/@nocobase/plugin-public-forms/package.json b/packages/plugins/@nocobase/plugin-public-forms/package.json
index 1d07c2fee4..4f9380127f 100644
--- a/packages/plugins/@nocobase/plugin-public-forms/package.json
+++ b/packages/plugins/@nocobase/plugin-public-forms/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/plugin-public-forms",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"main": "dist/server/index.js",
"displayName": "Public forms",
"displayName.zh-CN": "公开表单",
diff --git a/packages/plugins/@nocobase/plugin-public-forms/src/client/schemas/editActionSchema.ts b/packages/plugins/@nocobase/plugin-public-forms/src/client/schemas/editActionSchema.ts
index 53c3ffa77f..402f79d01f 100644
--- a/packages/plugins/@nocobase/plugin-public-forms/src/client/schemas/editActionSchema.ts
+++ b/packages/plugins/@nocobase/plugin-public-forms/src/client/schemas/editActionSchema.ts
@@ -13,7 +13,6 @@ export const editActionSchema = {
'x-component': 'Action.Link',
'x-component-props': {
openMode: 'drawer',
- icon: 'EditOutlined',
},
properties: {
drawer: {
diff --git a/packages/plugins/@nocobase/plugin-sample-hello/package.json b/packages/plugins/@nocobase/plugin-sample-hello/package.json
index aa8732dabb..69e7a074ce 100644
--- a/packages/plugins/@nocobase/plugin-sample-hello/package.json
+++ b/packages/plugins/@nocobase/plugin-sample-hello/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/plugin-sample-hello",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"main": "./dist/server/index.js",
"displayName": "Hello",
"displayName.zh-CN": "Hello",
diff --git a/packages/plugins/@nocobase/plugin-snapshot-field/package.json b/packages/plugins/@nocobase/plugin-snapshot-field/package.json
index 7ba92aa78a..32e077b583 100644
--- a/packages/plugins/@nocobase/plugin-snapshot-field/package.json
+++ b/packages/plugins/@nocobase/plugin-snapshot-field/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "数据表字段:关系快照",
"description": "When adding a new record, create a snapshot for its relational record and save in the new record. The snapshot will not be updated when the relational record is updated.",
"description.zh-CN": "在添加数据时,为它的关系数据创建快照,并保存在当前的数据中。关系数据更新时,快照不会更新。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "./dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/field-snapshot",
diff --git a/packages/plugins/@nocobase/plugin-system-settings/package.json b/packages/plugins/@nocobase/plugin-system-settings/package.json
index a38d782aa4..057538678d 100644
--- a/packages/plugins/@nocobase/plugin-system-settings/package.json
+++ b/packages/plugins/@nocobase/plugin-system-settings/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "系统设置",
"description": "Used to adjust the system title, logo, language, etc.",
"description.zh-CN": "用于调整系统的标题、LOGO、语言等。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "./dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/system-settings",
diff --git a/packages/plugins/@nocobase/plugin-theme-editor/package.json b/packages/plugins/@nocobase/plugin-theme-editor/package.json
index c33805ff9a..5fcdfd7f99 100644
--- a/packages/plugins/@nocobase/plugin-theme-editor/package.json
+++ b/packages/plugins/@nocobase/plugin-theme-editor/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/plugin-theme-editor",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"main": "dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/theme-editor",
"homepage.zh-CN": "https://docs-cn.nocobase.com/handbook/theme-editor",
diff --git a/packages/plugins/@nocobase/plugin-theme-editor/src/client/antd-token-previewer/meta/category.ts b/packages/plugins/@nocobase/plugin-theme-editor/src/client/antd-token-previewer/meta/category.ts
index 3b2509f3ce..fd7ca4ad71 100644
--- a/packages/plugins/@nocobase/plugin-theme-editor/src/client/antd-token-previewer/meta/category.ts
+++ b/packages/plugins/@nocobase/plugin-theme-editor/src/client/antd-token-previewer/meta/category.ts
@@ -279,7 +279,7 @@ const category: TokenTree = [
nameEn: 'Others',
desc: '',
descEn: '',
- seedToken: ['wireframe'],
+ seedToken: ['wireframe', 'siderWidth'],
},
],
},
diff --git a/packages/plugins/@nocobase/plugin-theme-editor/src/client/antd-token-previewer/token-panel-pro/TokenContent.tsx b/packages/plugins/@nocobase/plugin-theme-editor/src/client/antd-token-previewer/token-panel-pro/TokenContent.tsx
index 86f129146d..88b89eb58b 100644
--- a/packages/plugins/@nocobase/plugin-theme-editor/src/client/antd-token-previewer/token-panel-pro/TokenContent.tsx
+++ b/packages/plugins/@nocobase/plugin-theme-editor/src/client/antd-token-previewer/token-panel-pro/TokenContent.tsx
@@ -10,7 +10,7 @@
import { CaretRightOutlined, ExpandOutlined, QuestionCircleOutlined } from '@ant-design/icons';
import type { ThemeConfig } from '@nocobase/client';
import { StablePopover } from '@nocobase/client';
-import { Button, Checkbox, Collapse, ConfigProvider, Switch, Tooltip, Typography } from 'antd';
+import { Button, Checkbox, Collapse, ConfigProvider, InputNumber, Switch, Tooltip, Typography } from 'antd';
import seed from 'antd/es/theme/themes/seed';
import classNames from 'classnames';
import type { FC } from 'react';
@@ -346,6 +346,9 @@ const SeedTokenPreview: FC = ({ theme, tokenName, disabled, alph
/>
)}
{tokenName === 'wireframe' && }
+ {['siderWidth'].includes(tokenName) && (
+
+ )}
);
};
diff --git a/packages/plugins/@nocobase/plugin-theme-editor/src/client/antd-token-previewer/token-panel-pro/token-meta.json b/packages/plugins/@nocobase/plugin-theme-editor/src/client/antd-token-previewer/token-panel-pro/token-meta.json
index 54ff50a523..5209098ea7 100644
--- a/packages/plugins/@nocobase/plugin-theme-editor/src/client/antd-token-previewer/token-panel-pro/token-meta.json
+++ b/packages/plugins/@nocobase/plugin-theme-editor/src/client/antd-token-previewer/token-panel-pro/token-meta.json
@@ -1592,6 +1592,14 @@
"type": "boolean",
"source": "seed"
},
+ "siderWidth": {
+ "name": "侧边栏宽度(px)",
+ "nameEn": "Sider width (px)",
+ "desc": "调整侧边栏展示区域的宽度,宽度单位通常为像素(px)",
+ "descEn": "Adjust the width of the sidebar display area. The width is usually measured in pixels (px).",
+ "type": "number",
+ "source": "map"
+ },
"zIndexBase": {
"name": "基础 zIndex",
"nameEn": "Base zIndex",
diff --git a/packages/plugins/@nocobase/plugin-ui-schema-storage/package.json b/packages/plugins/@nocobase/plugin-ui-schema-storage/package.json
index 457c09e1fd..248aa9dd61 100644
--- a/packages/plugins/@nocobase/plugin-ui-schema-storage/package.json
+++ b/packages/plugins/@nocobase/plugin-ui-schema-storage/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "UI schema 存储服务",
"description": "Provides centralized UI schema storage service.",
"description.zh-CN": "提供中心化的 UI schema 存储服务。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "./dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/ui-schema-storage",
diff --git a/packages/plugins/@nocobase/plugin-user-data-sync/package.json b/packages/plugins/@nocobase/plugin-user-data-sync/package.json
index 47b204a6ce..a109b5a777 100644
--- a/packages/plugins/@nocobase/plugin-user-data-sync/package.json
+++ b/packages/plugins/@nocobase/plugin-user-data-sync/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "用户数据同步",
"description": "Reigster and manage extensible user data synchronization sources, with HTTP API provided by default. Support for synchronizing data to resources such as users and departments.",
"description.zh-CN": "注册和管理可扩展的用户数据同步来源,默认提供 HTTP API。支持向用户和部门等资源同步数据。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"main": "dist/server/index.js",
"peerDependencies": {
"@nocobase/client": "1.x",
diff --git a/packages/plugins/@nocobase/plugin-users/package.json b/packages/plugins/@nocobase/plugin-users/package.json
index 3031a2e31b..cf7689c77f 100644
--- a/packages/plugins/@nocobase/plugin-users/package.json
+++ b/packages/plugins/@nocobase/plugin-users/package.json
@@ -4,14 +4,14 @@
"displayName.zh-CN": "用户",
"description": "Provides basic user model, as well as created by and updated by fields.",
"description.zh-CN": "提供了基础的用户模型,以及创建人和最后更新人字段。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "./dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/users",
"homepage.zh-CN": "https://docs-cn.nocobase.com/handbook/users",
"devDependencies": {
- "@types/jsonwebtoken": "^8.5.8",
- "jsonwebtoken": "^8.5.1"
+ "@types/jsonwebtoken": "^9.0.9",
+ "jsonwebtoken": "^9.0.2"
},
"peerDependencies": {
"@nocobase/actions": "1.x",
diff --git a/packages/plugins/@nocobase/plugin-verification/package.json b/packages/plugins/@nocobase/plugin-verification/package.json
index 4190a22f8b..8b66a8d586 100644
--- a/packages/plugins/@nocobase/plugin-verification/package.json
+++ b/packages/plugins/@nocobase/plugin-verification/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "验证",
"description": "User identity verification management, including SMS, TOTP authenticator, with extensibility.",
"description.zh-CN": "用户身份验证管理,包含短信、TOTP 认证器等,可扩展。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "./dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/verification",
diff --git a/packages/plugins/@nocobase/plugin-verification/src/client/schemas/verificators.ts b/packages/plugins/@nocobase/plugin-verification/src/client/schemas/verificators.ts
index 9115298ca0..f7393c4314 100644
--- a/packages/plugins/@nocobase/plugin-verification/src/client/schemas/verificators.ts
+++ b/packages/plugins/@nocobase/plugin-verification/src/client/schemas/verificators.ts
@@ -207,7 +207,6 @@ export const verficatorsSchema: ISchema = {
'x-component': 'Action.Link',
'x-component-props': {
openMode: 'drawer',
- icon: 'EditOutlined',
},
properties: {
drawer: {
diff --git a/packages/plugins/@nocobase/plugin-verification/src/server/migrations/20250111192640-providers2verificators.ts b/packages/plugins/@nocobase/plugin-verification/src/server/migrations/20250111192640-providers2verificators.ts
index 86f788fa69..4534038626 100644
--- a/packages/plugins/@nocobase/plugin-verification/src/server/migrations/20250111192640-providers2verificators.ts
+++ b/packages/plugins/@nocobase/plugin-verification/src/server/migrations/20250111192640-providers2verificators.ts
@@ -13,7 +13,7 @@ import { SMS_OTP_VERIFICATION_TYPE } from '../../constants';
export default class extends Migration {
on = 'afterLoad'; // 'beforeLoad' or 'afterLoad'
- appVersion = '<1.6.1';
+ appVersion = '<1.7.0';
async up() {
const providers = await this.db.getRepository('verifications_providers').find();
diff --git a/packages/plugins/@nocobase/plugin-workflow-action-trigger/package.json b/packages/plugins/@nocobase/plugin-workflow-action-trigger/package.json
index 9273c83917..a96f5cd057 100644
--- a/packages/plugins/@nocobase/plugin-workflow-action-trigger/package.json
+++ b/packages/plugins/@nocobase/plugin-workflow-action-trigger/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "工作流:操作后事件",
"description": "Triggered after the completion of a request initiated through an action button or API, such as after adding, updating, deleting data, or \"submit to workflow\". Suitable for data processing, sending notifications, etc., after actions are completed.",
"description.zh-CN": "通过操作按钮或 API 发起请求并在执行完成后触发,比如新增、更新、删除数据或者“提交至工作流”之后。适用于在操作完成后进行数据处理、发送通知等。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "./dist/server/index.js",
"homepage": "https://docs.nocobase.com/plugins/workflow-action-trigger",
diff --git a/packages/plugins/@nocobase/plugin-workflow-aggregate/package.json b/packages/plugins/@nocobase/plugin-workflow-aggregate/package.json
index 201387fbdb..3a5a11ac35 100644
--- a/packages/plugins/@nocobase/plugin-workflow-aggregate/package.json
+++ b/packages/plugins/@nocobase/plugin-workflow-aggregate/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "工作流:聚合查询节点",
"description": "Used to aggregate data against the database in workflow, such as: statistics, sum, average, etc.",
"description.zh-CN": "可用于在工作流中对数据库进行聚合查询,如:统计数量、求和、平均值等。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "./dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/workflow-aggregate",
diff --git a/packages/plugins/@nocobase/plugin-workflow-delay/package.json b/packages/plugins/@nocobase/plugin-workflow-delay/package.json
index 874b59727c..6abadcdde0 100644
--- a/packages/plugins/@nocobase/plugin-workflow-delay/package.json
+++ b/packages/plugins/@nocobase/plugin-workflow-delay/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "工作流:延时节点",
"description": "Could be used in workflow parallel branch for waiting other branches.",
"description.zh-CN": "可用于工作流并行分支中等待其他分支执行完成。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "./dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/workflow-delay",
diff --git a/packages/plugins/@nocobase/plugin-workflow-dynamic-calculation/package.json b/packages/plugins/@nocobase/plugin-workflow-dynamic-calculation/package.json
index 4cfa89a145..75a17bb985 100644
--- a/packages/plugins/@nocobase/plugin-workflow-dynamic-calculation/package.json
+++ b/packages/plugins/@nocobase/plugin-workflow-dynamic-calculation/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "工作流:动态表达式计算节点",
"description": "Useful plugin for doing dynamic calculation based on expression collection records in workflow.",
"description.zh-CN": "用于在工作流中进行基于数据行的动态表达式计算。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "./dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/workflow-dynamic-calculation",
diff --git a/packages/plugins/@nocobase/plugin-workflow-loop/package.json b/packages/plugins/@nocobase/plugin-workflow-loop/package.json
index 8445cd6a5f..1a31dcbf3a 100644
--- a/packages/plugins/@nocobase/plugin-workflow-loop/package.json
+++ b/packages/plugins/@nocobase/plugin-workflow-loop/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "工作流:循环节点",
"description": "Used to repeat the sub-process processing of each value in an array, and can also be used for fixed times of sub-process processing.",
"description.zh-CN": "用于对一个数组中的每个值进行重复的子流程处理,也可用于固定次数的重复子流程处理。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "./dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/workflow-loop",
diff --git a/packages/plugins/@nocobase/plugin-workflow-mailer/package.json b/packages/plugins/@nocobase/plugin-workflow-mailer/package.json
index 45e9fe77d6..ff648c2439 100644
--- a/packages/plugins/@nocobase/plugin-workflow-mailer/package.json
+++ b/packages/plugins/@nocobase/plugin-workflow-mailer/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "工作流:邮件发送节点",
"description": "Send email in workflow.",
"description.zh-CN": "可用于在工作流中发送电子邮件。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "./dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/workflow-smtp-mailer",
diff --git a/packages/plugins/@nocobase/plugin-workflow-manual/package.json b/packages/plugins/@nocobase/plugin-workflow-manual/package.json
index e5c80f4bb3..469dd411fe 100644
--- a/packages/plugins/@nocobase/plugin-workflow-manual/package.json
+++ b/packages/plugins/@nocobase/plugin-workflow-manual/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "工作流:人工处理节点",
"description": "Could be used for workflows which some of decisions are made by users.",
"description.zh-CN": "用于人工控制部分决策的流程。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "./dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/workflow-manual",
diff --git a/packages/plugins/@nocobase/plugin-workflow-manual/src/client/WorkflowTodo.tsx b/packages/plugins/@nocobase/plugin-workflow-manual/src/client/WorkflowTodo.tsx
index 491a82d89c..5a90d0daad 100644
--- a/packages/plugins/@nocobase/plugin-workflow-manual/src/client/WorkflowTodo.tsx
+++ b/packages/plugins/@nocobase/plugin-workflow-manual/src/client/WorkflowTodo.tsx
@@ -8,6 +8,7 @@
*/
import React, { createContext, useCallback, useContext, useEffect, useState } from 'react';
+import { useNavigate, useParams } from 'react-router-dom';
import { useField, useFieldSchema, useForm } from '@formily/react';
import { FormLayout } from '@formily/antd-v5';
import { Button, Card, ConfigProvider, Descriptions, Space, Spin, Tag } from 'antd';
@@ -47,17 +48,14 @@ import WorkflowPlugin, {
useAvailableUpstreams,
useFlowContext,
EXECUTION_STATUS,
- JOB_STATUS,
WorkflowTitle,
- TASK_STATUS,
usePopupRecordContext,
} from '@nocobase/plugin-workflow/client';
import { NAMESPACE, useLang } from '../locale';
import { FormBlockProvider } from './instruction/FormBlockProvider';
import { ManualFormType, manualFormTypes } from './instruction/SchemaConfig';
-import { TaskStatusOptionsMap } from '../common/constants';
-import { useNavigate, useParams } from 'react-router-dom';
+import { TaskStatusOptionsMap, TASK_STATUS } from '../common/constants';
function TaskStatusColumn(props) {
const recordData = useCollectionRecordData();
@@ -654,11 +652,11 @@ function TaskItem() {
const StatusFilterMap = {
pending: {
- status: JOB_STATUS.PENDING,
+ status: TASK_STATUS.PENDING,
'execution.status': EXECUTION_STATUS.STARTED,
},
completed: {
- status: JOB_STATUS.RESOLVED,
+ status: [TASK_STATUS.RESOLVED, TASK_STATUS.REJECTED],
},
};
diff --git a/packages/plugins/@nocobase/plugin-workflow-manual/src/common/constants.ts b/packages/plugins/@nocobase/plugin-workflow-manual/src/common/constants.ts
index dd4acc5d20..a59b843700 100644
--- a/packages/plugins/@nocobase/plugin-workflow-manual/src/common/constants.ts
+++ b/packages/plugins/@nocobase/plugin-workflow-manual/src/common/constants.ts
@@ -14,7 +14,7 @@ export const MANUAL_TASK_TYPE = 'manual';
export const TASK_STATUS = {
PENDING: 0,
RESOLVED: 1,
- REJECTED: -1,
+ REJECTED: -5,
};
export const TaskStatusOptions = [
diff --git a/packages/plugins/@nocobase/plugin-workflow-manual/src/server/Plugin.ts b/packages/plugins/@nocobase/plugin-workflow-manual/src/server/Plugin.ts
index a63b5aba87..08e931293b 100644
--- a/packages/plugins/@nocobase/plugin-workflow-manual/src/server/Plugin.ts
+++ b/packages/plugins/@nocobase/plugin-workflow-manual/src/server/Plugin.ts
@@ -51,7 +51,7 @@ export default class extends Plugin {
},
});
- this.app.acl.allow('workflowManualTasks', ['list', 'get', 'submit'], 'loggedIn');
+ this.app.acl.allow('workflowManualTasks', ['list', 'listMine', 'get', 'submit'], 'loggedIn');
const workflowPlugin = this.app.pm.get(WorkflowPlugin) as WorkflowPlugin;
workflowPlugin.registerInstruction('manual', ManualInstruction);
diff --git a/packages/plugins/@nocobase/plugin-workflow-manual/src/server/__tests__/tasks.test.ts b/packages/plugins/@nocobase/plugin-workflow-manual/src/server/__tests__/tasks.test.ts
new file mode 100644
index 0000000000..c866136331
--- /dev/null
+++ b/packages/plugins/@nocobase/plugin-workflow-manual/src/server/__tests__/tasks.test.ts
@@ -0,0 +1,150 @@
+/**
+ * This file is part of the NocoBase (R) project.
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
+ * Authors: NocoBase Team.
+ *
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
+ * For more information, please refer to: https://www.nocobase.com/agreement.
+ */
+
+import Database from '@nocobase/database';
+import { EXECUTION_STATUS, JOB_STATUS } from '@nocobase/plugin-workflow';
+import { getApp, sleep } from '@nocobase/plugin-workflow-test';
+import { MockServer } from '@nocobase/test';
+import { TASK_STATUS } from '../../common/constants';
+
+// NOTE: skipped because time is not stable on github ci, but should work in local
+describe('workflow > instructions > manual > task center', () => {
+ let app: MockServer;
+ let agent;
+ let userAgents;
+ let db: Database;
+ let PostRepo;
+ let WorkflowModel;
+ let workflow;
+ let UserModel;
+ let users;
+ let UserJobModel;
+
+ beforeEach(async () => {
+ app = await getApp({
+ plugins: ['users', 'auth', 'workflow-manual'],
+ });
+ // await app.getPlugin('auth').install();
+ agent = app.agent();
+ db = app.db;
+ WorkflowModel = db.getCollection('workflows').model;
+ PostRepo = db.getCollection('posts').repository;
+ UserModel = db.getCollection('users').model;
+ UserJobModel = db.getModel('workflowManualTasks');
+
+ users = await UserModel.bulkCreate([
+ { id: 2, nickname: 'a' },
+ { id: 3, nickname: 'b' },
+ ]);
+
+ userAgents = await Promise.all(users.map((user) => app.agent().login(user)));
+
+ workflow = await WorkflowModel.create({
+ enabled: true,
+ type: 'collection',
+ config: {
+ mode: 1,
+ collection: 'posts',
+ },
+ });
+ });
+
+ afterEach(() => app.destroy());
+
+ describe('listMine', () => {
+ it('member', async () => {
+ const n1 = await workflow.createNode({
+ type: 'manual',
+ config: {
+ assignees: [users[0].id],
+ forms: {
+ f1: {
+ type: 'update',
+ actions: [{ status: JOB_STATUS.RESOLVED, key: 'resolve' }],
+ collection: 'posts',
+ filter: {
+ id: '{{$context.data.id}}',
+ },
+ },
+ },
+ },
+ });
+
+ const post = await PostRepo.create({ values: { title: 't1' } });
+
+ await sleep(500);
+
+ const UserJobModel = db.getModel('workflowManualTasks');
+ const pendingJobs = await UserJobModel.findAll({
+ order: [['userId', 'ASC']],
+ });
+ expect(pendingJobs.length).toBe(1);
+
+ const res1 = await userAgents[0].resource('workflowManualTasks').listMine();
+ expect(res1.status).toBe(200);
+ expect(res1.body.data.length).toBe(1);
+
+ const res2 = await userAgents[0].resource('workflowManualTasks').listMine({
+ filter: {
+ status: TASK_STATUS.PENDING,
+ },
+ });
+ expect(res2.status).toBe(200);
+ expect(res2.body.data.length).toBe(1);
+
+ const res3 = await userAgents[0].resource('workflowManualTasks').listMine({
+ filter: {
+ status: TASK_STATUS.RESOLVED,
+ },
+ });
+ expect(res3.status).toBe(200);
+ expect(res3.body.data.length).toBe(0);
+
+ const res4 = await userAgents[0].resource('workflowManualTasks').submit({
+ filterByTk: pendingJobs[0].get('id'),
+ values: {
+ result: { f1: { title: 't2' }, _: 'resolve' },
+ },
+ });
+ expect(res4.status).toBe(202);
+
+ await sleep(500);
+
+ const [e1] = await workflow.getExecutions({ order: [['createdAt', 'ASC']] });
+ expect(e1.status).toBe(EXECUTION_STATUS.RESOLVED);
+ const [j1] = await e1.getJobs();
+ expect(j1.status).toBe(JOB_STATUS.RESOLVED);
+ expect(j1.result).toMatchObject({ f1: { title: 't2' } });
+
+ const posts = await PostRepo.find({ order: [['createdAt', 'ASC']] });
+ expect(posts.length).toBe(1);
+ expect(posts[0]).toMatchObject({ title: 't2' });
+
+ const res5 = await userAgents[0].resource('workflowManualTasks').listMine({
+ filter: {
+ status: TASK_STATUS.PENDING,
+ },
+ });
+ expect(res5.status).toBe(200);
+ expect(res5.body.data.length).toBe(0);
+
+ const res6 = await userAgents[0].resource('workflowManualTasks').listMine({
+ filter: {
+ status: TASK_STATUS.RESOLVED,
+ },
+ });
+ expect(res6.status).toBe(200);
+ expect(res6.body.data.length).toBe(1);
+
+ const res7 = await userAgents[0].resource('workflowManualTasks').listMine();
+ expect(res7.status).toBe(200);
+ expect(res7.body.data.length).toBe(1);
+ });
+ });
+});
diff --git a/packages/plugins/@nocobase/plugin-workflow-notification/package.json b/packages/plugins/@nocobase/plugin-workflow-notification/package.json
index 2474535dc5..920f2a8c8b 100644
--- a/packages/plugins/@nocobase/plugin-workflow-notification/package.json
+++ b/packages/plugins/@nocobase/plugin-workflow-notification/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "工作流:通知节点",
"description": "Send notification in workflow.",
"description.zh-CN": "可用于在工作流中发送各类通知。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "./dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/workflow-smtp-mailer",
diff --git a/packages/plugins/@nocobase/plugin-workflow-parallel/package.json b/packages/plugins/@nocobase/plugin-workflow-parallel/package.json
index 3dd3024223..e35549f16f 100644
--- a/packages/plugins/@nocobase/plugin-workflow-parallel/package.json
+++ b/packages/plugins/@nocobase/plugin-workflow-parallel/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "工作流:并行分支节点",
"description": "Could be used for parallel execution of branch processes in the workflow.",
"description.zh-CN": "用于在工作流中需要并行执行的分支流程。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "./dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/workflow-parallel",
diff --git a/packages/plugins/@nocobase/plugin-workflow-request/package.json b/packages/plugins/@nocobase/plugin-workflow-request/package.json
index 88676beb3e..df10693f3f 100644
--- a/packages/plugins/@nocobase/plugin-workflow-request/package.json
+++ b/packages/plugins/@nocobase/plugin-workflow-request/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "工作流:HTTP 请求节点",
"description": "Send HTTP requests to any HTTP service for data interaction in workflow.",
"description.zh-CN": "可用于在工作流中向任意 HTTP 服务发送请求,进行数据交互。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "./dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/workflow-request",
diff --git a/packages/plugins/@nocobase/plugin-workflow-response-message/package.json b/packages/plugins/@nocobase/plugin-workflow-response-message/package.json
index f8833d6adc..8ee9b09265 100644
--- a/packages/plugins/@nocobase/plugin-workflow-response-message/package.json
+++ b/packages/plugins/@nocobase/plugin-workflow-response-message/package.json
@@ -1,6 +1,6 @@
{
"name": "@nocobase/plugin-workflow-response-message",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"displayName": "Workflow: Response message",
"displayName.zh-CN": "工作流:响应消息",
"description": "Used for assemble response message and showing to client in form event and request interception workflows.",
diff --git a/packages/plugins/@nocobase/plugin-workflow-sql/package.json b/packages/plugins/@nocobase/plugin-workflow-sql/package.json
index 2fb3bbba7f..47606dc7bd 100644
--- a/packages/plugins/@nocobase/plugin-workflow-sql/package.json
+++ b/packages/plugins/@nocobase/plugin-workflow-sql/package.json
@@ -4,7 +4,7 @@
"displayName.zh-CN": "工作流:SQL 节点",
"description": "Execute SQL statements in workflow.",
"description.zh-CN": "可用于在工作流中对数据库执行任意 SQL 语句。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "./dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/workflow-sql",
diff --git a/packages/plugins/@nocobase/plugin-workflow-test/package.json b/packages/plugins/@nocobase/plugin-workflow-test/package.json
index a2e2f95942..9d150ed275 100644
--- a/packages/plugins/@nocobase/plugin-workflow-test/package.json
+++ b/packages/plugins/@nocobase/plugin-workflow-test/package.json
@@ -2,7 +2,7 @@
"name": "@nocobase/plugin-workflow-test",
"displayName": "Workflow: test kit",
"displayName.zh-CN": "工作流:测试工具包",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "dist/server/index.js",
"types": "./dist/server/index.d.ts",
diff --git a/packages/plugins/@nocobase/plugin-workflow-test/src/e2e/e2eCollectionModel.ts b/packages/plugins/@nocobase/plugin-workflow-test/src/e2e/e2eCollectionModel.ts
index 10709e0ae7..9dbbd3aded 100644
--- a/packages/plugins/@nocobase/plugin-workflow-test/src/e2e/e2eCollectionModel.ts
+++ b/packages/plugins/@nocobase/plugin-workflow-test/src/e2e/e2eCollectionModel.ts
@@ -882,7 +882,7 @@ export const builtinExpression = {
value: 'formula.js',
label: 'Formula.js',
tooltip: '{{t("Formula.js supports most Microsoft Excel formula functions.")}}',
- link: 'https://formulajs.info/functions/',
+ link: 'https://docs.nocobase.com/handbook/calculation-engines/formula',
},
],
default: 'formula.js',
diff --git a/packages/plugins/@nocobase/plugin-workflow/package.json b/packages/plugins/@nocobase/plugin-workflow/package.json
index 401cbe5e6b..6a332c9519 100644
--- a/packages/plugins/@nocobase/plugin-workflow/package.json
+++ b/packages/plugins/@nocobase/plugin-workflow/package.json
@@ -4,13 +4,13 @@
"displayName.zh-CN": "工作流",
"description": "A powerful BPM tool that provides foundational support for business automation, with the capability to extend unlimited triggers and nodes.",
"description.zh-CN": "一个强大的 BPM 工具,为业务自动化提供基础支持,并且可任意扩展更多的触发器和节点。",
- "version": "1.7.0-beta.18",
+ "version": "1.7.0-beta.26",
"license": "AGPL-3.0",
"main": "./dist/server/index.js",
"homepage": "https://docs.nocobase.com/handbook/workflow",
"homepage.zh-CN": "https://docs-cn.nocobase.com/handbook/workflow",
"dependencies": {
- "@nocobase/plugin-workflow-test": "1.7.0-beta.18"
+ "@nocobase/plugin-workflow-test": "1.7.0-beta.26"
},
"devDependencies": {
"@ant-design/icons": "5.x",
diff --git a/packages/plugins/@nocobase/plugin-workflow/src/client/components/TriggerCollectionRecordSelect.tsx b/packages/plugins/@nocobase/plugin-workflow/src/client/components/TriggerCollectionRecordSelect.tsx
index ca1f085b11..42d964426c 100644
--- a/packages/plugins/@nocobase/plugin-workflow/src/client/components/TriggerCollectionRecordSelect.tsx
+++ b/packages/plugins/@nocobase/plugin-workflow/src/client/components/TriggerCollectionRecordSelect.tsx
@@ -21,19 +21,19 @@ export function TriggerCollectionRecordSelect(props) {
const [dataSourceName, collectionName] = parseCollectionName(workflow.config.collection);
const { collectionManager } = app.dataSourceManager.getDataSource(dataSourceName);
const collection = collectionManager.getCollection(collectionName);
- const render = (props) => (
+ const render = (p) => (