@stacksjs/defaults 0.70.207 → 0.70.208
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/TODO.md +21 -0
- package/ai/AGENTS.md +79 -0
- package/ai/README.md +45 -0
- package/ai/claude/launch.json +12 -0
- package/ai/skills/stacks-actions/SKILL.md +128 -0
- package/ai/skills/stacks-ai/SKILL.md +276 -0
- package/ai/skills/stacks-alias/SKILL.md +94 -0
- package/ai/skills/stacks-analytics/SKILL.md +91 -0
- package/ai/skills/stacks-api/SKILL.md +738 -0
- package/ai/skills/stacks-arrays/SKILL.md +277 -0
- package/ai/skills/stacks-auth/SKILL.md +422 -0
- package/ai/skills/stacks-auto-imports/SKILL.md +138 -0
- package/ai/skills/stacks-brandkit/SKILL.md +811 -0
- package/ai/skills/stacks-browse/SKILL.md +127 -0
- package/ai/skills/stacks-browse/scripts/browse.ts +492 -0
- package/ai/skills/stacks-browser/SKILL.md +145 -0
- package/ai/skills/stacks-buddy/SKILL.md +676 -0
- package/ai/skills/stacks-build/SKILL.md +163 -0
- package/ai/skills/stacks-cache/SKILL.md +125 -0
- package/ai/skills/stacks-calendar/SKILL.md +113 -0
- package/ai/skills/stacks-chat/SKILL.md +371 -0
- package/ai/skills/stacks-cli/SKILL.md +112 -0
- package/ai/skills/stacks-cloud/SKILL.md +192 -0
- package/ai/skills/stacks-cms/SKILL.md +217 -0
- package/ai/skills/stacks-collections/SKILL.md +82 -0
- package/ai/skills/stacks-commerce/SKILL.md +114 -0
- package/ai/skills/stacks-composables/SKILL.md +161 -0
- package/ai/skills/stacks-config/SKILL.md +144 -0
- package/ai/skills/stacks-configuration/SKILL.md +154 -0
- package/ai/skills/stacks-cron/SKILL.md +123 -0
- package/ai/skills/stacks-crosswind/SKILL.md +190 -0
- package/ai/skills/stacks-dashboard/SKILL.md +173 -0
- package/ai/skills/stacks-database/SKILL.md +286 -0
- package/ai/skills/stacks-datetime/SKILL.md +269 -0
- package/ai/skills/stacks-dependencies/SKILL.md +111 -0
- package/ai/skills/stacks-deploy/SKILL.md +102 -0
- package/ai/skills/stacks-design-brutalist/SKILL.md +110 -0
- package/ai/skills/stacks-design-minimalist/SKILL.md +115 -0
- package/ai/skills/stacks-design-output/SKILL.md +55 -0
- package/ai/skills/stacks-design-soft/SKILL.md +156 -0
- package/ai/skills/stacks-design-taste/SKILL.md +1012 -0
- package/ai/skills/stacks-design-taste-codex/SKILL.md +294 -0
- package/ai/skills/stacks-desktop/SKILL.md +78 -0
- package/ai/skills/stacks-development/SKILL.md +298 -0
- package/ai/skills/stacks-dns/SKILL.md +149 -0
- package/ai/skills/stacks-docs/SKILL.md +109 -0
- package/ai/skills/stacks-email/SKILL.md +236 -0
- package/ai/skills/stacks-enums/SKILL.md +100 -0
- package/ai/skills/stacks-env/SKILL.md +181 -0
- package/ai/skills/stacks-error-handling/SKILL.md +137 -0
- package/ai/skills/stacks-events/SKILL.md +228 -0
- package/ai/skills/stacks-faker/SKILL.md +158 -0
- package/ai/skills/stacks-git/SKILL.md +158 -0
- package/ai/skills/stacks-guard/SKILL.md +98 -0
- package/ai/skills/stacks-health/SKILL.md +75 -0
- package/ai/skills/stacks-http/SKILL.md +316 -0
- package/ai/skills/stacks-i18n/SKILL.md +198 -0
- package/ai/skills/stacks-image-to-code/SKILL.md +629 -0
- package/ai/skills/stacks-imagegen-mobile/SKILL.md +1474 -0
- package/ai/skills/stacks-imagegen-web/SKILL.md +998 -0
- package/ai/skills/stacks-investigate/SKILL.md +119 -0
- package/ai/skills/stacks-jobs/SKILL.md +136 -0
- package/ai/skills/stacks-lint/SKILL.md +184 -0
- package/ai/skills/stacks-listeners/SKILL.md +99 -0
- package/ai/skills/stacks-logging/SKILL.md +78 -0
- package/ai/skills/stacks-mail/SKILL.md +120 -0
- package/ai/skills/stacks-middleware/SKILL.md +249 -0
- package/ai/skills/stacks-migrations/SKILL.md +105 -0
- package/ai/skills/stacks-models/SKILL.md +267 -0
- package/ai/skills/stacks-new-feature/SKILL.md +206 -0
- package/ai/skills/stacks-notifications/SKILL.md +210 -0
- package/ai/skills/stacks-objects/SKILL.md +205 -0
- package/ai/skills/stacks-office-hours/SKILL.md +134 -0
- package/ai/skills/stacks-orm/SKILL.md +342 -0
- package/ai/skills/stacks-path/SKILL.md +118 -0
- package/ai/skills/stacks-payments/SKILL.md +373 -0
- package/ai/skills/stacks-plan-review/SKILL.md +152 -0
- package/ai/skills/stacks-plugins/SKILL.md +149 -0
- package/ai/skills/stacks-push/SKILL.md +376 -0
- package/ai/skills/stacks-query-builder/SKILL.md +128 -0
- package/ai/skills/stacks-queue/SKILL.md +559 -0
- package/ai/skills/stacks-realtime/SKILL.md +442 -0
- package/ai/skills/stacks-redesign/SKILL.md +182 -0
- package/ai/skills/stacks-registry/SKILL.md +58 -0
- package/ai/skills/stacks-repl/SKILL.md +80 -0
- package/ai/skills/stacks-retro/SKILL.md +122 -0
- package/ai/skills/stacks-review/SKILL.md +135 -0
- package/ai/skills/stacks-router/SKILL.md +231 -0
- package/ai/skills/stacks-routes/SKILL.md +105 -0
- package/ai/skills/stacks-scaffolding/SKILL.md +162 -0
- package/ai/skills/stacks-scheduler/SKILL.md +363 -0
- package/ai/skills/stacks-search-engine/SKILL.md +112 -0
- package/ai/skills/stacks-security/SKILL.md +129 -0
- package/ai/skills/stacks-security-audit/SKILL.md +128 -0
- package/ai/skills/stacks-server/SKILL.md +458 -0
- package/ai/skills/stacks-shell/SKILL.md +62 -0
- package/ai/skills/stacks-slug/SKILL.md +87 -0
- package/ai/skills/stacks-sms/SKILL.md +385 -0
- package/ai/skills/stacks-socials/SKILL.md +303 -0
- package/ai/skills/stacks-storage/SKILL.md +576 -0
- package/ai/skills/stacks-strings/SKILL.md +416 -0
- package/ai/skills/stacks-stx/SKILL.md +176 -0
- package/ai/skills/stacks-technical-diagrams/LICENSE +22 -0
- package/ai/skills/stacks-technical-diagrams/SKILL.md +290 -0
- package/ai/skills/stacks-technical-diagrams/agents/openai.yaml +4 -0
- package/ai/skills/stacks-technical-diagrams/assets/template.html +1252 -0
- package/ai/skills/stacks-technical-diagrams/bin/technical-diagrams.mjs +289 -0
- package/ai/skills/stacks-technical-diagrams/bunfig.toml +1 -0
- package/ai/skills/stacks-technical-diagrams/examples/agent-run.lifecycle.json +64 -0
- package/ai/skills/stacks-technical-diagrams/examples/agent-tool-call.workflow.json +88 -0
- package/ai/skills/stacks-technical-diagrams/examples/cache-miss-request.sequence.json +75 -0
- package/ai/skills/stacks-technical-diagrams/examples/product-analytics.dataflow.json +70 -0
- package/ai/skills/stacks-technical-diagrams/examples/web-app.architecture.json +41 -0
- package/ai/skills/stacks-technical-diagrams/renderers/architecture/grid.mjs +62 -0
- package/ai/skills/stacks-technical-diagrams/renderers/architecture/render-architecture.mjs +371 -0
- package/ai/skills/stacks-technical-diagrams/renderers/dataflow/README.md +82 -0
- package/ai/skills/stacks-technical-diagrams/renderers/dataflow/render-dataflow.mjs +295 -0
- package/ai/skills/stacks-technical-diagrams/renderers/lifecycle/README.md +91 -0
- package/ai/skills/stacks-technical-diagrams/renderers/lifecycle/render-lifecycle.mjs +384 -0
- package/ai/skills/stacks-technical-diagrams/renderers/sequence/README.md +84 -0
- package/ai/skills/stacks-technical-diagrams/renderers/sequence/render-sequence.mjs +257 -0
- package/ai/skills/stacks-technical-diagrams/renderers/shared/cli.mjs +42 -0
- package/ai/skills/stacks-technical-diagrams/renderers/shared/generated-validators.mjs +13 -0
- package/ai/skills/stacks-technical-diagrams/renderers/shared/geometry.mjs +230 -0
- package/ai/skills/stacks-technical-diagrams/renderers/shared/layout-report.mjs +40 -0
- package/ai/skills/stacks-technical-diagrams/renderers/shared/utils.mjs +88 -0
- package/ai/skills/stacks-technical-diagrams/renderers/shared/validator.mjs +40 -0
- package/ai/skills/stacks-technical-diagrams/renderers/workflow/README.md +103 -0
- package/ai/skills/stacks-technical-diagrams/renderers/workflow/render-workflow.mjs +481 -0
- package/ai/skills/stacks-technical-diagrams/schemas/README.md +68 -0
- package/ai/skills/stacks-technical-diagrams/schemas/architecture.schema.json +121 -0
- package/ai/skills/stacks-technical-diagrams/schemas/common.schema.json +43 -0
- package/ai/skills/stacks-technical-diagrams/schemas/dataflow.schema.json +221 -0
- package/ai/skills/stacks-technical-diagrams/schemas/lifecycle.schema.json +241 -0
- package/ai/skills/stacks-technical-diagrams/schemas/sequence.schema.json +186 -0
- package/ai/skills/stacks-technical-diagrams/schemas/workflow.schema.json +332 -0
- package/ai/skills/stacks-technical-diagrams/scripts/check-render-output.mjs +297 -0
- package/ai/skills/stacks-technical-diagrams/scripts/render-examples.mjs +28 -0
- package/ai/skills/stacks-testing/SKILL.md +129 -0
- package/ai/skills/stacks-tunnel/SKILL.md +125 -0
- package/ai/skills/stacks-types/SKILL.md +178 -0
- package/ai/skills/stacks-ui/SKILL.md +246 -0
- package/ai/skills/stacks-utils/SKILL.md +444 -0
- package/ai/skills/stacks-validation/SKILL.md +371 -0
- package/ai/skills/stacks-whois/SKILL.md +315 -0
- package/assets/world-map-data.ts +121 -0
- package/bootstrap.ts +114 -0
- package/docs/api-examples.md +46 -0
- package/docs/index.md +24 -0
- package/docs/markdown-examples.md +87 -0
- package/functions/analytics.ts +97 -0
- package/functions/api.ts +143 -0
- package/functions/auth.ts +208 -0
- package/functions/billing/payments.ts +149 -0
- package/functions/blog.ts +120 -0
- package/functions/cms/categorizables.ts +107 -0
- package/functions/cms/pages.ts +108 -0
- package/functions/cms/posts.ts +100 -0
- package/functions/cms/taggables.ts +102 -0
- package/functions/commerce/coupons.ts +128 -0
- package/functions/commerce/customers.ts +128 -0
- package/functions/commerce/gift-cards.ts +119 -0
- package/functions/commerce/orders.ts +112 -0
- package/functions/commerce/payments.ts +119 -0
- package/functions/commerce/products/categories.ts +123 -0
- package/functions/commerce/products/manufacturers.ts +123 -0
- package/functions/commerce/products/products.ts +123 -0
- package/functions/commerce/products/reviews.ts +123 -0
- package/functions/commerce/products/units.ts +123 -0
- package/functions/commerce/products/variants.ts +123 -0
- package/functions/commerce/shippings/delivery-routes.ts +123 -0
- package/functions/commerce/shippings/digital-deliveries.ts +119 -0
- package/functions/commerce/shippings/drivers.ts +123 -0
- package/functions/commerce/shippings/license-keys.ts +123 -0
- package/functions/commerce/shippings/shipping-methods.ts +123 -0
- package/functions/commerce/shippings/shipping-rates.ts +119 -0
- package/functions/commerce/shippings/shipping-zones.ts +119 -0
- package/functions/commerce/taxes.ts +119 -0
- package/functions/commerce/waitlist/products.ts +123 -0
- package/functions/commerce/waitlist/restaurants.ts +123 -0
- package/functions/craft.ts +107 -0
- package/functions/dashboard.ts +153 -0
- package/functions/inbox.ts +95 -0
- package/functions/jobs.ts +86 -0
- package/functions/monitoring/errors.ts +295 -0
- package/functions/queue.ts +111 -0
- package/functions/realtime/websockets.ts +96 -0
- package/functions/realtime.ts +52 -0
- package/functions/releases.ts +49 -0
- package/functions/search.ts +126 -0
- package/functions/toasts.ts +95 -0
- package/functions/uploads.ts +216 -0
- package/ide/.gitignore +4 -0
- package/ide/cursor/rules/auto-imports.mdc +574 -0
- package/ide/cursor/rules/code-style.mdc +12 -0
- package/ide/cursor/rules/documentation.mdc +9 -0
- package/ide/cursor/rules/error-handling-validation.mdc +11 -0
- package/ide/cursor/rules/key-conventions.mdc +11 -0
- package/ide/cursor/rules/project-structure.mdc +169 -0
- package/ide/cursor/rules/readme.mdc +318 -0
- package/ide/cursor/rules/syntax-formatting.mdc +9 -0
- package/ide/cursor/rules/testing.mdc +10 -0
- package/ide/cursor/rules/typescript.mdc +9 -0
- package/ide/cursor/rules/ui-styling.mdc +0 -0
- package/ide/dictionary.txt +397 -0
- package/ide/jetbrains/.fleet/settings.json +4 -0
- package/ide/jetbrains/.idea/.gitignore +5 -0
- package/ide/jetbrains/.idea/.name +1 -0
- package/ide/jetbrains/.idea/inspectionProfiles/Project_Default.xml +6 -0
- package/ide/jetbrains/.idea/jsLinters/eslint.xml +7 -0
- package/ide/jetbrains/.idea/modules.xml +8 -0
- package/ide/jetbrains/.idea/stacks.iml +22 -0
- package/ide/jetbrains/.idea/vcs.xml +6 -0
- package/ide/jetbrains/.idea/webResources.xml +14 -0
- package/ide/jetbrains/IntelliJ IDEA Global Settings +0 -0
- package/ide/jetbrains/installed.txt +4 -0
- package/ide/jetbrains/options/github-copilot.xml +5 -0
- package/ide/jetbrains/options/nodejs.xml +7 -0
- package/ide/jetbrains/options/templates.xml +124 -0
- package/ide/jetbrains/templates/JavaScript.xml +6 -0
- package/ide/jetbrains/templates/Stacks.xml +8 -0
- package/ide/vscode/.vscode/README.md +23 -0
- package/ide/vscode/.vscode/extensions.json +5 -0
- package/ide/vscode/.vscode/settings.json +176 -0
- package/ide/vscode/.vscode/stacks.code-snippets +181 -0
- package/ide/vscode/LICENSE.md +21 -0
- package/ide/vscode/README.md +36 -0
- package/ide/vscode/logo.png +0 -0
- package/ide/vscode/package.json +79 -0
- package/ide/zed/.zed/settings.json +139 -0
- package/lang/README.md +28 -0
- package/lang/de.yml +14 -0
- package/lang/en.yml +15 -0
- package/package.json +19 -3
- package/project/bootstrap +161 -0
- package/project/buddy +175 -0
- package/project/storage/framework/tsconfig.app.json +50 -0
- package/project/storage/framework/tsconfig.base.json +58 -0
- package/routes/core.ts +78 -0
- package/routes/dashboard-api.ts +233 -0
- package/routes/dashboard.ts +739 -0
- package/routes/email.ts +129 -0
- package/stores/[name].stx +16 -0
- package/stores/git.ts +71 -0
- package/stores/payment.ts +474 -0
- package/stores/queue.ts +43 -0
- package/stores/user.ts +29 -0
- package/stx-components-plugin.ts +25 -0
- package/styles/design-tokens.css +597 -0
- package/types/dashboard.ts +70 -0
- package/types/defaults.ts +438 -0
- package/vcs/github/CODE_OF_CONDUCT.md +83 -0
- package/vcs/github/CONTRIBUTING.md +187 -0
- package/vcs/github/EXPLANATIONS.md +41 -0
- package/vcs/github/FUNDING.yml +1 -0
- package/vcs/github/ISSUE_TEMPLATE/bug_report.yml +49 -0
- package/vcs/github/ISSUE_TEMPLATE/config.yml +10 -0
- package/vcs/github/ISSUE_TEMPLATE/feature_request.yml +44 -0
- package/vcs/github/SECURITY.md +70 -0
- package/vcs/github/renovate.json +5 -0
- package/vcs/github/stale.yml +14 -0
- package/vcs/github/workflows/README.md +16 -0
- package/vcs/github/workflows/ci.yml +114 -0
- package/vcs/github/workflows/export-size.yml +25 -0
- package/vcs/github/workflows/labeler.yml +13 -0
- package/vcs/github/workflows/release.yml +219 -0
- package/views/[...all].stx +8 -0
- package/views/about.md +3 -0
- package/views/auth/login.stx +1 -0
- package/views/auth/signup.stx +85 -0
- package/views/dashboard/.discovered-models.json +542 -0
- package/views/dashboard/AUDIT.md +904 -0
- package/views/dashboard/[...all].stx +89 -0
- package/views/dashboard/access-tokens/index.stx +177 -0
- package/views/dashboard/actions/index.stx +129 -0
- package/views/dashboard/analytics/blog/index.stx +356 -0
- package/views/dashboard/analytics/browsers/index.stx +263 -0
- package/views/dashboard/analytics/commerce/sales/index.stx +329 -0
- package/views/dashboard/analytics/commerce/web/index.stx +379 -0
- package/views/dashboard/analytics/countries/index.stx +289 -0
- package/views/dashboard/analytics/devices/index.stx +305 -0
- package/views/dashboard/analytics/events/index.stx +536 -0
- package/views/dashboard/analytics/index.stx +88 -0
- package/views/dashboard/analytics/marketing/index.stx +315 -0
- package/views/dashboard/analytics/pages/index.stx +271 -0
- package/views/dashboard/analytics/referrers/index.stx +319 -0
- package/views/dashboard/analytics/web/index.stx +356 -0
- package/views/dashboard/buddy/index.stx +198 -0
- package/views/dashboard/ci/index.stx +462 -0
- package/views/dashboard/cloud/index.stx +452 -0
- package/views/dashboard/commands/index.stx +295 -0
- package/views/dashboard/commerce/categories/index.stx +406 -0
- package/views/dashboard/commerce/coupons/index.stx +485 -0
- package/views/dashboard/commerce/customers/index.stx +410 -0
- package/views/dashboard/commerce/dashboard/index.stx +287 -0
- package/views/dashboard/commerce/delivery/delivery-routes.stx +305 -0
- package/views/dashboard/commerce/delivery/digital-delivery.stx +332 -0
- package/views/dashboard/commerce/delivery/drivers.stx +397 -0
- package/views/dashboard/commerce/delivery/index.stx +18 -0
- package/views/dashboard/commerce/delivery/license-keys.stx +380 -0
- package/views/dashboard/commerce/delivery/shipping-methods.stx +346 -0
- package/views/dashboard/commerce/delivery/shipping-rates.stx +338 -0
- package/views/dashboard/commerce/delivery/shipping-zones.stx +302 -0
- package/views/dashboard/commerce/delivery/tabs.ts +25 -0
- package/views/dashboard/commerce/gift-cards/index.stx +561 -0
- package/views/dashboard/commerce/manufacturers/index.stx +308 -0
- package/views/dashboard/commerce/orders/index.stx +247 -0
- package/views/dashboard/commerce/payments/index.stx +535 -0
- package/views/dashboard/commerce/pos/index.stx +653 -0
- package/views/dashboard/commerce/printers/devices/index.stx +273 -0
- package/views/dashboard/commerce/printers/receipts/index.stx +308 -0
- package/views/dashboard/commerce/products/detail.stx +563 -0
- package/views/dashboard/commerce/products/index.stx +370 -0
- package/views/dashboard/commerce/reviews/index.stx +656 -0
- package/views/dashboard/commerce/reviews/index.ts +0 -0
- package/views/dashboard/commerce/taxes/index.stx +377 -0
- package/views/dashboard/commerce/units/index.stx +317 -0
- package/views/dashboard/commerce/variants/index.stx +319 -0
- package/views/dashboard/commerce/waitlist/products.stx +942 -0
- package/views/dashboard/commerce/waitlist/restaurant.stx +1024 -0
- package/views/dashboard/components/index.stx +330 -0
- package/views/dashboard/composables/index.ts +19 -0
- package/views/dashboard/composables/useChart.ts +77 -0
- package/views/dashboard/composables/useNavigation.ts +99 -0
- package/views/dashboard/composables/useRole.ts +58 -0
- package/views/dashboard/composables/useTheme.ts +74 -0
- package/views/dashboard/content/authors/index.stx +171 -0
- package/views/dashboard/content/blog/index.stx +493 -0
- package/views/dashboard/content/categories/index.stx +169 -0
- package/views/dashboard/content/comments/index.stx +189 -0
- package/views/dashboard/content/dashboard.stx +383 -0
- package/views/dashboard/content/files/index.stx +706 -0
- package/views/dashboard/content/pages/index.stx +174 -0
- package/views/dashboard/content/posts/index.stx +269 -0
- package/views/dashboard/content/seo/index.stx +240 -0
- package/views/dashboard/content/tags/index.stx +167 -0
- package/views/dashboard/data/activity/index.stx +261 -0
- package/views/dashboard/data/dashboard/index.stx +116 -0
- package/views/dashboard/data/subscribers.stx +270 -0
- package/views/dashboard/data/teams.stx +275 -0
- package/views/dashboard/data/users.stx +279 -0
- package/views/dashboard/dependencies/index.stx +178 -0
- package/views/dashboard/deployments/[id].stx +234 -0
- package/views/dashboard/deployments/index.stx +9 -0
- package/views/dashboard/dns/index.stx +163 -0
- package/views/dashboard/environment/index.stx +283 -0
- package/views/dashboard/errors/index.stx +274 -0
- package/views/dashboard/forgot-password.stx +57 -0
- package/views/dashboard/functions/index.stx +159 -0
- package/views/dashboard/health/index.stx +248 -0
- package/views/dashboard/inbox/activity.stx +350 -0
- package/views/dashboard/inbox/index.stx +452 -0
- package/views/dashboard/inbox/settings.stx +290 -0
- package/views/dashboard/index.stx +252 -0
- package/views/dashboard/insights/index.stx +529 -0
- package/views/dashboard/jobs/[id].stx +430 -0
- package/views/dashboard/jobs/history.stx +222 -0
- package/views/dashboard/jobs/index.stx +214 -0
- package/views/dashboard/kanban/[id].stx +899 -0
- package/views/dashboard/kanban/index.stx +260 -0
- package/views/dashboard/layouts/default.stx +565 -0
- package/views/dashboard/layouts/guest.stx +10 -0
- package/views/dashboard/login.stx +48 -0
- package/views/dashboard/logs/index.stx +540 -0
- package/views/dashboard/mailboxes/index.stx +149 -0
- package/views/dashboard/management/permissions/index.stx +490 -0
- package/views/dashboard/marketing/campaigns/index.stx +604 -0
- package/views/dashboard/marketing/lists/index.stx +514 -0
- package/views/dashboard/marketing/reviews/index.stx +475 -0
- package/views/dashboard/marketing/social-posts/index.stx +560 -0
- package/views/dashboard/models/[model].stx +195 -0
- package/views/dashboard/models/index.stx +159 -0
- package/views/dashboard/monitoring/errors/index.stx +415 -0
- package/views/dashboard/notifications/dashboard.stx +383 -0
- package/views/dashboard/notifications/email.stx +336 -0
- package/views/dashboard/notifications/history.stx +373 -0
- package/views/dashboard/notifications/sms.stx +332 -0
- package/views/dashboard/packages/index.stx +195 -0
- package/views/dashboard/queries/[id].stx +381 -0
- package/views/dashboard/queries/history.stx +227 -0
- package/views/dashboard/queries/index.stx +335 -0
- package/views/dashboard/queries/slow.stx +318 -0
- package/views/dashboard/queue/index.stx +427 -0
- package/views/dashboard/realtime/index.stx +429 -0
- package/views/dashboard/register.stx +46 -0
- package/views/dashboard/releases/index.stx +389 -0
- package/views/dashboard/requests/index.stx +462 -0
- package/views/dashboard/serverless/index.stx +475 -0
- package/views/dashboard/servers/[id].stx +299 -0
- package/views/dashboard/servers/index.stx +483 -0
- package/views/dashboard/settings/billing.stx +50 -0
- package/views/dashboard/settings/index.stx +256 -0
- package/views/dashboard/settings/mail.stx +252 -0
- package/views/dashboard/stores/auth.ts +123 -0
- package/views/dashboard/stores/ci.ts +342 -0
- package/views/dashboard/stores/index.ts +129 -0
- package/views/dashboard/stores/kanban.ts +723 -0
- package/views/dashboard/stores/rbac.ts +350 -0
- package/views/dashboard/stx.config.ts +34 -0
- package/views/dashboard/teams/[id].stx +170 -0
- package/views/forum/category.stx +92 -0
- package/views/forum/index.stx +209 -0
- package/views/forum/new-topic.stx +113 -0
- package/views/forum/profile.stx +1 -0
- package/views/forum/topic.stx +143 -0
- package/views/hello-world/[name].stx +47 -0
- package/views/index.stx +21 -0
- package/views/system-tray/index.stx +147 -0
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
@extends('layouts/default')
|
|
2
|
+
|
|
3
|
+
@section('content')
|
|
4
|
+
@title('Dashboard - Commerce Categories')
|
|
5
|
+
<div class="p-6 space-y-6">
|
|
6
|
+
|
|
7
|
+
<PageHeader title="Categories" description="Manage your product categories">
|
|
8
|
+
<template #actions>
|
|
9
|
+
<Button variant="primary" @click="openAddModal()">
|
|
10
|
+
<div class="h-4 w-4 i-hugeicons-plus-sign"></div>
|
|
11
|
+
Add Category
|
|
12
|
+
</Button>
|
|
13
|
+
</template>
|
|
14
|
+
</PageHeader>
|
|
15
|
+
|
|
16
|
+
<!-- Filters -->
|
|
17
|
+
<div class="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between mt-6">
|
|
18
|
+
<div class="relative max-w-sm">
|
|
19
|
+
<div class="flex absolute inset-y-0 left-0 items-center pl-3 pointer-events-none">
|
|
20
|
+
<div class="h-5 w-5 text-gray-400 i-hugeicons-search-01"></div>
|
|
21
|
+
</div>
|
|
22
|
+
<input
|
|
23
|
+
x-model="searchQuery"
|
|
24
|
+
@input="resetPage()"
|
|
25
|
+
type="text"
|
|
26
|
+
class="block pl-10 pr-3 py-1.5 w-full text-gray-900 sm:leading-6 sm:text-sm dark:text-white placeholder:text-gray-400 dark:placeholder:text-neutral-500 dark:bg-neutral-800 border-0 ring-1 ring-gray-300 ring-inset rounded-md dark:ring-neutral-700 focus:ring-2 focus:ring-blue-600 focus:ring-inset"
|
|
27
|
+
placeholder="Search categories..."
|
|
28
|
+
/>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<div class="flex flex-col gap-4 sm:flex-row">
|
|
32
|
+
<select
|
|
33
|
+
x-model="featuredFilter"
|
|
34
|
+
class="block pl-3 pr-10 py-1.5 w-full text-gray-900 sm:leading-6 sm:text-sm dark:text-white dark:bg-neutral-800 border-0 ring-1 ring-gray-300 ring-inset rounded-md dark:ring-neutral-700 focus:ring-2 focus:ring-blue-600 focus:ring-inset"
|
|
35
|
+
>
|
|
36
|
+
<option value="all">All Categories</option>
|
|
37
|
+
<option value="featured">Active Only</option>
|
|
38
|
+
<option value="not-featured">Inactive Only</option>
|
|
39
|
+
</select>
|
|
40
|
+
|
|
41
|
+
<select
|
|
42
|
+
x-model.number="itemsPerPage"
|
|
43
|
+
class="block pl-3 pr-10 py-1.5 w-full text-gray-900 sm:leading-6 sm:text-sm dark:text-white dark:bg-neutral-800 border-0 ring-1 ring-gray-300 ring-inset rounded-md dark:ring-neutral-700 focus:ring-2 focus:ring-blue-600 focus:ring-inset"
|
|
44
|
+
>
|
|
45
|
+
<option value="5">5 per page</option>
|
|
46
|
+
<option value="10">10 per page</option>
|
|
47
|
+
<option value="25">25 per page</option>
|
|
48
|
+
<option value="50">50 per page</option>
|
|
49
|
+
</select>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
<!-- Categories table -->
|
|
54
|
+
<div class="flow-root mt-6">
|
|
55
|
+
<div class="overflow-x-auto -mx-4 -my-2 sm:-mx-6 lg:-mx-8">
|
|
56
|
+
<div class="inline-block py-2 sm:px-6 lg:px-8 min-w-full align-middle">
|
|
57
|
+
<div class="overflow-hidden ring-1 ring-black ring-opacity-5 sm:rounded-lg shadow">
|
|
58
|
+
<CategoriesTable
|
|
59
|
+
:categories="paginatedCategories"
|
|
60
|
+
:searchQuery="searchQuery"
|
|
61
|
+
:featuredFilter="featuredFilter"
|
|
62
|
+
:sortBy="sortBy"
|
|
63
|
+
:sortOrder="sortOrder"
|
|
64
|
+
:currentPage="currentPage"
|
|
65
|
+
:itemsPerPage="itemsPerPage"
|
|
66
|
+
@toggle-sort="toggleSort"
|
|
67
|
+
@view-category="viewCategory"
|
|
68
|
+
@edit-category="editCategory"
|
|
69
|
+
@delete-category="handleDeleteCategory"
|
|
70
|
+
/>
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
</div>
|
|
75
|
+
|
|
76
|
+
<div class="px-4 py-3 bg-gray-50 dark:bg-neutral-900 border-gray-200 border-t dark:border-neutral-700">
|
|
77
|
+
<Pagination
|
|
78
|
+
:currentPage="currentPage"
|
|
79
|
+
:totalItems="totalItems"
|
|
80
|
+
:itemsPerPage="itemsPerPage"
|
|
81
|
+
@prev="handlePrevPage"
|
|
82
|
+
@next="handleNextPage"
|
|
83
|
+
@page="handlePageChange"
|
|
84
|
+
/>
|
|
85
|
+
</div>
|
|
86
|
+
|
|
87
|
+
<!-- Add / Edit Category Modal — kept mounted so form state survives toggles. -->
|
|
88
|
+
<div :show="showAddModal" class="fixed inset-0 overflow-y-auto z-10">
|
|
89
|
+
<div class="flex items-end justify-center sm:items-center p-4 sm:p-0 min-h-full text-center">
|
|
90
|
+
<div class="fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity" @click="closeAddModal()"></div>
|
|
91
|
+
|
|
92
|
+
<div class="overflow-hidden relative pb-4 pt-5 px-4 sm:my-8 sm:p-6 sm:max-w-lg sm:w-full text-left bg-white dark:bg-neutral-800 rounded-lg shadow-xl transition-all transform">
|
|
93
|
+
<div>
|
|
94
|
+
<div class="mt-3 sm:mt-5 text-center">
|
|
95
|
+
<h3 class="font-semibold leading-6 text-base text-gray-900 dark:text-white">{{ isEditing() ? 'Edit Category' : 'Add New Category' }}</h3>
|
|
96
|
+
<div class="mt-4">
|
|
97
|
+
<div class="space-y-4">
|
|
98
|
+
<div>
|
|
99
|
+
<label for="category-name" class="block font-medium leading-6 text-gray-900 text-left text-sm dark:text-neutral-200">Name</label>
|
|
100
|
+
<div class="mt-2">
|
|
101
|
+
<input
|
|
102
|
+
type="text"
|
|
103
|
+
id="category-name"
|
|
104
|
+
x-model="newCategoryName"
|
|
105
|
+
class="block py-1.5 w-full text-gray-900 sm:leading-6 sm:text-sm dark:text-white placeholder:text-gray-400 dark:bg-neutral-700 border-0 ring-1 ring-gray-300 ring-inset rounded-md dark:ring-neutral-600 focus:ring-2 focus:ring-blue-600 focus:ring-inset shadow-sm"
|
|
106
|
+
/>
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
<div>
|
|
110
|
+
<label for="category-description" class="block font-medium leading-6 text-gray-900 text-left text-sm dark:text-neutral-200">Description</label>
|
|
111
|
+
<div class="mt-2">
|
|
112
|
+
<textarea
|
|
113
|
+
id="category-description"
|
|
114
|
+
x-model="newCategoryDescription"
|
|
115
|
+
rows="3"
|
|
116
|
+
class="block py-1.5 w-full text-gray-900 sm:leading-6 sm:text-sm dark:text-white placeholder:text-gray-400 dark:bg-neutral-700 border-0 ring-1 ring-gray-300 ring-inset rounded-md dark:ring-neutral-600 focus:ring-2 focus:ring-blue-600 focus:ring-inset shadow-sm"
|
|
117
|
+
></textarea>
|
|
118
|
+
</div>
|
|
119
|
+
</div>
|
|
120
|
+
<div>
|
|
121
|
+
<label for="category-image" class="block font-medium leading-6 text-gray-900 text-left text-sm dark:text-neutral-200">Image</label>
|
|
122
|
+
<div class="mt-2">
|
|
123
|
+
<div class="flex gap-3 items-center">
|
|
124
|
+
<input
|
|
125
|
+
type="text"
|
|
126
|
+
id="category-image"
|
|
127
|
+
x-model="newCategoryImageUrl"
|
|
128
|
+
placeholder="/images/categories/your-category.jpg"
|
|
129
|
+
class="block py-1.5 w-full text-gray-900 sm:leading-6 sm:text-sm dark:text-white placeholder:text-gray-400 dark:bg-neutral-700 border-0 ring-1 ring-gray-300 ring-inset rounded-md dark:ring-neutral-600 focus:ring-2 focus:ring-blue-600 focus:ring-inset shadow-sm"
|
|
130
|
+
/>
|
|
131
|
+
<span class="text-gray-500 dark:text-neutral-400">or</span>
|
|
132
|
+
<label for="file-upload" class="px-2.5 py-1.5 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 cursor-pointer">
|
|
133
|
+
Browse
|
|
134
|
+
<input
|
|
135
|
+
id="file-upload"
|
|
136
|
+
type="file"
|
|
137
|
+
accept="image/*"
|
|
138
|
+
class="sr-only"
|
|
139
|
+
@change="handleImageUpload"
|
|
140
|
+
/>
|
|
141
|
+
</label>
|
|
142
|
+
</div>
|
|
143
|
+
</div>
|
|
144
|
+
<div class="flex justify-center mt-2">
|
|
145
|
+
<img
|
|
146
|
+
:show="newCategoryImageUrl()"
|
|
147
|
+
:src="imagePreview()"
|
|
148
|
+
alt="Category preview"
|
|
149
|
+
class="object-cover h-16 w-16 border border-gray-200 rounded-full dark:border-neutral-700 shadow-sm"
|
|
150
|
+
onerror="this.src='/images/categories/placeholder.jpg'"
|
|
151
|
+
/>
|
|
152
|
+
<div
|
|
153
|
+
:show="!newCategoryImageUrl()"
|
|
154
|
+
class="flex items-center justify-center h-16 w-16 font-medium text-white bg-blue-500 rounded-full shadow-sm"
|
|
155
|
+
>
|
|
156
|
+
{{ newCategoryName() ? newCategoryName().charAt(0).toUpperCase() : '?' }}
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
<p class="mt-1 text-gray-500 text-left text-xs dark:text-neutral-400">Enter the URL of the category image or upload a file</p>
|
|
160
|
+
</div>
|
|
161
|
+
<div>
|
|
162
|
+
<label for="category-display-order" class="block font-medium leading-6 text-gray-900 text-left text-sm dark:text-neutral-200">Display Order</label>
|
|
163
|
+
<div class="mt-2">
|
|
164
|
+
<input
|
|
165
|
+
type="number"
|
|
166
|
+
id="category-display-order"
|
|
167
|
+
x-model.number="newCategoryDisplayOrder"
|
|
168
|
+
min="0"
|
|
169
|
+
class="block py-1.5 w-full text-gray-900 sm:leading-6 sm:text-sm dark:text-white placeholder:text-gray-400 dark:bg-neutral-700 border-0 ring-1 ring-gray-300 ring-inset rounded-md dark:ring-neutral-600 focus:ring-2 focus:ring-blue-600 focus:ring-inset shadow-sm"
|
|
170
|
+
placeholder="0"
|
|
171
|
+
/>
|
|
172
|
+
</div>
|
|
173
|
+
</div>
|
|
174
|
+
<div class="flex items-center">
|
|
175
|
+
<input
|
|
176
|
+
id="category-featured"
|
|
177
|
+
type="checkbox"
|
|
178
|
+
x-model="newCategoryIsActive"
|
|
179
|
+
class="h-4 w-4 text-blue-600 dark:bg-neutral-700 border-gray-300 rounded dark:border-neutral-600 focus:ring-blue-600"
|
|
180
|
+
/>
|
|
181
|
+
<label for="category-featured" class="block ml-2 text-gray-900 text-sm dark:text-neutral-200">Active category</label>
|
|
182
|
+
</div>
|
|
183
|
+
</div>
|
|
184
|
+
</div>
|
|
185
|
+
</div>
|
|
186
|
+
</div>
|
|
187
|
+
<div class="sm:grid sm:gap-3 sm:grid-cols-2 sm:grid-flow-row-dense mt-5 sm:mt-6">
|
|
188
|
+
<button
|
|
189
|
+
type="button"
|
|
190
|
+
@click="addCategory()"
|
|
191
|
+
class="inline-flex justify-center sm:col-start-2 px-3 py-2 w-full font-semibold text-sm text-white bg-blue-600 hover:bg-blue-500 rounded-md focus-visible:outline focus-visible:outline-2 focus-visible:outline-blue-600 focus-visible:outline-offset-2 shadow-sm"
|
|
192
|
+
>
|
|
193
|
+
{{ isEditing() ? 'Save' : 'Add' }}
|
|
194
|
+
</button>
|
|
195
|
+
<button
|
|
196
|
+
type="button"
|
|
197
|
+
@click="closeAddModal()"
|
|
198
|
+
class="inline-flex justify-center sm:col-start-1 mt-3 px-3 py-2 sm:mt-0 w-full 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"
|
|
199
|
+
>
|
|
200
|
+
Cancel
|
|
201
|
+
</button>
|
|
202
|
+
</div>
|
|
203
|
+
</div>
|
|
204
|
+
</div>
|
|
205
|
+
</div>
|
|
206
|
+
</div>
|
|
207
|
+
|
|
208
|
+
<script client>
|
|
209
|
+
import { useCategories } from '../../../../functions/commerce/products/categories'
|
|
210
|
+
import type { Categories } from '../../../../types/defaults'
|
|
211
|
+
|
|
212
|
+
const { categories, fetchCategories, createCategory, deleteCategory: deleteCategoryFromAPI } = useCategories()
|
|
213
|
+
|
|
214
|
+
const searchQuery = state('')
|
|
215
|
+
const sortBy = state<'name' | 'display_order'>('name')
|
|
216
|
+
const sortOrder = state<'asc' | 'desc'>('asc')
|
|
217
|
+
const featuredFilter = state<'all' | 'featured' | 'not-featured'>('all')
|
|
218
|
+
const currentPage = state(1)
|
|
219
|
+
const itemsPerPage = state(10)
|
|
220
|
+
|
|
221
|
+
// Modal state.
|
|
222
|
+
const showAddModal = state(false)
|
|
223
|
+
const isEditing = state(false)
|
|
224
|
+
const editingCategoryId = state<number | null>(null)
|
|
225
|
+
|
|
226
|
+
// Flat signals per form field — keeps each x-model binding 1:1.
|
|
227
|
+
const newCategoryName = state('')
|
|
228
|
+
const newCategoryDescription = state('')
|
|
229
|
+
const newCategoryIsActive = state(true)
|
|
230
|
+
const newCategoryImageUrl = state('')
|
|
231
|
+
const newCategoryDisplayOrder = state(0)
|
|
232
|
+
|
|
233
|
+
const filteredCategories = derived(() => {
|
|
234
|
+
const q = searchQuery().toLowerCase()
|
|
235
|
+
const filter = featuredFilter()
|
|
236
|
+
const by = sortBy()
|
|
237
|
+
const dir = sortOrder()
|
|
238
|
+
|
|
239
|
+
return (categories.value as Categories[])
|
|
240
|
+
.filter((c) => {
|
|
241
|
+
const matchesSearch
|
|
242
|
+
= c.name.toLowerCase().includes(q)
|
|
243
|
+
|| (c.description || '').toLowerCase().includes(q)
|
|
244
|
+
const matchesFeatured
|
|
245
|
+
= filter === 'all'
|
|
246
|
+
|| (filter === 'featured' && c.is_active)
|
|
247
|
+
|| (filter === 'not-featured' && !c.is_active)
|
|
248
|
+
return matchesSearch && matchesFeatured
|
|
249
|
+
})
|
|
250
|
+
.sort((a, b) => {
|
|
251
|
+
let cmp = 0
|
|
252
|
+
if (by === 'name')
|
|
253
|
+
cmp = a.name.localeCompare(b.name)
|
|
254
|
+
else if (by === 'display_order')
|
|
255
|
+
cmp = (a.display_order || 0) - (b.display_order || 0)
|
|
256
|
+
return dir === 'asc' ? cmp : -cmp
|
|
257
|
+
})
|
|
258
|
+
})
|
|
259
|
+
|
|
260
|
+
const paginatedCategories = derived(() => {
|
|
261
|
+
const start = (currentPage() - 1) * itemsPerPage()
|
|
262
|
+
return filteredCategories().slice(start, start + itemsPerPage())
|
|
263
|
+
})
|
|
264
|
+
|
|
265
|
+
const totalItems = derived(() => filteredCategories().length)
|
|
266
|
+
|
|
267
|
+
function imagePreview(): string {
|
|
268
|
+
return newCategoryImageUrl() || '/images/categories/placeholder.jpg'
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
function resetPage(): void {
|
|
272
|
+
currentPage.set(1)
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
function handlePrevPage(): void {
|
|
276
|
+
if (currentPage() > 1)
|
|
277
|
+
currentPage.update(p => p - 1)
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
function handleNextPage(): void {
|
|
281
|
+
const totalPages = Math.ceil(totalItems() / itemsPerPage())
|
|
282
|
+
if (currentPage() < totalPages)
|
|
283
|
+
currentPage.update(p => p + 1)
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
function handlePageChange(page: number): void {
|
|
287
|
+
currentPage.set(page)
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
function toggleSort(column: 'name' | 'display_order'): void {
|
|
291
|
+
if (sortBy() === column) {
|
|
292
|
+
sortOrder.update(d => d === 'asc' ? 'desc' : 'asc')
|
|
293
|
+
}
|
|
294
|
+
else {
|
|
295
|
+
sortBy.set(column)
|
|
296
|
+
sortOrder.set('asc')
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
function resetForm(): void {
|
|
301
|
+
newCategoryName.set('')
|
|
302
|
+
newCategoryDescription.set('')
|
|
303
|
+
newCategoryIsActive.set(true)
|
|
304
|
+
newCategoryImageUrl.set('')
|
|
305
|
+
newCategoryDisplayOrder.set(0)
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function openAddModal(): void {
|
|
309
|
+
isEditing.set(false)
|
|
310
|
+
editingCategoryId.set(null)
|
|
311
|
+
resetForm()
|
|
312
|
+
showAddModal.set(true)
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
function closeAddModal(): void {
|
|
316
|
+
showAddModal.set(false)
|
|
317
|
+
isEditing.set(false)
|
|
318
|
+
editingCategoryId.set(null)
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// Naive client-side image upload — same shape as the original. In a
|
|
322
|
+
// real app, POST to the server and store the returned URL.
|
|
323
|
+
function handleImageUpload(event: Event): void {
|
|
324
|
+
const input = event.target as HTMLInputElement
|
|
325
|
+
const file = input.files?.[0]
|
|
326
|
+
if (!file)
|
|
327
|
+
return
|
|
328
|
+
const reader = new FileReader()
|
|
329
|
+
reader.onload = (e) => {
|
|
330
|
+
if (e.target && typeof e.target.result === 'string')
|
|
331
|
+
newCategoryImageUrl.set(e.target.result)
|
|
332
|
+
}
|
|
333
|
+
reader.readAsDataURL(file)
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
async function addCategory(): Promise<void> {
|
|
337
|
+
const list = categories.value as Categories[]
|
|
338
|
+
const id = list.length > 0 ? Math.max(...list.map(c => c.id || 0)) + 1 : 1
|
|
339
|
+
|
|
340
|
+
const optimistic = {
|
|
341
|
+
id,
|
|
342
|
+
name: newCategoryName(),
|
|
343
|
+
description: newCategoryDescription(),
|
|
344
|
+
image_url: newCategoryImageUrl(),
|
|
345
|
+
is_active: newCategoryIsActive(),
|
|
346
|
+
display_order: newCategoryDisplayOrder(),
|
|
347
|
+
uuid: `category-${id}`,
|
|
348
|
+
}
|
|
349
|
+
categories.value = [...list, optimistic as unknown as Categories]
|
|
350
|
+
|
|
351
|
+
try {
|
|
352
|
+
await createCategory({
|
|
353
|
+
name: optimistic.name,
|
|
354
|
+
description: optimistic.description,
|
|
355
|
+
image_url: optimistic.image_url,
|
|
356
|
+
is_active: optimistic.is_active,
|
|
357
|
+
display_order: optimistic.display_order,
|
|
358
|
+
} as unknown as Categories)
|
|
359
|
+
closeAddModal()
|
|
360
|
+
}
|
|
361
|
+
catch (error) {
|
|
362
|
+
categories.value = (categories.value as Categories[]).filter(c => c.id !== id)
|
|
363
|
+
// eslint-disable-next-line no-console
|
|
364
|
+
console.error('Failed to create category:', error)
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
function viewCategory(category: Categories): void {
|
|
369
|
+
navigate(`/dashboard/commerce/categories/${category.id}`)
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
function editCategory(category: Categories): void {
|
|
373
|
+
isEditing.set(true)
|
|
374
|
+
editingCategoryId.set(category.id ?? null)
|
|
375
|
+
newCategoryName.set(category.name)
|
|
376
|
+
newCategoryDescription.set(category.description || '')
|
|
377
|
+
newCategoryIsActive.set(category.is_active ?? true)
|
|
378
|
+
newCategoryImageUrl.set(category.image_url || '')
|
|
379
|
+
newCategoryDisplayOrder.set(category.display_order ?? 0)
|
|
380
|
+
showAddModal.set(true)
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
async function handleDeleteCategory(category: Categories): Promise<void> {
|
|
384
|
+
// eslint-disable-next-line no-alert
|
|
385
|
+
if (!confirm(`Are you sure you want to delete the category "${category.name}"?`))
|
|
386
|
+
return
|
|
387
|
+
|
|
388
|
+
const original = [...(categories.value as Categories[])]
|
|
389
|
+
categories.value = original.filter(c => c.id !== category.id)
|
|
390
|
+
|
|
391
|
+
try {
|
|
392
|
+
await deleteCategoryFromAPI(category.id as number)
|
|
393
|
+
}
|
|
394
|
+
catch (error) {
|
|
395
|
+
categories.value = original
|
|
396
|
+
// eslint-disable-next-line no-console
|
|
397
|
+
console.error('Failed to delete category:', error)
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
onMount(async () => {
|
|
402
|
+
await fetchCategories()
|
|
403
|
+
})
|
|
404
|
+
</script>
|
|
405
|
+
|
|
406
|
+
@endsection
|