diff --git a/package-lock.json b/package-lock.json index 2009f70..74d7897 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "we-bstly-angular", - "version": "4.0.1", + "version": "4.0.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "we-bstly-angular", - "version": "4.0.1", + "version": "4.0.2", "dependencies": { "@angular/animations": "^20.3.15", "@angular/cdk": "^20.2.14", @@ -35,7 +35,7 @@ "@angular/localize": "^20.3.15", "@types/jasmine": "^5.1.13", "@types/jasminewd2": "^2.0.13", - "@types/node": "^24.10.4", + "@types/node": "^25.0.3", "@types/openpgp": "^5.0.0", "jasmine-core": "~5.13.0", "jasmine-spec-reporter": "~7.0.0", @@ -5577,9 +5577,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.10.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.4.tgz", - "integrity": "sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==", + "version": "25.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz", + "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", "dev": true, "license": "MIT", "dependencies": { @@ -6675,9 +6675,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001760", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001760.tgz", - "integrity": "sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==", + "version": "1.0.30001761", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001761.tgz", + "integrity": "sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==", "dev": true, "funding": [ { diff --git a/package.json b/package.json index 5aa0f8e..102707a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "we-bstly-angular", - "version": "4.0.1", + "version": "4.0.2", "scripts": { "ng": "ng", "start": "ng serve", @@ -38,7 +38,7 @@ "@angular/localize": "^20.3.15", "@types/jasmine": "^5.1.13", "@types/jasminewd2": "^2.0.13", - "@types/node": "^24.10.4", + "@types/node": "^25.0.3", "@types/openpgp": "^5.0.0", "jasmine-core": "~5.13.0", "jasmine-spec-reporter": "~7.0.0", diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 57bc742..7a27541 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -1,61 +1,62 @@ import { NgModule } from '@angular/core'; -import { Routes, RouterModule } from '@angular/router'; +import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard, AuthUpdateGuard, AuthenticatedGuard, AnonymousGuard, AdminGuard } from './auth/auth.guard'; -import { MainComponent } from './ui/main/main.component'; -import { FormLoginComponent } from './pages/form-login/form-login.component'; -import { FormLogin2FAComponent } from './pages/form-login-2fa/form-login-2fa.component'; -import { PasswordComponent } from './pages/password/password.component'; -import { PasswordResetComponent } from './pages/password-reset/password-reset.component'; +import { AdminGuard, AnonymousGuard, AuthGuard, AuthUpdateGuard, AuthenticatedGuard } from './auth/auth.guard'; import { AccountComponent } from './pages/account/account.component'; -import { RegisterComponent } from './pages/register/register.component'; -import { TokensComponent } from './pages/tokens/tokens.component'; -import { ServicesComponent } from './pages/services/services.component'; -import { InfoComponent } from './pages/account/info/info.component'; -import { ProfileComponent } from './pages/account/profile/profile.component'; -import { VoucherComponent } from './pages/account/voucher/voucher.component'; -import { SecurityComponent } from './pages/account/security/security.component'; -import { UnavailableComponent } from './pages/unavailable/unavailable.component'; -import { NotfoundComponent } from './pages/notfound/notfound.component'; -import { UserComponent } from './pages/user/user.component' -import { JitsiComponent } from './pages/jitsi/jitsi.component' -import { ParteyComponent } from './pages/partey/partey.component' -import { ParteyTimeslotsComponent } from './pages/partey/timeslots/timeslots.compontent' import { AliasesComponent } from './pages/account/aliases/aliases.component'; import { DomainsComponent } from './pages/account/domains/domains.component'; -import { InvitesComponent } from './pages/invites/invites.component'; -import { UrlShortenerComponent, UrlShortenerPasswordComponent } from './pages/urlshortener/urlshortener.component'; -import { MinetestAccountsComponent } from './pages/minetest/accounts/accounts.component'; -import { DividertestComponent } from './pages/dividertest/dividertest.component' -import { BorrowProvingComponent } from './pages/borrow/proving/proving.component'; -import { BorrowItemEditComponent, BorrowItemsComponent } from './pages/borrow/items/items.component'; -import { BorrowRequestsComponent } from './pages/borrow/requests/requests.component'; -import { BorrowComponent } from './pages/borrow/borrow.component'; -import { InviteCodeComponent } from './pages/invites/code/code.component'; -import { JukeboxComponent } from './pages/jukebox/jukebox.compontent'; -import { FormLoginOidcComponent } from './pages/form-login-oidc/form-login-oidc.component'; import { DyndnsComponent } from './pages/account/dyndns/dyndns.component'; +import { InfoComponent } from './pages/account/info/info.component'; +import { ProfileComponent } from './pages/account/profile/profile.component'; +import { SecurityComponent } from './pages/account/security/security.component'; +import { VoucherComponent } from './pages/account/voucher/voucher.component'; import { AdminComponent } from './pages/admin/admin.component'; -import { AdminUsersComponent } from './pages/admin/users/users.component'; -import { AdminServicesComponent } from './pages/admin/services/services.component'; -import { AdminPermissionsComponent } from './pages/admin/permissions/permissions.component'; -import { AdminQuotasComponent } from './pages/admin/quotas/quotas.component'; -import { AdminJitsiRoomsComponent } from './pages/admin/jitsi-rooms/jitsi-rooms.component'; -import { AdminMinetestAccountsComponent } from './pages/admin/minetest-accounts/minetest-accounts.component'; -import { AdminShortenedUrlsComponent } from './pages/admin/shortened-urls/shortened-urls.component'; -import { AdminJukeboxComponent } from './pages/admin/jukebox/jukebox.component'; -import { AdminParteyMapsComponent } from './pages/admin/partey-maps/partey-maps.component'; -import { AdminParteyTagsComponent } from './pages/admin/partey-tags/partey-tags.component'; -import { AdminParteyReportsComponent } from './pages/admin/partey-reports/partey-reports.component'; -import { AdminTimeslotsComponent } from './pages/admin/timeslots/timeslots.component'; -import { AdminSystemPropertiesComponent } from './pages/admin/system-properties/system-properties.component'; -import { AdminPermissionMappingsComponent } from './pages/admin/permission-mappings/permission-mappings.component'; -import { AdminQuotaMappingsComponent } from './pages/admin/quota-mappings/quota-mappings.component'; -import { AdminVoucherMappingsComponent } from './pages/admin/voucher-mappings/voucher-mappings.component'; -import { AdminSystemProfileFieldsComponent } from './pages/admin/system-profile-fields/system-profile-fields.component'; -import { AdminUserAliasesComponent } from './pages/admin/user-aliases/user-aliases.component'; -import { AdminOidcClientsComponent } from './pages/admin/oidc-clients/oidc-clients.component'; import { AdminI18nComponent } from './pages/admin/i18n/i18n.component'; +import { AdminJitsiRoomsComponent } from './pages/admin/jitsi-rooms/jitsi-rooms.component'; +import { AdminJukeboxComponent } from './pages/admin/jukebox/jukebox.component'; +import { AdminMinetestAccountsComponent } from './pages/admin/minetest-accounts/minetest-accounts.component'; +import { AdminOidcClientsComponent } from './pages/admin/oidc-clients/oidc-clients.component'; +import { AdminParteyMapsComponent } from './pages/admin/partey-maps/partey-maps.component'; +import { AdminParteyReportsComponent } from './pages/admin/partey-reports/partey-reports.component'; +import { AdminParteyTagsComponent } from './pages/admin/partey-tags/partey-tags.component'; +import { AdminPermissionMappingsComponent } from './pages/admin/permission-mappings/permission-mappings.component'; +import { AdminPermissionsComponent } from './pages/admin/permissions/permissions.component'; +import { AdminQuotaMappingsComponent } from './pages/admin/quota-mappings/quota-mappings.component'; +import { AdminQuotasComponent } from './pages/admin/quotas/quotas.component'; +import { AdminServicesComponent } from './pages/admin/services/services.component'; +import { AdminShortenedUrlsComponent } from './pages/admin/shortened-urls/shortened-urls.component'; +import { AdminSystemProfileFieldsComponent } from './pages/admin/system-profile-fields/system-profile-fields.component'; +import { AdminSystemPropertiesComponent } from './pages/admin/system-properties/system-properties.component'; +import { AdminTimeslotsComponent } from './pages/admin/timeslots/timeslots.component'; +import { AdminUserAliasesComponent } from './pages/admin/user-aliases/user-aliases.component'; +import { AdminUsersComponent } from './pages/admin/users/users.component'; +import { AdminVoucherMappingsComponent } from './pages/admin/voucher-mappings/voucher-mappings.component'; +import { BorrowComponent } from './pages/borrow/borrow.component'; +import { BorrowItemsComponent } from './pages/borrow/items/items.component'; +import { BorrowProvingComponent } from './pages/borrow/proving/proving.component'; +import { BorrowRequestsComponent } from './pages/borrow/requests/requests.component'; +import { DividertestComponent } from './pages/dividertest/dividertest.component'; +import { FormLogin2FAComponent } from './pages/form-login-2fa/form-login-2fa.component'; +import { FormLoginOidcComponent } from './pages/form-login-oidc/form-login-oidc.component'; +import { FormLoginComponent } from './pages/form-login/form-login.component'; +import { StartPageComponent } from './pages/home-redirect/home-redirect.component'; +import { InviteCodeComponent } from './pages/invites/code/code.component'; +import { InvitesComponent } from './pages/invites/invites.component'; +import { JitsiComponent } from './pages/jitsi/jitsi.component'; +import { JukeboxComponent } from './pages/jukebox/jukebox.compontent'; +import { MinetestAccountsComponent } from './pages/minetest/accounts/accounts.component'; +import { NotfoundComponent } from './pages/notfound/notfound.component'; +import { ParteyComponent } from './pages/partey/partey.component'; +import { ParteyTimeslotsComponent } from './pages/partey/timeslots/timeslots.compontent'; +import { PasswordResetComponent } from './pages/password-reset/password-reset.component'; +import { PasswordComponent } from './pages/password/password.component'; +import { RegisterComponent } from './pages/register/register.component'; +import { ServicesComponent } from './pages/services/services.component'; +import { TokensComponent } from './pages/tokens/tokens.component'; +import { UnavailableComponent } from './pages/unavailable/unavailable.component'; +import { UrlShortenerComponent, UrlShortenerPasswordComponent } from './pages/urlshortener/urlshortener.component'; +import { UserComponent } from './pages/user/user.component'; +import { MainComponent } from './ui/main/main.component'; const routes: Routes = [ { path: 'profile/:username', component: UserComponent, canActivate: [AuthUpdateGuard] }, @@ -64,10 +65,11 @@ const routes: Routes = [ { path: 'partey/manage', component: ParteyComponent, canActivate: [AuthenticatedGuard] }, { path: '', component: MainComponent, children: [ - { path: '', redirectTo: "/account/info", pathMatch: 'full' }, + { path: '', redirectTo: "/home", pathMatch: 'full' }, { path: 'login', component: FormLoginComponent, canActivate: [AnonymousGuard] }, { path: 'login/2fa', component: FormLogin2FAComponent, canActivate: [AnonymousGuard] }, { path: 'login/oidc', component: FormLoginOidcComponent, canActivate: [AuthenticatedGuard] }, + { path: 'home', component: StartPageComponent, canActivate: [AuthenticatedGuard] }, { path: 'service-login', component: FormLoginComponent, canActivate: [AnonymousGuard] }, { path: 'service-login/2fa', component: FormLogin2FAComponent, canActivate: [AnonymousGuard] }, { path: 'password', component: PasswordComponent, canActivate: [AnonymousGuard] }, @@ -107,7 +109,8 @@ const routes: Routes = [ { path: 'invite/:code', component: InviteCodeComponent, canActivate: [AuthGuard] }, { path: 'admin', component: AdminComponent, canActivate: [AdminGuard], children: [ - { path: '', redirectTo: "/admin/users", pathMatch: 'full' }, + { path: '', redirectTo: "/admin/i18n", pathMatch: 'full' }, + { path: 'i18n', component: AdminI18nComponent, canActivate: [AdminGuard] }, { path: 'users', component: AdminUsersComponent, canActivate: [AdminGuard] }, { path: 'permissions', component: AdminPermissionsComponent, canActivate: [AdminGuard] }, { path: 'permission-mappings', component: AdminPermissionMappingsComponent, canActivate: [AdminGuard] }, @@ -126,8 +129,7 @@ const routes: Routes = [ { path: 'partey-maps', component: AdminParteyMapsComponent, canActivate: [AdminGuard] }, { path: 'partey-tags', component: AdminParteyTagsComponent, canActivate: [AdminGuard] }, { path: 'partey-reports', component: AdminParteyReportsComponent, canActivate: [AdminGuard] }, - { path: 'timeslots', component: AdminTimeslotsComponent, canActivate: [AdminGuard] }, - { path: 'i18n', component: AdminI18nComponent, canActivate: [AdminGuard] } + { path: 'timeslots', component: AdminTimeslotsComponent, canActivate: [AdminGuard] } ] }, { path: 'unavailable', component: UnavailableComponent }, diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 3943a49..0ff9ac8 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,108 +1,108 @@ -import { NgModule, Injectable, APP_INITIALIZER } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { AppRoutingModule } from './app-routing.module'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { HttpClientModule, HttpInterceptor, HttpHandler, HttpRequest, HTTP_INTERCEPTORS } from '@angular/common/http'; -import { MaterialModule } from './material/material.module'; -import { QrCodeModule } from 'ng-qrcode'; -import { DatePipe } from '@angular/common'; import { ClipboardModule } from '@angular/cdk/clipboard'; +import { DatePipe } from '@angular/common'; +import { HTTP_INTERCEPTORS, HttpClientModule, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http'; +import { APP_INITIALIZER, Injectable, NgModule } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { BrowserModule } from '@angular/platform-browser'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { QrCodeModule } from 'ng-qrcode'; +import { AppRoutingModule } from './app-routing.module'; +import { MaterialModule } from './material/material.module'; import { AutofocusDirective } from './material/autofocus'; -import { I18nPipe, I18nEmptyPipe } from './utils/i18n.pipe'; -import { MomentPipe } from './utils/moment.pipe'; -import { MainComponent } from './ui/main/main.component'; -import { AccountComponent } from './pages/account/account.component'; -import { ServicesComponent } from './pages/services/services.component'; import { AppComponent } from './app.component'; -import { FormLoginComponent } from './pages/form-login/form-login.component'; -import { FormLogin2FAComponent } from './pages/form-login-2fa/form-login-2fa.component'; -import { TokensComponent } from './pages/tokens/tokens.component'; -import { InvitesComponent } from './pages/invites/invites.component'; -import { PermissionsComponent } from './ui/permissions/permissions.component'; -import { ProfileFieldDialog, ProfileFieldsComponent, ProfileFieldBlob } from './ui/profilefields/profilefields.component'; -import { ServicesGridComponent } from './ui/servicesgrid/servicesgrid.component'; -import { ServicesTableComponent } from './ui/servicestable/servicestable.component'; -import { ProfileFieldPgpBlob } from './ui/profilefields/binary/pgp/profilefield.pgp-blob'; -import { QuotasComponent } from './ui/quotas/quotas.component'; -import { SecurityComponent, SecurityKeyDialog, SecurityTotpDialog } from './pages/account/security/security.component'; -import { VoucherComponent } from './pages/account/voucher/voucher.component'; -import { VoucherDialog } from './pages/account/voucher/voucher.component'; -import { InfoComponent } from './pages/account/info/info.component'; +import { AccountComponent } from './pages/account/account.component'; import { AliasesComponent } from './pages/account/aliases/aliases.component'; import { DomainsComponent } from './pages/account/domains/domains.component'; import { DyndnsComponent } from './pages/account/dyndns/dyndns.component'; +import { InfoComponent } from './pages/account/info/info.component'; import { ProfileComponent } from './pages/account/profile/profile.component'; -import { PasswordComponent } from './pages/password/password.component'; +import { SecurityComponent, SecurityKeyDialog, SecurityTotpDialog } from './pages/account/security/security.component'; +import { VoucherComponent, VoucherDialog } from './pages/account/voucher/voucher.component'; +import { BorrowItemEditComponent, BorrowItemsComponent } from './pages/borrow/items/items.component'; +import { BorrowProvingComponent, BorrowProvingResultDialog } from './pages/borrow/proving/proving.component'; +import { BorrowRequestEditComponent, BorrowRequestsComponent } from './pages/borrow/requests/requests.component'; +import { DividertestComponent } from './pages/dividertest/dividertest.component'; +import { FormLogin2FAComponent } from './pages/form-login-2fa/form-login-2fa.component'; +import { FormLoginComponent } from './pages/form-login/form-login.component'; +import { InvitesComponent } from './pages/invites/invites.component'; +import { JitsiComponent, JitsiEditDialog, JitsiShareDialog } from './pages/jitsi/jitsi.component'; +import { NotfoundComponent } from './pages/notfound/notfound.component'; +import { ParteyComponent } from './pages/partey/partey.component'; +import { ParteyTimeslotDialog, ParteyTimeslotsComponent } from './pages/partey/timeslots/timeslots.compontent'; import { PasswordResetComponent } from './pages/password-reset/password-reset.component'; +import { PasswordComponent } from './pages/password/password.component'; import { RegisterComponent, RegisterDialog } from './pages/register/register.component'; import { UsernameDialog } from './pages/register/username-dialog/username.dialog'; +import { ServicesComponent } from './pages/services/services.component'; +import { TokensComponent } from './pages/tokens/tokens.component'; import { UnavailableComponent } from './pages/unavailable/unavailable.component'; -import { NotfoundComponent } from './pages/notfound/notfound.component'; -import { HtmlComponent } from './utils/html/html.component'; -import { ConfirmDialog } from './ui/confirm/confirm.component'; +import { UrlShortenerComponent, UrlShortenerEditDialog, UrlShortenerPasswordComponent, UrlShortenerShareDialog } from './pages/urlshortener/urlshortener.component'; import { UserComponent } from './pages/user/user.component'; -import { JitsiComponent, JitsiEditDialog, JitsiShareDialog } from './pages/jitsi/jitsi.component'; -import { ParteyComponent } from './pages/partey/partey.component'; -import { ParteyTimeslotsComponent, ParteyTimeslotDialog } from './pages/partey/timeslots/timeslots.compontent'; -import { UrlShortenerComponent, UrlShortenerPasswordComponent, UrlShortenerShareDialog, UrlShortenerEditDialog } from './pages/urlshortener/urlshortener.component'; -import { BorrowItemEditComponent, BorrowItemsComponent } from './pages/borrow/items/items.component'; -import { BorrowRequestEditComponent, BorrowRequestsComponent } from './pages/borrow/requests/requests.component'; -import { BorrowProvingComponent, BorrowProvingResultDialog } from './pages/borrow/proving/proving.component'; +import { ConfirmDialog } from './ui/confirm/confirm.component'; import { DividerComponent } from './ui/divider/divider.component'; -import { DividertestComponent } from './pages/dividertest/dividertest.component'; +import { MainComponent } from './ui/main/main.component'; +import { PermissionsComponent } from './ui/permissions/permissions.component'; +import { ProfileFieldPgpBlob } from './ui/profilefields/binary/pgp/profilefield.pgp-blob'; +import { ProfileFieldBlob, ProfileFieldDialog, ProfileFieldsComponent } from './ui/profilefields/profilefields.component'; +import { QuotasComponent } from './ui/quotas/quotas.component'; +import { ServicesGridComponent } from './ui/servicesgrid/servicesgrid.component'; +import { ServicesTableComponent } from './ui/servicestable/servicestable.component'; +import { HtmlComponent } from './utils/html/html.component'; +import { I18nEmptyPipe, I18nPipe } from './utils/i18n.pipe'; +import { MomentPipe } from './utils/moment.pipe'; -import { I18nService, I18nPaginatorIntl } from './services/i18n.service'; -import { MinetestAccountsComponent } from './pages/minetest/accounts/accounts.component'; -import { BorrowComponent } from './pages/borrow/borrow.component'; -import { DurationpickerComponent } from './ui/durationpicker/durationpicker.component'; -import { InviteCodeComponent } from './pages/invites/code/code.component'; -import { InviteEditComponent } from './pages/invites/edit/invite.edit'; -import { MatPaginatorIntl } from '@angular/material/paginator'; -import { JukeboxComponent } from './pages/jukebox/jukebox.compontent'; -import { FormLoginOidcComponent } from './pages/form-login-oidc/form-login-oidc.component'; -import { MatDatepickerModule } from '@angular/material/datepicker'; import { MomentDateModule } from '@angular/material-moment-adapter'; import { MAT_DATE_FORMATS } from '@angular/material/core'; -import { DatetimepickerComponent } from './ui/datetimepicker/datetimepicker.component'; +import { MatDatepickerModule } from '@angular/material/datepicker'; +import { MatPaginatorIntl } from '@angular/material/paginator'; import { AdminComponent } from './pages/admin/admin.component'; -import { AdminUsersComponent } from './pages/admin/users/users.component'; -import { AdminUserEditDialog } from './pages/admin/users/user.edit'; -import { AdminPermissionEditDialog } from './pages/admin/permissions/permission.edit'; -import { AdminQuotaEditDialog } from './pages/admin/quotas/quota.edit'; -import { AdminServiceEditDialog } from './pages/admin/services/service.edit'; -import { AdminPermissionMappingEditDialog } from './pages/admin/permission-mappings/permission-mapping.edit'; -import { AdminQuotaMappingEditDialog } from './pages/admin/quota-mappings/quota-mapping.edit'; -import { AdminServicesComponent } from './pages/admin/services/services.component'; -import { AdminPermissionsComponent } from './pages/admin/permissions/permissions.component'; -import { AdminQuotasComponent } from './pages/admin/quotas/quotas.component'; -import { AdminJitsiRoomsComponent } from './pages/admin/jitsi-rooms/jitsi-rooms.component'; -import { AdminMinetestAccountsComponent } from './pages/admin/minetest-accounts/minetest-accounts.component'; -import { AdminShortenedUrlsComponent } from './pages/admin/shortened-urls/shortened-urls.component'; -import { AdminShortenedUrlEditDialog } from './pages/admin/shortened-urls/shortened-url.edit'; -import { AdminJukeboxComponent } from './pages/admin/jukebox/jukebox.component'; -import { AdminParteyMapsComponent } from './pages/admin/partey-maps/partey-maps.component'; -import { AdminParteyTagsComponent } from './pages/admin/partey-tags/partey-tags.component'; -import { AdminParteyReportsComponent } from './pages/admin/partey-reports/partey-reports.component'; -import { AdminTimeslotsComponent } from './pages/admin/timeslots/timeslots.component'; -import { AdminSystemPropertiesComponent } from './pages/admin/system-properties/system-properties.component'; -import { AdminPermissionMappingsComponent } from './pages/admin/permission-mappings/permission-mappings.component'; -import { AdminQuotaMappingsComponent } from './pages/admin/quota-mappings/quota-mappings.component'; -import { AdminVoucherMappingsComponent } from './pages/admin/voucher-mappings/voucher-mappings.component'; -import { AdminSystemProfileFieldsComponent } from './pages/admin/system-profile-fields/system-profile-fields.component'; -import { AdminUserAliasesComponent } from './pages/admin/user-aliases/user-aliases.component'; -import { AdminOidcClientsComponent } from './pages/admin/oidc-clients/oidc-clients.component'; -import { AdminOidcClientEditDialog } from './pages/admin/oidc-clients/oidc-client.edit'; import { AdminI18nComponent } from './pages/admin/i18n/i18n.component'; import { AdminI18nEditDialog } from './pages/admin/i18n/i18n.edit'; -import { AdminVoucherMappingEditDialog } from './pages/admin/voucher-mappings/voucher-mapping.edit'; -import { AdminSystemPropertyEditDialog } from './pages/admin/system-properties/system-property.edit'; -import { AdminSystemProfileFieldEditDialog } from './pages/admin/system-profile-fields/system-profile-field.edit'; -import { AdminUserAliasEditDialog } from './pages/admin/user-aliases/user-alias.edit'; import { AdminJitsiRoomEditDialog } from './pages/admin/jitsi-rooms/jitsi-room.edit'; +import { AdminJitsiRoomsComponent } from './pages/admin/jitsi-rooms/jitsi-rooms.component'; +import { AdminJukeboxComponent } from './pages/admin/jukebox/jukebox.component'; +import { AdminMinetestAccountsComponent } from './pages/admin/minetest-accounts/minetest-accounts.component'; +import { AdminOidcClientEditDialog } from './pages/admin/oidc-clients/oidc-client.edit'; +import { AdminOidcClientsComponent } from './pages/admin/oidc-clients/oidc-clients.component'; +import { AdminParteyMapsComponent } from './pages/admin/partey-maps/partey-maps.component'; +import { AdminParteyReportsComponent } from './pages/admin/partey-reports/partey-reports.component'; +import { AdminParteyTagsComponent } from './pages/admin/partey-tags/partey-tags.component'; +import { AdminPermissionMappingEditDialog } from './pages/admin/permission-mappings/permission-mapping.edit'; +import { AdminPermissionMappingsComponent } from './pages/admin/permission-mappings/permission-mappings.component'; +import { AdminPermissionEditDialog } from './pages/admin/permissions/permission.edit'; +import { AdminPermissionsComponent } from './pages/admin/permissions/permissions.component'; +import { AdminQuotaMappingEditDialog } from './pages/admin/quota-mappings/quota-mapping.edit'; +import { AdminQuotaMappingsComponent } from './pages/admin/quota-mappings/quota-mappings.component'; +import { AdminQuotaEditDialog } from './pages/admin/quotas/quota.edit'; +import { AdminQuotasComponent } from './pages/admin/quotas/quotas.component'; +import { AdminServiceEditDialog } from './pages/admin/services/service.edit'; +import { AdminServicesComponent } from './pages/admin/services/services.component'; +import { AdminShortenedUrlEditDialog } from './pages/admin/shortened-urls/shortened-url.edit'; +import { AdminShortenedUrlsComponent } from './pages/admin/shortened-urls/shortened-urls.component'; +import { AdminSystemProfileFieldEditDialog } from './pages/admin/system-profile-fields/system-profile-field.edit'; +import { AdminSystemProfileFieldsComponent } from './pages/admin/system-profile-fields/system-profile-fields.component'; +import { AdminSystemPropertiesComponent } from './pages/admin/system-properties/system-properties.component'; +import { AdminSystemPropertyEditDialog } from './pages/admin/system-properties/system-property.edit'; +import { AdminTimeslotsComponent } from './pages/admin/timeslots/timeslots.component'; +import { AdminUserAliasEditDialog } from './pages/admin/user-aliases/user-alias.edit'; +import { AdminUserAliasesComponent } from './pages/admin/user-aliases/user-aliases.component'; +import { AdminUserEditDialog } from './pages/admin/users/user.edit'; +import { AdminUsersComponent } from './pages/admin/users/users.component'; +import { AdminVoucherMappingEditDialog } from './pages/admin/voucher-mappings/voucher-mapping.edit'; +import { AdminVoucherMappingsComponent } from './pages/admin/voucher-mappings/voucher-mappings.component'; +import { BorrowComponent } from './pages/borrow/borrow.component'; +import { FormLoginOidcComponent } from './pages/form-login-oidc/form-login-oidc.component'; +import { StartPageComponent } from './pages/home-redirect/home-redirect.component'; +import { InviteCodeComponent } from './pages/invites/code/code.component'; +import { InviteEditComponent } from './pages/invites/edit/invite.edit'; +import { JukeboxComponent } from './pages/jukebox/jukebox.compontent'; +import { MinetestAccountsComponent } from './pages/minetest/accounts/accounts.component'; +import { I18nPaginatorIntl, I18nService } from './services/i18n.service'; +import { DatetimepickerComponent } from './ui/datetimepicker/datetimepicker.component'; +import { DurationpickerComponent } from './ui/durationpicker/durationpicker.component'; export function init_app(i18n: I18nService) { @@ -167,7 +167,8 @@ export class XhrInterceptor implements HttpInterceptor { DatetimepickerComponent, DurationpickerComponent, JukeboxComponent, - AdminComponent, AdminUsersComponent, AdminUserEditDialog, AdminPermissionEditDialog, AdminQuotaEditDialog, + StartPageComponent, + AdminComponent, AdminUsersComponent, AdminUserEditDialog, AdminPermissionEditDialog, AdminQuotaEditDialog, AdminServiceEditDialog, AdminPermissionMappingEditDialog, AdminQuotaMappingEditDialog, AdminOidcClientEditDialog, AdminVoucherMappingEditDialog, AdminSystemPropertyEditDialog, AdminSystemProfileFieldEditDialog, AdminUserAliasEditDialog, AdminJitsiRoomEditDialog, diff --git a/src/app/auth/auth.guard.ts b/src/app/auth/auth.guard.ts index f759775..ebab318 100644 --- a/src/app/auth/auth.guard.ts +++ b/src/app/auth/auth.guard.ts @@ -47,11 +47,12 @@ export class AuthenticatedGuard implements CanActivate { return that.router.navigateByUrl(that.router.parseUrl('/login?target=' + encodeURIComponent(state.url)), { skipLocationChange: true, replaceUrl: true }); } - this.profileService.get([ "locale", "darkTheme" ]).subscribe({ + this.profileService.get([ "locale", "darkTheme", "startPage" ]).subscribe({ next: (profileFields: any) => { let updateLocale = false; let darktheme = 'false'; let updateTheme = false; + let startPage = '/account/info'; for (let profileField of profileFields) { if (profileField.name == "darkTheme") { darktheme = profileField.value; @@ -62,6 +63,8 @@ export class AuthenticatedGuard implements CanActivate { updateLocale = true; } } catch { } + } else if (profileField.name == "startPage") { + startPage = profileField.value; } } @@ -70,6 +73,11 @@ export class AuthenticatedGuard implements CanActivate { localStorage.setItem("bstly.darkTheme", darktheme); updateTheme = true; } + + if (startPage != localStorage.getItem("bstly.startPage")) { + localStorage.setItem("bstly.startPage", startPage); + updateTheme = true; + } } catch { } if (updateLocale || updateTheme) { diff --git a/src/app/pages/account/security/security-key.dialog.html b/src/app/pages/account/security/security-key.dialog.html index 89ab949..fdf3362 100644 --- a/src/app/pages/account/security/security-key.dialog.html +++ b/src/app/pages/account/security/security-key.dialog.html @@ -7,10 +7,11 @@

{{'security.webauthn.nickname' | i18n}} - +
- - + {{'ok' | + i18n}} + {{'cancel' | i18n}}
\ No newline at end of file diff --git a/src/app/pages/account/security/security-totp.dialog.html b/src/app/pages/account/security/security-totp.dialog.html index 1df79d9..a1b1d69 100644 --- a/src/app/pages/account/security/security-totp.dialog.html +++ b/src/app/pages/account/security/security-totp.dialog.html @@ -15,7 +15,7 @@
- {{'cancel' | i18n}} {{'security.2fa.totp.enable' | i18n}} + {{'cancel' | i18n}}
\ No newline at end of file diff --git a/src/app/pages/account/security/security.component.html b/src/app/pages/account/security/security.component.html index 0a245e7..d552d38 100644 --- a/src/app/pages/account/security/security.component.html +++ b/src/app/pages/account/security/security.component.html @@ -146,6 +146,11 @@ } + @if (webauthnWarning) { +
+ {{'security.webauthn.hint' | i18n}} +
+ } } diff --git a/src/app/pages/account/security/security.component.scss b/src/app/pages/account/security/security.component.scss index 05a706c..9dfd6a5 100644 --- a/src/app/pages/account/security/security.component.scss +++ b/src/app/pages/account/security/security.component.scss @@ -1,3 +1,9 @@ +@use '../../../../variables.scss' as vars; + mat-form-field { display: inline; } + +.mat-bg-error-container { + color: vars.$warn; +} \ No newline at end of file diff --git a/src/app/pages/account/security/security.component.ts b/src/app/pages/account/security/security.component.ts index ac86da5..4765108 100644 --- a/src/app/pages/account/security/security.component.ts +++ b/src/app/pages/account/security/security.component.ts @@ -1,4 +1,4 @@ -import { Component, Inject, OnInit, ViewChild } from '@angular/core'; +import { Component, HostListener, Inject, OnInit, ViewChild } from '@angular/core'; import { FormBuilder, FormControl, FormGroup, NgForm, Validators } from '@angular/forms'; import { MAT_DIALOG_DATA, MatDialog, MatDialogRef } from '@angular/material/dialog'; @@ -16,13 +16,14 @@ import { MatchingValidator } from './../../../utils/matching.validator'; }) export class SecurityComponent implements OnInit { - public working: boolean; - public success: boolean; - public successStatus: boolean; - public totp: boolean = false; - public webauthn: boolean = false; - public webAuthnSupported: boolean = false; - public webAuthnCredentials: any[] = []; + working: boolean; + success: boolean; + successStatus: boolean; + totp: boolean = false; + webauthn: boolean = false; + webauthnWarning: boolean = false; + webAuthnSupported: boolean = false; + webAuthnCredentials: any[] = []; statuses = ["NORMAL", "SLEEP", "PURGE"]; @@ -77,10 +78,12 @@ export class SecurityComponent implements OnInit { next: (credentials) => { this.webAuthnCredentials = credentials; this.webauthn = credentials.length > 0; + this.webauthnWarning = this.webauthn && credentials.some((c) => c.usage == 'LOGIN_2FA'); }, error: (error) => { this.webAuthnCredentials = []; this.webauthn = false; + this.webauthnWarning = false; } }); } @@ -271,6 +274,18 @@ export class SecurityTotpDialog { ngOnInit(): void { this.code = new FormControl('', [Validators.required, Validators.pattern("[0-9]{6}")]); } + + @HostListener('window:keyup.Enter', ['$event']) + confirmDialog(): void { + if (this.code.valid && this.code.value) { + this.dialogRef.close(this.code.value); + } + } + + @HostListener('window:keyup.Esc', ['$event']) + cancelDialog(): void { + this.dialogRef.close(false); + } } @Component({ @@ -288,5 +303,17 @@ export class SecurityKeyDialog implements OnInit { ngOnInit(): void { this.nickname = new FormControl('', []); } + + @HostListener('window:keyup.Enter', ['$event']) + confirmDialog(): void { + if (this.nickname.value) { + this.dialogRef.close(this.nickname.value); + } + } + + @HostListener('window:keyup.Esc', ['$event']) + cancelDialog(): void { + this.dialogRef.close(false); + } } diff --git a/src/app/pages/admin/admin.component.html b/src/app/pages/admin/admin.component.html index 3b229d0..da1a434 100644 --- a/src/app/pages/admin/admin.component.html +++ b/src/app/pages/admin/admin.component.html @@ -1,52 +1,50 @@

{{'admin.title' | i18n}} admin_panel_settings