diff --git a/packages/core/src/create-plugin/constant/plugin-list.ts b/packages/core/src/create-plugin/constant/plugin-list.ts index 6211b1d0998b7d23b9fdb91238fa322d5c794b80..4e819cf2d6c2dc855a5e5f5fcbf3523d837d6edf 100644 --- a/packages/core/src/create-plugin/constant/plugin-list.ts +++ b/packages/core/src/create-plugin/constant/plugin-list.ts @@ -7,23 +7,23 @@ export const PluginList: IPluginType[] = [ // { name: 'CHART_SERIESRENDER', caption: '图表序列绘制插件' }, 未支持 // { name: 'CHART_CSRENDER', caption: '图表坐标系组件绘制插件' }, 未支持 { name: 'CUSTOM', caption: '自定义部件绘制插件' }, - { name: 'DATAVIEW_ITEM', caption: '数据视图项绘制插件' }, + // { name: 'DATAVIEW_ITEM', caption: '数据视图项绘制插件' }, 未支持 { name: 'DATAVIEW_RENDER', caption: '数据视图绘制插件' }, { name: 'EDITFORM_RENDER', caption: '编辑表单绘制插件' }, { name: 'EDITOR_CUSTOMSTYLE', caption: '编辑器自定义绘制插件' }, { name: 'FORM_USERCONTROL', caption: '表单自定义控件绘制插件' }, { name: 'GRID_COLRENDER', caption: '数据表格列绘制插件' }, { name: 'GRID_RENDER', caption: '数据表格绘制插件' }, - { name: 'LIST_ITEMRENDER', caption: '列表项绘制插件' }, + // { name: 'LIST_ITEMRENDER', caption: '列表项绘制插件' }, 未支持 { name: 'LIST_RENDER', caption: '列表绘制插件' }, { name: 'PORTLET_CUSTOM', caption: '自定义门户部件绘制插件' }, - { name: 'PORTLET_TITLEBAR', caption: '门户部件标题栏绘制插件' }, + // { name: 'PORTLET_TITLEBAR', caption: '门户部件标题栏绘制插件' }, 未支持 { name: 'SEARCHFORM_RENDER', caption: '搜索表单绘制插件' }, { name: 'TOOLBAR_ITEM', caption: '工具栏项绘制插件' }, { name: 'TOOLBAR_RENDER', caption: '工具栏绘制插件' }, - { name: 'TREEEXPBAR_RENDER', caption: '树导航栏绘制插件' }, + // { name: 'TREEEXPBAR_RENDER', caption: '树导航栏绘制插件' }, 未支持 { name: 'TREE_RENDER', caption: '树视图绘制插件' }, - { name: 'UIENGINE', caption: '界面引擎' }, + // { name: 'UIENGINE', caption: '界面引擎' }, 未支持 { name: 'UILOGICNODE', caption: '界面逻辑节点' }, { name: 'VIEW_CUSTOM', caption: '实体视图绘制插件' }, { name: 'DEMETHOD', caption: '应用实体方法插件' }, diff --git a/packages/core/src/create-plugin/template/platform/ac_item/README.md b/packages/core/src/create-plugin/template/platform/ac_item/README.md index 2aa47b1e97d6d34b72fc8b50359f898bee3779e2..52af43c068e53c7a07e8d9eaea011be3228d738c 100644 --- a/packages/core/src/create-plugin/template/platform/ac_item/README.md +++ b/packages/core/src/create-plugin/template/platform/ac_item/README.md @@ -1,5 +1,7 @@ # 自填列表项插件 +自填列表项插件可自定义下拉列表项的绘制逻辑,当标准逻辑无法满足项绘制要求时,可以通过自填列表项插件来实现。modeling建模平台创建自填列表项插件可参见 [插件开发](https://open.ibizlab.cn/apphub/zh/guide/plugin-dev.html) + ## 插件结构 ``` @@ -11,14 +13,54 @@ ​ |─ ─ index.ts 自填列表项插件入口文件 ``` -### 自填列表项插件入口文件 +- 自填列表项插件入口文件 -自填列表项插件入口文件会全局注册自填列表项适配器和自填列表项插件组件,供外部使用。 +自填列表项插件入口文件会全局注册自填列表项插件适配器和自填列表项插件组件,供外部使用。 -### 自填列表项插件组件 +- 自填列表项插件组件 自填列表项插件组件使用tsx的书写方式,承载自填列表项绘制的内容,可根据需求自定义内容呈现。 -### 自填列表项插件适配器 +- 自填列表项插件适配器 自填列表项插件适配器主要通过component属性指定自填列表项实际要绘制的组件。 + +## 本地开发 + +1. 安装依赖并link至全局 + +```sh +// 安装依赖 +pnpm i + +// link底包 +./scripts/link.sh + +// 启动 +pnpm dev + +// link到全局 +pnpm link --global +``` + +2. 主项目包中引用插件 + +```sh +// link插件 +pnpm link --global '{{pluginGroup}}/{{pluginName}}' +``` + +3. 主项目包中注册插件 + +```ts +import { App } from 'vue'; +import {{ pascalCasePluginName }} from '{{pluginGroup}}/{{pluginName}}' + +export default { + install(app: App) { + app.use({{ pascalCasePluginName }}); + // 设置本地开发需要忽略加载的插件,可填写正则或全匹配字符串。匹配插件在modeling建模平台配置的[运行时插件仓库配置]内容 + ibiz.plugin.setDevIgnore(/^{{pluginGroup}}\/{{pluginName}}/); + }, +}; +``` diff --git a/packages/core/src/create-plugin/template/platform/ac_item/package.json b/packages/core/src/create-plugin/template/platform/ac_item/package.json index b89f541dca6c061575c2f2e85648e53bb5e2e515..7bcf063680ec82aa96d7b56a1d83dbed72f592da 100644 --- a/packages/core/src/create-plugin/template/platform/ac_item/package.json +++ b/packages/core/src/create-plugin/template/platform/ac_item/package.json @@ -28,12 +28,12 @@ }, "devDependencies": { "@floating-ui/dom": "^1.5.3", - "@ibiz-template/core": "0.7.40-alpha.13", - "@ibiz-template/model-helper": "0.7.40-alpha.13", - "@ibiz-template/runtime": "0.7.40-alpha.13", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", "@ibiz-template/theme": "^0.7.39", - "@ibiz-template/vue3-util": "0.7.40-alpha.13", - "@ibiz/model-core": "^0.1.71", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", "@qx-chitanda/vite-plugin-lib-legacy": "^4.1.1", "@types/lodash-es": "^4.17.12", "@types/ramda": "^0.29.6", @@ -84,12 +84,12 @@ }, "peerDependencies": { "@floating-ui/dom": "^1.5.1", - "@ibiz-template/core": "0.7.40-alpha.13", - "@ibiz-template/model-helper": "0.7.40-alpha.13", - "@ibiz-template/runtime": "0.7.40-alpha.13", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", "@ibiz-template/theme": "^0.7.39", - "@ibiz-template/vue3-util": "0.7.40-alpha.13", - "@ibiz/model-core": "^0.1.71", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", "async-validator": "^4.2.5", "axios": "^1.6.2", "dayjs": "^1.11.10", diff --git a/packages/core/src/create-plugin/template/platform/ac_item/src/index.ts b/packages/core/src/create-plugin/template/platform/ac_item/src/index.ts index 8e7f631f58859f51a3fbe53c8e8e65ee381e8d35..f70cae4c0054451fb05dd2d825f80ea0fb953595 100644 --- a/packages/core/src/create-plugin/template/platform/ac_item/src/index.ts +++ b/packages/core/src/create-plugin/template/platform/ac_item/src/index.ts @@ -9,7 +9,7 @@ export default { install(app: App) { // 全局注册自填列表项插件组件 app.component({{pascalCasePluginName}}.name!, {{pascalCasePluginName}}); - // 全局注册自填列表项适配器,AC_ITEM是插件类型,{{pluginId}}是插件标识 + // 全局注册自填列表项插件适配器,AC_ITEM是插件类型,{{pluginId}}是插件标识 registerAcItemProvider('AC_ITEM_{{pluginId}}', () => new {{pascalCasePluginName}}Provider()); }, }; diff --git a/packages/core/src/create-plugin/template/platform/ac_item/src/{{pluginName}}.tsx b/packages/core/src/create-plugin/template/platform/ac_item/src/{{pluginName}}.tsx index ab3dff1a2c9c15aaeaabd8ed5d11fd56a4b1885d..e704f61946f67add1e6644f43ba93814bb6ac9c7 100644 --- a/packages/core/src/create-plugin/template/platform/ac_item/src/{{pluginName}}.tsx +++ b/packages/core/src/create-plugin/template/platform/ac_item/src/{{pluginName}}.tsx @@ -4,7 +4,7 @@ import { useNamespace } from '@ibiz-template/vue3-util'; import './{{pluginName}}.scss'; export const {{ pascalCasePluginName }} = defineComponent({ - name: 'IBiz{{pascalCasePluginName}}', + name: 'IBiz{{ pascalCasePluginName }}', props: { item: { type: Object as PropType, diff --git a/packages/core/src/create-plugin/template/platform/chart_render/README.md b/packages/core/src/create-plugin/template/platform/chart_render/README.md index 620cdc9ab5e44a40f706ae1d101e3046f980ca09..d96e9f357a11e4a696bfda5c19c3e2b456ccde4f 100644 --- a/packages/core/src/create-plugin/template/platform/chart_render/README.md +++ b/packages/core/src/create-plugin/template/platform/chart_render/README.md @@ -1,73 +1,71 @@ # 图表插件 -// todo 简单描述,modeling建模平台创建图表插件可参见 [插件开发](https://open.ibizlab.cn/apphub/zh/guide/plugin-dev.html) +图表插件可自定义图表内容的绘制,当标准逻辑无法满足图表绘制要求时,可以通过图表插件来实现。modeling建模平台创建图表插件可参见 [插件开发](https://open.ibizlab.cn/apphub/zh/guide/plugin-dev.html) ## 插件结构 ``` -|─ ─ {{pluginName}} 部件插件顶层目录 - |─ ─ src 部件插件源代码目录 -​ |─ ─ {{pluginName}}.controller.ts 部件插件控制器 -​ |─ ─ {{pluginName}}.provider.ts 部件插件适配器 -​ |─ ─ {{pluginName}}.scss 部件插件样式 -​ |─ ─ {{pluginName}}.tsx 部件插件组件 -​ |─ ─ index.ts 部件插件入口文件 +|─ ─ {{pluginName}} 图表插件顶层目录 + |─ ─ src 图表插件源代码目录 +​ |─ ─ {{pluginName}}.controller.ts 图表插件控制器 +​ |─ ─ {{pluginName}}.provider.ts 图表插件适配器 +​ |─ ─ {{pluginName}}.scss 图表插件样式 +​ |─ ─ {{pluginName}}.tsx 图表插件组件 +​ |─ ─ index.ts 图表插件入口文件 ``` -- 部件插件入口文件 +- 图表插件入口文件 -部件插件入口文件会全局注册部件适配器和部件插件组件,供外部使用。 +图表插件入口文件会全局注册图表插件适配器和图表插件组件,供外部使用。 -- 部件插件组件 +- 图表插件组件 -部件插件组件使用tsx的书写方式,承载部件绘制的内容,可拷贝基础UI绘制,然后根据需求进行调整。其中,基础UI绘制可参考附录中UI呈现部分。 +图表插件组件使用tsx的书写方式,承载图表绘制的内容。 -- 部件插件适配器 +- 图表插件适配器 -部件插件适配器主要通过component属性指定部件实际要绘制的组件,并且通过createController方法返回传递给部件的控制器。 +图表插件适配器主要通过component属性指定图表实际要绘制的组件,并且通过createController方法返回传递给图表的控制器。 -- 部件插件控制器 +- 图表插件控制器 -部件插件控制器可继承基础控制器,然后根据需求进行调整。其中,基础控制器可参考附录中控制器部分。 +图表插件控制器承载图表的逻辑控制。 ## 本地开发 -// todo - -## 附录 - -| 部件类型 | UI呈现 | 控制器 | -| :----------------: | :--------------------: | :-----------------------: | -| 应用菜单 | AppMenuControl | AppMenuController | -| 应用菜单(图标视图) | AppMenuIconViewControl | AppMenuIconViewController | -| 日历 | CalendarControl | CalendarController | -| 标题栏 | CaptionBarControl | CaptionBarController | -| 图表 | ChartControl | ChartController | -| 上下文菜单 | ContextMenuControl | ContextMenuController | -| 数据看板 | DashboardControl | DashboardController | -| 卡片 | DataViewControl | DataViewControlController | -| 数据关系栏 | DRBarControl | DRBarController | -| 数据关系分页 | DRTabControl | DRTabController | -| 日历导航栏 | CalendarExpBarControl | CalendarExpBarController | -| 图表导航栏 | ChartExpBarControl | ChartExpBarController | -| 卡片导航栏 | DataViewExpBarControl | ExpBarControlController | -| 表格导航栏 | GridExpBarControl | ExpBarControlController | -| 列表导航栏 | ListExpBarControl | ExpBarControlController | -| 树导航栏 | TreeExpBarControl | TreeExpBarController | -| 编辑表单 | EditFormControl | EditFormController | -| 搜索表单 | SearchFormControl | SearchFormController | -| 甘特图 | GanttControl | GanttController | -| 表格 | GridControl | GridController | -| 看板 | KanbanControl | KanbanController | -| 列表 | ListControl | ListController | -| 地图 | MapControl | MapController | -| 多编辑视图面板 | MEditViewPanelControl | MEditViewPanelController | -| 选择视图面板 | PickupViewPanelControl | PickupViewPanelController | -| 报表面板 | ReportPanelControl | ReportPanelController | -| 搜索栏 | SearchBarControl | SearchBarController | -| 分页导航面板 | TabExpPanelControl | TabExpPanelController | -| 工具栏 | ToolbarControl | ToolbarController | -| 树 | TreeControl | TreeController | -| 树表格 | TreeGridControl | TreeGridController | -| 树表格(增强) | TreeGridExControl | TreeGridExController | -| 向导面板 | WizardPanelControl | WizardPanelController | +1. 安装依赖并link至全局 + +```sh +// 安装依赖 +pnpm i + +// link底包 +./scripts/link.sh + +// 启动 +pnpm dev + +// link到全局 +pnpm link --global +``` + +2. 主项目包中引用插件 + +```sh +// link插件 +pnpm link --global '{{pluginGroup}}/{{pluginName}}' +``` + +3. 主项目包中注册插件 + +```ts +import { App } from 'vue'; +import {{ pascalCasePluginName }} from '{{pluginGroup}}/{{pluginName}}' + +export default { + install(app: App) { + app.use({{ pascalCasePluginName }}); + // 设置本地开发需要忽略加载的插件,可填写正则或全匹配字符串。匹配插件在modeling建模平台配置的[运行时插件仓库配置]内容 + ibiz.plugin.setDevIgnore(/^{{pluginGroup}}\/{{pluginName}}/); + }, +}; +``` \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/chart_render/package.json b/packages/core/src/create-plugin/template/platform/chart_render/package.json index 9d91bb1fd3085001f191e80f53cd6dbddc3ee9c9..526db31b8430b973184cd5e8a7416fd394369d62 100644 --- a/packages/core/src/create-plugin/template/platform/chart_render/package.json +++ b/packages/core/src/create-plugin/template/platform/chart_render/package.json @@ -28,12 +28,12 @@ }, "devDependencies": { "@floating-ui/dom": "^1.5.3", - "@ibiz-template/core": "0.7.40-alpha.13", - "@ibiz-template/model-helper": "0.7.40-alpha.13", - "@ibiz-template/runtime": "0.7.40-alpha.13", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", "@ibiz-template/theme": "^0.7.39", - "@ibiz-template/vue3-util": "0.7.40-alpha.13", - "@ibiz/model-core": "^0.1.71", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", "@qx-chitanda/vite-plugin-lib-legacy": "^4.1.1", "@types/lodash-es": "^4.17.12", "@types/ramda": "^0.29.6", @@ -84,12 +84,12 @@ }, "peerDependencies": { "@floating-ui/dom": "^1.5.1", - "@ibiz-template/core": "0.7.40-alpha.13", - "@ibiz-template/model-helper": "0.7.40-alpha.13", - "@ibiz-template/runtime": "0.7.40-alpha.13", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", "@ibiz-template/theme": "^0.7.39", - "@ibiz-template/vue3-util": "0.7.40-alpha.13", - "@ibiz/model-core": "^0.1.71", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", "async-validator": "^4.2.5", "axios": "^1.6.2", "dayjs": "^1.11.10", diff --git a/packages/core/src/create-plugin/template/platform/chart_render/src/index.ts b/packages/core/src/create-plugin/template/platform/chart_render/src/index.ts index ecc396f727261bdedfbed7c5c7e25565a34b8b83..65972451f6cc767287207e5279fe3c69a050c18b 100644 --- a/packages/core/src/create-plugin/template/platform/chart_render/src/index.ts +++ b/packages/core/src/create-plugin/template/platform/chart_render/src/index.ts @@ -5,11 +5,11 @@ import { {{ pascalCasePluginName }}Provider } from './{{pluginName}}.provider'; export default { install(app: App) { - // 全局注册部件插件组件 + // 全局注册图表插件组件 app.component({{ pascalCasePluginName }}.name!, {{ pascalCasePluginName }}); - // 全局注册部件适配器,CUSTOM是插件类型,{{pluginId}}是插件标识 + // 全局注册图表插件适配器,CHART_RENDER是插件类型,{{pluginId}}是插件标识 registerControlProvider( - 'CUSTOM_{{pluginId}}', + 'CHART_RENDER_{{pluginId}}', () => new {{ pascalCasePluginName }}Provider(), ); }, diff --git a/packages/core/src/create-plugin/template/platform/chart_render/src/{{pluginName}}.tsx b/packages/core/src/create-plugin/template/platform/chart_render/src/{{pluginName}}.tsx index d4c9c9bf593d56089e12dc02ae459f231c76b757..4fd6580b0d5f891eff5fdad0f43155aa86bd9729 100644 --- a/packages/core/src/create-plugin/template/platform/chart_render/src/{{pluginName}}.tsx +++ b/packages/core/src/create-plugin/template/platform/chart_render/src/{{pluginName}}.tsx @@ -1,7 +1,7 @@ -import { useControlController, useNamespace } from '@ibiz-template/vue3-util'; import { defineComponent, PropType } from 'vue'; -import { IControlProvider } from '@ibiz-template/runtime'; +import { useControlController, useNamespace } from '@ibiz-template/vue3-util'; import { IDEChart } from '@ibiz/model-core'; +import { IControlProvider } from '@ibiz-template/runtime'; import { {{ pascalCasePluginName }}Controller } from './{{pluginName}}.controller'; import './{{pluginName}}.scss'; diff --git a/packages/core/src/create-plugin/template/platform/custom/README.md b/packages/core/src/create-plugin/template/platform/custom/README.md index 91ca028d21309a921372bcea34ddc59bdfa15b21..9439fe6aba615cd11167e4d9736dfd89154e91c1 100644 --- a/packages/core/src/create-plugin/template/platform/custom/README.md +++ b/packages/core/src/create-plugin/template/platform/custom/README.md @@ -1,5 +1,7 @@ # 部件插件 +部件插件可自定义部件内容的绘制,当标准逻辑无法满足部件绘制要求时,可以通过部件插件来实现。modeling建模平台创建部件插件可参见 [插件开发](https://open.ibizlab.cn/apphub/zh/guide/plugin-dev.html) + ## 插件结构 ``` @@ -12,22 +14,62 @@ ​ |─ ─ index.ts 部件插件入口文件 ``` -### 部件插件入口文件 +- 部件插件入口文件 -部件插件入口文件会全局注册部件适配器和部件插件组件,供外部使用。 +部件插件入口文件会全局注册部件插件适配器和部件插件组件,供外部使用。 -### 部件插件组件 +- 部件插件组件 部件插件组件使用tsx的书写方式,承载部件绘制的内容,可拷贝基础UI绘制,然后根据需求进行调整。其中,基础UI绘制可参考附录中UI呈现部分。 -### 部件插件适配器 +- 部件插件适配器 部件插件适配器主要通过component属性指定部件实际要绘制的组件,并且通过createController方法返回传递给部件的控制器。 -### 部件插件控制器 +- 部件插件控制器 部件插件控制器可继承基础控制器,然后根据需求进行调整。其中,基础控制器可参考附录中控制器部分。 +## 本地开发 + +1. 安装依赖并link至全局 + +```sh +// 安装依赖 +pnpm i + +// link底包 +./scripts/link.sh + +// 启动 +pnpm dev + +// link到全局 +pnpm link --global +``` + +2. 主项目包中引用插件 + +```sh +// link插件 +pnpm link --global '{{pluginGroup}}/{{pluginName}}' +``` + +3. 主项目包中注册插件 + +```ts +import { App } from 'vue'; +import {{ pascalCasePluginName }} from '{{pluginGroup}}/{{pluginName}}' + +export default { + install(app: App) { + app.use({{ pascalCasePluginName }}); + // 设置本地开发需要忽略加载的插件,可填写正则或全匹配字符串。匹配插件在modeling建模平台配置的[运行时插件仓库配置]内容 + ibiz.plugin.setDevIgnore(/^{{pluginGroup}}\/{{pluginName}}/); + }, +}; +``` + ## 附录 | 部件类型 | UI呈现 | 控制器 | diff --git a/packages/core/src/create-plugin/template/platform/custom/package.json b/packages/core/src/create-plugin/template/platform/custom/package.json index 9d91bb1fd3085001f191e80f53cd6dbddc3ee9c9..526db31b8430b973184cd5e8a7416fd394369d62 100644 --- a/packages/core/src/create-plugin/template/platform/custom/package.json +++ b/packages/core/src/create-plugin/template/platform/custom/package.json @@ -28,12 +28,12 @@ }, "devDependencies": { "@floating-ui/dom": "^1.5.3", - "@ibiz-template/core": "0.7.40-alpha.13", - "@ibiz-template/model-helper": "0.7.40-alpha.13", - "@ibiz-template/runtime": "0.7.40-alpha.13", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", "@ibiz-template/theme": "^0.7.39", - "@ibiz-template/vue3-util": "0.7.40-alpha.13", - "@ibiz/model-core": "^0.1.71", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", "@qx-chitanda/vite-plugin-lib-legacy": "^4.1.1", "@types/lodash-es": "^4.17.12", "@types/ramda": "^0.29.6", @@ -84,12 +84,12 @@ }, "peerDependencies": { "@floating-ui/dom": "^1.5.1", - "@ibiz-template/core": "0.7.40-alpha.13", - "@ibiz-template/model-helper": "0.7.40-alpha.13", - "@ibiz-template/runtime": "0.7.40-alpha.13", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", "@ibiz-template/theme": "^0.7.39", - "@ibiz-template/vue3-util": "0.7.40-alpha.13", - "@ibiz/model-core": "^0.1.71", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", "async-validator": "^4.2.5", "axios": "^1.6.2", "dayjs": "^1.11.10", diff --git a/packages/core/src/create-plugin/template/platform/custom/src/index.ts b/packages/core/src/create-plugin/template/platform/custom/src/index.ts index ecc396f727261bdedfbed7c5c7e25565a34b8b83..ace90896d06ed811e22f03a06daffabae35968bf 100644 --- a/packages/core/src/create-plugin/template/platform/custom/src/index.ts +++ b/packages/core/src/create-plugin/template/platform/custom/src/index.ts @@ -7,7 +7,7 @@ export default { install(app: App) { // 全局注册部件插件组件 app.component({{ pascalCasePluginName }}.name!, {{ pascalCasePluginName }}); - // 全局注册部件适配器,CUSTOM是插件类型,{{pluginId}}是插件标识 + // 全局注册部件插件适配器,CUSTOM是插件类型,{{pluginId}}是插件标识 registerControlProvider( 'CUSTOM_{{pluginId}}', () => new {{ pascalCasePluginName }}Provider(), diff --git a/packages/core/src/create-plugin/template/platform/custom/src/{{pluginName}}.controller.ts b/packages/core/src/create-plugin/template/platform/custom/src/{{pluginName}}.controller.ts index 2d6b3000c23b0e08c5fac4928ced7974559f882d..98837c3e891be06cc551b33172f228f71418ea49 100644 --- a/packages/core/src/create-plugin/template/platform/custom/src/{{pluginName}}.controller.ts +++ b/packages/core/src/create-plugin/template/platform/custom/src/{{pluginName}}.controller.ts @@ -1,3 +1,3 @@ -import { ChartController } from '@ibiz-template/runtime'; +import { ControlController } from '@ibiz-template/runtime'; -export class {{ pascalCasePluginName }}Controller extends ChartController {} +export class {{ pascalCasePluginName }}Controller extends ControlController {} diff --git a/packages/core/src/create-plugin/template/platform/custom/src/{{pluginName}}.tsx b/packages/core/src/create-plugin/template/platform/custom/src/{{pluginName}}.tsx index d4c9c9bf593d56089e12dc02ae459f231c76b757..09db41fcbfd5e895a25b431043b4f2da3b16f154 100644 --- a/packages/core/src/create-plugin/template/platform/custom/src/{{pluginName}}.tsx +++ b/packages/core/src/create-plugin/template/platform/custom/src/{{pluginName}}.tsx @@ -1,7 +1,7 @@ -import { useControlController, useNamespace } from '@ibiz-template/vue3-util'; import { defineComponent, PropType } from 'vue'; +import { useControlController, useNamespace } from '@ibiz-template/vue3-util'; +import { IControl } from '@ibiz/model-core'; import { IControlProvider } from '@ibiz-template/runtime'; -import { IDEChart } from '@ibiz/model-core'; import { {{ pascalCasePluginName }}Controller } from './{{pluginName}}.controller'; import './{{pluginName}}.scss'; @@ -9,9 +9,9 @@ export const {{ pascalCasePluginName }} = defineComponent({ name: 'IBiz{{ pascalCasePluginName }}', props: { /** - * @description 图表模型数据 + * @description 模型数据 */ - modelData: { type: Object as PropType, required: true }, + modelData: { type: Object as PropType, required: true }, /** * @description 应用上下文对象 */ @@ -25,23 +25,6 @@ export const {{ pascalCasePluginName }} = defineComponent({ * @description 部件适配器 */ provider: { type: Object as PropType }, - /** - * @description 部件激活模式,值为0:表示无激活,1:表示单击激活,2:表示双击激活 - */ - mdctrlActiveMode: { type: Number, default: undefined }, - /** - * @description 是否默认加载数据 - * @default true - */ - loadDefault: { type: Boolean, default: true }, - /** - * @description 是否是简单模式,即直接传入数据,不加载数据 - */ - isSimple: { type: Boolean, required: false }, - /** - * @description 简单模式下传入的数据 - */ - data: { type: Array, required: false }, }, setup() { const c = useControlController( diff --git a/packages/core/src/create-plugin/template/platform/dataview_render/.eslintrc.cjs b/packages/core/src/create-plugin/template/platform/dataview_render/.eslintrc.cjs new file mode 100644 index 0000000000000000000000000000000000000000..c6e5a1dd5b2fa946548b00254225469f2f15bee9 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/dataview_render/.eslintrc.cjs @@ -0,0 +1,52 @@ +module.exports = { + root: true, + env: { + browser: true, + es2021: true, + }, + extends: ['airbnb-base', 'prettier', 'plugin:@typescript-eslint/recommended'], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + plugins: ['prettier', '@typescript-eslint', 'unused-imports'], + rules: { + 'prettier/prettier': 'error', + 'arrow-body-style': 'off', + 'prefer-arrow-callback': 'off', + 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-new': [0], + 'no-continue': [0], + '@typescript-eslint/no-empty-interface': 'off', + 'no-use-before-define': [0], + 'no-restricted-syntax': [0], + 'no-empty-function': [0], + 'no-useless-constructor': [0], // 禁止空的构造函数 + 'no-param-reassign': [0], // 禁止修改传入函数的参数 + 'no-underscore-dangle': [0], // 禁止使用下划线开头的变量名 + 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], // 禁止使用 ++,-- + 'consistent-return': [0], // 函数可以有不同类型返回值 + 'class-methods-use-this': [0], // 方法内未使用此方法时,强制定义为静态方法 + 'import/prefer-default-export': [0], // 一个模块只能有默认导出,不可以有多个导出 + 'import/no-unresolved': [0], // 不允许未解决的模块 + 'import/extensions': [0], // 不允许导入文件时不带后缀 + 'unused-imports/no-unused-imports': 'error', + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], + '@typescript-eslint/no-inferrable-types': [0], + '@typescript-eslint/no-non-null-assertion': [0], + '@typescript-eslint/no-explicit-any': ['error'], + '@typescript-eslint/explicit-function-return-type': 'error', // 要求函数和类方法的显式返回类型 + '@typescript-eslint/explicit-module-boundary-types': 'error', // 要求导出函数和类的公共类方法的显式返回和参数类型 + 'import/no-extraneous-dependencies': [ + 0, + { + devDependencies: true, + peerDependencies: true, + // optionalDependencies: true, + // bundledDependencies: true + }, + ], + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/dataview_render/CHANGELOG.md b/packages/core/src/create-plugin/template/platform/dataview_render/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..8ac8e7f05d173977a1ad060d18e7f0b6a5f23cf5 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/dataview_render/CHANGELOG.md @@ -0,0 +1,3 @@ +# 版本变更日志 + +添加变更日志 \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/dataview_render/README.md b/packages/core/src/create-plugin/template/platform/dataview_render/README.md new file mode 100644 index 0000000000000000000000000000000000000000..d39e1903fce5a2e5aef5721b0b7b2a1bb55b5e1f --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/dataview_render/README.md @@ -0,0 +1,71 @@ +# 数据视图插件 + +数据视图插件可自定义数据视图内容的绘制,当标准逻辑无法满足数据视图绘制要求时,可以通过数据视图插件来实现。modeling建模平台创建数据视图插件可参见 [插件开发](https://open.ibizlab.cn/apphub/zh/guide/plugin-dev.html) + +## 插件结构 + +``` +|─ ─ {{pluginName}} 数据视图插件顶层目录 + |─ ─ src 数据视图插件源代码目录 +​ |─ ─ {{pluginName}}.controller.ts 数据视图插件控制器 +​ |─ ─ {{pluginName}}.provider.ts 数据视图插件适配器 +​ |─ ─ {{pluginName}}.scss 数据视图插件样式 +​ |─ ─ {{pluginName}}.tsx 数据视图插件组件 +​ |─ ─ index.ts 数据视图插件入口文件 +``` + +- 数据视图插件入口文件 + +数据视图插件入口文件会全局注册数据视图插件适配器和数据视图插件组件,供外部使用。 + +- 数据视图插件组件 + +数据视图插件组件使用tsx的书写方式,承载数据视图绘制的内容。 + +- 数据视图插件适配器 + +数据视图插件适配器主要通过component属性指定数据视图实际要绘制的组件,并且通过createController方法返回传递给数据视图的控制器。 + +- 数据视图插件控制器 + +数据视图插件控制器承载数据视图的逻辑控制。 + +## 本地开发 + +1. 安装依赖并link至全局 + +```sh +// 安装依赖 +pnpm i + +// link底包 +./scripts/link.sh + +// 启动 +pnpm dev + +// link到全局 +pnpm link --global +``` + +2. 主项目包中引用插件 + +```sh +// link插件 +pnpm link --global '{{pluginGroup}}/{{pluginName}}' +``` + +3. 主项目包中注册插件 + +```ts +import { App } from 'vue'; +import {{ pascalCasePluginName }} from '{{pluginGroup}}/{{pluginName}}' + +export default { + install(app: App) { + app.use({{ pascalCasePluginName }}); + // 设置本地开发需要忽略加载的插件,可填写正则或全匹配字符串。匹配插件在modeling建模平台配置的[运行时插件仓库配置]内容 + ibiz.plugin.setDevIgnore(/^{{pluginGroup}}\/{{pluginName}}/); + }, +}; +``` diff --git a/packages/core/src/create-plugin/template/platform/dataview_render/package.json b/packages/core/src/create-plugin/template/platform/dataview_render/package.json new file mode 100644 index 0000000000000000000000000000000000000000..526db31b8430b973184cd5e8a7416fd394369d62 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/dataview_render/package.json @@ -0,0 +1,106 @@ +{ + "name": "{{pluginGroup}}/{{pluginName}}", + "version": "0.0.1", + "description": "{{pluginDescription}}", + "author": "tony001", + "license": "MIT", + "type": "module", + "main": "dist/index.es.js", + "module": "dist/index.es.js", + "types": "dist/types/index.d.ts", + "system": "dist/index.legacy.js", + "styles": [ + "dist/style.css" + ], + "files": [ + "dist", + "public", + "CHANGELOG.md", + "README.md" + ], + "publishConfig": { + "registry": "https://registry.npmjs.org/" + }, + "scripts": { + "dev": "vite build --watch", + "build": "vue-tsc --noEmit && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "@floating-ui/dom": "^1.5.3", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "@qx-chitanda/vite-plugin-lib-legacy": "^4.1.1", + "@types/lodash-es": "^4.17.12", + "@types/ramda": "^0.29.6", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", + "@vitejs/plugin-vue": "^4.4.1", + "@vitejs/plugin-vue-jsx": "^3.0.2", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "eslint": "^8.53.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-prettier": "^5.0.1", + "eslint-plugin-unused-imports": "^3.0.0", + "eslint-plugin-vue": "^9.18.1", + "husky": "^8.0.3", + "lerna": "^8.0.0", + "lint-staged": "^15.1.0", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "postcss": "^8.4.31", + "prettier": "^3.1.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "rollup-plugin-visualizer": "^5.9.2", + "sass": "1.69.5", + "stylelint": "15.11.0", + "stylelint-config-prettier": "^9.0.5", + "stylelint-config-recess-order": "^4.3.0", + "stylelint-config-standard": "^34.0.0", + "stylelint-config-standard-scss": "^11.1.0", + "stylelint-scss": "5.3.1", + "terser": "^5.24.0", + "typescript": "5.2.2", + "vite": "^4.5.0", + "vite-plugin-dts": "^3.6.3", + "vite-plugin-eslint": "^1.8.1", + "vite-plugin-libcss": "^1.1.1", + "vue": "^3.3.8", + "vue-eslint-parser": "^9.3.2", + "vue-router": "^4.2.5", + "vue-tsc": "1.8.22", + "vuedraggable": "^4.1.0" + }, + "peerDependencies": { + "@floating-ui/dom": "^1.5.1", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "vue": "^3.3.8", + "vue-router": "^4.2.5", + "vuedraggable": "^4.1.0" + } +} diff --git a/packages/core/src/create-plugin/template/platform/dataview_render/scripts/link.sh b/packages/core/src/create-plugin/template/platform/dataview_render/scripts/link.sh new file mode 100755 index 0000000000000000000000000000000000000000..d4edc1556f72a02300c491cda3c13a7ff34795a7 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/dataview_render/scripts/link.sh @@ -0,0 +1,6 @@ +pnpm link --global "@ibiz-template/vue3-util" +pnpm link --global "@ibiz-template/model-helper" +pnpm link --global "@ibiz-template/runtime" +pnpm link --global "@ibiz-template/core" +pnpm link --global "@ibiz-template/theme" +pnpm link --global "@ibiz-template/vue3-components" diff --git a/packages/core/src/create-plugin/template/platform/dataview_render/src/index.ts b/packages/core/src/create-plugin/template/platform/dataview_render/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..72602e02bafb120d2f9b4418bd9b3e43f098b141 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/dataview_render/src/index.ts @@ -0,0 +1,16 @@ +import { App } from 'vue'; +import { registerControlProvider } from '@ibiz-template/runtime'; +import { {{ pascalCasePluginName }} } from './{{pluginName}}'; +import { {{ pascalCasePluginName }}Provider } from './{{pluginName}}.provider'; + +export default { + install(app: App) { + // 全局注册数据视图插件组件 + app.component({{ pascalCasePluginName }}.name!, {{ pascalCasePluginName }}); + // 全局注册数据视图插件适配器,DATAVIEW_RENDER是插件类型,{{pluginId}}是插件标识 + registerControlProvider( + 'DATAVIEW_RENDER_{{pluginId}}', + () => new {{ pascalCasePluginName }}Provider(), + ); + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/dataview_render/src/{{pluginName}}.controller.ts b/packages/core/src/create-plugin/template/platform/dataview_render/src/{{pluginName}}.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..676aa99351baa8ee031363f5d43a8ad0e29232c9 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/dataview_render/src/{{pluginName}}.controller.ts @@ -0,0 +1,3 @@ +import { DataViewControlController } from '@ibiz-template/runtime'; + +export class {{ pascalCasePluginName }}Controller extends DataViewControlController {} diff --git a/packages/core/src/create-plugin/template/platform/dataview_render/src/{{pluginName}}.provider.ts b/packages/core/src/create-plugin/template/platform/dataview_render/src/{{pluginName}}.provider.ts new file mode 100644 index 0000000000000000000000000000000000000000..9a32e3ffd8cf352373e44506e938059b9c46041a --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/dataview_render/src/{{pluginName}}.provider.ts @@ -0,0 +1,20 @@ +import { + CTX, + IControlController, + IControlProvider, +} from '@ibiz-template/runtime'; +import { IControl } from '@ibiz/model-core'; +import { {{ pascalCasePluginName }}Controller } from './{{pluginName}}.controller'; + +export class {{ pascalCasePluginName }}Provider implements IControlProvider { + component: string = 'IBiz{{ pascalCasePluginName }}'; + + createController( + model: IControl, + context: IContext, + params: IParams, + ctx: CTX, + ): IControlController { + return new {{ pascalCasePluginName }}Controller(model, context, params, ctx); + } +} diff --git a/packages/core/src/create-plugin/template/platform/dataview_render/src/{{pluginName}}.scss b/packages/core/src/create-plugin/template/platform/dataview_render/src/{{pluginName}}.scss new file mode 100644 index 0000000000000000000000000000000000000000..f494ab6cf7c220eae2d3b11bd32b7e3d96d2dc16 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/dataview_render/src/{{pluginName}}.scss @@ -0,0 +1,3 @@ +@include b({{pluginName}}){ + // 样式 +} \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/dataview_render/src/{{pluginName}}.tsx b/packages/core/src/create-plugin/template/platform/dataview_render/src/{{pluginName}}.tsx new file mode 100644 index 0000000000000000000000000000000000000000..d730f6df37595be2e60b2a100c587138b1be4bfe --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/dataview_render/src/{{pluginName}}.tsx @@ -0,0 +1,64 @@ +import { defineComponent, PropType } from 'vue'; +import { useControlController, useNamespace } from '@ibiz-template/vue3-util'; +import { IDEDataView } from '@ibiz/model-core'; +import { IControlProvider } from '@ibiz-template/runtime'; +import { {{ pascalCasePluginName }}Controller } from './{{pluginName}}.controller'; +import './{{pluginName}}.scss'; + +export const {{ pascalCasePluginName }} = defineComponent({ + name: 'IBiz{{ pascalCasePluginName }}', + props: { + /** + * @description 数据视图(卡片)模型数据 + */ + modelData: { type: Object as PropType, required: true }, + /** + * @description 应用上下文对象 + */ + context: { type: Object as PropType, required: true }, + /** + * @description 视图参数对象 + * @default {} + */ + params: { type: Object as PropType, default: () => ({}) }, + /** + * @description 部件适配器 + */ + provider: { type: Object as PropType }, + /** + * @description 部件行数据默认激活模式,值为0:不激活,值为1:单击激活,值为2:双击激活 + */ + mdctrlActiveMode: { type: Number, default: undefined }, + /** + * @description 是否单选 + */ + singleSelect: { type: Boolean, default: undefined }, + /** + * @description 是否是简单模式,即直接传入数据,不加载数据 + */ + isSimple: { type: Boolean, required: false }, + /** + * @description 简单模式下传入的数据 + */ + data: { type: Array, required: false }, + /** + * @description 是否默认加载数据 + * @default true + */ + loadDefault: { type: Boolean, default: true }, + }, + setup() { + const c = useControlController( + (...args) => new {{ pascalCasePluginName }}Controller(...args), + ); + const ns = useNamespace('{{pluginName}}'); + + return { + c, + ns, + }; + }, + render() { + return
插件示例
; + }, +}); diff --git a/packages/core/src/create-plugin/template/platform/dataview_render/tsconfig.json b/packages/core/src/create-plugin/template/platform/dataview_render/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..ba8f48be2a612227b3b2cd44668c26316fa3dd4b --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/dataview_render/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Node", + "strict": true, + "jsx": "preserve", + "jsxImportSource": "vue", + "sourceMap": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ESNext", "DOM"], + "skipLibCheck": true + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/packages/core/src/create-plugin/template/platform/dataview_render/tsconfig.node.json b/packages/core/src/create-plugin/template/platform/dataview_render/tsconfig.node.json new file mode 100644 index 0000000000000000000000000000000000000000..9d31e2aed93c876bc048cf2f863cb2a847c901e8 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/dataview_render/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/core/src/create-plugin/template/platform/dataview_render/vite.config.ts b/packages/core/src/create-plugin/template/platform/dataview_render/vite.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..fc3449a5a42babd06efbe73c42acd8989ffb91fc --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/dataview_render/vite.config.ts @@ -0,0 +1,57 @@ +import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import libLegacy from '@qx-chitanda/vite-plugin-lib-legacy'; +import dts from 'vite-plugin-dts'; +import libCss from 'vite-plugin-libcss'; +// https://vitejs.dev/config/ +export default defineConfig({ + build: { + lib: { + entry: './src/index.ts', + fileName: format => `index.${format}.js`, + }, + rollupOptions: { + external: [ + '@ibiz-template/core', + '@ibiz-template/model-helper', + '@ibiz-template/runtime', + '@ibiz-template/theme', + '@ibiz-template/vue3-util', + '@ibiz/dynamic-model-api', + '@floating-ui/dom', + 'async-validator', + 'axios', + 'dayjs', + 'element-plus', + 'lodash-es', + 'pluralize', + 'qs', + 'qx-util', + 'ramda', + 'vue', + 'vue-router', + 'vuedraggable', + ], + }, + }, + css: { + preprocessorOptions: { + scss: { + additionalData: '@import "@ibiz-template/theme/style/global.scss";', + }, + }, + }, + plugins: [ + // eslint({ + // include: 'src/**/*.{ts,tsx,js,jsx}', + // }), + vue(), + vueJsx(), + libLegacy(), + libCss(), + dts({ + outDir: 'dist/types', + }), + ], +}); diff --git a/packages/core/src/create-plugin/template/platform/editform_render/.eslintrc.cjs b/packages/core/src/create-plugin/template/platform/editform_render/.eslintrc.cjs new file mode 100644 index 0000000000000000000000000000000000000000..c6e5a1dd5b2fa946548b00254225469f2f15bee9 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editform_render/.eslintrc.cjs @@ -0,0 +1,52 @@ +module.exports = { + root: true, + env: { + browser: true, + es2021: true, + }, + extends: ['airbnb-base', 'prettier', 'plugin:@typescript-eslint/recommended'], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + plugins: ['prettier', '@typescript-eslint', 'unused-imports'], + rules: { + 'prettier/prettier': 'error', + 'arrow-body-style': 'off', + 'prefer-arrow-callback': 'off', + 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-new': [0], + 'no-continue': [0], + '@typescript-eslint/no-empty-interface': 'off', + 'no-use-before-define': [0], + 'no-restricted-syntax': [0], + 'no-empty-function': [0], + 'no-useless-constructor': [0], // 禁止空的构造函数 + 'no-param-reassign': [0], // 禁止修改传入函数的参数 + 'no-underscore-dangle': [0], // 禁止使用下划线开头的变量名 + 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], // 禁止使用 ++,-- + 'consistent-return': [0], // 函数可以有不同类型返回值 + 'class-methods-use-this': [0], // 方法内未使用此方法时,强制定义为静态方法 + 'import/prefer-default-export': [0], // 一个模块只能有默认导出,不可以有多个导出 + 'import/no-unresolved': [0], // 不允许未解决的模块 + 'import/extensions': [0], // 不允许导入文件时不带后缀 + 'unused-imports/no-unused-imports': 'error', + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], + '@typescript-eslint/no-inferrable-types': [0], + '@typescript-eslint/no-non-null-assertion': [0], + '@typescript-eslint/no-explicit-any': ['error'], + '@typescript-eslint/explicit-function-return-type': 'error', // 要求函数和类方法的显式返回类型 + '@typescript-eslint/explicit-module-boundary-types': 'error', // 要求导出函数和类的公共类方法的显式返回和参数类型 + 'import/no-extraneous-dependencies': [ + 0, + { + devDependencies: true, + peerDependencies: true, + // optionalDependencies: true, + // bundledDependencies: true + }, + ], + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/editform_render/CHANGELOG.md b/packages/core/src/create-plugin/template/platform/editform_render/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..8ac8e7f05d173977a1ad060d18e7f0b6a5f23cf5 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editform_render/CHANGELOG.md @@ -0,0 +1,3 @@ +# 版本变更日志 + +添加变更日志 \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/editform_render/README.md b/packages/core/src/create-plugin/template/platform/editform_render/README.md new file mode 100644 index 0000000000000000000000000000000000000000..55d827c1458fd4385db40101dbc818db0bc85ccd --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editform_render/README.md @@ -0,0 +1,71 @@ +# 编辑表单插件 + +编辑表单插件可自定义编辑表单内容的绘制,当标准逻辑无法满足编辑表单绘制要求时,可以通过编辑表单插件来实现。modeling建模平台创建编辑表单插件可参见 [插件开发](https://open.ibizlab.cn/apphub/zh/guide/plugin-dev.html) + +## 插件结构 + +``` +|─ ─ {{pluginName}} 编辑表单插件顶层目录 + |─ ─ src 编辑表单插件源代码目录 +​ |─ ─ {{pluginName}}.controller.ts 编辑表单插件控制器 +​ |─ ─ {{pluginName}}.provider.ts 编辑表单插件适配器 +​ |─ ─ {{pluginName}}.scss 编辑表单插件样式 +​ |─ ─ {{pluginName}}.tsx 编辑表单插件组件 +​ |─ ─ index.ts 编辑表单插件入口文件 +``` + +- 编辑表单插件入口文件 + +编辑表单插件入口文件会全局注册编辑表单插件适配器和编辑表单插件组件,供外部使用。 + +- 编辑表单插件组件 + +编辑表单插件组件使用tsx的书写方式,承载编辑表单绘制的内容。 + +- 编辑表单插件适配器 + +编辑表单插件适配器主要通过component属性指定编辑表单实际要绘制的组件,并且通过createController方法返回传递给编辑表单的控制器。 + +- 编辑表单插件控制器 + +编辑表单插件控制器承载编辑表单的逻辑控制。 + +## 本地开发 + +1. 安装依赖并link至全局 + +```sh +// 安装依赖 +pnpm i + +// link底包 +./scripts/link.sh + +// 启动 +pnpm dev + +// link到全局 +pnpm link --global +``` + +2. 主项目包中引用插件 + +```sh +// link插件 +pnpm link --global '{{pluginGroup}}/{{pluginName}}' +``` + +3. 主项目包中注册插件 + +```ts +import { App } from 'vue'; +import {{ pascalCasePluginName }} from '{{pluginGroup}}/{{pluginName}}' + +export default { + install(app: App) { + app.use({{ pascalCasePluginName }}); + // 设置本地开发需要忽略加载的插件,可填写正则或全匹配字符串。匹配插件在modeling建模平台配置的[运行时插件仓库配置]内容 + ibiz.plugin.setDevIgnore(/^{{pluginGroup}}\/{{pluginName}}/); + }, +}; +``` \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/editform_render/package.json b/packages/core/src/create-plugin/template/platform/editform_render/package.json new file mode 100644 index 0000000000000000000000000000000000000000..526db31b8430b973184cd5e8a7416fd394369d62 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editform_render/package.json @@ -0,0 +1,106 @@ +{ + "name": "{{pluginGroup}}/{{pluginName}}", + "version": "0.0.1", + "description": "{{pluginDescription}}", + "author": "tony001", + "license": "MIT", + "type": "module", + "main": "dist/index.es.js", + "module": "dist/index.es.js", + "types": "dist/types/index.d.ts", + "system": "dist/index.legacy.js", + "styles": [ + "dist/style.css" + ], + "files": [ + "dist", + "public", + "CHANGELOG.md", + "README.md" + ], + "publishConfig": { + "registry": "https://registry.npmjs.org/" + }, + "scripts": { + "dev": "vite build --watch", + "build": "vue-tsc --noEmit && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "@floating-ui/dom": "^1.5.3", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "@qx-chitanda/vite-plugin-lib-legacy": "^4.1.1", + "@types/lodash-es": "^4.17.12", + "@types/ramda": "^0.29.6", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", + "@vitejs/plugin-vue": "^4.4.1", + "@vitejs/plugin-vue-jsx": "^3.0.2", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "eslint": "^8.53.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-prettier": "^5.0.1", + "eslint-plugin-unused-imports": "^3.0.0", + "eslint-plugin-vue": "^9.18.1", + "husky": "^8.0.3", + "lerna": "^8.0.0", + "lint-staged": "^15.1.0", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "postcss": "^8.4.31", + "prettier": "^3.1.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "rollup-plugin-visualizer": "^5.9.2", + "sass": "1.69.5", + "stylelint": "15.11.0", + "stylelint-config-prettier": "^9.0.5", + "stylelint-config-recess-order": "^4.3.0", + "stylelint-config-standard": "^34.0.0", + "stylelint-config-standard-scss": "^11.1.0", + "stylelint-scss": "5.3.1", + "terser": "^5.24.0", + "typescript": "5.2.2", + "vite": "^4.5.0", + "vite-plugin-dts": "^3.6.3", + "vite-plugin-eslint": "^1.8.1", + "vite-plugin-libcss": "^1.1.1", + "vue": "^3.3.8", + "vue-eslint-parser": "^9.3.2", + "vue-router": "^4.2.5", + "vue-tsc": "1.8.22", + "vuedraggable": "^4.1.0" + }, + "peerDependencies": { + "@floating-ui/dom": "^1.5.1", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "vue": "^3.3.8", + "vue-router": "^4.2.5", + "vuedraggable": "^4.1.0" + } +} diff --git a/packages/core/src/create-plugin/template/platform/editform_render/scripts/link.sh b/packages/core/src/create-plugin/template/platform/editform_render/scripts/link.sh new file mode 100755 index 0000000000000000000000000000000000000000..d4edc1556f72a02300c491cda3c13a7ff34795a7 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editform_render/scripts/link.sh @@ -0,0 +1,6 @@ +pnpm link --global "@ibiz-template/vue3-util" +pnpm link --global "@ibiz-template/model-helper" +pnpm link --global "@ibiz-template/runtime" +pnpm link --global "@ibiz-template/core" +pnpm link --global "@ibiz-template/theme" +pnpm link --global "@ibiz-template/vue3-components" diff --git a/packages/core/src/create-plugin/template/platform/editform_render/src/index.ts b/packages/core/src/create-plugin/template/platform/editform_render/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..0a3b05b101b2db0ea1d34d9f21832805ae443d02 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editform_render/src/index.ts @@ -0,0 +1,16 @@ +import { App } from 'vue'; +import { registerControlProvider } from '@ibiz-template/runtime'; +import { {{ pascalCasePluginName }} } from './{{pluginName}}'; +import { {{ pascalCasePluginName }}Provider } from './{{pluginName}}.provider'; + +export default { + install(app: App) { + // 全局注册编辑表单插件组件 + app.component({{ pascalCasePluginName }}.name!, {{ pascalCasePluginName }}); + // 全局注册编辑表单插件适配器,EDITFORM_RENDER是插件类型,{{pluginId}}是插件标识 + registerControlProvider( + 'EDITFORM_RENDER_{{pluginId}}', + () => new {{ pascalCasePluginName }}Provider(), + ); + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/editform_render/src/{{pluginName}}.controller.ts b/packages/core/src/create-plugin/template/platform/editform_render/src/{{pluginName}}.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..e97eb66925670b88aabd1eec09d210fcaef24820 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editform_render/src/{{pluginName}}.controller.ts @@ -0,0 +1,3 @@ +import { EditFormController } from '@ibiz-template/runtime'; + +export class {{ pascalCasePluginName }}Controller extends EditFormController {} diff --git a/packages/core/src/create-plugin/template/platform/editform_render/src/{{pluginName}}.provider.ts b/packages/core/src/create-plugin/template/platform/editform_render/src/{{pluginName}}.provider.ts new file mode 100644 index 0000000000000000000000000000000000000000..9a32e3ffd8cf352373e44506e938059b9c46041a --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editform_render/src/{{pluginName}}.provider.ts @@ -0,0 +1,20 @@ +import { + CTX, + IControlController, + IControlProvider, +} from '@ibiz-template/runtime'; +import { IControl } from '@ibiz/model-core'; +import { {{ pascalCasePluginName }}Controller } from './{{pluginName}}.controller'; + +export class {{ pascalCasePluginName }}Provider implements IControlProvider { + component: string = 'IBiz{{ pascalCasePluginName }}'; + + createController( + model: IControl, + context: IContext, + params: IParams, + ctx: CTX, + ): IControlController { + return new {{ pascalCasePluginName }}Controller(model, context, params, ctx); + } +} diff --git a/packages/core/src/create-plugin/template/platform/editform_render/src/{{pluginName}}.scss b/packages/core/src/create-plugin/template/platform/editform_render/src/{{pluginName}}.scss new file mode 100644 index 0000000000000000000000000000000000000000..f494ab6cf7c220eae2d3b11bd32b7e3d96d2dc16 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editform_render/src/{{pluginName}}.scss @@ -0,0 +1,3 @@ +@include b({{pluginName}}){ + // 样式 +} \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/editform_render/src/{{pluginName}}.tsx b/packages/core/src/create-plugin/template/platform/editform_render/src/{{pluginName}}.tsx new file mode 100644 index 0000000000000000000000000000000000000000..31ab26708a271ad5edbad2f8120a293ee82d621a --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editform_render/src/{{pluginName}}.tsx @@ -0,0 +1,56 @@ +import { defineComponent, PropType } from 'vue'; +import { useControlController, useNamespace } from '@ibiz-template/vue3-util'; +import { IDEEditForm } from '@ibiz/model-core'; +import { IControlProvider } from '@ibiz-template/runtime'; +import { {{ pascalCasePluginName }}Controller } from './{{pluginName}}.controller'; +import './{{pluginName}}.scss'; + +export const {{ pascalCasePluginName }} = defineComponent({ + name: 'IBiz{{ pascalCasePluginName }}', + props: { + /** + * @description 表单模型数据 + */ + modelData: { type: Object as PropType, required: true }, + /** + * @description 应用上下文对象 + */ + context: { type: Object as PropType, required: true }, + /** + * @description 视图参数对象 + * @default {} + */ + params: { type: Object as PropType, default: () => ({}) }, + /** + * @description 部件适配器 + */ + provider: { type: Object as PropType }, + /** + * @description 是否是简单模式,即直接传入数据,不加载数据 + */ + isSimple: { type: Boolean, required: false }, + /** + * @description 简单模式下传入的数据 + */ + data: { type: Object as PropType, required: false }, + /** + * @description 是否默认加载数据 + * @default true + */ + loadDefault: { type: Boolean, default: true }, + }, + setup() { + const c = useControlController( + (...args) => new {{ pascalCasePluginName }}Controller(...args), + ); + const ns = useNamespace('{{pluginName}}'); + + return { + c, + ns, + }; + }, + render() { + return
插件示例
; + }, +}); diff --git a/packages/core/src/create-plugin/template/platform/editform_render/tsconfig.json b/packages/core/src/create-plugin/template/platform/editform_render/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..ba8f48be2a612227b3b2cd44668c26316fa3dd4b --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editform_render/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Node", + "strict": true, + "jsx": "preserve", + "jsxImportSource": "vue", + "sourceMap": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ESNext", "DOM"], + "skipLibCheck": true + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/packages/core/src/create-plugin/template/platform/editform_render/tsconfig.node.json b/packages/core/src/create-plugin/template/platform/editform_render/tsconfig.node.json new file mode 100644 index 0000000000000000000000000000000000000000..9d31e2aed93c876bc048cf2f863cb2a847c901e8 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editform_render/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/core/src/create-plugin/template/platform/editform_render/vite.config.ts b/packages/core/src/create-plugin/template/platform/editform_render/vite.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..fc3449a5a42babd06efbe73c42acd8989ffb91fc --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editform_render/vite.config.ts @@ -0,0 +1,57 @@ +import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import libLegacy from '@qx-chitanda/vite-plugin-lib-legacy'; +import dts from 'vite-plugin-dts'; +import libCss from 'vite-plugin-libcss'; +// https://vitejs.dev/config/ +export default defineConfig({ + build: { + lib: { + entry: './src/index.ts', + fileName: format => `index.${format}.js`, + }, + rollupOptions: { + external: [ + '@ibiz-template/core', + '@ibiz-template/model-helper', + '@ibiz-template/runtime', + '@ibiz-template/theme', + '@ibiz-template/vue3-util', + '@ibiz/dynamic-model-api', + '@floating-ui/dom', + 'async-validator', + 'axios', + 'dayjs', + 'element-plus', + 'lodash-es', + 'pluralize', + 'qs', + 'qx-util', + 'ramda', + 'vue', + 'vue-router', + 'vuedraggable', + ], + }, + }, + css: { + preprocessorOptions: { + scss: { + additionalData: '@import "@ibiz-template/theme/style/global.scss";', + }, + }, + }, + plugins: [ + // eslint({ + // include: 'src/**/*.{ts,tsx,js,jsx}', + // }), + vue(), + vueJsx(), + libLegacy(), + libCss(), + dts({ + outDir: 'dist/types', + }), + ], +}); diff --git a/packages/core/src/create-plugin/template/platform/editor_customstyle/.eslintrc.cjs b/packages/core/src/create-plugin/template/platform/editor_customstyle/.eslintrc.cjs new file mode 100644 index 0000000000000000000000000000000000000000..c6e5a1dd5b2fa946548b00254225469f2f15bee9 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editor_customstyle/.eslintrc.cjs @@ -0,0 +1,52 @@ +module.exports = { + root: true, + env: { + browser: true, + es2021: true, + }, + extends: ['airbnb-base', 'prettier', 'plugin:@typescript-eslint/recommended'], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + plugins: ['prettier', '@typescript-eslint', 'unused-imports'], + rules: { + 'prettier/prettier': 'error', + 'arrow-body-style': 'off', + 'prefer-arrow-callback': 'off', + 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-new': [0], + 'no-continue': [0], + '@typescript-eslint/no-empty-interface': 'off', + 'no-use-before-define': [0], + 'no-restricted-syntax': [0], + 'no-empty-function': [0], + 'no-useless-constructor': [0], // 禁止空的构造函数 + 'no-param-reassign': [0], // 禁止修改传入函数的参数 + 'no-underscore-dangle': [0], // 禁止使用下划线开头的变量名 + 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], // 禁止使用 ++,-- + 'consistent-return': [0], // 函数可以有不同类型返回值 + 'class-methods-use-this': [0], // 方法内未使用此方法时,强制定义为静态方法 + 'import/prefer-default-export': [0], // 一个模块只能有默认导出,不可以有多个导出 + 'import/no-unresolved': [0], // 不允许未解决的模块 + 'import/extensions': [0], // 不允许导入文件时不带后缀 + 'unused-imports/no-unused-imports': 'error', + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], + '@typescript-eslint/no-inferrable-types': [0], + '@typescript-eslint/no-non-null-assertion': [0], + '@typescript-eslint/no-explicit-any': ['error'], + '@typescript-eslint/explicit-function-return-type': 'error', // 要求函数和类方法的显式返回类型 + '@typescript-eslint/explicit-module-boundary-types': 'error', // 要求导出函数和类的公共类方法的显式返回和参数类型 + 'import/no-extraneous-dependencies': [ + 0, + { + devDependencies: true, + peerDependencies: true, + // optionalDependencies: true, + // bundledDependencies: true + }, + ], + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/editor_customstyle/CHANGELOG.md b/packages/core/src/create-plugin/template/platform/editor_customstyle/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..8ac8e7f05d173977a1ad060d18e7f0b6a5f23cf5 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editor_customstyle/CHANGELOG.md @@ -0,0 +1,3 @@ +# 版本变更日志 + +添加变更日志 \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/editor_customstyle/README.md b/packages/core/src/create-plugin/template/platform/editor_customstyle/README.md new file mode 100644 index 0000000000000000000000000000000000000000..7a7137477db701a01108972043f6fe83cf0773fb --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editor_customstyle/README.md @@ -0,0 +1,122 @@ +# 编辑器插件 + +编辑器插件可自定义编辑器内容的绘制,当标准逻辑无法满足编辑器绘制要求时,可以通过编辑器插件来实现。modeling建模平台创建编辑器插件可参见 [插件开发](https://open.ibizlab.cn/apphub/zh/guide/plugin-dev.html) + +## 插件结构 + +``` +|─ ─ {{pluginName}} 编辑器插件顶层目录 + |─ ─ src 编辑器插件源代码目录 +​ |─ ─ {{pluginName}}.controller.ts 编辑器插件控制器 +​ |─ ─ {{pluginName}}.provider.ts 编辑器插件适配器 +​ |─ ─ {{pluginName}}.scss 编辑器插件样式 +​ |─ ─ {{pluginName}}.tsx 编辑器插件组件 +​ |─ ─ index.ts 编辑器插件入口文件 +``` + +- 编辑器插件入口文件 + +编辑器插件入口文件会全局注册编辑器插件适配器和编辑器插件组件,供外部使用。 + +- 编辑器插件组件 + +编辑器插件组件使用tsx的书写方式,承载编辑器绘制的内容,可拷贝基础UI绘制,然后根据需求进行调整。其中,基础UI绘制可参考附录中UI呈现部分。 + +- 编辑器插件适配器 + +编辑器插件适配器主要通过formEditor属性和gridEditor属性指定编辑器在表单和表格中实际要绘制的组件,并且通过createController方法返回需传递给编辑器的控制器。 + +- 编辑器插件控制器 + +编辑器插件控制器承载编辑器的逻辑控制,可继承基础控制器,然后根据需求进行调整。其中,基础控制器可参考附录中控制器部分。 + +## 本地开发 + +1. 安装依赖并link至全局 + +```sh +// 安装依赖 +pnpm i + +// link底包 +./scripts/link.sh + +// 启动 +pnpm dev + +// link到全局 +pnpm link --global +``` + +2. 主项目包中引用插件 + +```sh +// link插件 +pnpm link --global '{{pluginGroup}}/{{pluginName}}' +``` + +3. 主项目包中注册插件 + +```ts +import { App } from 'vue'; +import {{ pascalCasePluginName }} from '{{pluginGroup}}/{{pluginName}}' + +export default { + install(app: App) { + app.use({{ pascalCasePluginName }}); + // 设置本地开发需要忽略加载的插件,可填写正则或全匹配字符串。匹配插件在modeling建模平台配置的[运行时插件仓库配置]内容 + ibiz.plugin.setDevIgnore(/^{{pluginGroup}}\/{{pluginName}}/); + }, +}; +``` + +## 附录 + +| 编辑器类型 | UI呈现 | 控制器 | +| :----------------------------: | :-------------------: | :-----------------------------: | +| 数组编辑器 | IBizArray | ArrayEditorController | +| 自动填充 | IBizAutoComplete | AutoCompleteEditorController | +| 自动填充(只能选择) | IBizAutoComplete | AutoCompleteEditorController | +| 自动填充(无按钮) | IBizAutoComplete | AutoCompleteEditorController | +| 自动填充(只能选择、无按钮) | IBizAutoComplete | AutoCompleteEditorController | +| 级联选择器 | IBizCascader | CascaderEditorController | +| 选项框 | IBizCheckbox | CheckBoxEditorController | +| 选项框列表 | IBizCheckboxList | CheckBoxListEditorController | +| 代码编辑框 | IBizCode | CodeEditorController | +| 颜色选择器 | IBizColorPicker | ColorPickerEditorController | +| 地址框(选择) | IBizMPicker | PickerEditorController | +| 地址框(支持选择、AC) | IBizMPicker | PickerEditorController | +| 数据选择 | IBizPicker | PickerEditorController | +| 数据选择(无AC) | IBizPicker | PickerEditorController | +| 数据选择(无AC、数据链接) | IBizPicker | PickerEditorController | +| 数据选择(下拉、数据链接) | IBizPicker | PickerEditorController | +| 数据选择(无按钮) | IBizPicker | PickerEditorController | +| 数据选择(下拉) | IBizPickerDropDown | PickerEditorController | +| 数据选择(嵌入选择视图) | IBizPickerEmbedView | PickerEditorController | +| 数据选择(数据链接) | IBizPickerLink | PickerEditorController | +| 数据链接 | IBizPickerLink | PickerEditorController | +| 数据选择(下拉视图) | IBizPickerSelectView | PickerEditorController | +| 数据选择(下拉视图、数据链接) | IBizPickerSelectView | PickerEditorController | +| 时间选择器 | IBizDatePicker | DatePickerEditorController | +| 时间范围选择器 | IBizDateRangePicker | DateRangeEditorController | +| 下拉列表框 | IBizDropdown | DropDownListEditorController | +| HTML编辑框 | IBizHtml | HtmlEditorController | +| 列表框(选择) | IBizListBox | ListBoxEditorController | +| Markdown编辑框 | IBizMarkDown | MarkDownEditorController | +| 数值范围编辑框 | IBizNumberRangePicker | NumberRangeEditorController | +| 单选项列表 | IBizRadio | RadioButtonListEditorController | +| 评分器 | IBizRate | RateEditorController | +| 直接内容 | IBizRaw | RawEditorController | +| 滑动输入条 | IBizSlider | SliderEditorController | +| 标签 | IBizSpan | SpanEditorController | +| 标签(数据链接) | IBizSpanLink | SpanEditorController | +| 步进器 | IBizStepper | StepperEditorController | +| 开关部件 | IBizSwitch | SwitchEditorController | +| IP地址输入框 | IBizInputIP | TextBoxEditorController | +| 数值框 | IBizInputNumber | TextBoxEditorController | +| 文本框 | IBizInput | TextBoxEditorController | +| 密码框 | IBizInput | TextBoxEditorController | +| 多行输入框 | IBizInput | TextBoxEditorController | +| 文件控件 | IBizFileUpload | UploadEditorController | +| 图片控件(单项、直接内容) | IBizImagePreview | UploadEditorController | +| 图片控件 | IBizImageUpload | UploadEditorController | diff --git a/packages/core/src/create-plugin/template/platform/editor_customstyle/package.json b/packages/core/src/create-plugin/template/platform/editor_customstyle/package.json new file mode 100644 index 0000000000000000000000000000000000000000..526db31b8430b973184cd5e8a7416fd394369d62 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editor_customstyle/package.json @@ -0,0 +1,106 @@ +{ + "name": "{{pluginGroup}}/{{pluginName}}", + "version": "0.0.1", + "description": "{{pluginDescription}}", + "author": "tony001", + "license": "MIT", + "type": "module", + "main": "dist/index.es.js", + "module": "dist/index.es.js", + "types": "dist/types/index.d.ts", + "system": "dist/index.legacy.js", + "styles": [ + "dist/style.css" + ], + "files": [ + "dist", + "public", + "CHANGELOG.md", + "README.md" + ], + "publishConfig": { + "registry": "https://registry.npmjs.org/" + }, + "scripts": { + "dev": "vite build --watch", + "build": "vue-tsc --noEmit && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "@floating-ui/dom": "^1.5.3", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "@qx-chitanda/vite-plugin-lib-legacy": "^4.1.1", + "@types/lodash-es": "^4.17.12", + "@types/ramda": "^0.29.6", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", + "@vitejs/plugin-vue": "^4.4.1", + "@vitejs/plugin-vue-jsx": "^3.0.2", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "eslint": "^8.53.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-prettier": "^5.0.1", + "eslint-plugin-unused-imports": "^3.0.0", + "eslint-plugin-vue": "^9.18.1", + "husky": "^8.0.3", + "lerna": "^8.0.0", + "lint-staged": "^15.1.0", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "postcss": "^8.4.31", + "prettier": "^3.1.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "rollup-plugin-visualizer": "^5.9.2", + "sass": "1.69.5", + "stylelint": "15.11.0", + "stylelint-config-prettier": "^9.0.5", + "stylelint-config-recess-order": "^4.3.0", + "stylelint-config-standard": "^34.0.0", + "stylelint-config-standard-scss": "^11.1.0", + "stylelint-scss": "5.3.1", + "terser": "^5.24.0", + "typescript": "5.2.2", + "vite": "^4.5.0", + "vite-plugin-dts": "^3.6.3", + "vite-plugin-eslint": "^1.8.1", + "vite-plugin-libcss": "^1.1.1", + "vue": "^3.3.8", + "vue-eslint-parser": "^9.3.2", + "vue-router": "^4.2.5", + "vue-tsc": "1.8.22", + "vuedraggable": "^4.1.0" + }, + "peerDependencies": { + "@floating-ui/dom": "^1.5.1", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "vue": "^3.3.8", + "vue-router": "^4.2.5", + "vuedraggable": "^4.1.0" + } +} diff --git a/packages/core/src/create-plugin/template/platform/editor_customstyle/scripts/link.sh b/packages/core/src/create-plugin/template/platform/editor_customstyle/scripts/link.sh new file mode 100755 index 0000000000000000000000000000000000000000..d4edc1556f72a02300c491cda3c13a7ff34795a7 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editor_customstyle/scripts/link.sh @@ -0,0 +1,6 @@ +pnpm link --global "@ibiz-template/vue3-util" +pnpm link --global "@ibiz-template/model-helper" +pnpm link --global "@ibiz-template/runtime" +pnpm link --global "@ibiz-template/core" +pnpm link --global "@ibiz-template/theme" +pnpm link --global "@ibiz-template/vue3-components" diff --git a/packages/core/src/create-plugin/template/platform/editor_customstyle/src/index.ts b/packages/core/src/create-plugin/template/platform/editor_customstyle/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..129581e711d88a8b0762fb517b2c0e8faaed6527 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editor_customstyle/src/index.ts @@ -0,0 +1,16 @@ +import { registerEditorProvider } from '@ibiz-template/runtime'; +import { App } from 'vue'; +import { {{ pascalCasePluginName }} } from './{{pluginName}}'; +import { {{ pascalCasePluginName }}Provider } from './{{pluginName}}.provider'; + +export default { + install(app: App) { + // 全局注册编辑器插件组件 + app.component({{ pascalCasePluginName }}.name!, {{ pascalCasePluginName }}); + // 全局注册编辑器插件适配器,EDITOR_CUSTOMSTYLE是插件类型,{{pluginId}}是插件标识 + registerEditorProvider( + 'EDITOR_CUSTOMSTYLE_{{pluginId}}', + () => new {{ pascalCasePluginName }}Provider(), + ); + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/editor_customstyle/src/{{pluginName}}.controller.ts b/packages/core/src/create-plugin/template/platform/editor_customstyle/src/{{pluginName}}.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..d217ff23926f1dcc735ce3ba803b7509d37975a0 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editor_customstyle/src/{{pluginName}}.controller.ts @@ -0,0 +1,4 @@ +import { EditorController } from '@ibiz-template/runtime'; +import { IEditor } from '@ibiz/model-core'; + +export class {{ pascalCasePluginName }}Controller extends EditorController {} diff --git a/packages/core/src/create-plugin/template/platform/editor_customstyle/src/{{pluginName}}.provider.ts b/packages/core/src/create-plugin/template/platform/editor_customstyle/src/{{pluginName}}.provider.ts new file mode 100644 index 0000000000000000000000000000000000000000..9ace7265e9090d37e13081215dd8ea23657fdc6f --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editor_customstyle/src/{{pluginName}}.provider.ts @@ -0,0 +1,21 @@ +import { + IEditorContainerController, + IEditorProvider, +} from '@ibiz-template/runtime'; +import { IEditor } from '@ibiz/model-core'; +import { {{ pascalCasePluginName }}Controller } from './{{pluginName}}.controller'; + +export class {{ pascalCasePluginName }}Provider implements IEditorProvider { + formEditor: string = 'IBiz{{ pascalCasePluginName }}'; + + gridEditor: string = 'IBiz{{ pascalCasePluginName }}'; + + async createController( + editorModel: IEditor, + parentController: IEditorContainerController, + ): Promise<{{ pascalCasePluginName }}Controller> { + const c = new {{ pascalCasePluginName }}Controller(editorModel, parentController); + await c.init(); + return c; + } +} diff --git a/packages/core/src/create-plugin/template/platform/editor_customstyle/src/{{pluginName}}.scss b/packages/core/src/create-plugin/template/platform/editor_customstyle/src/{{pluginName}}.scss new file mode 100644 index 0000000000000000000000000000000000000000..f494ab6cf7c220eae2d3b11bd32b7e3d96d2dc16 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editor_customstyle/src/{{pluginName}}.scss @@ -0,0 +1,3 @@ +@include b({{pluginName}}){ + // 样式 +} \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/editor_customstyle/src/{{pluginName}}.tsx b/packages/core/src/create-plugin/template/platform/editor_customstyle/src/{{pluginName}}.tsx new file mode 100644 index 0000000000000000000000000000000000000000..d2d8d7cb2353bda7d28ae139115c5bde28b7e249 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editor_customstyle/src/{{pluginName}}.tsx @@ -0,0 +1,36 @@ +import { defineComponent } from 'vue'; +import { + getEditorEmits, + getEditorProps, + useNamespace, +} from '@ibiz-template/vue3-util'; +import { {{ pascalCasePluginName }}Controller } from './{{pluginName}}.controller'; +import './{{pluginName}}.scss'; + +export const {{ pascalCasePluginName }} = defineComponent({ + name: 'IBiz{{ pascalCasePluginName }}', + props: getEditorProps<{{ pascalCasePluginName }}Controller>(), + emits: getEditorEmits(), + setup(props) { + const c = props.controller; + const ns = useNamespace('{{pluginName}}'); + + return { + c, + ns, + }; + }, + render() { + return ( +
+ 插件示例 +
+ ); + }, +}); diff --git a/packages/core/src/create-plugin/template/platform/editor_customstyle/tsconfig.json b/packages/core/src/create-plugin/template/platform/editor_customstyle/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..ba8f48be2a612227b3b2cd44668c26316fa3dd4b --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editor_customstyle/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Node", + "strict": true, + "jsx": "preserve", + "jsxImportSource": "vue", + "sourceMap": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ESNext", "DOM"], + "skipLibCheck": true + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/packages/core/src/create-plugin/template/platform/editor_customstyle/tsconfig.node.json b/packages/core/src/create-plugin/template/platform/editor_customstyle/tsconfig.node.json new file mode 100644 index 0000000000000000000000000000000000000000..9d31e2aed93c876bc048cf2f863cb2a847c901e8 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editor_customstyle/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/core/src/create-plugin/template/platform/editor_customstyle/vite.config.ts b/packages/core/src/create-plugin/template/platform/editor_customstyle/vite.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..fc3449a5a42babd06efbe73c42acd8989ffb91fc --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/editor_customstyle/vite.config.ts @@ -0,0 +1,57 @@ +import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import libLegacy from '@qx-chitanda/vite-plugin-lib-legacy'; +import dts from 'vite-plugin-dts'; +import libCss from 'vite-plugin-libcss'; +// https://vitejs.dev/config/ +export default defineConfig({ + build: { + lib: { + entry: './src/index.ts', + fileName: format => `index.${format}.js`, + }, + rollupOptions: { + external: [ + '@ibiz-template/core', + '@ibiz-template/model-helper', + '@ibiz-template/runtime', + '@ibiz-template/theme', + '@ibiz-template/vue3-util', + '@ibiz/dynamic-model-api', + '@floating-ui/dom', + 'async-validator', + 'axios', + 'dayjs', + 'element-plus', + 'lodash-es', + 'pluralize', + 'qs', + 'qx-util', + 'ramda', + 'vue', + 'vue-router', + 'vuedraggable', + ], + }, + }, + css: { + preprocessorOptions: { + scss: { + additionalData: '@import "@ibiz-template/theme/style/global.scss";', + }, + }, + }, + plugins: [ + // eslint({ + // include: 'src/**/*.{ts,tsx,js,jsx}', + // }), + vue(), + vueJsx(), + libLegacy(), + libCss(), + dts({ + outDir: 'dist/types', + }), + ], +}); diff --git a/packages/core/src/create-plugin/template/platform/form_usercontrol/.eslintrc.cjs b/packages/core/src/create-plugin/template/platform/form_usercontrol/.eslintrc.cjs new file mode 100644 index 0000000000000000000000000000000000000000..c6e5a1dd5b2fa946548b00254225469f2f15bee9 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/form_usercontrol/.eslintrc.cjs @@ -0,0 +1,52 @@ +module.exports = { + root: true, + env: { + browser: true, + es2021: true, + }, + extends: ['airbnb-base', 'prettier', 'plugin:@typescript-eslint/recommended'], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + plugins: ['prettier', '@typescript-eslint', 'unused-imports'], + rules: { + 'prettier/prettier': 'error', + 'arrow-body-style': 'off', + 'prefer-arrow-callback': 'off', + 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-new': [0], + 'no-continue': [0], + '@typescript-eslint/no-empty-interface': 'off', + 'no-use-before-define': [0], + 'no-restricted-syntax': [0], + 'no-empty-function': [0], + 'no-useless-constructor': [0], // 禁止空的构造函数 + 'no-param-reassign': [0], // 禁止修改传入函数的参数 + 'no-underscore-dangle': [0], // 禁止使用下划线开头的变量名 + 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], // 禁止使用 ++,-- + 'consistent-return': [0], // 函数可以有不同类型返回值 + 'class-methods-use-this': [0], // 方法内未使用此方法时,强制定义为静态方法 + 'import/prefer-default-export': [0], // 一个模块只能有默认导出,不可以有多个导出 + 'import/no-unresolved': [0], // 不允许未解决的模块 + 'import/extensions': [0], // 不允许导入文件时不带后缀 + 'unused-imports/no-unused-imports': 'error', + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], + '@typescript-eslint/no-inferrable-types': [0], + '@typescript-eslint/no-non-null-assertion': [0], + '@typescript-eslint/no-explicit-any': ['error'], + '@typescript-eslint/explicit-function-return-type': 'error', // 要求函数和类方法的显式返回类型 + '@typescript-eslint/explicit-module-boundary-types': 'error', // 要求导出函数和类的公共类方法的显式返回和参数类型 + 'import/no-extraneous-dependencies': [ + 0, + { + devDependencies: true, + peerDependencies: true, + // optionalDependencies: true, + // bundledDependencies: true + }, + ], + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/form_usercontrol/CHANGELOG.md b/packages/core/src/create-plugin/template/platform/form_usercontrol/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..8ac8e7f05d173977a1ad060d18e7f0b6a5f23cf5 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/form_usercontrol/CHANGELOG.md @@ -0,0 +1,3 @@ +# 版本变更日志 + +添加变更日志 \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/form_usercontrol/README.md b/packages/core/src/create-plugin/template/platform/form_usercontrol/README.md new file mode 100644 index 0000000000000000000000000000000000000000..b735269efa4eb4df92b5153e83459a3b242c8ab4 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/form_usercontrol/README.md @@ -0,0 +1,86 @@ +# 表单成员插件 + +表单成员插件可自定义表单成员内容的绘制,当标准逻辑无法满足表单成员绘制要求时,可以通过表单成员插件来实现。modeling建模平台创建表单成员插件可参见 [插件开发](https://open.ibizlab.cn/apphub/zh/guide/plugin-dev.html) + +## 插件结构 + +``` +|─ ─ {{pluginName}} 表单成员插件顶层目录 + |─ ─ src 表单成员插件源代码目录 +​ |─ ─ {{pluginName}}.controller.ts 表单成员插件控制器 +​ |─ ─ {{pluginName}}.provider.ts 表单成员插件适配器 +​ |─ ─ {{pluginName}}.scss 表单成员插件样式 +​ |─ ─ {{pluginName}}.tsx 表单成员插件组件 +​ |─ ─ index.ts 表单成员插件入口文件 +``` + +- 表单成员插件入口文件 + +表单成员插件入口文件会全局注册表单成员插件适配器和表单成员插件组件,供外部使用。 + +- 表单成员插件组件 + +表单成员插件组件使用tsx的书写方式,承载表单成员绘制的内容,可拷贝基础UI绘制,然后根据需求进行调整。其中,基础UI绘制可参考附录中UI呈现部分。 + +- 表单成员插件适配器 + +表单成员插件适配器主要通过component属性指定表单成员实际要绘制的组件,并且通过createController方法返回需传递给表单成员的控制器。 + +- 表单成员插件控制器 + +表单成员插件控制器承载表单成员的逻辑控制,可继承基础控制器,然后根据需求进行调整。其中,基础控制器可参考附录中控制器部分。 + +## 本地开发 + +1. 安装依赖并link至全局 + +```sh +// 安装依赖 +pnpm i + +// link底包 +./scripts/link.sh + +// 启动 +pnpm dev + +// link到全局 +pnpm link --global +``` + +2. 主项目包中引用插件 + +```sh +// link插件 +pnpm link --global '{{pluginGroup}}/{{pluginName}}' +``` + +3. 主项目包中注册插件 + +```ts +import { App } from 'vue'; +import {{ pascalCasePluginName }} from '{{pluginGroup}}/{{pluginName}}' + +export default { + install(app: App) { + app.use({{ pascalCasePluginName }}); + // 设置本地开发需要忽略加载的插件,可填写正则或全匹配字符串。匹配插件在modeling建模平台配置的[运行时插件仓库配置]内容 + ibiz.plugin.setDevIgnore(/^{{pluginGroup}}\/{{pluginName}}/); + }, +}; +``` + +## 附录 + +| 表单成员类型 | UI呈现 | 控制器 | +| :------------: | :------------: | :----------------------: | +| 表单按钮 | FormButton | FormButtonController | +| 表单按钮组 | FormButtonList | FormButtonListController | +| 表单关系界面 | FormDRUIPart | FormDRUIPartController | +| 表单分组面板 | FormGroupPanel | FormGroupPanelController | +| 表单项 | FormItem | FormItemController | +| 表单多数据部件 | FormMDCtrl | FormMDCtrlController | +| 表单分页 | FormPageItem | FormPageController | +| 表单直接内容 | FormRawItem | FormRawItemController | +| 表单tab分页 | FormTabPage | FormTabPageController | +| 表单tab面板 | FormTabPanel | FormTabPanelController | diff --git a/packages/core/src/create-plugin/template/platform/form_usercontrol/package.json b/packages/core/src/create-plugin/template/platform/form_usercontrol/package.json new file mode 100644 index 0000000000000000000000000000000000000000..526db31b8430b973184cd5e8a7416fd394369d62 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/form_usercontrol/package.json @@ -0,0 +1,106 @@ +{ + "name": "{{pluginGroup}}/{{pluginName}}", + "version": "0.0.1", + "description": "{{pluginDescription}}", + "author": "tony001", + "license": "MIT", + "type": "module", + "main": "dist/index.es.js", + "module": "dist/index.es.js", + "types": "dist/types/index.d.ts", + "system": "dist/index.legacy.js", + "styles": [ + "dist/style.css" + ], + "files": [ + "dist", + "public", + "CHANGELOG.md", + "README.md" + ], + "publishConfig": { + "registry": "https://registry.npmjs.org/" + }, + "scripts": { + "dev": "vite build --watch", + "build": "vue-tsc --noEmit && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "@floating-ui/dom": "^1.5.3", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "@qx-chitanda/vite-plugin-lib-legacy": "^4.1.1", + "@types/lodash-es": "^4.17.12", + "@types/ramda": "^0.29.6", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", + "@vitejs/plugin-vue": "^4.4.1", + "@vitejs/plugin-vue-jsx": "^3.0.2", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "eslint": "^8.53.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-prettier": "^5.0.1", + "eslint-plugin-unused-imports": "^3.0.0", + "eslint-plugin-vue": "^9.18.1", + "husky": "^8.0.3", + "lerna": "^8.0.0", + "lint-staged": "^15.1.0", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "postcss": "^8.4.31", + "prettier": "^3.1.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "rollup-plugin-visualizer": "^5.9.2", + "sass": "1.69.5", + "stylelint": "15.11.0", + "stylelint-config-prettier": "^9.0.5", + "stylelint-config-recess-order": "^4.3.0", + "stylelint-config-standard": "^34.0.0", + "stylelint-config-standard-scss": "^11.1.0", + "stylelint-scss": "5.3.1", + "terser": "^5.24.0", + "typescript": "5.2.2", + "vite": "^4.5.0", + "vite-plugin-dts": "^3.6.3", + "vite-plugin-eslint": "^1.8.1", + "vite-plugin-libcss": "^1.1.1", + "vue": "^3.3.8", + "vue-eslint-parser": "^9.3.2", + "vue-router": "^4.2.5", + "vue-tsc": "1.8.22", + "vuedraggable": "^4.1.0" + }, + "peerDependencies": { + "@floating-ui/dom": "^1.5.1", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "vue": "^3.3.8", + "vue-router": "^4.2.5", + "vuedraggable": "^4.1.0" + } +} diff --git a/packages/core/src/create-plugin/template/platform/form_usercontrol/scripts/link.sh b/packages/core/src/create-plugin/template/platform/form_usercontrol/scripts/link.sh new file mode 100755 index 0000000000000000000000000000000000000000..d4edc1556f72a02300c491cda3c13a7ff34795a7 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/form_usercontrol/scripts/link.sh @@ -0,0 +1,6 @@ +pnpm link --global "@ibiz-template/vue3-util" +pnpm link --global "@ibiz-template/model-helper" +pnpm link --global "@ibiz-template/runtime" +pnpm link --global "@ibiz-template/core" +pnpm link --global "@ibiz-template/theme" +pnpm link --global "@ibiz-template/vue3-components" diff --git a/packages/core/src/create-plugin/template/platform/form_usercontrol/src/index.ts b/packages/core/src/create-plugin/template/platform/form_usercontrol/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..21fc1854939032c2821e508786d59722c8c7892d --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/form_usercontrol/src/index.ts @@ -0,0 +1,16 @@ +import { App } from 'vue'; +import { registerFormDetailProvider } from '@ibiz-template/runtime'; +import { {{ pascalCasePluginName }} } from './{{pluginName}}'; +import { {{ pascalCasePluginName }}Provider } from './{{pluginName}}.provider'; + +export default { + install(app: App) { + // 全局注册表单成员插件组件 + app.component({{ pascalCasePluginName }}.name!, {{ pascalCasePluginName }}); + // 全局注册表单成员插件适配器,FORM_USERCONTROL是插件类型,{{pluginId}}是插件标识 + registerFormDetailProvider( + 'FORM_USERCONTROL_{{pluginId}}', + () => new {{ pascalCasePluginName }}Provider(), + ); + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/form_usercontrol/src/{{pluginName}}.controller.ts b/packages/core/src/create-plugin/template/platform/form_usercontrol/src/{{pluginName}}.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..a0bb9a6f0219563f094dfa5e8537987b8622467f --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/form_usercontrol/src/{{pluginName}}.controller.ts @@ -0,0 +1,3 @@ +import { FormDetailController } from '@ibiz-template/runtime'; + +export class {{ pascalCasePluginName }}Controller extends FormDetailController {} diff --git a/packages/core/src/create-plugin/template/platform/form_usercontrol/src/{{pluginName}}.provider.ts b/packages/core/src/create-plugin/template/platform/form_usercontrol/src/{{pluginName}}.provider.ts new file mode 100644 index 0000000000000000000000000000000000000000..1490dd0d728bd9e5c4de7ba70661031149f5ae72 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/form_usercontrol/src/{{pluginName}}.provider.ts @@ -0,0 +1,21 @@ +import { + FormController, + IFormDetailContainerController, + IFormDetailProvider, +} from '@ibiz-template/runtime'; +import { IDEFormDetail } from '@ibiz/model-core'; +import { {{ pascalCasePluginName }}Controller } from './{{pluginName}}.controller'; + +export class {{ pascalCasePluginName }}Provider implements IFormDetailProvider { + component: string = 'IBiz{{ pascalCasePluginName }}'; + + async createController( + detailModel: IDEFormDetail, + form: FormController, + parent: IFormDetailContainerController | undefined, + ): Promise<{{ pascalCasePluginName }}Controller> { + const c = new {{ pascalCasePluginName }}Controller(detailModel, form, parent); + await c.init(); + return c; + } +} diff --git a/packages/core/src/create-plugin/template/platform/form_usercontrol/src/{{pluginName}}.scss b/packages/core/src/create-plugin/template/platform/form_usercontrol/src/{{pluginName}}.scss new file mode 100644 index 0000000000000000000000000000000000000000..f494ab6cf7c220eae2d3b11bd32b7e3d96d2dc16 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/form_usercontrol/src/{{pluginName}}.scss @@ -0,0 +1,3 @@ +@include b({{pluginName}}){ + // 样式 +} \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/form_usercontrol/src/{{pluginName}}.tsx b/packages/core/src/create-plugin/template/platform/form_usercontrol/src/{{pluginName}}.tsx new file mode 100644 index 0000000000000000000000000000000000000000..1f3e165a0fb0768adc152795c7e1364c2bfc0381 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/form_usercontrol/src/{{pluginName}}.tsx @@ -0,0 +1,27 @@ +import { defineComponent, PropType } from 'vue'; +import { useNamespace } from '@ibiz-template/vue3-util'; +import { IDEFormDetail } from '@ibiz/model-core'; +import { {{ pascalCasePluginName }}Controller } from './{{pluginName}}.controller'; +import './{{pluginName}}.scss'; + +export const {{ pascalCasePluginName }} = defineComponent({ + name: 'IBiz{{ pascalCasePluginName }}', + props: { + modelData: { + type: Object as PropType, + required: true, + }, + controller: { + type: {{ pascalCasePluginName }}Controller, + required: true, + }, + }, + setup() { + const ns = useNamespace('{{pluginName}}'); + + return { ns }; + }, + render() { + return
插件示例
; + }, +}); diff --git a/packages/core/src/create-plugin/template/platform/form_usercontrol/tsconfig.json b/packages/core/src/create-plugin/template/platform/form_usercontrol/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..ba8f48be2a612227b3b2cd44668c26316fa3dd4b --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/form_usercontrol/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Node", + "strict": true, + "jsx": "preserve", + "jsxImportSource": "vue", + "sourceMap": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ESNext", "DOM"], + "skipLibCheck": true + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/packages/core/src/create-plugin/template/platform/form_usercontrol/tsconfig.node.json b/packages/core/src/create-plugin/template/platform/form_usercontrol/tsconfig.node.json new file mode 100644 index 0000000000000000000000000000000000000000..9d31e2aed93c876bc048cf2f863cb2a847c901e8 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/form_usercontrol/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/core/src/create-plugin/template/platform/form_usercontrol/vite.config.ts b/packages/core/src/create-plugin/template/platform/form_usercontrol/vite.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..fc3449a5a42babd06efbe73c42acd8989ffb91fc --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/form_usercontrol/vite.config.ts @@ -0,0 +1,57 @@ +import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import libLegacy from '@qx-chitanda/vite-plugin-lib-legacy'; +import dts from 'vite-plugin-dts'; +import libCss from 'vite-plugin-libcss'; +// https://vitejs.dev/config/ +export default defineConfig({ + build: { + lib: { + entry: './src/index.ts', + fileName: format => `index.${format}.js`, + }, + rollupOptions: { + external: [ + '@ibiz-template/core', + '@ibiz-template/model-helper', + '@ibiz-template/runtime', + '@ibiz-template/theme', + '@ibiz-template/vue3-util', + '@ibiz/dynamic-model-api', + '@floating-ui/dom', + 'async-validator', + 'axios', + 'dayjs', + 'element-plus', + 'lodash-es', + 'pluralize', + 'qs', + 'qx-util', + 'ramda', + 'vue', + 'vue-router', + 'vuedraggable', + ], + }, + }, + css: { + preprocessorOptions: { + scss: { + additionalData: '@import "@ibiz-template/theme/style/global.scss";', + }, + }, + }, + plugins: [ + // eslint({ + // include: 'src/**/*.{ts,tsx,js,jsx}', + // }), + vue(), + vueJsx(), + libLegacy(), + libCss(), + dts({ + outDir: 'dist/types', + }), + ], +}); diff --git a/packages/core/src/create-plugin/template/platform/grid_colrender/.eslintrc.cjs b/packages/core/src/create-plugin/template/platform/grid_colrender/.eslintrc.cjs new file mode 100644 index 0000000000000000000000000000000000000000..c6e5a1dd5b2fa946548b00254225469f2f15bee9 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_colrender/.eslintrc.cjs @@ -0,0 +1,52 @@ +module.exports = { + root: true, + env: { + browser: true, + es2021: true, + }, + extends: ['airbnb-base', 'prettier', 'plugin:@typescript-eslint/recommended'], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + plugins: ['prettier', '@typescript-eslint', 'unused-imports'], + rules: { + 'prettier/prettier': 'error', + 'arrow-body-style': 'off', + 'prefer-arrow-callback': 'off', + 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-new': [0], + 'no-continue': [0], + '@typescript-eslint/no-empty-interface': 'off', + 'no-use-before-define': [0], + 'no-restricted-syntax': [0], + 'no-empty-function': [0], + 'no-useless-constructor': [0], // 禁止空的构造函数 + 'no-param-reassign': [0], // 禁止修改传入函数的参数 + 'no-underscore-dangle': [0], // 禁止使用下划线开头的变量名 + 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], // 禁止使用 ++,-- + 'consistent-return': [0], // 函数可以有不同类型返回值 + 'class-methods-use-this': [0], // 方法内未使用此方法时,强制定义为静态方法 + 'import/prefer-default-export': [0], // 一个模块只能有默认导出,不可以有多个导出 + 'import/no-unresolved': [0], // 不允许未解决的模块 + 'import/extensions': [0], // 不允许导入文件时不带后缀 + 'unused-imports/no-unused-imports': 'error', + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], + '@typescript-eslint/no-inferrable-types': [0], + '@typescript-eslint/no-non-null-assertion': [0], + '@typescript-eslint/no-explicit-any': ['error'], + '@typescript-eslint/explicit-function-return-type': 'error', // 要求函数和类方法的显式返回类型 + '@typescript-eslint/explicit-module-boundary-types': 'error', // 要求导出函数和类的公共类方法的显式返回和参数类型 + 'import/no-extraneous-dependencies': [ + 0, + { + devDependencies: true, + peerDependencies: true, + // optionalDependencies: true, + // bundledDependencies: true + }, + ], + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/grid_colrender/CHANGELOG.md b/packages/core/src/create-plugin/template/platform/grid_colrender/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..8ac8e7f05d173977a1ad060d18e7f0b6a5f23cf5 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_colrender/CHANGELOG.md @@ -0,0 +1,3 @@ +# 版本变更日志 + +添加变更日志 \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/grid_colrender/README.md b/packages/core/src/create-plugin/template/platform/grid_colrender/README.md new file mode 100644 index 0000000000000000000000000000000000000000..1fed5d273ce0124359addda1f82442a537d13648 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_colrender/README.md @@ -0,0 +1,80 @@ +# 表格列插件 + +表格列插件可自定义表格单元格内容的绘制,当标准逻辑无法满足表格单元格绘制要求时,可以通过表格列插件来实现。modeling建模平台创建表格列插件可参见 [插件开发](https://open.ibizlab.cn/apphub/zh/guide/plugin-dev.html) + +## 插件结构 + +``` +|─ ─ {{pluginName}} 表格列插件顶层目录 + |─ ─ src 表格列插件源代码目录 +​ |─ ─ {{pluginName}}.controller.ts 表格列插件控制器 +​ |─ ─ {{pluginName}}.provider.ts 表格列插件适配器 +​ |─ ─ {{pluginName}}.scss 表格列插件样式 +​ |─ ─ {{pluginName}}.tsx 表格列插件组件 +​ |─ ─ index.ts 表格列插件入口文件 +``` + +- 表格列插件入口文件 + +表格列插件入口文件会全局注册表格列插件适配器和表格列插件组件,供外部使用。 + +- 表格列插件组件 + +表格列插件组件使用tsx的书写方式,承载表格列绘制的内容,可拷贝基础UI绘制,然后根据需求进行调整。其中,基础UI绘制可参考附录中UI呈现部分。 + +- 表格列插件适配器 + +表格列插件适配器主要通过component属性指定表格列单元格实际要绘制的组件,并且通过createController方法返回需传递给表格列的控制器。 + +- 表格列插件控制器 + +表格列插件控制器承载表格列的逻辑控制,可继承基础控制器,然后根据需求进行调整。其中,基础控制器可参考附录中控制器部分。 + +## 本地开发 + +1. 安装依赖并link至全局 + +```sh +// 安装依赖 +pnpm i + +// link底包 +./scripts/link.sh + +// 启动 +pnpm dev + +// link到全局 +pnpm link --global +``` + +2. 主项目包中引用插件 + +```sh +// link插件 +pnpm link --global '{{pluginGroup}}/{{pluginName}}' +``` + +3. 主项目包中注册插件 + +```ts +import { App } from 'vue'; +import {{ pascalCasePluginName }} from '{{pluginGroup}}/{{pluginName}}' + +export default { + install(app: App) { + app.use({{ pascalCasePluginName }}); + // 设置本地开发需要忽略加载的插件,可填写正则或全匹配字符串。匹配插件在modeling建模平台配置的[运行时插件仓库配置]内容 + ibiz.plugin.setDevIgnore(/^{{pluginGroup}}\/{{pluginName}}/); + }, +}; +``` + +## 附录 + +| 表格列类型 | UI呈现 | 控制器 | +| :----------------: | :-----------------: | :---------------------------: | +| 属性列 | GridFieldColumn | GridFieldColumnController | +| 属性列(开启行编辑) | GridFieldEditColumn | GridFieldEditColumnController | +| 分组列 | GridGroupColumn | GridGroupColumnController | +| 操作列 | GridUAColumn | GridUAColumnController | diff --git a/packages/core/src/create-plugin/template/platform/grid_colrender/package.json b/packages/core/src/create-plugin/template/platform/grid_colrender/package.json new file mode 100644 index 0000000000000000000000000000000000000000..526db31b8430b973184cd5e8a7416fd394369d62 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_colrender/package.json @@ -0,0 +1,106 @@ +{ + "name": "{{pluginGroup}}/{{pluginName}}", + "version": "0.0.1", + "description": "{{pluginDescription}}", + "author": "tony001", + "license": "MIT", + "type": "module", + "main": "dist/index.es.js", + "module": "dist/index.es.js", + "types": "dist/types/index.d.ts", + "system": "dist/index.legacy.js", + "styles": [ + "dist/style.css" + ], + "files": [ + "dist", + "public", + "CHANGELOG.md", + "README.md" + ], + "publishConfig": { + "registry": "https://registry.npmjs.org/" + }, + "scripts": { + "dev": "vite build --watch", + "build": "vue-tsc --noEmit && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "@floating-ui/dom": "^1.5.3", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "@qx-chitanda/vite-plugin-lib-legacy": "^4.1.1", + "@types/lodash-es": "^4.17.12", + "@types/ramda": "^0.29.6", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", + "@vitejs/plugin-vue": "^4.4.1", + "@vitejs/plugin-vue-jsx": "^3.0.2", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "eslint": "^8.53.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-prettier": "^5.0.1", + "eslint-plugin-unused-imports": "^3.0.0", + "eslint-plugin-vue": "^9.18.1", + "husky": "^8.0.3", + "lerna": "^8.0.0", + "lint-staged": "^15.1.0", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "postcss": "^8.4.31", + "prettier": "^3.1.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "rollup-plugin-visualizer": "^5.9.2", + "sass": "1.69.5", + "stylelint": "15.11.0", + "stylelint-config-prettier": "^9.0.5", + "stylelint-config-recess-order": "^4.3.0", + "stylelint-config-standard": "^34.0.0", + "stylelint-config-standard-scss": "^11.1.0", + "stylelint-scss": "5.3.1", + "terser": "^5.24.0", + "typescript": "5.2.2", + "vite": "^4.5.0", + "vite-plugin-dts": "^3.6.3", + "vite-plugin-eslint": "^1.8.1", + "vite-plugin-libcss": "^1.1.1", + "vue": "^3.3.8", + "vue-eslint-parser": "^9.3.2", + "vue-router": "^4.2.5", + "vue-tsc": "1.8.22", + "vuedraggable": "^4.1.0" + }, + "peerDependencies": { + "@floating-ui/dom": "^1.5.1", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "vue": "^3.3.8", + "vue-router": "^4.2.5", + "vuedraggable": "^4.1.0" + } +} diff --git a/packages/core/src/create-plugin/template/platform/grid_colrender/scripts/link.sh b/packages/core/src/create-plugin/template/platform/grid_colrender/scripts/link.sh new file mode 100755 index 0000000000000000000000000000000000000000..d4edc1556f72a02300c491cda3c13a7ff34795a7 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_colrender/scripts/link.sh @@ -0,0 +1,6 @@ +pnpm link --global "@ibiz-template/vue3-util" +pnpm link --global "@ibiz-template/model-helper" +pnpm link --global "@ibiz-template/runtime" +pnpm link --global "@ibiz-template/core" +pnpm link --global "@ibiz-template/theme" +pnpm link --global "@ibiz-template/vue3-components" diff --git a/packages/core/src/create-plugin/template/platform/grid_colrender/src/index.ts b/packages/core/src/create-plugin/template/platform/grid_colrender/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..ce0252d64594d1d55a2ff359f7bd2d09c6cd5297 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_colrender/src/index.ts @@ -0,0 +1,16 @@ +import { App } from 'vue'; +import { registerGridColumnProvider } from '@ibiz-template/runtime'; +import { {{ pascalCasePluginName }} } from './{{pluginName}}'; +import { {{ pascalCasePluginName }}Provider } from './{{pluginName}}.provider'; + +export default { + install(app: App) { + // 全局注册表格列插件组件 + app.component({{ pascalCasePluginName }}.name!, {{ pascalCasePluginName }}); + // 全局注册表格列插件适配器,GRID_COLRENDER是插件类型,{{pluginId}}是插件标识 + registerGridColumnProvider( + 'GRID_COLRENDER_{{pluginId}}', + () => new {{ pascalCasePluginName }}Provider(), + ); + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/grid_colrender/src/{{pluginName}}.controller.ts b/packages/core/src/create-plugin/template/platform/grid_colrender/src/{{pluginName}}.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..9b7aa0f2a9cc078893359588f05beecf3fa66401 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_colrender/src/{{pluginName}}.controller.ts @@ -0,0 +1,4 @@ +import { GridColumnController } from '@ibiz-template/runtime'; +import { IDEGridColumn } from '@ibiz/model-core'; + +export class {{ pascalCasePluginName }}Controller extends GridColumnController {} diff --git a/packages/core/src/create-plugin/template/platform/grid_colrender/src/{{pluginName}}.provider.ts b/packages/core/src/create-plugin/template/platform/grid_colrender/src/{{pluginName}}.provider.ts new file mode 100644 index 0000000000000000000000000000000000000000..b84e1240bddfebd3f1a5b60c66c2db0d2df44154 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_colrender/src/{{pluginName}}.provider.ts @@ -0,0 +1,16 @@ +import { GridController, IGridColumnProvider } from '@ibiz-template/runtime'; +import { IDEGridColumn } from '@ibiz/model-core'; +import { {{ pascalCasePluginName }}Controller } from './{{pluginName}}.controller'; + +export class {{ pascalCasePluginName }}Provider implements IGridColumnProvider { + component: string = 'IBiz{{ pascalCasePluginName }}'; + + async createController( + columnModel: IDEGridColumn, + grid: GridController, + ): Promise<{{ pascalCasePluginName }}Controller> { + const c = new {{ pascalCasePluginName }}Controller(columnModel, grid); + await c.init(); + return c; + } +} diff --git a/packages/core/src/create-plugin/template/platform/grid_colrender/src/{{pluginName}}.scss b/packages/core/src/create-plugin/template/platform/grid_colrender/src/{{pluginName}}.scss new file mode 100644 index 0000000000000000000000000000000000000000..f527953f0053997aa9a90770b4202e2807a365e3 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_colrender/src/{{pluginName}}.scss @@ -0,0 +1,3 @@ +@include b({{pluginName}}) { + // 样式 +} \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/grid_colrender/src/{{pluginName}}.tsx b/packages/core/src/create-plugin/template/platform/grid_colrender/src/{{pluginName}}.tsx new file mode 100644 index 0000000000000000000000000000000000000000..345b053cfe0ed373bddba254b1a5ef2cba75ba55 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_colrender/src/{{pluginName}}.tsx @@ -0,0 +1,29 @@ +import { defineComponent } from 'vue'; +import { useNamespace } from '@ibiz-template/vue3-util'; +import { GridRowState } from '@ibiz-template/runtime'; +import { {{ pascalCasePluginName }}Controller } from './{{pluginName}}.controller'; +import './{{pluginName}}.scss'; + +export const {{ pascalCasePluginName }} = defineComponent({ + name: 'IBiz{{ pascalCasePluginName }}', + props: { + controller: { + type: {{ pascalCasePluginName }}Controller, + required: true, + }, + row: { + type: GridRowState, + required: true, + }, + }, + setup() { + const ns = useNamespace('{{pluginName}}'); + + return { + ns, + }; + }, + render() { + return
插件示例
; + }, +}); diff --git a/packages/core/src/create-plugin/template/platform/grid_colrender/tsconfig.json b/packages/core/src/create-plugin/template/platform/grid_colrender/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..ba8f48be2a612227b3b2cd44668c26316fa3dd4b --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_colrender/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Node", + "strict": true, + "jsx": "preserve", + "jsxImportSource": "vue", + "sourceMap": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ESNext", "DOM"], + "skipLibCheck": true + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/packages/core/src/create-plugin/template/platform/grid_colrender/tsconfig.node.json b/packages/core/src/create-plugin/template/platform/grid_colrender/tsconfig.node.json new file mode 100644 index 0000000000000000000000000000000000000000..9d31e2aed93c876bc048cf2f863cb2a847c901e8 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_colrender/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/core/src/create-plugin/template/platform/grid_colrender/vite.config.ts b/packages/core/src/create-plugin/template/platform/grid_colrender/vite.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..fc3449a5a42babd06efbe73c42acd8989ffb91fc --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_colrender/vite.config.ts @@ -0,0 +1,57 @@ +import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import libLegacy from '@qx-chitanda/vite-plugin-lib-legacy'; +import dts from 'vite-plugin-dts'; +import libCss from 'vite-plugin-libcss'; +// https://vitejs.dev/config/ +export default defineConfig({ + build: { + lib: { + entry: './src/index.ts', + fileName: format => `index.${format}.js`, + }, + rollupOptions: { + external: [ + '@ibiz-template/core', + '@ibiz-template/model-helper', + '@ibiz-template/runtime', + '@ibiz-template/theme', + '@ibiz-template/vue3-util', + '@ibiz/dynamic-model-api', + '@floating-ui/dom', + 'async-validator', + 'axios', + 'dayjs', + 'element-plus', + 'lodash-es', + 'pluralize', + 'qs', + 'qx-util', + 'ramda', + 'vue', + 'vue-router', + 'vuedraggable', + ], + }, + }, + css: { + preprocessorOptions: { + scss: { + additionalData: '@import "@ibiz-template/theme/style/global.scss";', + }, + }, + }, + plugins: [ + // eslint({ + // include: 'src/**/*.{ts,tsx,js,jsx}', + // }), + vue(), + vueJsx(), + libLegacy(), + libCss(), + dts({ + outDir: 'dist/types', + }), + ], +}); diff --git a/packages/core/src/create-plugin/template/platform/grid_render/.eslintrc.cjs b/packages/core/src/create-plugin/template/platform/grid_render/.eslintrc.cjs new file mode 100644 index 0000000000000000000000000000000000000000..c6e5a1dd5b2fa946548b00254225469f2f15bee9 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_render/.eslintrc.cjs @@ -0,0 +1,52 @@ +module.exports = { + root: true, + env: { + browser: true, + es2021: true, + }, + extends: ['airbnb-base', 'prettier', 'plugin:@typescript-eslint/recommended'], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + plugins: ['prettier', '@typescript-eslint', 'unused-imports'], + rules: { + 'prettier/prettier': 'error', + 'arrow-body-style': 'off', + 'prefer-arrow-callback': 'off', + 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-new': [0], + 'no-continue': [0], + '@typescript-eslint/no-empty-interface': 'off', + 'no-use-before-define': [0], + 'no-restricted-syntax': [0], + 'no-empty-function': [0], + 'no-useless-constructor': [0], // 禁止空的构造函数 + 'no-param-reassign': [0], // 禁止修改传入函数的参数 + 'no-underscore-dangle': [0], // 禁止使用下划线开头的变量名 + 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], // 禁止使用 ++,-- + 'consistent-return': [0], // 函数可以有不同类型返回值 + 'class-methods-use-this': [0], // 方法内未使用此方法时,强制定义为静态方法 + 'import/prefer-default-export': [0], // 一个模块只能有默认导出,不可以有多个导出 + 'import/no-unresolved': [0], // 不允许未解决的模块 + 'import/extensions': [0], // 不允许导入文件时不带后缀 + 'unused-imports/no-unused-imports': 'error', + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], + '@typescript-eslint/no-inferrable-types': [0], + '@typescript-eslint/no-non-null-assertion': [0], + '@typescript-eslint/no-explicit-any': ['error'], + '@typescript-eslint/explicit-function-return-type': 'error', // 要求函数和类方法的显式返回类型 + '@typescript-eslint/explicit-module-boundary-types': 'error', // 要求导出函数和类的公共类方法的显式返回和参数类型 + 'import/no-extraneous-dependencies': [ + 0, + { + devDependencies: true, + peerDependencies: true, + // optionalDependencies: true, + // bundledDependencies: true + }, + ], + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/grid_render/CHANGELOG.md b/packages/core/src/create-plugin/template/platform/grid_render/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..8ac8e7f05d173977a1ad060d18e7f0b6a5f23cf5 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_render/CHANGELOG.md @@ -0,0 +1,3 @@ +# 版本变更日志 + +添加变更日志 \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/grid_render/README.md b/packages/core/src/create-plugin/template/platform/grid_render/README.md new file mode 100644 index 0000000000000000000000000000000000000000..45ba3ef9ce061604e61cd45ff2d57dda616a1260 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_render/README.md @@ -0,0 +1,71 @@ +# 表格插件 + +表格插件可自定义表格内容的绘制,当标准逻辑无法满足表格绘制要求时,可以通过表格插件来实现。modeling建模平台创建表格插件可参见 [插件开发](https://open.ibizlab.cn/apphub/zh/guide/plugin-dev.html) + +## 插件结构 + +``` +|─ ─ {{pluginName}} 表格插件顶层目录 + |─ ─ src 表格插件源代码目录 +​ |─ ─ {{pluginName}}.controller.ts 表格插件控制器 +​ |─ ─ {{pluginName}}.provider.ts 表格插件适配器 +​ |─ ─ {{pluginName}}.scss 表格插件样式 +​ |─ ─ {{pluginName}}.tsx 表格插件组件 +​ |─ ─ index.ts 表格插件入口文件 +``` + +- 表格插件入口文件 + +表格插件入口文件会全局注册表格插件适配器和表格插件组件,供外部使用。 + +- 表格插件组件 + +表格插件组件使用tsx的书写方式,承载表格绘制的内容。 + +- 表格插件适配器 + +表格插件适配器主要通过component属性指定表格实际要绘制的组件,并且通过createController方法返回传递给表格的控制器。 + +- 表格插件控制器 + +表格插件控制器承载表格的逻辑控制。 + +## 本地开发 + +1. 安装依赖并link至全局 + +```sh +// 安装依赖 +pnpm i + +// link底包 +./scripts/link.sh + +// 启动 +pnpm dev + +// link到全局 +pnpm link --global +``` + +2. 主项目包中引用插件 + +```sh +// link插件 +pnpm link --global '{{pluginGroup}}/{{pluginName}}' +``` + +3. 主项目包中注册插件 + +```ts +import { App } from 'vue'; +import {{ pascalCasePluginName }} from '{{pluginGroup}}/{{pluginName}}' + +export default { + install(app: App) { + app.use({{ pascalCasePluginName }}); + // 设置本地开发需要忽略加载的插件,可填写正则或全匹配字符串。匹配插件在modeling建模平台配置的[运行时插件仓库配置]内容 + ibiz.plugin.setDevIgnore(/^{{pluginGroup}}\/{{pluginName}}/); + }, +}; +``` \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/grid_render/package.json b/packages/core/src/create-plugin/template/platform/grid_render/package.json new file mode 100644 index 0000000000000000000000000000000000000000..526db31b8430b973184cd5e8a7416fd394369d62 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_render/package.json @@ -0,0 +1,106 @@ +{ + "name": "{{pluginGroup}}/{{pluginName}}", + "version": "0.0.1", + "description": "{{pluginDescription}}", + "author": "tony001", + "license": "MIT", + "type": "module", + "main": "dist/index.es.js", + "module": "dist/index.es.js", + "types": "dist/types/index.d.ts", + "system": "dist/index.legacy.js", + "styles": [ + "dist/style.css" + ], + "files": [ + "dist", + "public", + "CHANGELOG.md", + "README.md" + ], + "publishConfig": { + "registry": "https://registry.npmjs.org/" + }, + "scripts": { + "dev": "vite build --watch", + "build": "vue-tsc --noEmit && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "@floating-ui/dom": "^1.5.3", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "@qx-chitanda/vite-plugin-lib-legacy": "^4.1.1", + "@types/lodash-es": "^4.17.12", + "@types/ramda": "^0.29.6", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", + "@vitejs/plugin-vue": "^4.4.1", + "@vitejs/plugin-vue-jsx": "^3.0.2", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "eslint": "^8.53.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-prettier": "^5.0.1", + "eslint-plugin-unused-imports": "^3.0.0", + "eslint-plugin-vue": "^9.18.1", + "husky": "^8.0.3", + "lerna": "^8.0.0", + "lint-staged": "^15.1.0", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "postcss": "^8.4.31", + "prettier": "^3.1.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "rollup-plugin-visualizer": "^5.9.2", + "sass": "1.69.5", + "stylelint": "15.11.0", + "stylelint-config-prettier": "^9.0.5", + "stylelint-config-recess-order": "^4.3.0", + "stylelint-config-standard": "^34.0.0", + "stylelint-config-standard-scss": "^11.1.0", + "stylelint-scss": "5.3.1", + "terser": "^5.24.0", + "typescript": "5.2.2", + "vite": "^4.5.0", + "vite-plugin-dts": "^3.6.3", + "vite-plugin-eslint": "^1.8.1", + "vite-plugin-libcss": "^1.1.1", + "vue": "^3.3.8", + "vue-eslint-parser": "^9.3.2", + "vue-router": "^4.2.5", + "vue-tsc": "1.8.22", + "vuedraggable": "^4.1.0" + }, + "peerDependencies": { + "@floating-ui/dom": "^1.5.1", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "vue": "^3.3.8", + "vue-router": "^4.2.5", + "vuedraggable": "^4.1.0" + } +} diff --git a/packages/core/src/create-plugin/template/platform/grid_render/scripts/link.sh b/packages/core/src/create-plugin/template/platform/grid_render/scripts/link.sh new file mode 100755 index 0000000000000000000000000000000000000000..d4edc1556f72a02300c491cda3c13a7ff34795a7 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_render/scripts/link.sh @@ -0,0 +1,6 @@ +pnpm link --global "@ibiz-template/vue3-util" +pnpm link --global "@ibiz-template/model-helper" +pnpm link --global "@ibiz-template/runtime" +pnpm link --global "@ibiz-template/core" +pnpm link --global "@ibiz-template/theme" +pnpm link --global "@ibiz-template/vue3-components" diff --git a/packages/core/src/create-plugin/template/platform/grid_render/src/index.ts b/packages/core/src/create-plugin/template/platform/grid_render/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..6fae65c52a302d1f03a98b2165f8316df09cdae3 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_render/src/index.ts @@ -0,0 +1,16 @@ +import { App } from 'vue'; +import { registerControlProvider } from '@ibiz-template/runtime'; +import { {{ pascalCasePluginName }} } from './{{pluginName}}'; +import { {{ pascalCasePluginName }}Provider } from './{{pluginName}}.provider'; + +export default { + install(app: App) { + // 全局注册表格插件组件 + app.component({{ pascalCasePluginName }}.name!, {{ pascalCasePluginName }}); + // 全局注册表格插件适配器,GRID_RENDER是插件类型,{{pluginId}}是插件标识 + registerControlProvider( + 'GRID_RENDER_{{pluginId}}', + () => new {{ pascalCasePluginName }}Provider(), + ); + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/grid_render/src/{{pluginName}}.controller.ts b/packages/core/src/create-plugin/template/platform/grid_render/src/{{pluginName}}.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..d25ada651566b6daf6f1d8dbaa9eb494459cd5a8 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_render/src/{{pluginName}}.controller.ts @@ -0,0 +1,3 @@ +import { GridController } from '@ibiz-template/runtime'; + +export class {{ pascalCasePluginName }}Controller extends GridController {} diff --git a/packages/core/src/create-plugin/template/platform/grid_render/src/{{pluginName}}.provider.ts b/packages/core/src/create-plugin/template/platform/grid_render/src/{{pluginName}}.provider.ts new file mode 100644 index 0000000000000000000000000000000000000000..9a32e3ffd8cf352373e44506e938059b9c46041a --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_render/src/{{pluginName}}.provider.ts @@ -0,0 +1,20 @@ +import { + CTX, + IControlController, + IControlProvider, +} from '@ibiz-template/runtime'; +import { IControl } from '@ibiz/model-core'; +import { {{ pascalCasePluginName }}Controller } from './{{pluginName}}.controller'; + +export class {{ pascalCasePluginName }}Provider implements IControlProvider { + component: string = 'IBiz{{ pascalCasePluginName }}'; + + createController( + model: IControl, + context: IContext, + params: IParams, + ctx: CTX, + ): IControlController { + return new {{ pascalCasePluginName }}Controller(model, context, params, ctx); + } +} diff --git a/packages/core/src/create-plugin/template/platform/grid_render/src/{{pluginName}}.scss b/packages/core/src/create-plugin/template/platform/grid_render/src/{{pluginName}}.scss new file mode 100644 index 0000000000000000000000000000000000000000..f494ab6cf7c220eae2d3b11bd32b7e3d96d2dc16 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_render/src/{{pluginName}}.scss @@ -0,0 +1,3 @@ +@include b({{pluginName}}){ + // 样式 +} \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/grid_render/src/{{pluginName}}.tsx b/packages/core/src/create-plugin/template/platform/grid_render/src/{{pluginName}}.tsx new file mode 100644 index 0000000000000000000000000000000000000000..cfc5f6078a22eea165b3374fe84757a0e0c71178 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_render/src/{{pluginName}}.tsx @@ -0,0 +1,68 @@ +import { defineComponent, PropType } from 'vue'; +import { useControlController, useNamespace } from '@ibiz-template/vue3-util'; +import { IDEGrid } from '@ibiz/model-core'; +import { IControlProvider } from '@ibiz-template/runtime'; +import { {{ pascalCasePluginName }}Controller } from './{{pluginName}}.controller'; +import './{{pluginName}}.scss'; + +export const {{ pascalCasePluginName }} = defineComponent({ + name: 'IBiz{{ pascalCasePluginName }}', + props: { + /** + * @description 表格模型数据 + */ + modelData: { type: Object as PropType, required: true }, + /** + * @description 应用上下文对象 + */ + context: { type: Object as PropType, required: true }, + /** + * @description 视图参数对象 + * @default {} + */ + params: { type: Object as PropType, default: () => ({}) }, + /** + * @description 部件适配器 + */ + provider: { type: Object as PropType }, + /** + * @description 部件行数据默认激活模式,值为0:不激活,值为1:单击激活,值为2:双击激活 + */ + mdctrlActiveMode: { type: Number, default: undefined }, + /** + * @description 是否单选 + */ + singleSelect: { type: Boolean, default: undefined }, + /** + * @description 是否启用行编辑 + */ + rowEditOpen: { type: Boolean, default: undefined }, + /** + * @description 是否是简单模式,即直接传入数据,不加载数据 + */ + isSimple: { type: Boolean, required: false }, + /** + * @description 简单模式下传入的数据 + */ + data: { type: Array, required: false }, + /** + * @description 是否默认加载数据 + * @default true + */ + loadDefault: { type: Boolean, default: true }, + }, + setup() { + const c = useControlController( + (...args) => new {{ pascalCasePluginName }}Controller(...args), + ); + const ns = useNamespace('{{pluginName}}'); + + return { + c, + ns, + }; + }, + render() { + return
插件示例
; + }, +}); diff --git a/packages/core/src/create-plugin/template/platform/grid_render/tsconfig.json b/packages/core/src/create-plugin/template/platform/grid_render/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..ba8f48be2a612227b3b2cd44668c26316fa3dd4b --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_render/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Node", + "strict": true, + "jsx": "preserve", + "jsxImportSource": "vue", + "sourceMap": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ESNext", "DOM"], + "skipLibCheck": true + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/packages/core/src/create-plugin/template/platform/grid_render/tsconfig.node.json b/packages/core/src/create-plugin/template/platform/grid_render/tsconfig.node.json new file mode 100644 index 0000000000000000000000000000000000000000..9d31e2aed93c876bc048cf2f863cb2a847c901e8 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_render/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/core/src/create-plugin/template/platform/grid_render/vite.config.ts b/packages/core/src/create-plugin/template/platform/grid_render/vite.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..fc3449a5a42babd06efbe73c42acd8989ffb91fc --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/grid_render/vite.config.ts @@ -0,0 +1,57 @@ +import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import libLegacy from '@qx-chitanda/vite-plugin-lib-legacy'; +import dts from 'vite-plugin-dts'; +import libCss from 'vite-plugin-libcss'; +// https://vitejs.dev/config/ +export default defineConfig({ + build: { + lib: { + entry: './src/index.ts', + fileName: format => `index.${format}.js`, + }, + rollupOptions: { + external: [ + '@ibiz-template/core', + '@ibiz-template/model-helper', + '@ibiz-template/runtime', + '@ibiz-template/theme', + '@ibiz-template/vue3-util', + '@ibiz/dynamic-model-api', + '@floating-ui/dom', + 'async-validator', + 'axios', + 'dayjs', + 'element-plus', + 'lodash-es', + 'pluralize', + 'qs', + 'qx-util', + 'ramda', + 'vue', + 'vue-router', + 'vuedraggable', + ], + }, + }, + css: { + preprocessorOptions: { + scss: { + additionalData: '@import "@ibiz-template/theme/style/global.scss";', + }, + }, + }, + plugins: [ + // eslint({ + // include: 'src/**/*.{ts,tsx,js,jsx}', + // }), + vue(), + vueJsx(), + libLegacy(), + libCss(), + dts({ + outDir: 'dist/types', + }), + ], +}); diff --git a/packages/core/src/create-plugin/template/platform/list_render/.eslintrc.cjs b/packages/core/src/create-plugin/template/platform/list_render/.eslintrc.cjs new file mode 100644 index 0000000000000000000000000000000000000000..c6e5a1dd5b2fa946548b00254225469f2f15bee9 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/list_render/.eslintrc.cjs @@ -0,0 +1,52 @@ +module.exports = { + root: true, + env: { + browser: true, + es2021: true, + }, + extends: ['airbnb-base', 'prettier', 'plugin:@typescript-eslint/recommended'], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + plugins: ['prettier', '@typescript-eslint', 'unused-imports'], + rules: { + 'prettier/prettier': 'error', + 'arrow-body-style': 'off', + 'prefer-arrow-callback': 'off', + 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-new': [0], + 'no-continue': [0], + '@typescript-eslint/no-empty-interface': 'off', + 'no-use-before-define': [0], + 'no-restricted-syntax': [0], + 'no-empty-function': [0], + 'no-useless-constructor': [0], // 禁止空的构造函数 + 'no-param-reassign': [0], // 禁止修改传入函数的参数 + 'no-underscore-dangle': [0], // 禁止使用下划线开头的变量名 + 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], // 禁止使用 ++,-- + 'consistent-return': [0], // 函数可以有不同类型返回值 + 'class-methods-use-this': [0], // 方法内未使用此方法时,强制定义为静态方法 + 'import/prefer-default-export': [0], // 一个模块只能有默认导出,不可以有多个导出 + 'import/no-unresolved': [0], // 不允许未解决的模块 + 'import/extensions': [0], // 不允许导入文件时不带后缀 + 'unused-imports/no-unused-imports': 'error', + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], + '@typescript-eslint/no-inferrable-types': [0], + '@typescript-eslint/no-non-null-assertion': [0], + '@typescript-eslint/no-explicit-any': ['error'], + '@typescript-eslint/explicit-function-return-type': 'error', // 要求函数和类方法的显式返回类型 + '@typescript-eslint/explicit-module-boundary-types': 'error', // 要求导出函数和类的公共类方法的显式返回和参数类型 + 'import/no-extraneous-dependencies': [ + 0, + { + devDependencies: true, + peerDependencies: true, + // optionalDependencies: true, + // bundledDependencies: true + }, + ], + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/list_render/CHANGELOG.md b/packages/core/src/create-plugin/template/platform/list_render/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..8ac8e7f05d173977a1ad060d18e7f0b6a5f23cf5 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/list_render/CHANGELOG.md @@ -0,0 +1,3 @@ +# 版本变更日志 + +添加变更日志 \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/list_render/README.md b/packages/core/src/create-plugin/template/platform/list_render/README.md new file mode 100644 index 0000000000000000000000000000000000000000..402656ba153d07bda3c7ff369c60cde64d292127 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/list_render/README.md @@ -0,0 +1,71 @@ +# 列表插件 + +列表插件可自定义列表内容的绘制,当标准逻辑无法满足列表绘制要求时,可以通过列表插件来实现。modeling建模平台创建列表插件可参见 [插件开发](https://open.ibizlab.cn/apphub/zh/guide/plugin-dev.html) + +## 插件结构 + +``` +|─ ─ {{pluginName}} 列表插件顶层目录 + |─ ─ src 列表插件源代码目录 +​ |─ ─ {{pluginName}}.controller.ts 列表插件控制器 +​ |─ ─ {{pluginName}}.provider.ts 列表插件适配器 +​ |─ ─ {{pluginName}}.scss 列表插件样式 +​ |─ ─ {{pluginName}}.tsx 列表插件组件 +​ |─ ─ index.ts 列表插件入口文件 +``` + +- 列表插件入口文件 + +列表插件入口文件会全局注册列表插件适配器和列表插件组件,供外部使用。 + +- 列表插件组件 + +列表插件组件使用tsx的书写方式,承载列表绘制的内容。 + +- 列表插件适配器 + +列表插件适配器主要通过component属性指定列表实际要绘制的组件,并且通过createController方法返回传递给列表的控制器。 + +- 列表插件控制器 + +列表插件控制器承载列表的逻辑控制。 + +## 本地开发 + +1. 安装依赖并link至全局 + +```sh +// 安装依赖 +pnpm i + +// link底包 +./scripts/link.sh + +// 启动 +pnpm dev + +// link到全局 +pnpm link --global +``` + +2. 主项目包中引用插件 + +```sh +// link插件 +pnpm link --global '{{pluginGroup}}/{{pluginName}}' +``` + +3. 主项目包中注册插件 + +```ts +import { App } from 'vue'; +import {{ pascalCasePluginName }} from '{{pluginGroup}}/{{pluginName}}' + +export default { + install(app: App) { + app.use({{ pascalCasePluginName }}); + // 设置本地开发需要忽略加载的插件,可填写正则或全匹配字符串。匹配插件在modeling建模平台配置的[运行时插件仓库配置]内容 + ibiz.plugin.setDevIgnore(/^{{pluginGroup}}\/{{pluginName}}/); + }, +}; +``` diff --git a/packages/core/src/create-plugin/template/platform/list_render/package.json b/packages/core/src/create-plugin/template/platform/list_render/package.json new file mode 100644 index 0000000000000000000000000000000000000000..526db31b8430b973184cd5e8a7416fd394369d62 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/list_render/package.json @@ -0,0 +1,106 @@ +{ + "name": "{{pluginGroup}}/{{pluginName}}", + "version": "0.0.1", + "description": "{{pluginDescription}}", + "author": "tony001", + "license": "MIT", + "type": "module", + "main": "dist/index.es.js", + "module": "dist/index.es.js", + "types": "dist/types/index.d.ts", + "system": "dist/index.legacy.js", + "styles": [ + "dist/style.css" + ], + "files": [ + "dist", + "public", + "CHANGELOG.md", + "README.md" + ], + "publishConfig": { + "registry": "https://registry.npmjs.org/" + }, + "scripts": { + "dev": "vite build --watch", + "build": "vue-tsc --noEmit && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "@floating-ui/dom": "^1.5.3", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "@qx-chitanda/vite-plugin-lib-legacy": "^4.1.1", + "@types/lodash-es": "^4.17.12", + "@types/ramda": "^0.29.6", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", + "@vitejs/plugin-vue": "^4.4.1", + "@vitejs/plugin-vue-jsx": "^3.0.2", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "eslint": "^8.53.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-prettier": "^5.0.1", + "eslint-plugin-unused-imports": "^3.0.0", + "eslint-plugin-vue": "^9.18.1", + "husky": "^8.0.3", + "lerna": "^8.0.0", + "lint-staged": "^15.1.0", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "postcss": "^8.4.31", + "prettier": "^3.1.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "rollup-plugin-visualizer": "^5.9.2", + "sass": "1.69.5", + "stylelint": "15.11.0", + "stylelint-config-prettier": "^9.0.5", + "stylelint-config-recess-order": "^4.3.0", + "stylelint-config-standard": "^34.0.0", + "stylelint-config-standard-scss": "^11.1.0", + "stylelint-scss": "5.3.1", + "terser": "^5.24.0", + "typescript": "5.2.2", + "vite": "^4.5.0", + "vite-plugin-dts": "^3.6.3", + "vite-plugin-eslint": "^1.8.1", + "vite-plugin-libcss": "^1.1.1", + "vue": "^3.3.8", + "vue-eslint-parser": "^9.3.2", + "vue-router": "^4.2.5", + "vue-tsc": "1.8.22", + "vuedraggable": "^4.1.0" + }, + "peerDependencies": { + "@floating-ui/dom": "^1.5.1", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "vue": "^3.3.8", + "vue-router": "^4.2.5", + "vuedraggable": "^4.1.0" + } +} diff --git a/packages/core/src/create-plugin/template/platform/list_render/scripts/link.sh b/packages/core/src/create-plugin/template/platform/list_render/scripts/link.sh new file mode 100755 index 0000000000000000000000000000000000000000..d4edc1556f72a02300c491cda3c13a7ff34795a7 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/list_render/scripts/link.sh @@ -0,0 +1,6 @@ +pnpm link --global "@ibiz-template/vue3-util" +pnpm link --global "@ibiz-template/model-helper" +pnpm link --global "@ibiz-template/runtime" +pnpm link --global "@ibiz-template/core" +pnpm link --global "@ibiz-template/theme" +pnpm link --global "@ibiz-template/vue3-components" diff --git a/packages/core/src/create-plugin/template/platform/list_render/src/index.ts b/packages/core/src/create-plugin/template/platform/list_render/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..6d47cb33410f9647a9a98da6ef2b884a5e79d6b7 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/list_render/src/index.ts @@ -0,0 +1,16 @@ +import { App } from 'vue'; +import { registerControlProvider } from '@ibiz-template/runtime'; +import { {{ pascalCasePluginName }} } from './{{pluginName}}'; +import { {{ pascalCasePluginName }}Provider } from './{{pluginName}}.provider'; + +export default { + install(app: App) { + // 全局注册列表插件组件 + app.component({{ pascalCasePluginName }}.name!, {{ pascalCasePluginName }}); + // 全局注册列表插件适配器,LIST_RENDER是插件类型,{{pluginId}}是插件标识 + registerControlProvider( + 'LIST_RENDER_{{pluginId}}', + () => new {{ pascalCasePluginName }}Provider(), + ); + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/list_render/src/{{pluginName}}.controller.ts b/packages/core/src/create-plugin/template/platform/list_render/src/{{pluginName}}.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..6ce4bbd161fda997cad4820b2aaf8e9ff7c77759 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/list_render/src/{{pluginName}}.controller.ts @@ -0,0 +1,3 @@ +import { ListController } from '@ibiz-template/runtime'; + +export class {{ pascalCasePluginName }}Controller extends ListController {} diff --git a/packages/core/src/create-plugin/template/platform/list_render/src/{{pluginName}}.provider.ts b/packages/core/src/create-plugin/template/platform/list_render/src/{{pluginName}}.provider.ts new file mode 100644 index 0000000000000000000000000000000000000000..9a32e3ffd8cf352373e44506e938059b9c46041a --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/list_render/src/{{pluginName}}.provider.ts @@ -0,0 +1,20 @@ +import { + CTX, + IControlController, + IControlProvider, +} from '@ibiz-template/runtime'; +import { IControl } from '@ibiz/model-core'; +import { {{ pascalCasePluginName }}Controller } from './{{pluginName}}.controller'; + +export class {{ pascalCasePluginName }}Provider implements IControlProvider { + component: string = 'IBiz{{ pascalCasePluginName }}'; + + createController( + model: IControl, + context: IContext, + params: IParams, + ctx: CTX, + ): IControlController { + return new {{ pascalCasePluginName }}Controller(model, context, params, ctx); + } +} diff --git a/packages/core/src/create-plugin/template/platform/list_render/src/{{pluginName}}.scss b/packages/core/src/create-plugin/template/platform/list_render/src/{{pluginName}}.scss new file mode 100644 index 0000000000000000000000000000000000000000..f494ab6cf7c220eae2d3b11bd32b7e3d96d2dc16 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/list_render/src/{{pluginName}}.scss @@ -0,0 +1,3 @@ +@include b({{pluginName}}){ + // 样式 +} \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/list_render/src/{{pluginName}}.tsx b/packages/core/src/create-plugin/template/platform/list_render/src/{{pluginName}}.tsx new file mode 100644 index 0000000000000000000000000000000000000000..4f05a47f93ebae5ddaa138d7646b728b519fcbc4 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/list_render/src/{{pluginName}}.tsx @@ -0,0 +1,64 @@ +import { defineComponent, PropType } from 'vue'; +import { useControlController, useNamespace } from '@ibiz-template/vue3-util'; +import { IDEList } from '@ibiz/model-core'; +import { IControlProvider } from '@ibiz-template/runtime'; +import { {{ pascalCasePluginName }}Controller } from './{{pluginName}}.controller'; +import './{{pluginName}}.scss'; + +export const {{ pascalCasePluginName }} = defineComponent({ + name: 'IBiz{{ pascalCasePluginName }}', + props: { + /** + * @description 列表模型数据 + */ + modelData: { type: Object as PropType, required: true }, + /** + * @description 应用上下文对象 + */ + context: { type: Object as PropType, required: true }, + /** + * @description 视图参数对象 + * @default {} + */ + params: { type: Object as PropType, default: () => ({}) }, + /** + * @description 部件适配器 + */ + provider: { type: Object as PropType }, + /** + * @description 部件行数据默认激活模式,值为0:不激活,值为1:单击激活,值为2:双击激活 + */ + mdctrlActiveMode: { type: Number, default: undefined }, + /** + * @description 是否单选 + */ + singleSelect: { type: Boolean, default: undefined }, + /** + * @description 是否是简单模式,即直接传入数据,不加载数据 + */ + isSimple: { type: Boolean, required: false }, + /** + * @description 简单模式下传入的数据 + */ + data: { type: Array, required: false }, + /** + * @description 是否默认加载数据 + * @default true + */ + loadDefault: { type: Boolean, default: true }, + }, + setup() { + const c = useControlController( + (...args) => new {{ pascalCasePluginName }}Controller(...args), + ); + const ns = useNamespace('{{pluginName}}'); + + return { + c, + ns, + }; + }, + render() { + return
插件示例
; + }, +}); diff --git a/packages/core/src/create-plugin/template/platform/list_render/tsconfig.json b/packages/core/src/create-plugin/template/platform/list_render/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..ba8f48be2a612227b3b2cd44668c26316fa3dd4b --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/list_render/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Node", + "strict": true, + "jsx": "preserve", + "jsxImportSource": "vue", + "sourceMap": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ESNext", "DOM"], + "skipLibCheck": true + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/packages/core/src/create-plugin/template/platform/list_render/tsconfig.node.json b/packages/core/src/create-plugin/template/platform/list_render/tsconfig.node.json new file mode 100644 index 0000000000000000000000000000000000000000..9d31e2aed93c876bc048cf2f863cb2a847c901e8 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/list_render/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/core/src/create-plugin/template/platform/list_render/vite.config.ts b/packages/core/src/create-plugin/template/platform/list_render/vite.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..fc3449a5a42babd06efbe73c42acd8989ffb91fc --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/list_render/vite.config.ts @@ -0,0 +1,57 @@ +import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import libLegacy from '@qx-chitanda/vite-plugin-lib-legacy'; +import dts from 'vite-plugin-dts'; +import libCss from 'vite-plugin-libcss'; +// https://vitejs.dev/config/ +export default defineConfig({ + build: { + lib: { + entry: './src/index.ts', + fileName: format => `index.${format}.js`, + }, + rollupOptions: { + external: [ + '@ibiz-template/core', + '@ibiz-template/model-helper', + '@ibiz-template/runtime', + '@ibiz-template/theme', + '@ibiz-template/vue3-util', + '@ibiz/dynamic-model-api', + '@floating-ui/dom', + 'async-validator', + 'axios', + 'dayjs', + 'element-plus', + 'lodash-es', + 'pluralize', + 'qs', + 'qx-util', + 'ramda', + 'vue', + 'vue-router', + 'vuedraggable', + ], + }, + }, + css: { + preprocessorOptions: { + scss: { + additionalData: '@import "@ibiz-template/theme/style/global.scss";', + }, + }, + }, + plugins: [ + // eslint({ + // include: 'src/**/*.{ts,tsx,js,jsx}', + // }), + vue(), + vueJsx(), + libLegacy(), + libCss(), + dts({ + outDir: 'dist/types', + }), + ], +}); diff --git a/packages/core/src/create-plugin/template/platform/portlet_custom/.eslintrc.cjs b/packages/core/src/create-plugin/template/platform/portlet_custom/.eslintrc.cjs new file mode 100644 index 0000000000000000000000000000000000000000..c6e5a1dd5b2fa946548b00254225469f2f15bee9 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/portlet_custom/.eslintrc.cjs @@ -0,0 +1,52 @@ +module.exports = { + root: true, + env: { + browser: true, + es2021: true, + }, + extends: ['airbnb-base', 'prettier', 'plugin:@typescript-eslint/recommended'], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + plugins: ['prettier', '@typescript-eslint', 'unused-imports'], + rules: { + 'prettier/prettier': 'error', + 'arrow-body-style': 'off', + 'prefer-arrow-callback': 'off', + 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-new': [0], + 'no-continue': [0], + '@typescript-eslint/no-empty-interface': 'off', + 'no-use-before-define': [0], + 'no-restricted-syntax': [0], + 'no-empty-function': [0], + 'no-useless-constructor': [0], // 禁止空的构造函数 + 'no-param-reassign': [0], // 禁止修改传入函数的参数 + 'no-underscore-dangle': [0], // 禁止使用下划线开头的变量名 + 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], // 禁止使用 ++,-- + 'consistent-return': [0], // 函数可以有不同类型返回值 + 'class-methods-use-this': [0], // 方法内未使用此方法时,强制定义为静态方法 + 'import/prefer-default-export': [0], // 一个模块只能有默认导出,不可以有多个导出 + 'import/no-unresolved': [0], // 不允许未解决的模块 + 'import/extensions': [0], // 不允许导入文件时不带后缀 + 'unused-imports/no-unused-imports': 'error', + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], + '@typescript-eslint/no-inferrable-types': [0], + '@typescript-eslint/no-non-null-assertion': [0], + '@typescript-eslint/no-explicit-any': ['error'], + '@typescript-eslint/explicit-function-return-type': 'error', // 要求函数和类方法的显式返回类型 + '@typescript-eslint/explicit-module-boundary-types': 'error', // 要求导出函数和类的公共类方法的显式返回和参数类型 + 'import/no-extraneous-dependencies': [ + 0, + { + devDependencies: true, + peerDependencies: true, + // optionalDependencies: true, + // bundledDependencies: true + }, + ], + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/portlet_custom/CHANGELOG.md b/packages/core/src/create-plugin/template/platform/portlet_custom/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..8ac8e7f05d173977a1ad060d18e7f0b6a5f23cf5 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/portlet_custom/CHANGELOG.md @@ -0,0 +1,3 @@ +# 版本变更日志 + +添加变更日志 \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/portlet_custom/README.md b/packages/core/src/create-plugin/template/platform/portlet_custom/README.md new file mode 100644 index 0000000000000000000000000000000000000000..5d8b5b785c3ce9141d98015b7ec7e74d730bf9d1 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/portlet_custom/README.md @@ -0,0 +1,86 @@ +# 门户部件插件 + +门户部件插件可自定义门户部件内容的绘制,当标准逻辑无法满足门户部件绘制要求时,可以通过门户部件插件来实现。modeling建模平台创建门户部件插件可参见 [插件开发](https://open.ibizlab.cn/apphub/zh/guide/plugin-dev.html) + +## 插件结构 + +``` +|─ ─ {{pluginName}} 门户部件插件顶层目录 + |─ ─ src 门户部件插件源代码目录 +​ |─ ─ {{pluginName}}.controller.ts 门户部件插件控制器 +​ |─ ─ {{pluginName}}.provider.ts 门户部件插件适配器 +​ |─ ─ {{pluginName}}.scss 门户部件插件样式 +​ |─ ─ {{pluginName}}.tsx 门户部件插件组件 +​ |─ ─ index.ts 门户部件插件入口文件 +``` + +- 门户部件插件入口文件 + +门户部件插件入口文件会全局注册门户部件插件适配器和门户部件插件组件,供外部使用。 + +- 门户部件插件组件 + +门户部件插件组件使用tsx的书写方式,承载门户部件绘制的内容,可拷贝基础UI绘制,然后根据需求进行调整。其中,基础UI绘制可参考附录中UI呈现部分。 + +- 门户部件插件适配器 + +门户部件插件适配器主要通过component属性指定门户部件实际要绘制的组件,并且通过createController方法返回需传递给门户部件的控制器。 + +- 门户部件插件控制器 + +门户部件插件控制器承载门户部件的逻辑控制,可继承基础控制器,然后根据需求进行调整。其中,基础控制器可参考附录中控制器部分。 + +## 本地开发 + +1. 安装依赖并link至全局 + +```sh +// 安装依赖 +pnpm i + +// link底包 +./scripts/link.sh + +// 启动 +pnpm dev + +// link到全局 +pnpm link --global +``` + +2. 主项目包中引用插件 + +```sh +// link插件 +pnpm link --global '{{pluginGroup}}/{{pluginName}}' +``` + +3. 主项目包中注册插件 + +```ts +import { App } from 'vue'; +import {{ pascalCasePluginName }} from '{{pluginGroup}}/{{pluginName}}' + +export default { + install(app: App) { + app.use({{ pascalCasePluginName }}); + // 设置本地开发需要忽略加载的插件,可填写正则或全匹配字符串。匹配插件在modeling建模平台配置的[运行时插件仓库配置]内容 + ibiz.plugin.setDevIgnore(/^{{pluginGroup}}\/{{pluginName}}/); + }, +}; +``` + +## 附录 + +| 门户部件类型 | UI呈现 | 控制器 | +| :----------: | :--------------: | :------------------------: | +| 操作栏 | ActionBarPortlet | ActionBarPortletController | +| 实体图表 | ChartPortlet | ChartPortletController | +| 容器 | ContainerPortlet | ContainerPortletController | +| 过滤器 | FilterPortlet | FilterPortletController | +| 网页部件 | HtmlPortlet | HtmlPortletController | +| 实体列表 | ListPortlet | ListPortletController | +| 菜单栏 | MenuPortlet | MenuPortletController | +| 直接内容 | RawItemPortlet | RawItemPortletController | +| 报表 | ReportPortlet | ReportPortletController | +| 系统视图 | ViewPortlet | ViewPortletController | diff --git a/packages/core/src/create-plugin/template/platform/portlet_custom/package.json b/packages/core/src/create-plugin/template/platform/portlet_custom/package.json new file mode 100644 index 0000000000000000000000000000000000000000..526db31b8430b973184cd5e8a7416fd394369d62 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/portlet_custom/package.json @@ -0,0 +1,106 @@ +{ + "name": "{{pluginGroup}}/{{pluginName}}", + "version": "0.0.1", + "description": "{{pluginDescription}}", + "author": "tony001", + "license": "MIT", + "type": "module", + "main": "dist/index.es.js", + "module": "dist/index.es.js", + "types": "dist/types/index.d.ts", + "system": "dist/index.legacy.js", + "styles": [ + "dist/style.css" + ], + "files": [ + "dist", + "public", + "CHANGELOG.md", + "README.md" + ], + "publishConfig": { + "registry": "https://registry.npmjs.org/" + }, + "scripts": { + "dev": "vite build --watch", + "build": "vue-tsc --noEmit && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "@floating-ui/dom": "^1.5.3", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "@qx-chitanda/vite-plugin-lib-legacy": "^4.1.1", + "@types/lodash-es": "^4.17.12", + "@types/ramda": "^0.29.6", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", + "@vitejs/plugin-vue": "^4.4.1", + "@vitejs/plugin-vue-jsx": "^3.0.2", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "eslint": "^8.53.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-prettier": "^5.0.1", + "eslint-plugin-unused-imports": "^3.0.0", + "eslint-plugin-vue": "^9.18.1", + "husky": "^8.0.3", + "lerna": "^8.0.0", + "lint-staged": "^15.1.0", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "postcss": "^8.4.31", + "prettier": "^3.1.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "rollup-plugin-visualizer": "^5.9.2", + "sass": "1.69.5", + "stylelint": "15.11.0", + "stylelint-config-prettier": "^9.0.5", + "stylelint-config-recess-order": "^4.3.0", + "stylelint-config-standard": "^34.0.0", + "stylelint-config-standard-scss": "^11.1.0", + "stylelint-scss": "5.3.1", + "terser": "^5.24.0", + "typescript": "5.2.2", + "vite": "^4.5.0", + "vite-plugin-dts": "^3.6.3", + "vite-plugin-eslint": "^1.8.1", + "vite-plugin-libcss": "^1.1.1", + "vue": "^3.3.8", + "vue-eslint-parser": "^9.3.2", + "vue-router": "^4.2.5", + "vue-tsc": "1.8.22", + "vuedraggable": "^4.1.0" + }, + "peerDependencies": { + "@floating-ui/dom": "^1.5.1", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "vue": "^3.3.8", + "vue-router": "^4.2.5", + "vuedraggable": "^4.1.0" + } +} diff --git a/packages/core/src/create-plugin/template/platform/portlet_custom/scripts/link.sh b/packages/core/src/create-plugin/template/platform/portlet_custom/scripts/link.sh new file mode 100755 index 0000000000000000000000000000000000000000..d4edc1556f72a02300c491cda3c13a7ff34795a7 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/portlet_custom/scripts/link.sh @@ -0,0 +1,6 @@ +pnpm link --global "@ibiz-template/vue3-util" +pnpm link --global "@ibiz-template/model-helper" +pnpm link --global "@ibiz-template/runtime" +pnpm link --global "@ibiz-template/core" +pnpm link --global "@ibiz-template/theme" +pnpm link --global "@ibiz-template/vue3-components" diff --git a/packages/core/src/create-plugin/template/platform/portlet_custom/src/index.ts b/packages/core/src/create-plugin/template/platform/portlet_custom/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..e96a1861e21e5485da8afc426a2ee897c45a86ec --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/portlet_custom/src/index.ts @@ -0,0 +1,16 @@ +import { App } from 'vue'; +import { registerPortletProvider } from '@ibiz-template/runtime'; +import { {{ pascalCasePluginName }} } from './{{pluginName}}'; +import { {{ pascalCasePluginName }}Provider } from './{{pluginName}}.provider'; + +export default { + install(app: App) { + // 全局注册门户部件插件组件 + app.component({{ pascalCasePluginName }}.name!, {{ pascalCasePluginName }}); + // 全局注册门户部件插件适配器,PORTLET_CUSTOM是插件类型,{{pluginId}}是插件标识 + registerPortletProvider( + 'PORTLET_CUSTOM_{{pluginId}}', + () => new {{ pascalCasePluginName }}Provider(), + ); + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/portlet_custom/src/{{pluginName}}.controller.ts b/packages/core/src/create-plugin/template/platform/portlet_custom/src/{{pluginName}}.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..1b37ea8c7f7032fc003d3a5dc4622a1174359508 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/portlet_custom/src/{{pluginName}}.controller.ts @@ -0,0 +1,4 @@ +import { PortletPartController } from '@ibiz-template/runtime'; +import { IDBPortletPart } from '@ibiz/model-core'; + +export class {{ pascalCasePluginName }}Controller extends PortletPartController {} diff --git a/packages/core/src/create-plugin/template/platform/portlet_custom/src/{{pluginName}}.provider.ts b/packages/core/src/create-plugin/template/platform/portlet_custom/src/{{pluginName}}.provider.ts new file mode 100644 index 0000000000000000000000000000000000000000..7bbfdf469f2d4a50c12bb50e57956c4089787eff --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/portlet_custom/src/{{pluginName}}.provider.ts @@ -0,0 +1,21 @@ +import { + IDashboardController, + IPortletContainerController, + IPortletProvider, +} from '@ibiz-template/runtime'; +import { IDBPortletPart } from '@ibiz/model-core'; +import { {{ pascalCasePluginName }}Controller } from './{{pluginName}}.controller'; + +export class {{ pascalCasePluginName }}Provider implements IPortletProvider { + component: string = 'IBiz{{ pascalCasePluginName }}'; + + async createController( + portletModel: IDBPortletPart, + dashboard: IDashboardController, + parent?: IPortletContainerController, + ): Promise<{{ pascalCasePluginName }}Controller> { + const c = new {{ pascalCasePluginName }}Controller(portletModel, dashboard, parent); + await c.init(); + return c; + } +} diff --git a/packages/core/src/create-plugin/template/platform/portlet_custom/src/{{pluginName}}.scss b/packages/core/src/create-plugin/template/platform/portlet_custom/src/{{pluginName}}.scss new file mode 100644 index 0000000000000000000000000000000000000000..f494ab6cf7c220eae2d3b11bd32b7e3d96d2dc16 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/portlet_custom/src/{{pluginName}}.scss @@ -0,0 +1,3 @@ +@include b({{pluginName}}){ + // 样式 +} \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/portlet_custom/src/{{pluginName}}.tsx b/packages/core/src/create-plugin/template/platform/portlet_custom/src/{{pluginName}}.tsx new file mode 100644 index 0000000000000000000000000000000000000000..6fb04aa671871ababe2e39562918a2725e5cbce1 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/portlet_custom/src/{{pluginName}}.tsx @@ -0,0 +1,28 @@ +import { defineComponent, PropType } from 'vue'; +import { useNamespace } from '@ibiz-template/vue3-util'; +import { IDBPortletPart } from '@ibiz/model-core'; +import { {{ pascalCasePluginName }}Controller } from './{{pluginName}}.controller'; +import './{{pluginName}}.scss'; + +export const {{ pascalCasePluginName }} = defineComponent({ + name: 'IBiz{{ pascalCasePluginName }}', + props: { + modelData: { + type: Object as PropType, + required: true, + }, + controller: { + type: {{ pascalCasePluginName }}Controller, + required: true, + }, + }, + setup() { + const ns = useNamespace('{{pluginName}}'); + + return { ns }; + }, + + render() { + return
插件示例
; + }, +}); diff --git a/packages/core/src/create-plugin/template/platform/portlet_custom/tsconfig.json b/packages/core/src/create-plugin/template/platform/portlet_custom/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..ba8f48be2a612227b3b2cd44668c26316fa3dd4b --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/portlet_custom/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Node", + "strict": true, + "jsx": "preserve", + "jsxImportSource": "vue", + "sourceMap": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ESNext", "DOM"], + "skipLibCheck": true + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/packages/core/src/create-plugin/template/platform/portlet_custom/tsconfig.node.json b/packages/core/src/create-plugin/template/platform/portlet_custom/tsconfig.node.json new file mode 100644 index 0000000000000000000000000000000000000000..9d31e2aed93c876bc048cf2f863cb2a847c901e8 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/portlet_custom/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/core/src/create-plugin/template/platform/portlet_custom/vite.config.ts b/packages/core/src/create-plugin/template/platform/portlet_custom/vite.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..fc3449a5a42babd06efbe73c42acd8989ffb91fc --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/portlet_custom/vite.config.ts @@ -0,0 +1,57 @@ +import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import libLegacy from '@qx-chitanda/vite-plugin-lib-legacy'; +import dts from 'vite-plugin-dts'; +import libCss from 'vite-plugin-libcss'; +// https://vitejs.dev/config/ +export default defineConfig({ + build: { + lib: { + entry: './src/index.ts', + fileName: format => `index.${format}.js`, + }, + rollupOptions: { + external: [ + '@ibiz-template/core', + '@ibiz-template/model-helper', + '@ibiz-template/runtime', + '@ibiz-template/theme', + '@ibiz-template/vue3-util', + '@ibiz/dynamic-model-api', + '@floating-ui/dom', + 'async-validator', + 'axios', + 'dayjs', + 'element-plus', + 'lodash-es', + 'pluralize', + 'qs', + 'qx-util', + 'ramda', + 'vue', + 'vue-router', + 'vuedraggable', + ], + }, + }, + css: { + preprocessorOptions: { + scss: { + additionalData: '@import "@ibiz-template/theme/style/global.scss";', + }, + }, + }, + plugins: [ + // eslint({ + // include: 'src/**/*.{ts,tsx,js,jsx}', + // }), + vue(), + vueJsx(), + libLegacy(), + libCss(), + dts({ + outDir: 'dist/types', + }), + ], +}); diff --git a/packages/core/src/create-plugin/template/platform/searchform_render/.eslintrc.cjs b/packages/core/src/create-plugin/template/platform/searchform_render/.eslintrc.cjs new file mode 100644 index 0000000000000000000000000000000000000000..c6e5a1dd5b2fa946548b00254225469f2f15bee9 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/searchform_render/.eslintrc.cjs @@ -0,0 +1,52 @@ +module.exports = { + root: true, + env: { + browser: true, + es2021: true, + }, + extends: ['airbnb-base', 'prettier', 'plugin:@typescript-eslint/recommended'], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + plugins: ['prettier', '@typescript-eslint', 'unused-imports'], + rules: { + 'prettier/prettier': 'error', + 'arrow-body-style': 'off', + 'prefer-arrow-callback': 'off', + 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-new': [0], + 'no-continue': [0], + '@typescript-eslint/no-empty-interface': 'off', + 'no-use-before-define': [0], + 'no-restricted-syntax': [0], + 'no-empty-function': [0], + 'no-useless-constructor': [0], // 禁止空的构造函数 + 'no-param-reassign': [0], // 禁止修改传入函数的参数 + 'no-underscore-dangle': [0], // 禁止使用下划线开头的变量名 + 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], // 禁止使用 ++,-- + 'consistent-return': [0], // 函数可以有不同类型返回值 + 'class-methods-use-this': [0], // 方法内未使用此方法时,强制定义为静态方法 + 'import/prefer-default-export': [0], // 一个模块只能有默认导出,不可以有多个导出 + 'import/no-unresolved': [0], // 不允许未解决的模块 + 'import/extensions': [0], // 不允许导入文件时不带后缀 + 'unused-imports/no-unused-imports': 'error', + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], + '@typescript-eslint/no-inferrable-types': [0], + '@typescript-eslint/no-non-null-assertion': [0], + '@typescript-eslint/no-explicit-any': ['error'], + '@typescript-eslint/explicit-function-return-type': 'error', // 要求函数和类方法的显式返回类型 + '@typescript-eslint/explicit-module-boundary-types': 'error', // 要求导出函数和类的公共类方法的显式返回和参数类型 + 'import/no-extraneous-dependencies': [ + 0, + { + devDependencies: true, + peerDependencies: true, + // optionalDependencies: true, + // bundledDependencies: true + }, + ], + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/searchform_render/CHANGELOG.md b/packages/core/src/create-plugin/template/platform/searchform_render/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..8ac8e7f05d173977a1ad060d18e7f0b6a5f23cf5 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/searchform_render/CHANGELOG.md @@ -0,0 +1,3 @@ +# 版本变更日志 + +添加变更日志 \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/searchform_render/README.md b/packages/core/src/create-plugin/template/platform/searchform_render/README.md new file mode 100644 index 0000000000000000000000000000000000000000..1ccd44eab7685a16991e1dc2ae7ed7af77153736 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/searchform_render/README.md @@ -0,0 +1,71 @@ +# 搜索表单插件 + +搜索表单插件可自定义搜索表单内容的绘制,当标准逻辑无法满足搜索表单绘制要求时,可以通过搜索表单插件来实现。modeling建模平台创建搜索表单插件可参见 [插件开发](https://open.ibizlab.cn/apphub/zh/guide/plugin-dev.html) + +## 插件结构 + +``` +|─ ─ {{pluginName}} 搜索表单插件顶层目录 + |─ ─ src 搜索表单插件源代码目录 +​ |─ ─ {{pluginName}}.controller.ts 搜索表单插件控制器 +​ |─ ─ {{pluginName}}.provider.ts 搜索表单插件适配器 +​ |─ ─ {{pluginName}}.scss 搜索表单插件样式 +​ |─ ─ {{pluginName}}.tsx 搜索表单插件组件 +​ |─ ─ index.ts 搜索表单插件入口文件 +``` + +- 搜索表单插件入口文件 + +搜索表单插件入口文件会全局注册搜索表单插件适配器和搜索表单插件组件,供外部使用。 + +- 搜索表单插件组件 + +搜索表单插件组件使用tsx的书写方式,承载搜索表单绘制的内容。 + +- 搜索表单插件适配器 + +搜索表单插件适配器主要通过component属性指定搜索表单实际要绘制的组件,并且通过createController方法返回传递给搜索表单的控制器。 + +- 搜索表单插件控制器 + +搜索表单插件控制器承载搜索表单的逻辑控制。 + +## 本地开发 + +1. 安装依赖并link至全局 + +```sh +// 安装依赖 +pnpm i + +// link底包 +./scripts/link.sh + +// 启动 +pnpm dev + +// link到全局 +pnpm link --global +``` + +2. 主项目包中引用插件 + +```sh +// link插件 +pnpm link --global '{{pluginGroup}}/{{pluginName}}' +``` + +3. 主项目包中注册插件 + +```ts +import { App } from 'vue'; +import {{ pascalCasePluginName }} from '{{pluginGroup}}/{{pluginName}}' + +export default { + install(app: App) { + app.use({{ pascalCasePluginName }}); + // 设置本地开发需要忽略加载的插件,可填写正则或全匹配字符串。匹配插件在modeling建模平台配置的[运行时插件仓库配置]内容 + ibiz.plugin.setDevIgnore(/^{{pluginGroup}}\/{{pluginName}}/); + }, +}; +``` diff --git a/packages/core/src/create-plugin/template/platform/searchform_render/package.json b/packages/core/src/create-plugin/template/platform/searchform_render/package.json new file mode 100644 index 0000000000000000000000000000000000000000..526db31b8430b973184cd5e8a7416fd394369d62 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/searchform_render/package.json @@ -0,0 +1,106 @@ +{ + "name": "{{pluginGroup}}/{{pluginName}}", + "version": "0.0.1", + "description": "{{pluginDescription}}", + "author": "tony001", + "license": "MIT", + "type": "module", + "main": "dist/index.es.js", + "module": "dist/index.es.js", + "types": "dist/types/index.d.ts", + "system": "dist/index.legacy.js", + "styles": [ + "dist/style.css" + ], + "files": [ + "dist", + "public", + "CHANGELOG.md", + "README.md" + ], + "publishConfig": { + "registry": "https://registry.npmjs.org/" + }, + "scripts": { + "dev": "vite build --watch", + "build": "vue-tsc --noEmit && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "@floating-ui/dom": "^1.5.3", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "@qx-chitanda/vite-plugin-lib-legacy": "^4.1.1", + "@types/lodash-es": "^4.17.12", + "@types/ramda": "^0.29.6", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", + "@vitejs/plugin-vue": "^4.4.1", + "@vitejs/plugin-vue-jsx": "^3.0.2", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "eslint": "^8.53.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-prettier": "^5.0.1", + "eslint-plugin-unused-imports": "^3.0.0", + "eslint-plugin-vue": "^9.18.1", + "husky": "^8.0.3", + "lerna": "^8.0.0", + "lint-staged": "^15.1.0", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "postcss": "^8.4.31", + "prettier": "^3.1.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "rollup-plugin-visualizer": "^5.9.2", + "sass": "1.69.5", + "stylelint": "15.11.0", + "stylelint-config-prettier": "^9.0.5", + "stylelint-config-recess-order": "^4.3.0", + "stylelint-config-standard": "^34.0.0", + "stylelint-config-standard-scss": "^11.1.0", + "stylelint-scss": "5.3.1", + "terser": "^5.24.0", + "typescript": "5.2.2", + "vite": "^4.5.0", + "vite-plugin-dts": "^3.6.3", + "vite-plugin-eslint": "^1.8.1", + "vite-plugin-libcss": "^1.1.1", + "vue": "^3.3.8", + "vue-eslint-parser": "^9.3.2", + "vue-router": "^4.2.5", + "vue-tsc": "1.8.22", + "vuedraggable": "^4.1.0" + }, + "peerDependencies": { + "@floating-ui/dom": "^1.5.1", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "vue": "^3.3.8", + "vue-router": "^4.2.5", + "vuedraggable": "^4.1.0" + } +} diff --git a/packages/core/src/create-plugin/template/platform/searchform_render/scripts/link.sh b/packages/core/src/create-plugin/template/platform/searchform_render/scripts/link.sh new file mode 100755 index 0000000000000000000000000000000000000000..d4edc1556f72a02300c491cda3c13a7ff34795a7 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/searchform_render/scripts/link.sh @@ -0,0 +1,6 @@ +pnpm link --global "@ibiz-template/vue3-util" +pnpm link --global "@ibiz-template/model-helper" +pnpm link --global "@ibiz-template/runtime" +pnpm link --global "@ibiz-template/core" +pnpm link --global "@ibiz-template/theme" +pnpm link --global "@ibiz-template/vue3-components" diff --git a/packages/core/src/create-plugin/template/platform/searchform_render/src/index.ts b/packages/core/src/create-plugin/template/platform/searchform_render/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..d8a359e87ba2e0dd5bc79efb3cd9ea8992a79024 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/searchform_render/src/index.ts @@ -0,0 +1,16 @@ +import { App } from 'vue'; +import { registerControlProvider } from '@ibiz-template/runtime'; +import { {{ pascalCasePluginName }} } from './{{pluginName}}'; +import { {{ pascalCasePluginName }}Provider } from './{{pluginName}}.provider'; + +export default { + install(app: App) { + // 全局注册搜索表单插件组件 + app.component({{ pascalCasePluginName }}.name!, {{ pascalCasePluginName }}); + // 全局注册搜索表单插件适配器,SEARCHFORM_RENDER是插件类型,{{pluginId}}是插件标识 + registerControlProvider( + 'SEARCHFORM_RENDER_{{pluginId}}', + () => new {{ pascalCasePluginName }}Provider(), + ); + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/searchform_render/src/{{pluginName}}.controller.ts b/packages/core/src/create-plugin/template/platform/searchform_render/src/{{pluginName}}.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..a8625b5a4f16f71d75e27eb3831da02621053fd9 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/searchform_render/src/{{pluginName}}.controller.ts @@ -0,0 +1,3 @@ +import { SearchFormController } from '@ibiz-template/runtime'; + +export class {{ pascalCasePluginName }}Controller extends SearchFormController {} diff --git a/packages/core/src/create-plugin/template/platform/searchform_render/src/{{pluginName}}.provider.ts b/packages/core/src/create-plugin/template/platform/searchform_render/src/{{pluginName}}.provider.ts new file mode 100644 index 0000000000000000000000000000000000000000..9a32e3ffd8cf352373e44506e938059b9c46041a --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/searchform_render/src/{{pluginName}}.provider.ts @@ -0,0 +1,20 @@ +import { + CTX, + IControlController, + IControlProvider, +} from '@ibiz-template/runtime'; +import { IControl } from '@ibiz/model-core'; +import { {{ pascalCasePluginName }}Controller } from './{{pluginName}}.controller'; + +export class {{ pascalCasePluginName }}Provider implements IControlProvider { + component: string = 'IBiz{{ pascalCasePluginName }}'; + + createController( + model: IControl, + context: IContext, + params: IParams, + ctx: CTX, + ): IControlController { + return new {{ pascalCasePluginName }}Controller(model, context, params, ctx); + } +} diff --git a/packages/core/src/create-plugin/template/platform/searchform_render/src/{{pluginName}}.scss b/packages/core/src/create-plugin/template/platform/searchform_render/src/{{pluginName}}.scss new file mode 100644 index 0000000000000000000000000000000000000000..f494ab6cf7c220eae2d3b11bd32b7e3d96d2dc16 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/searchform_render/src/{{pluginName}}.scss @@ -0,0 +1,3 @@ +@include b({{pluginName}}){ + // 样式 +} \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/searchform_render/src/{{pluginName}}.tsx b/packages/core/src/create-plugin/template/platform/searchform_render/src/{{pluginName}}.tsx new file mode 100644 index 0000000000000000000000000000000000000000..ddf3340abefc31348673bfefd4cb513312874ab7 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/searchform_render/src/{{pluginName}}.tsx @@ -0,0 +1,59 @@ +import { defineComponent, PropType } from 'vue'; +import { useControlController, useNamespace } from '@ibiz-template/vue3-util'; +import { IDESearchForm } from '@ibiz/model-core'; +import { IControlProvider } from '@ibiz-template/runtime'; +import { {{ pascalCasePluginName }}Controller } from './{{pluginName}}.controller'; +import './{{pluginName}}.scss'; + +export const {{ pascalCasePluginName }} = defineComponent({ + name: 'IBiz{{ pascalCasePluginName }}', + props: { + /** + * @description 搜索表单模型数据 + */ + modelData: { + type: Object as PropType, + required: true, + }, + /** + * @description 应用上下文对象 + */ + context: { type: Object as PropType, required: true }, + /** + * @description 视图参数对象 + * @default {} + */ + params: { type: Object as PropType, default: () => ({}) }, + /** + * @description 部件适配器 + */ + provider: { type: Object as PropType }, + /** + * @description 是否是简单模式,即直接传入数据,不加载数据 + */ + isSimple: { type: Boolean, required: false }, + /** + * @description 简单模式下传入的数据 + */ + data: { type: Object as PropType, required: false }, + /** + * @description 是否默认加载数据 + * @default true + */ + loadDefault: { type: Boolean, default: true }, + }, + setup() { + const c = useControlController( + (...args) => new {{ pascalCasePluginName }}Controller(...args), + ); + const ns = useNamespace('{{pluginName}}'); + + return { + c, + ns, + }; + }, + render() { + return
插件示例
; + }, +}); diff --git a/packages/core/src/create-plugin/template/platform/searchform_render/tsconfig.json b/packages/core/src/create-plugin/template/platform/searchform_render/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..ba8f48be2a612227b3b2cd44668c26316fa3dd4b --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/searchform_render/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Node", + "strict": true, + "jsx": "preserve", + "jsxImportSource": "vue", + "sourceMap": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ESNext", "DOM"], + "skipLibCheck": true + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/packages/core/src/create-plugin/template/platform/searchform_render/tsconfig.node.json b/packages/core/src/create-plugin/template/platform/searchform_render/tsconfig.node.json new file mode 100644 index 0000000000000000000000000000000000000000..9d31e2aed93c876bc048cf2f863cb2a847c901e8 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/searchform_render/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/core/src/create-plugin/template/platform/searchform_render/vite.config.ts b/packages/core/src/create-plugin/template/platform/searchform_render/vite.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..fc3449a5a42babd06efbe73c42acd8989ffb91fc --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/searchform_render/vite.config.ts @@ -0,0 +1,57 @@ +import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import libLegacy from '@qx-chitanda/vite-plugin-lib-legacy'; +import dts from 'vite-plugin-dts'; +import libCss from 'vite-plugin-libcss'; +// https://vitejs.dev/config/ +export default defineConfig({ + build: { + lib: { + entry: './src/index.ts', + fileName: format => `index.${format}.js`, + }, + rollupOptions: { + external: [ + '@ibiz-template/core', + '@ibiz-template/model-helper', + '@ibiz-template/runtime', + '@ibiz-template/theme', + '@ibiz-template/vue3-util', + '@ibiz/dynamic-model-api', + '@floating-ui/dom', + 'async-validator', + 'axios', + 'dayjs', + 'element-plus', + 'lodash-es', + 'pluralize', + 'qs', + 'qx-util', + 'ramda', + 'vue', + 'vue-router', + 'vuedraggable', + ], + }, + }, + css: { + preprocessorOptions: { + scss: { + additionalData: '@import "@ibiz-template/theme/style/global.scss";', + }, + }, + }, + plugins: [ + // eslint({ + // include: 'src/**/*.{ts,tsx,js,jsx}', + // }), + vue(), + vueJsx(), + libLegacy(), + libCss(), + dts({ + outDir: 'dist/types', + }), + ], +}); diff --git a/packages/core/src/create-plugin/template/platform/toolbar_item/.eslintrc.cjs b/packages/core/src/create-plugin/template/platform/toolbar_item/.eslintrc.cjs new file mode 100644 index 0000000000000000000000000000000000000000..c6e5a1dd5b2fa946548b00254225469f2f15bee9 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_item/.eslintrc.cjs @@ -0,0 +1,52 @@ +module.exports = { + root: true, + env: { + browser: true, + es2021: true, + }, + extends: ['airbnb-base', 'prettier', 'plugin:@typescript-eslint/recommended'], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + plugins: ['prettier', '@typescript-eslint', 'unused-imports'], + rules: { + 'prettier/prettier': 'error', + 'arrow-body-style': 'off', + 'prefer-arrow-callback': 'off', + 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-new': [0], + 'no-continue': [0], + '@typescript-eslint/no-empty-interface': 'off', + 'no-use-before-define': [0], + 'no-restricted-syntax': [0], + 'no-empty-function': [0], + 'no-useless-constructor': [0], // 禁止空的构造函数 + 'no-param-reassign': [0], // 禁止修改传入函数的参数 + 'no-underscore-dangle': [0], // 禁止使用下划线开头的变量名 + 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], // 禁止使用 ++,-- + 'consistent-return': [0], // 函数可以有不同类型返回值 + 'class-methods-use-this': [0], // 方法内未使用此方法时,强制定义为静态方法 + 'import/prefer-default-export': [0], // 一个模块只能有默认导出,不可以有多个导出 + 'import/no-unresolved': [0], // 不允许未解决的模块 + 'import/extensions': [0], // 不允许导入文件时不带后缀 + 'unused-imports/no-unused-imports': 'error', + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], + '@typescript-eslint/no-inferrable-types': [0], + '@typescript-eslint/no-non-null-assertion': [0], + '@typescript-eslint/no-explicit-any': ['error'], + '@typescript-eslint/explicit-function-return-type': 'error', // 要求函数和类方法的显式返回类型 + '@typescript-eslint/explicit-module-boundary-types': 'error', // 要求导出函数和类的公共类方法的显式返回和参数类型 + 'import/no-extraneous-dependencies': [ + 0, + { + devDependencies: true, + peerDependencies: true, + // optionalDependencies: true, + // bundledDependencies: true + }, + ], + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/toolbar_item/CHANGELOG.md b/packages/core/src/create-plugin/template/platform/toolbar_item/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..8ac8e7f05d173977a1ad060d18e7f0b6a5f23cf5 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_item/CHANGELOG.md @@ -0,0 +1,3 @@ +# 版本变更日志 + +添加变更日志 \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/toolbar_item/README.md b/packages/core/src/create-plugin/template/platform/toolbar_item/README.md new file mode 100644 index 0000000000000000000000000000000000000000..b0692145a12dea893642b4a7a77dfdae759bc4fe --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_item/README.md @@ -0,0 +1,66 @@ +# 工具栏项插件 + +工具栏项插件可自定义工具栏项内容的绘制,当标准逻辑无法满足工具栏项绘制要求时,可以通过工具栏项插件来实现。modeling建模平台创建工具栏项插件可参见 [插件开发](https://open.ibizlab.cn/apphub/zh/guide/plugin-dev.html) + +## 插件结构 + +``` +|─ ─ {{pluginName}} 工具栏项插件顶层目录 + |─ ─ src 工具栏项插件源代码目录 +​ |─ ─ {{pluginName}}.provider.ts 工具栏项插件适配器 +​ |─ ─ {{pluginName}}.scss 工具栏项插件样式 +​ |─ ─ {{pluginName}}.tsx 工具栏项插件组件 +​ |─ ─ index.ts 工具栏项插件入口文件 +``` + +- 工具栏项插件入口文件 + +工具栏项插件入口文件会全局注册工具栏项插件适配器和工具栏项插件组件,供外部使用。 + +- 工具栏项插件组件 + +工具栏项插件组件使用tsx的书写方式,承载工具栏项绘制的内容,可根据需求自定义内容呈现。 + +- 工具栏项插件适配器 + +工具栏项插件适配器主要通过component属性指定工具栏项实际要绘制的组件。 + +## 本地开发 + +1. 安装依赖并link至全局 + +```sh +// 安装依赖 +pnpm i + +// link底包 +./scripts/link.sh + +// 启动 +pnpm dev + +// link到全局 +pnpm link --global +``` + +2. 主项目包中引用插件 + +```sh +// link插件 +pnpm link --global '{{pluginGroup}}/{{pluginName}}' +``` + +3. 主项目包中注册插件 + +```ts +import { App } from 'vue'; +import {{ pascalCasePluginName }} from '{{pluginGroup}}/{{pluginName}}' + +export default { + install(app: App) { + app.use({{ pascalCasePluginName }}); + // 设置本地开发需要忽略加载的插件,可填写正则或全匹配字符串。匹配插件在modeling建模平台配置的[运行时插件仓库配置]内容 + ibiz.plugin.setDevIgnore(/^{{pluginGroup}}\/{{pluginName}}/); + }, +}; +``` diff --git a/packages/core/src/create-plugin/template/platform/toolbar_item/package.json b/packages/core/src/create-plugin/template/platform/toolbar_item/package.json new file mode 100644 index 0000000000000000000000000000000000000000..526db31b8430b973184cd5e8a7416fd394369d62 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_item/package.json @@ -0,0 +1,106 @@ +{ + "name": "{{pluginGroup}}/{{pluginName}}", + "version": "0.0.1", + "description": "{{pluginDescription}}", + "author": "tony001", + "license": "MIT", + "type": "module", + "main": "dist/index.es.js", + "module": "dist/index.es.js", + "types": "dist/types/index.d.ts", + "system": "dist/index.legacy.js", + "styles": [ + "dist/style.css" + ], + "files": [ + "dist", + "public", + "CHANGELOG.md", + "README.md" + ], + "publishConfig": { + "registry": "https://registry.npmjs.org/" + }, + "scripts": { + "dev": "vite build --watch", + "build": "vue-tsc --noEmit && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "@floating-ui/dom": "^1.5.3", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "@qx-chitanda/vite-plugin-lib-legacy": "^4.1.1", + "@types/lodash-es": "^4.17.12", + "@types/ramda": "^0.29.6", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", + "@vitejs/plugin-vue": "^4.4.1", + "@vitejs/plugin-vue-jsx": "^3.0.2", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "eslint": "^8.53.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-prettier": "^5.0.1", + "eslint-plugin-unused-imports": "^3.0.0", + "eslint-plugin-vue": "^9.18.1", + "husky": "^8.0.3", + "lerna": "^8.0.0", + "lint-staged": "^15.1.0", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "postcss": "^8.4.31", + "prettier": "^3.1.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "rollup-plugin-visualizer": "^5.9.2", + "sass": "1.69.5", + "stylelint": "15.11.0", + "stylelint-config-prettier": "^9.0.5", + "stylelint-config-recess-order": "^4.3.0", + "stylelint-config-standard": "^34.0.0", + "stylelint-config-standard-scss": "^11.1.0", + "stylelint-scss": "5.3.1", + "terser": "^5.24.0", + "typescript": "5.2.2", + "vite": "^4.5.0", + "vite-plugin-dts": "^3.6.3", + "vite-plugin-eslint": "^1.8.1", + "vite-plugin-libcss": "^1.1.1", + "vue": "^3.3.8", + "vue-eslint-parser": "^9.3.2", + "vue-router": "^4.2.5", + "vue-tsc": "1.8.22", + "vuedraggable": "^4.1.0" + }, + "peerDependencies": { + "@floating-ui/dom": "^1.5.1", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "vue": "^3.3.8", + "vue-router": "^4.2.5", + "vuedraggable": "^4.1.0" + } +} diff --git a/packages/core/src/create-plugin/template/platform/toolbar_item/scripts/link.sh b/packages/core/src/create-plugin/template/platform/toolbar_item/scripts/link.sh new file mode 100755 index 0000000000000000000000000000000000000000..d4edc1556f72a02300c491cda3c13a7ff34795a7 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_item/scripts/link.sh @@ -0,0 +1,6 @@ +pnpm link --global "@ibiz-template/vue3-util" +pnpm link --global "@ibiz-template/model-helper" +pnpm link --global "@ibiz-template/runtime" +pnpm link --global "@ibiz-template/core" +pnpm link --global "@ibiz-template/theme" +pnpm link --global "@ibiz-template/vue3-components" diff --git a/packages/core/src/create-plugin/template/platform/toolbar_item/src/index.ts b/packages/core/src/create-plugin/template/platform/toolbar_item/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..568ff4b4064983a8a45766a1d7413b8fae668716 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_item/src/index.ts @@ -0,0 +1,16 @@ +import { App } from 'vue'; +import { registerToolbarItemProvider } from '@ibiz-template/runtime'; +import { {{ pascalCasePluginName }} } from './{{pluginName}}'; +import { {{ pascalCasePluginName }}Provider } from './{{pluginName}}.provider'; + +export default { + install(app: App) { + // 全局注册工具栏项插件组件 + app.component({{ pascalCasePluginName }}.name!, {{ pascalCasePluginName }}); + // 全局注册工具栏项插件适配器,TOOLBAR_ITEM是插件类型,{{pluginId}}是插件标识 + registerToolbarItemProvider( + 'TOOLBAR_ITEM_{{pluginId}}', + () => new {{ pascalCasePluginName }}Provider(), + ); + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/toolbar_item/src/{{pluginName}}.provider.ts b/packages/core/src/create-plugin/template/platform/toolbar_item/src/{{pluginName}}.provider.ts new file mode 100644 index 0000000000000000000000000000000000000000..3f3e29505bbbd28741f683a2b3f39eb0517e8f2a --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_item/src/{{pluginName}}.provider.ts @@ -0,0 +1,5 @@ +import { IToolbarItemProvider } from '@ibiz-template/runtime'; + +export class {{ pascalCasePluginName }}Provider implements IToolbarItemProvider { + component: string = 'IBiz{{ pascalCasePluginName }}'; +} diff --git a/packages/core/src/create-plugin/template/platform/toolbar_item/src/{{pluginName}}.scss b/packages/core/src/create-plugin/template/platform/toolbar_item/src/{{pluginName}}.scss new file mode 100644 index 0000000000000000000000000000000000000000..dac02ade949d22f1331b36a839c70941eed5e50b --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_item/src/{{pluginName}}.scss @@ -0,0 +1,3 @@ +@include b({{pluginName}}) { + // 样式 +} diff --git a/packages/core/src/create-plugin/template/platform/toolbar_item/src/{{pluginName}}.tsx b/packages/core/src/create-plugin/template/platform/toolbar_item/src/{{pluginName}}.tsx new file mode 100644 index 0000000000000000000000000000000000000000..e6572d13c3f58a79a44dc74ced34a0bb41cbdab5 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_item/src/{{pluginName}}.tsx @@ -0,0 +1,27 @@ +import { PropType, defineComponent } from 'vue'; +import { useNamespace } from '@ibiz-template/vue3-util'; +import { IDEToolbarItem } from '@ibiz/model-core'; +import { ToolbarController } from '@ibiz-template/runtime'; +import './{{pluginName}}.scss'; + +export const {{ pascalCasePluginName }} = defineComponent({ + name: 'IBiz{{ pascalCasePluginName }}', + props: { + item: { + type: Object as PropType, + required: true, + }, + controller: { + type: ToolbarController, + required: true, + }, + }, + setup() { + const ns = useNamespace('{{pluginName}}'); + + return { ns }; + }, + render() { + return
插件示例
; + }, +}); diff --git a/packages/core/src/create-plugin/template/platform/toolbar_item/tsconfig.json b/packages/core/src/create-plugin/template/platform/toolbar_item/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..ba8f48be2a612227b3b2cd44668c26316fa3dd4b --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_item/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Node", + "strict": true, + "jsx": "preserve", + "jsxImportSource": "vue", + "sourceMap": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ESNext", "DOM"], + "skipLibCheck": true + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/packages/core/src/create-plugin/template/platform/toolbar_item/tsconfig.node.json b/packages/core/src/create-plugin/template/platform/toolbar_item/tsconfig.node.json new file mode 100644 index 0000000000000000000000000000000000000000..9d31e2aed93c876bc048cf2f863cb2a847c901e8 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_item/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/core/src/create-plugin/template/platform/toolbar_item/vite.config.ts b/packages/core/src/create-plugin/template/platform/toolbar_item/vite.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..fc3449a5a42babd06efbe73c42acd8989ffb91fc --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_item/vite.config.ts @@ -0,0 +1,57 @@ +import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import libLegacy from '@qx-chitanda/vite-plugin-lib-legacy'; +import dts from 'vite-plugin-dts'; +import libCss from 'vite-plugin-libcss'; +// https://vitejs.dev/config/ +export default defineConfig({ + build: { + lib: { + entry: './src/index.ts', + fileName: format => `index.${format}.js`, + }, + rollupOptions: { + external: [ + '@ibiz-template/core', + '@ibiz-template/model-helper', + '@ibiz-template/runtime', + '@ibiz-template/theme', + '@ibiz-template/vue3-util', + '@ibiz/dynamic-model-api', + '@floating-ui/dom', + 'async-validator', + 'axios', + 'dayjs', + 'element-plus', + 'lodash-es', + 'pluralize', + 'qs', + 'qx-util', + 'ramda', + 'vue', + 'vue-router', + 'vuedraggable', + ], + }, + }, + css: { + preprocessorOptions: { + scss: { + additionalData: '@import "@ibiz-template/theme/style/global.scss";', + }, + }, + }, + plugins: [ + // eslint({ + // include: 'src/**/*.{ts,tsx,js,jsx}', + // }), + vue(), + vueJsx(), + libLegacy(), + libCss(), + dts({ + outDir: 'dist/types', + }), + ], +}); diff --git a/packages/core/src/create-plugin/template/platform/toolbar_render/.eslintrc.cjs b/packages/core/src/create-plugin/template/platform/toolbar_render/.eslintrc.cjs new file mode 100644 index 0000000000000000000000000000000000000000..c6e5a1dd5b2fa946548b00254225469f2f15bee9 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_render/.eslintrc.cjs @@ -0,0 +1,52 @@ +module.exports = { + root: true, + env: { + browser: true, + es2021: true, + }, + extends: ['airbnb-base', 'prettier', 'plugin:@typescript-eslint/recommended'], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + plugins: ['prettier', '@typescript-eslint', 'unused-imports'], + rules: { + 'prettier/prettier': 'error', + 'arrow-body-style': 'off', + 'prefer-arrow-callback': 'off', + 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-new': [0], + 'no-continue': [0], + '@typescript-eslint/no-empty-interface': 'off', + 'no-use-before-define': [0], + 'no-restricted-syntax': [0], + 'no-empty-function': [0], + 'no-useless-constructor': [0], // 禁止空的构造函数 + 'no-param-reassign': [0], // 禁止修改传入函数的参数 + 'no-underscore-dangle': [0], // 禁止使用下划线开头的变量名 + 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], // 禁止使用 ++,-- + 'consistent-return': [0], // 函数可以有不同类型返回值 + 'class-methods-use-this': [0], // 方法内未使用此方法时,强制定义为静态方法 + 'import/prefer-default-export': [0], // 一个模块只能有默认导出,不可以有多个导出 + 'import/no-unresolved': [0], // 不允许未解决的模块 + 'import/extensions': [0], // 不允许导入文件时不带后缀 + 'unused-imports/no-unused-imports': 'error', + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], + '@typescript-eslint/no-inferrable-types': [0], + '@typescript-eslint/no-non-null-assertion': [0], + '@typescript-eslint/no-explicit-any': ['error'], + '@typescript-eslint/explicit-function-return-type': 'error', // 要求函数和类方法的显式返回类型 + '@typescript-eslint/explicit-module-boundary-types': 'error', // 要求导出函数和类的公共类方法的显式返回和参数类型 + 'import/no-extraneous-dependencies': [ + 0, + { + devDependencies: true, + peerDependencies: true, + // optionalDependencies: true, + // bundledDependencies: true + }, + ], + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/toolbar_render/CHANGELOG.md b/packages/core/src/create-plugin/template/platform/toolbar_render/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..8ac8e7f05d173977a1ad060d18e7f0b6a5f23cf5 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_render/CHANGELOG.md @@ -0,0 +1,3 @@ +# 版本变更日志 + +添加变更日志 \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/toolbar_render/README.md b/packages/core/src/create-plugin/template/platform/toolbar_render/README.md new file mode 100644 index 0000000000000000000000000000000000000000..bc8dccb847848b29c6ad00916eefc1536991fc8e --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_render/README.md @@ -0,0 +1,71 @@ +# 工具栏插件 + +工具栏插件可自定义工具栏内容的绘制,当标准逻辑无法满足工具栏绘制要求时,可以通过工具栏插件来实现。modeling建模平台创建工具栏插件可参见 [插件开发](https://open.ibizlab.cn/apphub/zh/guide/plugin-dev.html) + +## 插件结构 + +``` +|─ ─ {{pluginName}} 工具栏插件顶层目录 + |─ ─ src 工具栏插件源代码目录 +​ |─ ─ {{pluginName}}.controller.ts 工具栏插件控制器 +​ |─ ─ {{pluginName}}.provider.ts 工具栏插件适配器 +​ |─ ─ {{pluginName}}.scss 工具栏插件样式 +​ |─ ─ {{pluginName}}.tsx 工具栏插件组件 +​ |─ ─ index.ts 工具栏插件入口文件 +``` + +- 工具栏插件入口文件 + +工具栏插件入口文件会全局注册工具栏插件适配器和工具栏插件组件,供外部使用。 + +- 工具栏插件组件 + +工具栏插件组件使用tsx的书写方式,承载工具栏绘制的内容。 + +- 工具栏插件适配器 + +工具栏插件适配器主要通过component属性指定工具栏实际要绘制的组件,并且通过createController方法返回传递给工具栏的控制器。 + +- 工具栏插件控制器 + +工具栏插件控制器承载工具栏的逻辑控制。 + +## 本地开发 + +1. 安装依赖并link至全局 + +```sh +// 安装依赖 +pnpm i + +// link底包 +./scripts/link.sh + +// 启动 +pnpm dev + +// link到全局 +pnpm link --global +``` + +2. 主项目包中引用插件 + +```sh +// link插件 +pnpm link --global '{{pluginGroup}}/{{pluginName}}' +``` + +3. 主项目包中注册插件 + +```ts +import { App } from 'vue'; +import {{ pascalCasePluginName }} from '{{pluginGroup}}/{{pluginName}}' + +export default { + install(app: App) { + app.use({{ pascalCasePluginName }}); + // 设置本地开发需要忽略加载的插件,可填写正则或全匹配字符串。匹配插件在modeling建模平台配置的[运行时插件仓库配置]内容 + ibiz.plugin.setDevIgnore(/^{{pluginGroup}}\/{{pluginName}}/); + }, +}; +``` diff --git a/packages/core/src/create-plugin/template/platform/toolbar_render/package.json b/packages/core/src/create-plugin/template/platform/toolbar_render/package.json new file mode 100644 index 0000000000000000000000000000000000000000..526db31b8430b973184cd5e8a7416fd394369d62 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_render/package.json @@ -0,0 +1,106 @@ +{ + "name": "{{pluginGroup}}/{{pluginName}}", + "version": "0.0.1", + "description": "{{pluginDescription}}", + "author": "tony001", + "license": "MIT", + "type": "module", + "main": "dist/index.es.js", + "module": "dist/index.es.js", + "types": "dist/types/index.d.ts", + "system": "dist/index.legacy.js", + "styles": [ + "dist/style.css" + ], + "files": [ + "dist", + "public", + "CHANGELOG.md", + "README.md" + ], + "publishConfig": { + "registry": "https://registry.npmjs.org/" + }, + "scripts": { + "dev": "vite build --watch", + "build": "vue-tsc --noEmit && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "@floating-ui/dom": "^1.5.3", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "@qx-chitanda/vite-plugin-lib-legacy": "^4.1.1", + "@types/lodash-es": "^4.17.12", + "@types/ramda": "^0.29.6", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", + "@vitejs/plugin-vue": "^4.4.1", + "@vitejs/plugin-vue-jsx": "^3.0.2", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "eslint": "^8.53.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-prettier": "^5.0.1", + "eslint-plugin-unused-imports": "^3.0.0", + "eslint-plugin-vue": "^9.18.1", + "husky": "^8.0.3", + "lerna": "^8.0.0", + "lint-staged": "^15.1.0", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "postcss": "^8.4.31", + "prettier": "^3.1.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "rollup-plugin-visualizer": "^5.9.2", + "sass": "1.69.5", + "stylelint": "15.11.0", + "stylelint-config-prettier": "^9.0.5", + "stylelint-config-recess-order": "^4.3.0", + "stylelint-config-standard": "^34.0.0", + "stylelint-config-standard-scss": "^11.1.0", + "stylelint-scss": "5.3.1", + "terser": "^5.24.0", + "typescript": "5.2.2", + "vite": "^4.5.0", + "vite-plugin-dts": "^3.6.3", + "vite-plugin-eslint": "^1.8.1", + "vite-plugin-libcss": "^1.1.1", + "vue": "^3.3.8", + "vue-eslint-parser": "^9.3.2", + "vue-router": "^4.2.5", + "vue-tsc": "1.8.22", + "vuedraggable": "^4.1.0" + }, + "peerDependencies": { + "@floating-ui/dom": "^1.5.1", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "vue": "^3.3.8", + "vue-router": "^4.2.5", + "vuedraggable": "^4.1.0" + } +} diff --git a/packages/core/src/create-plugin/template/platform/toolbar_render/scripts/link.sh b/packages/core/src/create-plugin/template/platform/toolbar_render/scripts/link.sh new file mode 100755 index 0000000000000000000000000000000000000000..d4edc1556f72a02300c491cda3c13a7ff34795a7 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_render/scripts/link.sh @@ -0,0 +1,6 @@ +pnpm link --global "@ibiz-template/vue3-util" +pnpm link --global "@ibiz-template/model-helper" +pnpm link --global "@ibiz-template/runtime" +pnpm link --global "@ibiz-template/core" +pnpm link --global "@ibiz-template/theme" +pnpm link --global "@ibiz-template/vue3-components" diff --git a/packages/core/src/create-plugin/template/platform/toolbar_render/src/index.ts b/packages/core/src/create-plugin/template/platform/toolbar_render/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..ff6d3bf7c1037d41f432dc6a6053f9064383ca3b --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_render/src/index.ts @@ -0,0 +1,16 @@ +import { App } from 'vue'; +import { registerControlProvider } from '@ibiz-template/runtime'; +import { {{ pascalCasePluginName }} } from './{{pluginName}}'; +import { {{ pascalCasePluginName }}Provider } from './{{pluginName}}.provider'; + +export default { + install(app: App) { + // 全局注册工具栏插件组件 + app.component({{ pascalCasePluginName }}.name!, {{ pascalCasePluginName }}); + // 全局注册工具栏插件适配器,TOOLBAR_RENDER是插件类型,{{pluginId}}是插件标识 + registerControlProvider( + 'TOOLBAR_RENDER_{{pluginId}}', + () => new {{ pascalCasePluginName }}Provider(), + ); + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/toolbar_render/src/{{pluginName}}.controller.ts b/packages/core/src/create-plugin/template/platform/toolbar_render/src/{{pluginName}}.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..90cdad933fc1410fcf1b64d1b637645b787411b0 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_render/src/{{pluginName}}.controller.ts @@ -0,0 +1,3 @@ +import { ToolbarController } from '@ibiz-template/runtime'; + +export class {{ pascalCasePluginName }}Controller extends ToolbarController {} diff --git a/packages/core/src/create-plugin/template/platform/toolbar_render/src/{{pluginName}}.provider.ts b/packages/core/src/create-plugin/template/platform/toolbar_render/src/{{pluginName}}.provider.ts new file mode 100644 index 0000000000000000000000000000000000000000..9a32e3ffd8cf352373e44506e938059b9c46041a --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_render/src/{{pluginName}}.provider.ts @@ -0,0 +1,20 @@ +import { + CTX, + IControlController, + IControlProvider, +} from '@ibiz-template/runtime'; +import { IControl } from '@ibiz/model-core'; +import { {{ pascalCasePluginName }}Controller } from './{{pluginName}}.controller'; + +export class {{ pascalCasePluginName }}Provider implements IControlProvider { + component: string = 'IBiz{{ pascalCasePluginName }}'; + + createController( + model: IControl, + context: IContext, + params: IParams, + ctx: CTX, + ): IControlController { + return new {{ pascalCasePluginName }}Controller(model, context, params, ctx); + } +} diff --git a/packages/core/src/create-plugin/template/platform/toolbar_render/src/{{pluginName}}.scss b/packages/core/src/create-plugin/template/platform/toolbar_render/src/{{pluginName}}.scss new file mode 100644 index 0000000000000000000000000000000000000000..f494ab6cf7c220eae2d3b11bd32b7e3d96d2dc16 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_render/src/{{pluginName}}.scss @@ -0,0 +1,3 @@ +@include b({{pluginName}}){ + // 样式 +} \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/toolbar_render/src/{{pluginName}}.tsx b/packages/core/src/create-plugin/template/platform/toolbar_render/src/{{pluginName}}.tsx new file mode 100644 index 0000000000000000000000000000000000000000..e51237ce78694fa82da3a2e8571c0fd759617ac5 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_render/src/{{pluginName}}.tsx @@ -0,0 +1,59 @@ +import { defineComponent, PropType } from 'vue'; +import { useControlController, useNamespace } from '@ibiz-template/vue3-util'; +import { IDEToolbar } from '@ibiz/model-core'; +import { IControlProvider } from '@ibiz-template/runtime'; +import { {{ pascalCasePluginName }}Controller } from './{{pluginName}}.controller'; +import './{{pluginName}}.scss'; + +export const {{ pascalCasePluginName }} = defineComponent({ + name: 'IBiz{{ pascalCasePluginName }}', + props: { + /** + * @description 工具栏模型数据 + */ + modelData: { + type: Object as PropType, + required: true, + }, + /** + * @description 绘制模式 + */ + runMode: { + type: String as PropType<'DESIGN' | 'RUNTIME'>, + default: 'RUNTIME', + }, + /** + * @description 应用上下文对象 + */ + context: { type: Object as PropType, required: true }, + /** + * @description 视图参数对象 + * @default {} + */ + params: { type: Object as PropType, default: () => ({}) }, + /** + * @description 部件适配器 + */ + provider: { type: Object as PropType }, + /** + * @description 是否手动计算按钮状态,即工具栏自身默认不计算权限 + * @default false + */ + manualCalcButtonState: { type: Boolean, default: false }, + }, + emits: ['click'], + setup() { + const c = useControlController( + (...args) => new {{ pascalCasePluginName }}Controller(...args), + ); + const ns = useNamespace('{{pluginName}}'); + + return { + c, + ns, + }; + }, + render() { + return
插件示例
; + }, +}); diff --git a/packages/core/src/create-plugin/template/platform/toolbar_render/tsconfig.json b/packages/core/src/create-plugin/template/platform/toolbar_render/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..ba8f48be2a612227b3b2cd44668c26316fa3dd4b --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_render/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Node", + "strict": true, + "jsx": "preserve", + "jsxImportSource": "vue", + "sourceMap": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ESNext", "DOM"], + "skipLibCheck": true + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/packages/core/src/create-plugin/template/platform/toolbar_render/tsconfig.node.json b/packages/core/src/create-plugin/template/platform/toolbar_render/tsconfig.node.json new file mode 100644 index 0000000000000000000000000000000000000000..9d31e2aed93c876bc048cf2f863cb2a847c901e8 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_render/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/core/src/create-plugin/template/platform/toolbar_render/vite.config.ts b/packages/core/src/create-plugin/template/platform/toolbar_render/vite.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..fc3449a5a42babd06efbe73c42acd8989ffb91fc --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/toolbar_render/vite.config.ts @@ -0,0 +1,57 @@ +import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import libLegacy from '@qx-chitanda/vite-plugin-lib-legacy'; +import dts from 'vite-plugin-dts'; +import libCss from 'vite-plugin-libcss'; +// https://vitejs.dev/config/ +export default defineConfig({ + build: { + lib: { + entry: './src/index.ts', + fileName: format => `index.${format}.js`, + }, + rollupOptions: { + external: [ + '@ibiz-template/core', + '@ibiz-template/model-helper', + '@ibiz-template/runtime', + '@ibiz-template/theme', + '@ibiz-template/vue3-util', + '@ibiz/dynamic-model-api', + '@floating-ui/dom', + 'async-validator', + 'axios', + 'dayjs', + 'element-plus', + 'lodash-es', + 'pluralize', + 'qs', + 'qx-util', + 'ramda', + 'vue', + 'vue-router', + 'vuedraggable', + ], + }, + }, + css: { + preprocessorOptions: { + scss: { + additionalData: '@import "@ibiz-template/theme/style/global.scss";', + }, + }, + }, + plugins: [ + // eslint({ + // include: 'src/**/*.{ts,tsx,js,jsx}', + // }), + vue(), + vueJsx(), + libLegacy(), + libCss(), + dts({ + outDir: 'dist/types', + }), + ], +}); diff --git a/packages/core/src/create-plugin/template/platform/tree_render/.eslintrc.cjs b/packages/core/src/create-plugin/template/platform/tree_render/.eslintrc.cjs new file mode 100644 index 0000000000000000000000000000000000000000..c6e5a1dd5b2fa946548b00254225469f2f15bee9 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/tree_render/.eslintrc.cjs @@ -0,0 +1,52 @@ +module.exports = { + root: true, + env: { + browser: true, + es2021: true, + }, + extends: ['airbnb-base', 'prettier', 'plugin:@typescript-eslint/recommended'], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + plugins: ['prettier', '@typescript-eslint', 'unused-imports'], + rules: { + 'prettier/prettier': 'error', + 'arrow-body-style': 'off', + 'prefer-arrow-callback': 'off', + 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-new': [0], + 'no-continue': [0], + '@typescript-eslint/no-empty-interface': 'off', + 'no-use-before-define': [0], + 'no-restricted-syntax': [0], + 'no-empty-function': [0], + 'no-useless-constructor': [0], // 禁止空的构造函数 + 'no-param-reassign': [0], // 禁止修改传入函数的参数 + 'no-underscore-dangle': [0], // 禁止使用下划线开头的变量名 + 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], // 禁止使用 ++,-- + 'consistent-return': [0], // 函数可以有不同类型返回值 + 'class-methods-use-this': [0], // 方法内未使用此方法时,强制定义为静态方法 + 'import/prefer-default-export': [0], // 一个模块只能有默认导出,不可以有多个导出 + 'import/no-unresolved': [0], // 不允许未解决的模块 + 'import/extensions': [0], // 不允许导入文件时不带后缀 + 'unused-imports/no-unused-imports': 'error', + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], + '@typescript-eslint/no-inferrable-types': [0], + '@typescript-eslint/no-non-null-assertion': [0], + '@typescript-eslint/no-explicit-any': ['error'], + '@typescript-eslint/explicit-function-return-type': 'error', // 要求函数和类方法的显式返回类型 + '@typescript-eslint/explicit-module-boundary-types': 'error', // 要求导出函数和类的公共类方法的显式返回和参数类型 + 'import/no-extraneous-dependencies': [ + 0, + { + devDependencies: true, + peerDependencies: true, + // optionalDependencies: true, + // bundledDependencies: true + }, + ], + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/tree_render/CHANGELOG.md b/packages/core/src/create-plugin/template/platform/tree_render/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..8ac8e7f05d173977a1ad060d18e7f0b6a5f23cf5 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/tree_render/CHANGELOG.md @@ -0,0 +1,3 @@ +# 版本变更日志 + +添加变更日志 \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/tree_render/README.md b/packages/core/src/create-plugin/template/platform/tree_render/README.md new file mode 100644 index 0000000000000000000000000000000000000000..f0de3f9951e5bfd2b27be496d66784078482417a --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/tree_render/README.md @@ -0,0 +1,71 @@ +# 树视图插件 + +树视图插件可自定义树视图内容的绘制,当标准逻辑无法满足树视图绘制要求时,可以通过树视图插件来实现。modeling建模平台创建树视图插件可参见 [插件开发](https://open.ibizlab.cn/apphub/zh/guide/plugin-dev.html) + +## 插件结构 + +``` +|─ ─ {{pluginName}} 树视图插件顶层目录 + |─ ─ src 树视图插件源代码目录 +​ |─ ─ {{pluginName}}.controller.ts 树视图插件控制器 +​ |─ ─ {{pluginName}}.provider.ts 树视图插件适配器 +​ |─ ─ {{pluginName}}.scss 树视图插件样式 +​ |─ ─ {{pluginName}}.tsx 树视图插件组件 +​ |─ ─ index.ts 树视图插件入口文件 +``` + +- 树视图插件入口文件 + +树视图插件入口文件会全局注册树视图插件适配器和树视图插件组件,供外部使用。 + +- 树视图插件组件 + +树视图插件组件使用tsx的书写方式,承载树视图绘制的内容。 + +- 树视图插件适配器 + +树视图插件适配器主要通过component属性指定树视图实际要绘制的组件,并且通过createController方法返回传递给树视图的控制器。 + +- 树视图插件控制器 + +树视图插件控制器承载树视图的逻辑控制。 + +## 本地开发 + +1. 安装依赖并link至全局 + +```sh +// 安装依赖 +pnpm i + +// link底包 +./scripts/link.sh + +// 启动 +pnpm dev + +// link到全局 +pnpm link --global +``` + +2. 主项目包中引用插件 + +```sh +// link插件 +pnpm link --global '{{pluginGroup}}/{{pluginName}}' +``` + +3. 主项目包中注册插件 + +```ts +import { App } from 'vue'; +import {{ pascalCasePluginName }} from '{{pluginGroup}}/{{pluginName}}' + +export default { + install(app: App) { + app.use({{ pascalCasePluginName }}); + // 设置本地开发需要忽略加载的插件,可填写正则或全匹配字符串。匹配插件在modeling建模平台配置的[运行时插件仓库配置]内容 + ibiz.plugin.setDevIgnore(/^{{pluginGroup}}\/{{pluginName}}/); + }, +}; +``` diff --git a/packages/core/src/create-plugin/template/platform/tree_render/package.json b/packages/core/src/create-plugin/template/platform/tree_render/package.json new file mode 100644 index 0000000000000000000000000000000000000000..526db31b8430b973184cd5e8a7416fd394369d62 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/tree_render/package.json @@ -0,0 +1,106 @@ +{ + "name": "{{pluginGroup}}/{{pluginName}}", + "version": "0.0.1", + "description": "{{pluginDescription}}", + "author": "tony001", + "license": "MIT", + "type": "module", + "main": "dist/index.es.js", + "module": "dist/index.es.js", + "types": "dist/types/index.d.ts", + "system": "dist/index.legacy.js", + "styles": [ + "dist/style.css" + ], + "files": [ + "dist", + "public", + "CHANGELOG.md", + "README.md" + ], + "publishConfig": { + "registry": "https://registry.npmjs.org/" + }, + "scripts": { + "dev": "vite build --watch", + "build": "vue-tsc --noEmit && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "@floating-ui/dom": "^1.5.3", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "@qx-chitanda/vite-plugin-lib-legacy": "^4.1.1", + "@types/lodash-es": "^4.17.12", + "@types/ramda": "^0.29.6", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", + "@vitejs/plugin-vue": "^4.4.1", + "@vitejs/plugin-vue-jsx": "^3.0.2", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "eslint": "^8.53.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-prettier": "^5.0.1", + "eslint-plugin-unused-imports": "^3.0.0", + "eslint-plugin-vue": "^9.18.1", + "husky": "^8.0.3", + "lerna": "^8.0.0", + "lint-staged": "^15.1.0", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "postcss": "^8.4.31", + "prettier": "^3.1.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "rollup-plugin-visualizer": "^5.9.2", + "sass": "1.69.5", + "stylelint": "15.11.0", + "stylelint-config-prettier": "^9.0.5", + "stylelint-config-recess-order": "^4.3.0", + "stylelint-config-standard": "^34.0.0", + "stylelint-config-standard-scss": "^11.1.0", + "stylelint-scss": "5.3.1", + "terser": "^5.24.0", + "typescript": "5.2.2", + "vite": "^4.5.0", + "vite-plugin-dts": "^3.6.3", + "vite-plugin-eslint": "^1.8.1", + "vite-plugin-libcss": "^1.1.1", + "vue": "^3.3.8", + "vue-eslint-parser": "^9.3.2", + "vue-router": "^4.2.5", + "vue-tsc": "1.8.22", + "vuedraggable": "^4.1.0" + }, + "peerDependencies": { + "@floating-ui/dom": "^1.5.1", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "vue": "^3.3.8", + "vue-router": "^4.2.5", + "vuedraggable": "^4.1.0" + } +} diff --git a/packages/core/src/create-plugin/template/platform/tree_render/scripts/link.sh b/packages/core/src/create-plugin/template/platform/tree_render/scripts/link.sh new file mode 100755 index 0000000000000000000000000000000000000000..d4edc1556f72a02300c491cda3c13a7ff34795a7 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/tree_render/scripts/link.sh @@ -0,0 +1,6 @@ +pnpm link --global "@ibiz-template/vue3-util" +pnpm link --global "@ibiz-template/model-helper" +pnpm link --global "@ibiz-template/runtime" +pnpm link --global "@ibiz-template/core" +pnpm link --global "@ibiz-template/theme" +pnpm link --global "@ibiz-template/vue3-components" diff --git a/packages/core/src/create-plugin/template/platform/tree_render/src/index.ts b/packages/core/src/create-plugin/template/platform/tree_render/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..7370543f516bc5707aad9d9096fbd73c44781fd9 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/tree_render/src/index.ts @@ -0,0 +1,16 @@ +import { App } from 'vue'; +import { registerControlProvider } from '@ibiz-template/runtime'; +import { {{ pascalCasePluginName }} } from './{{pluginName}}'; +import { {{ pascalCasePluginName }}Provider } from './{{pluginName}}.provider'; + +export default { + install(app: App) { + // 全局注册树视图插件组件 + app.component({{ pascalCasePluginName }}.name!, {{ pascalCasePluginName }}); + // 全局注册树视图插件适配器,TREE_RENDER是插件类型,{{pluginId}}是插件标识 + registerControlProvider( + 'TREE_RENDER_{{pluginId}}', + () => new {{ pascalCasePluginName }}Provider(), + ); + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/tree_render/src/{{pluginName}}.controller.ts b/packages/core/src/create-plugin/template/platform/tree_render/src/{{pluginName}}.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..b887b8b08e579127d9138f16b7a8a34b50d3c767 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/tree_render/src/{{pluginName}}.controller.ts @@ -0,0 +1,3 @@ +import { TreeController } from '@ibiz-template/runtime'; + +export class {{ pascalCasePluginName }}Controller extends TreeController {} diff --git a/packages/core/src/create-plugin/template/platform/tree_render/src/{{pluginName}}.provider.ts b/packages/core/src/create-plugin/template/platform/tree_render/src/{{pluginName}}.provider.ts new file mode 100644 index 0000000000000000000000000000000000000000..9a32e3ffd8cf352373e44506e938059b9c46041a --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/tree_render/src/{{pluginName}}.provider.ts @@ -0,0 +1,20 @@ +import { + CTX, + IControlController, + IControlProvider, +} from '@ibiz-template/runtime'; +import { IControl } from '@ibiz/model-core'; +import { {{ pascalCasePluginName }}Controller } from './{{pluginName}}.controller'; + +export class {{ pascalCasePluginName }}Provider implements IControlProvider { + component: string = 'IBiz{{ pascalCasePluginName }}'; + + createController( + model: IControl, + context: IContext, + params: IParams, + ctx: CTX, + ): IControlController { + return new {{ pascalCasePluginName }}Controller(model, context, params, ctx); + } +} diff --git a/packages/core/src/create-plugin/template/platform/tree_render/src/{{pluginName}}.scss b/packages/core/src/create-plugin/template/platform/tree_render/src/{{pluginName}}.scss new file mode 100644 index 0000000000000000000000000000000000000000..f494ab6cf7c220eae2d3b11bd32b7e3d96d2dc16 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/tree_render/src/{{pluginName}}.scss @@ -0,0 +1,3 @@ +@include b({{pluginName}}){ + // 样式 +} \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/tree_render/src/{{pluginName}}.tsx b/packages/core/src/create-plugin/template/platform/tree_render/src/{{pluginName}}.tsx new file mode 100644 index 0000000000000000000000000000000000000000..a62476075873bd0024ce8b15bcf719be9ec1a8a9 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/tree_render/src/{{pluginName}}.tsx @@ -0,0 +1,78 @@ +import { defineComponent, PropType } from 'vue'; +import { useControlController, useNamespace } from '@ibiz-template/vue3-util'; +import { IDETree } from '@ibiz/model-core'; +import { IControlProvider, ITreeNodeData } from '@ibiz-template/runtime'; +import { {{ pascalCasePluginName }}Controller } from './{{pluginName}}.controller'; +import './{{pluginName}}.scss'; + +export const {{ pascalCasePluginName }} = defineComponent({ + name: 'IBiz{{ pascalCasePluginName }}', + props: { + /** + * @description 树模型数据 + */ + modelData: { type: Object as PropType, required: true }, + /** + * @description 应用上下文对象 + */ + context: { type: Object as PropType, required: true }, + /** + * @description 视图参数对象 + * @default {} + */ + params: { type: Object as PropType, default: () => ({}) }, + /** + * @description 部件适配器 + */ + provider: { type: Object as PropType }, + /** + * @description 树节点默认激活模式,值为0:不激活,值为1:单击激活,值为2:双击激活 + */ + mdctrlActiveMode: { type: Number, default: undefined }, + /** + * @description 是否单选 + */ + singleSelect: { type: Boolean, default: undefined }, + /** + * @description 是否是导航的 + */ + navigational: { type: Boolean, default: undefined }, + /** + * @description 默认展开节点集合 + */ + defaultExpandedKeys: { type: Array as PropType }, + /** + * @description 是否默认加载数据 + * @default true + */ + loadDefault: { type: Boolean, default: true }, + /** + * @description 在显示复选框的情况下,是否严格的遵循父子不互相关联的做法 + * @default true + */ + checkStrictly: { type: Boolean, default: true }, + /** + * @description 是否是简单模式 + * @default false + */ + isSimple: { type: Boolean, default: false }, + /** + * @description 简单模式下传入的数据 + */ + data: { type: Array, required: false }, + }, + setup() { + const c = useControlController( + (...args) => new {{ pascalCasePluginName }}Controller(...args), + ); + const ns = useNamespace('{{pluginName}}'); + + return { + c, + ns, + }; + }, + render() { + return
插件示例
; + }, +}); diff --git a/packages/core/src/create-plugin/template/platform/tree_render/tsconfig.json b/packages/core/src/create-plugin/template/platform/tree_render/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..ba8f48be2a612227b3b2cd44668c26316fa3dd4b --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/tree_render/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Node", + "strict": true, + "jsx": "preserve", + "jsxImportSource": "vue", + "sourceMap": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ESNext", "DOM"], + "skipLibCheck": true + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/packages/core/src/create-plugin/template/platform/tree_render/tsconfig.node.json b/packages/core/src/create-plugin/template/platform/tree_render/tsconfig.node.json new file mode 100644 index 0000000000000000000000000000000000000000..9d31e2aed93c876bc048cf2f863cb2a847c901e8 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/tree_render/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/core/src/create-plugin/template/platform/tree_render/vite.config.ts b/packages/core/src/create-plugin/template/platform/tree_render/vite.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..fc3449a5a42babd06efbe73c42acd8989ffb91fc --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/tree_render/vite.config.ts @@ -0,0 +1,57 @@ +import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import libLegacy from '@qx-chitanda/vite-plugin-lib-legacy'; +import dts from 'vite-plugin-dts'; +import libCss from 'vite-plugin-libcss'; +// https://vitejs.dev/config/ +export default defineConfig({ + build: { + lib: { + entry: './src/index.ts', + fileName: format => `index.${format}.js`, + }, + rollupOptions: { + external: [ + '@ibiz-template/core', + '@ibiz-template/model-helper', + '@ibiz-template/runtime', + '@ibiz-template/theme', + '@ibiz-template/vue3-util', + '@ibiz/dynamic-model-api', + '@floating-ui/dom', + 'async-validator', + 'axios', + 'dayjs', + 'element-plus', + 'lodash-es', + 'pluralize', + 'qs', + 'qx-util', + 'ramda', + 'vue', + 'vue-router', + 'vuedraggable', + ], + }, + }, + css: { + preprocessorOptions: { + scss: { + additionalData: '@import "@ibiz-template/theme/style/global.scss";', + }, + }, + }, + plugins: [ + // eslint({ + // include: 'src/**/*.{ts,tsx,js,jsx}', + // }), + vue(), + vueJsx(), + libLegacy(), + libCss(), + dts({ + outDir: 'dist/types', + }), + ], +}); diff --git a/packages/core/src/create-plugin/template/platform/uilogicnode/.eslintrc.cjs b/packages/core/src/create-plugin/template/platform/uilogicnode/.eslintrc.cjs new file mode 100644 index 0000000000000000000000000000000000000000..c6e5a1dd5b2fa946548b00254225469f2f15bee9 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/uilogicnode/.eslintrc.cjs @@ -0,0 +1,52 @@ +module.exports = { + root: true, + env: { + browser: true, + es2021: true, + }, + extends: ['airbnb-base', 'prettier', 'plugin:@typescript-eslint/recommended'], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + plugins: ['prettier', '@typescript-eslint', 'unused-imports'], + rules: { + 'prettier/prettier': 'error', + 'arrow-body-style': 'off', + 'prefer-arrow-callback': 'off', + 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-new': [0], + 'no-continue': [0], + '@typescript-eslint/no-empty-interface': 'off', + 'no-use-before-define': [0], + 'no-restricted-syntax': [0], + 'no-empty-function': [0], + 'no-useless-constructor': [0], // 禁止空的构造函数 + 'no-param-reassign': [0], // 禁止修改传入函数的参数 + 'no-underscore-dangle': [0], // 禁止使用下划线开头的变量名 + 'no-plusplus': ['error', { allowForLoopAfterthoughts: true }], // 禁止使用 ++,-- + 'consistent-return': [0], // 函数可以有不同类型返回值 + 'class-methods-use-this': [0], // 方法内未使用此方法时,强制定义为静态方法 + 'import/prefer-default-export': [0], // 一个模块只能有默认导出,不可以有多个导出 + 'import/no-unresolved': [0], // 不允许未解决的模块 + 'import/extensions': [0], // 不允许导入文件时不带后缀 + 'unused-imports/no-unused-imports': 'error', + '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], + '@typescript-eslint/no-inferrable-types': [0], + '@typescript-eslint/no-non-null-assertion': [0], + '@typescript-eslint/no-explicit-any': ['error'], + '@typescript-eslint/explicit-function-return-type': 'error', // 要求函数和类方法的显式返回类型 + '@typescript-eslint/explicit-module-boundary-types': 'error', // 要求导出函数和类的公共类方法的显式返回和参数类型 + 'import/no-extraneous-dependencies': [ + 0, + { + devDependencies: true, + peerDependencies: true, + // optionalDependencies: true, + // bundledDependencies: true + }, + ], + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/uilogicnode/CHANGELOG.md b/packages/core/src/create-plugin/template/platform/uilogicnode/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..8ac8e7f05d173977a1ad060d18e7f0b6a5f23cf5 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/uilogicnode/CHANGELOG.md @@ -0,0 +1,3 @@ +# 版本变更日志 + +添加变更日志 \ No newline at end of file diff --git a/packages/core/src/create-plugin/template/platform/uilogicnode/README.md b/packages/core/src/create-plugin/template/platform/uilogicnode/README.md new file mode 100644 index 0000000000000000000000000000000000000000..db63cff66640f7c8ba65a946669d40495a91a3fd --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/uilogicnode/README.md @@ -0,0 +1,60 @@ +# 界面逻辑节点插件 + +界面逻辑节点插件可自定义界面处理逻辑,当标准逻辑无法满足要求时,可以通过界面逻辑节点插件来实现。modeling建模平台创建界面逻辑节点插件可参见 [插件开发](https://open.ibizlab.cn/apphub/zh/guide/plugin-dev.html) + +## 插件结构 + +``` +|─ ─ {{pluginName}} 界面逻辑节点插件顶层目录 + |─ ─ src 界面逻辑节点插件源代码目录 +​ |─ ─ {{pluginName}}.provider.ts 界面逻辑节点插件适配器 +​ |─ ─ index.ts 界面逻辑节点插件入口文件 +``` + +- 界面逻辑节点插件入口文件 + +界面逻辑节点插件入口文件会全局注册界面逻辑节点插件适配器,供外部使用。 + +- 界面逻辑节点插件适配器 + +界面逻辑节点插件适配器主要通过实现exec方法去自定义界面逻辑节点执行逻辑。 + +## 本地开发 + +1. 安装依赖并link至全局 + +```sh +// 安装依赖 +pnpm i + +// link底包 +./scripts/link.sh + +// 启动 +pnpm dev + +// link到全局 +pnpm link --global +``` + +2. 主项目包中引用插件 + +```sh +// link插件 +pnpm link --global '{{pluginGroup}}/{{pluginName}}' +``` + +3. 主项目包中注册插件 + +```ts +import { App } from 'vue'; +import {{ pascalCasePluginName }} from '{{pluginGroup}}/{{pluginName}}' + +export default { + install(app: App) { + app.use({{ pascalCasePluginName }}); + // 设置本地开发需要忽略加载的插件,可填写正则或全匹配字符串。匹配插件在modeling建模平台配置的[运行时插件仓库配置]内容 + ibiz.plugin.setDevIgnore(/^{{pluginGroup}}\/{{pluginName}}/); + }, +}; +``` diff --git a/packages/core/src/create-plugin/template/platform/uilogicnode/package.json b/packages/core/src/create-plugin/template/platform/uilogicnode/package.json new file mode 100644 index 0000000000000000000000000000000000000000..526db31b8430b973184cd5e8a7416fd394369d62 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/uilogicnode/package.json @@ -0,0 +1,106 @@ +{ + "name": "{{pluginGroup}}/{{pluginName}}", + "version": "0.0.1", + "description": "{{pluginDescription}}", + "author": "tony001", + "license": "MIT", + "type": "module", + "main": "dist/index.es.js", + "module": "dist/index.es.js", + "types": "dist/types/index.d.ts", + "system": "dist/index.legacy.js", + "styles": [ + "dist/style.css" + ], + "files": [ + "dist", + "public", + "CHANGELOG.md", + "README.md" + ], + "publishConfig": { + "registry": "https://registry.npmjs.org/" + }, + "scripts": { + "dev": "vite build --watch", + "build": "vue-tsc --noEmit && vite build", + "preview": "vite preview" + }, + "devDependencies": { + "@floating-ui/dom": "^1.5.3", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "@qx-chitanda/vite-plugin-lib-legacy": "^4.1.1", + "@types/lodash-es": "^4.17.12", + "@types/ramda": "^0.29.6", + "@typescript-eslint/eslint-plugin": "^6.11.0", + "@typescript-eslint/parser": "^6.11.0", + "@vitejs/plugin-vue": "^4.4.1", + "@vitejs/plugin-vue-jsx": "^3.0.2", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "eslint": "^8.53.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-prettier": "^5.0.1", + "eslint-plugin-unused-imports": "^3.0.0", + "eslint-plugin-vue": "^9.18.1", + "husky": "^8.0.3", + "lerna": "^8.0.0", + "lint-staged": "^15.1.0", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "postcss": "^8.4.31", + "prettier": "^3.1.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "rollup-plugin-visualizer": "^5.9.2", + "sass": "1.69.5", + "stylelint": "15.11.0", + "stylelint-config-prettier": "^9.0.5", + "stylelint-config-recess-order": "^4.3.0", + "stylelint-config-standard": "^34.0.0", + "stylelint-config-standard-scss": "^11.1.0", + "stylelint-scss": "5.3.1", + "terser": "^5.24.0", + "typescript": "5.2.2", + "vite": "^4.5.0", + "vite-plugin-dts": "^3.6.3", + "vite-plugin-eslint": "^1.8.1", + "vite-plugin-libcss": "^1.1.1", + "vue": "^3.3.8", + "vue-eslint-parser": "^9.3.2", + "vue-router": "^4.2.5", + "vue-tsc": "1.8.22", + "vuedraggable": "^4.1.0" + }, + "peerDependencies": { + "@floating-ui/dom": "^1.5.1", + "@ibiz-template/core": "^0.7.40-alpha.7", + "@ibiz-template/model-helper": "^0.7.40-alpha.8", + "@ibiz-template/runtime": "^0.7.40-alpha.8", + "@ibiz-template/theme": "^0.7.39", + "@ibiz-template/vue3-util": "^0.7.40-alpha.8", + "@ibiz/model-core": "^0.1.72", + "async-validator": "^4.2.5", + "axios": "^1.6.2", + "dayjs": "^1.11.10", + "element-plus": "^2.4.2", + "lodash-es": "^4.17.21", + "pluralize": "^8.0.0", + "qs": "^6.11.2", + "qx-util": "^0.4.8", + "ramda": "^0.29.1", + "vue": "^3.3.8", + "vue-router": "^4.2.5", + "vuedraggable": "^4.1.0" + } +} diff --git a/packages/core/src/create-plugin/template/platform/uilogicnode/scripts/link.sh b/packages/core/src/create-plugin/template/platform/uilogicnode/scripts/link.sh new file mode 100755 index 0000000000000000000000000000000000000000..d4edc1556f72a02300c491cda3c13a7ff34795a7 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/uilogicnode/scripts/link.sh @@ -0,0 +1,6 @@ +pnpm link --global "@ibiz-template/vue3-util" +pnpm link --global "@ibiz-template/model-helper" +pnpm link --global "@ibiz-template/runtime" +pnpm link --global "@ibiz-template/core" +pnpm link --global "@ibiz-template/theme" +pnpm link --global "@ibiz-template/vue3-components" diff --git a/packages/core/src/create-plugin/template/platform/uilogicnode/src/index.ts b/packages/core/src/create-plugin/template/platform/uilogicnode/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..f3e4c391cae90cce46bd8e980fbb59dc105d1fa5 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/uilogicnode/src/index.ts @@ -0,0 +1,13 @@ +import { App } from 'vue'; +import { registerUILogicNodeProvider } from '@ibiz-template/runtime'; +import { {{ pascalCasePluginName }}Provider } from './{{pluginName}}.provider'; + +export default { + install(_app: App) { + // 全局注册界面逻辑节点插件适配器,UILOGICNODE是插件类型,{{pluginId}}是插件标识 + registerUILogicNodeProvider( + 'UILOGICNODE_{{pluginId}}', + () => new {{ pascalCasePluginName }}Provider(), + ); + }, +}; diff --git a/packages/core/src/create-plugin/template/platform/uilogicnode/src/{{pluginName}}.provider.ts b/packages/core/src/create-plugin/template/platform/uilogicnode/src/{{pluginName}}.provider.ts new file mode 100644 index 0000000000000000000000000000000000000000..5ae5277ea8f0ffeb599a7c0260f0a8c730f8654b --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/uilogicnode/src/{{pluginName}}.provider.ts @@ -0,0 +1,8 @@ +import { IUILogicContext, IUILogicNodeProvider } from '@ibiz-template/runtime'; +import { IDEUIPFPluginLogic } from '@ibiz/model-core'; + +export class {{ pascalCasePluginName }}Provider implements IUILogicNodeProvider { + async exec(model: IDEUIPFPluginLogic, ctx: IUILogicContext): Promise { + // 执行逻辑 + } +} diff --git a/packages/core/src/create-plugin/template/platform/uilogicnode/tsconfig.json b/packages/core/src/create-plugin/template/platform/uilogicnode/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..ba8f48be2a612227b3b2cd44668c26316fa3dd4b --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/uilogicnode/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Node", + "strict": true, + "jsx": "preserve", + "jsxImportSource": "vue", + "sourceMap": true, + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ESNext", "DOM"], + "skipLibCheck": true + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/packages/core/src/create-plugin/template/platform/uilogicnode/tsconfig.node.json b/packages/core/src/create-plugin/template/platform/uilogicnode/tsconfig.node.json new file mode 100644 index 0000000000000000000000000000000000000000..9d31e2aed93c876bc048cf2f863cb2a847c901e8 --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/uilogicnode/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/core/src/create-plugin/template/platform/uilogicnode/vite.config.ts b/packages/core/src/create-plugin/template/platform/uilogicnode/vite.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..fc3449a5a42babd06efbe73c42acd8989ffb91fc --- /dev/null +++ b/packages/core/src/create-plugin/template/platform/uilogicnode/vite.config.ts @@ -0,0 +1,57 @@ +import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import libLegacy from '@qx-chitanda/vite-plugin-lib-legacy'; +import dts from 'vite-plugin-dts'; +import libCss from 'vite-plugin-libcss'; +// https://vitejs.dev/config/ +export default defineConfig({ + build: { + lib: { + entry: './src/index.ts', + fileName: format => `index.${format}.js`, + }, + rollupOptions: { + external: [ + '@ibiz-template/core', + '@ibiz-template/model-helper', + '@ibiz-template/runtime', + '@ibiz-template/theme', + '@ibiz-template/vue3-util', + '@ibiz/dynamic-model-api', + '@floating-ui/dom', + 'async-validator', + 'axios', + 'dayjs', + 'element-plus', + 'lodash-es', + 'pluralize', + 'qs', + 'qx-util', + 'ramda', + 'vue', + 'vue-router', + 'vuedraggable', + ], + }, + }, + css: { + preprocessorOptions: { + scss: { + additionalData: '@import "@ibiz-template/theme/style/global.scss";', + }, + }, + }, + plugins: [ + // eslint({ + // include: 'src/**/*.{ts,tsx,js,jsx}', + // }), + vue(), + vueJsx(), + libLegacy(), + libCss(), + dts({ + outDir: 'dist/types', + }), + ], +});