@ram_28/kf-ai-sdk 1.0.10 → 1.0.12
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/README.md +55 -48
- package/dist/api/client.d.ts +23 -13
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/datetime.d.ts +5 -5
- package/dist/api/datetime.d.ts.map +1 -1
- package/dist/api/index.d.ts +1 -1
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/metadata.d.ts +2 -2
- package/dist/api/metadata.d.ts.map +1 -1
- package/dist/api.cjs +1 -0
- package/dist/api.d.ts +4 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.mjs +27 -0
- package/dist/api.types.cjs +1 -0
- package/dist/api.types.d.ts +4 -0
- package/dist/api.types.d.ts.map +1 -0
- package/dist/api.types.mjs +1 -0
- package/dist/auth/AuthProvider.d.ts +3 -3
- package/dist/auth/AuthProvider.d.ts.map +1 -1
- package/dist/auth/authClient.d.ts +4 -4
- package/dist/auth/authClient.d.ts.map +1 -1
- package/dist/auth/authConfig.d.ts +5 -5
- package/dist/auth/authConfig.d.ts.map +1 -1
- package/dist/auth/index.d.ts +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/types.d.ts +21 -21
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/auth/useAuth.d.ts +2 -2
- package/dist/auth/useAuth.d.ts.map +1 -1
- package/dist/auth.cjs +1 -0
- package/dist/auth.d.ts +5 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.mjs +280 -0
- package/dist/auth.types.cjs +1 -0
- package/dist/auth.types.d.ts +2 -0
- package/dist/auth.types.d.ts.map +1 -0
- package/dist/auth.types.mjs +1 -0
- package/dist/base-types.d.ts +2 -0
- package/dist/base-types.d.ts.map +1 -0
- package/dist/client-C15j4O5B.cjs +1 -0
- package/dist/client-CfvLiGfP.js +233 -0
- package/dist/cn-Dr87sK3i.js +2775 -0
- package/dist/cn-mXUIg4vp.cjs +1 -0
- package/dist/components/hooks/index.d.ts +3 -3
- package/dist/components/hooks/index.d.ts.map +1 -1
- package/dist/components/hooks/useFilter/index.d.ts +2 -2
- package/dist/components/hooks/useFilter/index.d.ts.map +1 -1
- package/dist/components/hooks/useFilter/types.d.ts +19 -31
- package/dist/components/hooks/useFilter/types.d.ts.map +1 -1
- package/dist/components/hooks/useFilter/useFilter.d.ts +2 -2
- package/dist/components/hooks/useFilter/useFilter.d.ts.map +1 -1
- package/dist/components/hooks/useForm/apiClient.d.ts +6 -6
- package/dist/components/hooks/useForm/apiClient.d.ts.map +1 -1
- package/dist/components/hooks/useForm/expressionValidator.utils.d.ts +7 -7
- package/dist/components/hooks/useForm/expressionValidator.utils.d.ts.map +1 -1
- package/dist/components/hooks/useForm/index.d.ts +5 -5
- package/dist/components/hooks/useForm/index.d.ts.map +1 -1
- package/dist/components/hooks/useForm/optimizedExpressionValidator.utils.d.ts +10 -10
- package/dist/components/hooks/useForm/optimizedExpressionValidator.utils.d.ts.map +1 -1
- package/dist/components/hooks/useForm/ruleClassifier.utils.d.ts +7 -12
- package/dist/components/hooks/useForm/ruleClassifier.utils.d.ts.map +1 -1
- package/dist/components/hooks/useForm/schemaParser.utils.d.ts +7 -7
- package/dist/components/hooks/useForm/schemaParser.utils.d.ts.map +1 -1
- package/dist/components/hooks/useForm/types.d.ts +79 -70
- package/dist/components/hooks/useForm/types.d.ts.map +1 -1
- package/dist/components/hooks/useForm/useForm.d.ts +2 -2
- package/dist/components/hooks/useForm/useForm.d.ts.map +1 -1
- package/dist/components/hooks/useKanban/apiClient.d.ts +16 -16
- package/dist/components/hooks/useKanban/apiClient.d.ts.map +1 -1
- package/dist/components/hooks/useKanban/context.d.ts +3 -3
- package/dist/components/hooks/useKanban/context.d.ts.map +1 -1
- package/dist/components/hooks/useKanban/dragDropManager.d.ts +7 -7
- package/dist/components/hooks/useKanban/dragDropManager.d.ts.map +1 -1
- package/dist/components/hooks/useKanban/index.d.ts +1 -1
- package/dist/components/hooks/useKanban/index.d.ts.map +1 -1
- package/dist/components/hooks/useKanban/types.d.ts +65 -67
- package/dist/components/hooks/useKanban/types.d.ts.map +1 -1
- package/dist/components/hooks/useKanban/useKanban.d.ts +2 -2
- package/dist/components/hooks/useKanban/useKanban.d.ts.map +1 -1
- package/dist/components/hooks/useTable/index.d.ts +1 -1
- package/dist/components/hooks/useTable/index.d.ts.map +1 -1
- package/dist/components/hooks/useTable/types.d.ts +10 -10
- package/dist/components/hooks/useTable/types.d.ts.map +1 -1
- package/dist/components/hooks/useTable/useTable.d.ts +2 -2
- package/dist/components/hooks/useTable/useTable.d.ts.map +1 -1
- package/dist/filter.cjs +1 -0
- package/dist/filter.d.ts +3 -0
- package/dist/filter.d.ts.map +1 -0
- package/dist/filter.mjs +6 -0
- package/dist/filter.types.cjs +1 -0
- package/dist/filter.types.d.ts +2 -0
- package/dist/filter.types.d.ts.map +1 -0
- package/dist/filter.types.mjs +1 -0
- package/dist/form.cjs +1 -0
- package/dist/form.d.ts +3 -0
- package/dist/form.d.ts.map +1 -0
- package/dist/form.mjs +1346 -0
- package/dist/form.types.cjs +1 -0
- package/dist/form.types.d.ts +2 -0
- package/dist/form.types.d.ts.map +1 -0
- package/dist/form.types.mjs +1 -0
- package/dist/jsx-runtime-BYECrxsp.cjs +30 -0
- package/dist/jsx-runtime-DGlMoOmv.js +630 -0
- package/dist/kanban.cjs +13 -0
- package/dist/kanban.d.ts +5 -0
- package/dist/kanban.d.ts.map +1 -0
- package/dist/kanban.mjs +694 -0
- package/dist/kanban.types.cjs +1 -0
- package/dist/kanban.types.d.ts +2 -0
- package/dist/kanban.types.d.ts.map +1 -0
- package/dist/kanban.types.mjs +1 -0
- package/dist/kanban.ui.cjs +1 -0
- package/dist/kanban.ui.d.ts +2 -0
- package/dist/kanban.ui.d.ts.map +1 -0
- package/dist/kanban.ui.mjs +104 -0
- package/dist/metadata-2FLBsFcf.cjs +1 -0
- package/dist/metadata-DBcoDth-.js +43 -0
- package/dist/table.cjs +1 -0
- package/dist/table.d.ts +2 -0
- package/dist/table.d.ts.map +1 -0
- package/dist/table.mjs +148 -0
- package/dist/table.types.cjs +1 -0
- package/dist/table.types.d.ts +2 -0
- package/dist/table.types.d.ts.map +1 -0
- package/dist/table.types.mjs +1 -0
- package/dist/types/base-fields.d.ts +45 -45
- package/dist/types/base-fields.d.ts.map +1 -1
- package/dist/types/common.d.ts +45 -61
- package/dist/types/common.d.ts.map +1 -1
- package/dist/types.cjs +1 -0
- package/dist/types.mjs +1 -0
- package/dist/useFilter-CXFqEHyI.js +129 -0
- package/dist/useFilter-D-bCDo6Z.cjs +1 -0
- package/dist/utils/formatting.d.ts +4 -4
- package/dist/utils/formatting.d.ts.map +1 -1
- package/dist/utils.cjs +4 -0
- package/dist/utils.d.ts +3 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.mjs +105 -0
- package/package.json +147 -9
- package/sdk/api/client.ts +76 -49
- package/sdk/api/datetime.ts +5 -5
- package/sdk/api/index.ts +28 -33
- package/sdk/api/metadata.ts +4 -4
- package/sdk/api.ts +24 -0
- package/sdk/api.types.ts +58 -0
- package/sdk/auth/AuthProvider.tsx +18 -18
- package/sdk/auth/authClient.ts +9 -9
- package/sdk/auth/authConfig.ts +9 -9
- package/sdk/auth/index.ts +5 -5
- package/sdk/auth/types.ts +21 -21
- package/sdk/auth/useAuth.ts +2 -2
- package/sdk/auth.ts +22 -0
- package/sdk/auth.types.ts +28 -0
- package/sdk/base-types.ts +45 -0
- package/sdk/components/hooks/index.ts +22 -22
- package/sdk/components/hooks/useFilter/index.ts +8 -14
- package/sdk/components/hooks/useFilter/types.ts +29 -58
- package/sdk/components/hooks/useFilter/useFilter.ts +41 -44
- package/sdk/components/hooks/useForm/apiClient.ts +8 -8
- package/sdk/components/hooks/useForm/expressionValidator.utils.ts +18 -18
- package/sdk/components/hooks/useForm/index.ts +24 -24
- package/sdk/components/hooks/useForm/optimizedExpressionValidator.utils.ts +22 -22
- package/sdk/components/hooks/useForm/ruleClassifier.utils.ts +26 -62
- package/sdk/components/hooks/useForm/schemaParser.utils.ts +24 -24
- package/sdk/components/hooks/useForm/types.ts +85 -75
- package/sdk/components/hooks/useForm/useForm.ts +160 -40
- package/sdk/components/hooks/useKanban/apiClient.ts +54 -54
- package/sdk/components/hooks/useKanban/context.ts +3 -3
- package/sdk/components/hooks/useKanban/dragDropManager.ts +19 -19
- package/sdk/components/hooks/useKanban/index.ts +26 -26
- package/sdk/components/hooks/useKanban/types.ts +69 -71
- package/sdk/components/hooks/useKanban/useKanban.ts +43 -51
- package/sdk/components/hooks/useKanban/useKanbanSimple.ts +4 -4
- package/sdk/components/hooks/useTable/index.ts +5 -1
- package/sdk/components/hooks/useTable/types.ts +10 -10
- package/sdk/components/hooks/useTable/useTable.ts +10 -10
- package/sdk/filter.ts +13 -0
- package/sdk/filter.types.ts +17 -0
- package/sdk/form.ts +15 -0
- package/sdk/form.types.ts +46 -0
- package/sdk/kanban.ts +23 -0
- package/sdk/kanban.types.ts +50 -0
- package/sdk/kanban.ui.ts +16 -0
- package/sdk/table.ts +7 -0
- package/sdk/table.types.ts +13 -0
- package/sdk/types/base-fields.ts +47 -47
- package/sdk/types/common.ts +47 -71
- package/sdk/types/index.ts +1 -1
- package/sdk/utils/formatting.ts +4 -4
- package/sdk/utils.ts +10 -0
- package/dist/index.cjs +0 -45
- package/dist/index.mjs +0 -6327
package/dist/form.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var Te=Object.defineProperty;var Me=(t,e,r)=>e in t?Te(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var L=(t,e,r)=>Me(t,typeof e!="symbol"?e+"":e,r);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("react"),Ie=require("react-hook-form"),ae=require("@tanstack/react-query"),M=require("./client-C15j4O5B.cjs"),Le=require("./metadata-2FLBsFcf.cjs");function Ue(){const t=new Date;return{NOW:t,TODAY:new Date(t.getFullYear(),t.getMonth(),t.getDate()),CURRENT_USER:{EmpId:1,Email:"user@example.com",FirstName:"John",LastName:"Doe",Role:"User"},CURRENT_USER_ID:1}}const $e={CONCAT:(...t)=>t.map(e=>String(e||"")).join(""),TRIM:t=>String(t||"").trim(),LENGTH:t=>String(t||"").length,UPPER:t=>String(t||"").toUpperCase(),LOWER:t=>String(t||"").toLowerCase(),SUBSTRING:(t,e,r)=>{const s=String(t||"");return r!==void 0?s.substring(e,e+r):s.substring(e)},CONTAINS:(t,e)=>String(t||"").includes(String(e||"")),YEAR:t=>new Date(t).getFullYear(),MONTH:t=>new Date(t).getMonth()+1,DAY:t=>new Date(t).getDate(),DATE_DIFF:(t,e)=>{const r=new Date(t),s=new Date(e),a=Math.abs(r.getTime()-s.getTime());return Math.ceil(a/(1e3*60*60*24))},ADD_DAYS:(t,e)=>{const r=new Date(t);return r.setDate(r.getDate()+e),r},ADD_MONTHS:(t,e)=>{const r=new Date(t);return r.setMonth(r.getMonth()+e),r},SUM:(...t)=>t.reduce((e,r)=>e+(Number(r)||0),0),AVG:(...t)=>{const e=t.filter(r=>!isNaN(Number(r)));return e.length>0?e.reduce((r,s)=>r+Number(s),0)/e.length:0},MIN:(...t)=>Math.min(...t.map(e=>Number(e)||0)),MAX:(...t)=>Math.max(...t.map(e=>Number(e)||0)),ROUND:t=>Math.round(Number(t)||0),FLOOR:t=>Math.floor(Number(t)||0),CEIL:t=>Math.ceil(Number(t)||0),ABS:t=>Math.abs(Number(t)||0),IF:(t,e,r)=>t?e:r,IS_NULL:t=>t==null,IS_EMPTY:t=>!t||String(t).trim()==="",IS_NUMBER:t=>!isNaN(Number(t))&&t!==""&&t!==null&&t!==void 0,IS_DATE:t=>{const e=new Date(t);return!isNaN(e.getTime())},AUTO_NUMBER:()=>Math.floor(Math.random()*1e4)+1e3,UUID:()=>"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,t=>{const e=Math.random()*16|0;return(t=="x"?e:e&3|8).toString(16)}),ARRAY_LENGTH:t=>Array.isArray(t)?t.length:0,ARRAY_CONTAINS:(t,e)=>Array.isArray(t)?t.includes(e):!1,ARRAY_JOIN:(t,e=",")=>Array.isArray(t)?t.join(e):""};function x(t,e){var r;switch(t.Type){case"Literal":return t.Value;case"SystemIdentifier":if(t.Property){const f=e.systemValues[t.Name];return Y(f,t.Property.Name)}return e.systemValues[t.Name];case"Identifier":if(t.Property){const f=ne(t,e);return Y(f,t.Property.Name)}return ne(t,e);case"MemberExpression":if(!t.Arguments||t.Arguments.length===0)throw new Error("MemberExpression requires Arguments array");const s=x(t.Arguments[0],e),a=(r=t.Arguments[0].Property)==null?void 0:r.Name;return a?Y(s,a):s;case"BinaryExpression":if(!t.Arguments||t.Arguments.length!==2)throw new Error("BinaryExpression requires exactly 2 arguments");const n=x(t.Arguments[0],e),o=x(t.Arguments[1],e);return _e(t.Operator,n,o);case"LogicalExpression":if(!t.Arguments||t.Arguments.length<2)throw new Error("LogicalExpression requires at least 2 arguments");return qe(t.Operator,t.Arguments,e);case"CallExpression":if(!t.Callee)throw new Error("CallExpression requires Callee");const u=$e[t.Callee];if(!u)throw new Error(`Unknown function: ${t.Callee}`);const p=(t.Arguments||[]).map(f=>x(f,e));return u(...p);case"AssignmentExpression":if(!t.Arguments||t.Arguments.length!==1)throw new Error("AssignmentExpression requires exactly 1 argument");return x(t.Arguments[0],e);default:throw new Error(`Unknown expression type: ${t.Type}`)}}function ne(t,e){const{Name:r,Source:s}=t;if(!r)throw new Error("Identifier requires Name");switch(s){case"Input":default:return e.formValues[r]}}function Y(t,e){if(!(!t||typeof t!="object"))return t[e]}function _e(t,e,r){const s=a=>a==null?0:typeof a=="number"?a:typeof a=="object"&&a!==null&&"value"in a?Number(a.value)||0:Number(a)||0;switch(t){case"==":return e==r;case"!=":return e!=r;case">":return s(e)>s(r);case"<":return s(e)<s(r);case">=":return s(e)>=s(r);case"<=":return s(e)<=s(r);case"+":return s(e)+s(r);case"-":return s(e)-s(r);case"*":return s(e)*s(r);case"/":const a=s(r);return a!==0?s(e)/a:0;default:throw new Error(`Unknown binary operator: ${t}`)}}function qe(t,e,r){switch(t){case"AND":return e.every(s=>!!x(s,r));case"OR":return e.some(s=>!!x(s,r));default:throw new Error(`Unknown logical operator: ${t}`)}}function le(t,e,r={}){const s={formValues:e,systemValues:Ue(),referenceData:r};try{return x(t,s)}catch(a){return console.warn("Expression evaluation failed:",a),!1}}function ie(t,e,r={}){const s=[];for(const a of t)try{le(a.Condition.ExpressionTree,e,r)||s.push({isValid:!1,message:a.Message,fieldName:a.Id})}catch(n){console.warn(`Cross-field validation rule ${a.Id} failed:`,n)}return s}function je(t,e={},r={}){try{return le(t,e,r)}catch(s){return console.warn("Default value calculation failed:",s),null}}function oe(t,e){var u,p,f;const r=((u=t.Expression)==null?void 0:u.toLowerCase())||"",s=((p=t.Name)==null?void 0:p.toLowerCase())||"",a=((f=t.Id)==null?void 0:f.toLowerCase())||"",n=e.toLowerCase();return s.includes("required")||a.includes("required")?!0:[`${n} != null`,`${n} != ''`,`trim(${n}) != ''`,`${n}!=null`,`${n}!=''`].some(R=>r.includes(R))}function Be(t){const e={...t};e.Rules||(e.Rules={Validation:{},Computation:{},BusinessLogic:{}}),e.Rules.Validation||(e.Rules.Validation={}),e.Rules.Computation||(e.Rules.Computation={}),e.Rules.BusinessLogic||(e.Rules.BusinessLogic={});const r={...e.Fields};return Object.entries(r).forEach(([s,a])=>{let n=a.Required||!1;if(a.Validation&&Array.isArray(a.Validation))if(a.Validation.length>0&&typeof a.Validation[0]=="object"){const o=[];a.Validation.forEach(u=>{e.Rules.Validation[u.Id]=u,o.push(u.Id),oe(u,s)&&(n=!0)}),r[s]={...a,Validation:o,Required:n}}else a.Validation.forEach(u=>{var f;const p=(f=e.Rules.Validation)==null?void 0:f[u];p&&oe(p,s)&&(n=!0)}),n&&!a.Required&&(r[s]={...a,Required:!0});if(a.Formula){const o=`RULE_COMPUTE_${s.toUpperCase()}`;e.Rules.Computation[o]={Id:o,Name:a.Formula.Id||`Compute ${s}`,Description:a.Formula.Description||`Computes value for ${s}`,Expression:a.Formula.Expression,ExpressionTree:a.Formula.ExpressionTree,ResultType:a.Type}}}),e.Fields=r,e}function Pe(t){var r,s,a;const e={validation:{},computation:{},businessLogic:{}};return(r=t.Rules)!=null&&r.Validation&&(e.validation={...t.Rules.Validation}),(s=t.Rules)!=null&&s.Computation&&(e.computation={...t.Rules.Computation}),(a=t.Rules)!=null&&a.BusinessLogic&&(e.businessLogic={...t.Rules.BusinessLogic}),e}function ke(t){var s;const e={};if(!((s=t.Rules)!=null&&s.Computation))return e;const r=Object.entries(t.Fields).filter(([a,n])=>n.Computed).map(([a])=>a);return r.sort((a,n)=>n.length-a.length),Object.entries(t.Rules.Computation).forEach(([a,n])=>{const o=a.toUpperCase().replace(/[_-]/g,"");for(const p of r){const f=p.toUpperCase().replace(/[_-]/g,"");if(o.includes(f)){e[a]=p;return}}const u=`${n.Name||""} ${n.Description||""}`.toLowerCase();for(const p of r)if(u.includes(p.toLowerCase())){e[a]=p;return}}),e}function Ye(t,e){const r={};Object.keys(t.Fields).forEach(a=>{r[a]={validation:[],computation:[],businessLogic:[]}}),Object.entries(t.Fields).forEach(([a,n])=>{n.Validation&&Array.isArray(n.Validation)&&n.Validation.forEach(u=>{e.validation[u]?r[a].validation.push(u):e.computation[u]?r[a].computation.push(u):e.businessLogic[u]&&r[a].businessLogic.push(u)}),n.Formula&&Object.entries(e.computation).forEach(([o,u])=>{var p;u.Expression===((p=n.Formula)==null?void 0:p.Expression)&&(r[a].computation.includes(o)||r[a].computation.push(o))})});const s=ke(t);return Object.entries(s).forEach(([a,n])=>{r[n]&&!r[n].computation.includes(a)&&r[n].computation.push(a)}),r}function ze(t,e){const r={},s={editable:!0,readable:!0,hidden:!1};return Object.keys(t.Fields).forEach(a=>{var p,f,R,I,w,i;if(!e||!((p=t.RolePermission)!=null&&p[e])){r[a]=s;return}const n=t.RolePermission[e],o=((f=n.Editable)==null?void 0:f.includes(a))||((R=n.Editable)==null?void 0:R.includes("*"))||!1,u=((I=n.ReadOnly)==null?void 0:I.includes(a))||((w=n.ReadOnly)==null?void 0:w.includes("*"))||o;r[a]={editable:o&&!((i=n.ReadOnly)!=null&&i.includes(a)),readable:u,hidden:!u}}),r}function Ke(t,e){switch(t){case"String":return e.toLowerCase().includes("email")?"email":e.toLowerCase().includes("password")?"password":"text";case"Number":return"number";case"Boolean":return"checkbox";case"Date":return"date";case"DateTime":return"datetime-local";case"Reference":return"reference";case"Array":case"Object":return"textarea";default:return"text"}}function de(t){return t.replace(/([A-Z])/g," $1").replace(/^./,e=>e.toUpperCase()).replace(/_/g," ").trim()}function He(t,e,r){const s={};switch(e.Required&&(s.required={value:!0,message:`${de(t)} is required`}),e.Type){case"Number":s.valueAsNumber=!0;break;case"Date":case"DateTime":s.valueAsDate=!0;break}return e.Validation&&e.Validation.length>0&&(s.validate=()=>!0),s}function Je(t){return t.Values?t.Values.Mode==="Static"&&t.Values.Items?t.Values.Items.map(e=>({value:e.Value,label:e.Label})):t.Values.Mode==="Dynamic"&&t.Values.Reference?[]:[]:[]}function We(t,e={}){if(!t.DefaultValue)switch(t.Type){case"Boolean":return!1;case"Number":return 0;case"String":return"";case"Array":return[];case"Object":return{};default:return}return je(t.DefaultValue.ExpressionTree,e)}function Ge(t,e,r,s={},a,n){const o={editable:!0,readable:!0,hidden:!1},p=n||{validation:[],computation:[],businessLogic:[]},f=e.Computed||!!e.Formula||p.computation.length>0,R=He(t,e);return f&&(R.disabled=!0),{name:t,type:Ke(e.Type,t),label:e.Name||de(t),required:e.Required||!1,computed:f,defaultValue:We(e,s),options:Je(e),validation:R,description:e.Description,_bdoField:e,permission:a||o,rules:p}}function Qe(t,e={},r){let s=t;s=Be(s);const a={},n=[],o=[],u=[],p=[],f=Pe(s),R=Ye(s,f),I=ze(s,r);for(const[w,i]of Object.entries(s.Fields)){if(w.startsWith("_")&&!["_id"].includes(w))continue;const $=I[w];if($.hidden)continue;const C=Ge(w,i,s.Fields,e,$,R[w]||{validation:[],computation:[],businessLogic:[]});a[w]=C,n.push(w),C.computed&&o.push(w),C.required&&u.push(w)}return{fields:a,fieldOrder:n,computedFields:o,requiredFields:u,crossFieldValidation:p,rules:f,fieldRules:R,rolePermissions:s.RolePermission}}function Xe(t){var r;if(t.type!=="reference"||!((r=t._bdoField.Values)!=null&&r.Reference))return null;const e=t._bdoField.Values.Reference;return{businessObject:e.BusinessObject,fields:e.Fields||["_id"],filters:e.Filters,sort:e.Sort}}function Ze(t){const e={};for(const[r,s]of Object.entries(t.fields))if(s.type==="reference"){const a=Xe(s);a&&(e[r]=a)}return e}async function et(t){try{const r=(await Le.getBdoSchema(t)).BOBlob;if(!r||typeof r!="object"||!r.Fields)throw new Error(`Invalid BDO schema response for ${t}`);return r}catch(e){throw console.error(`Schema fetch error for ${t}:`,e),new Error(`Failed to load form schema: ${e instanceof Error?e.message:"Unknown error"}`)}}async function tt(t,e=3){let r;for(let s=1;s<=e;s++)try{return await et(t)}catch(a){if(r=a,s<e){const n=Math.min(1e3*Math.pow(2,s-1),5e3);await new Promise(o=>setTimeout(o,n));continue}}throw r}async function rt(t,e){try{return await M.api(t).get(e)}catch(r){throw console.error(`Record fetch error for ${t}/${e}:`,r),new Error(`Failed to load record: ${r instanceof Error?r.message:"Unknown error"}`)}}async function st(t,e,r,s){try{let a;if(e==="create")return a=await M.api(t).create(r),{success:!0,data:a,recordId:a._id||s};if(e==="update"){if(!s)throw new Error("Record ID is required for update operations");return a=await M.api(t).update(s,r),{success:!0,data:a,recordId:a._id||s}}else throw new Error(`Unsupported operation: ${e}`)}catch(a){return console.error("Form submission error:",a),{success:!1,error:new Error(`Failed to ${e} record: ${a instanceof Error?a.message:"Unknown error"}`)}}}async function at(t,e=["_id"],r,s){try{const a={};return r&&(a.Filter=r),s&&(a.Sort=s),e.length>0&&(a.Field=e),(await M.api(t).list(a)).Data||[]}catch(a){return console.error(`Reference data fetch error for ${t}:`,a),[]}}async function nt(t){const e={},r=Object.entries(t).map(async([a,n])=>{try{const o=await at(n.businessObject,n.fields,n.filters,n.sort);return[a,o]}catch(o){return console.warn(`Failed to fetch reference data for ${a}:`,o),[a,[]]}});return(await Promise.allSettled(r)).forEach(a=>{if(a.status==="fulfilled"){const[n,o]=a.value;e[n]=Array.isArray(o)?o:[]}}),e}function it(t,e,r="create",s){const a={};return Object.keys(t).forEach(n=>{const o=n,u=t[o];if(!e.includes(n)&&u!==void 0){if(r==="create"){a[o]=u;return}if(r==="update"){if(!s){a[o]=u;return}const p=s[o];JSON.stringify(u)!==JSON.stringify(p)&&(a[o]=u)}}}),a}function ot(t){var e,r,s,a;return typeof t=="string"?t:t!=null&&t.message?t.message:(r=(e=t==null?void 0:t.response)==null?void 0:e.data)!=null&&r.message?t.response.data.message:(a=(s=t==null?void 0:t.response)==null?void 0:s.data)!=null&&a.error?t.response.data.error:"An unexpected error occurred"}function ut(t){var e,r;return!navigator.onLine||(t==null?void 0:t.code)==="NETWORK_ERROR"||((e=t==null?void 0:t.message)==null?void 0:e.toLowerCase().includes("network"))||((r=t==null?void 0:t.message)==null?void 0:r.toLowerCase().includes("fetch"))}function ct(t){var e,r,s;return(t==null?void 0:t.status)===400||((e=t==null?void 0:t.response)==null?void 0:e.status)===400||((r=t==null?void 0:t.message)==null?void 0:r.toLowerCase().includes("validation"))||((s=t==null?void 0:t.message)==null?void 0:s.toLowerCase().includes("invalid"))}const U=new Map;function lt(t,e,r=10){U.set(t,{data:e,timestamp:Date.now(),ttl:r*60*1e3})}function dt(t){const e=U.get(t);return e?Date.now()-e.timestamp>e.ttl?(U.delete(t),null):e.data:null}function ft(t){t?Array.from(U.keys()).filter(r=>r.startsWith(t)).forEach(r=>U.delete(r)):U.clear()}async function mt(t){const e=`schema:${t}`,r=dt(e);if(r)return r;const s=await tt(t);return lt(e,s,30),s}class ue{constructor(e=1e3){L(this,"cache",new Map);L(this,"maxSize");this.maxSize=e}get(e){const r=this.cache.get(e);return r!==void 0&&(this.cache.delete(e),this.cache.set(e,r)),r}set(e,r){if(this.cache.has(e))this.cache.delete(e);else if(this.cache.size>=this.maxSize){const s=this.cache.keys().next().value;this.cache.delete(s)}this.cache.set(e,r)}clear(){this.cache.clear()}}function pt(t){const e=new Set;function r(s){switch(s.Type){case"Identifier":s.Name&&!s.Name.startsWith("$")&&e.add(s.Name);break;case"MemberExpression":s.Arguments&&s.Arguments.forEach(r);break;case"CallExpression":case"BinaryExpression":case"LogicalExpression":s.Arguments&&s.Arguments.forEach(r);break}}return r(t),e}class ht{constructor(){L(this,"resultCache",new ue(500));L(this,"dependencyCache",new ue(200));L(this,"compiledExpressions",new Map)}createCacheKey(e,r){const s=JSON.stringify(e),a=JSON.stringify(r);return`${s}:${a}`}getDependencies(e){const r=JSON.stringify(e);let s=this.dependencyCache.get(r);return s||(s=pt(e),this.dependencyCache.set(r,s)),s}getCachedResult(e,r,s){if(!s)return;const a=this.getDependencies(e);for(const o of a)if(r[o]!==s[o])return;const n=this.createCacheKey(e,r);return this.resultCache.get(n)}evaluate(e,r,s){const a=this.getCachedResult(e,r,s);if(a!==void 0)return a;const n=this.evaluateNode(e,r),o=this.createCacheKey(e,r);return this.resultCache.set(o,n),n}evaluateNode(e,r){switch(e.Type){case"Literal":return e.Value;case"Identifier":return this.getIdentifierValue(e,r);case"BinaryExpression":return this.evaluateBinaryExpression(e,r);case"LogicalExpression":return this.evaluateLogicalExpression(e,r);case"CallExpression":return this.evaluateCallExpression(e,r);case"MemberExpression":return this.evaluateMemberExpression(e,r);default:throw new Error(`Unsupported expression type: ${e.Type}`)}}getIdentifierValue(e,r){if(e.Name){if(e.Name==="NOW")return new Date;if(e.Name==="TODAY"){const s=new Date;return new Date(s.getFullYear(),s.getMonth(),s.getDate())}return e.Name==="CURRENT_USER_ID"?1:e.Name==="CURRENT_USER"?{EmpId:1,Email:"user@example.com",FirstName:"John",LastName:"Doe",Role:"User"}:r[e.Name]}}evaluateBinaryExpression(e,r){if(!e.Arguments||e.Arguments.length!==2)throw new Error("Binary expression requires exactly 2 arguments");const s=this.evaluateNode(e.Arguments[0],r),a=this.evaluateNode(e.Arguments[1],r);switch(e.Operator){case"==":return s==a;case"!=":return s!=a;case"===":return s===a;case"!==":return s!==a;case"<":return Number(s)<Number(a);case"<=":return Number(s)<=Number(a);case">":return Number(s)>Number(a);case">=":return Number(s)>=Number(a);case"+":return Number(s)+Number(a);case"-":return Number(s)-Number(a);case"*":return Number(s)*Number(a);case"/":return Number(s)/Number(a);case"%":return Number(s)%Number(a);default:throw new Error(`Unsupported binary operator: ${e.Operator}`)}}evaluateLogicalExpression(e,r){if(!e.Arguments||e.Arguments.length<2)throw new Error("Logical expression requires at least 2 arguments");switch(e.Operator){case"AND":for(const s of e.Arguments)if(!this.evaluateNode(s,r))return!1;return!0;case"OR":for(const s of e.Arguments)if(this.evaluateNode(s,r))return!0;return!1;default:throw new Error(`Unsupported logical operator: ${e.Operator}`)}}evaluateCallExpression(e,r){var a;if(!e.Callee)throw new Error("Call expression requires a function name");const s=((a=e.Arguments)==null?void 0:a.map(n=>this.evaluateNode(n,r)))||[];switch(e.Callee){case"CONCAT":return s.map(f=>String(f||"")).join("");case"TRIM":return String(s[0]||"").trim();case"LENGTH":return String(s[0]||"").length;case"UPPER":return String(s[0]||"").toUpperCase();case"LOWER":return String(s[0]||"").toLowerCase();case"CONTAINS":return String(s[0]||"").includes(String(s[1]||""));case"MATCHES":return new RegExp(String(s[1])).test(String(s[0]||""));case"SUM":return s.reduce((f,R)=>f+(Number(R)||0),0);case"AVG":const n=s.filter(f=>!isNaN(Number(f)));return n.length>0?n.reduce((f,R)=>f+Number(R),0)/n.length:0;case"MIN":return Math.min(...s.map(f=>Number(f)||0));case"MAX":return Math.max(...s.map(f=>Number(f)||0));case"ROUND":return Math.round(Number(s[0])||0);case"FLOOR":return Math.floor(Number(s[0])||0);case"CEIL":return Math.ceil(Number(s[0])||0);case"ABS":return Math.abs(Number(s[0])||0);case"YEAR":return new Date(s[0]).getFullYear();case"MONTH":return new Date(s[0]).getMonth()+1;case"DAY":return new Date(s[0]).getDate();case"DATE_DIFF":const o=new Date(s[0]),u=new Date(s[1]),p=Math.abs(o.getTime()-u.getTime());return Math.ceil(p/(1e3*60*60*24));case"IF":return s[0]?s[1]:s[2];case"AUTO_NUMBER":return Math.floor(Math.random()*1e4);default:throw new Error(`Unknown function: ${e.Callee}`)}}evaluateMemberExpression(e,r){var n;if(!e.Arguments||e.Arguments.length===0)throw new Error("Member expression requires arguments");const s=this.evaluateNode(e.Arguments[0],r),a=(n=e.Arguments[0].Property)==null?void 0:n.Name;return a&&s&&typeof s=="object"?s[a]:s}clearCache(){this.resultCache.clear(),this.dependencyCache.clear(),this.compiledExpressions.clear()}}const fe=new ht;function gt(t,e,r,s,a){if(!r||r.length===0)return{isValid:!0};const n={...s,[t]:e};for(const o of r)try{if(!fe.evaluate(o.ExpressionTree,n,a))return{isValid:!1,message:o.Message||`Validation failed for ${o.Name}`,fieldName:t}}catch(u){console.warn(`Validation rule ${o.Id} failed to evaluate:`,u)}return{isValid:!0}}function ce(t){return Array.from(fe.getDependencies(t))}function bt(t){const{source:e,operation:r,recordId:s,defaultValues:a={},mode:n="onBlur",enabled:o=!0,userRole:u,onSchemaError:p,skipSchemaFetch:f=!1,schema:R,interactionMode:I="interactive"}=t,w=I==="interactive",[i,$]=h.useState(null),[C,me]=h.useState({}),[z,K]=h.useState(!1),[pe]=h.useState({}),[V,H]=h.useState(null),[J,W]=h.useState(!1),[he,G]=h.useState(null),_=h.useRef(!1),P=h.useRef(null),q=h.useRef(null),v=h.useRef(p);h.useEffect(()=>{v.current=p},[p]);const{data:j,isLoading:ge,error:B,refetch:Q}=ae.useQuery({queryKey:["form-schema",e],queryFn:()=>f?Promise.resolve(R||{}):mt(e),enabled:o&&(!f||!!R),retry:3,staleTime:30*60*1e3,gcTime:60*60*1e3,throwOnError:!1}),{data:D,isLoading:X,error:be}=ae.useQuery({queryKey:["form-record",e,s],queryFn:()=>rt(e,s),enabled:o&&r==="update"&&!!s,retry:3,staleTime:5*60*1e3,gcTime:15*60*1e3,throwOnError:!1}),we=h.useMemo(()=>{const c={...a};if(r==="update"&&D&&Object.assign(c,D),i)for(const[d,l]of Object.entries(i.fields))l.defaultValue!==void 0&&!(d in c)&&(c[d]=l.defaultValue);return c},[a,D,r,i]),m=Ie.useForm({mode:n,defaultValues:a,values:r==="update"&&D?we:void 0});h.useEffect(()=>{var c;if(j)try{const d=Qe(j,{},u);$(d);const l=Ze(d);Object.keys(l).length>0&&nt(l).then(me).catch(console.warn)}catch(d){console.error("Schema processing failed:",d),(c=v.current)==null||c.call(v,d)}},[j,u]),h.useEffect(()=>{var c;B&&((c=v.current)==null||c.call(v,B))},[B]),h.useEffect(()=>{if(!w||r!=="create"||!i||!o||V)return;(async()=>{W(!0),G(null);try{const l=await M.api(e).draftInteraction({});H(l._id),l&&typeof l=="object"&&Object.entries(l).forEach(([g,b])=>{if(g==="_id")return;m.getValues(g)!==b&&m.setValue(g,b,{shouldDirty:!1,shouldValidate:!1})})}catch(d){console.error("Failed to create initial draft:",d),G(d)}finally{W(!1)}})()},[w,r,i,o,V,e,m]);const k=h.useMemo(()=>{if(!i)return[];const c=new Set,d=new Set(i.computedFields);return Object.entries(i.fieldRules).forEach(([l,g])=>{g.computation.forEach(b=>{const E=i.rules.computation[b];E!=null&&E.ExpressionTree&&ce(E.ExpressionTree).forEach(y=>{i.fields[y]&&y!==l&&!d.has(y)&&c.add(y)})})}),i.computedFields.forEach(l=>{const g=i.fields[l];g._bdoField.Formula&&ce(g._bdoField.Formula.ExpressionTree).forEach(E=>{i.fields[E]&&E!==l&&!d.has(E)&&c.add(E)})}),Array.from(c)},[i]),Z=h.useCallback(async c=>{if(!(!i||!(w||k.length>0&&k.includes(c)))){if(w&&r==="create"&&!V){console.warn("Interactive create mode: waiting for draft ID");return}_.current||(P.current&&clearTimeout(P.current),P.current=setTimeout(()=>{if(!i||_.current)return;const l=m.getValues();(async()=>{_.current=!0;try{const b=M.api(e),E={};r==="update"&&s&&"_id"in l&&(E._id=l._id),w&&r==="create"&&V&&(E._id=V);const S=q.current??(r==="update"?D:null)??{},y=new Set(i.computedFields||[]);Object.keys(l).forEach(F=>{if(F==="_id"||y.has(F))return;const A=l[F],se=S[F];JSON.stringify(A)!==JSON.stringify(se)&&(A!==""&&A!==null&&A!==void 0)&&(E[F]=A)});const N=E,O={...q.current};Object.keys(l).forEach(F=>{y.has(F)||(O[F]=l[F])}),q.current=O;let T;r==="update"&&s?T=await b.draftPatch(s,N):w&&V?T=await b.draftInteraction(N):T=await b.draft(N),T&&typeof T=="object"&&(Object.entries(T).forEach(([F,A])=>{l[F]!==A&&m.setValue(F,A,{shouldDirty:!1,shouldValidate:!1})}),Object.entries(T).forEach(([F,A])=>{y.has(F)&&(q.current[F]=A)}))}catch(b){console.warn("Failed to compute fields via API:",b)}finally{_.current=!1}})()},300))}},[i,r,s,D,e,m,k,w,V]),Ee=h.useCallback(async()=>{if(!i)return!1;const c=m.getValues();if(!await m.trigger())return!1;const l=i.crossFieldValidation.map(b=>({Id:b.Id,Condition:{ExpressionTree:b.ExpressionTree},Message:b.Message||`Validation failed for ${b.Name}`})),g=ie(l,c,C);return g.length>0?(g.forEach((b,E)=>{m.setError(`root.crossField${E}`,{type:"validate",message:b.message})}),!1):!0},[i,m.getValues,m.trigger,m.setError,C]),ye=h.useCallback((c,d)=>m.handleSubmit(async(l,g)=>{if(!i){const b=new Error("Schema not loaded");d==null||d(b,g);return}K(!0);try{const b=i.crossFieldValidation.map(N=>({Id:N.Id,Condition:{ExpressionTree:N.ExpressionTree},Message:N.Message||`Validation failed for ${N.Name}`})),E=ie(b,l,C);if(E.length>0){E.forEach((N,O)=>{m.setError(`root.crossField${O}`,{type:"validate",message:N.message})}),d==null||d(m.formState.errors,g);return}const S=it(l,i.computedFields,r,D);let y;if(w){const N=M.api(e);if(r==="create"){if(!V)throw new Error("Interactive create mode requires a draft ID. Draft creation may have failed.");y={success:!0,data:await N.draft({...S,_id:V})}}else y={success:!0,data:await N.draftUpdate(s,S)}}else if(y=await st(e,r,S,s),!y.success)throw y.error||new Error("Submission failed");r==="create"&&(m.reset(),w&&H(null)),await(c==null?void 0:c(y.data||l,g))}catch(b){d==null||d(b,g)}finally{K(!1)}},(l,g)=>{d==null||d(l,g)}),[m,i,C,e,r,s,D,w,V]),Ne=h.useCallback(c=>(i==null?void 0:i.fields[c])||null,[i]),Re=h.useCallback(()=>{if(!i)return{};const c={};return Object.entries(i.fields).forEach(([d,l])=>{c[d]=l}),c},[i]),Fe=h.useCallback(c=>!!(i!=null&&i.fields[c]),[i]),Se=h.useCallback(c=>(i==null?void 0:i.requiredFields.includes(c))||!1,[i]),Ve=h.useCallback(c=>(i==null?void 0:i.computedFields.includes(c))||!1,[i]),Ae=h.useCallback(async()=>{await Q()},[Q]),Ce=h.useCallback(()=>{m.clearErrors()},[m]),ee=ge||r==="update"&&X||w&&r==="create"&&J,Oe=ee||z,te=B||be||he,De=!!te,xe=h.useMemo(()=>(i==null?void 0:i.computedFields)||[],[i]),ve=h.useMemo(()=>(i==null?void 0:i.requiredFields)||[],[i]),re=h.useMemo(()=>{if(!i)return{};const c={};return Object.entries(i.fields).forEach(([d,l])=>{const g={};switch(l.required&&(g.required=`${l.label} is required`),l.permission.editable||(g.disabled=!0),l.type){case"number":g.valueAsNumber=!0;break;case"date":case"datetime-local":g.valueAsDate=!0;break}const b=l.rules.validation;b.length>0&&(g.validate={expressionValidation:E=>{const S=m.getValues();for(const y of b){const N=i.rules.validation[y];if(N){const O=gt(d,E,[N],S,pe);if(!O.isValid)return O.message||N.Message||"Invalid value"}}return!0}}),c[d]=g}),c},[i,m,C]);return{register:h.useCallback((c,d)=>{const l=re[c],g=d==null?void 0:d.onBlur,b=async E=>{g&&await g(E);let S=!0;n==="onBlur"||n==="onTouched"||n==="all"?S=await m.trigger(c):S=!m.getFieldState(c,m.formState).error,S&&await Z(c)};return m.register(c,{...l,...d,onBlur:b})},[m,re,Z,n]),handleSubmit:ye,watch:m.watch,setValue:m.setValue,reset:m.reset,errors:m.formState.errors,isValid:m.formState.isValid,isDirty:m.formState.isDirty,isSubmitting:m.formState.isSubmitting||z,isSubmitSuccessful:m.formState.isSubmitSuccessful,isLoadingInitialData:ee,isLoadingRecord:X,isLoading:Oe,draftId:V,isCreatingDraft:J,loadError:te,hasError:De,schema:j,schemaConfig:i,computedFields:xe,requiredFields:ve,getField:Ne,getFields:Re,hasField:Fe,isFieldRequired:Se,isFieldComputed:Ve,refreshSchema:Ae,validateForm:Ee,clearErrors:Ce}}exports.clearFormCache=ft;exports.isNetworkError=ut;exports.isValidationError=ct;exports.parseApiError=ot;exports.useForm=bt;
|
package/dist/form.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../sdk/form.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAG7D,OAAO,EACL,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,UAAU,IAAI,cAAc,GAC7B,MAAM,sCAAsC,CAAC"}
|