@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,332 @@
1
+ /**
2
+ * App Configuration Composable
3
+ * Provides reactive access to application configuration
4
+ */
5
+
6
+ import { ref, computed, watch } from 'vue'
7
+ import { useAppConfig as useAppConfigCore, type AppConfig } from '@/config/app.config'
8
+ import { useMenuConfig } from '@/config/menu.config'
9
+ import { useThemeConfig } from '@/config/theme.config'
10
+ import { myAppConfig } from '@/config/my-app.config'
11
+
12
+ export const useAppConfig = () => {
13
+ const { config, setConfig, getConfig, getConfigValue } = useAppConfigCore()
14
+ const { setMenuConfig, getMenuConfig, getMenuItems, getMenuByOrgLevel, searchMenu } = useMenuConfig()
15
+ const { setThemeConfig, getThemeConfig, getColor, generateCSSVariables } = useThemeConfig()
16
+
17
+ // Make config reactive
18
+ const reactiveConfig = ref(getConfig())
19
+
20
+ // Check if config is loaded - config is considered loaded if it has meaningful data
21
+ // Since we now use myAppConfig as default, config should always be available
22
+ const isConfigLoaded = computed(() => {
23
+ const currentConfig = getConfig()
24
+ // Config is loaded if it has a name and it's not the base template name
25
+ // Also check if branding exists (means config was properly initialized)
26
+ return !!(
27
+ currentConfig?.name &&
28
+ currentConfig.name !== 'Vue Framework Template' &&
29
+ currentConfig.branding?.companyName
30
+ )
31
+ })
32
+
33
+ const configError = ref<string | null>(null)
34
+
35
+ // Initialize configuration
36
+ const initializeConfig = async (customConfig?: Partial<AppConfig>) => {
37
+ try {
38
+ // Use myAppConfig as default if no custom config provided
39
+ const configToUse = customConfig || myAppConfig
40
+
41
+ // Load configuration
42
+ if (configToUse) {
43
+ setConfig(configToUse)
44
+ }
45
+
46
+ // Load configuration from localStorage if available
47
+ const savedConfig = localStorage.getItem('app.config')
48
+ if (savedConfig) {
49
+ const parsedConfig = JSON.parse(savedConfig)
50
+ setConfig(parsedConfig)
51
+ }
52
+
53
+ // Load configuration from environment variables
54
+ const currentConfig = getConfig()
55
+ const envConfig: Partial<AppConfig> = {
56
+ api: {
57
+ baseUrl: import.meta.env.VITE_API_URL || currentConfig.api.baseUrl,
58
+ endpoints: currentConfig.api.endpoints
59
+ },
60
+ branding: {
61
+ logo: currentConfig.branding.logo,
62
+ companyName: import.meta.env.VITE_COMPANY_NAME || currentConfig.branding.companyName,
63
+ primaryColor: import.meta.env.VITE_PRIMARY_COLOR || currentConfig.branding.primaryColor
64
+ }
65
+ }
66
+
67
+ setConfig(envConfig)
68
+
69
+ // Get updated config after all changes
70
+ const finalConfig = getConfig()
71
+
72
+ // Initialize menu configuration
73
+ setMenuConfig({
74
+ items: finalConfig.ui.features.search ? getMenuItems() : [],
75
+ searchEnabled: finalConfig.ui.features.search,
76
+ historyEnabled: true,
77
+ maxHistoryItems: 5,
78
+ defaultOpenItems: ['dashboard']
79
+ })
80
+
81
+ // Initialize theme configuration
82
+ setThemeConfig({
83
+ colors: {
84
+ primary: finalConfig.branding.primaryColor,
85
+ primaryHover: finalConfig.branding.secondaryColor || finalConfig.branding.primaryColor,
86
+ primaryActive: finalConfig.ui.theme.accent || '#e8f1fb',
87
+ secondary: finalConfig.branding.secondaryColor,
88
+ accent: finalConfig.ui.theme.accent,
89
+ background: '#ffffff',
90
+ surface: '#f8f9fa',
91
+ text: '#4D5E80',
92
+ textSecondary: '#6c757d',
93
+ border: '#dee2e6',
94
+ error: '#dc3545',
95
+ warning: '#ffc107',
96
+ success: '#28a745',
97
+ info: '#17a2b8'
98
+ },
99
+ darkMode: {
100
+ enabled: finalConfig.ui.theme.darkMode,
101
+ colors: {
102
+ background: '#0a0a0a',
103
+ surface: '#111111',
104
+ text: '#cccccc',
105
+ textSecondary: '#999999',
106
+ border: '#151515'
107
+ }
108
+ }
109
+ })
110
+
111
+ configError.value = null
112
+
113
+ // Update reactive config
114
+ reactiveConfig.value = getConfig()
115
+ } catch (error) {
116
+ configError.value = error instanceof Error ? error.message : 'Failed to load configuration'
117
+ console.error('Configuration initialization failed:', error)
118
+ }
119
+ }
120
+
121
+ // Save configuration to localStorage
122
+ const saveConfig = () => {
123
+ try {
124
+ localStorage.setItem('app.config', JSON.stringify(getConfig()))
125
+ } catch (error) {
126
+ console.error('Failed to save configuration:', error)
127
+ }
128
+ }
129
+
130
+ // Reset configuration to defaults
131
+ const resetConfig = () => {
132
+ localStorage.removeItem('app.config')
133
+ initializeConfig()
134
+ }
135
+
136
+ // Computed properties for easy access with null checks
137
+ const appName = computed(() => reactiveConfig.value?.name || 'Loading...')
138
+ const logoAlt = computed(() => reactiveConfig.value?.branding?.logoAlt || 'Logo Alt')
139
+ const appVersion = computed(() => reactiveConfig.value?.version || '1.0.0')
140
+ const companyName = computed(() => reactiveConfig.value?.branding?.companyName || 'Loading...')
141
+ const primaryColor = computed(() => reactiveConfig.value?.branding?.primaryColor || '#3B82F6')
142
+ const logo = computed(() => reactiveConfig.value?.branding?.logo || '/img/brand/logo.svg')
143
+ const loginBackgroundDay = computed(() => reactiveConfig.value?.branding?.loginBackgroundDay || '/src/assets/login-day.png')
144
+ const loginBackgroundNight = computed(() => reactiveConfig.value?.branding?.loginBackgroundNight || '/src/assets/login-night.png')
145
+
146
+ // API configuration
147
+ const apiBaseUrl = computed(() => reactiveConfig.value?.api?.baseUrl || 'http://localhost:3000/api')
148
+ const apiEndpoints = computed(() => reactiveConfig.value?.api?.endpoints || {
149
+ auth: {
150
+ login: '/auth/login',
151
+ logout: '/auth/logout',
152
+ refresh: '/auth/refresh',
153
+ forgotPassword: '/auth/forgot-password',
154
+ changePassword: '/auth/change-password',
155
+ info: '/auth/info',
156
+ status: '/auth/status',
157
+ init: '/auth/init',
158
+ captcha: '/auth/captcha'
159
+ },
160
+ notifications: {
161
+ unreadCount: '/notifications/unread-count',
162
+ list: '/notifications'
163
+ },
164
+ media: {
165
+ upload: '/media/upload',
166
+ delete: '/media'
167
+ }
168
+ })
169
+
170
+ // Authentication configuration
171
+ const authConfig = computed(() => reactiveConfig.value?.auth || {
172
+ tokenKey: 'app.user.token',
173
+ userKey: 'app.user.name',
174
+ organizationKey: 'app.user.organization',
175
+ defaultRedirect: '/',
176
+ ssoEnabled: false,
177
+ captchaEnabled: false,
178
+ otpEnabled: false,
179
+ passwordPolicy: {
180
+ minLength: 6,
181
+ requireUppercase: false,
182
+ requireLowercase: false,
183
+ requireNumbers: false,
184
+ requireSpecialChars: false
185
+ }
186
+ })
187
+ const tokenKey = computed(() => reactiveConfig.value?.auth?.tokenKey || 'app.user.token')
188
+ const userKey = computed(() => reactiveConfig.value?.auth?.userKey || 'app.user.name')
189
+ const organizationKey = computed(() => reactiveConfig.value?.auth?.organizationKey || 'app.user.organization')
190
+
191
+ // Organization configuration
192
+ const organizationLevels = computed(() => reactiveConfig.value?.organization?.levels || ['user', 'admin', 'superadmin'])
193
+ const defaultOrgLevel = computed(() => reactiveConfig.value?.organization?.defaultLevel || 'user')
194
+ const superAdminLevel = computed(() => reactiveConfig.value?.organization?.superAdminLevel || 'superadmin')
195
+
196
+ // UI configuration
197
+ const uiConfig = computed(() => reactiveConfig.value?.ui || {
198
+ theme: {
199
+ primary: '#3B82F6',
200
+ secondary: '#1D4ED8',
201
+ accent: '#EFF6FF',
202
+ darkMode: false
203
+ },
204
+ layout: {
205
+ sidebarWidth: 80,
206
+ headerHeight: 40,
207
+ tabHeight: 32
208
+ },
209
+ features: {
210
+ search: true,
211
+ notifications: false,
212
+ darkMode: false,
213
+ tabs: true,
214
+ breadcrumbs: true
215
+ }
216
+ })
217
+ const themeConfig = computed(() => reactiveConfig.value?.ui?.theme || {
218
+ primary: '#3B82F6',
219
+ secondary: '#1D4ED8',
220
+ accent: '#EFF6FF',
221
+ darkMode: false
222
+ })
223
+ const layoutConfig = computed(() => reactiveConfig.value?.ui?.layout || {
224
+ sidebarWidth: 80,
225
+ headerHeight: 40,
226
+ tabHeight: 32
227
+ })
228
+ const features = computed(() => reactiveConfig.value?.ui?.features || {
229
+ search: true,
230
+ notifications: false,
231
+ darkMode: false,
232
+ tabs: true,
233
+ breadcrumbs: true
234
+ })
235
+
236
+ // Localization
237
+ const locale = computed(() => reactiveConfig.value?.i18n?.defaultLocale || 'en')
238
+ const messages = computed(() => reactiveConfig.value?.i18n?.messages || {})
239
+
240
+ // Features
241
+ const enabledFeatures = computed(() => reactiveConfig.value?.features || {
242
+ fileUpload: true,
243
+ export: true,
244
+ import: false,
245
+ realTimeNotifications: false,
246
+ websocket: false
247
+ })
248
+
249
+ // Watch for configuration changes and save to localStorage
250
+ watch(
251
+ () => getConfig(),
252
+ (newConfig) => {
253
+ if (isConfigLoaded.value) {
254
+ saveConfig()
255
+ reactiveConfig.value = newConfig
256
+ }
257
+ },
258
+ { deep: true }
259
+ )
260
+
261
+ // Watch reactiveConfig to keep it in sync
262
+ watch(
263
+ () => getConfig(),
264
+ (newConfig) => {
265
+ reactiveConfig.value = newConfig
266
+ },
267
+ { immediate: true }
268
+ )
269
+
270
+ return {
271
+ // State
272
+ isConfigLoaded,
273
+ configError,
274
+
275
+ // Configuration
276
+ config: computed(() => reactiveConfig.value),
277
+ appName,
278
+ appVersion,
279
+ companyName,
280
+ primaryColor,
281
+ logo,
282
+ logoAlt,
283
+ loginBackgroundDay,
284
+ loginBackgroundNight,
285
+
286
+ // API
287
+ apiBaseUrl,
288
+ apiEndpoints,
289
+
290
+ // Authentication
291
+ authConfig,
292
+ tokenKey,
293
+ userKey,
294
+ organizationKey,
295
+
296
+ // Organization
297
+ organizationLevels,
298
+ defaultOrgLevel,
299
+ superAdminLevel,
300
+
301
+ // UI
302
+ uiConfig,
303
+ themeConfig,
304
+ layoutConfig,
305
+ features,
306
+
307
+ // Localization
308
+ locale,
309
+ messages,
310
+
311
+ // Features
312
+ enabledFeatures,
313
+
314
+ // Methods
315
+ initializeConfig,
316
+ saveConfig,
317
+ resetConfig,
318
+ setConfig,
319
+ getConfigValue,
320
+
321
+ // Menu
322
+ getMenuConfig,
323
+ getMenuItems,
324
+ getMenuByOrgLevel,
325
+ searchMenu,
326
+
327
+ // Theme
328
+ getThemeConfig,
329
+ getColor,
330
+ generateCSSVariables
331
+ }
332
+ }
@@ -0,0 +1,71 @@
1
+ // composables/useDarkMode.ts
2
+ import { ref, onMounted, watch } from 'vue'
3
+
4
+ const isDark = ref<boolean>(false)
5
+ const isInitialized = ref<boolean>(false)
6
+ const followSystem = ref<boolean>(true)
7
+
8
+ export function useDarkMode() {
9
+ const updateDarkMode = (dark: boolean) => {
10
+ if (dark) {
11
+ document.documentElement.classList.add('dark')
12
+ } else {
13
+ document.documentElement.classList.remove('dark')
14
+ }
15
+ }
16
+
17
+ const toggleDarkMode = () => {
18
+ followSystem.value = false
19
+ isDark.value = !isDark.value
20
+ localStorage.setItem('darkMode', JSON.stringify(isDark.value))
21
+ localStorage.setItem('followSystem', 'false')
22
+ }
23
+
24
+ const resetToSystem = () => {
25
+ followSystem.value = true
26
+ localStorage.removeItem('darkMode')
27
+ localStorage.setItem('followSystem', 'true')
28
+
29
+ isDark.value = window.matchMedia('(prefers-color-scheme: dark)').matches
30
+ }
31
+
32
+ const initializeDarkMode = () => {
33
+ if (isInitialized.value) return
34
+
35
+ const savedFollowSystem = localStorage.getItem('followSystem')
36
+ const savedDarkMode = localStorage.getItem('darkMode')
37
+
38
+ if (savedFollowSystem === 'false' && savedDarkMode !== null) {
39
+ followSystem.value = false
40
+ isDark.value = JSON.parse(savedDarkMode)
41
+ } else {
42
+ followSystem.value = true
43
+ isDark.value = window.matchMedia('(prefers-color-scheme: dark)').matches
44
+ }
45
+
46
+ isInitialized.value = true
47
+ }
48
+
49
+ watch(isDark, updateDarkMode, { immediate: true })
50
+
51
+ onMounted(() => {
52
+ const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')
53
+ const handleChange = (e: MediaQueryListEvent) => {
54
+ if (followSystem.value) {
55
+ isDark.value = e.matches
56
+ }
57
+ }
58
+
59
+ mediaQuery.addEventListener('change', handleChange)
60
+
61
+ return () => mediaQuery.removeEventListener('change', handleChange)
62
+ })
63
+
64
+ return {
65
+ isDark,
66
+ followSystem,
67
+ toggleDarkMode,
68
+ resetToSystem,
69
+ initializeDarkMode
70
+ }
71
+ }
@@ -0,0 +1,318 @@
1
+ /**
2
+ * Application Configuration
3
+ * Centralized configuration for the framework template
4
+ */
5
+
6
+ import { myAppConfig } from './my-app.config'
7
+
8
+ export interface AppConfig {
9
+ // Application Identity
10
+ name: string
11
+ version: string
12
+ description?: string
13
+
14
+ // Branding
15
+ branding: {
16
+ logo: string
17
+ logoAlt?: string
18
+ favicon?: string
19
+ primaryColor: string
20
+ secondaryColor?: string
21
+ companyName: string
22
+ companyUrl?: string
23
+ loginBackgroundDay?: string
24
+ loginBackgroundNight?: string
25
+ }
26
+
27
+ // API Configuration
28
+ api: {
29
+ baseUrl: string
30
+ timeout?: number
31
+ retryAttempts?: number
32
+ endpoints: {
33
+ auth: {
34
+ login: string
35
+ logout: string
36
+ refresh: string
37
+ forgotPassword: string
38
+ changePassword: string
39
+ info: string
40
+ status: string
41
+ init: string
42
+ captcha: string
43
+ }
44
+ notifications: {
45
+ unreadCount: string
46
+ list: string
47
+ }
48
+ media: {
49
+ upload: string
50
+ delete: string
51
+ }
52
+ }
53
+ }
54
+
55
+ // Authentication
56
+ auth: {
57
+ tokenKey: string
58
+ userKey: string
59
+ organizationKey: string
60
+ defaultRedirect: string
61
+ ssoEnabled: boolean
62
+ ssoUrl?: string
63
+ captchaEnabled: boolean
64
+ otpEnabled: boolean
65
+ passwordPolicy: {
66
+ minLength: number
67
+ requireUppercase: boolean
68
+ requireLowercase: boolean
69
+ requireNumbers: boolean
70
+ requireSpecialChars: boolean
71
+ }
72
+ }
73
+
74
+ // Organization & Permissions
75
+ organization: {
76
+ levels: string[]
77
+ defaultLevel?: string
78
+ superAdminLevel?: string
79
+ }
80
+
81
+ // UI Configuration
82
+ ui: {
83
+ theme: {
84
+ primary: string
85
+ secondary?: string
86
+ accent?: string
87
+ darkMode: boolean
88
+ }
89
+ layout: {
90
+ sidebarWidth: number
91
+ headerHeight: number
92
+ tabHeight: number
93
+ }
94
+ features: {
95
+ search: boolean
96
+ notifications: boolean
97
+ darkMode: boolean
98
+ tabs: boolean
99
+ breadcrumbs: boolean
100
+ }
101
+ }
102
+
103
+ // Localization
104
+ i18n: {
105
+ defaultLocale: string
106
+ fallbackLocale: string
107
+ messages: Record<string, any>
108
+ }
109
+
110
+ // Features
111
+ features: {
112
+ fileUpload: boolean
113
+ export: boolean
114
+ import: boolean
115
+ realTimeNotifications: boolean
116
+ websocket: boolean
117
+ }
118
+ }
119
+
120
+ // Base default configuration (fallback values)
121
+ const baseDefaultConfig: AppConfig = {
122
+ name: 'Vue Framework Template',
123
+ version: '1.0.0',
124
+ description: 'A configurable Vue.js framework template',
125
+
126
+ branding: {
127
+ logo: '/img/brand/logo.svg',
128
+ logoAlt: 'Application Logo',
129
+ favicon: '/favicon.ico',
130
+ primaryColor: '#2671D9',
131
+ secondaryColor: '#297df0',
132
+ companyName: 'Your Company',
133
+ companyUrl: 'https://yourcompany.com',
134
+ loginBackgroundDay: '/src/assets/login-day.png',
135
+ loginBackgroundNight: '/src/assets/login-night.png'
136
+ },
137
+
138
+ api: {
139
+ baseUrl: import.meta.env.VITE_API_URL || 'http://localhost:3000/api',
140
+ timeout: 30000,
141
+ retryAttempts: 3,
142
+ endpoints: {
143
+ auth: {
144
+ login: '/auth/login',
145
+ logout: '/auth/logout',
146
+ refresh: '/user/refresh-token',
147
+ forgotPassword: '/auth/forgotpassword',
148
+ changePassword: '/auth/changepassword',
149
+ info: '/auth/info',
150
+ status: '/auth/status',
151
+ init: '/auth/login/init',
152
+ captcha: '/auth/captcha/init'
153
+ },
154
+ notifications: {
155
+ unreadCount: '/notif/unreadCount',
156
+ list: '/notif/list'
157
+ },
158
+ media: {
159
+ upload: '/media',
160
+ delete: '/media'
161
+ }
162
+ }
163
+ },
164
+
165
+ auth: {
166
+ tokenKey: 'app.user.token',
167
+ userKey: 'app.user.name',
168
+ organizationKey: 'app.user.organization',
169
+ defaultRedirect: '/',
170
+ ssoEnabled: false,
171
+ captchaEnabled: true,
172
+ otpEnabled: true,
173
+ passwordPolicy: {
174
+ minLength: 8,
175
+ requireUppercase: true,
176
+ requireLowercase: true,
177
+ requireNumbers: true,
178
+ requireSpecialChars: false
179
+ }
180
+ },
181
+
182
+ organization: {
183
+ levels: ['user', 'admin', 'superadmin'],
184
+ defaultLevel: 'user',
185
+ superAdminLevel: 'superadmin'
186
+ },
187
+
188
+ ui: {
189
+ theme: {
190
+ primary: '#2671D9',
191
+ secondary: '#297df0',
192
+ accent: '#e8f1fb',
193
+ darkMode: true
194
+ },
195
+ layout: {
196
+ sidebarWidth: 80,
197
+ headerHeight: 40,
198
+ tabHeight: 32
199
+ },
200
+ features: {
201
+ search: true,
202
+ notifications: true,
203
+ darkMode: true,
204
+ tabs: true,
205
+ breadcrumbs: true
206
+ }
207
+ },
208
+
209
+ i18n: {
210
+ defaultLocale: 'en',
211
+ fallbackLocale: 'en',
212
+ messages: {
213
+ en: {
214
+ common: {
215
+ search: 'Search...',
216
+ loading: 'Loading...',
217
+ error: 'An error occurred',
218
+ success: 'Success',
219
+ cancel: 'Cancel',
220
+ confirm: 'Confirm',
221
+ save: 'Save',
222
+ delete: 'Delete',
223
+ edit: 'Edit',
224
+ view: 'View'
225
+ },
226
+ auth: {
227
+ login: 'Login',
228
+ logout: 'Logout',
229
+ email: 'Email',
230
+ password: 'Password',
231
+ forgotPassword: 'Forgot Password?',
232
+ changePassword: 'Change Password',
233
+ loginSuccess: 'Login successful',
234
+ loginError: 'Login failed'
235
+ }
236
+ }
237
+ }
238
+ },
239
+
240
+ features: {
241
+ fileUpload: true,
242
+ export: true,
243
+ import: true,
244
+ realTimeNotifications: false,
245
+ websocket: false
246
+ }
247
+ }
248
+
249
+ // Deep merge helper function
250
+ function deepMerge(target: AppConfig, source: Partial<AppConfig>): AppConfig {
251
+ const output = { ...target } as any
252
+
253
+ if (isObject(target) && isObject(source)) {
254
+ Object.keys(source).forEach(key => {
255
+ const sourceValue = (source as any)[key]
256
+ const targetValue = (target as any)[key]
257
+
258
+ if (isObject(sourceValue) && isObject(targetValue) && !Array.isArray(sourceValue) && !Array.isArray(targetValue)) {
259
+ output[key] = deepMergeObject(targetValue, sourceValue)
260
+ } else if (sourceValue !== undefined) {
261
+ output[key] = sourceValue
262
+ }
263
+ })
264
+ }
265
+
266
+ return output as AppConfig
267
+ }
268
+
269
+ // Helper for merging nested objects (not full AppConfig)
270
+ function deepMergeObject(target: Record<string, any>, source: Record<string, any>): Record<string, any> {
271
+ const output = { ...target }
272
+
273
+ Object.keys(source).forEach(key => {
274
+ const sourceValue = source[key]
275
+ const targetValue = target[key]
276
+
277
+ if (isObject(sourceValue) && isObject(targetValue) && !Array.isArray(sourceValue) && !Array.isArray(targetValue)) {
278
+ output[key] = deepMergeObject(targetValue, sourceValue)
279
+ } else if (sourceValue !== undefined) {
280
+ output[key] = sourceValue
281
+ }
282
+ })
283
+
284
+ return output
285
+ }
286
+
287
+ function isObject(item: any): item is Record<string, any> {
288
+ return item && typeof item === 'object' && !Array.isArray(item)
289
+ }
290
+
291
+ // Default configuration - merges myAppConfig with base defaults
292
+ export const defaultConfig: AppConfig = deepMerge(baseDefaultConfig, myAppConfig)
293
+
294
+ // Configuration instance
295
+ let appConfig: AppConfig = { ...defaultConfig }
296
+
297
+ export const useAppConfig = () => {
298
+ const setConfig = (config: Partial<AppConfig>) => {
299
+ appConfig = { ...appConfig, ...config }
300
+ }
301
+
302
+ const getConfig = (): AppConfig => {
303
+ return appConfig
304
+ }
305
+
306
+ const getConfigValue = <T>(path: string): T => {
307
+ return path.split('.').reduce((obj: any, key) => obj?.[key], appConfig) as T
308
+ }
309
+
310
+ return {
311
+ config: appConfig,
312
+ setConfig,
313
+ getConfig,
314
+ getConfigValue
315
+ }
316
+ }
317
+
318
+ export default appConfig