@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,6 @@
1
+ <svg width="218" height="36" viewBox="0 0 218 36" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M218 13.9805H65.5467C56.0994 13.9805 46.957 17.3243 39.7391 23.4196L24.6719 36.1433H218V13.9805Z" fill="#91BEF7"/>
3
+ <path d="M25.2224 29.5356L49.525 8.75953L43.774 7.37383L19.4281 28.3645L25.2224 29.5356Z" fill="#91BEF7"/>
4
+ <path d="M4.93729 37.0517L29.2398 16.2756L24.3473 15.0634L0.00133888 36.0542L4.93729 37.0517Z" fill="#FFF200"/>
5
+ <path d="M5.60198 27.1341L25.8613 9.78491L23.0714 9.22105L3.07008 26.399L5.60198 27.1341Z" fill="white"/>
6
+ </svg>
Binary file
Binary file
@@ -0,0 +1,14 @@
1
+ <script setup>
2
+ import { cn } from "@/lib/utils";
3
+ import { LucidePlusCircle } from "lucide-vue-next";
4
+ import BtnCircle from "@/components/button/BtnCircle.vue";
5
+
6
+ const props = defineProps(["class"]);
7
+ </script>
8
+
9
+ <template>
10
+ <BtnCircle :class="cn('!h-auto !w-auto border-[1.5px] border-primary_main bg-white py-1 pl-[5px] pr-3 text-sm text-primary_main', props.class)">
11
+ <LucidePlusCircle :size="25" class="mr-[6px]" :stroke-width="1.5" />
12
+ <slot></slot>
13
+ </BtnCircle>
14
+ </template>
@@ -0,0 +1,10 @@
1
+ <script setup lang="ts">
2
+ import { cn } from '@/lib/utils';
3
+ const props = defineProps(['class'])
4
+ </script>
5
+
6
+ <template>
7
+ <button type="button" :class="cn('text-[12px] 2xl:text-[13px] rounded-full size-7 2xl:size-8 flex items-center justify-center hover:bg-slate-200 dark:hover:bg-dark_bg5 transition text-gray-500 cursor-pointer', props.class)">
8
+ <slot></slot>
9
+ </button>
10
+ </template>
@@ -0,0 +1,15 @@
1
+ <script setup lang="ts">
2
+ import { cn } from "@/lib/utils";
3
+ import { type HTMLAttributes } from "vue";
4
+
5
+ interface Props {
6
+ class?: HTMLAttributes["class"];
7
+ }
8
+ const props = defineProps<Props>();
9
+ </script>
10
+
11
+ <template>
12
+ <button :class="cn('hover:bg-primary_main_hover rounded-md border-2 border-primary_main bg-transparent px-4 py-2 font-medium text-primary_main transition hover:text-white', props.class)">
13
+ <slot></slot>
14
+ </button>
15
+ </template>
@@ -0,0 +1,25 @@
1
+ <script setup lang="ts">
2
+ import { Button } from '@/components/ui/button'
3
+ import { cn } from '@/lib/utils';
4
+ const props = defineProps(['class', 'loading', 'disabled', 'disabledClass'])
5
+ </script>
6
+
7
+ <template>
8
+ <Button
9
+ :class="[
10
+ cn('text-[13px] 2xl:text-[14px] bg-blue-500 px-6 py-0 h-9 2xl:h-11 border-none rounded-md border-blue-500 text-white font-medium hover:bg-blue-600 transition leading-none', props.class),
11
+ { '!bg-gray-300 !text-gray-300 cursor-default relative overflow-hidden !shadow-none': props.loading },
12
+ { '!bg-gray-300 !text-gray-400 cursor-default relative overflow-hidden !shadow-none': props.disabled || props.disabledClass },
13
+ ]"
14
+ :disabled="props.loading || props.disabled">
15
+ <slot></slot>
16
+ <div v-if="props.loading" class="top-0 right-0 bottom-0 left-0 bg-gray-300">
17
+ <svg class="absolute left-0 top-0 bottom-0 right-0 m-auto w-7 h-7 text-black animate-spin" fill="none"
18
+ viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
19
+ <circle class="opacity-15" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="2" />
20
+ <path class="opacity-15" fill="currentColor"
21
+ d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" />
22
+ </svg>
23
+ </div>
24
+ </Button>
25
+ </template>
@@ -0,0 +1,26 @@
1
+ <script setup lang="ts">
2
+ import { Button } from "@/components/ui/button";
3
+ import { cn } from "@/lib/utils";
4
+ const props = defineProps(["class", "disabled", "loading", "disabledClass"]);
5
+ </script>
6
+
7
+ <template>
8
+ <Button
9
+ :class="[
10
+ cn(
11
+ 'h-9 rounded-md border-none border-primary_main bg-blue-50 bg-transparent px-6 text-[13px] font-medium text-primary_main shadow-none transition hover:border-primary_main hover:bg-blue-100 2xl:h-11 2xl:text-sm',
12
+ props.class
13
+ ),
14
+ { 'relative cursor-default overflow-hidden !bg-gray-300 !text-gray-300 !shadow-none': props.loading },
15
+ { 'relative cursor-default overflow-hidden !bg-gray-300 !text-gray-400 !shadow-none': props.disabled || props.disabledClass }
16
+ ]"
17
+ :disabled="props.disabled || props.loading">
18
+ <slot></slot>
19
+ <div v-if="props.loading" class="bottom-0 left-0 right-0 top-0 bg-gray-300">
20
+ <svg class="absolute bottom-0 left-0 right-0 top-0 m-auto h-7 w-7 animate-spin text-black" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
21
+ <circle class="opacity-15" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="2" />
22
+ <path class="opacity-15" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" />
23
+ </svg>
24
+ </div>
25
+ </Button>
26
+ </template>
@@ -0,0 +1,144 @@
1
+ <script setup>
2
+ import moment from 'moment';
3
+
4
+ moment.updateLocale('en', {
5
+ relativeTime : {
6
+ future: "in %s",
7
+ past: "%s ago",
8
+ s : '1s',
9
+ ss : '%ds',
10
+ m: "1m",
11
+ mm: "%dm",
12
+ h: "1h",
13
+ hh: "%dh",
14
+ d: "1d",
15
+ dd: "%dd",
16
+ w: "1w",
17
+ ww: "%dw",
18
+ M: "1Mo",
19
+ MM: "%dMo",
20
+ y: "1y",
21
+ yy: "%dy"
22
+ },
23
+ });
24
+
25
+ const props = defineProps(['timeline', 'theme']);
26
+ </script>
27
+
28
+ <template>
29
+ <section
30
+ class="relative text-sm mb-6 rounded-md p-3 bg-white dark:bg-dasi_dark_bg3 transition-colors"
31
+ >
32
+ <div class="absolute left-7 top-0 w-px h-full bg-gray-300 dark:bg-dasi_dark_bg5"></div>
33
+ <div class="space-y-4">
34
+ <div v-for="(item, i) in props.timeline" :key="i">
35
+ <!-- CRUD/restore timeline item -->
36
+ <div
37
+ class="relative flex items-center"
38
+ v-if="['create', 'edit', 'delete_soft', 'restore'].includes(item.activityCode)"
39
+ >
40
+ <div
41
+ class="flex-none w-11 h-11 -ml-1.5 rounded-full bg-green-300 text-green-700 border-4 border-slate-50 overflow-hidden flex items-center justify-center font-semibold text-[17px] leading-none
42
+ dark:bg-green-900 dark:text-green-200 dark:border-dasi_dark_bg3"
43
+ :class="{'!border-slate-100 dark:!border-dasi_dark_bg3': props.theme === 'theme2'}"
44
+ >
45
+ {{ item.userName ? item.userName.substring(0,1).toUpperCase() : '' }}
46
+ </div>
47
+ <div class="ml-2 pt-1" v-if="props.theme === 'theme2'">
48
+ <h4 class="font-medium text-[15px]">
49
+ {{ item.pageName }}
50
+ <span class="text-gray-400 dark:text-gray-500 text-[13px] ml-1 mr-2">&bull;</span>
51
+ <span
52
+ class="text-gray-400 dark:text-gray-500 text-[13px] text-right whitespace-nowrap pl-3 mb-auto"
53
+ :title="moment(item.createdAt).format('D MMM YYYY HH:mm')"
54
+ >
55
+ {{ moment(item.createdAt).fromNow() }}
56
+ </span>
57
+ </h4>
58
+ <p class="text-gray-400 dark:text-gray-400 text-[14px]">
59
+ {{ item.userName }}
60
+ <b class="font-medium text-dasi_text_color dark:text-dasi_text_color">{{ item.activityName }}</b> pada
61
+ {{ item.pageName }}
62
+ </p>
63
+ </div>
64
+ <div class="ml-2" v-else>
65
+ <span class="font-[500]">{{ item.userName }}</span>
66
+ <span class="text-gray-400 dark:text-gray-400">{{ item.activityName }}</span>
67
+ </div>
68
+ <div
69
+ class="ml-auto text-gray-400 dark:text-gray-500 text-[13px] text-right whitespace-nowrap pl-3 mb-auto"
70
+ :class="{'!hidden': props.theme === 'theme2'}"
71
+ :title="moment(item.createdAt).format('D MMM YYYY HH:mm')"
72
+ >
73
+ {{ moment(item.createdAt).fromNow() }}
74
+ </div>
75
+ </div>
76
+ <!-- Approval timeline item -->
77
+ <div
78
+ class="relative flex items-start"
79
+ v-else-if="['approval_reject', 'approval_approve'].includes(item.activityCode)"
80
+ >
81
+ <div
82
+ class="flex-none w-11 h-11 -ml-1.5 rounded-full bg-green-300 text-green-700 border-4 border-slate-50 overflow-hidden
83
+ dark:bg-green-900 dark:text-green-200 dark:border-dasi_dark_bg3"
84
+ :class="{'!border-slate-100 dark:!border-dasi_dark_bg3': props.theme === 'theme2'}"
85
+ ></div>
86
+ <div class="ml-2 bg-white dark:bg-dasi_dark_bg3 px-4 py-3 border dark:border-dasi_dark_bg5 rounded-sm mt-1 mr-5">
87
+ <div class="font-semibold">{{ item.userName }} Approve</div>
88
+ <div class="text-gray-500 dark:text-gray-400 mt-1">
89
+ Lorem ipsum dolor, sit amet consectetur adipisicing elit. Deleniti, blanditiis?
90
+ </div>
91
+ </div>
92
+ <div
93
+ class="ml-auto text-gray-400 dark:text-gray-500 text-[13px] flex-none text-right whitespace-nowrap pl-3 mb-auto"
94
+ :class="{'!hidden': props.theme === 'theme2'}"
95
+ :title="moment(item.createdAt).format('D MMM YYYY HH:mm')"
96
+ >
97
+ {{ moment(item.createdAt).fromNow() }}
98
+ </div>
99
+ </div>
100
+ <!-- Default timeline item -->
101
+ <div
102
+ class="relative flex items-center"
103
+ v-else
104
+ :class="{'!items-start': props.theme === 'theme2'}"
105
+ >
106
+ <div
107
+ class="flex-none w-8 h-8 rounded-full overflow-hidden flex items-center justify-center bg-slate-50 dark:bg-dasi_dark_bg5"
108
+ :class="{'!bg-slate-100 dark:!bg-dasi_dark_bg5': props.theme === 'theme2'}"
109
+ >
110
+ <div class="w-[13px] h-[13px] rounded-full border-2 border-gray-400 dark:border-gray-600"></div>
111
+ </div>
112
+ <div class="ml-3.5 pt-1" v-if="props.theme === 'theme2'">
113
+ <h4 class="font-medium text-[15px]">
114
+ {{ item.pageName }}
115
+ <span class="text-gray-400 dark:text-gray-500 text-[13px] ml-1 mr-2">&bull;</span>
116
+ <span
117
+ class="text-gray-400 dark:text-gray-500 text-[13px] text-right whitespace-nowrap pl-3 mb-auto"
118
+ :title="moment(item.createdAt).format('D MMM YYYY HH:mm')"
119
+ >
120
+ {{ moment(item.createdAt).fromNow() }}
121
+ </span>
122
+ </h4>
123
+ <p class="text-gray-400 dark:text-gray-400 text-[14px]">
124
+ {{ item.userName }}
125
+ <b class="font-medium text-dasi_text_color dark:text-dasi_text_color">{{ item.activityName }}</b> pada
126
+ {{ item.pageName }}
127
+ </p>
128
+ </div>
129
+ <div class="ml-3.5" v-else>
130
+ <span class="font-[500]">{{ item.userName }}</span>
131
+ <span class="text-gray-400 dark:text-gray-400">{{ item.activityName }}</span>
132
+ </div>
133
+ <div
134
+ class="ml-auto text-gray-400 dark:text-gray-500 text-[13px] text-right whitespace-nowrap pl-3 mb-auto"
135
+ :class="{'!hidden': props.theme === 'theme2'}"
136
+ :title="moment(item.createdAt).format('D MMM YYYY HH:mm')"
137
+ >
138
+ {{ moment(item.createdAt).fromNow() }}
139
+ </div>
140
+ </div>
141
+ </div>
142
+ </div>
143
+ </section>
144
+ </template>
@@ -0,0 +1,288 @@
1
+ <script setup lang="ts">
2
+ import { getMenuItemByUrl, isValidValue } from '@/lib/utils';
3
+ import { FileCheck2, LucideCheckCheck, LucideCircleX, LucideCornerRightUp, LucideSend, LucideSettings, LucideX, LucideXCircle } from 'lucide-vue-next';
4
+ import moment from 'moment';
5
+ import { RouterLink } from 'vue-router';
6
+ import { Skeleton } from '../ui/skeleton';
7
+ import BtnPrimary from '../button/BtnPrimary.vue';
8
+ import { onMounted, ref } from 'vue';
9
+
10
+ const props = defineProps(['data', 'saving', 'loading', 'approvalStrategy', 'approvals', 'myApproval', 'requester']);
11
+ const emits = defineEmits(['approve', 'reject', 'submit']);
12
+ const menu = ref<any>();
13
+
14
+ onMounted(() => {
15
+ menu.value = getMenuItemByUrl('/approval/approval-strategy');
16
+ })
17
+ </script>
18
+
19
+ <template>
20
+ <div class="px-4 pt-4 pb-6 space-y-2.5" v-if="props.loading">
21
+ <Skeleton class="w-full h-4 rounded-full"/>
22
+ <Skeleton class="w-[80%] h-4 rounded-full"/>
23
+ <Skeleton class="w-[40%] h-4 rounded-full"/>
24
+ </div>
25
+ <template v-else>
26
+ <div class="leading-[1.325] px-4 pt-3 pb-6 text-gray-500"
27
+ v-if="!approvalStrategy && !isValidValue(approvals)">
28
+ <FileCheck2 :size="26" :stroke-width="1.8" class="mb-3"/>
29
+ <h4 class="font-medium mb-0.5">Pengaturan approval belum ditetapkan.</h4>
30
+ <div class="text-sm mb-3">
31
+ Mohon untuk tetapkan pengaturan approval
32
+ pada halaman Approval Strategy.
33
+ </div>
34
+ <RouterLink class="border pl-2 pr-3 gap-1 py-1.5 flex items-center w-fit rounded-md text-[13px] hover:bg-blue-100 hover:text-blue-500 hover:border-blue-300 transition"
35
+ :to="menu.url" target="_blank" rel="noopener"
36
+ v-if="menu">
37
+ <LucideSettings :size="18"/>
38
+ Tetapkan Pengaturan
39
+ </RouterLink>
40
+ </div>
41
+ <section class="space-y-2" v-else>
42
+
43
+ <!-- My approval -->
44
+ <section
45
+ v-if="myApproval && myApproval.approvalStatus !== 'PENDING'
46
+ && !(myApproval.approvalStatus === 'WAITING_APPROVAL' && data.status === 'REJECTED')"
47
+ class="px-4 pt-3 pb-1"
48
+ :class="{'!bg-green-50 border-green-400 dark:!bg-green-950': myApproval.approvalStatus === 'APPROVED',
49
+ '!bg-red-50 border-red-300': myApproval.approvalStatus === 'REJECTED',
50
+ '!bg-blue-50 border-blue-300': myApproval.approvalStatus === 'PASSED'}">
51
+ <h4 class="font-semibold mb-[2px]">Approval</h4>
52
+ <p class="text-[13px] leading-snug mb-4">
53
+ <template v-if="['APPROVED', 'REJECTED'].includes(myApproval.approvalStatus)">
54
+ <span class="opacity-75">Anda telah </span>
55
+ <span class="font-medium text-green-500" v-if="myApproval.approvalStatus === 'APPROVED'">Menyetujui</span>
56
+ <span class="font-medium text-red-500" v-else-if="myApproval.approvalStatus === 'REJECTED'">Menolak</span>
57
+ <span class="opacity-75"> data ini pada<br />
58
+ <template v-if="myApproval.approvalDate">
59
+ {{ moment(myApproval.approvalDate).utc().format('D MMM YYYY HH:mm') }}
60
+ </template>
61
+ </span>
62
+ </template>
63
+ <span class="opacity-75" v-else-if="myApproval.approvalStatus === 'WAITING_APPROVAL'">
64
+ Data ini membutuhkan approval Anda, silahkan setujui atau tolak dengan klik tombol di bawah.
65
+ </span>
66
+ <span class="opacity-75" v-else-if="myApproval.approvalStatus === 'PASSED'">
67
+ Request approval Anda untuk aktifitas ini telah terlewati.
68
+ </span>
69
+ <template v-else>{{ myApproval.approvalStatus }}</template>
70
+ </p>
71
+ <div class="mb-2" v-if="myApproval.approvalStatus === 'APPROVED'">
72
+ <div class="text-green-500 font-medium -mt-1 flex items-center">
73
+ <LucideCheckCheck class="mr-3"/>
74
+ Approved
75
+ </div>
76
+ <div class="text-[12px] mt-1 opacity-75" v-if="myApproval.approvalDate">
77
+ Approved {{ moment(myApproval.approvalDate).utc().subtract(7, 'hour').calendar() }}
78
+ </div>
79
+ </div>
80
+ <div class="mb-2" v-else-if="myApproval.approvalStatus === 'REJECTED'">
81
+ <div class="text-red-500 font-medium -mt-1 flex items-center">
82
+ <LucideXCircle class="mr-2" :stroke-width="1.6"/>
83
+ Rejected
84
+ </div>
85
+ <div class="text-[12px] mt-1 opacity-75" v-if="myApproval.approvalDate">
86
+ Rejected {{ moment(myApproval.approvalDate).utc().subtract(7, 'hour').calendar() }}
87
+ </div>
88
+ </div>
89
+ <div class="mb-2" v-else-if="myApproval.approvalStatus === 'PASSED'">
90
+ <div class="text-blue-500 font-medium -mt-1 flex items-center">
91
+ <LucideCornerRightUp class="mr-3"/>
92
+ Passed
93
+ </div>
94
+ </div>
95
+ <template v-else-if="myApproval.approvalStatus === 'WAITING_APPROVAL'">
96
+ <div v-if="saving" class="h-9 mb-2 rounded-md relative flex items-center pl-9 text-gray-400 text-sm italic">
97
+ <svg class="absolute left-0 top-0 bottom-0 m-auto size-6 text-black animate-spin" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
98
+ <circle class="opacity-15" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="2"/>
99
+ <path class="opacity-15" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"/>
100
+ </svg>
101
+ Saving approval...
102
+ </div>
103
+ <div class="grid grid-cols-2 gap-3.5" v-else>
104
+ <button class="w-full text-left flex items-center border-red-500 border px-3 h-[34px] rounded-md text-red-500 transition hover:bg-red-100 text-sm"
105
+ @click="emits('reject')">
106
+ <LucideCircleX class="mr-2" :size="20" :stroke-width="1.5"/> Tolak
107
+ </button>
108
+ <button class="w-full text-left flex items-center bg-green-500 px-3 h-[34px] rounded-md text-white mb-2 border border-green-500 hover:bg-green-600 hover:border-green-600 transition text-sm"
109
+ @click="emits('approve')">
110
+ <LucideCheckCheck class="mr-2" :size="20"/> Setujui
111
+ </button>
112
+ </div>
113
+ </template>
114
+ </section>
115
+
116
+ <!-- Requester -->
117
+ <section class="px-4 pt-3 pb-1" v-if="requester">
118
+ <h4 class="font-semibold mb-[2px]">Pengajuan Approval</h4>
119
+ <p class="text-[13px] leading-snug mb-3">
120
+ <span class="opacity-75">
121
+ Request approval ini diajukan oleh
122
+ </span>
123
+ </p>
124
+ <div class="flex items-start text-sm">
125
+ <div class="flex-none size-6 bg-green-200 text-green-700 font-medium text-xs rounded-full mr-2.5 flex items-center justify-center">
126
+ {{ requester.name.substring(0, 1).toUpperCase() }}
127
+ </div>
128
+ <div>
129
+ <h4 class="font-medium">{{ requester.name }}</h4>
130
+ <p class="text-gray-500 text-xs leading-[1.175]">
131
+ <span class="font-medium">{{ requester.organization?.accessLevel?.name }}</span> &bull;
132
+ {{ requester.organization?.name }}
133
+ </p>
134
+ </div>
135
+ </div>
136
+ </section>
137
+
138
+ <!-- Approver list -->
139
+ <section class="px-4 pt-3 pb-1">
140
+ <h4 class="font-semibold mb-[2px]">
141
+ <template v-if="['WAITING_APPROVAL', 'APPROVED_PARTIALY'].includes(data.status)">
142
+ Waiting Approval
143
+ </template>
144
+ <template v-else>Approval</template>
145
+ </h4>
146
+ <p class="text-[13px] leading-snug opacity-75 mb-2">Aktifitas ini membutuhkan approval dari</p>
147
+
148
+ <template v-if="isValidValue(approvals)">
149
+ <div class="mb-5" v-for="(approvalLevel, i1) in approvals" :key="i1">
150
+ <div class="uppercase font-medium text-xs opacity-65 mb-1.5">
151
+ Approval Tingkat {{ i1+1 }}
152
+ </div>
153
+ <div class="flex pb-1 mb-2 items-start text-sm border-b border-dashed"
154
+ v-for="(item, i2) in approvalLevel">
155
+ <div class="mr-auto flex"
156
+ v-if="(myApproval?.approvalLevelIdx ?? 0) >= i1 && (myApproval?.approvalCodeIdx ?? 0) >= i2 && item.approvalCode?.account">
157
+ <div class="flex-none size-6 bg-green-200 text-green-700 font-medium text-xs rounded-full mr-2.5 flex items-center justify-center">
158
+ {{ (item.approvalCode?.account?.name ?? '?').substring(0,1) }}
159
+ </div>
160
+ <div class="w-full leading-[1.2]">
161
+ <h4 class="font-semibold pt-0.5 text-sm">{{ item.approvalCode?.account?.name ?? '-' }}</h4>
162
+ <p class="text-gray-500 text-xs leading-[1.175]">
163
+ <span class="font-medium">{{ item.approvalCode?.account?.organization?.accessLevel?.name }}</span> &bull;
164
+ {{ item.approvalCode?.account?.organization?.name }}
165
+ </p>
166
+ </div>
167
+ </div>
168
+ <div class="mr-auto mb-auto" v-else>
169
+ <h4 class="font-semibold text-sm">{{ item.approvalCode?.name }}</h4>
170
+ </div>
171
+ <div class="ml-auto text-right leading-[1] flex-none">
172
+ <div class="font-semibold text-[11px] uppercase flex items-center border rounded-full px-2 leading-none pt-1 pb-[3px] w-fit ml-auto"
173
+ :class="{
174
+ 'text-gray-500 bg-gray-50 border-gray-300': !item.approvalStatus,
175
+ 'text-orange-400 bg-orange-50 border-orange-200': item.approvalStatus === 'WAITING_APPROVAL',
176
+ 'text-red-500 bg-red-50 border-red-300': item.approvalStatus === 'REJECTED',
177
+ 'text-green-500 bg-green-50 border-green-300': item.approvalStatus === 'APPROVED',
178
+ 'text-blue-500 bg-blue-50 border-blue-300': ['PASSED'].includes(item.approvalStatus),
179
+ 'text-yellow-400 bg-yellow-50 border-yellow-200': ['PENDING'].includes(item.approvalStatus),
180
+ }">
181
+ <template v-if="!item.approvalStatus">
182
+ Not Submited
183
+ </template>
184
+ <template v-else-if="['pending'].includes(item.approvalStatus)">
185
+ Pending
186
+ </template>
187
+ <template v-else-if="['WAITING_APPROVAL'].includes(item.approvalStatus)">
188
+ Requested
189
+ </template>
190
+ <template v-else-if="item.approvalStatus === 'APPROVED'">
191
+ <LucideCheckCheck :size="15" class="mr-1 -my-[2px]"/>
192
+ Approved
193
+ </template>
194
+ <template v-else-if="item.approvalStatus === 'PASSED'">
195
+ Passed
196
+ </template>
197
+ <template v-else-if="item.approvalStatus === 'REJECTED'">
198
+ Rejected
199
+ </template>
200
+ <template v-else>{{ item.approvalStatus }}</template>
201
+ </div>
202
+ <div class="opacity-65 text-[11px] mt-1"
203
+ v-if="item.approvalDate && item.approvalStatus !== 'PASSED'">
204
+ {{ moment(item.approvalDate).utc().format('DD/MM/YYYY HH:mm') }}
205
+ </div>
206
+ </div>
207
+ </div>
208
+ </div>
209
+ </template>
210
+
211
+ <template v-else-if="approvalStrategy">
212
+ <div class="mb-5" v-for="(approvalLevel, i1) in approvalStrategy.approvalLevels" :key="i1">
213
+ <div class="uppercase font-medium text-xs opacity-65 mb-1.5">
214
+ Approval Tingkat {{ i1+1 }}
215
+ </div>
216
+ <div class="flex pb-1 mb-2 items-start text-sm border-b border-dashed"
217
+ v-for="(item, i2) in approvalLevel.approvalCodes">
218
+ <div class="mr-auto flex"
219
+ v-if="(myApproval?.approvalLevelIdx ?? 0) >= i1 && (myApproval?.approvalCodeIdx ?? 0) >= i2 && item.approvalCode?.account">
220
+ <div class="flex-none size-6 bg-green-200 text-green-700 font-medium text-xs rounded-full mr-2.5 flex items-center justify-center">
221
+ {{ (item.approvalCode?.account?.name ?? '?').substring(0,1) }}
222
+ </div>
223
+ <div class="w-full leading-[1.2]">
224
+ <h4 class="font-semibold pt-0.5 text-sm">{{ item.approvalCode?.account?.name ?? '-' }}</h4>
225
+ <p class="text-gray-500 text-xs leading-[1.175]">
226
+ <span class="font-medium">{{ item.approvalCode?.account?.organization?.accessLevel?.name }}</span> &bull;
227
+ {{ item.approvalCode?.account?.organization?.name }}
228
+ </p>
229
+ </div>
230
+ </div>
231
+ <div class="mr-auto mb-auto" v-else>
232
+ <h4 class="font-semibold text-sm">{{ item.approvalCode?.name }}</h4>
233
+ </div>
234
+ <div class="ml-auto text-right leading-[1] flex-none">
235
+ <div class="font-semibold text-[11px] uppercase flex items-center border rounded-full px-2 leading-none pt-1 pb-[3px] w-fit ml-auto"
236
+ :class="{
237
+ 'text-gray-500 bg-gray-50 border-gray-300': !item.approvalStatus,
238
+ 'text-orange-400 bg-orange-50 border-orange-200': item.approvalStatus === 'WAITING_APPROVAL',
239
+ 'text-red-500 bg-red-50 border-red-300': item.approvalStatus === 'REJECTED',
240
+ 'text-green-500 bg-green-50 border-green-300': item.approvalStatus === 'APPROVED',
241
+ 'text-blue-500 bg-blue-50 border-blue-300': ['PASSED'].includes(item.approvalStatus),
242
+ 'text-yellow-400 bg-yellow-50 border-yellow-200': ['PENDING'].includes(item.approvalStatus),
243
+ }">
244
+ <template v-if="!item.approvalStatus">
245
+ Not Submited
246
+ </template>
247
+ <template v-else-if="['pending'].includes(item.approvalStatus)">
248
+ Pending
249
+ </template>
250
+ <template v-else-if="['WAITING_APPROVAL'].includes(item.approvalStatus)">
251
+ Requested
252
+ </template>
253
+ <template v-else-if="item.approvalStatus === 'APPROVED'">
254
+ <LucideCheckCheck :size="15" class="mr-1 -my-[2px]"/>
255
+ Approved
256
+ </template>
257
+ <template v-else-if="item.approvalStatus === 'PASSED'">
258
+ Passed
259
+ </template>
260
+ <template v-else-if="item.approvalStatus === 'REJECTED'">
261
+ Rejected
262
+ </template>
263
+ <template v-else>{{ item.approvalStatus }}</template>
264
+ </div>
265
+ <div class="opacity-65 text-[11px] mt-1" v-if="item.approvalDate">
266
+ {{ moment(item.approvalDate).utc().format('DD/MM/YYYY HH:mm') }}
267
+ </div>
268
+ </div>
269
+ </div>
270
+ </div>
271
+ </template>
272
+
273
+ <div v-if="data.status === 'APPROVAL_REQUIRED'">
274
+ <p class="text-[13px] leading-snug opacity-75 mb-2">
275
+ Mulai proses approval dengan klik tombol Submit Approval.
276
+ Mohon pastikan data sudah sesuai untuk mulai proses Approval.
277
+ </p>
278
+ <BtnPrimary class="w-full text-left justify-start !font-normal flex items-center px-3 !h-[36px] !text-sm"
279
+ @click="emits('submit')"
280
+ :loading="saving">
281
+ <LucideSend class="mr-2" :size="20" :stroke-width="1.5"/>
282
+ Submit Approval
283
+ </BtnPrimary>
284
+ </div>
285
+ </section>
286
+ </section>
287
+ </template>
288
+ </template>