@ai-matrx/ records-ui (英语)
该平台的主要唱片UI组件. 这里的每个组件读取
仅写通过 @ai-matrx/records时
@ai-matrx/design-system自己的原始和数据表,并携带
@ai-matrx/alchemy单子,一个人到达一个.
在这个平台上没有每个地物的发言权。 需要的特性 网格、窗体、取取器或取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取 几行线.
捆绑一次
import { RecordsProvider } from "@ai-matrx/records/react";
import { RecordsUiProvider } from "@ai-matrx/records-ui";
import "@ai-matrx/design-system/styles.css";
<RecordsProvider config={{ dataSource: supabase, organizationId, actor: { actor: "user", user_id } }}>
<RecordsUiProvider value={{ rights: (table) => myRights(table), density: "condensed" }}>
{children}
</RecordsUiProvider>
</RecordsProvider>;
rights 是决定一个人是否看到管理者的港口
控制系统。 不受限制,它回答"不" 有原因, 并且每一个这样的控制是
ABSENT——这个包件船没有其中任何一种残废的变体.
然后,每行数行
import {
Grid, RecordForm, FieldEditor, TableSettings, RelationPicker,
Peek, ImportWizard, ExportMenu, CustomFieldsSection,
} from "@ai-matrx/records-ui";
<Grid tableId={id} onOpenRecord={setPeeking} onAddField={openSettings} /> // records as rows, fields as columns
<RecordForm tableId={id} /> // create, generated from the Field records
<RecordForm tableId={id} recordId={recordId} /> // edit, with the conflict shown when someone wins
<Peek tableId={id} recordId={recordId} onClose={close} /> // any custom table's record, no per-table code
<TableSettings tableId={id} /> // rename · reorder · retype · delete
<FieldEditor tableId={id} field={field} /> // one Field's type, rules and sensitivity
<ImportWizard tableId={id} onProposeField={propose} /> // map columns, preview rows, propose the rest
<ExportMenu tableId={id} label="Deals" /> // CSV · XLSX · Alchemy
<CustomFieldsSection tableId={entityTableId} recordId={record.id} /> // THE one line a standard entity page adds
RelationPicker 用于 RecordForm 自动用于任意 relation 字段;
当屏幕只需要取取器时直接挂起它 .
视图、队列、历史和评论
<ViewBar tableId={id} onActiveView={setView} seed={[{ name: "By stage", subject: id, layout: "kanban", groupField: "stage" }]} />
<ViewSwitcher view={view} /> // grid · kanban · calendar · gallery, one membership Rule
<ActionInbox tableId={id} seed={[...]} /> // approvals, assignments and agent proposals, one queue
<HistoryPanel tableId={id} recordId={recordId} /> // the timeline IS the record; undo is the store's soft delete
<CommentThread tableId={id} recordId={recordId} /> // a comment is a record
<FormBuilder tableId={id} seed={[form]} /> <FormRunner form={form} /> // a form is a view on a real Table
<DashboardCanvas tableId={id} seed={[dashboard]} /> <ChartBlock spec={chart} /> // every block is one `record_aggregate`
<NotifyRuleEditor tableId={id} /> // a subscription is a Rule record over a saved view
<DocTemplate tableId={id} seed={[tpl]} /> <DocRender templateId={t} recordId={r} /> // tokens resolved by the store
<SignBlock tableId={id} recordId={r} render={render} /> // the signature is checked against the exact bytes
说到唱片,让经纪人保持它充满
<RecordChat tableId={id} recordId={recordId} /> // the HOST's chat surface, this record as its context
<EnrichPanel tableId={id} recordId={recordId} /> // per-field AI fill, freshness and provenance
RecordChat 船舶 无聊天 UI. AI Matrx有一个—— matrx前端的
AgentConversationColumn 它读到应用程序的Redux商店, 所以一个包
输入它就会不再是一个包裹, 和第二个在这里漂浮
一个月之内. RecordChat 构建仅记录存储可构建的部分 :
通过读取门读取的记录,每个值都带有其字段的单位和
格式( 提供代理 $48,000从不裸露 48000),字段为
存储 MASCKED 大声命名 secret 财务报告和审定财务报表 on_demand 挡住的
与缘由. 然后它把它交给 chat 端口 :
<RecordsUiProvider value={{
chat: (ctx) => {
const { conversationId } = useAgentLauncher(agentId, {
surfaceKey: ctx.surfaceKey,
runtime: { context: Object.fromEntries(ctx.entries.map((e) => [e.key, e.value])) },
});
return <AgentConversationColumn conversationId={conversationId} surfaceKey={ctx.surfaceKey} />;
},
}}>
通过一个 任务从来没有钉住UUID。 不受约束, 面板 以理由缺席,不画作曲.
EnrichPanel 读取代理从字段填充的字段
个人(source = agent以及从何时开始 review_interval_days,以及
将每个值从自己的信封中取出 updated_at,哪个
因为其中一个地方变了 所以会叫每个地方都变了 填满自己去
通过 服务器 records 工具因为一个被盖章的演员 agent
代表一个人只能由服务器诚实地制作:
<RecordsUiProvider value={{
enrich: (ask) => fetch("/api/ai/tools/execute", { method: "POST", body: JSON.stringify({
tool_name: "records", surface: "records-ui:enrich",
arguments: { action: "record_write", record_id: ask.recordId, values: {/* the agent's answers */} },
})}).then((r) => r.json()).then((r) => ({ ok: r.ok, message: r.output })),
}}>
两个开关今天坐在电话前 面板都叫两个
而不是旋转:接头 custom/code_paths_enabled 解决错误,和
页:1 records 排成一行 tool.binding 实值 is_active = false。 。 。 .
工作:核对表、预订和没有信号的电话
<ChecklistRunner tableId={id} seed={[{ name: "Onboarding", subject: id, steps: [{ title: "Confirm the address" }] }]} />
<BookingSlots tableId={id} form={bookingForm} availability={{ fromHour: 9, toHour: 17, everyMinutes: 60, days: 5 }} />
<CaptureSheet tableId={id} readingField="amount" noteField="title" />
ChecklistRunner 使每一步成为 真实记录 可转让、可评论,
可出口的、具有历史意义的——整个图由单一行为创造
(单位:千美元)custom.work_template_instantiate 在写任何一篇之前,先判断它
半成品的核对表不是这家商店可以进入的状态。 各州和
提供的移动来自 custom.work_states(); 商店不列出移动
下一个不显示灰色,它不存在.
BookingSlots 握住空档 第一个 接下来是细节
细节首先是两个人如何填表 其中一人发现
结束。 每个插槽有一个被扣是数据库中的 UNIQUE INDEX,而不是检查这个
屏幕制作,所以一个种族的失败者读取数据库本身的句子命名
拒绝的指数。 保存在一个槽中
结束 custom.work_slots_declare; 如果商店无法构建索引
拒绝,而这个屏幕显示拒绝 而不是一个采摘者将出售
同一个小时两次.
CaptureSheet 是离线捕捉合同, 并且两者都减半 事项:
客户端 薄荷 id 人一触即发——离线
第一次尝试,永远不要重新考虑再试验 店铺的破烂,所以一个
重新连接同一捕捉器的电话 写了30次记录
每次都得到同样的身份证明 捆绑 captureQueue 以保留队列
被重新装入; 不装入, 它在记忆中的 页面的生命,并这样说.
外人:门户、公共网页、嵌入式
<PortalShell tableId={id} form={intakeForm} /> // their list, their record, their form
<PublicViewPage slug={params.slug} /> // a signed-out visitor's page
<EmbedFrame tableId={id} formId={formId} embedUrl="https://app.example/embed" /> // issue the token
const { binding, error } = useEmbedHandshake({ secret, requiredMode: "read" }); // and verify it, inside the iframe
PortalShell 询问 iam 此人不是自己决定:
"外部"是指没有成员 非个人 组织,因为
注册薄荷,每个人都是个人的 另一本读物就没人了
外为. 他们能达到的就是 iam.external_principal_reach - 准确的说
资源 idsicity 一次一次递给他们,从未"他们
组织记录".
PublicViewPage 使出版物具有约束力 共享不是出版物页:1
地址,无人制造, 一个被撤销, 一个其车道关闭 全部解决
因为一个地址对被撤销的地址有不同的回答
约束将是一个存在论者。 每个读数都带商店的
"没有被扫描"注解(D-15)——一个功能,所以页面,API和收录
排成一行不能变成三个不同的录取点。 到达出版的快乐
路径需要请求命名空间 和经核实的出版商,是个人
站在开放的互联网背后 而不是屏幕可能伪造的东西.
EmbedFrame 薄荷通过一个符号 custom.anon_token_issue显示秘密
一次 (只储存其摘要),并在拒绝之前说明规则:a
符号带有一个决定——读取或写出,从不同时写出——它的出处列表是:
需要并准确匹配,所以 example.com.evil.test 检查后缀失败
比赛会通过.
每一个都一样
- 店自有句. 拒绝从未重新措辞。 "别人 当你在做这个工作时 改变了这个记录", 因为店里是这么说的 冲突就随着它而来 字段.
- 缺席 从不死. 一个人不得使用的控制是不能提供的。 那边 在此软件包中,没有禁用"+",也没有灰色设置面板.
- A Field决定它的编辑. 13个对等类型来自商店
(单位:千美元)
custom.parity_field_types()),生成为@ai-matrx/records单位 而格式则出现在字段上,因为它们会改变数值的含义. - 什么都没有悄悄地掉下来. 显示未映射的导入列 (b) 一份没有实况报道的清单 尚不存在的车道被命名.
- 深色,一行头,光和暗,iOS安全,通过设计 系统本身的符号——这个软件包没有设置自己的颜色.
演示
pnpm demo 运行每个组件对 一个活店无头,打开
该车道的自有港口(127.0.0.1:305),并站起自有的站台、田地和
记录它第一次运行。 它的数据接合是平台的服务器道
在打开产品开关的每个请求中
作为测试身份( e)[email protected]通过商店的自有门,并设置
在承诺之前,每个开关都退后,所以没有其他会话能观察到
打开. pnpm test 使jsdom中的相同页面与服务器相对
说一个人会看到什么.
它故意读到现场商店: custom.anon_*,嵌入的标志
外部主机和出版物装订只存在在那里,演示指向
排练时会回答 door_absent 包的三分之一和
把它称为一个发现.
31个组成部分
Grid | RecordForm | FieldEditor |
TableSettings | RelationPicker | Peek |
ViewSwitcher | ViewBar | ImportWizard |
ExportMenu | CustomFieldsSection | ActionInbox |
ProposalRow | HistoryPanel | CommentThread |
FormBuilder | FormRunner | ChartBlock |
DashboardCanvas | NotifyRuleEditor | DocTemplate |
DocRender | SignBlock | RecordChat |
EnrichPanel | ChecklistRunner | BookingSlots |
CaptureSheet | PortalShell | PublicViewPage |
EmbedFrame |
图标
| 命令 | 它会做什么 |
|---|---|
pnpm demo | 每个组件,在排练分支上直播,无头 |
pnpm test | 演示页毫无头绪 |
pnpm build | {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}你来干什么 dist (sm + cjs + d.ts),然后是客户端边界印章 |
pnpm check:package | · 出口协议 |