@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,681 @@
1
+ <script setup lang="ts">
2
+ import ScrollArea from '@/components/ui/scroll-area/ScrollArea.vue';
3
+ import { ref, onMounted, watch, onUnmounted } from 'vue';
4
+ import { RouterLink, useRoute, useRouter } from 'vue-router'
5
+ import { marked } from 'marked';
6
+ import doscMenu from '@/docs/index';
7
+ import { CurlGenerator } from 'curl-generator';
8
+ import Copyright from '@/components/helper/Copyright.vue';
9
+ import ApiTester from '@/components/helper/ApiTester.vue';
10
+ import { LucideLoader2, LucidePlaneTakeoff, LucideScrollText, LucideSearch } from 'lucide-vue-next';
11
+ import api from '@/api/api';
12
+
13
+ interface Menu {
14
+ title: string
15
+ code?: string
16
+ items?: Menu[]
17
+ type?: 'page' | 'api' | null
18
+ openApi?: any
19
+ }
20
+
21
+ interface CodeBlock {
22
+ start: number
23
+ end: number
24
+ }
25
+
26
+ const route = useRoute();
27
+ const router = useRouter();
28
+
29
+ const ms = ref<Menu | null>(null); // menuSelected
30
+ const msc = ref(''); // menuSelectedCode
31
+ const leftbar = ref<Menu[]>([]);
32
+ const ls = ref<Menu | null>(null); // leftbarSelected
33
+ const lsc = ref(''); // leftbarSelectedCode
34
+ const indexHtml = ref('');
35
+ const rightbar = ref<Menu[]>([]);
36
+ const rsi = ref(0); // rightbarSelectedIndex
37
+ const apiUrl = ref(import.meta.env.VITE_API_URL);
38
+ const exampleType = ref('cURL');
39
+ const sendingApi = ref(false);
40
+ const q = ref('');
41
+
42
+ /**
43
+ * El
44
+ *
45
+ */
46
+ const apiTesterEl: any = ref(null);
47
+
48
+ /**
49
+ * Extract all header h2 (##)
50
+ * from markdown string
51
+ *
52
+ */
53
+ function loadRightbar(markdown: string) {
54
+ rightbar.value = [];
55
+
56
+ /**
57
+ * Regular expressions to match h2 (##) headers
58
+ * and skip ## on code block
59
+ *
60
+ */
61
+ const h2Regex = /^##\s(.+)$/gm;
62
+ const codeBlockRegex = /```[\s\S]*?```|`[\s\S]*?`/g;
63
+
64
+ // Find all code blocks to ignore
65
+ const codeBlocks: CodeBlock[] = [];
66
+ let match;
67
+ while ((match = codeBlockRegex.exec(markdown)) !== null) {
68
+ codeBlocks.push({ start: match.index, end: codeBlockRegex.lastIndex });
69
+ }
70
+
71
+ // Helper function to check if a position is inside a code block
72
+ function isInCodeBlock(index: number) {
73
+ return codeBlocks.some(block => index >= block.start && index < block.end);
74
+ }
75
+
76
+ // Reset the regex lastIndex to start searching from the beginning
77
+ h2Regex.lastIndex = 0;
78
+
79
+ // Match all ## headers
80
+ while ((match = h2Regex.exec(markdown)) !== null) {
81
+ if (!isInCodeBlock(match.index)) {
82
+ rightbar.value.push({ title: match[1] });
83
+ }
84
+ }
85
+ }
86
+
87
+ async function loadContent() {
88
+ lsc.value = route.path.split('/')[3];
89
+ if (!lsc.value && leftbar.value.length > 0 && leftbar.value[0].items && leftbar.value[0].items.length > 0) {
90
+ lsc.value = String(leftbar.value[0].items[0].code);
91
+ }
92
+
93
+ if (ms.value?.type === 'api') {
94
+ /**
95
+ * Find leftbar selected
96
+ * from leftbar array
97
+ *
98
+ */
99
+ for (const item of leftbar.value) {
100
+ if (!item.items) continue;
101
+ for (const sub of item.items) {
102
+ if (sub.code === lsc.value) {
103
+ ls.value = sub;
104
+ /**
105
+ * Format api for example
106
+ *
107
+ */
108
+ ls.value.openApi.endpointExample = ls.value.openApi.endpoint;
109
+ ls.value.openApi.headers = {};
110
+ if (ls.value.openApi.requestBody && ls.value.openApi.requestBody.content) {
111
+ const rbc = ls.value.openApi.requestBody.content;
112
+ for (const rb in rbc) {
113
+ ls.value.openApi.requestBodyContentType = rb;
114
+ ls.value.openApi.headers['Content-Type'] = rb;
115
+ if (rbc[rb].example) {
116
+ ls.value.openApi.requestBodyExample = rbc[rb].example;
117
+ } else if (rbc[rb].schema && rbc[rb].schema.example) {
118
+ ls.value.openApi.requestBodyExample = rbc[rb].schema.example;
119
+ }
120
+ }
121
+ }
122
+ let queryParams = [];
123
+ if (ls.value.openApi.parameters) {
124
+ for (const param of ls.value.openApi.parameters) {
125
+ if (param.in === 'path') {
126
+ if (param.example) {
127
+ ls.value.openApi.endpointExample = ls.value.openApi.endpointExample.replace(`{${param.name}}`, param.example);
128
+ }
129
+ } else if (param.in === 'header') {
130
+ ls.value.openApi.headers[param.name] = param.example || '';
131
+ } else if (param.in === 'query') {
132
+ queryParams.push(`${param.name}=${param.example || `{${param.name}}`}`);
133
+ }
134
+ }
135
+ }
136
+ const qm = queryParams.length > 0 ? '?' : '';
137
+ ls.value.openApi.endpointExample = `${ls.value.openApi.endpointExample}${qm}${queryParams.join('&')}`;
138
+
139
+ for (const key in ls.value.openApi.responses) {
140
+ if (Number(key) === 200) {
141
+ const item = ls.value.openApi.responses[key];
142
+ for (const k2 in item.content) {
143
+ ls.value.openApi.responseContentType = k2;
144
+ if (item.content[k2].examples) {
145
+ for (const k3 in item.content[k2].examples) {
146
+ ls.value.openApi.okResponseExample = item.content[k2].examples[k3];
147
+ }
148
+ }
149
+ }
150
+ break;
151
+ }
152
+ }
153
+ break;
154
+ }
155
+ }
156
+ }
157
+
158
+ return;
159
+ }
160
+
161
+ // Reset content
162
+ indexHtml.value = '';
163
+
164
+ if (!msc.value || !lsc.value) return;
165
+
166
+ try {
167
+ /* @vite-ignore */
168
+ const md = (await import(`@/docs/${msc.value}/${lsc.value}.md`)).default;
169
+ const htmlTmp = await marked(md);
170
+ let i = 0;
171
+ indexHtml.value = htmlTmp.replace(/<h2>/g, () => {
172
+ const id = `h2-${i}`;
173
+ i += 1;
174
+ return `<h2 id="${id}">`;
175
+ });
176
+ loadRightbar(md);
177
+ } catch (error) {
178
+ console.error('Failed to load module:', error);
179
+ }
180
+ }
181
+
182
+ function camelCaseToSpace(text: string) {
183
+ return text.replace(/([A-Z])/g, ' $1').replace(/^./, str => str.toUpperCase());
184
+ }
185
+
186
+ async function loadLeftbar() {
187
+ if (!ms.value) return;
188
+
189
+ // Reset selected leftbar menu
190
+ ls.value = null
191
+ lsc.value = '';
192
+ leftbar.value = [];
193
+
194
+ if (ms.value.type === 'api') {
195
+ /**
196
+ * Load json open api
197
+ *
198
+ */
199
+ const jsonData = (await import(`@/docs/${msc.value}/${msc.value}.json`)).default;
200
+ for (const key in jsonData.paths) {
201
+ console.log(key);
202
+ const category = camelCaseToSpace(key.split('/')[1]);
203
+ let itemFound = false;
204
+ for (const item of leftbar.value) {
205
+ if (item.title === category) {
206
+ const items: Menu[] = [];
207
+ for (const method in jsonData.paths[key]) {
208
+ const openApi = jsonData.paths[key][method];
209
+ openApi.endpoint = key;
210
+ openApi.method = method;
211
+ const code = `${method}${key.replace(/\//g, '-')}`;
212
+ items.push({ title: openApi.summary, openApi, code: code.toLowerCase() })
213
+ }
214
+ item.items?.push(...items);
215
+ itemFound = true;
216
+ break;
217
+ }
218
+ }
219
+ if (!itemFound) {
220
+ const items: Menu[] = [];
221
+ for (const method in jsonData.paths[key]) {
222
+ const openApi = jsonData.paths[key][method];
223
+ openApi.endpoint = key;
224
+ openApi.method = method;
225
+ const code = `${method}${key.replace(/\//g, '-')}`;
226
+ items.push({
227
+ title: openApi.summary,
228
+ openApi: openApi,
229
+ code: code.toLowerCase(),
230
+ })
231
+ }
232
+ leftbar.value.push({ title: category, items });
233
+ }
234
+ }
235
+ loadContent();
236
+ return;
237
+ }
238
+
239
+ try {
240
+ // Dynamically import the TypeScript file from the specified folder
241
+ leftbar.value = (await import(`@/docs/${msc.value}/${msc.value}.ts`)).default;
242
+ loadContent();
243
+ } catch (error) {
244
+ console.error('Failed to load module:', error);
245
+ }
246
+ }
247
+
248
+ function findMenuOpen(path: string) {
249
+ if (!route.path.split('/')[2]) {
250
+ if (doscMenu.length > 0) router.push(`/docs/${doscMenu[0].code}`);
251
+ return;
252
+ }
253
+
254
+ const newMenu = path.split('/')[2];
255
+ if (msc.value === newMenu) {
256
+ loadContent();
257
+ return;
258
+ }
259
+ msc.value = newMenu;
260
+
261
+ /**
262
+ * Set menu selected
263
+ * find from docMenu
264
+ *
265
+ */
266
+ for (const item of doscMenu) {
267
+ if (item.code === msc.value) {
268
+ ms.value = item as Menu;
269
+ break;
270
+ }
271
+ }
272
+
273
+ loadLeftbar();
274
+ }
275
+
276
+ function gotoH2(idx: number) {
277
+ const el: any = document.getElementById(`h2-${idx}`);
278
+ if (el) window.scrollTo({ top: el.offsetTop, behavior: 'smooth' });
279
+ }
280
+
281
+ function winScrolled() {
282
+ const docsEl = document.getElementById('dasi-docs');
283
+ if (!docsEl) return;
284
+
285
+ const els: any = [...docsEl.getElementsByTagName('h2')];
286
+ let i = els.length - 1;
287
+ for (const item of els.reverse()) {
288
+ if (window.scrollY >= item.offsetTop) {
289
+ if (rsi.value !== i) rsi.value = i;
290
+ break;
291
+ }
292
+ i -= 1;
293
+ }
294
+ }
295
+
296
+ function tryApi(api: any) {
297
+ apiTesterEl.value.open(api);
298
+ // sendingApi.value = true;
299
+ // api.get(api.endpointExample).then((r) => {
300
+
301
+ // }).catch((err) => {
302
+
303
+ // }).finally(() => {
304
+ // sendingApi.value = false;
305
+ // })
306
+ }
307
+
308
+ watch(route, (to) => {
309
+ findMenuOpen(to.path);
310
+ });
311
+
312
+ onMounted(async () => {
313
+ findMenuOpen(route.path);
314
+ window.addEventListener('scroll', winScrolled);
315
+ });
316
+
317
+ onUnmounted(() => {
318
+ window.removeEventListener('scroll', winScrolled);
319
+ });
320
+ </script>
321
+
322
+ <template>
323
+ <section class="fixed top-24 left-20 right-0 h-10 border-b bg-white flex items-center pl-6 pr-3 z-9">
324
+ <h4 class="font-medium">Dokumentasi</h4>
325
+ <div class="flex items-center ml-auto">
326
+ <RouterLink :to="`/docs/${item.code}`"
327
+ class="block text-sm py-1 rounded-full px-4 ml-1 hover:bg-hover_main cursor-pointer"
328
+ :class="{'bg-active_main text-primary_main': msc === item.code}"
329
+ v-for="(item, i) in doscMenu" :key="i">
330
+ {{ item.title }}
331
+ </RouterLink>
332
+ </div>
333
+ </section>
334
+ <section class="z-9 fixed left-20 top-24 bottom-0 bg-white w-80 border-r">
335
+ <ScrollArea class="h-full">
336
+ <div class="px-4 pb-5">
337
+ <div class="mt-5 relative">
338
+ <input class="rounded-full bg-gray-100 border-gray-100 w-full px-5 !h-9 py-0 block hover:bg-white transition hover:border-gray-300 focus:bg-white focus:border-primary_main !outline-none !shadow-none !hover:shadow-none !hover:outline-none pr-10"
339
+ type="text" placeholder="Search docs..." v-model="q">
340
+ <LucideSearch class="text-gray-400 right-3 top-1/2 -translate-y-1/2 absolute" :size="22"/>
341
+ </div>
342
+ <div v-for="(item, i) in leftbar.filter(row => row.title.toLowerCase().indexOf(q.toLowerCase()) >= 0)" :key="i" class="pt-5">
343
+ <div class="flex items-center font-medium text-gray-400 text-[14px] mb-1 px-2">
344
+ {{ item.title }}
345
+ </div>
346
+ <div v-for="(sub, i) in item.items" :key="i">
347
+ <RouterLink :to="`/docs/${msc}/${sub.code}`"
348
+ class="block relative py-[3px] mb-[2px] px-2 rounded-sm hover:bg-hover_main text-[14px] hover:text-primary_main transition"
349
+ :class="{'!bg-primary_main !text-white': lsc === sub.code}">
350
+ {{ sub.title }}
351
+ </RouterLink>
352
+ </div>
353
+ </div>
354
+ </div>
355
+ </ScrollArea>
356
+ </section>
357
+ <section class="ml-80 mt-10 min-h-[calc(100vh-96px)] bg-white">
358
+ <div class="pt-5 px-10 pb-16" v-if="lsc">
359
+ <div class="relative flex -mx-10 -mt-5 -mb-16 pr-[400px]" v-if="ms && ms.type === 'api'">
360
+ <div class="w-full px-10 pt-5 pb-16 min-h-[calc(100vh-96px)]">
361
+ <div class="text-red-500 bg-red-100 inline-block px-3 py-0.5 font-medium rounded-full text-sm mb-1 -ml-[2px]"
362
+ v-if="ls?.openApi.deprecated">Deprecated</div>
363
+ <h3 class="text-xl font-medium">{{ ls?.title }}</h3>
364
+ <p class="mt-2 font-[400] text-[15px] leading-snug" v-if="ls?.openApi.description">{{ ls?.openApi.description }}</p>
365
+
366
+ <div class="-mr-[440px] flex relative z-3">
367
+ <section class="w-full pr-10">
368
+ <div class="border flex items-center rounded-sm overflow-hidden mt-5 mb-6 py-1.5">
369
+ <div class="flex-none font-semibold uppercase pt-0.5 px-4 border-r"
370
+ :class="{'text-green-500': ls?.openApi.method === 'get',
371
+ 'text-blue-500': ls?.openApi.method === 'post',
372
+ 'text-purple-500': ls?.openApi.method === 'put',
373
+ 'text-orange-500': ls?.openApi.method === 'patch',
374
+ 'text-red-500': ls?.openApi.method === 'delete'}">
375
+ {{ ls?.openApi.method }}
376
+ </div>
377
+ <div class="pl-4 whitespace-nowrap overflow-hidden text-ellipsis">
378
+ {{ ls?.openApi.endpoint }}
379
+ </div>
380
+ </div>
381
+ <section class="mb-7" v-if="ls?.openApi.parameters && ls?.openApi.parameters.length > 0">
382
+ <h4 class="font-medium mb-1 ml-1 text-[15px]">Request Paremeters</h4>
383
+ <div class="dasi-api-doc">
384
+ <table class="border rounded-sm font-light">
385
+ <thead>
386
+ <tr>
387
+ <th>Name</th>
388
+ <th>In</th>
389
+ <th>Type</th>
390
+ <th>Description</th>
391
+ </tr>
392
+ </thead>
393
+ <tbody>
394
+ <tr v-for="(item, i) in ls?.openApi.parameters" :key="i"
395
+ :class="{'bg-red-50': item.deprecated}">
396
+ <td>
397
+ <div class="font-medium"
398
+ :class="{'text-red-500 line-through': item.deprecated}">
399
+ {{ item.name }}
400
+ </div>
401
+ <span class="text-sm text-black/60" v-if="!item.required">optional</span>
402
+ <div class="text-red-500 font-medium text-[13px] mt-0.5"
403
+ v-if="item.deprecated">Deprecated
404
+ </div>
405
+ </td>
406
+ <td>{{ item.in }}</td>
407
+ <td>
408
+ <div class="flex items-center" v-if="Array.isArray(item.schema.type)">
409
+ <div v-for="(type, i) in item.schema.type" :key="i">
410
+ <span
411
+ class="mr-1.5 px-1 border rounded-sm pb-0.5"
412
+ :class="{'text-pink-700 border-pink-200': type === 'string',
413
+ 'text-purple-700 border-purple-200': type === 'boolean',
414
+ 'text-sky-600 border-sky-200': type === 'array',
415
+ 'text-green-600 border-green-200': ['number', 'integer'].includes(type)}">
416
+ {{ type }}
417
+ </span>
418
+ <span class="mr-1.5 text-gray-400 text-sm" v-if="i < item.schema.type.length - 1">/</span>
419
+ </div>
420
+ </div class="flex items-center">
421
+ <template v-else>
422
+ <span class="mr-1.5 px-1 border rounded-sm pb-0.5"
423
+ :class="{'text-pink-700 border-pink-200': item.schema.type === 'string',
424
+ 'text-purple-700 border-purple-200': item.schema.type === 'boolean',
425
+ 'text-sky-600 border-sky-200': item.schema.type === 'array',
426
+ 'text-green-600 border-green-200': ['number', 'integer'].includes(item.schema.type)}">
427
+ {{ item.schema.type }}
428
+ </span>
429
+ </template>
430
+ </td>
431
+ <td>
432
+ <div v-if="item.description">
433
+ {{ item.description }}
434
+ </div>
435
+ <div class="mt-2.5 text-[13px] mb-0.5" v-if="item.example">
436
+ <span class="font-medium mr-1.5">Example:</span>
437
+ <span class="px-1.5 bg-slate-50 border rounded-sm py-0.5 font-normal">
438
+ {{ item.example }}
439
+ </span>
440
+ </div>
441
+ </td>
442
+ </tr>
443
+ </tbody>
444
+ </table>
445
+ </div>
446
+ </section>
447
+
448
+ <section class="mb-9" v-if="ls?.openApi.requestBody">
449
+ <h4 class="font-medium mb-1 ml-1 text-[15px]">Request Body</h4>
450
+ <section v-for="(item, key) in ls?.openApi.requestBody.content" :key="key">
451
+ <div class="dasi-api-doc mb-3">
452
+ <table class="border rounded-sm mb-3">
453
+ <thead>
454
+ <tr>
455
+ <th>Content-Type</th>
456
+ <th>Req. Body Params. / Schema</th>
457
+ </tr>
458
+ </thead>
459
+ <tbody>
460
+ <tr>
461
+ <td>{{ key }}</td>
462
+ <td>
463
+ <pre class="border rounded-sm py-1.5 px-2 bg-slate-50 text-[13px]"
464
+ v-if="item.schema.properties && Object.keys(item.schema.properties).length > 0"
465
+ ><code>{{item.schema.properties}}</code></pre>
466
+ <span class="text-sm italic text-gray-300" v-else>Not available</span>
467
+ </td>
468
+ </tr>
469
+ </tbody>
470
+ </table>
471
+ </div>
472
+ </section>
473
+ </section>
474
+
475
+ <section class="mb-7" v-if="ls?.openApi.responses">
476
+ <h4 class="font-medium mb-1 ml-1 text-[15px]">Responses</h4>
477
+ <div class="dasi-api-doc">
478
+ <table class="border rounded-sm font-light table-responses">
479
+ <thead>
480
+ <tr>
481
+ <th>Code</th>
482
+ <th class="whitespace-nowrap">Response</th>
483
+ </tr>
484
+ </thead>
485
+ <tbody>
486
+ <tr v-for="(item, key) in ls?.openApi.responses" :key="key">
487
+ <td class="border-t">
488
+ <div class="font-medium mb-1">{{ key }}</div>
489
+ <span
490
+ class="px-1 border rounded-sm py-0.5 font-medium"
491
+ :class="{'text-pink-700 border-pink-200': Number(key) >= 300 || Number(key) < 200,
492
+ 'text-green-600 border-green-200': Number(key) >= 200 && Number(key) < 300}">
493
+ {{ item.description }}
494
+ </span>
495
+ </td>
496
+ <td class="border-t">
497
+ <div class="" v-for="(resp, ct) in item.content" :key="ct">
498
+ <div class="font-normal mb-2">
499
+ Content-Type:
500
+ <span class="px-1.5 bg-slate-50 border rounded-sm pt-0.5 pb-1 ml-1">{{ ct }}</span>
501
+ </div>
502
+ <div class="mb-4" v-if="resp.schema && resp.schema.properties && Object.keys(resp.schema.properties).length > 0">
503
+ <div class="font-medium mb-[2px] ml-1">Schema</div>
504
+ <pre class="bg-slate-50 border rounded-sm py-1.5 px-2 text-[13px]"><code>{{resp.schema.properties}}</code></pre>
505
+ </div>
506
+ <template v-if="resp.examples">
507
+ <div class="mb-4" v-for="(example, exc) in resp.examples" :key="exc">
508
+ <div class="font-medium mb-[2px] ml-1">Example</div>
509
+ <pre class="bg-slate-50 border rounded-sm py-1.5 px-2 text-[13px]"
510
+ :class="{'text-green-700 !bg-green-50 border-green-300': Number(key) >= 200 && Number(key) < 300,
511
+ 'text-red-700 !bg-red-50 border-red-300': Number(key) >= 300 || Number(key) < 200}"><code>{{example}}</code></pre>
512
+ </div>
513
+ </template>
514
+ </div>
515
+ </td>
516
+ </tr>
517
+ </tbody>
518
+ </table>
519
+ </div>
520
+ </section>
521
+
522
+ <section class="border-t pt-2 mt-10" v-if="ls?.openApi.tags && 1>2">
523
+ <div v-for="(tag, i) in ls?.openApi.tags" :key="i">
524
+ <span class="mr-1.5 px-1 border rounded-sm pb-0.5">{{ tag }}</span>
525
+ </div>
526
+ </section>
527
+ </section>
528
+
529
+ <section class="w-[400px] text-white/80 text-sm flex-none">
530
+ <div class="flex border-b border-b-white/10 pl-5 mb-3">
531
+ <div class="font-medium mr-5 pb-3 relative text-gray-500 cursor-pointer hover:text-gray-300 transition"
532
+ :class="{'text-white': exampleType === 'cURL'}"
533
+ v-on:click="exampleType = 'cURL'">
534
+ cURL
535
+ <div class="absolute -left-1 -right-1 bottom-0 h-1 rounded-t-full bg-primary_main_hover"
536
+ v-if="exampleType === 'cURL'"></div>
537
+ </div>
538
+ <div class="font-medium mr-5 pb-3 relative text-gray-500 cursor-pointer hover:text-gray-300 transition"
539
+ :class="{'text-white': exampleType === 'DASI API'}"
540
+ v-on:click="exampleType = 'DASI API'">
541
+ DASI API
542
+ <div class="absolute -left-1 -right-1 bottom-0 h-1 rounded-t-full bg-primary_main_hover"
543
+ v-if="exampleType === 'DASI API'"></div>
544
+ </div>
545
+ </div>
546
+
547
+ <div class="font-medium px-5 mb-1 text-[13px] flex items-center">
548
+ Request example
549
+ <div class="ml-auto text-white/35 font-normal">
550
+ {{ exampleType }}
551
+ </div>
552
+ </div>
553
+ <template v-if="exampleType === 'cURL'">
554
+ <pre class="px-4 py-3 bg-[#1f3473] overflow-x-scroll mb-8 text-[13px] border-l-4 border-l-[#1f57ff]"><code>{{ CurlGenerator({
555
+ url: `${apiUrl}${ls?.openApi.endpointExample}`,
556
+ method: ls?.openApi.method,
557
+ headers: ls?.openApi.headers,
558
+ body: ls?.openApi.requestBodyExample,
559
+ }) }}</code></pre>
560
+ </template>
561
+ <template v-else>
562
+ <pre class="px-4 py-3 bg-[#1f3473] overflow-x-scroll mb-8 text-[13px] border-l-4 border-l-[#1f57ff]"><code>import api from '@/api/api'
563
+
564
+ api.{{ ls?.openApi.method.toLowerCase() }}('{{ ls?.openApi.endpointExample }}'<template
565
+ v-if="ls?.openApi.requestBodyExample">, {{ ls.openApi.requestBodyExample }}</template><template
566
+ v-if="Object.keys(ls?.openApi.headers).length > 0">, {
567
+ headers: {
568
+ <span v-for="(header, i) in ls?.openApi.headers" :key="i">"{{ i }}": "{{ header }}",</span>
569
+ },
570
+ }</template>).then((r) => {
571
+ // Your code after req success...
572
+
573
+ }).catch((err) => {
574
+ // Logic for handling error...
575
+
576
+ }).finally(() => {
577
+ // Finish api request, stop loading...
578
+
579
+ })
580
+ </code></pre>
581
+ </template>
582
+ <div class="px-5 -mt-5 mb-8">
583
+ <button class="bg-primary_main w-full h-10 font-medium text-[15px] rounded-md shadow-md text-left flex items-center px-4 transition hover:bg-primary_main_hover hover:shadow-lg"
584
+ :class="{'!bg-slate-800 !text-slate-600 !shadow-none !cursor-default': sendingApi}"
585
+ v-on:click="tryApi(ls?.openApi)">
586
+ <LucideLoader2 class="mr-2 animate-spin" v-if="sendingApi"/>
587
+ <LucidePlaneTakeoff class="mr-2" v-else/>
588
+ Try This Endpoint
589
+ </button>
590
+ </div>
591
+
592
+ <template v-if="ls?.openApi.requestBodyExample">
593
+ <div class="font-medium px-5 mb-1 text-[13px] flex items-center">
594
+ Req. Body example
595
+ <div class="ml-auto text-white/35 font-normal" v-if="ls.openApi.requestBodyContentType">
596
+ {{ ls.openApi.requestBodyContentType }}
597
+ </div>
598
+ </div>
599
+ <pre class="px-4 py-3 bg-[#1f3473] overflow-x-scroll mb-8 text-[13px] border-l-4 border-l-[#1f57ff]"><code>{{ ls?.openApi.requestBodyExample }}</code></pre>
600
+ </template>
601
+
602
+ <template v-if="ls?.openApi.okResponseExample">
603
+ <div class="font-medium px-5 mb-1 text-[13px] flex items-center">
604
+ Success response example
605
+ <div class="ml-auto text-white/35 font-normal" v-if="ls.openApi.responseContentType">
606
+ {{ ls.openApi.responseContentType }}
607
+ </div>
608
+ </div>
609
+ <pre class="px-4 py-3 bg-[#1f3473] overflow-x-scroll mb-8 text-[13px] border-l-4 border-l-[#1f57ff]"><code>{{ ls?.openApi.okResponseExample }}</code></pre>
610
+ </template>
611
+ </section>
612
+ </div>
613
+
614
+ <div class="text-sm text-gray-400">
615
+ <Copyright/>
616
+ </div>
617
+ </div>
618
+ <div class="absolute right-0 top-0 bottom-0 w-[400px] bg-slate-800"></div>
619
+ </div>
620
+ <div class="relative" v-else>
621
+ <div class="max-w-[760px]">
622
+ <div v-if="indexHtml">
623
+ <div id="dasi-docs" class="dasi-docs" v-html="indexHtml"></div>
624
+ <div class="text-sm text-gray-400">
625
+ <Copyright/>
626
+ </div>
627
+ </div>
628
+ <div class="text-center flex items-center h-[calc(100vh-200px)]" v-else>
629
+ <div class="w-full">
630
+ <LucideScrollText :size="40" :stroke-width="1.5" class="mx-auto mb-3 text-gray-500"/>
631
+ <div class="font-semibold text-lg">
632
+ Tidak Ada Data
633
+ </div>
634
+ <div class="text-gray-500 text-sm">
635
+ Maaf! Konten belum tersedia
636
+ </div>
637
+ </div>
638
+ </div>
639
+ </div>
640
+
641
+ <div class="fixed top-24 right-0 w-80 text-sm pt-5 pr-6" v-if="rightbar && rightbar.length > 0">
642
+ <h4 class="font-semibold mb-1 text-lg">Di halaman ini</h4>
643
+ <div v-for="(item, i) in rightbar" :key="i"
644
+ class="py-1 text-gray-400 hover:text-text_main cursor-pointer rightbar-nav relative"
645
+ :class="{active: i === rsi}" v-on:click="gotoH2(i)">
646
+ {{item.title}}
647
+ </div>
648
+ </div>
649
+ </div>
650
+ </div>
651
+ </section>
652
+ <ApiTester ref="apiTesterEl"/>
653
+ </template>
654
+
655
+ <style lang="scss" scoped>
656
+ .rightbar-nav{
657
+ transition: all .3s ease;
658
+ &:before{
659
+ content: "";
660
+ position: absolute;
661
+ left: 0; top: 4px; bottom: 4px;
662
+ width: 0;
663
+ border-radius: 50px;
664
+ transition: all .3s ease;
665
+ background-color: #ccc;
666
+ }
667
+ &:hover, &.active{
668
+ padding-left: 12px;
669
+ opacity: 1;
670
+ &:before{
671
+ width: 3px;
672
+ }
673
+ }
674
+ &.active{
675
+ color: #2671D9;
676
+ &:before{
677
+ background-color: #2671D9;
678
+ }
679
+ }
680
+ }
681
+ </style>