More dynamic Motion-Detail metainfo
* Adjust login page * Rework legal notice and pp * Add more custom animations * Add Router to navigation panel
This commit is contained in:
parent
54cc737ede
commit
fa106a46c9
@ -1,10 +1,12 @@
|
|||||||
import { trigger, animate, transition, style, query, stagger, group, state } from '@angular/animations';
|
import { trigger, animate, transition, style, query, stagger, group, state, sequence } from '@angular/animations';
|
||||||
|
|
||||||
export const pageTransition = trigger('pageTransition', [
|
export const pageTransition = trigger('pageTransition', [
|
||||||
transition('* => *', [
|
transition('* => *', [
|
||||||
/** keep the dom clean - let all items "just" enter */
|
/** keep the dom clean - let all items "just" enter */
|
||||||
query(':enter mat-card', [style({ opacity: 0 })], { optional: true }),
|
query(':enter mat-card', [style({ opacity: 0 })], { optional: true }),
|
||||||
query(':enter .on-transition-fade', [style({ opacity: 0 })], { optional: true }),
|
query(':enter .on-transition-fade', [style({ opacity: 0 })], { optional: true }),
|
||||||
|
query(':enter mat-row', [style({ opacity: 0 })], { optional: true }),
|
||||||
|
query(':enter mat-expansion-panel', [style({ opacity: 0 })], { optional: true }),
|
||||||
|
|
||||||
/** parallel vanishing */
|
/** parallel vanishing */
|
||||||
group([
|
group([
|
||||||
@ -15,6 +17,12 @@ export const pageTransition = trigger('pageTransition', [
|
|||||||
/** how the material cards are leaving */
|
/** how the material cards are leaving */
|
||||||
query(':leave mat-card', [style({ opacity: 1 }), animate('0.2s', style({ opacity: 0 }))], {
|
query(':leave mat-card', [style({ opacity: 1 }), animate('0.2s', style({ opacity: 0 }))], {
|
||||||
optional: true
|
optional: true
|
||||||
|
}),
|
||||||
|
query(':leave mat-row', [style({ opacity: 1 }), animate('0.2s', style({ opacity: 0 }))], {
|
||||||
|
optional: true
|
||||||
|
}),
|
||||||
|
query(':leave mat-expansion-panel', [style({ opacity: 1 }), animate('0.2s', style({ opacity: 0 }))], {
|
||||||
|
optional: true
|
||||||
})
|
})
|
||||||
]),
|
]),
|
||||||
|
|
||||||
@ -33,6 +41,24 @@ export const pageTransition = trigger('pageTransition', [
|
|||||||
animate('300ms ease-in-out', style({ transform: 'translateY(0px)', opacity: 1 }))
|
animate('300ms ease-in-out', style({ transform: 'translateY(0px)', opacity: 1 }))
|
||||||
]),
|
]),
|
||||||
{ optional: true }
|
{ optional: true }
|
||||||
|
),
|
||||||
|
query(
|
||||||
|
':enter mat-row',
|
||||||
|
/** stagger = "one after another" with a distance of 50ms" */
|
||||||
|
stagger(30, [
|
||||||
|
style({ transform: 'translateY(24px)' }),
|
||||||
|
animate('200ms ease-in-out', style({ transform: 'translateY(0px)', opacity: 1 }))
|
||||||
|
]),
|
||||||
|
{ optional: true }
|
||||||
|
),
|
||||||
|
query(
|
||||||
|
':enter mat-expansion-panel',
|
||||||
|
/** stagger = "one after another" with a distance of 50ms" */
|
||||||
|
stagger(100, [
|
||||||
|
style({ transform: 'translateY(50px)' }),
|
||||||
|
animate('300ms ease-in-out', style({ transform: 'translateY(0px)', opacity: 1 }))
|
||||||
|
]),
|
||||||
|
{ optional: true }
|
||||||
)
|
)
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
<h2 mat-dialog-title>Impressum</h2>
|
|
||||||
<mat-dialog-content>
|
|
||||||
OpenSlides ist ein freies, webbasiertes Präsentations- und Versammlungssystem zur Darstellung und Steuerung von Tagesordnung,
|
|
||||||
Anträgen und Wahlen einer Versammlung.
|
|
||||||
</mat-dialog-content>
|
|
||||||
<br>
|
|
||||||
<mat-dialog-content>
|
|
||||||
OpenSlides 3.0 PRE ALPHA (Lizenz: MIT)
|
|
||||||
</mat-dialog-content>
|
|
@ -1,15 +0,0 @@
|
|||||||
import { Component } from '@angular/core';
|
|
||||||
import { MatDialogRef } from '@angular/material';
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'app-impressum',
|
|
||||||
templateUrl: './legal-notice.dialog.component.html',
|
|
||||||
styleUrls: ['./legal-notice.dialog.component.css']
|
|
||||||
})
|
|
||||||
export class LegalnoticeDialogComponent {
|
|
||||||
constructor(public dialogRef: MatDialogRef<LegalnoticeDialogComponent>) {}
|
|
||||||
|
|
||||||
onNoClick(): void {
|
|
||||||
this.dialogRef.close();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,40 +0,0 @@
|
|||||||
<h2 mat-dialog-title>Datenschutzerklärung</h2>
|
|
||||||
<mat-dialog-content>
|
|
||||||
OpenSlides speichert nur so viele personenbezogene Daten wie unbedingt nötig sind, um Besuchern Informationen und Dienste
|
|
||||||
zuverlässig und sicher anbieten zu können.
|
|
||||||
</mat-dialog-content>
|
|
||||||
<br>
|
|
||||||
<mat-dialog-content>
|
|
||||||
Eine Auswertung der Dienste-Protokolle erfolgt nur von uns selbst und auch nur, um mögliche Fehler, Einbruchsversuche oder
|
|
||||||
technisches Verhalten der Server auf unseren Server zu analysieren.
|
|
||||||
</mat-dialog-content>
|
|
||||||
<br>
|
|
||||||
<mat-dialog-content>
|
|
||||||
Nachfolgend wird genau aufgeschlüsselt, bei welcher Gelegenheit welche Daten wie lange gespeichert sind. Zudem wird beschrieben,
|
|
||||||
welche Schritte erforderlich sind um Daten zu löschen.
|
|
||||||
</mat-dialog-content>
|
|
||||||
<br>
|
|
||||||
<h3>Cookies</h3>
|
|
||||||
<mat-dialog-content>
|
|
||||||
Beim Besuch der Website wird ein sogenanntes Cookie angelegt. Dieses Cookie wird ausschließlich dazu verwendet, um auf der
|
|
||||||
Website eingeloggt zu bleiben. Ein sogenanntes "Tracking Cookie" wird nicht verwendet.
|
|
||||||
</mat-dialog-content>
|
|
||||||
<br>
|
|
||||||
<h3>Logfiles</h3>
|
|
||||||
<mat-dialog-content>
|
|
||||||
Zu OpenSlides gehören verschiedene Unter-Services. Diese loggen folgende Informationen: Quell-IP-Adresse, Zeitstempel, genutztes
|
|
||||||
Betriebssystem, verwendeter Web-Browser, Referer-URL, E-Mail-Adresse und besuchte Seite.
|
|
||||||
</mat-dialog-content>
|
|
||||||
<br>
|
|
||||||
<h3>Datenbank</h3>
|
|
||||||
<mat-dialog-content>
|
|
||||||
Als Mitglied werden folgende Daten von Ihnen gespeichert: Titel, Vorname, Nachname, EMail, Gliederungsebene, Teilnehmernummer,
|
|
||||||
Gruppenzugehörigkeit, Initiales Passwort im Klartext, Vergebenes Passwort als kryptografischer Hashwert und ein Kommentar
|
|
||||||
für interne Notizen. Diese Informationen werden mit den Aktionen innerhalb von OpenSlides in Verbindung gebracht. Diese
|
|
||||||
Informationen werden nicht an Dritte weiter gegeben und sind auch nicht für diese zugänglich.
|
|
||||||
</mat-dialog-content>
|
|
||||||
<br>
|
|
||||||
<h3>Löschung von Daten</h3>
|
|
||||||
<mat-dialog-content>
|
|
||||||
Die Daten dieser OpenSlides-Demo-Instanz werden nächtlich automatisch gelöscht.
|
|
||||||
</mat-dialog-content>
|
|
@ -1,15 +0,0 @@
|
|||||||
import { Component } from '@angular/core';
|
|
||||||
import { MatDialogRef } from '@angular/material';
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'app-privacy-policy.dialog',
|
|
||||||
templateUrl: './privacy-policy.dialog.component.html',
|
|
||||||
styleUrls: ['./privacy-policy.dialog.component.css']
|
|
||||||
})
|
|
||||||
export class PrivacyPolicyDialogComponent {
|
|
||||||
constructor(public dialogRef: MatDialogRef<PrivacyPolicyDialogComponent>) {}
|
|
||||||
|
|
||||||
onNoClick(): void {
|
|
||||||
this.dialogRef.close();
|
|
||||||
}
|
|
||||||
}
|
|
@ -154,7 +154,16 @@ export class Motion extends BaseModel {
|
|||||||
const workflowId = +motionsWorkflowConfig.value;
|
const workflowId = +motionsWorkflowConfig.value;
|
||||||
//get the workflow for out motion
|
//get the workflow for out motion
|
||||||
const selectedWorkflow = this.DS.get(Workflow, workflowId) as Workflow;
|
const selectedWorkflow = this.DS.get(Workflow, workflowId) as Workflow;
|
||||||
return selectedWorkflow.getStateNameById(this.state_id);
|
const stateName = selectedWorkflow.getStateNameById(this.state_id);
|
||||||
|
if (stateName !== 'NULL') {
|
||||||
|
return stateName;
|
||||||
|
} else {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
get possibleStates() {
|
||||||
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -32,9 +32,6 @@ import { TranslateModule } from '@ngx-translate/core';
|
|||||||
// directives
|
// directives
|
||||||
import { OsPermsDirective } from './directives/os-perms.directive';
|
import { OsPermsDirective } from './directives/os-perms.directive';
|
||||||
import { DomChangeDirective } from './directives/dom-change.directive';
|
import { DomChangeDirective } from './directives/dom-change.directive';
|
||||||
import { LegalnoticeDialogComponent } from './components/legal-notice/legal-notice.dialog.component';
|
|
||||||
import { PrivacyPolicyDialogComponent } from './components/privacy-policy/privacy-policy.dialog.component';
|
|
||||||
// import { CdkTableModule } from '@angular/cdk/table';
|
|
||||||
|
|
||||||
library.add(fas);
|
library.add(fas);
|
||||||
|
|
||||||
@ -91,7 +88,6 @@ library.add(fas);
|
|||||||
TranslateModule,
|
TranslateModule,
|
||||||
OsPermsDirective
|
OsPermsDirective
|
||||||
],
|
],
|
||||||
declarations: [OsPermsDirective, DomChangeDirective, LegalnoticeDialogComponent, PrivacyPolicyDialogComponent],
|
declarations: [OsPermsDirective, DomChangeDirective]
|
||||||
entryComponents: [LegalnoticeDialogComponent, PrivacyPolicyDialogComponent]
|
|
||||||
})
|
})
|
||||||
export class SharedModule {}
|
export class SharedModule {}
|
||||||
|
16
client/src/app/site/legal-notice/legal-notice.component.html
Normal file
16
client/src/app/site/legal-notice/legal-notice.component.html
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
<mat-toolbar color='primary'>
|
||||||
|
<span class='app-name on-transition-fade' translate>Legal Notice</span>
|
||||||
|
</mat-toolbar>
|
||||||
|
|
||||||
|
<mat-card class="os-card on-transition-fade">
|
||||||
|
<div>
|
||||||
|
<div class='legal-notice-text'>
|
||||||
|
<a href="https://openslides.org/">OpenSlides</a> ist ein freies, webbasiertes Präsentations- und Versammlungssystem zur Darstellung und Steuerung
|
||||||
|
von Tagesordnung, Anträgen und Wahlen einer Versammlung.
|
||||||
|
</div>
|
||||||
|
<mat-divider></mat-divider>
|
||||||
|
<div class='version-text'>
|
||||||
|
OpenSlides 3.0 PRE ALPHA (Lizenz: MIT)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</mat-card>
|
@ -0,0 +1,9 @@
|
|||||||
|
.legal-notice-text {
|
||||||
|
display: block;
|
||||||
|
padding-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.version-text {
|
||||||
|
display: block;
|
||||||
|
padding-top: 20px;
|
||||||
|
}
|
@ -1,19 +1,19 @@
|
|||||||
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
import { LegalnoticeDialogComponent } from './legal-notice.dialog.component';
|
import { LegalNoticeComponent } from './legal-notice.component';
|
||||||
|
|
||||||
describe('LegalnoticeDialogComponent', () => {
|
describe('LegalNoticeComponent', () => {
|
||||||
let component: LegalnoticeDialogComponent;
|
let component: LegalNoticeComponent;
|
||||||
let fixture: ComponentFixture<LegalnoticeDialogComponent>;
|
let fixture: ComponentFixture<LegalNoticeComponent>;
|
||||||
|
|
||||||
beforeEach(async(() => {
|
beforeEach(async(() => {
|
||||||
TestBed.configureTestingModule({
|
TestBed.configureTestingModule({
|
||||||
declarations: [LegalnoticeDialogComponent]
|
declarations: [LegalNoticeComponent]
|
||||||
}).compileComponents();
|
}).compileComponents();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
fixture = TestBed.createComponent(LegalnoticeDialogComponent);
|
fixture = TestBed.createComponent(LegalNoticeComponent);
|
||||||
component = fixture.componentInstance;
|
component = fixture.componentInstance;
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
});
|
});
|
12
client/src/app/site/legal-notice/legal-notice.component.ts
Normal file
12
client/src/app/site/legal-notice/legal-notice.component.ts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import { Component, OnInit } from '@angular/core';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-legal-notice',
|
||||||
|
templateUrl: './legal-notice.component.html',
|
||||||
|
styleUrls: ['./legal-notice.component.scss']
|
||||||
|
})
|
||||||
|
export class LegalNoticeComponent implements OnInit {
|
||||||
|
constructor() {}
|
||||||
|
|
||||||
|
ngOnInit() {}
|
||||||
|
}
|
@ -9,6 +9,7 @@ mat-form-field {
|
|||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
width: 90%;
|
width: 90%;
|
||||||
|
max-width: 400px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -26,8 +27,8 @@ mat-form-field {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.form-wrapper {
|
.form-wrapper {
|
||||||
padding-left: 15px;
|
padding-left: 30px;
|
||||||
padding-right: 15px;
|
padding-right: 30px;
|
||||||
|
|
||||||
mat-spinner {
|
mat-spinner {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@ -41,5 +42,5 @@ mat-form-field {
|
|||||||
.login-form {
|
.login-form {
|
||||||
padding-top: 60px;
|
padding-top: 60px;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
max-width: 600px;
|
max-width: 400px;
|
||||||
}
|
}
|
||||||
|
@ -26,25 +26,62 @@
|
|||||||
</mat-expansion-panel-header>
|
</mat-expansion-panel-header>
|
||||||
<div class='meta-info-panel-body'>
|
<div class='meta-info-panel-body'>
|
||||||
|
|
||||||
<h3 translate *ngIf="motion.submitterName">Submitters</h3>
|
<div *ngIf="motion.submitterName">
|
||||||
|
<h3 translate>Submitters</h3>
|
||||||
{{motion.submitterName}}
|
{{motion.submitterName}}
|
||||||
|
</div>
|
||||||
|
|
||||||
<h3 translate *ngIf='motion.supporters_id && motion.supporters_id.length > 0'>Supporters</h3>
|
<div *ngIf='motion.supporters_id && motion.supporters_id.length > 0'>
|
||||||
|
<h3>translate>Supporters</h3>
|
||||||
|
<!-- print all motion supporters -->
|
||||||
|
</div>
|
||||||
|
|
||||||
<h3 translate *ngIf='motion.state_id'>Status</h3>
|
<div *ngIf='motion.state_id'>
|
||||||
|
<h3>
|
||||||
|
<a [matMenuTriggerFor]="stateMenu">
|
||||||
|
<span translate>Status</span>
|
||||||
|
<fa-icon icon='cog'></fa-icon>
|
||||||
|
</a>
|
||||||
|
</h3>
|
||||||
{{motion.stateName}}
|
{{motion.stateName}}
|
||||||
|
</div>
|
||||||
|
|
||||||
<h3 translate *ngIf='motion.recommendation_id'>{{motion.recomBy}}</h3>
|
<div *ngIf='motion.recommendation_id'>
|
||||||
<!-- config.get(motions_recommendations_by) -->
|
<h3>
|
||||||
|
<a [matMenuTriggerFor]="stateMenu">
|
||||||
|
<span>{{motion.recomBy}}</span>
|
||||||
|
<fa-icon icon='cog'></fa-icon>
|
||||||
|
</a>
|
||||||
|
</h3>
|
||||||
{{motion.recommendation}}
|
{{motion.recommendation}}
|
||||||
|
</div>
|
||||||
|
|
||||||
<h3 translate *ngIf="motion.category_id">Category</h3>
|
<div *ngIf="motion.category_id">
|
||||||
|
<h3>
|
||||||
|
<a [matMenuTriggerFor]="categoryMenu">
|
||||||
|
<span translate>Category</span>
|
||||||
|
<fa-icon icon='cog'></fa-icon>
|
||||||
|
</a>
|
||||||
|
</h3>
|
||||||
{{motion.category}}
|
{{motion.category}}
|
||||||
|
</div>
|
||||||
|
|
||||||
<h3 translate *ngIf="motion.origin">Origin</h3>
|
<div *ngIf="motion.origin">
|
||||||
{{motion.origin}}
|
<h3>
|
||||||
|
<span translate>Origin</span>
|
||||||
|
<fa-icon icon='cog'></fa-icon>
|
||||||
|
</h3>
|
||||||
|
<span>{{motion.origin}}</span>
|
||||||
|
|
||||||
<h3 translate *ngIf='motion.polls && motion.polls.length > 0'>Voting</h3>
|
<br>
|
||||||
|
<mat-form-field>
|
||||||
|
<input matInput #origin placeholder='Origin' value={{motion.origin}}>
|
||||||
|
</mat-form-field>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div *ngIf='motion.polls && motion.polls.length > 0'>
|
||||||
|
<h3 translate>Voting</h3>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</mat-expansion-panel>
|
</mat-expansion-panel>
|
||||||
<!-- <mat-expansion-panel [expanded]='true'> -->
|
<!-- <mat-expansion-panel [expanded]='true'> -->
|
||||||
@ -73,3 +110,15 @@
|
|||||||
|
|
||||||
</mat-expansion-panel>
|
</mat-expansion-panel>
|
||||||
</mat-accordion>
|
</mat-accordion>
|
||||||
|
|
||||||
|
<!-- dummy values -->
|
||||||
|
<mat-menu #stateMenu="matMenu">
|
||||||
|
<button mat-menu-item translate>Accept</button>
|
||||||
|
<button mat-menu-item translate>Reject</button>
|
||||||
|
<button mat-menu-item translate>Do not decice</button>
|
||||||
|
</mat-menu>
|
||||||
|
|
||||||
|
<mat-menu #categoryMenu="matMenu">
|
||||||
|
<button mat-menu-item translate>B - Bildung</button>
|
||||||
|
<button mat-menu-item translate>T - Test</button>
|
||||||
|
</mat-menu>
|
@ -21,12 +21,36 @@ mat-panel-title {
|
|||||||
|
|
||||||
.meta-info-panel {
|
.meta-info-panel {
|
||||||
padding-top: 25px;
|
padding-top: 25px;
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
h3 {
|
h3 {
|
||||||
display: block;
|
display: block;
|
||||||
margin-top: 12px; //distance between heading and text
|
margin-top: 12px; //distance between heading and text
|
||||||
margin-bottom: 3px; //distance between heading and text
|
margin-bottom: 3px; //distance between heading and text
|
||||||
font-size: 80%;
|
font-size: 80%;
|
||||||
color: gray;
|
color: gray;
|
||||||
|
|
||||||
|
fa-icon {
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mat-form-field {
|
||||||
|
margin-top: 12px; //distance between heading and text
|
||||||
|
}
|
||||||
|
|
||||||
|
.mat-form-field-label {
|
||||||
|
font-size: 12pt;
|
||||||
|
color: gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mat-form-field-label-wrapper {
|
||||||
|
fa-icon {
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.meta-info-panel-body {
|
.meta-info-panel-body {
|
||||||
|
@ -27,6 +27,7 @@ export class MotionDetailComponent extends BaseComponent implements OnInit {
|
|||||||
if (newModel.id === +params.id) {
|
if (newModel.id === +params.id) {
|
||||||
this.motion = newModel as Motion;
|
this.motion = newModel as Motion;
|
||||||
console.log('this.motion = ', this.motion);
|
console.log('this.motion = ', this.motion);
|
||||||
|
// console.log('motion state name: ', this.motion.stateName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -35,6 +36,7 @@ export class MotionDetailComponent extends BaseComponent implements OnInit {
|
|||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
console.log('(init)the motion: ', this.motion);
|
console.log('(init)the motion: ', this.motion);
|
||||||
|
console.log('motion state name: ', this.motion.stateName);
|
||||||
}
|
}
|
||||||
|
|
||||||
downloadSingleMotionButton() {
|
downloadSingleMotionButton() {
|
||||||
|
@ -0,0 +1,27 @@
|
|||||||
|
<mat-toolbar color='primary'>
|
||||||
|
<span class='app-name on-transition-fade' translate>Privacy Policy</span>
|
||||||
|
</mat-toolbar>
|
||||||
|
|
||||||
|
<mat-card class="os-card on-transition-fade">
|
||||||
|
<div>
|
||||||
|
OpenSlides speichert nur so viele personenbezogene Daten wie unbedingt nötig sind, um Besuchern Informationen und Dienste
|
||||||
|
zuverlässig und sicher anbieten zu können. Eine Auswertung der Dienste-Protokolle erfolgt nur von uns selbst und
|
||||||
|
auch nur, um mögliche Fehler, Einbruchsversuche oder technisches Verhalten der Server auf unseren Server zu analysieren.
|
||||||
|
Eine Weitergabe von Teilen der erhobenen Daten erfolgt ausschließlich gemäß gesetzlicher Verpflichtung z.B. an Strafverfolgungs-
|
||||||
|
oder Steuerbehörden. Nachfolgend wird genau aufgeschlüsselt, bei welcher Gelegenheit welche Daten wie lange gespeichert
|
||||||
|
sind. Zudem wird beschrieben, welche Schritte erforderlich sind um Daten zu löschen.
|
||||||
|
<h3 translate>Cookies</h3>
|
||||||
|
Beim Besuch der Website wird ein sogenanntes Cookie angelegt. Dieses Cookie wird ausschließlich dazu verwendet, um auf der
|
||||||
|
Website eingeloggt zu bleiben. Ein sogenanntes "Tracking Cookie" wird nicht verwendet.
|
||||||
|
<h3 translate>Logfiles</h3>
|
||||||
|
Zu OpenSlides gehören verschiedene Unter-Services. Diese loggen folgende Informationen: Quell-IP-Adresse, Zeitstempel, genutztes
|
||||||
|
Betriebssystem, verwendeter Web-Browser, Referer-URL, E-Mail-Adresse und besuchte Seite.
|
||||||
|
<h3 translate>Database</h3>
|
||||||
|
Als Mitglied werden folgende Daten von Ihnen gespeichert: Titel, Vorname, Nachname, EMail, Gliederungsebene, Teilnehmernummer,
|
||||||
|
Gruppenzugehörigkeit, Initiales Passwort im Klartext, Vergebenes Passwort als kryptografischer Hashwert und ein Kommentar
|
||||||
|
für interne Notizen. Diese Informationen werden mit den Aktionen innerhalb von OpenSlides in Verbindung gebracht.
|
||||||
|
Diese Informationen werden nicht an Dritte weiter gegeben und sind auch nicht für diese zugänglich.
|
||||||
|
<h3 translate>Deleting Files</h3>
|
||||||
|
Die Daten dieser OpenSlides-Demo-Instanz werden nächtlich automatisch gelöscht.
|
||||||
|
</div>
|
||||||
|
</mat-card>
|
@ -1,19 +1,19 @@
|
|||||||
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
import { PrivacyPolicyDialogComponent } from './privacy-policy.dialog.component';
|
import { PrivacyPolicyComponent } from './privacy-policy.component';
|
||||||
|
|
||||||
describe('PrivacyPolicyDialogComponent', () => {
|
describe('PrivacyPolicyComponent', () => {
|
||||||
let component: PrivacyPolicyDialogComponent;
|
let component: PrivacyPolicyComponent;
|
||||||
let fixture: ComponentFixture<PrivacyPolicyDialogComponent>;
|
let fixture: ComponentFixture<PrivacyPolicyComponent>;
|
||||||
|
|
||||||
beforeEach(async(() => {
|
beforeEach(async(() => {
|
||||||
TestBed.configureTestingModule({
|
TestBed.configureTestingModule({
|
||||||
declarations: [PrivacyPolicyDialogComponent]
|
declarations: [PrivacyPolicyComponent]
|
||||||
}).compileComponents();
|
}).compileComponents();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
fixture = TestBed.createComponent(PrivacyPolicyDialogComponent);
|
fixture = TestBed.createComponent(PrivacyPolicyComponent);
|
||||||
component = fixture.componentInstance;
|
component = fixture.componentInstance;
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
});
|
});
|
@ -0,0 +1,12 @@
|
|||||||
|
import { Component, OnInit } from '@angular/core';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-privacy-policy',
|
||||||
|
templateUrl: './privacy-policy.component.html',
|
||||||
|
styleUrls: ['./privacy-policy.component.scss']
|
||||||
|
})
|
||||||
|
export class PrivacyPolicyComponent implements OnInit {
|
||||||
|
constructor() {}
|
||||||
|
|
||||||
|
ngOnInit() {}
|
||||||
|
}
|
@ -4,6 +4,8 @@ import { Routes, RouterModule } from '@angular/router';
|
|||||||
import { SiteComponent } from './site.component';
|
import { SiteComponent } from './site.component';
|
||||||
|
|
||||||
import { StartComponent } from './start/start.component';
|
import { StartComponent } from './start/start.component';
|
||||||
|
import { PrivacyPolicyComponent } from './privacy-policy/privacy-policy.component';
|
||||||
|
import { LegalNoticeComponent } from './legal-notice/legal-notice.component';
|
||||||
// import { LoginComponent } from './login/login.component';
|
// import { LoginComponent } from './login/login.component';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -18,6 +20,8 @@ const routes: Routes = [
|
|||||||
component: SiteComponent,
|
component: SiteComponent,
|
||||||
children: [
|
children: [
|
||||||
{ path: '', component: StartComponent },
|
{ path: '', component: StartComponent },
|
||||||
|
{ path: 'legalnotice', component: LegalNoticeComponent },
|
||||||
|
{ path: 'privacypolicy', component: PrivacyPolicyComponent },
|
||||||
{ path: 'agenda', loadChildren: './agenda/agenda.module#AgendaModule' },
|
{ path: 'agenda', loadChildren: './agenda/agenda.module#AgendaModule' },
|
||||||
{
|
{
|
||||||
path: 'assignments',
|
path: 'assignments',
|
||||||
|
@ -72,16 +72,29 @@
|
|||||||
<fa-icon icon='cog'></fa-icon>
|
<fa-icon icon='cog'></fa-icon>
|
||||||
<span translate>Settings</span>
|
<span translate>Settings</span>
|
||||||
</a>
|
</a>
|
||||||
|
<mat-divider></mat-divider>
|
||||||
|
<a [@navItemAnim] *appOsPerms="['core.can_see_projector']" mat-list-item routerLink='/projector' routerLinkActive='active'
|
||||||
|
(click)='isMobile ? sideNav.toggle() : null'>
|
||||||
|
<fa-icon icon='video'></fa-icon>
|
||||||
|
<span translate>Projector</span>
|
||||||
|
</a>
|
||||||
</mat-nav-list>
|
</mat-nav-list>
|
||||||
|
|
||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
<button mat-button (click)='openLegalNotice()'>
|
<button mat-button>
|
||||||
|
<a routerLink='/legalnotice' (click)='isMobile ? sideNav.toggle() : null'>
|
||||||
<span translate>Legal Notice</span>
|
<span translate>Legal Notice</span>
|
||||||
|
</a>
|
||||||
</button>
|
</button>
|
||||||
<button mat-button (click)='openPrivacyPolicy()'>
|
<button mat-button>
|
||||||
|
<a routerLink='/privacypolicy' (click)='isMobile ? sideNav.toggle() : null'>
|
||||||
<span translate>Privacy Policy</span>
|
<span translate>Privacy Policy</span>
|
||||||
|
</a>
|
||||||
</button>
|
</button>
|
||||||
|
<!-- <button mat-button (click)='openPrivacyPolicy()'>
|
||||||
|
<span translate>Privacy Policy</span>
|
||||||
|
</button> -->
|
||||||
<br>
|
<br>
|
||||||
<span align="center">© Copyright by
|
<span align="center">© Copyright by
|
||||||
<a href='https://openslides.org/'>OpenSlides</a>
|
<a href='https://openslides.org/'>OpenSlides</a>
|
||||||
@ -103,16 +116,10 @@
|
|||||||
<button mat-icon-button (click)='sideNav.toggle()'>
|
<button mat-icon-button (click)='sideNav.toggle()'>
|
||||||
<fa-icon icon='search'></fa-icon>
|
<fa-icon icon='search'></fa-icon>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
</mat-toolbar>
|
</mat-toolbar>
|
||||||
|
|
||||||
<!-- continue with <mat-toolbar> in the app-->
|
<!-- continue with <mat-toolbar> in the app-->
|
||||||
<main [@pageTransition]="o.isActivated ? o.activatedRoute : ''">
|
<main [@pageTransition]="o.isActivated ? o.activatedRoute : ''">
|
||||||
<router-outlet #o="outlet"></router-outlet>
|
<router-outlet #o="outlet"></router-outlet>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<!-- the global projector button -->
|
|
||||||
<!-- <button class='projector-button' mat-fab>
|
|
||||||
<fa-icon icon='video'></fa-icon>
|
|
||||||
</button> -->
|
|
||||||
</mat-sidenav-container>
|
</mat-sidenav-container>
|
@ -10,8 +10,6 @@ import { TranslateService } from '@ngx-translate/core'; //showcase
|
|||||||
import { BaseComponent } from 'app/base.component';
|
import { BaseComponent } from 'app/base.component';
|
||||||
import { pageTransition, navItemAnim } from 'app/shared/animations';
|
import { pageTransition, navItemAnim } from 'app/shared/animations';
|
||||||
import { MatDialog } from '@angular/material';
|
import { MatDialog } from '@angular/material';
|
||||||
import { LegalnoticeDialogComponent } from '../shared/components/legal-notice/legal-notice.dialog.component';
|
|
||||||
import { PrivacyPolicyDialogComponent } from '../shared/components/privacy-policy/privacy-policy.dialog.component';
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-site',
|
selector: 'app-site',
|
||||||
@ -112,18 +110,4 @@ export class SiteComponent extends BaseComponent implements OnInit {
|
|||||||
this.authService.logout().subscribe();
|
this.authService.logout().subscribe();
|
||||||
this.router.navigate(['/login']);
|
this.router.navigate(['/login']);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Opens the legal notice as dialog
|
|
||||||
*/
|
|
||||||
openLegalNotice() {
|
|
||||||
const dialogRef = this.dialog.open(LegalnoticeDialogComponent);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Opens the privacy Policy as dialog
|
|
||||||
*/
|
|
||||||
openPrivacyPolicy() {
|
|
||||||
const dialogRef = this.dialog.open(PrivacyPolicyDialogComponent);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -7,9 +7,11 @@ import { TranslateModule } from '@ngx-translate/core';
|
|||||||
|
|
||||||
import { SiteComponent } from './site.component';
|
import { SiteComponent } from './site.component';
|
||||||
import { StartComponent } from './start/start.component';
|
import { StartComponent } from './start/start.component';
|
||||||
|
import { LegalNoticeComponent } from './legal-notice/legal-notice.component';
|
||||||
|
import { PrivacyPolicyComponent } from './privacy-policy/privacy-policy.component';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [CommonModule, SharedModule, SiteRoutingModule, TranslateModule.forChild()],
|
imports: [CommonModule, SharedModule, SiteRoutingModule, TranslateModule.forChild()],
|
||||||
declarations: [SiteComponent, StartComponent]
|
declarations: [SiteComponent, StartComponent, LegalNoticeComponent, PrivacyPolicyComponent]
|
||||||
})
|
})
|
||||||
export class SiteModule {}
|
export class SiteModule {}
|
||||||
|
Loading…
Reference in New Issue
Block a user