@sava-info-systems/api-maker-with-extensions 2.2.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (244) hide show
  1. package/.dockerignore +5 -1
  2. package/Dockerfile +1 -35
  3. package/Dockerfile.base +22 -0
  4. package/Dockerfile.extended-base +44 -0
  5. package/dist/1025.5c34b11ab88519fd.js +1 -0
  6. package/dist/1097.3c5b2b4587cefa6e.js +1 -0
  7. package/dist/115.8d10b2b963e7d632.js +1 -0
  8. package/dist/148.f8f560a5f818328e.js +1 -0
  9. package/dist/1558.576af7585833e289.js +1 -0
  10. package/dist/1678.14f917ee37080d63.js +1 -0
  11. package/dist/1754.fc6d6e9f6c1e96d5.js +1 -0
  12. package/dist/1928.9c9375dd036b025a.js +1 -0
  13. package/dist/1957.b718aa368330b524.js +1 -0
  14. package/dist/2140.bb097d69bcb6a1e5.js +1 -0
  15. package/dist/2295.aa3514c8d1238cb2.js +1 -0
  16. package/dist/238.553f30dbe5124419.js +1 -0
  17. package/dist/2473.260a6b26a70eaa8d.js +1 -0
  18. package/dist/2579.b02fe6a8ba3a2e71.js +1 -0
  19. package/dist/2714.b41d14f7378785df.js +1 -0
  20. package/dist/2735.4046cae4c68ac75f.js +1 -0
  21. package/dist/292.bb85e0ea91dcc118.js +1 -0
  22. package/dist/3139.5dd9289cc24b4100.js +1 -0
  23. package/dist/3450.588aafa515b19133.js +1 -0
  24. package/dist/3664.ed1232e3c70195fc.js +1 -0
  25. package/dist/3752.d4e0a280a37c1426.js +1 -0
  26. package/dist/3rdpartylicenses.txt +1 -1
  27. package/dist/4110.b9ebfd9a7382c450.js +1 -0
  28. package/dist/4186.2fd0537d5bc6d882.js +1 -0
  29. package/dist/4211.b6b9f495b100e985.js +1 -0
  30. package/dist/4575.1fee055d10b57afc.js +1 -0
  31. package/dist/4842.ccf765ed3e9753a7.js +1 -0
  32. package/dist/485.7870367c9475fed8.js +1 -0
  33. package/dist/{4895.a54759704d1994b1.js → 4895.fa7b24d66157c531.js} +1 -1
  34. package/dist/5334.e0a2450fc295f659.js +1 -0
  35. package/dist/5421.2c2c0fbf926792db.js +1 -0
  36. package/dist/5434.0997994b319a866a.js +1 -0
  37. package/dist/5679.e362a3e10cb1b953.js +1 -0
  38. package/dist/5761.6c20b09245ac31ef.js +1 -0
  39. package/dist/5765.8d761aef1708e8a1.js +1 -0
  40. package/dist/6236.969b45cad747277c.js +1 -0
  41. package/dist/6393.1b7b097f17d75290.js +1 -0
  42. package/dist/6401.f18e3c98d6deaa22.js +1 -0
  43. package/dist/6650.05ea40acd68697c3.js +1 -0
  44. package/dist/7368.85d940d08fdca6e2.js +1 -0
  45. package/dist/7436.4a62f7ef13cffb21.js +1 -0
  46. package/dist/7470.d24359dc7a3ef75a.js +1 -0
  47. package/dist/7649.8e5ff8a951b474e0.js +1 -0
  48. package/dist/7975.d3d7064d527ac017.js +1 -0
  49. package/dist/7977.85b17bdb465e9a90.js +1 -0
  50. package/dist/7987.c1637bec96a9cc03.js +1 -0
  51. package/dist/8125.8390bc1b477ec6b9.js +1 -0
  52. package/dist/8266.0bf85311cf40ddff.js +1 -0
  53. package/dist/8296.fe54c3787977fad3.js +1 -0
  54. package/dist/885.7e1ec0f82adbdd6f.js +1 -0
  55. package/dist/891.fee03277c7f1c29d.js +1 -0
  56. package/dist/{913.4580b4ce4307a40f.js → 913.e49eb351997bc25c.js} +1 -1
  57. package/dist/9243.eaa2c312b42fc4b3.js +1 -0
  58. package/dist/9575.8404e98d640fd9f9.js +1 -0
  59. package/dist/9939.537c5e355804804b.js +1 -0
  60. package/dist/assets/images/icons/api-group-light.svg +11 -0
  61. package/dist/assets/images/icons/api-group.svg +5 -5
  62. package/dist/assets/images/icons/api-maker-deployment-light.svg +5 -0
  63. package/dist/assets/images/icons/api-maker-deployment.svg +3 -3
  64. package/dist/assets/images/icons/api-user-light.svg +12 -0
  65. package/dist/assets/images/icons/api-user.svg +2 -2
  66. package/dist/assets/images/icons/comparator-light.svg +61 -0
  67. package/dist/assets/images/icons/comparator.svg +2 -2
  68. package/dist/assets/images/icons/custom-light.svg +6 -0
  69. package/dist/assets/images/icons/custom.svg +5 -5
  70. package/dist/assets/images/icons/database-light.svg +29 -0
  71. package/dist/assets/images/icons/database.svg +6 -6
  72. package/dist/assets/images/icons/db-m-light.svg +10 -0
  73. package/dist/assets/images/icons/db-m.svg +4 -4
  74. package/dist/assets/images/icons/db-token-generator-light.svg +4 -0
  75. package/dist/assets/images/icons/db-token-generator.svg +4 -0
  76. package/dist/assets/images/icons/dev-light.svg +13 -0
  77. package/dist/assets/images/icons/dev.svg +4 -4
  78. package/dist/assets/images/icons/diagram-light.svg +28 -0
  79. package/dist/assets/images/icons/diagram.svg +9 -9
  80. package/dist/assets/images/icons/event-light.svg +16 -0
  81. package/dist/assets/images/icons/event.svg +4 -4
  82. package/dist/assets/images/icons/film-movies-icon.svg +3 -3
  83. package/dist/assets/images/icons/finder-light.svg +14 -0
  84. package/dist/assets/images/icons/finder.svg +3 -3
  85. package/dist/assets/images/icons/i18n-light.svg +11 -0
  86. package/dist/assets/images/icons/i18n.svg +6 -6
  87. package/dist/assets/images/icons/increment-light.svg +5 -0
  88. package/dist/assets/images/icons/increment.svg +2 -2
  89. package/dist/assets/images/icons/license-light.svg +6 -0
  90. package/dist/assets/images/icons/license.svg +4 -4
  91. package/dist/assets/images/icons/log-light.svg +17 -0
  92. package/dist/assets/images/icons/log-profile-light.svg +23 -0
  93. package/dist/assets/images/icons/log-profile.svg +7 -7
  94. package/dist/assets/images/icons/log.svg +6 -6
  95. package/dist/assets/images/icons/masters.svg +3 -3
  96. package/dist/assets/images/icons/native-process-logs-light.svg +13 -0
  97. package/dist/assets/images/icons/native-process-logs.svg +6 -6
  98. package/dist/assets/images/icons/nodes-light.svg +5 -0
  99. package/dist/assets/images/icons/nodes.svg +2 -2
  100. package/dist/assets/images/icons/notes-light.svg +16 -0
  101. package/dist/assets/images/icons/notes.svg +2 -2
  102. package/dist/assets/images/icons/process_initializers-light.svg +20 -0
  103. package/dist/assets/images/icons/process_initializers.svg +7 -7
  104. package/dist/assets/images/icons/rsa_encryption-light.svg +6 -0
  105. package/dist/assets/images/icons/rsa_encryption.svg +2 -2
  106. package/dist/assets/images/icons/sandbox-light.svg +11 -0
  107. package/dist/assets/images/icons/sandbox.svg +2 -2
  108. package/dist/assets/images/icons/scanning-period-light.svg +13 -0
  109. package/dist/assets/images/icons/scanning-period.svg +4 -4
  110. package/dist/assets/images/icons/schedulers-light.svg +8 -0
  111. package/dist/assets/images/icons/schedulers.svg +5 -5
  112. package/dist/assets/images/icons/secret-light.svg +15 -0
  113. package/dist/assets/images/icons/secret.svg +2 -2
  114. package/dist/assets/images/icons/swagger-logo-light.svg +9 -0
  115. package/dist/assets/images/icons/swagger-logo.svg +2 -2
  116. package/dist/assets/images/icons/systems-light.svg +8 -0
  117. package/dist/assets/images/icons/systems.svg +3 -3
  118. package/dist/assets/images/icons/testing-light.svg +12 -0
  119. package/dist/assets/images/icons/testing.svg +6 -6
  120. package/dist/assets/images/icons/third-party-light.svg +19 -0
  121. package/dist/assets/images/icons/third-party.svg +4 -4
  122. package/dist/assets/images/icons/typescript-light.svg +12 -0
  123. package/dist/assets/images/icons/typescript.svg +2 -2
  124. package/dist/assets/images/icons/ui-maker-light.svg +23 -0
  125. package/dist/assets/images/icons/ui-maker.svg +10 -10
  126. package/dist/assets/images/icons/utility-light.svg +19 -0
  127. package/dist/assets/images/icons/utility.svg +2 -2
  128. package/dist/assets/images/icons/vulnerability-light.svg +20 -0
  129. package/dist/assets/images/icons/vulnerability.svg +5 -5
  130. package/dist/assets/images/icons/web-light.svg +16 -0
  131. package/dist/assets/images/icons/web.svg +3 -3
  132. package/dist/assets/images/logo/api_maker_logo_dark.svg +29 -0
  133. package/dist/assets/images/logo/api_maker_logo_full_white.svg +29 -0
  134. package/dist/assets/images/logo/api_maker_logo_light.svg +22 -0
  135. package/dist/assets/images/logo/apple-touch-icon.png +0 -0
  136. package/dist/assets/images/logo/favicon-192x192.png +0 -0
  137. package/dist/assets/images/logo/favicon-32x32.png +0 -0
  138. package/dist/assets/images/logo/favicon-512x512.png +0 -0
  139. package/dist/assets/images/logo/logo_docs-light.svg +15 -0
  140. package/dist/assets/images/logo/logo_docs.svg +3 -3
  141. package/dist/assets/images/logo/logo_store-light.svg +17 -0
  142. package/dist/assets/images/logo/logo_store.svg +3 -3
  143. package/dist/assets/images/logo/store_logo-dark.svg +11 -0
  144. package/dist/assets/images/logo/store_logo-light.svg +11 -0
  145. package/dist/assets/images/logo/store_logo.svg +2 -2
  146. package/dist/assets/primeng-theme/primeng-theme-overrides.scss +1426 -31
  147. package/dist/assets/public/diagram-viewer/data.json +1886 -0
  148. package/dist/assets/public/diagram-viewer/index.html +1228 -0
  149. package/dist/assets/public/diagram-viewer/index.js +1 -0
  150. package/dist/assets/public/monaco-editor/index.html +105 -9
  151. package/dist/assets/public/monaco-editor/index.js +1 -1
  152. package/dist/assets/public/table-viewer/index.html +738 -0
  153. package/dist/assets/public/table-viewer/index.js +1 -0
  154. package/dist/assets/schema-types/InterfaceProps.ts +71 -13
  155. package/dist/assets/schema-types/store-types.ts +2 -0
  156. package/dist/assets/schema-types/types.ts +65 -17
  157. package/dist/assets/styles/bootstrap-overrides.scss +170 -7
  158. package/dist/assets/styles/colors-dark.scss +320 -33
  159. package/dist/assets/styles/colors-light.scss +453 -9
  160. package/dist/assets/styles/out/styles.css.map +1 -1
  161. package/dist/assets/styles/styles.scss +286 -15
  162. package/dist/assets/styles/variables.scss +2 -2
  163. package/dist/bootstrap-overrides.css +1 -0
  164. package/dist/colors-dark.css +1 -0
  165. package/dist/colors-light.css +1 -0
  166. package/dist/{common.912ad7a22e5de63a.js → common.86c514055f788290.js} +1 -1
  167. package/dist/index.html +111 -27
  168. package/dist/main.0ac98a72f1b9c1dd.js +1 -0
  169. package/dist/runtime.0e9fc303007ced09.js +1 -0
  170. package/dist/styles-global.css +1 -0
  171. package/dist/{styles.242217e145c3f7ab.css → styles.c1032bc4f4d7829b.css} +1 -1
  172. package/main.js +1 -1
  173. package/package-sandbox.json +1 -1
  174. package/package.json +9 -9
  175. package/pnpm-workspace.yaml +15 -0
  176. package/sandbox.js +1 -1
  177. package/src/assets/schema-types/store-types.ts +2 -0
  178. package/src/assets/schema-types/types.ts +65 -17
  179. package/src/schema-types/store-types.js +2 -0
  180. package/src/schema-types/types.js +1 -0
  181. package/src/tools/.github/copilot-instructions.md +17 -9
  182. package/src/tools/local-client.js +1 -1
  183. package/dist/1025.a0db9347453600d0.js +0 -1
  184. package/dist/1097.d0d6fd13031aa1f0.js +0 -1
  185. package/dist/148.1dc7d9e0cfe45510.js +0 -1
  186. package/dist/1558.0aae3e5c538d3815.js +0 -1
  187. package/dist/1678.ed1e4a269e0f42bc.js +0 -1
  188. package/dist/1754.691f142aa1eabe28.js +0 -1
  189. package/dist/1928.2b376f7cf66ed038.js +0 -1
  190. package/dist/1957.ab7fda21d9978597.js +0 -1
  191. package/dist/2140.1ce150285aebe3cc.js +0 -1
  192. package/dist/2295.4fa1d4b5ff482f3a.js +0 -1
  193. package/dist/238.891233aa670bdd2b.js +0 -1
  194. package/dist/2473.4b2bb1ad5b1cc99d.js +0 -1
  195. package/dist/2579.6558b67b2d98f116.js +0 -1
  196. package/dist/2714.0d6939336a02dd0a.js +0 -1
  197. package/dist/2735.86437a8639a0c1bb.js +0 -1
  198. package/dist/292.c7c794ff29abbe37.js +0 -1
  199. package/dist/3139.0921102d181c220d.js +0 -1
  200. package/dist/3450.9b5cfc83039b02b5.js +0 -1
  201. package/dist/3664.4a1dd7f16f8b57fb.js +0 -1
  202. package/dist/4110.d108e786ecbdfd1b.js +0 -1
  203. package/dist/4186.ac3e8af0efeeac14.js +0 -1
  204. package/dist/4211.1bfe72ce0b7b2f76.js +0 -1
  205. package/dist/443.7e3946651373e09a.js +0 -1
  206. package/dist/4575.6ad36e53bd72fb6f.js +0 -1
  207. package/dist/4842.e7649d81606ad80d.js +0 -1
  208. package/dist/485.b546656b466cb8a4.js +0 -1
  209. package/dist/5334.72c1c6d89fdf136e.js +0 -1
  210. package/dist/5421.2067001c10533303.js +0 -1
  211. package/dist/5679.4e22239895c7f520.js +0 -1
  212. package/dist/5761.331ca41ab64cca92.js +0 -1
  213. package/dist/5765.2b640be5d177d794.js +0 -1
  214. package/dist/6236.6c0fc469f0c96549.js +0 -1
  215. package/dist/6393.173ecdfc3b022973.js +0 -1
  216. package/dist/6401.374823002788afe7.js +0 -1
  217. package/dist/6650.1d18ee25901d68be.js +0 -1
  218. package/dist/7368.9ebf62d518f8ad7a.js +0 -1
  219. package/dist/7436.640bf5fe48814cbe.js +0 -1
  220. package/dist/7470.b1ce7eedb9cedb2d.js +0 -1
  221. package/dist/7649.ab4744cfe713eec0.js +0 -1
  222. package/dist/7975.578a00ebd1160a1e.js +0 -1
  223. package/dist/7977.afeded970bac8b66.js +0 -1
  224. package/dist/7987.5958ad5b81873058.js +0 -1
  225. package/dist/8125.b2f908096882ed45.js +0 -1
  226. package/dist/8266.aca59a0a04590ab1.js +0 -1
  227. package/dist/8296.a387c28f5702c5e8.js +0 -1
  228. package/dist/885.be44d92efca1aaf6.js +0 -1
  229. package/dist/891.5e08c81e5200413e.js +0 -1
  230. package/dist/9243.08630ad94e1fddba.js +0 -1
  231. package/dist/9575.30ac91b65602c0ca.js +0 -1
  232. package/dist/9939.4b0d758462bcc042.js +0 -1
  233. package/dist/assets/images/logo/API Maker Logo 2021 black.svg +0 -47
  234. package/dist/assets/images/logo/API Maker Logo 2021.svg +0 -49
  235. package/dist/assets/images/logo/logo.svg +0 -41
  236. package/dist/assets/styles/out/bootstrap-overrides.css +0 -2
  237. package/dist/assets/styles/out/colors-dark.css +0 -2
  238. package/dist/assets/styles/out/colors-light.css +0 -2
  239. package/dist/assets/styles/out/monaco-editor-overrides.css +0 -2
  240. package/dist/assets/styles/out/styles.css +0 -2
  241. package/dist/assets/styles/out/variables.css +0 -2
  242. package/dist/favicon.ico +0 -0
  243. package/dist/main.d3c81428418939dc.js +0 -1
  244. package/dist/runtime.2f0f434d4763c970.js +0 -1
@@ -0,0 +1 @@
1
+ !function(){"use strict";const e={INIT:"TV_INIT",CLEAR:"TV_CLEAR",READY:"TV_READY",DATA_LOADED:"TV_DATA_LOADED",ROW_UPDATED:"TV_ROW_UPDATED",ERROR:"TV_ERROR"};let t=null,n=null,o=[];const i=new Map,r=new Map,l=new Map;let a=!1;function s(e,t){try{window.parent.postMessage({type:e,payload:t||{}},"*")}catch(e){}}function c(e,t){return["background:"+t,"border:1px solid "+e,"color:"+e,"padding:2px 9px","border-radius:3px","cursor:pointer","font-size:10px","font-family:inherit","line-height:16px","height:20px"].join(";")}function d(e,t){if(!e)return String(t);const o=n&&n.keyField||function(e){const t=["_id","id","ID","Id","guid","uuid","key"];for(let n=0;n<t.length;n++)if(void 0!==e[t[n]])return t[n];return null}(e);return o&&void 0!==e[o]&&null!==e[o]?String(e[o]):String(t)}function u(e){const n=e.data,a=e.colDef.field,s=e.newValue,c=e.oldValue,u=e.node,p=u.rowIndex;if(s===c)return;const h=d(n,p);i.has(h)||i.set(h,{changes:{},node:u,rowData:D(n)});const m=i.get(h);m.changes[a]={old:c,new:s};const y=h+"::"+a;r.has(h)&&(r.get(h).delete(a),0===r.get(h).size&&r.delete(h)),l.delete(y);const g=o[p];if(g){const e=g[a],t=null!==s&&"object"==typeof s;(null!==e&&"object"==typeof e?JSON.stringify(e):String(e??""))===(t?JSON.stringify(s):String(s??""))&&(delete m.changes[a],0===Object.keys(m.changes).length&&i.delete(h))}f(),t&&t.refreshCells({rowNodes:[u],columns:[a],force:!0})}function f(){const e=i.size,t=e>0&&!(!n||!n.isEditable),o=document.getElementById("btnSaveEdits"),r=document.getElementById("btnDiscardEdits"),l=document.getElementById("editSep"),a=document.getElementById("pendingPill");o.style.display=t?"":"none",r.style.display=t?"":"none",l.style.display=t?"":"none",a.textContent=String(e)}function p(e){const t=document.getElementById("btnAddColumn");t&&(t.style.display=e?"":"none")}function h(){if(!t)return;const e=t.getSelectedRows().length,o=document.getElementById("selCount"),i=document.getElementById("statusSep2"),r=document.getElementById("btnDeleteRows"),l=!(!n||!n.updateUrl);r&&(r.style.display=l?"":"none",r.disabled=!l||0===e),e>0?(o.textContent=e+" selected",o.style.display="",i.style.display=""):(o.style.display="none",i.style.display="none")}function m(e){const t=function(e){if(!n||!n.updateUrl)return null;const t=n.updateUrl,o=encodeURIComponent(e);if(-1!==t.indexOf("{id}"))return t.replace("{id}",o).replace(/\/update-by-id\/[^/?]+/i,"/"+o);if(-1!==t.indexOf(":id"))return t.replace(":id",o).replace(/\/update-by-id\/[^/?]+/i,"/"+o);const i=t.indexOf("?");return-1===i?t.replace(/\/+$/,"")+"/"+o:t.slice(0,i).replace(/\/+$/,"")+"/"+o+t.slice(i)}(e);if(!t)return Promise.resolve({error:"Unable to build delete URL"});const o=Object.assign({},n.headers||{});return fetch(t,{method:"DELETE",headers:o}).then((function(e){return e.ok?{ok:!0}:e.text().then((function(t){return{error:"HTTP "+e.status+(t?": "+t.slice(0,80):"")}}))})).catch((function(e){return{error:e.message}}))}function y(){if(!t)return;const e=t.getSelectedNodes();if(!e||!e.length)return void b("error","No rows selected to delete");const n=e.map((function(e){return d(e.data,e.rowIndex)})).filter(Boolean);var r,l,a;n.length?(r="Delete "+n.length+" selected row"+(1!==n.length?"s":"")+"?\n\nThis action cannot be undone.",l="Delete",a="Cancel",new Promise((function(e){const t=document.getElementById("confirmOverlay"),n=document.getElementById("confirmMessage"),o=document.getElementById("confirmOkBtn"),i=document.getElementById("confirmCancelBtn");if(!(t&&n&&o&&i))return void e(!1);n.textContent=r,o.textContent=l||"Delete",i.textContent=a||"Cancel",t.style.display="flex";const s=function(n){t.style.display="none",o.removeEventListener("click",c),i.removeEventListener("click",d),window.removeEventListener("keydown",u),e(n)},c=function(){s(!0)},d=function(){s(!1)},u=function(e){"Escape"===e.key&&(e.preventDefault(),s(!1))};o.addEventListener("click",c),i.addEventListener("click",d),window.addEventListener("keydown",u),i.focus()}))).then((function(r){r&&(b("loading","Deleting…"),S(!0),Promise.all(n.map(m)).then((function(r){S(!1);const l=[],a=new Set;if(r.forEach((function(e,t){e&&e.error?l.push(e.error):a.add(n[t])})),a.size){const n=e.filter((function(e){return a.has(d(e.data,e.rowIndex))})).map((function(e){return e.data}));t&&t.applyTransaction({remove:n}),o=o.filter((function(e,t){return!a.has(d(e,t))})),a.forEach((function(e){i.has(e)&&i.delete(e)})),f(),h(),_(o.length)}0===l.length?b("success","Deleted "+a.size+" row"+(1!==a.size?"s":"")):b("error",l.length+" delete error(s): "+l.slice(0,2).join("; "))})).catch((function(e){S(!1),b("error","Delete failed: "+e.message)})))})):b("error","Unable to determine selected row key")}function g(){if(!i.size)return;b("loading","Saving…"),S(!0);const a=[],c=[];i.forEach((function(e,t){a.push(t),c.push(function(e,t){if(!n||!n.updateUrl)return Promise.resolve({ok:!0});let o=n.updateUrl;if(-1!==o.indexOf("{id}"))o=o.replace("{id}",encodeURIComponent(e));else if(-1!==o.indexOf(":id"))o=o.replace(":id",encodeURIComponent(e));else{const t=o.indexOf("?");o=-1===t?o.replace(/\/+$/,"")+"/"+encodeURIComponent(e)+"/":o.slice(0,t).replace(/\/+$/,"")+"/"+encodeURIComponent(e)+"/"+o.slice(t)}const i=(n.updateMethod||"PUT").toUpperCase(),r=Object.assign({"Content-Type":"application/json"},n.headers||{}),l={};return Object.keys(t.changes).forEach((function(e){l[e]=t.changes[e].new})),fetch(o,{method:i,headers:r,body:JSON.stringify(l)}).then((function(e){return e.ok?{ok:!0}:e.text().then((function(t){try{const e=JSON.parse(t);if(e&&!1===e.success&&Array.isArray(e.errors)&&e.errors.length>0){const t=e.errors.map((function(e){return{field:e.field,message:e.message,action:e.action,code:e.code}}));return{error:e.errors.map((function(e){return e.message})).join("; "),fieldErrors:t}}}catch(e){}return{error:"HTTP "+e.status+(t?": "+t.slice(0,120):"")}}))})).catch((function(e){return{error:e.message}}))}(t,e))})),Promise.all(c).then((function(n){S(!1),r.clear(),l.clear();const c=n.filter((function(e){return e&&e.error})),d=n.length-c.length;if(0===c.length)i.forEach((function(e){const t=e.node.rowIndex;o[t]&&Object.keys(e.changes).forEach((function(n){o[t][n]=e.changes[n].new}))})),i.clear(),f(),t&&t.refreshCells({force:!0}),b("success","Saved "+d+" row"+(1!==d?"s":"")),s(e.ROW_UPDATED,{count:d,errors:[]});else{const o=[];n.forEach((function(e,t){if(e&&e.fieldErrors&&e.fieldErrors.length>0){const n=a[t];e.fieldErrors.forEach((function(e){r.has(n)||r.set(n,new Set),r.get(n).add(e.field),l.set(n+"::"+e.field,{message:e.message||"",action:e.action||""})}));const s=i.get(n);s&&s.node&&o.push(s.node)}})),t&&o.length>0&&t.refreshCells({rowNodes:o,force:!0});const u=c.map((function(e){return e.error}));b("error",c.length+" error(s): "+u.slice(0,2).join("; ")),s(e.ROW_UPDATED,{count:d,errors:u})}})).catch((function(e){S(!1),b("error","Save failed: "+e.message)}))}function v(){i.size&&(i.forEach((function(e){const t=o[e.node.rowIndex];if(t){const n=Object.assign({},e.node.data);Object.keys(e.changes).forEach((function(e){n[e]=t[e]})),e.node.setData(n)}})),i.clear(),f(),t&&t.refreshCells({force:!0}),b("","Edits discarded"))}function E(){new Promise((function(e){const t=document.getElementById("addColOverlay"),n=document.getElementById("addColInput"),o=document.getElementById("addColOkBtn"),i=document.getElementById("addColCancelBtn");n.value="",t.style.display="flex",setTimeout((function(){n.focus()}),50);const r=function(r){t.style.display="none",o.removeEventListener("click",l),i.removeEventListener("click",a),n.removeEventListener("keydown",s),window.removeEventListener("keydown",c),e(r)},l=function(){r(n.value.trim())},a=function(){r(null)},s=function(e){"Enter"===e.key&&(e.preventDefault(),l())},c=function(e){"Escape"===e.key&&(e.preventDefault(),r(null))};o.addEventListener("click",l),i.addEventListener("click",a),n.addEventListener("keydown",s),window.addEventListener("keydown",c)})).then((function(e){if(!e)return;const o=t&&t.getColumnDefs()||[];if(o.some((function(t){return t.field===e})))return void b("error",'Column "'+e+'" already exists');const r=!(!n||!n.isEditable),l={field:e,headerName:e,editable:r,sortable:!0,filter:"agTextColumnFilter",resizable:!0,minWidth:70,flex:1,wrapText:!1,tooltipValueGetter:function(e){return null===e.value||void 0===e.value?null:String(e.value)},valueFormatter:function(e){if(null===e.value||void 0===e.value)return"";if("object"==typeof e.value)try{return JSON.stringify(e.value)}catch(e){return"[Object]"}return String(e.value)},cellEditor:"agTextCellEditor",cellEditorParams:{useFormatter:!1},cellClass:function(t){const n=d(t.data,t.node?t.node.rowIndex:-1);return i.has(n)&&void 0!==i.get(n).changes[e]?"cell-modified":""},cellStyle:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},headerTooltip:e};t&&(t.setGridOption("columnDefs",o.concat([l])),b("success",'Column "'+e+'" added'))}))}function x(){const e=[];return t&&t.forEachNodeAfterFilterAndSort((function(t){t.data&&e.push(t.data)})),e}function w(){return t?t.getColumnDefs().map((function(e){return e.field})).filter(Boolean):[]}function b(e,t){const n=document.getElementById("statusDot"),o=document.getElementById("statusText");n.className="status-dot"+(e?" "+e:""),o.textContent=t}function S(e){document.getElementById("loadingOverlay").style.display=e?"flex":"none"}function C(e){document.getElementById("emptyState").style.display=e?"flex":"none"}function _(e){const t=document.getElementById("rowCount"),n=document.getElementById("statusSep");e>0?(t.textContent=e.toLocaleString()+" row"+(1!==e?"s":""),t.style.display="",n.style.display=""):(t.style.display="none",n.style.display="none")}function D(e){try{return JSON.parse(JSON.stringify(e))}catch(t){return e}}window.addEventListener("message",(function(a){const u=a.data;if(u&&u.type)switch(u.type){case e.INIT:n=u.payload||{},function(){if(!n||void 0===n.data||null===n.data)return C(!0),void b("","No data");b("loading","Loading…"),S(!0),a=!0,document.getElementById("emptyState").style.display=a?"none":"",setTimeout((function(){!function(a){S(!1);const u=function(e){if(!e)return[];if(Array.isArray(e))return e.filter((function(e){return null!=e}));return"object"==typeof e?[e]:[]}(a);if(!u.length)return C(!0),b("","No data"),_(0),t&&(t.setGridOption("columnDefs",[]),t.setGridOption("rowData",[])),void s(e.DATA_LOADED,{count:0});C(!1),o=D(u),i.clear(),f();const m=function(e){const t=[],o={},a=Math.min(e.length,50);for(let n=0;n<a;n++){const i=e[n];i&&"object"==typeof i&&Object.keys(i).forEach((function(e){o[e]||(o[e]=!0,t.push(e))}))}const s=!(!n||!n.isEditable);return t.map((function(t){const n=function(e,t,n){for(let o=0;o<n;o++){const n=e[o]&&e[o][t];if(null!=n)return n}return null}(e,t,a),o="number"==typeof n,u="_id"===t||"__v"===t,f=s&&!u;var p,h;return"boolean"==typeof n?(p="agCheckboxCellEditor",h={}):null!==n&&"object"==typeof n?(p=function(){function e(){}return e.prototype.init=function(e){this._params=e,this._originalType=typeof e.value,this._container=document.createElement("div"),this._container.style.cssText=["position:fixed","z-index:9999","background:#1e1e1e","border:1px solid #097BED","border-radius:5px","box-shadow:0 8px 24px rgba(0,0,0,0.5)","display:flex","flex-direction:column"].join(";"),this._ta=document.createElement("textarea"),this._ta.spellcheck=!1,this._ta.style.cssText=["background:#1e1e1e","color:#e8e8e8","border:none","outline:none","resize:none","font-family:JetBrains Mono,Menlo,Monaco,Consolas,monospace","font-size:11px","line-height:1.5","padding:8px","height:100%","width:100%","box-sizing:border-box","tab-size:2"].join(";");var t=e.value;if(null==t)this._ta.value="";else if("object"==typeof t)try{this._ta.value=JSON.stringify(t,null,2)}catch(e){this._ta.value=String(t)}else this._ta.value=String(t);this._footer=document.createElement("div"),this._footer.style.cssText=["display:flex","align-items:center","gap:6px","padding:4px 6px","border-top:1px solid #3a3a3a","background:#252525","border-radius:0 0 4px 4px"].join(";"),this._errSpan=document.createElement("span"),this._errSpan.style.cssText="flex:1;font-size:10px;color:#ED4B48;font-family:inherit;";var n=this,o=document.createElement("button");o.textContent="Save",o.style.cssText=c("#26B47F","rgba(38,180,127,0.35)"),o.addEventListener("mousedown",(function(e){e.preventDefault(),n._commit()}));var i=document.createElement("button");i.textContent="Cancel",i.style.cssText=c("#969696","#3a3a3a"),i.addEventListener("mousedown",(function(t){t.preventDefault(),e.stopEditing(!0)})),this._footer.appendChild(this._errSpan),this._footer.appendChild(i),this._footer.appendChild(o),this._container.appendChild(this._ta),this._container.appendChild(this._footer),this._ta.addEventListener("keydown",(function(t){if((t.ctrlKey||t.metaKey)&&"Enter"===t.key)t.preventDefault(),t.stopPropagation(),n._commit();else if("Enter"===t.key)t.stopPropagation();else if("Escape"===t.key)t.preventDefault(),t.stopPropagation(),e.stopEditing(!0);else if(!t.shiftKey||"Delete"!==t.key&&"Backspace"!==t.key){if("Tab"===t.key){t.preventDefault();var o=n._ta.selectionStart;i=n._ta.value;n._ta.value=i.slice(0,o)+" "+i.slice(n._ta.selectionEnd),n._ta.selectionStart=n._ta.selectionEnd=o+2}}else{t.preventDefault();var i=n._ta.value,r=n._ta.selectionStart,l=i.lastIndexOf("\n",r-1)+1,a=i.indexOf("\n",r);-1===a&&(a=i.length);var s=l,c=a<i.length?a+1:a;s===c&&l>0&&(s=l-1,c=a),n._ta.value=i.slice(0,s)+i.slice(c),n._ta.selectionStart=n._ta.selectionEnd=s}}))},e.prototype._commit=function(){var e=this._ta.value.trim();if("object"===this._originalType)try{this._parsed=JSON.parse(""===e?"null":e),this._errSpan.textContent="",this._ta.style.borderBottom="none",this._params.stopEditing(!1)}catch(e){this._errSpan.textContent="Invalid JSON — "+e.message,this._ta.style.borderBottom="2px solid #ED4B48",this._ta.focus()}else this._parsed=e,this._params.stopEditing(!1)},e.prototype.getGui=function(){return this._container},e.prototype.afterGuiAttached=function(){var e={w:window.innerWidth,h:window.innerHeight},t=Math.round(.8*e.w),n=Math.round(.8*e.h),o=Math.round((e.w-t)/2),i=Math.round((e.h-n)/2);this._container.style.left=o+"px",this._container.style.top=i+"px",this._container.style.width=t+"px",this._container.style.height=n+"px",this._ta.focus();var r=this._ta.value.length;this._ta.setSelectionRange(r,r)},e.prototype.getValue=function(){if(void 0!==this._parsed)return this._parsed;var e=this._ta.value.trim();if("object"===this._originalType)try{return JSON.parse(""===e?"null":e)}catch(t){return e}return e},e.prototype.isPopup=function(){return!0},e.prototype.isCancelAfterEnd=function(){return!1},e.prototype.focusIn=function(){this._ta.focus()},e}(),h={}):(p="agTextCellEditor",h={useFormatter:!1}),{field:t,headerName:t,editable:f,sortable:!0,filter:o?"agNumberColumnFilter":"agTextColumnFilter",resizable:!0,minWidth:70,maxWidth:600,flex:1,wrapText:!1,suppressSizeToFit:!1,tooltipValueGetter:function(e){const n=d(e.data,e.node?e.node.rowIndex:-1)+"::"+t;if(l.has(n)){const e=l.get(n);return e.message+(e.action?"\n\nAction: "+e.action:"")}return null===e.value||void 0===e.value?null:"object"==typeof e.value?JSON.stringify(e.value,null,2):String(e.value)},valueFormatter:function(e){if(null===e.value||void 0===e.value)return"";if("object"==typeof e.value)try{return JSON.stringify(e.value)}catch(e){return"[Object]"}return String(e.value)},cellEditor:p,cellEditorParams:h,cellClass:function(e){const n=d(e.data,e.node?e.node.rowIndex:-1);return r.has(n)&&r.get(n).has(t)?"cell-error":i.has(n)&&void 0!==i.get(n).changes[t]?"cell-modified":""},cellStyle:u?{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",color:"#686868"}:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},headerTooltip:t}}))}(u);t&&(t.setGridOption("columnDefs",m),t.setGridOption("rowData",u),setTimeout((function(){t&&t.autoSizeAllColumns()}),120));b("success","Loaded"),_(u.length),h(),p(!0),s(e.DATA_LOADED,{count:u.length})}(n.data)}),0);var a}();break;case e.CLEAR:!function(){o=[],i.clear(),f(),t&&(t.setGridOption("columnDefs",[]),t.setGridOption("rowData",[]));b("","Cleared"),_(0),h(),p(!1),C(!0)}()}})),document.addEventListener("DOMContentLoaded",(function(){!function(e){if(window.agGrid)return void e();let t=0;var n=setInterval((function(){if(window.agGrid)return clearInterval(n),void e();++t>100&&(clearInterval(n),document.getElementById("emptyState").querySelector("span").textContent="Failed to load AG Grid.",C(!0))}),100)}((function(){!function(){const n=document.getElementById("myGrid"),o={columnDefs:[],rowData:[],defaultColDef:{sortable:!0,resizable:!0,filter:!0,editable:!1,minWidth:70,flex:1,wrapText:!1,cellStyle:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}},rowSelection:"multiple",cellSelection:!0,rowMultiSelectWithClick:!1,enableCellTextSelection:!0,suppressScrollOnNewData:!0,stopEditingWhenCellsLoseFocus:!0,tabToNextCell:function(e){return e.nextCellPosition},onCellKeyDown:function(e){const t=e.event;if((t.ctrlKey||t.metaKey)&&"c"===t.key){const n=e.value;let o;if(null==n)o="";else if("object"==typeof n)try{o=JSON.stringify(n)}catch(e){o="[Object]"}else o=String(n);navigator.clipboard.writeText(o).catch((function(){const e=document.createElement("textarea");e.value=o,document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e)})),t.preventDefault()}},onCellValueChanged:u,onSelectionChanged:h,getRowId:function(e){return d(e.data,e.node?e.node.rowIndex:-1)},tooltipShowDelay:400,tooltipHideDelay:3e3,onGridReady:function(n){t=n.api,a=!0,s(e.READY,{})}};agGrid.createGrid(n,o)}(),document.getElementById("btnSaveEdits").addEventListener("click",g),document.getElementById("btnDiscardEdits").addEventListener("click",v),document.getElementById("btnDeleteRows").addEventListener("click",y),document.getElementById("btnAddColumn").addEventListener("click",E),document.getElementById("btnAutoSize").addEventListener("click",(function(){t&&t.autoSizeAllColumns()})),document.getElementById("btnFitGrid").addEventListener("click",(function(){t&&t.sizeColumnsToFit()})),document.getElementById("quickFilter").addEventListener("input",(function(e){t&&t.setGridOption("quickFilterText",e.target.value)}));const n=document.getElementById("exportMenu");document.getElementById("btnExport").addEventListener("click",(function(e){e.stopPropagation(),n.classList.toggle("open")})),document.addEventListener("click",(function(){n.classList.remove("open")})),document.getElementById("btnExportCsv").addEventListener("click",(function(){n.classList.remove("open"),t&&t.exportDataAsCsv({fileName:"export.csv",processCellCallback:function(e){const t=e.value;if(null==t)return"";if("object"==typeof t)try{return JSON.stringify(t)}catch(e){return""}return String(t)}})})),document.getElementById("btnExportExcel").addEventListener("click",(function(){n.classList.remove("open"),function(){if(!t||!window.XLSX)return void alert("SheetJS library not loaded. Check your network connection.");const e=x();if(!e.length)return void alert("No data to export.");const n=w(),o=[n].concat(e.map((function(e){return n.map((function(t){const n=e[t];if(null==n)return"";if("object"==typeof n)try{return JSON.stringify(n)}catch(e){return""}return n}))}))),i=XLSX.utils.aoa_to_sheet(o);i["!cols"]=n.map((function(e,t){let n=e.length;for(let e=1;e<Math.min(o.length,100);e++){const i=o[e][t];null!=i&&(n=Math.max(n,String(i).length))}return{wch:Math.min(n+2,60)}}));const r=XLSX.utils.book_new();XLSX.utils.book_append_sheet(r,i,"Data"),XLSX.writeFile(r,"export.xlsx")}()})),document.getElementById("btnExportPdf").addEventListener("click",(function(){n.classList.remove("open"),function(){if(!window.jspdf)return void alert("jsPDF library not loaded. Check your network connection.");const e=x();if(!e.length)return void alert("No data to export.");const t=new(0,window.jspdf.jsPDF)({orientation:"landscape",unit:"pt",format:"a4"}),n=w(),o=e.map((function(e){return n.map((function(t){const n=e[t];if(null==n)return"";if("object"==typeof n)try{return JSON.stringify(n)}catch(e){return""}return String(n)}))}));t.autoTable({head:[n],body:o,startY:20,styles:{fontSize:7,cellPadding:3,overflow:"ellipsize",cellWidth:"wrap",font:"helvetica",textColor:[30,30,30],lineColor:[210,210,210],lineWidth:.1},headStyles:{fillColor:[55,65,81],textColor:[255,255,255],fontStyle:"bold"},bodyStyles:{fillColor:[255,255,255],textColor:[30,30,30]},alternateRowStyles:{fillColor:[248,249,250]},margin:{top:20,left:10,right:10}}),t.save("export.pdf")}()})),document.addEventListener("keydown",(function(e){(e.ctrlKey||e.metaKey)&&"s"===e.key&&(e.preventDefault(),i.size&&g()),(e.ctrlKey||e.metaKey)&&"z"===e.key&&(e.preventDefault(),v())}))}))}))}();
@@ -40,7 +40,7 @@ export enum ITPApiSettingsProps {
40
40
  enableCaching = 'enableCaching',
41
41
  acceptOnlyEncryptedData = 'acceptOnlyEncryptedData',
42
42
  apiAccessType = 'apiAccessType',
43
- authTokenInfo = 'authTokenInfo',
43
+ authProviders = 'authProviders',
44
44
  thirdPartyApiSettingsCode = 'thirdPartyApiSettingsCode',
45
45
  resetCacheOnModificationOf = 'resetCacheOnModificationOf',
46
46
 
@@ -156,7 +156,6 @@ export enum ICustomApiProps {
156
156
  // label = 'label',
157
157
  apiDocs = 'apiDocs',
158
158
  apiAccessType = 'apiAccessType',
159
- authTokenInfo = 'authTokenInfo',
160
159
  enableCaching = 'enableCaching',
161
160
  acceptOnlyEncryptedData = 'acceptOnlyEncryptedData',
162
161
  requestMethod = 'requestMethod',
@@ -168,6 +167,8 @@ export enum ICustomApiProps {
168
167
  swaggerDocs = 'swaggerDocs',
169
168
  separateSandboxSettings = 'separateSandboxSettings',
170
169
  fileUpload = 'fileUpload',
170
+ authProviders = 'authProviders',
171
+ customApiTimeoutInSeconds = 'customApiTimeoutInSeconds',
171
172
  }
172
173
 
173
174
  export enum IGroupProps {
@@ -178,6 +179,7 @@ export enum IGroupProps {
178
179
 
179
180
  export enum IInstanceApiSettingsProps {
180
181
  guid = 'guid',
182
+ name = 'name',
181
183
  instanceName = 'instanceName',
182
184
  databaseName = 'databaseName',
183
185
  collectionName = 'collectionName',
@@ -186,13 +188,14 @@ export enum IInstanceApiSettingsProps {
186
188
  apiAccessType = 'apiAccessType',
187
189
  enableCaching = 'enableCaching',
188
190
  acceptOnlyEncryptedData = 'acceptOnlyEncryptedData',
189
- authTokenInfo = 'authTokenInfo',
191
+ authProviders = 'authProviders',
190
192
  instanceApiSettingCode = 'instanceApiSettingCode',
191
193
  instanceApiSettingCodeJS = 'instanceApiSettingCodeJS',
192
194
  }
193
195
 
194
196
  export enum IInstanceApiHooksProps {
195
197
  guid = 'guid',
198
+ name = 'name',
196
199
  instanceName = 'instanceName',
197
200
  databaseName = 'databaseName',
198
201
  collectionName = 'collectionName',
@@ -202,11 +205,13 @@ export enum IInstanceApiHooksProps {
202
205
 
203
206
  export enum IInstanceHooksProps {
204
207
  guid = 'guid',
208
+ name = 'name',
205
209
  instanceName = 'instanceName',
206
210
  user = 'user',
207
211
  }
208
212
 
209
213
  export enum IDatabaseHooksProps {
214
+ name = 'name',
210
215
  instanceName = 'instanceName',
211
216
  databaseName = 'databaseName',
212
217
  user = 'user',
@@ -215,6 +220,7 @@ export enum IDatabaseHooksProps {
215
220
 
216
221
  export enum ICollectionHooksProps {
217
222
  guid = 'guid',
223
+ name = 'name',
218
224
  instanceName = 'instanceName',
219
225
  databaseName = 'databaseName',
220
226
  collectionName = 'collectionName',
@@ -234,10 +240,12 @@ export enum IInstanceProps {
234
240
  maxPoolConnections = 'maxPoolConnections',
235
241
  active = 'active',
236
242
  connectionString = 'connectionString',
243
+ connectionStringSandbox = 'connectionStringSandbox',
237
244
  }
238
245
 
239
246
  export enum ISchemaProps {
240
247
  guid = 'guid',
248
+ name = 'name',
241
249
  instanceName = 'instanceName',
242
250
  databaseName = 'databaseName',
243
251
  collectionName = 'collectionName',
@@ -286,7 +294,7 @@ export enum ISystemApiSettingsProps {
286
294
  enableCaching = 'enableCaching',
287
295
  acceptOnlyEncryptedData = 'acceptOnlyEncryptedData',
288
296
  apiAccessType = 'apiAccessType',
289
- authTokenInfo = 'authTokenInfo',
297
+ authProviders = 'authProviders',
290
298
  }
291
299
 
292
300
  export enum ISystemApiHooksProps {
@@ -375,6 +383,7 @@ export enum IPrePostHookProps {
375
383
  hookCodeMap = 'hookCodeMap',
376
384
  isActive = 'isActive',
377
385
  runOnNativeProcess = 'runOnNativeProcess',
386
+ groupNames = 'groupNames',
378
387
  }
379
388
 
380
389
  export enum IArrayOperationBodyProps {
@@ -414,6 +423,62 @@ export enum INotesProps {
414
423
  user = 'user'
415
424
  }
416
425
 
426
+ export enum IAuthProviderProps {
427
+ guid = 'guid',
428
+ user = 'user',
429
+ name = 'name',
430
+ dbTokenGeneratorCode = 'dbTokenGeneratorCode',
431
+ dbTokenGeneratorJS = 'dbTokenGeneratorJS',
432
+ dbTokenGeneratorMap = 'dbTokenGeneratorMap',
433
+ fieldsGeneratorFunCode = 'fieldsGeneratorFunCode',
434
+ fieldsGeneratorFunJS = 'fieldsGeneratorFunJS',
435
+ fieldsGeneratorFunMap = 'fieldsGeneratorFunMap',
436
+ runOnNativeProcess = 'runOnNativeProcess',
437
+ generatorType = 'generatorType',
438
+ customTokenGeneratorFunCode = 'customTokenGeneratorFunCode',
439
+ customTokenGeneratorFunJS = 'customTokenGeneratorFunJS',
440
+ customTokenGeneratorFunMap = 'customTokenGeneratorFunMap',
441
+ customTokenValidatorFunCode = 'customTokenValidatorFunCode',
442
+ customTokenValidatorFunJS = 'customTokenValidatorFunJS',
443
+ customTokenValidatorFunMap = 'customTokenValidatorFunMap',
444
+ apiAccessType = 'apiAccessType',
445
+ instance = 'instance',
446
+ database = 'database',
447
+ collection = 'collection',
448
+ table = 'table',
449
+ usernameColumn = 'usernameColumn',
450
+ passwordColumn = 'passwordColumn',
451
+ passwordChangedAtColumn = 'passwordChangedAtColumn',
452
+ groupsColumn = 'groupsColumn',
453
+ countOfUsersForTesting = 'countOfUsersForTesting',
454
+ condition = 'condition',
455
+ sortUsersForTesting = 'sortUsersForTesting',
456
+ select = 'select',
457
+ expiresInSeconds = 'expiresInSeconds',
458
+
459
+ // AWS
460
+ cognitoUserPoolId = 'cognitoUserPoolId',
461
+ region = 'region',
462
+ tokenUse = 'tokenUse',
463
+ tokenExpiration = 'tokenExpiration',
464
+
465
+ // Azure AD
466
+ appId = 'appId',
467
+ tenant = 'tenant',
468
+ audience = 'audience',
469
+ issuer = 'issuer',
470
+ maxRetries = 'maxRetries',
471
+
472
+ // Google
473
+ clientId = 'clientId',
474
+
475
+ // Groups properties (shared across AWS / Azure / Google)
476
+ sourceFieldOfUniqueId = 'sourceFieldOfUniqueId',
477
+ groupsDataSource = 'groupsDataSource',
478
+
479
+ testObj = 'testObj',
480
+ }
481
+
417
482
  export enum IUtilityClassesProps {
418
483
  guid = 'guid',
419
484
  name = 'name',
@@ -511,15 +576,6 @@ export enum IAdminDashboardsProps {
511
576
  user = 'user'
512
577
  }
513
578
 
514
- export enum ICallApiFromBackendProps {
515
- }
516
-
517
- export enum IAuthTokenInfoProps {
518
- authTokenType = 'authTokenType',
519
- authTokenAM = 'authTokenAM',
520
- authTokenAMDB = 'authTokenAMDB',
521
- }
522
-
523
579
  export enum IAuthTokenAMProps {
524
580
  u = 'u',
525
581
  p = 'p',
@@ -530,6 +586,7 @@ export enum IRefreshTokenAMProps {
530
586
  }
531
587
 
532
588
  export enum IAuthTokenAMDBProps {
589
+ name = 'name',
533
590
  instance = 'instance',
534
591
  database = 'database',
535
592
  collection = 'collection',
@@ -614,6 +671,7 @@ export enum IAuthInfoObjectsProps {
614
671
  authGoogleGroups = 'authGoogleGroups',
615
672
  authAWSGroups = 'authAWSGroups',
616
673
  authAzureGroups = 'authAzureGroups',
674
+ authCustomGroups = 'authCustomGroups',
617
675
 
618
676
  }
619
677
 
@@ -69,6 +69,7 @@ export enum ESupportedAPIParamType {
69
69
  aws_authorization = 'aws_authorization',
70
70
  google_authorization = 'google_authorization',
71
71
  azure_authorization = 'azure_authorization',
72
+ custom_authorization = 'custom_authorization',
72
73
 
73
74
  i18n = 'i18n',
74
75
  boolean = 'boolean',
@@ -102,6 +103,7 @@ export enum EHeader {
102
103
  AUTHORIZATION_AWS = 'x-aws-authorization', // used tor EAuthTokenType
103
104
  AUTHORIZATION_GOOGLE = 'x-google-authorization', // used tor EAuthTokenType
104
105
  AUTHORIZATION_AZURE = 'x-azure-authorization', // used tor EAuthTokenType
106
+ AUTHORIZATION_CUSTOM = 'x-custom-authorization', // used tor EAuthTokenType
105
107
  RUN_IN_SANDBOX = 'x-am-run-in-sandbox',
106
108
 
107
109
  ORIGIN = 'origin',
@@ -66,6 +66,8 @@ export interface ISandboxReqAuthObj {
66
66
  authAMUser?: any;
67
67
  /** API Maker database user authentication token. */
68
68
  authAMDB?: any;
69
+ /** Custom authorization provided by user */
70
+ authCustom?: any;
69
71
 
70
72
  /** Google authentication token. */
71
73
  authGoogle?: any;
@@ -202,6 +204,11 @@ export interface IAuthInfoObjects {
202
204
  /** Groups/roles assigned to the API Maker database user. */
203
205
  authAMDBGroups?: any[]; // IGroup[]
204
206
 
207
+ /** Custom authorization token information */
208
+ authCustomInfo?: any;
209
+ /** Groups/roles assigned to the API Maker database user. */
210
+ authCustomGroups?: any[]; // IGroup[]
211
+
205
212
  /** Google authentication token information. */
206
213
  authGoogleInfo?: IAuthTokenGoogle;
207
214
  /** Groups/roles assigned to the Google authenticated user. */
@@ -788,7 +795,7 @@ export interface ISecretType {
788
795
  common?: ISecretTypeCommon; // it is general purpose secret key section.
789
796
  }
790
797
 
791
- export interface ISecretTypeCommon extends Pick<IAuthTokenInfoCommon, 'authTokenInfo'> {
798
+ export interface ISecretTypeCommon extends Pick<IAuthTokenInfoCommon, 'authProviders'> {
792
799
  hashingAlgorithm?: 'SHA256'; // change in IPropertyHashing also
793
800
  nonce?: string; // if it is available, it will be used for hashing, if not available secret will be used for hashing
794
801
 
@@ -811,8 +818,9 @@ export interface ISecretTypeCommon extends Pick<IAuthTokenInfoCommon, 'authToken
811
818
 
812
819
  export interface IAuthTokenInfo {
813
820
  authTokenType?: EAuthTokenType;
814
- authTokenAM?: IAuthTokenAM | IRefreshTokenAM;
815
- authTokenAMDB?: IAuthTokenAMDB | IRefreshTokenAM;
821
+ authTokenAM?: IAuthTokenAM;
822
+ authTokenAMDB?: IAuthTokenAMDBRequest;
823
+ authTokenCustom?: IAuthTokenAMDBRequest;
816
824
 
817
825
  authTokenAWS?: IAuthTokenAWS;
818
826
  authTokenAzureAD?: IAuthTokenAzureAD;
@@ -832,14 +840,18 @@ export interface IAuthTokenAM {
832
840
  expiresInSeconds?: number;
833
841
  }
834
842
 
835
- export interface IRefreshTokenAM {
836
- refresh_token: string;
837
- }
843
+ // export interface IRefreshTokenAM {
844
+ // name?: string;
845
+ // refresh_token: string;
846
+ // }
838
847
 
839
848
  /**
840
849
  * API Maker database user authentication configuration.
841
850
  */
842
- export interface IAuthTokenAMDB extends Partial<IAuthTokenAM> {
851
+ export interface IAuthTokenAMDB {
852
+ /** Name of DB authorization token generator. It will be used in get-token api with username & pass to generate token. */
853
+ name?: string;
854
+
843
855
  /** Database instance name. */
844
856
  instance?: string;
845
857
  /** Database name. */
@@ -860,9 +872,9 @@ export interface IAuthTokenAMDB extends Partial<IAuthTokenAM> {
860
872
  passwordChangedAtColumn?: string;
861
873
 
862
874
  /**
863
- * Column containing comma-separated group assignments.
864
- * Use "*" to grant access to all API user groups.
865
- * DB users can access APIs if they belong to at least one of the required groups.
875
+ * column name which holds values of, comma separated groups assigned to this db user.
876
+ * "*" = means all groups of api user.
877
+ * DB user can hit API if he/she has access in any of these groups.
866
878
  */
867
879
  groupsColumn?: string;
868
880
  /**
@@ -877,12 +889,19 @@ export interface IAuthTokenAMDB extends Partial<IAuthTokenAM> {
877
889
  sortUsersForTesting?: any;
878
890
  /** Fields to select from user records. */
879
891
  select?: any;
892
+ /** Token expiration time in seconds. */
893
+ expiresInSeconds?: number;
894
+ /** If true, code will be executed on native process otherwise executed on sandbox. */
895
+ runOnNativeProcess?: boolean;
896
+ }
880
897
 
881
- /**
882
- * Stringified request JSON data.
883
- * Internal field populated by the system.
884
- */
885
- __amDBRequestData?: string;
898
+ export interface IAuthTokenAMDBRequest {
899
+ /** Name of token generator */
900
+ name?: string;
901
+ /** Username. */
902
+ u: string;
903
+ /** Password. */
904
+ p: string;
886
905
  }
887
906
 
888
907
  /**
@@ -1332,6 +1351,22 @@ export interface IArrayOperation {
1332
1351
  upsert?: boolean;
1333
1352
  }
1334
1353
 
1354
+ /**
1355
+ * Request structure for token generation API calls.
1356
+ */
1357
+ export interface IGetTokenRequest {
1358
+ /** Name of token generator */
1359
+ name?: string;
1360
+ /** Username. */
1361
+ u: string;
1362
+ /** Password. */
1363
+ p: string;
1364
+ /** Refresh token for obtaining a new access token without re-authenticating. */
1365
+ refresh_token?: string;
1366
+ /** Token expiration time in seconds. Used to get only AM user token. */
1367
+ expiresInSeconds?: number;
1368
+ }
1369
+
1335
1370
  /**
1336
1371
  * Response structure for token generation API calls.
1337
1372
  */
@@ -1349,10 +1384,14 @@ export interface IGetTokenResponse {
1349
1384
 
1350
1385
  export interface IAuthTokenInfoCommon {
1351
1386
  apiAccessType?: EAPIAccessType; // api level setting
1352
- authTokenInfo?: IAuthTokenInfo[] | string; // string will point to secret path.
1387
+
1388
+ /** Provide names of token generators */
1389
+ authProviders?: string[];
1353
1390
  }
1354
1391
 
1355
1392
  export interface IInstanceApiSettingsTypes extends IAuthTokenInfoCommon {
1393
+ /** Folder name of this item in git. It has to be unique, and it can contain [a-zA-Z0-9_ -] characters only. */
1394
+ name?: string;
1356
1395
  enableCaching?: boolean; // collection level setting
1357
1396
  acceptOnlyEncryptedData?: boolean; // database & collection & api level setting
1358
1397
  }
@@ -1415,6 +1454,13 @@ export interface ICustomApiSettingsTypes extends IAuthTokenInfoCommon {
1415
1454
  */
1416
1455
  runOnNativeProcess?: boolean;
1417
1456
 
1457
+ /**
1458
+ * Maximum time (in seconds) the system will allow this custom API to complete its operation.
1459
+ * Converted to milliseconds and sent as the 'x-am-sandbox-timeout' header.
1460
+ * @default 10
1461
+ */
1462
+ customApiTimeoutInSeconds?: number;
1463
+
1418
1464
  /**
1419
1465
  * List of all possible error messages this API can return.
1420
1466
  * Used for API documentation and client-side error handling.
@@ -1612,6 +1658,8 @@ export enum EAuthTokenType {
1612
1658
  AM = 'AM',
1613
1659
  /** Database-backed user authentication. */
1614
1660
  AM_DB = 'AM_DB',
1661
+ /** Write your own logic to generate token and validate token */
1662
+ CUSTOM_TOKEN_GENERATOR = 'CUSTOM_TOKEN_GENERATOR',
1615
1663
  /** Google OAuth authentication. */
1616
1664
  GOOGLE = 'GOOGLE',
1617
1665
  /** AWS Cognito authentication. */
@@ -1829,7 +1877,7 @@ export interface IAMGlobalSysSystem {
1829
1877
  getSecret(): any; // we can call it without any param also, in store and in tp it will return object of that part.
1830
1878
  callExternalApi<T>(data: ICallApiFromBackend | ICallApiFromBackend[] | ICallApiFromBackendProcess | ICallApiFromBackendProcess[] | (ICallApiFromBackend | ICallApiFromBackendProcess)[]): Promise<ICallExternalApiResp<T>>;
1831
1879
  callExternalApi(data: ICallApiFromBackend | ICallApiFromBackend[] | ICallApiFromBackendProcess | ICallApiFromBackendProcess[] | (ICallApiFromBackend | ICallApiFromBackendProcess)[]): Promise<ICallExternalApiResp<any>>;
1832
- getToken(data: IAuthTokenInfo | IAuthTokenInfo[]): any;
1880
+ getToken(data: IGetTokenRequest | IGetTokenRequest[]): any;
1833
1881
  executeQuery(query: IExecuteQuery): any;
1834
1882
  /**
1835
1883
  * It should be used SQL based databases only.
@@ -9,7 +9,7 @@
9
9
  .card { border-radius: 0 !important;}
10
10
 
11
11
  .card-header {
12
- padding: .25rem .5rem;
12
+ padding: .25rem 1rem;
13
13
  font-weight: bold;
14
14
  border-radius: 0 !important;
15
15
  }
@@ -43,20 +43,136 @@
43
43
  .modal-header {
44
44
  line-height: 1.5rem; // to keep header text in vertically center.
45
45
  font-weight: bold;
46
+ align-items: center; // vertically centre the title + close button (Bootstrap defaults to flex-start)
46
47
  }
47
48
 
48
- .modal-header .close {
49
- padding: .25rem .5rem;
50
- margin: -0.25rem -0.5rem -0.25rem auto;
51
- //border-left: $border-style;
49
+ // New UI standard: round close button. Geometry here is theme-agnostic (same in
50
+ // dark & light); the surface/border/hover colours live in colors-dark/-light.scss.
51
+ // Covers both the in-header close button AND the absolutely-positioned close that
52
+ // some full-screen modals (e.g. the test-case layout) drop straight into .modal-content.
53
+ .modal-header .close,
54
+ .modal-content > .close {
55
+ display: inline-flex;
56
+ align-items: center;
57
+ justify-content: center;
58
+ width: 1.75rem;
59
+ height: 1.75rem;
60
+ padding: 0;
61
+ vertical-align: middle; // centre against sibling inline content (some headers wrap it in a float-right div)
62
+ border-radius: 50%;
63
+ line-height: 1;
64
+ opacity: 1; // Bootstrap dims .close to 0.5 by default
65
+ transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease;
66
+
67
+ // the X glyph sits centred; sized to the round button
68
+ span { display: inline-flex; }
69
+ i { font-size: 0.95rem; line-height: 1; }
70
+
71
+ // Normalise the close glyph app-wide. Modals use three different close icons:
72
+ // fa-window-close (\f410, boxy square) · fa-times-circle (\f057, circled X)
73
+ // · fa-times (\f00d, plain X). The first two read as a "box/circle inside the
74
+ // round button". Force them all to a clean plain X (\f00d) so every modal's
75
+ // round close button is identical, without editing each template.
76
+ // (Font Awesome 5 Free, solid weight 900.)
77
+ i.fa-window-close::before,
78
+ i.fa-times-circle::before { content: "\f00d"; }
79
+ }
80
+ // Flush-right only when it's a flex child of the header (not the absolutely-positioned variant).
81
+ .modal-header .close { margin: 0 0 0 auto; }
82
+ // Absolutely-positioned corner close (test-case / system-logs full-screen modals): its sibling
83
+ // action icons sit at the same inline `top: 0.25rem` but on a 1.3rem (`line-height-1-3`) line, so
84
+ // their centre is at 0.9rem; the 1.75rem round button pinned at the same top centres at 1.125rem —
85
+ // ~0.225rem lower. Pull it up by exactly that half-height difference so it lines up with the icons.
86
+ .modal-content > .close { margin-top: -0.225rem; }
87
+ .modal-header .close:hover,
88
+ .modal-header .close:focus { opacity: 1; outline: none; }
89
+
90
+ // Some modals group the close button with a docs link / info icon in a
91
+ // `float-right` wrapper. Those children have different heights (e.g. the 25px
92
+ // docs logo), so on a shared inline baseline the round close button reads as
93
+ // off-centre. Lay the wrapper out as a centred flex row so every action—incl.
94
+ // the close button—sits on one vertically-centred line. Order keeps Close last.
95
+ .modal-header > .float-right {
96
+ float: none !important;
97
+ display: inline-flex;
98
+ align-items: center;
99
+ gap: 0.65rem; // even, comfortable spacing between header actions (docs / info / close)
100
+ margin-left: auto; // push the action group to the right edge…
101
+ padding-left: 1rem; // …but never let it crowd the title text
102
+ }
103
+ .modal-header > .float-right .close { margin: 0; order: 1; }
104
+
105
+ // New UI standard: header action icons (docs logo + info / help glyphs) share a
106
+ // consistent size and sit centred next to the round close button. Drop the ad-hoc
107
+ // inline sizing/margins (font-size:25px, ml-2/3, mt-n1/n2) the templates carry.
108
+ .modal-header > .float-right {
109
+ // Docs wordmark logo — fixed height (the SVG is 235×145, so width auto keeps ratio),
110
+ // a touch recessed, brightening on hover like a link.
111
+ a {
112
+ display: inline-flex;
113
+ align-items: center;
114
+ margin: 0 !important;
115
+ }
116
+ img {
117
+ height: 20px !important;
118
+ width: auto !important;
119
+ margin: 0 !important; // neutralise mt-n1/n2 + ml/mr that skewed centring
120
+ opacity: 0.9;
121
+ transition: opacity 0.15s ease;
122
+ }
123
+ a:hover img { opacity: 1; }
124
+
125
+ // Info / help action — normalise the inline font-size:1.4em + harsh text-info to
126
+ // a consistent glyph that matches the close button's scale and brand colour.
127
+ > span {
128
+ font-size: 1rem !important;
129
+ display: inline-flex;
130
+ align-items: center;
131
+ margin: 0 !important;
132
+ }
133
+ > span i { font-size: 1.15rem; line-height: 1; transition: color 0.15s ease; }
52
134
  }
53
135
 
54
136
  .nav-link { padding: 0.5rem 1rem !important;}
55
137
 
138
+ // Pin navbar item metrics so swapping bootswatch themes (slate <-> cerulean) can't reflow the
139
+ // navbar (prevents the menu "dancing" on dark/light toggle). Theme-agnostic — same in both modes.
140
+ .navbar { min-height: 44px; }
141
+ .navbar-nav .nav-link {
142
+ padding: 0.5rem 1rem !important;
143
+ line-height: 1.5 !important;
144
+ font-size: $font-size !important;
145
+ font-weight: 400 !important;
146
+ }
147
+ .navbar-nav .nav-link.active,
148
+ .navbar-nav .nav-item.show > .nav-link { font-weight: 400 !important; } // no bold jump on active
149
+
150
+ // Menu (dropdown) separator — brand-tinted hairline, visible in both themes.
151
+ .dropdown-divider {
152
+ border-top: 1px solid rgba(97, 175, 239, 0.20);
153
+ margin: 0.3rem 0.5rem;
154
+ }
155
+
156
+ // Pin heading sizes so the bootswatch slate/cerulean swap renders them identically (same in dark & light).
157
+ h1, .h1 { font-size: 2.5rem !important; }
158
+ h2, .h2 { font-size: 2rem !important; }
159
+ h3, .h3 { font-size: 1.75rem !important; }
160
+ h4, .h4 { font-size: 1.40625rem !important; }
161
+ h5, .h5 { font-size: 1.171875rem !important; }
162
+ h6, .h6 { font-size: 0.9375rem !important; }
163
+
164
+ // Heading standard (theme-agnostic) — spacing/weight/line-height. Color is set per theme.
165
+ h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 {
166
+ margin-bottom: 0.5rem;
167
+ font-weight: 500;
168
+ line-height: 1.2;
169
+ }
170
+
56
171
  .nav-pills .nav-link, .nav-tabs .nav-link, .nav-tabs .nav-link:hover {color: var(--content-primary--shade--four);}
57
172
 
58
173
  .navbar-brand {
59
- padding-top: 0.3125rem !important;
174
+ //padding-top: 0.3125rem !important;
175
+ padding-top: 0 !important;
60
176
  padding-bottom: 0.3125rem !important;
61
177
  font-size: 1.25rem !important;
62
178
  }
@@ -67,7 +183,28 @@
67
183
  border: none !important;
68
184
  }
69
185
 
70
- .form-control-sm, .col-form-label-sm { font-size: $font-size;}
186
+ // ==== Consistent input HEIGHT across both themes ====
187
+ // bootswatch slate (dark) and cerulean (light) ship DIFFERENT .form-control padding +
188
+ // font-size, and since the height is calc(1.5em + padding + 2px) (em-based) the inputs
189
+ // render at different heights per theme. Pin font-size + padding + line-height + border
190
+ // so every input is identical in dark & light, everywhere in the app.
191
+ .form-control {
192
+ font-size: $font-size !important; // 0.875rem
193
+ padding: 0.375rem 0.75rem !important;
194
+ line-height: 1.5 !important;
195
+ border-width: 1px !important;
196
+ height: calc(1.5em + 0.75rem + 2px) !important;
197
+ }
198
+ .form-control-sm, .col-form-label-sm { font-size: $font-size !important; }
199
+ .form-control-sm {
200
+ padding: 0.25rem 0.5rem !important;
201
+ line-height: 1.5 !important;
202
+ border-width: 1px !important;
203
+ height: calc(1.5em + 0.5rem + 2px) !important;
204
+ }
205
+ // input-group prefix/suffix boxes must match the input height (same padding/line-height/font).
206
+ .input-group-sm .input-group-text, .input-group-sm .form-control { font-size: $font-size !important; }
207
+ textarea.form-control, textarea.form-control-sm { height: auto !important; } // textareas size to rows
71
208
 
72
209
  //.modal-content { max-height: calc(100vh - 72px);}
73
210
  .modal-content { max-height: calc(100vh - 68px); } // 72px is giving scroll in case of log profile.
@@ -92,3 +229,29 @@
92
229
 
93
230
  // file upload classes
94
231
  .custom-file-input:lang(en) ~ .custom-file-label::after {padding: 5px; height: 30px;}
232
+
233
+ // Override Bootswatch's harsh .btn black border + text-shadow (doesn't suit the brand gradient buttons).
234
+ .btn {
235
+ border-color: transparent;
236
+ text-shadow: none;
237
+ }
238
+
239
+ // ==== Consistent button HEIGHT + font across both themes ====
240
+ // Same root cause as inputs: bootswatch slate (dark) uses padding 0.75rem 1rem / font 0.9375rem,
241
+ // cerulean (light) uses 0.375rem 0.75rem / font 1rem — so buttons render at different heights per
242
+ // theme. Pin font-size + padding + line-height + border so buttons are identical in dark & light.
243
+ // EXCLUDE explicitly-sized icon buttons (.btn-xsm-custom, .btn-icon-only) — they set their
244
+ // own width/height/padding and must not be re-padded by these consistency rules.
245
+ .btn:not(.btn-xsm-custom):not(.btn-icon-only) {
246
+ font-size: $font-size !important; // 0.875rem
247
+ padding: 0.375rem 0.75rem !important;
248
+ line-height: 1.5 !important;
249
+ border-width: 1px !important;
250
+ }
251
+ .btn-sm:not(.btn-xsm-custom):not(.btn-icon-only),
252
+ .btn-group-sm > .btn:not(.btn-xsm-custom):not(.btn-icon-only) {
253
+ font-size: $font-size !important;
254
+ padding: 0.25rem 0.5rem !important;
255
+ line-height: 1.5 !important;
256
+ border-width: 1px !important;
257
+ }