@flytedan/flytebot-design-system 0.67.3 → 0.68.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.
package/dist/index.cjs CHANGED
@@ -4193,6 +4193,24 @@ function CsiHero({ band = "weak", crp, label, className = "" }) {
4193
4193
  // src/components/data/DataTable.tsx
4194
4194
  var import_jsx_runtime44 = require("react/jsx-runtime");
4195
4195
  var STACK_MAX_WIDTH = 640;
4196
+ function RowActionButton({ action, size }) {
4197
+ return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
4198
+ IconButton,
4199
+ {
4200
+ icon: action.icon,
4201
+ label: action.label,
4202
+ size,
4203
+ disabled: action.disabled,
4204
+ onClick: (e) => {
4205
+ e.stopPropagation();
4206
+ action.onClick();
4207
+ }
4208
+ }
4209
+ );
4210
+ }
4211
+ function RowActionCell({ action }) {
4212
+ return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("td", { className: "fd-table-action", children: action ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(RowActionButton, { action, size: "sm" }) : null });
4213
+ }
4196
4214
  var cellOf = (c, row) => c.render ? c.render(row) : row[c.key];
4197
4215
  function rowInteraction(row, onRowClick) {
4198
4216
  if (!onRowClick) return {};
@@ -4220,6 +4238,7 @@ function DataTable({
4220
4238
  selectedIds,
4221
4239
  rowTitle,
4222
4240
  onRowClick,
4241
+ rowAction,
4223
4242
  rowKey = "id",
4224
4243
  loading = false,
4225
4244
  refreshing = false,
@@ -4256,27 +4275,37 @@ function DataTable({
4256
4275
  onSort,
4257
4276
  rowTitle,
4258
4277
  onRowClick,
4278
+ rowAction,
4259
4279
  isSelected
4260
4280
  }
4261
4281
  ) : /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("table", { className: ["fd-table", compact3 ? "fd-table-compact" : ""].filter(Boolean).join(" "), children: [
4262
- /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("thead", { children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("tr", { children: columns.map((c) => /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
4263
- "th",
4264
- {
4265
- scope: "col",
4266
- style: { width: c.width },
4267
- className: [c.numeric ? "is-num" : "", sort && sort.key === c.key ? "is-sorted" : ""].filter(Boolean).join(" "),
4268
- "aria-sort": sort && sort.key === c.key ? sort.dir === "asc" ? "ascending" : "descending" : void 0,
4269
- children: c.sortable && onSort ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(SortButton, { column: c, sort, onSort }) : c.label
4270
- },
4271
- c.key
4272
- )) }) }),
4273
- /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("tbody", { className: stale ? "fd-stale" : void 0, children: loading ? Array.from({ length: skeletonRows }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("tr", { children: columns.map((c) => /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("td", { className: c.numeric ? "is-num" : "", children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: "fd-skel fd-skel-text", style: { display: "inline-block", height: 13, width: c.numeric ? 52 : i % 3 === 0 ? "72%" : "88%" } }) }, c.key)) }, i)) : rows.map((r) => /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
4282
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("thead", { children: /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("tr", { children: [
4283
+ columns.map((c) => /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
4284
+ "th",
4285
+ {
4286
+ scope: "col",
4287
+ style: { width: c.width },
4288
+ className: [c.numeric ? "is-num" : "", sort && sort.key === c.key ? "is-sorted" : ""].filter(Boolean).join(" "),
4289
+ "aria-sort": sort && sort.key === c.key ? sort.dir === "asc" ? "ascending" : "descending" : void 0,
4290
+ children: c.sortable && onSort ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(SortButton, { column: c, sort, onSort }) : c.label
4291
+ },
4292
+ c.key
4293
+ )),
4294
+ rowAction ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("th", { scope: "col", className: "fd-table-action-head", children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: "fd-sr-only", children: "Actions" }) }) : null
4295
+ ] }) }),
4296
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("tbody", { className: stale ? "fd-stale" : void 0, children: loading ? Array.from({ length: skeletonRows }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("tr", { children: [
4297
+ columns.map((c) => /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("td", { className: c.numeric ? "is-num" : "", children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: "fd-skel fd-skel-text", style: { display: "inline-block", height: 13, width: c.numeric ? 52 : i % 3 === 0 ? "72%" : "88%" } }) }, c.key)),
4298
+ rowAction ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("td", { className: "fd-table-action" }) : null
4299
+ ] }, i)) : rows.map((r) => /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(
4274
4300
  "tr",
4275
4301
  {
4276
4302
  "aria-selected": isSelected(r) ? "true" : void 0,
4277
4303
  title: rowTitle ? rowTitle(r) : void 0,
4278
4304
  ...rowInteraction(r, onRowClick),
4279
- children: columns.map((c) => /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("td", { className: c.numeric ? "is-num" : "", children: cellOf(c, r) }, c.key))
4305
+ children: [
4306
+ columns.map((c) => /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("td", { className: c.numeric ? "is-num" : "", children: cellOf(c, r) }, c.key)),
4307
+ rowAction ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(RowActionCell, { action: rowAction(r) }) : null
4308
+ ]
4280
4309
  },
4281
4310
  r[rowKey]
4282
4311
  )) })
@@ -4289,7 +4318,7 @@ function DataTable({
4289
4318
  ] }) }) : null
4290
4319
  ] });
4291
4320
  }
4292
- function StackedRows({ columns, rows, rowKey, loading, stale, skeletonRows, sort, onSort, rowTitle, onRowClick, isSelected }) {
4321
+ function StackedRows({ columns, rows, rowKey, loading, stale, skeletonRows, sort, onSort, rowTitle, onRowClick, rowAction, isSelected }) {
4293
4322
  const sortable = onSort ? columns.filter((c) => c.sortable) : [];
4294
4323
  const primary = columns.filter((c) => c.phone === "primary");
4295
4324
  const secondary = columns.filter((c) => c.phone === "secondary");
@@ -4308,31 +4337,34 @@ function StackedRows({ columns, rows, rowKey, loading, stale, skeletonRows, sort
4308
4337
  c.key
4309
4338
  );
4310
4339
  }) }) : null,
4311
- /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("div", { className: stale ? "fd-dt-cards fd-stale" : "fd-dt-cards", children: loading ? Array.from({ length: skeletonRows }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("div", { className: "fd-dt-card", children: [
4340
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("div", { className: stale ? "fd-dt-cards fd-stale" : "fd-dt-cards", children: loading ? Array.from({ length: skeletonRows }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("div", { className: "fd-dt-item", children: /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("div", { className: "fd-dt-card", children: [
4312
4341
  /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: "fd-skel fd-skel-text", style: { display: "block", height: 14, width: i % 3 === 0 ? "55%" : "70%" } }),
4313
4342
  secondary.length ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: "fd-skel fd-skel-text", style: { display: "block", height: 12, width: "40%" } }) : null
4314
- ] }, i)) : rows.map((r) => {
4343
+ ] }) }, i)) : rows.map((r) => {
4315
4344
  const selected = isSelected(r);
4345
+ const action = rowAction ? rowAction(r) : null;
4316
4346
  const semantics = onRowClick ? { role: "button", "aria-pressed": selected } : { "aria-current": selected ? "true" : void 0 };
4317
- return /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(
4318
- "div",
4319
- {
4320
- className: "fd-dt-card",
4321
- title: rowTitle ? rowTitle(r) : void 0,
4322
- "data-selected": selected ? "true" : void 0,
4323
- ...semantics,
4324
- ...rowInteraction(r, onRowClick),
4325
- children: [
4326
- /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("div", { className: "fd-dt-card-title", children: primary.map((c) => /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: c.numeric ? "is-num" : void 0, children: cellOf(c, r) }, c.key)) }),
4327
- secondary.length ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("div", { className: "fd-dt-card-meta", children: secondary.map((c) => /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("span", { className: c.numeric ? "is-num" : void 0, children: [
4328
- /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: "fd-dt-card-label", children: c.label }),
4329
- " ",
4330
- cellOf(c, r)
4331
- ] }, c.key)) }) : null
4332
- ]
4333
- },
4334
- r[rowKey]
4335
- );
4347
+ return /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("div", { className: "fd-dt-item", children: [
4348
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(
4349
+ "div",
4350
+ {
4351
+ className: "fd-dt-card",
4352
+ title: rowTitle ? rowTitle(r) : void 0,
4353
+ "data-selected": selected ? "true" : void 0,
4354
+ ...semantics,
4355
+ ...rowInteraction(r, onRowClick),
4356
+ children: [
4357
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("div", { className: "fd-dt-card-title", children: primary.map((c) => /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: c.numeric ? "is-num" : void 0, children: cellOf(c, r) }, c.key)) }),
4358
+ secondary.length ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("div", { className: "fd-dt-card-meta", children: secondary.map((c) => /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("span", { className: c.numeric ? "is-num" : void 0, children: [
4359
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: "fd-dt-card-label", children: c.label }),
4360
+ " ",
4361
+ cellOf(c, r)
4362
+ ] }, c.key)) }) : null
4363
+ ]
4364
+ }
4365
+ ),
4366
+ action ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("div", { className: "fd-dt-action", children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(RowActionButton, { action, size: "md" }) }) : null
4367
+ ] }, r[rowKey]);
4336
4368
  }) })
4337
4369
  ] });
4338
4370
  }
@@ -4993,8 +5025,8 @@ function splitForMiddleEllipsis(text) {
4993
5025
  if (chars.length <= TAIL_CHARS) return { head: text, tail: "" };
4994
5026
  return { head: chars.slice(0, -TAIL_CHARS).join(""), tail: chars.slice(-TAIL_CHARS).join("") };
4995
5027
  }
4996
- function MiddleEllipsis({ text }) {
4997
- const { head, tail } = splitForMiddleEllipsis(text);
5028
+ function MiddleEllipsis({ text, middle = true }) {
5029
+ const { head, tail } = middle ? splitForMiddleEllipsis(text) : { head: text, tail: "" };
4998
5030
  return /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("span", { className: "fd-mid-ellipsis", children: [
4999
5031
  /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("span", { className: "fd-mid-ellipsis-head", children: head }),
5000
5032
  tail ? /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("span", { className: "fd-mid-ellipsis-tail", children: tail }) : null
@@ -5131,6 +5163,9 @@ function assertValidFieldDefinition(field) {
5131
5163
  );
5132
5164
  }
5133
5165
  }
5166
+ function joinsLabels(field, value) {
5167
+ return field.type === "multiSelect" && value?.values.length === 2;
5168
+ }
5134
5169
  function chipLabel(field, value) {
5135
5170
  switch (field.type) {
5136
5171
  case "text":
@@ -5885,7 +5920,7 @@ function FilterBar({ fields = [], filters, onFilterChange, onFilterRemove, align
5885
5920
  const valueText = set ? chipLabel(field, value) : "";
5886
5921
  const chipText = set ? field.label + ": " + valueText : field.label;
5887
5922
  const paintedText = field.icon && set ? valueText : chipText;
5888
- const chip = /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Tag, { icon: field.icon, selected: true, onClick: toggleOrClose, onRemove: remove, title: chipText, "aria-label": chipText, children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(MiddleEllipsis, { text: paintedText }) });
5923
+ const chip = /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Tag, { icon: field.icon, selected: true, onClick: toggleOrClose, onRemove: remove, title: chipText, "aria-label": chipText, children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(MiddleEllipsis, { text: paintedText, middle: !joinsLabels(field, value) }) });
5889
5924
  if (field.type === "text") {
5890
5925
  return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)("span", { className: "fd-filterbar-chip", children: chip }, field.key);
5891
5926
  }