@nexttylabs/echo 0.2.0
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/.changeset/README.md +21 -0
- package/.changeset/config.json +11 -0
- package/.changeset/cozy-ghosts-care.md +5 -0
- package/.changeset/sharp-lines-stand.md +5 -0
- package/.changeset/sour-doodles-eat.md +5 -0
- package/.changeset/tender-moose-shop.md +5 -0
- package/.github/pull_request_template.md +13 -0
- package/.github/workflows/ci.yml +41 -0
- package/.github/workflows/publish.yml +44 -0
- package/.github/workflows/release.yml +73 -0
- package/AGENTS.md +92 -0
- package/CHANGELOG.md +13 -0
- package/Dockerfile +57 -0
- package/LICENSE +661 -0
- package/Makefile +77 -0
- package/README.md +198 -0
- package/app/(auth)/login/page.tsx +53 -0
- package/app/(auth)/register/page.tsx +48 -0
- package/app/(auth)/sign-in/page.tsx +22 -0
- package/app/(dashboard)/admin/feedback/[id]/edit/page.tsx +103 -0
- package/app/(dashboard)/admin/feedback/[id]/page.tsx +154 -0
- package/app/(dashboard)/admin/feedback/new/page.tsx +91 -0
- package/app/(dashboard)/admin/feedback/page.tsx +81 -0
- package/app/(dashboard)/admin/layout.tsx +48 -0
- package/app/(dashboard)/analytics/portal/page.tsx +30 -0
- package/app/(dashboard)/dashboard/page.tsx +133 -0
- package/app/(dashboard)/layout.tsx +69 -0
- package/app/(dashboard)/no-access/page.tsx +45 -0
- package/app/(dashboard)/settings/access/page.tsx +56 -0
- package/app/(dashboard)/settings/api-keys/page.tsx +55 -0
- package/app/(dashboard)/settings/appearance/page.tsx +40 -0
- package/app/(dashboard)/settings/branding/page.tsx +62 -0
- package/app/(dashboard)/settings/changelog/page.tsx +51 -0
- package/app/(dashboard)/settings/danger-zone/page.tsx +92 -0
- package/app/(dashboard)/settings/feedback/page.tsx +63 -0
- package/app/(dashboard)/settings/integrations/page.tsx +94 -0
- package/app/(dashboard)/settings/layout.tsx +43 -0
- package/app/(dashboard)/settings/modules/page.tsx +54 -0
- package/app/(dashboard)/settings/notifications/page.tsx +48 -0
- package/app/(dashboard)/settings/organization/page.tsx +104 -0
- package/app/(dashboard)/settings/organization/portal/access/page.tsx +22 -0
- package/app/(dashboard)/settings/organization/portal/experience/page.tsx +22 -0
- package/app/(dashboard)/settings/organization/portal/growth/page.tsx +22 -0
- package/app/(dashboard)/settings/organization/portal/layout.tsx +24 -0
- package/app/(dashboard)/settings/organization/portal/page.tsx +22 -0
- package/app/(dashboard)/settings/organizations/[orgId]/members/page.tsx +69 -0
- package/app/(dashboard)/settings/organizations/new/page.tsx +36 -0
- package/app/(dashboard)/settings/page.tsx +22 -0
- package/app/(dashboard)/settings/portal-access/page.tsx +53 -0
- package/app/(dashboard)/settings/portal-branding/page.tsx +59 -0
- package/app/(dashboard)/settings/portal-growth/page.tsx +57 -0
- package/app/(dashboard)/settings/portal-modules/page.tsx +49 -0
- package/app/(dashboard)/settings/portal-resources/page.tsx +66 -0
- package/app/(dashboard)/settings/profile/page.tsx +48 -0
- package/app/(dashboard)/settings/widgets/page.tsx +63 -0
- package/app/(public)/[organizationSlug]/changelog/page.tsx +109 -0
- package/app/(public)/[organizationSlug]/feedback/[id]/page.tsx +146 -0
- package/app/(public)/[organizationSlug]/page.tsx +160 -0
- package/app/(public)/[organizationSlug]/roadmap/page.tsx +142 -0
- package/app/(public)/docs/page.tsx +48 -0
- package/app/(public)/feedback/[id]/not-found.tsx +33 -0
- package/app/(public)/feedback/[id]/page.tsx +102 -0
- package/app/(public)/invite/[token]/page.tsx +121 -0
- package/app/(public)/page.tsx +22 -0
- package/app/(public)/widget/[organizationId]/page.tsx +122 -0
- package/app/api/_utils.ts +29 -0
- package/app/api/admin/backup/route.ts +72 -0
- package/app/api/api-keys/[keyId]/route.ts +92 -0
- package/app/api/api-keys/route.ts +116 -0
- package/app/api/auth/[...all]/route.ts +21 -0
- package/app/api/auth/clear-session/route.ts +43 -0
- package/app/api/auth/register/handler.ts +176 -0
- package/app/api/auth/register/route.ts +26 -0
- package/app/api/docs/route.ts +28 -0
- package/app/api/feedback/[id]/comments/[commentId]/route.ts +105 -0
- package/app/api/feedback/[id]/comments/route.ts +421 -0
- package/app/api/feedback/[id]/duplicates/route.ts +285 -0
- package/app/api/feedback/[id]/handler.ts +91 -0
- package/app/api/feedback/[id]/processing-status/route.ts +199 -0
- package/app/api/feedback/[id]/reclassify/route.ts +145 -0
- package/app/api/feedback/[id]/route.ts +511 -0
- package/app/api/feedback/[id]/suggest-tags/route.ts +227 -0
- package/app/api/feedback/[id]/sync-github/route.ts +52 -0
- package/app/api/feedback/[id]/vote/route.ts +431 -0
- package/app/api/feedback/bulk/route.ts +212 -0
- package/app/api/feedback/handler.ts +138 -0
- package/app/api/feedback/route.ts +298 -0
- package/app/api/feedback/similar/route.ts +100 -0
- package/app/api/health/route.test.ts +64 -0
- package/app/api/health/route.ts +92 -0
- package/app/api/identify/jwt/route.ts +29 -0
- package/app/api/integrations/github/route.ts +196 -0
- package/app/api/internal/domain-lookup/route.ts +67 -0
- package/app/api/invitations/accept/handler.ts +101 -0
- package/app/api/invitations/accept/route.ts +29 -0
- package/app/api/notifications/preferences/route.ts +109 -0
- package/app/api/organizations/[orgId]/handler.ts +123 -0
- package/app/api/organizations/[orgId]/invitations/handler.ts +121 -0
- package/app/api/organizations/[orgId]/invitations/route.ts +29 -0
- package/app/api/organizations/[orgId]/members/[memberId]/handler.ts +208 -0
- package/app/api/organizations/[orgId]/members/[memberId]/route.ts +30 -0
- package/app/api/organizations/[orgId]/members/handler.ts +77 -0
- package/app/api/organizations/[orgId]/members/route.ts +29 -0
- package/app/api/organizations/[orgId]/route.ts +30 -0
- package/app/api/organizations/handler.ts +97 -0
- package/app/api/organizations/route.ts +29 -0
- package/app/api/tags/sync/route.ts +88 -0
- package/app/api/upload/handler.ts +79 -0
- package/app/api/upload/route.ts +37 -0
- package/app/api/v1/feedback/[id]/route.ts +276 -0
- package/app/api/v1/feedback/route.ts +250 -0
- package/app/api/v1/spec/route.ts +356 -0
- package/app/api/webhooks/[webhookId]/route.ts +213 -0
- package/app/api/webhooks/github/route.ts +158 -0
- package/app/api/webhooks/route.ts +143 -0
- package/app/favicon.ico +0 -0
- package/app/globals.css +139 -0
- package/app/health/route.ts +108 -0
- package/app/layout.tsx +60 -0
- package/bun.lock +2503 -0
- package/components/api/rate-limit-info.tsx +86 -0
- package/components/api-keys/api-key-manager.tsx +262 -0
- package/components/auth/login-form.tsx +207 -0
- package/components/auth/register-form.tsx +230 -0
- package/components/comment/comment-form.tsx +111 -0
- package/components/comment/internal-notes.tsx +219 -0
- package/components/comment/public-comments.tsx +387 -0
- package/components/component-example-client-only.tsx +29 -0
- package/components/component-example.tsx +519 -0
- package/components/dashboard/index.ts +22 -0
- package/components/dashboard/organization-switcher.tsx +96 -0
- package/components/dashboard/quick-actions.tsx +57 -0
- package/components/dashboard/recent-feedback-list.tsx +152 -0
- package/components/dashboard/stats-cards.tsx +88 -0
- package/components/dashboard/status-chart.tsx +106 -0
- package/components/example.tsx +70 -0
- package/components/feedback/attachment-list.tsx +103 -0
- package/components/feedback/auto-classification-badge.tsx +92 -0
- package/components/feedback/classification-override.tsx +64 -0
- package/components/feedback/duplicate-suggestions-inline.tsx +158 -0
- package/components/feedback/duplicate-suggestions.tsx +188 -0
- package/components/feedback/embedded-feedback-form.tsx +439 -0
- package/components/feedback/feedback-actions.tsx +160 -0
- package/components/feedback/feedback-bulk-actions.tsx +184 -0
- package/components/feedback/feedback-detail-view.tsx +321 -0
- package/components/feedback/feedback-detail.tsx +305 -0
- package/components/feedback/feedback-edit-form.tsx +131 -0
- package/components/feedback/feedback-filters.tsx +222 -0
- package/components/feedback/feedback-list-controls.tsx +433 -0
- package/components/feedback/feedback-list-item.tsx +298 -0
- package/components/feedback/feedback-list-skeleton.tsx +49 -0
- package/components/feedback/feedback-list.tsx +523 -0
- package/components/feedback/feedback-sorter.tsx +117 -0
- package/components/feedback/feedback-stats.tsx +124 -0
- package/components/feedback/file-upload.tsx +289 -0
- package/components/feedback/processing-status.tsx +161 -0
- package/components/feedback/status-history.tsx +134 -0
- package/components/feedback/status-selector.tsx +153 -0
- package/components/feedback/submit-on-behalf-form.tsx +403 -0
- package/components/feedback/tag-suggestions.tsx +212 -0
- package/components/feedback/vote-button.tsx +113 -0
- package/components/feedback/vote-list.tsx +108 -0
- package/components/integrations/github-config.tsx +200 -0
- package/components/landing/hero.tsx +150 -0
- package/components/layout/dashboard-layout.tsx +59 -0
- package/components/layout/index.ts +20 -0
- package/components/layout/language-switcher.tsx +129 -0
- package/components/layout/mobile-sidebar.tsx +66 -0
- package/components/layout/sidebar.tsx +279 -0
- package/components/portal/changelog-entry.tsx +132 -0
- package/components/portal/changelog-list.tsx +85 -0
- package/components/portal/contributor-badge.tsx +29 -0
- package/components/portal/contributors-sidebar.tsx +98 -0
- package/components/portal/create-post-dialog.tsx +247 -0
- package/components/portal/feedback-board.tsx +205 -0
- package/components/portal/feedback-post-card.tsx +198 -0
- package/components/portal/help-center.tsx +169 -0
- package/components/portal/leaderboard.tsx +29 -0
- package/components/portal/portal-header.tsx +153 -0
- package/components/portal/portal-layout.tsx +62 -0
- package/components/portal/portal-modules-panel.tsx +118 -0
- package/components/portal/portal-nav.tsx +59 -0
- package/components/portal/portal-overview.tsx +174 -0
- package/components/portal/portal-settings-nav.tsx +62 -0
- package/components/portal/portal-settings-shell.tsx +71 -0
- package/components/portal/portal-shell.tsx +62 -0
- package/components/portal/portal-tab-nav.tsx +77 -0
- package/components/portal/project-switcher.tsx +20 -0
- package/components/portal/roadmap-board.tsx +82 -0
- package/components/portal/roadmap-card.tsx +76 -0
- package/components/portal/roadmap-column.tsx +78 -0
- package/components/portal/settings-forms/access-form.tsx +194 -0
- package/components/portal/settings-forms/copy-form.tsx +95 -0
- package/components/portal/settings-forms/index.ts +23 -0
- package/components/portal/settings-forms/languages-form.tsx +223 -0
- package/components/portal/settings-forms/seo-form.tsx +156 -0
- package/components/portal/settings-forms/sharing-form.tsx +155 -0
- package/components/portal/settings-forms/theme-form.tsx +104 -0
- package/components/settings/api-keys-list.tsx +167 -0
- package/components/settings/appearance-form.tsx +71 -0
- package/components/settings/index.ts +25 -0
- package/components/settings/invite-member-form.tsx +119 -0
- package/components/settings/notification-preferences.tsx +174 -0
- package/components/settings/organization-form.tsx +165 -0
- package/components/settings/organization-members-list.tsx +197 -0
- package/components/settings/profile-form.tsx +124 -0
- package/components/settings/role-selector.tsx +57 -0
- package/components/settings/settings-sidebar.tsx +115 -0
- package/components/shared/pagination.tsx +215 -0
- package/components/ui/alert-dialog.tsx +201 -0
- package/components/ui/alert.tsx +75 -0
- package/components/ui/avatar.tsx +126 -0
- package/components/ui/badge.tsx +62 -0
- package/components/ui/button.tsx +77 -0
- package/components/ui/card.tsx +111 -0
- package/components/ui/combobox.tsx +311 -0
- package/components/ui/dialog.tsx +158 -0
- package/components/ui/dropdown-menu.tsx +272 -0
- package/components/ui/field.tsx +256 -0
- package/components/ui/input-group.tsx +164 -0
- package/components/ui/input.tsx +36 -0
- package/components/ui/label.tsx +41 -0
- package/components/ui/pagination.tsx +142 -0
- package/components/ui/select.tsx +202 -0
- package/components/ui/separator.tsx +45 -0
- package/components/ui/sheet.tsx +151 -0
- package/components/ui/skeleton.tsx +32 -0
- package/components/ui/switch.tsx +49 -0
- package/components/ui/table.tsx +118 -0
- package/components/ui/tabs.tsx +107 -0
- package/components/ui/textarea.tsx +35 -0
- package/components/ui/tooltip.tsx +78 -0
- package/components/widget/widget-form.tsx +439 -0
- package/components.json +24 -0
- package/db/init/01-init.sql +13 -0
- package/docker-compose.dev.yml +26 -0
- package/docker-compose.yml +98 -0
- package/docs/architecture.md +259 -0
- package/docs/component-inventory.md +261 -0
- package/docs/database-migrations.md +76 -0
- package/docs/development-guide.md +209 -0
- package/docs/e2e-user-flows.csv +31 -0
- package/docs/er-diagram-feedback.mmd +138 -0
- package/docs/er-diagram.mmd +281 -0
- package/docs/i18n-check-report.md +296 -0
- package/docs/index.md +214 -0
- package/docs/logic-chain.md +94 -0
- package/docs/plans/2026-01-02-database-migration-scripts.md +496 -0
- package/docs/plans/2026-01-02-user-login-design.md +37 -0
- package/docs/plans/2026-01-02-user-login.md +437 -0
- package/docs/plans/2026-01-02-user-registration-design.md +47 -0
- package/docs/plans/2026-01-02-user-registration.md +628 -0
- package/docs/plans/2026-01-03-roles-permissions-design.md +20 -0
- package/docs/plans/2026-01-03-roles-permissions.md +266 -0
- package/docs/plans/2026-01-05-authentication-middleware.md +207 -0
- package/docs/plans/2026-01-05-member-removal.md +186 -0
- package/docs/plans/2026-01-05-organization-creation.md +374 -0
- package/docs/plans/2026-01-05-rbac-middleware.md +112 -0
- package/docs/plans/2026-01-05-role-configuration.md +441 -0
- package/docs/plans/2026-01-06-file-upload-support.md +804 -0
- package/docs/plans/2026-01-06-permission-check-hook.md +155 -0
- package/docs/plans/2026-01-06-resource-ownership-check.md +231 -0
- package/docs/plans/2026-01-07-feedback-tracking-link.md +459 -0
- package/docs/plans/2026-01-09-logout-redirect-design.md +52 -0
- package/docs/plans/2026-01-09-phase2-3-plan.md +654 -0
- package/docs/plans/2026-01-09-portal-execution-plan.md +408 -0
- package/docs/plans/2026-01-09-project-delete-feature-design.md +163 -0
- package/docs/plans/2026-01-09-project-delete-implementation.md +451 -0
- package/docs/plans/2026-01-09-project-edit-delete-design.md +52 -0
- package/docs/plans/2026-01-09-settings-center-design.md +114 -0
- package/docs/plans/2026-01-09-settings-center.md +948 -0
- package/docs/plans/2026-01-10-organization-only-design.md +66 -0
- package/docs/plans/2026-01-10-organization-only-implementation.md +433 -0
- package/docs/plans/2026-01-10-portal-settings-restructure-plan.md +18 -0
- package/docs/plans/2026-01-10-project-settings-tabs-design-implementation.md +296 -0
- package/docs/plans/2026-01-14-e2e-playwright-feedback.md +173 -0
- package/docs/plans/2026-01-15-feedback-management-org-context-design.md +82 -0
- package/docs/plans/2026-01-15-feedback-management-org-context-implementation-plan.md +521 -0
- package/docs/plans/2026-01-16-admin-feedback-filters-design.md +75 -0
- package/docs/plans/2026-01-16-admin-feedback-filters-implementation.md +293 -0
- package/docs/plans/2026-01-16-admin-feedback-route-consolidation.md +180 -0
- package/docs/plans/2026-01-16-e2e-test-fixes.md +158 -0
- package/docs/plans/2026-01-17-admin-feedback-filters.md +214 -0
- package/docs/plans/2026-01-17-admin-feedback-improvements.md +453 -0
- package/docs/plans/2026-01-18-changesets-design.md +40 -0
- package/docs/product_changes.md +37 -0
- package/docs/project-overview.md +159 -0
- package/docs/project-scan-report.json +104 -0
- package/docs/route-role-visibility.md +51 -0
- package/docs/source-tree-analysis.md +150 -0
- package/docs/testing/delete-project-manual-tests.md +18 -0
- package/docs/user-story-tracking.md +191 -0
- package/drizzle.config.ts +32 -0
- package/eslint.config.mjs +19 -0
- package/hooks/use-permissions.ts +56 -0
- package/i18n/config.ts +45 -0
- package/i18n/request.ts +28 -0
- package/i18n/resolve-locale.ts +38 -0
- package/lib/api/errors.ts +62 -0
- package/lib/auth/cli-config.ts +35 -0
- package/lib/auth/client.ts +20 -0
- package/lib/auth/config.ts +55 -0
- package/lib/auth/jwt-identity.ts +21 -0
- package/lib/auth/org-context.ts +71 -0
- package/lib/auth/organization.ts +107 -0
- package/lib/auth/permissions.ts +87 -0
- package/lib/auth/session.ts +23 -0
- package/lib/config/rate-limits.ts +64 -0
- package/lib/dashboard/get-dashboard-stats.ts +136 -0
- package/lib/db/index.ts +41 -0
- package/lib/db/migrate.test.ts +49 -0
- package/lib/db/migrate.ts +62 -0
- package/lib/db/migrations/.gitkeep +0 -0
- package/lib/db/migrations/0000_cynical_gladiator.sql +53 -0
- package/lib/db/migrations/0001_wandering_sunfire.sql +27 -0
- package/lib/db/migrations/0002_shallow_speedball.sql +1 -0
- package/lib/db/migrations/0003_add_org_description.sql +1 -0
- package/lib/db/migrations/0003_boring_wild_pack.sql +13 -0
- package/lib/db/migrations/0004_windy_tyrannus.sql +27 -0
- package/lib/db/migrations/0005_perpetual_doorman.sql +5 -0
- package/lib/db/migrations/0006_aberrant_captain_midlands.sql +13 -0
- package/lib/db/migrations/0007_clever_captain_cross.sql +14 -0
- package/lib/db/migrations/0008_sparkling_pandemic.sql +2 -0
- package/lib/db/migrations/0009_happy_black_tom.sql +29 -0
- package/lib/db/migrations/0010_kind_junta.sql +8 -0
- package/lib/db/migrations/0011_mute_squadron_supreme.sql +25 -0
- package/lib/db/migrations/0012_giant_power_man.sql +24 -0
- package/lib/db/migrations/0013_damp_titanium_man.sql +17 -0
- package/lib/db/migrations/0014_blue_alice.sql +18 -0
- package/lib/db/migrations/0015_webhook_tables.sql +41 -0
- package/lib/db/migrations/0016_github_integration.sql +30 -0
- package/lib/db/migrations/0016_overjoyed_ghost_rider.sql +22 -0
- package/lib/db/migrations/0017_slimy_inhumans.sql +6 -0
- package/lib/db/migrations/0018_same_spitfire.sql +1 -0
- package/lib/db/migrations/0019_jittery_loners.sql +16 -0
- package/lib/db/migrations/0019_remove_projects_add_org_settings.sql +14 -0
- package/lib/db/migrations/meta/0000_snapshot.json +374 -0
- package/lib/db/migrations/meta/0001_snapshot.json +553 -0
- package/lib/db/migrations/meta/0002_snapshot.json +560 -0
- package/lib/db/migrations/meta/0003_snapshot.json +650 -0
- package/lib/db/migrations/meta/0004_snapshot.json +852 -0
- package/lib/db/migrations/meta/0005_snapshot.json +900 -0
- package/lib/db/migrations/meta/0006_snapshot.json +1011 -0
- package/lib/db/migrations/meta/0007_snapshot.json +1125 -0
- package/lib/db/migrations/meta/0008_snapshot.json +1146 -0
- package/lib/db/migrations/meta/0009_snapshot.json +1386 -0
- package/lib/db/migrations/meta/0010_snapshot.json +1419 -0
- package/lib/db/migrations/meta/0011_snapshot.json +1615 -0
- package/lib/db/migrations/meta/0012_snapshot.json +1805 -0
- package/lib/db/migrations/meta/0013_snapshot.json +1948 -0
- package/lib/db/migrations/meta/0014_snapshot.json +2082 -0
- package/lib/db/migrations/meta/0015_snapshot.json +2476 -0
- package/lib/db/migrations/meta/0016_snapshot.json +2633 -0
- package/lib/db/migrations/meta/0017_snapshot.json +2680 -0
- package/lib/db/migrations/meta/0018_snapshot.json +2686 -0
- package/lib/db/migrations/meta/0019_snapshot.json +2741 -0
- package/lib/db/migrations/meta/_journal.json +146 -0
- package/lib/db/schema/ai-processing.ts +90 -0
- package/lib/db/schema/api-keys.ts +61 -0
- package/lib/db/schema/attachments.ts +48 -0
- package/lib/db/schema/auth.ts +111 -0
- package/lib/db/schema/comments.ts +74 -0
- package/lib/db/schema/duplicates.ts +80 -0
- package/lib/db/schema/feedback.ts +88 -0
- package/lib/db/schema/github-integrations.ts +66 -0
- package/lib/db/schema/index.ts +35 -0
- package/lib/db/schema/invitations.ts +32 -0
- package/lib/db/schema/notifications.ts +85 -0
- package/lib/db/schema/organization-members.ts +37 -0
- package/lib/db/schema/organization-settings.ts +134 -0
- package/lib/db/schema/organizations.ts +30 -0
- package/lib/db/schema/projects.ts +145 -0
- package/lib/db/schema/status-history.ts +63 -0
- package/lib/db/schema/tags.ts +194 -0
- package/lib/db/schema/user-profiles.ts +31 -0
- package/lib/db/schema/votes.ts +60 -0
- package/lib/db/schema/webhooks.ts +106 -0
- package/lib/feedback/filters.ts +28 -0
- package/lib/feedback/find-similar.ts +49 -0
- package/lib/feedback/get-feedback-by-id.ts +159 -0
- package/lib/feedback/prefill.ts +51 -0
- package/lib/http/get-request-url.ts +28 -0
- package/lib/integrations/github.ts +159 -0
- package/lib/invitations.ts +22 -0
- package/lib/logger.test.ts +31 -0
- package/lib/logger.ts +58 -0
- package/lib/middleware/api-key.ts +126 -0
- package/lib/middleware/rate-limit-keys.ts +47 -0
- package/lib/middleware/rate-limit.ts +148 -0
- package/lib/middleware/rbac.ts +39 -0
- package/lib/middleware/request-id.test.ts +28 -0
- package/lib/middleware/request-id.ts +30 -0
- package/lib/middleware/request-logger.test.ts +36 -0
- package/lib/middleware/request-logger.ts +41 -0
- package/lib/middleware/with-rate-limit.ts +33 -0
- package/lib/portal/analytics.ts +20 -0
- package/lib/portal/contributors.ts +27 -0
- package/lib/portal/i18n.ts +20 -0
- package/lib/portal/leaderboard-settings.ts +20 -0
- package/lib/portal/modules.ts +20 -0
- package/lib/portal/portal-copy.ts +20 -0
- package/lib/portal/public-context.tsx +110 -0
- package/lib/portal/seo.ts +20 -0
- package/lib/portal/settings-context.ts +56 -0
- package/lib/portal/sharing.ts +20 -0
- package/lib/portal/sorting.ts +20 -0
- package/lib/portal/theme.ts +20 -0
- package/lib/services/ai/classifier.ts +296 -0
- package/lib/services/ai/duplicate-detector.ts +255 -0
- package/lib/services/ai/tag-suggester.ts +108 -0
- package/lib/services/api-keys.ts +164 -0
- package/lib/services/backup.ts +173 -0
- package/lib/services/email/templates.ts +158 -0
- package/lib/services/email.ts +68 -0
- package/lib/services/github-sync.ts +205 -0
- package/lib/services/notifications/index.ts +224 -0
- package/lib/services/portal-settings.ts +157 -0
- package/lib/swagger/config.ts +296 -0
- package/lib/swagger/generate.ts +400 -0
- package/lib/upload/file-validator.ts +52 -0
- package/lib/upload/storage.ts +59 -0
- package/lib/utils/format.ts +26 -0
- package/lib/utils/slug.ts +28 -0
- package/lib/utils.ts +23 -0
- package/lib/validations/auth.ts +56 -0
- package/lib/validations/comment.ts +44 -0
- package/lib/validations/feedback.ts +51 -0
- package/lib/validations/invitations.ts +23 -0
- package/lib/validations/organizations.ts +34 -0
- package/lib/validations/projects.ts +49 -0
- package/lib/validators/feedback.ts +57 -0
- package/lib/validators/index.ts +18 -0
- package/lib/webhooks/events.ts +73 -0
- package/lib/webhooks/index.ts +21 -0
- package/lib/webhooks/retry.ts +188 -0
- package/lib/webhooks/sender.ts +183 -0
- package/lib/webhooks/verify.ts +37 -0
- package/lib/workers/feedback-processor.ts +255 -0
- package/messages/en.json +965 -0
- package/messages/jp.json +862 -0
- package/messages/zh-CN.json +855 -0
- package/next-env.d.ts +6 -0
- package/next.config.ts +66 -0
- package/package.json +84 -0
- package/playwright.config.ts +44 -0
- package/postcss.config.mjs +7 -0
- package/proxy.test.ts +131 -0
- package/proxy.ts +190 -0
- package/public/file.svg +1 -0
- package/public/globe.svg +1 -0
- package/public/logo-64.svg +5 -0
- package/public/logo.svg +5 -0
- package/public/next.svg +1 -0
- package/public/openapi.json +673 -0
- package/public/uploads/.gitkeep +0 -0
- package/public/uploads/02695701-ded0-4c81-8a21-9326c1d65448.pdf +1 -0
- package/public/uploads/178843ea-2780-48ef-8988-f4cba442e4cb.pdf +1 -0
- package/public/uploads/24b0a9ef-da93-49da-934f-637f89c7871d.pdf +1 -0
- package/public/uploads/7a11626d-a8e4-4b91-a8eb-20b6213b0a5a.pdf +1 -0
- package/public/uploads/b0703f4d-6e7b-4aab-8191-1a7b15f1b8ee.pdf +1 -0
- package/public/uploads/c8de0aed-4d3a-44aa-83bb-6594b7a2ddb3.pdf +1 -0
- package/public/uploads/e4cce295-0d85-4525-a1b0-a61c45722e26.pdf +1 -0
- package/public/uploads/eb4df45e-563c-48b8-9c68-c18212312426.pdf +1 -0
- package/public/vercel.svg +1 -0
- package/public/widget/embed.js +249 -0
- package/public/window.svg +1 -0
- package/scripts/backup-db.sh +57 -0
- package/scripts/backup-db.ts +24 -0
- package/scripts/generate-openapi.ts +22 -0
- package/scripts/migration-helper.ts +39 -0
- package/scripts/pre-deploy.ts +75 -0
- package/scripts/restore-db.sh +60 -0
- package/scripts/rollback.ts +72 -0
- package/scripts/seed-tags.ts +48 -0
- package/tests/api/feedback-bulk.test.ts +47 -0
- package/tests/api/feedback-by-id.test.ts +67 -0
- package/tests/api/feedback-comments-route-import.test.ts +26 -0
- package/tests/api/feedback-create.test.ts +71 -0
- package/tests/api/feedback-delete.test.ts +160 -0
- package/tests/api/feedback-filter.test.ts +250 -0
- package/tests/api/feedback-list.test.ts +234 -0
- package/tests/api/feedback-route-assignee-condition.test.ts +32 -0
- package/tests/api/feedback-similar.test.ts +46 -0
- package/tests/api/feedback-sort.test.ts +261 -0
- package/tests/api/feedback-status-enum.test.ts +49 -0
- package/tests/api/feedback-status-filter.test.ts +117 -0
- package/tests/api/feedback-submit-on-behalf.test.ts +269 -0
- package/tests/api/feedback.test.ts +175 -0
- package/tests/api/identify-jwt.test.ts +25 -0
- package/tests/api/invitation-accept.test.ts +213 -0
- package/tests/api/organization-invitations.test.ts +186 -0
- package/tests/api/organization-members-list.test.ts +79 -0
- package/tests/api/organization-members.test.ts +340 -0
- package/tests/api/organizations.test.ts +149 -0
- package/tests/api/register.test.ts +112 -0
- package/tests/api/upload.test.ts +103 -0
- package/tests/api/vote.test.ts +82 -0
- package/tests/app/admin-feedback-detail-page.test.tsx +25 -0
- package/tests/app/admin-feedback-list-page.test.tsx +25 -0
- package/tests/app/admin-feedback-new-page.test.tsx +25 -0
- package/tests/app/health-route-helpers.test.ts +27 -0
- package/tests/app/login-page.test.ts +26 -0
- package/tests/app/portal-page.test.ts +29 -0
- package/tests/app/project-portal-overview.test.tsx +25 -0
- package/tests/app/widget-page-import.test.ts +25 -0
- package/tests/components/create-post-dialog-defaults.test.ts +43 -0
- package/tests/components/feedback/duplicate-suggestions-inline.test.tsx +27 -0
- package/tests/components/feedback/embedded-feedback-form.test.tsx +96 -0
- package/tests/components/feedback/feedback-detail.test.tsx +25 -0
- package/tests/components/feedback/feedback-stats.test.tsx +49 -0
- package/tests/components/feedback-bulk-actions.test.tsx +39 -0
- package/tests/components/feedback-i18n-keys.test.ts +70 -0
- package/tests/components/feedback-list-controls-compile.test.ts +25 -0
- package/tests/components/feedback-list-controls.test.tsx +204 -0
- package/tests/components/feedback-list-item.test.tsx +67 -0
- package/tests/components/landing/hero.test.tsx +46 -0
- package/tests/components/layout/language-switcher.test.tsx +25 -0
- package/tests/components/layout/sidebar.test.tsx +157 -0
- package/tests/components/login-form.test.ts +25 -0
- package/tests/components/organization-form.test.ts +32 -0
- package/tests/components/organization-switcher.test.ts +25 -0
- package/tests/components/pagination.test.tsx +43 -0
- package/tests/components/portal-overview.test.tsx +25 -0
- package/tests/components/profile-form.test.tsx +139 -0
- package/tests/components/role-selector.test.ts +31 -0
- package/tests/components/status-chart.test.tsx +90 -0
- package/tests/e2e/auth.e2e.ts +323 -0
- package/tests/e2e/feedback-actions.e2e.ts +471 -0
- package/tests/e2e/feedback-attachment.e2e.ts +168 -0
- package/tests/e2e/feedback-customer.e2e.ts +226 -0
- package/tests/e2e/feedback-management.e2e.ts +565 -0
- package/tests/e2e/feedback-submit.e2e.ts +133 -0
- package/tests/e2e/feedback-view.e2e.ts +297 -0
- package/tests/e2e/fixtures/test-data.ts +235 -0
- package/tests/e2e/health-check.e2e.ts +230 -0
- package/tests/e2e/helpers/test-utils-helpers.test.ts +43 -0
- package/tests/e2e/helpers/test-utils.ts +298 -0
- package/tests/e2e/integration-placeholders.e2e.ts +199 -0
- package/tests/e2e/organization.e2e.ts +292 -0
- package/tests/e2e/permissions.e2e.ts +424 -0
- package/tests/e2e/project-widget.e2e.ts +63 -0
- package/tests/feedback/filters.test.ts +29 -0
- package/tests/hooks/use-permissions.test.ts +52 -0
- package/tests/lib/ai/classifier.test.ts +104 -0
- package/tests/lib/ai/duplicate-detector.test.ts +234 -0
- package/tests/lib/attachments-schema.test.ts +30 -0
- package/tests/lib/auth/session.test.ts +49 -0
- package/tests/lib/auth-client.test.ts +37 -0
- package/tests/lib/auth-config.test.ts +26 -0
- package/tests/lib/feedback-prefill.test.ts +52 -0
- package/tests/lib/feedback-processor.test.ts +41 -0
- package/tests/lib/feedback-schema.test.ts +33 -0
- package/tests/lib/file-validator.test.ts +48 -0
- package/tests/lib/get-feedback-by-id.test.ts +37 -0
- package/tests/lib/invitations.test.ts +35 -0
- package/tests/lib/login-schema.test.ts +36 -0
- package/tests/lib/org-context.test.ts +95 -0
- package/tests/lib/organization-access.test.ts +44 -0
- package/tests/lib/organization-member-role-schema.test.ts +41 -0
- package/tests/lib/permissions.test.ts +88 -0
- package/tests/lib/portal-analytics.test.ts +25 -0
- package/tests/lib/portal-contributors.test.ts +25 -0
- package/tests/lib/portal-copy.test.ts +27 -0
- package/tests/lib/portal-i18n.test.ts +30 -0
- package/tests/lib/portal-leaderboard-settings.test.ts +25 -0
- package/tests/lib/portal-modules.test.ts +25 -0
- package/tests/lib/portal-seo.test.ts +25 -0
- package/tests/lib/portal-sharing.test.ts +25 -0
- package/tests/lib/portal-sorting.test.ts +25 -0
- package/tests/lib/portal-theme.test.ts +25 -0
- package/tests/lib/rate-limit.test.ts +142 -0
- package/tests/lib/resolve-locale.test.ts +34 -0
- package/tests/lib/services/backup.test.ts +145 -0
- package/tests/lib/user-organizations.test.ts +42 -0
- package/tests/lib/user-role-schema.test.ts +33 -0
- package/tests/lib/user-schema.test.ts +25 -0
- package/tests/setup.ts +74 -0
- package/tsconfig.json +34 -0
- package/types/bun-test.d.ts +31 -0
package/messages/en.json
ADDED
|
@@ -0,0 +1,965 @@
|
|
|
1
|
+
{
|
|
2
|
+
"navigation": {
|
|
3
|
+
"dashboard": "Dashboard",
|
|
4
|
+
"feedback": "Feedback",
|
|
5
|
+
"sectionLabel": "Navigation",
|
|
6
|
+
"settings": "Settings",
|
|
7
|
+
"logout": "Log out",
|
|
8
|
+
"openMenu": "Open menu",
|
|
9
|
+
"organization": "Organization",
|
|
10
|
+
"selectOrganization": "Select organization",
|
|
11
|
+
"newOrganization": "New organization"
|
|
12
|
+
},
|
|
13
|
+
"language": {
|
|
14
|
+
"label": "Language",
|
|
15
|
+
"en": "English",
|
|
16
|
+
"zh-CN": "简体中文",
|
|
17
|
+
"jp": "日本語"
|
|
18
|
+
},
|
|
19
|
+
"hero": {
|
|
20
|
+
"title": "Echo",
|
|
21
|
+
"login": "Login",
|
|
22
|
+
"register": "Sign Up",
|
|
23
|
+
"headline": "Open Source Product Feedback Management Platform",
|
|
24
|
+
"description": "Designed for startups to centrally manage product feedback, discover insights, and make informed product decisions.",
|
|
25
|
+
"subtitle": "Start at zero cost, fully control your data.",
|
|
26
|
+
"cta1": "Get Started",
|
|
27
|
+
"cta2": "View Documentation",
|
|
28
|
+
"coreValues": "Core Values",
|
|
29
|
+
"feature1": {
|
|
30
|
+
"title": "Zero Cost Start",
|
|
31
|
+
"description": "Open source core features, free self-hosting, deploy in 5 minutes"
|
|
32
|
+
},
|
|
33
|
+
"feature2": {
|
|
34
|
+
"title": "Data Sovereignty",
|
|
35
|
+
"description": "Full control over user feedback data, compliant with GDPR and other regulations"
|
|
36
|
+
},
|
|
37
|
+
"feature3": {
|
|
38
|
+
"title": "AI Native",
|
|
39
|
+
"description": "Smart classification, duplicate detection, insight discovery for more efficient decisions"
|
|
40
|
+
},
|
|
41
|
+
"feature4": {
|
|
42
|
+
"title": "Easy Integration",
|
|
43
|
+
"description": "Open API and Webhooks for seamless integration with existing workflows"
|
|
44
|
+
},
|
|
45
|
+
"ready": {
|
|
46
|
+
"title": "Ready to Get Started?",
|
|
47
|
+
"description": "Join the startups already using Echo to ensure every user feedback is heard.",
|
|
48
|
+
"cta1": "Create Free Account",
|
|
49
|
+
"cta2": "Have an Account? Login"
|
|
50
|
+
},
|
|
51
|
+
"footer": {
|
|
52
|
+
"title": "Echo - Open Source Product Feedback Management Platform",
|
|
53
|
+
"docs": "Documentation"
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"common": {
|
|
57
|
+
"loading": "Loading...",
|
|
58
|
+
"save": "Save",
|
|
59
|
+
"saving": "Saving...",
|
|
60
|
+
"cancel": "Cancel",
|
|
61
|
+
"delete": "Delete",
|
|
62
|
+
"edit": "Edit",
|
|
63
|
+
"create": "Create",
|
|
64
|
+
"comingSoon": "Coming soon",
|
|
65
|
+
"noData": "No data",
|
|
66
|
+
"settingsSaved": "Settings saved",
|
|
67
|
+
"saveFailed": "Save failed, please try again later",
|
|
68
|
+
"viewAll": "View all",
|
|
69
|
+
"submitFirst": "Submit first feedback",
|
|
70
|
+
"noOrganization": "No associated organization found."
|
|
71
|
+
},
|
|
72
|
+
"validation": {
|
|
73
|
+
"titleRequired": "Title is required",
|
|
74
|
+
"titleMax200": "Title must be 200 characters or less",
|
|
75
|
+
"descriptionRequired": "Description is required",
|
|
76
|
+
"descriptionMax5000": "Description must be 5000 characters or less",
|
|
77
|
+
"customerNameRequired": "Customer name is required",
|
|
78
|
+
"customerNameMax100": "Customer name must be 100 characters or less",
|
|
79
|
+
"emailInvalid": "Please enter a valid email address",
|
|
80
|
+
"typeRequired": "Please select a type",
|
|
81
|
+
"priorityRequired": "Please select a priority"
|
|
82
|
+
},
|
|
83
|
+
"settings": {
|
|
84
|
+
"title": "Settings",
|
|
85
|
+
"groups": {
|
|
86
|
+
"general": "General",
|
|
87
|
+
"brandingCustomizations": "Branding & Customizations",
|
|
88
|
+
"accessAuthentication": "Access & Authentication",
|
|
89
|
+
"modules": "Modules",
|
|
90
|
+
"other": "Other",
|
|
91
|
+
"resources": "Resources"
|
|
92
|
+
},
|
|
93
|
+
"items": {
|
|
94
|
+
"profile": "Profile",
|
|
95
|
+
"organization": "Organization",
|
|
96
|
+
"teamMembers": "Team Members",
|
|
97
|
+
"appearance": "Appearance",
|
|
98
|
+
"branding": "Branding",
|
|
99
|
+
"notificationEmails": "Notification Emails",
|
|
100
|
+
"organizationAccess": "Organization Access",
|
|
101
|
+
"securitySso": "Security & SSO",
|
|
102
|
+
"apiKeys": "API Keys",
|
|
103
|
+
"customizeModules": "Customize Modules",
|
|
104
|
+
"feedbackRoadmap": "Feedback & Roadmap",
|
|
105
|
+
"changelog": "Changelog",
|
|
106
|
+
"widgetsEmbeds": "Widgets & Embeds",
|
|
107
|
+
"integrations": "Integrations",
|
|
108
|
+
"advanced": "Advanced",
|
|
109
|
+
"dangerZone": "Danger Zone",
|
|
110
|
+
"developerDocs": "Developer Docs",
|
|
111
|
+
"joinCommunity": "Join Community"
|
|
112
|
+
},
|
|
113
|
+
"organizationForm": {
|
|
114
|
+
"titleEdit": "Organization Settings",
|
|
115
|
+
"titleCreate": "Create Organization",
|
|
116
|
+
"descEdit": "Manage your organization’s basic information",
|
|
117
|
+
"descCreate": "Create an organization to manage multiple projects or teams",
|
|
118
|
+
"nameLabel": "Organization name",
|
|
119
|
+
"descriptionLabel": "Description",
|
|
120
|
+
"savingEdit": "Saving...",
|
|
121
|
+
"savingCreate": "Creating...",
|
|
122
|
+
"submitEdit": "Save changes",
|
|
123
|
+
"submitCreate": "Create",
|
|
124
|
+
"updateFailed": "Update failed",
|
|
125
|
+
"createFailed": "Create failed",
|
|
126
|
+
"updatedSuccess": "Organization updated",
|
|
127
|
+
"genericError": "Something went wrong. Please try again later."
|
|
128
|
+
},
|
|
129
|
+
"profile": {
|
|
130
|
+
"pageTitle": "Profile",
|
|
131
|
+
"pageDescription": "Manage your account information and preferences",
|
|
132
|
+
"avatarTitle": "Avatar",
|
|
133
|
+
"avatarDescription": "Your profile picture",
|
|
134
|
+
"changeAvatar": "Change Avatar",
|
|
135
|
+
"avatarHint": "Avatar upload coming soon",
|
|
136
|
+
"cardTitle": "Personal Information",
|
|
137
|
+
"cardDescription": "Update your personal details",
|
|
138
|
+
"nameLabel": "Name",
|
|
139
|
+
"namePlaceholder": "Enter your name",
|
|
140
|
+
"nameRequired": "Name is required",
|
|
141
|
+
"nameTooLong": "Name must be 100 characters or less",
|
|
142
|
+
"emailLabel": "Email",
|
|
143
|
+
"emailNote": "Email address cannot be changed",
|
|
144
|
+
"saveChanges": "Save Changes",
|
|
145
|
+
"updating": "Saving...",
|
|
146
|
+
"updateSuccess": "Profile updated successfully",
|
|
147
|
+
"updateFailed": "Failed to update profile"
|
|
148
|
+
},
|
|
149
|
+
"appearance": {
|
|
150
|
+
"pageTitle": "Appearance",
|
|
151
|
+
"pageDescription": "Customize the app's display style",
|
|
152
|
+
"cardTitle": "Appearance",
|
|
153
|
+
"cardDescription": "Customize the app's display style",
|
|
154
|
+
"themeLabel": "Theme",
|
|
155
|
+
"themeLight": "Light",
|
|
156
|
+
"themeDark": "Dark",
|
|
157
|
+
"themeSystem": "System",
|
|
158
|
+
"themeComingSoon": "Theme switching coming soon"
|
|
159
|
+
},
|
|
160
|
+
"notifications": {
|
|
161
|
+
"pageTitle": "Notification Settings",
|
|
162
|
+
"pageDescription": "Choose the types of notifications you want to receive",
|
|
163
|
+
"cardTitle": "Email Notifications",
|
|
164
|
+
"cardDescription": "Choose the types of email notifications you want to receive",
|
|
165
|
+
"statusChange": "Feedback Status Change",
|
|
166
|
+
"statusChangeDesc": "Receive notifications when your submitted feedback status changes",
|
|
167
|
+
"newComment": "New Comment Notification",
|
|
168
|
+
"newCommentDesc": "Receive notifications when others comment on feedback you're following",
|
|
169
|
+
"saveSettings": "Save Settings"
|
|
170
|
+
},
|
|
171
|
+
"apiKeys": {
|
|
172
|
+
"pageTitle": "API Keys",
|
|
173
|
+
"pageDescription": "Manage your API access keys",
|
|
174
|
+
"createTitle": "Create New Key",
|
|
175
|
+
"createDescription": "Create a new API key for external integrations",
|
|
176
|
+
"keyNameLabel": "Key Name",
|
|
177
|
+
"keyNamePlaceholder": "Enter key name",
|
|
178
|
+
"createButton": "Create Key",
|
|
179
|
+
"existingTitle": "Existing Keys",
|
|
180
|
+
"existingDescription": "Manage your API keys",
|
|
181
|
+
"noKeys": "No API keys",
|
|
182
|
+
"keyCreatedAlert": "New key created: {key}\n\nPlease save this key immediately, it will not be shown again.",
|
|
183
|
+
"deleteConfirm": "Are you sure you want to delete this API key? This action cannot be undone."
|
|
184
|
+
},
|
|
185
|
+
"dangerZone": {
|
|
186
|
+
"pageTitle": "Danger Zone",
|
|
187
|
+
"pageDescription": "Irreversible and destructive actions",
|
|
188
|
+
"deleteOrg": "Delete Organization",
|
|
189
|
+
"deleteOrgDesc": "Permanently delete your organization and all its data. This action cannot be undone.",
|
|
190
|
+
"resetData": "Reset All Data",
|
|
191
|
+
"resetDataDesc": "Delete all feedback, roadmap items, and changelog entries. Organization settings will be preserved.",
|
|
192
|
+
"transferOwnership": "Transfer Ownership",
|
|
193
|
+
"transferOwnershipDesc": "Transfer organization ownership to another admin. You will lose owner privileges."
|
|
194
|
+
},
|
|
195
|
+
"advanced": {
|
|
196
|
+
"pageTitle": "Advanced",
|
|
197
|
+
"pageDescription": "Advanced settings and configurations",
|
|
198
|
+
"dataExport": "Data Export",
|
|
199
|
+
"dataExportDesc": "Export all your data",
|
|
200
|
+
"dataExportComingSoon": "Data export coming soon",
|
|
201
|
+
"webhooks": "Webhooks",
|
|
202
|
+
"webhooksDesc": "Configure webhook endpoints",
|
|
203
|
+
"webhooksComingSoon": "Webhook configuration coming soon",
|
|
204
|
+
"developerMode": "Developer Mode",
|
|
205
|
+
"developerModeDesc": "Enable advanced debugging features",
|
|
206
|
+
"developerModeComingSoon": "Developer mode coming soon"
|
|
207
|
+
},
|
|
208
|
+
"security": {
|
|
209
|
+
"pageTitle": "Security & SSO",
|
|
210
|
+
"pageDescription": "Manage security settings and single sign-on",
|
|
211
|
+
"sso": "Single Sign-On (SSO)",
|
|
212
|
+
"ssoDesc": "Configure SAML or OAuth providers",
|
|
213
|
+
"ssoComingSoon": "SSO configuration coming soon",
|
|
214
|
+
"twoFactor": "Two-Factor Authentication",
|
|
215
|
+
"twoFactorDesc": "Require 2FA for team members",
|
|
216
|
+
"twoFactorComingSoon": "2FA settings coming soon"
|
|
217
|
+
},
|
|
218
|
+
"integrations": {
|
|
219
|
+
"pageTitle": "Integrations",
|
|
220
|
+
"pageDescription": "Connect with third-party tools and services",
|
|
221
|
+
"availableTitle": "Available Integrations",
|
|
222
|
+
"availableDesc": "Connect your favorite tools",
|
|
223
|
+
"slack": "Slack",
|
|
224
|
+
"slackDesc": "Get notifications in Slack",
|
|
225
|
+
"jira": "Jira",
|
|
226
|
+
"jiraDesc": "Sync with Jira issues",
|
|
227
|
+
"linear": "Linear",
|
|
228
|
+
"linearDesc": "Connect to Linear projects",
|
|
229
|
+
"discord": "Discord",
|
|
230
|
+
"discordDesc": "Post updates to Discord"
|
|
231
|
+
},
|
|
232
|
+
"widgets": {
|
|
233
|
+
"pageTitle": "Widgets & Embeds",
|
|
234
|
+
"pageDescription": "Embed feedback widgets on your website",
|
|
235
|
+
"feedbackWidget": "Feedback Widget",
|
|
236
|
+
"feedbackWidgetDesc": "Embed a feedback button on your site",
|
|
237
|
+
"feedbackWidgetComingSoon": "Widget configuration coming soon",
|
|
238
|
+
"changelogWidget": "Changelog Widget",
|
|
239
|
+
"changelogWidgetDesc": "Display changelog updates in your app",
|
|
240
|
+
"changelogWidgetComingSoon": "Changelog widget coming soon"
|
|
241
|
+
},
|
|
242
|
+
"access": {
|
|
243
|
+
"pageTitle": "Organization Access",
|
|
244
|
+
"pageDescription": "Control public access and permissions",
|
|
245
|
+
"visibilityTitle": "Visibility & Permissions",
|
|
246
|
+
"visibilityDesc": "Configure public access, voting, and indexing settings"
|
|
247
|
+
},
|
|
248
|
+
"branding": {
|
|
249
|
+
"pageTitle": "Branding",
|
|
250
|
+
"pageDescription": "Customize your portal's visual style and copy",
|
|
251
|
+
"themeTitle": "Theme",
|
|
252
|
+
"themeDesc": "Control colors, fonts and visual appearance",
|
|
253
|
+
"copyTitle": "Copy",
|
|
254
|
+
"copyDesc": "Configure portal title and guide text",
|
|
255
|
+
"languagesTitle": "Languages",
|
|
256
|
+
"languagesDesc": "Configure default language and available languages"
|
|
257
|
+
},
|
|
258
|
+
"modules": {
|
|
259
|
+
"pageTitle": "Customize Modules",
|
|
260
|
+
"pageDescription": "Enable or disable feature modules",
|
|
261
|
+
"configTitle": "Module Configuration",
|
|
262
|
+
"configDesc": "Enable feedback, roadmap and changelog as needed"
|
|
263
|
+
},
|
|
264
|
+
"changelog": {
|
|
265
|
+
"pageTitle": "Changelog",
|
|
266
|
+
"pageDescription": "Configure changelog display and notifications",
|
|
267
|
+
"settingsTitle": "Changelog Settings",
|
|
268
|
+
"settingsDesc": "Control how changelog entries are displayed",
|
|
269
|
+
"settingsComingSoon": "Changelog configuration coming soon"
|
|
270
|
+
},
|
|
271
|
+
"feedbackSettings": {
|
|
272
|
+
"pageTitle": "Feedback & Roadmap",
|
|
273
|
+
"pageDescription": "Configure feedback collection and roadmap display",
|
|
274
|
+
"settingsTitle": "Feedback Settings",
|
|
275
|
+
"settingsDesc": "Configure how users submit and view feedback",
|
|
276
|
+
"settingsComingSoon": "Feedback configuration coming soon",
|
|
277
|
+
"roadmapTitle": "Roadmap Display",
|
|
278
|
+
"roadmapDesc": "Control roadmap visibility and layout",
|
|
279
|
+
"roadmapComingSoon": "Roadmap settings coming soon"
|
|
280
|
+
},
|
|
281
|
+
"portal": {
|
|
282
|
+
"branding": {
|
|
283
|
+
"title": "Portal Branding",
|
|
284
|
+
"description": "Manage portal visual styles and copy language",
|
|
285
|
+
"theme": {
|
|
286
|
+
"title": "Portal Theme",
|
|
287
|
+
"description": "Control colors, fonts and visual experience"
|
|
288
|
+
},
|
|
289
|
+
"copy": {
|
|
290
|
+
"title": "Portal Copy",
|
|
291
|
+
"description": "Unify portal title and guide copy"
|
|
292
|
+
},
|
|
293
|
+
"copyForm": {
|
|
294
|
+
"defaults": {
|
|
295
|
+
"title": "Feedback Hub",
|
|
296
|
+
"ctaLabel": "Submit feedback",
|
|
297
|
+
"emptyStateMessage": "No feedback yet—be the first to share an idea!",
|
|
298
|
+
"successMessage": "Thanks for your feedback! We'll read it carefully.",
|
|
299
|
+
"placeholders": {
|
|
300
|
+
"titleInput": "Enter feedback title...",
|
|
301
|
+
"descriptionInput": "Describe your idea in detail..."
|
|
302
|
+
}
|
|
303
|
+
},
|
|
304
|
+
"labels": {
|
|
305
|
+
"title": "Portal title",
|
|
306
|
+
"description": "Portal description",
|
|
307
|
+
"ctaLabel": "Submit button text",
|
|
308
|
+
"emptyStateMessage": "Empty state message",
|
|
309
|
+
"successMessage": "Success message",
|
|
310
|
+
"placeholdersSection": "Input placeholders",
|
|
311
|
+
"placeholders": {
|
|
312
|
+
"titleInput": "Title input",
|
|
313
|
+
"descriptionInput": "Description input"
|
|
314
|
+
}
|
|
315
|
+
},
|
|
316
|
+
"placeholders": {
|
|
317
|
+
"title": "Feedback Hub",
|
|
318
|
+
"description": "Help us understand your ideas and make the product better",
|
|
319
|
+
"ctaLabel": "Submit feedback",
|
|
320
|
+
"emptyStateMessage": "No feedback...",
|
|
321
|
+
"successMessage": "Thanks for your feedback!",
|
|
322
|
+
"titleInput": "Enter feedback title...",
|
|
323
|
+
"descriptionInput": "Describe your idea in detail..."
|
|
324
|
+
},
|
|
325
|
+
"help": {
|
|
326
|
+
"title": "Displayed at the top of the portal",
|
|
327
|
+
"description": "A short description shown below the title",
|
|
328
|
+
"emptyStateMessage": "Shown when there is no feedback yet",
|
|
329
|
+
"successMessage": "Shown after a user successfully submits feedback"
|
|
330
|
+
},
|
|
331
|
+
"buttons": {
|
|
332
|
+
"save": "Save changes"
|
|
333
|
+
},
|
|
334
|
+
"status": {
|
|
335
|
+
"saved": "Copy settings saved",
|
|
336
|
+
"saveFailed": "Save failed"
|
|
337
|
+
}
|
|
338
|
+
},
|
|
339
|
+
"languages": {
|
|
340
|
+
"title": "Portal Languages",
|
|
341
|
+
"description": "Configure default and optional languages"
|
|
342
|
+
},
|
|
343
|
+
"themeForm": {
|
|
344
|
+
"labels": {
|
|
345
|
+
"mode": "Color mode",
|
|
346
|
+
"primaryColor": "Primary color",
|
|
347
|
+
"accentColor": "Accent color",
|
|
348
|
+
"borderRadius": "Border radius",
|
|
349
|
+
"fontFamily": "Custom font",
|
|
350
|
+
"customCSS": "Custom CSS"
|
|
351
|
+
},
|
|
352
|
+
"placeholders": {
|
|
353
|
+
"mode": "Select color mode",
|
|
354
|
+
"borderRadius": "Select border radius"
|
|
355
|
+
},
|
|
356
|
+
"options": {
|
|
357
|
+
"mode": {
|
|
358
|
+
"light": "Light mode",
|
|
359
|
+
"dark": "Dark mode",
|
|
360
|
+
"system": "Follow system"
|
|
361
|
+
},
|
|
362
|
+
"borderRadius": {
|
|
363
|
+
"none": "No radius",
|
|
364
|
+
"sm": "Small radius",
|
|
365
|
+
"md": "Medium radius",
|
|
366
|
+
"lg": "Large radius",
|
|
367
|
+
"full": "Full radius"
|
|
368
|
+
}
|
|
369
|
+
},
|
|
370
|
+
"help": {
|
|
371
|
+
"primaryColor": "Used for buttons, links and primary elements",
|
|
372
|
+
"accentColor": "Used for highlights and secondary actions",
|
|
373
|
+
"fontFamily": "Leave empty to use system default font",
|
|
374
|
+
"customCSS": "Advanced users can add custom styles"
|
|
375
|
+
},
|
|
376
|
+
"buttons": {
|
|
377
|
+
"save": "Save changes"
|
|
378
|
+
},
|
|
379
|
+
"status": {
|
|
380
|
+
"saved": "Theme settings saved",
|
|
381
|
+
"saveFailed": "Save failed"
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
},
|
|
385
|
+
"access": {
|
|
386
|
+
"title": "Portal Access"
|
|
387
|
+
},
|
|
388
|
+
"overview": {
|
|
389
|
+
"themeSummary": {
|
|
390
|
+
"custom": "Primary color {color}",
|
|
391
|
+
"default": "Using default theme"
|
|
392
|
+
},
|
|
393
|
+
"seoSummary": {
|
|
394
|
+
"unset": "SEO title not set"
|
|
395
|
+
},
|
|
396
|
+
"status": {
|
|
397
|
+
"title": "Portal Status",
|
|
398
|
+
"description": "Portal entry and visibility for the current organization",
|
|
399
|
+
"badgeEnabled": "Public",
|
|
400
|
+
"badgeDisabled": "Closed",
|
|
401
|
+
"preview": "Preview Portal",
|
|
402
|
+
"open": "Open Portal",
|
|
403
|
+
"portalLink": "Portal link:"
|
|
404
|
+
},
|
|
405
|
+
"cards": {
|
|
406
|
+
"action": "Go to settings",
|
|
407
|
+
"experience": {
|
|
408
|
+
"title": "Experience",
|
|
409
|
+
"description": "Theme, copy and language",
|
|
410
|
+
"items": {
|
|
411
|
+
"copyTitle": "Title: {title}",
|
|
412
|
+
"copyTitleUnset": "Portal title not set",
|
|
413
|
+
"defaultLanguage": "Default language: {locale}"
|
|
414
|
+
}
|
|
415
|
+
},
|
|
416
|
+
"growth": {
|
|
417
|
+
"title": "Growth",
|
|
418
|
+
"description": "Sharing and SEO configuration",
|
|
419
|
+
"items": {
|
|
420
|
+
"socialSharingEnabled": "Social sharing configured",
|
|
421
|
+
"socialSharingDisabled": "Social sharing not configured",
|
|
422
|
+
"ogImageSet": "OG image set",
|
|
423
|
+
"ogImageUnset": "OG image not set"
|
|
424
|
+
}
|
|
425
|
+
},
|
|
426
|
+
"visibility": {
|
|
427
|
+
"title": "Visibility",
|
|
428
|
+
"description": "Public access and indexing",
|
|
429
|
+
"items": {
|
|
430
|
+
"portalEnabled": "Portal public",
|
|
431
|
+
"portalDisabled": "Portal closed",
|
|
432
|
+
"publicVotingEnabled": "Public voting allowed",
|
|
433
|
+
"publicVotingDisabled": "Public voting disabled",
|
|
434
|
+
"noIndex": "Indexing disabled",
|
|
435
|
+
"index": "Indexing allowed"
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
},
|
|
439
|
+
"modules": {
|
|
440
|
+
"badge": "Module toggle",
|
|
441
|
+
"summary": "Manage Portal module display"
|
|
442
|
+
}
|
|
443
|
+
},
|
|
444
|
+
"modules": {
|
|
445
|
+
"title": "Portal Modules",
|
|
446
|
+
"panelTitle": "Portal Modules",
|
|
447
|
+
"panelDescription": "Control which feature modules are shown in the portal.",
|
|
448
|
+
"rows": {
|
|
449
|
+
"feedback": {
|
|
450
|
+
"label": "Feedback",
|
|
451
|
+
"description": "Allow users to submit and browse feedback"
|
|
452
|
+
},
|
|
453
|
+
"roadmap": {
|
|
454
|
+
"label": "Roadmap",
|
|
455
|
+
"description": "Show planned features and progress"
|
|
456
|
+
},
|
|
457
|
+
"changelog": {
|
|
458
|
+
"label": "Changelog",
|
|
459
|
+
"description": "Publish updates and release announcements"
|
|
460
|
+
}
|
|
461
|
+
},
|
|
462
|
+
"saveButton": "Save module settings",
|
|
463
|
+
"saving": "Saving...",
|
|
464
|
+
"saved": "Module settings saved",
|
|
465
|
+
"saveFailed": "Save failed"
|
|
466
|
+
},
|
|
467
|
+
"resources": {
|
|
468
|
+
"title": "Portal Resources",
|
|
469
|
+
"links": {
|
|
470
|
+
"title": "Portal Links"
|
|
471
|
+
}
|
|
472
|
+
},
|
|
473
|
+
"growth": {
|
|
474
|
+
"title": "Portal Growth",
|
|
475
|
+
"seo": {
|
|
476
|
+
"title": "SEO Settings"
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
},
|
|
481
|
+
"invite": {
|
|
482
|
+
"status": {
|
|
483
|
+
"loading": {
|
|
484
|
+
"title": "Accepting invitation",
|
|
485
|
+
"description": "Please wait while we confirm your invitation."
|
|
486
|
+
},
|
|
487
|
+
"success": {
|
|
488
|
+
"title": "Welcome to the organization",
|
|
489
|
+
"description": "Invitation confirmed successfully. You can now start collaborating."
|
|
490
|
+
},
|
|
491
|
+
"expired": {
|
|
492
|
+
"title": "Invitation expired",
|
|
493
|
+
"description": "This invitation has expired. Please contact the administrator to resend."
|
|
494
|
+
},
|
|
495
|
+
"unauthorized": {
|
|
496
|
+
"title": "Please log in first",
|
|
497
|
+
"description": "Log in to accept the invitation and join the organization."
|
|
498
|
+
},
|
|
499
|
+
"error": {
|
|
500
|
+
"title": "Unable to accept invitation",
|
|
501
|
+
"description": "The invitation link may be invalid. Please contact the administrator."
|
|
502
|
+
}
|
|
503
|
+
},
|
|
504
|
+
"buttons": {
|
|
505
|
+
"dashboard": "Go to dashboard",
|
|
506
|
+
"login": "Go to login",
|
|
507
|
+
"back": "Back"
|
|
508
|
+
}
|
|
509
|
+
},
|
|
510
|
+
"auth": {
|
|
511
|
+
"login": {
|
|
512
|
+
"pageTitle": "Echo",
|
|
513
|
+
"pageSubtitle": "Sign in to continue accessing your feedback and organization",
|
|
514
|
+
"cardTitle": "Sign In",
|
|
515
|
+
"cardDescription": "Enter your email and password to sign in",
|
|
516
|
+
"emailLabel": "Email",
|
|
517
|
+
"passwordLabel": "Password",
|
|
518
|
+
"rememberMe": "Remember me",
|
|
519
|
+
"forgotPassword": "Forgot password?",
|
|
520
|
+
"submitButton": "Sign In",
|
|
521
|
+
"submitting": "Signing in...",
|
|
522
|
+
"noAccount": "Don't have an account?",
|
|
523
|
+
"register": "Register",
|
|
524
|
+
"invalidCredentials": "Invalid email or password"
|
|
525
|
+
},
|
|
526
|
+
"register": {
|
|
527
|
+
"pageTitle": "Echo",
|
|
528
|
+
"pageSubtitle": "Create a new account to start collecting feedback",
|
|
529
|
+
"cardTitle": "Create Account",
|
|
530
|
+
"cardDescription": "Fill in the information below to register a new account",
|
|
531
|
+
"nameLabel": "Name",
|
|
532
|
+
"namePlaceholder": "John Doe",
|
|
533
|
+
"emailLabel": "Email",
|
|
534
|
+
"passwordLabel": "Password",
|
|
535
|
+
"passwordHint": "At least 8 characters, including uppercase, lowercase, and numbers or special characters",
|
|
536
|
+
"confirmPasswordLabel": "Confirm Password",
|
|
537
|
+
"submitButton": "Register",
|
|
538
|
+
"submitting": "Registering...",
|
|
539
|
+
"hasAccount": "Already have an account?",
|
|
540
|
+
"login": "Sign In",
|
|
541
|
+
"emailExists": "Email already exists",
|
|
542
|
+
"registerFailed": "Registration failed, please try again later"
|
|
543
|
+
},
|
|
544
|
+
"validation": {
|
|
545
|
+
"nameRequired": "Please enter your name",
|
|
546
|
+
"emailRequired": "Please enter your email address",
|
|
547
|
+
"emailInvalid": "Please enter a valid email address",
|
|
548
|
+
"passwordRequired": "Please enter a password",
|
|
549
|
+
"passwordMinLength": "Password must be at least 8 characters",
|
|
550
|
+
"passwordUppercase": "Password must contain an uppercase letter",
|
|
551
|
+
"passwordLowercase": "Password must contain a lowercase letter",
|
|
552
|
+
"passwordNumberOrSpecial": "Password must contain a number or special character",
|
|
553
|
+
"passwordMismatch": "Passwords do not match"
|
|
554
|
+
}
|
|
555
|
+
},
|
|
556
|
+
"dashboard": {
|
|
557
|
+
"pageTitle": "Dashboard",
|
|
558
|
+
"pageDescription": "Feedback management overview",
|
|
559
|
+
"visitPortal": "Visit Web Portal",
|
|
560
|
+
"stats": {
|
|
561
|
+
"totalFeedback": "Total Feedback",
|
|
562
|
+
"pending": "Pending",
|
|
563
|
+
"weeklyNew": "New This Week",
|
|
564
|
+
"resolved": "Resolved"
|
|
565
|
+
},
|
|
566
|
+
"recentFeedback": {
|
|
567
|
+
"title": "Recent Feedback",
|
|
568
|
+
"noData": "No feedback data",
|
|
569
|
+
"count": "{count} items",
|
|
570
|
+
"quantity": "Quantity"
|
|
571
|
+
},
|
|
572
|
+
"quickActions": {
|
|
573
|
+
"submitFeedback": "Submit New Feedback",
|
|
574
|
+
"viewAllFeedback": "View All Feedback",
|
|
575
|
+
"settings": "Settings",
|
|
576
|
+
"organizationSettings": "Organization Settings"
|
|
577
|
+
},
|
|
578
|
+
"statusChart": {
|
|
579
|
+
"title": "Status Distribution",
|
|
580
|
+
"noData": "No data"
|
|
581
|
+
}
|
|
582
|
+
},
|
|
583
|
+
"feedback": {
|
|
584
|
+
"trigger": "Feedback",
|
|
585
|
+
"dialogTitle": "Submit Feedback",
|
|
586
|
+
"dialogDescription": "Fill out the form to submit your suggestions or issues.",
|
|
587
|
+
"form": {
|
|
588
|
+
"title": "Title",
|
|
589
|
+
"titlePlaceholder": "Briefly describe your feedback",
|
|
590
|
+
"description": "Description",
|
|
591
|
+
"descriptionPlaceholder": "Describe what happened or what you'd like to see improved",
|
|
592
|
+
"type": "Feedback Type",
|
|
593
|
+
"selectType": "Select feedback type",
|
|
594
|
+
"priority": "Priority",
|
|
595
|
+
"selectPriority": "Select priority",
|
|
596
|
+
"submit": "Submit",
|
|
597
|
+
"submitting": "Submitting...",
|
|
598
|
+
"cancel": "Cancel"
|
|
599
|
+
},
|
|
600
|
+
"fileUpload": {
|
|
601
|
+
"errors": {
|
|
602
|
+
"size": "File size must be {maxMb}MB or less",
|
|
603
|
+
"type": "Unsupported file type",
|
|
604
|
+
"missingFeedbackId": "Please submit feedback first"
|
|
605
|
+
},
|
|
606
|
+
"dropzone": {
|
|
607
|
+
"title": "Drag files here, or click to select",
|
|
608
|
+
"subtitle": "Supports PNG, JPG, GIF, PDF (max {maxMb}MB)"
|
|
609
|
+
},
|
|
610
|
+
"status": {
|
|
611
|
+
"pending": "Pending",
|
|
612
|
+
"uploading": "Uploading...",
|
|
613
|
+
"success": "✓ Uploaded",
|
|
614
|
+
"error": "✗ Upload failed"
|
|
615
|
+
},
|
|
616
|
+
"buttons": {
|
|
617
|
+
"upload": "Upload files"
|
|
618
|
+
}
|
|
619
|
+
},
|
|
620
|
+
"detail": {
|
|
621
|
+
"info": "Info",
|
|
622
|
+
"createdAt": "Created",
|
|
623
|
+
"updatedAt": "Updated",
|
|
624
|
+
"feedbackId": "Feedback ID: #{id}",
|
|
625
|
+
"copyLinkAriaLabel": "Copy tracking link",
|
|
626
|
+
"priorityLabel": "Priority: {priority}",
|
|
627
|
+
"votes": "Votes",
|
|
628
|
+
"description": "Description",
|
|
629
|
+
"attachments": "Attachments",
|
|
630
|
+
"votesTitle": "Votes",
|
|
631
|
+
"statusHistory": "Status History",
|
|
632
|
+
"backToList": "Back to list",
|
|
633
|
+
"customerInfo": "Customer info (submitted on behalf)",
|
|
634
|
+
"customerName": "Name",
|
|
635
|
+
"customerEmail": "Email",
|
|
636
|
+
"customerPhone": "Phone",
|
|
637
|
+
"descriptionTitle": "Description",
|
|
638
|
+
"attachmentsTitle": "Attachments ({count})",
|
|
639
|
+
"onBehalf": {
|
|
640
|
+
"title": "Submitted on behalf",
|
|
641
|
+
"submitter": "Submitter",
|
|
642
|
+
"customerInfo": "Customer info",
|
|
643
|
+
"name": "Name",
|
|
644
|
+
"email": "Email",
|
|
645
|
+
"phone": "Phone",
|
|
646
|
+
"unknownUser": "Unknown user",
|
|
647
|
+
"customerHidden": "Customer details are hidden for privacy."
|
|
648
|
+
},
|
|
649
|
+
"timeline": {
|
|
650
|
+
"title": "Timeline",
|
|
651
|
+
"createdAt": "Created at",
|
|
652
|
+
"updatedAt": "Last updated"
|
|
653
|
+
},
|
|
654
|
+
"shareHint": "Share this link to track feedback progress",
|
|
655
|
+
"shareLinkLabel": "Share link",
|
|
656
|
+
"copyLink": "Copy link",
|
|
657
|
+
"copied": "Copied",
|
|
658
|
+
"feedbackIdLabel": "Feedback ID",
|
|
659
|
+
"voteHistory": "Voting Record",
|
|
660
|
+
"publicTitle": "Feedback Detail",
|
|
661
|
+
"publicDescription": "View feedback details and updates.",
|
|
662
|
+
"publicHeader": "Feedback Detail",
|
|
663
|
+
"publicBackHome": "Back to home",
|
|
664
|
+
"publicContinueSubmit": "Submit another"
|
|
665
|
+
},
|
|
666
|
+
"submitOnBehalf": {
|
|
667
|
+
"roleNotice": "You are submitting feedback on behalf of a customer as {strong}{role}{/strong}.",
|
|
668
|
+
"submitSuccess": "Feedback submitted successfully!",
|
|
669
|
+
"submitFailed": "Submit failed",
|
|
670
|
+
"networkError": "Network error. Please try again later.",
|
|
671
|
+
"viewDetail": "View feedback details →",
|
|
672
|
+
"cardTitle": "Submit feedback on behalf of a customer",
|
|
673
|
+
"cardDescription": "Submit feedback for a customer; the system will record both your info and the customer info.",
|
|
674
|
+
"sections": {
|
|
675
|
+
"feedback": "Feedback",
|
|
676
|
+
"customer": "Customer information"
|
|
677
|
+
},
|
|
678
|
+
"labels": {
|
|
679
|
+
"title": "Title",
|
|
680
|
+
"description": "Description",
|
|
681
|
+
"type": "Type",
|
|
682
|
+
"priority": "Priority",
|
|
683
|
+
"customerName": "Customer name",
|
|
684
|
+
"customerEmail": "Customer email",
|
|
685
|
+
"customerPhone": "Customer phone (optional)"
|
|
686
|
+
},
|
|
687
|
+
"placeholders": {
|
|
688
|
+
"title": "Briefly describe the issue or request",
|
|
689
|
+
"description": "Describe the issue or request in detail",
|
|
690
|
+
"type": "Select type",
|
|
691
|
+
"priority": "Select priority",
|
|
692
|
+
"customerName": "Customer name",
|
|
693
|
+
"customerEmail": "customer@example.com",
|
|
694
|
+
"customerPhone": "+86 138 0000 0000"
|
|
695
|
+
},
|
|
696
|
+
"submit": "Submit feedback",
|
|
697
|
+
"submitting": "Submitting..."
|
|
698
|
+
},
|
|
699
|
+
"success": "Feedback submitted successfully",
|
|
700
|
+
"tracking": "Tracking link",
|
|
701
|
+
"copy": "Copy link",
|
|
702
|
+
"copied": "Copied",
|
|
703
|
+
"close": "Close",
|
|
704
|
+
"pageTitle": "Feedback Management",
|
|
705
|
+
"pageDescription": "View and manage all user feedback",
|
|
706
|
+
"filters": {
|
|
707
|
+
"title": "Filters",
|
|
708
|
+
"activeCount": "({count} active)",
|
|
709
|
+
"clearAll": "Clear Filters",
|
|
710
|
+
"logicHint": "Within a group: match any • Across groups: match all",
|
|
711
|
+
"statusLabel": "Status",
|
|
712
|
+
"statusPlaceholder": "Select status",
|
|
713
|
+
"typeLabel": "Type",
|
|
714
|
+
"typePlaceholder": "Select type",
|
|
715
|
+
"priorityLabel": "Priority",
|
|
716
|
+
"priorityPlaceholder": "Select priority"
|
|
717
|
+
},
|
|
718
|
+
"status": {
|
|
719
|
+
"label": "Status",
|
|
720
|
+
"all": "All Status",
|
|
721
|
+
"new": "New",
|
|
722
|
+
"inProgress": "In Progress",
|
|
723
|
+
"planned": "Planned",
|
|
724
|
+
"completed": "Completed",
|
|
725
|
+
"closed": "Closed",
|
|
726
|
+
"resolved": "Resolved",
|
|
727
|
+
"updating": "Updating...",
|
|
728
|
+
"updateFailed": "Update failed, please try again later"
|
|
729
|
+
},
|
|
730
|
+
"type": {
|
|
731
|
+
"label": "Type",
|
|
732
|
+
"all": "All Types",
|
|
733
|
+
"bug": "Bug",
|
|
734
|
+
"feature": "Feature Request",
|
|
735
|
+
"issue": "Issue",
|
|
736
|
+
"other": "Other",
|
|
737
|
+
"improvement": "Improvement",
|
|
738
|
+
"question": "Question"
|
|
739
|
+
},
|
|
740
|
+
"priority": {
|
|
741
|
+
"label": "Priority",
|
|
742
|
+
"all": "All Priorities",
|
|
743
|
+
"low": "Low",
|
|
744
|
+
"medium": "Medium",
|
|
745
|
+
"high": "High",
|
|
746
|
+
"critical": "Critical"
|
|
747
|
+
},
|
|
748
|
+
"filterTags": {
|
|
749
|
+
"status": "Status: {value}",
|
|
750
|
+
"type": "Type: {value}",
|
|
751
|
+
"priority": "Priority: {value}"
|
|
752
|
+
},
|
|
753
|
+
"list": {
|
|
754
|
+
"searchPlaceholder": "Search title or description…",
|
|
755
|
+
"searchButton": "Search",
|
|
756
|
+
"sortLabel": "Sort",
|
|
757
|
+
"sortNewest": "Newest",
|
|
758
|
+
"sortOldest": "Oldest",
|
|
759
|
+
"sortMostVotes": "Most votes",
|
|
760
|
+
"sortFewestVotes": "Fewest votes",
|
|
761
|
+
"sort": {
|
|
762
|
+
"createdAt_desc": "Newest",
|
|
763
|
+
"createdAt_asc": "Oldest",
|
|
764
|
+
"voteCount_desc": "Most votes",
|
|
765
|
+
"priority_desc": "Highest priority",
|
|
766
|
+
"status_asc": "Status"
|
|
767
|
+
},
|
|
768
|
+
"pageSizeLabel": "Per page",
|
|
769
|
+
"summary": "Total {total} / {pageSize} per page",
|
|
770
|
+
"empty": "No feedback yet",
|
|
771
|
+
"error": "Error: {message}",
|
|
772
|
+
"filtersEmpty": "No filters",
|
|
773
|
+
"hasVotes": "Has votes",
|
|
774
|
+
"hasReplies": "Has replies",
|
|
775
|
+
"boolYes": "Yes",
|
|
776
|
+
"boolNo": "No",
|
|
777
|
+
"selectLabel": "Select feedback",
|
|
778
|
+
"delete": "Delete feedback",
|
|
779
|
+
"selectAll": "Select all on page",
|
|
780
|
+
"createdAt": "Created"
|
|
781
|
+
},
|
|
782
|
+
"pagination": {
|
|
783
|
+
"previous": "Previous",
|
|
784
|
+
"next": "Next",
|
|
785
|
+
"jumpTo": "Go to",
|
|
786
|
+
"go": "Go",
|
|
787
|
+
"goToPage": "Go to page {page}"
|
|
788
|
+
},
|
|
789
|
+
"bulk": {
|
|
790
|
+
"selectedCount": "{count} selected",
|
|
791
|
+
"updateStatus": "Update status",
|
|
792
|
+
"updatePriority": "Update priority",
|
|
793
|
+
"delete": "Delete",
|
|
794
|
+
"deleteConfirmTitle": "Delete selected feedback?",
|
|
795
|
+
"deleteConfirmDesc": "Deleted feedback will no longer appear in the list.",
|
|
796
|
+
"clearSelection": "Clear selection"
|
|
797
|
+
},
|
|
798
|
+
"vote": {
|
|
799
|
+
"label": "Votes",
|
|
800
|
+
"vote": "Vote",
|
|
801
|
+
"voted": "Voted",
|
|
802
|
+
"count": "{count} votes",
|
|
803
|
+
"noVotes": "No votes yet",
|
|
804
|
+
"visitor": "Visitor",
|
|
805
|
+
"anonymous": "Anonymous"
|
|
806
|
+
},
|
|
807
|
+
"relative": {
|
|
808
|
+
"today": "Today",
|
|
809
|
+
"yesterday": "Yesterday",
|
|
810
|
+
"daysAgo": "{count} days ago"
|
|
811
|
+
},
|
|
812
|
+
"actions": {
|
|
813
|
+
"label": "Feedback actions"
|
|
814
|
+
}
|
|
815
|
+
},
|
|
816
|
+
"integrations": {
|
|
817
|
+
"github": {
|
|
818
|
+
"title": "GitHub Integration",
|
|
819
|
+
"description": "Sync feedback to GitHub Issues for tracking and collaboration",
|
|
820
|
+
"personalAccessToken": "Personal Access Token",
|
|
821
|
+
"owner": "Owner",
|
|
822
|
+
"repository": "Repository",
|
|
823
|
+
"autoSync": "Auto-sync new feedback",
|
|
824
|
+
"webhook": {
|
|
825
|
+
"title": "Configure GitHub Webhook:",
|
|
826
|
+
"events": "Events: Select \"Issues\" only"
|
|
827
|
+
},
|
|
828
|
+
"connecting": "Connecting...",
|
|
829
|
+
"connect": "Connect GitHub",
|
|
830
|
+
"disconnect": "Disconnect",
|
|
831
|
+
"failedToLoad": "Failed to load configuration"
|
|
832
|
+
}
|
|
833
|
+
},
|
|
834
|
+
"widget": {
|
|
835
|
+
"thankYou": "Thank you!",
|
|
836
|
+
"successMessage": "Your feedback has been submitted successfully.",
|
|
837
|
+
"welcomeMessage": "We'd love to hear your thoughts.",
|
|
838
|
+
"title": "Title",
|
|
839
|
+
"description": "Description",
|
|
840
|
+
"priority": "Priority",
|
|
841
|
+
"titlePlaceholder": "What would you like to share?"
|
|
842
|
+
},
|
|
843
|
+
"apiKeys": {
|
|
844
|
+
"loading": "Loading...",
|
|
845
|
+
"empty": "No API keys yet. Create one to get started.",
|
|
846
|
+
"deleteConfirm": "Are you sure you want to delete this API key?",
|
|
847
|
+
"createdAt": "Created",
|
|
848
|
+
"lastUsed": "Last used",
|
|
849
|
+
"dialog": {
|
|
850
|
+
"title": "Your API Key",
|
|
851
|
+
"description": "Please save this key now. You won't be able to see it again after closing.",
|
|
852
|
+
"copy": "Copy to clipboard",
|
|
853
|
+
"copied": "Copied!",
|
|
854
|
+
"close": "Close"
|
|
855
|
+
},
|
|
856
|
+
"create": {
|
|
857
|
+
"title": "Create New API Key",
|
|
858
|
+
"description": "Generate a new API key for programmatic access",
|
|
859
|
+
"placeholder": "e.g., Production API Key",
|
|
860
|
+
"button": "Create",
|
|
861
|
+
"creating": "Creating..."
|
|
862
|
+
},
|
|
863
|
+
"status": {
|
|
864
|
+
"active": "Active",
|
|
865
|
+
"disabled": "Disabled"
|
|
866
|
+
},
|
|
867
|
+
"actions": {
|
|
868
|
+
"enable": "Enable",
|
|
869
|
+
"disable": "Disable",
|
|
870
|
+
"delete": "Delete"
|
|
871
|
+
}
|
|
872
|
+
},
|
|
873
|
+
"comments": {
|
|
874
|
+
"internal": {
|
|
875
|
+
"title": "Internal Notes",
|
|
876
|
+
"loading": "Loading...",
|
|
877
|
+
"empty": "No internal notes yet",
|
|
878
|
+
"beFirst": "Add the first note to start the discussion",
|
|
879
|
+
"formLabel": "Internal note",
|
|
880
|
+
"placeholder": "Add an internal note, e.g., context or next steps…",
|
|
881
|
+
"submit": "Add note",
|
|
882
|
+
"submitting": "Adding...",
|
|
883
|
+
"deleteAriaLabel": "Delete note",
|
|
884
|
+
"errors": {
|
|
885
|
+
"loadFailed": "Failed to load internal notes",
|
|
886
|
+
"addFailed": "Failed to add internal note",
|
|
887
|
+
"deleteFailed": "Failed to delete internal note"
|
|
888
|
+
}
|
|
889
|
+
},
|
|
890
|
+
"public": {
|
|
891
|
+
"title": "Public Comments",
|
|
892
|
+
"loading": "Loading...",
|
|
893
|
+
"empty": "No comments yet",
|
|
894
|
+
"beFirst": "Be the first to comment",
|
|
895
|
+
"loginPrompt": "Log in to comment, or leave an anonymous message",
|
|
896
|
+
"loginRequired": "Log in to leave a comment",
|
|
897
|
+
"login": "Log in",
|
|
898
|
+
"guestComment": "Anonymous comment",
|
|
899
|
+
"formLabel": "Comment",
|
|
900
|
+
"placeholder": "Share your thoughts, e.g., what you liked or what needs improvement…",
|
|
901
|
+
"submit": "Post comment",
|
|
902
|
+
"submitting": "Posting...",
|
|
903
|
+
"anonymous": "Anonymous",
|
|
904
|
+
"guest": "Guest",
|
|
905
|
+
"errors": {
|
|
906
|
+
"loadFailed": "Failed to load comments",
|
|
907
|
+
"submitFailed": "Failed to post comment"
|
|
908
|
+
},
|
|
909
|
+
"guestForm": {
|
|
910
|
+
"title": "Anonymous Comment",
|
|
911
|
+
"nameLabel": "Name",
|
|
912
|
+
"emailLabel": "Email address",
|
|
913
|
+
"contentLabel": "Comment",
|
|
914
|
+
"namePlaceholder": "Your name, e.g., Alex Chen…",
|
|
915
|
+
"emailPlaceholder": "Email address, e.g., alex@example.com…",
|
|
916
|
+
"contentPlaceholder": "Share your thoughts, e.g., what you liked or what needs improvement…",
|
|
917
|
+
"cancel": "Cancel",
|
|
918
|
+
"submit": "Post comment",
|
|
919
|
+
"submitting": "Posting..."
|
|
920
|
+
}
|
|
921
|
+
}
|
|
922
|
+
},
|
|
923
|
+
"processing": {
|
|
924
|
+
"queued": "AI processing queued...",
|
|
925
|
+
"inProgress": "AI processing in progress...",
|
|
926
|
+
"completed": "AI processing completed",
|
|
927
|
+
"failed": "AI processing failed",
|
|
928
|
+
"retry": "Retry"
|
|
929
|
+
},
|
|
930
|
+
"errors": {
|
|
931
|
+
"noAccess": {
|
|
932
|
+
"title": "Access Denied",
|
|
933
|
+
"message": "Your account does not have permission to access this page. Please contact your administrator for access.",
|
|
934
|
+
"backToDashboard": "Back to Dashboard",
|
|
935
|
+
"viewSettings": "View Settings"
|
|
936
|
+
},
|
|
937
|
+
"notFound": {
|
|
938
|
+
"title": "Feedback Not Found"
|
|
939
|
+
}
|
|
940
|
+
},
|
|
941
|
+
"analytics": {
|
|
942
|
+
"portal": {
|
|
943
|
+
"title": "Portal Analytics",
|
|
944
|
+
"timeseriesPoints": "Timeseries data points: {count}"
|
|
945
|
+
}
|
|
946
|
+
},
|
|
947
|
+
"portal": {
|
|
948
|
+
"roadmap": {
|
|
949
|
+
"title": "Roadmap",
|
|
950
|
+
"subscribeToUpdates": "Subscribe to updates",
|
|
951
|
+
"submitFeedback": "Submit feedback"
|
|
952
|
+
},
|
|
953
|
+
"changelog": {
|
|
954
|
+
"title": "Changelog",
|
|
955
|
+
"subscribeToUpdates": "Subscribe to updates"
|
|
956
|
+
},
|
|
957
|
+
"contributors": {
|
|
958
|
+
"mostHelpful": "Most helpful"
|
|
959
|
+
},
|
|
960
|
+
"ai": {
|
|
961
|
+
"classification": "AI Classification",
|
|
962
|
+
"reasons": "Reasons:"
|
|
963
|
+
}
|
|
964
|
+
}
|
|
965
|
+
}
|