create-appraisejs 0.1.6 → 0.1.8-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -45
- package/dist/cli.js +4 -4
- package/dist/cli.js.map +1 -1
- package/dist/copy-template.d.ts +2 -1
- package/dist/copy-template.d.ts.map +1 -1
- package/dist/copy-template.js +10 -7
- package/dist/copy-template.js.map +1 -1
- package/dist/copy-template.test.js +19 -0
- package/dist/copy-template.test.js.map +1 -1
- package/package.json +69 -67
- package/templates/default/.vscode/settings.json +5 -0
- package/templates/default/appraisejs.config.json +1 -1
- package/templates/default/components.json +24 -24
- package/templates/default/cucumber.mjs +16 -0
- package/templates/default/eslint.config.mjs +15 -15
- package/templates/default/next.config.ts +13 -7
- package/templates/default/package-lock.json +13732 -14321
- package/templates/default/package.json +11 -9
- package/templates/default/postcss.config.mjs +8 -8
- package/templates/default/prisma/migrations/20251104113456_add_type_for_template_step_groups/migration.sql +16 -16
- package/templates/default/prisma/migrations/20251104170946_add_tags_to_test_suite_and_test_case/migration.sql +27 -27
- package/templates/default/prisma/migrations/20251112190024_add_cascade_delete_to_test_run_test_case/migration.sql +17 -17
- package/templates/default/prisma/migrations/20251113181100_add_test_run_log/migration.sql +12 -12
- package/templates/default/prisma/migrations/20251119191838_add_tag_type/migration.sql +28 -28
- package/templates/default/prisma/migrations/20251121164059_add_conflict_resolution/migration.sql +12 -12
- package/templates/default/prisma/migrations/20251223183400_add_report_model_to_db_schema/migration.sql +10 -10
- package/templates/default/prisma/migrations/20251223183637_add_report_test_case_entity_for_storing_test_results_for_individual_test_cases/migration.sql +10 -10
- package/templates/default/prisma/migrations/20251224083549_add_comprehensive_report_storage/migration.sql +108 -108
- package/templates/default/prisma/migrations/20251229194422_migrate_duration_to_string/migration.sql +55 -55
- package/templates/default/prisma/migrations/20251230124637_add_unique_constraint_to_test_run_name/migration.sql +27 -27
- package/templates/default/prisma/migrations/20260115094436_add_dashboard_metrics/migration.sql +59 -59
- package/templates/default/prisma/migrations/20260127172022_add_cascade_delete_to_step_parameters/migration.sql +34 -34
- package/templates/default/prisma/schema.prisma +554 -554
- package/templates/default/scripts/regenerate-features.ts +94 -94
- package/templates/default/scripts/setup-env.ts +19 -19
- package/templates/default/scripts/sync-all.ts +341 -341
- package/templates/default/scripts/sync-appraise-base-template.ts +52 -2
- package/templates/default/scripts/sync-environments.ts +323 -323
- package/templates/default/scripts/sync-locator-groups.ts +413 -413
- package/templates/default/scripts/sync-locators.ts +402 -402
- package/templates/default/scripts/sync-modules.ts +349 -349
- package/templates/default/scripts/sync-tags.ts +292 -292
- package/templates/default/scripts/sync-template-step-groups.ts +399 -399
- package/templates/default/scripts/sync-template-steps.ts +806 -806
- package/templates/default/scripts/sync-test-cases.ts +905 -905
- package/templates/default/scripts/sync-test-suites.ts +411 -411
- package/templates/default/src/actions/conflict/conflict.action.ts +33 -33
- package/templates/default/src/actions/dashboard/dashboard-actions.ts +240 -240
- package/templates/default/src/actions/environments/environment-actions.ts +205 -205
- package/templates/default/src/actions/locator/locator-actions.ts +547 -547
- package/templates/default/src/actions/locator-groups/locator-group-actions.ts +344 -344
- package/templates/default/src/actions/modules/module-actions.ts +133 -133
- package/templates/default/src/actions/reports/report-actions.ts +613 -613
- package/templates/default/src/actions/review/review-actions.ts +147 -147
- package/templates/default/src/actions/tags/tag-actions.ts +104 -104
- package/templates/default/src/actions/template-step/template-step-actions.ts +332 -332
- package/templates/default/src/actions/template-step-group/template-step-group-actions.ts +278 -278
- package/templates/default/src/actions/template-test-case/template-test-case-actions.ts +238 -238
- package/templates/default/src/actions/test-case/test-case-actions.ts +419 -419
- package/templates/default/src/actions/test-run/test-run-actions.ts +1185 -1185
- package/templates/default/src/actions/test-suite/test-suite-actions.ts +253 -253
- package/templates/default/src/actions/user/user-actions.ts +13 -13
- package/templates/default/src/app/(base)/environments/create/page.tsx +28 -28
- package/templates/default/src/app/(base)/environments/environment-form.tsx +219 -219
- package/templates/default/src/app/(base)/environments/environment-table-columns.tsx +96 -96
- package/templates/default/src/app/(base)/environments/environment-table.tsx +24 -24
- package/templates/default/src/app/(base)/environments/modify/[id]/page.tsx +46 -46
- package/templates/default/src/app/(base)/environments/page.tsx +59 -59
- package/templates/default/src/app/(base)/layout.tsx +10 -10
- package/templates/default/src/app/(base)/locator-groups/create/page.tsx +44 -44
- package/templates/default/src/app/(base)/locator-groups/locator-group-form.tsx +215 -215
- package/templates/default/src/app/(base)/locator-groups/locator-group-table-columns.tsx +77 -77
- package/templates/default/src/app/(base)/locator-groups/locator-group-table.tsx +28 -28
- package/templates/default/src/app/(base)/locator-groups/modify/[id]/page.tsx +46 -46
- package/templates/default/src/app/(base)/locator-groups/page.tsx +61 -61
- package/templates/default/src/app/(base)/locators/create/page.tsx +38 -38
- package/templates/default/src/app/(base)/locators/locator-form.tsx +163 -163
- package/templates/default/src/app/(base)/locators/locator-table-columns.tsx +73 -90
- package/templates/default/src/app/(base)/locators/locator-table.tsx +28 -28
- package/templates/default/src/app/(base)/locators/modify/[id]/page.tsx +45 -45
- package/templates/default/src/app/(base)/locators/page.tsx +65 -65
- package/templates/default/src/app/(base)/locators/sync-locators-button.tsx +66 -66
- package/templates/default/src/app/(base)/modules/create/page.tsx +34 -34
- package/templates/default/src/app/(base)/modules/modify/[id]/page.tsx +46 -46
- package/templates/default/src/app/(base)/modules/module-form.tsx +126 -126
- package/templates/default/src/app/(base)/modules/module-table-columns.tsx +85 -85
- package/templates/default/src/app/(base)/modules/module-table.tsx +24 -24
- package/templates/default/src/app/(base)/modules/page.tsx +59 -59
- package/templates/default/src/app/(base)/reports/[id]/page.tsx +517 -517
- package/templates/default/src/app/(base)/reports/duration-chart.tsx +33 -33
- package/templates/default/src/app/(base)/reports/feature-chart.tsx +78 -78
- package/templates/default/src/app/(base)/reports/overview-chart.tsx +46 -46
- package/templates/default/src/app/(base)/reports/page.tsx +98 -98
- package/templates/default/src/app/(base)/reports/report-metric-card.tsx +16 -16
- package/templates/default/src/app/(base)/reports/report-table-columns.tsx +189 -189
- package/templates/default/src/app/(base)/reports/report-table.tsx +72 -72
- package/templates/default/src/app/(base)/reports/report-view-table-columns.tsx +131 -131
- package/templates/default/src/app/(base)/reports/report-view-table.tsx +82 -82
- package/templates/default/src/app/(base)/reports/test-cases/page.tsx +42 -42
- package/templates/default/src/app/(base)/reports/test-cases/test-cases-metric-table-columns.tsx +115 -115
- package/templates/default/src/app/(base)/reports/test-cases/test-cases-metric-table.tsx +27 -27
- package/templates/default/src/app/(base)/reports/test-suites/page.tsx +42 -42
- package/templates/default/src/app/(base)/reports/test-suites/test-suites-metric-table-columns.tsx +79 -79
- package/templates/default/src/app/(base)/reports/test-suites/test-suites-metric-table.tsx +27 -27
- package/templates/default/src/app/(base)/reports/view-logs-button.tsx +60 -60
- package/templates/default/src/app/(base)/reviews/create/page.tsx +26 -26
- package/templates/default/src/app/(base)/reviews/created-reviews-table.tsx +15 -15
- package/templates/default/src/app/(base)/reviews/modify/[id]/page.tsx +26 -26
- package/templates/default/src/app/(base)/reviews/page.tsx +26 -26
- package/templates/default/src/app/(base)/reviews/review/[id]/page.tsx +26 -26
- package/templates/default/src/app/(base)/reviews/review-form.tsx +11 -11
- package/templates/default/src/app/(base)/reviews/review-table-by-creator-columns.tsx +9 -9
- package/templates/default/src/app/(base)/reviews/review-table-by-reviewer-columns.tsx +9 -9
- package/templates/default/src/app/(base)/reviews/reviewer-reviews-table.tsx +15 -15
- package/templates/default/src/app/(base)/tags/create/page.tsx +39 -39
- package/templates/default/src/app/(base)/tags/modify/[id]/page.tsx +50 -50
- package/templates/default/src/app/(base)/tags/page.tsx +58 -58
- package/templates/default/src/app/(base)/tags/tag-form.tsx +147 -147
- package/templates/default/src/app/(base)/tags/tag-table-columns.tsx +63 -63
- package/templates/default/src/app/(base)/tags/tag-table.tsx +29 -29
- package/templates/default/src/app/(base)/template-step-groups/create/page.tsx +28 -28
- package/templates/default/src/app/(base)/template-step-groups/modify/[id]/page.tsx +45 -45
- package/templates/default/src/app/(base)/template-step-groups/page.tsx +60 -60
- package/templates/default/src/app/(base)/template-step-groups/template-step-group-form.tsx +167 -167
- package/templates/default/src/app/(base)/template-step-groups/template-step-group-table-columns.tsx +89 -89
- package/templates/default/src/app/(base)/template-step-groups/template-step-group-table.tsx +32 -32
- package/templates/default/src/app/(base)/template-steps/create/page.tsx +37 -37
- package/templates/default/src/app/(base)/template-steps/modify/[id]/page.tsx +49 -49
- package/templates/default/src/app/(base)/template-steps/page.tsx +59 -59
- package/templates/default/src/app/(base)/template-steps/paramChip.tsx +213 -213
- package/templates/default/src/app/(base)/template-steps/template-step-form.tsx +384 -384
- package/templates/default/src/app/(base)/template-steps/template-step-table-columns.tsx +158 -158
- package/templates/default/src/app/(base)/template-steps/template-step-table.tsx +24 -24
- package/templates/default/src/app/(base)/template-test-cases/create/page.tsx +56 -56
- package/templates/default/src/app/(base)/template-test-cases/modify/[id]/page.tsx +89 -89
- package/templates/default/src/app/(base)/template-test-cases/page.tsx +58 -58
- package/templates/default/src/app/(base)/template-test-cases/template-test-case-flow.tsx +84 -84
- package/templates/default/src/app/(base)/template-test-cases/template-test-case-form.tsx +262 -262
- package/templates/default/src/app/(base)/template-test-cases/template-test-case-table-columns.tsx +76 -76
- package/templates/default/src/app/(base)/template-test-cases/template-test-case-table.tsx +32 -32
- package/templates/default/src/app/(base)/test-cases/create/page.tsx +76 -76
- package/templates/default/src/app/(base)/test-cases/create-from-template/generate/[id]/page.tsx +96 -96
- package/templates/default/src/app/(base)/test-cases/create-from-template/page.tsx +38 -38
- package/templates/default/src/app/(base)/test-cases/create-from-template/template-selection-form.tsx +73 -73
- package/templates/default/src/app/(base)/test-cases/modify/[id]/page.tsx +106 -106
- package/templates/default/src/app/(base)/test-cases/page.tsx +60 -60
- package/templates/default/src/app/(base)/test-cases/test-case-flow.tsx +82 -82
- package/templates/default/src/app/(base)/test-cases/test-case-form.tsx +395 -395
- package/templates/default/src/app/(base)/test-cases/test-case-table-columns.tsx +90 -90
- package/templates/default/src/app/(base)/test-cases/test-case-table.tsx +35 -35
- package/templates/default/src/app/(base)/test-runs/[id]/page.tsx +56 -56
- package/templates/default/src/app/(base)/test-runs/create/page.tsx +47 -47
- package/templates/default/src/app/(base)/test-runs/page.tsx +60 -60
- package/templates/default/src/app/(base)/test-runs/test-run-form.tsx +508 -512
- package/templates/default/src/app/(base)/test-runs/test-run-table-columns.tsx +229 -229
- package/templates/default/src/app/(base)/test-runs/test-run-table.tsx +127 -127
- package/templates/default/src/app/(base)/test-suites/create/page.tsx +45 -45
- package/templates/default/src/app/(base)/test-suites/modify/[id]/page.tsx +55 -55
- package/templates/default/src/app/(base)/test-suites/page.tsx +82 -82
- package/templates/default/src/app/(base)/test-suites/test-suite-form.tsx +269 -269
- package/templates/default/src/app/(base)/test-suites/test-suite-table-columns.tsx +97 -97
- package/templates/default/src/app/(base)/test-suites/test-suite-table.tsx +29 -29
- package/templates/default/src/app/(dashboard-components)/app-drawer.tsx +187 -187
- package/templates/default/src/app/(dashboard-components)/data-card-grid.tsx +12 -12
- package/templates/default/src/app/(dashboard-components)/data-card.tsx +26 -26
- package/templates/default/src/app/(dashboard-components)/execution-health-panel.tsx +56 -56
- package/templates/default/src/app/(dashboard-components)/ongoing-test-runs-card.tsx +87 -87
- package/templates/default/src/app/(dashboard-components)/quick-actions-drawer.tsx +44 -44
- package/templates/default/src/app/api/test-runs/[runId]/download/route.ts +133 -133
- package/templates/default/src/app/api/test-runs/[runId]/logs/route.ts +420 -420
- package/templates/default/src/app/api/test-runs/[runId]/trace/[testCaseId]/route.ts +146 -146
- package/templates/default/src/app/globals.css +147 -147
- package/templates/default/src/app/layout.tsx +171 -171
- package/templates/default/src/app/page.tsx +64 -64
- package/templates/default/src/assets/icons/empty-tube.tsx +23 -23
- package/templates/default/src/assets/icons/tube-plus.tsx +29 -29
- package/templates/default/src/components/base-node.tsx +21 -21
- package/templates/default/src/components/chart/pie-chart.tsx +73 -73
- package/templates/default/src/components/data-extraction/locator-inspector.tsx +460 -460
- package/templates/default/src/components/data-state/empty-state.tsx +40 -40
- package/templates/default/src/components/data-visualization/info-card.tsx +70 -70
- package/templates/default/src/components/data-visualization/info-grid.tsx +22 -22
- package/templates/default/src/components/devtools/providers.tsx +19 -13
- package/templates/default/src/components/diagram/button-edge.tsx +54 -54
- package/templates/default/src/components/diagram/dynamic-parameters.tsx +438 -438
- package/templates/default/src/components/diagram/edit-header-option.tsx +36 -36
- package/templates/default/src/components/diagram/flow-diagram.tsx +470 -470
- package/templates/default/src/components/diagram/node-form.tsx +262 -262
- package/templates/default/src/components/diagram/options-header-node.tsx +57 -57
- package/templates/default/src/components/diagram/template-step-combobox.tsx +155 -155
- package/templates/default/src/components/form/error-message.tsx +7 -7
- package/templates/default/src/components/kokonutui/smooth-tab.tsx +453 -453
- package/templates/default/src/components/loading-skeleton/data-table/data-table-skeleton.tsx +30 -30
- package/templates/default/src/components/loading-skeleton/form/button-skeleton.tsx +8 -8
- package/templates/default/src/components/loading-skeleton/form/icon-button-skeleton.tsx +8 -8
- package/templates/default/src/components/loading-skeleton/form/text-input-skeleton.tsx +8 -8
- package/templates/default/src/components/loading-skeleton/visualization/table-skeleton.tsx +14 -14
- package/templates/default/src/components/logo.tsx +15 -15
- package/templates/default/src/components/navigation/command-badge.tsx +34 -34
- package/templates/default/src/components/navigation/command-chain-input.tsx +51 -51
- package/templates/default/src/components/navigation/entity-search-command.tsx +116 -116
- package/templates/default/src/components/navigation/nav-card.tsx +31 -31
- package/templates/default/src/components/navigation/nav-command.tsx +508 -508
- package/templates/default/src/components/navigation/nav-link.tsx +60 -60
- package/templates/default/src/components/navigation/nav-menu-card-deck.tsx +112 -112
- package/templates/default/src/components/node-header.tsx +159 -159
- package/templates/default/src/components/reports/test-case-logs-modal.tsx +253 -253
- package/templates/default/src/components/table/table-actions.tsx +172 -172
- package/templates/default/src/components/test-run/download-logs-button.tsx +99 -99
- package/templates/default/src/components/test-run/log-viewer.tsx +445 -445
- package/templates/default/src/components/test-run/test-run-details.tsx +611 -611
- package/templates/default/src/components/test-run/test-run-header.tsx +149 -149
- package/templates/default/src/components/test-run/view-report-button.tsx +102 -102
- package/templates/default/src/components/theme/mode-toggle.tsx +54 -54
- package/templates/default/src/components/theme/theme-provider.tsx +8 -8
- package/templates/default/src/components/typography/page-header-subtitle.tsx +7 -7
- package/templates/default/src/components/typography/page-header.tsx +7 -7
- package/templates/default/src/components/ui/alert-dialog.tsx +106 -106
- package/templates/default/src/components/ui/alert.tsx +43 -43
- package/templates/default/src/components/ui/avatar.tsx +40 -40
- package/templates/default/src/components/ui/badge.tsx +29 -29
- package/templates/default/src/components/ui/button.tsx +47 -47
- package/templates/default/src/components/ui/calendar.tsx +158 -158
- package/templates/default/src/components/ui/card.tsx +43 -43
- package/templates/default/src/components/ui/checkbox.tsx +28 -28
- package/templates/default/src/components/ui/command.tsx +135 -135
- package/templates/default/src/components/ui/data-table-column-header.tsx +61 -61
- package/templates/default/src/components/ui/data-table-pagination.tsx +87 -87
- package/templates/default/src/components/ui/data-table-view-options.tsx +50 -50
- package/templates/default/src/components/ui/data-table.tsx +267 -267
- package/templates/default/src/components/ui/dialog.tsx +97 -97
- package/templates/default/src/components/ui/dropdown-menu.tsx +182 -182
- package/templates/default/src/components/ui/input.tsx +22 -22
- package/templates/default/src/components/ui/kbd.tsx +28 -28
- package/templates/default/src/components/ui/label.tsx +19 -19
- package/templates/default/src/components/ui/loading.tsx +12 -12
- package/templates/default/src/components/ui/multi-select-with-preview.tsx +116 -116
- package/templates/default/src/components/ui/multi-select.tsx +142 -142
- package/templates/default/src/components/ui/navigation-menu.tsx +120 -120
- package/templates/default/src/components/ui/popover.tsx +33 -33
- package/templates/default/src/components/ui/progress.tsx +25 -25
- package/templates/default/src/components/ui/radio-group.tsx +44 -44
- package/templates/default/src/components/ui/scroll-area.tsx +40 -40
- package/templates/default/src/components/ui/select.tsx +151 -144
- package/templates/default/src/components/ui/separator.tsx +22 -22
- package/templates/default/src/components/ui/skeleton.tsx +7 -7
- package/templates/default/src/components/ui/table.tsx +76 -76
- package/templates/default/src/components/ui/tabs.tsx +55 -55
- package/templates/default/src/components/ui/textarea.tsx +21 -21
- package/templates/default/src/components/ui/toast.tsx +113 -113
- package/templates/default/src/components/ui/toaster.tsx +26 -26
- package/templates/default/src/components/user-prompt/delete-prompt.tsx +87 -87
- package/templates/default/src/config/db-config.ts +10 -10
- package/templates/default/src/constants/form-opts/diagram/node-form.ts +30 -30
- package/templates/default/src/constants/form-opts/environment-form-opts.ts +24 -24
- package/templates/default/src/constants/form-opts/locator-form-opts.ts +20 -20
- package/templates/default/src/constants/form-opts/locator-group-form-opts.ts +28 -28
- package/templates/default/src/constants/form-opts/module-form-opts.ts +21 -21
- package/templates/default/src/constants/form-opts/review-form-opts.ts +23 -23
- package/templates/default/src/constants/form-opts/tag-form-opts.ts +42 -42
- package/templates/default/src/constants/form-opts/template-selection-form-opts.ts +16 -16
- package/templates/default/src/constants/form-opts/template-step-group-form-opts.ts +24 -24
- package/templates/default/src/constants/form-opts/template-test-case-form-opts.ts +39 -39
- package/templates/default/src/constants/form-opts/template-test-step-form-opts.ts +36 -36
- package/templates/default/src/constants/form-opts/test-case-form-opts.ts +43 -43
- package/templates/default/src/constants/form-opts/test-run-form-opts.ts +31 -31
- package/templates/default/src/constants/form-opts/test-suite-form-opts.ts +24 -24
- package/templates/default/src/hooks/use-toast.ts +187 -187
- package/templates/default/src/lib/bidirectional-sync.ts +432 -432
- package/templates/default/src/lib/database-sync.ts +531 -531
- package/templates/default/src/lib/environment-file-utils.ts +221 -221
- package/templates/default/src/lib/feature-file-generator.ts +411 -411
- package/templates/default/src/lib/gherkin-parser.ts +259 -259
- package/templates/default/src/lib/locator-group-file-utils.ts +370 -370
- package/templates/default/src/lib/metrics/metric-calculator.ts +613 -613
- package/templates/default/src/lib/module-hierarchy-builder.ts +205 -205
- package/templates/default/src/lib/path-helpers/module-path.ts +71 -71
- package/templates/default/src/lib/test-case-utils.ts +6 -6
- package/templates/default/src/lib/test-run/log-formatter.ts +83 -83
- package/templates/default/src/lib/test-run/process-manager.ts +191 -191
- package/templates/default/src/lib/test-run/report-parser.ts +316 -316
- package/templates/default/src/lib/test-run/test-run-executor.ts +144 -144
- package/templates/default/src/lib/test-run/winston-logger.ts +95 -95
- package/templates/default/src/lib/transformers/gherkin-converter.ts +42 -42
- package/templates/default/src/lib/transformers/key-to-icon-transformer.tsx +95 -95
- package/templates/default/src/lib/transformers/template-test-case-converter.ts +160 -160
- package/templates/default/src/lib/utils/node-param-validation.ts +81 -81
- package/templates/default/src/lib/utils/template-step-file-generator.ts +167 -167
- package/templates/default/src/lib/utils/template-step-file-manager-intelligent.ts +723 -723
- package/templates/default/src/lib/utils/template-step-file-manager.ts +166 -166
- package/templates/default/src/lib/utils.ts +31 -31
- package/templates/default/src/tests/config/executor/world.ts +41 -41
- package/templates/default/src/tests/executor.ts +80 -80
- package/templates/default/src/tests/hooks/hooks.ts +99 -99
- package/templates/default/src/tests/mapping/locator-map.json +1 -1
- package/templates/default/src/tests/steps/actions/click.step.ts +62 -62
- package/templates/default/src/tests/steps/actions/navigation.step.ts +73 -72
- package/templates/default/src/tests/steps/validations/active_state_assertion.step.ts +34 -34
- package/templates/default/src/tests/steps/validations/navigation_assertion.step.ts +24 -23
- package/templates/default/src/tests/steps/validations/text_assertion.step.ts +111 -111
- package/templates/default/src/tests/steps/validations/visibility_assertion.step.ts +30 -30
- package/templates/default/src/tests/support/parameter-types.ts +12 -12
- package/templates/default/src/tests/utils/cache.util.ts +260 -260
- package/templates/default/src/tests/utils/cli.util.ts +177 -177
- package/templates/default/src/tests/utils/environment.util.ts +65 -65
- package/templates/default/src/tests/utils/locator.util.ts +248 -248
- package/templates/default/src/tests/utils/random-data.util.ts +44 -44
- package/templates/default/src/tests/utils/spawner.util.ts +617 -617
- package/templates/default/src/types/diagram/diagram.ts +34 -34
- package/templates/default/src/types/diagram/template-step.ts +11 -11
- package/templates/default/src/types/executor/browser.type.ts +1 -1
- package/templates/default/src/types/form/actionHandler.ts +6 -6
- package/templates/default/src/types/locator/locator.type.ts +11 -11
- package/templates/default/src/types/step/step.type.ts +1 -1
- package/templates/default/src/types/table/data-table.ts +6 -6
- package/templates/default/tailwind.config.ts +62 -62
- package/templates/default/.env +0 -2
- package/templates/default/next-env.d.ts +0 -6
- package/templates/default/prisma/prisma/dev.db +0 -0
- package/templates/default/src/tests/config/environments/environments.json +0 -14
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import * as React from 'react'
|
|
2
|
-
|
|
3
|
-
import { cn } from '@/lib/utils'
|
|
4
|
-
|
|
5
|
-
const Textarea = React.forwardRef<HTMLTextAreaElement, React.ComponentProps<'textarea'>>(
|
|
6
|
-
({ className, ...props }, ref) => {
|
|
7
|
-
return (
|
|
8
|
-
<textarea
|
|
9
|
-
className={cn(
|
|
10
|
-
'flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',
|
|
11
|
-
className,
|
|
12
|
-
)}
|
|
13
|
-
ref={ref}
|
|
14
|
-
{...props}
|
|
15
|
-
/>
|
|
16
|
-
)
|
|
17
|
-
},
|
|
18
|
-
)
|
|
19
|
-
Textarea.displayName = 'Textarea'
|
|
20
|
-
|
|
21
|
-
export { Textarea }
|
|
1
|
+
import * as React from 'react'
|
|
2
|
+
|
|
3
|
+
import { cn } from '@/lib/utils'
|
|
4
|
+
|
|
5
|
+
const Textarea = React.forwardRef<HTMLTextAreaElement, React.ComponentProps<'textarea'>>(
|
|
6
|
+
({ className, ...props }, ref) => {
|
|
7
|
+
return (
|
|
8
|
+
<textarea
|
|
9
|
+
className={cn(
|
|
10
|
+
'flex min-h-[60px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-base shadow-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',
|
|
11
|
+
className,
|
|
12
|
+
)}
|
|
13
|
+
ref={ref}
|
|
14
|
+
{...props}
|
|
15
|
+
/>
|
|
16
|
+
)
|
|
17
|
+
},
|
|
18
|
+
)
|
|
19
|
+
Textarea.displayName = 'Textarea'
|
|
20
|
+
|
|
21
|
+
export { Textarea }
|
|
@@ -1,113 +1,113 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
|
|
3
|
-
import * as React from 'react'
|
|
4
|
-
import * as ToastPrimitives from '@radix-ui/react-toast'
|
|
5
|
-
import { cva, type VariantProps } from 'class-variance-authority'
|
|
6
|
-
import { X } from 'lucide-react'
|
|
7
|
-
|
|
8
|
-
import { cn } from '@/lib/utils'
|
|
9
|
-
|
|
10
|
-
const ToastProvider = ToastPrimitives.Provider
|
|
11
|
-
|
|
12
|
-
const ToastViewport = React.forwardRef<
|
|
13
|
-
React.ElementRef<typeof ToastPrimitives.Viewport>,
|
|
14
|
-
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport>
|
|
15
|
-
>(({ className, ...props }, ref) => (
|
|
16
|
-
<ToastPrimitives.Viewport
|
|
17
|
-
ref={ref}
|
|
18
|
-
className={cn(
|
|
19
|
-
'fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]',
|
|
20
|
-
className,
|
|
21
|
-
)}
|
|
22
|
-
{...props}
|
|
23
|
-
/>
|
|
24
|
-
))
|
|
25
|
-
ToastViewport.displayName = ToastPrimitives.Viewport.displayName
|
|
26
|
-
|
|
27
|
-
const toastVariants = cva(
|
|
28
|
-
'group pointer-events-auto relative flex w-full items-center justify-between space-x-2 overflow-hidden rounded-md border p-4 pr-6 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full',
|
|
29
|
-
{
|
|
30
|
-
variants: {
|
|
31
|
-
variant: {
|
|
32
|
-
default: 'border bg-background text-foreground',
|
|
33
|
-
destructive: 'destructive group border-destructive bg-destructive text-destructive-foreground',
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
defaultVariants: {
|
|
37
|
-
variant: 'default',
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
)
|
|
41
|
-
|
|
42
|
-
const Toast = React.forwardRef<
|
|
43
|
-
React.ElementRef<typeof ToastPrimitives.Root>,
|
|
44
|
-
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> & VariantProps<typeof toastVariants>
|
|
45
|
-
>(({ className, variant, ...props }, ref) => {
|
|
46
|
-
return <ToastPrimitives.Root ref={ref} className={cn(toastVariants({ variant }), className)} {...props} />
|
|
47
|
-
})
|
|
48
|
-
Toast.displayName = ToastPrimitives.Root.displayName
|
|
49
|
-
|
|
50
|
-
const ToastAction = React.forwardRef<
|
|
51
|
-
React.ElementRef<typeof ToastPrimitives.Action>,
|
|
52
|
-
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action>
|
|
53
|
-
>(({ className, ...props }, ref) => (
|
|
54
|
-
<ToastPrimitives.Action
|
|
55
|
-
ref={ref}
|
|
56
|
-
className={cn(
|
|
57
|
-
'inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium transition-colors hover:bg-secondary focus:outline-none focus:ring-1 focus:ring-ring disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive',
|
|
58
|
-
className,
|
|
59
|
-
)}
|
|
60
|
-
{...props}
|
|
61
|
-
/>
|
|
62
|
-
))
|
|
63
|
-
ToastAction.displayName = ToastPrimitives.Action.displayName
|
|
64
|
-
|
|
65
|
-
const ToastClose = React.forwardRef<
|
|
66
|
-
React.ElementRef<typeof ToastPrimitives.Close>,
|
|
67
|
-
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close>
|
|
68
|
-
>(({ className, ...props }, ref) => (
|
|
69
|
-
<ToastPrimitives.Close
|
|
70
|
-
ref={ref}
|
|
71
|
-
className={cn(
|
|
72
|
-
'absolute right-1 top-1 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-1 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600',
|
|
73
|
-
className,
|
|
74
|
-
)}
|
|
75
|
-
toast-close=""
|
|
76
|
-
{...props}
|
|
77
|
-
>
|
|
78
|
-
<X className="h-4 w-4" />
|
|
79
|
-
</ToastPrimitives.Close>
|
|
80
|
-
))
|
|
81
|
-
ToastClose.displayName = ToastPrimitives.Close.displayName
|
|
82
|
-
|
|
83
|
-
const ToastTitle = React.forwardRef<
|
|
84
|
-
React.ElementRef<typeof ToastPrimitives.Title>,
|
|
85
|
-
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title>
|
|
86
|
-
>(({ className, ...props }, ref) => (
|
|
87
|
-
<ToastPrimitives.Title ref={ref} className={cn('text-sm font-semibold [&+div]:text-xs', className)} {...props} />
|
|
88
|
-
))
|
|
89
|
-
ToastTitle.displayName = ToastPrimitives.Title.displayName
|
|
90
|
-
|
|
91
|
-
const ToastDescription = React.forwardRef<
|
|
92
|
-
React.ElementRef<typeof ToastPrimitives.Description>,
|
|
93
|
-
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description>
|
|
94
|
-
>(({ className, ...props }, ref) => (
|
|
95
|
-
<ToastPrimitives.Description ref={ref} className={cn('text-sm opacity-90', className)} {...props} />
|
|
96
|
-
))
|
|
97
|
-
ToastDescription.displayName = ToastPrimitives.Description.displayName
|
|
98
|
-
|
|
99
|
-
type ToastProps = React.ComponentPropsWithoutRef<typeof Toast>
|
|
100
|
-
|
|
101
|
-
type ToastActionElement = React.ReactElement<typeof ToastAction>
|
|
102
|
-
|
|
103
|
-
export {
|
|
104
|
-
type ToastProps,
|
|
105
|
-
type ToastActionElement,
|
|
106
|
-
ToastProvider,
|
|
107
|
-
ToastViewport,
|
|
108
|
-
Toast,
|
|
109
|
-
ToastTitle,
|
|
110
|
-
ToastDescription,
|
|
111
|
-
ToastClose,
|
|
112
|
-
ToastAction,
|
|
113
|
-
}
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import * as React from 'react'
|
|
4
|
+
import * as ToastPrimitives from '@radix-ui/react-toast'
|
|
5
|
+
import { cva, type VariantProps } from 'class-variance-authority'
|
|
6
|
+
import { X } from 'lucide-react'
|
|
7
|
+
|
|
8
|
+
import { cn } from '@/lib/utils'
|
|
9
|
+
|
|
10
|
+
const ToastProvider = ToastPrimitives.Provider
|
|
11
|
+
|
|
12
|
+
const ToastViewport = React.forwardRef<
|
|
13
|
+
React.ElementRef<typeof ToastPrimitives.Viewport>,
|
|
14
|
+
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport>
|
|
15
|
+
>(({ className, ...props }, ref) => (
|
|
16
|
+
<ToastPrimitives.Viewport
|
|
17
|
+
ref={ref}
|
|
18
|
+
className={cn(
|
|
19
|
+
'fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]',
|
|
20
|
+
className,
|
|
21
|
+
)}
|
|
22
|
+
{...props}
|
|
23
|
+
/>
|
|
24
|
+
))
|
|
25
|
+
ToastViewport.displayName = ToastPrimitives.Viewport.displayName
|
|
26
|
+
|
|
27
|
+
const toastVariants = cva(
|
|
28
|
+
'group pointer-events-auto relative flex w-full items-center justify-between space-x-2 overflow-hidden rounded-md border p-4 pr-6 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full',
|
|
29
|
+
{
|
|
30
|
+
variants: {
|
|
31
|
+
variant: {
|
|
32
|
+
default: 'border bg-background text-foreground',
|
|
33
|
+
destructive: 'destructive group border-destructive bg-destructive text-destructive-foreground',
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
defaultVariants: {
|
|
37
|
+
variant: 'default',
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
const Toast = React.forwardRef<
|
|
43
|
+
React.ElementRef<typeof ToastPrimitives.Root>,
|
|
44
|
+
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> & VariantProps<typeof toastVariants>
|
|
45
|
+
>(({ className, variant, ...props }, ref) => {
|
|
46
|
+
return <ToastPrimitives.Root ref={ref} className={cn(toastVariants({ variant }), className)} {...props} />
|
|
47
|
+
})
|
|
48
|
+
Toast.displayName = ToastPrimitives.Root.displayName
|
|
49
|
+
|
|
50
|
+
const ToastAction = React.forwardRef<
|
|
51
|
+
React.ElementRef<typeof ToastPrimitives.Action>,
|
|
52
|
+
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action>
|
|
53
|
+
>(({ className, ...props }, ref) => (
|
|
54
|
+
<ToastPrimitives.Action
|
|
55
|
+
ref={ref}
|
|
56
|
+
className={cn(
|
|
57
|
+
'inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium transition-colors hover:bg-secondary focus:outline-none focus:ring-1 focus:ring-ring disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive',
|
|
58
|
+
className,
|
|
59
|
+
)}
|
|
60
|
+
{...props}
|
|
61
|
+
/>
|
|
62
|
+
))
|
|
63
|
+
ToastAction.displayName = ToastPrimitives.Action.displayName
|
|
64
|
+
|
|
65
|
+
const ToastClose = React.forwardRef<
|
|
66
|
+
React.ElementRef<typeof ToastPrimitives.Close>,
|
|
67
|
+
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close>
|
|
68
|
+
>(({ className, ...props }, ref) => (
|
|
69
|
+
<ToastPrimitives.Close
|
|
70
|
+
ref={ref}
|
|
71
|
+
className={cn(
|
|
72
|
+
'absolute right-1 top-1 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-1 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600',
|
|
73
|
+
className,
|
|
74
|
+
)}
|
|
75
|
+
toast-close=""
|
|
76
|
+
{...props}
|
|
77
|
+
>
|
|
78
|
+
<X className="h-4 w-4" />
|
|
79
|
+
</ToastPrimitives.Close>
|
|
80
|
+
))
|
|
81
|
+
ToastClose.displayName = ToastPrimitives.Close.displayName
|
|
82
|
+
|
|
83
|
+
const ToastTitle = React.forwardRef<
|
|
84
|
+
React.ElementRef<typeof ToastPrimitives.Title>,
|
|
85
|
+
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title>
|
|
86
|
+
>(({ className, ...props }, ref) => (
|
|
87
|
+
<ToastPrimitives.Title ref={ref} className={cn('text-sm font-semibold [&+div]:text-xs', className)} {...props} />
|
|
88
|
+
))
|
|
89
|
+
ToastTitle.displayName = ToastPrimitives.Title.displayName
|
|
90
|
+
|
|
91
|
+
const ToastDescription = React.forwardRef<
|
|
92
|
+
React.ElementRef<typeof ToastPrimitives.Description>,
|
|
93
|
+
React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description>
|
|
94
|
+
>(({ className, ...props }, ref) => (
|
|
95
|
+
<ToastPrimitives.Description ref={ref} className={cn('text-sm opacity-90', className)} {...props} />
|
|
96
|
+
))
|
|
97
|
+
ToastDescription.displayName = ToastPrimitives.Description.displayName
|
|
98
|
+
|
|
99
|
+
type ToastProps = React.ComponentPropsWithoutRef<typeof Toast>
|
|
100
|
+
|
|
101
|
+
type ToastActionElement = React.ReactElement<typeof ToastAction>
|
|
102
|
+
|
|
103
|
+
export {
|
|
104
|
+
type ToastProps,
|
|
105
|
+
type ToastActionElement,
|
|
106
|
+
ToastProvider,
|
|
107
|
+
ToastViewport,
|
|
108
|
+
Toast,
|
|
109
|
+
ToastTitle,
|
|
110
|
+
ToastDescription,
|
|
111
|
+
ToastClose,
|
|
112
|
+
ToastAction,
|
|
113
|
+
}
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
|
|
3
|
-
import { useToast } from '@/hooks/use-toast'
|
|
4
|
-
import { Toast, ToastClose, ToastDescription, ToastProvider, ToastTitle, ToastViewport } from '@/components/ui/toast'
|
|
5
|
-
|
|
6
|
-
export function Toaster() {
|
|
7
|
-
const { toasts } = useToast()
|
|
8
|
-
|
|
9
|
-
return (
|
|
10
|
-
<ToastProvider>
|
|
11
|
-
{toasts.map(function ({ id, title, description, action, ...props }) {
|
|
12
|
-
return (
|
|
13
|
-
<Toast key={id} {...props}>
|
|
14
|
-
<div className="grid gap-1">
|
|
15
|
-
{title && <ToastTitle>{title}</ToastTitle>}
|
|
16
|
-
{description && <ToastDescription>{description}</ToastDescription>}
|
|
17
|
-
</div>
|
|
18
|
-
{action}
|
|
19
|
-
<ToastClose />
|
|
20
|
-
</Toast>
|
|
21
|
-
)
|
|
22
|
-
})}
|
|
23
|
-
<ToastViewport />
|
|
24
|
-
</ToastProvider>
|
|
25
|
-
)
|
|
26
|
-
}
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { useToast } from '@/hooks/use-toast'
|
|
4
|
+
import { Toast, ToastClose, ToastDescription, ToastProvider, ToastTitle, ToastViewport } from '@/components/ui/toast'
|
|
5
|
+
|
|
6
|
+
export function Toaster() {
|
|
7
|
+
const { toasts } = useToast()
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<ToastProvider>
|
|
11
|
+
{toasts.map(function ({ id, title, description, action, ...props }) {
|
|
12
|
+
return (
|
|
13
|
+
<Toast key={id} {...props}>
|
|
14
|
+
<div className="grid gap-1">
|
|
15
|
+
{title && <ToastTitle>{title}</ToastTitle>}
|
|
16
|
+
{description && <ToastDescription>{description}</ToastDescription>}
|
|
17
|
+
</div>
|
|
18
|
+
{action}
|
|
19
|
+
<ToastClose />
|
|
20
|
+
</Toast>
|
|
21
|
+
)
|
|
22
|
+
})}
|
|
23
|
+
<ToastViewport />
|
|
24
|
+
</ToastProvider>
|
|
25
|
+
)
|
|
26
|
+
}
|
|
@@ -1,87 +1,87 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
Dialog,
|
|
5
|
-
DialogContent,
|
|
6
|
-
DialogDescription,
|
|
7
|
-
DialogFooter,
|
|
8
|
-
DialogHeader,
|
|
9
|
-
DialogTitle,
|
|
10
|
-
DialogTrigger,
|
|
11
|
-
DialogClose,
|
|
12
|
-
} from '../ui/dialog'
|
|
13
|
-
import { Button } from '../ui/button'
|
|
14
|
-
import { AlertCircle, Trash, X } from 'lucide-react'
|
|
15
|
-
import { useState } from 'react'
|
|
16
|
-
|
|
17
|
-
export default function DeletePrompt({
|
|
18
|
-
isDisabled,
|
|
19
|
-
dialogTitle,
|
|
20
|
-
dialogDescription,
|
|
21
|
-
confirmationText,
|
|
22
|
-
deleteHandler,
|
|
23
|
-
open,
|
|
24
|
-
onOpenChange,
|
|
25
|
-
}: {
|
|
26
|
-
isDisabled?: boolean
|
|
27
|
-
dialogTitle: string
|
|
28
|
-
dialogDescription: string
|
|
29
|
-
confirmationText: string
|
|
30
|
-
deleteHandler: () => Promise<void>
|
|
31
|
-
open?: boolean
|
|
32
|
-
onOpenChange?: (open: boolean) => void
|
|
33
|
-
}) {
|
|
34
|
-
const [internalOpen, setInternalOpen] = useState(false)
|
|
35
|
-
|
|
36
|
-
// Use controlled state if provided, otherwise use internal state
|
|
37
|
-
const isOpen = open !== undefined ? open : internalOpen
|
|
38
|
-
const setIsOpen = onOpenChange || setInternalOpen
|
|
39
|
-
|
|
40
|
-
// Determine if we're in controlled mode (open prop provided)
|
|
41
|
-
const isControlled = open !== undefined
|
|
42
|
-
|
|
43
|
-
return (
|
|
44
|
-
<Dialog open={isOpen} onOpenChange={setIsOpen}>
|
|
45
|
-
{!isControlled && (
|
|
46
|
-
<DialogTrigger asChild disabled={isDisabled}>
|
|
47
|
-
<Button variant="outline" size="icon">
|
|
48
|
-
<Trash className="h-4 w-4" />
|
|
49
|
-
</Button>
|
|
50
|
-
</DialogTrigger>
|
|
51
|
-
)}
|
|
52
|
-
<DialogContent className="border-none">
|
|
53
|
-
<DialogHeader>
|
|
54
|
-
<DialogTitle className="flex items-end gap-2">
|
|
55
|
-
<AlertCircle className="h-5 w-5" />
|
|
56
|
-
{dialogTitle}
|
|
57
|
-
</DialogTitle>
|
|
58
|
-
<DialogDescription>{dialogDescription}</DialogDescription>
|
|
59
|
-
</DialogHeader>
|
|
60
|
-
<div className="mb-4 flex flex-col gap-2">
|
|
61
|
-
<h1 className="text-md">{confirmationText}</h1>
|
|
62
|
-
</div>
|
|
63
|
-
<DialogFooter>
|
|
64
|
-
<Button
|
|
65
|
-
variant="destructive"
|
|
66
|
-
className="bg-red-500 hover:bg-red-600"
|
|
67
|
-
onClick={async () => {
|
|
68
|
-
await deleteHandler()
|
|
69
|
-
setIsOpen(false)
|
|
70
|
-
}}
|
|
71
|
-
>
|
|
72
|
-
<span className="flex items-center gap-2 text-white">
|
|
73
|
-
<Trash className="h-4 w-4" />
|
|
74
|
-
Delete
|
|
75
|
-
</span>
|
|
76
|
-
</Button>
|
|
77
|
-
<DialogClose asChild className="bg-gray-700 text-white hover:bg-gray-800">
|
|
78
|
-
<Button variant="secondary">
|
|
79
|
-
<X className="h-4 w-4" />
|
|
80
|
-
Cancel
|
|
81
|
-
</Button>
|
|
82
|
-
</DialogClose>
|
|
83
|
-
</DialogFooter>
|
|
84
|
-
</DialogContent>
|
|
85
|
-
</Dialog>
|
|
86
|
-
)
|
|
87
|
-
}
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
Dialog,
|
|
5
|
+
DialogContent,
|
|
6
|
+
DialogDescription,
|
|
7
|
+
DialogFooter,
|
|
8
|
+
DialogHeader,
|
|
9
|
+
DialogTitle,
|
|
10
|
+
DialogTrigger,
|
|
11
|
+
DialogClose,
|
|
12
|
+
} from '../ui/dialog'
|
|
13
|
+
import { Button } from '../ui/button'
|
|
14
|
+
import { AlertCircle, Trash, X } from 'lucide-react'
|
|
15
|
+
import { useState } from 'react'
|
|
16
|
+
|
|
17
|
+
export default function DeletePrompt({
|
|
18
|
+
isDisabled,
|
|
19
|
+
dialogTitle,
|
|
20
|
+
dialogDescription,
|
|
21
|
+
confirmationText,
|
|
22
|
+
deleteHandler,
|
|
23
|
+
open,
|
|
24
|
+
onOpenChange,
|
|
25
|
+
}: {
|
|
26
|
+
isDisabled?: boolean
|
|
27
|
+
dialogTitle: string
|
|
28
|
+
dialogDescription: string
|
|
29
|
+
confirmationText: string
|
|
30
|
+
deleteHandler: () => Promise<void>
|
|
31
|
+
open?: boolean
|
|
32
|
+
onOpenChange?: (open: boolean) => void
|
|
33
|
+
}) {
|
|
34
|
+
const [internalOpen, setInternalOpen] = useState(false)
|
|
35
|
+
|
|
36
|
+
// Use controlled state if provided, otherwise use internal state
|
|
37
|
+
const isOpen = open !== undefined ? open : internalOpen
|
|
38
|
+
const setIsOpen = onOpenChange || setInternalOpen
|
|
39
|
+
|
|
40
|
+
// Determine if we're in controlled mode (open prop provided)
|
|
41
|
+
const isControlled = open !== undefined
|
|
42
|
+
|
|
43
|
+
return (
|
|
44
|
+
<Dialog open={isOpen} onOpenChange={setIsOpen}>
|
|
45
|
+
{!isControlled && (
|
|
46
|
+
<DialogTrigger asChild disabled={isDisabled}>
|
|
47
|
+
<Button variant="outline" size="icon">
|
|
48
|
+
<Trash className="h-4 w-4" />
|
|
49
|
+
</Button>
|
|
50
|
+
</DialogTrigger>
|
|
51
|
+
)}
|
|
52
|
+
<DialogContent className="border-none">
|
|
53
|
+
<DialogHeader>
|
|
54
|
+
<DialogTitle className="flex items-end gap-2">
|
|
55
|
+
<AlertCircle className="h-5 w-5" />
|
|
56
|
+
{dialogTitle}
|
|
57
|
+
</DialogTitle>
|
|
58
|
+
<DialogDescription>{dialogDescription}</DialogDescription>
|
|
59
|
+
</DialogHeader>
|
|
60
|
+
<div className="mb-4 flex flex-col gap-2">
|
|
61
|
+
<h1 className="text-md">{confirmationText}</h1>
|
|
62
|
+
</div>
|
|
63
|
+
<DialogFooter>
|
|
64
|
+
<Button
|
|
65
|
+
variant="destructive"
|
|
66
|
+
className="bg-red-500 hover:bg-red-600"
|
|
67
|
+
onClick={async () => {
|
|
68
|
+
await deleteHandler()
|
|
69
|
+
setIsOpen(false)
|
|
70
|
+
}}
|
|
71
|
+
>
|
|
72
|
+
<span className="flex items-center gap-2 text-white">
|
|
73
|
+
<Trash className="h-4 w-4" />
|
|
74
|
+
Delete
|
|
75
|
+
</span>
|
|
76
|
+
</Button>
|
|
77
|
+
<DialogClose asChild className="bg-gray-700 text-white hover:bg-gray-800">
|
|
78
|
+
<Button variant="secondary">
|
|
79
|
+
<X className="h-4 w-4" />
|
|
80
|
+
Cancel
|
|
81
|
+
</Button>
|
|
82
|
+
</DialogClose>
|
|
83
|
+
</DialogFooter>
|
|
84
|
+
</DialogContent>
|
|
85
|
+
</Dialog>
|
|
86
|
+
)
|
|
87
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { PrismaClient } from '@prisma/client'
|
|
2
|
-
|
|
3
|
-
const globalForPrisma = global as unknown as {
|
|
4
|
-
prisma: PrismaClient | undefined
|
|
5
|
-
}
|
|
6
|
-
const prisma = globalForPrisma.prisma ?? new PrismaClient()
|
|
7
|
-
|
|
8
|
-
if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma
|
|
9
|
-
|
|
10
|
-
export default prisma
|
|
1
|
+
import { PrismaClient } from '@prisma/client'
|
|
2
|
+
|
|
3
|
+
const globalForPrisma = global as unknown as {
|
|
4
|
+
prisma: PrismaClient | undefined
|
|
5
|
+
}
|
|
6
|
+
const prisma = globalForPrisma.prisma ?? new PrismaClient()
|
|
7
|
+
|
|
8
|
+
if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma
|
|
9
|
+
|
|
10
|
+
export default prisma
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
import { StepParameterType } from '@prisma/client'
|
|
2
|
-
import { z } from 'zod'
|
|
3
|
-
|
|
4
|
-
export const nodeDataSchema = z.object({
|
|
5
|
-
label: z.string().min(3, { message: 'Label must be at least 3 characters' }),
|
|
6
|
-
gherkinStep: z.string(),
|
|
7
|
-
templateStepId: z.string().min(1, { message: 'Template step is required' }),
|
|
8
|
-
parameters: z.array(
|
|
9
|
-
z.object({
|
|
10
|
-
name: z.string(),
|
|
11
|
-
value: z.string(),
|
|
12
|
-
type: z.nativeEnum(StepParameterType),
|
|
13
|
-
order: z.number(),
|
|
14
|
-
}),
|
|
15
|
-
),
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
export type NodeData = z.infer<typeof nodeDataSchema>
|
|
19
|
-
|
|
20
|
-
export const formOpts = {
|
|
21
|
-
defaultValues: {
|
|
22
|
-
label: '',
|
|
23
|
-
gherkinStep: '',
|
|
24
|
-
templateStepId: '',
|
|
25
|
-
parameters: [],
|
|
26
|
-
} as NodeData,
|
|
27
|
-
validators: {
|
|
28
|
-
onChange: nodeDataSchema,
|
|
29
|
-
},
|
|
30
|
-
}
|
|
1
|
+
import { StepParameterType } from '@prisma/client'
|
|
2
|
+
import { z } from 'zod'
|
|
3
|
+
|
|
4
|
+
export const nodeDataSchema = z.object({
|
|
5
|
+
label: z.string().min(3, { message: 'Label must be at least 3 characters' }),
|
|
6
|
+
gherkinStep: z.string(),
|
|
7
|
+
templateStepId: z.string().min(1, { message: 'Template step is required' }),
|
|
8
|
+
parameters: z.array(
|
|
9
|
+
z.object({
|
|
10
|
+
name: z.string(),
|
|
11
|
+
value: z.string(),
|
|
12
|
+
type: z.nativeEnum(StepParameterType),
|
|
13
|
+
order: z.number(),
|
|
14
|
+
}),
|
|
15
|
+
),
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
export type NodeData = z.infer<typeof nodeDataSchema>
|
|
19
|
+
|
|
20
|
+
export const formOpts = {
|
|
21
|
+
defaultValues: {
|
|
22
|
+
label: '',
|
|
23
|
+
gherkinStep: '',
|
|
24
|
+
templateStepId: '',
|
|
25
|
+
parameters: [],
|
|
26
|
+
} as NodeData,
|
|
27
|
+
validators: {
|
|
28
|
+
onChange: nodeDataSchema,
|
|
29
|
+
},
|
|
30
|
+
}
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import { z } from 'zod'
|
|
2
|
-
|
|
3
|
-
export const environmentSchema = z.object({
|
|
4
|
-
name: z.string().min(1, { message: 'Name is required' }),
|
|
5
|
-
baseUrl: z.string().url({ message: 'Base URL must be a valid URL' }),
|
|
6
|
-
apiBaseUrl: z.string().url({ message: 'API Base URL must be a valid URL' }).optional().or(z.literal('')),
|
|
7
|
-
username: z.string().optional().or(z.literal('')),
|
|
8
|
-
password: z.string().optional().or(z.literal('')),
|
|
9
|
-
})
|
|
10
|
-
|
|
11
|
-
export type Environment = z.infer<typeof environmentSchema>
|
|
12
|
-
|
|
13
|
-
export const formOpts = {
|
|
14
|
-
defaultValues: {
|
|
15
|
-
name: '',
|
|
16
|
-
baseUrl: '',
|
|
17
|
-
apiBaseUrl: '',
|
|
18
|
-
username: '',
|
|
19
|
-
password: '',
|
|
20
|
-
},
|
|
21
|
-
validators: {
|
|
22
|
-
onChange: environmentSchema,
|
|
23
|
-
},
|
|
24
|
-
}
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
|
|
3
|
+
export const environmentSchema = z.object({
|
|
4
|
+
name: z.string().min(1, { message: 'Name is required' }),
|
|
5
|
+
baseUrl: z.string().url({ message: 'Base URL must be a valid URL' }),
|
|
6
|
+
apiBaseUrl: z.string().url({ message: 'API Base URL must be a valid URL' }).optional().or(z.literal('')),
|
|
7
|
+
username: z.string().optional().or(z.literal('')),
|
|
8
|
+
password: z.string().optional().or(z.literal('')),
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
export type Environment = z.infer<typeof environmentSchema>
|
|
12
|
+
|
|
13
|
+
export const formOpts = {
|
|
14
|
+
defaultValues: {
|
|
15
|
+
name: '',
|
|
16
|
+
baseUrl: '',
|
|
17
|
+
apiBaseUrl: '',
|
|
18
|
+
username: '',
|
|
19
|
+
password: '',
|
|
20
|
+
},
|
|
21
|
+
validators: {
|
|
22
|
+
onChange: environmentSchema,
|
|
23
|
+
},
|
|
24
|
+
}
|