ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

NocoBase 批量编辑操作详解:@nocobase/plugin-action-bulk-edit 的原理与源码实现

NocoBase 批量编辑操作详解:@nocobase/plugin-action-bulk-edit 的原理与源码实现 NocoBase 批量编辑操作详解nocobase/plugin-action-bulk-edit 的原理与源码实现【免费下载链接】nocobaseNocoBase is an open-source AI no-code platform for building business systems fast. Instead of generating everything from scratch, AI works on top of production-proven infrastructure and a WYSIWYG no-code interface, so you get both speed and reliability.项目地址: https://gitcode.com/GitHub_Trending/no/nocobase本文以 NocoBase 内置插件nocobase/plugin-action-bulk-edit为核心讲解“操作批量编辑”这一功能的使用方式、完整配置项以及它在客户端如何构造更新条件、最终调用updateAPI 一次性修改多条记录的实现链路。读完后你将能够熟练地在表格/甘特图/地图数据块上配置批量编辑操作并从源码层面理解“选中更新”与“全表更新”两种模式背后的过滤器构造逻辑。一、插件概览批量编辑是什么批量编辑Bulk edit是 NocoBase 面向列表数据的一块标准操作在表格、甘特图或地图数据块上添加该操作后用户点击按钮即可弹出一个可自由编排字段的表单填写一次赋值内容然后一次性应用到全部数据或当前选中的记录上。官方文档对该插件的概括就是一句话“对全部数据或选中的数据进行批量编辑”插件文档。从 package.json 与文档 frontmatter 可以确认该插件的关键属性属性取值说明包名nocobase/plugin-action-bulk-edit当前仓库版本 2.2.13displayName操作批量编辑 / Action: Batch edit中文/英文显示名builtIntrue内置插件isFreetrueeditionLevel: 0免费Free 版本可用defaultEnabledfalse不默认启用需在插件管理页中安装/启用supportedVersions1.x、2.x兼容 1.x 与 2.x 两个大版本二、给数据块添加“批量编辑”操作插件的客户端入口是 PluginActionBulkEditClient。在load()中它通过schemaInitializerManager.addItem把批量编辑操作注册到了三类数据块的“操作”配置区this.app.schemaInitializerManager.addItem(table:configureActions, customize.bulkEdit, initializerData); this.app.schemaInitializerManager.addItem(gantt:configureActions, customize.bulkEdit, initializerData); this.app.schemaInitializerManager.addItem(map:configureActions, customize.bulkEdit, initializerData);也就是说表格table、甘特图gantt、地图map三种数据块在配置模式下都能从“添加操作”菜单中找到“批量编辑”。注册时传入的初始 schema 还声明了该操作的元信息x-action: customize:bulkEdit标识为可自定义的批量编辑操作x-decorator: BulkEditActionDecorator用装饰器组件包裹用于在运行时向操作注入批量编辑相关的上下文x-settings: actionSettings:bulkEdit设置面板见第四节x-acl-action: update且skipScopeCheck: true权限检查以update动作为准且跳过范围scope检查useVisible: () useActionAvailable(updateMany)从源码结构看该操作按钮的可见性由updateMany动作是否可用决定即只有具备批量更新能力的用户才看得到这个按钮。点击初始化器后BulkEditActionInitializer 会生成如下骨架 schema核心片段const schema { type: void, title: {{t(Bulk edit)}}, x-component: Action, x-action: customize:bulkEdit, x-action-settings: { updateMode: selected, // 默认“选中”模式 }, x-component-props: { openMode: defaultOpenMode, // 打开方式继承当前数据块的默认打开方式 icon: EditOutlined, }, properties: { drawer: { type: void, x-component: Action.Container, // 弹层容器 x-component-props: { className: nb-action-popup }, properties: { tabs: { x-component: Tabs, x-initializer: popup:addTab, x-initializer-props: { gridInitializer: popup:bulkEdit:addBlock, // 在 Tab 内可继续拖入数据块 }, // ……Grid 网格容器用于摆放批量编辑要赋值的字段 }, }, }, }, };可以看出批量编辑的弹窗是一个Tabs Grid结构默认updateMode为selected只更新选中记录图标为EditOutlined打开方式跟随数据块的默认打开模式。你可以在弹窗内的 Grid 中拖入任意字段组件每个字段代表“把哪些记录的某个字段统一改成什么值”。三、操作级设置项数据范围、打开方式等注册给actionSettings:bulkEdit的设置面板定义在 BulkEditAction.Settings.tsx包含以下配置项设置项组件作用编辑按钮editButtonActionDesigner.ButtonEditor修改按钮文字、图标、颜色、显示形态文字/图标/仅图标联动规则linkageRulesSchemaSettingsLinkageRules配置该按钮与其他按钮/字段之间的显示隐藏联动打开方式openModeSchemaInitializerOpenModeSchemaItems弹层、新页面、同页打开等源码中仅对create/update/view/customize:popup/duplicate/customize:create类弹层操作保留该选项更新的数据updateModeUpdateMode核心配置选择本次批量编辑作用于“选中”记录还是“全表”数据删除操作removeSchemaSettingsRemove删除该操作带“Delete action”二次确认其中“更新的数据”选项UpdateMode 组件只有两个取值写入x-action-settings.updateModeselected仅更新选中记录中文文案“选中”all更新全表中文文案“全表”对应 zh-CN.json 中Entire collection: 全表。选择变化后会通过dn.emit(patch)更新 schema 并刷新设计器保证配置即时生效。四、提交按钮设置二次确认与成功后的行为批量编辑表单底部的“提交”按钮使用另一套设置面板actionSettings:bulkEditSubmitbulkEditFormSubmitActionSettings它比操作级设置多了三个与批量操作强相关的配置设置项组件说明编辑按钮ActionDesigner.ButtonEditor提交按钮的文字/样式二次确认secondConfirmationSecondConFirm提交前弹出确认中文文案为“确定要执行批量编辑操作吗”成功提交后afterSuccessfulSubmissionAfterSuccess配置保存成功后的跳转/关闭行为刷新数据块请求refreshDataBlockRequestRefreshDataBlockRequest提交后是否自动刷新外层数据块参数isPopupAction: true联动规则 / 删除操作—与操作级设置一致对于“批量改数据”这种高影响操作建议开启二次确认避免误触。五、提交时的底层实现一次 update 请求完成批量修改真正执行批量修改的逻辑在 client-v2 的 submitHandler.ts其执行链路非常清晰表单校验与取值blockModel.form.validateFields()校验通过后getFieldsValue(true)取出全部赋值字段的值读取更新模式从 flow 模型的bulkEditSettings/editMode参数取出updateMode缺省为selected构造更新范围filterselected模式取数据块当前选中的行用集合的主键getPrimaryKey()/filterTargetKey缺省id映射出主键数组构造过滤器{ $and: [{ [filterKey]: { $in: ids } }] }若没有选中任何记录则提示“请选择要编辑的记录”并终止all模式updateData.filter collectionModel?.resource.getFilter()。从源码看全表模式取的是数据块当前的过滤器条件即“该数据块当前能展示出的全部数据”而不是无条件扫库发起单个 update 请求await ctx.api .resource(collection.name, null, { x-data-source: collection?.dataSourceKey, // 支持外部数据源集合 }) .update({ filter: updateData.filter, values: updateData.values, ... });即批量编辑并不是逐条调用updateByPk而是一次带filter的update请求由数据层Sequelize 等翻译成一条批量 UPDATE。若走到无 filter 分支则会附加forceUpdate: true。保存成功后提示“保存成功”并调用resetUserModifiedFields()清理表单状态。这里也体现了一个实现事实服务端插件 仅是一个空的占位类export class PluginActionBulkEditServer extends Plugin {}不注册任何自定义 API 或数据模型——批量编辑完全复用 NocoBase 通用的资源update接口插件只负责前端表单编排与过滤器构造。六、双端实现与测试佐证该插件同时维护了两套客户端实现方便读者按需深入client旧版 Designable 体系BulkEditActionInitializer、BulkEditFieldcomponent/BulkEditField.tsx等配套 e2e 用例 popup.test.ts、refresh.test.ts、schemaSettings.test.ts、schemaInitailizer.test.ts分别覆盖弹窗行为、刷新、设置面板与 schema 初始化client-v2Flow 引擎体系以 models 目录 下的BulkEditActionModel、BulkEditFieldModel、BulkEditFormModel、BulkEditFormSubmitActionModel等模型描述整个操作提交走 submitHandler.ts并有 BulkEditFieldV2.test.tsx、submitHandler.test.ts、BulkEditFlowModels.test.ts 等单测覆盖提交与模型行为。多语言文案集中在 src/locale 目录含 zh-CN、en-US、ja-JP 等 17 种语言如“不更新 / Remains the same”“修改为 / Changed to”“清空 / Clear”等字段赋值提示均可在该目录中查证。七、使用建议与小结插件不默认启用defaultEnabled: false需先在插件管理中启用nocobase/plugin-action-bulk-edit在表格/甘特图/地图数据块上添加该操作后先在弹窗内拖入需要统一修改的字段默认更新范围为“选中”记录适合逐批处理需要一次性改全量时再切换为“全表”并务必开启二次确认权限侧从源码看以update动作 updateMany可用性作为显示门槛配置权限时可为相应角色单独控制该能力批量编辑走的是通用update接口一次请求 filter因此对主库与外部数据源集合同样适用。主要参考路径插件文档、客户端入口、操作设置、提交处理、服务端插件。【免费下载链接】nocobaseNocoBase is an open-source AI no-code platform for building business systems fast. Instead of generating everything from scratch, AI works on top of production-proven infrastructure and a WYSIWYG no-code interface, so you get both speed and reliability.项目地址: https://gitcode.com/GitHub_Trending/no/nocobase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表