@declarion/react 0.87.0 → 0.88.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/dist-lib/app.js +28 -28
  2. package/dist-lib/components/actions/ActionButton.js +86 -85
  3. package/dist-lib/components/actions/ActionResultDialog.impl.js +47 -47
  4. package/dist-lib/components/actions/ActionRunner.js +47 -47
  5. package/dist-lib/components/actions/ObjectActionBar.js +9 -9
  6. package/dist-lib/components/actions/RowActionsKebab.js +19 -19
  7. package/dist-lib/components/agents/AgentChatPanel.impl.js +53 -53
  8. package/dist-lib/components/chrome/AssociationTabs.js +21 -21
  9. package/dist-lib/components/chrome/RecordHeader.js +33 -40
  10. package/dist-lib/components/detail-layout/AssociatedBlock.js +387 -381
  11. package/dist-lib/components/detail-layout/ChildrenBlock.js +12 -13
  12. package/dist-lib/components/detail-layout/ChildrenTimeline.js +198 -198
  13. package/dist-lib/components/detail-layout/DraggableChildrenTable.js +114 -114
  14. package/dist-lib/components/detail-layout/EditableChildrenTable.js +160 -160
  15. package/dist-lib/components/detail-layout/EvidenceBlock.js +20 -21
  16. package/dist-lib/components/detail-layout/PropertiesBlock.js +45 -39
  17. package/dist-lib/components/detail-layout/QuickAddForm.js +9 -9
  18. package/dist-lib/components/detail-layout/TimelineComposer.js +87 -89
  19. package/dist-lib/components/detail-layout/widgets/EntityScorecardWidget.js +100 -99
  20. package/dist-lib/components/fields/FileReferenceField.js +9 -9
  21. package/dist-lib/components/fields/StructureField.js +57 -47
  22. package/dist-lib/components/fields/TimestampField.js +59 -54
  23. package/dist-lib/components/fields/cells/factories/money.js +14 -23
  24. package/dist-lib/components/fields/cells/factories/nextRun.js +1 -1
  25. package/dist-lib/components/fields/cells/factories/text.js +18 -3
  26. package/dist-lib/components/fields/cells/factories/timestamp.js +24 -12
  27. package/dist-lib/components/file-widgets/DocumentCard.js +108 -106
  28. package/dist-lib/components/layout/Layout.js +306 -361
  29. package/dist-lib/components/layout/Rail.js +42 -41
  30. package/dist-lib/components/layout/Sidebar.js +132 -117
  31. package/dist-lib/components/layout/TabStrip.js +116 -115
  32. package/dist-lib/components/layout/TenantChip.js +47 -54
  33. package/dist-lib/components/layout/TopBar.js +108 -105
  34. package/dist-lib/components/list/InlineEditCell.js +23 -23
  35. package/dist-lib/components/list/QuickPeek.js +65 -66
  36. package/dist-lib/components/pages/DocumentsMenu.js +42 -42
  37. package/dist-lib/components/pages/ExportMenu.js +25 -25
  38. package/dist-lib/components/pages/RecordDocumentsPanel.js +35 -35
  39. package/dist-lib/components/pages/RecordNotesPanel.js +94 -93
  40. package/dist-lib/components/pages/SmartDetailPage.impl.js +421 -417
  41. package/dist-lib/components/pages/SmartListPage.impl.js +293 -295
  42. package/dist-lib/components/pages/SmartRecordListPage.impl.js +310 -310
  43. package/dist-lib/components/pages/auth/AuthShell.js +73 -73
  44. package/dist-lib/components/pages/auth/SignIn.js +32 -32
  45. package/dist-lib/components/pages/auth/SignUp.impl.js +3 -3
  46. package/dist-lib/components/pages/auth/SignUpCode.js +9 -9
  47. package/dist-lib/components/pages/list/ListFloatbar.js +12 -12
  48. package/dist-lib/components/pages/list/ListHeader.js +19 -19
  49. package/dist-lib/components/pages/list/ListNoRows.js +15 -15
  50. package/dist-lib/components/pages/list/ListToolbar.js +145 -145
  51. package/dist-lib/components/pages/list/useActiveView.js +14 -5
  52. package/dist-lib/components/pages/list/useListQuery.js +121 -81
  53. package/dist-lib/components/pages/list/useListRowInteraction.js +70 -70
  54. package/dist-lib/components/pages/list/useRowMenu.js +7 -7
  55. package/dist-lib/components/pages/profile/Preferences.impl.js +81 -78
  56. package/dist-lib/components/pages/profile/Profile.impl.js +191 -189
  57. package/dist-lib/components/pages/tenant-params/TenantParamsPage.impl.js +166 -158
  58. package/dist-lib/components/shared/ChangePasswordDialog.impl.js +23 -23
  59. package/dist-lib/components/shared/MarkdownRenderer.js +9 -9
  60. package/dist-lib/hooks/useAuth.js +11 -11
  61. package/dist-lib/hooks/useBranding.js +4 -4
  62. package/dist-lib/hooks/useDisplayTimeZone.js +8 -0
  63. package/dist-lib/hooks/useFollowAgentOpen.js +24 -24
  64. package/dist-lib/hooks/useImpersonation.js +6 -6
  65. package/dist-lib/hooks/useMutations.js +23 -23
  66. package/dist-lib/hooks/useObjectStatus.js +5 -5
  67. package/dist-lib/hooks/useParams.js +59 -51
  68. package/dist-lib/hooks/useProperties.js +8 -8
  69. package/dist-lib/hooks/useRowTenant.js +18 -6
  70. package/dist-lib/hooks/useText.js +9 -7
  71. package/dist-lib/hooks/useUiPreferences.js +71 -0
  72. package/dist-lib/index.d.ts +22 -6
  73. package/dist-lib/index.js +127 -126
  74. package/dist-lib/lib/actions.js +116 -84
  75. package/dist-lib/lib/child-config.js +10 -1
  76. package/dist-lib/lib/format-count.js +16 -1
  77. package/dist-lib/lib/language.js +23 -21
  78. package/dist-lib/lib/money-text.js +29 -0
  79. package/dist-lib/lib/profile.js +4 -0
  80. package/dist-lib/lib/role-label.js +8 -0
  81. package/dist-lib/lib/schema-routing.js +34 -14
  82. package/dist-lib/lib/shortcut.js +10 -0
  83. package/dist-lib/lib/timestamp.js +93 -31
  84. package/dist-lib/stores/auth.js +9 -8
  85. package/dist-lib/stores/preferences.js +56 -17
  86. package/dist-lib/testing.d.ts +1 -1
  87. package/dist-lib/testing.js +25 -28
  88. package/dist-lib/types/schema.js +33 -27
  89. package/dist-lib/{useResponsiveMode-D3SKz5z4.d.ts → useResponsiveMode-9_eJT18k.d.ts} +5 -5
  90. package/package.json +1 -1
@@ -1,79 +1,79 @@
1
1
  import { coerceDisplayString as e } from "../../lib/display-value.js";
2
- import { fieldDisplayName as t } from "../../types/schema.js";
3
- import { Icon as n } from "../primitives/Icons.js";
4
- import { Btn as r } from "../primitives/Btn.js";
5
- import { IconBtn as i } from "../primitives/IconBtn.js";
6
- import { useText as a } from "../../hooks/useText.js";
7
- import { renderField as o } from "../fields/index.js";
8
- import { dataTableCellStyle as s, dataTableHeadCellStyle as c, dataTableStyle as l } from "../primitives/dataTableStyles.js";
9
- import { useCallback as u, useMemo as d, useRef as f } from "react";
10
- import { jsx as p, jsxs as m } from "react/jsx-runtime";
11
- import { DndContext as h, PointerSensor as g, closestCenter as _, useSensor as v, useSensors as y } from "@dnd-kit/core";
12
- import { SortableContext as b, useSortable as x, verticalListSortingStrategy as S } from "@dnd-kit/sortable";
13
- import { CSS as C } from "@dnd-kit/utilities";
2
+ import { fieldDisplayName as t, isUserEditableField as n } from "../../types/schema.js";
3
+ import { Icon as r } from "../primitives/Icons.js";
4
+ import { Btn as i } from "../primitives/Btn.js";
5
+ import { IconBtn as a } from "../primitives/IconBtn.js";
6
+ import { useText as o } from "../../hooks/useText.js";
7
+ import { renderField as s } from "../fields/index.js";
8
+ import { dataTableCellStyle as c, dataTableHeadCellStyle as l, dataTableStyle as u } from "../primitives/dataTableStyles.js";
9
+ import { useCallback as d, useMemo as f, useRef as p } from "react";
10
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
11
+ import { DndContext as g, PointerSensor as _, closestCenter as v, useSensor as y, useSensors as b } from "@dnd-kit/core";
12
+ import { SortableContext as x, useSortable as S, verticalListSortingStrategy as C } from "@dnd-kit/sortable";
13
+ import { CSS as w } from "@dnd-kit/utilities";
14
14
  //#region src/components/detail-layout/DraggableChildrenTable.tsx
15
- function w({ config: e, childEntity: i, schema: o, rows: s, onChange: x, validationErrors: C, refs: w }) {
16
- let E = a(), D = f(null), O = e.position_field, k = e.columns, A = y(v(g, { activationConstraint: { distance: 5 } })), j = new Set(Array.isArray(e.foreign_key) ? e.foreign_key : [e.foreign_key]), M = k.filter((e) => {
17
- if (j.has(e) || e === O) return !1;
18
- let t = i.fields.get(e);
19
- return !(!t || t.auto || t.primary || t.source);
20
- }), N = new Set(k.filter((e) => {
21
- if (e === O) return !0;
22
- let t = i.fields.get(e);
23
- return t && (t.auto || t.primary || t.source);
24
- })), P = k.filter((e) => e !== O), F = d(() => s.filter((e) => !e._deleted).map((e) => e._key), [s]), I = u((e, t, n) => {
25
- x(s.map((r) => r._key === e ? {
15
+ function T({ config: e, childEntity: a, schema: s, rows: c, onChange: S, validationErrors: w, refs: T }) {
16
+ let D = o(), O = p(null), k = e.position_field, A = e.columns, j = b(y(_, { activationConstraint: { distance: 5 } })), M = new Set(Array.isArray(e.foreign_key) ? e.foreign_key : [e.foreign_key]), N = A.filter((e) => {
17
+ if (M.has(e) || e === k) return !1;
18
+ let t = a.fields.get(e);
19
+ return !(!t || !n(t));
20
+ }), P = new Set(A.filter((e) => {
21
+ if (e === k) return !0;
22
+ let t = a.fields.get(e);
23
+ return t && !n(t);
24
+ })), F = A.filter((e) => e !== k), I = f(() => c.filter((e) => !e._deleted).map((e) => e._key), [c]), L = d((e, t, n) => {
25
+ S(c.map((r) => r._key === e ? {
26
26
  ...r,
27
27
  [t]: n,
28
28
  _dirty: !0
29
29
  } : r));
30
- }, [s, x]), L = u(() => {
31
- let t = s.filter((e) => !e._deleted).reduce((e, t) => {
32
- let n = typeof t[O] == "number" ? t[O] : -1;
30
+ }, [c, S]), R = d(() => {
31
+ let t = c.filter((e) => !e._deleted).reduce((e, t) => {
32
+ let n = typeof t[k] == "number" ? t[k] : -1;
33
33
  return Math.max(e, n);
34
34
  }, -1), n = {
35
35
  _key: crypto.randomUUID(),
36
36
  _dirty: !0,
37
- [O]: t + 1
37
+ [k]: t + 1
38
38
  }, r = e.quick_add?.defaults ?? {};
39
- for (let e of M) {
40
- let t = i.fields.get(e);
39
+ for (let e of N) {
40
+ let t = a.fields.get(e);
41
41
  t && (r[e] === void 0 ? t.default === void 0 ? t.type === "bool" && (n[e] = !1) : n[e] = t.default : n[e] = r[e]);
42
42
  }
43
- x([...s, n]);
43
+ S([...c, n]);
44
44
  }, [
45
- s,
46
- x,
47
- M,
48
- i,
45
+ c,
46
+ S,
47
+ N,
48
+ a,
49
49
  e.quick_add?.defaults,
50
- O
51
- ]), R = u((e) => {
52
- x(s.map((t) => t._key === e ? {
50
+ k
51
+ ]), z = d((e) => {
52
+ S(c.map((t) => t._key === e ? {
53
53
  ...t,
54
54
  _deleted: !0
55
55
  } : t));
56
- }, [s, x]), z = u((e) => {
57
- x(s.map((t) => t._key === e ? {
56
+ }, [c, S]), B = d((e) => {
57
+ S(c.map((t) => t._key === e ? {
58
58
  ...t,
59
59
  _deleted: !1
60
60
  } : t));
61
- }, [s, x]), B = u((e) => {
61
+ }, [c, S]), V = d((e) => {
62
62
  let { active: t, over: n } = e;
63
63
  if (!n || t.id === n.id) return;
64
- let r = s.filter((e) => !e._deleted), i = s.filter((e) => e._deleted), a = r.findIndex((e) => e._key === String(t.id)), o = r.findIndex((e) => e._key === String(n.id));
64
+ let r = c.filter((e) => !e._deleted), i = c.filter((e) => e._deleted), a = r.findIndex((e) => e._key === String(t.id)), o = r.findIndex((e) => e._key === String(n.id));
65
65
  if (a === -1 || o === -1) return;
66
- let c = [...r], [l] = c.splice(a, 1);
67
- c.splice(o, 0, l), x([...c.map((e, t) => ({
66
+ let s = [...r], [l] = s.splice(a, 1);
67
+ s.splice(o, 0, l), S([...s.map((e, t) => ({
68
68
  ...e,
69
- [O]: t,
70
- _dirty: e[O] !== t || e._dirty
69
+ [k]: t,
70
+ _dirty: e[k] !== t || e._dirty
71
71
  })), ...i]);
72
72
  }, [
73
- s,
74
- x,
75
- O
76
- ]), V = u((e) => {
73
+ c,
74
+ S,
75
+ k
76
+ ]), H = d((e) => {
77
77
  let t = e.target, n = t.closest("td");
78
78
  if (!n) return;
79
79
  let r = n.closest("tr");
@@ -97,7 +97,7 @@ function w({ config: e, childEntity: i, schema: o, rows: s, onChange: x, validat
97
97
  if (o < t.length - 1) {
98
98
  let e = t[o + 1].cells[a]?.querySelector("input, select, textarea, [tabindex]");
99
99
  e && e.focus();
100
- } else L(), requestAnimationFrame(() => {
100
+ } else R(), requestAnimationFrame(() => {
101
101
  let e = i.querySelectorAll("tr"), t = e[e.length - 1];
102
102
  if (t) {
103
103
  let e = t.querySelector("input, select, textarea, [tabindex]");
@@ -105,92 +105,92 @@ function w({ config: e, childEntity: i, schema: o, rows: s, onChange: x, validat
105
105
  }
106
106
  });
107
107
  } else e.key === "Escape" && t.blur?.();
108
- }, [L]), H = c;
109
- return /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("div", {
108
+ }, [R]), U = l;
109
+ return /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("div", {
110
110
  style: { overflowX: "auto" },
111
- children: /* @__PURE__ */ p(h, {
112
- sensors: A,
113
- collisionDetection: _,
114
- onDragEnd: B,
115
- children: /* @__PURE__ */ m("table", {
116
- ref: D,
117
- style: l,
118
- onKeyDown: V,
119
- children: [/* @__PURE__ */ p("thead", { children: /* @__PURE__ */ m("tr", { children: [
120
- /* @__PURE__ */ p("th", { style: {
121
- ...H,
111
+ children: /* @__PURE__ */ m(g, {
112
+ sensors: j,
113
+ collisionDetection: v,
114
+ onDragEnd: V,
115
+ children: /* @__PURE__ */ h("table", {
116
+ ref: O,
117
+ style: u,
118
+ onKeyDown: H,
119
+ children: [/* @__PURE__ */ m("thead", { children: /* @__PURE__ */ h("tr", { children: [
120
+ /* @__PURE__ */ m("th", { style: {
121
+ ...U,
122
122
  width: 32,
123
123
  padding: "0 4px"
124
124
  } }),
125
- P.map((e) => {
126
- let n = i.fields.get(e);
127
- return /* @__PURE__ */ p("th", {
128
- style: H,
129
- children: n ? t(E, n, e, o.entities) : e
125
+ F.map((e) => {
126
+ let n = a.fields.get(e);
127
+ return /* @__PURE__ */ m("th", {
128
+ style: U,
129
+ children: n ? t(D, n, e, s.entities) : e
130
130
  }, e);
131
131
  }),
132
- /* @__PURE__ */ p("th", { style: {
133
- ...H,
132
+ /* @__PURE__ */ m("th", { style: {
133
+ ...U,
134
134
  width: 40
135
135
  } })
136
- ] }) }), /* @__PURE__ */ p(b, {
137
- items: F,
138
- strategy: S,
139
- children: /* @__PURE__ */ p("tbody", { children: s.map((e) => /* @__PURE__ */ p(T, {
136
+ ] }) }), /* @__PURE__ */ m(x, {
137
+ items: I,
138
+ strategy: C,
139
+ children: /* @__PURE__ */ m("tbody", { children: c.map((e) => /* @__PURE__ */ m(E, {
140
140
  row: e,
141
- columns: P,
142
- editableColumns: M,
143
- displayOnlyColumns: N,
144
- childEntity: i,
145
- validationErrors: C,
146
- refs: w,
147
- onCellChange: I,
148
- onDelete: R,
149
- onUndoDelete: z
141
+ columns: F,
142
+ editableColumns: N,
143
+ displayOnlyColumns: P,
144
+ childEntity: a,
145
+ validationErrors: w,
146
+ refs: T,
147
+ onCellChange: L,
148
+ onDelete: z,
149
+ onUndoDelete: B
150
150
  }, e._key)) })
151
151
  })]
152
152
  })
153
153
  })
154
- }), /* @__PURE__ */ p("div", {
154
+ }), /* @__PURE__ */ m("div", {
155
155
  style: { marginTop: 8 },
156
- children: /* @__PURE__ */ p(r, {
156
+ children: /* @__PURE__ */ m(i, {
157
157
  kind: "ghost",
158
158
  size: "xs",
159
- icon: /* @__PURE__ */ p(n.plus, { size: 12 }),
160
- onClick: L,
161
- children: E("record.row.add", "Add row")
159
+ icon: /* @__PURE__ */ m(r.plus, { size: 12 }),
160
+ onClick: R,
161
+ children: D("record.row.add", "Add row")
162
162
  })
163
163
  })] });
164
164
  }
165
- function T({ row: t, columns: r, editableColumns: c, displayOnlyColumns: l, childEntity: u, validationErrors: d, refs: f, onCellChange: h, onDelete: g, onUndoDelete: _ }) {
166
- let v = a(), y = !!t._deleted, b = d?.[t._key], { attributes: S, listeners: w, setNodeRef: T, transform: E, transition: D, isDragging: O } = x({
165
+ function E({ row: t, columns: n, editableColumns: i, displayOnlyColumns: l, childEntity: u, validationErrors: d, refs: f, onCellChange: p, onDelete: g, onUndoDelete: _ }) {
166
+ let v = o(), y = !!t._deleted, b = d?.[t._key], { attributes: x, listeners: C, setNodeRef: T, transform: E, transition: D, isDragging: O } = S({
167
167
  id: t._key,
168
168
  disabled: y
169
169
  }), k = {
170
- transform: C.Translate.toString(E),
170
+ transform: w.Translate.toString(E),
171
171
  transition: D,
172
172
  zIndex: O ? 10 : void 0,
173
173
  opacity: O ? .5 : void 0
174
- }, A = s, j = {
174
+ }, A = c, j = {
175
175
  padding: "4px 4px",
176
176
  borderBottom: "1px solid var(--divider)",
177
177
  verticalAlign: "middle"
178
178
  };
179
- return /* @__PURE__ */ m("tr", {
179
+ return /* @__PURE__ */ h("tr", {
180
180
  ref: T,
181
181
  style: {
182
182
  ...k,
183
183
  opacity: y ? .5 : k?.opacity ?? 1
184
184
  },
185
185
  children: [
186
- /* @__PURE__ */ p("td", {
186
+ /* @__PURE__ */ m("td", {
187
187
  style: {
188
188
  padding: "4px 4px",
189
189
  borderBottom: "1px solid var(--divider)",
190
190
  width: 32,
191
191
  verticalAlign: "middle"
192
192
  },
193
- children: !y && /* @__PURE__ */ p("button", {
193
+ children: !y && /* @__PURE__ */ m("button", {
194
194
  type: "button",
195
195
  style: {
196
196
  cursor: "grab",
@@ -200,19 +200,19 @@ function T({ row: t, columns: r, editableColumns: c, displayOnlyColumns: l, chil
200
200
  border: 0,
201
201
  display: "inline-flex"
202
202
  },
203
- ...S,
204
- ...w,
205
- children: /* @__PURE__ */ p(n.grid, { size: 14 })
203
+ ...x,
204
+ ...C,
205
+ children: /* @__PURE__ */ m(r.grid, { size: 14 })
206
206
  })
207
207
  }),
208
- r.map((n) => {
209
- let r = u.fields.get(n), i = b?.includes(n), a = l.has(n), s = c.includes(n);
210
- return y || a || !s ? /* @__PURE__ */ p("td", {
208
+ n.map((n) => {
209
+ let r = u.fields.get(n), a = b?.includes(n), o = l.has(n), c = i.includes(n);
210
+ return y || o || !c ? /* @__PURE__ */ m("td", {
211
211
  style: {
212
212
  ...A,
213
213
  textDecoration: y ? "line-through" : "none"
214
214
  },
215
- children: r ? o({
215
+ children: r ? s({
216
216
  field: r,
217
217
  fieldName: n,
218
218
  value: t[n],
@@ -221,40 +221,40 @@ function T({ row: t, columns: r, editableColumns: c, displayOnlyColumns: l, chil
221
221
  refs: f,
222
222
  t: v
223
223
  }) : e(t[n])
224
- }, n) : /* @__PURE__ */ p("td", {
224
+ }, n) : /* @__PURE__ */ m("td", {
225
225
  style: {
226
226
  ...j,
227
- outline: i ? "1px solid var(--danger)" : "none",
227
+ outline: a ? "1px solid var(--danger)" : "none",
228
228
  outlineOffset: -1,
229
- borderRadius: i ? "var(--radius-sm)" : 0
229
+ borderRadius: a ? "var(--radius-sm)" : 0
230
230
  },
231
- title: i ? v("record.row.field_required", "{field} is required", { field: n }) : void 0,
232
- children: r ? o({
231
+ title: a ? v("record.row.field_required", "{field} is required", { field: n }) : void 0,
232
+ children: r ? s({
233
233
  field: r,
234
234
  fieldName: n,
235
235
  value: t[n],
236
236
  mode: "edit",
237
- onChange: (e) => h(t._key, n, e),
237
+ onChange: (e) => p(t._key, n, e),
238
238
  record: t,
239
239
  refs: f,
240
240
  t: v
241
241
  }) : e(t[n])
242
242
  }, n);
243
243
  }),
244
- /* @__PURE__ */ p("td", {
244
+ /* @__PURE__ */ m("td", {
245
245
  style: {
246
246
  padding: "4px 8px",
247
247
  borderBottom: "1px solid var(--divider)",
248
248
  verticalAlign: "middle"
249
249
  },
250
- children: y ? /* @__PURE__ */ p(i, {
250
+ children: y ? /* @__PURE__ */ m(a, {
251
251
  size: 24,
252
- icon: /* @__PURE__ */ p(n.refresh, { size: 12 }),
252
+ icon: /* @__PURE__ */ m(r.refresh, { size: 12 }),
253
253
  onClick: () => _(t._key),
254
254
  title: v("record.row.undo_delete", "Undo delete")
255
- }) : /* @__PURE__ */ p(i, {
255
+ }) : /* @__PURE__ */ m(a, {
256
256
  size: 24,
257
- icon: /* @__PURE__ */ p(n.trash, { size: 12 }),
257
+ icon: /* @__PURE__ */ m(r.trash, { size: 12 }),
258
258
  onClick: () => g(t._key),
259
259
  title: v("record.row.delete", "Delete row")
260
260
  })
@@ -263,4 +263,4 @@ function T({ row: t, columns: r, editableColumns: c, displayOnlyColumns: l, chil
263
263
  });
264
264
  }
265
265
  //#endregion
266
- export { w as DraggableChildrenTable };
266
+ export { T as DraggableChildrenTable };