@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.
- package/README.md +346 -0
- package/bin/dasi-cli.cjs +184 -0
- package/dist/date-selector-test-BlukYeWl.js +91 -0
- package/dist/favicon.ico +0 -0
- package/dist/html2canvas.esm-CKxSAI8P.js +4886 -0
- package/dist/img/brand/ic_pln.svg +12 -0
- package/dist/img/brand/mapp_power_logo.svg +21 -0
- package/dist/img/common/pltu_ulumbu_flores_ntt.jpeg +0 -0
- package/dist/index-BQSA2aPs.js +126556 -0
- package/dist/index.es-DQWt-PZn.js +5769 -0
- package/dist/index.es.js +11 -0
- package/dist/index.umd.js +8564 -0
- package/dist/informasi-gudang-BmoEy2RL.js +164 -0
- package/dist/informasi-gudang-DXfS46Nh.js +50 -0
- package/dist/purify.es-C-9oolON.js +546 -0
- package/dist/scripts/pdf.worker.min.js +29 -0
- package/dist/scripts/pdf.worker.min.mjs +29 -0
- package/dist/scripts/pdf.worker.mjs +57722 -0
- package/dist/scripts/pdf.worker.mjs.map +1 -0
- package/dist/style.css +1 -0
- package/dist/test-schema-JFghGc0_.js +8 -0
- package/dist/test-schema-uusFsJe4.js +438 -0
- package/dist/types-l0sNRNKZ.js +1 -0
- package/package.json +178 -0
- package/src/App.vue +18 -0
- package/src/__tests__/index.test.ts +9 -0
- package/src/api/api.ts +117 -0
- package/src/assets/app-selector.svg +3 -0
- package/src/assets/dasi.png +0 -0
- package/src/assets/foto_ss.svg +21 -0
- package/src/assets/icons/circle-blue.svg +4 -0
- package/src/assets/icons/circle-gray.svg +15 -0
- package/src/assets/icons/circle-green.svg +4 -0
- package/src/assets/icons/circle-orange.svg +4 -0
- package/src/assets/icons/circle-purple.svg +4 -0
- package/src/assets/icons/circle-red.svg +15 -0
- package/src/assets/icons/harbor.svg +12 -0
- package/src/assets/icons/ic-box-red.svg +8 -0
- package/src/assets/icons/ic-chevron-right.svg +1 -0
- package/src/assets/icons/ic-loading.svg +9 -0
- package/src/assets/icons/ic-reset.svg +16 -0
- package/src/assets/icons/ic-sailing.svg +5 -0
- package/src/assets/icons/icon-app-selector.svg +3 -0
- package/src/assets/icons/icon-browser-check.svg +4 -0
- package/src/assets/icons/icon-calendar.svg +3 -0
- package/src/assets/icons/icon-chart-bar.svg +3 -0
- package/src/assets/icons/icon-chart-doc.svg +16 -0
- package/src/assets/icons/icon-chart-line.svg +10 -0
- package/src/assets/icons/icon-chart-mix.svg +15 -0
- package/src/assets/icons/icon-chart-pie.svg +11 -0
- package/src/assets/icons/icon-continue.svg +12 -0
- package/src/assets/icons/icon-dashboard-2.svg +17 -0
- package/src/assets/icons/icon-dashboard.svg +3 -0
- package/src/assets/icons/icon-data-kelistrikan.svg +19 -0
- package/src/assets/icons/icon-data-sentral.svg +11 -0
- package/src/assets/icons/icon-database.svg +5 -0
- package/src/assets/icons/icon-desktop.svg +3 -0
- package/src/assets/icons/icon-download.svg +13 -0
- package/src/assets/icons/icon-energi-primer.svg +12 -0
- package/src/assets/icons/icon-faba-apk2.svg +11 -0
- package/src/assets/icons/icon-faba.svg +11 -0
- package/src/assets/icons/icon-factory.svg +14 -0
- package/src/assets/icons/icon-globe-doc.svg +19 -0
- package/src/assets/icons/icon-ikk.svg +10 -0
- package/src/assets/icons/icon-kbb.svg +13 -0
- package/src/assets/icons/icon-kos.svg +16 -0
- package/src/assets/icons/icon-kpi-bod.svg +15 -0
- package/src/assets/icons/icon-kss.svg +14 -0
- package/src/assets/icons/icon-map.svg +12 -0
- package/src/assets/icons/icon-monitoring-harian.svg +13 -0
- package/src/assets/icons/icon-notification.svg +4 -0
- package/src/assets/icons/icon-overview.svg +17 -0
- package/src/assets/icons/icon-pltu.svg +13 -0
- package/src/assets/icons/icon-sebaran-sentral.svg +12 -0
- package/src/assets/icons/icon-select-data-kelistrikan.svg +19 -0
- package/src/assets/icons/icon-select-data-sentral.svg +11 -0
- package/src/assets/icons/icon-select-energi-primer.svg +12 -0
- package/src/assets/icons/icon-select-faba-apk2.svg +11 -0
- package/src/assets/icons/icon-select-ikk.svg +10 -0
- package/src/assets/icons/icon-select-kbb.svg +13 -0
- package/src/assets/icons/icon-select-kos.svg +16 -0
- package/src/assets/icons/icon-select-kpi-bod.svg +15 -0
- package/src/assets/icons/icon-select-kss.svg +14 -0
- package/src/assets/icons/icon-select-monitoring-harian.svg +13 -0
- package/src/assets/icons/icon-select-overview.svg +17 -0
- package/src/assets/icons/icon-select-sebaran-sentral.svg +12 -0
- package/src/assets/icons/icon-sentral-white.svg +13 -0
- package/src/assets/icons/icon-shipping.svg +5 -0
- package/src/assets/icons/icon-sort.svg +5 -0
- package/src/assets/icons/icon-tree-box.svg +14 -0
- package/src/assets/icons/icon-warehouse.svg +12 -0
- package/src/assets/icons/pin-green.svg +3 -0
- package/src/assets/icons/pin-orange.svg +3 -0
- package/src/assets/icons/pin-purple.svg +3 -0
- package/src/assets/icons/ship.svg +3 -0
- package/src/assets/icons/shipment/icon-antri.svg +15 -0
- package/src/assets/icons/shipment/icon-bongkar.svg +4 -0
- package/src/assets/icons/shipment/icon-invoice.svg +6 -0
- package/src/assets/icons/shipment/icon-loading.svg +8 -0
- package/src/assets/icons/shipment/icon-pembayaran.svg +13 -0
- package/src/assets/icons/shipment/icon-pengiriman.svg +4 -0
- package/src/assets/icons/shipment/icon-sailing.svg +4 -0
- package/src/assets/icons/shipment/icon-shipment-completed.svg +6 -0
- package/src/assets/icons/shipment/icon-shipment-in-progress.svg +6 -0
- package/src/assets/icons/shipment/icon-shipment-over-sla.svg +6 -0
- package/src/assets/icons/shipment/icon-spt.svg +4 -0
- package/src/assets/icons/shipment/icon-total-shipment.svg +4 -0
- package/src/assets/icons/upload_doc_icon.svg +42 -0
- package/src/assets/icons/upload_icon_blue.svg +14 -0
- package/src/assets/login-bg-day-min.jpg +0 -0
- package/src/assets/login-bg-night-min.jpg +0 -0
- package/src/assets/login-bg.jpg +0 -0
- package/src/assets/login-day.png +0 -0
- package/src/assets/login-night.png +0 -0
- package/src/assets/lucide-circle-plus-blue.svg +1 -0
- package/src/assets/pdf-logo.svg +11 -0
- package/src/assets/pemasok-card-bg.svg +6 -0
- package/src/assets/success_animation.gif +0 -0
- package/src/assets/success_animation.mp4 +0 -0
- package/src/assets/success_animation.webm +0 -0
- package/src/components/button/BtnAddOutline.vue +14 -0
- package/src/components/button/BtnCircle.vue +10 -0
- package/src/components/button/BtnOutline.vue +15 -0
- package/src/components/button/BtnPrimary.vue +25 -0
- package/src/components/button/BtnSecondary.vue +26 -0
- package/src/components/detail/AccountDetailTimeline.vue +144 -0
- package/src/components/detail/ApprovalInfo.vue +288 -0
- package/src/components/detail/DCI2.vue +164 -0
- package/src/components/detail/DetailContentHeader.vue +83 -0
- package/src/components/detail/DetailContentItem.vue +186 -0
- package/src/components/detail/DetailContentItems.vue +388 -0
- package/src/components/detail/DetailContentLoading.vue +12 -0
- package/src/components/detail/DetailContentTablet.vue +10 -0
- package/src/components/detail/DetailSheet.vue +294 -0
- package/src/components/detail/DetailTimeline.vue +191 -0
- package/src/components/detail/DocApprovalDialog.vue +29 -0
- package/src/components/detail/DocViewerContent.vue +991 -0
- package/src/components/dialog/ConfirmDialog.vue +96 -0
- package/src/components/dialog/DialogBase.vue +53 -0
- package/src/components/dialog/DialogSelect.vue +212 -0
- package/src/components/dialog/ErrorDialog.vue +63 -0
- package/src/components/dialog/FormDialog.vue +141 -0
- package/src/components/dialog/FormInputerDialog.vue +91 -0
- package/src/components/dialog/InfoDialog.vue +74 -0
- package/src/components/dialog/SuccessDialog.vue +51 -0
- package/src/components/examples/TestSchemaExample.vue +288 -0
- package/src/components/forms/auth/LoginForm.vue +806 -0
- package/src/components/forms/auth/PwdScore.vue +68 -0
- package/src/components/helper/ApiTester.vue +153 -0
- package/src/components/helper/ChangePwd.vue +150 -0
- package/src/components/helper/CheckboxElement.vue +43 -0
- package/src/components/helper/ConfigSwitcher.vue +54 -0
- package/src/components/helper/Copyright.vue +10 -0
- package/src/components/helper/ErrorScreen.vue +40 -0
- package/src/components/helper/LucideIcon.vue +27 -0
- package/src/components/helper/PdfViewer.vue +103 -0
- package/src/components/helper/PinInputer.vue +205 -0
- package/src/components/helper/PrivacyPolicy.vue +122 -0
- package/src/components/layout/PageActivityHeader.vue +48 -0
- package/src/components/layout/PageHeader.vue +70 -0
- package/src/components/loadings/LoadingDialog.vue +29 -0
- package/src/components/loadings/LoadingDialogSpin.vue +25 -0
- package/src/components/loadings/LoadingIndicator.vue +38 -0
- package/src/components/loadings/LoadingScreen.vue +23 -0
- package/src/components/notif/Notif.vue +103 -0
- package/src/components/notif/NotifItem.vue +41 -0
- package/src/components/pages/Header.vue +431 -0
- package/src/components/pages/Leftbar.vue +417 -0
- package/src/components/pages/PageActivity.vue +108 -0
- package/src/components/pages/PageActivityContent.vue +597 -0
- package/src/components/pages/PageContentTable.vue +589 -0
- package/src/components/pages/PageTab.vue +84 -0
- package/src/components/selector/BaseSelector.vue +1136 -0
- package/src/components/selector/ConfigDataSelector.vue +136 -0
- package/src/components/settings/SettingsItem.vue +38 -0
- package/src/components/tab/TabView.vue +11 -0
- package/src/components/tab/TabViewItem.vue +18 -0
- package/src/components/tab/TabViewItemBar.vue +9 -0
- package/src/components/tables/CellHover.vue +65 -0
- package/src/components/tables/DashboardDataTable.vue +707 -0
- package/src/components/tables/DataStatusTag.vue +52 -0
- package/src/components/tables/DataTable.vue +156 -0
- package/src/components/tables/DataTableAccordion.vue +249 -0
- package/src/components/tables/DataTableActionRow.vue +64 -0
- package/src/components/tables/DataTableCell.vue +272 -0
- package/src/components/tables/DataTableHeader.vue +60 -0
- package/src/components/tables/DataTableRow.vue +213 -0
- package/src/components/tables/ExpandedTable.vue +259 -0
- package/src/components/tables/PageTable.vue +73 -0
- package/src/components/tables/Pagination.vue +98 -0
- package/src/components/tables/dropdown/BaseDropdownTable.vue +140 -0
- package/src/components/tables/dropdown/DropdownTableActivity.vue +33 -0
- package/src/components/tables/dropdown/DropdownTableAsset.vue +30 -0
- package/src/components/tables/dropdown/DropdownTableConfig.vue +30 -0
- package/src/components/tables/dropdown/DropdownTableDataKonektor.vue +31 -0
- package/src/components/tables/dropdown/DropdownTableDataLabel.vue +30 -0
- package/src/components/tables/dropdown/DropdownTableDataSchema.vue +31 -0
- package/src/components/tables/dropdown/DropdownTableFabaPemanfaat.vue +30 -0
- package/src/components/tables/dropdown/DropdownTableGroup.vue +36 -0
- package/src/components/tables/dropdown/DropdownTableHalaman.vue +33 -0
- package/src/components/tables/dropdown/DropdownTableLevel.vue +66 -0
- package/src/components/tables/dropdown/DropdownTableOrganization.vue +47 -0
- package/src/components/tables/dropdown/DropdownTablePengelola.vue +28 -0
- package/src/components/tables/dropdown/DropdownTableQueryLayer.vue +29 -0
- package/src/components/tables/dropdown/DropdownTableSentral.vue +33 -0
- package/src/components/tables/dropdown/DropdownTableWarehouse.vue +30 -0
- package/src/components/tables/dropdown/TableDropdown.vue +52 -0
- package/src/components/ui/accordion/Accordion.vue +19 -0
- package/src/components/ui/accordion/AccordionContent.vue +24 -0
- package/src/components/ui/accordion/AccordionItem.vue +24 -0
- package/src/components/ui/accordion/AccordionTrigger.vue +42 -0
- package/src/components/ui/accordion/index.ts +4 -0
- package/src/components/ui/alert-dialog/AlertDialog.vue +14 -0
- package/src/components/ui/alert-dialog/AlertDialogAction.vue +20 -0
- package/src/components/ui/alert-dialog/AlertDialogCancel.vue +20 -0
- package/src/components/ui/alert-dialog/AlertDialogContent.vue +42 -0
- package/src/components/ui/alert-dialog/AlertDialogDescription.vue +25 -0
- package/src/components/ui/alert-dialog/AlertDialogFooter.vue +21 -0
- package/src/components/ui/alert-dialog/AlertDialogHeader.vue +16 -0
- package/src/components/ui/alert-dialog/AlertDialogTitle.vue +22 -0
- package/src/components/ui/alert-dialog/AlertDialogTrigger.vue +11 -0
- package/src/components/ui/alert-dialog/index.ts +9 -0
- package/src/components/ui/avatar/Avatar.vue +24 -0
- package/src/components/ui/avatar/AvatarFallback.vue +11 -0
- package/src/components/ui/avatar/AvatarImage.vue +9 -0
- package/src/components/ui/avatar/UsersAvatar.vue +28 -0
- package/src/components/ui/avatar/index.ts +24 -0
- package/src/components/ui/button/Button.vue +27 -0
- package/src/components/ui/button/index.ts +34 -0
- package/src/components/ui/calendar/Calendar.vue +325 -0
- package/src/components/ui/calendar/index.ts +22 -0
- package/src/components/ui/checkbox/Checkbox.vue +33 -0
- package/src/components/ui/checkbox/index.ts +1 -0
- package/src/components/ui/command/Command.vue +30 -0
- package/src/components/ui/command/CommandDialog.vue +21 -0
- package/src/components/ui/command/CommandEmpty.vue +20 -0
- package/src/components/ui/command/CommandGroup.vue +29 -0
- package/src/components/ui/command/CommandInput.vue +33 -0
- package/src/components/ui/command/CommandItem.vue +26 -0
- package/src/components/ui/command/CommandList.vue +27 -0
- package/src/components/ui/command/CommandSeparator.vue +23 -0
- package/src/components/ui/command/CommandShortcut.vue +14 -0
- package/src/components/ui/command/index.ts +9 -0
- package/src/components/ui/context-menu/ContextMenu.vue +15 -0
- package/src/components/ui/context-menu/ContextMenuCheckboxItem.vue +40 -0
- package/src/components/ui/context-menu/ContextMenuContent.vue +36 -0
- package/src/components/ui/context-menu/ContextMenuGroup.vue +11 -0
- package/src/components/ui/context-menu/ContextMenuItem.vue +34 -0
- package/src/components/ui/context-menu/ContextMenuLabel.vue +25 -0
- package/src/components/ui/context-menu/ContextMenuPortal.vue +11 -0
- package/src/components/ui/context-menu/ContextMenuRadioGroup.vue +19 -0
- package/src/components/ui/context-menu/ContextMenuRadioItem.vue +40 -0
- package/src/components/ui/context-menu/ContextMenuSeparator.vue +20 -0
- package/src/components/ui/context-menu/ContextMenuShortcut.vue +14 -0
- package/src/components/ui/context-menu/ContextMenuSub.vue +19 -0
- package/src/components/ui/context-menu/ContextMenuSubContent.vue +35 -0
- package/src/components/ui/context-menu/ContextMenuSubTrigger.vue +34 -0
- package/src/components/ui/context-menu/ContextMenuTrigger.vue +13 -0
- package/src/components/ui/context-menu/index.ts +14 -0
- package/src/components/ui/datetime/DatetimeRangeComponent.vue +52 -0
- package/src/components/ui/dialog/Dialog.vue +14 -0
- package/src/components/ui/dialog/DialogClose.vue +11 -0
- package/src/components/ui/dialog/DialogContent.vue +53 -0
- package/src/components/ui/dialog/DialogDescription.vue +24 -0
- package/src/components/ui/dialog/DialogFooter.vue +19 -0
- package/src/components/ui/dialog/DialogHeader.vue +16 -0
- package/src/components/ui/dialog/DialogScrollContent.vue +59 -0
- package/src/components/ui/dialog/DialogTitle.vue +29 -0
- package/src/components/ui/dialog/DialogTrigger.vue +11 -0
- package/src/components/ui/dialog/index.ts +9 -0
- package/src/components/ui/dropdown-menu/DropdownMenu.vue +14 -0
- package/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +40 -0
- package/src/components/ui/dropdown-menu/DropdownMenuContent.vue +38 -0
- package/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +11 -0
- package/src/components/ui/dropdown-menu/DropdownMenuItem.vue +28 -0
- package/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +24 -0
- package/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +19 -0
- package/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +41 -0
- package/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +22 -0
- package/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +14 -0
- package/src/components/ui/dropdown-menu/DropdownMenuSub.vue +19 -0
- package/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +30 -0
- package/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +33 -0
- package/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +13 -0
- package/src/components/ui/dropdown-menu/index.ts +16 -0
- package/src/components/ui/form/FormControl.vue +16 -0
- package/src/components/ui/form/FormDescription.vue +20 -0
- package/src/components/ui/form/FormItem.vue +25 -0
- package/src/components/ui/form/FormLabel.vue +23 -0
- package/src/components/ui/form/FormMessage.vue +16 -0
- package/src/components/ui/form/index.ts +6 -0
- package/src/components/ui/form/useFormField.ts +30 -0
- package/src/components/ui/hover-card/HoverCard.vue +14 -0
- package/src/components/ui/hover-card/HoverCardContent.vue +41 -0
- package/src/components/ui/hover-card/HoverCardTrigger.vue +11 -0
- package/src/components/ui/hover-card/index.ts +3 -0
- package/src/components/ui/input/Input.vue +24 -0
- package/src/components/ui/input/index.ts +1 -0
- package/src/components/ui/label/Label.vue +27 -0
- package/src/components/ui/label/index.ts +1 -0
- package/src/components/ui/pagination/PaginationEllipsis.vue +22 -0
- package/src/components/ui/pagination/PaginationFirst.vue +29 -0
- package/src/components/ui/pagination/PaginationLast.vue +29 -0
- package/src/components/ui/pagination/PaginationNext.vue +29 -0
- package/src/components/ui/pagination/PaginationPrev.vue +29 -0
- package/src/components/ui/pagination/index.ts +10 -0
- package/src/components/ui/pin-input/PinInput.vue +23 -0
- package/src/components/ui/pin-input/PinInputGroup.vue +18 -0
- package/src/components/ui/pin-input/PinInputInput.vue +18 -0
- package/src/components/ui/pin-input/PinInputSeparator.vue +15 -0
- package/src/components/ui/pin-input/index.ts +4 -0
- package/src/components/ui/popover/Popover.vue +15 -0
- package/src/components/ui/popover/PopoverContent.vue +48 -0
- package/src/components/ui/popover/PopoverTrigger.vue +11 -0
- package/src/components/ui/popover/index.ts +4 -0
- package/src/components/ui/preview/PreviewPdf.vue +118 -0
- package/src/components/ui/progress/ProgressCircle.vue +27 -0
- package/src/components/ui/progress/SemiCircularProgressBar.vue +83 -0
- package/src/components/ui/progress/TotalCalories.vue +31 -0
- package/src/components/ui/radio-group/RadioGroup.vue +25 -0
- package/src/components/ui/radio-group/RadioGroupItem.vue +37 -0
- package/src/components/ui/radio-group/index.ts +2 -0
- package/src/components/ui/scroll-area/ScrollArea.vue +29 -0
- package/src/components/ui/scroll-area/ScrollBar.vue +30 -0
- package/src/components/ui/scroll-area/index.ts +2 -0
- package/src/components/ui/select/Select.vue +15 -0
- package/src/components/ui/select/SelectContent.vue +52 -0
- package/src/components/ui/select/SelectGroup.vue +19 -0
- package/src/components/ui/select/SelectInline.vue +84 -0
- package/src/components/ui/select/SelectItem.vue +44 -0
- package/src/components/ui/select/SelectItemText.vue +11 -0
- package/src/components/ui/select/SelectLabel.vue +13 -0
- package/src/components/ui/select/SelectScrollDownButton.vue +24 -0
- package/src/components/ui/select/SelectScrollUpButton.vue +24 -0
- package/src/components/ui/select/SelectSeparator.vue +17 -0
- package/src/components/ui/select/SelectTrigger.vue +31 -0
- package/src/components/ui/select/SelectTriggerCustom.vue +23 -0
- package/src/components/ui/select/SelectValue.vue +11 -0
- package/src/components/ui/select/index.ts +12 -0
- package/src/components/ui/separator/Separator.vue +20 -0
- package/src/components/ui/separator/index.ts +1 -0
- package/src/components/ui/sheet/Sheet.vue +14 -0
- package/src/components/ui/sheet/SheetClose.vue +11 -0
- package/src/components/ui/sheet/SheetContent.vue +48 -0
- package/src/components/ui/sheet/SheetDescription.vue +22 -0
- package/src/components/ui/sheet/SheetFooter.vue +19 -0
- package/src/components/ui/sheet/SheetHeader.vue +16 -0
- package/src/components/ui/sheet/SheetTitle.vue +22 -0
- package/src/components/ui/sheet/SheetTrigger.vue +11 -0
- package/src/components/ui/sheet/index.ts +31 -0
- package/src/components/ui/skeleton/Skeleton.vue +28 -0
- package/src/components/ui/skeleton/index.ts +1 -0
- package/src/components/ui/sonner/Sonner.vue +22 -0
- package/src/components/ui/sonner/index.ts +1 -0
- package/src/components/ui/star/StarRating.vue +19 -0
- package/src/components/ui/switch/Switch.vue +37 -0
- package/src/components/ui/switch/index.ts +1 -0
- package/src/components/ui/table/Table.vue +16 -0
- package/src/components/ui/table/TableBody.vue +14 -0
- package/src/components/ui/table/TableCaption.vue +14 -0
- package/src/components/ui/table/TableCell.vue +21 -0
- package/src/components/ui/table/TableEmpty.vue +37 -0
- package/src/components/ui/table/TableFooter.vue +14 -0
- package/src/components/ui/table/TableHead.vue +14 -0
- package/src/components/ui/table/TableHeader.vue +14 -0
- package/src/components/ui/table/TableRow.vue +14 -0
- package/src/components/ui/table/index.ts +8 -0
- package/src/components/ui/tabs/Tabs.vue +15 -0
- package/src/components/ui/tabs/TabsContent.vue +22 -0
- package/src/components/ui/tabs/TabsList.vue +25 -0
- package/src/components/ui/tabs/TabsTrigger.vue +27 -0
- package/src/components/ui/tabs/index.ts +4 -0
- package/src/components/ui/tags-input/TagsInput.vue +22 -0
- package/src/components/ui/tags-input/TagsInputInput.vue +19 -0
- package/src/components/ui/tags-input/TagsInputItem.vue +22 -0
- package/src/components/ui/tags-input/TagsInputItemDelete.vue +24 -0
- package/src/components/ui/tags-input/TagsInputItemText.vue +19 -0
- package/src/components/ui/tags-input/index.ts +5 -0
- package/src/components/ui/textarea/Textarea.vue +24 -0
- package/src/components/ui/textarea/index.ts +1 -0
- package/src/components/ui/tooltip/Tooltip.vue +14 -0
- package/src/components/ui/tooltip/TooltipContent.vue +31 -0
- package/src/components/ui/tooltip/TooltipProvider.vue +11 -0
- package/src/components/ui/tooltip/TooltipTrigger.vue +11 -0
- package/src/components/ui/tooltip/index.ts +4 -0
- package/src/composables/useAppConfig.ts +332 -0
- package/src/composables/useDarkMode.ts +71 -0
- package/src/config/app.config.ts +318 -0
- package/src/config/examples/ecommerce.config.ts +132 -0
- package/src/config/examples/generic.config.ts +132 -0
- package/src/config/menu.config.ts +149 -0
- package/src/config/my-app.config.ts +134 -0
- package/src/config/test-config.ts +32 -0
- package/src/config/theme.config.ts +250 -0
- package/src/docs/index.ts +21 -0
- package/src/docs.scss +403 -0
- package/src/index.d.ts +5 -0
- package/src/index.ts +20 -0
- package/src/layouts/AuthLayout.vue +68 -0
- package/src/layouts/DefaultLayout.vue +119 -0
- package/src/layouts/DocsLayout.vue +681 -0
- package/src/layouts/FormGlobal.vue +50 -0
- package/src/layouts/GlobalDialog.vue +122 -0
- package/src/layouts/RakorConfirmDialog.vue +95 -0
- package/src/layouts/SettingsLayout.vue +115 -0
- package/src/lib/constants.ts +2 -0
- package/src/lib/detail.utils.ts +213 -0
- package/src/lib/form.utils.ts +1009 -0
- package/src/lib/page.flow.utils.ts +81 -0
- package/src/lib/page.utils.ts +865 -0
- package/src/lib/performance.utils.ts +302 -0
- package/src/lib/tablerow.utils.ts +51 -0
- package/src/lib/utils.ts +643 -0
- package/src/main.scss +717 -0
- package/src/main.ts +74 -0
- package/src/menu.ts +78 -0
- package/src/nestedlist_color.scss +161 -0
- package/src/router/index.ts +92 -0
- package/src/stores/auth.ts +117 -0
- package/src/stores/counter.ts +12 -0
- package/src/stores/dialog.ts +168 -0
- package/src/stores/form.ts +103 -0
- package/src/stores/tabs.ts +52 -0
- package/src/tw.scss +419 -0
- package/src/types/form.types.ts +348 -0
- package/src/types/types.ts +7 -0
- package/src/utils/config.utils.ts +149 -0
- package/src/views/NotFound.vue +30 -0
- package/src/views/PageActivity.vue +15 -0
- package/src/views/auth/LoginView.vue +7 -0
- package/src/views/auth/OauthCallback.vue +101 -0
- package/src/views/dashboard/index.vue +16 -0
- package/src/views/settings/AccountSettingsView.vue +70 -0
- package/src/views/settings/AuditLogsSettingsView.vue +116 -0
- package/src/views/settings/DeviceSettingsView.vue +70 -0
- package/src/views/settings/MainSettingsView.vue +12 -0
- package/src/views/settings/ProfileSettingsView.vue +104 -0
- package/src/vueform/config/informasi-gudang.ts +47 -0
- package/src/vueform/config/test-schema.ts +8 -0
- package/src/vueform/config/types.ts +768 -0
- package/src/vueform/customization/classes.js +46 -0
- package/src/vueform/customization/tailwind.classes.js +2117 -0
- package/src/vueform/elements/ConfigDataSelectorElement.vue +50 -0
- package/src/vueform/elements/DateSelectorElement.vue +323 -0
- package/src/vueform/elements/SelectorElement.vue +153 -0
- package/src/vueform/schemas/date-selector-test.ts +103 -0
- package/src/vueform/schemas/informasi-gudang.ts +160 -0
- package/src/vueform/schemas/test-schema.ts +483 -0
- package/src/vueform.config.js +77 -0
- package/src/vueform.validator.ts +77 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<svg width="218" height="36" viewBox="0 0 218 36" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<path d="M218 13.9805H65.5467C56.0994 13.9805 46.957 17.3243 39.7391 23.4196L24.6719 36.1433H218V13.9805Z" fill="#91BEF7"/>
|
|
3
|
+
<path d="M25.2224 29.5356L49.525 8.75953L43.774 7.37383L19.4281 28.3645L25.2224 29.5356Z" fill="#91BEF7"/>
|
|
4
|
+
<path d="M4.93729 37.0517L29.2398 16.2756L24.3473 15.0634L0.00133888 36.0542L4.93729 37.0517Z" fill="#FFF200"/>
|
|
5
|
+
<path d="M5.60198 27.1341L25.8613 9.78491L23.0714 9.22105L3.07008 26.399L5.60198 27.1341Z" fill="white"/>
|
|
6
|
+
</svg>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { cn } from "@/lib/utils";
|
|
3
|
+
import { LucidePlusCircle } from "lucide-vue-next";
|
|
4
|
+
import BtnCircle from "@/components/button/BtnCircle.vue";
|
|
5
|
+
|
|
6
|
+
const props = defineProps(["class"]);
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<template>
|
|
10
|
+
<BtnCircle :class="cn('!h-auto !w-auto border-[1.5px] border-primary_main bg-white py-1 pl-[5px] pr-3 text-sm text-primary_main', props.class)">
|
|
11
|
+
<LucidePlusCircle :size="25" class="mr-[6px]" :stroke-width="1.5" />
|
|
12
|
+
<slot></slot>
|
|
13
|
+
</BtnCircle>
|
|
14
|
+
</template>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { cn } from '@/lib/utils';
|
|
3
|
+
const props = defineProps(['class'])
|
|
4
|
+
</script>
|
|
5
|
+
|
|
6
|
+
<template>
|
|
7
|
+
<button type="button" :class="cn('text-[12px] 2xl:text-[13px] rounded-full size-7 2xl:size-8 flex items-center justify-center hover:bg-slate-200 dark:hover:bg-dark_bg5 transition text-gray-500 cursor-pointer', props.class)">
|
|
8
|
+
<slot></slot>
|
|
9
|
+
</button>
|
|
10
|
+
</template>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { cn } from "@/lib/utils";
|
|
3
|
+
import { type HTMLAttributes } from "vue";
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
class?: HTMLAttributes["class"];
|
|
7
|
+
}
|
|
8
|
+
const props = defineProps<Props>();
|
|
9
|
+
</script>
|
|
10
|
+
|
|
11
|
+
<template>
|
|
12
|
+
<button :class="cn('hover:bg-primary_main_hover rounded-md border-2 border-primary_main bg-transparent px-4 py-2 font-medium text-primary_main transition hover:text-white', props.class)">
|
|
13
|
+
<slot></slot>
|
|
14
|
+
</button>
|
|
15
|
+
</template>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { Button } from '@/components/ui/button'
|
|
3
|
+
import { cn } from '@/lib/utils';
|
|
4
|
+
const props = defineProps(['class', 'loading', 'disabled', 'disabledClass'])
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<template>
|
|
8
|
+
<Button
|
|
9
|
+
:class="[
|
|
10
|
+
cn('text-[13px] 2xl:text-[14px] bg-blue-500 px-6 py-0 h-9 2xl:h-11 border-none rounded-md border-blue-500 text-white font-medium hover:bg-blue-600 transition leading-none', props.class),
|
|
11
|
+
{ '!bg-gray-300 !text-gray-300 cursor-default relative overflow-hidden !shadow-none': props.loading },
|
|
12
|
+
{ '!bg-gray-300 !text-gray-400 cursor-default relative overflow-hidden !shadow-none': props.disabled || props.disabledClass },
|
|
13
|
+
]"
|
|
14
|
+
:disabled="props.loading || props.disabled">
|
|
15
|
+
<slot></slot>
|
|
16
|
+
<div v-if="props.loading" class="top-0 right-0 bottom-0 left-0 bg-gray-300">
|
|
17
|
+
<svg class="absolute left-0 top-0 bottom-0 right-0 m-auto w-7 h-7 text-black animate-spin" fill="none"
|
|
18
|
+
viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
19
|
+
<circle class="opacity-15" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="2" />
|
|
20
|
+
<path class="opacity-15" fill="currentColor"
|
|
21
|
+
d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" />
|
|
22
|
+
</svg>
|
|
23
|
+
</div>
|
|
24
|
+
</Button>
|
|
25
|
+
</template>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { Button } from "@/components/ui/button";
|
|
3
|
+
import { cn } from "@/lib/utils";
|
|
4
|
+
const props = defineProps(["class", "disabled", "loading", "disabledClass"]);
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<template>
|
|
8
|
+
<Button
|
|
9
|
+
:class="[
|
|
10
|
+
cn(
|
|
11
|
+
'h-9 rounded-md border-none border-primary_main bg-blue-50 bg-transparent px-6 text-[13px] font-medium text-primary_main shadow-none transition hover:border-primary_main hover:bg-blue-100 2xl:h-11 2xl:text-sm',
|
|
12
|
+
props.class
|
|
13
|
+
),
|
|
14
|
+
{ 'relative cursor-default overflow-hidden !bg-gray-300 !text-gray-300 !shadow-none': props.loading },
|
|
15
|
+
{ 'relative cursor-default overflow-hidden !bg-gray-300 !text-gray-400 !shadow-none': props.disabled || props.disabledClass }
|
|
16
|
+
]"
|
|
17
|
+
:disabled="props.disabled || props.loading">
|
|
18
|
+
<slot></slot>
|
|
19
|
+
<div v-if="props.loading" class="bottom-0 left-0 right-0 top-0 bg-gray-300">
|
|
20
|
+
<svg class="absolute bottom-0 left-0 right-0 top-0 m-auto h-7 w-7 animate-spin text-black" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
21
|
+
<circle class="opacity-15" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="2" />
|
|
22
|
+
<path class="opacity-15" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" />
|
|
23
|
+
</svg>
|
|
24
|
+
</div>
|
|
25
|
+
</Button>
|
|
26
|
+
</template>
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import moment from 'moment';
|
|
3
|
+
|
|
4
|
+
moment.updateLocale('en', {
|
|
5
|
+
relativeTime : {
|
|
6
|
+
future: "in %s",
|
|
7
|
+
past: "%s ago",
|
|
8
|
+
s : '1s',
|
|
9
|
+
ss : '%ds',
|
|
10
|
+
m: "1m",
|
|
11
|
+
mm: "%dm",
|
|
12
|
+
h: "1h",
|
|
13
|
+
hh: "%dh",
|
|
14
|
+
d: "1d",
|
|
15
|
+
dd: "%dd",
|
|
16
|
+
w: "1w",
|
|
17
|
+
ww: "%dw",
|
|
18
|
+
M: "1Mo",
|
|
19
|
+
MM: "%dMo",
|
|
20
|
+
y: "1y",
|
|
21
|
+
yy: "%dy"
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
const props = defineProps(['timeline', 'theme']);
|
|
26
|
+
</script>
|
|
27
|
+
|
|
28
|
+
<template>
|
|
29
|
+
<section
|
|
30
|
+
class="relative text-sm mb-6 rounded-md p-3 bg-white dark:bg-dasi_dark_bg3 transition-colors"
|
|
31
|
+
>
|
|
32
|
+
<div class="absolute left-7 top-0 w-px h-full bg-gray-300 dark:bg-dasi_dark_bg5"></div>
|
|
33
|
+
<div class="space-y-4">
|
|
34
|
+
<div v-for="(item, i) in props.timeline" :key="i">
|
|
35
|
+
<!-- CRUD/restore timeline item -->
|
|
36
|
+
<div
|
|
37
|
+
class="relative flex items-center"
|
|
38
|
+
v-if="['create', 'edit', 'delete_soft', 'restore'].includes(item.activityCode)"
|
|
39
|
+
>
|
|
40
|
+
<div
|
|
41
|
+
class="flex-none w-11 h-11 -ml-1.5 rounded-full bg-green-300 text-green-700 border-4 border-slate-50 overflow-hidden flex items-center justify-center font-semibold text-[17px] leading-none
|
|
42
|
+
dark:bg-green-900 dark:text-green-200 dark:border-dasi_dark_bg3"
|
|
43
|
+
:class="{'!border-slate-100 dark:!border-dasi_dark_bg3': props.theme === 'theme2'}"
|
|
44
|
+
>
|
|
45
|
+
{{ item.userName ? item.userName.substring(0,1).toUpperCase() : '' }}
|
|
46
|
+
</div>
|
|
47
|
+
<div class="ml-2 pt-1" v-if="props.theme === 'theme2'">
|
|
48
|
+
<h4 class="font-medium text-[15px]">
|
|
49
|
+
{{ item.pageName }}
|
|
50
|
+
<span class="text-gray-400 dark:text-gray-500 text-[13px] ml-1 mr-2">•</span>
|
|
51
|
+
<span
|
|
52
|
+
class="text-gray-400 dark:text-gray-500 text-[13px] text-right whitespace-nowrap pl-3 mb-auto"
|
|
53
|
+
:title="moment(item.createdAt).format('D MMM YYYY HH:mm')"
|
|
54
|
+
>
|
|
55
|
+
{{ moment(item.createdAt).fromNow() }}
|
|
56
|
+
</span>
|
|
57
|
+
</h4>
|
|
58
|
+
<p class="text-gray-400 dark:text-gray-400 text-[14px]">
|
|
59
|
+
{{ item.userName }}
|
|
60
|
+
<b class="font-medium text-dasi_text_color dark:text-dasi_text_color">{{ item.activityName }}</b> pada
|
|
61
|
+
{{ item.pageName }}
|
|
62
|
+
</p>
|
|
63
|
+
</div>
|
|
64
|
+
<div class="ml-2" v-else>
|
|
65
|
+
<span class="font-[500]">{{ item.userName }}</span>
|
|
66
|
+
<span class="text-gray-400 dark:text-gray-400">{{ item.activityName }}</span>
|
|
67
|
+
</div>
|
|
68
|
+
<div
|
|
69
|
+
class="ml-auto text-gray-400 dark:text-gray-500 text-[13px] text-right whitespace-nowrap pl-3 mb-auto"
|
|
70
|
+
:class="{'!hidden': props.theme === 'theme2'}"
|
|
71
|
+
:title="moment(item.createdAt).format('D MMM YYYY HH:mm')"
|
|
72
|
+
>
|
|
73
|
+
{{ moment(item.createdAt).fromNow() }}
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
<!-- Approval timeline item -->
|
|
77
|
+
<div
|
|
78
|
+
class="relative flex items-start"
|
|
79
|
+
v-else-if="['approval_reject', 'approval_approve'].includes(item.activityCode)"
|
|
80
|
+
>
|
|
81
|
+
<div
|
|
82
|
+
class="flex-none w-11 h-11 -ml-1.5 rounded-full bg-green-300 text-green-700 border-4 border-slate-50 overflow-hidden
|
|
83
|
+
dark:bg-green-900 dark:text-green-200 dark:border-dasi_dark_bg3"
|
|
84
|
+
:class="{'!border-slate-100 dark:!border-dasi_dark_bg3': props.theme === 'theme2'}"
|
|
85
|
+
></div>
|
|
86
|
+
<div class="ml-2 bg-white dark:bg-dasi_dark_bg3 px-4 py-3 border dark:border-dasi_dark_bg5 rounded-sm mt-1 mr-5">
|
|
87
|
+
<div class="font-semibold">{{ item.userName }} Approve</div>
|
|
88
|
+
<div class="text-gray-500 dark:text-gray-400 mt-1">
|
|
89
|
+
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Deleniti, blanditiis?
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
<div
|
|
93
|
+
class="ml-auto text-gray-400 dark:text-gray-500 text-[13px] flex-none text-right whitespace-nowrap pl-3 mb-auto"
|
|
94
|
+
:class="{'!hidden': props.theme === 'theme2'}"
|
|
95
|
+
:title="moment(item.createdAt).format('D MMM YYYY HH:mm')"
|
|
96
|
+
>
|
|
97
|
+
{{ moment(item.createdAt).fromNow() }}
|
|
98
|
+
</div>
|
|
99
|
+
</div>
|
|
100
|
+
<!-- Default timeline item -->
|
|
101
|
+
<div
|
|
102
|
+
class="relative flex items-center"
|
|
103
|
+
v-else
|
|
104
|
+
:class="{'!items-start': props.theme === 'theme2'}"
|
|
105
|
+
>
|
|
106
|
+
<div
|
|
107
|
+
class="flex-none w-8 h-8 rounded-full overflow-hidden flex items-center justify-center bg-slate-50 dark:bg-dasi_dark_bg5"
|
|
108
|
+
:class="{'!bg-slate-100 dark:!bg-dasi_dark_bg5': props.theme === 'theme2'}"
|
|
109
|
+
>
|
|
110
|
+
<div class="w-[13px] h-[13px] rounded-full border-2 border-gray-400 dark:border-gray-600"></div>
|
|
111
|
+
</div>
|
|
112
|
+
<div class="ml-3.5 pt-1" v-if="props.theme === 'theme2'">
|
|
113
|
+
<h4 class="font-medium text-[15px]">
|
|
114
|
+
{{ item.pageName }}
|
|
115
|
+
<span class="text-gray-400 dark:text-gray-500 text-[13px] ml-1 mr-2">•</span>
|
|
116
|
+
<span
|
|
117
|
+
class="text-gray-400 dark:text-gray-500 text-[13px] text-right whitespace-nowrap pl-3 mb-auto"
|
|
118
|
+
:title="moment(item.createdAt).format('D MMM YYYY HH:mm')"
|
|
119
|
+
>
|
|
120
|
+
{{ moment(item.createdAt).fromNow() }}
|
|
121
|
+
</span>
|
|
122
|
+
</h4>
|
|
123
|
+
<p class="text-gray-400 dark:text-gray-400 text-[14px]">
|
|
124
|
+
{{ item.userName }}
|
|
125
|
+
<b class="font-medium text-dasi_text_color dark:text-dasi_text_color">{{ item.activityName }}</b> pada
|
|
126
|
+
{{ item.pageName }}
|
|
127
|
+
</p>
|
|
128
|
+
</div>
|
|
129
|
+
<div class="ml-3.5" v-else>
|
|
130
|
+
<span class="font-[500]">{{ item.userName }}</span>
|
|
131
|
+
<span class="text-gray-400 dark:text-gray-400">{{ item.activityName }}</span>
|
|
132
|
+
</div>
|
|
133
|
+
<div
|
|
134
|
+
class="ml-auto text-gray-400 dark:text-gray-500 text-[13px] text-right whitespace-nowrap pl-3 mb-auto"
|
|
135
|
+
:class="{'!hidden': props.theme === 'theme2'}"
|
|
136
|
+
:title="moment(item.createdAt).format('D MMM YYYY HH:mm')"
|
|
137
|
+
>
|
|
138
|
+
{{ moment(item.createdAt).fromNow() }}
|
|
139
|
+
</div>
|
|
140
|
+
</div>
|
|
141
|
+
</div>
|
|
142
|
+
</div>
|
|
143
|
+
</section>
|
|
144
|
+
</template>
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { getMenuItemByUrl, isValidValue } from '@/lib/utils';
|
|
3
|
+
import { FileCheck2, LucideCheckCheck, LucideCircleX, LucideCornerRightUp, LucideSend, LucideSettings, LucideX, LucideXCircle } from 'lucide-vue-next';
|
|
4
|
+
import moment from 'moment';
|
|
5
|
+
import { RouterLink } from 'vue-router';
|
|
6
|
+
import { Skeleton } from '../ui/skeleton';
|
|
7
|
+
import BtnPrimary from '../button/BtnPrimary.vue';
|
|
8
|
+
import { onMounted, ref } from 'vue';
|
|
9
|
+
|
|
10
|
+
const props = defineProps(['data', 'saving', 'loading', 'approvalStrategy', 'approvals', 'myApproval', 'requester']);
|
|
11
|
+
const emits = defineEmits(['approve', 'reject', 'submit']);
|
|
12
|
+
const menu = ref<any>();
|
|
13
|
+
|
|
14
|
+
onMounted(() => {
|
|
15
|
+
menu.value = getMenuItemByUrl('/approval/approval-strategy');
|
|
16
|
+
})
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<template>
|
|
20
|
+
<div class="px-4 pt-4 pb-6 space-y-2.5" v-if="props.loading">
|
|
21
|
+
<Skeleton class="w-full h-4 rounded-full"/>
|
|
22
|
+
<Skeleton class="w-[80%] h-4 rounded-full"/>
|
|
23
|
+
<Skeleton class="w-[40%] h-4 rounded-full"/>
|
|
24
|
+
</div>
|
|
25
|
+
<template v-else>
|
|
26
|
+
<div class="leading-[1.325] px-4 pt-3 pb-6 text-gray-500"
|
|
27
|
+
v-if="!approvalStrategy && !isValidValue(approvals)">
|
|
28
|
+
<FileCheck2 :size="26" :stroke-width="1.8" class="mb-3"/>
|
|
29
|
+
<h4 class="font-medium mb-0.5">Pengaturan approval belum ditetapkan.</h4>
|
|
30
|
+
<div class="text-sm mb-3">
|
|
31
|
+
Mohon untuk tetapkan pengaturan approval
|
|
32
|
+
pada halaman Approval Strategy.
|
|
33
|
+
</div>
|
|
34
|
+
<RouterLink class="border pl-2 pr-3 gap-1 py-1.5 flex items-center w-fit rounded-md text-[13px] hover:bg-blue-100 hover:text-blue-500 hover:border-blue-300 transition"
|
|
35
|
+
:to="menu.url" target="_blank" rel="noopener"
|
|
36
|
+
v-if="menu">
|
|
37
|
+
<LucideSettings :size="18"/>
|
|
38
|
+
Tetapkan Pengaturan
|
|
39
|
+
</RouterLink>
|
|
40
|
+
</div>
|
|
41
|
+
<section class="space-y-2" v-else>
|
|
42
|
+
|
|
43
|
+
<!-- My approval -->
|
|
44
|
+
<section
|
|
45
|
+
v-if="myApproval && myApproval.approvalStatus !== 'PENDING'
|
|
46
|
+
&& !(myApproval.approvalStatus === 'WAITING_APPROVAL' && data.status === 'REJECTED')"
|
|
47
|
+
class="px-4 pt-3 pb-1"
|
|
48
|
+
:class="{'!bg-green-50 border-green-400 dark:!bg-green-950': myApproval.approvalStatus === 'APPROVED',
|
|
49
|
+
'!bg-red-50 border-red-300': myApproval.approvalStatus === 'REJECTED',
|
|
50
|
+
'!bg-blue-50 border-blue-300': myApproval.approvalStatus === 'PASSED'}">
|
|
51
|
+
<h4 class="font-semibold mb-[2px]">Approval</h4>
|
|
52
|
+
<p class="text-[13px] leading-snug mb-4">
|
|
53
|
+
<template v-if="['APPROVED', 'REJECTED'].includes(myApproval.approvalStatus)">
|
|
54
|
+
<span class="opacity-75">Anda telah </span>
|
|
55
|
+
<span class="font-medium text-green-500" v-if="myApproval.approvalStatus === 'APPROVED'">Menyetujui</span>
|
|
56
|
+
<span class="font-medium text-red-500" v-else-if="myApproval.approvalStatus === 'REJECTED'">Menolak</span>
|
|
57
|
+
<span class="opacity-75"> data ini pada<br />
|
|
58
|
+
<template v-if="myApproval.approvalDate">
|
|
59
|
+
{{ moment(myApproval.approvalDate).utc().format('D MMM YYYY HH:mm') }}
|
|
60
|
+
</template>
|
|
61
|
+
</span>
|
|
62
|
+
</template>
|
|
63
|
+
<span class="opacity-75" v-else-if="myApproval.approvalStatus === 'WAITING_APPROVAL'">
|
|
64
|
+
Data ini membutuhkan approval Anda, silahkan setujui atau tolak dengan klik tombol di bawah.
|
|
65
|
+
</span>
|
|
66
|
+
<span class="opacity-75" v-else-if="myApproval.approvalStatus === 'PASSED'">
|
|
67
|
+
Request approval Anda untuk aktifitas ini telah terlewati.
|
|
68
|
+
</span>
|
|
69
|
+
<template v-else>{{ myApproval.approvalStatus }}</template>
|
|
70
|
+
</p>
|
|
71
|
+
<div class="mb-2" v-if="myApproval.approvalStatus === 'APPROVED'">
|
|
72
|
+
<div class="text-green-500 font-medium -mt-1 flex items-center">
|
|
73
|
+
<LucideCheckCheck class="mr-3"/>
|
|
74
|
+
Approved
|
|
75
|
+
</div>
|
|
76
|
+
<div class="text-[12px] mt-1 opacity-75" v-if="myApproval.approvalDate">
|
|
77
|
+
Approved {{ moment(myApproval.approvalDate).utc().subtract(7, 'hour').calendar() }}
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
<div class="mb-2" v-else-if="myApproval.approvalStatus === 'REJECTED'">
|
|
81
|
+
<div class="text-red-500 font-medium -mt-1 flex items-center">
|
|
82
|
+
<LucideXCircle class="mr-2" :stroke-width="1.6"/>
|
|
83
|
+
Rejected
|
|
84
|
+
</div>
|
|
85
|
+
<div class="text-[12px] mt-1 opacity-75" v-if="myApproval.approvalDate">
|
|
86
|
+
Rejected {{ moment(myApproval.approvalDate).utc().subtract(7, 'hour').calendar() }}
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
<div class="mb-2" v-else-if="myApproval.approvalStatus === 'PASSED'">
|
|
90
|
+
<div class="text-blue-500 font-medium -mt-1 flex items-center">
|
|
91
|
+
<LucideCornerRightUp class="mr-3"/>
|
|
92
|
+
Passed
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
<template v-else-if="myApproval.approvalStatus === 'WAITING_APPROVAL'">
|
|
96
|
+
<div v-if="saving" class="h-9 mb-2 rounded-md relative flex items-center pl-9 text-gray-400 text-sm italic">
|
|
97
|
+
<svg class="absolute left-0 top-0 bottom-0 m-auto size-6 text-black animate-spin" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
|
98
|
+
<circle class="opacity-15" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="2"/>
|
|
99
|
+
<path class="opacity-15" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"/>
|
|
100
|
+
</svg>
|
|
101
|
+
Saving approval...
|
|
102
|
+
</div>
|
|
103
|
+
<div class="grid grid-cols-2 gap-3.5" v-else>
|
|
104
|
+
<button class="w-full text-left flex items-center border-red-500 border px-3 h-[34px] rounded-md text-red-500 transition hover:bg-red-100 text-sm"
|
|
105
|
+
@click="emits('reject')">
|
|
106
|
+
<LucideCircleX class="mr-2" :size="20" :stroke-width="1.5"/> Tolak
|
|
107
|
+
</button>
|
|
108
|
+
<button class="w-full text-left flex items-center bg-green-500 px-3 h-[34px] rounded-md text-white mb-2 border border-green-500 hover:bg-green-600 hover:border-green-600 transition text-sm"
|
|
109
|
+
@click="emits('approve')">
|
|
110
|
+
<LucideCheckCheck class="mr-2" :size="20"/> Setujui
|
|
111
|
+
</button>
|
|
112
|
+
</div>
|
|
113
|
+
</template>
|
|
114
|
+
</section>
|
|
115
|
+
|
|
116
|
+
<!-- Requester -->
|
|
117
|
+
<section class="px-4 pt-3 pb-1" v-if="requester">
|
|
118
|
+
<h4 class="font-semibold mb-[2px]">Pengajuan Approval</h4>
|
|
119
|
+
<p class="text-[13px] leading-snug mb-3">
|
|
120
|
+
<span class="opacity-75">
|
|
121
|
+
Request approval ini diajukan oleh
|
|
122
|
+
</span>
|
|
123
|
+
</p>
|
|
124
|
+
<div class="flex items-start text-sm">
|
|
125
|
+
<div class="flex-none size-6 bg-green-200 text-green-700 font-medium text-xs rounded-full mr-2.5 flex items-center justify-center">
|
|
126
|
+
{{ requester.name.substring(0, 1).toUpperCase() }}
|
|
127
|
+
</div>
|
|
128
|
+
<div>
|
|
129
|
+
<h4 class="font-medium">{{ requester.name }}</h4>
|
|
130
|
+
<p class="text-gray-500 text-xs leading-[1.175]">
|
|
131
|
+
<span class="font-medium">{{ requester.organization?.accessLevel?.name }}</span> •
|
|
132
|
+
{{ requester.organization?.name }}
|
|
133
|
+
</p>
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
</section>
|
|
137
|
+
|
|
138
|
+
<!-- Approver list -->
|
|
139
|
+
<section class="px-4 pt-3 pb-1">
|
|
140
|
+
<h4 class="font-semibold mb-[2px]">
|
|
141
|
+
<template v-if="['WAITING_APPROVAL', 'APPROVED_PARTIALY'].includes(data.status)">
|
|
142
|
+
Waiting Approval
|
|
143
|
+
</template>
|
|
144
|
+
<template v-else>Approval</template>
|
|
145
|
+
</h4>
|
|
146
|
+
<p class="text-[13px] leading-snug opacity-75 mb-2">Aktifitas ini membutuhkan approval dari</p>
|
|
147
|
+
|
|
148
|
+
<template v-if="isValidValue(approvals)">
|
|
149
|
+
<div class="mb-5" v-for="(approvalLevel, i1) in approvals" :key="i1">
|
|
150
|
+
<div class="uppercase font-medium text-xs opacity-65 mb-1.5">
|
|
151
|
+
Approval Tingkat {{ i1+1 }}
|
|
152
|
+
</div>
|
|
153
|
+
<div class="flex pb-1 mb-2 items-start text-sm border-b border-dashed"
|
|
154
|
+
v-for="(item, i2) in approvalLevel">
|
|
155
|
+
<div class="mr-auto flex"
|
|
156
|
+
v-if="(myApproval?.approvalLevelIdx ?? 0) >= i1 && (myApproval?.approvalCodeIdx ?? 0) >= i2 && item.approvalCode?.account">
|
|
157
|
+
<div class="flex-none size-6 bg-green-200 text-green-700 font-medium text-xs rounded-full mr-2.5 flex items-center justify-center">
|
|
158
|
+
{{ (item.approvalCode?.account?.name ?? '?').substring(0,1) }}
|
|
159
|
+
</div>
|
|
160
|
+
<div class="w-full leading-[1.2]">
|
|
161
|
+
<h4 class="font-semibold pt-0.5 text-sm">{{ item.approvalCode?.account?.name ?? '-' }}</h4>
|
|
162
|
+
<p class="text-gray-500 text-xs leading-[1.175]">
|
|
163
|
+
<span class="font-medium">{{ item.approvalCode?.account?.organization?.accessLevel?.name }}</span> •
|
|
164
|
+
{{ item.approvalCode?.account?.organization?.name }}
|
|
165
|
+
</p>
|
|
166
|
+
</div>
|
|
167
|
+
</div>
|
|
168
|
+
<div class="mr-auto mb-auto" v-else>
|
|
169
|
+
<h4 class="font-semibold text-sm">{{ item.approvalCode?.name }}</h4>
|
|
170
|
+
</div>
|
|
171
|
+
<div class="ml-auto text-right leading-[1] flex-none">
|
|
172
|
+
<div class="font-semibold text-[11px] uppercase flex items-center border rounded-full px-2 leading-none pt-1 pb-[3px] w-fit ml-auto"
|
|
173
|
+
:class="{
|
|
174
|
+
'text-gray-500 bg-gray-50 border-gray-300': !item.approvalStatus,
|
|
175
|
+
'text-orange-400 bg-orange-50 border-orange-200': item.approvalStatus === 'WAITING_APPROVAL',
|
|
176
|
+
'text-red-500 bg-red-50 border-red-300': item.approvalStatus === 'REJECTED',
|
|
177
|
+
'text-green-500 bg-green-50 border-green-300': item.approvalStatus === 'APPROVED',
|
|
178
|
+
'text-blue-500 bg-blue-50 border-blue-300': ['PASSED'].includes(item.approvalStatus),
|
|
179
|
+
'text-yellow-400 bg-yellow-50 border-yellow-200': ['PENDING'].includes(item.approvalStatus),
|
|
180
|
+
}">
|
|
181
|
+
<template v-if="!item.approvalStatus">
|
|
182
|
+
Not Submited
|
|
183
|
+
</template>
|
|
184
|
+
<template v-else-if="['pending'].includes(item.approvalStatus)">
|
|
185
|
+
Pending
|
|
186
|
+
</template>
|
|
187
|
+
<template v-else-if="['WAITING_APPROVAL'].includes(item.approvalStatus)">
|
|
188
|
+
Requested
|
|
189
|
+
</template>
|
|
190
|
+
<template v-else-if="item.approvalStatus === 'APPROVED'">
|
|
191
|
+
<LucideCheckCheck :size="15" class="mr-1 -my-[2px]"/>
|
|
192
|
+
Approved
|
|
193
|
+
</template>
|
|
194
|
+
<template v-else-if="item.approvalStatus === 'PASSED'">
|
|
195
|
+
Passed
|
|
196
|
+
</template>
|
|
197
|
+
<template v-else-if="item.approvalStatus === 'REJECTED'">
|
|
198
|
+
Rejected
|
|
199
|
+
</template>
|
|
200
|
+
<template v-else>{{ item.approvalStatus }}</template>
|
|
201
|
+
</div>
|
|
202
|
+
<div class="opacity-65 text-[11px] mt-1"
|
|
203
|
+
v-if="item.approvalDate && item.approvalStatus !== 'PASSED'">
|
|
204
|
+
{{ moment(item.approvalDate).utc().format('DD/MM/YYYY HH:mm') }}
|
|
205
|
+
</div>
|
|
206
|
+
</div>
|
|
207
|
+
</div>
|
|
208
|
+
</div>
|
|
209
|
+
</template>
|
|
210
|
+
|
|
211
|
+
<template v-else-if="approvalStrategy">
|
|
212
|
+
<div class="mb-5" v-for="(approvalLevel, i1) in approvalStrategy.approvalLevels" :key="i1">
|
|
213
|
+
<div class="uppercase font-medium text-xs opacity-65 mb-1.5">
|
|
214
|
+
Approval Tingkat {{ i1+1 }}
|
|
215
|
+
</div>
|
|
216
|
+
<div class="flex pb-1 mb-2 items-start text-sm border-b border-dashed"
|
|
217
|
+
v-for="(item, i2) in approvalLevel.approvalCodes">
|
|
218
|
+
<div class="mr-auto flex"
|
|
219
|
+
v-if="(myApproval?.approvalLevelIdx ?? 0) >= i1 && (myApproval?.approvalCodeIdx ?? 0) >= i2 && item.approvalCode?.account">
|
|
220
|
+
<div class="flex-none size-6 bg-green-200 text-green-700 font-medium text-xs rounded-full mr-2.5 flex items-center justify-center">
|
|
221
|
+
{{ (item.approvalCode?.account?.name ?? '?').substring(0,1) }}
|
|
222
|
+
</div>
|
|
223
|
+
<div class="w-full leading-[1.2]">
|
|
224
|
+
<h4 class="font-semibold pt-0.5 text-sm">{{ item.approvalCode?.account?.name ?? '-' }}</h4>
|
|
225
|
+
<p class="text-gray-500 text-xs leading-[1.175]">
|
|
226
|
+
<span class="font-medium">{{ item.approvalCode?.account?.organization?.accessLevel?.name }}</span> •
|
|
227
|
+
{{ item.approvalCode?.account?.organization?.name }}
|
|
228
|
+
</p>
|
|
229
|
+
</div>
|
|
230
|
+
</div>
|
|
231
|
+
<div class="mr-auto mb-auto" v-else>
|
|
232
|
+
<h4 class="font-semibold text-sm">{{ item.approvalCode?.name }}</h4>
|
|
233
|
+
</div>
|
|
234
|
+
<div class="ml-auto text-right leading-[1] flex-none">
|
|
235
|
+
<div class="font-semibold text-[11px] uppercase flex items-center border rounded-full px-2 leading-none pt-1 pb-[3px] w-fit ml-auto"
|
|
236
|
+
:class="{
|
|
237
|
+
'text-gray-500 bg-gray-50 border-gray-300': !item.approvalStatus,
|
|
238
|
+
'text-orange-400 bg-orange-50 border-orange-200': item.approvalStatus === 'WAITING_APPROVAL',
|
|
239
|
+
'text-red-500 bg-red-50 border-red-300': item.approvalStatus === 'REJECTED',
|
|
240
|
+
'text-green-500 bg-green-50 border-green-300': item.approvalStatus === 'APPROVED',
|
|
241
|
+
'text-blue-500 bg-blue-50 border-blue-300': ['PASSED'].includes(item.approvalStatus),
|
|
242
|
+
'text-yellow-400 bg-yellow-50 border-yellow-200': ['PENDING'].includes(item.approvalStatus),
|
|
243
|
+
}">
|
|
244
|
+
<template v-if="!item.approvalStatus">
|
|
245
|
+
Not Submited
|
|
246
|
+
</template>
|
|
247
|
+
<template v-else-if="['pending'].includes(item.approvalStatus)">
|
|
248
|
+
Pending
|
|
249
|
+
</template>
|
|
250
|
+
<template v-else-if="['WAITING_APPROVAL'].includes(item.approvalStatus)">
|
|
251
|
+
Requested
|
|
252
|
+
</template>
|
|
253
|
+
<template v-else-if="item.approvalStatus === 'APPROVED'">
|
|
254
|
+
<LucideCheckCheck :size="15" class="mr-1 -my-[2px]"/>
|
|
255
|
+
Approved
|
|
256
|
+
</template>
|
|
257
|
+
<template v-else-if="item.approvalStatus === 'PASSED'">
|
|
258
|
+
Passed
|
|
259
|
+
</template>
|
|
260
|
+
<template v-else-if="item.approvalStatus === 'REJECTED'">
|
|
261
|
+
Rejected
|
|
262
|
+
</template>
|
|
263
|
+
<template v-else>{{ item.approvalStatus }}</template>
|
|
264
|
+
</div>
|
|
265
|
+
<div class="opacity-65 text-[11px] mt-1" v-if="item.approvalDate">
|
|
266
|
+
{{ moment(item.approvalDate).utc().format('DD/MM/YYYY HH:mm') }}
|
|
267
|
+
</div>
|
|
268
|
+
</div>
|
|
269
|
+
</div>
|
|
270
|
+
</div>
|
|
271
|
+
</template>
|
|
272
|
+
|
|
273
|
+
<div v-if="data.status === 'APPROVAL_REQUIRED'">
|
|
274
|
+
<p class="text-[13px] leading-snug opacity-75 mb-2">
|
|
275
|
+
Mulai proses approval dengan klik tombol Submit Approval.
|
|
276
|
+
Mohon pastikan data sudah sesuai untuk mulai proses Approval.
|
|
277
|
+
</p>
|
|
278
|
+
<BtnPrimary class="w-full text-left justify-start !font-normal flex items-center px-3 !h-[36px] !text-sm"
|
|
279
|
+
@click="emits('submit')"
|
|
280
|
+
:loading="saving">
|
|
281
|
+
<LucideSend class="mr-2" :size="20" :stroke-width="1.5"/>
|
|
282
|
+
Submit Approval
|
|
283
|
+
</BtnPrimary>
|
|
284
|
+
</div>
|
|
285
|
+
</section>
|
|
286
|
+
</section>
|
|
287
|
+
</template>
|
|
288
|
+
</template>
|