@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,41 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { LucideBell } from "lucide-vue-next";
|
|
3
|
+
import BtnOutline from "@/components/button/BtnOutline.vue";
|
|
4
|
+
import moment from "moment";
|
|
5
|
+
|
|
6
|
+
moment.updateLocale("en", {
|
|
7
|
+
relativeTime: {
|
|
8
|
+
future: "in %s",
|
|
9
|
+
past: "%s ago",
|
|
10
|
+
s: "1s",
|
|
11
|
+
ss: "%ds",
|
|
12
|
+
m: "1m",
|
|
13
|
+
mm: "%dm",
|
|
14
|
+
h: "1h",
|
|
15
|
+
hh: "%dh",
|
|
16
|
+
d: "1d",
|
|
17
|
+
dd: "%dd",
|
|
18
|
+
w: "1w",
|
|
19
|
+
ww: "%dw",
|
|
20
|
+
M: "1Mo",
|
|
21
|
+
MM: "%dMo",
|
|
22
|
+
y: "1y",
|
|
23
|
+
yy: "%dy"
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const props = defineProps(["item"]);
|
|
28
|
+
</script>
|
|
29
|
+
|
|
30
|
+
<template>
|
|
31
|
+
<main class="relative mb-1 cursor-pointer rounded-sm py-3 pl-[60px] pr-4 text-gray-700 transition hover:bg-hover_main" :class="{ 'bg-slate-50': props.item.isRead }">
|
|
32
|
+
<div class="absolute left-2 top-3 flex h-9 w-9 items-center justify-center rounded-full bg-slate-100">
|
|
33
|
+
<LucideBell :size="19" class="text-primary_main"></LucideBell>
|
|
34
|
+
<div class="absolute right-0 top-0 z-2 size-3 rounded-full border-2 border-white bg-primary_main" v-if="props.item.isRead"></div>
|
|
35
|
+
</div>
|
|
36
|
+
<h4 class="text-sm font-semibold leading-tight text-gray-600">{{ props.item.name }}</h4>
|
|
37
|
+
<div class="pb-[2px] pt-[3px] text-[12px] text-gray-500 opacity-70">{{ moment(props.item.createdAt).utc().subtract(7, "hour").calendar() }}</div>
|
|
38
|
+
<p class="whitespace-pre-wrap text-xs leading-snug text-gray-500">{{ props.item.message }}</p>
|
|
39
|
+
<!-- <BtnOutline class="text-[13px] py-1 px-3 rounded-full border-[1px] mt-2">Notification Action</BtnOutline> -->
|
|
40
|
+
</main>
|
|
41
|
+
</template>
|
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { onMounted, onUnmounted, ref, watch, computed } from "vue";
|
|
3
|
+
import { ChevronDown, Bell, LogOut, Settings, LucideBookOpenText, LucideX, LucidePlusCircle, LucidePin, LucideRotateCw, Sun, Moon } from "lucide-vue-next";
|
|
4
|
+
import Avatar from "@/components/ui/avatar/Avatar.vue";
|
|
5
|
+
import AvatarFallback from "@/components/ui/avatar/AvatarFallback.vue";
|
|
6
|
+
import DropdownMenu from "@/components/ui/dropdown-menu/DropdownMenu.vue";
|
|
7
|
+
import DropdownMenuTrigger from "@/components/ui/dropdown-menu/DropdownMenuTrigger.vue";
|
|
8
|
+
import DropdownMenuContent from "@/components/ui/dropdown-menu/DropdownMenuContent.vue";
|
|
9
|
+
import DropdownMenuSeparator from "@/components/ui/dropdown-menu/DropdownMenuSeparator.vue";
|
|
10
|
+
import DropdownMenuItem from "@/components/ui/dropdown-menu/DropdownMenuItem.vue";
|
|
11
|
+
import DropdownMenuShortcut from "@/components/ui/dropdown-menu/DropdownMenuShortcut.vue";
|
|
12
|
+
import AlertDialog from "@/components/ui/alert-dialog/AlertDialog.vue";
|
|
13
|
+
import AlertDialogContent from "@/components/ui/alert-dialog/AlertDialogContent.vue";
|
|
14
|
+
import AlertDialogHeader from "@/components/ui/alert-dialog/AlertDialogHeader.vue";
|
|
15
|
+
import AlertDialogTitle from "@/components/ui/alert-dialog/AlertDialogTitle.vue";
|
|
16
|
+
import AlertDialogDescription from "@/components/ui/alert-dialog/AlertDialogDescription.vue";
|
|
17
|
+
import AlertDialogFooter from "@/components/ui/alert-dialog/AlertDialogFooter.vue";
|
|
18
|
+
import AlertDialogCancel from "@/components/ui/alert-dialog/AlertDialogCancel.vue";
|
|
19
|
+
import AlertDialogAction from "@/components/ui/alert-dialog/AlertDialogAction.vue";
|
|
20
|
+
import LoadingDialog from "@/components/loadings/LoadingDialog.vue";
|
|
21
|
+
import { useMagicKeys } from "@vueuse/core";
|
|
22
|
+
import Notif from "@/components/notif/Notif.vue";
|
|
23
|
+
import { useRoute, useRouter } from "vue-router";
|
|
24
|
+
import menu, { type Submenu } from "@/menu";
|
|
25
|
+
import ChangePwd from "@/components/helper/ChangePwd.vue";
|
|
26
|
+
import api from "@/api/api";
|
|
27
|
+
import { useTab } from "@/stores/tabs";
|
|
28
|
+
import { useAppConfig } from "@/composables/useAppConfig";
|
|
29
|
+
import {
|
|
30
|
+
ContextMenu,
|
|
31
|
+
ContextMenuCheckboxItem,
|
|
32
|
+
ContextMenuContent,
|
|
33
|
+
ContextMenuItem,
|
|
34
|
+
ContextMenuLabel,
|
|
35
|
+
ContextMenuRadioGroup,
|
|
36
|
+
ContextMenuRadioItem,
|
|
37
|
+
ContextMenuSeparator,
|
|
38
|
+
ContextMenuShortcut,
|
|
39
|
+
ContextMenuSub,
|
|
40
|
+
ContextMenuSubContent,
|
|
41
|
+
ContextMenuSubTrigger,
|
|
42
|
+
ContextMenuTrigger
|
|
43
|
+
} from "@/components/ui/context-menu";
|
|
44
|
+
import { useDarkMode } from "@/composables/useDarkMode";
|
|
45
|
+
|
|
46
|
+
const keys = useMagicKeys();
|
|
47
|
+
const route = useRoute();
|
|
48
|
+
const router = useRouter();
|
|
49
|
+
const tabStore = useTab();
|
|
50
|
+
|
|
51
|
+
const { companyName, logo, primaryColor, apiEndpoints, features, enabledFeatures, userKey, isConfigLoaded } = useAppConfig();
|
|
52
|
+
|
|
53
|
+
const breadcrumbs = ref<{ name: string; uri?: string }[]>([]);
|
|
54
|
+
const logoutConfirmOpen = ref(false);
|
|
55
|
+
const showNotif = ref(false);
|
|
56
|
+
const notifUnread = ref(0);
|
|
57
|
+
const hasWebSocketNotif = ref(false);
|
|
58
|
+
const authUser = ref({ name: "", email: "..." });
|
|
59
|
+
const headerEl: any = ref(null);
|
|
60
|
+
const ddUserOpen = ref(false);
|
|
61
|
+
const tabActive = ref("");
|
|
62
|
+
const { isDark, toggleDarkMode } = useDarkMode();
|
|
63
|
+
|
|
64
|
+
const emits = defineEmits(["openSearch"]);
|
|
65
|
+
|
|
66
|
+
const floatingNotifs = ref();
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* El
|
|
70
|
+
*
|
|
71
|
+
*/
|
|
72
|
+
const loadingDialogEl: any = ref(null);
|
|
73
|
+
|
|
74
|
+
function updateBreadcrumbs() {
|
|
75
|
+
breadcrumbs.value = [];
|
|
76
|
+
for (const item of menu) {
|
|
77
|
+
if (item.submenu) {
|
|
78
|
+
for (const submenu of item.submenu) {
|
|
79
|
+
if (submenu.url === route.fullPath) {
|
|
80
|
+
tabStore.addTab(submenu);
|
|
81
|
+
breadcrumbs.value = [{ name: item.name }, { name: submenu.name, uri: submenu.url }];
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function doLogout() {
|
|
90
|
+
if (loadingDialogEl.value) loadingDialogEl.value.open();
|
|
91
|
+
tabStore.clearTabs();
|
|
92
|
+
api
|
|
93
|
+
.post(apiEndpoints.value.auth.logout)
|
|
94
|
+
.then(() => {
|
|
95
|
+
console.log("Logout success!");
|
|
96
|
+
})
|
|
97
|
+
.finally(() => {
|
|
98
|
+
localStorage.clear();
|
|
99
|
+
window.location.href = "/login";
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function countNotifUnread() {
|
|
104
|
+
if (!enabledFeatures.value.realTimeNotifications) return;
|
|
105
|
+
|
|
106
|
+
api
|
|
107
|
+
.get(apiEndpoints.value.notifications.unreadCount)
|
|
108
|
+
.then(r => {
|
|
109
|
+
notifUnread.value = r.data.total || 0;
|
|
110
|
+
})
|
|
111
|
+
.finally(() => {
|
|
112
|
+
setTimeout(() => {
|
|
113
|
+
countNotifUnread();
|
|
114
|
+
}, 3500);
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function fnHover(item: any) {
|
|
119
|
+
for (const notif of floatingNotifs.value) {
|
|
120
|
+
notif.visible = false;
|
|
121
|
+
}
|
|
122
|
+
item.visible = true;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function fnBlur() {
|
|
126
|
+
for (const notif of floatingNotifs.value) {
|
|
127
|
+
notif.visible = true;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function closeDrodown() {
|
|
132
|
+
ddUserOpen.value = false;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function closeTab(tab: Submenu) {
|
|
136
|
+
tabStore.removeTab(tab);
|
|
137
|
+
if (tab.url === tabActive.value) {
|
|
138
|
+
const newTab = tabStore.tabs[tabStore.tabs.length - 1];
|
|
139
|
+
const newUri = newTab ? newTab.url || "/" : "/";
|
|
140
|
+
router.push(newUri);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function closeTabOthers(tab: Submenu) {
|
|
145
|
+
const tabToClose: Submenu[] = [];
|
|
146
|
+
for (const item of tabStore.tabs) {
|
|
147
|
+
if (item.url !== tab.url) tabToClose.push(item);
|
|
148
|
+
}
|
|
149
|
+
for (const item of tabToClose) {
|
|
150
|
+
tabStore.removeTab(item);
|
|
151
|
+
}
|
|
152
|
+
if (tabActive.value !== tab.url) router.push(tab.url || "/");
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function closeTabRight(tab: Submenu) {
|
|
156
|
+
const tabToClose: Submenu[] = [];
|
|
157
|
+
let tabFound;
|
|
158
|
+
for (const item of tabStore.tabs) {
|
|
159
|
+
if (item.url === tab.url) {
|
|
160
|
+
tabFound = true;
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
if (tabFound) tabToClose.push(item);
|
|
164
|
+
}
|
|
165
|
+
for (const item of tabToClose) {
|
|
166
|
+
tabStore.removeTab(item);
|
|
167
|
+
}
|
|
168
|
+
if (tabActive.value !== tab.url) router.push(tab.url || "/");
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function newTab() {
|
|
172
|
+
setTimeout(() => {
|
|
173
|
+
emits("openSearch");
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function handleNotificationClick() {
|
|
178
|
+
// Clear unread count when notification bell is clicked
|
|
179
|
+
notifUnread.value = 0;
|
|
180
|
+
hasWebSocketNotif.value = false;
|
|
181
|
+
// showNotif.value = true;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
watch(keys["Shift+Cmd+X"], v => {
|
|
185
|
+
if (v) logoutConfirmOpen.value = !logoutConfirmOpen.value;
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
watch(route, () => {
|
|
189
|
+
updateBreadcrumbs();
|
|
190
|
+
tabActive.value = route.path;
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
onMounted(() => {
|
|
194
|
+
const authUserName = localStorage.getItem(userKey.value);
|
|
195
|
+
authUser.value.name = authUserName ? String(authUserName) : "";
|
|
196
|
+
api.get(apiEndpoints.value.auth.info).then(r => {
|
|
197
|
+
authUser.value.email = r.data.data.email;
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
tabActive.value = route.path;
|
|
201
|
+
|
|
202
|
+
updateBreadcrumbs();
|
|
203
|
+
});
|
|
204
|
+
</script>
|
|
205
|
+
|
|
206
|
+
<template>
|
|
207
|
+
<header class="fixed left-20 right-0 top-0 z-7 flex h-10 items-center border-b bg-white px-4 dark:border-dark_border dark:bg-dark_bg 2xl:h-14 2xl:px-6" ref="headerEl">
|
|
208
|
+
<div class="mr-auto flex gap-2 text-xs text-gray-500 2xl:text-sm">
|
|
209
|
+
<RouterLink to="/">Home</RouterLink>
|
|
210
|
+
<template v-for="(item, i) in breadcrumbs" :key="i">
|
|
211
|
+
<span>/</span>
|
|
212
|
+
<RouterLink :to="item.uri" :key="i" v-if="item.uri">{{ item.name }}</RouterLink>
|
|
213
|
+
<span v-else>{{ item.name }}</span>
|
|
214
|
+
</template>
|
|
215
|
+
</div>
|
|
216
|
+
|
|
217
|
+
<div class="ml-auto flex items-center">
|
|
218
|
+
<DropdownMenu v-model:open="showNotif">
|
|
219
|
+
<DropdownMenuTrigger>
|
|
220
|
+
<div
|
|
221
|
+
class="relative ml-2 flex size-7 cursor-pointer items-center justify-center rounded-full text-gray-500 transition hover:bg-hover_main hover:text-primary_main 2xl:size-8"
|
|
222
|
+
@click="handleNotificationClick">
|
|
223
|
+
<Bell class="size-[18px] transition 2xl:size-[22px]" />
|
|
224
|
+
<div class="absolute right-1 top-1 z-2 h-3 w-3 rounded-full border-2 border-white bg-red-600" v-if="notifUnread > 0 || hasWebSocketNotif"></div>
|
|
225
|
+
<!-- <svg viewBox="0 0 100 100" preserveAspectRatio="xMidYMid" class="w-10 h-10 absolute -top-1 -left-1">
|
|
226
|
+
<circle cx="50" cy="50" fill="none" stroke="currentColor" stroke-width="5" r="35" stroke-dasharray="164.93361431346415 56.97787143782138">
|
|
227
|
+
<animateTransform attributeName="transform" type="rotate" repeatCount="indefinite" dur="1s" values="0 50 50;360 50 50" keyTimes="0;1"></animateTransform>
|
|
228
|
+
</circle>
|
|
229
|
+
</svg> -->
|
|
230
|
+
</div>
|
|
231
|
+
</DropdownMenuTrigger>
|
|
232
|
+
<DropdownMenuContent class="mr-6 w-[400px] border-none p-0">
|
|
233
|
+
<Notif @close-dropdown="showNotif = false" />
|
|
234
|
+
</DropdownMenuContent>
|
|
235
|
+
</DropdownMenu>
|
|
236
|
+
|
|
237
|
+
<button @click="toggleDarkMode" class="relative ml-2 flex h-8 w-8 cursor-pointer items-center justify-center rounded-full text-gray-500 transition hover:bg-hover_main hover:text-primary_main">
|
|
238
|
+
<Sun v-if="isDark" class="size-[18px] transition 2xl:size-[22px]" />
|
|
239
|
+
<Moon v-else class="size-[18px] transition 2xl:size-[22px]" />
|
|
240
|
+
</button>
|
|
241
|
+
<RouterLink to="/settings" class="relative ml-2 flex h-8 w-8 cursor-pointer items-center justify-center rounded-full text-gray-500 transition hover:bg-hover_main hover:text-primary_main">
|
|
242
|
+
<Settings class="size-[18px] transition 2xl:size-[22px]" />
|
|
243
|
+
</RouterLink>
|
|
244
|
+
<DropdownMenu>
|
|
245
|
+
<DropdownMenuTrigger>
|
|
246
|
+
<div class="group ml-3 flex size-7 cursor-pointer items-center justify-center rounded-md bg-gray-100 transition hover:bg-hover_main dark:bg-gray-800 2xl:size-8">
|
|
247
|
+
<svg width="100" height="100" viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg" class="size-[14px] fill-gray-400 transition group-hover:fill-primary_main 2xl:size-[16px]">
|
|
248
|
+
<path
|
|
249
|
+
d="M1.61539 3.23077C1.29589 3.23077 0.983574 3.13603 0.717926 2.95853C0.452277 2.78103 0.245229 2.52874 0.122965 2.23357C0.000699922 1.93839 -0.0312901 1.61359 0.0310399 1.30024C0.0933699 0.986886 0.24722 0.699052 0.473136 0.473136C0.699052 0.24722 0.986886 0.0933699 1.30024 0.0310399C1.61359 -0.0312901 1.93839 0.000699922 2.23357 0.122965C2.52874 0.245229 2.78103 0.452277 2.95853 0.717926C3.13603 0.983574 3.23077 1.29589 3.23077 1.61539C3.23031 2.04367 3.05997 2.45428 2.75713 2.75713C2.45428 3.05997 2.04367 3.23031 1.61539 3.23077ZM6 3.23077C5.68051 3.23077 5.36819 3.13603 5.10254 2.95853C4.83689 2.78103 4.62984 2.52874 4.50758 2.23357C4.38531 1.93839 4.35333 1.61359 4.41566 1.30024C4.47798 0.986886 4.63184 0.699052 4.85775 0.473136C5.08367 0.24722 5.3715 0.0933699 5.68485 0.0310399C5.99821 -0.0312901 6.32301 0.000699922 6.61818 0.122965C6.91335 0.245229 7.16564 0.452277 7.34314 0.717926C7.52064 0.983574 7.61539 1.29589 7.61539 1.61539C7.61493 2.04367 7.44459 2.45428 7.14174 2.75713C6.8389 3.05997 6.42829 3.23031 6 3.23077ZM10.3846 3.23077C10.0651 3.23077 9.7528 3.13603 9.48716 2.95853C9.22151 2.78103 9.01446 2.52874 8.8922 2.23357C8.76993 1.93839 8.73794 1.61359 8.80027 1.30024C8.8626 0.986886 9.01645 0.699052 9.24237 0.473136C9.46828 0.24722 9.75612 0.0933699 10.0695 0.0310399C10.3828 -0.0312901 10.7076 0.000699922 11.0028 0.122965C11.298 0.245229 11.5503 0.452277 11.7278 0.717926C11.9053 0.983574 12 1.29589 12 1.61539C11.9995 2.04367 11.8292 2.45428 11.5264 2.75713C11.2235 3.05997 10.8129 3.23031 10.3846 3.23077ZM1.61539 7.61539C1.29589 7.61539 0.983574 7.52064 0.717926 7.34314C0.452277 7.16564 0.245229 6.91335 0.122965 6.61818C0.000699922 6.32301 -0.0312901 5.99821 0.0310399 5.68485C0.0933699 5.3715 0.24722 5.08367 0.473136 4.85775C0.699052 4.63184 0.986886 4.47798 1.30024 4.41566C1.61359 4.35333 1.93839 4.38531 2.23357 4.50758C2.52874 4.62984 2.78103 4.83689 2.95853 5.10254C3.13603 5.36819 3.23077 5.68051 3.23077 6C3.23031 6.42829 3.05997 6.8389 2.75713 7.14174C2.45428 7.44459 2.04367 7.61493 1.61539 7.61539ZM6 7.61539C5.68051 7.61539 5.36819 7.52064 5.10254 7.34314C4.83689 7.16564 4.62984 6.91335 4.50758 6.61818C4.38531 6.32301 4.35333 5.99821 4.41566 5.68485C4.47798 5.3715 4.63184 5.08367 4.85775 4.85775C5.08367 4.63184 5.3715 4.47798 5.68485 4.41566C5.99821 4.35333 6.32301 4.38531 6.61818 4.50758C6.91335 4.62984 7.16564 4.83689 7.34314 5.10254C7.52064 5.36819 7.61539 5.68051 7.61539 6C7.61493 6.42829 7.44459 6.8389 7.14174 7.14174C6.8389 7.44459 6.42829 7.61493 6 7.61539ZM10.3846 7.61539C10.0651 7.61539 9.7528 7.52064 9.48716 7.34314C9.22151 7.16564 9.01446 6.91335 8.8922 6.61818C8.76993 6.32301 8.73794 5.99821 8.80027 5.68485C8.8626 5.3715 9.01645 5.08367 9.24237 4.85775C9.46828 4.63184 9.75612 4.47798 10.0695 4.41566C10.3828 4.35333 10.7076 4.38531 11.0028 4.50758C11.298 4.62984 11.5503 4.83689 11.7278 5.10254C11.9053 5.36819 12 5.68051 12 6C11.9995 6.42829 11.8292 6.8389 11.5264 7.14174C11.2235 7.44459 10.8129 7.61493 10.3846 7.61539ZM1.61539 12C1.29589 12 0.983574 11.9053 0.717926 11.7278C0.452277 11.5503 0.245229 11.298 0.122965 11.0028C0.000699922 10.7076 -0.0312901 10.3828 0.0310399 10.0695C0.0933699 9.75612 0.24722 9.46828 0.473136 9.24237C0.699052 9.01645 0.986886 8.8626 1.30024 8.80027C1.61359 8.73794 1.93839 8.76993 2.23357 8.8922C2.52874 9.01446 2.78103 9.22151 2.95853 9.48716C3.13603 9.7528 3.23077 10.0651 3.23077 10.3846C3.23031 10.8129 3.05997 11.2235 2.75713 11.5264C2.45428 11.8292 2.04367 11.9995 1.61539 12ZM6 12C5.68051 12 5.36819 11.9053 5.10254 11.7278C4.83689 11.5503 4.62984 11.298 4.50758 11.0028C4.38531 10.7076 4.35333 10.3828 4.41566 10.0695C4.47798 9.75612 4.63184 9.46828 4.85775 9.24237C5.08367 9.01645 5.3715 8.8626 5.68485 8.80027C5.99821 8.73794 6.32301 8.76993 6.61818 8.8922C6.91335 9.01446 7.16564 9.22151 7.34314 9.48716C7.52064 9.7528 7.61539 10.0651 7.61539 10.3846C7.61493 10.8129 7.44459 11.2235 7.14174 11.5264C6.8389 11.8292 6.42829 11.9995 6 12ZM10.3846 12C10.0651 12 9.7528 11.9053 9.48716 11.7278C9.22151 11.5503 9.01446 11.298 8.8922 11.0028C8.76993 10.7076 8.73794 10.3828 8.80027 10.0695C8.8626 9.75612 9.01645 9.46828 9.24237 9.24237C9.46828 9.01645 9.75612 8.8626 10.0695 8.80027C10.3828 8.73794 10.7076 8.76993 11.0028 8.8922C11.298 9.01446 11.5503 9.22151 11.7278 9.48716C11.9053 9.7528 12 10.0651 12 10.3846C11.9995 10.8129 11.8292 11.2235 11.5264 11.5264C11.2235 11.8292 10.8129 11.9995 10.3846 12Z" />
|
|
250
|
+
</svg>
|
|
251
|
+
</div>
|
|
252
|
+
</DropdownMenuTrigger>
|
|
253
|
+
</DropdownMenu>
|
|
254
|
+
<DropdownMenu v-model:open="ddUserOpen">
|
|
255
|
+
<DropdownMenuTrigger>
|
|
256
|
+
<div class="ml-4 flex cursor-pointer items-center">
|
|
257
|
+
<Avatar class="mr-3 size-7 bg-green-300 font-semibold text-green-700 2xl:size-8">
|
|
258
|
+
<AvatarFallback v-if="authUser.name">
|
|
259
|
+
{{ authUser.name.substring(0, 1).toUpperCase() }}
|
|
260
|
+
</AvatarFallback>
|
|
261
|
+
</Avatar>
|
|
262
|
+
<div class="2x:text-md mr-3 text-sm">
|
|
263
|
+
<template v-if="authUser.name">{{ authUser.name }}</template>
|
|
264
|
+
<i class="font-light text-gray-400" v-else>Unnamed user</i>
|
|
265
|
+
</div>
|
|
266
|
+
<div class="flex h-6 w-6 items-center justify-center rounded-full bg-gray-100 transition hover:bg-hover_main hover:text-primary_main dark:bg-gray-800">
|
|
267
|
+
<ChevronDown class="w-4"></ChevronDown>
|
|
268
|
+
</div>
|
|
269
|
+
</div>
|
|
270
|
+
</DropdownMenuTrigger>
|
|
271
|
+
<DropdownMenuContent class="mr-6 w-72">
|
|
272
|
+
<div class="flex items-center px-4 py-3">
|
|
273
|
+
<Avatar class="mr-3 size-11 bg-green-300 text-lg font-semibold text-green-700">
|
|
274
|
+
<AvatarFallback v-if="authUser.name">
|
|
275
|
+
{{ authUser.name.substring(0, 1).toUpperCase() }}
|
|
276
|
+
</AvatarFallback>
|
|
277
|
+
</Avatar>
|
|
278
|
+
<div>
|
|
279
|
+
<h4 class="mb-[2px] text-base font-medium leading-tight">
|
|
280
|
+
<template v-if="authUser.name">{{ authUser.name }}</template>
|
|
281
|
+
<i class="font-light text-gray-400" v-else>Unnamed user</i>
|
|
282
|
+
</h4>
|
|
283
|
+
<p class="text-sm leading-none text-gray-500">
|
|
284
|
+
{{ authUser.email }}
|
|
285
|
+
</p>
|
|
286
|
+
</div>
|
|
287
|
+
</div>
|
|
288
|
+
<DropdownMenuSeparator class="mb-2" />
|
|
289
|
+
<ChangePwd class="block w-full cursor-pointer rounded-md border-none bg-none px-5 py-2 text-left text-sm text-primary_main transition hover:bg-hover_main" v-on:finish="closeDrodown">
|
|
290
|
+
Change Password
|
|
291
|
+
</ChangePwd>
|
|
292
|
+
<RouterLink to="/docs" class="flex w-full cursor-pointer items-center rounded-md border-none bg-none px-5 py-2 text-left text-sm transition hover:bg-hover_main">
|
|
293
|
+
<LucideBookOpenText class="mr-2" :size="18" :stroke-width="1.4" />
|
|
294
|
+
Documentation
|
|
295
|
+
</RouterLink>
|
|
296
|
+
<DropdownMenuSeparator></DropdownMenuSeparator>
|
|
297
|
+
<DropdownMenuItem class="cursor-pointer rounded-md py-2 pl-5" v-on:click="logoutConfirmOpen = true">
|
|
298
|
+
<LogOut class="mr-2 h-4 w-4"></LogOut>
|
|
299
|
+
<span>Logout</span>
|
|
300
|
+
<DropdownMenuShortcut>⇧⌘X</DropdownMenuShortcut>
|
|
301
|
+
</DropdownMenuItem>
|
|
302
|
+
</DropdownMenuContent>
|
|
303
|
+
</DropdownMenu>
|
|
304
|
+
</div>
|
|
305
|
+
</header>
|
|
306
|
+
<div class="tab-cnt fixed left-20 right-0 top-10 z-10 flex h-8 overflow-auto border-b bg-white px-1 text-[15px] dark:border-dark_border dark:bg-dark_bg 2xl:top-14 2xl:h-10 2xl:px-3">
|
|
307
|
+
<ContextMenu v-for="(tab, i) in tabStore.tabs" :key="i">
|
|
308
|
+
<ContextMenuTrigger>
|
|
309
|
+
<RouterLink
|
|
310
|
+
:to="tab.url || '#'"
|
|
311
|
+
class="group relative flex h-8 cursor-pointer items-center rounded-t-lg py-2 pl-3 pr-1.5 text-gray-500 dark:text-gray-300 2xl:h-10"
|
|
312
|
+
:class="{ 'bg-slate-50 text-primary_main dark:bg-dark_bg2': tabActive === tab.url }">
|
|
313
|
+
<div class="overflow-hidden text-ellipsis whitespace-nowrap text-xs font-semibold 2xl:text-sm">
|
|
314
|
+
{{ tab.name }}
|
|
315
|
+
</div>
|
|
316
|
+
<button
|
|
317
|
+
class="ml-1.5 flex size-5 flex-none items-center justify-center rounded-full opacity-0 transition hover:bg-slate-200 group-hover:opacity-100"
|
|
318
|
+
:class="{ 'opacity-100': tabActive === tab.url }"
|
|
319
|
+
v-on:click.prevent="closeTab(tab)">
|
|
320
|
+
<LucideX class="text-gray-500" :size="15" />
|
|
321
|
+
</button>
|
|
322
|
+
<div class="absolute bottom-0 left-0 right-0 h-0.5 rounded-t-full transition group-hover:bg-gray-400" :class="{ '!bg-primary_main': tabActive === tab.url }"></div>
|
|
323
|
+
</RouterLink>
|
|
324
|
+
</ContextMenuTrigger>
|
|
325
|
+
<ContextMenuContent class="w-56">
|
|
326
|
+
<ContextMenuItem v-on:click.prevent="newTab">
|
|
327
|
+
<LucidePlusCircle class="mr-[9px]" :size="15" />
|
|
328
|
+
New Tab
|
|
329
|
+
<ContextMenuShortcut>⌘⇧T</ContextMenuShortcut>
|
|
330
|
+
</ContextMenuItem>
|
|
331
|
+
<ContextMenuItem>
|
|
332
|
+
<LucideRotateCw class="mr-[9px]" :size="15" />
|
|
333
|
+
Reload
|
|
334
|
+
<ContextMenuShortcut>⌘⇧R</ContextMenuShortcut>
|
|
335
|
+
</ContextMenuItem>
|
|
336
|
+
<ContextMenuSeparator />
|
|
337
|
+
<ContextMenuItem inset v-on:click.prevent="closeTab(tab)"> Close </ContextMenuItem>
|
|
338
|
+
<ContextMenuItem inset v-on:click.prevent="closeTabOthers(tab)"> Close Others </ContextMenuItem>
|
|
339
|
+
<ContextMenuItem inset v-on:click.prevent="closeTabRight(tab)"> Close to the Right </ContextMenuItem>
|
|
340
|
+
<ContextMenuSeparator />
|
|
341
|
+
<ContextMenuItem>
|
|
342
|
+
<LucidePin class="mr-[9px] text-orange-500" :size="15" fill="currentcolor" />
|
|
343
|
+
Pin
|
|
344
|
+
</ContextMenuItem>
|
|
345
|
+
</ContextMenuContent>
|
|
346
|
+
</ContextMenu>
|
|
347
|
+
<button class="ml-2 mt-1 flex size-6 items-center justify-center rounded-full transition hover:bg-slate-200 hover:text-primary_main 2xl:size-8" v-on:click="newTab">
|
|
348
|
+
<LucidePlusCircle :stroke-width="1.5" class="size-[18px] 2xl:size-[22px]" />
|
|
349
|
+
</button>
|
|
350
|
+
</div>
|
|
351
|
+
|
|
352
|
+
<AlertDialog v-model:open="logoutConfirmOpen">
|
|
353
|
+
<AlertDialogContent class="w-96 dark:bg-dark_bg2">
|
|
354
|
+
<AlertDialogHeader>
|
|
355
|
+
<AlertDialogTitle>Logout dari {{ companyName }}</AlertDialogTitle>
|
|
356
|
+
<AlertDialogDescription> Apakah kamu yakin ingin logout dari {{ companyName }}? kamu dapat login kembali kapan aja. </AlertDialogDescription>
|
|
357
|
+
</AlertDialogHeader>
|
|
358
|
+
<AlertDialogFooter>
|
|
359
|
+
<AlertDialogCancel>Batal</AlertDialogCancel>
|
|
360
|
+
<AlertDialogAction class="bg-red-600 hover:bg-red-500" v-on:click="doLogout">Logout</AlertDialogAction>
|
|
361
|
+
</AlertDialogFooter>
|
|
362
|
+
</AlertDialogContent>
|
|
363
|
+
</AlertDialog>
|
|
364
|
+
|
|
365
|
+
<main class="notif-cnt">
|
|
366
|
+
<section class="fixed right-8 top-14 z-999" v-on:mouseleave="fnBlur">
|
|
367
|
+
<ul
|
|
368
|
+
class="notif-ul h-28 overflow-auto p-3 transition-all hover:mt-0 hover:h-auto hover:max-h-[calc(100%-3.5rem)]"
|
|
369
|
+
v-for="(item, i) in floatingNotifs"
|
|
370
|
+
:key="i"
|
|
371
|
+
:class="{
|
|
372
|
+
'-mt-8': i > 0,
|
|
373
|
+
'!h-0 scale-0 !p-0 opacity-0': !item.visible
|
|
374
|
+
}"
|
|
375
|
+
v-on:mouseenter="fnHover(item)">
|
|
376
|
+
<li class="mb-2 min-w-[365px] rounded-lg bg-white px-4 py-4 text-[13px]" v-for="i in 20" :key="i" :class="`notif-item-${i > 3 ? 'x' : i}`">
|
|
377
|
+
<h4 class="font-semibold">Event has been created</h4>
|
|
378
|
+
<p>Monday, January 3rd at 6:00pm</p>
|
|
379
|
+
</li>
|
|
380
|
+
</ul>
|
|
381
|
+
</section>
|
|
382
|
+
</main>
|
|
383
|
+
<LoadingDialog ref="loadingDialogEl" />
|
|
384
|
+
</template>
|
|
385
|
+
|
|
386
|
+
<style scoped lang="scss">
|
|
387
|
+
.tab-cnt {
|
|
388
|
+
scrollbar-width: none; /* Firefox */
|
|
389
|
+
-ms-overflow-style: none; /* IE and Edge */
|
|
390
|
+
&::-webkit-scrollbar {
|
|
391
|
+
display: none;
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
.notif-ul {
|
|
396
|
+
// background-color: red;
|
|
397
|
+
max-height: 60vh !important;
|
|
398
|
+
li {
|
|
399
|
+
box-shadow: 0 2px 12px rgba($color: #000000, $alpha: 0.14);
|
|
400
|
+
transition: all 0.36s ease;
|
|
401
|
+
&.notif-item-x {
|
|
402
|
+
opacity: 0;
|
|
403
|
+
transform: scale(0.82) translateY(-400%);
|
|
404
|
+
}
|
|
405
|
+
&.notif-item-1 {
|
|
406
|
+
display: block;
|
|
407
|
+
position: relative;
|
|
408
|
+
z-index: 9;
|
|
409
|
+
}
|
|
410
|
+
&.notif-item-2 {
|
|
411
|
+
transform: scale(0.94) translateY(-100%);
|
|
412
|
+
position: relative;
|
|
413
|
+
z-index: 8;
|
|
414
|
+
}
|
|
415
|
+
&.notif-item-3 {
|
|
416
|
+
transform: scale(0.88) translateY(-214%);
|
|
417
|
+
position: relative;
|
|
418
|
+
z-index: 7;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
&:hover {
|
|
422
|
+
li {
|
|
423
|
+
transform: none;
|
|
424
|
+
opacity: 1;
|
|
425
|
+
&.notif-item-x {
|
|
426
|
+
display: block;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
</style>
|