@dasidev/dasi-ui 1.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 (450) hide show
  1. package/README.md +346 -0
  2. package/bin/dasi-cli.cjs +184 -0
  3. package/dist/date-selector-test-BlukYeWl.js +91 -0
  4. package/dist/favicon.ico +0 -0
  5. package/dist/html2canvas.esm-CKxSAI8P.js +4886 -0
  6. package/dist/img/brand/ic_pln.svg +12 -0
  7. package/dist/img/brand/mapp_power_logo.svg +21 -0
  8. package/dist/img/common/pltu_ulumbu_flores_ntt.jpeg +0 -0
  9. package/dist/index-BQSA2aPs.js +126556 -0
  10. package/dist/index.es-DQWt-PZn.js +5769 -0
  11. package/dist/index.es.js +11 -0
  12. package/dist/index.umd.js +8564 -0
  13. package/dist/informasi-gudang-BmoEy2RL.js +164 -0
  14. package/dist/informasi-gudang-DXfS46Nh.js +50 -0
  15. package/dist/purify.es-C-9oolON.js +546 -0
  16. package/dist/scripts/pdf.worker.min.js +29 -0
  17. package/dist/scripts/pdf.worker.min.mjs +29 -0
  18. package/dist/scripts/pdf.worker.mjs +57722 -0
  19. package/dist/scripts/pdf.worker.mjs.map +1 -0
  20. package/dist/style.css +1 -0
  21. package/dist/test-schema-JFghGc0_.js +8 -0
  22. package/dist/test-schema-uusFsJe4.js +438 -0
  23. package/dist/types-l0sNRNKZ.js +1 -0
  24. package/package.json +178 -0
  25. package/src/App.vue +18 -0
  26. package/src/__tests__/index.test.ts +9 -0
  27. package/src/api/api.ts +117 -0
  28. package/src/assets/app-selector.svg +3 -0
  29. package/src/assets/dasi.png +0 -0
  30. package/src/assets/foto_ss.svg +21 -0
  31. package/src/assets/icons/circle-blue.svg +4 -0
  32. package/src/assets/icons/circle-gray.svg +15 -0
  33. package/src/assets/icons/circle-green.svg +4 -0
  34. package/src/assets/icons/circle-orange.svg +4 -0
  35. package/src/assets/icons/circle-purple.svg +4 -0
  36. package/src/assets/icons/circle-red.svg +15 -0
  37. package/src/assets/icons/harbor.svg +12 -0
  38. package/src/assets/icons/ic-box-red.svg +8 -0
  39. package/src/assets/icons/ic-chevron-right.svg +1 -0
  40. package/src/assets/icons/ic-loading.svg +9 -0
  41. package/src/assets/icons/ic-reset.svg +16 -0
  42. package/src/assets/icons/ic-sailing.svg +5 -0
  43. package/src/assets/icons/icon-app-selector.svg +3 -0
  44. package/src/assets/icons/icon-browser-check.svg +4 -0
  45. package/src/assets/icons/icon-calendar.svg +3 -0
  46. package/src/assets/icons/icon-chart-bar.svg +3 -0
  47. package/src/assets/icons/icon-chart-doc.svg +16 -0
  48. package/src/assets/icons/icon-chart-line.svg +10 -0
  49. package/src/assets/icons/icon-chart-mix.svg +15 -0
  50. package/src/assets/icons/icon-chart-pie.svg +11 -0
  51. package/src/assets/icons/icon-continue.svg +12 -0
  52. package/src/assets/icons/icon-dashboard-2.svg +17 -0
  53. package/src/assets/icons/icon-dashboard.svg +3 -0
  54. package/src/assets/icons/icon-data-kelistrikan.svg +19 -0
  55. package/src/assets/icons/icon-data-sentral.svg +11 -0
  56. package/src/assets/icons/icon-database.svg +5 -0
  57. package/src/assets/icons/icon-desktop.svg +3 -0
  58. package/src/assets/icons/icon-download.svg +13 -0
  59. package/src/assets/icons/icon-energi-primer.svg +12 -0
  60. package/src/assets/icons/icon-faba-apk2.svg +11 -0
  61. package/src/assets/icons/icon-faba.svg +11 -0
  62. package/src/assets/icons/icon-factory.svg +14 -0
  63. package/src/assets/icons/icon-globe-doc.svg +19 -0
  64. package/src/assets/icons/icon-ikk.svg +10 -0
  65. package/src/assets/icons/icon-kbb.svg +13 -0
  66. package/src/assets/icons/icon-kos.svg +16 -0
  67. package/src/assets/icons/icon-kpi-bod.svg +15 -0
  68. package/src/assets/icons/icon-kss.svg +14 -0
  69. package/src/assets/icons/icon-map.svg +12 -0
  70. package/src/assets/icons/icon-monitoring-harian.svg +13 -0
  71. package/src/assets/icons/icon-notification.svg +4 -0
  72. package/src/assets/icons/icon-overview.svg +17 -0
  73. package/src/assets/icons/icon-pltu.svg +13 -0
  74. package/src/assets/icons/icon-sebaran-sentral.svg +12 -0
  75. package/src/assets/icons/icon-select-data-kelistrikan.svg +19 -0
  76. package/src/assets/icons/icon-select-data-sentral.svg +11 -0
  77. package/src/assets/icons/icon-select-energi-primer.svg +12 -0
  78. package/src/assets/icons/icon-select-faba-apk2.svg +11 -0
  79. package/src/assets/icons/icon-select-ikk.svg +10 -0
  80. package/src/assets/icons/icon-select-kbb.svg +13 -0
  81. package/src/assets/icons/icon-select-kos.svg +16 -0
  82. package/src/assets/icons/icon-select-kpi-bod.svg +15 -0
  83. package/src/assets/icons/icon-select-kss.svg +14 -0
  84. package/src/assets/icons/icon-select-monitoring-harian.svg +13 -0
  85. package/src/assets/icons/icon-select-overview.svg +17 -0
  86. package/src/assets/icons/icon-select-sebaran-sentral.svg +12 -0
  87. package/src/assets/icons/icon-sentral-white.svg +13 -0
  88. package/src/assets/icons/icon-shipping.svg +5 -0
  89. package/src/assets/icons/icon-sort.svg +5 -0
  90. package/src/assets/icons/icon-tree-box.svg +14 -0
  91. package/src/assets/icons/icon-warehouse.svg +12 -0
  92. package/src/assets/icons/pin-green.svg +3 -0
  93. package/src/assets/icons/pin-orange.svg +3 -0
  94. package/src/assets/icons/pin-purple.svg +3 -0
  95. package/src/assets/icons/ship.svg +3 -0
  96. package/src/assets/icons/shipment/icon-antri.svg +15 -0
  97. package/src/assets/icons/shipment/icon-bongkar.svg +4 -0
  98. package/src/assets/icons/shipment/icon-invoice.svg +6 -0
  99. package/src/assets/icons/shipment/icon-loading.svg +8 -0
  100. package/src/assets/icons/shipment/icon-pembayaran.svg +13 -0
  101. package/src/assets/icons/shipment/icon-pengiriman.svg +4 -0
  102. package/src/assets/icons/shipment/icon-sailing.svg +4 -0
  103. package/src/assets/icons/shipment/icon-shipment-completed.svg +6 -0
  104. package/src/assets/icons/shipment/icon-shipment-in-progress.svg +6 -0
  105. package/src/assets/icons/shipment/icon-shipment-over-sla.svg +6 -0
  106. package/src/assets/icons/shipment/icon-spt.svg +4 -0
  107. package/src/assets/icons/shipment/icon-total-shipment.svg +4 -0
  108. package/src/assets/icons/upload_doc_icon.svg +42 -0
  109. package/src/assets/icons/upload_icon_blue.svg +14 -0
  110. package/src/assets/login-bg-day-min.jpg +0 -0
  111. package/src/assets/login-bg-night-min.jpg +0 -0
  112. package/src/assets/login-bg.jpg +0 -0
  113. package/src/assets/login-day.png +0 -0
  114. package/src/assets/login-night.png +0 -0
  115. package/src/assets/lucide-circle-plus-blue.svg +1 -0
  116. package/src/assets/pdf-logo.svg +11 -0
  117. package/src/assets/pemasok-card-bg.svg +6 -0
  118. package/src/assets/success_animation.gif +0 -0
  119. package/src/assets/success_animation.mp4 +0 -0
  120. package/src/assets/success_animation.webm +0 -0
  121. package/src/components/button/BtnAddOutline.vue +14 -0
  122. package/src/components/button/BtnCircle.vue +10 -0
  123. package/src/components/button/BtnOutline.vue +15 -0
  124. package/src/components/button/BtnPrimary.vue +25 -0
  125. package/src/components/button/BtnSecondary.vue +26 -0
  126. package/src/components/detail/AccountDetailTimeline.vue +144 -0
  127. package/src/components/detail/ApprovalInfo.vue +288 -0
  128. package/src/components/detail/DCI2.vue +164 -0
  129. package/src/components/detail/DetailContentHeader.vue +83 -0
  130. package/src/components/detail/DetailContentItem.vue +186 -0
  131. package/src/components/detail/DetailContentItems.vue +388 -0
  132. package/src/components/detail/DetailContentLoading.vue +12 -0
  133. package/src/components/detail/DetailContentTablet.vue +10 -0
  134. package/src/components/detail/DetailSheet.vue +294 -0
  135. package/src/components/detail/DetailTimeline.vue +191 -0
  136. package/src/components/detail/DocApprovalDialog.vue +29 -0
  137. package/src/components/detail/DocViewerContent.vue +991 -0
  138. package/src/components/dialog/ConfirmDialog.vue +96 -0
  139. package/src/components/dialog/DialogBase.vue +53 -0
  140. package/src/components/dialog/DialogSelect.vue +212 -0
  141. package/src/components/dialog/ErrorDialog.vue +63 -0
  142. package/src/components/dialog/FormDialog.vue +141 -0
  143. package/src/components/dialog/FormInputerDialog.vue +91 -0
  144. package/src/components/dialog/InfoDialog.vue +74 -0
  145. package/src/components/dialog/SuccessDialog.vue +51 -0
  146. package/src/components/examples/TestSchemaExample.vue +288 -0
  147. package/src/components/forms/auth/LoginForm.vue +806 -0
  148. package/src/components/forms/auth/PwdScore.vue +68 -0
  149. package/src/components/helper/ApiTester.vue +153 -0
  150. package/src/components/helper/ChangePwd.vue +150 -0
  151. package/src/components/helper/CheckboxElement.vue +43 -0
  152. package/src/components/helper/ConfigSwitcher.vue +54 -0
  153. package/src/components/helper/Copyright.vue +10 -0
  154. package/src/components/helper/ErrorScreen.vue +40 -0
  155. package/src/components/helper/LucideIcon.vue +27 -0
  156. package/src/components/helper/PdfViewer.vue +103 -0
  157. package/src/components/helper/PinInputer.vue +205 -0
  158. package/src/components/helper/PrivacyPolicy.vue +122 -0
  159. package/src/components/layout/PageActivityHeader.vue +48 -0
  160. package/src/components/layout/PageHeader.vue +70 -0
  161. package/src/components/loadings/LoadingDialog.vue +29 -0
  162. package/src/components/loadings/LoadingDialogSpin.vue +25 -0
  163. package/src/components/loadings/LoadingIndicator.vue +38 -0
  164. package/src/components/loadings/LoadingScreen.vue +23 -0
  165. package/src/components/notif/Notif.vue +103 -0
  166. package/src/components/notif/NotifItem.vue +41 -0
  167. package/src/components/pages/Header.vue +431 -0
  168. package/src/components/pages/Leftbar.vue +417 -0
  169. package/src/components/pages/PageActivity.vue +108 -0
  170. package/src/components/pages/PageActivityContent.vue +597 -0
  171. package/src/components/pages/PageContentTable.vue +589 -0
  172. package/src/components/pages/PageTab.vue +84 -0
  173. package/src/components/selector/BaseSelector.vue +1136 -0
  174. package/src/components/selector/ConfigDataSelector.vue +136 -0
  175. package/src/components/settings/SettingsItem.vue +38 -0
  176. package/src/components/tab/TabView.vue +11 -0
  177. package/src/components/tab/TabViewItem.vue +18 -0
  178. package/src/components/tab/TabViewItemBar.vue +9 -0
  179. package/src/components/tables/CellHover.vue +65 -0
  180. package/src/components/tables/DashboardDataTable.vue +707 -0
  181. package/src/components/tables/DataStatusTag.vue +52 -0
  182. package/src/components/tables/DataTable.vue +156 -0
  183. package/src/components/tables/DataTableAccordion.vue +249 -0
  184. package/src/components/tables/DataTableActionRow.vue +64 -0
  185. package/src/components/tables/DataTableCell.vue +272 -0
  186. package/src/components/tables/DataTableHeader.vue +60 -0
  187. package/src/components/tables/DataTableRow.vue +213 -0
  188. package/src/components/tables/ExpandedTable.vue +259 -0
  189. package/src/components/tables/PageTable.vue +73 -0
  190. package/src/components/tables/Pagination.vue +98 -0
  191. package/src/components/tables/dropdown/BaseDropdownTable.vue +140 -0
  192. package/src/components/tables/dropdown/DropdownTableActivity.vue +33 -0
  193. package/src/components/tables/dropdown/DropdownTableAsset.vue +30 -0
  194. package/src/components/tables/dropdown/DropdownTableConfig.vue +30 -0
  195. package/src/components/tables/dropdown/DropdownTableDataKonektor.vue +31 -0
  196. package/src/components/tables/dropdown/DropdownTableDataLabel.vue +30 -0
  197. package/src/components/tables/dropdown/DropdownTableDataSchema.vue +31 -0
  198. package/src/components/tables/dropdown/DropdownTableFabaPemanfaat.vue +30 -0
  199. package/src/components/tables/dropdown/DropdownTableGroup.vue +36 -0
  200. package/src/components/tables/dropdown/DropdownTableHalaman.vue +33 -0
  201. package/src/components/tables/dropdown/DropdownTableLevel.vue +66 -0
  202. package/src/components/tables/dropdown/DropdownTableOrganization.vue +47 -0
  203. package/src/components/tables/dropdown/DropdownTablePengelola.vue +28 -0
  204. package/src/components/tables/dropdown/DropdownTableQueryLayer.vue +29 -0
  205. package/src/components/tables/dropdown/DropdownTableSentral.vue +33 -0
  206. package/src/components/tables/dropdown/DropdownTableWarehouse.vue +30 -0
  207. package/src/components/tables/dropdown/TableDropdown.vue +52 -0
  208. package/src/components/ui/accordion/Accordion.vue +19 -0
  209. package/src/components/ui/accordion/AccordionContent.vue +24 -0
  210. package/src/components/ui/accordion/AccordionItem.vue +24 -0
  211. package/src/components/ui/accordion/AccordionTrigger.vue +42 -0
  212. package/src/components/ui/accordion/index.ts +4 -0
  213. package/src/components/ui/alert-dialog/AlertDialog.vue +14 -0
  214. package/src/components/ui/alert-dialog/AlertDialogAction.vue +20 -0
  215. package/src/components/ui/alert-dialog/AlertDialogCancel.vue +20 -0
  216. package/src/components/ui/alert-dialog/AlertDialogContent.vue +42 -0
  217. package/src/components/ui/alert-dialog/AlertDialogDescription.vue +25 -0
  218. package/src/components/ui/alert-dialog/AlertDialogFooter.vue +21 -0
  219. package/src/components/ui/alert-dialog/AlertDialogHeader.vue +16 -0
  220. package/src/components/ui/alert-dialog/AlertDialogTitle.vue +22 -0
  221. package/src/components/ui/alert-dialog/AlertDialogTrigger.vue +11 -0
  222. package/src/components/ui/alert-dialog/index.ts +9 -0
  223. package/src/components/ui/avatar/Avatar.vue +24 -0
  224. package/src/components/ui/avatar/AvatarFallback.vue +11 -0
  225. package/src/components/ui/avatar/AvatarImage.vue +9 -0
  226. package/src/components/ui/avatar/UsersAvatar.vue +28 -0
  227. package/src/components/ui/avatar/index.ts +24 -0
  228. package/src/components/ui/button/Button.vue +27 -0
  229. package/src/components/ui/button/index.ts +34 -0
  230. package/src/components/ui/calendar/Calendar.vue +325 -0
  231. package/src/components/ui/calendar/index.ts +22 -0
  232. package/src/components/ui/checkbox/Checkbox.vue +33 -0
  233. package/src/components/ui/checkbox/index.ts +1 -0
  234. package/src/components/ui/command/Command.vue +30 -0
  235. package/src/components/ui/command/CommandDialog.vue +21 -0
  236. package/src/components/ui/command/CommandEmpty.vue +20 -0
  237. package/src/components/ui/command/CommandGroup.vue +29 -0
  238. package/src/components/ui/command/CommandInput.vue +33 -0
  239. package/src/components/ui/command/CommandItem.vue +26 -0
  240. package/src/components/ui/command/CommandList.vue +27 -0
  241. package/src/components/ui/command/CommandSeparator.vue +23 -0
  242. package/src/components/ui/command/CommandShortcut.vue +14 -0
  243. package/src/components/ui/command/index.ts +9 -0
  244. package/src/components/ui/context-menu/ContextMenu.vue +15 -0
  245. package/src/components/ui/context-menu/ContextMenuCheckboxItem.vue +40 -0
  246. package/src/components/ui/context-menu/ContextMenuContent.vue +36 -0
  247. package/src/components/ui/context-menu/ContextMenuGroup.vue +11 -0
  248. package/src/components/ui/context-menu/ContextMenuItem.vue +34 -0
  249. package/src/components/ui/context-menu/ContextMenuLabel.vue +25 -0
  250. package/src/components/ui/context-menu/ContextMenuPortal.vue +11 -0
  251. package/src/components/ui/context-menu/ContextMenuRadioGroup.vue +19 -0
  252. package/src/components/ui/context-menu/ContextMenuRadioItem.vue +40 -0
  253. package/src/components/ui/context-menu/ContextMenuSeparator.vue +20 -0
  254. package/src/components/ui/context-menu/ContextMenuShortcut.vue +14 -0
  255. package/src/components/ui/context-menu/ContextMenuSub.vue +19 -0
  256. package/src/components/ui/context-menu/ContextMenuSubContent.vue +35 -0
  257. package/src/components/ui/context-menu/ContextMenuSubTrigger.vue +34 -0
  258. package/src/components/ui/context-menu/ContextMenuTrigger.vue +13 -0
  259. package/src/components/ui/context-menu/index.ts +14 -0
  260. package/src/components/ui/datetime/DatetimeRangeComponent.vue +52 -0
  261. package/src/components/ui/dialog/Dialog.vue +14 -0
  262. package/src/components/ui/dialog/DialogClose.vue +11 -0
  263. package/src/components/ui/dialog/DialogContent.vue +53 -0
  264. package/src/components/ui/dialog/DialogDescription.vue +24 -0
  265. package/src/components/ui/dialog/DialogFooter.vue +19 -0
  266. package/src/components/ui/dialog/DialogHeader.vue +16 -0
  267. package/src/components/ui/dialog/DialogScrollContent.vue +59 -0
  268. package/src/components/ui/dialog/DialogTitle.vue +29 -0
  269. package/src/components/ui/dialog/DialogTrigger.vue +11 -0
  270. package/src/components/ui/dialog/index.ts +9 -0
  271. package/src/components/ui/dropdown-menu/DropdownMenu.vue +14 -0
  272. package/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +40 -0
  273. package/src/components/ui/dropdown-menu/DropdownMenuContent.vue +38 -0
  274. package/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +11 -0
  275. package/src/components/ui/dropdown-menu/DropdownMenuItem.vue +28 -0
  276. package/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +24 -0
  277. package/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +19 -0
  278. package/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +41 -0
  279. package/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +22 -0
  280. package/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +14 -0
  281. package/src/components/ui/dropdown-menu/DropdownMenuSub.vue +19 -0
  282. package/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +30 -0
  283. package/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +33 -0
  284. package/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +13 -0
  285. package/src/components/ui/dropdown-menu/index.ts +16 -0
  286. package/src/components/ui/form/FormControl.vue +16 -0
  287. package/src/components/ui/form/FormDescription.vue +20 -0
  288. package/src/components/ui/form/FormItem.vue +25 -0
  289. package/src/components/ui/form/FormLabel.vue +23 -0
  290. package/src/components/ui/form/FormMessage.vue +16 -0
  291. package/src/components/ui/form/index.ts +6 -0
  292. package/src/components/ui/form/useFormField.ts +30 -0
  293. package/src/components/ui/hover-card/HoverCard.vue +14 -0
  294. package/src/components/ui/hover-card/HoverCardContent.vue +41 -0
  295. package/src/components/ui/hover-card/HoverCardTrigger.vue +11 -0
  296. package/src/components/ui/hover-card/index.ts +3 -0
  297. package/src/components/ui/input/Input.vue +24 -0
  298. package/src/components/ui/input/index.ts +1 -0
  299. package/src/components/ui/label/Label.vue +27 -0
  300. package/src/components/ui/label/index.ts +1 -0
  301. package/src/components/ui/pagination/PaginationEllipsis.vue +22 -0
  302. package/src/components/ui/pagination/PaginationFirst.vue +29 -0
  303. package/src/components/ui/pagination/PaginationLast.vue +29 -0
  304. package/src/components/ui/pagination/PaginationNext.vue +29 -0
  305. package/src/components/ui/pagination/PaginationPrev.vue +29 -0
  306. package/src/components/ui/pagination/index.ts +10 -0
  307. package/src/components/ui/pin-input/PinInput.vue +23 -0
  308. package/src/components/ui/pin-input/PinInputGroup.vue +18 -0
  309. package/src/components/ui/pin-input/PinInputInput.vue +18 -0
  310. package/src/components/ui/pin-input/PinInputSeparator.vue +15 -0
  311. package/src/components/ui/pin-input/index.ts +4 -0
  312. package/src/components/ui/popover/Popover.vue +15 -0
  313. package/src/components/ui/popover/PopoverContent.vue +48 -0
  314. package/src/components/ui/popover/PopoverTrigger.vue +11 -0
  315. package/src/components/ui/popover/index.ts +4 -0
  316. package/src/components/ui/preview/PreviewPdf.vue +118 -0
  317. package/src/components/ui/progress/ProgressCircle.vue +27 -0
  318. package/src/components/ui/progress/SemiCircularProgressBar.vue +83 -0
  319. package/src/components/ui/progress/TotalCalories.vue +31 -0
  320. package/src/components/ui/radio-group/RadioGroup.vue +25 -0
  321. package/src/components/ui/radio-group/RadioGroupItem.vue +37 -0
  322. package/src/components/ui/radio-group/index.ts +2 -0
  323. package/src/components/ui/scroll-area/ScrollArea.vue +29 -0
  324. package/src/components/ui/scroll-area/ScrollBar.vue +30 -0
  325. package/src/components/ui/scroll-area/index.ts +2 -0
  326. package/src/components/ui/select/Select.vue +15 -0
  327. package/src/components/ui/select/SelectContent.vue +52 -0
  328. package/src/components/ui/select/SelectGroup.vue +19 -0
  329. package/src/components/ui/select/SelectInline.vue +84 -0
  330. package/src/components/ui/select/SelectItem.vue +44 -0
  331. package/src/components/ui/select/SelectItemText.vue +11 -0
  332. package/src/components/ui/select/SelectLabel.vue +13 -0
  333. package/src/components/ui/select/SelectScrollDownButton.vue +24 -0
  334. package/src/components/ui/select/SelectScrollUpButton.vue +24 -0
  335. package/src/components/ui/select/SelectSeparator.vue +17 -0
  336. package/src/components/ui/select/SelectTrigger.vue +31 -0
  337. package/src/components/ui/select/SelectTriggerCustom.vue +23 -0
  338. package/src/components/ui/select/SelectValue.vue +11 -0
  339. package/src/components/ui/select/index.ts +12 -0
  340. package/src/components/ui/separator/Separator.vue +20 -0
  341. package/src/components/ui/separator/index.ts +1 -0
  342. package/src/components/ui/sheet/Sheet.vue +14 -0
  343. package/src/components/ui/sheet/SheetClose.vue +11 -0
  344. package/src/components/ui/sheet/SheetContent.vue +48 -0
  345. package/src/components/ui/sheet/SheetDescription.vue +22 -0
  346. package/src/components/ui/sheet/SheetFooter.vue +19 -0
  347. package/src/components/ui/sheet/SheetHeader.vue +16 -0
  348. package/src/components/ui/sheet/SheetTitle.vue +22 -0
  349. package/src/components/ui/sheet/SheetTrigger.vue +11 -0
  350. package/src/components/ui/sheet/index.ts +31 -0
  351. package/src/components/ui/skeleton/Skeleton.vue +28 -0
  352. package/src/components/ui/skeleton/index.ts +1 -0
  353. package/src/components/ui/sonner/Sonner.vue +22 -0
  354. package/src/components/ui/sonner/index.ts +1 -0
  355. package/src/components/ui/star/StarRating.vue +19 -0
  356. package/src/components/ui/switch/Switch.vue +37 -0
  357. package/src/components/ui/switch/index.ts +1 -0
  358. package/src/components/ui/table/Table.vue +16 -0
  359. package/src/components/ui/table/TableBody.vue +14 -0
  360. package/src/components/ui/table/TableCaption.vue +14 -0
  361. package/src/components/ui/table/TableCell.vue +21 -0
  362. package/src/components/ui/table/TableEmpty.vue +37 -0
  363. package/src/components/ui/table/TableFooter.vue +14 -0
  364. package/src/components/ui/table/TableHead.vue +14 -0
  365. package/src/components/ui/table/TableHeader.vue +14 -0
  366. package/src/components/ui/table/TableRow.vue +14 -0
  367. package/src/components/ui/table/index.ts +8 -0
  368. package/src/components/ui/tabs/Tabs.vue +15 -0
  369. package/src/components/ui/tabs/TabsContent.vue +22 -0
  370. package/src/components/ui/tabs/TabsList.vue +25 -0
  371. package/src/components/ui/tabs/TabsTrigger.vue +27 -0
  372. package/src/components/ui/tabs/index.ts +4 -0
  373. package/src/components/ui/tags-input/TagsInput.vue +22 -0
  374. package/src/components/ui/tags-input/TagsInputInput.vue +19 -0
  375. package/src/components/ui/tags-input/TagsInputItem.vue +22 -0
  376. package/src/components/ui/tags-input/TagsInputItemDelete.vue +24 -0
  377. package/src/components/ui/tags-input/TagsInputItemText.vue +19 -0
  378. package/src/components/ui/tags-input/index.ts +5 -0
  379. package/src/components/ui/textarea/Textarea.vue +24 -0
  380. package/src/components/ui/textarea/index.ts +1 -0
  381. package/src/components/ui/tooltip/Tooltip.vue +14 -0
  382. package/src/components/ui/tooltip/TooltipContent.vue +31 -0
  383. package/src/components/ui/tooltip/TooltipProvider.vue +11 -0
  384. package/src/components/ui/tooltip/TooltipTrigger.vue +11 -0
  385. package/src/components/ui/tooltip/index.ts +4 -0
  386. package/src/composables/useAppConfig.ts +332 -0
  387. package/src/composables/useDarkMode.ts +71 -0
  388. package/src/config/app.config.ts +318 -0
  389. package/src/config/examples/ecommerce.config.ts +132 -0
  390. package/src/config/examples/generic.config.ts +132 -0
  391. package/src/config/menu.config.ts +149 -0
  392. package/src/config/my-app.config.ts +134 -0
  393. package/src/config/test-config.ts +32 -0
  394. package/src/config/theme.config.ts +250 -0
  395. package/src/docs/index.ts +21 -0
  396. package/src/docs.scss +403 -0
  397. package/src/index.d.ts +5 -0
  398. package/src/index.ts +20 -0
  399. package/src/layouts/AuthLayout.vue +68 -0
  400. package/src/layouts/DefaultLayout.vue +119 -0
  401. package/src/layouts/DocsLayout.vue +681 -0
  402. package/src/layouts/FormGlobal.vue +50 -0
  403. package/src/layouts/GlobalDialog.vue +122 -0
  404. package/src/layouts/RakorConfirmDialog.vue +95 -0
  405. package/src/layouts/SettingsLayout.vue +115 -0
  406. package/src/lib/constants.ts +2 -0
  407. package/src/lib/detail.utils.ts +213 -0
  408. package/src/lib/form.utils.ts +1009 -0
  409. package/src/lib/page.flow.utils.ts +81 -0
  410. package/src/lib/page.utils.ts +865 -0
  411. package/src/lib/performance.utils.ts +302 -0
  412. package/src/lib/tablerow.utils.ts +51 -0
  413. package/src/lib/utils.ts +643 -0
  414. package/src/main.scss +717 -0
  415. package/src/main.ts +74 -0
  416. package/src/menu.ts +78 -0
  417. package/src/nestedlist_color.scss +161 -0
  418. package/src/router/index.ts +92 -0
  419. package/src/stores/auth.ts +117 -0
  420. package/src/stores/counter.ts +12 -0
  421. package/src/stores/dialog.ts +168 -0
  422. package/src/stores/form.ts +103 -0
  423. package/src/stores/tabs.ts +52 -0
  424. package/src/tw.scss +419 -0
  425. package/src/types/form.types.ts +348 -0
  426. package/src/types/types.ts +7 -0
  427. package/src/utils/config.utils.ts +149 -0
  428. package/src/views/NotFound.vue +30 -0
  429. package/src/views/PageActivity.vue +15 -0
  430. package/src/views/auth/LoginView.vue +7 -0
  431. package/src/views/auth/OauthCallback.vue +101 -0
  432. package/src/views/dashboard/index.vue +16 -0
  433. package/src/views/settings/AccountSettingsView.vue +70 -0
  434. package/src/views/settings/AuditLogsSettingsView.vue +116 -0
  435. package/src/views/settings/DeviceSettingsView.vue +70 -0
  436. package/src/views/settings/MainSettingsView.vue +12 -0
  437. package/src/views/settings/ProfileSettingsView.vue +104 -0
  438. package/src/vueform/config/informasi-gudang.ts +47 -0
  439. package/src/vueform/config/test-schema.ts +8 -0
  440. package/src/vueform/config/types.ts +768 -0
  441. package/src/vueform/customization/classes.js +46 -0
  442. package/src/vueform/customization/tailwind.classes.js +2117 -0
  443. package/src/vueform/elements/ConfigDataSelectorElement.vue +50 -0
  444. package/src/vueform/elements/DateSelectorElement.vue +323 -0
  445. package/src/vueform/elements/SelectorElement.vue +153 -0
  446. package/src/vueform/schemas/date-selector-test.ts +103 -0
  447. package/src/vueform/schemas/informasi-gudang.ts +160 -0
  448. package/src/vueform/schemas/test-schema.ts +483 -0
  449. package/src/vueform.config.js +77 -0
  450. package/src/vueform.validator.ts +77 -0
@@ -0,0 +1,50 @@
1
+ <script setup lang="ts">
2
+ import FormDialog from '@/components/dialog/FormDialog.vue';
3
+ import { useFormSheet } from '@/stores/form';
4
+ import type { Vueform } from '@vueform/vueform';
5
+ import { ref, watch } from 'vue';
6
+
7
+ const formSheet = useFormSheet();
8
+
9
+ /**
10
+ * El
11
+ *
12
+ */
13
+ const formSheetEl = ref<Vueform>();
14
+
15
+ function sheetFormChanged(after: any, before: any) {
16
+ formSheet.onChange(after, before);
17
+ }
18
+
19
+ function formEditCanceled() {
20
+ formSheetEl.value?.reset();
21
+ formSheet.close();
22
+ }
23
+
24
+ watch(() => formSheetEl.value, (el$) => {
25
+ formSheet.el$ = el$;
26
+ if (el$) {
27
+ setTimeout(() => {
28
+ formSheet.onMounted();
29
+ })
30
+ }
31
+ })
32
+ </script>
33
+
34
+ <template>
35
+ <FormDialog
36
+ v-model:open="formSheet.show"
37
+ :title="formSheet.title"
38
+ v-on:save-click="formSheetEl?.submit()"
39
+ v-on:cancel-click="formEditCanceled"
40
+ :loading="formSheet.loading"
41
+ v-model:saving="formSheet.saving"
42
+ v-model:error="formSheet.formError"
43
+ :class="formSheet.className">
44
+ <Vueform
45
+ :schema="(formSheet.formSchema as any)"
46
+ :endpoint="formSheet.submitForm"
47
+ ref="formSheetEl"
48
+ v-on:change="sheetFormChanged"/>
49
+ </FormDialog>
50
+ </template>
@@ -0,0 +1,122 @@
1
+ <script setup lang="ts">
2
+ import BtnPrimary from '@/components/button/BtnPrimary.vue';
3
+ import BtnSecondary from '@/components/button/BtnSecondary.vue';
4
+ import ErrorDialog from '@/components/dialog/ErrorDialog.vue';
5
+ import FormInputerDialog from '@/components/dialog/FormInputerDialog.vue';
6
+ import InfoDialog from '@/components/dialog/InfoDialog.vue';
7
+ import SuccessDialog from '@/components/dialog/SuccessDialog.vue';
8
+ import LoadingDialog from '@/components/loadings/LoadingDialog.vue';
9
+ import LucideIcon from '@/components/helper/LucideIcon.vue';
10
+ import { AlertDialog, AlertDialogContent, AlertDialogDescription, AlertDialogFooter,
11
+ AlertDialogHeader, AlertDialogTitle } from '@/components/ui/alert-dialog';
12
+ import DialogDescription from '@/components/ui/dialog/DialogDescription.vue';
13
+ import DialogTitle from '@/components/ui/dialog/DialogTitle.vue';
14
+ import { useConfirmDialog, useErrorDialog, useFormInputerDialog, useInfoDialog, useLoadingDialog, useSuccessDialog } from '@/stores/dialog';
15
+
16
+ /**
17
+ * Dialog
18
+ *
19
+ */
20
+ const infoDialog = useInfoDialog();
21
+ const errorDialog = useErrorDialog();
22
+ const loadingDialog = useLoadingDialog();
23
+ const confirmDialog = useConfirmDialog();
24
+ const successDialog = useSuccessDialog();
25
+ const formInputerDialog = useFormInputerDialog();
26
+
27
+ function formInputerChanged(after: any, before: any, el$: any) {
28
+ if (formInputerDialog.options?.onChange) {
29
+ formInputerDialog.options?.onChange(after, before, el$);
30
+ }
31
+ }
32
+ </script>
33
+
34
+ <template>
35
+ <LoadingDialog v-model:show="loadingDialog.show"/>
36
+ <InfoDialog v-model:open="infoDialog.show">
37
+ <template #title>
38
+ {{ infoDialog.options?.title }}
39
+ </template>
40
+ <template #description>
41
+ {{ infoDialog.options?.description }}
42
+ </template>
43
+ <template #actionLabel>
44
+ {{ infoDialog.options?.actionLabel || 'Tutup' }}
45
+ </template>
46
+ </InfoDialog>
47
+ <ErrorDialog v-model:open="errorDialog.show" v-on:close="errorDialog.close">
48
+ <template #title>
49
+ {{ errorDialog.options?.title }}
50
+ </template>
51
+ <template #description>
52
+ {{ errorDialog.options?.description }}
53
+ </template>
54
+ <template #actionLabel>
55
+ {{ errorDialog.options?.actionLabel || 'Tutup' }}
56
+ </template>
57
+ </ErrorDialog>
58
+ <SuccessDialog v-model:open="successDialog.show" v-on:close="successDialog.close">
59
+ <template #title v-if="successDialog.options?.title">
60
+ {{ successDialog.options?.title }}
61
+ </template>
62
+ <template #description v-if="successDialog.options?.description">
63
+ {{ successDialog.options?.description }}
64
+ </template>
65
+ <template #close-label v-if="successDialog.options?.closeLabel">
66
+ {{ successDialog.options?.closeLabel }}
67
+ </template>
68
+ </SuccessDialog>
69
+
70
+ <AlertDialog v-model:open="confirmDialog.show">
71
+ <AlertDialogContent>
72
+ <AlertDialogHeader>
73
+ <AlertDialogTitle>{{ confirmDialog.options?.title }}</AlertDialogTitle>
74
+ <AlertDialogDescription>
75
+ <div v-html="confirmDialog.options?.description"></div>
76
+ </AlertDialogDescription>
77
+ </AlertDialogHeader>
78
+ <slot name="content"></slot>
79
+ <AlertDialogFooter class="pt-4">
80
+ <BtnSecondary class="h-auto 2xl:h-auto"
81
+ v-on:click="confirmDialog.close(false)">
82
+ {{ confirmDialog.options?.cancelLabel || 'Batal' }}
83
+ </BtnSecondary>
84
+ <BtnPrimary v-on:click.stop="confirmDialog.close(true)"
85
+ :loading="confirmDialog.options?.loading"
86
+ :disabled="confirmDialog.options?.loading"
87
+ class="h-auto 2xl:h-auto"
88
+ :class="{
89
+ 'bg-red-500 hover:bg-red-600': confirmDialog.options?.negative,
90
+ 'pl-3 pr-4': confirmDialog.options?.actionIcon,
91
+ }">
92
+ <LucideIcon v-if="confirmDialog.options?.actionIcon"
93
+ :name="confirmDialog.options?.actionIcon"
94
+ :size="18" class="mr-2 -ml-1" />
95
+ {{ confirmDialog.options?.actionLabel || 'Simpan' }}
96
+ </BtnPrimary>
97
+ </AlertDialogFooter>
98
+ </AlertDialogContent>
99
+ </AlertDialog>
100
+
101
+ <FormInputerDialog
102
+ :class="formInputerDialog.options?.class"
103
+ :class-content="formInputerDialog.options?.classContent"
104
+ :class-overlay="formInputerDialog.options?.classOverlay"
105
+ :close-on-submit="false"
106
+ v-model:show="formInputerDialog.show"
107
+ v-model:error="formInputerDialog.formError"
108
+ v-model:saving="formInputerDialog.saving"
109
+ v-model:form="formInputerDialog.formSchema"
110
+ @submit="formInputerDialog.submit"
111
+ @change="formInputerChanged"
112
+ >
113
+ <template #header>
114
+ <DialogTitle>{{ formInputerDialog.options?.title }}</DialogTitle>
115
+ <DialogDescription v-if="formInputerDialog.options?.description">
116
+ {{ formInputerDialog.options?.description }}
117
+ </DialogDescription>
118
+ </template>
119
+ <template #button-label>{{ formInputerDialog.options?.actionLabel ?? 'Simpan' }}</template>
120
+ <template #secondary-button-label>{{ formInputerDialog.options?.cancelLabel ?? 'Batal' }}</template>
121
+ </FormInputerDialog>
122
+ </template>
@@ -0,0 +1,95 @@
1
+ <script setup lang="ts">
2
+ import api from '@/api/api';
3
+ import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog';
4
+ import { LucideCheckCheck } from 'lucide-vue-next';
5
+ import { onMounted, ref } from 'vue';
6
+
7
+ const konfirmasiTutupRakorOpen = ref(false);
8
+ const konfirmasiData = ref<any>(null);
9
+ const tutupRakorCountdown = ref(0);
10
+ let tutupRakorInterval: any = null;
11
+
12
+ function konfirmasiTutupRakor() {
13
+ konfirmasiTutupRakorOpen.value = false;
14
+ dialogOpenChanged(false);
15
+ api.post(`jadwal-rakor/${konfirmasiData.value.id}/konfirmasi-tutup-rakor`);
16
+ }
17
+
18
+ function setIntervalCloseKonfirmasiTutupRakor() {
19
+ tutupRakorCountdown.value = 30;
20
+ if (tutupRakorInterval) clearInterval(tutupRakorInterval);
21
+ setInterval(() => {
22
+ if (tutupRakorCountdown.value <= 0) {
23
+ if (tutupRakorInterval) clearInterval(tutupRakorInterval);
24
+ konfirmasiTutupRakorOpen.value = false;
25
+ setTimeout(() => {
26
+ dialogOpenChanged(false);
27
+ }, 3000);
28
+ return;
29
+ }
30
+ tutupRakorCountdown.value -= 1;
31
+ }, 1000);
32
+ }
33
+
34
+ /**
35
+ * Next change this to get from websocket
36
+ * when back-end ws ready
37
+ *
38
+ */
39
+ function checkKonfirmasiTutupRakor() {
40
+ if (konfirmasiTutupRakorOpen.value) return;
41
+ // api.get('/jadwal-rakor/konfirmasi-tutup-rakor').then((r) => {
42
+ // konfirmasiTutupRakorOpen.value = true;
43
+ // konfirmasiData.value = r.data.data;
44
+ // setIntervalCloseKonfirmasiTutupRakor();
45
+ // }).finally(() => {
46
+ // setTimeout(() => {
47
+ // checkKonfirmasiTutupRakor();
48
+ // }, 3000);
49
+ // })
50
+ }
51
+
52
+ function dialogOpenChanged(b: boolean) {
53
+ if (b) return;
54
+ setTimeout(() => {
55
+ checkKonfirmasiTutupRakor();
56
+ }, 5000);
57
+ }
58
+
59
+ onMounted(() => {
60
+ // checkKonfirmasiTutupRakor();
61
+ })
62
+ </script>
63
+
64
+ <template>
65
+ <Dialog v-model:open="konfirmasiTutupRakorOpen" v-on:update:open="dialogOpenChanged">
66
+ <DialogContent class="max-w-[520px] w-full">
67
+ <DialogHeader>
68
+ <DialogTitle>Rakor <b>{{ konfirmasiData.jadwalRakor.judul }}</b> Telah Ditutup</DialogTitle>
69
+ <DialogDescription class="mt-2">
70
+ Rakor 1 telah ditutup oleh
71
+ <b>{{ konfirmasiData.jadwalRakor && konfirmasiData.jadwalRakor.rakorDitutupOleh
72
+ ? konfirmasiData.jadwalRakor.rakorDitutupOleh.name : '' }}</b>
73
+ dari <b>{{ konfirmasiData.jadwalRakor && konfirmasiData.jadwalRakor.rakorDitutupOleh
74
+ && konfirmasiData.jadwalRakor.rakorDitutupOleh.organization
75
+ ? konfirmasiData.jadwalRakor.rakorDitutupOleh.organization.name : '' }}</b>,
76
+ silahkan konfrimasi penutupan Rakor dengan klik tombol Konfirmasi di bawah.
77
+ <br /><br />
78
+ Notulen rakor akan dikirimkan melalui email setelah semua peserta melakukan konfirmasi.
79
+ <br /><br />
80
+ Akan otomatis terkonfirmasi jika tidak ada konfirmasi selama 30 detik.
81
+ </DialogDescription>
82
+ </DialogHeader>
83
+ <div class="text-sm">
84
+ <div class="flex items-center pt-4 -mb-1">
85
+ <div class="ml-auto pr-5" v-if="tutupRakorCountdown">{{ tutupRakorCountdown }}</div>
86
+ <button class="bg-green-500 text-white hover:bg-green-600 transition px-4 py-2 rounded-md font-medium text-base min-w-[120px] flex items-center"
87
+ v-on:click="konfirmasiTutupRakor">
88
+ <LucideCheckCheck class="mr-2"/>
89
+ Konfirmasi
90
+ </button>
91
+ </div>
92
+ </div>
93
+ </DialogContent>
94
+ </Dialog>
95
+ </template>
@@ -0,0 +1,115 @@
1
+ <script setup lang="ts">
2
+ import ScrollArea from "@/components/ui/scroll-area/ScrollArea.vue";
3
+ import LucideIcon from "@/components/helper/LucideIcon.vue";
4
+ import { ref, onMounted, onBeforeMount, watch } from "vue";
5
+ import { useRoute } from "vue-router";
6
+
7
+ interface Menu {
8
+ id: string;
9
+ name: string;
10
+ uri?: string;
11
+ icon?: string;
12
+ iconSize?: number;
13
+ iconType?: "svg" | "lucide";
14
+ hasData?: boolean;
15
+ connectApi?: boolean;
16
+ finished?: boolean;
17
+ submenu?: Menu[];
18
+ }
19
+
20
+ const menu: Menu[] = [
21
+ {
22
+ id: "personal",
23
+ name: "Personal Settings",
24
+ submenu: [
25
+ {
26
+ id: "profile",
27
+ name: "Profile Settings",
28
+ icon: "CircleUser",
29
+ uri: "/settings/profile"
30
+ },
31
+ {
32
+ id: "account",
33
+ name: "Account Settings",
34
+ icon: "UserCog",
35
+ uri: "/settings/account"
36
+ },
37
+ {
38
+ id: "device",
39
+ name: "Devices",
40
+ icon: "Smartphone",
41
+ uri: "/settings/device"
42
+ }
43
+ ]
44
+ },
45
+ {
46
+ id: "security",
47
+ name: "Security",
48
+ submenu: [
49
+ {
50
+ id: "logs",
51
+ name: "Audit Logs",
52
+ icon: "ScrollText",
53
+ uri: "/settings/audit-logs"
54
+ }
55
+ // {
56
+ // name: 'API Access',
57
+ // icon: 'FileKey2',
58
+ // },
59
+ ]
60
+ }
61
+ ];
62
+
63
+ const route = useRoute();
64
+
65
+ const menuOpen = ref("");
66
+
67
+ watch(route, to => {
68
+ findMenuOpen(to.path);
69
+ });
70
+
71
+ function findMenuOpen(path: string) {
72
+ searhMenu: for (const item of menu) {
73
+ if (!item.submenu) continue;
74
+ for (const sub of item.submenu) {
75
+ if (sub.uri === path) {
76
+ menuOpen.value = sub.id;
77
+ break searhMenu;
78
+ }
79
+ }
80
+ }
81
+ }
82
+
83
+ onMounted(() => {
84
+ findMenuOpen(route.path);
85
+ });
86
+ </script>
87
+
88
+ <template>
89
+ <section class="dark:bg-dark_bg3 fixed bottom-0 left-20 top-14 z-9 w-80 border-r bg-white">
90
+ <ScrollArea class="h-full px-2 pb-5">
91
+ <div v-for="(item, i) in menu" :key="i" class="pt-5">
92
+ <div class="my-1 flex items-center px-3 text-[13px] font-semibold uppercase text-gray-400">
93
+ {{ item.name }}
94
+ </div>
95
+ <div v-for="(sub, i) in item.submenu" :key="i">
96
+ <RouterLink
97
+ :to="sub.uri || '#'"
98
+ class="hover:bg-dasi_hover hover:text-dasi_primary relative my-2 block rounded-md py-2.5 pl-11 pr-4 text-sm font-[500]"
99
+ :class="{ '!bg-dasi_primary !text-white': menuOpen && menuOpen === sub.id }">
100
+ <div class="absolute left-3 top-1/2 flex h-8 w-8 -translate-y-1/2 items-center">
101
+ <div v-html="sub.icon" v-if="sub.iconType === 'svg'"></div>
102
+ <LucideIcon :name="sub.icon" :size="sub.iconSize || 19" :strokeWidth="1.4"></LucideIcon>
103
+ </div>
104
+ {{ sub.name }}
105
+ </RouterLink>
106
+ </div>
107
+ </div>
108
+ </ScrollArea>
109
+ </section>
110
+ <section class="pl-80">
111
+ <div class="p-5 text-sm">
112
+ <RouterView />
113
+ </div>
114
+ </section>
115
+ </template>
@@ -0,0 +1,2 @@
1
+ export const InternalServerError = 'Internal server error, mohon coba beberapa saat lagi';
2
+ export const DibutuhkanPerbaikanLabel = '<p class="text-red-500 font-medium text-[12px]">Dibutuhkan perbaikan</p>';
@@ -0,0 +1,213 @@
1
+ import type { DasiV2FormSchema } from "@/types/form.types";
2
+
3
+ /**
4
+ * Generic schema mapping utility
5
+ * Maps data from API response to form schema defaults
6
+ */
7
+ export async function schemaMaping(schema: DasiV2FormSchema, items: any) {
8
+ // Process each field in schema
9
+ for (const [key, item] of Object.entries(schema)) {
10
+ processSchemaField(key, item, items);
11
+ }
12
+ }
13
+
14
+ function processSchemaField(key: string, item: any, items: any) {
15
+ // Generate search key variations (removes Id, Ids, Code suffixes)
16
+ const searchKey = generateSearchKey(key);
17
+
18
+ // Try direct mapping from main data
19
+ setDirectMapping(key, searchKey, item, items);
20
+
21
+ // Fallback: try mapping from parent object if present
22
+ // Generic pattern: look for parent[searchKey] or parent[key]
23
+ const parentKeys = ['parent', 'parentData', 'related'];
24
+ for (const parentKey of parentKeys) {
25
+ if ((item.default === undefined || item.default === null || item.default === "") && items?.[parentKey]) {
26
+ const parent = items[parentKey];
27
+ // Direct key mapping
28
+ if (parent[searchKey] !== undefined && parent[searchKey] !== null) {
29
+ item.default = parent[searchKey];
30
+ break;
31
+ } else if (parent[key] !== undefined && parent[key] !== null) {
32
+ item.default = parent[key];
33
+ break;
34
+ } else {
35
+ // Selector/organization style keys
36
+ if (["dasi_v2_selector_single", "dasi_v2_config_data_selector", "dasi_v2_organization"].includes(item.type)) {
37
+ const theKey = key.endsWith("Id")
38
+ ? key.substring(0, key.length - 2)
39
+ : key.endsWith("Code") && key !== "unitCode"
40
+ ? key.substring(0, key.length - 4)
41
+ : key.endsWith("Ids")
42
+ ? key.substring(0, key.length - 3)
43
+ : key;
44
+ if (parent[theKey] !== undefined && parent[theKey] !== null) {
45
+ item.default = parent[theKey];
46
+ break;
47
+ }
48
+ }
49
+ }
50
+ }
51
+ }
52
+
53
+ // Fallback: try mapping from array of related items (first item)
54
+ const relatedArrayKeys = ['relatedItems', 'items', 'children'];
55
+ for (const arrayKey of relatedArrayKeys) {
56
+ if ((item.default === undefined || item.default === null || item.default === "") && Array.isArray(items?.[arrayKey]) && items[arrayKey].length > 0) {
57
+ const firstItem = items[arrayKey][0];
58
+ // Try direct key mapping
59
+ if (firstItem[searchKey] !== undefined && firstItem[searchKey] !== null) {
60
+ item.default = firstItem[searchKey];
61
+ break;
62
+ } else if (firstItem[key] !== undefined && firstItem[key] !== null) {
63
+ item.default = firstItem[key];
64
+ break;
65
+ }
66
+ }
67
+ }
68
+
69
+ // Handle organization mapping
70
+ if (key === "organizationId" && items.organization) {
71
+ item.default = items.organization;
72
+ }
73
+
74
+ // Handle accessLevelId mapping
75
+ if (key === "accessLevelId") {
76
+ item.default = items.accessLevel || null;
77
+ }
78
+
79
+ // Handle Selector types
80
+ if (["dasi_v2_selector_single", "dasi_v2_config_data_selector", "dasi_v2_organization", "file"].includes(item.type)) {
81
+ const theKey =
82
+ key.substring(key.length - 2, key.length) === "Id"
83
+ ? key.substring(0, key.length - 2)
84
+ : key.substring(key.length - 4, key.length) === "Code" && key !== "unitCode"
85
+ ? key.substring(0, key.length - 4)
86
+ : key.substring(key.length - 3, key.length) === "Ids"
87
+ ? key.substring(0, key.length - 3)
88
+ : key;
89
+
90
+ item.default = items[theKey] || null;
91
+ }
92
+
93
+ // Handle file type
94
+ if (item.type === "file") {
95
+ const theKey = key.endsWith("Id") ? key.substring(0, key.length - 2) : key;
96
+ item.default = items[theKey] || null;
97
+ }
98
+
99
+ // Handle date range mapping
100
+ if (key.endsWith("Range") && item.type === "dasi_v2_date_range") {
101
+ // For date range fields, virtual fields will be handled separately
102
+ // The template will look for {key}Awal and {key}Akhir fields
103
+ }
104
+
105
+ // Fallback for createdAt
106
+ if (key === "createdAt" && !item.default && items.createdAt) {
107
+ item.default = items.createdAt;
108
+ }
109
+ }
110
+
111
+ function getNestedValue(obj: any, path: string): any {
112
+ return path.split(".").reduce((current, key) => {
113
+ if (current === null || current === undefined) {
114
+ return null;
115
+ }
116
+
117
+ // Handle array notation like "items.0.field"
118
+ if (!isNaN(Number(key))) {
119
+ const index = Number(key);
120
+ return Array.isArray(current) && current[index] ? current[index] : null;
121
+ }
122
+
123
+ return current[key];
124
+ }, obj);
125
+ }
126
+
127
+ function generateSearchKey(key: string): string {
128
+ const suffixes = [
129
+ { suffix: "Id", length: 2 },
130
+ { suffix: "Ids", length: 3 },
131
+ { suffix: "Code", length: 4 }
132
+ ];
133
+
134
+ for (const { suffix, length } of suffixes) {
135
+ if (key.endsWith(suffix) && key !== "unitCode") {
136
+ return key.substring(0, key.length - length);
137
+ }
138
+ }
139
+
140
+ return key;
141
+ }
142
+
143
+ function setDirectMapping(key: string, searchKey: string, item: any, items: any) {
144
+ for (const [itemKey, value] of Object.entries(items)) {
145
+ if (searchKey === itemKey || key === itemKey) {
146
+ // Don't override if value is null/undefined for organization fields
147
+ if ((value === null || value === undefined) && key.endsWith("Id")) {
148
+ break;
149
+ }
150
+ item.default = value;
151
+ break;
152
+ }
153
+ }
154
+ }
155
+
156
+ /**
157
+ * Add virtual fields for date range types to support template rendering
158
+ */
159
+ function addVirtualDateRangeFields(schema: DasiV2FormSchema, items: any) {
160
+ // Find all date range fields
161
+ for (const [key, item] of Object.entries(schema)) {
162
+ if (item.type === "dasi_v2_date_range") {
163
+ // Add virtual Start field
164
+ const startKey = `${key}Start`;
165
+ if (!schema[startKey] && items[startKey]) {
166
+ schema[startKey] = {
167
+ type: "hidden",
168
+ default: items[startKey],
169
+ showInDetail: false
170
+ };
171
+ }
172
+
173
+ // Add virtual End field
174
+ const endKey = `${key}End`;
175
+ if (!schema[endKey] && items[endKey]) {
176
+ schema[endKey] = {
177
+ type: "hidden",
178
+ default: items[endKey],
179
+ showInDetail: false
180
+ };
181
+ }
182
+
183
+ // Also try Awal/Akhir pattern as fallback (Indonesian naming)
184
+ const awalKey = `${key}Awal`;
185
+ if (!schema[awalKey] && items[awalKey]) {
186
+ schema[awalKey] = {
187
+ type: "hidden",
188
+ default: items[awalKey],
189
+ showInDetail: false
190
+ };
191
+ }
192
+
193
+ const akhirKey = `${key}Akhir`;
194
+ if (!schema[akhirKey] && items[akhirKey]) {
195
+ schema[akhirKey] = {
196
+ type: "hidden",
197
+ default: items[akhirKey],
198
+ showInDetail: false
199
+ };
200
+ }
201
+
202
+ // Also try Mulai pattern as fallback
203
+ const mulaiKey = `${key}Mulai`;
204
+ if (!schema[mulaiKey] && items[mulaiKey]) {
205
+ schema[mulaiKey] = {
206
+ type: "hidden",
207
+ default: items[mulaiKey],
208
+ showInDetail: false
209
+ };
210
+ }
211
+ }
212
+ }
213
+ }