diff --git a/backend/go.mod b/backend/go.mod index 76d23d4..6216540 100644 --- a/backend/go.mod +++ b/backend/go.mod @@ -3,9 +3,9 @@ module backend go 1.25.4 require ( - gitea.tecamino.com/paadi/access-handler v1.0.34 - gitea.tecamino.com/paadi/memberDB v1.1.28 - gitea.tecamino.com/paadi/tecamino-dbm v0.1.1 + gitea.tecamino.com/paadi/access-handler v1.0.48 + gitea.tecamino.com/paadi/memberDB v1.1.30 + gitea.tecamino.com/paadi/tecamino-dbm v1.0.0 gitea.tecamino.com/paadi/tecamino-logger v0.2.1 github.com/gin-contrib/cors v1.7.6 github.com/gin-gonic/gin v1.11.0 @@ -14,7 +14,7 @@ require ( ) require ( - gitea.tecamino.com/paadi/dbHandler v1.1.11 // indirect + gitea.tecamino.com/paadi/dbHandler v1.1.12 // indirect github.com/bytedance/sonic v1.14.0 // indirect github.com/bytedance/sonic/loader v0.3.0 // indirect github.com/cloudwego/base64x v0.1.6 // indirect diff --git a/backend/go.sum b/backend/go.sum index 1d2f8ac..24e4bba 100644 --- a/backend/go.sum +++ b/backend/go.sum @@ -1,11 +1,11 @@ -gitea.tecamino.com/paadi/access-handler v1.0.34 h1:6P65HiusSfvgv/ezOvxSahqyRJMK9UrxtGsz6loLoUk= -gitea.tecamino.com/paadi/access-handler v1.0.34/go.mod h1:HyMp1WvzmqLw8Ljt3r1qlF8fY+T5WFXr9Da/CTIM0H8= -gitea.tecamino.com/paadi/dbHandler v1.1.11 h1:hTpMWRr4dW7TkiBnEku0/3ggDC7/uP82U9paRKY/QEs= -gitea.tecamino.com/paadi/dbHandler v1.1.11/go.mod h1:y/xn/POJg1DO++67uKvnO23lJQgh+XFQq7HZCS9Getw= -gitea.tecamino.com/paadi/memberDB v1.1.28 h1:QSgPFIvzWS17bAIHp01nqUG5CQuE74AckrdYg6xZljw= -gitea.tecamino.com/paadi/memberDB v1.1.28/go.mod h1:uLoKel+EcuXUzxAY5ugfWh640TSomfTJR+g8Jfe8YKI= -gitea.tecamino.com/paadi/tecamino-dbm v0.1.1 h1:vAq7mwUxlxJuLzCQSDMrZCwo8ky5usWi9Qz+UP+WnkI= -gitea.tecamino.com/paadi/tecamino-dbm v0.1.1/go.mod h1:+tmf1rjPaKEoNeUcr1vdtoFIFweNG3aUGevDAl3NMBk= +gitea.tecamino.com/paadi/access-handler v1.0.48 h1:PYZvOwR9HCORAFpm7Nd5ZXvWwT5w04OvbcHhVHmPJlw= +gitea.tecamino.com/paadi/access-handler v1.0.48/go.mod h1:0kUGU4Jw2jSvopCCwecuX/2QnVKS09Ec1KQNrBXvsFs= +gitea.tecamino.com/paadi/dbHandler v1.1.12 h1:F1ARSTUm0MZmF84FfD/g5RQNMYyDYXHYrB3cXPSi4qw= +gitea.tecamino.com/paadi/dbHandler v1.1.12/go.mod h1:y/xn/POJg1DO++67uKvnO23lJQgh+XFQq7HZCS9Getw= +gitea.tecamino.com/paadi/memberDB v1.1.30 h1:N+3V9A/+OAGIoJeUNVHj1qUuBcy6ADLYFIgCnp2Ggk4= +gitea.tecamino.com/paadi/memberDB v1.1.30/go.mod h1:Q4NO1cdBm/6RLF+bP2NEzBPJURKjyIr4u3dElDXmHWI= +gitea.tecamino.com/paadi/tecamino-dbm v1.0.0 h1:xFgcpIiQMyqbglScZBAbdOQyM+yOJ3GHMK2iX5Ep3Gg= +gitea.tecamino.com/paadi/tecamino-dbm v1.0.0/go.mod h1:+tmf1rjPaKEoNeUcr1vdtoFIFweNG3aUGevDAl3NMBk= gitea.tecamino.com/paadi/tecamino-logger v0.2.1 h1:sQTBKYPdzn9mmWX2JXZBtGBvNQH7cuXIwsl4TD0aMgE= gitea.tecamino.com/paadi/tecamino-logger v0.2.1/go.mod h1:FkzRTldUBBOd/iy2upycArDftSZ5trbsX5Ira5OzJgM= github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ= diff --git a/backend/main.go b/backend/main.go index 2148ebf..33074e8 100644 --- a/backend/main.go +++ b/backend/main.go @@ -145,6 +145,7 @@ func main() { auth.GET("/users", accessHandler.GetUser) auth.GET("/roles", accessHandler.GetRole) + auth.GET("/workspaces", accessHandler.GetWorkspace) auth.POST("database/open", dbHandler.OpenDatabase) auth.POST("/members/add", dbHandler.AddNewMember) @@ -177,6 +178,11 @@ func main() { auth.POST("/users/new/password", accessHandler.ChangePassword) auth.POST("/users/delete", accessHandler.DeleteUser) + auth.POST("/workspaces/add", accessHandler.AddWorkspace) + auth.POST("/workspaces/update", accessHandler.UpdateWorkspace) + auth.POST("/workspaces/data", accessHandler.ReadWorkspaceData) + auth.POST("/workspaces/delete", accessHandler.DeleteWorkspace) + api.POST("/login/refresh", accessHandler.Refresh) // Serve static files @@ -228,4 +234,8 @@ func main() { if err := s.ServeHttp(env.HostUrl.GetValue(), env.HostPort.GetUIntValue()); err != nil { logger.Error("main", "error http server "+err.Error()) } + if err := s.ServeHttp(env.HostUrl.GetValue(), env.HostPort.GetUIntValue()); err != nil { + logger.Error("main", "error http server "+err.Error()) + } + } diff --git a/src/assets/lang/de-CH.yaml b/src/assets/lang/de-CH.yaml index 134e30c..d2bcdec 100644 --- a/src/assets/lang/de-CH.yaml +++ b/src/assets/lang/de-CH.yaml @@ -197,3 +197,11 @@ calendar: firstDayOfWeek: 1 format24h: true pluralDay: 'Täg' +description: Beschribig +workspace: Workspace +workspaces: Workspaces +addNewWorkspace: Füeg neuis Workspace hinzue +saved: gspicheret +noWorkspaceFound: Kes Workspace gfunge +addNewDatabase: Nei Datenbank +fileNeedsToEndWith: Dateiname mues fougendi endig ha diff --git a/src/assets/lang/de-DE.yaml b/src/assets/lang/de-DE.yaml index efd6fb2..ab01eb6 100644 --- a/src/assets/lang/de-DE.yaml +++ b/src/assets/lang/de-DE.yaml @@ -65,8 +65,8 @@ roleIsRequired: Rolle ist erforderlich permissions: Rechte selectRoleOptions: Wähle Rollen Optionen selectEventOptions: Wähle Veranstaltungs Optionen -addNewRole: Füge neue Rolle hinzu -addNewEvent: Füeg neue Veranstaltung hinzu +addNewRole: Neue Rolle hinzufügen +addNewEvent: Neue Veranstaltung hinzufügen veryWeak: sehr Schwach weak: Schwach fair: Ausreichend @@ -197,3 +197,11 @@ calendar: firstDayOfWeek: 1 format24h: true pluralDay: 'Tage' +description: Beschreibung +workspace: Workspace +workspaces: Workspaces +addNewWorkspace: Neues Workspace hinzufügen +saved: gespeichert +noWorkspaceFound: Kein Workspace gefunden +addNewDatabase: Neue Datenbank hinzufügen +fileNeedsToEndWith: Dateiname muss folgende Endung haben diff --git a/src/assets/lang/en-US.yaml b/src/assets/lang/en-US.yaml index 8dc0823..9e92570 100644 --- a/src/assets/lang/en-US.yaml +++ b/src/assets/lang/en-US.yaml @@ -197,3 +197,11 @@ calendar: firstDayOfWeek: 0 format24h: false pluralDay: 'Days' +description: Description +workspace: Workspace +workspaces: Workspaces +addNewWorkspace: Add new Workspace +saved: saved +noWorkspaceFound: No Workspace found +addNewDatabase: Add new database +fileNeedsToEndWith: Filename must end with diff --git a/src/assets/lang/es-ES.yaml b/src/assets/lang/es-ES.yaml index 253014d..645318a 100644 --- a/src/assets/lang/es-ES.yaml +++ b/src/assets/lang/es-ES.yaml @@ -37,7 +37,7 @@ login: Iniciar sesión logout: Cerrar sesión user: Usuario password: Contraseña -isRequired: Es obligatorio +isRequired: Obligatorio colors: Colores primaryColor: Color principal primaryColorText: Color del texto principal @@ -108,7 +108,7 @@ attendeeAdded: Asistente añadido attendeesAdded: Asistentes añadidos eventAdded: Evento añadido userUpdated: Usuario actualizado -selectResponsibleOptions: Seleccionar opciones responsables +selectResponsibleOptions: Seleccionar opciones de responsables addNewResponsible: Añadir responsable responsibleAdded: Responsable añadido responsiblesAdded: Responsables añadidos @@ -197,3 +197,11 @@ calendar: firstDayOfWeek: 1 format24h: true pluralDay: 'dias' +description: Descripción +workspace: Workspace +workspaces: Workspaces +addNewWorkspace: Añadir nuevo Workspace +saved: guardado +noWorkspaceFound: No se encontró Workspace +addNewDatabase: Agregar nueva base de datos +fileNeedsToEndWith: El nombre del archivo debe terminar con diff --git a/src/boot/quasar-global.ts b/src/boot/quasar-global.ts index 68e7015..dfa33a3 100644 --- a/src/boot/quasar-global.ts +++ b/src/boot/quasar-global.ts @@ -1,7 +1,7 @@ import { boot } from 'quasar/wrappers'; import { setQuasarInstance } from 'src/vueLib/utils/globalQ'; import { setRouterInstance } from 'src/vueLib/utils/globalRouter'; -import { databaseName, logo, appName } from 'src/vueLib/models/settings'; +import { databaseName, logo, appName, workspace } from 'src/vueLib/models/settings'; import { Dark } from 'quasar'; import { getLocalDarkMode, getLocalSettings } from 'src/localstorage/localStorage'; @@ -20,7 +20,8 @@ export default boot(({ app, router }) => { if (settings.appName) { appName.value = settings.appName; } - databaseName.value = settings.databaseName ?? databaseName.value; + databaseName.value = settings.databaseName; + workspace.value = settings.workspace?.uuid ?? ''; document.documentElement.style.setProperty('--q-primary', settings.primaryColor ?? '#1976d2'); document.documentElement.style.setProperty( diff --git a/src/components/WorkspaceEditAllDialog.vue b/src/components/WorkspaceEditAllDialog.vue new file mode 100644 index 0000000..c23f480 --- /dev/null +++ b/src/components/WorkspaceEditAllDialog.vue @@ -0,0 +1,105 @@ + + + + + + + + + + + + {{ $t('save') }} + + + + + + + diff --git a/src/localstorage/localStorage.ts b/src/localstorage/localStorage.ts index 2c20ad8..031ea2f 100644 --- a/src/localstorage/localStorage.ts +++ b/src/localstorage/localStorage.ts @@ -1,11 +1,12 @@ import { Dark } from 'quasar'; -import { appName, databaseName, type Settings } from 'src/vueLib/models/settings'; +import { appName, databaseName, workspace, type Settings } from 'src/vueLib/models/settings'; import { ref } from 'vue'; export function setLocalSettings(settings: Settings) { localStorage.setItem('icon', settings.icon); localStorage.setItem('appName', settings.appName); localStorage.setItem('databaseName', settings.databaseName); + localStorage.setItem('workspace', settings.workspace?.uuid || ''); localStorage.setItem('primaryColor', settings.primaryColor); localStorage.setItem('primaryColorText', settings.primaryColorText); localStorage.setItem('secondaryColor', settings.secondaryColor); @@ -28,9 +29,15 @@ export function getLocalSettings(): Settings { iconName = ''; } + let ws = localStorage.getItem('workspace'); + if (ws === undefined || ws === 'undefined') { + ws = workspace.value || ''; + } + return { icon: iconName, appName: name, + workspace: { name: '', description: '', uuid: ws }, databaseName: db, primaryColor: localStorage.getItem('primaryColor'), primaryColorText: localStorage.getItem('primaryColorText'), @@ -42,6 +49,7 @@ export function getLocalSettings(): Settings { export function clearLocalStorage() { localStorage.removeItem('icon'); localStorage.removeItem('appName'); + localStorage.removeItem('workspace'); localStorage.removeItem('databaseName'); localStorage.removeItem('primaryColor'); localStorage.removeItem('primaryColorText'); diff --git a/src/pages/SettingsPage.vue b/src/pages/SettingsPage.vue index 1909f82..41b1d31 100644 --- a/src/pages/SettingsPage.vue +++ b/src/pages/SettingsPage.vue @@ -26,15 +26,57 @@ {{ $t('database') }} - - + + + @update:model-value="changeDatabase" + > + + + + {{ scope.opt }} + + + + + + + + + + + + + {{ $t('noWorkspaceFound') }} + @@ -129,32 +171,81 @@ + + + + + + diff --git a/src/pages/StatsPage.vue b/src/pages/StatsPage.vue index ebb3d9e..6be851e 100644 --- a/src/pages/StatsPage.vue +++ b/src/pages/StatsPage.vue @@ -52,7 +52,7 @@ import { appApi } from 'src/boot/axios'; import { i18n } from 'src/boot/lang'; import SiteTitle from 'src/vueLib/general/SiteTitle.vue'; import { useNotify } from 'src/vueLib/general/useNotify'; -import { databaseName } from 'src/vueLib/models/settings'; +import { databaseName, workspace } from 'src/vueLib/models/settings'; import { onMounted, ref } from 'vue'; const stats = ref(); @@ -71,8 +71,10 @@ const amounts = ref<{ const { NotifyResponse } = useNotify(); onMounted(async () => { + let path = databaseName.value; + if (workspace.value !== '') path = workspace.value + '/' + path; stats.value = await appApi - .post('/stats', { database: databaseName.value }) + .post('/stats', { database: path }) .then((resp) => { if ((resp.data.databaseSize as number) >= 1000000000) { return (resp.data.data.databaseSize / 1000000000).toFixed(2) + ' GB'; diff --git a/src/pages/UserSettings.vue b/src/pages/UserSettings.vue index 13d524a..d4e01a4 100644 --- a/src/pages/UserSettings.vue +++ b/src/pages/UserSettings.vue @@ -16,7 +16,7 @@ @@ -31,12 +31,11 @@ - + - {{ user?.user?.role }} + +
{{ $t('database') }}