@cadraos/sdk 0.3.13 → 0.3.14-p102.2

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.
@@ -1,5 +1,5 @@
1
1
  import { createContext, useMemo, useContext, useState, useCallback, useEffect } from 'react';
2
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
3
3
 
4
4
  var BoardHostMappingContext = createContext(null);
5
5
  function BoardHostMappingProvider({
@@ -71,86 +71,8 @@ function collectDueRefs(lanes) {
71
71
  }
72
72
  return Array.from(byRef.values());
73
73
  }
74
- var DEFAULT_ORG_COLUMN = "org_id";
75
- function laneStageId(lane) {
76
- return lane.id ?? lane.key;
77
- }
78
- function suggestHostState(lane) {
79
- return lane.label ?? lane.key ?? "";
80
- }
81
- function freshFieldRow(ref, requiresPredicate) {
82
- return {
83
- ref,
84
- kind: requiresPredicate ? "predicate" : "column",
85
- column: "",
86
- path: "",
87
- via: "",
88
- table: "",
89
- name: "",
90
- predicateOnly: requiresPredicate
91
- };
92
- }
93
- function fieldRowFromBinding(b, requiresPredicate) {
94
- const base = freshFieldRow(b.ref, requiresPredicate);
95
- switch (b.kind) {
96
- case "column":
97
- return { ...base, kind: "column", column: b.column };
98
- case "json":
99
- return { ...base, kind: "json", column: b.column, path: b.path };
100
- case "fk":
101
- return { ...base, kind: "fk", via: b.via, table: b.table, column: b.column };
102
- case "predicate":
103
- return { ...base, kind: "predicate", name: b.name };
104
- default:
105
- return base;
106
- }
107
- }
108
- function fieldRowError(row) {
109
- switch (row.kind) {
110
- case "column":
111
- return identifierError(row.column) && `column ${identifierError(row.column)}`;
112
- case "json": {
113
- const colErr = identifierError(row.column);
114
- if (colErr) return `column ${colErr}`;
115
- if (!isValidJsonPath(row.path))
116
- return "path must be dot-separated identifiers";
117
- return null;
118
- }
119
- case "fk": {
120
- const viaErr = identifierError(row.via);
121
- if (viaErr) return `via ${viaErr}`;
122
- const tableErr = identifierError(row.table);
123
- if (tableErr) return `table ${tableErr}`;
124
- const colErr = identifierError(row.column);
125
- if (colErr) return `column ${colErr}`;
126
- return null;
127
- }
128
- case "predicate":
129
- return row.name.length === 0 ? "pick a predicate" : !isValidIdentifier(row.name) ? "predicate name must be a single identifier" : null;
130
- default:
131
- return "unknown kind";
132
- }
133
- }
134
- function rowToBinding(row) {
135
- switch (row.kind) {
136
- case "column":
137
- return { ref: row.ref, kind: "column", column: row.column };
138
- case "json":
139
- return { ref: row.ref, kind: "json", column: row.column, path: row.path };
140
- case "fk":
141
- return {
142
- ref: row.ref,
143
- kind: "fk",
144
- via: row.via,
145
- table: row.table,
146
- column: row.column
147
- };
148
- case "predicate":
149
- return { ref: row.ref, kind: "predicate", name: row.name };
150
- default:
151
- return { ref: row.ref, kind: "column", column: "" };
152
- }
153
- }
74
+
75
+ // src/board-host/widget/styles.ts
154
76
  var S = {
155
77
  card: {
156
78
  background: "#fff",
@@ -232,6 +154,200 @@ var S = {
232
154
  borderRadius: 999
233
155
  }
234
156
  };
157
+ function laneStageId(lane) {
158
+ return lane.id ?? lane.key;
159
+ }
160
+ function withStale(offered, extra) {
161
+ const known = new Set(offered.map((o) => o.value));
162
+ const stale = extra.filter((v) => v && !known.has(v)).map((v) => ({ value: v, label: `${v} (not on the board)` }));
163
+ return [...offered, ...stale];
164
+ }
165
+ function LaneMapStep({
166
+ lanes,
167
+ value,
168
+ onChange,
169
+ hostStates,
170
+ createIfMissing
171
+ }) {
172
+ function setEntry(key, entry) {
173
+ onChange({ ...value, [key]: entry });
174
+ }
175
+ return /* @__PURE__ */ jsx(Fragment, { children: lanes.map((lane) => {
176
+ const entry = value[lane.key];
177
+ const hostState = entry?.hostState ?? "";
178
+ const alsoFrom = entry?.alsoFrom ?? [];
179
+ const mapped = hostState.trim().length > 0;
180
+ return /* @__PURE__ */ jsxs("div", { style: S.lane, children: [
181
+ /* @__PURE__ */ jsxs("span", { children: [
182
+ lane.label,
183
+ /* @__PURE__ */ jsx("small", { style: { display: "block", color: "#98a1ad", fontSize: 11 }, children: laneStageId(lane) })
184
+ ] }),
185
+ /* @__PURE__ */ jsx("span", { style: { color: "#98a1ad", textAlign: "center" }, children: "\u2192" }),
186
+ hostStates ? /* @__PURE__ */ jsxs(
187
+ "select",
188
+ {
189
+ "aria-label": `Host state for ${lane.label}`,
190
+ value: hostState,
191
+ onChange: (e) => {
192
+ const next = e.target.value;
193
+ setEntry(lane.key, {
194
+ hostState: next,
195
+ alsoFrom: alsoFrom.filter((s) => s !== next)
196
+ });
197
+ },
198
+ style: { ...S.input, minWidth: 0, width: "100%" },
199
+ children: [
200
+ /* @__PURE__ */ jsx("option", { value: "", children: "\u2014 host state \u2014" }),
201
+ withStale(hostStates, [hostState]).map((o) => /* @__PURE__ */ jsx("option", { value: o.value, children: o.label }, o.value))
202
+ ]
203
+ }
204
+ ) : /* @__PURE__ */ jsx(
205
+ "input",
206
+ {
207
+ "aria-label": `Host state for ${lane.label}`,
208
+ value: hostState,
209
+ placeholder: "\u2014 host state \u2014",
210
+ onChange: (e) => {
211
+ setEntry(lane.key, { ...entry, hostState: e.target.value });
212
+ },
213
+ style: { ...S.input, minWidth: 0, width: "100%" }
214
+ }
215
+ ),
216
+ createIfMissing ? /* @__PURE__ */ jsxs(
217
+ "label",
218
+ {
219
+ style: { display: "flex", alignItems: "center", gap: 6, fontSize: 11.5, color: "#6b7480" },
220
+ children: [
221
+ /* @__PURE__ */ jsx(
222
+ "input",
223
+ {
224
+ type: "checkbox",
225
+ "aria-label": `Create lane ${lane.label} if missing`,
226
+ checked: createIfMissing.value[lane.key] ?? false,
227
+ onChange: (e) => createIfMissing.onChange(lane.key, e.target.checked)
228
+ }
229
+ ),
230
+ "create"
231
+ ]
232
+ }
233
+ ) : /* @__PURE__ */ jsx("span", {}),
234
+ hostStates && /* @__PURE__ */ jsxs(
235
+ "label",
236
+ {
237
+ style: {
238
+ gridColumn: "1 / -1",
239
+ display: "flex",
240
+ alignItems: "flex-start",
241
+ gap: 8,
242
+ fontSize: 11.5,
243
+ color: "#6b7480"
244
+ },
245
+ children: [
246
+ "Also accepts",
247
+ /* @__PURE__ */ jsx(
248
+ "select",
249
+ {
250
+ multiple: true,
251
+ "aria-label": `Also accepts for ${lane.label}`,
252
+ value: alsoFrom,
253
+ onChange: (e) => {
254
+ const picked = Array.from(e.target.options).filter((o) => o.selected).map((o) => o.value);
255
+ setEntry(lane.key, { hostState, alsoFrom: picked });
256
+ },
257
+ style: { ...S.input, minWidth: 0, flex: 1 },
258
+ children: withStale(hostStates, alsoFrom).filter((o) => o.value !== hostState).map((o) => /* @__PURE__ */ jsx("option", { value: o.value, children: o.label }, o.value))
259
+ }
260
+ )
261
+ ]
262
+ }
263
+ ),
264
+ /* @__PURE__ */ jsx(
265
+ "span",
266
+ {
267
+ style: { ...S.st, color: mapped ? "#16a34a" : "#c2710c", gridColumn: "1 / -1", marginTop: 2 },
268
+ children: mapped ? "\u2713 mapped" : "\u26A0 gap \u2014 unmapped lane"
269
+ }
270
+ )
271
+ ] }, lane.key);
272
+ }) });
273
+ }
274
+ var DEFAULT_ORG_COLUMN = "org_id";
275
+ function suggestHostState(lane) {
276
+ return lane.label ?? lane.key ?? "";
277
+ }
278
+ function freshFieldRow(ref, requiresPredicate) {
279
+ return {
280
+ ref,
281
+ kind: requiresPredicate ? "predicate" : "column",
282
+ column: "",
283
+ path: "",
284
+ via: "",
285
+ table: "",
286
+ name: "",
287
+ predicateOnly: requiresPredicate
288
+ };
289
+ }
290
+ function fieldRowFromBinding(b, requiresPredicate) {
291
+ const base = freshFieldRow(b.ref, requiresPredicate);
292
+ switch (b.kind) {
293
+ case "column":
294
+ return { ...base, kind: "column", column: b.column };
295
+ case "json":
296
+ return { ...base, kind: "json", column: b.column, path: b.path };
297
+ case "fk":
298
+ return { ...base, kind: "fk", via: b.via, table: b.table, column: b.column };
299
+ case "predicate":
300
+ return { ...base, kind: "predicate", name: b.name };
301
+ default:
302
+ return base;
303
+ }
304
+ }
305
+ function fieldRowError(row) {
306
+ switch (row.kind) {
307
+ case "column":
308
+ return identifierError(row.column) && `column ${identifierError(row.column)}`;
309
+ case "json": {
310
+ const colErr = identifierError(row.column);
311
+ if (colErr) return `column ${colErr}`;
312
+ if (!isValidJsonPath(row.path))
313
+ return "path must be dot-separated identifiers";
314
+ return null;
315
+ }
316
+ case "fk": {
317
+ const viaErr = identifierError(row.via);
318
+ if (viaErr) return `via ${viaErr}`;
319
+ const tableErr = identifierError(row.table);
320
+ if (tableErr) return `table ${tableErr}`;
321
+ const colErr = identifierError(row.column);
322
+ if (colErr) return `column ${colErr}`;
323
+ return null;
324
+ }
325
+ case "predicate":
326
+ return row.name.length === 0 ? "pick a predicate" : !isValidIdentifier(row.name) ? "predicate name must be a single identifier" : null;
327
+ default:
328
+ return "unknown kind";
329
+ }
330
+ }
331
+ function rowToBinding(row) {
332
+ switch (row.kind) {
333
+ case "column":
334
+ return { ref: row.ref, kind: "column", column: row.column };
335
+ case "json":
336
+ return { ref: row.ref, kind: "json", column: row.column, path: row.path };
337
+ case "fk":
338
+ return {
339
+ ref: row.ref,
340
+ kind: "fk",
341
+ via: row.via,
342
+ table: row.table,
343
+ column: row.column
344
+ };
345
+ case "predicate":
346
+ return { ref: row.ref, kind: "predicate", name: row.name };
347
+ default:
348
+ return { ref: row.ref, kind: "column", column: "" };
349
+ }
350
+ }
235
351
  function statusColors(status) {
236
352
  switch (status) {
237
353
  case "valid":
@@ -590,57 +706,28 @@ function BoardHostMapping({
590
706
  /* @__PURE__ */ jsx("span", { style: S.ttl, children: "Lane map" }),
591
707
  /* @__PURE__ */ jsx("span", { style: { marginLeft: "auto", fontSize: 11, color: "#98a1ad" }, children: "auto-matched by name" })
592
708
  ] }),
593
- lanes.map((lane) => {
594
- const mapped = (laneStates[lane.key] ?? "").trim().length > 0;
595
- return /* @__PURE__ */ jsxs("div", { style: S.lane, children: [
596
- /* @__PURE__ */ jsxs("span", { children: [
597
- lane.label,
598
- /* @__PURE__ */ jsx("small", { style: { display: "block", color: "#98a1ad", fontSize: 11 }, children: laneStageId(lane) })
599
- ] }),
600
- /* @__PURE__ */ jsx("span", { style: { color: "#98a1ad", textAlign: "center" }, children: "\u2192" }),
601
- /* @__PURE__ */ jsx(
602
- "input",
603
- {
604
- "aria-label": `Host state for ${lane.label}`,
605
- value: laneStates[lane.key] ?? "",
606
- placeholder: "\u2014 host state \u2014",
607
- onChange: (e) => {
608
- setLaneStates((s) => ({ ...s, [lane.key]: e.target.value }));
609
- setValidation(null);
610
- },
611
- style: { ...S.input, minWidth: 0, width: "100%" }
612
- }
613
- ),
614
- /* @__PURE__ */ jsxs(
615
- "label",
616
- {
617
- style: { display: "flex", alignItems: "center", gap: 6, fontSize: 11.5, color: "#6b7480" },
618
- children: [
619
- /* @__PURE__ */ jsx(
620
- "input",
621
- {
622
- type: "checkbox",
623
- "aria-label": `Create lane ${lane.label} if missing`,
624
- checked: laneCreate[lane.key] ?? false,
625
- onChange: (e) => {
626
- setLaneCreate((c) => ({ ...c, [lane.key]: e.target.checked }));
627
- setValidation(null);
628
- }
629
- }
630
- ),
631
- "create"
632
- ]
633
- }
709
+ /* @__PURE__ */ jsx(
710
+ LaneMapStep,
711
+ {
712
+ lanes,
713
+ value: Object.fromEntries(
714
+ Object.entries(laneStates).map(([k, hostState]) => [k, { hostState }])
634
715
  ),
635
- /* @__PURE__ */ jsx(
636
- "span",
637
- {
638
- style: { ...S.st, color: mapped ? "#16a34a" : "#c2710c", gridColumn: "1 / -1", marginTop: 2 },
639
- children: mapped ? "\u2713 mapped" : "\u26A0 gap \u2014 unmapped lane"
716
+ onChange: (next) => {
717
+ setLaneStates(
718
+ Object.fromEntries(Object.entries(next).map(([k, e]) => [k, e.hostState]))
719
+ );
720
+ setValidation(null);
721
+ },
722
+ createIfMissing: {
723
+ value: laneCreate,
724
+ onChange: (key, checked) => {
725
+ setLaneCreate((c) => ({ ...c, [key]: checked }));
726
+ setValidation(null);
640
727
  }
641
- )
642
- ] }, lane.key);
643
- })
728
+ }
729
+ }
730
+ )
644
731
  ] }),
645
732
  /* @__PURE__ */ jsxs("section", { style: S.sec, "aria-label": "Field map", children: [
646
733
  /* @__PURE__ */ jsxs("div", { style: S.lbl, children: [
@@ -815,6 +902,6 @@ function BoardHostMapping({
815
902
  ] });
816
903
  }
817
904
 
818
- export { BoardHostMapping, BoardHostMappingProvider, WIDGET_IDENTIFIER_PATTERN, collectDueRefs, identifierError, isValidIdentifier, isValidJsonPath, useBoardHostMappingAdapter, useBoardHostMappingAdapterOptional };
905
+ export { BoardHostMapping, BoardHostMappingProvider, LaneMapStep, WIDGET_IDENTIFIER_PATTERN, collectDueRefs, identifierError, isValidIdentifier, isValidJsonPath, useBoardHostMappingAdapter, useBoardHostMappingAdapterOptional };
819
906
  //# sourceMappingURL=index.js.map
820
907
  //# sourceMappingURL=index.js.map