@shwfed/config 2.7.7 → 2.8.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 (91) hide show
  1. package/dist/mcp.mjs +128 -55
  2. package/dist/module.json +1 -1
  3. package/dist/preview/assets/{badge-B0tiCpa_.js → badge-BI1mdo92.js} +1 -1
  4. package/dist/preview/assets/{config-jDPbLgBr.js → config-BNF2r9jW.js} +1 -1
  5. package/dist/preview/assets/{config-CGvnv-5x.js → config-BxuGYvER.js} +1 -1
  6. package/dist/preview/assets/{config-GCvXe12z.js → config-Cy5w3JWQ.js} +1 -1
  7. package/dist/preview/assets/{config-BG9TRQcv.js → config-DqUnpWZk.js} +1 -1
  8. package/dist/preview/assets/{config-C-XJ-8Rs.js → config-Du5SuNSb.js} +1 -1
  9. package/dist/preview/assets/{config-Dafqx9xC.js → config-DuzQXHvg.js} +1 -1
  10. package/dist/preview/assets/{config-Bfb2sH6S.js → config-OrJljNWU.js} +1 -1
  11. package/dist/preview/assets/{config-DqMRy1WL.js → config-XgVqueyq.js} +1 -1
  12. package/dist/preview/assets/{config-DDPihojt.js → config-ggyCcWNZ.js} +1 -1
  13. package/dist/preview/assets/{definition.vue_vue_type_script_setup_true_lang-DBXfCj4Q.js → definition.vue_vue_type_script_setup_true_lang-lEhYVEcN.js} +1 -1
  14. package/dist/preview/assets/{index-D7jDE3kp.js → index-BvLLQuQr.js} +1 -1
  15. package/dist/preview/assets/{index-B0PL01fm.css → index-DsMR5NfK.css} +1 -1
  16. package/dist/preview/assets/{index-CHzOsSTW.js → index-Yv78vz4W.js} +168 -168
  17. package/dist/preview/assets/index-yrBKwEfk.js +1 -0
  18. package/dist/preview/assets/{item-DV-Garrg.js → item-DMtXi_cx.js} +1 -1
  19. package/dist/preview/assets/{runtime-DKtlQWwc.js → runtime-2S3Yr051.js} +1 -1
  20. package/dist/preview/assets/{runtime-UmLaEUGf.js → runtime-BUPuX-Gq.js} +1 -1
  21. package/dist/preview/assets/{runtime-BovPWken.js → runtime-C4jFTZ4Z.js} +1 -1
  22. package/dist/preview/assets/{runtime-DA77AmOP.js → runtime-CA58Mif7.js} +1 -1
  23. package/dist/preview/assets/{runtime-BxBBFFHA.js → runtime-CWqQzWuc.js} +1 -1
  24. package/dist/preview/assets/{runtime-D-LBi56N.js → runtime-CjJBU_e1.js} +1 -1
  25. package/dist/preview/assets/{runtime-DHTqFEQI.js → runtime-DeUmGsM_.js} +1 -1
  26. package/dist/preview/assets/{runtime-CwmJ9MLQ.js → runtime-DnXoWy2A.js} +1 -1
  27. package/dist/preview/assets/{runtime-Cyjx6haa.js → runtime-wVZ1xP8L.js} +1 -1
  28. package/dist/preview/index.html +2 -2
  29. package/dist/runtime/components/block-layout-editor/index.vue +1 -4
  30. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.table/config.d.vue.ts +2 -0
  31. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.table/config.vue.d.ts +2 -0
  32. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.table/runtime.d.vue.ts +2 -0
  33. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.table/runtime.vue.d.ts +2 -0
  34. package/dist/runtime/components/config/blocks/2026-05-06/com.shwfed.block.table/schema.d.ts +2 -0
  35. package/dist/runtime/components/config/blocks/2026-05-17/com.shwfed.block.chart.xy/config.vue +5 -0
  36. package/dist/runtime/components/config/blocks/2026-06-02/com.shwfed.block.card/config.vue +2 -0
  37. package/dist/runtime/components/config/blocks/2026-06-02/com.shwfed.block.card/schema.d.ts +5 -0
  38. package/dist/runtime/components/config/blocks/2026-06-02/com.shwfed.block.card/schema.js +8 -3
  39. package/dist/runtime/components/form/config.vue +24 -16
  40. package/dist/runtime/components/form/fields/2026-04-22/com.shwfed.form.field.markdown/runtime.vue +12 -1
  41. package/dist/runtime/components/form/fields/2026-04-22/com.shwfed.form.field.markdown/schema.d.ts +8 -2
  42. package/dist/runtime/components/form/fields/2026-04-22/com.shwfed.form.field.markdown/schema.js +3 -3
  43. package/dist/runtime/components/form/fields/2026-04-22/com.shwfed.form.field.textarea/config.d.vue.ts +2 -2
  44. package/dist/runtime/components/form/fields/2026-04-22/com.shwfed.form.field.textarea/config.vue +15 -25
  45. package/dist/runtime/components/form/fields/2026-04-22/com.shwfed.form.field.textarea/config.vue.d.ts +2 -2
  46. package/dist/runtime/components/form/fields/2026-04-22/com.shwfed.form.field.textarea/runtime.vue +11 -2
  47. package/dist/runtime/components/form/fields/2026-04-22/com.shwfed.form.field.textarea/schema.d.ts +1 -1
  48. package/dist/runtime/components/form/fields/2026-04-22/com.shwfed.form.field.textarea/schema.js +4 -4
  49. package/dist/runtime/components/form/fields/2026-05-18/com.shwfed.form.field.table/config.d.vue.ts +2 -0
  50. package/dist/runtime/components/form/fields/2026-05-18/com.shwfed.form.field.table/config.vue.d.ts +2 -0
  51. package/dist/runtime/components/form/fields/2026-05-18/com.shwfed.form.field.table/schema.d.ts +2 -0
  52. package/dist/runtime/components/form/index.vue +5 -1
  53. package/dist/runtime/components/form/schema.d.ts +1 -1
  54. package/dist/runtime/components/form/schema.js +6 -1
  55. package/dist/runtime/components/form/utils/form-vars.js +2 -0
  56. package/dist/runtime/components/form/utils/schema-meta.d.ts +2 -0
  57. package/dist/runtime/components/form/utils/schema-meta.js +24 -0
  58. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/config.d.vue.ts +2 -2
  59. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/config.vue.d.ts +2 -2
  60. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-static/config.d.vue.ts +2 -2
  61. package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-static/config.vue.d.ts +2 -2
  62. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/config.d.vue.ts +2 -2
  63. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/config.vue.d.ts +2 -2
  64. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-static/config.d.vue.ts +2 -2
  65. package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-static/config.vue.d.ts +2 -2
  66. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/config.d.vue.ts +2 -2
  67. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/config.vue.d.ts +2 -2
  68. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/config.d.vue.ts +2 -2
  69. package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/config.vue.d.ts +2 -2
  70. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/config.d.vue.ts +2 -2
  71. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/config.vue.d.ts +2 -2
  72. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/config.d.vue.ts +2 -2
  73. package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/config.vue.d.ts +2 -2
  74. package/dist/runtime/components/table/config.vue +30 -36
  75. package/dist/runtime/components/table/index.d.vue.ts +2 -0
  76. package/dist/runtime/components/table/index.vue +8 -0
  77. package/dist/runtime/components/table/index.vue.d.ts +2 -0
  78. package/dist/runtime/components/table/schema.d.ts +4 -0
  79. package/dist/runtime/components/table/schema.js +4 -0
  80. package/dist/runtime/components/ui/expression-editor/ExpressionEditor.d.vue.ts +4 -3
  81. package/dist/runtime/components/ui/expression-editor/ExpressionEditor.vue +135 -111
  82. package/dist/runtime/components/ui/expression-editor/ExpressionEditor.vue.d.ts +4 -3
  83. package/dist/runtime/share/expression.d.ts +23 -0
  84. package/dist/runtime/share/expression.js +37 -17
  85. package/dist/runtime/share/use-persisted-query.d.ts +21 -0
  86. package/dist/runtime/share/use-persisted-query.js +33 -0
  87. package/dist/runtime/vendor/cel-js/CLAUDE.md +2 -2
  88. package/dist/runtime/vendor/cel-js/PROMPT.md +15 -6
  89. package/dist/runtime/vendor/cel-js/lib/macros.js +66 -14
  90. package/package.json +1 -1
  91. package/dist/preview/assets/index-CSfKAdi7.js +0 -1
@@ -0,0 +1 @@
1
+ import{b2 as e}from"./index-Yv78vz4W.js";import{b3 as f,b4 as r,b5 as s}from"./index-Yv78vz4W.js";export{f as TableConfig,r as createTableConfig,e as default,s as getColumnTechnicalKey};
@@ -1 +1 @@
1
- import{d as q,u as B,o as O,w as y,a as M,c as E,n as T,b as V,r as x,e as o,g as z,f as A,h as s,i as J,j as L,p as P,l as U,k as W,m as D,q as g,s as G,t as h,v as H}from"./index-CHzOsSTW.js";import K from"./index-D7jDE3kp.js";const X=q({name:"ShwfedBlockAnimatedNumberItem",__name:"item",props:{item:{}},setup(b){const n=b,j=G(),a=x(void 0),m=x(0);function u(){return D(j)}function S(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"&&e.trim()!==""){const t=Number(e);return Number.isFinite(t)?t:0}return 0}const d=o(()=>a.value===void 0?g():H(a.value));function v(e){if(!e)return"";try{const t=h(s(e,{...u(),json:d.value}));return t==null?"":String(t)}catch{return""}}const w=o(()=>v(n.item.prefix)),_=o(()=>v(n.item.suffix));function C(e){if(e)try{const t=h(s(e,{...u(),json:d.value}));return t==null?void 0:typeof t=="string"||typeof t=="object"?t:String(t)}catch{return}}const F=o(()=>C(n.item.style));async function r(){const e=n.item.dataSource,t=u(),N=z(function*(){let i=g();e.request&&(i=yield*A(yield*s(e.request,t)));const k=yield*s(e.value,{...t,json:i});return{json:J(i),value:k}});try{const i=await L(P(N,U));a.value=i.json,m.value=S(i.value)}catch(i){console.warn("[shwfed-animated-number] fetch failed",i)}}const l=o(()=>(n.item.pollingInterval??0)>0),I=o(()=>Math.max(1,n.item.pollingInterval??1)*1e3),c=W(),{pause:p,resume:f}=B(()=>{r()},I,{immediate:!1});return O(()=>{r(),l.value&&c.value&&f()}),y(c,e=>{l.value&&(e?(r(),f()):p())}),y(()=>[n.item.dataSource.request??"",n.item.dataSource.value,n.item.pollingInterval??0].join("|"),()=>{r(),l.value&&c.value?f():p()}),(e,t)=>(M(),E(V(K),{value:m.value,prefix:w.value,suffix:_.value,style:T(F.value)},null,8,["value","prefix","suffix","style"]))}});export{X as default};
1
+ import{d as q,u as B,o as O,w as y,a as M,c as E,n as T,b as V,r as x,e as o,g as z,f as A,h as s,i as J,j as L,p as P,l as U,k as W,m as D,q as g,s as G,t as h,v as H}from"./index-Yv78vz4W.js";import K from"./index-BvLLQuQr.js";const X=q({name:"ShwfedBlockAnimatedNumberItem",__name:"item",props:{item:{}},setup(b){const n=b,j=G(),a=x(void 0),m=x(0);function u(){return D(j)}function S(e){if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"&&e.trim()!==""){const t=Number(e);return Number.isFinite(t)?t:0}return 0}const d=o(()=>a.value===void 0?g():H(a.value));function v(e){if(!e)return"";try{const t=h(s(e,{...u(),json:d.value}));return t==null?"":String(t)}catch{return""}}const w=o(()=>v(n.item.prefix)),_=o(()=>v(n.item.suffix));function C(e){if(e)try{const t=h(s(e,{...u(),json:d.value}));return t==null?void 0:typeof t=="string"||typeof t=="object"?t:String(t)}catch{return}}const F=o(()=>C(n.item.style));async function r(){const e=n.item.dataSource,t=u(),N=z(function*(){let i=g();e.request&&(i=yield*A(yield*s(e.request,t)));const k=yield*s(e.value,{...t,json:i});return{json:J(i),value:k}});try{const i=await L(P(N,U));a.value=i.json,m.value=S(i.value)}catch(i){console.warn("[shwfed-animated-number] fetch failed",i)}}const l=o(()=>(n.item.pollingInterval??0)>0),I=o(()=>Math.max(1,n.item.pollingInterval??1)*1e3),c=W(),{pause:p,resume:f}=B(()=>{r()},I,{immediate:!1});return O(()=>{r(),l.value&&c.value&&f()}),y(c,e=>{l.value&&(e?(r(),f()):p())}),y(()=>[n.item.dataSource.request??"",n.item.dataSource.value,n.item.pollingInterval??0].join("|"),()=>{r(),l.value&&c.value?f():p()}),(e,t)=>(M(),E(V(K),{value:m.value,prefix:w.value,suffix:_.value,style:T(F.value)},null,8,["value","prefix","suffix","style"]))}});export{X as default};
@@ -1 +1 @@
1
- import{d as l,G as u,g,aE as m,M as d,aF as p,aG as x,aH as E,c as _,b as h,h as k,m as w,aI as C,s as I,aJ as b,a as v}from"./index-CHzOsSTW.js";import{_ as y}from"./definition.vue_vue_type_script_setup_true_lang-DBXfCj4Q.js";const R=l({name:"ShwfedHttpRequestConfirmActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(s){const n=s,{locale:i}=u(),a=I(),t=(e,o)=>k(e,{...w(a),...o}),r=b(),c=C(),f=g(function*(){if(c&&!(yield*m(()=>c())))return;const e=d(n.config.markdown,i.value)??"",o=p(e,t);(yield*x({content:o,icon:n.config.icon,color:n.config.color}))||(yield*E(n.config.expression,t,{messageExpression:n.config.messageExpression,resultExpression:n.config.resultExpression,channel:r,triggers:{success:n.config.onSuccess,warning:n.config.onWarning,error:n.config.onError,info:n.config.onInfo}}))});return(e,o)=>(v(),_(y,{"action-id":s.buttonId,effect:h(f)},null,8,["action-id","effect"]))}});export{R as default};
1
+ import{d as l,G as u,g,aE as m,M as d,aF as p,aG as x,aH as E,c as _,b as h,h as k,m as w,aI as C,s as I,aJ as b,a as v}from"./index-Yv78vz4W.js";import{_ as y}from"./definition.vue_vue_type_script_setup_true_lang-lEhYVEcN.js";const R=l({name:"ShwfedHttpRequestConfirmActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(s){const n=s,{locale:i}=u(),a=I(),t=(e,o)=>k(e,{...w(a),...o}),r=b(),c=C(),f=g(function*(){if(c&&!(yield*m(()=>c())))return;const e=d(n.config.markdown,i.value)??"",o=p(e,t);(yield*x({content:o,icon:n.config.icon,color:n.config.color}))||(yield*E(n.config.expression,t,{messageExpression:n.config.messageExpression,resultExpression:n.config.resultExpression,channel:r,triggers:{success:n.config.onSuccess,warning:n.config.onWarning,error:n.config.onError,info:n.config.onInfo}}))});return(e,o)=>(v(),_(y,{"action-id":s.buttonId,effect:h(f)},null,8,["action-id","effect"]))}});export{R as default};
@@ -1 +1 @@
1
- import{d as u,G as i,c as l,b as p,e as m,a as d,J as f,M as _,aF as k,h as w,m as x,s as g}from"./index-CHzOsSTW.js";const B=u({name:"ShwfedMarkdownItemRuntime",__name:"runtime",props:{config:{}},setup(n){const o=n,{locale:t}=i(),a=g(),c=(e,s)=>w(e,{...x(a),...s}),r=m(()=>{const e=_(o.config.content,t.value)??"";return k(e,c)});return(e,s)=>(d(),l(p(f),{"data-slot":"buttons-markdown",source:r.value,class:"prose prose-sm prose-zinc px-1"},null,8,["source"]))}});export{B as default};
1
+ import{d as u,G as i,c as l,b as p,e as m,a as d,J as f,M as _,aF as k,h as w,m as x,s as g}from"./index-Yv78vz4W.js";const B=u({name:"ShwfedMarkdownItemRuntime",__name:"runtime",props:{config:{}},setup(n){const o=n,{locale:t}=i(),a=g(),c=(e,s)=>w(e,{...x(a),...s}),r=m(()=>{const e=_(o.config.content,t.value)??"";return k(e,c)});return(e,s)=>(d(),l(p(f),{"data-slot":"buttons-markdown",source:r.value,class:"prose prose-sm prose-zinc px-1"},null,8,["source"]))}});export{B as default};
@@ -1 +1 @@
1
- import{d as u,aK as p,aE as m,aL as a,aM as g,aH as d,c as l,b as x,h as E,m as _,aI as h,s as C,aJ as I,a as b}from"./index-CHzOsSTW.js";import{_ as v}from"./definition.vue_vue_type_script_setup_true_lang-DBXfCj4Q.js";const R=u({name:"ShwfedHttpRequestActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(t){const e=t,c=C(),i=(n,s)=>E(n,{..._(c),...s}),r=I(),o=h(),f=p(()=>{const n=o?m(()=>o()):a(!0);return g(n,s=>s?d(e.config.expression,i,{messageExpression:e.config.messageExpression,resultExpression:e.config.resultExpression,channel:r,triggers:{success:e.config.onSuccess,warning:e.config.onWarning,error:e.config.onError,info:e.config.onInfo}}):a(void 0))});return(n,s)=>(b(),l(v,{"action-id":t.buttonId,effect:x(f)},null,8,["action-id","effect"]))}});export{R as default};
1
+ import{d as u,aK as p,aE as m,aL as a,aM as g,aH as d,c as l,b as x,h as E,m as _,aI as h,s as C,aJ as I,a as b}from"./index-Yv78vz4W.js";import{_ as v}from"./definition.vue_vue_type_script_setup_true_lang-lEhYVEcN.js";const R=u({name:"ShwfedHttpRequestActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(t){const e=t,c=C(),i=(n,s)=>E(n,{..._(c),...s}),r=I(),o=h(),f=p(()=>{const n=o?m(()=>o()):a(!0);return g(n,s=>s?d(e.config.expression,i,{messageExpression:e.config.messageExpression,resultExpression:e.config.resultExpression,channel:r,triggers:{success:e.config.onSuccess,warning:e.config.onWarning,error:e.config.onError,info:e.config.onInfo}}):a(void 0))});return(n,s)=>(b(),l(v,{"action-id":t.buttonId,effect:x(f)},null,8,["action-id","effect"]))}});export{R as default};
@@ -1 +1 @@
1
- import{d as _,aK as E,g as S,aQ as r,aV as m,aW as b,aX as j,c as v,b as x,h as B,m as L,aJ as k,s as C,a as R}from"./index-CHzOsSTW.js";import{_ as T}from"./definition.vue_vue_type_script_setup_true_lang-DBXfCj4Q.js";const q=_({name:"ShwfedHttpDownloadActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(d){const c=d,g=C(),t=(e,n)=>B(e,{...L(g),...n}),l=k(),p=new Set(["success","error","warning","info"]);function f(e){const n=URL.createObjectURL(e),o=document.createElement("a");o.href=n,o.download=e.name,document.body.appendChild(o),o.click(),o.remove(),URL.revokeObjectURL(n)}const y=E(()=>S(function*(){const{template:e,messageExpression:n,resultExpression:o}=c.config,u=yield*t(e.request);if(!e.download){const s=yield*u.file();return yield*r(()=>f(s)),yield*m(l,c.config.onSuccess)}const a={json:yield*u.json()},i=o===void 0?"success":yield*b(t(o,a),s=>p.has(s)?s:"success");if(n!==void 0){const s=yield*t(n,a);yield*r(()=>j[i](s))}if(i==="success"||i==="info"){const w=yield*(yield*t(e.download,a)).file();yield*r(()=>f(w))}const h={success:c.config.onSuccess,warning:c.config.onWarning,error:c.config.onError,info:c.config.onInfo};return yield*m(l,h[i])}));return(e,n)=>(R(),v(T,{"action-id":d.buttonId,effect:x(y)},null,8,["action-id","effect"]))}});export{q as default};
1
+ import{d as _,aK as E,g as S,aQ as r,aV as m,aW as b,aX as j,c as v,b as x,h as B,m as L,aJ as k,s as C,a as R}from"./index-Yv78vz4W.js";import{_ as T}from"./definition.vue_vue_type_script_setup_true_lang-lEhYVEcN.js";const q=_({name:"ShwfedHttpDownloadActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(d){const c=d,g=C(),t=(e,n)=>B(e,{...L(g),...n}),l=k(),p=new Set(["success","error","warning","info"]);function f(e){const n=URL.createObjectURL(e),o=document.createElement("a");o.href=n,o.download=e.name,document.body.appendChild(o),o.click(),o.remove(),URL.revokeObjectURL(n)}const y=E(()=>S(function*(){const{template:e,messageExpression:n,resultExpression:o}=c.config,u=yield*t(e.request);if(!e.download){const s=yield*u.file();return yield*r(()=>f(s)),yield*m(l,c.config.onSuccess)}const a={json:yield*u.json()},i=o===void 0?"success":yield*b(t(o,a),s=>p.has(s)?s:"success");if(n!==void 0){const s=yield*t(n,a);yield*r(()=>j[i](s))}if(i==="success"||i==="info"){const w=yield*(yield*t(e.download,a)).file();yield*r(()=>f(w))}const h={success:c.config.onSuccess,warning:c.config.onWarning,error:c.config.onError,info:c.config.onInfo};return yield*m(l,h[i])}));return(e,n)=>(R(),v(T,{"action-id":d.buttonId,effect:x(y)},null,8,["action-id","effect"]))}});export{q as default};
@@ -1 +1 @@
1
- import{d as l,aY as g,aK as A,aM as y,aV as h,c as _,b,h as S,m as j,aJ as k,aZ as C,a as B,s as O}from"./index-CHzOsSTW.js";import{_ as x}from"./definition.vue_vue_type_script_setup_true_lang-DBXfCj4Q.js";const I=l({name:"ShwfedStateWriteActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(r){const s=r,i=O(),f=(e,t)=>S(e,{...j(i),...t}),n=g(),c=n.kind==="form"&&n.parent?n.parent:n,u=k(),m=C((e,t,a)=>{if(Array.isArray(e[t])&&Array.isArray(a))return e[t]=a,!0});function o(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function p(e,t){return o(e)&&o(t)?m({...t},e):t}const d=A(()=>y(f(s.config.expression),e=>{for(const t of Object.keys(e)){const a=p(c.getAt(t),e[t]);c.setAt(t,a)}return h(u,s.config.onSuccess)}));return(e,t)=>(B(),_(x,{"action-id":r.buttonId,effect:b(d)},null,8,["action-id","effect"]))}});export{I as default};
1
+ import{d as l,aY as g,aK as A,aM as y,aV as h,c as _,b,h as S,m as j,aJ as k,aZ as C,a as B,s as O}from"./index-Yv78vz4W.js";import{_ as x}from"./definition.vue_vue_type_script_setup_true_lang-lEhYVEcN.js";const I=l({name:"ShwfedStateWriteActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(r){const s=r,i=O(),f=(e,t)=>S(e,{...j(i),...t}),n=g(),c=n.kind==="form"&&n.parent?n.parent:n,u=k(),m=C((e,t,a)=>{if(Array.isArray(e[t])&&Array.isArray(a))return e[t]=a,!0});function o(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function p(e,t){return o(e)&&o(t)?m({...t},e):t}const d=A(()=>y(f(s.config.expression),e=>{for(const t of Object.keys(e)){const a=p(c.getAt(t),e[t]);c.setAt(t,a)}return h(u,s.config.onSuccess)}));return(e,t)=>(B(),_(x,{"action-id":r.buttonId,effect:b(d)},null,8,["action-id","effect"]))}});export{I as default};
@@ -1 +1 @@
1
- import{d as i,G as x,aO as M,g as T,M as c,aP as p,t as S,c as b,H as d,b as u,r as N,y as k,aJ as I,aQ as L,a as H,S as w,n as A,I as r,aR as F,aS as R,ax as V,s as $,aT as f,D as m,aU as j}from"./index-CHzOsSTW.js";import{_ as z}from"./definition.vue_vue_type_script_setup_true_lang-DBXfCj4Q.js";const Y=i({name:"ShwfedModalLayoutActionRuntime",__name:"runtime",props:{buttonId:{},config:{},buttonTitle:{}},setup(n){const a=n,{locale:l}=x(),v=e=>{},g=$(),s=k(f,void 0),h=I(),o=N(null),C=M(a.buttonId,{close:()=>L(()=>{o.value?.()})},h),y=i({name:"ModalBoundaryBridge",setup(e,{slots:t}){return R(g),m(j,C),s&&m(f,s),()=>t.default?.()}}),E=(e,t)=>V()?.(e,t),_=T(function*(){const e=c(a.config.modalTitle,l.value)??c(a.buttonTitle,l.value)??"",{modal:t,close:B}=yield*p({title:e,width:a.config.modalWidth});o.value=()=>S(B()),yield*t,o.value=null});return(e,t)=>(H(),b(z,{"action-id":n.buttonId,effect:u(_)},{default:d(()=>[w("div",{style:A(n.config.modalMinHeight?`min-height: ${n.config.modalMinHeight}`:void 0)},[r(u(y),null,{default:d(()=>[r(F,{"slot-value":n.config.slot,configure:v,"find-entry":E},null,8,["slot-value"])]),_:1})],4)]),_:1},8,["action-id","effect"]))}});export{Y as default};
1
+ import{d as i,G as x,aO as M,g as T,M as c,aP as p,t as S,c as b,H as d,b as u,r as N,y as k,aJ as I,aQ as L,a as H,S as w,n as A,I as r,aR as F,aS as R,ax as V,s as $,aT as f,D as m,aU as j}from"./index-Yv78vz4W.js";import{_ as z}from"./definition.vue_vue_type_script_setup_true_lang-lEhYVEcN.js";const Y=i({name:"ShwfedModalLayoutActionRuntime",__name:"runtime",props:{buttonId:{},config:{},buttonTitle:{}},setup(n){const a=n,{locale:l}=x(),v=e=>{},g=$(),s=k(f,void 0),h=I(),o=N(null),C=M(a.buttonId,{close:()=>L(()=>{o.value?.()})},h),y=i({name:"ModalBoundaryBridge",setup(e,{slots:t}){return R(g),m(j,C),s&&m(f,s),()=>t.default?.()}}),E=(e,t)=>V()?.(e,t),_=T(function*(){const e=c(a.config.modalTitle,l.value)??c(a.buttonTitle,l.value)??"",{modal:t,close:B}=yield*p({title:e,width:a.config.modalWidth});o.value=()=>S(B()),yield*t,o.value=null});return(e,t)=>(H(),b(z,{"action-id":n.buttonId,effect:u(_)},{default:d(()=>[w("div",{style:A(n.config.modalMinHeight?`min-height: ${n.config.modalMinHeight}`:void 0)},[r(u(y),null,{default:d(()=>[r(F,{"slot-value":n.config.slot,configure:v,"find-entry":E},null,8,["slot-value"])]),_:1})],4)]),_:1},8,["action-id","effect"]))}});export{Y as default};
@@ -1 +1 @@
1
- import{_ as n}from"./definition.vue_vue_type_script_setup_true_lang-DBXfCj4Q.js";import{d as o,c as a,b as c,a as f,aN as i}from"./index-CHzOsSTW.js";const _=o({name:"ShwfedPrototypeActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(t){const e=i;return(r,s)=>(f(),a(n,{"action-id":t.buttonId,effect:c(e)},null,8,["action-id","effect"]))}});export{_ as default};
1
+ import{_ as n}from"./definition.vue_vue_type_script_setup_true_lang-lEhYVEcN.js";import{d as o,c as a,b as c,a as f,aN as i}from"./index-Yv78vz4W.js";const _=o({name:"ShwfedPrototypeActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(t){const e=i;return(r,s)=>(f(),a(n,{"action-id":t.buttonId,effect:c(e)},null,8,["action-id","effect"]))}});export{_ as default};
@@ -1 +1 @@
1
- import{_ as c}from"./definition.vue_vue_type_script_setup_true_lang-DBXfCj4Q.js";import{d as s,aK as o,aV as i,c as r,b as f,aJ as u,a as m}from"./index-CHzOsSTW.js";const g=s({name:"ShwfedEventDispatchActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(e){const n=e,t=u(),a=o(()=>i(t,n.config.triggers));return(p,d)=>(m(),r(c,{"action-id":e.buttonId,effect:f(a)},null,8,["action-id","effect"]))}});export{g as default};
1
+ import{_ as c}from"./definition.vue_vue_type_script_setup_true_lang-lEhYVEcN.js";import{d as s,aK as o,aV as i,c as r,b as f,aJ as u,a as m}from"./index-Yv78vz4W.js";const g=s({name:"ShwfedEventDispatchActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(e){const n=e,t=u(),a=o(()=>i(t,n.config.triggers));return(p,d)=>(m(),r(c,{"action-id":e.buttonId,effect:f(a)},null,8,["action-id","effect"]))}});export{g as default};
@@ -1 +1 @@
1
- import{d as f,aK as u,aM as l,aE as d,c as m,b as w,h as p,m as h,s as _,a as g}from"./index-CHzOsSTW.js";import{_ as b}from"./definition.vue_vue_type_script_setup_true_lang-DBXfCj4Q.js";function v(){return{resolve:e=>({href:new URL(e,window.location.href).href})}}function x(e,t){return window.location.assign(e),Promise.resolve()}const B=f({name:"ShwfedNavigationActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(e){const t=e,i=v(),a=_(),r=(n,o)=>p(n,{...h(a),...o});function c(n){try{return new URL(n,window.location.href).origin!==window.location.origin}catch{return!1}}const s=u(()=>l(r(t.config.url),n=>d(async()=>{const o=c(n);if(t.config.mode==="_blank"){window.open(o?n:i.resolve(n).href,"_blank");return}await x(n)})));return(n,o)=>(g(),m(b,{"action-id":e.buttonId,effect:w(s)},null,8,["action-id","effect"]))}});export{B as default};
1
+ import{d as f,aK as u,aM as l,aE as d,c as m,b as w,h as p,m as h,s as _,a as g}from"./index-Yv78vz4W.js";import{_ as b}from"./definition.vue_vue_type_script_setup_true_lang-lEhYVEcN.js";function v(){return{resolve:e=>({href:new URL(e,window.location.href).href})}}function x(e,t){return window.location.assign(e),Promise.resolve()}const B=f({name:"ShwfedNavigationActionRuntime",__name:"runtime",props:{buttonId:{},config:{}},setup(e){const t=e,i=v(),a=_(),r=(n,o)=>p(n,{...h(a),...o});function c(n){try{return new URL(n,window.location.href).origin!==window.location.origin}catch{return!1}}const s=u(()=>l(r(t.config.url),n=>d(async()=>{const o=c(n);if(t.config.mode==="_blank"){window.open(o?n:i.resolve(n).href,"_blank");return}await x(n)})));return(n,o)=>(g(),m(b,{"action-id":e.buttonId,effect:w(s)},null,8,["action-id","effect"]))}});export{B as default};
@@ -10,8 +10,8 @@
10
10
  `--primary`, the primary button variant renders as transparent. */
11
11
  body { --primary: #009689; }
12
12
  </style>
13
- <script type="module" crossorigin src="./assets/index-CHzOsSTW.js"></script>
14
- <link rel="stylesheet" crossorigin href="./assets/index-B0PL01fm.css">
13
+ <script type="module" crossorigin src="./assets/index-Yv78vz4W.js"></script>
14
+ <link rel="stylesheet" crossorigin href="./assets/index-DsMR5NfK.css">
15
15
  </head>
16
16
  <body>
17
17
  <div id="app"></div>
@@ -195,9 +195,8 @@ function recenter() {
195
195
  const frame = activeFrame.value;
196
196
  const frameW = frame.cols * stepPx.value;
197
197
  const frameH = frame.rows * stepPx.value;
198
- const rightInset = inlineItem.value ? inlinePaneWidth.value : 0;
199
198
  coordinate.value = {
200
- x: Math.round((rect.width - rightInset - frameW) / 2),
199
+ x: Math.round((rect.width - frameW) / 2),
201
200
  y: Math.round((rect.height - frameH) / 2)
202
201
  };
203
202
  }
@@ -823,7 +822,6 @@ function requestDrill(itemId) {
823
822
  function closeInline() {
824
823
  setSelection([]);
825
824
  }
826
- watch(() => inlineItemId.value !== null, () => recenterSoon());
827
825
  let paneResize = null;
828
826
  function beginPaneResize(e) {
829
827
  if (e.button !== 0) return;
@@ -841,7 +839,6 @@ useEventListener("mousemove", (e) => {
841
839
  useEventListener("mouseup", () => {
842
840
  if (!paneResize) return;
843
841
  paneResize = null;
844
- recenterSoon();
845
842
  });
846
843
  </script>
847
844
 
@@ -156,6 +156,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {},
156
156
  readonly pageSizes?: readonly number[] | undefined;
157
157
  readonly pageIndex?: number | undefined;
158
158
  } | undefined;
159
+ readonly persistQuery?: boolean | undefined;
159
160
  readonly initialState?: {
160
161
  readonly expanded?: boolean | {
161
162
  readonly [x: string]: boolean;
@@ -336,6 +337,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {},
336
337
  readonly pageSizes?: readonly number[] | undefined;
337
338
  readonly pageIndex?: number | undefined;
338
339
  } | undefined;
340
+ readonly persistQuery?: boolean | undefined;
339
341
  readonly initialState?: {
340
342
  readonly expanded?: boolean | {
341
343
  readonly [x: string]: boolean;
@@ -156,6 +156,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {},
156
156
  readonly pageSizes?: readonly number[] | undefined;
157
157
  readonly pageIndex?: number | undefined;
158
158
  } | undefined;
159
+ readonly persistQuery?: boolean | undefined;
159
160
  readonly initialState?: {
160
161
  readonly expanded?: boolean | {
161
162
  readonly [x: string]: boolean;
@@ -336,6 +337,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {},
336
337
  readonly pageSizes?: readonly number[] | undefined;
337
338
  readonly pageIndex?: number | undefined;
338
339
  } | undefined;
340
+ readonly persistQuery?: boolean | undefined;
339
341
  readonly initialState?: {
340
342
  readonly expanded?: boolean | {
341
343
  readonly [x: string]: boolean;
@@ -151,6 +151,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
151
151
  readonly pageSizes?: readonly number[] | undefined;
152
152
  readonly pageIndex?: number | undefined;
153
153
  } | undefined;
154
+ readonly persistQuery?: boolean | undefined;
154
155
  readonly initialState?: {
155
156
  readonly expanded?: boolean | {
156
157
  readonly [x: string]: boolean;
@@ -331,6 +332,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
331
332
  readonly pageSizes?: readonly number[] | undefined;
332
333
  readonly pageIndex?: number | undefined;
333
334
  } | undefined;
335
+ readonly persistQuery?: boolean | undefined;
334
336
  readonly initialState?: {
335
337
  readonly expanded?: boolean | {
336
338
  readonly [x: string]: boolean;
@@ -151,6 +151,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
151
151
  readonly pageSizes?: readonly number[] | undefined;
152
152
  readonly pageIndex?: number | undefined;
153
153
  } | undefined;
154
+ readonly persistQuery?: boolean | undefined;
154
155
  readonly initialState?: {
155
156
  readonly expanded?: boolean | {
156
157
  readonly [x: string]: boolean;
@@ -331,6 +332,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
331
332
  readonly pageSizes?: readonly number[] | undefined;
332
333
  readonly pageIndex?: number | undefined;
333
334
  } | undefined;
335
+ readonly persistQuery?: boolean | undefined;
334
336
  readonly initialState?: {
335
337
  readonly expanded?: boolean | {
336
338
  readonly [x: string]: boolean;
@@ -166,6 +166,7 @@ export declare function schema(configure: (env: Environment) => void, _blockRef:
166
166
  readonly pageSizes?: readonly number[] | undefined;
167
167
  readonly pageIndex?: number | undefined;
168
168
  } | undefined;
169
+ readonly persistQuery?: boolean | undefined;
169
170
  readonly initialState?: {
170
171
  readonly expanded?: boolean | {
171
172
  readonly [x: string]: boolean;
@@ -447,6 +448,7 @@ export declare function schema(configure: (env: Environment) => void, _blockRef:
447
448
  message: Schema.SchemaClass<string, string, never>;
448
449
  }>]>>;
449
450
  }>>;
451
+ persistQuery: Schema.optional<Schema.SchemaClass<boolean, boolean, never>>;
450
452
  initialState: Schema.optional<Schema.Struct<{
451
453
  columnVisibility: Schema.optional<Schema.Record$<typeof Schema.String, typeof Schema.Boolean>>;
452
454
  columnOrder: Schema.optional<Schema.Array$<typeof Schema.String>>;
@@ -384,6 +384,7 @@ function removeY(i) {
384
384
  :model-value="block.x"
385
385
  result-type="list"
386
386
  :extra-vars="dataSourceVars"
387
+ unlisted-vars-are-dyn
387
388
  placeholder="返回列表,如 range(0, 12)"
388
389
  @update:model-value="setX"
389
390
  />
@@ -440,6 +441,7 @@ function removeY(i) {
440
441
  :model-value="s.value"
441
442
  result-type="list"
442
443
  :extra-vars="dataSourceVars"
444
+ unlisted-vars-are-dyn
443
445
  :placeholder="`\u7B2C ${i + 1} \u4E2A\u7CFB\u5217\uFF0C\u5982 source1.map(r, r.value)`"
444
446
  @update:model-value="(v) => setYValue(i, v)"
445
447
  />
@@ -576,6 +578,7 @@ function removeY(i) {
576
578
  :model-value="s.dash ?? ''"
577
579
  result-type="list"
578
580
  :extra-vars="dataSourceVars"
581
+ unlisted-vars-are-dyn
579
582
  placeholder="留空为实线,如 [4, 4]"
580
583
  @update:model-value="(v) => setYDash(i, v)"
581
584
  />
@@ -653,6 +656,7 @@ function removeY(i) {
653
656
  :model-value="s.width ?? ''"
654
657
  result-type="number"
655
658
  :extra-vars="dataSourceVars"
659
+ unlisted-vars-are-dyn
656
660
  placeholder="留空自动,如 24"
657
661
  @update:model-value="(v) => setYWidth(i, v)"
658
662
  />
@@ -680,6 +684,7 @@ function removeY(i) {
680
684
  :model-value="s.size ?? ''"
681
685
  result-type="list"
682
686
  :extra-vars="dataSourceVars"
687
+ unlisted-vars-are-dyn
683
688
  placeholder="留空用默认大小,如 source1.map(r, r.weight)"
684
689
  @update:model-value="(v) => setYSize(i, v)"
685
690
  />
@@ -29,6 +29,7 @@ import {
29
29
  badgeSchema,
30
30
  getStructFieldDescription,
31
31
  getStructFieldTitle,
32
+ JSON_VAR,
32
33
  schema
33
34
  } from "./schema";
34
35
  defineOptions({ name: "ShwfedBlockCardConfig" });
@@ -419,6 +420,7 @@ if (breadcrumbExt) {
419
420
  :model-value="badge.show ?? ''"
420
421
  placeholder="例:json.?data.?total.orValue(0) != 0"
421
422
  result-type="bool"
423
+ :extra-vars="{ json: JSON_VAR }"
422
424
  multiline
423
425
  class="min-h-12"
424
426
  @update:model-value="(v) => setBadgeShow(v)"
@@ -19,6 +19,11 @@ export declare const metadata: {
19
19
  readonly max: number;
20
20
  };
21
21
  };
22
+ export declare const JSON_VAR: {
23
+ readonly type: "optional<dyn>";
24
+ readonly label: "HTTP 响应体";
25
+ readonly description: "HTTP 响应体(配置了请求时为已解析 JSON,否则为 none)";
26
+ };
22
27
  export declare const BADGE_VARIANTS: readonly ["default", "secondary", "destructive", "outline"];
23
28
  /**
24
29
  * The card's top-right badge: an optional HTTP datasource whose response feeds
@@ -10,10 +10,15 @@ export const metadata = {
10
10
  w: { initial: 12, min: 4, max: Infinity },
11
11
  h: { initial: 6, min: 4, max: Infinity }
12
12
  };
13
+ export const JSON_VAR = {
14
+ type: "optional<dyn>",
15
+ label: "HTTP \u54CD\u5E94\u4F53",
16
+ description: "HTTP \u54CD\u5E94\u4F53\uFF08\u914D\u7F6E\u4E86\u8BF7\u6C42\u65F6\u4E3A\u5DF2\u89E3\u6790 JSON\uFF0C\u5426\u5219\u4E3A none\uFF09"
17
+ };
13
18
  function registerJson(env) {
14
- env.registerVariable("json", "optional<dyn>", {
15
- label: "HTTP \u54CD\u5E94\u4F53",
16
- description: "HTTP \u54CD\u5E94\u4F53\uFF08\u914D\u7F6E\u4E86\u8BF7\u6C42\u65F6\u4E3A\u5DF2\u89E3\u6790 JSON\uFF0C\u5426\u5219\u4E3A none\uFF09"
19
+ env.registerVariable("json", JSON_VAR.type, {
20
+ label: JSON_VAR.label,
21
+ description: JSON_VAR.description
17
22
  });
18
23
  }
19
24
  export const BADGE_VARIANTS = ["default", "secondary", "destructive", "outline"];
@@ -9,6 +9,8 @@ import { Textarea } from "../ui/textarea";
9
9
  import { provideEventAncestor } from "../../share/event-bus";
10
10
  import {
11
11
  FormConfig,
12
+ getNestedStructFieldDescription,
13
+ getNestedStructFieldTitle,
12
14
  getStructFieldDescription,
13
15
  getStructFieldTitle,
14
16
  metadata as formMetadata
@@ -25,6 +27,8 @@ const configure = props.configure ?? (() => {
25
27
  const formConfigSchema = FormConfig(configure);
26
28
  const generalFieldTitle = (f) => getStructFieldTitle(formConfigSchema, f) ?? f;
27
29
  const generalFieldDescription = (f) => getStructFieldDescription(formConfigSchema, f);
30
+ const initialFieldTitle = (f) => getNestedStructFieldTitle(formConfigSchema, "initial", f) ?? f;
31
+ const initialFieldDescription = (f) => getNestedStructFieldDescription(formConfigSchema, "initial", f);
28
32
  provideCELContext(buildFormCelScope(configure));
29
33
  const formEventAncestor = computed(() => {
30
34
  const id = config.value.id;
@@ -124,45 +128,49 @@ function updateStyle(value) {
124
128
  <Field orientation="vertical">
125
129
  <FieldLabel class="text-xs text-zinc-500">
126
130
  <template
127
- v-if="generalFieldDescription('initial')"
131
+ v-if="initialFieldDescription('request')"
128
132
  #tooltip
129
133
  >
130
134
  <Markdown
131
- :source="generalFieldDescription('initial')"
135
+ :source="initialFieldDescription('request')"
132
136
  block
133
137
  class="prose prose-sm prose-zinc"
134
138
  />
135
139
  </template>
136
- {{ generalFieldTitle("initial") }}(数据)
140
+ {{ initialFieldTitle("request") }}
137
141
  </FieldLabel>
138
142
  <ExpressionEditor
139
- :model-value="config.initial?.data ?? ''"
140
- placeholder="如 { 'name': '', 'age': 0 }"
141
- result-type="dyn"
142
- :extra-vars="{ json: { type: 'optional<dyn>', label: 'HTTP \u54CD\u5E94\u4F53', description: '\u300C\u8BF7\u6C42\u300D\u7684\u54CD\u5E94\u4F53\uFF08\u5DF2\u89E3\u6790 JSON\uFF09\uFF1B\u672A\u914D\u7F6E\u8BF7\u6C42\u65F6\u4E3A none' } }"
143
+ :model-value="config.initial?.request ?? ''"
144
+ placeholder="如 http.get('https://api.example.com/record/1')"
145
+ result-type="HttpRequest"
143
146
  multiline
144
147
  class="min-h-20"
145
- @update:model-value="(v) => setInitialField('data', v)"
148
+ @update:model-value="(v) => setInitialField('request', v)"
146
149
  />
147
150
  </Field>
148
151
 
149
152
  <Field orientation="vertical">
150
153
  <FieldLabel class="text-xs text-zinc-500">
151
- <template #tooltip>
154
+ <template
155
+ v-if="initialFieldDescription('data')"
156
+ #tooltip
157
+ >
152
158
  <Markdown
153
- source="可选的 HTTP 请求:返回 `HttpRequest`,由宿主发起,响应体作为 `json` 传给「数据」表达式"
159
+ :source="initialFieldDescription('data')"
154
160
  block
155
161
  class="prose prose-sm prose-zinc"
156
162
  />
157
163
  </template>
158
- {{ generalFieldTitle("initial") }}(请求)
164
+ {{ initialFieldTitle("data") }}
159
165
  </FieldLabel>
160
166
  <ExpressionEditor
161
- :model-value="config.initial?.request ?? ''"
162
- placeholder="如 http.get('https://api.example.com/record/1')"
163
- result-type="HttpRequest"
164
- class="min-h-10"
165
- @update:model-value="(v) => setInitialField('request', v)"
167
+ :model-value="config.initial?.data ?? ''"
168
+ placeholder="如 { 'name': '', 'age': 0 }"
169
+ result-type="dyn"
170
+ :extra-vars="{ json: { type: 'optional<dyn>', label: 'HTTP \u54CD\u5E94\u4F53', description: '\u300C\u8BF7\u6C42\u300D\u7684\u54CD\u5E94\u4F53\uFF08\u5DF2\u89E3\u6790 JSON\uFF09\uFF1B\u672A\u914D\u7F6E\u8BF7\u6C42\u65F6\u4E3A none' } }"
171
+ multiline
172
+ class="min-h-20"
173
+ @update:model-value="(v) => setInitialField('data', v)"
166
174
  />
167
175
  </Field>
168
176
 
@@ -1,15 +1,26 @@
1
1
  <script setup>
2
2
  import { computed } from "vue";
3
3
  import { useI18n } from "vue-i18n";
4
+ import { cel as _rawCel } from "../../../../../utils/cel";
5
+ import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
4
6
  import { getLocalizedText } from "../../../../../share/locale";
5
7
  import { Markdown } from "../../../../ui/markdown";
8
+ import { interpolateMarkdown } from "../../../../table/utils/runtime";
9
+ import { useFormState } from "../../../utils/state";
6
10
  defineOptions({ name: "ShwfedMarkdownFieldRuntime" });
7
11
  const props = defineProps({
8
12
  fieldId: { type: String, required: true },
9
13
  config: { type: null, required: true }
10
14
  });
11
15
  const { locale } = useI18n();
12
- const source = computed(() => getLocalizedText(props.config.content, locale.value) ?? "");
16
+ const { state } = useFormState();
17
+ const inherited = injectCELContext();
18
+ const $cel = (expression, context) => _rawCel(expression, { ...celBindings(inherited), ...context });
19
+ const source = computed(() => {
20
+ const template = getLocalizedText(props.config.content, locale.value) ?? "";
21
+ if (!template) return "";
22
+ return interpolateMarkdown(template, $cel, { form: state.value ?? {} });
23
+ });
13
24
  </script>
14
25
 
15
26
  <template>
@@ -17,13 +17,19 @@ export declare const metadata: {
17
17
  };
18
18
  };
19
19
  export declare function schema(configure: (env: Environment) => void): Schema.Struct<{
20
- content: Schema.TupleType<readonly [Schema.Struct<{
20
+ content: Schema.refine<readonly [{
21
+ readonly locale: "zh";
22
+ readonly message: string;
23
+ }, ...{
24
+ readonly locale: "en" | "ja" | "ko";
25
+ readonly message: string;
26
+ }[]], Schema.TupleType<readonly [Schema.Struct<{
21
27
  locale: Schema.Literal<["zh"]>;
22
28
  message: Schema.SchemaClass<string, string, never>;
23
29
  }>], [Schema.Struct<{
24
30
  locale: Schema.Literal<["ja", "en", "ko"]>;
25
31
  message: Schema.SchemaClass<string, string, never>;
26
- }>]>;
32
+ }>]>>;
27
33
  id: Schema.refine<string, typeof Schema.String>;
28
34
  displayName: Schema.optional<Schema.SchemaClass<string, string, never>>;
29
35
  hidden: Schema.optional<Schema.Schema<string, string, never>>;
@@ -1,5 +1,5 @@
1
1
  import { Schema } from "effect";
2
- import { Locale } from "../../../../../share/locale.js";
2
+ import { LocaleMarkdown } from "../../../../../share/expression.js";
3
3
  import { commonFieldFields } from "../../../utils/common.js";
4
4
  export const type = "com.shwfed.form.field.markdown";
5
5
  export const compatibilityDate = "2026-04-22";
@@ -14,9 +14,9 @@ export function schema(configure) {
14
14
  type: Schema.Literal(type),
15
15
  compatibilityDate: Schema.Literal(compatibilityDate),
16
16
  ...commonFieldFields(configure),
17
- content: Locale.annotations({
17
+ content: LocaleMarkdown({ configure }).annotations({
18
18
  title: "\u5185\u5BB9",
19
- description: "\u6E32\u67D3\u4E3A Markdown \u7684\u591A\u8BED\u8A00\u6587\u672C"
19
+ description: "\u6E32\u67D3\u4E3A Markdown \u7684\u591A\u8BED\u8A00\u6587\u672C\uFF0C\u652F\u6301 `{{ \u8868\u8FBE\u5F0F }}` \u63D2\u503C"
20
20
  })
21
21
  }).annotations({
22
22
  title: "MarkdownField",
@@ -24,7 +24,6 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
24
24
  }[]] | undefined;
25
25
  readonly required?: string | undefined;
26
26
  readonly displayName?: string | undefined;
27
- readonly rows?: number | undefined;
28
27
  readonly compatibilityDate: "2026-04-22";
29
28
  readonly orientation?: "vertical" | "floating" | undefined;
30
29
  readonly placeholder?: readonly [{
@@ -51,6 +50,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
51
50
  readonly warning?: boolean | undefined;
52
51
  readonly when: string;
53
52
  }[] | undefined;
53
+ readonly maxLength?: number | undefined;
54
54
  }) => any;
55
55
  }, string, import("vue").PublicProps, Readonly<__VLS_ModelProps> & Readonly<{
56
56
  "onUpdate:modelValue"?: ((value: {
@@ -74,7 +74,6 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
74
74
  }[]] | undefined;
75
75
  readonly required?: string | undefined;
76
76
  readonly displayName?: string | undefined;
77
- readonly rows?: number | undefined;
78
77
  readonly compatibilityDate: "2026-04-22";
79
78
  readonly orientation?: "vertical" | "floating" | undefined;
80
79
  readonly placeholder?: readonly [{
@@ -101,6 +100,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
101
100
  readonly warning?: boolean | undefined;
102
101
  readonly when: string;
103
102
  }[] | undefined;
103
+ readonly maxLength?: number | undefined;
104
104
  }) => any) | undefined;
105
105
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
106
106
  declare const _default: typeof __VLS_export;
@@ -4,7 +4,7 @@ import { Field, FieldLabel } from "../../../../ui/field";
4
4
  import { ExpressionEditor } from "../../../../ui/expression-editor";
5
5
  import DerivedValueEditor from "../../../DerivedValueEditor.vue";
6
6
  import ValidationRulesField from "../../../ValidationRulesField.vue";
7
- import { InputGroup, InputGroupInput } from "../../../../ui/input-group";
7
+ import { InputGroup, InputGroupInput, InputGroupNumberField } from "../../../../ui/input-group";
8
8
  import { Locale as LocaleField } from "../../../../ui/locale";
9
9
  import { Markdown } from "../../../../ui/markdown";
10
10
  import {
@@ -35,22 +35,14 @@ const pathText = computed({
35
35
  }
36
36
  }
37
37
  });
38
- const rowsText = computed({
39
- get: () => value.value.rows != null ? String(value.value.rows) : "",
40
- set: (next) => {
41
- const trimmed = String(next ?? "").trim();
42
- if (trimmed.length === 0) {
43
- value.value = { ...value.value, rows: void 0 };
44
- return;
45
- }
46
- const n = Number(trimmed);
47
- if (!Number.isFinite(n) || !Number.isInteger(n) || n <= 0) {
48
- value.value = { ...value.value, rows: void 0 };
49
- return;
50
- }
51
- value.value = { ...value.value, rows: n };
38
+ function setMaxLength(v) {
39
+ if (v === void 0 || !(v > 0)) {
40
+ const { maxLength: _omit, ...rest } = value.value;
41
+ value.value = rest;
42
+ } else {
43
+ value.value = { ...value.value, maxLength: Math.round(v) };
52
44
  }
53
- });
45
+ }
54
46
  </script>
55
47
 
56
48
  <template>
@@ -203,24 +195,22 @@ const rowsText = computed({
203
195
  <Field orientation="vertical">
204
196
  <FieldLabel class="text-xs text-zinc-500">
205
197
  <template
206
- v-if="fieldDescription('rows')"
198
+ v-if="fieldDescription('maxLength')"
207
199
  #tooltip
208
200
  >
209
201
  <Markdown
210
- :source="fieldDescription('rows')"
202
+ :source="fieldDescription('maxLength')"
211
203
  block
212
204
  class="prose prose-sm prose-zinc"
213
205
  />
214
206
  </template>
215
- {{ fieldTitle("rows") }}
207
+ {{ fieldTitle("maxLength") }}
216
208
  </FieldLabel>
217
209
  <InputGroup>
218
- <InputGroupInput
219
- v-model="rowsText"
220
- type="number"
221
- min="1"
222
- step="1"
223
- placeholder="例:4"
210
+ <InputGroupNumberField
211
+ :model-value="value.maxLength"
212
+ :min="1"
213
+ @update:model-value="setMaxLength"
224
214
  />
225
215
  </InputGroup>
226
216
  </Field>
@@ -24,7 +24,6 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
24
24
  }[]] | undefined;
25
25
  readonly required?: string | undefined;
26
26
  readonly displayName?: string | undefined;
27
- readonly rows?: number | undefined;
28
27
  readonly compatibilityDate: "2026-04-22";
29
28
  readonly orientation?: "vertical" | "floating" | undefined;
30
29
  readonly placeholder?: readonly [{
@@ -51,6 +50,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
51
50
  readonly warning?: boolean | undefined;
52
51
  readonly when: string;
53
52
  }[] | undefined;
53
+ readonly maxLength?: number | undefined;
54
54
  }) => any;
55
55
  }, string, import("vue").PublicProps, Readonly<__VLS_ModelProps> & Readonly<{
56
56
  "onUpdate:modelValue"?: ((value: {
@@ -74,7 +74,6 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
74
74
  }[]] | undefined;
75
75
  readonly required?: string | undefined;
76
76
  readonly displayName?: string | undefined;
77
- readonly rows?: number | undefined;
78
77
  readonly compatibilityDate: "2026-04-22";
79
78
  readonly orientation?: "vertical" | "floating" | undefined;
80
79
  readonly placeholder?: readonly [{
@@ -101,6 +100,7 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_ModelProps, {},
101
100
  readonly warning?: boolean | undefined;
102
101
  readonly when: string;
103
102
  }[] | undefined;
103
+ readonly maxLength?: number | undefined;
104
104
  }) => any) | undefined;
105
105
  }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
106
106
  declare const _default: typeof __VLS_export;
@@ -6,7 +6,7 @@ import { cel as _rawCel } from "../../../../../utils/cel";
6
6
  import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
7
7
  import { getLocalizedText } from "../../../../../share/locale";
8
8
  import { Field, FieldLabel, FieldMessages } from "../../../../ui/field";
9
- import { InputGroup, InputGroupTextarea } from "../../../../ui/input-group";
9
+ import { InputGroup, InputGroupAddon, InputGroupText, InputGroupTextarea } from "../../../../ui/input-group";
10
10
  import { Markdown } from "../../../../ui/markdown";
11
11
  import { DEFAULT_FIELD_ORIENTATION } from "../../../utils/common";
12
12
  import { useFieldValue } from "../../../utils/field-value";
@@ -29,6 +29,7 @@ const placeholderText = computed(
29
29
  const tooltipText = computed(
30
30
  () => props.config.tooltip ? getLocalizedText(props.config.tooltip, locale.value) : void 0
31
31
  );
32
+ const maxLength = computed(() => props.config.maxLength);
32
33
  function evalBool(expression, label) {
33
34
  if (!expression) return false;
34
35
  try {
@@ -94,9 +95,17 @@ const { isRequired, errors, warnings, visible } = useFieldValidation({
94
95
  v-model="draft"
95
96
  :placeholder="placeholderText"
96
97
  :disabled="isDisabled"
97
- :rows="config.rows"
98
+ :maxlength="maxLength"
98
99
  @blur="commit"
99
100
  />
101
+ <InputGroupAddon
102
+ v-if="maxLength != null"
103
+ align="block-end"
104
+ >
105
+ <InputGroupText class="tabular-nums">
106
+ {{ draft.length }} / {{ maxLength }}
107
+ </InputGroupText>
108
+ </InputGroupAddon>
100
109
  </InputGroup>
101
110
  <FieldMessages
102
111
  v-if="visible"