@stacksjs/defaults 0.70.54
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/LICENSE.md +21 -0
- package/README.md +2 -0
- package/package.json +20 -0
- package/resources/assets/fonts/013717e9.woff +0 -0
- package/resources/assets/fonts/03355817.woff2 +0 -0
- package/resources/assets/fonts/0380de7e.woff2 +0 -0
- package/resources/assets/fonts/0ba5d32a.woff +0 -0
- package/resources/assets/fonts/0bd57ddf.woff2 +0 -0
- package/resources/assets/fonts/19de0a60.woff2 +0 -0
- package/resources/assets/fonts/20b87e84.woff +0 -0
- package/resources/assets/fonts/4bbc67e1.woff +0 -0
- package/resources/assets/fonts/576fb0d7.woff +0 -0
- package/resources/assets/fonts/5ea10ee5.woff2 +0 -0
- package/resources/assets/fonts/6413fc0a.woff +0 -0
- package/resources/assets/fonts/72c114cf.woff +0 -0
- package/resources/assets/fonts/73c57e73.woff2 +0 -0
- package/resources/assets/fonts/813dca6c.woff +0 -0
- package/resources/assets/fonts/8a9b0995.woff2 +0 -0
- package/resources/assets/fonts/90b4832f.woff +0 -0
- package/resources/assets/fonts/9394ab85.woff2 +0 -0
- package/resources/assets/fonts/9b3c7d7f.woff2 +0 -0
- package/resources/assets/fonts/Monaco.ttf +0 -0
- package/resources/assets/fonts/b1b36d74.woff +0 -0
- package/resources/assets/fonts/b5d74798.woff2 +0 -0
- package/resources/assets/fonts/b9f81a4d.woff +0 -0
- package/resources/assets/fonts/c9784008.woff2 +0 -0
- package/resources/assets/fonts/cf692227.woff +0 -0
- package/resources/assets/fonts/d1c6ab51.woff2 +0 -0
- package/resources/assets/fonts/e2eb62fc.woff +0 -0
- package/resources/assets/fonts/fe21f8d8.woff2 +0 -0
- package/resources/assets/fonts/nps/CampmateScript-Regular.woff2 +0 -0
- package/resources/assets/fonts/nps/NPS_2026-variable.woff2 +0 -0
- package/resources/assets/fonts/nps/RedwoodSerif-Regular.woff2 +0 -0
- package/resources/assets/fonts/nps/SequoiaSans-Regular.woff2 +0 -0
- package/resources/assets/fonts/nps/Switchback-Regular.woff2 +0 -0
- package/resources/assets/images/app-icon.png +0 -0
- package/resources/assets/images/bg-img.png +0 -0
- package/resources/assets/images/park-ridge.svg +15 -0
- package/resources/assets/images/topography.svg +1 -0
- package/resources/assets/scripts/main.ts +2153 -0
- package/resources/assets/styles/README.md +19 -0
- package/resources/assets/styles/docs/main.css +1 -0
- package/resources/assets/styles/docs/overrides.css +1 -0
- package/resources/assets/styles/docs/vars.css +8 -0
- package/resources/assets/styles/main.css +1419 -0
- package/resources/components/Button.stx +70 -0
- package/resources/components/Buttons/BaseButton.stx +39 -0
- package/resources/components/Buttons/Counter.stx +28 -0
- package/resources/components/Buttons/ToggleDark.stx +11 -0
- package/resources/components/Container.stx +10 -0
- package/resources/components/Dashboard/.gitkeep +0 -0
- package/resources/components/Dashboard/Auth/ForgotPassword.stx +127 -0
- package/resources/components/Dashboard/Auth/Login.stx +212 -0
- package/resources/components/Dashboard/Auth/Register.stx +306 -0
- package/resources/components/Dashboard/Avatar.stx +123 -0
- package/resources/components/Dashboard/Billing/ActivePlan.stx +57 -0
- package/resources/components/Dashboard/Billing/CardBrands.stx +32 -0
- package/resources/components/Dashboard/Billing/CardForm.stx +34 -0
- package/resources/components/Dashboard/Billing/OneTimePayment.stx +28 -0
- package/resources/components/Dashboard/Billing/PaymentForm.stx +33 -0
- package/resources/components/Dashboard/Billing/PaymentMethod.stx +66 -0
- package/resources/components/Dashboard/Billing/PaymentMethodList.stx +52 -0
- package/resources/components/Dashboard/Billing/Plans.stx +136 -0
- package/resources/components/Dashboard/Buttons/AppButton.stx +48 -0
- package/resources/components/Dashboard/Buttons/IconButton.stx +20 -0
- package/resources/components/Dashboard/Card.stx +78 -0
- package/resources/components/Dashboard/Chart.stx +75 -0
- package/resources/components/Dashboard/CodeEditor.stx +41 -0
- package/resources/components/Dashboard/Commerce/BulkActionBar.stx +70 -0
- package/resources/components/Dashboard/Commerce/CategoriesTable.stx +133 -0
- package/resources/components/Dashboard/Commerce/CouponsTable.stx +161 -0
- package/resources/components/Dashboard/Commerce/CustomersTable.stx +142 -0
- package/resources/components/Dashboard/Commerce/Delivery/DeliveryRoutesTable.stx +80 -0
- package/resources/components/Dashboard/Commerce/Delivery/DigitalDeliveryTable.stx +85 -0
- package/resources/components/Dashboard/Commerce/Delivery/DriversTable.stx +99 -0
- package/resources/components/Dashboard/Commerce/Delivery/LicenseKeysTable.stx +92 -0
- package/resources/components/Dashboard/Commerce/Delivery/LicenseTemplatesTable.stx +88 -0
- package/resources/components/Dashboard/Commerce/Delivery/Pagination.stx +122 -0
- package/resources/components/Dashboard/Commerce/Delivery/SearchFilter.stx +23 -0
- package/resources/components/Dashboard/Commerce/Delivery/ShippingMethodsTable.stx +80 -0
- package/resources/components/Dashboard/Commerce/Delivery/ShippingRatesTable.stx +59 -0
- package/resources/components/Dashboard/Commerce/Delivery/ShippingZonesTable.stx +71 -0
- package/resources/components/Dashboard/Commerce/Delivery/TabNavigation.stx +36 -0
- package/resources/components/Dashboard/Commerce/Forms/CouponsForm.stx +191 -0
- package/resources/components/Dashboard/Commerce/OrdersTable.stx +131 -0
- package/resources/components/Dashboard/Commerce/ProductsTable.stx +170 -0
- package/resources/components/Dashboard/CreateRecordModal.stx +363 -0
- package/resources/components/Dashboard/DashboardLayout.stx +155 -0
- package/resources/components/Dashboard/Deployments/ActivityFeed.stx +54 -0
- package/resources/components/Dashboard/Deployments/DeployScript.stx +23 -0
- package/resources/components/Dashboard/Deployments/DeploymentHistory.stx +97 -0
- package/resources/components/Dashboard/Deployments/DeploymentList.stx +94 -0
- package/resources/components/Dashboard/Deployments/LiveTerminalOutput.stx +18 -0
- package/resources/components/Dashboard/Elements/Dropdown.stx +57 -0
- package/resources/components/Dashboard/Email/EmailActivityChart.stx +111 -0
- package/resources/components/Dashboard/Email/EmailCompose.stx +72 -0
- package/resources/components/Dashboard/Email/EmailDetail.stx +105 -0
- package/resources/components/Dashboard/Email/EmailList.stx +117 -0
- package/resources/components/Dashboard/Email/EmailSearch.stx +40 -0
- package/resources/components/Dashboard/Email/EmailSidebar.stx +133 -0
- package/resources/components/Dashboard/GlobalSearch.stx +124 -0
- package/resources/components/Dashboard/MobileSidebar.stx +47 -0
- package/resources/components/Dashboard/Modals/BaseModal.stx +50 -0
- package/resources/components/Dashboard/Modals/Popups/Alert.stx +112 -0
- package/resources/components/Dashboard/Modals/Popups/Toast.stx +70 -0
- package/resources/components/Dashboard/Modals/ToastWrapper.stx +35 -0
- package/resources/components/Dashboard/Monitoring/ErrorDetailModal.stx +228 -0
- package/resources/components/Dashboard/Monitoring/ErrorsTable.stx +184 -0
- package/resources/components/Dashboard/Navbar.stx +194 -0
- package/resources/components/Dashboard/NavbarModern.stx +188 -0
- package/resources/components/Dashboard/NotificationErrorModal.stx +105 -0
- package/resources/components/Dashboard/NotificationStatusBadge.stx +20 -0
- package/resources/components/Dashboard/Pagination.stx +90 -0
- package/resources/components/Dashboard/Queue/QueueTable.stx +127 -0
- package/resources/components/Dashboard/Settings/Forms/AIForm.stx +126 -0
- package/resources/components/Dashboard/Settings/Forms/AnalyticsForm.stx +52 -0
- package/resources/components/Dashboard/Settings/Forms/AppForm.stx +157 -0
- package/resources/components/Dashboard/Settings/Forms/CLIForm.stx +66 -0
- package/resources/components/Dashboard/Settings/Forms/CacheForm.stx +253 -0
- package/resources/components/Dashboard/Settings/Forms/CloudForm.stx +441 -0
- package/resources/components/Dashboard/Settings/Forms/DNSForm.stx +307 -0
- package/resources/components/Dashboard/Settings/Forms/DatabaseForm.stx +168 -0
- package/resources/components/Dashboard/Settings/Forms/EmailForm.stx +100 -0
- package/resources/components/Dashboard/Settings/Forms/FileSystemForm.stx +259 -0
- package/resources/components/Dashboard/Settings/Forms/HashingForm.stx +119 -0
- package/resources/components/Dashboard/Settings/Forms/LibraryForm.stx +389 -0
- package/resources/components/Dashboard/Settings/Forms/QueueForm.stx +219 -0
- package/resources/components/Dashboard/Settings/Forms/SearchEngineForm.stx +48 -0
- package/resources/components/Dashboard/Settings/Forms/SecurityForm.stx +143 -0
- package/resources/components/Dashboard/Settings/Forms/ServicesForm.stx +194 -0
- package/resources/components/Dashboard/Settings/Forms/StorageForm.stx +191 -0
- package/resources/components/Dashboard/Settings/Forms/TeamsForm.stx +33 -0
- package/resources/components/Dashboard/Settings/SettingsFormManager.stx +181 -0
- package/resources/components/Dashboard/SettingsHeader.stx +88 -0
- package/resources/components/Dashboard/SettingsSidebar.stx +234 -0
- package/resources/components/Dashboard/Sidebar.stx +23 -0
- package/resources/components/Dashboard/SidebarModern.stx +249 -0
- package/resources/components/Dashboard/Skeleton/LoadingCard.stx +15 -0
- package/resources/components/Dashboard/Skeleton/LoadingDetails.stx +26 -0
- package/resources/components/Dashboard/Table.stx +82 -0
- package/resources/components/Dashboard/TerminalContainer.stx +97 -0
- package/resources/components/Dashboard/Tooltip.stx +166 -0
- package/resources/components/Dashboard/Transaction/index.stx +88 -0
- package/resources/components/Dashboard/UI/ActivityTable.stx +54 -0
- package/resources/components/Dashboard/UI/Avatar.stx +102 -0
- package/resources/components/Dashboard/UI/Badge.stx +66 -0
- package/resources/components/Dashboard/UI/Button.stx +73 -0
- package/resources/components/Dashboard/UI/Card.stx +51 -0
- package/resources/components/Dashboard/UI/ChartCard.stx +36 -0
- package/resources/components/Dashboard/UI/Checkbox.stx +74 -0
- package/resources/components/Dashboard/UI/ConfirmDialog.stx +74 -0
- package/resources/components/Dashboard/UI/DataTable.stx +45 -0
- package/resources/components/Dashboard/UI/Dropdown.stx +72 -0
- package/resources/components/Dashboard/UI/DropdownItem.stx +80 -0
- package/resources/components/Dashboard/UI/EmptyState.stx +50 -0
- package/resources/components/Dashboard/UI/FilterBar.stx +48 -0
- package/resources/components/Dashboard/UI/Input.stx +77 -0
- package/resources/components/Dashboard/UI/Modal.stx +75 -0
- package/resources/components/Dashboard/UI/PageHeader.stx +69 -0
- package/resources/components/Dashboard/UI/PageLayout.stx +84 -0
- package/resources/components/Dashboard/UI/Pagination.stx +126 -0
- package/resources/components/Dashboard/UI/QuickLinks.stx +31 -0
- package/resources/components/Dashboard/UI/RouterLink.stx +31 -0
- package/resources/components/Dashboard/UI/Select.stx +84 -0
- package/resources/components/Dashboard/UI/ServiceHealth.stx +38 -0
- package/resources/components/Dashboard/UI/StatsCard.stx +79 -0
- package/resources/components/Dashboard/UI/Table.stx +143 -0
- package/resources/components/Dashboard/UI/Tabs.stx +45 -0
- package/resources/components/Dashboard/UI/Textarea.stx +93 -0
- package/resources/components/Dashboard/UI/Toggle.stx +84 -0
- package/resources/components/Dashboard/UI/WindowControls.stx +135 -0
- package/resources/components/Dashboard/Widget.stx +89 -0
- package/resources/components/Dashboard/WindowControls.stx +119 -0
- package/resources/components/Dashboard/index.ts +106 -0
- package/resources/components/Docs/Demo/ComboboxCode.md +114 -0
- package/resources/components/Docs/Demo/ComboboxDemo.stx +91 -0
- package/resources/components/Docs/Demo/DialogCode.md +42 -0
- package/resources/components/Docs/Demo/DialogDemo.stx +76 -0
- package/resources/components/Docs/Demo/DocsPlayground.stx +39 -0
- package/resources/components/Docs/Demo/DropdownCode.md +109 -0
- package/resources/components/Docs/Demo/DropdownDemo.stx +82 -0
- package/resources/components/Docs/Demo/Hero.stx +100 -0
- package/resources/components/Docs/Demo/ListboxCode.md +87 -0
- package/resources/components/Docs/Demo/ListboxDemo.stx +59 -0
- package/resources/components/Docs/Demo/NotificationCode.md +173 -0
- package/resources/components/Docs/Demo/NotificationDemo.stx +99 -0
- package/resources/components/Docs/Demo/PopoverCode.md +161 -0
- package/resources/components/Docs/Demo/PopoverDemo.stx +96 -0
- package/resources/components/Docs/Demo/RadioGroupCode.md +98 -0
- package/resources/components/Docs/Demo/RadioGroupDemo.stx +53 -0
- package/resources/components/Docs/Demo/StepperCode.md +216 -0
- package/resources/components/Docs/Demo/StepperDemo.stx +137 -0
- package/resources/components/Docs/Demo/SwitchCode.md +24 -0
- package/resources/components/Docs/Demo/SwitchDemo.stx +28 -0
- package/resources/components/Docs/Home.stx +7 -0
- package/resources/components/Docs/HomeContributors.stx +23 -0
- package/resources/components/Docs/HomeSponsors.stx +17 -0
- package/resources/components/Docs/HomeTeam.stx +18 -0
- package/resources/components/Docs/TeamMember.stx +79 -0
- package/resources/components/Email/EmailButton.stx +32 -0
- package/resources/components/Email/EmailDivider.stx +20 -0
- package/resources/components/Email/EmailImage.stx +24 -0
- package/resources/components/Email/EmailLayout.stx +55 -0
- package/resources/components/Email/EmailLink.stx +22 -0
- package/resources/components/Email/EmailSection.stx +20 -0
- package/resources/components/Email/EmailText.stx +30 -0
- package/resources/components/Forum/ForumBreadcrumb.stx +38 -0
- package/resources/components/Forum/ForumCategory.stx +16 -0
- package/resources/components/Forum/ForumCategoryItem.stx +46 -0
- package/resources/components/Forum/ForumLayout.stx +36 -0
- package/resources/components/Forum/ForumPagination.stx +39 -0
- package/resources/components/Forum/ForumPost.stx +71 -0
- package/resources/components/Forum/ForumReplyForm.stx +76 -0
- package/resources/components/Forum/ForumSidebar.stx +86 -0
- package/resources/components/Forum/ForumTopicItem.stx +77 -0
- package/resources/components/Forum/ForumTopicList.stx +23 -0
- package/resources/components/HelloWorld.stx +253 -0
- package/resources/components/Logo.stx +10 -0
- package/resources/components/Marketing/CallToAction.stx +30 -0
- package/resources/components/Marketing/ComingSoon.stx +155 -0
- package/resources/components/Marketing/Faqs.stx +99 -0
- package/resources/components/Marketing/Feature.stx +32 -0
- package/resources/components/Marketing/Fields.stx +28 -0
- package/resources/components/Marketing/Footer.stx +33 -0
- package/resources/components/Marketing/Header.stx +51 -0
- package/resources/components/Marketing/Hero.stx +46 -0
- package/resources/components/Marketing/Layout.stx +26 -0
- package/resources/components/Marketing/NavLink.stx +13 -0
- package/resources/components/Marketing/Plan.stx +43 -0
- package/resources/components/Marketing/Pricing.stx +120 -0
- package/resources/components/Marketing/PrimaryFeatures.stx +80 -0
- package/resources/components/Marketing/PrimaryFeatures2.stx +98 -0
- package/resources/components/Marketing/SecondaryFeatures.stx +80 -0
- package/resources/components/Marketing/Testimonials.stx +120 -0
- package/resources/components/Pagination.stx +149 -0
- package/resources/components/Playground.stx +9 -0
- package/resources/components/README.md +87 -0
- package/resources/components/Storefront/AnnouncementBar.stx +17 -0
- package/resources/components/Storefront/CartDrawer.stx +227 -0
- package/resources/components/Storefront/CheckoutSteps.stx +50 -0
- package/resources/components/Storefront/Footer.stx +81 -0
- package/resources/components/Storefront/Header.stx +66 -0
- package/resources/components/Storefront/OrderSummary.stx +79 -0
- package/resources/components/Storefront/ProductCard.stx +63 -0
- package/resources/components/Storefront/ProductGallery.stx +88 -0
- package/resources/components/Storefront/QuantitySelector.stx +97 -0
- package/resources/components/index.ts +13 -0
- package/resources/emails/email-verification.stx +46 -0
- package/resources/emails/layouts/base.html +113 -0
- package/resources/emails/password-changed.stx +55 -0
- package/resources/emails/password-reset.stx +43 -0
- package/resources/emails/subscription-confirmation.stx +99 -0
- package/resources/emails/welcome.stx +48 -0
- package/resources/functions/README.md +28 -0
- package/resources/functions/counter.ts +13 -0
- package/resources/functions/dark.ts +4 -0
- package/resources/functions/dashboard/analytics.ts +238 -0
- package/resources/functions/dashboard/config-io.ts +316 -0
- package/resources/functions/dashboard/data.ts +375 -0
- package/resources/functions/dashboard/library.ts +250 -0
- package/resources/functions/dashboard/sidebar.ts +537 -0
- package/resources/functions/dashboard/system.ts +150 -0
- package/resources/layouts/403.stx +188 -0
- package/resources/layouts/404.stx +34 -0
- package/resources/layouts/README.md +14 -0
- package/resources/layouts/dashboard/default.stx +20 -0
- package/resources/layouts/dashboard/guest.stx +10 -0
- package/resources/layouts/default.stx +3 -0
- package/resources/layouts/maintenance.stx +11 -0
- package/resources/layouts/storefront.stx +73 -0
- package/resources/layouts/system-tray/default.stx +3 -0
- package/resources/modules/.gitkeep +0 -0
- package/resources/plugins/.gitkeep +0 -0
- package/resources/plugins/preloader.ts +308 -0
- package/resources/types/README.md +3 -0
- package/resources/views/cart.stx +149 -0
- package/resources/views/checkout/contact.stx +101 -0
- package/resources/views/checkout/payment.stx +114 -0
- package/resources/views/checkout/shipping.stx +120 -0
- package/resources/views/coming-soon.stx +9 -0
- package/resources/views/dashboard/custom-page.stx +45 -0
- package/resources/views/dashboard/index.stx +24 -0
- package/resources/views/emails/welcome.stx +0 -0
- package/resources/views/errors/tester.stx +26 -0
- package/resources/views/index.stx +2865 -0
- package/resources/views/orders/[id].stx +130 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
interface ToastProps {
|
|
3
|
+
show?: boolean
|
|
4
|
+
type?: 'warning' | 'success' | 'error' | 'info'
|
|
5
|
+
title?: string
|
|
6
|
+
position?: string
|
|
7
|
+
id?: string
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { show = false, type = 'warning', title = 'sample title', position = 'top-right', id = 'toast-' + Math.random().toString(36).slice(2, 11) } = defineProps<ToastProps>()
|
|
11
|
+
</script>
|
|
12
|
+
@if(show)
|
|
13
|
+
<div class="relative z-60" aria-labelledby="modal-title" role="alert" aria-live="assertive" data-toast="{{ id }}">
|
|
14
|
+
<div class="fixed inset-0"></div>
|
|
15
|
+
|
|
16
|
+
<div class="fixed inset-0 overflow-y-auto z-10">
|
|
17
|
+
<div class="my-8 p-4 text-center sm:items-center sm:p-0 {{ position == 'center' ? 'flex justify-center h-full' : '' }} {{ position == 'top' ? 'flex justify-center' : '' }} {{ position == 'top-right' ? 'flex justify-end mt-4' : '' }} {{ position == 'top-left' ? 'flex justify-start' : '' }}">
|
|
18
|
+
<div aria-live="assertive" class="flex fixed inset-0 items-end sm:items-start px-4 py-6 sm:p-6 pointer-events-none">
|
|
19
|
+
<div class="flex flex-col items-center sm:items-end space-y-4 w-full">
|
|
20
|
+
<div class="overflow-hidden max-w-sm w-full bg-white dark:bg-neutral-700 ring-1 ring-black ring-opacity-5 rounded-lg shadow-lg pointer-events-auto">
|
|
21
|
+
<div class="p-4">
|
|
22
|
+
<div class="flex items-center">
|
|
23
|
+
@if(type == 'warning')
|
|
24
|
+
<div class="flex-shrink-0">
|
|
25
|
+
<svg class="h-6 w-6 text-yellow-400" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
26
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z"></path>
|
|
27
|
+
</svg>
|
|
28
|
+
</div>
|
|
29
|
+
@elseif(type == 'success')
|
|
30
|
+
<div class="flex-shrink-0">
|
|
31
|
+
<svg class="h-6 w-6 text-green-400" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true">
|
|
32
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path>
|
|
33
|
+
</svg>
|
|
34
|
+
</div>
|
|
35
|
+
@elseif(type == 'error')
|
|
36
|
+
<div class="flex-shrink-0">
|
|
37
|
+
<svg class="h-6 w-6 text-red-400" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
38
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M9.75 9.75l4.5 4.5m0-4.5l-4.5 4.5M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path>
|
|
39
|
+
</svg>
|
|
40
|
+
</div>
|
|
41
|
+
@elseif(type == 'info')
|
|
42
|
+
<div class="flex-shrink-0">
|
|
43
|
+
<svg class="h-6 w-6 text-blue-400" fill="none" stroke="currentColor" stroke-width="1.5" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
|
|
44
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z"></path>
|
|
45
|
+
</svg>
|
|
46
|
+
</div>
|
|
47
|
+
@endif
|
|
48
|
+
|
|
49
|
+
<div class="flex-1 ml-3 pt-0.5 w-0">
|
|
50
|
+
<p class="font-medium text-gray-900 text-left text-sm dark:text-neutral-100">
|
|
51
|
+
{{ title }}
|
|
52
|
+
</p>
|
|
53
|
+
</div>
|
|
54
|
+
<div class="flex flex-shrink-0 ml-4">
|
|
55
|
+
<button type="button" class="inline-flex text-gray-400 hover:text-gray-500 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2" data-action="close">
|
|
56
|
+
<span class="sr-only">Close</span>
|
|
57
|
+
<svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
|
58
|
+
<path d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"></path>
|
|
59
|
+
</svg>
|
|
60
|
+
</button>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
</div>
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
@endif
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
interface ToastWrapperProps {
|
|
3
|
+
width?: number
|
|
4
|
+
position?: 'center' | 'top' | 'top-right' | 'top-left'
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
const { width = 30, position = 'top-right' } = defineProps<ToastWrapperProps>()
|
|
8
|
+
</script>
|
|
9
|
+
<div class="relative z-60" aria-labelledby="modal-title" role="dialog" aria-modal="true">
|
|
10
|
+
<div class="fixed inset-0"></div>
|
|
11
|
+
|
|
12
|
+
<div class="fixed inset-0 overflow-y-auto z-10">
|
|
13
|
+
<div class="my-8 p-4 text-center sm:items-center sm:p-0 {{ position == 'center' ? 'flex justify-center h-full' : '' }} {{ position == 'top' ? 'flex justify-center' : '' }} {{ position == 'top-right' ? 'flex justify-end mt-4' : '' }} {{ position == 'top-left' ? 'flex justify-start' : '' }}">
|
|
14
|
+
<div aria-live="assertive" class="flex fixed inset-0 items-end sm:items-start px-4 py-6 sm:p-6 pointer-events-none">
|
|
15
|
+
<div class="flex flex-col items-center sm:items-end space-y-4 w-full">
|
|
16
|
+
<div class="overflow-hidden max-w-sm w-full bg-white dark:bg-neutral-700 ring-1 ring-black ring-opacity-5 rounded-lg shadow-lg pointer-events-auto">
|
|
17
|
+
<div class="p-4">
|
|
18
|
+
<div class="flex items-center">
|
|
19
|
+
<slot name="body" />
|
|
20
|
+
<div class="flex flex-shrink-0 ml-4">
|
|
21
|
+
<button type="button" class="inline-flex text-gray-400 hover:text-gray-500 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2" data-action="close">
|
|
22
|
+
<span class="sr-only">Close</span>
|
|
23
|
+
<svg class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
|
24
|
+
<path d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"></path>
|
|
25
|
+
</svg>
|
|
26
|
+
</button>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
interface ErrorDetailModalProps {
|
|
3
|
+
error?: any
|
|
4
|
+
isOpen?: boolean
|
|
5
|
+
errorInstances?: any[]
|
|
6
|
+
isLoading?: boolean
|
|
7
|
+
activeTab?: string
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { error = null, isOpen = false, errorInstances = [], isLoading = false, activeTab = 'details' } = defineProps<ErrorDetailModalProps>()
|
|
11
|
+
|
|
12
|
+
// Helper functions
|
|
13
|
+
function getStatusClass(status) {
|
|
14
|
+
switch (status) {
|
|
15
|
+
case 'resolved':
|
|
16
|
+
return 'bg-green-50 text-green-700 ring-1 ring-inset ring-green-600/20 dark:bg-green-900/30 dark:text-green-400'
|
|
17
|
+
case 'ignored':
|
|
18
|
+
return 'bg-gray-50 text-gray-700 ring-1 ring-inset ring-gray-600/20 dark:bg-neutral-900/30 dark:text-neutral-400'
|
|
19
|
+
case 'unresolved':
|
|
20
|
+
default:
|
|
21
|
+
return 'bg-red-50 text-red-700 ring-1 ring-inset ring-red-600/20 dark:bg-red-900/30 dark:text-red-400'
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function getTypeClass(type) {
|
|
26
|
+
const typeLC = type.toLowerCase()
|
|
27
|
+
if (typeLC.includes('error') || typeLC.includes('exception')) {
|
|
28
|
+
return 'bg-red-50 text-red-700 ring-1 ring-inset ring-red-600/20 dark:bg-red-900/30 dark:text-red-400'
|
|
29
|
+
}
|
|
30
|
+
if (typeLC.includes('warning')) {
|
|
31
|
+
return 'bg-yellow-50 text-yellow-700 ring-1 ring-inset ring-yellow-600/20 dark:bg-yellow-900/30 dark:text-yellow-400'
|
|
32
|
+
}
|
|
33
|
+
if (typeLC.includes('info')) {
|
|
34
|
+
return 'bg-blue-50 text-blue-700 ring-1 ring-inset ring-blue-600/20 dark:bg-blue-900/30 dark:text-blue-400'
|
|
35
|
+
}
|
|
36
|
+
return 'bg-purple-50 text-purple-700 ring-1 ring-inset ring-purple-600/20 dark:bg-purple-900/30 dark:text-purple-400'
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function formatDate(dateString) {
|
|
40
|
+
const date = new Date(dateString)
|
|
41
|
+
return date.toLocaleString('en-US', {
|
|
42
|
+
year: 'numeric',
|
|
43
|
+
month: 'short',
|
|
44
|
+
day: 'numeric',
|
|
45
|
+
hour: '2-digit',
|
|
46
|
+
minute: '2-digit',
|
|
47
|
+
second: '2-digit',
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function formatTimeAgo(dateString) {
|
|
52
|
+
const date = new Date(dateString)
|
|
53
|
+
const now = new Date()
|
|
54
|
+
const diffMs = now.getTime() - date.getTime()
|
|
55
|
+
const diffSecs = Math.floor(diffMs / 1000)
|
|
56
|
+
const diffMins = Math.floor(diffSecs / 60)
|
|
57
|
+
const diffHours = Math.floor(diffMins / 60)
|
|
58
|
+
const diffDays = Math.floor(diffHours / 24)
|
|
59
|
+
|
|
60
|
+
if (diffDays > 0) return `${diffDays}d ago`
|
|
61
|
+
if (diffHours > 0) return `${diffHours}h ago`
|
|
62
|
+
if (diffMins > 0) return `${diffMins}m ago`
|
|
63
|
+
return 'Just now'
|
|
64
|
+
}
|
|
65
|
+
</script>
|
|
66
|
+
@if(isOpen && error)
|
|
67
|
+
<div class="fixed inset-0 overflow-y-auto z-50">
|
|
68
|
+
<div class="flex items-end justify-center sm:items-center p-4 sm:p-0 min-h-full text-center">
|
|
69
|
+
<!-- Backdrop -->
|
|
70
|
+
<div class="fixed inset-0 bg-gray-500 bg-opacity-75 dark:bg-neutral-900 dark:bg-opacity-75 transition-opacity" data-action="close"></div>
|
|
71
|
+
|
|
72
|
+
<!-- Modal panel -->
|
|
73
|
+
<div class="overflow-hidden relative sm:my-8 sm:max-w-4xl sm:w-full text-left bg-white dark:bg-neutral-800 rounded-lg shadow-xl transition-all transform">
|
|
74
|
+
<!-- Header -->
|
|
75
|
+
<div class="px-6 py-4 border-b border-gray-200 dark:border-neutral-700">
|
|
76
|
+
<div class="flex items-start justify-between">
|
|
77
|
+
<div class="flex-1">
|
|
78
|
+
<div class="flex gap-3 items-center">
|
|
79
|
+
<span class="inline-flex items-center rounded-md px-2 py-1 text-xs font-medium {{ getTypeClass(error.type) }}">
|
|
80
|
+
{{ error.type }}
|
|
81
|
+
</span>
|
|
82
|
+
<span class="inline-flex items-center rounded-md px-2 py-1 text-xs font-medium capitalize {{ getStatusClass(error.status) }}">
|
|
83
|
+
{{ error.status }}
|
|
84
|
+
</span>
|
|
85
|
+
</div>
|
|
86
|
+
<h3 class="mt-2 break-words font-semibold text-gray-900 text-lg dark:text-white">
|
|
87
|
+
{{ error.message }}
|
|
88
|
+
</h3>
|
|
89
|
+
<div class="flex gap-4 items-center mt-1 text-gray-500 text-sm dark:text-neutral-400">
|
|
90
|
+
<span class="flex items-center">
|
|
91
|
+
<div class="mr-1 h-4 w-4 i-hugeicons-time-02"></div>
|
|
92
|
+
First seen: {{ formatTimeAgo(error.first_seen) }}
|
|
93
|
+
</span>
|
|
94
|
+
<span class="flex items-center">
|
|
95
|
+
<div class="mr-1 h-4 w-4 i-hugeicons-clock-02"></div>
|
|
96
|
+
Last seen: {{ formatTimeAgo(error.last_seen) }}
|
|
97
|
+
</span>
|
|
98
|
+
<span class="flex items-center">
|
|
99
|
+
<div class="mr-1 h-4 w-4 i-hugeicons-chart-line-data-01"></div>
|
|
100
|
+
{{ error.count }} events
|
|
101
|
+
</span>
|
|
102
|
+
</div>
|
|
103
|
+
</div>
|
|
104
|
+
<button type="button" class="text-gray-400 hover:text-gray-500 rounded-md focus:outline-none" data-action="close">
|
|
105
|
+
<div class="h-6 w-6 i-hugeicons-cancel-01"></div>
|
|
106
|
+
</button>
|
|
107
|
+
</div>
|
|
108
|
+
|
|
109
|
+
<!-- Action buttons -->
|
|
110
|
+
<div class="flex gap-2 mt-4">
|
|
111
|
+
@if(error.status != 'resolved')
|
|
112
|
+
<button type="button" class="inline-flex items-center px-3 py-2 font-semibold text-sm text-white bg-green-600 hover:bg-green-500 rounded-md shadow-sm" data-action="resolve">
|
|
113
|
+
<div class="mr-1 h-4 w-4 i-hugeicons-checkmark-circle-02"></div>
|
|
114
|
+
Resolve
|
|
115
|
+
</button>
|
|
116
|
+
@endif
|
|
117
|
+
@if(error.status == 'resolved')
|
|
118
|
+
<button type="button" class="inline-flex items-center px-3 py-2 font-semibold text-sm text-white bg-yellow-600 hover:bg-yellow-500 rounded-md shadow-sm" data-action="unresolve">
|
|
119
|
+
<div class="mr-1 h-4 w-4 i-hugeicons-refresh"></div>
|
|
120
|
+
Reopen
|
|
121
|
+
</button>
|
|
122
|
+
@endif
|
|
123
|
+
@if(error.status != 'ignored')
|
|
124
|
+
<button type="button" class="inline-flex items-center px-3 py-2 font-semibold text-sm text-white bg-gray-600 hover:bg-gray-500 rounded-md shadow-sm" data-action="ignore">
|
|
125
|
+
<div class="mr-1 h-4 w-4 i-hugeicons-eye-off"></div>
|
|
126
|
+
Ignore
|
|
127
|
+
</button>
|
|
128
|
+
@endif
|
|
129
|
+
<button type="button" class="inline-flex items-center px-3 py-2 font-semibold text-sm text-white bg-red-600 hover:bg-red-500 rounded-md shadow-sm" data-action="delete">
|
|
130
|
+
<div class="mr-1 h-4 w-4 i-hugeicons-waste"></div>
|
|
131
|
+
Delete
|
|
132
|
+
</button>
|
|
133
|
+
</div>
|
|
134
|
+
</div>
|
|
135
|
+
|
|
136
|
+
<!-- Tabs -->
|
|
137
|
+
<div class="border-b border-gray-200 dark:border-neutral-700">
|
|
138
|
+
<nav class="flex -mb-px">
|
|
139
|
+
<button class="px-6 py-3 text-sm font-medium border-b-2 transition-colors {{ activeTab == 'details' ? 'border-blue-500 text-blue-600 dark:text-blue-400' : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 dark:text-neutral-400 dark:hover:text-gray-300' }}" data-action="tab" data-tab="details">
|
|
140
|
+
Details
|
|
141
|
+
</button>
|
|
142
|
+
<button class="px-6 py-3 text-sm font-medium border-b-2 transition-colors {{ activeTab == 'events' ? 'border-blue-500 text-blue-600 dark:text-blue-400' : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 dark:text-neutral-400 dark:hover:text-gray-300' }}" data-action="tab" data-tab="events">
|
|
143
|
+
Events ({{ error.count }})
|
|
144
|
+
</button>
|
|
145
|
+
</nav>
|
|
146
|
+
</div>
|
|
147
|
+
|
|
148
|
+
<!-- Content -->
|
|
149
|
+
<div class="overflow-y-auto px-6 py-4 max-h-[60vh]">
|
|
150
|
+
<!-- Details Tab -->
|
|
151
|
+
@if(activeTab == 'details')
|
|
152
|
+
<!-- Stack Trace -->
|
|
153
|
+
@if(error.stack)
|
|
154
|
+
<div class="mb-6">
|
|
155
|
+
<h4 class="mb-2 font-medium text-gray-900 text-sm dark:text-white">Stack Trace</h4>
|
|
156
|
+
<pre class="overflow-x-auto p-4 font-mono leading-relaxed text-gray-100 text-xs bg-gray-900 rounded-lg">{{ error.stack }}</pre>
|
|
157
|
+
</div>
|
|
158
|
+
@endif
|
|
159
|
+
|
|
160
|
+
<!-- Error Info -->
|
|
161
|
+
<div class="grid gap-4 grid-cols-2">
|
|
162
|
+
<div>
|
|
163
|
+
<h4 class="mb-2 font-medium text-gray-900 text-sm dark:text-white">Error Type</h4>
|
|
164
|
+
<p class="text-gray-600 text-sm dark:text-neutral-300">{{ error.type }}</p>
|
|
165
|
+
</div>
|
|
166
|
+
<div>
|
|
167
|
+
<h4 class="mb-2 font-medium text-gray-900 text-sm dark:text-white">Total Occurrences</h4>
|
|
168
|
+
<p class="text-gray-600 text-sm dark:text-neutral-300">{{ error.count }}</p>
|
|
169
|
+
</div>
|
|
170
|
+
<div>
|
|
171
|
+
<h4 class="mb-2 font-medium text-gray-900 text-sm dark:text-white">First Occurrence</h4>
|
|
172
|
+
<p class="text-gray-600 text-sm dark:text-neutral-300">{{ formatDate(error.first_seen) }}</p>
|
|
173
|
+
</div>
|
|
174
|
+
<div>
|
|
175
|
+
<h4 class="mb-2 font-medium text-gray-900 text-sm dark:text-white">Last Occurrence</h4>
|
|
176
|
+
<p class="text-gray-600 text-sm dark:text-neutral-300">{{ formatDate(error.last_seen) }}</p>
|
|
177
|
+
</div>
|
|
178
|
+
</div>
|
|
179
|
+
@endif
|
|
180
|
+
|
|
181
|
+
<!-- Events Tab -->
|
|
182
|
+
@if(activeTab == 'events')
|
|
183
|
+
@if(isLoading)
|
|
184
|
+
<div class="flex items-center justify-center py-8">
|
|
185
|
+
<div class="h-8 w-8 text-blue-500 animate-spin i-hugeicons-loading-01"></div>
|
|
186
|
+
</div>
|
|
187
|
+
@elseif(errorInstances.length == 0)
|
|
188
|
+
<div class="py-8 text-center text-gray-500 dark:text-neutral-400">
|
|
189
|
+
No individual events found
|
|
190
|
+
</div>
|
|
191
|
+
@else
|
|
192
|
+
<div class="space-y-3">
|
|
193
|
+
@foreach(errorInstances as instance)
|
|
194
|
+
<div class="p-4 bg-gray-50 dark:bg-neutral-700 rounded-lg">
|
|
195
|
+
<div class="flex items-start justify-between">
|
|
196
|
+
<div class="flex-1">
|
|
197
|
+
<div class="flex gap-2 items-center text-sm">
|
|
198
|
+
<span class="text-gray-500 dark:text-neutral-400">Event #{{ instance.id }}</span>
|
|
199
|
+
<span class="text-gray-400">|</span>
|
|
200
|
+
<span class="text-gray-600 dark:text-neutral-300">{{ formatDate(instance.created_at) }}</span>
|
|
201
|
+
</div>
|
|
202
|
+
<p class="mt-1 text-gray-900 text-sm dark:text-white">{{ instance.message }}</p>
|
|
203
|
+
@if(instance.additional_info)
|
|
204
|
+
<p class="mt-1 text-gray-500 text-xs dark:text-neutral-400">
|
|
205
|
+
{{ instance.additional_info }}
|
|
206
|
+
</p>
|
|
207
|
+
@endif
|
|
208
|
+
</div>
|
|
209
|
+
</div>
|
|
210
|
+
</div>
|
|
211
|
+
@endforeach
|
|
212
|
+
</div>
|
|
213
|
+
@endif
|
|
214
|
+
@endif
|
|
215
|
+
</div>
|
|
216
|
+
|
|
217
|
+
<!-- Footer -->
|
|
218
|
+
<div class="px-6 py-4 border-gray-200 border-t dark:border-neutral-700">
|
|
219
|
+
<div class="flex justify-end">
|
|
220
|
+
<button type="button" class="px-3 py-2 font-semibold text-gray-900 text-sm dark:text-white bg-white dark:bg-neutral-700 hover:bg-gray-50 dark:hover:bg-neutral-600 ring-1 ring-gray-300 ring-inset rounded-md dark:ring-neutral-600 shadow-sm" data-action="close">
|
|
221
|
+
Close
|
|
222
|
+
</button>
|
|
223
|
+
</div>
|
|
224
|
+
</div>
|
|
225
|
+
</div>
|
|
226
|
+
</div>
|
|
227
|
+
</div>
|
|
228
|
+
@endif
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
interface ErrorsTableProps {
|
|
3
|
+
errors?: any[]
|
|
4
|
+
searchQuery?: string
|
|
5
|
+
statusFilter?: string
|
|
6
|
+
typeFilter?: string
|
|
7
|
+
sortBy?: string
|
|
8
|
+
sortOrder?: string
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const { errors = [], searchQuery = '', statusFilter = 'all', typeFilter = 'all', sortBy = 'last_seen', sortOrder = 'desc' } = defineProps<ErrorsTableProps>()
|
|
12
|
+
|
|
13
|
+
// Helper functions
|
|
14
|
+
function getStatusClass(status) {
|
|
15
|
+
switch (status) {
|
|
16
|
+
case 'resolved':
|
|
17
|
+
return 'bg-green-50 text-green-700 ring-1 ring-inset ring-green-600/20 dark:bg-green-900/30 dark:text-green-400'
|
|
18
|
+
case 'ignored':
|
|
19
|
+
return 'bg-gray-50 text-gray-700 ring-1 ring-inset ring-gray-600/20 dark:bg-neutral-900/30 dark:text-neutral-400'
|
|
20
|
+
case 'unresolved':
|
|
21
|
+
default:
|
|
22
|
+
return 'bg-red-50 text-red-700 ring-1 ring-inset ring-red-600/20 dark:bg-red-900/30 dark:text-red-400'
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function getTypeClass(type) {
|
|
27
|
+
const typeLC = type.toLowerCase()
|
|
28
|
+
if (typeLC.includes('error') || typeLC.includes('exception')) {
|
|
29
|
+
return 'bg-red-50 text-red-700 ring-1 ring-inset ring-red-600/20 dark:bg-red-900/30 dark:text-red-400'
|
|
30
|
+
}
|
|
31
|
+
if (typeLC.includes('warning')) {
|
|
32
|
+
return 'bg-yellow-50 text-yellow-700 ring-1 ring-inset ring-yellow-600/20 dark:bg-yellow-900/30 dark:text-yellow-400'
|
|
33
|
+
}
|
|
34
|
+
if (typeLC.includes('info')) {
|
|
35
|
+
return 'bg-blue-50 text-blue-700 ring-1 ring-inset ring-blue-600/20 dark:bg-blue-900/30 dark:text-blue-400'
|
|
36
|
+
}
|
|
37
|
+
return 'bg-purple-50 text-purple-700 ring-1 ring-inset ring-purple-600/20 dark:bg-purple-900/30 dark:text-purple-400'
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function formatTimeAgo(dateString) {
|
|
41
|
+
const date = new Date(dateString)
|
|
42
|
+
const now = new Date()
|
|
43
|
+
const diffMs = now.getTime() - date.getTime()
|
|
44
|
+
const diffSecs = Math.floor(diffMs / 1000)
|
|
45
|
+
const diffMins = Math.floor(diffSecs / 60)
|
|
46
|
+
const diffHours = Math.floor(diffMins / 60)
|
|
47
|
+
const diffDays = Math.floor(diffHours / 24)
|
|
48
|
+
|
|
49
|
+
if (diffDays > 0) return `${diffDays}d ago`
|
|
50
|
+
if (diffHours > 0) return `${diffHours}h ago`
|
|
51
|
+
if (diffMins > 0) return `${diffMins}m ago`
|
|
52
|
+
return 'Just now'
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function truncateMessage(message, maxLength = 60) {
|
|
56
|
+
if (message.length <= maxLength) return message
|
|
57
|
+
return `${message.substring(0, maxLength)}...`
|
|
58
|
+
}
|
|
59
|
+
</script>
|
|
60
|
+
<div class="overflow-hidden">
|
|
61
|
+
<table class="min-w-full divide-gray-300 divide-y dark:divide-neutral-700">
|
|
62
|
+
<thead class="bg-gray-50 dark:bg-neutral-700">
|
|
63
|
+
<tr>
|
|
64
|
+
<th scope="col" class="pl-4 pr-3 py-3.5 sm:pl-6 font-semibold text-gray-900 text-left text-sm dark:text-neutral-200">
|
|
65
|
+
<button class="inline-flex items-center group" data-action="sort" data-column="type">
|
|
66
|
+
Error
|
|
67
|
+
<span class="group-focus:visible group-hover:visible flex-none ml-2 text-gray-400 rounded">
|
|
68
|
+
@if(sortBy == 'type')
|
|
69
|
+
<div class="{{ sortOrder == 'asc' ? 'i-hugeicons-arrow-up-02' : 'i-hugeicons-arrow-down-02' }} h-4 w-4"></div>
|
|
70
|
+
@else
|
|
71
|
+
<div class="h-4 w-4 i-hugeicons-arrows-up-down"></div>
|
|
72
|
+
@endif
|
|
73
|
+
</span>
|
|
74
|
+
</button>
|
|
75
|
+
</th>
|
|
76
|
+
<th scope="col" class="px-3 py-3.5 font-semibold text-gray-900 text-left text-sm dark:text-neutral-200">
|
|
77
|
+
<button class="inline-flex items-center group" data-action="sort" data-column="count">
|
|
78
|
+
Events
|
|
79
|
+
<span class="group-focus:visible group-hover:visible flex-none ml-2 text-gray-400 rounded">
|
|
80
|
+
@if(sortBy == 'count')
|
|
81
|
+
<div class="{{ sortOrder == 'asc' ? 'i-hugeicons-arrow-up-02' : 'i-hugeicons-arrow-down-02' }} h-4 w-4"></div>
|
|
82
|
+
@else
|
|
83
|
+
<div class="h-4 w-4 i-hugeicons-arrows-up-down"></div>
|
|
84
|
+
@endif
|
|
85
|
+
</span>
|
|
86
|
+
</button>
|
|
87
|
+
</th>
|
|
88
|
+
<th scope="col" class="px-3 py-3.5 font-semibold text-gray-900 text-left text-sm dark:text-neutral-200">
|
|
89
|
+
<button class="inline-flex items-center group" data-action="sort" data-column="last_seen">
|
|
90
|
+
Last Seen
|
|
91
|
+
<span class="group-focus:visible group-hover:visible flex-none ml-2 text-gray-400 rounded">
|
|
92
|
+
@if(sortBy == 'last_seen')
|
|
93
|
+
<div class="{{ sortOrder == 'asc' ? 'i-hugeicons-arrow-up-02' : 'i-hugeicons-arrow-down-02' }} h-4 w-4"></div>
|
|
94
|
+
@else
|
|
95
|
+
<div class="h-4 w-4 i-hugeicons-arrows-up-down"></div>
|
|
96
|
+
@endif
|
|
97
|
+
</span>
|
|
98
|
+
</button>
|
|
99
|
+
</th>
|
|
100
|
+
<th scope="col" class="px-3 py-3.5 font-semibold text-gray-900 text-left text-sm dark:text-neutral-200">
|
|
101
|
+
Status
|
|
102
|
+
</th>
|
|
103
|
+
<th scope="col" class="relative pl-3 pr-4 py-3.5 sm:pr-6">
|
|
104
|
+
<span class="sr-only">Actions</span>
|
|
105
|
+
</th>
|
|
106
|
+
</tr>
|
|
107
|
+
</thead>
|
|
108
|
+
<tbody class="bg-white dark:bg-neutral-800 divide-gray-200 divide-y dark:divide-neutral-700">
|
|
109
|
+
@foreach(errors as error)
|
|
110
|
+
<tr class="hover:bg-gray-50 dark:hover:bg-neutral-700 cursor-pointer" data-action="view" data-error-type="{{ error.type }}" data-error-message="{{ error.message }}">
|
|
111
|
+
<td class="pl-4 pr-3 py-4 sm:pl-6 text-sm">
|
|
112
|
+
<div class="flex flex-col">
|
|
113
|
+
<div class="flex gap-2 items-center">
|
|
114
|
+
<span class="inline-flex items-center rounded-md px-2 py-1 text-xs font-medium {{ getTypeClass(error.type) }}">
|
|
115
|
+
{{ error.type }}
|
|
116
|
+
</span>
|
|
117
|
+
</div>
|
|
118
|
+
<div class="mt-1 font-medium text-gray-900 dark:text-white">
|
|
119
|
+
{{ truncateMessage(error.message) }}
|
|
120
|
+
</div>
|
|
121
|
+
<div class="mt-0.5 text-gray-500 text-xs dark:text-neutral-400">
|
|
122
|
+
First seen: {{ formatTimeAgo(error.first_seen) }}
|
|
123
|
+
</div>
|
|
124
|
+
</div>
|
|
125
|
+
</td>
|
|
126
|
+
<td class="px-3 py-4 text-sm whitespace-nowrap">
|
|
127
|
+
<div class="flex items-center">
|
|
128
|
+
<span class="inline-flex items-center justify-center px-2 h-6 min-w-[24px] font-medium text-gray-700 text-xs dark:text-neutral-300 bg-gray-100 dark:bg-neutral-700 rounded-full">
|
|
129
|
+
{{ error.count }}
|
|
130
|
+
</span>
|
|
131
|
+
</div>
|
|
132
|
+
</td>
|
|
133
|
+
<td class="px-3 py-4 text-gray-500 text-sm whitespace-nowrap dark:text-neutral-300">
|
|
134
|
+
{{ formatTimeAgo(error.last_seen) }}
|
|
135
|
+
</td>
|
|
136
|
+
<td class="px-3 py-4 text-sm whitespace-nowrap">
|
|
137
|
+
<span class="inline-flex items-center rounded-md px-2 py-1 text-xs font-medium capitalize {{ getStatusClass(error.status) }}">
|
|
138
|
+
{{ error.status }}
|
|
139
|
+
</span>
|
|
140
|
+
</td>
|
|
141
|
+
<td class="relative pl-3 pr-4 py-4 sm:pr-6 font-medium text-right text-sm whitespace-nowrap">
|
|
142
|
+
<div class="flex items-center justify-end space-x-2">
|
|
143
|
+
@if(error.status != 'resolved')
|
|
144
|
+
<button type="button" title="Mark as resolved" class="text-green-400 dark:text-green-400 hover:text-green-600 dark:hover:text-green-300 duration-150 transition-colors" data-action="resolve" data-error-type="{{ error.type }}" data-error-message="{{ error.message }}">
|
|
145
|
+
<div class="h-5 w-5 i-hugeicons-checkmark-circle-02"></div>
|
|
146
|
+
</button>
|
|
147
|
+
@endif
|
|
148
|
+
@if(error.status == 'resolved')
|
|
149
|
+
<button type="button" title="Reopen" class="text-yellow-400 dark:text-yellow-400 hover:text-yellow-600 dark:hover:text-yellow-300 duration-150 transition-colors" data-action="unresolve" data-error-type="{{ error.type }}" data-error-message="{{ error.message }}">
|
|
150
|
+
<div class="h-5 w-5 i-hugeicons-refresh"></div>
|
|
151
|
+
</button>
|
|
152
|
+
@endif
|
|
153
|
+
@if(error.status != 'ignored')
|
|
154
|
+
<button type="button" title="Ignore" class="text-gray-400 dark:text-neutral-400 hover:text-gray-600 dark:hover:text-gray-300 duration-150 transition-colors" data-action="ignore" data-error-type="{{ error.type }}" data-error-message="{{ error.message }}">
|
|
155
|
+
<div class="h-5 w-5 i-hugeicons-eye-off"></div>
|
|
156
|
+
</button>
|
|
157
|
+
@endif
|
|
158
|
+
<button type="button" title="Delete" class="text-red-400 dark:text-red-400 hover:text-red-600 dark:hover:text-red-300 duration-150 transition-colors" data-action="delete" data-error-type="{{ error.type }}" data-error-message="{{ error.message }}">
|
|
159
|
+
<div class="h-5 w-5 i-hugeicons-waste"></div>
|
|
160
|
+
</button>
|
|
161
|
+
</div>
|
|
162
|
+
</td>
|
|
163
|
+
</tr>
|
|
164
|
+
@endforeach
|
|
165
|
+
@if(errors.length == 0)
|
|
166
|
+
<tr>
|
|
167
|
+
<td colspan="5" class="px-6 py-12 text-center">
|
|
168
|
+
<div class="flex flex-col items-center">
|
|
169
|
+
<div class="h-12 w-12 text-green-400 i-hugeicons-checkmark-circle-02"></div>
|
|
170
|
+
<h3 class="mt-2 font-medium text-gray-900 text-sm dark:text-white">No errors found</h3>
|
|
171
|
+
<p class="mt-1 text-gray-500 text-sm dark:text-neutral-400">
|
|
172
|
+
@if(searchQuery || statusFilter != 'all' || typeFilter != 'all')
|
|
173
|
+
Try adjusting your filters
|
|
174
|
+
@else
|
|
175
|
+
Your application is running smoothly!
|
|
176
|
+
@endif
|
|
177
|
+
</p>
|
|
178
|
+
</div>
|
|
179
|
+
</td>
|
|
180
|
+
</tr>
|
|
181
|
+
@endif
|
|
182
|
+
</tbody>
|
|
183
|
+
</table>
|
|
184
|
+
</div>
|