From f6ce6a181b2729975f0ecdeb9226f35826f5cc72 Mon Sep 17 00:00:00 2001 From: Ivan Skvortsov Date: Mon, 23 Feb 2026 13:54:01 +0100 Subject: [PATCH 1/8] feat: field type badges in the fields list table --- .../fields/components/FieldTypeBadge.vue | 24 ++++++++++++------- .../modules/fields/components/fieldColumns.ts | 7 +++--- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/frontend/src/modules/fields/components/FieldTypeBadge.vue b/frontend/src/modules/fields/components/FieldTypeBadge.vue index 24bd1ca..f664f65 100644 --- a/frontend/src/modules/fields/components/FieldTypeBadge.vue +++ b/frontend/src/modules/fields/components/FieldTypeBadge.vue @@ -2,12 +2,16 @@ import { FieldType } from '@/modules/fields/types' import { Badge } from '@/shared/ui/badge' import { cn } from '@/shared/utils/general' // your utility for class merging -import { useAttrs } from 'vue' +import { computed, useAttrs } from 'vue' -const props = defineProps<{ - type: FieldType - monochrome?: boolean -}>() +interface Props { + type: FieldType, + monochrome?: boolean +} + +const props = withDefaults(defineProps(), { + monochrome: false +}) const attrs = useAttrs() @@ -31,11 +35,15 @@ const colorClass = { const baseClass = 'text-xs tracking-widest uppercase' -const finalClass = cn( +const color = computed(() => (props.monochrome ? 'bg-muted text-foreground' : colorClass[props.type])) + +const finalClass = computed(() => cn( baseClass, - props.monochrome ? 'bg-muted text-foreground' : colorClass[props.type], + color, + color.value, attrs.class as string | undefined -) +)) + - + \ No newline at end of file From f6fa5e2bb5a44c383bb7fda26648978d5d5db3e2 Mon Sep 17 00:00:00 2001 From: Ivan Skvortsov Date: Mon, 23 Feb 2026 13:55:52 +0100 Subject: [PATCH 3/8] fix: auto scroll to top in router --- frontend/src/router/index.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index be85212..936532d 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -7,6 +7,14 @@ const publicPages = ['/login', '/signup', '/landing', '/oauth/callback'] const router = createRouter({ history: createWebHistory(), routes: routes, + scrollBehavior(to, from, savedPosition) { + if (savedPosition) { + return savedPosition + } + else { + return { top: 0, behavior: 'smooth' } + } + }, }) router.beforeEach((to, _from, next) => { From 2a2ac3cab0f0289bad7913ecd723614e494241ea Mon Sep 17 00:00:00 2001 From: Ivan Skvortsov Date: Mon, 23 Feb 2026 13:56:35 +0100 Subject: [PATCH 4/8] fix: tiny change in backend Settings --- backend/app/settings.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/app/settings.py b/backend/app/settings.py index 88db622..52cf0dc 100644 --- a/backend/app/settings.py +++ b/backend/app/settings.py @@ -3,7 +3,7 @@ from pathlib import Path from typing import Literal, Optional -from pydantic import ConfigDict +from pydantic import ConfigDict, Field from pydantic_settings import BaseSettings @@ -14,7 +14,7 @@ def resolve_env_file(base_dir: str = ".") -> str: class Settings(BaseSettings): - env: Literal["dev", "prod", "demo"] = "dev" + env: Literal["dev", "prod", "demo"] = Field(default="dev", alias="ENV") database_url: str = "sqlite:///./test.db" frontend_url: Optional[str] = None @@ -29,6 +29,7 @@ class Settings(BaseSettings): model_config = ConfigDict( env_file=resolve_env_file(), env_file_encoding="utf-8", + case_sensitive=False, ) @property From 24d8ddbd5b0ad012006fcc1c91fbe98c0a3862e1 Mon Sep 17 00:00:00 2001 From: Ivan Skvortsov Date: Mon, 23 Feb 2026 13:57:06 +0100 Subject: [PATCH 5/8] chore: restructured docker-compose.yml --- docker-compose.yaml | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/docker-compose.yaml b/docker-compose.yaml index 32437ec..a400adc 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,22 +1,4 @@ services: - db: - image: postgres:15 - container_name: evsy-db - restart: always - environment: - POSTGRES_USER: evsy - POSTGRES_PASSWORD: evsy - POSTGRES_DB: evsy - volumes: - - postgres_data:/var/lib/postgresql/data -# ports: -# - "5432:5432" - healthcheck: - test: ["CMD", "pg_isready", "-U", "evsy"] - interval: 10s - timeout: 5s - retries: 5 - backend: build: context: ./backend @@ -52,5 +34,23 @@ services: backend: condition: service_healthy + db: + image: postgres:15 + container_name: evsy-db + restart: always + environment: + POSTGRES_USER: evsy + POSTGRES_PASSWORD: evsy + POSTGRES_DB: evsy + volumes: + - postgres_data:/var/lib/postgresql/data +# ports: +# - "5432:5432" + healthcheck: + test: ["CMD", "pg_isready", "-U", "evsy"] + interval: 10s + timeout: 5s + retries: 5 + volumes: postgres_data: From a110526a5efafc4e8dc584a068e80159b36952a0 Mon Sep 17 00:00:00 2001 From: Ivan Skvortsov Date: Mon, 23 Feb 2026 13:57:58 +0100 Subject: [PATCH 6/8] fix: tiny change in frontend api.ts --- frontend/src/shared/utils/api.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/shared/utils/api.ts b/frontend/src/shared/utils/api.ts index 0ac47e8..b7d6d1a 100644 --- a/frontend/src/shared/utils/api.ts +++ b/frontend/src/shared/utils/api.ts @@ -3,7 +3,7 @@ import { useAuthStore } from '@/modules/auth/stores/useAuthStore' import router from '@/router' export const api = axios.create({ - baseURL: import.meta.env.VITE_API_URL ?? '/api/v1', + baseURL: import.meta.env.VITE_API_URL || '/api/v1', headers: { 'Content-Type': 'application/json', }, From 4724dcf7a9afca32a77138347a7e6a86198efcea Mon Sep 17 00:00:00 2001 From: Ivan Skvortsov Date: Tue, 24 Feb 2026 11:38:36 +0100 Subject: [PATCH 7/8] format --- .../fields/components/FieldTypeBadge.vue | 20 +++++++++---------- .../switchboard/components/ResetPanel.vue | 6 +++--- frontend/src/router/index.ts | 3 +-- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/frontend/src/modules/fields/components/FieldTypeBadge.vue b/frontend/src/modules/fields/components/FieldTypeBadge.vue index f664f65..fb86c68 100644 --- a/frontend/src/modules/fields/components/FieldTypeBadge.vue +++ b/frontend/src/modules/fields/components/FieldTypeBadge.vue @@ -5,12 +5,12 @@ import { cn } from '@/shared/utils/general' // your utility for class merging import { computed, useAttrs } from 'vue' interface Props { - type: FieldType, - monochrome?: boolean + type: FieldType + monochrome?: boolean } const props = withDefaults(defineProps(), { - monochrome: false + monochrome: false, }) const attrs = useAttrs() @@ -35,15 +35,13 @@ const colorClass = { const baseClass = 'text-xs tracking-widest uppercase' -const color = computed(() => (props.monochrome ? 'bg-muted text-foreground' : colorClass[props.type])) - -const finalClass = computed(() => cn( - baseClass, - color, - color.value, - attrs.class as string | undefined -)) +const color = computed(() => + props.monochrome ? 'bg-muted text-foreground' : colorClass[props.type] +) +const finalClass = computed(() => + cn(baseClass, color, color.value, attrs.class as string | undefined) +) - \ No newline at end of file + diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index 936532d..c69924d 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -10,8 +10,7 @@ const router = createRouter({ scrollBehavior(to, from, savedPosition) { if (savedPosition) { return savedPosition - } - else { + } else { return { top: 0, behavior: 'smooth' } } }, From 76f8b598dd823a7054d3ac762e06fbc57e2aa372 Mon Sep 17 00:00:00 2001 From: Ivan Skvortsov Date: Tue, 24 Feb 2026 14:53:30 +0100 Subject: [PATCH 8/8] fix: nice empty state in tags grid --- frontend/src/modules/tags/components/TagsDataGrid.vue | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/frontend/src/modules/tags/components/TagsDataGrid.vue b/frontend/src/modules/tags/components/TagsDataGrid.vue index 0324cb7..4ee1705 100644 --- a/frontend/src/modules/tags/components/TagsDataGrid.vue +++ b/frontend/src/modules/tags/components/TagsDataGrid.vue @@ -62,10 +62,8 @@ const handleSearchKeydown = (event: KeyboardEvent) => {