@octaviaflow/core 3.1.0-beta.104 → 3.1.0-beta.106

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 +1 @@
1
- {"version":3,"file":"ExpressionField.d.ts","sourceRoot":"","sources":["../../../src/components/ExpressionField/ExpressionField.tsx"],"names":[],"mappings":"AA2BA,OAAO,EAML,KAAK,aAAa,EAIlB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAaf,6EAA6E;AAC7E,MAAM,WAAW,gBAAgB;IAC/B,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,IAAI,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;CAChC;AAED,uEAAuE;AACvE,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACrD;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,CAAC;IAC1D;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWzD;AAyBD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAiBpE;AAuBD,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,KAAK,EACL,WAAW,EACX,UAAU,EACV,QAAgB,EAChB,IAAQ,EACR,EAAE,EACF,SAAS,EACT,KAAK,EACL,YAAY,EACZ,WAAW,EACX,cAAsB,EACtB,YAAY,EAAE,SAAS,GACxB,EAAE,oBAAoB,2CA8XtB;AAuND,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"ExpressionField.d.ts","sourceRoot":"","sources":["../../../src/components/ExpressionField/ExpressionField.tsx"],"names":[],"mappings":"AA2BA,OAAO,EAML,KAAK,aAAa,EAIlB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAaf,6EAA6E;AAC7E,MAAM,WAAW,gBAAgB;IAC/B,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,IAAI,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;CAChC;AAED,uEAAuE;AACvE,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACrD;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,CAAC;IAC1D;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWzD;AAyBD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAiBpE;AAuBD,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,KAAK,EACL,WAAW,EACX,UAAU,EACV,QAAgB,EAChB,IAAQ,EACR,EAAE,EACF,SAAS,EACT,KAAK,EACL,YAAY,EACZ,WAAW,EACX,cAAsB,EACtB,YAAY,EAAE,SAAS,GACxB,EAAE,oBAAoB,2CAsatB;AA6OD,eAAe,eAAe,CAAC"}
package/dist/index.cjs CHANGED
@@ -41593,13 +41593,19 @@ function ExpressionField({
41593
41593
  const fieldId = id ?? generatedId;
41594
41594
  const helperId = `${fieldId}-helper`;
41595
41595
  const [editing, setEditing] = (0, import_react188.useState)(null);
41596
+ const resolveLabelRef = (0, import_react188.useRef)(resolveLabel);
41597
+ const resolveCallRef = (0, import_react188.useRef)(resolveCall);
41598
+ const pillEveryTokenRef = (0, import_react188.useRef)(pillEveryToken);
41599
+ resolveLabelRef.current = resolveLabel;
41600
+ resolveCallRef.current = resolveCall;
41601
+ pillEveryTokenRef.current = pillEveryToken;
41596
41602
  const labelFor = (0, import_react188.useCallback)(
41597
- (token) => resolveLabel?.(token) ?? shortReferenceLabel(token),
41598
- [resolveLabel]
41603
+ (token) => resolveLabelRef.current?.(token) ?? shortReferenceLabel(token),
41604
+ []
41599
41605
  );
41600
41606
  const callLabel = (0, import_react188.useCallback)(
41601
- (name) => resolveCall?.(name)?.label ?? (name.startsWith("user.") ? name.slice(5) : name),
41602
- [resolveCall]
41607
+ (name) => resolveCallRef.current?.(name)?.label ?? (name.startsWith("user.") ? name.slice(5) : name),
41608
+ []
41603
41609
  );
41604
41610
  const chipText = (0, import_react188.useCallback)(
41605
41611
  (name, args) => {
@@ -41622,8 +41628,18 @@ function ExpressionField({
41622
41628
  } else {
41623
41629
  el.className = CHIP;
41624
41630
  el.setAttribute("data-call", segment.name);
41625
- el.textContent = chipText(segment.name, segment.args);
41626
41631
  el.title = segment.raw;
41632
+ const text = document.createElement("span");
41633
+ text.className = "ods-expression-field__chip-text";
41634
+ text.textContent = chipText(segment.name, segment.args);
41635
+ el.appendChild(text);
41636
+ const open = document.createElement("span");
41637
+ open.className = "ods-expression-field__chip-open";
41638
+ open.setAttribute("data-open", "true");
41639
+ open.setAttribute("role", "button");
41640
+ open.setAttribute("aria-label", "Edit arguments");
41641
+ open.textContent = "\u2304";
41642
+ el.appendChild(open);
41627
41643
  }
41628
41644
  return el;
41629
41645
  },
@@ -41635,7 +41651,7 @@ function ExpressionField({
41635
41651
  if (!el) return;
41636
41652
  el.innerHTML = "";
41637
41653
  if (!raw) return;
41638
- for (const segment of parseExpression(raw, pillEveryToken)) {
41654
+ for (const segment of parseExpression(raw, pillEveryTokenRef.current)) {
41639
41655
  if (segment.kind === "text") {
41640
41656
  el.appendChild(document.createTextNode(segment.raw));
41641
41657
  continue;
@@ -41647,7 +41663,7 @@ function ExpressionField({
41647
41663
  }
41648
41664
  }
41649
41665
  },
41650
- [pillEveryToken, makeToken]
41666
+ [makeToken]
41651
41667
  );
41652
41668
  (0, import_react188.useEffect)(() => {
41653
41669
  if (fromSelf.current) {
@@ -41748,7 +41764,9 @@ function ExpressionField({
41748
41764
  const call = parseCall(raw);
41749
41765
  if (!call) return;
41750
41766
  editing.el.setAttribute("data-value", raw);
41751
- editing.el.textContent = chipText(call.name, call.args);
41767
+ const text = editing.el.querySelector(".ods-expression-field__chip-text");
41768
+ if (text) text.textContent = chipText(call.name, call.args);
41769
+ else editing.el.textContent = chipText(call.name, call.args);
41752
41770
  editing.el.title = raw;
41753
41771
  setEditing(null);
41754
41772
  commit();
@@ -41756,14 +41774,19 @@ function ExpressionField({
41756
41774
  },
41757
41775
  [editing, chipText, commit]
41758
41776
  );
41777
+ const handleMouseDown = (0, import_react188.useCallback)((e) => {
41778
+ const token = e.target.closest(`.${PILL}, .${CHIP}`);
41779
+ if (token) e.preventDefault();
41780
+ }, []);
41759
41781
  const handleClick = (0, import_react188.useCallback)(
41760
41782
  (e) => {
41761
- const target = e.target.closest(`.${PILL}, .${CHIP}`);
41783
+ const node = e.target;
41784
+ const target = node.closest(`.${PILL}, .${CHIP}`);
41762
41785
  if (!target) return;
41763
- selectToken(target);
41764
- if (!disabled && target.classList.contains(CHIP) && e.detail >= 2) {
41765
- openEditor(target);
41766
- }
41786
+ const chipEl = target;
41787
+ const wantsEditor = chipEl.classList.contains(CHIP) && (!!node.closest("[data-open]") || e.detail >= 2);
41788
+ selectToken(chipEl);
41789
+ if (!disabled && wantsEditor) openEditor(chipEl);
41767
41790
  },
41768
41791
  [disabled, openEditor, selectToken]
41769
41792
  );
@@ -41869,6 +41892,7 @@ function ExpressionField({
41869
41892
  style: { minHeight: `${Math.max(1, rows) * 1.5 + 1}rem` },
41870
41893
  onInput: commit,
41871
41894
  onBlur: handleBlur,
41895
+ onMouseDown: handleMouseDown,
41872
41896
  onClick: handleClick,
41873
41897
  onKeyDown: handleKeyDown,
41874
41898
  onCopy: handleCopy,
@@ -41925,6 +41949,13 @@ function CallEditor({
41925
41949
  if (at) crumbs.push({ label: nameOf(at.name), path: path.slice(0, i) });
41926
41950
  }
41927
41951
  const setArg = (index, next) => setDraft((d) => replaceArgument(d, [...path, index], next));
41952
+ const removeArg = (index) => setDraft((d) => {
41953
+ const at = callAt(d, path);
41954
+ if (!at) return d;
41955
+ const next = at.args.filter((_, i) => i !== index);
41956
+ const rebuilt = path.length === 0 ? formatCall(at.name, next) : `${at.name}(${next.join(", ")})`;
41957
+ return path.length === 0 ? rebuilt : replaceArgument(d, path, rebuilt);
41958
+ });
41928
41959
  const dropInto = (index) => (e) => {
41929
41960
  const dropped = e.dataTransfer.getData("application/x-fx-insert");
41930
41961
  if (!dropped) return;
@@ -41984,7 +42015,20 @@ function CallEditor({
41984
42015
  return (
41985
42016
  // eslint-disable-next-line react/no-array-index-key
41986
42017
  /* @__PURE__ */ (0, import_jsx_runtime174.jsxs)("div", { className: "ods-expression-field__editor-row", children: [
41987
- /* @__PURE__ */ (0, import_jsx_runtime174.jsx)("span", { id: `arg-${index}-label`, children: rowLabel }),
42018
+ /* @__PURE__ */ (0, import_jsx_runtime174.jsxs)("span", { className: "ods-expression-field__editor-row-head", children: [
42019
+ /* @__PURE__ */ (0, import_jsx_runtime174.jsx)("span", { id: `arg-${index}-label`, children: rowLabel }),
42020
+ /* @__PURE__ */ (0, import_jsx_runtime174.jsx)(
42021
+ "button",
42022
+ {
42023
+ type: "button",
42024
+ className: "ods-expression-field__editor-remove",
42025
+ "aria-label": `Remove ${rowLabel}`,
42026
+ title: "Remove this argument",
42027
+ onClick: () => removeArg(index),
42028
+ children: "\u2715"
42029
+ }
42030
+ )
42031
+ ] }),
41988
42032
  nested ? /* @__PURE__ */ (0, import_jsx_runtime174.jsxs)(
41989
42033
  "div",
41990
42034
  {
@@ -42047,14 +42091,14 @@ function CallEditor({
42047
42091
  "button",
42048
42092
  {
42049
42093
  type: "button",
42050
- className: "ods-expression-field__editor-link",
42094
+ className: "ods-expression-field__editor-add",
42051
42095
  onClick: () => setDraft((d) => {
42052
42096
  const at = callAt(d, path);
42053
42097
  if (!at) return d;
42054
42098
  const next = [...at.args, '""'];
42055
42099
  return path.length === 0 ? formatCall(at.name, next) : replaceArgument(d, path, `${at.name}(${next.join(", ")})`);
42056
42100
  }),
42057
- children: "+ argument"
42101
+ children: "+ Add argument"
42058
42102
  }
42059
42103
  )
42060
42104
  ] }),