@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,205 @@
1
+ <script setup lang="ts">
2
+ import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog";
3
+ import { client } from "@passwordless-id/webauthn";
4
+ import { LucideRectangleEllipsis, LucideCircleSlash } from "lucide-vue-next";
5
+ import { cn } from "@/lib/utils";
6
+ import { ref } from "vue";
7
+ import { PinInput, PinInputGroup, PinInputInput } from "@/components/ui/pin-input";
8
+ import LoadingIndicator from "@/components/loadings/LoadingIndicator.vue";
9
+ import api from "@/api/api";
10
+
11
+ const props = defineProps(["class", "secondaryBtnClass", "primaryBtnClass"]);
12
+ const dialogOpen = ref<boolean>(false);
13
+ const loading = ref<boolean>(false);
14
+ const error = ref<string | null>(null);
15
+ const pin = ref<string[]>([]);
16
+ const next: any = ref(null);
17
+ const pinInitialized = ref(true);
18
+ const initError = ref(false);
19
+ const biometricEnabled = ref(false);
20
+
21
+ function open(n: any) {
22
+ dialogOpen.value = true;
23
+ error.value = null;
24
+ pin.value = [];
25
+ next.value = n;
26
+ pinInitialized.value = false;
27
+ biometricEnabled.value = false;
28
+ loading.value = true;
29
+ initError.value = false;
30
+ initAuthentication();
31
+ }
32
+
33
+ function initAuthentication() {
34
+ loading.value = true;
35
+ initError.value = false;
36
+ api
37
+ .get("/auth/authenticationMethods")
38
+ .then(async r => {
39
+ pinInitialized.value = r.data.pinInitialized;
40
+ biometricEnabled.value = r.data.biometricEnabled;
41
+ if (biometricEnabled.value) {
42
+ /**
43
+ * Try authenticate with biometric
44
+ *
45
+ */
46
+ try {
47
+ const options = r.data.biometricOptions;
48
+ const authentication = await client.authenticate(
49
+ options.publicKey.allowCredentials.map((row: any) => row.id),
50
+ options.publicKey.challenge,
51
+ {
52
+ authenticatorType: "auto",
53
+ userVerification: "required",
54
+ timeout: 60000
55
+ }
56
+ );
57
+ const formData = {
58
+ id: authentication.credentialId,
59
+ rawId: authentication.credentialId,
60
+ response: {
61
+ authenticatorData: authentication.authenticatorData,
62
+ clientDataJSON: authentication.clientData,
63
+ signature: authentication.signature
64
+ },
65
+ type: "public-key",
66
+ clientExtensionResults: {},
67
+ authenticatorAttachment: "platform"
68
+ };
69
+ api
70
+ .post("/auth/verifyBiometric", formData)
71
+ .then(ar => {
72
+ /**
73
+ * Biometric authentication success
74
+ *
75
+ */
76
+ close(true);
77
+ })
78
+ .catch(err => {
79
+ /**
80
+ * Failed biometric,
81
+ * try with pin
82
+ *
83
+ */
84
+ loading.value = false;
85
+ });
86
+ } catch (err) {
87
+ /**
88
+ * Failed biometric,
89
+ * try with pin
90
+ *
91
+ */
92
+ console.error(err);
93
+ loading.value = false;
94
+ }
95
+ return;
96
+ }
97
+ loading.value = false;
98
+ if (pinInitialized.value) setFocus("first");
99
+ })
100
+ .catch(err => {
101
+ console.error(err);
102
+ loading.value = false;
103
+ initError.value = true;
104
+ });
105
+ }
106
+
107
+ function setFocus(type: string) {
108
+ setTimeout(() => {
109
+ const pinInputsEl: any = document.getElementsByClassName("relative text-center focus:outline-none w-full text-xl");
110
+ if (pinInputsEl.length > 0 && pinInputsEl[0]) {
111
+ if (type === "first") pinInputsEl[0].focus();
112
+ else pinInputsEl[pinInputsEl.length - 1].focus();
113
+ }
114
+ });
115
+ }
116
+
117
+ function verifyPin() {
118
+ const pinStr = pin.value.join("");
119
+ loading.value = true;
120
+ api
121
+ .post("/auth/verifyPin", {
122
+ pin: pinStr
123
+ })
124
+ .then(r => {
125
+ close(true);
126
+ })
127
+ .catch(err => {
128
+ error.value = "PIN yang Anda masukkan salah, silahkan coba lagi";
129
+ loading.value = false;
130
+ setFocus("last");
131
+ });
132
+ }
133
+
134
+ function pinChanged() {
135
+ error.value = null;
136
+ }
137
+
138
+ function close(b: boolean) {
139
+ dialogOpen.value = false;
140
+ if (next.value) next.value(b);
141
+ }
142
+
143
+ defineExpose({ open });
144
+ </script>
145
+
146
+ <template>
147
+ <Dialog v-model:open="dialogOpen">
148
+ <DialogContent :class="[cn('max-w-[425px]', props.class), { 'bg-red-100 text-red-500': initError }]">
149
+ <div class="flex items-center justify-center py-4" v-if="loading">
150
+ <LoadingIndicator class="scale-75" />
151
+ </div>
152
+ <div class="text-center" v-else-if="initError">
153
+ <div class="relative inline-block">
154
+ <LucideCircleSlash class="mb-2 mt-2" :size="38" :stroke-width="1.5" />
155
+ </div>
156
+ <h4 class="mb-1 font-semibold">Koneksi Gagal</h4>
157
+ <p class="mb-3 text-sm">Tidak dapat menghubungkan ke server, periksa kembali koneksi internet Anda.</p>
158
+ <button
159
+ class="inline-block rounded-md border-2 border-transparent bg-transparent px-6 py-2 font-medium text-primary_main shadow-none transition hover:border-primary_main hover:bg-blue-50"
160
+ v-on:click="initAuthentication">
161
+ Coba Lagi
162
+ </button>
163
+ </div>
164
+ <div class="text-center" v-else-if="!pinInitialized">
165
+ <div class="relative inline-block">
166
+ <LucideRectangleEllipsis class="mb-4 mt-1" :size="56" :stroke-width="1" />
167
+ <div class="absolute top-7 h-1 w-full -rotate-45 bg-white"></div>
168
+ <div class="absolute top-8 h-[2px] w-full -rotate-45 bg-text_main"></div>
169
+ </div>
170
+ <h4 class="mb-1 font-semibold">PIN Belum Ditetapkan</h4>
171
+ <p class="mb-3 text-sm text-gray-500">Silahkan tetapkan PIN pada menu pengaturan untuk melakukan transaksi data.</p>
172
+ <a
173
+ href="/settings/account"
174
+ target="_blank"
175
+ v-on:click="close(false)"
176
+ class="inline-block rounded-md border-2 border-transparent bg-transparent px-6 py-2 font-medium text-primary_main shadow-none transition hover:border-primary_main hover:bg-blue-50"
177
+ >Tetapkan Pin</a
178
+ >
179
+ </div>
180
+ <template v-else>
181
+ <DialogHeader>
182
+ <DialogTitle class="mb-0 text-xl leading-tight"> DASI PIN </DialogTitle>
183
+ <DialogDescription class="mt-0 text-[16px] leading-tight">
184
+ <slot name="description"> Masukkan PIN untuk melakukan aksi ini </slot>
185
+ </DialogDescription>
186
+ </DialogHeader>
187
+ <div class="flex h-[78px] items-center justify-center" v-if="loading">
188
+ <LoadingIndicator class="scale-75" />
189
+ </div>
190
+ <div class="-mx-6 px-6 py-3" v-else>
191
+ <PinInput id="otp-input" v-model="pin" placeholder="○" @complete="verifyPin" :mask="true" v-on:update:model-value="pinChanged">
192
+ <PinInputGroup class="gap-2">
193
+ <template v-for="(_, index) in 6" :key="id">
194
+ <PinInputInput class="w-full rounded-md border py-3 text-xl" :class="{ 'border-red-400 bg-red-50 text-red-500': error }" :index="index" />
195
+ </template>
196
+ </PinInputGroup>
197
+ </PinInput>
198
+ <div class="pt-2 text-sm text-red-500" v-if="error">
199
+ {{ error }}
200
+ </div>
201
+ </div>
202
+ </template>
203
+ </DialogContent>
204
+ </Dialog>
205
+ </template>
@@ -0,0 +1,122 @@
1
+ <script setup></script>
2
+
3
+ <template>
4
+ <article>
5
+ <p>Effective Date: 27 Dec 2024</p>
6
+ <h3>1. Pendahuluan</h3>
7
+ <p>
8
+ Selamat datang di aplikasi BIOMASSA! Syarat dan Ketentuan ini ("Syarat") mengatur penggunaan aplikasi, situs web, dan layanan kami (secara kolektif disebut "Layanan"). Dengan mengakses atau menggunakan Layanan, Anda setuju untuk mematuhi Syarat ini. Jika Anda tidak setuju, harap jangan gunakan Layanan.
9
+ </p>
10
+ <h3>2. Penggunaan Layanan</h3>
11
+ <b>Kelayakan</b>
12
+ <p>
13
+ Anda harus berusia minimal 17 tahun untuk menggunakan Layanan. Dengan menggunakan Layanan, Anda menyatakan bahwa Anda memenuhi persyaratan ini.
14
+ </p>
15
+ <b>Tanggung Jawab Pengguna</b>
16
+ <ul>
17
+ <li>Memberikan informasi yang akurat dan terkini saat pendaftaran.</li>
18
+ <li>Menjaga kerahasiaan kredensial akun Anda.</li>
19
+ <li>Menggunakan Layanan hanya untuk tujuan yang sah dan sesuai dengan hukum yang berlaku.</li>
20
+ </ul>
21
+ <h3>
22
+ 3. Konten yang Dihasilkan Pengguna
23
+ </h3>
24
+ <p>
25
+ Anda dapat mengunggah, mengirim, atau membagikan konten melalui Layanan ("Konten Pengguna"). Dengan melakukannya, Anda memberikan kami lisensi non-eksklusif, bebas royalti, dan berlaku di seluruh dunia untuk menggunakan, menampilkan, dan mendistribusikan Konten Pengguna Anda sebagaimana diperlukan untuk mengoperasikan Layanan. Anda bertanggung jawab penuh atas Konten Pengguna Anda dan kepatuhannya terhadap hukum.
26
+ </p>
27
+ <h3>4. Aktivitas yang Dilarang</h3>
28
+ <p>Anda setuju untuk tidak:</p>
29
+ <ul>
30
+ <li>Menggunakan Layanan untuk tujuan ilegal atau tidak sah.</li>
31
+ <li>Memposting atau membagikan konten yang bersifat kasar, fitnah, cabul, atau melanggar hak kekayaan intelektual.</li>
32
+ <li>Mengganggu atau merusak Layanan atau server.</li>
33
+ </ul>
34
+ <h3>5. KEBIJAKAN PRIVASI</h3>
35
+ <p>
36
+ Kami menghargai privasi Anda dan berkomitmen untuk melindungi data pribadi Anda. Kebijakan ini menjelaskan bagaimana kami mengumpulkan, menggunakan, menyimpan, dan melindungi informasi pribadi Anda sesuai dengan peraturan perundang-undangan yang berlaku.
37
+ </p>
38
+ <h4>1. Data Pribadi yang Dikumpulkan</h4>
39
+ <p>Kami dapat mengumpulkan informasi pribadi berikut:</p>
40
+ <ul>
41
+ <li><b>Nama Lengkap:</b> Untuk keperluan identifikasi.</li>
42
+ <li><b>Alamat:</b> Untuk pengiriman dokumen atau verifikasi lokasi.</li>
43
+ <li><b>Email:</b> Untuk komunikasi terkait layanan kami.</li>
44
+ <li><b>Nomor Telepon:</b> Untuk keperluan komunikasi cepat dan darurat.</li>
45
+ <li><b>NIK (Nomor Induk Kependudukan):</b> Untuk keperluan identifikasi unik sesuai regulasi.</li>
46
+ <li><b>NPWP (Nomor Pokok Wajib Pajak):</b> Untuk keperluan administratif dan perpajakan.</li>
47
+ </ul>
48
+ <h4>2. Tujuan Penggunaan Data</h4>
49
+ <p>Data pribadi Anda digunakan untuk:</p>
50
+ <ul>
51
+ <li>Memberikan akses ke layanan kami.</li>
52
+ <li>Memenuhi kewajiban hukum dan administratif.</li>
53
+ <li>Menghubungi Anda untuk keperluan penting terkait layanan.</li>
54
+ <li>Memproses transaksi atau pengajuan yang Anda ajukan.</li>
55
+ </ul>
56
+ <h4>3. Perlindungan Data</h4>
57
+ <p>
58
+ Kami mengambil langkah-langkah teknis, administratif, dan fisik untuk melindungi data pribadi Anda dari akses yang tidak sah, penggunaan yang tidak sah, atau pengungkapan yang tidak sah.
59
+ </p>
60
+ <h4>4. Penyimpanan Data</h4>
61
+ <p>
62
+ Data Anda akan disimpan selama diperlukan untuk memenuhi tujuan pengumpulan atau selama diwajibkan oleh hukum yang berlaku.
63
+ </p>
64
+ <h4>5. Hak Anda</h4>
65
+ <p>Anda memiliki hak berikut terkait data pribadi Anda:</p>
66
+ <ul>
67
+ <li>Mengakses data pribadi Anda.</li>
68
+ <li>Memperbarui atau memperbaiki data yang tidak akurat.</li>
69
+ <li>Meminta penghapusan data pribadi Anda (dengan syarat tertentu).</li>
70
+ </ul>
71
+ <h4>6. Pembagian Data</h4>
72
+ <p>
73
+ Kami tidak akan membagikan data pribadi Anda kepada pihak ketiga tanpa persetujuan Anda, kecuali diwajibkan oleh hukum atau untuk memenuhi kewajiban kontrak kami dengan Anda.
74
+ </p>
75
+ <h4>7. Perubahan Kebijakan Privasi</h4>
76
+ <p>
77
+ Kebijakan ini dapat diubah sewaktu-waktu. Perubahan akan diberitahukan melalui email atau pengumuman pada platform kami.
78
+ </p>
79
+ <h3>
80
+ 6. Hukum yang Berlaku
81
+ </h3>
82
+ <p>
83
+ Syarat ini diatur dan ditafsirkan sesuai dengan hukum. Setiap perselisihan akan diselesaikan secara eksklusif di pengadilan.
84
+ </p>
85
+ <h3>7. Informasi Kontak</h3>
86
+ <p>Untuk pertanyaan atau kekhawatiran tentang Syarat ini, silakan hubungi kami melalui kontak yang tersedia di aplikasi.</p>
87
+ </article>
88
+ </template>
89
+
90
+ <style lang="scss" scoped>
91
+ h1{
92
+ font-size: 46px;
93
+ font-weight: 600;
94
+ margin: 0 0 20px;
95
+ }
96
+ h3{
97
+ font-size: 24px;
98
+ font-weight: 600;
99
+ margin: 0 0 20px;
100
+ }
101
+ h4{
102
+ font-size: 20px;
103
+ margin: 0 0 20px;
104
+ }
105
+ hr{
106
+ border-color: #999;
107
+ margin: 30px 0;
108
+ }
109
+ p{
110
+ font-size: 16px;
111
+ margin: 0 0 20px;
112
+ }
113
+ ul{
114
+ padding-left: 20px;
115
+ margin: 0 0 20px;
116
+ li{
117
+ list-style: disc;
118
+ padding: 4px 0;
119
+ padding-left: 8px;
120
+ }
121
+ }
122
+ </style>
@@ -0,0 +1,48 @@
1
+ <script setup lang="ts">
2
+ import { useRouter } from 'vue-router';
3
+ import BtnCircle from '@/components/button/BtnCircle.vue';
4
+ import { LucideArrowLeft, LucidePlusCircle, LucideRotateCcw } from 'lucide-vue-next';
5
+ import PageTab from '@/components/pages/PageTab.vue';
6
+ import { computed } from 'vue';
7
+
8
+ const router = useRouter();
9
+ const emits = defineEmits(['reload', 'tabChanged', 'addData']);
10
+ const tab = defineModel<string>('tab');
11
+ const props = defineProps(['showDeletedTab', 'customTabs', 'showAddBtn', 'title']);
12
+
13
+ const isShowAddBtn = computed(() => {
14
+ if (typeof props.showAddBtn === 'function') {
15
+ return props.showAddBtn();
16
+ }
17
+ return (props.showAddBtn !== false);
18
+ })
19
+ </script>
20
+
21
+ <template>
22
+ <div class="flex bg-white dark:bg-dark_bg border-b dark:border-dark_border">
23
+ <div class="flex items-center flex-none gap-1.5 pl-4 pr-5">
24
+ <BtnCircle @click="router.go(-1)">
25
+ <LucideArrowLeft :size="20"/>
26
+ </BtnCircle>
27
+ <BtnCircle @click="emits('reload')">
28
+ <LucideRotateCcw :size="18"/>
29
+ </BtnCircle>
30
+ </div>
31
+ <div class="w-full">
32
+ <PageTab
33
+ v-model="tab"
34
+ :show-favorite="false"
35
+ :show-deleted="showDeletedTab"
36
+ :custom-tabs="customTabs || []"
37
+ v-on:change="emits('tabChanged')"
38
+ />
39
+ </div>
40
+ <div class="flex items-center pr-6" v-if="isShowAddBtn">
41
+ <button @click="emits('addData')"
42
+ class="pl-[3px] 2xl:pl-2 pr-3 2xl:pr-4 cursor-pointer rounded-full h-[28px] 2xl:h-[34px] ml-3 bg-blue-50 dark:bg-dark_bg5 dark:border-dark_bg5 dark:hover:bg-blue-500 dark:hover:border-blue-500 dark:hover:text-white dark:text-dark_text text-blue-500 text-xs 2xl:text-[13px] border-blue-300 border flex items-center whitespace-nowrap leading-none font-medium hover:bg-blue-100 transition hover:border-blue-500">
43
+ <LucidePlusCircle class="mr-1 2xl:mr-2 size-[23px] 2xl:-ml-[2px] 2xl:size-[25px]" :stroke-width="1.4"/>
44
+ Tambah {{title}}
45
+ </button>
46
+ </div>
47
+ </div>
48
+ </template>
@@ -0,0 +1,70 @@
1
+ <script setup lang="ts">
2
+ import BtnPrimary from '@/components/button/BtnPrimary.vue'
3
+ import { cn } from '@/lib/utils';
4
+ import { boolean } from '@vueform/vueform';
5
+ import { LucideArrowLeft } from 'lucide-vue-next';
6
+ import { useRouter } from 'vue-router';
7
+
8
+ const router = useRouter();
9
+ const emits = defineEmits(['back']);
10
+ const props = defineProps({
11
+ isBack: {
12
+ type: Boolean,
13
+ default: false
14
+ },
15
+ backUrl: {
16
+ type: String,
17
+ default: '/',
18
+ },
19
+ customBack: {
20
+ type: boolean,
21
+ default: false,
22
+ },
23
+ class: {
24
+ type: String,
25
+ default: '',
26
+ },
27
+ })
28
+
29
+ function onBack() {
30
+ if (props.customBack) {
31
+ emits('back');
32
+ return;
33
+ }
34
+ props.backUrl ? router.push(props.backUrl) : router.back()
35
+ }
36
+ </script>
37
+
38
+ <template>
39
+ <div :class="cn('flex flex-row bg-white py-4 px-5 dark:bg-dark_bg', props.class)">
40
+ <div class="flex justify-between w-full items-center">
41
+ <div class="flex flex-col">
42
+ <div class="flex">
43
+ <div v-if="isBack" class="flex-none flex items-center">
44
+ <button class="mr-4 size-[42px] flex items-center justify-center -my-5 rounded-lg border-slate-300 hover:bg-slate-100 dark:bg-dark_bg3 dark:hover:bg-dark_bg4 dark:border-none transition ml-1 border"
45
+ v-on:click="onBack">
46
+ <slot name="back-icon">
47
+ <LucideArrowLeft/>
48
+ </slot>
49
+ </button>
50
+ </div>
51
+ <div class="flex flex-col my-auto">
52
+ <h4 class="font-medium text-lg">
53
+ <slot name="title"></slot>
54
+ </h4>
55
+ <p>
56
+ <slot name="description"></slot>
57
+ </p>
58
+ </div>
59
+ </div>
60
+ <slot name="prefix"></slot>
61
+ </div>
62
+ <div class="ml-auto flex items-center -my-6 gap-3">
63
+ <slot name="suffix"></slot>
64
+ </div>
65
+ </div>
66
+ <div>
67
+ <slot name="bottom"></slot>
68
+ </div>
69
+ </div>
70
+ </template>
@@ -0,0 +1,29 @@
1
+ <script setup lang="ts">
2
+ import { ref } from 'vue'
3
+ import {
4
+ AlertDialog,
5
+ AlertDialogContent,
6
+ } from '@/components/ui/alert-dialog'
7
+ import LoadingIndicator from '@/components/loadings/LoadingIndicator.vue'
8
+
9
+ const dialogOpen = defineModel('show', { default: false });
10
+
11
+ function open() {
12
+ dialogOpen.value = true;
13
+ }
14
+
15
+ function close() {
16
+ dialogOpen.value = false;
17
+ }
18
+
19
+ defineExpose({ open, close });
20
+ </script>
21
+
22
+ <template>
23
+ <AlertDialog v-model:open="dialogOpen">
24
+ <AlertDialogContent class="max-w-50 grid place-content-center bg-transparent border-none shadow-none !outline-none">
25
+ <LoadingIndicator class="scale-90"/>
26
+ </AlertDialogContent>
27
+ </AlertDialog>
28
+ </template>
29
+
@@ -0,0 +1,25 @@
1
+ <script setup lang="ts">
2
+ import {
3
+ AlertDialog,
4
+ AlertDialogContent,
5
+ AlertDialogDescription,
6
+ AlertDialogHeader,
7
+ AlertDialogTitle
8
+ } from '@/components/ui/alert-dialog'
9
+ import LoadingIndicator from '@/components/loadings/LoadingIndicator.vue'
10
+ </script>
11
+
12
+ <template>
13
+ <AlertDialog :default-open="true">
14
+ <AlertDialogContent
15
+ class="max-w-50 grid place-content-center bg-transparent border-transparent shadow-none focus:outline-none"
16
+ >
17
+ <AlertDialogHeader>
18
+ <AlertDialogTitle class="grid place-items-center"><LoadingIndicator /></AlertDialogTitle>
19
+ <AlertDialogDescription>
20
+ <span class="animate-pulse text-white font-bold text-md">Harap Tunggu . . .</span>
21
+ </AlertDialogDescription>
22
+ </AlertDialogHeader>
23
+ </AlertDialogContent>
24
+ </AlertDialog>
25
+ </template>
@@ -0,0 +1,38 @@
1
+ <script setup lang="ts">
2
+ import { useAppConfig } from '@/composables/useAppConfig'
3
+
4
+ const { logo, primaryColor } = useAppConfig()
5
+ </script>
6
+
7
+ <template>
8
+ <div class="w-20 h-20 relative flex items-center justify-center">
9
+ <div
10
+ class="h-12 w-12 bg-contain bg-center bg-no-repeat rounded-full border-2"
11
+ :style="{
12
+ backgroundImage: `url(${logo})`,
13
+ backgroundColor: primaryColor + '20',
14
+ borderColor: primaryColor
15
+ }"
16
+ ></div>
17
+ <svg viewBox="0 0 100 100" preserveAspectRatio="xMidYMid" class="w-20 h-20 absolute top-0 left-0">
18
+ <circle
19
+ cx="50"
20
+ cy="50"
21
+ fill="none"
22
+ :stroke="primaryColor"
23
+ stroke-width="3"
24
+ r="35"
25
+ stroke-dasharray="164.93361431346415 56.97787143782138"
26
+ >
27
+ <animateTransform
28
+ attributeName="transform"
29
+ type="rotate"
30
+ repeatCount="indefinite"
31
+ dur="1s"
32
+ values="0 50 50;360 50 50"
33
+ keyTimes="0;1"
34
+ ></animateTransform>
35
+ </circle>
36
+ </svg>
37
+ </div>
38
+ </template>
@@ -0,0 +1,23 @@
1
+ <script setup lang="ts">
2
+ import { useAppConfig } from '@/composables/useAppConfig'
3
+
4
+ const { companyName, logo, logoAlt } = useAppConfig()
5
+ </script>
6
+
7
+ <template>
8
+ <div class="fixed inset-0 z-50 bg-white dark:bg-dark_bg flex items-center justify-center">
9
+ <div class="text-center">
10
+ <div class="mb-8">
11
+ <img :src="logo" :alt="logoAlt" class="w-24 h-24 mx-auto mb-4" />
12
+ <h2 class="text-2xl font-semibold text-gray-800 dark:text-white">{{ companyName }}</h2>
13
+ </div>
14
+ <div class="flex items-center justify-center">
15
+ <svg class="animate-spin -ml-1 mr-3 h-8 w-8 text-blue-600" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24">
16
+ <circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
17
+ <path class="opacity-75" 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"></path>
18
+ </svg>
19
+ <span class="text-lg text-gray-600 dark:text-gray-300">Loading...</span>
20
+ </div>
21
+ </div>
22
+ </div>
23
+ </template>
@@ -0,0 +1,103 @@
1
+ <script setup lang="ts">
2
+ import { ref } from "vue";
3
+ import NotifItem from "../notif/NotifItem.vue";
4
+ import ScrollArea from "@/components/ui/scroll-area/ScrollArea.vue";
5
+ import Skeleton from "@/components/ui/skeleton/Skeleton.vue";
6
+ import { onMounted } from "vue";
7
+ import api from "@/api/api";
8
+ import { LucideBellOff } from "lucide-vue-next";
9
+ import { useRouter, useRoute } from "vue-router";
10
+
11
+ const allNotif = ref([]);
12
+ const loading = ref(true);
13
+ const router = useRouter();
14
+ const route = useRoute();
15
+
16
+ const emit = defineEmits(["close-dropdown"]);
17
+
18
+ function itemClicked(item: any) {
19
+ item.isRead = true;
20
+ console.log(item);
21
+ if (item.url) {
22
+ // Parse potential query parameters from the notif URL
23
+ let url = item.url;
24
+ let queryParams: Record<string, string> = {};
25
+
26
+ // Check if there's an editId in the notification data
27
+ if (item.editId) {
28
+ // Add the edit parameter to query params
29
+ queryParams = { ...queryParams, edit: item.editId };
30
+ }
31
+
32
+ // If URL already has query parameters
33
+ if (url.includes("?")) {
34
+ const [baseUrl, queryString] = url.split("?");
35
+
36
+ // Parse existing query parameters
37
+ const existingParams = new URLSearchParams(queryString);
38
+ existingParams.forEach((value, key) => {
39
+ queryParams[key] = value;
40
+ });
41
+
42
+ // Create new URL with combined parameters
43
+ url = baseUrl;
44
+ }
45
+
46
+ // Navigate with query parameters
47
+ router.push({
48
+ path: url,
49
+ query: Object.keys(queryParams).length > 0 ? queryParams : undefined
50
+ });
51
+ }
52
+ emit("close-dropdown");
53
+ }
54
+
55
+ onMounted(() => {
56
+ const storedNotif = sessionStorage.getItem("all_notif");
57
+ if (storedNotif) {
58
+ try {
59
+ allNotif.value = JSON.parse(storedNotif);
60
+ if (allNotif.value.length > 0) loading.value = false;
61
+ } catch (err) {
62
+ console.error(err);
63
+ }
64
+ }
65
+ api
66
+ .get("/notif/my")
67
+ .then(r => {
68
+ allNotif.value = r.data.data;
69
+ const allNotifStr = JSON.stringify(allNotif.value);
70
+ sessionStorage.setItem("all_notif", allNotifStr);
71
+ })
72
+ .finally(() => {
73
+ loading.value = false;
74
+ });
75
+ });
76
+ </script>
77
+
78
+ <template>
79
+ <main class="overflow-hidden rounded-lg bg-white shadow-md">
80
+ <div class="text-md bg-slate-100 px-4 py-3 font-semibold text-text_main">Notifikasi</div>
81
+ <ScrollArea class="h-[80vh] max-h-[480px] bg-white">
82
+ <div class="p-2">
83
+ <template v-if="loading">
84
+ <main class="relative mb-1 cursor-pointer rounded-sm py-3 pl-[4.2em] pr-4 transition" v-for="i in 3">
85
+ <div class="absolute left-3 top-2">
86
+ <Skeleton class="size-9 rounded-full"></Skeleton>
87
+ </div>
88
+ <Skeleton class="mb-2 h-3"></Skeleton>
89
+ <Skeleton class="h-2 w-[75%]"></Skeleton>
90
+ </main>
91
+ </template>
92
+ <div v-else-if="allNotif.length < 1" class="px-4 pt-8 text-center text-slate-500">
93
+ <LucideBellOff :size="64" :stroke-width="1" class="mx-auto mb-6" />
94
+ <h4 class="font-semibold">Belum Ada Notifikasi</h4>
95
+ <p class="text-sm">Semua notifikasi untuk Anda akan muncul disini.</p>
96
+ </div>
97
+ <template v-else>
98
+ <NotifItem v-for="(item, i) in allNotif" :key="i" :item="item" v-on:click="itemClicked(item)" />
99
+ </template>
100
+ </div>
101
+ </ScrollArea>
102
+ </main>
103
+ </template>