@asteby/metacore-运行时的反应
反应运行时间 元分数 师曰. 元数据驱动的 CRUD 层将一个表态转换成工作UI:动态表格,表态,动作调度器,槽扩展点,能力门,以及联合加载器.
这是一个 运行时间不是UI包 视觉原始人来自 @asteby/metacore-ui。主机通过 React 提供者输入 HTTP 客户端和(可选的)租户-分支上下文;不需要捆绑别名.
安装
pnpm add @asteby/metacore-runtime-react @asteby/metacore-sdk @asteby/metacore-ui
端点 : react, (中文(简体) ), react-dom, (中文(简体) ), react-i18next, (中文(简体) ), i18next, (中文(简体) ), @tanstack/react-router, (中文(简体) ), @tanstack/react-table, (中文(简体) ), date-fns, (中文(简体) ), lucide-react, (中文(简体) ), sonner, (中文(简体) ), zustand他们被宣布为同龄人 所以反应保持单人状态.
出口
| 导出 | 它会做什么 |
|---|---|
<DynamicTable model="…" /> | 元数据驱动 CRUD 表格 。 可排序,可分解,可过滤,可URL同步,并带有内置对话框. |
<DynamicForm fields={…} onSubmit={…} /> | 独立的窗体渲染器 ActionFieldDef[]。 。 。 . |
<DynamicRecordDialog /> | 创建/ 编辑/ 视图模式 /metadata/modal/<model>。 。 。 . |
<ActionModalDispatcher /> | 将自定义动作路径到其注册组件、通用窗体或确认对话框. |
<AddonLoader /> | 注入联邦 remoteEntry.js {\fn黑体\fs20\shad2\2ah82\3ah20\4ah33\fscx95\3ch592001\be1}然后叫替顿家来 register(api)。 。 。 . |
<Slot name="…" /> 编号 : slotRegistry | 命名由加词贡献的扩展点 . |
<CapabilityGate require="…" /> 编号 : <CapabilityProvider /> | 有条件的UI 根据能力. |
<NavigationBuilder /> 编号 : useNavigation() 编号 : mergeNavigation() | 将主机侧边栏与加通合并 manifest.navigation。 。 。 . |
<I18nProvider /> | 折叠 manifest.i18n 命名空间进入主机的 i18 次例. |
<ApiProvider client={axios} /> 编号 : useApi() | 输入主机的 HTTP 客户端 。 每个动态组件都需要. |
<BranchProvider branch={…} /> 编号 : useCurrentBranch() | 可选的租户部门背景. |
useMetadataCache() | 用于表格/模式元数据的Zustand存储器,持续到本地Storage. prefetchAll(api) 温暖它从 /metadata/all。 。 。 . |
defaultGetDynamicColumns 编号 : makeDefaultGetDynamicColumns(helpers) | 工厂 <DynamicTable> 用于将元数据转换为 TanStack 列 defs。 默认读取自 col.key (匹配内核合同). |
DynamicIcon | Lucide图标解析器 名称. |
<LicenseGate state={…} onActivate={…}> | 法语:enuelve la app; bloadea con un model-full-screen no descartable cuando la instancia falta/venció; degrada con bang en grace编号 :stale品牌意识. |
<LicenseExpiryBanner state={…} /> 编号 : <LicenseStatusBadge status={…} /> | Piezas sueltas del gate para Ajustes u otros lugares. 中国植物物种信息数据库. |
isLicenseOperable 编号 : isLicenseBlocking 编号 : isPresetEntitled 编号 : isTrialExpired | 帮助者发作 LicenseState, espejo de (法语) State.Operable()/Blocking() 德尔后端. |
<RealtimeProvider client={…} /> 编号 : useRealtime() 编号 : useRealtimeInvalidate() 编号 : useRealtimeStatus() 编号 : useRealtimeTick() | 死路一条 DATA_EVENT del 主机( ver) 实时) (中文(简体) ). |
Í科诺斯
<Icon name={value} /> (无) DynamicIcon{\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}你应该知道 { name, className }(中文(简体) )
解释a cualquier valor de ícono que un supend haya guardado. 中国植物物种信息数据库. 圣杯
对 parseIconSpec(value),una función pura que devuelve ,一个真菌pura que 德韦尔夫
{ kind: 'lucide', name } | { kind: 'emoji', value } | { kind: 'image', src } | { kind: 'unknown', raw }。 。 。 .
| 格式化 | 埃让普洛斯 | 结果 |
|---|---|---|
| 卢西德 | Brain, (中文(简体) ), credit-card, (中文(简体) ), credit_card, (中文(简体) ), BrainIcon | 格莱弗·卢西德 |
| 字体 5/6 | fas fa-brain, (中文(简体) ), fa-solid fa-brain, (中文(简体) ), far fa-heart, (中文(简体) ), fa fa-user-md, (中文(简体) ), fa-brain | glifo Lucide vía Tatala (英语) FONT_AWESOME_ALIASES + 卢西德河口公园 |
| Otras 引信 | mdi mdi-home, (中文(简体) ), bi bi-house, (中文(简体) ), ti ti-home, (中文(简体) ), ri-home-line, (中文(简体) ), mdi:home, (中文(简体) ), material-icons home | (原始内容存档于2012-10-10). Officialización contra Lucide (sin tabla) |
| 爱莫吉 | 🩺, (中文(简体) ), 👨⚕️, (中文(简体) ), 🇲🇽 | 非独活性血清Intl.Segmenter si 存在) |
| 图像 | https://…, (中文(简体) ), /ruta.png, (中文(简体) ), ./a.svg, (中文(简体) ), uploads/a.png, (中文(简体) ), data:image/(png|jpeg|webp|gif|svg+xml) | <img alt="" loading="lazy">爱的爱的爱的爱的爱的爱的爱的爱 |
| 奥特罗 | javascript:…, (中文(简体) ), data:text/html, SVG 内含,文本 libre | unknown: 无 se pinta texto crudo (nall o la prop) fallback(中文(简体) ) |
Lucide no incluye logos de marca (github, twitter...):拉斯·马尔卡斯(英语:las marcas (film))fab fa-github克丹语
unknown salvo que el host registre un resolutor. 中国植物物种信息数据库.
奥尔登·德·索罗西翁: (1) 宿主、研究者;
(原始内容存档于2018-10-21) (英语). el primerro que devuelve algo ditinto de null gana; (2) el parser integrado. 中国植物物种信息数据库.
import { registerIconResolver } from '@asteby/metacore-runtime-react'
// Al arrancar el host. Devuelve un IconSpec (reusa los renderers del SDK),
// un ReactNode (se pinta tal cual) o null para ceder.
const dispose = registerIconResolver((spec) =>
spec.startsWith('sprite:') ? <svg><use href={`/sprite.svg#${spec.slice(7)}`} /></svg> : null,
)
列数 : type: 'icon' una一栏的元数据
(tabla y detalle) (英语). Es 选入: una exto lamada icon 没有坎比亚。 粗略的轮廓
没有自已的主人 -。 。 。 .
DynamicIcon (menús, botones de acción) 没有pinta imágenes, solo glifos/emoji/nodos del host; para imágenes usa <Icon> o 栏a type: 'icon'。 。 。 .
答复: los íconos 儿子aria-hidden(salvo que se pase) (英语) label。 。 。 .
实时
埃尔主机 expone un RealtimeAPI (单位:千美元)@asteby/metacore-sdk)——以"以"为主"为主
host.realtime (原始内容存档于2013-10-12) (英语). las rutas inmersivas y como api.realtime (单位:千美元) register(api)。 。 。 .
失败帧子 org- scoped y 罪恶的活佛 (dentidad + qué llaves) (法语)
cambiaron); la reacción típica es "refetch lo que mestro". 维基语录链接:名人名言 - 文学作品 - 谚语 - 谚语 - 谚语 - 谚语 - 谚语 - 谚语.
// Host: montar una vez, dentro del QueryClientProvider y del provider de WS.
<RealtimeProvider client={realtimeClient}>…</RealtimeProvider>
// Addon federado: pasar el cliente explícito — el contexto React NO cruza la
// frontera de module federation, el objeto plano sí.
useRealtime({ models: ['SalesOrder'], client: host.realtime }, (e) => {
if (e.action === 'resync' || e.id === currentId) refetch()
})
// Invalidar react-query (usa SIEMPRE el QueryClient del host — nunca crees otro):
useRealtimeInvalidate({ models: ['SalesOrder', 'sales_order_items'], client: host.realtime })
// Tablas y kanbans: opt-in por prop (apagado por default).
<DynamicTable model="SalesOrder" realtime />
<DynamicKanban model="WorkOrder" realtime />
// …o global para todo lo que cuelgue del provider:
<RealtimeProvider client={realtimeClient} defaultRealtime>
useRealtimeInvalidate 无效的 toda 查询 cuya 密钥( 字符串, 阵列 anidao u)
objeto)为模范,拉塔布拉奥所提供 addon.Model 塔姆比昂区
una ruta (英语:/data/sales_orders?…) (中文(简体) ). (原始内容存档于2018-09-21) (英语). Se puede replazar el matcher con match。 。 。 .
Todos los hooks son no-op Cuando no hay cliente (host sin real time) (英语:Host sin real time). 托多斯·卢斯·卢斯(英语:Todos los hooks) 儿子·诺-奥·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·.
Blindaje de licencia (英语:LicenseGate(中文(简体) )
海关关卡 sDK小学: 业务和待办事宜 (原始内容存档于2013-10-12). en una línea. 负责官员:
- 内核 → 执行 (正文: está permitido; firma/verifica el estado).
- SDK 软件 (斯特·莫杜洛) • UX 密码 (门,旗,徽.
- 中枢 → 共和国 (英语:Mintea el sord Ed25519).
- 主机 → 线条 (续)
LicenseState(原始内容存档于2012-10-12). con su propio transporte y montan el gate.
英斯语 内核依赖性: 没有导入 su 客户端 ni fija su versión 。 埃尔主机
(原始内容存档于2018-10-21) (中文(简体) ). resuelve el estado (p. ej. GET /admin/license? y pasa una promesa ? ? ? ? ? ? ? ? ? ? ? ? ? onActivate。 。 。 .
import { LicenseGate } from '@asteby/metacore-runtime-react'
import { useLicenseState, useActivateLicense } from './features/license'
export function Shell({ children }) {
const { data: state } = useLicenseState() // GET /admin/license
const activate = useActivateLicense() // POST /admin/license/activate
return (
<LicenseGate
state={state}
onActivate={(code) => activate.mutateAsync(code)}
branding={{ name: brand.name, logo: brand.logo }}
onManage={() => navigate('/settings/license')}
>
{children}
</LicenseGate>
)
}
- 犯罪执法 o estado 可操作
valid编号 :stale编号 :grace儿童成长.stale编号 :grace蒙丹·德马斯·德格拉达多expired(c) 地方运输系统. - 执法
missing编号 :invalid编号 :expired• 模式 口号 行动公式.plan === 'trial'+ 键expired* 复制本 "Tu prueba gratuita terminó" (法语)。 。 。 . - 行动组织 罪孽重现: el host refresca el (英语:
state{\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}是的 德蒙塔门. - 盖多波罗尔 错误
canActivate(默认)true{\fn华文仿宋\fs16\1chd1d1d1}false{\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}我愿意为您效劳 罪状 劳动与劳动部readOnlyMessage(默认 : "语言学研究会"(Contacta al Administa de la plataforma para activar la licencia)) (中文(简体) ). Así solo el Platface Root/ Superadmin activa; as demás usuarios ven el boropeo con la indicación de quién contactar. 中国植物物种信息数据库.
国家妇女委员会OrgRuntimeProvider(中文(简体) )
(原始内容存档于2018-10-21) (英语). Enuelve la app autenticada una vez y todas las tablas, kanban, diálogos y 环境简介:
<OrgRuntimeProvider
timeZone={org.timezone} // 'America/Mexico_City' — fechas en la zona de la org
currency={org.currency_code} // 'MXN' — moneda por defecto
numberLocales={{ es: 'es-MX' }} // números y dinero como en México: 11,461.50 (no 11.461,50)
systemActor={{ name: 'Gobi', avatarUrl: '/brand/gobi.png' }} // quién aparece cuando "lo hizo el sistema"
>
<App />
</OrgRuntimeProvider>
numberLocales地方地图Intl(意大利语) {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}请说句名 Aplica a celdas (英语)number编号 :currency总计 馅饼,可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口可口 拉斯语Name 妇女委员会es编号 :en) (中文(简体) ). 钩子:useNumberLocale(lang), (中文(简体) ),resolveNumberLocale(lang, map)。 。 。 .systemActor(原始内容存档于2018-10-21) (英语). reemplaza el “Sistema' genérico en celdascreator编号 :created_by.*, (中文(简体) ),AuditInfo, (中文(简体) ),ActivityTimeline, (中文(简体) ),RecordHistoryy diálogo (英语) {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}我很高兴见到你 (原始内容存档于2018-03-29). Sin supporters se Conserva “Sistema”. 钩:useSystemActor()· ; {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}雷格拉·康帕蒂达:isSystemActorColumn(renderAs, key, namePath)。 。 。 .
设置 y salud de addons (SetupFlow, (中文(简体) ), HealthCard, (中文(简体) ), AddonConfigSurface(中文(简体) )
UI 声明段落 contributions.setup 编号 : contributions.health塔姆比昂语本身
进口suelta con @asteby/metacore-runtime-react/setup (solo esta porción.) (意大利语).
import { SetupFlow, HealthCard, RecordsTable, StepStatusBadge, AddonConfigSurface } from '@asteby/metacore-runtime-react'
<SetupFlow flow={flowDef} client={client} onComplete={...} renderCustom={...} />
SetupFlowClient适应者:getState(), (中文(简体) ),runStep(key, {values?, action?}), (中文(简体) ),skipStep(key),y 逻辑saveStep(key, values)(自动守护可见)ysubscribe(cb)(推倒语. El estado vive en el servidor, así que el flujo es reanudable: 爱丽丝·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克·克 {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}不说粗话.- Estados por paso: (英语)
pending | running | ok | warn | error | blocked。 。 。 .depends_on口语a 依附关系ok, (中文(简体) ),warnu 省略; los pasos 语句optionalse pueden 省略 你没有frenan la finalización. - (一) Polling con backoff (2 s x1.6, tope 30 s) Mientras algo Corre;
retry_after_s巴索·曼达 (1分5分钟). 拖车maxPollAttempts(40) deja de consultar y ofrece “Revisar ahora'. kind=form雷乌蒂利扎groupFieldsBySection+ 键FieldSection编号 :WizardProgress页:1form-layout(-ui)(secciones o sub-pasos), (英语:,visible_wheny 露营write_only(无) (原始内容存档于2017-03-27). de vuelta; vacío = conserver.kind=records我们aRecordsTable(copiar con fault reback,,,,,,,,,,,,,,,,,,,,,,,,,, (原始内容存档于2018-10-21). estado y diagnóstico por fila.kind=custom我们arenderCustomo el slot 联邦step.slot ?? setup.<flow.key>.<step.key>(道具:step, state, run, refresh) (中文(简体) ).fix妇女:{action}{\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}我很高兴见到你,{step}食人鱼 帕苏,{url}独唱 http(s) o ruta relativa (英语)onNavigatei el host enruta) (英语).- 特莱托斯语( 英語:Textos es/en incluidos)
useSetupT; se pueden sobrescribir con claves i18nnext 中文本无需改动setup.*。 。 。 .
释迦 UnifiedAddonConfigDialog (对)a AddonConfigSurface
编号 ops/frontend/src/features/installed-addons/index.tsx数字 :
- 硼
UnifiedAddonConfigDialog, (中文(简体) ),ConnectorCredentialFieldControl, (中文(简体) ),DynamicConnectorSelect, (中文(简体) ),fetchLookupOptions尔connector-form-model.ts(ahora viven en el SDK; los helpers se) (英语) 出口 desde el 子路径@asteby/metacore-runtime-react/setup数字 :shapeMismatch, (中文(简体) ),missingRequired, (中文(简体) ),parseSaveError, (中文(简体) ),safeUrl.; raíz solo expone los 组件). - 进口与蒙塔尔:
import { AddonConfigSurface } from '@asteby/metacore-runtime-react'
import { ensureAddonBundle } from '@/features/metacore/use-addon-locales'
const role = useAuthStore((s) => s.auth.user?.role)
const { activeBranch } = useActiveBranch()
<AddonConfigSurface
addon={addon}
connector={connector}
open={open}
onOpenChange={setOpen}
onSaved={refetch}
canManageIssuer={['owner', 'admin', 'superadmin'].includes((role ?? '').trim().toLowerCase())}
activeBranch={activeBranch ? { id: activeBranchId, name: activeBranch.name } : null}
ensureAddonBundle={(key, i18n) => ensureAddonBundle(i18n as any, key)}
displayName={addonDisplayName(addon)}
expectedOptionKinds={{
serie_invoice: 'factura',
serie_credit_note: 'nota_credito',
serie_payment_complement: 'pago',
}}
/>
请求 <ApiProvider> (o pasar ) (或 pasar ) client={api}页:1 QueryClientProvider· ; toast 脱声纳
叛逃问题notify {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}哦 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}那又怎样? 拉斯克飞地 installed_addons.* 尔
common.* siguen siendo las de ops: sus traducciones pinnen presentidad sobre el texto del SDK. 互联网档案馆的存檔,存档日期2013-12-21.
expectedOptionKinds (证书 - > tipo (原始内容存档于2018-03-31) (英语). es. e
(原始内容存档于2018-09-21) (英语). Inyectable y vacío por fecto: el SDK ya no tree lógica financial. 行动 脱去帕萨罗
(como arriba) para conservar el filtrado actually de series por tipo de documento. 互联网档案馆的存檔,存档日期2013-12-02., p.
3. Diferencia deliberada: unsecreto nunica se rellena desde(不保密) GET /integrations/:p/values, (中文(简体) ),
(原始内容存档于2018-10-12) (英语). aunque el backend lo devolviera.
最小使用量
import {
ApiProvider,
CapabilityProvider,
DynamicTable,
} from '@asteby/metacore-runtime-react'
import { api } from './lib/api'
export function App() {
return (
<ApiProvider client={api}>
<CapabilityProvider capabilities={session.capabilities}>
<DynamicTable model="tickets" />
</CapabilityProvider>
</ApiProvider>
)
}
关于道具、反应形状、定制模式和整个表面,见 docs/dynamic-ui.md。 。 。 .
它怎么对内核说话
| 终点 | 用于 |
|---|---|
GET /metadata/table/<model> | <DynamicTable> (ched. |
GET /metadata/modal/<model> | <DynamicRecordDialog> (ched. |
GET /metadata/all | useMetadataCache().prefetchAll()。 。 。 . |
GET /data/<model> | <DynamicTable> 列表中选择一个选项. |
GET /data/<model>/<id> | <DynamicRecordDialog> 视图/编辑. |
POST /data/<model> | 创建. |
PUT /data/<model>/<id> | 更新. |
DELETE /data/<model>/<id> | 删除(单一+批量). |
POST /data/<model>/<id>/action/<key> | <ActionModalDispatcher>。 。 。 . |
GET /options/<endpoint> | 关系取取取者+取取取取取取取取取取取取取取取取取. |
所有端点都可以通过 endpoint 道具 (英语).
构建
pnpm --filter @asteby/metacore-runtime-react build
许可证
阿帕奇 - 2.0