@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
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
@extends('layouts/default')
|
|
2
|
+
|
|
3
|
+
@section('content')
|
|
4
|
+
@title('Dashboard - Commerce Products')
|
|
5
|
+
<div class="p-6 space-y-6">
|
|
6
|
+
|
|
7
|
+
<PageHeader title="Products" description="Manage commerce products">
|
|
8
|
+
<template #actions>
|
|
9
|
+
<Button variant="primary" @click="openAddProductModal()">
|
|
10
|
+
<div class="h-4 w-4 i-hugeicons-plus-sign"></div>
|
|
11
|
+
Add Product
|
|
12
|
+
</Button>
|
|
13
|
+
</template>
|
|
14
|
+
</PageHeader>
|
|
15
|
+
|
|
16
|
+
<div class="overflow-hidden bg-white dark:bg-neutral-800 rounded-lg shadow">
|
|
17
|
+
<div class="px-4 py-5 sm:px-6 border-b border-gray-200 dark:border-neutral-700">
|
|
18
|
+
<div class="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between mt-4">
|
|
19
|
+
<div class="w-full md:w-96"><SearchFilter placeholder="Search products..." @search="handleSearch" /></div>
|
|
20
|
+
<div class="flex flex-col gap-4 sm:flex-row">
|
|
21
|
+
<select x-model="categoryFilter" 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">
|
|
22
|
+
<option value="all">All Categories</option>
|
|
23
|
+
<template :for="category in categoryFilterOptions">
|
|
24
|
+
<option value="{{ category.name }}">{{ category.name }} ({{ category.count }})</option>
|
|
25
|
+
</template>
|
|
26
|
+
</select>
|
|
27
|
+
|
|
28
|
+
<div class="flex rounded-md shadow-sm">
|
|
29
|
+
<button type="button" @click="setViewMode('grid')" class="inline-flex relative focus:z-10 items-center px-3 py-2 font-semibold text-sm ring-1 ring-gray-300 ring-inset rounded-l-md dark:ring-neutral-700 {{ viewMode === 'grid' ? 'bg-blue-600 text-white' : 'bg-white dark:bg-neutral-800 text-gray-900 dark:text-white hover:bg-gray-50 dark:hover:bg-neutral-700' }}">
|
|
30
|
+
<div class="h-5 w-5 i-hugeicons-grid"></div>
|
|
31
|
+
</button>
|
|
32
|
+
<button type="button" @click="setViewMode('list')" class="inline-flex relative focus:z-10 items-center -ml-px px-3 py-2 font-semibold text-sm ring-1 ring-gray-300 ring-inset rounded-r-md dark:ring-neutral-700 {{ viewMode === 'list' ? 'bg-blue-600 text-white' : 'bg-white dark:bg-neutral-800 text-gray-900 dark:text-white hover:bg-gray-50 dark:hover:bg-neutral-700' }}">
|
|
33
|
+
<div class="h-5 w-5 i-hugeicons-right-to-left-list-number"></div>
|
|
34
|
+
</button>
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
<select x-model.number="itemsPerPage" 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
|
+
<option value="5">5 per page</option>
|
|
39
|
+
<option value="10">10 per page</option>
|
|
40
|
+
<option value="25">25 per page</option>
|
|
41
|
+
<option value="50">50 per page</option>
|
|
42
|
+
</select>
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
|
|
47
|
+
<ProductsTable
|
|
48
|
+
:products="paginatedProducts"
|
|
49
|
+
:searchQuery="searchQuery"
|
|
50
|
+
:categoryFilter="categoryFilter"
|
|
51
|
+
:sortBy="sortBy"
|
|
52
|
+
:sortOrder="sortOrder"
|
|
53
|
+
:currentPage="currentPage"
|
|
54
|
+
:itemsPerPage="itemsPerPage"
|
|
55
|
+
:categories="categoryNames"
|
|
56
|
+
@toggle-sort="toggleSort"
|
|
57
|
+
@change-page="handlePageChange"
|
|
58
|
+
@previous-page="handlePrevPage"
|
|
59
|
+
@next-page="handleNextPage"
|
|
60
|
+
@view-product="viewProduct"
|
|
61
|
+
@edit-product="editProduct"
|
|
62
|
+
/>
|
|
63
|
+
|
|
64
|
+
<div class="px-4 py-3 bg-gray-50 dark:bg-neutral-900 border-gray-200 border-t dark:border-neutral-700">
|
|
65
|
+
<Pagination :currentPage="currentPage" :totalItems="totalItems" :itemsPerPage="itemsPerPage" @prev="handlePrevPage" @next="handleNextPage" @page="handlePageChange" />
|
|
66
|
+
</div>
|
|
67
|
+
</div>
|
|
68
|
+
|
|
69
|
+
<!-- Add Product Modal -->
|
|
70
|
+
<div :show="showProductModal" class="fixed inset-0 overflow-y-auto z-10">
|
|
71
|
+
<div class="flex items-end justify-center sm:items-center p-4 sm:p-0 min-h-full text-center">
|
|
72
|
+
<div class="fixed inset-0 bg-gray-500 bg-opacity-75 dark:bg-neutral-900 dark:bg-opacity-75 transition-opacity" @click="closeProductModal()"></div>
|
|
73
|
+
|
|
74
|
+
<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">
|
|
75
|
+
<div class="absolute right-0 top-0 pr-4 pt-4">
|
|
76
|
+
<button type="button" @click="closeProductModal()" class="text-gray-400 dark:text-neutral-500 hover:text-gray-500 dark:hover:text-gray-400 bg-white dark:bg-neutral-800 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2">
|
|
77
|
+
<span class="sr-only">Close</span>
|
|
78
|
+
<div class="h-6 w-6 i-hugeicons-can"></div>
|
|
79
|
+
</button>
|
|
80
|
+
</div>
|
|
81
|
+
<div class="sm:flex sm:items-start">
|
|
82
|
+
<div class="mt-3 sm:ml-4 sm:mt-0 w-full text-center sm:text-left">
|
|
83
|
+
<h3 class="font-semibold leading-6 text-base text-gray-900 dark:text-white">Add New Product</h3>
|
|
84
|
+
<div class="mt-4">
|
|
85
|
+
<form @submit.prevent="addProduct()" class="space-y-4">
|
|
86
|
+
<div>
|
|
87
|
+
<label for="product-name" class="block font-medium text-gray-700 text-sm dark:text-neutral-300">Name</label>
|
|
88
|
+
<input type="text" id="product-name" x-model="newName" required class="block mt-1 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" />
|
|
89
|
+
</div>
|
|
90
|
+
<div>
|
|
91
|
+
<label for="product-description" class="block font-medium text-gray-700 text-sm dark:text-neutral-300">Description</label>
|
|
92
|
+
<textarea id="product-description" x-model="newDescription" rows="3" class="block mt-1 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"></textarea>
|
|
93
|
+
</div>
|
|
94
|
+
<div class="grid gap-4 grid-cols-2">
|
|
95
|
+
<div>
|
|
96
|
+
<label for="product-price" class="block font-medium text-gray-700 text-sm dark:text-neutral-300">Price ($)</label>
|
|
97
|
+
<input type="number" id="product-price" x-model.number="newPrice" min="0" step="0.01" required class="block mt-1 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" />
|
|
98
|
+
</div>
|
|
99
|
+
<div>
|
|
100
|
+
<label for="product-sale-price" class="block font-medium text-gray-700 text-sm dark:text-neutral-300">Sale Price ($)</label>
|
|
101
|
+
<input type="number" id="product-sale-price" x-model.number="newSalePrice" min="0" step="0.01" class="block mt-1 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" />
|
|
102
|
+
</div>
|
|
103
|
+
</div>
|
|
104
|
+
<div class="grid gap-4 grid-cols-2">
|
|
105
|
+
<div>
|
|
106
|
+
<label for="product-category" class="block font-medium text-gray-700 text-sm dark:text-neutral-300">Category</label>
|
|
107
|
+
<select id="product-category" x-model.number="newCategoryId" required class="block mt-1 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">
|
|
108
|
+
<option value="0">Select a category</option>
|
|
109
|
+
<template :for="category in categoryOptions">
|
|
110
|
+
<option value="{{ category.id }}">{{ category.name }}</option>
|
|
111
|
+
</template>
|
|
112
|
+
</select>
|
|
113
|
+
</div>
|
|
114
|
+
<div>
|
|
115
|
+
<label for="product-manufacturer" class="block font-medium text-gray-700 text-sm dark:text-neutral-300">Manufacturer</label>
|
|
116
|
+
<select id="product-manufacturer" x-model.number="newManufacturerId" required class="block mt-1 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">
|
|
117
|
+
<option value="0">Select a manufacturer</option>
|
|
118
|
+
<template :for="manufacturer in manufacturerOptions">
|
|
119
|
+
<option value="{{ manufacturer.id }}">{{ manufacturer.name }}</option>
|
|
120
|
+
</template>
|
|
121
|
+
</select>
|
|
122
|
+
</div>
|
|
123
|
+
</div>
|
|
124
|
+
<div class="grid gap-4 grid-cols-2">
|
|
125
|
+
<div>
|
|
126
|
+
<label for="product-inventory" class="block font-medium text-gray-700 text-sm dark:text-neutral-300">Inventory</label>
|
|
127
|
+
<input type="number" id="product-inventory" x-model.number="newInventory" min="0" required class="block mt-1 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" />
|
|
128
|
+
</div>
|
|
129
|
+
<div>
|
|
130
|
+
<label for="product-status" class="block font-medium text-gray-700 text-sm dark:text-neutral-300">Status</label>
|
|
131
|
+
<select id="product-status" x-model="newStatus" class="block mt-1 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">
|
|
132
|
+
<option value="Active">Active</option>
|
|
133
|
+
<option value="Inactive">Inactive</option>
|
|
134
|
+
<option value="Draft">Draft</option>
|
|
135
|
+
<option value="Archived">Archived</option>
|
|
136
|
+
</select>
|
|
137
|
+
</div>
|
|
138
|
+
</div>
|
|
139
|
+
<div class="mt-4">
|
|
140
|
+
<div class="flex items-center">
|
|
141
|
+
<input id="product-featured" type="checkbox" x-model="newFeatured" class="h-4 w-4 text-blue-600 border-gray-300 rounded dark:border-neutral-600 focus:ring-blue-500" />
|
|
142
|
+
<label for="product-featured" class="block ml-2 font-medium text-gray-700 text-sm dark:text-neutral-300">Featured product</label>
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
<div>
|
|
146
|
+
<label for="product-image" class="block font-medium text-gray-700 text-sm dark:text-neutral-300">Image URL</label>
|
|
147
|
+
<input type="text" id="product-image" x-model="newImageUrl" class="block mt-1 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" />
|
|
148
|
+
</div>
|
|
149
|
+
|
|
150
|
+
<div class="sm:flex sm:flex-row-reverse mt-5 sm:mt-4">
|
|
151
|
+
<button type="submit" class="inline-flex justify-center px-3 py-2 sm:ml-3 w-full sm:w-auto font-semibold text-sm text-white bg-blue-600 hover:bg-blue-500 rounded-md shadow-sm">Add Product</button>
|
|
152
|
+
<button type="button" @click="closeProductModal()" class="inline-flex justify-center mt-3 px-3 py-2 sm:mt-0 w-full sm:w-auto 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">Cancel</button>
|
|
153
|
+
</div>
|
|
154
|
+
</form>
|
|
155
|
+
</div>
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
</div>
|
|
162
|
+
|
|
163
|
+
<script client>
|
|
164
|
+
import { useProducts } from '../../../../functions/commerce/products'
|
|
165
|
+
import { useCategories } from '../../../../functions/commerce/products/categories'
|
|
166
|
+
import { useManufacturers } from '../../../../functions/commerce/products/manufacturers'
|
|
167
|
+
|
|
168
|
+
interface Product {
|
|
169
|
+
id?: number
|
|
170
|
+
uuid?: string
|
|
171
|
+
name: string
|
|
172
|
+
description: string
|
|
173
|
+
price?: number
|
|
174
|
+
image_url?: string
|
|
175
|
+
is_available?: number
|
|
176
|
+
inventory_count?: number
|
|
177
|
+
preparation_time?: number
|
|
178
|
+
allergens?: string
|
|
179
|
+
nutritional_info?: string
|
|
180
|
+
category_id?: number
|
|
181
|
+
manufacturer_id?: number
|
|
182
|
+
created_at?: string
|
|
183
|
+
category?: { id?: number, name?: string }
|
|
184
|
+
manufacturer?: { id?: number, name?: string }
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
interface Category { id: number, name: string }
|
|
188
|
+
interface Manufacturer { id: number, name: string }
|
|
189
|
+
|
|
190
|
+
const { products, createProduct, fetchProducts } = useProducts()
|
|
191
|
+
const { categories, fetchCategories } = useCategories()
|
|
192
|
+
const { manufacturers, fetchManufacturers } = useManufacturers()
|
|
193
|
+
|
|
194
|
+
const viewMode = state('list')
|
|
195
|
+
const categoryFilter = state('all')
|
|
196
|
+
const sortBy = state('name')
|
|
197
|
+
const sortOrder = state<'asc' | 'desc'>('asc')
|
|
198
|
+
|
|
199
|
+
const searchQuery = state('')
|
|
200
|
+
const currentPage = state(1)
|
|
201
|
+
const itemsPerPage = state(5)
|
|
202
|
+
|
|
203
|
+
const showProductModal = state(false)
|
|
204
|
+
|
|
205
|
+
const newName = state('')
|
|
206
|
+
const newDescription = state('')
|
|
207
|
+
const newPrice = state(0)
|
|
208
|
+
const newSalePrice = state<number | null>(null)
|
|
209
|
+
const newCategoryId = state(0)
|
|
210
|
+
const newManufacturerId = state(0)
|
|
211
|
+
const newImageUrl = state('')
|
|
212
|
+
const newInventory = state(0)
|
|
213
|
+
const newStatus = state('Active')
|
|
214
|
+
const newFeatured = state(false)
|
|
215
|
+
|
|
216
|
+
function categoryOptions(): Category[] {
|
|
217
|
+
return ((categories.value as Category[]) || [])
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function manufacturerOptions(): Manufacturer[] {
|
|
221
|
+
return ((manufacturers.value as Manufacturer[]) || [])
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const filteredProducts = derived(() => {
|
|
225
|
+
const list = (products.value as Product[]) || []
|
|
226
|
+
const query = searchQuery().toLowerCase()
|
|
227
|
+
const cat = categoryFilter()
|
|
228
|
+
return list
|
|
229
|
+
.filter((product) => {
|
|
230
|
+
const matchesSearch = product.name.toLowerCase().includes(query)
|
|
231
|
+
|| product.description.toLowerCase().includes(query)
|
|
232
|
+
|| (product.category?.name || '').toLowerCase().includes(query)
|
|
233
|
+
const matchesCategory = cat === 'all' || (product.category?.name || '') === cat
|
|
234
|
+
return matchesSearch && matchesCategory
|
|
235
|
+
})
|
|
236
|
+
.sort((a, b) => {
|
|
237
|
+
let comparison = 0
|
|
238
|
+
const sb = sortBy()
|
|
239
|
+
if (sb === 'name')
|
|
240
|
+
comparison = a.name.localeCompare(b.name)
|
|
241
|
+
else if (sb === 'price')
|
|
242
|
+
comparison = (a.price || 0) - (b.price || 0)
|
|
243
|
+
else if (sb === 'inventory')
|
|
244
|
+
comparison = (a.inventory_count || 0) - (b.inventory_count || 0)
|
|
245
|
+
else if (sb === 'dateAdded') {
|
|
246
|
+
const dateA = a.created_at ? new Date(a.created_at).getTime() : 0
|
|
247
|
+
const dateB = b.created_at ? new Date(b.created_at).getTime() : 0
|
|
248
|
+
comparison = dateA - dateB
|
|
249
|
+
}
|
|
250
|
+
return sortOrder() === 'asc' ? comparison : -comparison
|
|
251
|
+
})
|
|
252
|
+
})
|
|
253
|
+
|
|
254
|
+
const paginatedProducts = derived(() => {
|
|
255
|
+
const start = (currentPage() - 1) * itemsPerPage()
|
|
256
|
+
return filteredProducts().slice(start, start + itemsPerPage())
|
|
257
|
+
})
|
|
258
|
+
|
|
259
|
+
const totalItems = derived(() => filteredProducts().length)
|
|
260
|
+
|
|
261
|
+
const categoryFilterOptions = derived(() => {
|
|
262
|
+
const list = (products.value as Product[]) || []
|
|
263
|
+
const counts = list.reduce((acc, product) => {
|
|
264
|
+
const name = product.category?.name || 'Unknown'
|
|
265
|
+
acc[name] = (acc[name] || 0) + 1
|
|
266
|
+
return acc
|
|
267
|
+
}, {} as Record<string, number>)
|
|
268
|
+
return Object.entries(counts).map(([name, count]) => ({ name, count }))
|
|
269
|
+
})
|
|
270
|
+
|
|
271
|
+
const categoryNames = derived(() => categoryFilterOptions().map(c => c.name))
|
|
272
|
+
|
|
273
|
+
function setViewMode(mode: string): void {
|
|
274
|
+
viewMode.set(mode)
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
function handleSearch(query: string): void {
|
|
278
|
+
searchQuery.set(query)
|
|
279
|
+
currentPage.set(1)
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
function handlePrevPage(): void {
|
|
283
|
+
if (currentPage() > 1)
|
|
284
|
+
currentPage.update(p => p - 1)
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
function handleNextPage(): void {
|
|
288
|
+
const totalPages = Math.ceil(totalItems() / itemsPerPage())
|
|
289
|
+
if (currentPage() < totalPages)
|
|
290
|
+
currentPage.update(p => p + 1)
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
function handlePageChange(page: number): void {
|
|
294
|
+
currentPage.set(page)
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
function toggleSort(column: string): void {
|
|
298
|
+
if (sortBy() === column) {
|
|
299
|
+
sortOrder.set(sortOrder() === 'asc' ? 'desc' : 'asc')
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
sortBy.set(column)
|
|
303
|
+
sortOrder.set('asc')
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
function viewProduct(product: Product): void {
|
|
308
|
+
navigate(`/dashboard/commerce/products/${product.id}`)
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
function editProduct(product: Product): void {
|
|
312
|
+
navigate(`/dashboard/commerce/products/${product.id}?edit=true`)
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
function resetForm(): void {
|
|
316
|
+
newName.set('')
|
|
317
|
+
newDescription.set('')
|
|
318
|
+
newPrice.set(0)
|
|
319
|
+
newSalePrice.set(null)
|
|
320
|
+
newCategoryId.set(0)
|
|
321
|
+
newManufacturerId.set(0)
|
|
322
|
+
newImageUrl.set('')
|
|
323
|
+
newInventory.set(0)
|
|
324
|
+
newStatus.set('Active')
|
|
325
|
+
newFeatured.set(false)
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
function openAddProductModal(): void {
|
|
329
|
+
resetForm()
|
|
330
|
+
showProductModal.set(true)
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
function closeProductModal(): void {
|
|
334
|
+
showProductModal.set(false)
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
async function addProduct(): Promise<void> {
|
|
338
|
+
try {
|
|
339
|
+
await createProduct({
|
|
340
|
+
name: newName(),
|
|
341
|
+
description: newDescription(),
|
|
342
|
+
price: newPrice(),
|
|
343
|
+
image_url: newImageUrl(),
|
|
344
|
+
is_available: newStatus() === 'Active' ? 1 : 0,
|
|
345
|
+
inventory_count: newInventory(),
|
|
346
|
+
preparation_time: 0,
|
|
347
|
+
allergens: '',
|
|
348
|
+
nutritional_info: '',
|
|
349
|
+
category_id: newCategoryId(),
|
|
350
|
+
manufacturer_id: newManufacturerId(),
|
|
351
|
+
})
|
|
352
|
+
closeProductModal()
|
|
353
|
+
await fetchProducts()
|
|
354
|
+
}
|
|
355
|
+
catch (error) {
|
|
356
|
+
// eslint-disable-next-line no-console
|
|
357
|
+
console.error('Failed to create product:', error)
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
onMount(async () => {
|
|
362
|
+
await Promise.all([
|
|
363
|
+
fetchProducts(),
|
|
364
|
+
fetchCategories(),
|
|
365
|
+
fetchManufacturers(),
|
|
366
|
+
])
|
|
367
|
+
})
|
|
368
|
+
</script>
|
|
369
|
+
|
|
370
|
+
@endsection
|