@stacksjs/defaults 0.70.206 → 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
|
File without changes
|
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
@extends('layouts/default')
|
|
2
|
+
|
|
3
|
+
@section('content')
|
|
4
|
+
@title('Dashboard - Commerce Taxes')
|
|
5
|
+
<PageLayout>
|
|
6
|
+
<div class="sm:flex sm:items-center sm:justify-between">
|
|
7
|
+
<PageHeader title="Tax Rates" description="Manage tax rates for your products across different countries and regions. Digital services often have specific tax requirements based on customer location." />
|
|
8
|
+
<div class="mt-4 sm:mt-0">
|
|
9
|
+
<button
|
|
10
|
+
type="button"
|
|
11
|
+
@click="openAddModal()"
|
|
12
|
+
class="inline-flex items-center px-3 py-2 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"
|
|
13
|
+
>
|
|
14
|
+
<div class="mr-1 h-5 w-5 i-hugeicons-plus-sign"></div>
|
|
15
|
+
Add tax
|
|
16
|
+
</button>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
|
|
20
|
+
<!-- Filters -->
|
|
21
|
+
<div class="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between mt-6">
|
|
22
|
+
<div class="relative max-w-sm">
|
|
23
|
+
<div class="flex absolute inset-y-0 left-0 items-center pl-3 pointer-events-none">
|
|
24
|
+
<div class="h-5 w-5 text-gray-400 i-hugeicons-search-01"></div>
|
|
25
|
+
</div>
|
|
26
|
+
<input
|
|
27
|
+
x-model="searchQuery"
|
|
28
|
+
type="text"
|
|
29
|
+
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"
|
|
30
|
+
placeholder="Search taxes..."
|
|
31
|
+
/>
|
|
32
|
+
</div>
|
|
33
|
+
|
|
34
|
+
<div class="flex flex-col gap-4 sm:flex-row">
|
|
35
|
+
<select
|
|
36
|
+
x-model="activeFilter"
|
|
37
|
+
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"
|
|
38
|
+
>
|
|
39
|
+
<option value="all">All Taxes</option>
|
|
40
|
+
<option value="active">Active Only</option>
|
|
41
|
+
<option value="inactive">Inactive Only</option>
|
|
42
|
+
</select>
|
|
43
|
+
|
|
44
|
+
<select
|
|
45
|
+
x-model="countryFilter"
|
|
46
|
+
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"
|
|
47
|
+
>
|
|
48
|
+
<option value="all">All Countries</option>
|
|
49
|
+
<template :for="country in countries">
|
|
50
|
+
<option value="{{ country }}">{{ country }}</option>
|
|
51
|
+
</template>
|
|
52
|
+
</select>
|
|
53
|
+
|
|
54
|
+
<select
|
|
55
|
+
x-model="typeFilter"
|
|
56
|
+
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"
|
|
57
|
+
>
|
|
58
|
+
<option value="all">All Types</option>
|
|
59
|
+
<template :for="type in taxTypes">
|
|
60
|
+
<option value="{{ type }}">{{ type }}</option>
|
|
61
|
+
</template>
|
|
62
|
+
</select>
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
|
|
66
|
+
<!-- Taxes table -->
|
|
67
|
+
<div class="flow-root mt-6">
|
|
68
|
+
<div class="overflow-x-auto -mx-4 -my-2 sm:-mx-6 lg:-mx-8">
|
|
69
|
+
<div class="inline-block py-2 sm:px-6 lg:px-8 min-w-full align-middle">
|
|
70
|
+
<div class="overflow-hidden ring-1 ring-black ring-opacity-5 sm:rounded-lg shadow">
|
|
71
|
+
<table class="min-w-full divide-gray-300 divide-y dark:divide-neutral-700">
|
|
72
|
+
<thead class="bg-gray-50 dark:bg-neutral-700">
|
|
73
|
+
<tr>
|
|
74
|
+
<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">
|
|
75
|
+
<button @click="toggleSort('name')" class="inline-flex items-center group">
|
|
76
|
+
Name
|
|
77
|
+
<span class="group-focus:visible group-hover:visible flex-none ml-2 text-gray-400 rounded">
|
|
78
|
+
<div class="h-4 w-4 {{ sortBy() === 'name' ? (sortOrder() === 'asc' ? 'i-hugeicons-arrow-up-02' : 'i-hugeicons-arrow-down-02') : 'i-hugeicons-arrows-up-down' }}"></div>
|
|
79
|
+
</span>
|
|
80
|
+
</button>
|
|
81
|
+
</th>
|
|
82
|
+
<th scope="col" class="px-3 py-3.5 font-semibold text-gray-900 text-left text-sm dark:text-neutral-200">
|
|
83
|
+
<button @click="toggleSort('rate')" class="inline-flex items-center group">
|
|
84
|
+
Rate (%)
|
|
85
|
+
<span class="group-focus:visible group-hover:visible flex-none ml-2 text-gray-400 rounded">
|
|
86
|
+
<div class="h-4 w-4 {{ sortBy() === 'rate' ? (sortOrder() === 'asc' ? 'i-hugeicons-arrow-up-02' : 'i-hugeicons-arrow-down-02') : 'i-hugeicons-arrows-up-down' }}"></div>
|
|
87
|
+
</span>
|
|
88
|
+
</button>
|
|
89
|
+
</th>
|
|
90
|
+
<th scope="col" class="px-3 py-3.5 font-semibold text-gray-900 text-left text-sm dark:text-neutral-200">Type</th>
|
|
91
|
+
<th scope="col" class="px-3 py-3.5 font-semibold text-gray-900 text-left text-sm dark:text-neutral-200">
|
|
92
|
+
<button @click="toggleSort('country')" class="inline-flex items-center group">
|
|
93
|
+
Country
|
|
94
|
+
<span class="group-focus:visible group-hover:visible flex-none ml-2 text-gray-400 rounded">
|
|
95
|
+
<div class="h-4 w-4 {{ sortBy() === 'country' ? (sortOrder() === 'asc' ? 'i-hugeicons-arrow-up-02' : 'i-hugeicons-arrow-down-02') : 'i-hugeicons-arrows-up-down' }}"></div>
|
|
96
|
+
</span>
|
|
97
|
+
</button>
|
|
98
|
+
</th>
|
|
99
|
+
<th scope="col" class="px-3 py-3.5 font-semibold text-gray-900 text-left text-sm dark:text-neutral-200">Region</th>
|
|
100
|
+
<th scope="col" class="px-3 py-3.5 font-semibold text-gray-900 text-left text-sm dark:text-neutral-200">Status</th>
|
|
101
|
+
<th scope="col" class="px-3 py-3.5 font-semibold text-gray-900 text-left text-sm dark:text-neutral-200">Default</th>
|
|
102
|
+
<th scope="col" class="px-3 py-3.5 font-semibold text-gray-900 text-right text-sm dark:text-neutral-200">
|
|
103
|
+
<button @click="toggleSort('createdAt')" class="inline-flex items-center text-right group">
|
|
104
|
+
Created
|
|
105
|
+
<span class="group-focus:visible group-hover:visible flex-none ml-2 text-gray-400 rounded">
|
|
106
|
+
<div class="h-4 w-4 {{ sortBy() === 'createdAt' ? (sortOrder() === 'asc' ? 'i-hugeicons-arrow-up-02' : 'i-hugeicons-arrow-down-02') : 'i-hugeicons-arrows-up-down' }}"></div>
|
|
107
|
+
</span>
|
|
108
|
+
</button>
|
|
109
|
+
</th>
|
|
110
|
+
<th scope="col" class="relative pl-3 pr-4 py-3.5 sm:pr-6">
|
|
111
|
+
<span class="sr-only">Actions</span>
|
|
112
|
+
</th>
|
|
113
|
+
</tr>
|
|
114
|
+
</thead>
|
|
115
|
+
<tbody class="bg-white dark:bg-neutral-800 divide-gray-200 divide-y dark:divide-neutral-700">
|
|
116
|
+
<template :for="tax in filteredTaxes">
|
|
117
|
+
<tr>
|
|
118
|
+
<td class="pl-4 pr-3 py-4 sm:pl-6 font-medium text-gray-900 text-sm whitespace-nowrap dark:text-white">{{ tax.name }}</td>
|
|
119
|
+
<td class="px-3 py-4 text-gray-500 text-sm whitespace-nowrap dark:text-neutral-300">{{ tax.rate }}%</td>
|
|
120
|
+
<td class="px-3 py-4 text-gray-500 text-sm whitespace-nowrap dark:text-neutral-300">{{ tax.type }}</td>
|
|
121
|
+
<td class="px-3 py-4 text-gray-500 text-sm whitespace-nowrap dark:text-neutral-300">{{ tax.country }}</td>
|
|
122
|
+
<td class="px-3 py-4 text-gray-500 text-sm whitespace-nowrap dark:text-neutral-300">{{ tax.region }}</td>
|
|
123
|
+
<td class="px-3 py-4 text-sm whitespace-nowrap">
|
|
124
|
+
<span class="inline-flex items-center px-2 py-1 font-medium text-xs rounded-md {{ tax.active ? 'bg-green-50 text-green-700 ring-1 ring-inset ring-green-600/20 dark:bg-green-900/30 dark:text-green-400' : 'bg-red-50 text-red-700 ring-1 ring-inset ring-red-600/20 dark:bg-red-900/30 dark:text-red-400' }}">
|
|
125
|
+
{{ tax.active ? 'Active' : 'Inactive' }}
|
|
126
|
+
</span>
|
|
127
|
+
</td>
|
|
128
|
+
<td class="px-3 py-4 text-sm whitespace-nowrap">
|
|
129
|
+
@if(tax.isDefault)
|
|
130
|
+
<span class="inline-flex items-center px-2 py-1 font-medium text-blue-700 text-xs dark:text-blue-400 bg-blue-50 dark:bg-blue-900/30 ring-1 ring-blue-600/20 ring-inset rounded-md">
|
|
131
|
+
Default
|
|
132
|
+
</span>
|
|
133
|
+
@endif
|
|
134
|
+
</td>
|
|
135
|
+
<td class="px-3 py-4 text-gray-500 text-right text-sm whitespace-nowrap dark:text-neutral-300">{{ tax.createdAt }}</td>
|
|
136
|
+
<td class="relative pl-3 pr-4 py-4 sm:pr-6 font-medium text-right text-sm whitespace-nowrap">
|
|
137
|
+
<div class="flex items-center justify-end space-x-2">
|
|
138
|
+
<button type="button" class="text-blue-600 dark:text-blue-400 hover:text-blue-900 dark:hover:text-blue-300">
|
|
139
|
+
<div class="h-5 w-5 i-hugeicons-edit-01"></div>
|
|
140
|
+
</button>
|
|
141
|
+
<button type="button" class="text-red-600 dark:text-red-400 hover:text-red-900 dark:hover:text-red-300">
|
|
142
|
+
<div class="h-5 w-5 i-hugeicons-waste"></div>
|
|
143
|
+
</button>
|
|
144
|
+
</div>
|
|
145
|
+
</td>
|
|
146
|
+
</tr>
|
|
147
|
+
</template>
|
|
148
|
+
@if(filteredTaxes().length === 0)
|
|
149
|
+
<tr>
|
|
150
|
+
<td colspan="9" class="px-6 py-4 text-center text-gray-500 text-sm dark:text-neutral-400">
|
|
151
|
+
No taxes found matching your criteria
|
|
152
|
+
</td>
|
|
153
|
+
</tr>
|
|
154
|
+
@endif
|
|
155
|
+
</tbody>
|
|
156
|
+
</table>
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
</div>
|
|
162
|
+
</div>
|
|
163
|
+
|
|
164
|
+
<!-- Add Tax Modal -->
|
|
165
|
+
<div :show="showAddModal" class="fixed inset-0 overflow-y-auto z-10">
|
|
166
|
+
<div class="flex items-end justify-center sm:items-center p-4 sm:p-0 min-h-full text-center">
|
|
167
|
+
<div class="fixed inset-0 bg-gray-500 bg-opacity-75 transition-opacity" @click="closeAddModal()"></div>
|
|
168
|
+
<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">
|
|
169
|
+
<div>
|
|
170
|
+
<div class="mt-3 sm:mt-5 text-center">
|
|
171
|
+
<h3 class="font-semibold leading-6 text-base text-gray-900 dark:text-white">Add New Tax Rate</h3>
|
|
172
|
+
<div class="mt-2">
|
|
173
|
+
<div class="text-gray-500 text-sm dark:text-neutral-400">
|
|
174
|
+
<p>Set up tax rates for different countries and regions where your SaaS products are sold.</p>
|
|
175
|
+
<p class="mt-2">For digital services, tax is typically based on the customer's location rather than your business location.</p>
|
|
176
|
+
</div>
|
|
177
|
+
</div>
|
|
178
|
+
</div>
|
|
179
|
+
|
|
180
|
+
<div class="mt-4">
|
|
181
|
+
<div class="space-y-4">
|
|
182
|
+
<div>
|
|
183
|
+
<label for="tax-name" class="block font-medium text-gray-700 text-sm dark:text-neutral-200">Name</label>
|
|
184
|
+
<div class="mt-1">
|
|
185
|
+
<input id="tax-name" type="text" x-model="newName" class="block w-full sm:text-sm dark:text-white dark:bg-neutral-700 border-gray-300 rounded-md dark:border-neutral-600 focus:border-blue-500 focus:ring-blue-500 shadow-sm" />
|
|
186
|
+
</div>
|
|
187
|
+
</div>
|
|
188
|
+
|
|
189
|
+
<div>
|
|
190
|
+
<label for="tax-rate" class="block font-medium text-gray-700 text-sm dark:text-neutral-200">Rate (%)</label>
|
|
191
|
+
<div class="mt-1">
|
|
192
|
+
<input id="tax-rate" type="number" step="0.01" x-model.number="newRate" class="block w-full sm:text-sm dark:text-white dark:bg-neutral-700 border-gray-300 rounded-md dark:border-neutral-600 focus:border-blue-500 focus:ring-blue-500 shadow-sm" />
|
|
193
|
+
</div>
|
|
194
|
+
<p class="mt-1 text-gray-500 text-xs dark:text-neutral-400">Enter the percentage rate (e.g., 20 for 20%)</p>
|
|
195
|
+
</div>
|
|
196
|
+
|
|
197
|
+
<div>
|
|
198
|
+
<label for="tax-type" class="block font-medium text-gray-700 text-sm dark:text-neutral-200">Type</label>
|
|
199
|
+
<div class="mt-1">
|
|
200
|
+
<select id="tax-type" x-model="newType" class="block w-full sm:text-sm dark:text-white dark:bg-neutral-700 border-gray-300 rounded-md dark:border-neutral-600 focus:border-blue-500 focus:ring-blue-500 shadow-sm">
|
|
201
|
+
<template :for="type in taxTypeOptions">
|
|
202
|
+
<option :value="type">{{ type }}</option>
|
|
203
|
+
</template>
|
|
204
|
+
</select>
|
|
205
|
+
</div>
|
|
206
|
+
</div>
|
|
207
|
+
|
|
208
|
+
<div>
|
|
209
|
+
<label for="tax-country" class="block font-medium text-gray-700 text-sm dark:text-neutral-200">Country</label>
|
|
210
|
+
<div class="mt-1">
|
|
211
|
+
<input id="tax-country" type="text" x-model="newCountry" class="block w-full sm:text-sm dark:text-white dark:bg-neutral-700 border-gray-300 rounded-md dark:border-neutral-600 focus:border-blue-500 focus:ring-blue-500 shadow-sm" />
|
|
212
|
+
</div>
|
|
213
|
+
</div>
|
|
214
|
+
|
|
215
|
+
<div>
|
|
216
|
+
<label for="tax-region" class="block font-medium text-gray-700 text-sm dark:text-neutral-200">Region</label>
|
|
217
|
+
<div class="mt-1">
|
|
218
|
+
<input id="tax-region" type="text" x-model="newRegion" placeholder="All" class="block w-full sm:text-sm dark:text-white dark:bg-neutral-700 border-gray-300 rounded-md dark:border-neutral-600 focus:border-blue-500 focus:ring-blue-500 shadow-sm" />
|
|
219
|
+
</div>
|
|
220
|
+
</div>
|
|
221
|
+
|
|
222
|
+
<div class="flex items-center">
|
|
223
|
+
<input id="active" x-model="newActive" type="checkbox" class="h-4 w-4 text-blue-600 dark:bg-neutral-700 border-gray-300 rounded dark:border-neutral-600 focus:ring-blue-600 dark:focus:ring-offset-neutral-800" />
|
|
224
|
+
<label for="active" class="block ml-2 text-gray-900 text-sm dark:text-white">Active</label>
|
|
225
|
+
</div>
|
|
226
|
+
|
|
227
|
+
<div class="flex items-center">
|
|
228
|
+
<input id="isDefault" x-model="newIsDefault" type="checkbox" class="h-4 w-4 text-blue-600 dark:bg-neutral-700 border-gray-300 rounded dark:border-neutral-600 focus:ring-blue-600 dark:focus:ring-offset-neutral-800" />
|
|
229
|
+
<label for="isDefault" class="block ml-2 text-gray-900 text-sm dark:text-white">Set as default tax rate</label>
|
|
230
|
+
</div>
|
|
231
|
+
<p class="text-gray-500 text-sm dark:text-neutral-400">This tax rate will be applied to new SaaS subscriptions by default</p>
|
|
232
|
+
</div>
|
|
233
|
+
</div>
|
|
234
|
+
</div>
|
|
235
|
+
|
|
236
|
+
<div class="sm:grid sm:gap-3 sm:grid-cols-2 sm:grid-flow-row-dense mt-5 sm:mt-6">
|
|
237
|
+
<button type="button" 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" @click="addTax()">Add</button>
|
|
238
|
+
<button type="button" 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" @click="closeAddModal()">Cancel</button>
|
|
239
|
+
</div>
|
|
240
|
+
</div>
|
|
241
|
+
</PageLayout>
|
|
242
|
+
<script client>
|
|
243
|
+
// Tax type options — moved out of the former `<script server>` block
|
|
244
|
+
// (stacksjs/stacks#1838).
|
|
245
|
+
const taxTypeOptions = ['VAT', 'GST', 'Sales Tax', 'Digital Services Tax', 'Consumption Tax'] as const
|
|
246
|
+
|
|
247
|
+
interface Tax {
|
|
248
|
+
id: number
|
|
249
|
+
name: string
|
|
250
|
+
rate: number
|
|
251
|
+
type: string
|
|
252
|
+
country: string
|
|
253
|
+
region: string
|
|
254
|
+
active: boolean
|
|
255
|
+
createdAt: string
|
|
256
|
+
isDefault: boolean
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
const initialTaxes: Tax[] = [
|
|
260
|
+
{ id: 1, name: 'US Digital Services', rate: 0.0, type: 'Sales Tax', country: 'United States', region: 'All', active: true, createdAt: '2023-05-10', isDefault: true },
|
|
261
|
+
{ id: 2, name: 'EU Digital VAT', rate: 20.0, type: 'VAT', country: 'European Union', region: 'All', active: true, createdAt: '2023-05-15', isDefault: false },
|
|
262
|
+
{ id: 3, name: 'UK Digital Services', rate: 20.0, type: 'VAT', country: 'United Kingdom', region: 'All', active: true, createdAt: '2023-05-20', isDefault: false },
|
|
263
|
+
{ id: 4, name: 'Canada GST/HST', rate: 5.0, type: 'GST', country: 'Canada', region: 'All', active: true, createdAt: '2023-06-01', isDefault: false },
|
|
264
|
+
{ id: 5, name: 'Australia GST', rate: 10.0, type: 'GST', country: 'Australia', region: 'All', active: true, createdAt: '2023-06-15', isDefault: false },
|
|
265
|
+
{ id: 6, name: 'Japan Consumption Tax', rate: 10.0, type: 'Consumption Tax', country: 'Japan', region: 'All', active: true, createdAt: '2023-07-01', isDefault: false },
|
|
266
|
+
{ id: 7, name: 'Norway VAT', rate: 25.0, type: 'VAT', country: 'Norway', region: 'All', active: true, createdAt: '2023-07-15', isDefault: false },
|
|
267
|
+
{ id: 8, name: 'New Zealand GST', rate: 15.0, type: 'GST', country: 'New Zealand', region: 'All', active: true, createdAt: '2023-08-01', isDefault: false },
|
|
268
|
+
{ id: 9, name: 'Singapore GST', rate: 8.0, type: 'GST', country: 'Singapore', region: 'All', active: true, createdAt: '2023-08-15', isDefault: false },
|
|
269
|
+
{ id: 10, name: 'South Africa VAT', rate: 15.0, type: 'VAT', country: 'South Africa', region: 'All', active: true, createdAt: '2023-09-01', isDefault: false },
|
|
270
|
+
]
|
|
271
|
+
|
|
272
|
+
const taxes = state(initialTaxes)
|
|
273
|
+
const searchQuery = state('')
|
|
274
|
+
const sortBy = state<'name' | 'rate' | 'country' | 'createdAt'>('name')
|
|
275
|
+
const sortOrder = state<'asc' | 'desc'>('asc')
|
|
276
|
+
const activeFilter = state<'all' | 'active' | 'inactive'>('all')
|
|
277
|
+
const countryFilter = state<string>('all')
|
|
278
|
+
const typeFilter = state<string>('all')
|
|
279
|
+
|
|
280
|
+
const showAddModal = state(false)
|
|
281
|
+
const newName = state('')
|
|
282
|
+
const newRate = state(0)
|
|
283
|
+
const newType = state<string>('Percentage')
|
|
284
|
+
const newCountry = state('')
|
|
285
|
+
const newRegion = state('')
|
|
286
|
+
const newActive = state(true)
|
|
287
|
+
const newIsDefault = state(false)
|
|
288
|
+
|
|
289
|
+
function countries(): string[] {
|
|
290
|
+
return Array.from(new Set(taxes().map(t => t.country))).sort()
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
function taxTypes(): string[] {
|
|
294
|
+
return Array.from(new Set(taxes().map(t => t.type))).sort()
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
const filteredTaxes = derived(() => {
|
|
298
|
+
const q = searchQuery().toLowerCase()
|
|
299
|
+
const aFilter = activeFilter()
|
|
300
|
+
const cFilter = countryFilter()
|
|
301
|
+
const tFilter = typeFilter()
|
|
302
|
+
const by = sortBy()
|
|
303
|
+
const dir = sortOrder()
|
|
304
|
+
|
|
305
|
+
return taxes()
|
|
306
|
+
.filter((t) => {
|
|
307
|
+
const matchesSearch
|
|
308
|
+
= t.name.toLowerCase().includes(q)
|
|
309
|
+
|| t.country.toLowerCase().includes(q)
|
|
310
|
+
|| t.region.toLowerCase().includes(q)
|
|
311
|
+
const matchesActive
|
|
312
|
+
= aFilter === 'all'
|
|
313
|
+
|| (aFilter === 'active' && t.active)
|
|
314
|
+
|| (aFilter === 'inactive' && !t.active)
|
|
315
|
+
const matchesCountry = cFilter === 'all' || t.country === cFilter
|
|
316
|
+
const matchesType = tFilter === 'all' || t.type === tFilter
|
|
317
|
+
return matchesSearch && matchesActive && matchesCountry && matchesType
|
|
318
|
+
})
|
|
319
|
+
.sort((a, b) => {
|
|
320
|
+
let cmp = 0
|
|
321
|
+
if (by === 'name') cmp = a.name.localeCompare(b.name)
|
|
322
|
+
else if (by === 'rate') cmp = a.rate - b.rate
|
|
323
|
+
else if (by === 'country') cmp = a.country.localeCompare(b.country)
|
|
324
|
+
else if (by === 'createdAt') cmp = new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()
|
|
325
|
+
return dir === 'asc' ? cmp : -cmp
|
|
326
|
+
})
|
|
327
|
+
})
|
|
328
|
+
|
|
329
|
+
function toggleSort(column: 'name' | 'rate' | 'country' | 'createdAt'): void {
|
|
330
|
+
if (sortBy() === column) {
|
|
331
|
+
sortOrder.update(d => d === 'asc' ? 'desc' : 'asc')
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
sortBy.set(column)
|
|
335
|
+
sortOrder.set('asc')
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
function openAddModal(): void {
|
|
340
|
+
newName.set('')
|
|
341
|
+
newRate.set(0)
|
|
342
|
+
newType.set('VAT')
|
|
343
|
+
newCountry.set('')
|
|
344
|
+
newRegion.set('')
|
|
345
|
+
newActive.set(true)
|
|
346
|
+
newIsDefault.set(false)
|
|
347
|
+
showAddModal.set(true)
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
function closeAddModal(): void {
|
|
351
|
+
showAddModal.set(false)
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
function addTax(): void {
|
|
355
|
+
const list = taxes()
|
|
356
|
+
const id = list.length > 0 ? Math.max(...list.map(t => t.id)) + 1 : 1
|
|
357
|
+
const isDefault = newIsDefault()
|
|
358
|
+
const next = isDefault
|
|
359
|
+
? list.map(t => ({ ...t, isDefault: false }))
|
|
360
|
+
: list
|
|
361
|
+
|
|
362
|
+
taxes.set([...next, {
|
|
363
|
+
id,
|
|
364
|
+
name: newName(),
|
|
365
|
+
rate: newRate(),
|
|
366
|
+
type: newType(),
|
|
367
|
+
country: newCountry(),
|
|
368
|
+
region: newRegion() || 'All',
|
|
369
|
+
active: newActive(),
|
|
370
|
+
createdAt: new Date().toISOString().split('T')[0] || '',
|
|
371
|
+
isDefault,
|
|
372
|
+
}])
|
|
373
|
+
closeAddModal()
|
|
374
|
+
}
|
|
375
|
+
</script>
|
|
376
|
+
|
|
377
|
+
@endsection
|