Giao diện
Kiến trúc Client
Client Digiforce là SPA React dùng @digiforce-nc/client. Trang này mô tả cấu trúc bên trong client, hệ thống manager, provider chain, và cách plugin client hoạt động. Đọc trước Tổng quan hệ thống để nắm boundary.
1) Application - trung tâm client
2) Constructor flow
Khi tạo Application, các bước chính theo thứ tự:
- RequireJS - init hoặc reuse
window.requirejs; binddefineGlobalDeps. - Reactive state -
loading,maintaining,error,maintained. - APIClient - tạo axios wrapper, gắn
apiClient.app = this. - Managers -
RouterManager→SchemaSettingsManager→PluginManager→SchemaInitializerManager→DataSourceManager. - UI core -
uiCore+ registerApplicationWidget. - Providers -
addDefaultProviders()+addReactRouterComponents()+ user providers. - WebSocketClient - kết nối realtime.
- PluginSettingsManager - màn cấu hình plugin trong admin.
- Listeners - token sync, maintaining end, i18n language change.
3) Provider chain
addDefaultProviders() xây chuỗi React context bao bọc toàn app:
Plugin thêm provider bằng app.addProviders(...) - sẽ được nối vào cuối chuỗi.
Context keys chính: app, routeRepository, appInfo, api, i18n, router, documentTitle, route, location, pageInfo.
4) RouterManager - route tree động
RouterManager cho phép route key dạng dot-path (admin.settings.acl) và build thành tree route React Router.
- Plugin thêm route:
app.router.add('admin.myPlugin', { path: '/admin/my-plugin', Component }). - Route tree resolve thành nested React Router config khi
mount(). - Hỗ trợ
element,Component, lazy import.
5) PluginManager (client)
Hai nguồn plugin:
Static plugins
Bundle sẵn, truyền vào _plugins khi tạo PluginManager. Luôn đi qua initStaticPlugins → add() → afterAdd().
Remote plugins
Khi loadRemotePlugins === true:
- Client gọi API
pm:listEnabled. getPlugins()tải bundle (requirejs hoặc dynamic import).- Mỗi plugin:
add(pluginClass, info)→afterAdd().
Load sequence
Lỗi trong pm.load() hoặc uiConfig.load() → LOAD_ERROR hiển thị trong UI.
6) Schema system
SchemaSettingsManager
Đăng ký mục settings cho block/field - hiển thị menu cấu hình trong UI builder. Plugin gọi schemaSettingsManager.addItem(name, config).
SchemaInitializerManager
Đăng ký mục initializer - nút "Thêm block / action" trong UI builder. Plugin gọi schemaInitializerManager.add(name, config).
UI Schema Renderer
UI Schema là JSON mô tả cây component. Renderer đọc schema → resolve component từ component map → render React tree. Schema lưu trong database, thay đổi runtime không cần rebuild.
7) DataSourceManager (client)
Namespace client, khác DataSourceManager server.
- Quản lý metadata data source phía client.
- Chọn source cho từng request (gửi header
x-data-source). - Cung cấp collection metadata cho UI (field types, relations) - phục vụ form builder, filter, display.
8) Giao tiếp: APIClient + WebSocketClient
APIClient
- Wrapper axios; gắn token (bearer), base URL, interceptor.
- Plugin có thể thêm interceptor:
apiClient.axios.interceptors.request.use(...). - Các method:
request(),resource(name).action(params).
WebSocketClient
- Duy trì kết nối WS với server.
- Nhận trạng thái:
maintaining(bảo trì),notification,refresh. - Client auto hiển thị UI maintaining khi nhận signal.
9) Mount - render ứng dụng
Application.mount(containerOrSelector):
getRootComponent()- build component tree từ provider chain + router.createRoot(container).render(<Root />).
Application.getRootComponent():
- Wrap providers:
compose(this.providers). - Component gốc lắng nghe
loading/error/maintainingstate. - Khi
loading = false→ render router output.
Đọc tiếp
- Tổng quan hệ thống
- Server architecture
- Data model & metadata - Collection, UI Schema.
- Plugin architecture - lifecycle client chi tiết.
- Core: Client Application - deep dive code-level.