@tachybase/plugin-field-formula 0.23.41 → 0.23.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  export declare const Formula: {
2
2
  (): any;
3
3
  Expression: (props: any) => import("react/jsx-runtime").JSX.Element;
4
- Result: import("react").ForwardRefExoticComponent<Omit<Partial<any>, "ref"> & import("react").RefAttributes<unknown>>;
4
+ Result: import("react").ForwardRefExoticComponent<Omit<any, "ref"> & import("react").RefAttributes<unknown>>;
5
5
  };
6
6
  export default Formula;
@@ -1,8 +1,8 @@
1
- (function(n,r){typeof exports=="object"&&typeof module!="undefined"?r(exports,require("@tachybase/client"),require("@tachybase/schema"),require("react/jsx-runtime"),require("react"),require("@tachybase/evaluators/client"),require("@tachybase/utils/client"),require("react-i18next")):typeof define=="function"&&define.amd?define(["exports","@tachybase/client","@tachybase/schema","react/jsx-runtime","react","@tachybase/evaluators/client","@tachybase/utils/client","react-i18next"],r):(n=typeof globalThis!="undefined"?globalThis:n||self,r(n["@tachybase/plugin-field-formula"]={},n["@tachybase/client"],n["@tachybase/schema"],n.jsxRuntime,n.react,n["@tachybase/evaluators"],n["@tachybase/utils"]))})(this,function(n,r,a,s,S,h,x){"use strict";var oe=Object.defineProperty,se=Object.defineProperties;var ue=Object.getOwnPropertyDescriptors;var D=Object.getOwnPropertySymbols;var B=Object.prototype.hasOwnProperty,$=Object.prototype.propertyIsEnumerable;var j=(n,r,a)=>r in n?oe(n,r,{enumerable:!0,configurable:!0,writable:!0,value:a}):n[r]=a,g=(n,r)=>{for(var a in r||(r={}))B.call(r,a)&&j(n,a,r[a]);if(D)for(var a of D(r))$.call(r,a)&&j(n,a,r[a]);return n},v=(n,r)=>se(n,ue(r));var G=(n,r)=>{var a={};for(var s in n)B.call(n,s)&&r.indexOf(s)<0&&(a[s]=n[s]);if(n!=null&&D)for(var s of D(n))r.indexOf(s)<0&&$.call(n,s)&&(a[s]=n[s]);return a};var l=(n,r,a)=>j(n,typeof r!="symbol"?r+"":r,a);var J=(n,r,a)=>new Promise((s,S)=>{var h=p=>{try{I(a.next(p))}catch(P){S(P)}},x=p=>{try{I(a.throw(p))}catch(P){S(P)}},I=p=>p.done?s(p.value):Promise.resolve(p.value).then(h,x);I((a=a.apply(n,r)).next())});const I=e=>{var T;const{value:t="",supports:i=[],useCurrentFields:o,onChange:u}=e,d=r.useCompile(),{interfaces:m}=r.useCollectionManager_deprecated(),N=((T=o==null?void 0:o())!=null?T:[]).filter(c=>i.includes(c.interface)).map(c=>{var M,F;return{label:d(c.uiSchema.title),value:c.name,children:(F=(M=m[c.interface]).usePathOptions)==null?void 0:F.call(M,c)}});return s.jsx(r.Variable.TextArea,{value:t,onChange:u,scope:N})},p={boolean:Boolean,integer:{boolean(e){return Number(e)},number(e){return e>=0?Math.floor(e):Math.ceil(e)},bigint(e){return Number(e)},string(e){const t=Number.parseInt(e,10);return Number.isNaN(t)||!Number.isFinite(t)?null:t},date(e){const t=e.valueOf();return Number.isNaN(t)?null:t}},bigInt:{boolean(e){return Number(e)},number(e){return Math.floor(e>=0?Math.floor(e):Math.ceil(e))},bigint(e){return Number(e)},string(e){const t=Number.parseInt(e,10);return Number.isNaN(t)||!Number.isFinite(t)?null:t},date(e){const t=e.valueOf();return Number.isNaN(t)?null:t}},double:{boolean(e){return Number(e)},number(e){return e},bigint(e){return Number(e)},string(e){const t=Number.parseFloat(e);return Number.isNaN(t)||!Number.isFinite(t)?null:t},date(e){const t=e.valueOf();return Number.isNaN(t)?null:t}},decimal:{boolean(e){return Number(e)},number(e){return e},bigint(e){return e},date(e){const t=e.valueOf();return Number.isNaN(t)?null:t}},string:{boolean(e){return e.toString()},number(e){return e.toString()},bigint(e){return e.toString()},string(e){return e},date(e){return e.toISOString()}},date:{boolean(e){return null},number(e){const t=new Date(e);return Number.isNaN(t.valueOf())?null:t},bigint(e){const t=new Date(Number(e));return Number.isNaN(t.valueOf())?null:t},string(e){const t=Date.parse(e);return Number.isNaN(t)?null:new Date(t)},date(e){return new Date(e)}}};function P(e,t){if(e==null)return null;let i=typeof e;i=="object"&&e instanceof Date&&(i="date");const o=p[t];if(!o)return null;if(typeof o=="function")return o(e);const u=o[i];return u?u(e):null}const U={boolean:r.Checkbox.ReadPretty,integer:r.InputNumber.ReadPretty,bigInt:r.InputNumber.ReadPretty,double:r.InputNumber.ReadPretty,decimal:r.InputNumber.ReadPretty,date:r.DatePicker.ReadPretty,string:r.Input.ReadPretty};function z(){const e=a.useFieldSchema(),t=r.useCollection_deprecated(),{getCollection:i,getCollectionField:o}=r.useCollectionManager_deprecated(),u=e.name.split(".");let d=t;for(let m=0;m<u.length-1;m++){const b=d.getField(u[m]);d=i(b.target)}return o(`${d.name}.${u[u.length-1]}`)}function H(e,t,i){const o=e[t];return Array.isArray(o)?o[i]:o&&typeof o=="object"?o:e}function K(e){var w,k,V;const R=e,{value:t}=R,i=G(R,["value"]),o=a.useFieldSchema(),{dataType:u,expression:d,engine:m="math.js"}=(w=z())!=null?w:{},[b,N]=S.useState(t),{evaluate:T}=h.evaluators.get(m),c=r.useFormBlockContext(),F=a.useField().path.entire,A=F==null?void 0:F.replace(`.${o.name}`,""),ee=A.split(".")[0],te=parseInt((k=A.split("."))==null?void 0:k[1]);S.useEffect(()=>{N(t)},[t]),a.useFormEffects(()=>{a.onFormValuesChange(ne=>{var _;if(o.name.indexOf(".")>=0||!(c!=null&&c.form)||(_=c.form)!=null&&_.readPretty)return;const ae=a.toJS(H(ne.values,ee,te));let f;try{f=T(d,ae),f=P(f,u)}catch(ie){f=null}f==null&&b==null&&N(f),N(f),f!==t&&e.onChange(f)})});const re=(V=U[u])!=null?V:r.Input;return s.jsx(re,v(g({},i),{value:u==="double"?x.toFixedByStep(b,e.step):b}))}const E=()=>null;E.Expression=I,E.Result=a.connect(K);const y="field-formula",L=[{dependencies:["dataType"],fulfill:{state:{display:'{{["double", "decimal"].includes($deps[0]) ? "visible" : "none"}}'}}}],q=[{dependencies:["dataType"],fulfill:{state:{display:'{{$deps[0] === "date" ? "visible" : "none"}}'}}}],{defaultProps:Q,dateTimeProps:C,operators:W}=r.interfacesProperties,X={"uiSchema.x-component-props.dateFormat":v(g({},x.lodash.cloneDeep(C["uiSchema.x-component-props.dateFormat"])),{"x-reactions":q}),"uiSchema.x-component-props.showTime":v(g({},x.lodash.cloneDeep(C["uiSchema.x-component-props.showTime"])),{"x-reactions":[...C["uiSchema.x-component-props.showTime"]["x-reactions"],...q]}),"uiSchema.x-component-props.timeFormat":g({},x.lodash.cloneDeep(C["uiSchema.x-component-props.timeFormat"]))};class Y extends r.CollectionFieldInterface{constructor(){super(...arguments);l(this,"name","formula");l(this,"type","object");l(this,"group","advanced");l(this,"order",1);l(this,"title",`{{t("Formula", { ns: "${y}" })}}`);l(this,"description",`{{t("Configure and store the results of calculations between multiple field values in the same record, supporting both Math.js and Excel formula functions.", { ns: "${y}" })}}`);l(this,"sortable",!0);l(this,"default",{type:"formula",uiSchema:{type:"string","x-component":"Formula.Result","x-component-props":{stringMode:!0,step:"1"},"x-read-pretty":!0}});l(this,"properties",v(g(v(g({},Q),{dataType:{type:"string",title:'{{t("Storage type")}}',"x-decorator":"FormItem","x-component":"Select","x-disabled":"{{ !createOnly }}",enum:[{value:"boolean",label:"Boolean"},{value:"integer",label:"Integer"},{value:"bigInt",label:"Big integer"},{value:"double",label:"Double"},{value:"string",label:"String"},{value:"date",label:"Datetime"}],required:!0,default:"double"},"uiSchema.x-component-props.addonAfter":{type:"string",title:"后缀","x-decorator":"FormItem","x-component":"Input"},"uiSchema.x-component-props.step":{type:"string",title:'{{t("Precision")}}',"x-component":"Select","x-decorator":"FormItem",required:!0,default:"0",enum:[{value:"0",label:"1"},{value:"0.1",label:"1.0"},{value:"0.01",label:"1.00"},{value:"0.001",label:"1.000"},{value:"0.0001",label:"1.0000"},{value:"0.00001",label:"1.00000"}],"x-reactions":L}}),X),{engine:{type:"string",title:`{{t("Calculation engine", { ns: "${y}" })}}`,"x-decorator":"FormItem","x-component":"Radio.Group",enum:Array.from(h.evaluators.getEntities()).reduce((i,[o,u])=>i.concat(g({value:o},u)),[]),required:!0,default:"math.js"},expression:{type:"string",title:`{{t("Expression", { ns: "${y}" })}}`,required:!0,"x-component":"Formula.Expression","x-decorator":"FormItem","x-component-props":{supports:["checkbox","number","percent","integer","number","percent","sequence","input","textarea","email","phone","datetime","createdAt","updatedAt","radioGroup","checkboxGroup","select","multipleSelect"],useCurrentFields:"{{ useCurrentFields }}"},"x-reactions":{dependencies:["engine"],fulfill:{schema:{description:"{{renderExpressionDescription($deps[0])}}"}}},"x-validator"(i,o,{form:u}){const{values:d}=u,{evaluate:m}=h.evaluators.get(d.engine),b=i.trim().replace(/{{\s*([^{}]+)\s*}}/g,"1");try{return m(b),""}catch(N){return r.i18n.t("Expression syntax error",{ns:y})}}}}));l(this,"filterable",{operators:W.string});l(this,"titleUsable",!0)}}function Z(e){const t=h.evaluators.get(e);return t!=null&&t.link?s.jsxs(s.Fragment,{children:[s.jsx("span",{className:r.css`
1
+ (function(n,r){typeof exports=="object"&&typeof module!="undefined"?r(exports,require("@tachybase/client"),require("@tachybase/schema"),require("react/jsx-runtime"),require("react"),require("@tachybase/evaluators/client"),require("@tachybase/utils/client"),require("react-i18next")):typeof define=="function"&&define.amd?define(["exports","@tachybase/client","@tachybase/schema","react/jsx-runtime","react","@tachybase/evaluators/client","@tachybase/utils/client","react-i18next"],r):(n=typeof globalThis!="undefined"?globalThis:n||self,r(n["@tachybase/plugin-field-formula"]={},n["@tachybase/client"],n["@tachybase/schema"],n.jsxRuntime,n.react,n["@tachybase/evaluators"],n["@tachybase/utils"]))})(this,function(n,r,a,s,F,h,g){"use strict";var ae=Object.defineProperty,oe=Object.defineProperties;var se=Object.getOwnPropertyDescriptors;var T=Object.getOwnPropertySymbols;var _=Object.prototype.hasOwnProperty,B=Object.prototype.propertyIsEnumerable;var V=(n,r,a)=>r in n?ae(n,r,{enumerable:!0,configurable:!0,writable:!0,value:a}):n[r]=a,f=(n,r)=>{for(var a in r||(r={}))_.call(r,a)&&V(n,a,r[a]);if(T)for(var a of T(r))B.call(r,a)&&V(n,a,r[a]);return n},N=(n,r)=>oe(n,se(r));var $=(n,r)=>{var a={};for(var s in n)_.call(n,s)&&r.indexOf(s)<0&&(a[s]=n[s]);if(n!=null&&T)for(var s of T(n))r.indexOf(s)<0&&B.call(n,s)&&(a[s]=n[s]);return a};var G=(n,r,a)=>new Promise((s,F)=>{var h=c=>{try{v(a.next(c))}catch(S){F(S)}},g=c=>{try{v(a.throw(c))}catch(S){F(S)}},v=c=>c.done?s(c.value):Promise.resolve(c.value).then(h,g);v((a=a.apply(n,r)).next())});const v=e=>{var C;const{value:t="",supports:i=[],useCurrentFields:o,onChange:u}=e,p=r.useCompile(),{interfaces:d}=r.useCollectionManager_deprecated(),I=((C=o==null?void 0:o())!=null?C:[]).filter(l=>i.includes(l.interface)).map(l=>{var E,y;return{label:p(l.uiSchema.title),value:l.name,children:(y=(E=d[l.interface]).usePathOptions)==null?void 0:y.call(E,l)}});return s.jsx(r.Variable.TextArea,{value:t,onChange:u,scope:I})},c={boolean:Boolean,integer:{boolean(e){return Number(e)},number(e){return e>=0?Math.floor(e):Math.ceil(e)},bigint(e){return Number(e)},string(e){const t=Number.parseInt(e,10);return Number.isNaN(t)||!Number.isFinite(t)?null:t},date(e){const t=e.valueOf();return Number.isNaN(t)?null:t}},bigInt:{boolean(e){return Number(e)},number(e){return Math.floor(e>=0?Math.floor(e):Math.ceil(e))},bigint(e){return Number(e)},string(e){const t=Number.parseInt(e,10);return Number.isNaN(t)||!Number.isFinite(t)?null:t},date(e){const t=e.valueOf();return Number.isNaN(t)?null:t}},double:{boolean(e){return Number(e)},number(e){return e},bigint(e){return Number(e)},string(e){const t=Number.parseFloat(e);return Number.isNaN(t)||!Number.isFinite(t)?null:t},date(e){const t=e.valueOf();return Number.isNaN(t)?null:t}},decimal:{boolean(e){return Number(e)},number(e){return e},bigint(e){return e},date(e){const t=e.valueOf();return Number.isNaN(t)?null:t}},string:{boolean(e){return e.toString()},number(e){return e.toString()},bigint(e){return e.toString()},string(e){return e},date(e){return e.toISOString()}},date:{boolean(e){return null},number(e){const t=new Date(e);return Number.isNaN(t.valueOf())?null:t},bigint(e){const t=new Date(Number(e));return Number.isNaN(t.valueOf())?null:t},string(e){const t=Date.parse(e);return Number.isNaN(t)?null:new Date(t)},date(e){return new Date(e)}}};function S(e,t){if(e==null)return null;let i=typeof e;i=="object"&&e instanceof Date&&(i="date");const o=c[t];if(!o)return null;if(typeof o=="function")return o(e);const u=o[i];return u?u(e):null}const J={boolean:r.Checkbox.ReadPretty,integer:r.InputNumber.ReadPretty,bigInt:r.InputNumber.ReadPretty,double:r.InputNumber.ReadPretty,decimal:r.InputNumber.ReadPretty,date:r.DatePicker.ReadPretty,string:r.Input.ReadPretty};function U(){const e=a.useFieldSchema(),t=r.useCollection_deprecated(),{getCollection:i,getCollectionField:o}=r.useCollectionManager_deprecated(),u=e.name.split(".");let p=t;for(let d=0;d<u.length-1;d++){const b=p.getField(u[d]);p=i(b.target)}return o(`${p.name}.${u[u.length-1]}`)}function z(e,t,i){const o=e[t];return Array.isArray(o)?o[i]:o&&typeof o=="object"?o:e}function H(e){var A,R,w;const O=e,{value:t}=O,i=$(O,["value"]),o=a.useFieldSchema(),{dataType:u,expression:p,engine:d="math.js"}=(A=U())!=null?A:{},[b,I]=F.useState(t),{evaluate:C}=h.evaluators.get(d),l=r.useFormBlockContext(),y=a.useField().path.entire,q=y==null?void 0:y.replace(`.${o.name}`,""),Z=q.split(".")[0],ee=parseInt((R=q.split("."))==null?void 0:R[1]);F.useEffect(()=>{I(t)},[t]),a.useFormEffects(()=>{a.onFormValuesChange(re=>{var k;if(o.name.indexOf(".")>=0||!(l!=null&&l.form)||(k=l.form)!=null&&k.readPretty)return;const ne=a.toJS(z(re.values,Z,ee));let m;try{m=C(p,ne),m=S(m,u)}catch(ue){m=null}m==null&&b==null&&I(m),I(m),m!==t&&e.onChange(m)})});const te=(w=J[u])!=null?w:r.Input;return s.jsx(te,N(f({},i),{value:u==="double"?g.toFixedByStep(b,e.step):b}))}const D=()=>null;D.Expression=v,D.Result=a.connect(H);const x="field-formula",K=[{dependencies:["dataType"],fulfill:{state:{display:'{{["double", "decimal"].includes($deps[0]) ? "visible" : "none"}}'}}}],M=[{dependencies:["dataType"],fulfill:{state:{display:'{{$deps[0] === "date" ? "visible" : "none"}}'}}}],{defaultProps:L,dateTimeProps:P,operators:Q}=r.interfacesProperties,W={"uiSchema.x-component-props.dateFormat":N(f({},g.lodash.cloneDeep(P["uiSchema.x-component-props.dateFormat"])),{"x-reactions":M}),"uiSchema.x-component-props.showTime":N(f({},g.lodash.cloneDeep(P["uiSchema.x-component-props.showTime"])),{"x-reactions":[...P["uiSchema.x-component-props.showTime"]["x-reactions"],...M]}),"uiSchema.x-component-props.timeFormat":f({},g.lodash.cloneDeep(P["uiSchema.x-component-props.timeFormat"]))};class X extends r.CollectionFieldInterface{constructor(){super(...arguments),this.name="formula",this.type="object",this.group="advanced",this.order=1,this.title=`{{t("Formula", { ns: "${x}" })}}`,this.description=`{{t("Configure and store the results of calculations between multiple field values in the same record, supporting both Math.js and Excel formula functions.", { ns: "${x}" })}}`,this.sortable=!0,this.default={type:"formula",uiSchema:{type:"string","x-component":"Formula.Result","x-component-props":{stringMode:!0,step:"1"},"x-read-pretty":!0}},this.properties=N(f(N(f({},L),{dataType:{type:"string",title:'{{t("Storage type")}}',"x-decorator":"FormItem","x-component":"Select","x-disabled":"{{ !createOnly }}",enum:[{value:"boolean",label:"Boolean"},{value:"integer",label:"Integer"},{value:"bigInt",label:"Big integer"},{value:"double",label:"Double"},{value:"string",label:"String"},{value:"date",label:"Datetime"}],required:!0,default:"double"},"uiSchema.x-component-props.addonAfter":{type:"string",title:"后缀","x-decorator":"FormItem","x-component":"Input"},"uiSchema.x-component-props.step":{type:"string",title:'{{t("Precision")}}',"x-component":"Select","x-decorator":"FormItem",required:!0,default:"0",enum:[{value:"0",label:"1"},{value:"0.1",label:"1.0"},{value:"0.01",label:"1.00"},{value:"0.001",label:"1.000"},{value:"0.0001",label:"1.0000"},{value:"0.00001",label:"1.00000"}],"x-reactions":K}}),W),{engine:{type:"string",title:`{{t("Calculation engine", { ns: "${x}" })}}`,"x-decorator":"FormItem","x-component":"Radio.Group",enum:Array.from(h.evaluators.getEntities()).reduce((t,[i,o])=>t.concat(f({value:i},o)),[]),required:!0,default:"math.js"},expression:{type:"string",title:`{{t("Expression", { ns: "${x}" })}}`,required:!0,"x-component":"Formula.Expression","x-decorator":"FormItem","x-component-props":{supports:["checkbox","number","percent","integer","number","percent","sequence","input","textarea","email","phone","datetime","createdAt","updatedAt","radioGroup","checkboxGroup","select","multipleSelect"],useCurrentFields:"{{ useCurrentFields }}"},"x-reactions":{dependencies:["engine"],fulfill:{schema:{description:"{{renderExpressionDescription($deps[0])}}"}}},"x-validator"(t,i,{form:o}){const{values:u}=o,{evaluate:p}=h.evaluators.get(u.engine),d=t.trim().replace(/{{\s*([^{}]+)\s*}}/g,"1");try{return p(d),""}catch(b){return r.i18n.t("Expression syntax error",{ns:x})}}}}),this.filterable={operators:Q.string},this.titleUsable=!0}}function Y(e){const t=h.evaluators.get(e);return t!=null&&t.link?s.jsxs(s.Fragment,{children:[s.jsx("span",{className:r.css`
2
2
  &:after {
3
3
  content: ':';
4
4
  }
5
5
  & + a {
6
6
  margin-left: 0.25em;
7
7
  }
8
- `,children:r.i18n.t("Syntax references",{ns:y})}),s.jsx("a",{href:t.link,target:"_blank",rel:"noreferrer",children:t.label})]}):null}class O extends r.Plugin{load(){return J(this,null,function*(){this.app.addComponents({Formula:E}),this.app.addScopes({renderExpressionDescription:Z}),this.app.dataSourceManager.addFieldInterfaces([Y])})}}n.FormulaFieldPlugin=O,n.default=O,Object.defineProperties(n,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
8
+ `,children:r.i18n.t("Syntax references",{ns:x})}),s.jsx("a",{href:t.link,target:"_blank",rel:"noreferrer",children:t.label})]}):null}class j extends r.Plugin{load(){return G(this,null,function*(){this.app.addComponents({Formula:D}),this.app.addScopes({renderExpressionDescription:Y}),this.app.dataSourceManager.addFieldInterfaces([X])})}}n.FormulaFieldPlugin=j,n.default=j,Object.defineProperties(n,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
@@ -1,10 +1,10 @@
1
1
  module.exports = {
2
- "@tachybase/client": "0.23.41",
2
+ "@tachybase/client": "0.23.47",
3
3
  "react": "18.3.1",
4
- "@tachybase/evaluators": "0.23.41",
5
- "@tachybase/utils": "0.23.41",
6
- "@tachybase/database": "0.23.41",
7
- "@tachybase/server": "0.23.41",
4
+ "@tachybase/evaluators": "0.23.47",
5
+ "@tachybase/utils": "0.23.47",
6
+ "@tachybase/database": "0.23.47",
7
+ "@tachybase/server": "0.23.47",
8
8
  "react-i18next": "15.2.0",
9
- "@tachybase/schema": "0.23.41"
9
+ "@tachybase/schema": "0.23.47"
10
10
  };
@@ -33,6 +33,62 @@ const DataTypeMap = {
33
33
  date: import_database.DataTypes.DATE(3)
34
34
  };
35
35
  class FormulaField extends import_database.Field {
36
+ constructor() {
37
+ super(...arguments);
38
+ this.initFieldData = async ({ transaction }) => {
39
+ const { name } = this.options;
40
+ const records = await this.collection.repository.find({
41
+ order: [this.collection.model.primaryKeyAttribute],
42
+ transaction
43
+ });
44
+ for (const record of records) {
45
+ const scope = record.toJSON();
46
+ const result = this.calculate(scope);
47
+ if (result != null) {
48
+ await record.update(
49
+ {
50
+ [name]: result
51
+ },
52
+ {
53
+ transaction,
54
+ silent: true,
55
+ hooks: false
56
+ }
57
+ );
58
+ }
59
+ }
60
+ };
61
+ this.calculateField = async (instance) => {
62
+ const { name } = this.options;
63
+ const result = this.calculate(instance.toJSON());
64
+ instance.set(name, result);
65
+ };
66
+ this.updateFieldData = async (instance, { transaction }) => {
67
+ if (this.collection.name !== instance.collectionName || instance.name !== this.options.name) {
68
+ return;
69
+ }
70
+ this.options = Object.assign(this.options, instance.options);
71
+ const { name } = this.options;
72
+ const records = await this.collection.repository.find({
73
+ order: [this.collection.model.primaryKeyAttribute],
74
+ transaction
75
+ });
76
+ for (const record of records) {
77
+ const scope = record.toJSON();
78
+ const result = this.calculate(scope);
79
+ await record.update(
80
+ {
81
+ [name]: result
82
+ },
83
+ {
84
+ transaction,
85
+ silent: true,
86
+ hooks: false
87
+ }
88
+ );
89
+ }
90
+ };
91
+ }
36
92
  get dataType() {
37
93
  const { dataType } = this.options;
38
94
  return DataTypeMap[dataType] ?? import_database.DataTypes.DOUBLE;
@@ -48,59 +104,6 @@ class FormulaField extends import_database.Field {
48
104
  }
49
105
  return null;
50
106
  }
51
- initFieldData = async ({ transaction }) => {
52
- const { name } = this.options;
53
- const records = await this.collection.repository.find({
54
- order: [this.collection.model.primaryKeyAttribute],
55
- transaction
56
- });
57
- for (const record of records) {
58
- const scope = record.toJSON();
59
- const result = this.calculate(scope);
60
- if (result != null) {
61
- await record.update(
62
- {
63
- [name]: result
64
- },
65
- {
66
- transaction,
67
- silent: true,
68
- hooks: false
69
- }
70
- );
71
- }
72
- }
73
- };
74
- calculateField = async (instance) => {
75
- const { name } = this.options;
76
- const result = this.calculate(instance.toJSON());
77
- instance.set(name, result);
78
- };
79
- updateFieldData = async (instance, { transaction }) => {
80
- if (this.collection.name !== instance.collectionName || instance.name !== this.options.name) {
81
- return;
82
- }
83
- this.options = Object.assign(this.options, instance.options);
84
- const { name } = this.options;
85
- const records = await this.collection.repository.find({
86
- order: [this.collection.model.primaryKeyAttribute],
87
- transaction
88
- });
89
- for (const record of records) {
90
- const scope = record.toJSON();
91
- const result = this.calculate(scope);
92
- await record.update(
93
- {
94
- [name]: result
95
- },
96
- {
97
- transaction,
98
- silent: true,
99
- hooks: false
100
- }
101
- );
102
- }
103
- };
104
107
  bind() {
105
108
  super.bind();
106
109
  this.database.on("fields.afterUpdate", this.updateFieldData);
@@ -22,7 +22,10 @@ __export(alter_field_exports, {
22
22
  module.exports = __toCommonJS(alter_field_exports);
23
23
  var import_server = require("@tachybase/server");
24
24
  class alter_field_default extends import_server.Migration {
25
- appVersion = "<=0.9.0-alpha.3";
25
+ constructor() {
26
+ super(...arguments);
27
+ this.appVersion = "<=0.9.0-alpha.3";
28
+ }
26
29
  async up() {
27
30
  const result = await this.app.version.satisfies("<=0.9.0-alpha.3");
28
31
  if (!result) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tachybase/plugin-field-formula",
3
3
  "displayName": "Field: Formula",
4
- "version": "0.23.41",
4
+ "version": "0.23.47",
5
5
  "description": "Configure and store the results of calculations between multiple field values in the same record, supporting both Math.js and Excel formula functions.",
6
6
  "keywords": [
7
7
  "Collection fields"
@@ -12,16 +12,16 @@
12
12
  "devDependencies": {
13
13
  "react": "^18.3.1",
14
14
  "react-i18next": "^15.2.0",
15
- "@tachybase/components": "0.23.41",
16
- "@tachybase/schema": "0.23.41"
15
+ "@tachybase/components": "0.23.47",
16
+ "@tachybase/schema": "0.23.47"
17
17
  },
18
18
  "peerDependencies": {
19
- "@tachybase/client": "0.23.41",
20
- "@tachybase/database": "0.23.41",
21
- "@tachybase/evaluators": "0.23.41",
22
- "@tachybase/server": "0.23.41",
23
- "@tachybase/test": "0.23.41",
24
- "@tachybase/utils": "0.23.41"
19
+ "@tachybase/client": "0.23.47",
20
+ "@tachybase/database": "0.23.47",
21
+ "@tachybase/evaluators": "0.23.47",
22
+ "@tachybase/utils": "0.23.47",
23
+ "@tachybase/test": "0.23.47",
24
+ "@tachybase/server": "0.23.47"
25
25
  },
26
26
  "description.zh-CN": "可以配置并存储同一条记录的多字段值之间的计算结果,支持 Math.js 和 Excel formula functions 两种引擎",
27
27
  "displayName.zh-CN": "数据表字段:公式",