From c4321d99cb4b6e1eb70d0d5ed670b6177acf4d43 Mon Sep 17 00:00:00 2001 From: Lurkars Date: Thu, 11 Mar 2021 19:52:37 +0100 Subject: [PATCH] update --- package-lock.json | 13 + package.json | 2 + src/app/app-routing.module.ts | 7 +- src/app/app.component.html | 3 - src/app/app.component.ts | 27 +- src/app/app.module.ts | 82 +- src/app/material/material.module.ts | 4 +- src/app/pages/account/account.component.html | 1 + .../pages/account/info/info.component.html | 4 +- src/app/pages/account/info/info.component.ts | 8 +- .../account/profile/profile.component.html | 1 + .../account/profile/profile.component.scss | 8 + .../account/profile/profile.component.spec.ts | 25 + .../account/profile/profile.component.ts | 24 + .../security/security-totp.dialog.html | 2 +- .../pages/home/club/home-club.component.html | 2 +- src/app/pages/home/home.component.ts | 14 + src/app/pages/home/home.terms-of-service.html | 1 + src/app/pages/register/register.component.ts | 70 +- src/app/pages/register/register.dialog.html | 18 +- src/app/services/profile.service.ts | 33 + .../ui/permissions/permissions.component.html | 7 +- .../ui/permissions/permissions.component.ts | 8 +- .../ui/profilefields/profilefield.blob.html | 9 + .../ui/profilefields/profilefield.blob.scss | 3 + .../ui/profilefields/profilefield.dialog.html | 66 ++ .../ui/profilefields/profilefield.dialog.scss | 3 + .../profilefields.component.html | 55 ++ .../profilefields.component.scss | 3 + .../profilefields.component.spec.ts | 25 + .../profilefields/profilefields.component.ts | 159 ++++ src/assets/i18n/de-informal.json | 53 +- src/assets/i18n/en.json | 47 +- src/assets/templates/de-informal/about.html | 2 +- .../templates/de-informal/club/charter.html | 63 +- src/assets/templates/de-informal/imprint.html | 18 +- .../templates/de-informal/privacy-policy.html | 854 +++++++++++------- .../services/active/nextcloud.html | 2 +- .../de-informal/terms-of-service.html | 120 +++ src/environments/environment.prod.ts | 2 +- src/styles.scss | 12 + 41 files changed, 1389 insertions(+), 471 deletions(-) create mode 100644 src/app/pages/account/profile/profile.component.html create mode 100644 src/app/pages/account/profile/profile.component.scss create mode 100644 src/app/pages/account/profile/profile.component.spec.ts create mode 100644 src/app/pages/account/profile/profile.component.ts create mode 100644 src/app/pages/home/home.terms-of-service.html create mode 100644 src/app/services/profile.service.ts create mode 100644 src/app/ui/profilefields/profilefield.blob.html create mode 100644 src/app/ui/profilefields/profilefield.blob.scss create mode 100644 src/app/ui/profilefields/profilefield.dialog.html create mode 100644 src/app/ui/profilefields/profilefield.dialog.scss create mode 100644 src/app/ui/profilefields/profilefields.component.html create mode 100644 src/app/ui/profilefields/profilefields.component.scss create mode 100644 src/app/ui/profilefields/profilefields.component.spec.ts create mode 100644 src/app/ui/profilefields/profilefields.component.ts create mode 100644 src/assets/templates/de-informal/terms-of-service.html diff --git a/package-lock.json b/package-lock.json index c40aa15..dd4b293 100644 --- a/package-lock.json +++ b/package-lock.json @@ -799,6 +799,14 @@ "tslib": "^2.0.0" } }, + "@angular/material-moment-adapter": { + "version": "10.2.7", + "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-10.2.7.tgz", + "integrity": "sha512-VaigAiBCz10AvpzgZvdR4SCGnMRxXKx8ukUdeowuoqAFONEPpRdCJmwZ+8bpi9Q/jXlrZJicCMhklj4bBQw6tg==", + "requires": { + "tslib": "^2.0.0" + } + }, "@angular/platform-browser": { "version": "10.1.5", "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-10.1.5.tgz", @@ -8233,6 +8241,11 @@ "minimist": "^1.2.5" } }, + "moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", diff --git a/package.json b/package.json index a7dfb9e..b6c495c 100644 --- a/package.json +++ b/package.json @@ -18,10 +18,12 @@ "@angular/core": "~10.1.5", "@angular/forms": "~10.1.5", "@angular/material": "^10.2.4", + "@angular/material-moment-adapter": "^10.2.7", "@angular/platform-browser": "~10.1.5", "@angular/platform-browser-dynamic": "~10.1.5", "@angular/router": "~10.1.5", "angularx-qrcode": "^10.0.11", + "moment": "^2.29.1", "openpgp": "^4.10.8", "rxjs": "~6.6.0", "tslib": "^2.0.0", diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 52682b6..a70bfe7 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -2,7 +2,7 @@ import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; import { AuthGuard, AuthUpdateGuard, AuthenticatedGuard, AnonymousGuard } from './auth/auth.guard'; -import { HomeComponent, ImprintComponent, PrivacyPolicyComponent } from './pages/home/home.component'; +import { HomeComponent, ImprintComponent, PrivacyPolicyComponent, TermsOfServiceComponent } from './pages/home/home.component'; import { HomeClubComponent } from './pages/home/club/home-club.component'; import { HomeGeneralComponent } from './pages/home/general/home-general.component'; import { HomePrivacyComponent } from './pages/home/privacy/home-privacy.component'; @@ -18,13 +18,14 @@ import { RegisterComponent } from './pages/register/register.component'; import { TokensComponent } from './pages/tokens/tokens.component'; import { AppsComponent } from './pages/apps/apps.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'; const routes: Routes = [ - { path: '', redirectTo: "/general", pathMatch: 'full' }, + { path: '', redirectTo: "/account", pathMatch: 'full' }, { path: '', component: HomeComponent, canActivate: [AuthUpdateGuard], runGuardsAndResolvers: 'always', children: [ { path: 'general', component: HomeGeneralComponent, canActivate: [AuthUpdateGuard] }, @@ -35,6 +36,7 @@ const routes: Routes = [ }, { path: 'imprint', component: ImprintComponent, canActivate: [AuthUpdateGuard] }, { path: 'privacy-policy', component: PrivacyPolicyComponent, canActivate: [AuthUpdateGuard] }, + { path: 'terms-of-service', component: TermsOfServiceComponent, canActivate: [AuthUpdateGuard] }, { path: 'login', component: LoginComponent, canActivate: [AnonymousGuard] }, { path: 'login/totp', component: LoginTotpComponent, canActivate: [AnonymousGuard] }, { path: 'external-login', component: FormLoginComponent, canActivate: [AnonymousGuard] }, @@ -46,6 +48,7 @@ const routes: Routes = [ path: 'account', component: AccountComponent, canActivate: [AuthenticatedGuard], children: [ { path: 'info', component: InfoComponent, canActivate: [AuthenticatedGuard] }, + { path: 'profile', component: ProfileComponent, canActivate: [AuthenticatedGuard] }, { path: 'voucher', component: VoucherComponent, canActivate: [AuthenticatedGuard] }, { path: 'security', component: SecurityComponent, canActivate: [AuthenticatedGuard] } ] diff --git a/src/app/app.component.html b/src/app/app.component.html index c21ac88..cedee7f 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -24,9 +24,6 @@ - - home {{'home' | i18n}} - login {{'login' | i18n}} diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 3b68b62..74f798b 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,10 +1,11 @@ -import { Component, HostListener } from '@angular/core'; +import {Component, HostListener} from '@angular/core'; -import { AuthService } from './services/auth.service'; -import { I18nService } from './services/i18n.service'; -import { Router } from '@angular/router'; -import { DomSanitizer } from '@angular/platform-browser'; -import { MatIconRegistry } from '@angular/material/icon'; +import {AuthService} from './services/auth.service'; +import {I18nService} from './services/i18n.service'; +import {Router} from '@angular/router'; +import {DomSanitizer} from '@angular/platform-browser'; +import {MatIconRegistry} from '@angular/material/icon'; +import {DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE} from '@angular/material/core'; @Component({ selector: 'app-root', @@ -19,19 +20,21 @@ export class AppComponent { locales; auth; - constructor(private i18n: I18nService, private authService: AuthService, private router: Router, private iconRegistry: MatIconRegistry, private sanitizer: DomSanitizer) { + constructor(private i18n: I18nService, private authService: AuthService, private router: Router, private iconRegistry: MatIconRegistry, private sanitizer: DomSanitizer, private _adapter: DateAdapter) { this.currentLocale = this.i18n.getLocale(); this.locales = this.i18n.getLocales(); this.authService.auth.subscribe(data => { this.auth = data; }) + this._adapter.setLocale(this.currentLocale); + iconRegistry.addSvgIcon('logo', sanitizer.bypassSecurityTrustResourceUrl('assets/icons/logo.svg')); } ngOnInit() { const width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; - if (width < 768) { + if(width < 768) { this.opened = false; } else { this.opened = true; @@ -45,13 +48,15 @@ export class AppComponent { logout() { this.authService.logout().subscribe(data => { - this.router.navigate([""]); + this.router.navigate([""]).then(() => { + window.location.reload(); + }); }) } isBiggerScreen() { const width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; - if (width < 768) { + if(width < 768) { return false; } else { return true; @@ -60,7 +65,7 @@ export class AppComponent { @HostListener('window:resize', ['$event']) onResize(event) { - if (event.target.innerWidth < 768) { + if(event.target.innerWidth < 768) { this.opened = false; } else { this.opened = true; diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 5b81099..cf3c1b6 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,47 +1,49 @@ -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 'angularx-qrcode'; +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 'angularx-qrcode'; -import { I18nPipe } from './utils/i18n.pipe'; -import { HomeComponent, ImprintComponent, PrivacyPolicyComponent } from './pages/home/home.component'; -import { HomeClubComponent } from './pages/home/club/home-club.component'; -import { HomeGeneralComponent } from './pages/home/general/home-general.component'; -import { HomePrivacyComponent } from './pages/home/privacy/home-privacy.component'; -import { HomeServicesComponent } from './pages/home/services/home-services.component'; -import { AccountComponent } from './pages/account/account.component'; -import { AppsComponent } from './pages/apps/apps.component'; -import { AppComponent } from './app.component'; -import { LoginComponent } from './pages/login/login.component'; -import { LoginTotpComponent } from './pages/login-totp/login-totp.component'; -import { FormLoginComponent } from './pages/form-login/form-login.component'; -import { FormLoginTotpComponent } from './pages/form-login-totp/form-login-totp.component'; -import { TokensComponent } from './pages/tokens/tokens.component'; -import { PermissionsComponent } from './ui/permissions/permissions.component'; -import { QuotasComponent } from './ui/quotas/quotas.component'; -import { SecurityComponent, 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 { PasswordComponent } from './pages/password/password.component'; -import { PasswordResetComponent } from './pages/password-reset/password-reset.component'; -import { RegisterComponent, RegisterDialog } from './pages/register/register.component'; -import { UsernameDialog } from './pages/register/username-dialog/username.dialog'; -import { UnavailableComponent } from './pages/unavailable/unavailable.component'; -import { NotfoundComponent } from './pages/notfound/notfound.component'; -import { HtmlComponent } from './utils/html/html.component'; +import {I18nPipe} from './utils/i18n.pipe'; +import {HomeComponent, ImprintComponent, PrivacyPolicyComponent, TermsOfServiceComponent} from './pages/home/home.component'; +import {HomeClubComponent} from './pages/home/club/home-club.component'; +import {HomeGeneralComponent} from './pages/home/general/home-general.component'; +import {HomePrivacyComponent} from './pages/home/privacy/home-privacy.component'; +import {HomeServicesComponent} from './pages/home/services/home-services.component'; +import {AccountComponent} from './pages/account/account.component'; +import {AppsComponent} from './pages/apps/apps.component'; +import {AppComponent} from './app.component'; +import {LoginComponent} from './pages/login/login.component'; +import {LoginTotpComponent} from './pages/login-totp/login-totp.component'; +import {FormLoginComponent} from './pages/form-login/form-login.component'; +import {FormLoginTotpComponent} from './pages/form-login-totp/form-login-totp.component'; +import {TokensComponent} from './pages/tokens/tokens.component'; +import {PermissionsComponent} from './ui/permissions/permissions.component'; +import {ProfileFieldDialog, ProfileFieldsComponent, ProfileFieldBlob} from './ui/profilefields/profilefields.component'; +import {QuotasComponent} from './ui/quotas/quotas.component'; +import {SecurityComponent, 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 {ProfileComponent} from './pages/account/profile/profile.component'; +import {PasswordComponent} from './pages/password/password.component'; +import {PasswordResetComponent} from './pages/password-reset/password-reset.component'; +import {RegisterComponent, RegisterDialog} from './pages/register/register.component'; +import {UsernameDialog} from './pages/register/username-dialog/username.dialog'; +import {UnavailableComponent} from './pages/unavailable/unavailable.component'; +import {NotfoundComponent} from './pages/notfound/notfound.component'; +import {HtmlComponent} from './utils/html/html.component'; -import { I18nService } from './services/i18n.service'; +import {I18nService} from './services/i18n.service'; export function init_app(i18n: I18nService) { - return () => i18n.fetch(i18n.getLocale()).then(response => { }, error => { }); + return () => i18n.fetch(i18n.getLocale()).then(response => {}, error => {}); } @Injectable() @@ -59,7 +61,7 @@ export class XhrInterceptor implements HttpInterceptor { declarations: [ I18nPipe, AppComponent, - HomeComponent, ImprintComponent, PrivacyPolicyComponent, + HomeComponent, ImprintComponent, PrivacyPolicyComponent, TermsOfServiceComponent, HomeClubComponent, HomeGeneralComponent, HomePrivacyComponent, @@ -72,12 +74,14 @@ export class XhrInterceptor implements HttpInterceptor { TokensComponent, AppsComponent, PermissionsComponent, + ProfileFieldsComponent, ProfileFieldDialog, ProfileFieldBlob, QuotasComponent, SecurityComponent, SecurityTotpDialog, VoucherComponent, VoucherDialog, InfoComponent, + ProfileComponent, PasswordComponent, PasswordResetComponent, RegisterComponent, @@ -98,7 +102,7 @@ export class XhrInterceptor implements HttpInterceptor { QRCodeModule, ], exports: [MaterialModule], - providers: [{ provide: APP_INITIALIZER, useFactory: init_app, deps: [I18nService], multi: true }, { provide: HTTP_INTERCEPTORS, useClass: XhrInterceptor, multi: true }], + providers: [{provide: APP_INITIALIZER, useFactory: init_app, deps: [I18nService], multi: true}, {provide: HTTP_INTERCEPTORS, useClass: XhrInterceptor, multi: true}], bootstrap: [AppComponent], }) export class AppModule { diff --git a/src/app/material/material.module.ts b/src/app/material/material.module.ts index 899699b..65abf6c 100644 --- a/src/app/material/material.module.ts +++ b/src/app/material/material.module.ts @@ -42,6 +42,7 @@ import { MatTooltipModule } from '@angular/material/tooltip'; import { MatPaginatorModule } from '@angular/material/paginator'; import { MatSortModule } from '@angular/material/sort'; import { MatTableModule } from '@angular/material/table'; +import { MatMomentDateModule } from '@angular/material-moment-adapter'; @NgModule({ declarations: [], @@ -81,7 +82,8 @@ import { MatTableModule } from '@angular/material/table'; MatTooltipModule, MatPaginatorModule, MatSortModule, - MatTableModule + MatTableModule, + MatMomentDateModule ], exports: [ MatAutocompleteModule, diff --git a/src/app/pages/account/account.component.html b/src/app/pages/account/account.component.html index 8a94b2e..449e54f 100644 --- a/src/app/pages/account/account.component.html +++ b/src/app/pages/account/account.component.html @@ -3,6 +3,7 @@ diff --git a/src/app/pages/account/info/info.component.html b/src/app/pages/account/info/info.component.html index 04b6956..63afe2e 100644 --- a/src/app/pages/account/info/info.component.html +++ b/src/app/pages/account/info/info.component.html @@ -1,4 +1,6 @@

{{'permissions' | i18n}}

{{'quotas' | i18n}}

- \ No newline at end of file + +

{{'profile' | i18n}}

+ \ No newline at end of file diff --git a/src/app/pages/account/info/info.component.ts b/src/app/pages/account/info/info.component.ts index 76feef1..2b7eb80 100644 --- a/src/app/pages/account/info/info.component.ts +++ b/src/app/pages/account/info/info.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { PermissionService } from './../../../services/permission.service'; import { QuotaService } from './../../../services/quota.service'; +import { ProfileService } from './../../../services/profile.service'; @Component({ selector: 'app-account-info', @@ -11,8 +12,9 @@ export class InfoComponent implements OnInit { permissions = []; quotas = []; + profileFields = []; - constructor(private permissionService: PermissionService, private quotaService: QuotaService) { } + constructor(private permissionService: PermissionService, private quotaService: QuotaService, private profileService : ProfileService) { } ngOnInit(): void { this.permissionService.permissions().subscribe((data: any) => { @@ -22,6 +24,10 @@ export class InfoComponent implements OnInit { this.quotaService.quotas().subscribe((data: any) => { this.quotas = data; }) + + this.profileService.getAll().subscribe((data: any) => { + this.profileFields = data; + }) } } diff --git a/src/app/pages/account/profile/profile.component.html b/src/app/pages/account/profile/profile.component.html new file mode 100644 index 0000000..b189c6e --- /dev/null +++ b/src/app/pages/account/profile/profile.component.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/app/pages/account/profile/profile.component.scss b/src/app/pages/account/profile/profile.component.scss new file mode 100644 index 0000000..9707ef7 --- /dev/null +++ b/src/app/pages/account/profile/profile.component.scss @@ -0,0 +1,8 @@ + +table { + width: 100%; +} + +td.mat-cell { + padding: 12px; +} \ No newline at end of file diff --git a/src/app/pages/account/profile/profile.component.spec.ts b/src/app/pages/account/profile/profile.component.spec.ts new file mode 100644 index 0000000..39cbc71 --- /dev/null +++ b/src/app/pages/account/profile/profile.component.spec.ts @@ -0,0 +1,25 @@ +import {ComponentFixture, TestBed} from '@angular/core/testing'; + +import {ProfileComponent} from './profile.component'; + +describe('ProfileComponent', () => { + let component: ProfileComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ProfileComponent] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ProfileComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/account/profile/profile.component.ts b/src/app/pages/account/profile/profile.component.ts new file mode 100644 index 0000000..e51e96f --- /dev/null +++ b/src/app/pages/account/profile/profile.component.ts @@ -0,0 +1,24 @@ +import {Component, OnInit} from '@angular/core'; +import {ProfileService} from '../../../services/profile.service'; +import {I18nService} from '../../../services/i18n.service'; + +@Component({ + selector: 'app-account-profile', + templateUrl: './profile.component.html', + styleUrls: ['./profile.component.scss'] +}) +export class ProfileComponent implements OnInit { + + profileFields = []; + types = ["TEXT", "NUMBER", "DATE", "URL", "EMAIL", "BOOL"]; + visibilities = ["PRIVATE", "PROTECTED", "PUBLIC"]; + + constructor(private profileService: ProfileService, private i18n: I18nService) {} + + ngOnInit(): void { + this.profileService.getAll().subscribe((data: any) => { + this.profileFields = data; + }) + } + +} diff --git a/src/app/pages/account/security/security-totp.dialog.html b/src/app/pages/account/security/security-totp.dialog.html index dedb8fb..bdcd97f 100644 --- a/src/app/pages/account/security/security-totp.dialog.html +++ b/src/app/pages/account/security/security-totp.dialog.html @@ -12,5 +12,5 @@
- +
\ No newline at end of file diff --git a/src/app/pages/home/club/home-club.component.html b/src/app/pages/home/club/home-club.component.html index b23ed48..d636d35 100644 --- a/src/app/pages/home/club/home-club.component.html +++ b/src/app/pages/home/club/home-club.component.html @@ -23,7 +23,7 @@ {{'home.club.charter' | i18n}} - + \ No newline at end of file diff --git a/src/app/pages/home/home.component.ts b/src/app/pages/home/home.component.ts index 02a51a3..db77dbf 100644 --- a/src/app/pages/home/home.component.ts +++ b/src/app/pages/home/home.component.ts @@ -41,4 +41,18 @@ export class PrivacyPolicyComponent implements OnInit { ngOnInit(): void { } +} + +@Component({ + selector: 'app-terms-of-service', + templateUrl: './home.terms-of-service.html' +}) +export class TermsOfServiceComponent implements OnInit { + + constructor() { + } + + ngOnInit(): void { + } + } \ No newline at end of file diff --git a/src/app/pages/home/home.terms-of-service.html b/src/app/pages/home/home.terms-of-service.html new file mode 100644 index 0000000..e29c572 --- /dev/null +++ b/src/app/pages/home/home.terms-of-service.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/app/pages/register/register.component.ts b/src/app/pages/register/register.component.ts index 52b12e2..ea35e94 100644 --- a/src/app/pages/register/register.component.ts +++ b/src/app/pages/register/register.component.ts @@ -1,15 +1,15 @@ -import { Component, OnInit, Inject } from '@angular/core'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; -import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { Router } from '@angular/router'; +import {Component, OnInit, Inject, ViewChild, ElementRef} from '@angular/core'; +import {FormBuilder, FormGroup, Validators} from '@angular/forms'; +import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog'; +import {Router} from '@angular/router'; -import { UserService } from './../../services/user.service'; -import { ItemService } from './../../services/item.service'; -import { I18nService } from './../../services/i18n.service'; -import { MatchingValidator } from './../../utils/matching.validator'; +import {UserService} from './../../services/user.service'; +import {ItemService} from './../../services/item.service'; +import {I18nService} from './../../services/i18n.service'; +import {MatchingValidator} from './../../utils/matching.validator'; -import { uniqueNamesGenerator, Config, adjectives, colors, animals } from 'unique-names-generator'; +import {uniqueNamesGenerator, Config, adjectives, colors, animals} from 'unique-names-generator'; var openpgp = require('openpgp'); @@ -71,10 +71,10 @@ export class RegisterComponent implements OnInit { register() { this.missingToken = false; - if (this.form.valid && !this.working) { + if(this.form.valid && !this.working) { this.working = true; let pgpOption = { - userIds: [{ name: this.model.username, email: this.model.username + "@we.bstly.de" }], + userIds: [{name: this.model.username, email: this.model.username + "@we.bstly.de"}], curve: "ed25519", } @@ -82,18 +82,21 @@ export class RegisterComponent implements OnInit { openpgp.generateKey(pgpOption).then((key) => { privKey = key.privateKeyArmored; pubKey = key.publicKeyArmored; - this.model.publicKey = pubKey; + + this.model.profileFields = [ + {"name": "publicKey", "type": "BLOB", "visibility": "PROTECTED", "blob": pubKey} + ] + + if(this.model.email) { + this.model.profileFields.push({"name": "email", "type": "EMAIL", "visibility": "PRITAVE", "value": this.model.email}) + } + if(this.model.primaryEmail) { + this.model.profileFields.push({"name": "primaryEmail", "type": "BOOL", "visibility": "PRITAVE", "value": this.model.primaryEmail}) + } + this.userService.register(this.model).subscribe((result: any) => { result.privateKey = privKey; - var element = document.createElement('a'); - element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(privKey)); - element.setAttribute('download', result.username + ".private.key"); - element.style.display = 'none'; - document.body.appendChild(element); - element.click(); - document.body.removeChild(element); - const dialogRef = this.dialog.open(RegisterDialog, { closeOnNavigation: false, disableClose: true, @@ -101,7 +104,7 @@ export class RegisterComponent implements OnInit { }); dialogRef.afterClosed().subscribe(result => { - if (result) { + if(result) { this.success = true; } }); @@ -109,20 +112,21 @@ export class RegisterComponent implements OnInit { this.working = false; }, (error) => { this.working = false; - if (error.status == 401) { + if(error.status == 401) { this.missingToken = true; - } else if (error.status == 409) { + } else if(error.status == 409) { let errors = {}; - for (let code of error.error) { + for(let code of error.error) { errors[code.field] = errors[code.field] || {}; errors[code.field][code.code] = true; } - for (let code in errors) { + for(let code in errors) { this.form.get(code).setErrors(errors[code]); } } }) + }) } } @@ -136,8 +140,22 @@ export class RegisterComponent implements OnInit { }) export class RegisterDialog { + public downloaded: boolean = false; + + @ViewChild("downloadKey", {read: ElementRef}) downloadKey: ElementRef; + constructor(private router: Router, public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public data: any) { } + @Inject(MAT_DIALOG_DATA) public data: any) { + } + + ngAfterViewInit() { + this.downloadKey.nativeElement.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(this.data.privateKey)); + this.downloadKey.nativeElement.setAttribute('download', this.data.username + ".private.key"); + } + + setDownloaded() { + this.downloaded = true; + } } diff --git a/src/app/pages/register/register.dialog.html b/src/app/pages/register/register.dialog.html index eda3c9e..29766c9 100644 --- a/src/app/pages/register/register.dialog.html +++ b/src/app/pages/register/register.dialog.html @@ -1,5 +1,5 @@

{{data.username}}

-
+

{{'permissions' | i18n}}

{{'quotas' | i18n}}

@@ -10,11 +10,19 @@ {{'pgp.privateKey' | i18n}} -
-
- + + + {{'pgp.privateKey.downloadKey' | + i18n}} + + +
+ + {{'pgp.privateKey.confirmStore' | i18n}} -
\ No newline at end of file + \ No newline at end of file diff --git a/src/app/services/profile.service.ts b/src/app/services/profile.service.ts new file mode 100644 index 0000000..11d263d --- /dev/null +++ b/src/app/services/profile.service.ts @@ -0,0 +1,33 @@ +import {Injectable} from '@angular/core'; +import {HttpClient} from '@angular/common/http'; + +import {environment} from '../../environments/environment'; + +@Injectable({ + providedIn: 'root', +}) +export class ProfileService { + + constructor(private http: HttpClient) { + } + + getAll() { + return this.http.get(environment.apiUrl + "/profiles"); + } + + getAllForUser(username) { + return this.http.get(environment.apiUrl + "/profiles/" + username); + } + + getForUser(username, name) { + return this.http.get(environment.apiUrl + "/profiles/" + username + "/" + name); + } + + createOrUpdate(profileModel) { + return this.http.post(environment.apiUrl + "/profiles", profileModel); + } + + delete(name) { + return this.http.delete(environment.apiUrl + "/profiles/" + name); + } +} \ No newline at end of file diff --git a/src/app/ui/permissions/permissions.component.html b/src/app/ui/permissions/permissions.component.html index 7fd7805..ec7dcb1 100644 --- a/src/app/ui/permissions/permissions.component.html +++ b/src/app/ui/permissions/permissions.component.html @@ -6,9 +6,14 @@ + + {{'permissions.starts' | i18n}} + {{permission.starts | date:datetimeformat}} + + {{'permissions.expires' | i18n}} - {{permission.expires | date}} + {{permission.expires | date:datetimeformat}} diff --git a/src/app/ui/permissions/permissions.component.ts b/src/app/ui/permissions/permissions.component.ts index 6ce3896..791f3d0 100644 --- a/src/app/ui/permissions/permissions.component.ts +++ b/src/app/ui/permissions/permissions.component.ts @@ -9,13 +9,14 @@ import { I18nService } from './../../services/i18n.service'; }) export class PermissionsComponent implements OnInit { - + datetimeformat: String; @Input() permissions; - permissionColumns = ["name", "expires"]; + permissionColumns = ["name", "starts", "expires"]; constructor(private i18n: I18nService) { } ngOnInit(): void { + this.datetimeformat = this.i18n.get('date-time-format',[]); } sortData(sort: Sort) { @@ -28,7 +29,8 @@ export class PermissionsComponent implements OnInit { this.permissions = data.sort((a, b) => { const isAsc = sort.direction === 'asc'; switch (sort.active) { - case 'name': return this.compare(this.i18n.get('permissions.' + a.name,[]), this.i18n.get('permissions.' + b.name,[]), isAsc); + case 'name': return this.compare(this.i18n.get('permissions.' + a.name, []), this.i18n.get('permissions.' + b.name, []), isAsc); + case 'starts': return this.compare(a.starts, b.starts, isAsc); case 'expires': return this.compare(a.expires, b.expires, isAsc); default: return 0; } diff --git a/src/app/ui/profilefields/profilefield.blob.html b/src/app/ui/profilefields/profilefield.blob.html new file mode 100644 index 0000000..9a5d98f --- /dev/null +++ b/src/app/ui/profilefields/profilefield.blob.html @@ -0,0 +1,9 @@ +

+ +
+    {{profileField.blob}}
+  
+
+ + + \ No newline at end of file diff --git a/src/app/ui/profilefields/profilefield.blob.scss b/src/app/ui/profilefields/profilefield.blob.scss new file mode 100644 index 0000000..720774d --- /dev/null +++ b/src/app/ui/profilefields/profilefield.blob.scss @@ -0,0 +1,3 @@ +mat-form-field { + display: block; +} \ No newline at end of file diff --git a/src/app/ui/profilefields/profilefield.dialog.html b/src/app/ui/profilefields/profilefield.dialog.html new file mode 100644 index 0000000..fe08ec0 --- /dev/null +++ b/src/app/ui/profilefields/profilefield.dialog.html @@ -0,0 +1,66 @@ +

+ +
+ + + + + + + + + {{'profileField.type.' + type | i18n}} + + + + +
+ + + + + + + + + + + + + + + + + + + + +
+ + + + + + {{'profileField.visibility.' + visibility | i18n}} + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/src/app/ui/profilefields/profilefield.dialog.scss b/src/app/ui/profilefields/profilefield.dialog.scss new file mode 100644 index 0000000..720774d --- /dev/null +++ b/src/app/ui/profilefields/profilefield.dialog.scss @@ -0,0 +1,3 @@ +mat-form-field { + display: block; +} \ No newline at end of file diff --git a/src/app/ui/profilefields/profilefields.component.html b/src/app/ui/profilefields/profilefields.component.html new file mode 100644 index 0000000..b4dab05 --- /dev/null +++ b/src/app/ui/profilefields/profilefields.component.html @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{{'profileField.name' | i18n}} {{'profileField.name.' + profileField.name | i18n}} {{'profileField.value' | i18n}} +
+ {{profileField.value}} + {{profileField.value | date:datetimeformat}} + {{profileField.value}} + {{profileField.value}} + {{profileField.value}} + +
+
{{'profileField.visibility' | i18n}} {{'profileField.visibility.' + profileField.visibility | i18n}} + {{'profileField.edit' | i18n}} + + edit + + {{'profileField.delete' | i18n}} + + delete + +
+
+
+ +
\ No newline at end of file diff --git a/src/app/ui/profilefields/profilefields.component.scss b/src/app/ui/profilefields/profilefields.component.scss new file mode 100644 index 0000000..ccd3994 --- /dev/null +++ b/src/app/ui/profilefields/profilefields.component.scss @@ -0,0 +1,3 @@ +table { + width: 100%; +} \ No newline at end of file diff --git a/src/app/ui/profilefields/profilefields.component.spec.ts b/src/app/ui/profilefields/profilefields.component.spec.ts new file mode 100644 index 0000000..363865c --- /dev/null +++ b/src/app/ui/profilefields/profilefields.component.spec.ts @@ -0,0 +1,25 @@ +import {ComponentFixture, TestBed} from '@angular/core/testing'; + +import {ProfileFieldsComponent} from './profilefields.component'; + +describe('ProfileFieldsComponent', () => { + let component: ProfileFieldsComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ProfileFieldsComponent] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ProfileFieldsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/ui/profilefields/profilefields.component.ts b/src/app/ui/profilefields/profilefields.component.ts new file mode 100644 index 0000000..9b55cc1 --- /dev/null +++ b/src/app/ui/profilefields/profilefields.component.ts @@ -0,0 +1,159 @@ +import {Component, OnInit, Inject, Input} from '@angular/core'; +import {Sort} from '@angular/material/sort'; +import {FormBuilder, FormGroup, Validators} from '@angular/forms'; +import {MatDialog, MatDialogRef, MAT_DIALOG_DATA} from '@angular/material/dialog'; +import {I18nService} from '../../services/i18n.service'; +import {ProfileService} from '../../services/profile.service'; + +@Component({ + selector: 'app-profilefields', + templateUrl: './profilefields.component.html', + styleUrls: ['./profilefields.component.scss'] +}) +export class ProfileFieldsComponent implements OnInit { + + @Input() profileFields: Array; + @Input() edit; + profileFieldColumns = ["name", "value"]; + + constructor(private i18n: I18nService, private profileService: ProfileService, public dialog: MatDialog) {} + + ngOnInit(): void { + if(this.edit) { + this.profileFieldColumns.push("visibility"); + this.profileFieldColumns.push("edit"); + this.profileFieldColumns.push("delete"); + } + } + + sortData(sort: Sort) { + const data = this.profileFields.slice(); + if(!sort.active || sort.direction === '') { + this.profileFields = data; + return; + } + + this.profileFields = data.sort((a, b) => { + const isAsc = sort.direction === 'asc'; + switch(sort.active) { + case 'name': return this.compare(this.i18n.get('profileField.name.' + a.name, []), this.i18n.get('profileField.name.' + b.name, []), isAsc); + case 'value': return this.compare(a.value, b.value, isAsc); + case 'index': return this.compare(a.index, b.index, isAsc); + default: return 0; + } + }); + } + + compare(a: number | string | String, b: number | string | String, isAsc: boolean) { + return (a < b ? -1 : 1) * (isAsc ? 1 : -1); + } + + + openEdit(profileField) { + + const resetProfileField = JSON.parse(JSON.stringify(profileField)); + + const dialogRef = this.dialog.open(ProfileFieldDialog, { + data: profileField, + minWidth : '400px' + }); + + + dialogRef.afterClosed().subscribe(result => { + if(result) { + this.profileService.createOrUpdate(result).subscribe(); + } else { + profileField.name = resetProfileField.name; + profileField.value = resetProfileField.value; + profileField.type = resetProfileField.type; + profileField.visibility = resetProfileField.visibility; + profileField.index = resetProfileField.index; + } + }); + + } + + confirmDelete(profileField) { + this.profileService.delete(profileField.name).subscribe((result: any) => { + this.profileFields.splice(this.profileFields.indexOf(profileField), 1); + this.profileFields = [...this.profileFields]; + }) + } + + openCreate() { + const dialogRef = this.dialog.open(ProfileFieldDialog, { + data: {"type": "TEXT", "visibility": "PRIVATE"}, + minWidth : '400px' + }); + + dialogRef.afterClosed().subscribe(result => { + if(result) { + this.profileService.createOrUpdate(result).subscribe((result: any) => { + this.profileFields.push(result); + this.profileFields = [...this.profileFields]; + }); + } + }); + + } + + openBlob(profileField) { + this.dialog.open(ProfileFieldBlob, { + data: profileField, + minWidth : '400px' + }); + } + +} + +@Component({ + selector: 'app-profilefield-dialog', + templateUrl: 'profilefield.dialog.html', + styleUrls: ['./profilefield.dialog.scss'] +}) +export class ProfileFieldDialog { + + form: FormGroup; + profileField; + + types = ["TEXT", "NUMBER", "DATE", "URL", "EMAIL", "BOOL", "BLOB"]; + visibilities = ["PRIVATE", "PROTECTED", "PUBLIC"]; + + constructor( + private formBuilder: FormBuilder, + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any) { + this.profileField = data; + } + + ngOnInit() { + this.form = this.formBuilder.group({ + name: ['', Validators.required], + type: ['', Validators.required], + value: [''], + blob: [''], + visibility: ['', Validators.required], + index: [''] + }); + } +} + + +@Component({ + selector: 'app-profilefield-blob', + templateUrl: 'profilefield.blob.html', + styleUrls: ['./profilefield.blob.scss'] +}) +export class ProfileFieldBlob { + + profileField; + + constructor( + public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data: any) { + this.profileField = data; + } + + + +} \ No newline at end of file diff --git a/src/assets/i18n/de-informal.json b/src/assets/i18n/de-informal.json index c8d0189..883b8b4 100644 --- a/src/assets/i18n/de-informal.json +++ b/src/assets/i18n/de-informal.json @@ -1,5 +1,6 @@ { "i18n.test.replace": "Wat!?! {0} {1} {2}", + "date-time-format": "dd.MM.yyyy HH:mm:ss", "greet": "Hallo {0}", "home": { ".": "Über we.bstly", @@ -55,6 +56,8 @@ "account": "Account", "token": "Token", "ok": "Ok", + "save": "Speichern", + "close" : "Schliessen", "tokens": { ".": "Tokens", "redeem": "Tokens einlösen", @@ -145,6 +148,7 @@ "permissions": { ".": "Berechtigungen", "name": "Name", + "starts": "Gültig ab", "expires": "Gültig bis", "nextcloud": "Nextcloud", "mail": "E-Mail Postfach", @@ -207,6 +211,7 @@ ".": "PGP", "privateKey": { ".": "Privater PGP Schlüssel", + "downloadKey": "Privaten Schlüssel herunterladen", "confirmStore": "Ich habe meinen privaten Schlüssel sicher gespeichert!" } }, @@ -214,5 +219,51 @@ "sourcecode": "Quellcode", "homepage": "Homepage", "imprint": "Impressum", - "privacy-policy": "Datenschutzerklärung" + "privacy-policy": "Datenschutzerklärung", + "profile": "Profil", + "profileField": { + ".": "Profilfeld", + "name": { + ".": "Name" + }, + "type": { + ".": "Typ", + "TEXT": { + ".": "Textfeld" + }, + "NUMBER": { + ".": "Numerisch" + }, + "DATE": { + ".": "Datum" + }, + "URL": { + ".": "URL" + }, + "EMAIL": { + ".": "E-Mail" + }, + "BOOL": { + ".": "Boolean" + } + }, + "edit": "Bearbeiten", + "delete": "Löschen", + "openBlob" : "Anzeigen", + "create": "Neues Profilfeld hinzufügen", + "value": "Wert", + "index": "Index", + "visibility": { + ".": "Sichtbarkeit", + "PRIVATE": { + ".": "Privat" + }, + "PROTECTED": { + ".": "Geschützt" + }, + "PUBLIC": { + ".": "Öffentlich" + } + } + } } \ No newline at end of file diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index ced7ac0..3b136b2 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -1,5 +1,6 @@ { "i18n.test.replace": "yes no it's clear! {0} {1} {2}", + "date-time-format": "yyyy/dd/MM HH:mm:ss", "greet": "Hello {0}", "home": "Home", "cancel" : "Cancel", @@ -129,5 +130,49 @@ }, "software" : "Software", "sourcecode": "Sourcecode", - "homepage": "Homepage" + "homepage": "Homepage", + "profile": "Profile", + "imprint": "Imprint", + "privacy-policy": "Privacy-Policy", + "profileField": { + ".": "Profilefield", + "name": { + ".": "Name" + }, + "type": { + ".": "Typ", + "TEXT": { + ".": "Textfield" + }, + "NUMBER": { + ".": "Numeric" + }, + "DATE": { + ".": "Date" + }, + "URL": { + ".": "URL" + }, + "EMAIL": { + ".": "Email" + }, + "BOOL": { + ".": "Boolean" + } + }, + "value": "Value", + "index": "Index", + "visibility": { + ".": "Visibility", + "PRIVATE": { + ".": "Private" + }, + "PROTECTED": { + ".": "Protected" + }, + "PUBLIC": { + ".": "Public" + } + } + } } \ No newline at end of file diff --git a/src/assets/templates/de-informal/about.html b/src/assets/templates/de-informal/about.html index f150ac2..143a8ce 100644 --- a/src/assets/templates/de-informal/about.html +++ b/src/assets/templates/de-informal/about.html @@ -1,2 +1,2 @@

we.bstly

-

Willkommen zu 'Bastelei (bald e.V.)'.

\ No newline at end of file +

Willkommen zu 'Bastelei e. V.'.

\ No newline at end of file diff --git a/src/assets/templates/de-informal/club/charter.html b/src/assets/templates/de-informal/club/charter.html index aea6162..3027afb 100644 --- a/src/assets/templates/de-informal/club/charter.html +++ b/src/assets/templates/de-informal/club/charter.html @@ -1,5 +1,5 @@

Satzung

-

des “Bastelei e.V.”

+

des “Bastelei e. V.”

Präambel

@@ -40,10 +40,8 @@ Zahlung des ersten Beitrages im Voraus. Die Vorläufigkeit endet mit der Bestätigung des Mitglieds durch den Vorstand.

-

Die Mitgliedschaft endet durch Austrittserklärung, durch Tod von natürlichen Personen oder durch Auflösung und - Erlöschen von juristischen Personen, Handelsgesellschaften, nicht rechtsfähigen Vereinen sowie Anstalten und - Körperschaften des öffentlichen Rechts oder durch Ausschluss; die Beitragspflicht für das laufende Beitragsjahr - bleibt hiervon unberührt.

+

Die Mitgliedschaft endet durch Austrittserklärung, durch Tod von natürlichen Personen oder durch Ausschluss; die + Beitragspflicht für das laufende Beitragsjahr bleibt hiervon unberührt.

Der Austritt wird durch Willenserklärung in Textform gegenüber dem Vorstand vollzogen.

@@ -56,7 +54,8 @@ erforderlich.

§4 Rechte und Pflichten der Mitglieder

-

Die Mitglieder sind berechtigt, die Leistungen des Vereins in Anspruch zu nehmen.

+

Die Mitglieder sind berechtigt, die Einrichtungen des Vereins in Anspruch zu nehmen und an Veranstaltungen des + Vereins teilzunehmen.

Die Mitglieder sind verpflichtet, die satzungsgemäßen Zwecke des Vereins zu unterstützen und zu fördern. Sie sind verpflichtet, die festgesetzten Beiträge zu zahlen.

@@ -108,24 +107,22 @@

Mitgliederversammlungen können digital oder auch als Hybridveranstaltungen abgehalten werden. Technische Hürden können durch Bildung von Kleingruppen gelöst werden.

-

Außerordentliche Mitgliederversammlungen werden auf Beschluss des Vorstandes abgehalten, wenn die Interessen des +

Außerordentliche Mitgliederversammlungen werden auf Beschluss des Vorstandes abgehalten, wenn die Interessen des Vereins dies erfordern, oder wenn mindestens fünf Prozent, bei weniger als 60 Mitgliedern mindestens drei - Mitglieder, aller stimmberechtigten Mitglieder dies unter Angabe des Zwecks in Textform beantragen. Die Einberufung - der Mitgliederversammlung erfolgt in Textform durch den Vorstand mit einer Frist von mindestens zwei Wochen. Zur - Wahrung der Frist reicht die Versendung an die zuletzt bekannte E-Mail-Adresse oder die Aufgabe der Einladung zur - Post an die letzte bekannte Anschrift. Hierbei sind die Tagesordnung bekannt zugeben und ihr die nötigen - Informationen zugänglich zu machen. Anträge zur Tagesordnung sind mindestens sieben Tage vor der - Mitgliederversammlung beim Vorstand in Textform einzureichen. Über die Behandlung von Initiativanträgen entscheidet - die Mitgliederversammlung. -

+ Mitglieder, aller stimmberechtigten Mitglieder dies unter Angabe des Zwecks in Textform beantragen.

+ +

Die Einberufung der Mitgliederversammlung erfolgt in Textform durch den Vorstand mit einer Frist von mindestens zwei + Wochen. Eine verkürzte Frist ist möglich, wenn alle Mitglieder der Frist vor Ablauf zustimmen. Zur Wahrung der Frist + reicht die Versendung an die zuletzt bekannte E-Mail-Adresse oder die Aufgabe der Einladung zur Post an die letzte + bekannte Anschrift. Hierbei sind die Tagesordnung bekannt zu geben und ihr die nötigen Informationen zugänglich zu + machen. Anträge zur Tagesordnung sind mindestens sieben Tage vor der Mitgliederversammlung beim Vorstand in Textform + einzureichen. Über die Behandlung von Initiativanträgen entscheidet die Mitgliederversammlung.

Die Mitgliederversammlung ist beschlussfähig, wenn mindestens fünf Prozent, bei weniger als 60 Mitgliedern mindestens drei Mitglieder, aller stimmberechtigten Mitglieder anwesend sind. Beschlüsse sind jedoch gültig, wenn die - Beschlussfähigkeit vor der - Beschlussfassung nicht angezweifelt worden ist. Ist die Mitgliederversammlung aufgrund mangelnder Teilnehmerzahl - nicht - beschlussfähig, ist die darauf folgende ordentlich einberufene Mitgliederversammlung ungeachtet der Teilnehmerzahl - beschlussfähig.

+ Beschlussfähigkeit vor der Beschlussfassung nicht angezweifelt worden ist. Ist die Mitgliederversammlung aufgrund + mangelnder Teilnehmerzahl nicht beschlussfähig, ist die darauf folgende ordentlich einberufene Mitgliederversammlung + ungeachtet der Teilnehmerzahl beschlussfähig. Auf Letzteres muss in der Einladung hingewiesen werden.

Beschlüsse über Satzungsänderungen und über die Auflösung des Vereins bedürfen zu ihrer Rechtswirksamkeit der Dreiviertelmehrheit der anwesenden stimmberechtigten Mitglieder. In allen anderen Fällen genügt die @@ -145,22 +142,20 @@ durchgeführt werden. Abwesende Mitglieder können so jedoch auch an Wahlen teilnehmen. Technische Hürden können durch Bevollmächtigungen gelöst werden.

-

Jede WählerIn kann beliebig vielen KandidatInnen jeweils eine Stimme geben. Jeder zu besetzende Posten - wird einzeln gewählt, wobei gleichrangige Posten (die zwei FinanzprüferInnen) jeweils gemeinsam gewählt - werden können. Bei der Wahl des Vorstandes ist gewählt, wer die meisten abgegebenen Stimmen erhält. Bei - Stimmengleichheit findet eine Stichwahl statt. Bei erneuter Stimmengleichheit entscheidet das Los. Bei - der Wahl der FinanzprüferInnen sind diejenigen beiden KandidatInnen gewählt, die die meisten Stimmen erhalten. - Bei Stimmengleichheit findet eine Stichwahl statt. Bei erneuter Stimmengleichheit entscheidet das Los. +

Jeder zu besetzende Posten wird einzeln gewählt, wobei gleichrangige Posten jeweils gemeinsam gewählt werden können. + Bei der Wahl des Vorstandes ist gewählt, wer die meisten abgegebenen Stimmen erhält. Bei Stimmengleichheit findet + eine Stichwahl statt. Bei erneuter Stimmengleichheit entscheidet das Los. Bei der Wahl der FinanzprüferInnen sind + diejenigen beiden KandidatInnen gewählt, die die meisten Stimmen erhalten. Bei Stimmengleichheit findet eine + Stichwahl statt. Bei erneuter Stimmengleichheit entscheidet das Los.

§9 Vorstand

-

Der Vorstand besteht aus zwei oder mehr gleichberechtigten Mitgliedern.

+

Der Vorstand im Sinne des §26, Abs. 2 BGB besteht aus zwei oder mehr gleichberechtigten Mitgliedern.

-

Vorstand im Sinne des § 26, Abs. 2 BGB ist jedes Vorstandsmitglied. Ausgenommen sind Einstellung und - Entlassung von Angestellten, gerichtliche Vertretung sowie Anzeigen, Aufnahme von Krediten, Gründung, - Erwerb und Veräußerung von Gesellschaften und Geschäftsanteilen von Gesellschaften zur Verwirklichung - der satzungsgemäßen Ziele; bei denen der Verein durch mindestens zwei Vorstandsmitglieder vertreten - wird.

+

Vertretungsberechtigt ist jedes Vorstandsmitglied allein. Ausgenommen sind Einstellung und Entlassung von + Angestellten, gerichtliche Vertretung sowie Anzeigen, Aufnahme von Krediten, Gründung, Erwerb und Veräußerung von + Gesellschaften und Geschäftsanteilen von Gesellschaften zur Verwirklichung der satzungsgemäßen Ziele; bei denen der + Verein durch mindestens zwei Vorstandsmitglieder vertreten wird.

Scheidet ein Vorstandsmitglied vorzeitig aus, kann der Vorstand ein neues Vorstandsmitglied aus dem Kreis der Mitglieder bis zur nächsten Vollversammlung berufen.

@@ -173,7 +168,7 @@

Die Vorstandsmitglieder nehmen eine interne Aufgabenverteilung vor. Mit dem Ablauf des Geschäftsjahres stellt der Vorstand unverzüglich die Abrechnung sowie die Vermögensübersicht und sonstige Unterlagen von - wirtschaftlichen Belang den FinanzprüferInnen des Vereins zur Prüfung zur Verfügung.

+ wirtschaftlichem Belang den FinanzprüferInnen des Vereins zur Prüfung zur Verfügung.

Der Vorstand führt die laufenden Geschäfte des Vereins. Bei der Geschäftsführung sind die Vorstandsmitglieder an die Beschlüsse der Mitgliederversammlung gebunden. Der Vorstand soll seine @@ -182,8 +177,6 @@

Der Vorstand verwaltet das Vereinsvermögen.

-

Der Verein wird gerichtlich und außergerichtlich durch zwei Vorstandsmitglieder gemeinsam vertreten.

-

§10 FinanzprüferInnen

Zur Kontrolle der Haushaltsführung bestellt die Mitgliederversammlung zwei FinanzprüferInnen. Nach Durchführung ihrer Prüfung informieren sie den Vorstand von ihrem Prüfungsergebnis und erstatten der diff --git a/src/assets/templates/de-informal/imprint.html b/src/assets/templates/de-informal/imprint.html index 5eed054..f0dd1f3 100644 --- a/src/assets/templates/de-informal/imprint.html +++ b/src/assets/templates/de-informal/imprint.html @@ -1,7 +1,18 @@ + + + + + + + +

Impressum

Kontakt
- Name: Bastelei (bald e. V.)
+ Name: Bastelei e. V.
+ Adresse: Asternstraße 6, 58285 Gevelsberg
+ Telefon: 02332 666 77 01
+ Fax: 02332 666 76 99
E-Mail: impressum@bstly.de

@@ -48,4 +59,7 @@

Wenn du uns mitteilen würdest, dass du trotzdem eine Urheberrechtsverletzung gefunden hast, würden wir das sehr schätzen. Dann können wir den entsprechenden Inhalt sofort entfernen und würde damit das Urheberrecht nicht mehr - verletzen.

\ No newline at end of file + verletzen.

+ + + \ No newline at end of file diff --git a/src/assets/templates/de-informal/privacy-policy.html b/src/assets/templates/de-informal/privacy-policy.html index 2f7caef..a2bb65b 100644 --- a/src/assets/templates/de-informal/privacy-policy.html +++ b/src/assets/templates/de-informal/privacy-policy.html @@ -1,384 +1,570 @@ -

Die folgende Erklärung gilt für die Domain bstly.de sowie deren Subdomains.

-

Datenschutzerklärung

+ -

Personenbezogene Daten (nachfolgend zumeist nur „Daten“ genannt) werden von uns nur im Rahmen der Erforderlichkeit - sowie zum Zwecke der Bereitstellung eines funktionsfähigen und nutzerfreundlichen Internetauftritts, inklusive - seiner Inhalte und der dort angebotenen Leistungen, verarbeitet.

+ + + -

Gemäß Art. 4 Ziffer 1. der Verordnung (EU) 2016/679, also der Datenschutz-Grundverordnung (nachfolgend nur „DSGVO“ - genannt), gilt als „Verarbeitung“ jeder mit oder ohne Hilfe automatisierter Verfahren ausgeführter Vorgang oder jede - solche Vorgangsreihe im Zusammenhang mit personenbezogenen Daten, wie das Erheben, das Erfassen, die Organisation, - das Ordnen, die Speicherung, die Anpassung oder Veränderung, das Auslesen, das Abfragen, die Verwendung, die - Offenlegung durch Übermittlung, Verbreitung oder eine andere Form der Bereitstellung, den Abgleich oder die - Verknüpfung, die Einschränkung, das Löschen oder die Vernichtung.

+ +

Die folgende Erklärung gilt für die Domain bstly.de, deren Subdomains sowie für die von Bastelei e. V. + bereitgestellten Services.

+

Datenschutzerklärung

-

Mit der nachfolgenden Datenschutzerklärung informieren wir dich insbesondere über Art, Umfang, Zweck, Dauer und - Rechtsgrundlage der Verarbeitung personenbezogener Daten, soweit wir entweder allein oder gemeinsam mit anderen über - die Zwecke und Mittel der Verarbeitung entscheiden.

+

Personenbezogene Daten (nachfolgend zumeist nur „Daten“ genannt) werden von uns nur im Rahmen der + Erforderlichkeit + sowie zum Zwecke der Bereitstellung eines funktionsfähigen und nutzerfreundlichen Internetauftritts, inklusive + seiner Inhalte und der dort angebotenen Leistungen, verarbeitet.

-

Die Datenschutzerklärung ist wie folgt gegliedert:
- I. Informationen über uns als Verantwortliche
- II. Rechte der Nutzer und Betroffenen
- III. Informationen zur Datenverarbeitung

+

Gemäß Art. 4 Ziffer 1. der Verordnung (EU) 2016/679, also der Datenschutz-Grundverordnung (nachfolgend nur + „DSGVO“ + genannt), gilt als „Verarbeitung“ jeder mit oder ohne Hilfe automatisierter Verfahren ausgeführter Vorgang oder + jede + solche Vorgangsreihe im Zusammenhang mit personenbezogenen Daten, wie das Erheben, das Erfassen, die + Organisation, + das Ordnen, die Speicherung, die Anpassung oder Veränderung, das Auslesen, das Abfragen, die Verwendung, die + Offenlegung durch Übermittlung, Verbreitung oder eine andere Form der Bereitstellung, den Abgleich oder die + Verknüpfung, die Einschränkung, das Löschen oder die Vernichtung.

+ +

Mit der nachfolgenden Datenschutzerklärung informieren wir dich insbesondere über Art, Umfang, Zweck, Dauer und + Rechtsgrundlage der Verarbeitung personenbezogener Daten, soweit wir entweder allein oder gemeinsam mit anderen + über + die Zwecke und Mittel der Verarbeitung entscheiden.

+ +

Die Datenschutzerklärung ist wie folgt gegliedert:
+ I. Informationen über uns als Verantwortliche
+ II. Rechte der Nutzer und Betroffenen
+ III. Informationen zur Datenverarbeitung

-

I. Informationen über uns als Verantwortlicher

+

I. Informationen über uns als Verantwortlicher

-

Verantwortliche Anbieter dieses Internetauftritts im datenschutzrechtlichen Sinne:
- Name: Bastelei (bald e. V.)
- E-Mail: datenschutz@bstly.de

+

Verantwortliche Anbieter dieses Internetauftritts im datenschutzrechtlichen Sinne:
+ Name: Bastelei e. V.
+ Adresse: Asternstraße 6, 58285 Gevelsberg
+ Telefon: 02332 666 77 01
+ Fax: 02332 666 76 99
+ E-Mail: datenschutz@bstly.de

-

II. Rechte der Nutzer und Betroffenen

+

II. Rechte der Nutzer und Betroffenen

-

Mit Blick auf die nachfolgend noch näher beschriebene Datenverarbeitung hast du als Nutzer und Betroffenen das Recht - auf Bestätigung, ob dich betreffende Daten verarbeitet werden, auf Auskunft über die verarbeiteten Daten, auf - weitere - Informationen über die Datenverarbeitung sowie auf Kopien der Daten (vgl. auch Art. 15 DSGVO); - auf Berichtigung oder Vervollständigung unrichtiger bzw. unvollständiger Daten (vgl. auch Art. 16 DSGVO); - auf unverzügliche Löschung der dich betreffenden Daten (vgl. auch Art. 17 DSGVO), oder, alternativ, soweit eine - weitere Verarbeitung gemäß Art. 17 Abs. 3 DSGVO erforderlich ist, auf Einschränkung der Verarbeitung nach Maßgabe - von Art. 18 DSGVO; - auf Erhalt der dich betreffenden und von dir bereitgestellten Daten und auf Übermittlung dieser Daten an andere - Anbieter/Verantwortliche (vgl. auch Art. 20 DSGVO);
- auf Beschwerde gegenüber der Aufsichtsbehörde, sofern du der Ansicht bist, dass die dich betreffenden Daten durch - den Anbieter unter Verstoß gegen datenschutzrechtliche Bestimmungen verarbeitet werden (vgl. auch Art. 77 DSGVO). -

+

Mit Blick auf die nachfolgend noch näher beschriebene Datenverarbeitung hast du als Nutzer und Betroffenen das + Recht + auf Bestätigung, ob dich betreffende Daten verarbeitet werden, auf Auskunft über die verarbeiteten Daten, auf + weitere + Informationen über die Datenverarbeitung sowie auf Kopien der Daten (vgl. auch Art. 15 DSGVO); + auf Berichtigung oder Vervollständigung unrichtiger bzw. unvollständiger Daten (vgl. auch Art. 16 DSGVO); + auf unverzügliche Löschung der dich betreffenden Daten (vgl. auch Art. 17 DSGVO), oder, alternativ, soweit eine + weitere Verarbeitung gemäß Art. 17 Abs. 3 DSGVO erforderlich ist, auf Einschränkung der Verarbeitung nach + Maßgabe + von Art. 18 DSGVO; + auf Erhalt der dich betreffenden und von dir bereitgestellten Daten und auf Übermittlung dieser Daten an andere + Anbieter/Verantwortliche (vgl. auch Art. 20 DSGVO);
+ auf Beschwerde gegenüber der Aufsichtsbehörde, sofern du der Ansicht bist, dass die dich betreffenden Daten + durch + den Anbieter unter Verstoß gegen datenschutzrechtliche Bestimmungen verarbeitet werden (vgl. auch Art. 77 + DSGVO). +

-

Darüber hinaus ist der Anbieter dazu verpflichtet, alle Empfänger, denen gegenüber Daten durch den Anbieter - offengelegt worden sind, über jedwede Berichtigung oder Löschung von Daten oder die Einschränkung der Verarbeitung, - die aufgrund der Artikel 16, 17 Abs. 1, 18 DSGVO erfolgt, zu unterrichten. Diese Verpflichtung besteht jedoch nicht, - soweit diese Mitteilung unmöglich oder mit einem unverhältnismäßigen Aufwand verbunden ist. Unbeschadet dessen hat - der Nutzer ein Recht auf Auskunft über diese Empfänger.

+

Darüber hinaus ist der Anbieter dazu verpflichtet, alle Empfänger, denen gegenüber Daten durch den Anbieter + offengelegt worden sind, über jedwede Berichtigung oder Löschung von Daten oder die Einschränkung der + Verarbeitung, + die aufgrund der Artikel 16, 17 Abs. 1, 18 DSGVO erfolgt, zu unterrichten. Diese Verpflichtung besteht jedoch + nicht, + soweit diese Mitteilung unmöglich oder mit einem unverhältnismäßigen Aufwand verbunden ist. Unbeschadet dessen + hat + der Nutzer ein Recht auf Auskunft über diese Empfänger.

-

Ebenfalls hast du als Nutzer und Betroffenen nach Art. 21 DSGVO das Recht auf Widerspruch gegen die künftige - Verarbeitung der dich betreffenden Daten, sofern die Daten durch den Anbieter nach Maßgabe von Art. 6 Abs. 1 lit. f) - DSGVO verarbeitet werden. Insbesondere ist ein Widerspruch gegen die Datenverarbeitung zum Zwecke der Direktwerbung - statthaft.

+

Ebenfalls hast du als Nutzer und Betroffenen nach Art. 21 DSGVO das Recht auf Widerspruch gegen die künftige + Verarbeitung der dich betreffenden Daten, sofern die Daten durch den Anbieter nach Maßgabe von Art. 6 Abs. 1 + lit. f) + DSGVO verarbeitet werden. Insbesondere ist ein Widerspruch gegen die Datenverarbeitung zum Zwecke der + Direktwerbung + statthaft.

-

Du hast gemäß denVorschriften der Datenschutzgrundverordnung (DSGVO) ein Auskunftsrecht über die zu deiner Person - gespeicherten Daten, einen Berichtigungsanspruch sowie – bei Vorliegen der rechtlichen Voraussetzungen – einen - Anspruch auf Einschränkung der Verarbeitung und Löschung.

+

Du hast gemäß denVorschriften der Datenschutzgrundverordnung (DSGVO) ein Auskunftsrecht über die zu deiner Person + gespeicherten Daten, einen Berichtigungsanspruch sowie – bei Vorliegen der rechtlichen Voraussetzungen – einen + Anspruch auf Einschränkung der Verarbeitung und Löschung.

-

Eine Auskunft / Löschung kann entweder in den entsprechenden Diensten über die persönlichen Einstellungen angefordert - werden oder per E-Mail Kontakt erfragt werden.

+

Eine Auskunft / Löschung kann entweder in den entsprechenden Diensten über die persönlichen Einstellungen + angefordert + werden oder per E-Mail Kontakt erfragt werden.

-

III. Informationen zur Datenverarbeitung

+

III. Informationen zur Datenverarbeitung

-

Deine bei Nutzung des Internetauftritts verarbeiteten Daten werden gelöscht oder gesperrt, sobald der Zweck der - Speicherung entfällt, der Löschung der Daten keine gesetzlichen Aufbewahrungspflichten entgegenstehen und - nachfolgend keine anderslautenden Angaben zu einzelnen Verarbeitungsverfahren gemacht werden.

+

Deine bei Nutzung des Internetauftritts verarbeiteten Daten werden gelöscht oder gesperrt, sobald der Zweck der + Speicherung entfällt, der Löschung der Daten keine gesetzlichen Aufbewahrungspflichten entgegenstehen und + nachfolgend keine anderslautenden Angaben zu einzelnen Verarbeitungsverfahren gemacht werden.

-

Serverdaten

+

Serverdaten

-

Aus technischen Gründen, werden Daten durch deinen Internet-Browser an den Server übermittelt. Soweit technisch - möglich, werden Daten wie u.a. Typ und Version deines Internetbrowsers, das Betriebssystem, die Website, von der aus - du auf unseren Internetauftritt gewechselt hast (Referrer URL), die Website(s) des Internetauftritts, die du - besuchst, Datum und Uhrzeit des jeweiligen Zugriffs sowie die IP-Adresse des Internetanschlusses, von dem aus die - Nutzung unseres Internetauftritts erfolgt, nicht(!) erhoben.

+

Aus technischen Gründen, werden Daten durch deinen Internet-Browser an den Server übermittelt. Soweit technisch + möglich, werden Daten wie u.a. Typ und Version deines Internetbrowsers, das Betriebssystem, die Website, von der + aus + du auf unseren Internetauftritt gewechselt hast (Referrer URL), die Website(s) des Internetauftritts, die du + besuchst, Datum und Uhrzeit des jeweiligen Zugriffs sowie die IP-Adresse des Internetanschlusses, von dem aus + die + Nutzung unseres Internetauftritts erfolgt, nicht(!) erhoben.

-

Da unser Interesse im Schutz dieser personenbezogenen Daten liegt, werden diese Daten generell nicht erhoben. Zur - Verbesserung, Stabilität, Funktionalität und Sicherheit unseres Internetauftritts ist jedoch eine temporäre - Erhebung möglich. Diese Speicherung erfolgt auf der Rechtsgrundlage von Art. 6 Abs. 1 lit. f) DSGVO.

+

Da unser Interesse im Schutz dieser personenbezogenen Daten liegt, werden diese Daten generell nicht erhoben. Zur + Verbesserung, Stabilität, Funktionalität und Sicherheit unseres Internetauftritts ist jedoch eine temporäre + Erhebung möglich. Diese Speicherung erfolgt auf der Rechtsgrundlage von Art. 6 Abs. 1 lit. f) DSGVO.

-

Sollten diese so erhobenen Daten vorübergehend in sog. Server-Log-Files gespeichert werden, geschieht dies jedoch - nicht gemeinsam mit anderen Daten von dir.

+

Sollten diese so erhobenen Daten vorübergehend in sog. Server-Log-Files gespeichert werden, geschieht dies jedoch + nicht gemeinsam mit anderen Daten von dir.

-

Die Daten werden spätestens nach 14 Tagen wieder gelöscht.

+

Die Daten werden spätestens nach 14 Tagen wieder gelöscht.

-

Kontaktanfragen / Kontaktmöglichkeit

+

Kontaktanfragen / Kontaktmöglichkeit

-

Sofern Du per Kontaktformular oder E-Mail mit uns in Kontakt trittst, werden die dabei von dir angegebenen Daten - zur Bearbeitung deiner Anfrage genutzt. Die Angabe der Daten ist zur Bearbeitung und Beantwortung deiner Anfrage - erforderlich - ohne deren Bereitstellung können wir deine Anfrage nicht oder allenfalls eingeschränkt beantworten. -

+

Sofern Du per Kontaktformular oder E-Mail mit uns in Kontakt trittst, werden die dabei von dir angegebenen Daten + zur Bearbeitung deiner Anfrage genutzt. Die Angabe der Daten ist zur Bearbeitung und Beantwortung deiner Anfrage + erforderlich - ohne deren Bereitstellung können wir deine Anfrage nicht oder allenfalls eingeschränkt + beantworten. +

-

Rechtsgrundlage für die Verarbeitung dieser Daten ist Art. 6 Abs. 1 lit. b) DSGVO.

+

Rechtsgrundlage für die Verarbeitung dieser Daten ist Art. 6 Abs. 1 lit. b) DSGVO.

-

Deine Daten werden gelöscht, sofern deine Anfrage abschließend beantwortet worden ist und der Löschung keine - gesetzlichen Aufbewahrungspflichten entgegenstehen, wie bspw. bei einer sich etwaig anschließenden - Vertragsabwicklung.

+

Deine Daten werden gelöscht, sofern deine Anfrage abschließend beantwortet worden ist und der Löschung keine + gesetzlichen Aufbewahrungspflichten entgegenstehen, wie bspw. bei einer sich etwaig anschließenden + Vertragsabwicklung.

-

Nutzung des Dienstes Pretix

+

Nutzung des Dienstes Pretix

-
Gespeicherte Daten
+
Gespeicherte Daten
-

Die folgenden Daten werden durch den Dienst Pretix erfasst und gespeichert: -

+

Die folgenden Daten werden durch den Dienst Pretix erfasst und gespeichert: +

- - - - - - - - - - - - - - - - - - - - - - - - - -
BezeichnungBetroffene Benutzer / SpeicherfristVerwendungszweck / Weitergabe an Dritte
- Cookies -

Zufällig generierte IDs, technisch bedingte Parameter

-
-

alle Besucher der Seite / Sitzungsende (Beenden des Browsers)

-
-

Wiedererkennung des Benutzers während der Nutzung der Anwendung

-

keine Weitergabe an Dritte

-
- Rechnungsdaten / Mitgliedsdaten -

E-Mail Adresse, Name, Anschrift (freiwillig: Kommentar, Referenz)

-
-

Benutzer mit getätigter Bestellung / bis zur Löschung

-
-

Durchführung der Bestellung, interne Auflistung der Vereinsmitglieder, Archivierung für Steuerprüfung -

-

keine Weitergabe an Dritte

-
- Bestelldaten -

Datum, Status, Menge sowie Art der Bestellung

-
-

Benutzer mit getätigter Bestellung / bis zur Löschung

-
-

Durchführung der Bestellung, automatische Erinnerung für Mitglieder

-

Keine Weitergabe an Dritte

-
+ + + + + + + + + + + + + + + + + + + + + + + + + +
BezeichnungBetroffene Benutzer / SpeicherfristVerwendungszweck / Weitergabe an Dritte
+ Cookies +

Zufällig generierte IDs, technisch bedingte Parameter

+
+

alle Besucher der Seite / Sitzungsende (Beenden des Browsers)

+
+

Wiedererkennung des Benutzers während der Nutzung der Anwendung

+

keine Weitergabe an Dritte

+
+ Rechnungsdaten / Mitgliedsdaten +

E-Mail Adresse, Name, Anschrift (freiwillig: Kommentar, Referenz)

+
+

Benutzer mit getätigter Bestellung / bis zur Löschung

+
+

Durchführung der Bestellung, interne Auflistung der Vereinsmitglieder, Archivierung für + Steuerprüfung +

+

keine Weitergabe an Dritte

+
+ Bestelldaten +

Datum, Status, Menge sowie Art der Bestellung

+
+

Benutzer mit getätigter Bestellung / bis zur Löschung

+
+

Durchführung der Bestellung, automatische Erinnerung für Mitglieder

+

Keine Weitergabe an Dritte

+
-

Nutzung des Dienstes we.bstly

+

Nutzung des Dienstes we.bstly

-
Gespeicherte Daten
+
Gespeicherte Daten
-

Die folgenden Daten werden durch den Dienst we.bstly erfasst und gespeichert: -

+

Die folgenden Daten werden durch den Dienst we.bstly erfasst und gespeichert: +

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
BezeichnungBetroffene Benutzer / SpeicherfristVerwendungszweck / Weitergabe an Dritte
- Cookies -

Zufällig generierte IDs, technisch bedingte Parameter

-
-

alle Besucher der Seite / Sitzungsende (Beenden des Browsers)

-

Benutzer der „automatischen Anmeldung“ / bis zur aktiven Beendigung der Sitzung

-
-

Wiedererkennung des Benutzers während der Nutzung der Anwendung

-

Wiedererkennung des Benutzers bei „automatischer Anmeldung“

-

keine Weitergabe an Dritte

-
- Account-Daten -

Benutzername, öffentlicher PGP Schlüssel (freiwillig: E-Mail Adresse)

-
-

Benutzer mit Account / bis zur Löschung

-
-

Identifizierung für Login, Nutzung weiterer Diensten

-

keine Weitergabe an Dritte

-
-

Passwort

-
-

Keine permanente Speicherung, direkte Weitergabe an Authentifizierungsserver

-
-

Authentifizierung (Login)

-

Keine Weitergabe an Dritte

-
- Einstellungen / Eigenschaften -

Berechtigungen und Quotas (freiwillig: Parameter Zweifaktor Authentifizierung)

-
-

Benutzer mit Account / siehe Account-Daten

-
-

Nutzung weiterer Diensten, Steuerung des Login Prozesses

-

Keine Weitergabe an Dritte

-
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BezeichnungBetroffene Benutzer / SpeicherfristVerwendungszweck / Weitergabe an Dritte
+ Cookies +

Zufällig generierte IDs, technisch bedingte Parameter

+
+

alle Besucher der Seite / Sitzungsende (Beenden des Browsers)

+

Benutzer der „automatischen Anmeldung“ / bis zur aktiven Beendigung der Sitzung

+
+

Wiedererkennung des Benutzers während der Nutzung der Anwendung

+

Wiedererkennung des Benutzers bei „automatischer Anmeldung“

+

keine Weitergabe an Dritte

+
+ Account-Daten +

Benutzername, öffentlicher PGP Schlüssel (freiwillig: E-Mail Adresse), Profildaten (freiwillig) +

+
+

Benutzer mit Account / bis zur Löschung

+
+

Identifizierung für Login, Nutzung weiterer Diensten

+

Weitergabe nur durch aktive Einstellung, ansonsten keine Weitergabe an Dritte

+
+

Passwort

+
+

Keine permanente Speicherung, direkte Weitergabe an Authentifizierungsserver

+
+

Authentifizierung (Login)

+

Keine Weitergabe an Dritte

+
+ Einstellungen / Eigenschaften +

Berechtigungen und Quotas (freiwillig: Parameter Zweifaktor Authentifizierung)

+
+

Benutzer mit Account / siehe Account-Daten

+
+

Nutzung weiterer Diensten, Steuerung des Login Prozesses

+

Keine Weitergabe an Dritte

+
-

Nutzung des Dienstes Nextcloud

+

Nutzung des Dienstes Nextcloud

-
Gespeicherte Daten
+
Gespeicherte Daten
-

Die folgenden Daten werden durch den Dienst Nextcloud erfasst und gespeichert: -

+

Die folgenden Daten werden durch den Dienst Nextcloud erfasst und gespeichert: +

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
BezeichnungBetroffene Benutzer / SpeicherfristVerwendungszweck / Weitergabe an Dritte
- Cookies -

Zufällig generierte IDs, technisch bedingte Parameter

-
-

alle Besucher der Seite / Sitzungsende (Beenden des Browsers)

-

Benutzer der „automatischen Anmeldung“ / 16 Tage nach letzter Nutzung

-
-

Wiedererkennung des Benutzers während der Nutzung der Anwendung

-

Wiedererkennung des Benutzers bei „automatischer Anmeldung“

-

keine Weitergabe an Dritte

-
- Account-Daten -

Benutzername (freiwillig: E-Mail Adresse)

-
-

Benutzer mit Account / bis zur Löschung

-
-

Suche nach Benutzern beim Teilen von Inhalten, Senden von Benachrichtigungen

-

Weitergabe an alle Nutzer

-
- Einstellungen/ Eigenschaften -

Zeitstempel letztes Login, Speicherplatzkontingent, Speicherplatzkauf / Laufzeit, Sprache, - vorgenommene persönliche Einstellungen

-
-

Benutzer mit Account / siehe Account-Daten

-
-

Erkennung inaktiver Benutzer, Speicherplatzzuweisung, persönliche Anpassung der Oberfläche, - Benachrichtigungen, etc.

-

Keine Weitergabe an Dritte

-
- Aktivitäten -

Auflistung der im System durchgeführten Aktionen, z.B. Upload von Dateien

-
-

Benutzer mit Account / 14 Tage

-
-

Nachvollziehbarkeit von Änderungen

-

Weitergabe individuell vom Nutzer einstellbar

-
- strukturierte Daten -

Daten, welche von Apps in der Datenbank abgelegt werden

-
-

Benutzer mit Account / maximale Speicherfrist siehe Account-Daten, ansonsten abhängig von der - jeweiligen App

-
-

Nutzung der jeweiligen Apps

-

Weitergabe von in Apps erfassten Daten individuell vom Nutzer einstellbar

-
- Dateien -

Dateien, welche mit der „Dateien“-Anwendung oder externen Clients abgelegt werden

-
-

Benutzer mit Account / siehe Account-Daten

-
-

Nutzung der „Dateien“-App oder Clients für verschiedene Plattformen zur Dateisynchronisierung, Teilen - von Dateien mit Dritten

-

Weitergabe von Dateien individuell vom Nutzer einstellbar

-
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BezeichnungBetroffene Benutzer / SpeicherfristVerwendungszweck / Weitergabe an Dritte
+ Cookies +

Zufällig generierte IDs, technisch bedingte Parameter

+
+

alle Besucher der Seite / Sitzungsende (Beenden des Browsers)

+

Benutzer der „automatischen Anmeldung“ / 16 Tage nach letzter Nutzung

+
+

Wiedererkennung des Benutzers während der Nutzung der Anwendung

+

Wiedererkennung des Benutzers bei „automatischer Anmeldung“

+

keine Weitergabe an Dritte

+
+ Account-Daten +

Benutzername (freiwillig: E-Mail Adresse)

+
+

Benutzer mit Account / bis zur Löschung

+
+

Suche nach Benutzern beim Teilen von Inhalten, Senden von Benachrichtigungen

+

Weitergabe an alle Nutzer

+
+ Einstellungen/ Eigenschaften +

Zeitstempel letztes Login, Speicherplatzkontingent, Speicherplatzkauf / Laufzeit, Sprache, + vorgenommene persönliche Einstellungen

+
+

Benutzer mit Account / siehe Account-Daten

+
+

Erkennung inaktiver Benutzer, Speicherplatzzuweisung, persönliche Anpassung der Oberfläche, + Benachrichtigungen, etc.

+

Keine Weitergabe an Dritte

+
+ Aktivitäten +

Auflistung der im System durchgeführten Aktionen, z.B. Upload von Dateien

+
+

Benutzer mit Account / 14 Tage

+
+

Nachvollziehbarkeit von Änderungen

+

Weitergabe individuell vom Nutzer einstellbar

+
+ strukturierte Daten +

Daten, welche von Apps in der Datenbank abgelegt werden

+
+

Benutzer mit Account / maximale Speicherfrist siehe Account-Daten, ansonsten abhängig von der + jeweiligen App

+
+

Nutzung der jeweiligen Apps

+

Weitergabe von in Apps erfassten Daten individuell vom Nutzer einstellbar

+
+ Dateien +

Dateien, welche mit der „Dateien“-Anwendung oder externen Clients abgelegt werden

+
+

Benutzer mit Account / siehe Account-Daten

+
+

Nutzung der „Dateien“-App oder Clients für verschiedene Plattformen zur Dateisynchronisierung, + Teilen + von Dateien mit Dritten

+

Weitergabe von Dateien individuell vom Nutzer einstellbar

+
-

Nutzung des Dienstes E-Mail Postfach

+

Nutzung des Dienstes E-Mail Postfach

+
Gespeicherte Daten
-
Gespeicherte Daten
+

Die folgenden Daten werden durch den Dienst E-Mail Postfach erfasst und gespeichert: +

-

Die folgenden Daten werden durch den Dienst E-Mail Postfach erfasst und gespeichert: -

+ + + + + + + + + + + + + + + +
BezeichnungBetroffene Benutzer / SpeicherfristVerwendungszweck / Weitergabe an Dritte
+ E-Mails +

Empfangene und gesendete E-Mails

+
+

Benutzer mit E-Mail Postfach / bis zur Löschung

+
+

Speicherung der E-Mails zur Abfrage

+

Jeweilige Sender & Empfänger der E-Mail

+
- - - - - - - - - - - - - - - -
BezeichnungBetroffene Benutzer / SpeicherfristVerwendungszweck / Weitergabe an Dritte
- E-Mails -

Empfangene und gesendete E-Mails

-
-

Benutzer mit E-Mail Postfach / bis zur Löschung

-
-

Speicherung der E-Mails zur Abfrage

-

Jeweilige Sender & Empfänger der E-Mail

-
+

Nutzung des Dienstes Workadventure

-

Sicherheit

+
Gespeicherte Daten
-

Sämtliche Daten werden verschlüsselt übertragen. Die Nutzung einer unverschlüsselten Verbindung zum Server ist - technisch ausgeschlossen.

+

Im Dienst Workadventure können weitere Dienste eingebunden sein, wie z.B. Jitsi Meet. Außerdem können externe + Webseiten geöffnet werden, es werden allerdings keine erfassten Daten an diese Webseiten weitergegeben!

-

Zusätzliche Sicherheitsfunktionen, wie 2-Faktor-Authentifizierung und anwendungsspezifische Logins werden unterstützt - und können in den Einstellungen aktiviert werden.

+

Die folgenden Daten werden durch den Dienst Workadventure erfasst: +

-

Rechenzentrum

+ + + + + + + + + + + + + + + + + + + + + + + + + +
BezeichnungBetroffene Benutzer / SpeicherfristVerwendungszweck / Weitergabe an Dritte
+ Username +

Gesetzter Username

+
+

Benutzer mit gültiger Session / bis zur Beendigung der Session

+
+

Identifizierung des Avatars

+

Andere Benutzer mit gültiger Session

+
+ Audiodaten +

(optional) Audiodaten des freigegebenen Mikrofons

+
+

Benutzer mit freigegebenen Mikrofon / WICHTIG: die Daten werden nicht an den Server übertragen + sondern direkt an die anderen Benutzer in der Nähe gesendet!

+
+

Direkte Gespräche mit anderen Benutzern

+

Andere Benutzer in direkter Nähe zum Avatar

+
+ Videodaten +

(optional) Videodaten der freigegebenen Kamera

+
+

Benutzer mit freigegebener Kamera / WICHTIG: die Daten werden nicht an den Server übertragen + sondern + direkt an die anderen Benutzer in der Nähe gesendet!

+
+

Direkte Gespräche mit anderen Benutzern

+

Andere Benutzer in direkter Nähe zum Avatar

+
-

Die Daten werden im Rechenzentrum der netcup GmbH gespeichert. Eine regelmäßige, automatisierte Datensicherung der Bestandsdaten wird durchgeführt. -

\ No newline at end of file +

Nutzung des Dienstes Jitsi Meet

+ +
Gespeicherte Daten
+ +

Die folgenden Daten werden durch den Dienst Jitsi Meet erfasst: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
BezeichnungBetroffene Benutzer / SpeicherfristVerwendungszweck / Weitergabe an Dritte
+ Benutzername +

Gesetzter Benutzername

+
+

Benutzer mit gültiger Session / bis zur Beendigung der Session

+
+

Anzeige des Benutzernamen an andere Benutzer

+

Andere Benutzer im Konferenzraum

+
+ Konferenzraum-Id +

Id des beigetretenen Konferenzraums

+
+

Benutzer mit gültiger Session / bis zur Beendigung der Session

+
+

Zuweisung des Users zum Konferenzraum

+

/

+
+ Audiodaten +

(optional) Audiodaten des freigegebenen Mikrofons

+
+

Benutzer mit freigegebenen Mikrofon / Keine permanente Speicherung

+
+

Gespräche mit anderen Benutzern im Konferenzraum

+

Andere Benutzer im Konferenzraum

+
+ Videodaten +

(optional) Videodaten der freigegebenen Kamera

+
+

Benutzer mit freigegebener Kamera / Keine permanente Speicherung

+
+

Gespräche mit anderen Benutzern im Konferenzraum

+

Andere Benutzer im Konferenzraum

+
+ Textnachrichten +

(optional) Textnachrichten die der Benutzer in den Chat sendet

+
+

Benutzer, die Chat-Nachrichten schreiben / Keine permanente Speicherung

+
+

Textnachrichten an andere Benutzern im Konferenzraum

+

Andere Benutzer im Konferenzraum

+
+ +

Sicherheit

+ +

Sämtliche Daten werden verschlüsselt übertragen. Die Nutzung einer unverschlüsselten Verbindung zum Server ist + technisch ausgeschlossen.

+ +

Zusätzliche Sicherheitsfunktionen, wie 2-Faktor-Authentifizierung und anwendungsspezifische Logins werden + unterstützt + und können in den Einstellungen aktiviert werden.

+ +

Rechenzentrum

+ +

Die Daten werden im Rechenzentrum der netcup GmbH gespeichert. Eine regelmäßige, automatisierte Datensicherung der + Bestandsdaten + wird durchgeführt. +

+ + + + \ No newline at end of file diff --git a/src/assets/templates/de-informal/services/active/nextcloud.html b/src/assets/templates/de-informal/services/active/nextcloud.html index e64d6b3..5288941 100644 --- a/src/assets/templates/de-informal/services/active/nextcloud.html +++ b/src/assets/templates/de-informal/services/active/nextcloud.html @@ -3,5 +3,5 @@ Daten in der Nextcloud sind generell verschlüsselt, für volle Sicherheit deiner Dateien kannst du allerdings auch die Ende-zu-Ende-Verschlüsselung der Nextcloud nutzen.

-

Über Nextcloud werden wir euch auch mit allen wichtigen Informationen über "Bastelei (bald e.V.)" informieren. +

Über Nextcloud werden wir euch auch mit allen wichtigen Informationen über "Bastelei e. V." informieren. Des weiteren bietet Nextcloud auch einige Community-Funktionen, die wir gerne mit euch nutzen möchten.

\ No newline at end of file diff --git a/src/assets/templates/de-informal/terms-of-service.html b/src/assets/templates/de-informal/terms-of-service.html new file mode 100644 index 0000000..189a770 --- /dev/null +++ b/src/assets/templates/de-informal/terms-of-service.html @@ -0,0 +1,120 @@ +

Nutzungsbedingungen

+ +

Bereitstellung

+

Mit we.bstly stellt der Bastelei e. V. eine Plattform + bereit, um verschiedene digitale Services zeitlich befristet zur Verfügung zu stellen.

+

we.bstly und damit verbundene Services stehen allen Vereinsmitgliedern des Bastelei e. V. sowie allen + NutzerInnen, die die entsprechenden Services direkt gebucht haben, zur Verfügung.

+

Gegenstand der Nutzung ist die Bereitstellung we.bstly und den damit verbundenen Services zur Online-Nutzung über das + Internet und die Übermittlung und Speicherung von Daten und Dateien der NutzerInnen.

+

we.bstly sowie die verschiedenen Services sind einzeln mit ihren Funktionen unter Aktive + Services aufgelistet.

+ + +

Nutzungsrecht

+

Die NutzerInnen haben für die Laufzeit der Nutzung das beschränkte, einfache, nicht übertragbare Recht, + we.bstly und damit verbundene Services über das Internet für eigene Zwecke zu nutzen. Darüberhinausgehende + Rechte bestehen nicht.

+

Die NutzerInnen sind nicht berechtigt, we.bstly und damit verbundene Services Dritten zugänglich zu machen. + Ausgenommen sind explizite Funktionen der einzelnen Services, deren Zweck im Zugang für Dritte liegt.

+ + +

Datensicherheit

+

we.bstly und damit verbundene Services haben Sicherheitsmerkmale implementiert, die Schutz vor Verlust, Missbrauch + und Manipulation der Daten und Dateien bieten. Dennoch kann ein 100% Schutz nicht gewährleistet werden (siehe Verfügbarkeit und Leistungsstörungen).

+ +

Die NutzerInnen sind für die Daten und Dateien, die sie in we.bstly und damit verbundenen Services ablegen, + verantwortlich. Alle Daten und Dateien in we.bstly und damit verbundenen Services sind aus dem Internet erreichbar + und durch Passwort und Benutzerkennung geschützt. Auch bei starken Passwörtern können diese von Angreifern + ausgespäht werden. Deswegen müssen die NutzerInnen ihre Verbindungskennung (z. B. Login-Namen und Passwörter) geheim + halten, vor dem Zugriff durch Unberechtigte schützen und den ordnungsgemäßen Gebrauch sicherstellen. Die NutzerInnen + müssen den + Bastelei e. V. unverzüglich informieren, sobald sie Kenntnis davon erlangen, dass unbefugten Dritten + ihr Passwort bekannt ist bzw. Ihnen eine Verletzung der Datensicherheit bekannt wird oder von ihnen eine solche + vermutet wird.

+ + +

Schutz des Rechenzentrums

+

Die NutzerInnen dürfen keine Daten und Dateien speichern oder versenden, die nach ihrer Art oder + Beschaffenheit geeignet sind, den Bestand oder den Betrieb des Rechenzentrums oder des Datennetzes zu gefährden.

+

Die NutzerInnen müssen jedweden Versuch unterlassen, selbst oder durch Dritte Informationen oder Daten und + Dateien unbefugt abzurufen oder in die software- und hardwaretechnischen Systeme einzugreifen oder eingreifen zu + lassen oder in die Datennetze unbefugt einzudringen.

+

Ebenfalls untersagt ist jede Handlung, die geeignet ist, den ordnungsgemäßen Betrieb we.bstly und damit verbundenen + Services zu beeinträchtigen.

+ + +

Verfügbarkeit und Leistungsstörungen

+

we.bstly sowie einzelne Services können nicht bereitgestellt werden bei

+
    +
  • Wartungsarbeiten zur Sicherstellung und Sicherung des Betriebs (diese werden zeitnah angekündigt)
  • +
  • Faktoren, die außerhalb der Kontrolle des Bastelei e. V. liegen (z. B. Naturkatastrophen, Kriege, + Terroranschläge, Aufstände oder staatliche Maßnahmen)
  • +
  • gravierenden Störungen des Betriebs, die durch Services, Hardware oder Software der NutzerInnen oder von Dritten + verursacht wurden.
  • +
+

Ansprüche der NutzerInnen gegenüber dem Bastelei e. V. bestehen in diesen Fällen nicht. +

+ +

Verfügbarkeit und Haftung

+

we.bstly und damit verbundene Services werden dem Nutzer ohne Gewährleistung zur Verfügung gestellt. Der Bastelei + (bald e. V.) übernimmt bezüglich der Inhalte keine Gewähr und leistet keine Zusicherungen hinsichtlich + Eigenschaften. Der Bastelei e. V. übernimmt zudem keine Garantie hinsichtlich der Richtigkeit und Aktualität + der zur Verfügung gestellten Inhalte.

+ +

Der Bastelei e. V. haftet nicht für Schäden, die durch die Nutzung entstehen, es sei denn, die betreffenden + Schäden sind auf vorsätzliches Fehlverhalten, grobe Fahrlässigkeit oder die Verletzung von Pflichten nach dem + Produkthaftungsgesetz zurückzuführen.

+ + +

Verbot und Haftung bei Daten und Dateien mit rechtswidrigen Inhalten

+

In we.bstly und damit verbundenen Services dürfen die NutzerInnen keine Daten und Dateien in rechtswidriger Weise + oder mit rechtswidrigem Inhalt übermitteln (unter anderem sind die nationalen und internationalen Schutzrechte, + insbesondere Marken- und Urheberrechte sowie die Datenschutzbestimmungen zu beachten). Geltendes Recht und die + Rechte Dritter + sind zu beachten. Des weiteren nicht erlaubt ist außerdem das Verbreiten von Inhalten, die +

    +
  • Rassismus
  • +
  • Gewaltverherrlichung und Extremismus irgendwelcher Art
  • +
  • Aufrufe und Anstiftung zu Straftaten und Gesetzesverstößen, Drohungen gegen Leib, Leben oder Eigentum
  • +
  • Hetzen gegen Personen oder Unternehmen
  • +
  • persönlichkeitsverletzende Äußerungen, Verleumdung, Ehrverletzung und üble Nachrede von Nutzern und Dritten + sowie Verstöße gegen das Lauterkeitsrecht
  • +
  • urheberrechtsverletzende Inhalte oder andere Verletzungen von Immaterialgüterrechten
  • +
  • sexuelle Belästigung von Nutzerinnen und Nutzern und Dritten
  • +
+darstellen, betreffen oder beinhalten. +

+

Insbesondere bei Verdacht auf einen Gesetzesverstoß, bei einem Gesetzesverstoß oder bei einem schwerwiegenden Verstoß + gegen diese Nutzungsbedingungen oder gegen Rechte Dritter behält sich der Bastelei e. V. vor, das Einstellen + von Daten und Dateien abzulehnen und/oder bereits eingestellte Daten und Dateien ohne vorherige Ankündigung zu + sperren oder zu + löschen.

+ + +

Verstöße gegen die Nutzungsbedingungen und Sperrung des Nutzeraccounts

+

Bei Missachtung der Nutzungsbedingungen oder Missachtung der gesetzesmäßigen Nutzung können NutzerInnen jederzeit + ohne Angabe von Gründen gesperrt oder gelöscht werden.

+ +

Datenschutz

+

Personenbezogene Daten werden ausschließlich zur Bereitstellung von we.bstly und damit verbundenen Services + verarbeitet. Die Details dazu sind in der Datenschutzerklärung zu finden. +

+ + +

Ablauf des Nutzerkontos und Datenlöschung

+

Nach Ablauf des Nutzerkontos wird den NutzerInnen eine Frist von 4 Wochen gewährt das Nutzerkonto zu erneuern. Nach + Ablauf dieser Frist werden alle Daten, denen keine gesetzlichen Aufbewahrungspflichten entgegenstehen, + unwiderruflich gelöscht.

+ + +

Freistellungsanspruch

+

Die NutzerInnen stellen den Betreibern für den Fall der Inanspruchnahme wegen + vermeintlicher oder tatsächlicher Rechtsverletzung und/oder Verletzung von Rechten Dritter im Zusammenhang mit der + Nutzung von we.bstly sowie den damit verbundenen Services vorgenommenen Handlungen von sämtlichen sich daraus + ergebenen Ansprüchen Dritter frei. Darüber hinaus verpflichten sich die NutzerInnen, alle Kosten zu ersetzen, die + dem Betreiber durch die Inanspruchnahme durch Dritte entstehen. Zu den erstattungsfähigen Kosten zählen auch die + Kosten einer angemessenen Rechtsverteidigung.

+ +

Auf den vorliegenden Vertrag ist ausschließlich deutsches Recht anwendbar.

\ No newline at end of file diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 805c0c2..bb5e44b 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -1,4 +1,4 @@ export const environment = { production: true, - apiUrl : 'https://api.bstly.de' + apiUrl : 'https://api.mig.bstly.de' }; diff --git a/src/styles.scss b/src/styles.scss index ac859c4..2dec352 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -177,3 +177,15 @@ mat-sidenav-container { width: 1000px; } } + +.text-center { + text-align: center; +} + +.text-justify { + text-align: justify; +} + +.text-right { + text-align: right; +}