Bỏ qua, đến nội dung

@digiforce-nc/plugin-ui-core

Plugin UI Core engine — quản lý widget tree, xử lý biến template, cung cấp query service cho giao diện động, và UI Builder API để xây dựng giao diện programmatically.

Plugin này làm gì?

Nếu plugin-ui-schema-storage lưu cấu trúc giao diện, thì plugin-ui-corebộ máy vận hành — nó biết cách đọc widget schema, resolve biến template thành giá trị thực, chạy query để lấy dữ liệu hiển thị, và cung cấp UI Builder để AI agent hoặc automation tạo/sửa giao diện qua API. Bốn thành phần này phối hợp tạo nên hệ thống giao diện động hoàn chỉnh.

Bốn nhiệm vụ chính

#Nhiệm vụChi tiết
1Widget managementCRUD uiWidgets, duplicate, attach vào parent, move, mutate batch
2Variables resolutionResolve biến template (cú pháp mustache) thành giá trị thực tế
3Query serviceChạy query dữ liệu, lưu query tái sử dụng, data binding cho widget
4UI BuilderAPI programmatic để tạo page, tab, block, field, action — phục vụ AI agent và automation

Kiến trúc — luồng render widget

API endpoints

Widget resource

EndpointMô tả
uiWidgets:findOneLấy widget theo UID
uiWidgets:schemaLấy schema đơn lẻ của widget
uiWidgets:schemasLấy nhiều schema cùng lúc
uiWidgets:schemaBundleBundle schema + toàn bộ descendants
uiWidgets:saveLưu widget (tạo mới hoặc cập nhật)
uiWidgets:duplicateNhân bản widget kèm descendants
uiWidgets:attachGắn widget vào parent tại vị trí chỉ định
uiWidgets:moveDi chuyển widget sang parent khác
uiWidgets:destroyXóa widget kèm descendants
uiWidgets:mutateThực hiện batch operations trên nhiều widget

Variables

EndpointMô tả
variables:resolveResolve biến template — nhận danh sách biến dạng path (VD: ctx.currentUser.id), trả về giá trị tương ứng

Lưu ý: Cú pháp biến sử dụng dạng mustache — tên biến được bao trong cặp ngoặc nhọn kép. Tuy nhiên, plugin thực tế nhận path string qua API, không parse template phía server.

Query service

EndpointMô tả
queryService:runChạy query trực tiếp (truyền SQL/filter)
queryService:runByIdChạy query đã lưu theo ID
queryService:saveLưu query để tái sử dụng
queryService:getBindLấy data binding — ánh xạ giữa query result và widget field

Database — 3 bảng chính

BảngChứa gìVí dụ
uiWidgetsWidget definitions (uid, type, options JSON){ uid: 'w1', type: 'table', options: {...} }
uiWidgetTreePathQuan hệ cây widget (closure table){ ancestor: 'w1', descendant: 'w2', depth: 1 }
queryServiceQuery đã lưu (uid, dataSourceKey, sql){ uid: 'q1', sql: 'SELECT * FROM orders' }

UI Builder API (mới)

Module ui-builder/ cung cấp API xây dựng giao diện programmatically — phù hợp cho AI agent, script tự động, hoặc tool migration.

Kiến trúc UI Builder

30+ Actions

NhómActionsMô tả
Readcatalog, context, getLiệt kê widget types, đọc context variables, lấy UI hiện tại
PagecreatePage, destroyPageTạo/xóa trang
TabaddTab, updateTab, moveTab, removeTabQuản lý tab trong trang
Popup TabaddPopupTab, updatePopupTab, movePopupTab, removePopupTabTab trong popup/drawer
BlockaddBlock, addBlocksThêm block (table, form, chart...) vào trang
FieldaddField, addFieldsThêm field vào block
ActionaddAction, addActions, addRecordAction, addRecordActionsThêm action buttons
SettingsupdateSettings, setEventFlows, setLayoutCập nhật cấu hình widget
LayoutmoveNode, removeNodeDi chuyển/xóa node
MenucreateMenu, updateMenuQuản lý menu navigation
Batchcompose, configure, apply, mutateOperations phức hợp, atomic batch

Ví dụ: Tạo table block bằng API

typescript
// Thêm table block hiển thị collection "orders" vào page
await agent.resource('uiBuilder').addBlock({
  values: {
    target: { uid: 'page-grid-uid' },
    use: 'TableBlockWidget',
    resource: {
      binding: 'currentCollection',
      collectionName: 'orders',
    },
  },
});

// Thêm fields vào block vừa tạo
await agent.resource('uiBuilder').addFields({
  values: {
    target: { uid: 'table-block-uid' },
    fields: ['title', 'amount', 'status', 'createdAt'],
  },
});

Catalog — widget type registry

uiBuilder:catalog trả về danh sách widget types khả dụng kèm metadata:

typescript
const { data } = await agent.resource('uiBuilder').catalog({
  values: { kind: 'block' },
});
// → [{ key: 'table', use: 'TableBlockWidget', kind: 'block',
//      editableDomains: ['props', 'stepParams'], ... }]

Mỗi catalog item chứa: key, label, use (widget class name), kind, scope, editableDomains, settingsSchema, configureOptions, resourceBindings, eventCapabilities.

Mutate — atomic batch operations

uiBuilder:mutate cho phép gộp nhiều operations vào 1 transaction:

typescript
await agent.resource('uiBuilder').mutate({
  values: {
    atomic: true,
    ops: [
      { type: 'addBlock', target: { uid: 'grid-1' }, values: { use: 'FormBlockWidget', ... } },
      { type: 'addField', target: { uid: '$ref:op-0' }, values: { field: 'email' } },
      { type: 'updateSettings', target: { uid: '$ref:op-0' }, values: { title: 'Thêm người dùng' } },
    ],
  },
});

Thành phần chính phía server

Thành phầnMô tả
UiWidgetRepositoryRepository xử lý CRUD widget + tree operations
UiWidgetSchemaServiceService resolve schema bundle, xử lý inheritance
Widget Schema RegistryRegistry đăng ký widget type mới từ plugin khác
VariablesServiceService resolve biến template thành giá trị
QueryServiceManagerQuản lý query execution và caching
UiBuilderServiceService chính của UI Builder — catalog, compose, mutate, context

Dependencies

PackageVai trò
@digiforce-nc/databaseDatabase ORM (peer)
@digiforce-nc/serverServer framework (peer)
@digiforce-nc/clientClient framework (peer)
@digiforce-nc/plugin-localizationLocalization cho widget labels

Xem thêm

  • Sao chép cấu trúc menu / trang / widget ra file và nạp lại — hướng dẫn lệnh digiforce schema (export và import) trong tài liệu CLI.

Mục lục chi tiết

  • Kiến trúc — Widget repository, schema service, variable resolution, query service
  • API reference — uiWidgets resource, variables:resolve, queryService
  • Database schema — ER diagram, closure table, 3 bảng
  • FAQ — Câu hỏi thường gặp