master-data-management-react 0.1.3 → 0.1.5
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 +14 -0
- package/dist/App.d.ts +5 -0
- package/dist/App.d.ts.map +1 -0
- package/dist/components/ServerSideGrid/ServerSideGrid.d.ts.map +1 -1
- package/dist/hooks/useApiService.d.ts +2 -0
- package/dist/hooks/useApiService.d.ts.map +1 -1
- package/dist/index.cjs +6 -6
- package/dist/index.js +354 -350
- package/dist/main.d.ts +2 -0
- package/dist/main.d.ts.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -42,10 +42,16 @@ ag-grid-react ag-grid-community
|
|
|
42
42
|
|
|
43
43
|
## 🚀 Quick Start
|
|
44
44
|
|
|
45
|
+
**⚠️ IMPORTANT:** Configure your axios instance with a `baseURL` to ensure dropdown options and all API calls go to your backend API, not your frontend. See [CLIENT_AXIOS_SETUP.md](./CLIENT_AXIOS_SETUP.md) for detailed setup.
|
|
46
|
+
|
|
45
47
|
```tsx
|
|
46
48
|
import { MasterView } from "master-data-management-react";
|
|
47
49
|
import axios from "axios";
|
|
48
50
|
|
|
51
|
+
// ✅ CRITICAL: Configure axios with baseURL
|
|
52
|
+
const apiClient = axios.create({
|
|
53
|
+
baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:3000',
|
|
54
|
+
});
|
|
49
55
|
const apiClient = axios.create({
|
|
50
56
|
baseURL: "https://api.example.com",
|
|
51
57
|
});
|
|
@@ -69,6 +75,14 @@ export default function App() {
|
|
|
69
75
|
}
|
|
70
76
|
```
|
|
71
77
|
|
|
78
|
+
**⚠️ Important:** Your `apiClient` **must** have a `baseURL` configured. Without it, API calls will try to fetch from the frontend itself instead of your backend.
|
|
79
|
+
|
|
80
|
+
> 📖 **Need help with axios setup?** See [AXIOS_SETUP_GUIDE.md](./AXIOS_SETUP_GUIDE.md) for detailed instructions, including:
|
|
81
|
+
> - Configuring axios with interceptors (JWT auth)
|
|
82
|
+
> - Environment variables setup
|
|
83
|
+
> - Monorepo considerations
|
|
84
|
+
> - Troubleshooting common issues
|
|
85
|
+
|
|
72
86
|
---
|
|
73
87
|
|
|
74
88
|
## 📝 Forms (Create / View / Edit)
|
package/dist/App.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"AAEA,OAAO,sCAAsC,CAAC;AAC9C,OAAO,8CAA8C,CAAC;AAmBtD,iBAAS,GAAG,4CA+CX;AAED,eAAe,GAAG,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServerSideGrid.d.ts","sourceRoot":"","sources":["../../../src/components/ServerSideGrid/ServerSideGrid.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAItD,OAAO,sCAAsC,CAAC;AAC9C,OAAO,8CAA8C,CAAC;AAMtD,OAAO,KAAK,EAAE,MAAM,EAAoB,MAAM,mBAAmB,CAAC;AAGlE,OAAO,EAOH,aAAa,EAChB,MAAM,gCAAgC,CAAC;AAKxC,UAAU,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,gBAAgB,CAAC,CAAC,CAAC;IACvE,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,OAAO,CAAC,EAAE,KAAK,CAAC,QAAQ,CACpB,KAAK,CAAC,cAAc,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,aAAa,CAAC,MAAM,OAAO,aAAa,CAAC,CAAA;KAAE,EAAE,CAAC,CACpG,CAAC;IACF,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,aAAa,CAAC,MAAM,OAAO,aAAa,CAAC,CAAA;KAAE,EAAE,CAAC;IACxF,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,MAAM,CAAC;IACvC,SAAS,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAC;IACpC,mBAAmB,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,QAAA,MAAM,cAAc,GAAI,CAAC,SAAS,MAAM,EAAE,mOAmBvC,mBAAmB,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"ServerSideGrid.d.ts","sourceRoot":"","sources":["../../../src/components/ServerSideGrid/ServerSideGrid.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAItD,OAAO,sCAAsC,CAAC;AAC9C,OAAO,8CAA8C,CAAC;AAMtD,OAAO,KAAK,EAAE,MAAM,EAAoB,MAAM,mBAAmB,CAAC;AAGlE,OAAO,EAOH,aAAa,EAChB,MAAM,gCAAgC,CAAC;AAKxC,UAAU,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAE,SAAQ,gBAAgB,CAAC,CAAC,CAAC;IACvE,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,OAAO,CAAC,EAAE,KAAK,CAAC,QAAQ,CACpB,KAAK,CAAC,cAAc,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,aAAa,CAAC,MAAM,OAAO,aAAa,CAAC,CAAA;KAAE,EAAE,CAAC,CACpG,CAAC;IACF,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,aAAa,CAAC,MAAM,OAAO,aAAa,CAAC,CAAA;KAAE,EAAE,CAAC;IACxF,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,MAAM,CAAC;IACvC,SAAS,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAC;IACpC,mBAAmB,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,QAAA,MAAM,cAAc,GAAI,CAAC,SAAS,MAAM,EAAE,mOAmBvC,mBAAmB,CAAC,CAAC,CAAC,4CAmGxB,CAAC;AAEF,eAAe,cAAc,CAAC"}
|
|
@@ -10,6 +10,7 @@ export interface ApiEndpoints {
|
|
|
10
10
|
recordById: (entity: string, id: string | number) => string;
|
|
11
11
|
exportCSV: (entity: string) => string;
|
|
12
12
|
exportExcel: (entity: string) => string;
|
|
13
|
+
dropdownOptions?: (url: string) => string;
|
|
13
14
|
}
|
|
14
15
|
export interface ApiService {
|
|
15
16
|
getEntities: () => Promise<any>;
|
|
@@ -21,6 +22,7 @@ export interface ApiService {
|
|
|
21
22
|
deleteRecord: (entity: string, id: string | number) => Promise<any>;
|
|
22
23
|
exportCSV: (entity: string, params?: any) => Promise<any>;
|
|
23
24
|
exportExcel: (entity: string, params?: any) => Promise<any>;
|
|
25
|
+
getDropdownOptions: (url: string) => Promise<any>;
|
|
24
26
|
}
|
|
25
27
|
export declare const createApiService: (apiClient: AxiosInstance, endpoints: ApiEndpoints) => ApiService;
|
|
26
28
|
//# sourceMappingURL=useApiService.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useApiService.d.ts","sourceRoot":"","sources":["../../src/hooks/useApiService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IACrC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,KAAK,MAAM,CAAC;IAC5D,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IACtC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"useApiService.d.ts","sourceRoot":"","sources":["../../src/hooks/useApiService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IACrC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,KAAK,MAAM,CAAC;IAC5D,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IACtC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CAC3C;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9C,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3D,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACjE,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1D,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/E,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IACpE,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1D,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5D,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CACnD;AAED,eAAO,MAAM,gBAAgB,GAC3B,WAAW,aAAa,EACxB,WAAW,YAAY,KACtB,UA6EF,CAAC"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
2
|
-
`+I+e}}var y=!1,L;{var Z=typeof WeakMap=="function"?WeakMap:Map;L=new Z}function
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const f=require("react"),a=require("@mui/material"),Vt=require("ag-grid-react"),ye=require("ag-grid-community"),ke=(n,E)=>({getEntities:async()=>{const u=await n.get(E.entities);return{data:u.data.data??u.data}},getMetadata:async u=>{const T=await n.get(E.metadata(u));return{data:T.data.data??T.data}},getRecords:async(u,T)=>{const i=await n.get(E.records(u),{params:T});return{data:i.data.data??i.data,total:i.data.total??i.data.count??0}},getRecord:async(u,T)=>{const i=await n.get(E.recordById(u,T));return{data:i.data.data??i.data}},createRecord:async(u,T)=>{const i=await n.post(E.records(u),T);return{data:i.data.data??i.data}},updateRecord:async(u,T,i)=>{const B=await n.put(E.recordById(u,T),i);return{data:B.data.data??B.data}},deleteRecord:async(u,T)=>{const i=await n.delete(E.recordById(u,T));return{data:i.data.data??i.data}},exportCSV:async(u,T)=>await n.get(E.exportCSV(u),{params:T,responseType:"blob"}),exportExcel:async(u,T)=>await n.get(E.exportExcel(u),{params:T,responseType:"blob"}),getDropdownOptions:async u=>{const T=E.dropdownOptions?E.dropdownOptions(u):u,i=await n.get(T);return{data:i.data.data??i.data}}});var he={exports:{}},Ae={};var nt;function $t(){if(nt)return Ae;nt=1;var n=f,E=Symbol.for("react.element"),u=Symbol.for("react.fragment"),T=Object.prototype.hasOwnProperty,i=n.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,B={key:!0,ref:!0,__self:!0,__source:!0};function X(p,g,Y){var O,D={},x=null,$=null;Y!==void 0&&(x=""+Y),g.key!==void 0&&(x=""+g.key),g.ref!==void 0&&($=g.ref);for(O in g)T.call(g,O)&&!B.hasOwnProperty(O)&&(D[O]=g[O]);if(p&&p.defaultProps)for(O in g=p.defaultProps,g)D[O]===void 0&&(D[O]=g[O]);return{$$typeof:E,type:p,key:x,ref:$,props:D,_owner:i.current}}return Ae.Fragment=u,Ae.jsx=X,Ae.jsxs=X,Ae}var me={};var ot;function Wt(){return ot||(ot=1,process.env.NODE_ENV!=="production"&&(function(){var n=f,E=Symbol.for("react.element"),u=Symbol.for("react.portal"),T=Symbol.for("react.fragment"),i=Symbol.for("react.strict_mode"),B=Symbol.for("react.profiler"),X=Symbol.for("react.provider"),p=Symbol.for("react.context"),g=Symbol.for("react.forward_ref"),Y=Symbol.for("react.suspense"),O=Symbol.for("react.suspense_list"),D=Symbol.for("react.memo"),x=Symbol.for("react.lazy"),$=Symbol.for("react.offscreen"),ee=Symbol.iterator,ie="@@iterator";function q(e){if(e===null||typeof e!="object")return null;var t=ee&&e[ee]||e[ie];return typeof t=="function"?t:null}var k=n.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function N(e){{for(var t=arguments.length,o=new Array(t>1?t-1:0),c=1;c<t;c++)o[c-1]=arguments[c];M("error",e,o)}}function M(e,t,o){{var c=k.ReactDebugCurrentFrame,h=c.getStackAddendum();h!==""&&(t+="%s",o=o.concat([h]));var C=o.map(function(m){return String(m)});C.unshift("Warning: "+t),Function.prototype.apply.call(console[e],console,C)}}var te=!1,j=!1,G=!1,le=!1,K=!1,se;se=Symbol.for("react.module.reference");function A(e){return!!(typeof e=="string"||typeof e=="function"||e===T||e===B||K||e===i||e===Y||e===O||le||e===$||te||j||G||typeof e=="object"&&e!==null&&(e.$$typeof===x||e.$$typeof===D||e.$$typeof===X||e.$$typeof===p||e.$$typeof===g||e.$$typeof===se||e.getModuleId!==void 0))}function S(e,t,o){var c=e.displayName;if(c)return c;var h=t.displayName||t.name||"";return h!==""?o+"("+h+")":o}function l(e){return e.displayName||"Context"}function _(e){if(e==null)return null;if(typeof e.tag=="number"&&N("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case T:return"Fragment";case u:return"Portal";case B:return"Profiler";case i:return"StrictMode";case Y:return"Suspense";case O:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case p:var t=e;return l(t)+".Consumer";case X:var o=e;return l(o._context)+".Provider";case g:return S(e,e.render,"ForwardRef");case D:var c=e.displayName||null;return c!==null?c:_(e.type)||"Memo";case x:{var h=e,C=h._payload,m=h._init;try{return _(m(C))}catch{return null}}}return null}var F=Object.assign,v=0,J,U,Q,ce,de,re,Se;function _e(){}_e.__reactDisabledLog=!0;function Ne(){{if(v===0){J=console.log,U=console.info,Q=console.warn,ce=console.error,de=console.group,re=console.groupCollapsed,Se=console.groupEnd;var e={configurable:!0,enumerable:!0,value:_e,writable:!0};Object.defineProperties(console,{info:e,log:e,warn:e,error:e,group:e,groupCollapsed:e,groupEnd:e})}v++}}function s(){{if(v--,v===0){var e={configurable:!0,enumerable:!0,writable:!0};Object.defineProperties(console,{log:F({},e,{value:J}),info:F({},e,{value:U}),warn:F({},e,{value:Q}),error:F({},e,{value:ce}),group:F({},e,{value:de}),groupCollapsed:F({},e,{value:re}),groupEnd:F({},e,{value:Se})})}v<0&&N("disabledDepth fell below zero. This is a bug in React. Please file an issue.")}}var d=k.ReactCurrentDispatcher,I;function b(e,t,o){{if(I===void 0)try{throw Error()}catch(h){var c=h.stack.trim().match(/\n( *(at )?)/);I=c&&c[1]||""}return`
|
|
2
|
+
`+I+e}}var y=!1,L;{var Z=typeof WeakMap=="function"?WeakMap:Map;L=new Z}function pe(e,t){if(!e||y)return"";{var o=L.get(e);if(o!==void 0)return o}var c;y=!0;var h=Error.prepareStackTrace;Error.prepareStackTrace=void 0;var C;C=d.current,d.current=null,Ne();try{if(t){var m=function(){throw Error()};if(Object.defineProperty(m.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(m,[])}catch(W){c=W}Reflect.construct(e,[],m)}else{try{m.call()}catch(W){c=W}e.call(m.prototype)}}else{try{throw Error()}catch(W){c=W}e()}}catch(W){if(W&&c&&typeof W.stack=="string"){for(var R=W.stack.split(`
|
|
3
3
|
`),V=c.stack.split(`
|
|
4
|
-
`),P=
|
|
5
|
-
`+
|
|
4
|
+
`),P=R.length-1,w=V.length-1;P>=1&&w>=0&&R[P]!==V[w];)w--;for(;P>=1&&w>=0;P--,w--)if(R[P]!==V[w]){if(P!==1||w!==1)do if(P--,w--,w<0||R[P]!==V[w]){var z=`
|
|
5
|
+
`+R[P].replace(" at new "," at ");return e.displayName&&z.includes("<anonymous>")&&(z=z.replace("<anonymous>",e.displayName)),typeof e=="function"&&L.set(e,z),z}while(P>=1&&w>=0);break}}}finally{y=!1,d.current=C,s(),Error.prepareStackTrace=h}var fe=e?e.displayName||e.name:"",ue=fe?b(fe):"";return typeof e=="function"&&L.set(e,ue),ue}function At(e,t,o){return pe(e,!1)}function mt(e){var t=e.prototype;return!!(t&&t.isReactComponent)}function Oe(e,t,o){if(e==null)return"";if(typeof e=="function")return pe(e,mt(e));if(typeof e=="string")return b(e);switch(e){case Y:return b("Suspense");case O:return b("SuspenseList")}if(typeof e=="object")switch(e.$$typeof){case g:return At(e.render);case D:return Oe(e.type,t,o);case x:{var c=e,h=c._payload,C=c._init;try{return Oe(C(h),t,o)}catch{}}}return""}var Re=Object.prototype.hasOwnProperty,$e={},We=k.ReactDebugCurrentFrame;function ve(e){if(e){var t=e._owner,o=Oe(e.type,e._source,t?t.type:null);We.setExtraStackFrame(o)}else We.setExtraStackFrame(null)}function gt(e,t,o,c,h){{var C=Function.call.bind(Re);for(var m in e)if(C(e,m)){var R=void 0;try{if(typeof e[m]!="function"){var V=Error((c||"React class")+": "+o+" type `"+m+"` is invalid; it must be a function, usually from the `prop-types` package, but received `"+typeof e[m]+"`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.");throw V.name="Invariant Violation",V}R=e[m](t,m,c,o,null,"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED")}catch(P){R=P}R&&!(R instanceof Error)&&(ve(h),N("%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).",c||"React class",o,m,typeof R),ve(null)),R instanceof Error&&!(R.message in $e)&&($e[R.message]=!0,ve(h),N("Failed %s type: %s",o,R.message),ve(null))}}}var It=Array.isArray;function be(e){return It(e)}function Ot(e){{var t=typeof Symbol=="function"&&Symbol.toStringTag,o=t&&e[Symbol.toStringTag]||e.constructor.name||"Object";return o}}function vt(e){try{return He(e),!1}catch{return!0}}function He(e){return""+e}function Xe(e){if(vt(e))return N("The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.",Ot(e)),He(e)}var ze=k.ReactCurrentOwner,ht={key:!0,ref:!0,__self:!0,__source:!0},qe,Ke;function yt(e){if(Re.call(e,"ref")){var t=Object.getOwnPropertyDescriptor(e,"ref").get;if(t&&t.isReactWarning)return!1}return e.ref!==void 0}function Dt(e){if(Re.call(e,"key")){var t=Object.getOwnPropertyDescriptor(e,"key").get;if(t&&t.isReactWarning)return!1}return e.key!==void 0}function Ct(e,t){typeof e.ref=="string"&&ze.current}function xt(e,t){{var o=function(){qe||(qe=!0,N("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)",t))};o.isReactWarning=!0,Object.defineProperty(e,"key",{get:o,configurable:!0})}}function Nt(e,t){{var o=function(){Ke||(Ke=!0,N("%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)",t))};o.isReactWarning=!0,Object.defineProperty(e,"ref",{get:o,configurable:!0})}}var bt=function(e,t,o,c,h,C,m){var R={$$typeof:E,type:e,key:t,ref:o,props:m,_owner:C};return R._store={},Object.defineProperty(R._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(R,"_self",{configurable:!1,enumerable:!1,writable:!1,value:c}),Object.defineProperty(R,"_source",{configurable:!1,enumerable:!1,writable:!1,value:h}),Object.freeze&&(Object.freeze(R.props),Object.freeze(R)),R};function Lt(e,t,o,c,h){{var C,m={},R=null,V=null;o!==void 0&&(Xe(o),R=""+o),Dt(t)&&(Xe(t.key),R=""+t.key),yt(t)&&(V=t.ref,Ct(t,h));for(C in t)Re.call(t,C)&&!ht.hasOwnProperty(C)&&(m[C]=t[C]);if(e&&e.defaultProps){var P=e.defaultProps;for(C in P)m[C]===void 0&&(m[C]=P[C])}if(R||V){var w=typeof e=="function"?e.displayName||e.name||"Unknown":e;R&&xt(m,w),V&&Nt(m,w)}return bt(e,R,V,h,c,ze.current,m)}}var Le=k.ReactCurrentOwner,Je=k.ReactDebugCurrentFrame;function Ee(e){if(e){var t=e._owner,o=Oe(e.type,e._source,t?t.type:null);Je.setExtraStackFrame(o)}else Je.setExtraStackFrame(null)}var Pe;Pe=!1;function Me(e){return typeof e=="object"&&e!==null&&e.$$typeof===E}function Qe(){{if(Le.current){var e=_(Le.current.type);if(e)return`
|
|
6
6
|
|
|
7
7
|
Check the render method of \``+e+"`."}return""}}function Pt(e){return""}var Ze={};function Mt(e){{var t=Qe();if(!t){var o=typeof e=="string"?e:e.displayName||e.name;o&&(t=`
|
|
8
8
|
|
|
9
|
-
Check the top-level render call using <`+o+">.")}return t}}function et(e,t){{if(!e._store||e._store.validated||e.key!=null)return;e._store.validated=!0;var o=Mt(t);if(Ze[o])return;Ze[o]=!0;var c="";e&&e._owner&&e._owner!==Le.current&&(c=" It was passed a child from "+_(e._owner.type)+"."),Ee(e),N('Each child in a list should have a unique "key" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',o,c),Ee(null)}}function tt(e,t){{if(typeof e!="object")return;if(be(e))for(var o=0;o<e.length;o++){var c=e[o];Me(c)&&et(c,t)}else if(Me(e))e._store&&(e._store.validated=!0);else if(e){var h=
|
|
9
|
+
Check the top-level render call using <`+o+">.")}return t}}function et(e,t){{if(!e._store||e._store.validated||e.key!=null)return;e._store.validated=!0;var o=Mt(t);if(Ze[o])return;Ze[o]=!0;var c="";e&&e._owner&&e._owner!==Le.current&&(c=" It was passed a child from "+_(e._owner.type)+"."),Ee(e),N('Each child in a list should have a unique "key" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',o,c),Ee(null)}}function tt(e,t){{if(typeof e!="object")return;if(be(e))for(var o=0;o<e.length;o++){var c=e[o];Me(c)&&et(c,t)}else if(Me(e))e._store&&(e._store.validated=!0);else if(e){var h=q(e);if(typeof h=="function"&&h!==e.entries)for(var C=h.call(e),m;!(m=C.next()).done;)Me(m.value)&&et(m.value,t)}}}function Ft(e){{var t=e.type;if(t==null||typeof t=="string")return;var o;if(typeof t=="function")o=t.propTypes;else if(typeof t=="object"&&(t.$$typeof===g||t.$$typeof===D))o=t.propTypes;else return;if(o){var c=_(t);gt(o,e.props,"prop",c,e)}else if(t.PropTypes!==void 0&&!Pe){Pe=!0;var h=_(t);N("Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?",h||"Unknown")}typeof t.getDefaultProps=="function"&&!t.getDefaultProps.isReactClassApproved&&N("getDefaultProps is only used on classic React.createClass definitions. Use a static property named `defaultProps` instead.")}}function wt(e){{for(var t=Object.keys(e.props),o=0;o<t.length;o++){var c=t[o];if(c!=="children"&&c!=="key"){Ee(e),N("Invalid prop `%s` supplied to `React.Fragment`. React.Fragment can only have `key` and `children` props.",c),Ee(null);break}}e.ref!==null&&(Ee(e),N("Invalid attribute `ref` supplied to `React.Fragment`."),Ee(null))}}var rt={};function at(e,t,o,c,h,C){{var m=A(e);if(!m){var R="";(e===void 0||typeof e=="object"&&e!==null&&Object.keys(e).length===0)&&(R+=" You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.");var V=Pt();V?R+=V:R+=Qe();var P;e===null?P="null":be(e)?P="array":e!==void 0&&e.$$typeof===E?(P="<"+(_(e.type)||"Unknown")+" />",R=" Did you accidentally export a JSX literal instead of a component?"):P=typeof e,N("React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s",P,R)}var w=Lt(e,t,o,h,C);if(w==null)return w;if(m){var z=t.children;if(z!==void 0)if(c)if(be(z)){for(var fe=0;fe<z.length;fe++)tt(z[fe],e);Object.freeze&&Object.freeze(z)}else N("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else tt(z,e)}if(Re.call(t,"key")){var ue=_(e),W=Object.keys(t).filter(function(kt){return kt!=="key"}),Fe=W.length>0?"{key: someKey, "+W.join(": ..., ")+": ...}":"{key: someKey}";if(!rt[ue+Fe]){var Yt=W.length>0?"{"+W.join(": ..., ")+": ...}":"{}";N(`A props object containing a "key" prop is being spread into JSX:
|
|
10
10
|
let props = %s;
|
|
11
11
|
<%s {...props} />
|
|
12
12
|
React keys must be passed directly to JSX without using spread:
|
|
13
13
|
let props = %s;
|
|
14
|
-
<%s key={someKey} {...props} />`,Fe,ue,Yt,ue),rt[ue+Fe]=!0}}return e===S?jt(j):Ft(j),j}}function wt(e,t,o){return at(e,t,o,!0)}function Ut(e,t,o){return at(e,t,o,!1)}var Gt=Ut,Bt=wt;me.Fragment=S,me.jsx=Gt,me.jsxs=Bt})()),me}var st;function Ht(){return st||(st=1,process.env.NODE_ENV==="production"?he.exports=$t():he.exports=Wt()),he.exports}var r=Ht();const Xt=a.styled(a.Box)(({theme:n})=>({width:"100%",fontFamily:n.typography.fontFamily})),it=a.styled("div")(({theme:n})=>({width:"100%","& .ag-header":{borderRadius:"8px 8px 0 0"},"& .ag-theme-alpine":{fontFamily:n.typography.fontFamily},"& .ag-header-cell-text":{fontSize:"14px",fontWeight:400,color:"#333"},"& .ag-cell":{fontSize:"14px",fontWeight:400,color:"#000",padding:"12px 16px"},"& .right-aligned-cell":{textAlign:"right"},"& .right-aligned-clickable-cell":{textAlign:"right",cursor:"pointer",color:"#1976d2",textDecoration:"underline"},"& .ag-header-cell.right-aligned-header":{justifyContent:"flex-end"},"& .ag-header-cell.right-aligned-header .ag-header-cell-label":{justifyContent:"flex-end",display:"flex",width:"100%"},"& .ag-cell:focus, .ag-cell:focus-within":{border:"1px solid transparent !important"}}));a.styled(a.Box)(()=>({position:"fixed",inset:0,display:"flex",alignItems:"center",justifyContent:"center",zIndex:1301,background:"rgba(255, 255, 255, 0.5)"}));const zt=a.styled(a.Box)(({theme:n})=>({display:"flex",justifyContent:"flex-end",marginTop:"16px",gap:"16px",[n.breakpoints.down("md")]:{flexWrap:"wrap",justifyContent:"center",gap:"12px"},[n.breakpoints.down("sm")]:{flexDirection:"column",alignItems:"center",gap:"16px"}})),qt=a.styled(a.Select)(()=>({fontSize:"14px",border:"none",boxShadow:"none",".MuiOutlinedInput-notchedOutline":{border:"none"},padding:"0px","& .MuiSelect-icon":{right:0},"& .MuiInputBase-input":{padding:0,paddingLeft:"8px",paddingRight:"32px !important"}})),Kt=a.styled(a.Box)(({height:n})=>({...n!==void 0&&{height:`${n}px`},"&.ag-theme-alpine":{border:"none !important"},".ag-root-wrapper":{border:"none !important"},".ag-header":{borderBottom:"none !important",backgroundColor:"#f5f5f5"},".ag-body-viewport":{border:"none !important"},".ag-header-cell img[alt='sort']":{display:"none",opacity:0,transition:"opacity 0.2s ease, visibility 0.2s ease"},".ag-header-cell:hover img[alt='sort']":{display:"block",opacity:1},".ag-row.ag-row-pinned":{borderBottom:"2px solid #e0e0e0"},".ag-header-cell":{display:"flex",alignItems:"center",justifyContent:"space-between"}})),Jt=a.styled(a.FormControl)(({theme:n})=>({display:"flex",flexDirection:"row",alignItems:"center",[n.breakpoints.down("sm")]:{flexWrap:"wrap",justifyContent:"center",gap:"8px"}})),lt=a.styled(a.Box)(({theme:n})=>({fontWeight:300,fontSize:"14px",[n.breakpoints.down("sm")]:{fontSize:"12px"}})),ct={DEFAULT_HEIGHT:500,MIN_HEIGHT:300,MAX_HEIGHT:800,DEFAULT_ROW_HEIGHT:50},Qt={DEFAULT_PAGE:1,DEFAULT_PAGE_SIZE:10,PAGE_SIZE_OPTIONS:[10,20,50,100],MIN_PAGE:1},Zt={ASC:"asc",DESC:"desc"},ut={UI_COLUMN_SORTED:"uiColumnSorted",API:"api",COLUMN_MOVED:"columnMoved"},je={NORMAL:"normal",AUTO_HEIGHT:"autoHeight"},Ve={CLIENT_SIDE:"clientSide",SERVER_SIDE:"serverSide",INFINITE:"infinite",VIEWPORT:"viewport"},er={DEFAULT_FLEX:1,ACTION_COLUMN_WIDTH:150,SORTABLE:!0,FILTER:!1},dt={NO_DATA:"N/A",LOADING:"Loading...",NO_RECORDS:"No records found"},Et={AG_THEME_ALPINE:"ag-theme-alpine",AG_THEME_BALHAM:"ag-theme-balham",AG_THEME_MATERIAL:"ag-theme-material"},ft={URL_REVOKE:100};ye.ModuleRegistry.registerModules([ye.ClientSideRowModelModule,ye.AllCommunityModule]);const Tt=({rows:n,totalRecords:T,currentPage:d,loading:S,onPageChange:i,columns:B,pageSize:z,pageSizeOptions:R,onPageSizeChange:g,setSort:Y,sortModel:O,height:D=ct.DEFAULT_HEIGHT,domLayout:x=je.NORMAL,getRowHeight:$,pinnedBottomRowData:ee,showLoader:ie=!0,emptyDataMessage:K,...k})=>{const N=E.useRef(null),M=E.useRef([]),te=w=>{if(w.source!==ut.UI_COLUMN_SORTED||(console.log("Sort Changed Event (User Initiated):",w),!Y))return;const G=w.api.getColumnState().filter(J=>J.sort).map(J=>({colId:J.colId,sort:J.sort}));console.log("New Sort Model:",G),JSON.stringify(G)!==JSON.stringify(M.current)&&(M.current=G,Y(G))};return ie&&S?r.jsx(it,{style:{display:"flex",alignItems:"center",justifyContent:"center",height:D,minHeight:120},children:r.jsx(a.CircularProgress,{})}):r.jsx(it,{"data-testid":"ServerSideGrid",className:Et.AG_THEME_ALPINE,children:r.jsxs(Xt,{children:[r.jsx(Kt,{height:x===je.AUTO_HEIGHT?void 0:D,children:r.jsx(Vt.AgGridReact,{ref:N,theme:"legacy",columnDefs:B,rowData:n,pinnedBottomRowData:ee,domLayout:x,rowModelType:Ve.CLIENT_SIDE,modules:[ye.ClientSideRowModelModule],localeText:{noRowsToShow:K||"No data to show"},...k,enableBrowserTooltips:!0,suppressMovableColumns:!0,suppressMenuHide:!0,onSortChanged:te,multiSortKey:"ctrl",alwaysMultiSort:!0,defaultColDef:{width:170,sortable:!0,unSortIcon:!0,tooltipValueGetter:w=>w.value??dt.NO_DATA},suppressRowTransform:!0,getRowHeight:$??(()=>54),maintainColumnOrder:!0,initialState:O&&O.length>0?{sort:{sortModel:O.map(w=>({colId:w.colId,sort:w.sort}))}}:void 0})}),T===0&&r.jsx(a.Divider,{})]})})},St=({totalRecords:n,currentPage:T,pageSize:d,onPageChange:S})=>{const i=Math.ceil(n/d);return r.jsxs(a.Box,{sx:{display:"flex",gap:2,alignItems:"center"},children:[r.jsx(a.Button,{size:"small",disabled:T===1,onClick:()=>S(T-1),children:"Previous"}),r.jsxs(a.Typography,{variant:"body2",children:["Page ",T," of ",i||1]}),r.jsx(a.Button,{size:"small",disabled:T>=i,onClick:()=>S(T+1),children:"Next"})]})},Ie={MASTER_DATA_MANAGEMENT:"Master Data Management",ADD_NEW_RECORD:"Add New Record",EDIT_RECORD:"Edit Record",VIEW_RECORD:"View Record"},oe={VIEW:"View",ADD_NEW_RECORD:"Add New Record",EDIT:"Edit",CREATE:"Create",UPDATE:"Update",CANCEL:"Cancel",BACK:"Back",EXPORT:"Export"},De={SELECT_ENTITY:"Select Entity",ACTIONS:"Actions",FROM:"From",TO:"To"},Te={SELECT_ENTITY:"Select Entity",SELECT:n=>`Select ${n}`,FILTER_BY:n=>`Filter by ${n}`},we={CSV:"CSV Format",EXCEL:"Excel Format"},Ue={CSV:"csv",EXCEL:"xlsx"},ne={FAILED_LOAD_ENTITIES:"Failed to load entities",FAILED_LOAD_METADATA:"Failed to load metadata",FAILED_LOAD_RECORD:"Failed to load record",FAILED_FETCH_LIST:"Failed to fetch list",FAILED_SAVE_RECORD:"Failed to save record. Please try again.",FAILED_EXPORT_CSV:"Failed to export CSV",FAILED_EXPORT_EXCEL:"Failed to export Excel",FAILED_LOAD_OPTIONS:n=>`Failed to load options for ${n}`,FAILED_LOAD_FORM_CONFIG:"Failed to load form configuration",FIELD_REQUIRED:n=>`${n} is required`,FIELD_MIN_VALUE:(n,T)=>`${n} must be at least ${T}`,FIELD_MAX_VALUE:(n,T)=>`${n} must be at most ${T}`},tr={RECORD_CREATED:"Record created successfully",RECORD_UPDATED:"Record updated successfully",RECORD_DELETED:"Record deleted successfully"},rr={REQUIRED:"This field is required",INVALID_FORMAT:"Invalid format"},ar={NO_DATA_AVAILABLE:"N/A",NO_RECORDS_FOUND:"No records found"},nr={LOADING:"Loading...",PLEASE_WAIT:"Please wait..."},Ce={SHOWING:"Showing",OF:"of",ENTRIES:"entries"},or={MASTER_VIEW:"master-view",MASTER_FORM:"master-form",FILTER_SECTION:"filter-section",FORM_SECTION:"form-section",FILTERS:"filters",FILTER_FIELD:"filter-field",FORM_FIELD:"form-field",FIELD_LABEL:"field-label",FIELD_INPUT:"field-input",ACTION_BUTTONS:"action-buttons",FORM_FIELDS:"form-fields",LOADING_CONTAINER:"loading-container"},sr={DEFAULT_TABLE_HEIGHT:500,DEFAULT_PAGE_SIZE:10,DEFAULT_COLUMN_WIDTH:150,MIN_HEIGHT_LOADING:"400px",ACTION_BUTTON_GAP:1,FORM_MARGIN_TOP:3,FORM_MARGIN_BOTTOM:2},Ge=[10,20,50,100],_t=" *",Rt="red",pt="_display",ir={ISO_DATE:"YYYY-MM-DD",DISPLAY_DATE:"DD/MM/YYYY",FILE_DATE:"YYYY-MM-DD"},lr={PAGE_SIZE:"Page size"},cr={BASE_URL:"http://localhost:3000",TIMEOUT:3e4,HEADERS:{CONTENT_TYPE:"application/json"}},ur={MASTER:"/master"},dr={ENTITIES:"/master/entities",ENTITY_METADATA:n=>`/master/${n}/metadata`,ENTITY_RECORDS:n=>`/master/${n}/records`,ENTITY_RECORD_BY_ID:(n,T)=>`/master/${n}/records/${T}`,ENTITY_OPTIONS:n=>`/master/${n}/options`,EXPORT_CSV:n=>`/master/${n}/export/csv`,EXPORT_EXCEL:n=>`/master/${n}/export/excel`},Er={GET:"GET",POST:"POST",PUT:"PUT",DELETE:"DELETE",PATCH:"PATCH"},fr={PAGE:"page",LIMIT:"limit",SEARCH:"search",SEARCH_BY:"searchBy",SORT_BY:"sortBy",SORT_ORDER:"sortOrder"},Be={ASC:"ASC",DESC:"DESC"},Tr={JSON:"json",BLOB:"blob",TEXT:"text"},Ye={CSV:"text/csv;charset=utf-8;",EXCEL:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",JSON:"application/json"},Sr={DATA:"data",COUNT:"count",MESSAGE:"message",ERROR:"error"},H={CREATE:"create",EDIT:"edit",VIEW:"view"},xe={TEXT:"text",DROPDOWN:"dropdown",DATEPICKER:"datepicker",NUMBER:"number",TEXTAREA:"textarea",CHECKBOX:"checkbox",RADIO:"radio"},ge={STRING:"string",NUMBER:"number",FLOAT:"float",DATE:"date",DATERANGE:"daterange",BOOLEAN:"boolean",ARRAY:"array",OBJECT:"object"},_r={API:"API",RAW:"Raw",STATIC:"Static"},Rr={ID:"id",NAME:"name",LABEL:"label",VALUE:"value",DISPLAY_NAME:"displayName",TABLE_NAME:"tableName"},pr={REQUIRED:"required",MIN:"min",MAX:"max",MIN_LENGTH:"minLength",MAX_LENGTH:"maxLength",PATTERN:"pattern",EMAIL:"email",URL:"url"},ae={FROM:"From",TO:"To"},Ar={TEXT:"text",NUMBER:"number",DATE:"date",EMAIL:"email",PASSWORD:"password",TEL:"tel",URL:"url"},mr={FLOAT_STEP:.01,INTEGER_STEP:1},gr={ENTITY_MATCH:/\/master\/([^\/]+)\/options/},Ir=({apiClient:n,apiEndpoints:T,onNavigateToNew:d,onNavigateToEdit:S})=>{const i=E.useMemo(()=>ke(n,T),[n,T]),[B,z]=E.useState([]),[R,g]=E.useState(null),[Y,O]=E.useState([]),[D,x]=E.useState({}),[$,ee]=E.useState([]),[ie,K]=E.useState([]),[k,N]=E.useState(0),[M,te]=E.useState(10),[w,G]=E.useState(1),[le,J]=E.useState(!1),[se,A]=E.useState(!1),[f,l]=E.useState({}),[_,F]=E.useState([]),[v,Q]=E.useState(null),U=E.useRef(!0);E.useEffect(()=>{(async()=>{try{const b=((await i.getEntities()).data||[]).map(y=>({name:y.tableName||y.name,label:y.displayName||y.label}));z(b),b.length>0&&g(b[0])}catch(u){console.error(ne.FAILED_LOAD_ENTITIES,u)}})()},[]),E.useEffect(()=>{if(!R)return;(async()=>{try{const I=(await i.getMetadata(R.name)).data||{};O(I.parameterList||[]),ee(I.resultsList||[]);const b={};(I.parameterList||[]).forEach(L=>{b[L.name]=null}),x(b);const y={};for(const L of I.parameterList||[])L.options&&Array.isArray(L.options)&&(y[L.name]=L.options);l(y),K([]),A(!1)}catch(u){console.error(ne.FAILED_LOAD_METADATA,u)}})()},[R]);const X=E.useMemo(()=>{const s={},u=[],I=[];Y.forEach(y=>{if(y.dataType===ge.DATERANGE){const Z=D[`${y.name}${ae.FROM}`],Re=D[`${y.name}${ae.TO}`];Z&&(s[`${y.name}${ae.FROM}`]=Z),Re&&(s[`${y.name}${ae.TO}`]=Re);return}const L=D[y.name];L==null||L===""||(y.options?s[y.name]=L:(u.push(y.name),I.push(String(L).trim())))});const b={page:w,limit:M};return Object.keys(s).length>0&&Object.entries(s).forEach(([y,L])=>{b[`filters[${y}]`]=L}),u.length>0&&(b.search=I.join(","),b.searchBy=u.join(",")),_.length>0&&(b.sortBy=_.map(y=>y.colId).join(","),b.sortOrder=_.map(y=>y.sort==="desc"?Be.DESC:Be.ASC).join(",")),console.log("Query params:",b),b},[Y,D,w,M,_]),ce=E.useCallback(async()=>{if(!(!R||!U.current)){U.current=!1,J(!0);try{console.log("Fetching with params:",X);const s=await i.getRecords(R.name,X),u=s.data||[],I=s.total||0;K(u),N(I)}catch(s){console.error(ne.FAILED_FETCH_LIST,s),console.error("Full error:",s),K([]),N(0)}finally{J(!1),U.current=!0}}},[R,X]);E.useEffect(()=>{se&&(w>1||_.length>0)&&ce()},[w,M,_,se,ce]);const de=()=>{G(1),A(!0),setTimeout(()=>{U.current=!0,ce()},0)},re=s=>{Q(s.currentTarget)},Se=()=>{Q(null)},_e=async s=>{if(R)try{const u=s==="csv"?await i.exportCSV(R.name,X):await i.exportExcel(R.name,X),I=s==="csv"?Ye.CSV:Ye.EXCEL,b=s==="csv"?Ue.CSV:Ue.EXCEL,y=new Blob([u.data],{type:I}),L=URL.createObjectURL(y),Z=document.createElement("a");Z.href=L,Z.download=`${R.name}_${new Date().toISOString().split("T")[0]}.${b}`,Z.style.visibility="hidden",document.body.appendChild(Z),Z.click(),document.body.removeChild(Z),setTimeout(()=>URL.revokeObjectURL(L),ft.URL_REVOKE)}catch(u){console.error(`Failed to export ${s.toUpperCase()}:`,u)}finally{Se()}},Ne=E.useMemo(()=>{const s=$.map(u=>({field:u.name,headerName:u.label,sortable:!0,filter:!1,flex:1}));return s.push({field:"actions",headerName:De.ACTIONS,sortable:!1,filter:!1,width:150,cellRenderer:u=>{const I=u.data;return!I||!R?null:r.jsx(a.Box,{sx:{display:"flex",gap:1,py:1},children:r.jsx(a.Button,{size:"small",variant:"outlined",onClick:()=>S?.(R.name,I.id),children:oe.EDIT})})}}),s},[$,R,S]);return r.jsxs(a.Box,{className:"master-view",children:[r.jsxs(a.Paper,{className:"filter-section",children:[r.jsx(a.Typography,{variant:"h5",gutterBottom:!0,children:Ie.MASTER_DATA_MANAGEMENT}),r.jsxs(a.Box,{className:"filters",children:[r.jsxs(a.Box,{className:"filter-field",children:[r.jsx(a.Typography,{variant:"body2",className:"field-label",children:De.SELECT_ENTITY}),r.jsx(a.Autocomplete,{options:B,getOptionLabel:s=>s.label,value:R,onChange:(s,u)=>g(u),renderInput:s=>r.jsx(a.TextField,{...s,size:"small",placeholder:Te.SELECT_ENTITY}),className:"field-input"})]}),Y.filter(s=>s.name.toLowerCase()!=="id").map(s=>r.jsxs(a.Box,{className:"filter-field",children:[r.jsx(a.Typography,{variant:"body2",className:"field-label",children:s.label}),s.dataType===ge.DATERANGE?r.jsxs(a.Box,{sx:{display:"flex",gap:1,width:"100%"},children:[r.jsx(a.TextField,{type:"date",size:"small",value:D[`${s.name}${ae.FROM}`]||"",onChange:u=>x(I=>({...I,[`${s.name}${ae.FROM}`]:u.target.value})),sx:{flex:1}}),r.jsx(a.TextField,{type:"date",size:"small",label:De.TO,value:D[`${s.name}${ae.TO}`]||"",onChange:u=>x(I=>({...I,[`${s.name}${ae.TO}`]:u.target.value})),sx:{flex:1}})]}):s.dataType===ge.DATE?r.jsx(a.TextField,{type:"date",size:"small",value:D[s.name]||"",onChange:u=>x(I=>({...I,[s.name]:u.target.value})),className:"field-input"}):s.options?r.jsx(a.Autocomplete,{options:f[s.name]||s.options,getOptionLabel:u=>u.label||String(u.value),value:f[s.name]?.find(u=>u.value===D[s.name])||null,onChange:(u,I)=>x(b=>({...b,[s.name]:I?.value||null})),renderInput:u=>r.jsx(a.TextField,{...u,size:"small",placeholder:Te.SELECT(s.label)}),className:"field-input"}):s.dataType===ge.NUMBER?r.jsx(a.TextField,{type:"number",size:"small",value:D[s.name]||"",onChange:u=>x(I=>({...I,[s.name]:u.target.value})),placeholder:Te.FILTER_BY(s.label),className:"field-input"}):r.jsx(a.TextField,{size:"small",value:D[s.name]||"",onChange:u=>x(I=>({...I,[s.name]:u.target.value})),placeholder:Te.FILTER_BY(s.label),className:"field-input"})]},s.name))]}),r.jsxs(a.Box,{className:"action-buttons",children:[r.jsx(a.Button,{variant:"contained",onClick:de,children:oe.VIEW}),r.jsx(a.Button,{variant:"contained",disabled:!R,onClick:()=>R&&d?.(R.name),children:oe.ADD_NEW_RECORD})]})]}),se&&r.jsxs(a.Box,{mt:4,width:"100%",children:[r.jsxs(a.Box,{display:"flex",justifyContent:"flex-end",mb:2,children:[r.jsx(a.Button,{variant:"outlined",onClick:re,disabled:!R,children:oe.EXPORT}),r.jsxs(a.Menu,{anchorEl:v,open:!!v,onClose:Se,children:[r.jsx(a.MenuItem,{onClick:()=>_e("csv"),children:we.CSV}),r.jsx(a.MenuItem,{onClick:()=>_e("excel"),children:we.EXCEL})]})]}),r.jsx(Tt,{rows:ie,columns:Ne,totalRecords:k,currentPage:w,loading:le,rowModelType:Ve.CLIENT_SIDE,onPageChange:G,pageSize:M,pageSizeOptions:[...Ge],onPageSizeChange:s=>{te(s),G(1)},setSort:F,sortModel:_,height:500},R?.name),r.jsxs(zt,{children:[r.jsx(a.Box,{display:"flex",alignItems:"center",gap:1,children:r.jsxs(Jt,{variant:"outlined",size:"small",children:[r.jsxs(lt,{children:[Ce.SHOWING," "]}),r.jsx(qt,{value:M,inputProps:{"aria-label":"Page size"},onChange:s=>{te(Number(s.target.value)),G(1)},children:Ge.map(s=>r.jsx(a.MenuItem,{value:s,children:s},s))}),r.jsxs(lt,{children:[Ce.OF," ",k," ",Ce.ENTRIES]})]})}),r.jsx(St,{totalRecords:k,currentPage:w,onPageChange:G,pageSize:M})]})]})]})},Or=({apiClient:n,apiEndpoints:T,entity:d,id:S,mode:i,onBack:B,onSuccess:z})=>{const R=E.useMemo(()=>ke(n,T),[n,T]),[g,Y]=E.useState({}),[O,D]=E.useState({}),[x,$]=E.useState(!1),[ee,ie]=E.useState({}),[K,k]=E.useState(!0),[N,M]=E.useState(null),te=E.useMemo(()=>Object.keys(g),[g]),w=E.useMemo(()=>te.sort((A,f)=>{const l=g[A],_=g[f];return l?.validation?.required&&!_?.validation?.required?-1:!l?.validation?.required&&_?.validation?.required?1:A.localeCompare(f)}),[te,g]);E.useEffect(()=>{if(!d)return;let A=!0;return(async()=>{k(!0),M(null);try{const l=await R.getMetadata(d);if(!A)return;const F=(l.data?.data||l.data||{}).formConfig||{};Y(F);const v={};for(const[Q,U]of Object.entries(F))if(U.fieldType===xe.DROPDOWN)if(U.optionType==="API"&&U.option&&typeof U.option=="string")try{const X=await n.get(U.option),de=(X.data?.data||X.data||[]).map(re=>({value:re.id,label:re.name||re.displayName||String(re.id)}));v[U.fieldName]=de}catch(X){console.error(`Failed to load options for ${Q}:`,X),v[U.fieldName]=[]}else U.optionType==="Raw"&&Array.isArray(U.option)&&(v[U.fieldName]=U.option);A&&ie(v)}catch(l){console.error(ne.FAILED_LOAD_METADATA,l),A&&M(ne.FAILED_LOAD_FORM_CONFIG)}finally{A&&k(!1)}})(),()=>{A=!1}},[d,R,n]),E.useEffect(()=>{if(!d||!S||i===H.CREATE){D({});return}let A=!0;return(async()=>{$(!0),M(null);try{const l=await R.getRecord(d,S);if(!A)return;const _=l.data?.data||l.data||{},F={};for(const[v,Q]of Object.entries(_))v.endsWith(pt)||(F[v]=Q);D(F)}catch(l){console.error(ne.FAILED_LOAD_RECORD,l),A&&M(ne.FAILED_LOAD_RECORD)}finally{A&&$(!1)}})(),()=>{A=!1}},[d,S,i,R]);const G=E.useCallback((A,f)=>{D(l=>({...l,[A]:f}))},[]),le=E.useCallback(()=>{const A=[];for(const[f,l]of Object.entries(g))l.validation?.required&&!O[l.fieldName]&&A.push(ne.FIELD_REQUIRED(f)),l.validation?.min!==void 0&&O[l.fieldName]<l.validation.min&&A.push(`${f} must be at least ${l.validation.min}`),l.validation?.max!==void 0&&O[l.fieldName]>l.validation.max&&A.push(`${f} must be at most ${l.validation.max}`);return A},[g,O]),J=E.useCallback(async()=>{if(!d)return;const A=le();if(A.length>0){M(A.join(", "));return}$(!0),M(null);try{const f={};for(const l of Object.values(g)){const _=l.fieldName;_&&O[_]!==void 0&&O[_]!==""&&(f[_]=O[_])}if(i===H.CREATE){const l=await R.createRecord(d,{data:f});z?.(l)}else if(S){const l=await R.updateRecord(d,S,{data:f});z?.(l)}B?.()}catch(f){console.error("Failed to save record:",f);const l=f?.response?.data?.message||(Array.isArray(f?.response?.data?.message)?f.response.data.message.join(", "):"Failed to save record. Please try again.");M(l)}finally{$(!1)}},[d,g,O,le,i,S,R,B,z]),se=E.useCallback(A=>{const f=g[A],l=f?.fieldName;if(!f||l==="id")return null;const _=O[l]??"",F=i===H.VIEW||x;return r.jsxs(a.Box,{className:"form-field",children:[r.jsxs(a.Typography,{variant:"body2",className:"field-label",children:[A,f.validation?.required&&i!==H.VIEW&&r.jsx("span",{style:{color:Rt},children:_t})]}),f.fieldType===xe.DROPDOWN?r.jsx(a.Autocomplete,{options:ee[l]||[],getOptionLabel:v=>v.label||String(v.value),value:ee[l]?.find(v=>v.value===_)||null,onChange:(v,Q)=>G(l,Q?.value??null),disabled:F,loading:K,renderInput:v=>r.jsx(a.TextField,{...v,size:"small",placeholder:Te.SELECT(A),error:f.validation?.required&&!_&&i!==H.VIEW}),className:"field-input"}):f.fieldType===xe.DATEPICKER?r.jsx(a.TextField,{type:"date",size:"small",value:_?String(_).slice(0,10):"",onChange:v=>G(l,v.target.value),disabled:F,error:f.validation?.required&&!_&&i!==H.VIEW,className:"field-input",InputLabelProps:{shrink:!0}}):f.dataType==="number"||f.dataType==="float"?r.jsx(a.TextField,{type:"number",size:"small",value:_,onChange:v=>G(l,v.target.value),disabled:F,placeholder:A,error:f.validation?.required&&!_&&i!==H.VIEW,inputProps:{max:f.validation?.max,min:f.validation?.min,step:f.dataType==="float"?.01:1},className:"field-input"}):r.jsx(a.TextField,{size:"small",value:_,onChange:v=>G(l,v.target.value),disabled:F,placeholder:A,error:f.validation?.required&&!_&&i!==H.VIEW,inputProps:{maxLength:f.validation?.max},className:"field-input"})]},A)},[g,O,ee,G,i,x,K]);return K?r.jsx(a.Box,{className:"loading-container",display:"flex",justifyContent:"center",alignItems:"center",minHeight:"400px",children:r.jsx(a.CircularProgress,{})}):r.jsx(a.Box,{className:"master-form",children:r.jsxs(a.Paper,{className:"form-section",children:[r.jsxs(a.Typography,{variant:"h5",gutterBottom:!0,children:[i===H.CREATE?Ie.ADD_NEW_RECORD:i===H.EDIT?Ie.EDIT_RECORD:Ie.VIEW_RECORD,d&&` - ${d.charAt(0).toUpperCase()+d.slice(1)}`]}),N&&r.jsx(a.Alert,{severity:"error",onClose:()=>M(null),sx:{mb:2},children:N}),x&&i!==H.VIEW&&r.jsx(a.Box,{display:"flex",justifyContent:"center",my:2,children:r.jsx(a.CircularProgress,{size:24})}),r.jsx(a.Box,{className:"form-fields",children:w.map(se)}),r.jsx(a.Box,{className:"action-buttons",mt:3,children:i!==H.VIEW?r.jsxs(r.Fragment,{children:[r.jsx(a.Button,{variant:"contained",onClick:J,disabled:x,children:x?r.jsx(a.CircularProgress,{size:24}):i===H.CREATE?oe.CREATE:oe.UPDATE}),r.jsx(a.Button,{variant:"outlined",onClick:()=>B?.(),disabled:x,children:oe.CANCEL})]}):r.jsx(a.Button,{variant:"outlined",onClick:()=>B?.(),children:oe.BACK})})]})})},vr={ROOT:"/",MASTER:"/master",MASTER_ENTITY_NEW:n=>`/master/${n}/new`,MASTER_ENTITY_VIEW:(n,T)=>`/master/${n}/${T}`,MASTER_ENTITY_EDIT:(n,T)=>`/master/${n}/${T}/edit`},hr={ROOT:"/",MASTER:"/master",MASTER_ENTITY_NEW:"/master/:entity/new",MASTER_ENTITY_VIEW:"/master/:entity/:id",MASTER_ENTITY_EDIT:"/master/:entity/:id/edit"},yr={NEW:"new",EDIT:"edit",VIEW:"view"},Dr={ENTITY:"entity",ID:"id"},Cr={NEW:"/new",EDIT:"/edit"};exports.API_BASE_PATHS=ur;exports.API_CONFIG=cr;exports.API_ENDPOINTS=dr;exports.ARIA_LABELS=lr;exports.BUTTON_LABELS=oe;exports.COLUMN_PROPERTIES=er;exports.CSS_CLASSES=or;exports.DATA_TYPES=ge;exports.DATE_FORMATS=ir;exports.DATE_RANGE_SUFFIXES=ae;exports.DISPLAY_FIELD_SUFFIX=pt;exports.EMPTY_STATE_MESSAGES=ar;exports.ERROR_MESSAGES=ne;exports.EXPORT_OPTIONS=we;exports.FIELD_LABELS=De;exports.FIELD_NAMES=Rr;exports.FIELD_TYPES=xe;exports.FILE_EXTENSIONS=Ue;exports.FORM_MODES=H;exports.GRID_CSS_CLASSES=Et;exports.GRID_EVENT_SOURCES=ut;exports.GRID_LAYOUT=je;exports.GRID_MESSAGES=dt;exports.GRID_SETTINGS=ct;exports.GRID_TEXT=Ce;exports.GRID_TIMEOUTS=ft;exports.HTTP_METHODS=Er;exports.INPUT_TYPES=Ar;exports.LOADING_MESSAGES=nr;exports.MIME_TYPES=Ye;exports.MasterForm=Or;exports.MasterView=Ir;exports.NUMBER_INPUT=mr;exports.OPTION_TYPES=_r;exports.PAGE_SIZE_OPTIONS=Ge;exports.PAGE_TITLES=Ie;exports.PAGINATION_SETTINGS=Qt;exports.PLACEHOLDERS=Te;exports.Pagination=St;exports.QUERY_PARAMS=fr;exports.REGEX_PATTERNS=gr;exports.REQUIRED_INDICATOR=_t;exports.REQUIRED_INDICATOR_COLOR=Rt;exports.RESPONSE_KEYS=Sr;exports.RESPONSE_TYPES=Tr;exports.ROUTES=vr;exports.ROUTE_KEYS=yr;exports.ROUTE_PATTERNS=hr;exports.ROUTE_SUFFIXES=Cr;exports.ROW_MODEL_TYPES=Ve;exports.SORT_ORDER=Be;exports.SORT_SETTINGS=Zt;exports.STYLE_CONSTANTS=sr;exports.SUCCESS_MESSAGES=tr;exports.ServerSideGrid=Tt;exports.URL_PARAMS=Dr;exports.VALIDATION_MESSAGES=rr;exports.VALIDATION_RULES=pr;exports.createApiService=ke;
|
|
14
|
+
<%s key={someKey} {...props} />`,Fe,ue,Yt,ue),rt[ue+Fe]=!0}}return e===T?wt(w):Ft(w),w}}function jt(e,t,o){return at(e,t,o,!0)}function Ut(e,t,o){return at(e,t,o,!1)}var Gt=Ut,Bt=jt;me.Fragment=T,me.jsx=Gt,me.jsxs=Bt})()),me}var st;function Ht(){return st||(st=1,process.env.NODE_ENV==="production"?he.exports=$t():he.exports=Wt()),he.exports}var r=Ht();const Xt=a.styled(a.Box)(({theme:n})=>({width:"100%",fontFamily:n.typography.fontFamily})),it=a.styled("div")(({theme:n})=>({width:"100%","& .ag-header":{borderRadius:"8px 8px 0 0"},"& .ag-theme-alpine":{fontFamily:n.typography.fontFamily},"& .ag-header-cell-text":{fontSize:"14px",fontWeight:400,color:"#333"},"& .ag-cell":{fontSize:"14px",fontWeight:400,color:"#000",padding:"12px 16px"},"& .right-aligned-cell":{textAlign:"right"},"& .right-aligned-clickable-cell":{textAlign:"right",cursor:"pointer",color:"#1976d2",textDecoration:"underline"},"& .ag-header-cell.right-aligned-header":{justifyContent:"flex-end"},"& .ag-header-cell.right-aligned-header .ag-header-cell-label":{justifyContent:"flex-end",display:"flex",width:"100%"},"& .ag-cell:focus, .ag-cell:focus-within":{border:"1px solid transparent !important"}}));a.styled(a.Box)(()=>({position:"fixed",inset:0,display:"flex",alignItems:"center",justifyContent:"center",zIndex:1301,background:"rgba(255, 255, 255, 0.5)"}));const zt=a.styled(a.Box)(({theme:n})=>({display:"flex",justifyContent:"flex-end",marginTop:"16px",gap:"16px",[n.breakpoints.down("md")]:{flexWrap:"wrap",justifyContent:"center",gap:"12px"},[n.breakpoints.down("sm")]:{flexDirection:"column",alignItems:"center",gap:"16px"}})),qt=a.styled(a.Select)(()=>({fontSize:"14px",border:"none",boxShadow:"none",".MuiOutlinedInput-notchedOutline":{border:"none"},padding:"0px","& .MuiSelect-icon":{right:0},"& .MuiInputBase-input":{padding:0,paddingLeft:"8px",paddingRight:"32px !important"}})),Kt=a.styled(a.Box)(({height:n})=>({...n!==void 0&&{height:`${n}px`},"&.ag-theme-alpine":{border:"none !important"},".ag-root-wrapper":{border:"none !important"},".ag-header":{borderBottom:"none !important",backgroundColor:"#f5f5f5"},".ag-body-viewport":{border:"none !important"},".ag-header-cell img[alt='sort']":{display:"none",opacity:0,transition:"opacity 0.2s ease, visibility 0.2s ease"},".ag-header-cell:hover img[alt='sort']":{display:"block",opacity:1},".ag-row.ag-row-pinned":{borderBottom:"2px solid #e0e0e0"},".ag-header-cell":{display:"flex",alignItems:"center",justifyContent:"space-between"}})),Jt=a.styled(a.FormControl)(({theme:n})=>({display:"flex",flexDirection:"row",alignItems:"center",[n.breakpoints.down("sm")]:{flexWrap:"wrap",justifyContent:"center",gap:"8px"}})),lt=a.styled(a.Box)(({theme:n})=>({fontWeight:300,fontSize:"14px",[n.breakpoints.down("sm")]:{fontSize:"12px"}})),ct={DEFAULT_HEIGHT:500,MIN_HEIGHT:300,MAX_HEIGHT:800,DEFAULT_ROW_HEIGHT:50},Qt={DEFAULT_PAGE:1,DEFAULT_PAGE_SIZE:10,PAGE_SIZE_OPTIONS:[10,20,50,100],MIN_PAGE:1},Zt={ASC:"asc",DESC:"desc"},ut={UI_COLUMN_SORTED:"uiColumnSorted",API:"api",COLUMN_MOVED:"columnMoved"},we={NORMAL:"normal",AUTO_HEIGHT:"autoHeight"},Ve={CLIENT_SIDE:"clientSide",SERVER_SIDE:"serverSide",INFINITE:"infinite",VIEWPORT:"viewport"},er={DEFAULT_FLEX:1,ACTION_COLUMN_WIDTH:150,SORTABLE:!0,FILTER:!1},dt={NO_DATA:"N/A",LOADING:"Loading...",NO_RECORDS:"No records found"},Et={AG_THEME_ALPINE:"ag-theme-alpine",AG_THEME_BALHAM:"ag-theme-balham",AG_THEME_MATERIAL:"ag-theme-material"},ft={URL_REVOKE:100};ye.ModuleRegistry.registerModules([ye.ClientSideRowModelModule,ye.AllCommunityModule]);const Tt=({rows:n,totalRecords:E,currentPage:u,loading:T,onPageChange:i,columns:B,pageSize:X,pageSizeOptions:p,onPageSizeChange:g,setSort:Y,sortModel:O,height:D=ct.DEFAULT_HEIGHT,domLayout:x=we.NORMAL,getRowHeight:$,pinnedBottomRowData:ee,showLoader:ie=!0,emptyDataMessage:q,...k})=>{const N=f.useRef(null),M=f.useRef([]),te=j=>{if(j.source!==ut.UI_COLUMN_SORTED||(console.log("Sort Changed Event (User Initiated):",j),!Y))return;const G=j.api.getColumnState().filter(K=>K.sort).map(K=>({colId:K.colId,sort:K.sort}));console.log("New Sort Model:",G),JSON.stringify(G)!==JSON.stringify(M.current)&&(M.current=G,Y(G))};return ie&&T?r.jsx(it,{style:{display:"flex",alignItems:"center",justifyContent:"center",height:D,minHeight:120},children:r.jsx(a.CircularProgress,{})}):r.jsx(it,{"data-testid":"ServerSideGrid",className:Et.AG_THEME_ALPINE,children:r.jsxs(Xt,{children:[r.jsx(Kt,{height:x===we.AUTO_HEIGHT?void 0:D,children:r.jsx(Vt.AgGridReact,{ref:N,theme:"legacy",columnDefs:B,rowData:n,pinnedBottomRowData:ee,domLayout:x,rowModelType:Ve.CLIENT_SIDE,modules:[ye.ClientSideRowModelModule],localeText:{noRowsToShow:q||"No data to show"},...k,enableBrowserTooltips:!0,suppressMovableColumns:!0,suppressMenuHide:!0,onSortChanged:te,defaultColDef:{width:170,sortable:!0,unSortIcon:!0,tooltipValueGetter:j=>j.value??dt.NO_DATA},suppressRowTransform:!0,getRowHeight:$??(()=>54),maintainColumnOrder:!0,initialState:O&&O.length>0?{sort:{sortModel:O.map(j=>({colId:j.colId,sort:j.sort}))}}:void 0})}),E===0&&r.jsx(a.Divider,{})]})})},St=({totalRecords:n,currentPage:E,pageSize:u,onPageChange:T})=>{const i=Math.ceil(n/u);return r.jsxs(a.Box,{sx:{display:"flex",gap:2,alignItems:"center"},children:[r.jsx(a.Button,{size:"small",disabled:E===1,onClick:()=>T(E-1),children:"Previous"}),r.jsxs(a.Typography,{variant:"body2",children:["Page ",E," of ",i||1]}),r.jsx(a.Button,{size:"small",disabled:E>=i,onClick:()=>T(E+1),children:"Next"})]})},Ie={MASTER_DATA_MANAGEMENT:"Master Data Management",ADD_NEW_RECORD:"Add New Record",EDIT_RECORD:"Edit Record",VIEW_RECORD:"View Record"},oe={VIEW:"View",ADD_NEW_RECORD:"Add New Record",EDIT:"Edit",CREATE:"Create",UPDATE:"Update",CANCEL:"Cancel",BACK:"Back",EXPORT:"Export"},De={SELECT_ENTITY:"Select Entity",ACTIONS:"Actions",FROM:"From",TO:"To"},Te={SELECT_ENTITY:"Select Entity",SELECT:n=>`Select ${n}`,FILTER_BY:n=>`Filter by ${n}`},je={CSV:"CSV Format",EXCEL:"Excel Format"},Ue={CSV:"csv",EXCEL:"xlsx"},ne={FAILED_LOAD_ENTITIES:"Failed to load entities",FAILED_LOAD_METADATA:"Failed to load metadata",FAILED_LOAD_RECORD:"Failed to load record",FAILED_FETCH_LIST:"Failed to fetch list",FAILED_SAVE_RECORD:"Failed to save record. Please try again.",FAILED_EXPORT_CSV:"Failed to export CSV",FAILED_EXPORT_EXCEL:"Failed to export Excel",FAILED_LOAD_OPTIONS:n=>`Failed to load options for ${n}`,FAILED_LOAD_FORM_CONFIG:"Failed to load form configuration",FIELD_REQUIRED:n=>`${n} is required`,FIELD_MIN_VALUE:(n,E)=>`${n} must be at least ${E}`,FIELD_MAX_VALUE:(n,E)=>`${n} must be at most ${E}`},tr={RECORD_CREATED:"Record created successfully",RECORD_UPDATED:"Record updated successfully",RECORD_DELETED:"Record deleted successfully"},rr={REQUIRED:"This field is required",INVALID_FORMAT:"Invalid format"},ar={NO_DATA_AVAILABLE:"N/A",NO_RECORDS_FOUND:"No records found"},nr={LOADING:"Loading...",PLEASE_WAIT:"Please wait..."},Ce={SHOWING:"Showing",OF:"of",ENTRIES:"entries"},or={MASTER_VIEW:"master-view",MASTER_FORM:"master-form",FILTER_SECTION:"filter-section",FORM_SECTION:"form-section",FILTERS:"filters",FILTER_FIELD:"filter-field",FORM_FIELD:"form-field",FIELD_LABEL:"field-label",FIELD_INPUT:"field-input",ACTION_BUTTONS:"action-buttons",FORM_FIELDS:"form-fields",LOADING_CONTAINER:"loading-container"},sr={DEFAULT_TABLE_HEIGHT:500,DEFAULT_PAGE_SIZE:10,DEFAULT_COLUMN_WIDTH:150,MIN_HEIGHT_LOADING:"400px",ACTION_BUTTON_GAP:1,FORM_MARGIN_TOP:3,FORM_MARGIN_BOTTOM:2},Ge=[10,20,50,100],_t=" *",pt="red",Rt="_display",ir={ISO_DATE:"YYYY-MM-DD",DISPLAY_DATE:"DD/MM/YYYY",FILE_DATE:"YYYY-MM-DD"},lr={PAGE_SIZE:"Page size"},cr={BASE_URL:"http://localhost:3000",TIMEOUT:3e4,HEADERS:{CONTENT_TYPE:"application/json"}},ur={MASTER:"/master"},dr={ENTITIES:"/master/entities",ENTITY_METADATA:n=>`/master/${n}/metadata`,ENTITY_RECORDS:n=>`/master/${n}/records`,ENTITY_RECORD_BY_ID:(n,E)=>`/master/${n}/records/${E}`,ENTITY_OPTIONS:n=>`/master/${n}/options`,EXPORT_CSV:n=>`/master/${n}/export/csv`,EXPORT_EXCEL:n=>`/master/${n}/export/excel`},Er={GET:"GET",POST:"POST",PUT:"PUT",DELETE:"DELETE",PATCH:"PATCH"},fr={PAGE:"page",LIMIT:"limit",SEARCH:"search",SEARCH_BY:"searchBy",SORT_BY:"sortBy",SORT_ORDER:"sortOrder"},Be={ASC:"ASC",DESC:"DESC"},Tr={JSON:"json",BLOB:"blob",TEXT:"text"},Ye={CSV:"text/csv;charset=utf-8;",EXCEL:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",JSON:"application/json"},Sr={DATA:"data",COUNT:"count",MESSAGE:"message",ERROR:"error"},H={CREATE:"create",EDIT:"edit",VIEW:"view"},xe={TEXT:"text",DROPDOWN:"dropdown",DATEPICKER:"datepicker",NUMBER:"number",TEXTAREA:"textarea",CHECKBOX:"checkbox",RADIO:"radio"},ge={STRING:"string",NUMBER:"number",FLOAT:"float",DATE:"date",DATERANGE:"daterange",BOOLEAN:"boolean",ARRAY:"array",OBJECT:"object"},_r={API:"API",RAW:"Raw",STATIC:"Static"},pr={ID:"id",NAME:"name",LABEL:"label",VALUE:"value",DISPLAY_NAME:"displayName",TABLE_NAME:"tableName"},Rr={REQUIRED:"required",MIN:"min",MAX:"max",MIN_LENGTH:"minLength",MAX_LENGTH:"maxLength",PATTERN:"pattern",EMAIL:"email",URL:"url"},ae={FROM:"From",TO:"To"},Ar={TEXT:"text",NUMBER:"number",DATE:"date",EMAIL:"email",PASSWORD:"password",TEL:"tel",URL:"url"},mr={FLOAT_STEP:.01,INTEGER_STEP:1},gr={ENTITY_MATCH:/\/master\/([^\/]+)\/options/},Ir=({apiClient:n,apiEndpoints:E,onNavigateToNew:u,onNavigateToEdit:T})=>{const i=f.useMemo(()=>ke(n,E),[n,E]),[B,X]=f.useState([]),[p,g]=f.useState(null),[Y,O]=f.useState([]),[D,x]=f.useState({}),[$,ee]=f.useState([]),[ie,q]=f.useState([]),[k,N]=f.useState(0),[M,te]=f.useState(10),[j,G]=f.useState(1),[le,K]=f.useState(!1),[se,A]=f.useState(!1),[S,l]=f.useState({}),[_,F]=f.useState([]),[v,J]=f.useState(null),U=f.useRef(!0);f.useEffect(()=>{(async()=>{try{const b=((await i.getEntities()).data||[]).map(y=>({name:y.tableName||y.name,label:y.displayName||y.label}));X(b),b.length>0&&g(b[0])}catch(d){console.error(ne.FAILED_LOAD_ENTITIES,d)}})()},[]),f.useEffect(()=>{if(!p)return;(async()=>{try{const I=(await i.getMetadata(p.name)).data||{};O(I.parameterList||[]),ee(I.resultsList||[]);const b={};(I.parameterList||[]).forEach(L=>{b[L.name]=null}),x(b);const y={};for(const L of I.parameterList||[])L.options&&Array.isArray(L.options)&&(y[L.name]=L.options);l(y),q([]),A(!1)}catch(d){console.error(ne.FAILED_LOAD_METADATA,d)}})()},[p]);const Q=f.useMemo(()=>{const s={},d=[],I=[];Y.forEach(y=>{if(y.dataType===ge.DATERANGE){const Z=D[`${y.name}${ae.FROM}`],pe=D[`${y.name}${ae.TO}`];Z&&(s[`${y.name}${ae.FROM}`]=Z),pe&&(s[`${y.name}${ae.TO}`]=pe);return}const L=D[y.name];L==null||L===""||(y.options?s[y.name]=L:(d.push(y.name),I.push(String(L).trim())))});const b={page:j,limit:M};return Object.keys(s).length>0&&Object.entries(s).forEach(([y,L])=>{b[`filters[${y}]`]=L}),d.length>0&&(b.search=I.join(","),b.searchBy=d.join(",")),_.length>0&&(b.sortBy=_.map(y=>y.colId).join(","),b.sortOrder=_.map(y=>y.sort==="desc"?Be.DESC:Be.ASC).join(",")),console.log("Query params:",b),b},[Y,D,j,M,_]),ce=f.useCallback(async()=>{if(!(!p||!U.current)){U.current=!1,K(!0);try{console.log("Fetching with params:",Q);const s=await i.getRecords(p.name,Q),d=s.data||[],I=s.total||0;q(d),N(I)}catch(s){console.error(ne.FAILED_FETCH_LIST,s),console.error("Full error:",s),q([]),N(0)}finally{K(!1),U.current=!0}}},[p,Q]);f.useEffect(()=>{se&&(j>1||_.length>0)&&ce()},[j,M,_,se,ce]);const de=()=>{G(1),A(!0),setTimeout(()=>{U.current=!0,ce()},0)},re=s=>{J(s.currentTarget)},Se=()=>{J(null)},_e=async s=>{if(p)try{const d=s==="csv"?await i.exportCSV(p.name,Q):await i.exportExcel(p.name,Q),I=s==="csv"?Ye.CSV:Ye.EXCEL,b=s==="csv"?Ue.CSV:Ue.EXCEL,y=new Blob([d.data],{type:I}),L=URL.createObjectURL(y),Z=document.createElement("a");Z.href=L,Z.download=`${p.name}_${new Date().toISOString().split("T")[0]}.${b}`,Z.style.visibility="hidden",document.body.appendChild(Z),Z.click(),document.body.removeChild(Z),setTimeout(()=>URL.revokeObjectURL(L),ft.URL_REVOKE)}catch(d){console.error(`Failed to export ${s.toUpperCase()}:`,d)}finally{Se()}},Ne=f.useMemo(()=>{const s=$.map(d=>({field:d.name,headerName:d.label,sortable:!0,filter:!1,flex:1}));return s.push({field:"actions",headerName:De.ACTIONS,sortable:!1,filter:!1,width:150,cellRenderer:d=>{const I=d.data;return!I||!p?null:r.jsx(a.Box,{sx:{display:"flex",gap:1,py:1},children:r.jsx(a.Button,{size:"small",variant:"outlined",onClick:()=>T?.(p.name,I.id),children:oe.EDIT})})}}),s},[$,p,T]);return r.jsxs(a.Box,{className:"master-view",children:[r.jsxs(a.Paper,{className:"filter-section",children:[r.jsx(a.Typography,{variant:"h5",gutterBottom:!0,children:Ie.MASTER_DATA_MANAGEMENT}),r.jsxs(a.Box,{className:"filters",children:[r.jsxs(a.Box,{className:"filter-field",children:[r.jsx(a.Typography,{variant:"body2",className:"field-label",children:De.SELECT_ENTITY}),r.jsx(a.Autocomplete,{options:B,getOptionLabel:s=>s.label,value:p,onChange:(s,d)=>g(d),renderInput:s=>r.jsx(a.TextField,{...s,size:"small",placeholder:Te.SELECT_ENTITY}),className:"field-input"})]}),Y.filter(s=>s.name.toLowerCase()!=="id").map(s=>r.jsxs(a.Box,{className:"filter-field",children:[r.jsx(a.Typography,{variant:"body2",className:"field-label",children:s.label}),s.dataType===ge.DATERANGE?r.jsxs(a.Box,{sx:{display:"flex",gap:1,width:"100%"},children:[r.jsx(a.TextField,{type:"date",size:"small",value:D[`${s.name}${ae.FROM}`]||"",onChange:d=>x(I=>({...I,[`${s.name}${ae.FROM}`]:d.target.value})),sx:{flex:1}}),r.jsx(a.TextField,{type:"date",size:"small",label:De.TO,value:D[`${s.name}${ae.TO}`]||"",onChange:d=>x(I=>({...I,[`${s.name}${ae.TO}`]:d.target.value})),sx:{flex:1}})]}):s.dataType===ge.DATE?r.jsx(a.TextField,{type:"date",size:"small",value:D[s.name]||"",onChange:d=>x(I=>({...I,[s.name]:d.target.value})),className:"field-input"}):s.options?r.jsx(a.Autocomplete,{options:S[s.name]||s.options,getOptionLabel:d=>d.label||String(d.value),value:S[s.name]?.find(d=>d.value===D[s.name])||null,onChange:(d,I)=>x(b=>({...b,[s.name]:I?.value||null})),renderInput:d=>r.jsx(a.TextField,{...d,size:"small",placeholder:Te.SELECT(s.label)}),className:"field-input"}):s.dataType===ge.NUMBER?r.jsx(a.TextField,{type:"number",size:"small",value:D[s.name]||"",onChange:d=>x(I=>({...I,[s.name]:d.target.value})),placeholder:Te.FILTER_BY(s.label),className:"field-input"}):r.jsx(a.TextField,{size:"small",value:D[s.name]||"",onChange:d=>x(I=>({...I,[s.name]:d.target.value})),placeholder:Te.FILTER_BY(s.label),className:"field-input"})]},s.name))]}),r.jsxs(a.Box,{className:"action-buttons",children:[r.jsx(a.Button,{variant:"contained",onClick:de,children:oe.VIEW}),r.jsx(a.Button,{variant:"contained",disabled:!p,onClick:()=>p&&u?.(p.name),children:oe.ADD_NEW_RECORD})]})]}),se&&r.jsxs(a.Box,{mt:4,width:"100%",children:[r.jsxs(a.Box,{display:"flex",justifyContent:"flex-end",mb:2,children:[r.jsx(a.Button,{variant:"outlined",onClick:re,disabled:!p,children:oe.EXPORT}),r.jsxs(a.Menu,{anchorEl:v,open:!!v,onClose:Se,children:[r.jsx(a.MenuItem,{onClick:()=>_e("csv"),children:je.CSV}),r.jsx(a.MenuItem,{onClick:()=>_e("excel"),children:je.EXCEL})]})]}),r.jsx(Tt,{rows:ie,columns:Ne,totalRecords:k,currentPage:j,loading:le,rowModelType:Ve.CLIENT_SIDE,onPageChange:G,pageSize:M,pageSizeOptions:[...Ge],onPageSizeChange:s=>{te(s),G(1)},setSort:F,sortModel:_,height:500},p?.name),r.jsxs(zt,{children:[r.jsx(a.Box,{display:"flex",alignItems:"center",gap:1,children:r.jsxs(Jt,{variant:"outlined",size:"small",children:[r.jsxs(lt,{children:[Ce.SHOWING," "]}),r.jsx(qt,{value:M,inputProps:{"aria-label":"Page size"},onChange:s=>{te(Number(s.target.value)),G(1)},children:Ge.map(s=>r.jsx(a.MenuItem,{value:s,children:s},s))}),r.jsxs(lt,{children:[Ce.OF," ",k," ",Ce.ENTRIES]})]})}),r.jsx(St,{totalRecords:k,currentPage:j,onPageChange:G,pageSize:M})]})]})]})},Or=({apiClient:n,apiEndpoints:E,entity:u,id:T,mode:i,onBack:B,onSuccess:X})=>{const p=f.useMemo(()=>ke(n,E),[n,E]),[g,Y]=f.useState({}),[O,D]=f.useState({}),[x,$]=f.useState(!1),[ee,ie]=f.useState({}),[q,k]=f.useState(!0),[N,M]=f.useState(null),te=f.useMemo(()=>Object.keys(g),[g]),j=f.useMemo(()=>te.sort((A,S)=>{const l=g[A],_=g[S];return l?.validation?.required&&!_?.validation?.required?-1:!l?.validation?.required&&_?.validation?.required?1:A.localeCompare(S)}),[te,g]);f.useEffect(()=>{if(!u)return;let A=!0;return(async()=>{k(!0),M(null);try{const l=await p.getMetadata(u);if(!A)return;const F=(l.data?.data||l.data||{}).formConfig||{};Y(F);const v={};for(const[J,U]of Object.entries(F))if(U.fieldType===xe.DROPDOWN)if(U.optionType==="API"&&U.option&&typeof U.option=="string")try{const de=((await p.getDropdownOptions(U.option)).data||[]).map(re=>({value:re.id,label:re.name||re.displayName||String(re.id)}));v[U.fieldName]=de}catch(Q){console.error(`Failed to load options for ${J}:`,Q),v[U.fieldName]=[]}else U.optionType==="Raw"&&Array.isArray(U.option)&&(v[U.fieldName]=U.option);A&&ie(v)}catch(l){console.error(ne.FAILED_LOAD_METADATA,l),A&&M(ne.FAILED_LOAD_FORM_CONFIG)}finally{A&&k(!1)}})(),()=>{A=!1}},[u,p,n]),f.useEffect(()=>{if(!u||!T||i===H.CREATE){D({});return}let A=!0;return(async()=>{$(!0),M(null);try{const l=await p.getRecord(u,T);if(!A)return;const _=l.data?.data||l.data||{},F={};for(const[v,J]of Object.entries(_))v.endsWith(Rt)||(F[v]=J);D(F)}catch(l){console.error(ne.FAILED_LOAD_RECORD,l),A&&M(ne.FAILED_LOAD_RECORD)}finally{A&&$(!1)}})(),()=>{A=!1}},[u,T,i,p]);const G=f.useCallback((A,S)=>{D(l=>({...l,[A]:S}))},[]),le=f.useCallback(()=>{const A=[];for(const[S,l]of Object.entries(g))l.validation?.required&&!O[l.fieldName]&&A.push(ne.FIELD_REQUIRED(S)),l.validation?.min!==void 0&&O[l.fieldName]<l.validation.min&&A.push(`${S} must be at least ${l.validation.min}`),l.validation?.max!==void 0&&O[l.fieldName]>l.validation.max&&A.push(`${S} must be at most ${l.validation.max}`);return A},[g,O]),K=f.useCallback(async()=>{if(!u)return;const A=le();if(A.length>0){M(A.join(", "));return}$(!0),M(null);try{const S={};for(const l of Object.values(g)){const _=l.fieldName;_&&O[_]!==void 0&&O[_]!==""&&(S[_]=O[_])}if(i===H.CREATE){const l=await p.createRecord(u,{data:S});X?.(l)}else if(T){const l=await p.updateRecord(u,T,{data:S});X?.(l)}B?.()}catch(S){console.error("Failed to save record:",S);const l=S?.response?.data?.message||(Array.isArray(S?.response?.data?.message)?S.response.data.message.join(", "):"Failed to save record. Please try again.");M(l)}finally{$(!1)}},[u,g,O,le,i,T,p,B,X]),se=f.useCallback(A=>{const S=g[A],l=S?.fieldName;if(!S||l==="id")return null;const _=O[l]??"",F=i===H.VIEW||x;return r.jsxs(a.Box,{className:"form-field",children:[r.jsxs(a.Typography,{variant:"body2",className:"field-label",children:[A,S.validation?.required&&i!==H.VIEW&&r.jsx("span",{style:{color:pt},children:_t})]}),S.fieldType===xe.DROPDOWN?r.jsx(a.Autocomplete,{options:ee[l]||[],getOptionLabel:v=>v.label||String(v.value),value:ee[l]?.find(v=>v.value===_)||null,onChange:(v,J)=>G(l,J?.value??null),disabled:F,loading:q,renderInput:v=>r.jsx(a.TextField,{...v,size:"small",placeholder:Te.SELECT(A),error:S.validation?.required&&!_&&i!==H.VIEW}),className:"field-input"}):S.fieldType===xe.DATEPICKER?r.jsx(a.TextField,{type:"date",size:"small",value:_?String(_).slice(0,10):"",onChange:v=>G(l,v.target.value),disabled:F,error:S.validation?.required&&!_&&i!==H.VIEW,className:"field-input",InputLabelProps:{shrink:!0}}):S.dataType==="number"||S.dataType==="float"?r.jsx(a.TextField,{type:"number",size:"small",value:_,onChange:v=>G(l,v.target.value),disabled:F,placeholder:A,error:S.validation?.required&&!_&&i!==H.VIEW,inputProps:{max:S.validation?.max,min:S.validation?.min,step:S.dataType==="float"?.01:1},className:"field-input"}):r.jsx(a.TextField,{size:"small",value:_,onChange:v=>G(l,v.target.value),disabled:F,placeholder:A,error:S.validation?.required&&!_&&i!==H.VIEW,inputProps:{maxLength:S.validation?.max},className:"field-input"})]},A)},[g,O,ee,G,i,x,q]);return q?r.jsx(a.Box,{className:"loading-container",display:"flex",justifyContent:"center",alignItems:"center",minHeight:"400px",children:r.jsx(a.CircularProgress,{})}):r.jsx(a.Box,{className:"master-form",children:r.jsxs(a.Paper,{className:"form-section",children:[r.jsxs(a.Typography,{variant:"h5",gutterBottom:!0,children:[i===H.CREATE?Ie.ADD_NEW_RECORD:i===H.EDIT?Ie.EDIT_RECORD:Ie.VIEW_RECORD,u&&` - ${u.charAt(0).toUpperCase()+u.slice(1)}`]}),N&&r.jsx(a.Alert,{severity:"error",onClose:()=>M(null),sx:{mb:2},children:N}),x&&i!==H.VIEW&&r.jsx(a.Box,{display:"flex",justifyContent:"center",my:2,children:r.jsx(a.CircularProgress,{size:24})}),r.jsx(a.Box,{className:"form-fields",children:j.map(se)}),r.jsx(a.Box,{className:"action-buttons",mt:3,children:i!==H.VIEW?r.jsxs(r.Fragment,{children:[r.jsx(a.Button,{variant:"contained",onClick:K,disabled:x,children:x?r.jsx(a.CircularProgress,{size:24}):i===H.CREATE?oe.CREATE:oe.UPDATE}),r.jsx(a.Button,{variant:"outlined",onClick:()=>B?.(),disabled:x,children:oe.CANCEL})]}):r.jsx(a.Button,{variant:"outlined",onClick:()=>B?.(),children:oe.BACK})})]})})},vr={ROOT:"/",MASTER:"/master",MASTER_ENTITY_NEW:n=>`/master/${n}/new`,MASTER_ENTITY_VIEW:(n,E)=>`/master/${n}/${E}`,MASTER_ENTITY_EDIT:(n,E)=>`/master/${n}/${E}/edit`},hr={ROOT:"/",MASTER:"/master",MASTER_ENTITY_NEW:"/master/:entity/new",MASTER_ENTITY_VIEW:"/master/:entity/:id",MASTER_ENTITY_EDIT:"/master/:entity/:id/edit"},yr={NEW:"new",EDIT:"edit",VIEW:"view"},Dr={ENTITY:"entity",ID:"id"},Cr={NEW:"/new",EDIT:"/edit"};exports.API_BASE_PATHS=ur;exports.API_CONFIG=cr;exports.API_ENDPOINTS=dr;exports.ARIA_LABELS=lr;exports.BUTTON_LABELS=oe;exports.COLUMN_PROPERTIES=er;exports.CSS_CLASSES=or;exports.DATA_TYPES=ge;exports.DATE_FORMATS=ir;exports.DATE_RANGE_SUFFIXES=ae;exports.DISPLAY_FIELD_SUFFIX=Rt;exports.EMPTY_STATE_MESSAGES=ar;exports.ERROR_MESSAGES=ne;exports.EXPORT_OPTIONS=je;exports.FIELD_LABELS=De;exports.FIELD_NAMES=pr;exports.FIELD_TYPES=xe;exports.FILE_EXTENSIONS=Ue;exports.FORM_MODES=H;exports.GRID_CSS_CLASSES=Et;exports.GRID_EVENT_SOURCES=ut;exports.GRID_LAYOUT=we;exports.GRID_MESSAGES=dt;exports.GRID_SETTINGS=ct;exports.GRID_TEXT=Ce;exports.GRID_TIMEOUTS=ft;exports.HTTP_METHODS=Er;exports.INPUT_TYPES=Ar;exports.LOADING_MESSAGES=nr;exports.MIME_TYPES=Ye;exports.MasterForm=Or;exports.MasterView=Ir;exports.NUMBER_INPUT=mr;exports.OPTION_TYPES=_r;exports.PAGE_SIZE_OPTIONS=Ge;exports.PAGE_TITLES=Ie;exports.PAGINATION_SETTINGS=Qt;exports.PLACEHOLDERS=Te;exports.Pagination=St;exports.QUERY_PARAMS=fr;exports.REGEX_PATTERNS=gr;exports.REQUIRED_INDICATOR=_t;exports.REQUIRED_INDICATOR_COLOR=pt;exports.RESPONSE_KEYS=Sr;exports.RESPONSE_TYPES=Tr;exports.ROUTES=vr;exports.ROUTE_KEYS=yr;exports.ROUTE_PATTERNS=hr;exports.ROUTE_SUFFIXES=Cr;exports.ROW_MODEL_TYPES=Ve;exports.SORT_ORDER=Be;exports.SORT_SETTINGS=Zt;exports.STYLE_CONSTANTS=sr;exports.SUCCESS_MESSAGES=tr;exports.ServerSideGrid=Tt;exports.URL_PARAMS=Dr;exports.VALIDATION_MESSAGES=rr;exports.VALIDATION_RULES=Rr;exports.createApiService=ke;
|