@shwfed/config 2.7.6 → 2.7.8
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/mcp.mjs +165 -52
- package/dist/module.json +1 -1
- package/dist/preview/assets/badge-KAEXz3VO.js +1 -0
- package/dist/preview/assets/{config-C947O8za.js → config-BXx5syNf.js} +1 -1
- package/dist/preview/assets/{config-DhAntnE5.js → config-Bb9Yeh33.js} +1 -1
- package/dist/preview/assets/config-C-QRPeN1.js +1 -0
- package/dist/preview/assets/config-CkKx7sVR.js +1 -0
- package/dist/preview/assets/config-CtbYlZCL.js +1 -0
- package/dist/preview/assets/{config-Bl8L6943.js → config-DPlbFBRi.js} +1 -1
- package/dist/preview/assets/config-DbfJWa8K.js +1 -0
- package/dist/preview/assets/{config-DppExb4h.js → config-DbirfZyy.js} +1 -1
- package/dist/preview/assets/{config-B7hXY5FF.js → config-ZczGik30.js} +1 -1
- package/dist/preview/assets/definition.vue_vue_type_script_setup_true_lang-CQ6MUPKO.js +1 -0
- package/dist/preview/assets/{index-DiC1rvCq.js → index-Bv_aA34a.js} +1 -1
- package/dist/preview/assets/{index-B0PL01fm.css → index-C9P-6gZd.css} +1 -1
- package/dist/preview/assets/index-CJFU9znN.js +1 -0
- package/dist/preview/assets/index-DUOkekYu.js +680 -0
- package/dist/preview/assets/item-SC0WQMVu.js +1 -0
- package/dist/preview/assets/{runtime-DmV_M4B_.js → runtime-BPOf7Yqz.js} +1 -1
- package/dist/preview/assets/runtime-CC2caFS9.js +1 -0
- package/dist/preview/assets/runtime-CLaRFZzt.js +1 -0
- package/dist/preview/assets/runtime-Ckuz5Kxm.js +1 -0
- package/dist/preview/assets/{runtime-BQnHKogz.js → runtime-CnKlH0mi.js} +1 -1
- package/dist/preview/assets/runtime-DO0anKbw.js +1 -0
- package/dist/preview/assets/{runtime-kLWO8JbC.js → runtime-DcStOiOi.js} +1 -1
- package/dist/preview/assets/runtime-EVgYW6_7.js +1 -0
- package/dist/preview/assets/runtime-i32sR7d3.js +1 -0
- package/dist/preview/index.html +2 -2
- package/dist/runtime/components/actions/buttons/2026-04-21/com.shwfed.actions.button.navigation/runtime.vue +16 -2
- package/dist/runtime/components/block-layout-editor/index.vue +1 -4
- package/dist/runtime/components/config/blocks/2026-05-17/com.shwfed.block.chart.xy/config.vue +5 -0
- package/dist/runtime/components/config/blocks/2026-05-17/com.shwfed.block.chart.xy/runtime.vue +2 -2
- package/dist/runtime/components/config/blocks/2026-06-01/com.shwfed.block.animated.number/item.vue +2 -2
- package/dist/runtime/components/config/blocks/2026-06-01/com.shwfed.block.animated.number/schema.js +2 -2
- package/dist/runtime/components/config/blocks/2026-06-02/com.shwfed.block.card/badge.vue +3 -2
- package/dist/runtime/components/config/blocks/2026-06-02/com.shwfed.block.card/schema.js +2 -2
- package/dist/runtime/components/form/config.vue +24 -16
- package/dist/runtime/components/form/fields/2026-05-13/com.shwfed.form.field.combobox.single.remote/runtime.vue +6 -5
- package/dist/runtime/components/form/fields/2026-05-13/com.shwfed.form.field.combobox.single.remote/schema.js +2 -2
- package/dist/runtime/components/form/fields/2026-05-23/com.shwfed.form.field.tree.multi/runtime.vue +3 -4
- package/dist/runtime/components/form/fields/2026-05-26/com.shwfed.form.field.tree.combobox.multi/runtime.vue +3 -4
- package/dist/runtime/components/form/fields/2026-05-26/com.shwfed.form.field.tree.combobox.single/runtime.vue +3 -4
- package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.multi/runtime.vue +6 -5
- package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.multi/schema.js +2 -2
- package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.single/runtime.vue +6 -5
- package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.combobox.single/schema.js +2 -2
- package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.multi/runtime.vue +3 -4
- package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.combobox.single/runtime.vue +3 -4
- package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.multi/runtime.vue +3 -4
- package/dist/runtime/components/form/fields/2026-05-28/com.shwfed.form.field.tree.single/runtime.vue +3 -4
- package/dist/runtime/components/form/schema.d.ts +1 -1
- package/dist/runtime/components/form/schema.js +8 -3
- package/dist/runtime/components/form/utils/initial.d.ts +5 -4
- package/dist/runtime/components/form/utils/initial.js +2 -2
- package/dist/runtime/components/form/utils/schema-meta.d.ts +2 -0
- package/dist/runtime/components/form/utils/schema-meta.js +24 -0
- package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/runtime.vue +7 -6
- package/dist/runtime/components/table/columns/2026-05-24/com.shwfed.table.column.combobox-single.remote.options-remote/schema.js +2 -2
- package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/runtime.vue +7 -6
- package/dist/runtime/components/table/columns/2026-05-25/com.shwfed.table.column.combobox-multi.remote.options-remote/schema.js +2 -2
- package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi/runtime.vue +7 -6
- package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi/schema.js +2 -2
- package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/runtime.vue +7 -6
- package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-multi.remote/schema.js +2 -2
- package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single/runtime.vue +7 -6
- package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single/schema.js +2 -2
- package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/runtime.vue +7 -6
- package/dist/runtime/components/table/columns/2026-05-26/com.shwfed.table.column.combobox-single.remote/schema.js +2 -2
- package/dist/runtime/components/table/columns/2026-05-27/com.shwfed.table.column.tree-combobox-multi/runtime.vue +3 -4
- package/dist/runtime/components/table/columns/2026-05-27/com.shwfed.table.column.tree-combobox-multi/schema.js +2 -2
- package/dist/runtime/components/table/columns/2026-05-27/com.shwfed.table.column.tree-combobox-single/runtime.vue +3 -4
- package/dist/runtime/components/table/columns/2026-05-27/com.shwfed.table.column.tree-combobox-single/schema.js +2 -2
- package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/runtime.vue +7 -6
- package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-multi/schema.js +2 -2
- package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/runtime.vue +7 -6
- package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.combobox-single/schema.js +2 -2
- package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-multi/runtime.vue +3 -4
- package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-multi/schema.js +2 -2
- package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-single/runtime.vue +3 -4
- package/dist/runtime/components/table/columns/2026-05-28/com.shwfed.table.column.tree-combobox-single/schema.js +2 -2
- package/dist/runtime/components/table/config.vue +0 -36
- package/dist/runtime/components/table/index.vue +3 -4
- package/dist/runtime/components/table/schema.js +3 -3
- package/dist/runtime/components/ui/expression-editor/ExpressionEditor.d.vue.ts +4 -3
- package/dist/runtime/components/ui/expression-editor/ExpressionEditor.vue +135 -111
- package/dist/runtime/components/ui/expression-editor/ExpressionEditor.vue.d.ts +4 -3
- package/dist/runtime/share/expression.d.ts +36 -0
- package/dist/runtime/share/expression.js +38 -17
- package/dist/runtime/share/request.d.ts +29 -0
- package/dist/runtime/share/request.js +11 -0
- package/dist/runtime/vendor/cel-js/CLAUDE.md +3 -3
- package/dist/runtime/vendor/cel-js/PROMPT.md +44 -3
- package/dist/runtime/vendor/cel-js/lib/functions.js +2 -2
- package/dist/runtime/vendor/cel-js/lib/macros.js +66 -14
- package/dist/runtime/vendor/cel-js/lib/optional.js +52 -1
- package/package.json +1 -1
- package/dist/preview/assets/badge-C-IvPZBx.js +0 -1
- package/dist/preview/assets/config-DXlCQMVi.js +0 -1
- package/dist/preview/assets/config-Dj0rEZRq.js +0 -1
- package/dist/preview/assets/config-_aVQvlhc.js +0 -1
- package/dist/preview/assets/config-l01zamcS.js +0 -1
- package/dist/preview/assets/definition.vue_vue_type_script_setup_true_lang-BbuC0qEM.js +0 -1
- package/dist/preview/assets/index-BNaI1T0H.js +0 -680
- package/dist/preview/assets/index-BwoBmSxu.js +0 -1
- package/dist/preview/assets/item-GFiAkFW6.js +0 -1
- package/dist/preview/assets/runtime-5h5U6Ozr.js +0 -1
- package/dist/preview/assets/runtime-B6dXW6zW.js +0 -1
- package/dist/preview/assets/runtime-BEOIc4zU.js +0 -1
- package/dist/preview/assets/runtime-Bx7G-5dR.js +0 -1
- package/dist/preview/assets/runtime-TNDFpOlo.js +0 -1
- package/dist/preview/assets/runtime-g9hb36Vh.js +0 -1
|
@@ -0,0 +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-DUOkekYu.js";import K from"./index-Bv_aA34a.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{_ as n}from"./definition.vue_vue_type_script_setup_true_lang-
|
|
1
|
+
import{_ as n}from"./definition.vue_vue_type_script_setup_true_lang-CQ6MUPKO.js";import{d as o,c as a,b as c,a as f,aN as i}from"./index-DUOkekYu.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};
|
|
@@ -0,0 +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-DUOkekYu.js";import{_ as v}from"./definition.vue_vue_type_script_setup_true_lang-CQ6MUPKO.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};
|
|
@@ -0,0 +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-DUOkekYu.js";import{_ as y}from"./definition.vue_vue_type_script_setup_true_lang-CQ6MUPKO.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};
|
|
@@ -0,0 +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-DUOkekYu.js";import{_ as z}from"./definition.vue_vue_type_script_setup_true_lang-CQ6MUPKO.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 c}from"./definition.vue_vue_type_script_setup_true_lang-
|
|
1
|
+
import{_ as c}from"./definition.vue_vue_type_script_setup_true_lang-CQ6MUPKO.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-DUOkekYu.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};
|
|
@@ -0,0 +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-DUOkekYu.js";import{_ as b}from"./definition.vue_vue_type_script_setup_true_lang-CQ6MUPKO.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 +1 @@
|
|
|
1
|
-
import{d as _,
|
|
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-DUOkekYu.js";import{_ as T}from"./definition.vue_vue_type_script_setup_true_lang-CQ6MUPKO.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};
|
|
@@ -0,0 +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-DUOkekYu.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};
|
|
@@ -0,0 +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-DUOkekYu.js";import{_ as x}from"./definition.vue_vue_type_script_setup_true_lang-CQ6MUPKO.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};
|
package/dist/preview/index.html
CHANGED
|
@@ -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-
|
|
14
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
13
|
+
<script type="module" crossorigin src="./assets/index-DUOkekYu.js"></script>
|
|
14
|
+
<link rel="stylesheet" crossorigin href="./assets/index-C9P-6gZd.css">
|
|
15
15
|
</head>
|
|
16
16
|
<body>
|
|
17
17
|
<div id="app"></div>
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
<script setup>
|
|
2
2
|
import { Effect } from "effect";
|
|
3
|
+
import { navigateTo, useRouter } from "#app";
|
|
3
4
|
import { cel as _rawCel } from "../../../../../utils/cel";
|
|
4
5
|
import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
|
|
5
6
|
import ShwfedActionDefinition from "../../../components/definition.vue";
|
|
@@ -8,13 +9,26 @@ const props = defineProps({
|
|
|
8
9
|
buttonId: { type: String, required: true },
|
|
9
10
|
config: { type: null, required: true }
|
|
10
11
|
});
|
|
12
|
+
const router = useRouter();
|
|
11
13
|
const inherited = injectCELContext();
|
|
12
14
|
const $cel = (expression, context) => _rawCel(expression, { ...celBindings(inherited), ...context });
|
|
15
|
+
function isExternal(url) {
|
|
16
|
+
try {
|
|
17
|
+
return new URL(url, window.location.href).origin !== window.location.origin;
|
|
18
|
+
} catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
13
22
|
const effect = Effect.suspend(
|
|
14
23
|
() => Effect.flatMap(
|
|
15
24
|
$cel(props.config.url),
|
|
16
|
-
(url) => Effect.
|
|
17
|
-
|
|
25
|
+
(url) => Effect.promise(async () => {
|
|
26
|
+
const external = isExternal(url);
|
|
27
|
+
if (props.config.mode === "_blank") {
|
|
28
|
+
window.open(external ? url : router.resolve(url).href, "_blank");
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
await navigateTo(url, { external });
|
|
18
32
|
})
|
|
19
33
|
)
|
|
20
34
|
);
|
|
@@ -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 -
|
|
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
|
|
package/dist/runtime/components/config/blocks/2026-05-17/com.shwfed.block.chart.xy/config.vue
CHANGED
|
@@ -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
|
/>
|
package/dist/runtime/components/config/blocks/2026-05-17/com.shwfed.block.chart.xy/runtime.vue
CHANGED
|
@@ -20,6 +20,7 @@ import { Markdown } from "../../../../ui/markdown";
|
|
|
20
20
|
import { cel } from "../../../../../utils/cel";
|
|
21
21
|
import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
|
|
22
22
|
import { getLocalizedText } from "../../../../../share/locale";
|
|
23
|
+
import { fetchJsonOption } from "../../../../../share/request";
|
|
23
24
|
defineOptions({ name: "ShwfedBlockChartXyRuntime" });
|
|
24
25
|
const block = defineModel("block", { type: null, ...{ required: true } });
|
|
25
26
|
const { locale } = useI18n();
|
|
@@ -70,8 +71,7 @@ async function fetchAll() {
|
|
|
70
71
|
const program = Effect.gen(function* () {
|
|
71
72
|
let jsonOpt = Option.none();
|
|
72
73
|
if (ds.request) {
|
|
73
|
-
|
|
74
|
-
jsonOpt = Option.some(yield* builder.json());
|
|
74
|
+
jsonOpt = yield* fetchJsonOption(yield* cel(ds.request, ctx));
|
|
75
75
|
}
|
|
76
76
|
return yield* cel(ds.data, { ...ctx, json: jsonOpt });
|
|
77
77
|
});
|
package/dist/runtime/components/config/blocks/2026-06-01/com.shwfed.block.animated.number/item.vue
CHANGED
|
@@ -6,6 +6,7 @@ import { useIntervalFn, useWindowFocus } from "@vueuse/core";
|
|
|
6
6
|
import NumberFlow from "@number-flow/vue";
|
|
7
7
|
import { cel } from "../../../../../utils/cel";
|
|
8
8
|
import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
|
|
9
|
+
import { fetchJsonOption } from "../../../../../share/request";
|
|
9
10
|
defineOptions({ name: "ShwfedBlockAnimatedNumberItem" });
|
|
10
11
|
const props = defineProps({
|
|
11
12
|
item: { type: null, required: true }
|
|
@@ -57,8 +58,7 @@ async function refresh() {
|
|
|
57
58
|
const program = Effect.gen(function* () {
|
|
58
59
|
let jsonOpt = Option.none();
|
|
59
60
|
if (ds.request) {
|
|
60
|
-
|
|
61
|
-
jsonOpt = Option.some(yield* builder.json());
|
|
61
|
+
jsonOpt = yield* fetchJsonOption(yield* cel(ds.request, ctx));
|
|
62
62
|
}
|
|
63
63
|
const value = yield* cel(ds.value, { ...ctx, json: jsonOpt });
|
|
64
64
|
return { json: Option.getOrUndefined(jsonOpt), value };
|
package/dist/runtime/components/config/blocks/2026-06-01/com.shwfed.block.animated.number/schema.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Schema } from "effect";
|
|
2
|
-
import { Expression, LocaleMarkdown } from "../../../../../share/expression.js";
|
|
2
|
+
import { Expression, HttpRequestResult, LocaleMarkdown } from "../../../../../share/expression.js";
|
|
3
3
|
export { getStructFieldDescription, getStructFieldTitle } from "../../../../table/utils/schema-meta.js";
|
|
4
4
|
export const type = "com.shwfed.block.animated.number";
|
|
5
5
|
export const compatibilityDate = "2026-06-01";
|
|
@@ -18,7 +18,7 @@ function registerJson(env) {
|
|
|
18
18
|
export function dataSourceSchema(configure) {
|
|
19
19
|
const CelRequest = Expression({
|
|
20
20
|
configure,
|
|
21
|
-
resultType:
|
|
21
|
+
resultType: HttpRequestResult
|
|
22
22
|
});
|
|
23
23
|
const CelNumber = Expression({
|
|
24
24
|
configure: (env) => {
|
|
@@ -7,6 +7,7 @@ import { useI18n } from "vue-i18n";
|
|
|
7
7
|
import { getLocalizedText } from "../../../../../share/locale";
|
|
8
8
|
import { cel } from "../../../../../utils/cel";
|
|
9
9
|
import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
|
|
10
|
+
import { fetchJsonOption } from "../../../../../share/request";
|
|
10
11
|
import { interpolateMarkdown } from "../../../../table/utils/runtime";
|
|
11
12
|
import { Badge } from "../../../../ui/badge";
|
|
12
13
|
import { Markdown } from "../../../../ui/markdown";
|
|
@@ -43,8 +44,8 @@ async function refresh() {
|
|
|
43
44
|
if (!req) return;
|
|
44
45
|
const ctx = baseContext();
|
|
45
46
|
const program = Effect.gen(function* () {
|
|
46
|
-
const
|
|
47
|
-
return
|
|
47
|
+
const json2 = yield* fetchJsonOption(yield* cel(req, ctx));
|
|
48
|
+
return Option.getOrUndefined(json2);
|
|
48
49
|
});
|
|
49
50
|
try {
|
|
50
51
|
json.value = await Effect.runPromise(Effect.provide(program, Fetch.layer));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Schema } from "effect";
|
|
2
|
-
import { Expression, LocaleMarkdown } from "../../../../../share/expression.js";
|
|
2
|
+
import { Expression, HttpRequestResult, LocaleMarkdown } from "../../../../../share/expression.js";
|
|
3
3
|
import { Slot, defaultSlot } from "../../../../../share/layout.js";
|
|
4
4
|
export { getStructFieldDescription, getStructFieldTitle } from "../../../../table/utils/schema-meta.js";
|
|
5
5
|
export const type = "com.shwfed.block.card";
|
|
@@ -20,7 +20,7 @@ export const BADGE_VARIANTS = ["default", "secondary", "destructive", "outline"]
|
|
|
20
20
|
export function badgeSchema(configure) {
|
|
21
21
|
const CelRequest = Expression({
|
|
22
22
|
configure,
|
|
23
|
-
resultType:
|
|
23
|
+
resultType: HttpRequestResult
|
|
24
24
|
});
|
|
25
25
|
const Content = LocaleMarkdown({
|
|
26
26
|
configure: (env) => {
|
|
@@ -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="
|
|
131
|
+
v-if="initialFieldDescription('request')"
|
|
128
132
|
#tooltip
|
|
129
133
|
>
|
|
130
134
|
<Markdown
|
|
131
|
-
:source="
|
|
135
|
+
:source="initialFieldDescription('request')"
|
|
132
136
|
block
|
|
133
137
|
class="prose prose-sm prose-zinc"
|
|
134
138
|
/>
|
|
135
139
|
</template>
|
|
136
|
-
{{
|
|
140
|
+
{{ initialFieldTitle("request") }}
|
|
137
141
|
</FieldLabel>
|
|
138
142
|
<ExpressionEditor
|
|
139
|
-
:model-value="config.initial?.
|
|
140
|
-
placeholder="如
|
|
141
|
-
result-type="
|
|
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('
|
|
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
|
|
154
|
+
<template
|
|
155
|
+
v-if="initialFieldDescription('data')"
|
|
156
|
+
#tooltip
|
|
157
|
+
>
|
|
152
158
|
<Markdown
|
|
153
|
-
source="
|
|
159
|
+
:source="initialFieldDescription('data')"
|
|
154
160
|
block
|
|
155
161
|
class="prose prose-sm prose-zinc"
|
|
156
162
|
/>
|
|
157
163
|
</template>
|
|
158
|
-
{{
|
|
164
|
+
{{ initialFieldTitle("data") }}
|
|
159
165
|
</FieldLabel>
|
|
160
166
|
<ExpressionEditor
|
|
161
|
-
:model-value="config.initial?.
|
|
162
|
-
placeholder="如
|
|
163
|
-
result-type="
|
|
164
|
-
|
|
165
|
-
|
|
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,10 +1,11 @@
|
|
|
1
1
|
<script setup>
|
|
2
2
|
import { Icon } from "@iconify/vue";
|
|
3
3
|
import { watchDebounced } from "@vueuse/core";
|
|
4
|
-
import { Effect } from "effect";
|
|
4
|
+
import { Effect, Option } from "effect";
|
|
5
5
|
import { Fetch } from "fx-fetch";
|
|
6
6
|
import { computed, nextTick, ref } from "vue";
|
|
7
7
|
import { useI18n } from "vue-i18n";
|
|
8
|
+
import { asRequest, fetchJsonOption } from "../../../../../share/request";
|
|
8
9
|
import { cel as _rawCel } from "../../../../../utils/cel";
|
|
9
10
|
import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
|
|
10
11
|
import { getLocalizedText } from "../../../../../share/locale";
|
|
@@ -100,8 +101,8 @@ const requestSignature = computed(() => {
|
|
|
100
101
|
const expr = props.config.request;
|
|
101
102
|
if (!expr) return null;
|
|
102
103
|
try {
|
|
103
|
-
const
|
|
104
|
-
return JSON.stringify(
|
|
104
|
+
const req = asRequest(Effect.runSync($cel(expr, { form: state.value ?? {} })));
|
|
105
|
+
return Option.isSome(req) ? JSON.stringify(req.value.describe()) : null;
|
|
105
106
|
} catch {
|
|
106
107
|
return null;
|
|
107
108
|
}
|
|
@@ -117,8 +118,8 @@ async function fetchOptions() {
|
|
|
117
118
|
const expr = props.config.request;
|
|
118
119
|
isLoading.value = true;
|
|
119
120
|
const program = Effect.gen(function* () {
|
|
120
|
-
const
|
|
121
|
-
return
|
|
121
|
+
const body = yield* fetchJsonOption(yield* $cel(expr, { form: state.value ?? {} }));
|
|
122
|
+
return Option.getOrNull(body);
|
|
122
123
|
});
|
|
123
124
|
try {
|
|
124
125
|
const result = await Effect.runPromise(Effect.provide(program, Fetch.layer));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Schema } from "effect";
|
|
2
|
-
import { Expression, LocaleMarkdown } from "../../../../../share/expression.js";
|
|
2
|
+
import { Expression, HttpRequestResult, LocaleMarkdown } from "../../../../../share/expression.js";
|
|
3
3
|
import { Locale } from "../../../../../share/locale.js";
|
|
4
4
|
import { commonFieldFields, derivedField, FieldOrientationSchema } from "../../../utils/common.js";
|
|
5
5
|
export const type = "com.shwfed.form.field.combobox.single.remote";
|
|
@@ -35,7 +35,7 @@ function configureWithJson(configure) {
|
|
|
35
35
|
const isListType = (actual) => actual === "dyn" || actual.startsWith("list");
|
|
36
36
|
export function schema(configure) {
|
|
37
37
|
const CelBool = Expression({ configure, resultType: "bool" });
|
|
38
|
-
const CelHttpRequest = Expression({ configure, resultType:
|
|
38
|
+
const CelHttpRequest = Expression({ configure, resultType: HttpRequestResult });
|
|
39
39
|
const CelOptions = Expression({ configure: configureWithJson(configure), resultType: isListType });
|
|
40
40
|
const CelOptionValue = Expression({ configure: configureWithOption(configure), resultType: "dyn" });
|
|
41
41
|
const LocaleOptionLabel = LocaleMarkdown({ configure: configureWithOption(configure) });
|
package/dist/runtime/components/form/fields/2026-05-23/com.shwfed.form.field.tree.multi/runtime.vue
CHANGED
|
@@ -4,6 +4,7 @@ import { Effect, Fiber, Option } from "effect";
|
|
|
4
4
|
import { Fetch } from "fx-fetch";
|
|
5
5
|
import { computed, ref, shallowRef, watch } from "vue";
|
|
6
6
|
import { useI18n } from "vue-i18n";
|
|
7
|
+
import { fetchJsonOption } from "../../../../../share/request";
|
|
7
8
|
import { cel as _rawCel } from "../../../../../utils/cel";
|
|
8
9
|
import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
|
|
9
10
|
import { getLocalizedText } from "../../../../../share/locale";
|
|
@@ -100,11 +101,9 @@ async function fetchTree() {
|
|
|
100
101
|
const effect = Effect.gen(function* () {
|
|
101
102
|
let jsonOpt = Option.none();
|
|
102
103
|
if (dataSource.request) {
|
|
103
|
-
|
|
104
|
+
jsonOpt = yield* fetchJsonOption(yield* $cel(dataSource.request, {
|
|
104
105
|
form: state.value ?? {}
|
|
105
|
-
});
|
|
106
|
-
const response = yield* builder.json();
|
|
107
|
-
jsonOpt = Option.some(response);
|
|
106
|
+
}));
|
|
108
107
|
}
|
|
109
108
|
const dataRaw = yield* $cel(dataSource.data, {
|
|
110
109
|
form: state.value ?? {},
|
|
@@ -4,6 +4,7 @@ import { Effect, Fiber, Option } from "effect";
|
|
|
4
4
|
import { Fetch } from "fx-fetch";
|
|
5
5
|
import { computed, ref, shallowRef, watch } from "vue";
|
|
6
6
|
import { useI18n } from "vue-i18n";
|
|
7
|
+
import { fetchJsonOption } from "../../../../../share/request";
|
|
7
8
|
import { cel as _rawCel } from "../../../../../utils/cel";
|
|
8
9
|
import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
|
|
9
10
|
import { getLocalizedText } from "../../../../../share/locale";
|
|
@@ -163,11 +164,9 @@ async function fetchTree() {
|
|
|
163
164
|
const effect = Effect.gen(function* () {
|
|
164
165
|
let jsonOpt = Option.none();
|
|
165
166
|
if (dataSource.request) {
|
|
166
|
-
|
|
167
|
+
jsonOpt = yield* fetchJsonOption(yield* $cel(dataSource.request, {
|
|
167
168
|
form: state.value ?? {}
|
|
168
|
-
});
|
|
169
|
-
const response = yield* builder.json();
|
|
170
|
-
jsonOpt = Option.some(response);
|
|
169
|
+
}));
|
|
171
170
|
}
|
|
172
171
|
const dataRaw = yield* $cel(dataSource.data, {
|
|
173
172
|
form: state.value ?? {},
|
|
@@ -4,6 +4,7 @@ import { Effect, Fiber, Option } from "effect";
|
|
|
4
4
|
import { Fetch } from "fx-fetch";
|
|
5
5
|
import { computed, ref, shallowRef, watch } from "vue";
|
|
6
6
|
import { useI18n } from "vue-i18n";
|
|
7
|
+
import { fetchJsonOption } from "../../../../../share/request";
|
|
7
8
|
import { cel as _rawCel } from "../../../../../utils/cel";
|
|
8
9
|
import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
|
|
9
10
|
import { getLocalizedText } from "../../../../../share/locale";
|
|
@@ -164,11 +165,9 @@ async function fetchTree() {
|
|
|
164
165
|
const effect = Effect.gen(function* () {
|
|
165
166
|
let jsonOpt = Option.none();
|
|
166
167
|
if (dataSource.request) {
|
|
167
|
-
|
|
168
|
+
jsonOpt = yield* fetchJsonOption(yield* $cel(dataSource.request, {
|
|
168
169
|
form: state.value ?? {}
|
|
169
|
-
});
|
|
170
|
-
const response = yield* builder.json();
|
|
171
|
-
jsonOpt = Option.some(response);
|
|
170
|
+
}));
|
|
172
171
|
}
|
|
173
172
|
const dataRaw = yield* $cel(dataSource.data, {
|
|
174
173
|
form: state.value ?? {},
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
<script setup>
|
|
2
2
|
import { Icon } from "@iconify/vue";
|
|
3
3
|
import { watchDebounced } from "@vueuse/core";
|
|
4
|
-
import { Effect } from "effect";
|
|
4
|
+
import { Effect, Option } from "effect";
|
|
5
5
|
import { Fetch } from "fx-fetch";
|
|
6
6
|
import { computed, ref } from "vue";
|
|
7
7
|
import { useI18n } from "vue-i18n";
|
|
8
|
+
import { asRequest, fetchJsonOption } from "../../../../../share/request";
|
|
8
9
|
import { cel as _rawCel } from "../../../../../utils/cel";
|
|
9
10
|
import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
|
|
10
11
|
import { interpolateMarkdown } from "../../../../table/utils/runtime";
|
|
@@ -101,8 +102,8 @@ const requestSignature = computed(() => {
|
|
|
101
102
|
const expr = opts.request;
|
|
102
103
|
if (!expr) return null;
|
|
103
104
|
try {
|
|
104
|
-
const
|
|
105
|
-
return JSON.stringify(
|
|
105
|
+
const req = asRequest(Effect.runSync($cel(expr, { form: state.value ?? {} })));
|
|
106
|
+
return Option.isSome(req) ? JSON.stringify(req.value.describe()) : null;
|
|
106
107
|
} catch {
|
|
107
108
|
return null;
|
|
108
109
|
}
|
|
@@ -124,8 +125,8 @@ async function fetchOptions() {
|
|
|
124
125
|
}
|
|
125
126
|
isLoading.value = true;
|
|
126
127
|
const program = Effect.gen(function* () {
|
|
127
|
-
const
|
|
128
|
-
return
|
|
128
|
+
const body = yield* fetchJsonOption(yield* $cel(expr, { form: state.value ?? {} }));
|
|
129
|
+
return Option.getOrNull(body);
|
|
129
130
|
});
|
|
130
131
|
try {
|
|
131
132
|
const result = await Effect.runPromise(Effect.provide(program, Fetch.layer));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Effect, Schema } from "effect";
|
|
2
|
-
import { Expression, LocaleMarkdown } from "../../../../../share/expression.js";
|
|
2
|
+
import { Expression, HttpRequestResult, LocaleMarkdown } from "../../../../../share/expression.js";
|
|
3
3
|
import { Locale } from "../../../../../share/locale.js";
|
|
4
4
|
import { commonFieldFields, derivedField, FieldOrientationSchema } from "../../../utils/common.js";
|
|
5
5
|
export const type = "com.shwfed.form.field.combobox.multi";
|
|
@@ -59,7 +59,7 @@ export function itemSchema(configure) {
|
|
|
59
59
|
export function remoteOptionsSchema(configure) {
|
|
60
60
|
const CelRequest = Schema.Union(
|
|
61
61
|
Schema.Literal(""),
|
|
62
|
-
Expression({ configure, resultType:
|
|
62
|
+
Expression({ configure, resultType: HttpRequestResult })
|
|
63
63
|
);
|
|
64
64
|
const CelOptions = Expression({ configure: configureWithJson(configure), resultType: isListType });
|
|
65
65
|
const CelOptionValue = Expression({ configure: configureWithOption(configure), resultType: "dyn" });
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
<script setup>
|
|
2
2
|
import { Icon } from "@iconify/vue";
|
|
3
3
|
import { watchDebounced } from "@vueuse/core";
|
|
4
|
-
import { Effect } from "effect";
|
|
4
|
+
import { Effect, Option } from "effect";
|
|
5
5
|
import { Fetch } from "fx-fetch";
|
|
6
6
|
import { computed, nextTick, ref, watch } from "vue";
|
|
7
7
|
import { useI18n } from "vue-i18n";
|
|
8
|
+
import { asRequest, fetchJsonOption } from "../../../../../share/request";
|
|
8
9
|
import { cel as _rawCel } from "../../../../../utils/cel";
|
|
9
10
|
import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
|
|
10
11
|
import { interpolateMarkdown } from "../../../../table/utils/runtime";
|
|
@@ -101,8 +102,8 @@ const requestSignature = computed(() => {
|
|
|
101
102
|
const expr = opts.request;
|
|
102
103
|
if (!expr) return null;
|
|
103
104
|
try {
|
|
104
|
-
const
|
|
105
|
-
return JSON.stringify(
|
|
105
|
+
const req = asRequest(Effect.runSync($cel(expr, { form: state.value ?? {} })));
|
|
106
|
+
return Option.isSome(req) ? JSON.stringify(req.value.describe()) : null;
|
|
106
107
|
} catch {
|
|
107
108
|
return null;
|
|
108
109
|
}
|
|
@@ -124,8 +125,8 @@ async function fetchOptions() {
|
|
|
124
125
|
}
|
|
125
126
|
isLoading.value = true;
|
|
126
127
|
const program = Effect.gen(function* () {
|
|
127
|
-
const
|
|
128
|
-
return
|
|
128
|
+
const body = yield* fetchJsonOption(yield* $cel(expr, { form: state.value ?? {} }));
|
|
129
|
+
return Option.getOrNull(body);
|
|
129
130
|
});
|
|
130
131
|
try {
|
|
131
132
|
const result = await Effect.runPromise(Effect.provide(program, Fetch.layer));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Effect, Schema } from "effect";
|
|
2
|
-
import { Expression, LocaleMarkdown } from "../../../../../share/expression.js";
|
|
2
|
+
import { Expression, HttpRequestResult, LocaleMarkdown } from "../../../../../share/expression.js";
|
|
3
3
|
import { Locale } from "../../../../../share/locale.js";
|
|
4
4
|
import { commonFieldFields, derivedField, FieldOrientationSchema } from "../../../utils/common.js";
|
|
5
5
|
export const type = "com.shwfed.form.field.combobox.single";
|
|
@@ -59,7 +59,7 @@ export function itemSchema(configure) {
|
|
|
59
59
|
export function remoteOptionsSchema(configure) {
|
|
60
60
|
const CelRequest = Schema.Union(
|
|
61
61
|
Schema.Literal(""),
|
|
62
|
-
Expression({ configure, resultType:
|
|
62
|
+
Expression({ configure, resultType: HttpRequestResult })
|
|
63
63
|
);
|
|
64
64
|
const CelOptions = Expression({ configure: configureWithJson(configure), resultType: isListType });
|
|
65
65
|
const CelOptionValue = Expression({ configure: configureWithOption(configure), resultType: "dyn" });
|
|
@@ -4,6 +4,7 @@ import { Effect, Fiber, Option } from "effect";
|
|
|
4
4
|
import { Fetch } from "fx-fetch";
|
|
5
5
|
import { computed, ref, shallowRef, watch } from "vue";
|
|
6
6
|
import { useI18n } from "vue-i18n";
|
|
7
|
+
import { fetchJsonOption } from "../../../../../share/request";
|
|
7
8
|
import { cel as _rawCel } from "../../../../../utils/cel";
|
|
8
9
|
import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
|
|
9
10
|
import { getLocalizedText } from "../../../../../share/locale";
|
|
@@ -181,11 +182,9 @@ async function fetchTree() {
|
|
|
181
182
|
const effect = Effect.gen(function* () {
|
|
182
183
|
let jsonOpt = Option.none();
|
|
183
184
|
if (dataSource.request) {
|
|
184
|
-
|
|
185
|
+
jsonOpt = yield* fetchJsonOption(yield* $cel(dataSource.request, {
|
|
185
186
|
form: state.value ?? {}
|
|
186
|
-
});
|
|
187
|
-
const response = yield* builder.json();
|
|
188
|
-
jsonOpt = Option.some(response);
|
|
187
|
+
}));
|
|
189
188
|
}
|
|
190
189
|
const dataRaw = yield* $cel(dataSource.data, {
|
|
191
190
|
form: state.value ?? {},
|
|
@@ -4,6 +4,7 @@ import { Effect, Fiber, Option } from "effect";
|
|
|
4
4
|
import { Fetch } from "fx-fetch";
|
|
5
5
|
import { computed, ref, shallowRef, watch } from "vue";
|
|
6
6
|
import { useI18n } from "vue-i18n";
|
|
7
|
+
import { fetchJsonOption } from "../../../../../share/request";
|
|
7
8
|
import { cel as _rawCel } from "../../../../../utils/cel";
|
|
8
9
|
import { celBindings, injectCELContext } from "../../../../../utils/cel-context";
|
|
9
10
|
import { getLocalizedText } from "../../../../../share/locale";
|
|
@@ -182,11 +183,9 @@ async function fetchTree() {
|
|
|
182
183
|
const effect = Effect.gen(function* () {
|
|
183
184
|
let jsonOpt = Option.none();
|
|
184
185
|
if (dataSource.request) {
|
|
185
|
-
|
|
186
|
+
jsonOpt = yield* fetchJsonOption(yield* $cel(dataSource.request, {
|
|
186
187
|
form: state.value ?? {}
|
|
187
|
-
});
|
|
188
|
-
const response = yield* builder.json();
|
|
189
|
-
jsonOpt = Option.some(response);
|
|
188
|
+
}));
|
|
190
189
|
}
|
|
191
190
|
const dataRaw = yield* $cel(dataSource.data, {
|
|
192
191
|
form: state.value ?? {},
|