Giao diện
@digiforce-nc/plugin-multi-space
Plugin Multi Space — cho phép phân chia dữ liệu thành nhiều không gian (Space) riêng biệt trong cùng một ứng dụng. Người dùng có thể chuyển đổi space và xem dữ liệu theo phạm vi space được chọn.
Plugin này làm gì?
Trong nhiều tổ chức, dữ liệu cần được phân tách theo phòng ban, chi nhánh, hoặc dự án. Plugin Multi Space giúp:
- Tạo và quản lý space — mỗi space là một ngữ cảnh dữ liệu riêng.
- Chuyển đổi space — người dùng chọn space đang làm việc qua giao diện.
- Lọc dữ liệu theo space — tất cả các API request tự động gắn header
x-spacesđể server lọc record. - Xem liên space — có thể chọn nhiều space để xem dữ liệu tổng hợp.
Kiến trúc client
SpaceProvider
SpaceProvider bọc toàn bộ ứng dụng, thực hiện:
- Gọi
spaces:mylấy danh sách space mà user thuộc về. - Đọc space mặc định từ server (hoặc fallback từ
localStorage). - Gắn header
x-spacesvàx-spaces-viewvào mọi API request. - Expose context (
SpaceContext) cho các component con. - Đăng ký thuộc tính
spacevàouiCore.context— cho phép widget/query service truy cập space hiện tại.
SwitchSpace
SwitchSpace là mục đổi space nhanh trong menu cài đặt block (schema settings). Nếu tài khoản chưa được gán space nào (danh sách space trống), mục này sẽ không hiện. Khi đã thuộc ít nhất một space, bạn dùng mục này để chuyển ngữ cảnh làm việc.
SpaceSelector
SpaceSelector là giao diện đầy đủ hơn (dùng trong settings page), cho phép:
- Chọn space đang làm việc (current space).
- Chọn nhiều space để xem dữ liệu (viewed spaces).
API
| Endpoint | Method | Mô tả |
|---|---|---|
spaces:my | GET | Danh sách space của user hiện tại |
spaces:setDefaultSpace | POST | Đặt space mặc định + danh sách space xem được |
Headers tự động
Khi đã chọn space, mọi request đều gắn:
| Header | Mô tả |
|---|---|
x-spaces | Tên space đang làm việc (VD: s_abc123) |
x-spaces-view | Danh sách space đang xem, phân cách bằng dấu phẩy |
Server middleware đọc các header này để lọc record theo space tương ứng.
UiCore context integration
Plugin đăng ký thuộc tính space vào uiCore.context:
typescript
uiCore.context.defineProperty('space', {
get: () => ({
selected: /* space đang chọn */,
viewable: /* danh sách space đang xem */,
}),
cache: false,
meta: {
type: 'object',
title: 'Current space',
properties: {
selected: { type: 'string', title: 'Selected space' },
viewable: { type: 'array', title: 'Viewable spaces' },
},
},
});Nhờ đó, widget và query service có thể dùng biến ctx.space.selected / ctx.space.viewable trong filter hoặc template.