@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,294 @@
1
+ <script setup lang="ts">
2
+ import { ref } from "vue";
3
+ import { ArrowLeftToLine, LucideFileClock, LucideX } from "lucide-vue-next";
4
+ import { Sheet, SheetClose, SheetContent, SheetHeader, SheetTitle } from "@/components/ui/sheet";
5
+ import ScrollArea from "@/components/ui/scroll-area/ScrollArea.vue";
6
+ import { cn } from "@/lib/utils";
7
+ import DetailTimeline from "@/components/detail/DetailTimeline.vue";
8
+ import type { DasiV2FormSchema, FormSchema, FormSchemaHooks } from "@/types/form.types";
9
+ import DetailContentLoading from "./DetailContentLoading.vue";
10
+ import DetailContentHeader from "./DetailContentHeader.vue";
11
+ import DetailContentItems from "./DetailContentItems.vue";
12
+ import DCI2 from "./DCI2.vue";
13
+ import moment from "moment";
14
+ import BtnCircle from "../button/BtnCircle.vue";
15
+ import type { ColumnRef, PageConfig } from "@/vueform/config/types";
16
+ import { getPageDataDetail } from "@/lib/page.utils";
17
+ import { useErrorDialog } from "@/stores/dialog";
18
+ import { InternalServerError } from "@/lib/constants";
19
+
20
+ interface Props {
21
+ title?: string;
22
+ class?: string;
23
+ }
24
+
25
+ interface DetailSheetOptions {
26
+ item: any;
27
+ endpoint: string;
28
+ schema?: DasiV2FormSchema;
29
+ columns?: ColumnRef[];
30
+ hooks?: FormSchemaHooks;
31
+ pageConfig?: PageConfig;
32
+ }
33
+
34
+ const props = withDefaults(defineProps<Props>(), {
35
+ title: "Data Detail"
36
+ });
37
+
38
+ const sheetOpen = ref(false);
39
+ const endpoint = ref<string>();
40
+ const data = ref<any>(null);
41
+ const loading = ref(true);
42
+ const schema = ref<DasiV2FormSchema>();
43
+ const columns = ref<ColumnRef[]>([]);
44
+ const hooks = ref<FormSchemaHooks>();
45
+ const pageConfig = ref<PageConfig>();
46
+
47
+ /**
48
+ * For shipment and payment flow
49
+ * when displaying parent and child data
50
+ *
51
+ */
52
+ const parentData = ref<any>(null);
53
+ const loadingParent = ref(false);
54
+
55
+ /**
56
+ * Dialog
57
+ *
58
+ */
59
+ const errorDialog = useErrorDialog();
60
+
61
+ /**
62
+ * Timeline
63
+ *
64
+ */
65
+ const payload = ref();
66
+ const prevData = ref();
67
+ const loadingDiff = ref(false);
68
+ const tlSelected = ref();
69
+
70
+ function closeDiff() {
71
+ tlSelected.value = null;
72
+ payload.value = null;
73
+ prevData.value = null;
74
+ }
75
+
76
+ /**
77
+ * Get data from api
78
+ *
79
+ */
80
+ function getData() {
81
+ loading.value = true;
82
+
83
+ // Simpan data dari list untuk fallback jika detail tidak lengkap
84
+ // const originalItem = data.value ? JSON.parse(JSON.stringify(data.value)) : null;
85
+
86
+ /**
87
+ * This is flow page,
88
+ * used on shipment and payment
89
+ *
90
+ */
91
+ const parentId = data.value.id;
92
+ if (pageConfig.value?.parentField && pageConfig.value.nextDataField) {
93
+ loadingParent.value = true;
94
+ getPageDataDetail({
95
+ endpoint: pageConfig.value.endpoint ?? "",
96
+ pageConfig: pageConfig.value,
97
+ item: { id: parentId },
98
+ formSchema: schema.value ?? {}
99
+ })
100
+ .then(r => {
101
+ if (!r || !r.data) return;
102
+ parentData.value = r.data.data || r.data;
103
+ })
104
+ .catch(err => {
105
+ prevData.value = null;
106
+ errorDialog.open({
107
+ title: "Gagal Mendapatkan Data",
108
+ description: err.message ?? InternalServerError
109
+ });
110
+ })
111
+ .finally(() => {
112
+ loadingParent.value = false;
113
+ });
114
+ }
115
+
116
+ getPageDataDetail({
117
+ endpoint: endpoint.value ?? "",
118
+ pageConfig: pageConfig.value,
119
+ item: data.value,
120
+ formSchema: schema.value ?? {},
121
+ includeExtras: !pageConfig.value?.parentField
122
+ })
123
+ .then(r => {
124
+ if (!r || !r.data) return;
125
+ data.value = r.data.data || r.data;
126
+
127
+ // // Gabungkan relasi yang kosong dari data list jika endpoint detail tidak mengembalikannya
128
+ // if (originalItem) {
129
+ // if ((!data.value.catatBongkarDs || data.value.catatBongkarDs.length === 0) && originalItem.catatBongkarDs && originalItem.catatBongkarDs.length > 0) {
130
+ // data.value.catatBongkarDs = originalItem.catatBongkarDs;
131
+ // }
132
+ // if ((!data.value.loadingInfoCif || data.value.loadingInfoCif.length === 0) && originalItem.loadingInfoCif && originalItem.loadingInfoCif.length > 0) {
133
+ // data.value.loadingInfoCif = originalItem.loadingInfoCif;
134
+ // }
135
+ // if ((!data.value.norIzinSandarBongkar || data.value.norIzinSandarBongkar.length === 0) && originalItem.norIzinSandarBongkar && originalItem.norIzinSandarBongkar.length > 0) {
136
+ // data.value.norIzinSandarBongkar = originalItem.norIzinSandarBongkar;
137
+ // }
138
+ // }
139
+
140
+ // // Add creator name for header display - fallback chain
141
+ // if (data.value.roa && Array.isArray(data.value.roa) && data.value.roa.length > 0) {
142
+ // const roaData = data.value.roa[0];
143
+ // if (roaData.creatorName && !data.value.creatorName) {
144
+ // data.value.creatorName = roaData.creatorName;
145
+ // }
146
+ // }
147
+
148
+ })
149
+ .catch(err => {
150
+ console.log("get detail data failed", err);
151
+ data.value = null;
152
+ })
153
+ .finally(() => {
154
+ loading.value = false;
155
+ // setTimeout(() => {
156
+ // const dci = document.getElementById('detail-content-items');
157
+ // if (!dci) return;
158
+ // dci.style.minHeight = `calc(100vh - ${dci.getBoundingClientRect().top + 33}px)`; // 1 border
159
+ // });
160
+ });
161
+ }
162
+
163
+ function open(options: DetailSheetOptions) {
164
+ sheetOpen.value = true;
165
+ data.value = options.item;
166
+ schema.value = options.schema;
167
+ hooks.value = options.hooks;
168
+ pageConfig.value = options.pageConfig;
169
+
170
+ columns.value = [];
171
+
172
+ /**
173
+ * Payment flow, columns and schema are different
174
+ * sources, so we need to display it separately
175
+ *
176
+ */
177
+ if (pageConfig.value?.parentField && pageConfig.value.nextDataField) {
178
+ for (const column of options.columns ?? []) {
179
+ if (
180
+ (!options.schema?.[column.key ?? "_"] && !options.schema?.[`${column.key}Id`] && !options.schema?.[`${column.key}Code`]) ||
181
+ options.schema?.[column.key ?? "_"]?.showInDetail === false ||
182
+ options.schema?.[`${column.key}Id`]?.showInDetail === false ||
183
+ options.schema?.[`${column.key}Code`]?.showInDetail === false
184
+ ) {
185
+ columns.value?.push(column);
186
+ }
187
+ }
188
+ } else {
189
+ /**
190
+ * Merge columns to schema
191
+ */
192
+ // for (const column of options.columns ?? []) {
193
+ // if (!schema.value) continue;
194
+ // if (column.key === 'id' || column.type === 'action') continue;
195
+ // if (!schema.value[column.key]) schema.value[column.key] = { type: column.cellType };
196
+ // schema.value[column.key].cellRender = column.cellRender as any;
197
+ // schema.value[column.key].cellDataSource = column.dataSource;
198
+ // schema.value[column.key].label = column.header;
199
+ // schema.value[column.key].showInDetail = column.showInDetail;
200
+ // }
201
+ }
202
+
203
+ /**
204
+ * Reset timeline
205
+ *
206
+ */
207
+ tlSelected.value = null;
208
+ prevData.value = null;
209
+ payload.value = null;
210
+ loadingDiff.value = false;
211
+
212
+ const slash = options.endpoint.startsWith("/") ? "" : "/";
213
+ endpoint.value = `${slash}${options.endpoint}`;
214
+ getData();
215
+ }
216
+
217
+ defineExpose({ open });
218
+ </script>
219
+
220
+ <template>
221
+ <Sheet v-model:open="sheetOpen">
222
+ <SheetContent :class="cn('w-11/12 !max-w-[1360px] bg-white px-8 pt-3 dark:bg-dark_bg2', props.class)">
223
+ <SheetHeader class="relative gap-y-0.5 pl-6">
224
+ <SheetClose>
225
+ <div
226
+ class="absolute -left-6 -top-1 flex size-10 cursor-pointer items-center justify-center rounded-full text-gray-500 transition hover:bg-hover_main hover:text-primary_main dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white">
227
+ <ArrowLeftToLine class="h-6 w-6 -scale-x-100 transform" />
228
+ </div>
229
+ </SheetClose>
230
+ <SheetTitle>{{ props.title }}</SheetTitle>
231
+ </SheetHeader>
232
+ <section class="absolute bottom-0 left-0 right-0 top-14 flex border-b border-t bg-slate-50 dark:border-dark_border3 dark:bg-dark_bg2">
233
+ <slot name="detail" :detail="data">
234
+ <div class="h-full w-[calc(100%-400px)] overflow-auto border-r bg-white dark:border-gray-700 dark:bg-dark_bg2">
235
+ <DetailContentLoading v-if="loading || loadingParent" />
236
+ <div class="min-h-full bg-white pt-5 dark:bg-dark_bg2" v-else>
237
+ <DetailContentHeader :data="data" :endpoint="endpoint || ''" :pageConfig="pageConfig" />
238
+ <div v-if="payload" class="flex h-8 w-full items-center gap-1.5 border-b bg-yellow-200 px-6 text-sm font-medium dark:border-gray-700 dark:bg-yellow-800 dark:text-yellow-100">
239
+ <LucideFileClock :size="20" :stroke-width="1.6" class="-mt-px" />
240
+ Riwayat data pada {{ moment(tlSelected.createdAt).utc().format("DD/MM/YYYY HH:mm") }}
241
+ <BtnCircle class="-mr-3 ml-auto !size-6 hover:bg-black/10 dark:hover:bg-white/10" v-on:click="closeDiff">
242
+ <LucideX :size="18" />
243
+ </BtnCircle>
244
+ </div>
245
+ <div id="detail-content-items" class="overflow-auto pb-[140px]">
246
+ <div v-if="loadingDiff">
247
+ <DetailContentLoading />
248
+ </div>
249
+ <div v-else>
250
+ <template v-if="columns && parentData">
251
+ <section class="detail-items px-6 pt-4">
252
+ <div class="vueform-divider"><span>Informasi General</span></div>
253
+ </section>
254
+ <DCI2 :columns="columns" :data="parentData" />
255
+ <div class="border-t py-1"></div>
256
+ </template>
257
+
258
+ <div :class="{ 'grid min-h-full w-[180%] grid-cols-2': payload, '!w-[270%] !grid-cols-3': prevData }">
259
+ <div class="w-full">
260
+ <div class="border-b bg-slate-100 px-6 py-1.5 text-[15px] font-medium dark:border-gray-700 dark:bg-gray-800 dark:text-gray-200" v-if="payload">Data saat ini</div>
261
+ <DCI2 :schema="schema" :data="data" v-if="schema" />
262
+ <!-- <DetailContentItems :schema="schema" :hooks="hooks" :data="data" v-if="schema"/> -->
263
+ </div>
264
+ <div class="w-full" v-if="prevData">
265
+ <div class="border-b bg-slate-100 px-6 py-1.5 text-[15px] font-medium dark:border-gray-700 dark:bg-gray-800 dark:text-gray-200">Data sebelum perubahan</div>
266
+ <DetailContentItems :schema="schema" :hooks="hooks" :data="prevData" v-if="schema" />
267
+ </div>
268
+ <div class="w-full" v-if="payload">
269
+ <div class="border-b bg-slate-100 px-6 py-1.5 text-[15px] font-medium dark:border-gray-700 dark:bg-gray-800 dark:text-gray-200">
270
+ <template v-if="prevData"> Data setelah perubahan </template>
271
+ <template v-else> Data pada {{ moment(tlSelected.createdAt).utc().format("DD/MM/YYYY HH:mm") }} </template>
272
+ </div>
273
+ <DetailContentItems :schema="schema" :hooks="hooks" :data="payload" v-if="schema" />
274
+ </div>
275
+ </div>
276
+ </div>
277
+ </div>
278
+ </div>
279
+ </div>
280
+ <ScrollArea class="h-full w-[400px]">
281
+ <DetailTimeline
282
+ v-if="data"
283
+ :data="data"
284
+ :page-config="pageConfig"
285
+ v-model:loading-diff="loadingDiff"
286
+ v-model:payload="payload"
287
+ v-model:prev-data="prevData"
288
+ v-model:selected="tlSelected" />
289
+ </ScrollArea>
290
+ </slot>
291
+ </section>
292
+ </SheetContent>
293
+ </Sheet>
294
+ </template>
@@ -0,0 +1,191 @@
1
+ <script setup lang="ts">
2
+ import api from "@/api/api";
3
+ import moment from "moment";
4
+ import { onMounted, ref } from "vue";
5
+ import Skeleton from "@/components/ui/skeleton/Skeleton.vue";
6
+ import { LucideEdit, LucideFileClock, LucideSquareSplitHorizontal, LucideTrash2, LucideUndo2 } from "lucide-vue-next";
7
+
8
+ moment.updateLocale("en", {
9
+ relativeTime: {
10
+ future: "in %s",
11
+ past: "%s ago",
12
+ s: "1s",
13
+ ss: "%ds",
14
+ m: "1m",
15
+ mm: "%dm",
16
+ h: "1h",
17
+ hh: "%dh",
18
+ d: "1d",
19
+ dd: "%dd",
20
+ w: "1w",
21
+ ww: "%dw",
22
+ M: "1Mo",
23
+ MM: "%dMo",
24
+ y: "1y",
25
+ yy: "%dy"
26
+ }
27
+ });
28
+
29
+ const props = defineProps(["data", "pageConfig"]);
30
+ const loading = ref(true);
31
+ const timeline = ref<any[]>([]);
32
+ const payload = defineModel("payload");
33
+ const prevData = defineModel("prevData");
34
+ const loadingDiff = defineModel<boolean>("loadingDiff", { default: false });
35
+ const selected = defineModel<any>("selected");
36
+
37
+ function getTimeline() {
38
+ loading.value = true;
39
+ const tlId = props.pageConfig?.parentField && props.pageConfig?.nextDataField ? props.data[props.pageConfig.nextDataField]?.[0]?.id : props.data.id;
40
+ api
41
+ .get(`/data-history/reference/${tlId || props.data.id}?limit=250`)
42
+ .then(r => {
43
+ timeline.value = r.data.data;
44
+ })
45
+ .finally(() => {
46
+ loading.value = false;
47
+ });
48
+ }
49
+
50
+ function getHistoryItem(item: any) {
51
+ selected.value = item;
52
+ loadingDiff.value = true;
53
+ api
54
+ .get(`/data-history/${item.id}/data-diff`)
55
+ .then(r => {
56
+ payload.value = r.data.data.payload;
57
+ prevData.value = r.data.data.prevData;
58
+ })
59
+ .finally(() => {
60
+ loadingDiff.value = false;
61
+ });
62
+ }
63
+
64
+ onMounted(() => {
65
+ getTimeline();
66
+ });
67
+ </script>
68
+
69
+ <template>
70
+ <div class="px-1.5 pb-14 pt-3">
71
+ <h4 class="flex gap-2 pb-3.5 pl-4 font-medium">
72
+ <LucideFileClock :size="22" :stroke-width="1.6" />
73
+ Audit log
74
+ </h4>
75
+ <section class="relative mb-6 text-sm" v-if="loading">
76
+ <div class="absolute left-4 top-0 h-full w-px bg-gray-300"></div>
77
+ <div class="space-y-4">
78
+ <div class="relative flex items-center">
79
+ <div class="flex h-8 w-8 flex-none items-center justify-center overflow-hidden rounded-full bg-slate-50">
80
+ <Skeleton class="h-[13px] w-[13px] rounded-full"></Skeleton>
81
+ </div>
82
+ <div class="ml-3 w-full">
83
+ <Skeleton class="h-2 w-[40%]"></Skeleton>
84
+ </div>
85
+ </div>
86
+ <div class="relative flex items-start">
87
+ <div class="-ml-1.5 flex h-11 w-11 flex-none items-center justify-center overflow-hidden rounded-full border-4 border-slate-50 bg-slate-50">
88
+ <Skeleton class="size-11 rounded-full" />
89
+ </div>
90
+ <div class="ml-2 mr-5 mt-1 w-full rounded-sm border-slate-100 bg-slate-100 px-4 py-3">
91
+ <Skeleton class="mb-2 h-3 w-[30%]"></Skeleton>
92
+ <Skeleton class="mb-2 h-2 w-[60%]"></Skeleton>
93
+ <Skeleton class="h-2 w-[85%]"></Skeleton>
94
+ </div>
95
+ </div>
96
+ <div class="relative flex items-center">
97
+ <div class="flex h-8 w-8 flex-none items-center justify-center overflow-hidden rounded-full bg-slate-50">
98
+ <Skeleton class="h-[13px] w-[13px] rounded-full"></Skeleton>
99
+ </div>
100
+ <div class="ml-3 w-full">
101
+ <Skeleton class="h-2 w-[40%]"></Skeleton>
102
+ </div>
103
+ </div>
104
+ <div class="relative flex items-center">
105
+ <div class="flex h-8 w-8 flex-none items-center justify-center overflow-hidden rounded-full bg-slate-50">
106
+ <Skeleton class="h-[13px] w-[13px] rounded-full"></Skeleton>
107
+ </div>
108
+ <div class="ml-3 w-full">
109
+ <Skeleton class="h-2 w-[40%]"></Skeleton>
110
+ </div>
111
+ </div>
112
+ </div>
113
+ </section>
114
+ <section class="relative mb-6 text-sm" v-else>
115
+ <div class="absolute left-7 top-0 h-full w-px bg-gray-300"></div>
116
+ <div class="space-y-0.5">
117
+ <div v-for="(item, i) in timeline" :key="i" class="rounded-md border border-transparent px-3 pb-3 pt-1" :class="{ '!border-blue-500 bg-blue-100': selected && item.id === selected.id }">
118
+ <!-- <pre>{{ item }}</pre> -->
119
+ <div class="relative flex items-start" v-if="['Create'].includes(item.type)">
120
+ <div
121
+ class="-ml-1.5 flex h-11 w-11 flex-none items-center justify-center overflow-hidden rounded-full border-4 border-slate-50 bg-green-300 text-[17px] font-semibold leading-none text-green-700">
122
+ {{ item.creatorName?.substring(0, 1)?.toUpperCase() }}
123
+ </div>
124
+ <div class="ml-2 pt-2.5 text-sm leading-[1.3]">
125
+ <div class="mr-1.5 font-[500]">{{ item.creatorName }}</div>
126
+ <div class="text-[13px] opacity-75">
127
+ <template v-if="item.type === 'Create'"> Membuat data baru </template>
128
+ <template v-else-if="item.type === 'Update'"> Melakukan perubahan data </template>
129
+ <template v-else>{{ item.type }}</template>
130
+ </div>
131
+ <!-- <button class="text-blue-500 text-[13px] flex items-center font-medium gap-1.5 w-full border mt-1 border-blue-500 pl-1.5 pr-2 py-0.5 rounded-md transition hover:bg-blue-500 hover:text-white"
132
+ v-on:click="getHistoryItem(item)">
133
+ <LucideSquareSplitHorizontal :size="20" :stroke-width="1.8"/>
134
+ Lihat riwayat data
135
+ </button> -->
136
+ </div>
137
+ <div class="ml-auto text-[13px] text-gray-400" :title="moment(item.createdAt).utc().format('DD/MM/YYYY HH:mm')">
138
+ {{ moment(item.createdAt).utc().calendar() }}
139
+ </div>
140
+ </div>
141
+ <div class="relative flex items-start" v-else-if="['approval_reject', 'approval_approve'].includes(item.activityCode)">
142
+ <div class="-ml-1.5 h-11 w-11 flex-none overflow-hidden rounded-full border-4 border-slate-50 bg-green-300 text-green-700"></div>
143
+ <div class="ml-2 mr-5 mt-1 rounded-sm border bg-white px-4 py-3">
144
+ <div class="font-semibold">{{ item.creatorName }} Approve</div>
145
+ <div class="mt-1 text-gray-500">Lorem ipsum dolor, sit amet consectetur adipisicing elit. Deleniti, blanditiis?</div>
146
+ </div>
147
+ <div class="ml-auto flex-none text-[13px] text-gray-400" :title="moment(item.createdAt).utc().format('DD/MM/YYYY HH:mm')">
148
+ {{ moment(item.createdAt).utc().calendar() }}
149
+ </div>
150
+ </div>
151
+ <div class="relative flex items-start" v-else>
152
+ <div class="flex h-8 w-8 flex-none items-center justify-center overflow-hidden rounded-full bg-slate-50">
153
+ <div
154
+ class="flex size-6 items-center justify-center rounded-full p-1 text-white"
155
+ :class="{
156
+ 'bg-blue-500': item.type === 'Update',
157
+ 'bg-green-500': item.type === 'Restore',
158
+ 'bg-red-500': item.type === 'Delete'
159
+ }"
160
+ v-if="['Delete', 'Update', 'Restore'].includes(item.type)">
161
+ <LucideEdit v-if="item.type === 'Update'" />
162
+ <LucideTrash2 v-else-if="item.type === 'Delete'" />
163
+ <LucideUndo2 v-else-if="item.type === 'Restore'" />
164
+ </div>
165
+ <div class="h-[13px] w-[13px] rounded-full border-2 border-gray-400" v-else></div>
166
+ </div>
167
+ <div class="ml-4 pt-1.5 text-sm leading-[1.3]">
168
+ <div class="mr-1.5 font-[500]">{{ item.creatorName }}</div>
169
+ <div class="text-[13px] text-gray-400">
170
+ <template v-if="item.type === 'Delete'"> Menghapus data </template>
171
+ <template v-else-if="item.type === 'Restore'"> Mengembalikan data terhapus </template>
172
+ <template v-else-if="item.type === 'Update'"> Melakukan perubahan data </template>
173
+ <template v-else>{{ item.type }}</template>
174
+ <!-- <button class="text-blue-500 text-[13px] flex items-center font-medium gap-1.5 w-full border mt-1 border-blue-500 pl-1.5 pr-2 py-0.5 rounded-md transition hover:bg-blue-500 hover:text-white"
175
+ :class="{'bg-blue-500 text-white': selected && selected.id === item.id}"
176
+ v-on:click="getHistoryItem(item)"
177
+ v-if="item.type === 'Update'">
178
+ <LucideSquareSplitHorizontal :size="20" :stroke-width="1.8"/>
179
+ Lihat riwayat data
180
+ </button> -->
181
+ </div>
182
+ </div>
183
+ <div class="ml-auto text-[13px] text-gray-400" :title="moment(item.createdAt).utc().format('DD/MM/YYYY HH:mm')">
184
+ {{ moment(item.createdAt).utc().calendar() }}
185
+ </div>
186
+ </div>
187
+ </div>
188
+ </div>
189
+ </section>
190
+ </div>
191
+ </template>
@@ -0,0 +1,29 @@
1
+ <script setup lang="ts">
2
+ import { ref } from 'vue';
3
+ import DocViewerContent, { type DocViewerOptions } from './DocViewerContent.vue'
4
+
5
+ const data = ref<any>({});
6
+ const docs = ref<any>([]);
7
+ const docViewerContent = ref<InstanceType<typeof DocViewerContent>>()
8
+ defineProps(['title', 'detailEndpoint', 'docsEndpoint', 'formSchema', 'pageConfig', 'columns']);
9
+
10
+ async function open(options: DocViewerOptions) {
11
+ return await docViewerContent.value?.open(options);
12
+ }
13
+
14
+ defineExpose({ open });
15
+ </script>
16
+
17
+ <template>
18
+ <DocViewerContent
19
+ ref="docViewerContent"
20
+ :title="title"
21
+ :detail-endpoint="detailEndpoint"
22
+ :docs-endpoint="docsEndpoint"
23
+ :form-schema="formSchema"
24
+ :page-config="pageConfig"
25
+ :columns="columns ?? pageConfig.columns"
26
+ v-model:data="data"
27
+ v-model:docs="docs"
28
+ />
29
+ </template>