Fix malfunctions in Firefox ESR
Various cryptic issues that had no usefull debug output. ngx-translates "translate" directive was causing Firefox ESR to jump in the "drainMicroTaskQueue" infinite recursion when using the directive in the same component as nGrid. Therefore, I changed all uses of the translate directive to the pipe (arround 700 or so, regex is my best friend now) open todo: adjust the linter that we may never use the translate directive again. There was another cryptic issue with the current version of exceljs which was also causing firefox to go crash when loading a workbook object. It was sufficient to have any Workbook() function declared in a module to cause firefox to crash.
This commit is contained in:
parent
42af962248
commit
820a47123a
@ -55,7 +55,7 @@
|
|||||||
"chart.js": "^2.9.2",
|
"chart.js": "^2.9.2",
|
||||||
"core-js": "^3.6.4",
|
"core-js": "^3.6.4",
|
||||||
"css-element-queries": "^1.2.3",
|
"css-element-queries": "^1.2.3",
|
||||||
"exceljs": "3.8.2",
|
"exceljs": "1.15.0",
|
||||||
"file-saver": "^2.0.2",
|
"file-saver": "^2.0.2",
|
||||||
"lz4js": "^0.2.0",
|
"lz4js": "^0.2.0",
|
||||||
"material-icon-font": "git+https://github.com/petergng/materialIconFont.git",
|
"material-icon-font": "git+https://github.com/petergng/materialIconFont.git",
|
||||||
|
@ -145,12 +145,11 @@ export class HttpService {
|
|||||||
if (isDetailResponse(e.error)) {
|
if (isDetailResponse(e.error)) {
|
||||||
error += this.processDetailResponse(e.error);
|
error += this.processDetailResponse(e.error);
|
||||||
} else {
|
} else {
|
||||||
error = Object.keys(e.error)
|
const errorList = Object.keys(e.error).map(key => {
|
||||||
.map(key => {
|
|
||||||
const capitalizedKey = key.charAt(0).toUpperCase() + key.slice(1);
|
const capitalizedKey = key.charAt(0).toUpperCase() + key.slice(1);
|
||||||
return this.translate.instant(capitalizedKey) + ': ' + this.processDetailResponse(e.error[key]);
|
return `${this.translate.instant(capitalizedKey)}: ${this.processDetailResponse(e.error[key])}`;
|
||||||
})
|
});
|
||||||
.join(', ');
|
error = errorList.join(', ');
|
||||||
}
|
}
|
||||||
} else if (e.status === 500) {
|
} else if (e.status === 500) {
|
||||||
error += this.translate.instant('A server error occured. Please contact your system administrator.');
|
error += this.translate.instant('A server error occured. Please contact your system administrator.');
|
||||||
|
@ -256,14 +256,11 @@ export class PdfDocumentService {
|
|||||||
if (logoHeaderLeftUrl && logoHeaderRightUrl) {
|
if (logoHeaderLeftUrl && logoHeaderRightUrl) {
|
||||||
text = '';
|
text = '';
|
||||||
} else {
|
} else {
|
||||||
const general_event_name = this.configService.instant<string>('general_event_name');
|
const general_event_name = this.translate.instant(this.configService.instant<string>('general_event_name'));
|
||||||
const general_event_description = this.configService.instant<string>('general_event_description');
|
const general_event_description = this.translate.instant(
|
||||||
const line1 = [
|
this.configService.instant<string>('general_event_description')
|
||||||
this.translate.instant(general_event_name),
|
);
|
||||||
this.translate.instant(general_event_description)
|
const line1 = [general_event_name, general_event_description].filter(Boolean).join(' - ');
|
||||||
]
|
|
||||||
.filter(Boolean)
|
|
||||||
.join(' – ');
|
|
||||||
const line2 = [
|
const line2 = [
|
||||||
this.configService.instant('general_event_location'),
|
this.configService.instant('general_event_location'),
|
||||||
this.configService.instant('general_event_date')
|
this.configService.instant('general_event_date')
|
||||||
|
@ -306,7 +306,8 @@ export class UserRepositoryService extends BaseRepository<ViewUser, User, UserTi
|
|||||||
} else if (numEmails === 1) {
|
} else if (numEmails === 1) {
|
||||||
msg = this.translate.instant('One email was send sucessfully.');
|
msg = this.translate.instant('One email was send sucessfully.');
|
||||||
} else {
|
} else {
|
||||||
msg = this.translate.instant('%num% emails were send sucessfully.').replace('%num%', numEmails);
|
msg = this.translate.instant('%num% emails were send sucessfully.');
|
||||||
|
msg = msg.replace('%num%', numEmails);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (noEmailIds.length) {
|
if (noEmailIds.length) {
|
||||||
|
@ -58,6 +58,13 @@ _('PDF footer logo (left)');
|
|||||||
_('PDF footer logo (right)');
|
_('PDF footer logo (right)');
|
||||||
_('Web interface header logo');
|
_('Web interface header logo');
|
||||||
_('PDF ballot paper logo');
|
_('PDF ballot paper logo');
|
||||||
|
_('Foreground color');
|
||||||
|
_('Background color');
|
||||||
|
_('Header background color');
|
||||||
|
_('Header font color');
|
||||||
|
_('Headline color');
|
||||||
|
_('Chyron background color');
|
||||||
|
_('Chyron font color');
|
||||||
|
|
||||||
// Agenda config strings
|
// Agenda config strings
|
||||||
_('Enable numbering for agenda items');
|
_('Enable numbering for agenda items');
|
||||||
@ -409,3 +416,18 @@ _('Motion change recommendation deleted');
|
|||||||
// core misc strings
|
// core misc strings
|
||||||
_('items per page');
|
_('items per page');
|
||||||
_('Tag');
|
_('Tag');
|
||||||
|
|
||||||
|
// strings which are not extracted as translateable strings from client code
|
||||||
|
_('Foreground color');
|
||||||
|
_('Background color');
|
||||||
|
_('Header background color');
|
||||||
|
_('Header font color');
|
||||||
|
_('Headline color');
|
||||||
|
_('Chyron background color');
|
||||||
|
_('Chyron font color');
|
||||||
|
_('Show full text');
|
||||||
|
_('Hide more text');
|
||||||
|
_('Show password');
|
||||||
|
_('Hide password');
|
||||||
|
_('result');
|
||||||
|
_('results');
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<div [formGroup]="form">
|
<div [formGroup]="form">
|
||||||
<p>
|
<p>
|
||||||
<mat-checkbox formControlName="agenda_create">
|
<mat-checkbox formControlName="agenda_create">
|
||||||
<span translate>Add to agenda</span>
|
<span>{{ 'Add to agenda' | translate }}</span>
|
||||||
</mat-checkbox>
|
</mat-checkbox>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
@ -2,17 +2,17 @@
|
|||||||
<table class="assignment-result-table">
|
<table class="assignment-result-table">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<th class="voting-option" translate>Candidates</th>
|
<th class="voting-option">{{ 'Candidates' | translate }}</th>
|
||||||
<th class="result yes">
|
<th class="result yes">
|
||||||
<span *ngIf="!isMethodY" translate>
|
<span *ngIf="!isMethodY">
|
||||||
Yes
|
{{ 'Yes' | translate }}
|
||||||
</span>
|
</span>
|
||||||
<span *ngIf="isMethodY" translate>
|
<span *ngIf="isMethodY">
|
||||||
Votes
|
{{ 'Votes' | translate }}
|
||||||
</span>
|
</span>
|
||||||
</th>
|
</th>
|
||||||
<th class="result no" translate *ngIf="!isMethodY">No</th>
|
<th class="result no" *ngIf="!isMethodY">{{ 'No' | translate }}</th>
|
||||||
<th class="result abstain" translate *ngIf="isMethodYNA">Abstain</th>
|
<th class="result abstain" *ngIf="isMethodYNA">{{ 'Abstain' | translate }}</th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr *ngFor="let row of tableData" [class]="row.class">
|
<tr *ngFor="let row of tableData" [class]="row.class">
|
||||||
<td class="voting-option">
|
<td class="voting-option">
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
<!-- upload file dialog -->
|
<!-- upload file dialog -->
|
||||||
<ng-template #uploadDialog>
|
<ng-template #uploadDialog>
|
||||||
<h1 mat-dialog-title>
|
<h1 mat-dialog-title>
|
||||||
<span translate>Upload files</span>
|
<span>{{ 'Upload files' | translate }}</span>
|
||||||
</h1>
|
</h1>
|
||||||
<os-media-upload-content
|
<os-media-upload-content
|
||||||
(uploadSuccessEvent)="uploadSuccess($event)"
|
(uploadSuccessEvent)="uploadSuccess($event)"
|
||||||
|
@ -9,9 +9,9 @@
|
|||||||
[ngSwitch]="banner.type"
|
[ngSwitch]="banner.type"
|
||||||
>
|
>
|
||||||
<ng-container *ngSwitchCase="'history'">
|
<ng-container *ngSwitchCase="'history'">
|
||||||
<span translate>You are using the history mode of OpenSlides. Changes will not be saved.</span>
|
<span>{{ 'You are using the history mode of OpenSlides. Changes will not be saved.' | translate }}</span>
|
||||||
<span>({{ getHistoryTimestamp() }})</span>
|
<span>({{ getHistoryTimestamp() }})</span>
|
||||||
<a (click)="timeTravel.resumeTime()" translate>Exit</a>
|
<a (click)="timeTravel.resumeTime()">{{ 'Exit' | translate }}</a>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<ng-container *ngSwitchDefault>
|
<ng-container *ngSwitchDefault>
|
||||||
<a class="banner-link" [routerLink]="banner.link" [style.cursor]="banner.link ? 'pointer' : 'default'">
|
<a class="banner-link" [routerLink]="banner.link" [style.cursor]="banner.link ? 'pointer' : 'default'">
|
||||||
|
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
<!-- Cancel -->
|
<!-- Cancel -->
|
||||||
<button mat-button (click)="closeDialog(false)">
|
<button mat-button (click)="closeDialog(false)">
|
||||||
<span translate>Cancel</span>
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
@ -89,13 +89,14 @@ type StateMachine = { [state in State]?: { [event in StateEvent]?: SMAction } };
|
|||||||
*ngIf="state === 'start'"
|
*ngIf="state === 'start'"
|
||||||
mat-raised-button
|
mat-raised-button
|
||||||
color="accent"
|
color="accent"
|
||||||
translate
|
|
||||||
>
|
>
|
||||||
Search player
|
{{ 'Search player' | translate }}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</mat-dialog-content>
|
</mat-dialog-content>
|
||||||
<mat-dialog-actions> <button mat-button mat-dialog-close translate>Close</button> </mat-dialog-actions>
|
<mat-dialog-actions>
|
||||||
|
<button mat-button mat-dialog-close>{{ 'Close' | translate }}</button>
|
||||||
|
</mat-dialog-actions>
|
||||||
`,
|
`,
|
||||||
styles: [
|
styles: [
|
||||||
`
|
`
|
||||||
|
@ -46,7 +46,7 @@ import { ViewportService } from 'app/core/ui-services/viewport.service';
|
|||||||
* <button mat-icon-button (click)="toggleMultiSelect()">
|
* <button mat-icon-button (click)="toggleMultiSelect()">
|
||||||
* <mat-icon>arrow_back</mat-icon>
|
* <mat-icon>arrow_back</mat-icon>
|
||||||
* </button>
|
* </button>
|
||||||
* <span>{{ selectedRows.length }} </span><span translate>selected</span>
|
* <span>{{ selectedRows.length }} </span><span>selected</span>
|
||||||
* </div>
|
* </div>
|
||||||
* </os-head-bar>
|
* </os-head-bar>
|
||||||
* ```
|
* ```
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
<div>
|
<div>
|
||||||
<ng-container *ngIf="!isEditing">
|
<ng-container *ngIf="!isEditing">
|
||||||
<div *ngIf="legalNotice" class="legal-notice-text" [innerHtml]="legalNotice | trust: 'html'"></div>
|
<div *ngIf="legalNotice" class="legal-notice-text" [innerHtml]="legalNotice | trust: 'html'"></div>
|
||||||
<div *ngIf="!legalNotice" translate>
|
<div *ngIf="!legalNotice">
|
||||||
The event manager hasn't set up a legal notice yet.
|
{{ 'The event manager has not set up a legal notice yet.' | translate }}
|
||||||
</div>
|
</div>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<ng-container *ngIf="isEditing">
|
<ng-container *ngIf="isEditing">
|
||||||
@ -18,13 +18,17 @@
|
|||||||
<a [attr.href]="versionInfo.openslides_url" target="_blank">
|
<a [attr.href]="versionInfo.openslides_url" target="_blank">
|
||||||
OpenSlides {{ versionInfo.openslides_version }}
|
OpenSlides {{ versionInfo.openslides_version }}
|
||||||
</a>
|
</a>
|
||||||
(<span translate>License</span>: {{ versionInfo.openslides_license }})
|
<span>({{ 'License' | translate }}: {{ versionInfo.openslides_license }})</span>
|
||||||
|
|
||||||
<div *ngIf="versionInfo.plugins.length">
|
<div *ngIf="versionInfo.plugins.length">
|
||||||
<p><span translate>Installed plugins</span>:</p>
|
<p>
|
||||||
|
<span>{{ 'Installed plugins' | translate }}:</span>
|
||||||
|
</p>
|
||||||
<div *ngFor="let plugin of versionInfo.plugins">
|
<div *ngFor="let plugin of versionInfo.plugins">
|
||||||
<a [attr.href]="plugin.url" target="_blank"> {{ plugin.verbose_name }} {{ plugin.version }} </a>
|
<a [attr.href]="plugin.url" target="_blank"> {{ plugin.verbose_name }} {{ plugin.version }} </a>
|
||||||
<div *ngIf="plugin.license">(<span translate>License</span>: {{ plugin.license }})</div>
|
<div *ngIf="plugin.license">
|
||||||
|
<span>({{ 'License' | translate }}: {{ plugin.license }})</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
|
|
||||||
<!-- No Results -->
|
<!-- No Results -->
|
||||||
<div *pblNgridNoDataRef class="pbl-ngrid-no-data">
|
<div *pblNgridNoDataRef class="pbl-ngrid-no-data">
|
||||||
<span translate>No data</span>
|
<span>{{ 'No data' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Slot transclusion for the individual cells -->
|
<!-- Slot transclusion for the individual cells -->
|
||||||
|
@ -27,8 +27,9 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<span translate>Upload to:</span>
|
<span> {{ 'Upload to:' | translate }}</span>
|
||||||
<i *ngIf="selectedDirectoryId === null" translate>Base folder</i>
|
|
||||||
|
<i *ngIf="selectedDirectoryId === null">{{ 'Base folder' | translate }}</i>
|
||||||
<i *ngIf="selectedDirectoryId !== null">{{ getDirectory(selectedDirectoryId).title }}</i>
|
<i *ngIf="selectedDirectoryId !== null">{{ getDirectory(selectedDirectoryId).title }}</i>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -36,7 +37,9 @@
|
|||||||
<table mat-table [dataSource]="uploadList" class="mat-elevation-z8">
|
<table mat-table [dataSource]="uploadList" class="mat-elevation-z8">
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<ng-container matColumnDef="title" sticky>
|
<ng-container matColumnDef="title" sticky>
|
||||||
<th mat-header-cell *matHeaderCellDef><span translate>Title</span></th>
|
<th mat-header-cell *matHeaderCellDef>
|
||||||
|
<span>{{ 'Title' | translate }}</span>
|
||||||
|
</th>
|
||||||
<td mat-cell *matCellDef="let file">
|
<td mat-cell *matCellDef="let file">
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<input matInput [value]="file.title" (input)="onChangeTitle($event.target.value, file)" />
|
<input matInput [value]="file.title" (input)="onChangeTitle($event.target.value, file)" />
|
||||||
@ -46,13 +49,17 @@
|
|||||||
|
|
||||||
<!-- Original file name -->
|
<!-- Original file name -->
|
||||||
<ng-container matColumnDef="filename">
|
<ng-container matColumnDef="filename">
|
||||||
<th mat-header-cell *matHeaderCellDef><span translate>File name</span></th>
|
<th mat-header-cell *matHeaderCellDef>
|
||||||
|
<span>{{ 'File name' | translate }}</span>
|
||||||
|
</th>
|
||||||
<td mat-cell *matCellDef="let file">{{ file.filename }}</td>
|
<td mat-cell *matCellDef="let file">{{ file.filename }}</td>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<!-- File information -->
|
<!-- File information -->
|
||||||
<ng-container matColumnDef="information">
|
<ng-container matColumnDef="information">
|
||||||
<th mat-header-cell *matHeaderCellDef><span translate>File information</span></th>
|
<th mat-header-cell *matHeaderCellDef>
|
||||||
|
<span>{{ 'File information' | translate }}</span>
|
||||||
|
</th>
|
||||||
<td mat-cell *matCellDef="let file">
|
<td mat-cell *matCellDef="let file">
|
||||||
<div class="file-info-cell">
|
<div class="file-info-cell">
|
||||||
<span>
|
<span>
|
||||||
@ -69,7 +76,9 @@
|
|||||||
|
|
||||||
<!-- Access groups -->
|
<!-- Access groups -->
|
||||||
<ng-container matColumnDef="access_groups">
|
<ng-container matColumnDef="access_groups">
|
||||||
<th mat-header-cell *matHeaderCellDef><span translate>Access groups</span></th>
|
<th mat-header-cell *matHeaderCellDef>
|
||||||
|
<span>{{ 'Access groups' | translate }}</span>
|
||||||
|
</th>
|
||||||
<td mat-cell *matCellDef="let file" [formGroup]="file.form">
|
<td mat-cell *matCellDef="let file" [formGroup]="file.form">
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<os-search-value-selector
|
<os-search-value-selector
|
||||||
@ -84,7 +93,9 @@
|
|||||||
|
|
||||||
<!-- Remove Button -->
|
<!-- Remove Button -->
|
||||||
<ng-container matColumnDef="remove">
|
<ng-container matColumnDef="remove">
|
||||||
<th mat-header-cell *matHeaderCellDef><span translate>Remove</span></th>
|
<th mat-header-cell *matHeaderCellDef>
|
||||||
|
<span>{{ 'Remove' | translate }}</span>
|
||||||
|
</th>
|
||||||
<td mat-cell *matCellDef="let file">
|
<td mat-cell *matCellDef="let file">
|
||||||
<button mat-icon-button color="warn" (click)="onRemoveButton(file)">
|
<button mat-icon-button color="warn" (click)="onRemoveButton(file)">
|
||||||
<mat-icon>close</mat-icon>
|
<mat-icon>close</mat-icon>
|
||||||
@ -107,10 +118,10 @@
|
|||||||
color="primary"
|
color="primary"
|
||||||
[disabled]="uploadList.data.length === 0"
|
[disabled]="uploadList.data.length === 0"
|
||||||
>
|
>
|
||||||
<span translate> Upload </span>
|
<span>{{ 'Upload' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" mat-raised-button (click)="onClearButton()" [disabled]="uploadList.data.length === 0">
|
<button type="button" mat-raised-button (click)="onClearButton()" [disabled]="uploadList.data.length === 0">
|
||||||
<span translate> Clear list </span>
|
<span>{{ 'Clear list' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<th></th>
|
<th></th>
|
||||||
<th colspan="2" translate>Votes</th>
|
<th colspan="2">{{ 'Votes' | translate }}</th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr *ngFor="let row of getTableData()" [class]="row.votingOption">
|
<tr *ngFor="let row of getTableData()" [class]="row.votingOption">
|
||||||
<!-- YNA/Valid etc -->
|
<!-- YNA/Valid etc -->
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<mat-card [ngClass]="isEditing ? 'os-form-card' : 'os-card'">
|
<mat-card [ngClass]="isEditing ? 'os-form-card' : 'os-card'">
|
||||||
<ng-container *ngIf="!isEditing">
|
<ng-container *ngIf="!isEditing">
|
||||||
<div *ngIf="privacyPolicy" [innerHtml]="privacyPolicy | trust: 'html'"></div>
|
<div *ngIf="privacyPolicy" [innerHtml]="privacyPolicy | trust: 'html'"></div>
|
||||||
<div *ngIf="!privacyPolicy" translate>
|
<div *ngIf="!privacyPolicy">
|
||||||
The event manager hasn't set up a privacy policy yet.
|
{{ 'The event manager has not set up a privacy policy yet.' | translate }}
|
||||||
</div>
|
</div>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<ng-container *ngIf="isEditing">
|
<ng-container *ngIf="isEditing">
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<h2 mat-dialog-title>
|
<h2 mat-dialog-title>
|
||||||
<span translate>Project selection?</span>
|
<span>{{ 'Project selection?' | translate }}</span>
|
||||||
</h2>
|
</h2>
|
||||||
<div class="element-name" *ngIf="projectorElementBuildDescriptor">
|
<div class="element-name" *ngIf="projectorElementBuildDescriptor">
|
||||||
{{ projectorElementBuildDescriptor.getDialogTitle() }}
|
{{ projectorElementBuildDescriptor.getDialogTitle() }}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<div class="custom-table-header flex-spaced">
|
<div class="custom-table-header flex-spaced">
|
||||||
<!-- Amount of filters -->
|
<!-- Amount of filters -->
|
||||||
<div class="filter-count">
|
<div class="filter-count">
|
||||||
<span>{{ filterCount }} </span><span translate>of</span>
|
<span>{{ filterCount }} </span><span>{{ 'of' | translate }}</span>
|
||||||
<span> {{ totalCount }}</span>
|
<span> {{ totalCount }}</span>
|
||||||
<span *ngIf="extraItemInfo"> · {{ extraItemInfo }}</span>
|
<span *ngIf="extraItemInfo"> · {{ extraItemInfo }}</span>
|
||||||
</div>
|
</div>
|
||||||
@ -30,10 +30,10 @@
|
|||||||
|
|
||||||
<!-- Sort Button -->
|
<!-- Sort Button -->
|
||||||
<button mat-button *ngIf="vp.isMobile && hasSorting" (click)="openSortDropDown()">
|
<button mat-button *ngIf="vp.isMobile && hasSorting" (click)="openSortDropDown()">
|
||||||
<span class="upper" translate>Sort</span>
|
<span class="upper">{{ 'Sort' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-button *ngIf="!vp.isMobile && hasSorting" [matMenuTriggerFor]="menu">
|
<button mat-button *ngIf="!vp.isMobile && hasSorting" [matMenuTriggerFor]="menu">
|
||||||
<span class="upper" translate>Sort</span>
|
<span class="upper">{{ 'Sort' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<!-- Search bar -->
|
<!-- Search bar -->
|
||||||
@ -58,7 +58,7 @@
|
|||||||
|
|
||||||
<button mat-button (click)="onClearAllButton($event)" *ngIf="filterAmount">
|
<button mat-button (click)="onClearAllButton($event)" *ngIf="filterAmount">
|
||||||
<os-icon-container icon="clear">
|
<os-icon-container icon="clear">
|
||||||
<span translate>Clear all filters</span>
|
<span>{{ 'Clear all filters' | translate }}</span>
|
||||||
</os-icon-container>
|
</os-icon-container>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<div cdkDropList [cdkDropListDisabled]="!enable" (cdkDropListDropped)="drop($event)">
|
<div cdkDropList [cdkDropListDisabled]="!enable" (cdkDropListDropped)="drop($event)">
|
||||||
<div class="line" *ngIf="!sortedItems.length">
|
<div class="line" *ngIf="!sortedItems.length">
|
||||||
<span translate>No data</span>
|
<span>{{ 'No data' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
[ngClass]="isSelectedRow(i) ? 'backgroundColorSelected line' : 'backgroundColorLight line'"
|
[ngClass]="isSelectedRow(i) ? 'backgroundColorSelected line' : 'backgroundColorLight line'"
|
||||||
@ -23,7 +23,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="line" *cdkDragPreview>
|
<div class="line" *cdkDragPreview>
|
||||||
<div class="spacer.left-10" *ngIf="multiSelectedIndex.length > 0">
|
<div class="spacer.left-10" *ngIf="multiSelectedIndex.length > 0">
|
||||||
{{ multiSelectedIndex.length }} <span translate>items selected</span>
|
{{ multiSelectedIndex.length }} <span>{{ 'items selected' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
<button type="button" *ngIf="menuItem" mat-menu-item [routerLink]="listOfSpeakers.listOfSpeakersUrl">
|
<button type="button" *ngIf="menuItem" mat-menu-item [routerLink]="listOfSpeakers.listOfSpeakersUrl">
|
||||||
<mat-icon>{{ icon }}</mat-icon>
|
<mat-icon>{{ icon }}</mat-icon>
|
||||||
<span translate>List of speakers</span>
|
<span>{{ 'List of speakers' | translate }}</span>
|
||||||
<span> </span>
|
<span> </span>
|
||||||
<mat-basic-chip disableRipple class="lightblue" *ngIf="listOfSpeakers.waitingSpeakerAmount > 0">
|
<mat-basic-chip disableRipple class="lightblue" *ngIf="listOfSpeakers.waitingSpeakerAmount > 0">
|
||||||
<span>{{ listOfSpeakers.waitingSpeakerAmount }}</span>
|
<span>{{ listOfSpeakers.waitingSpeakerAmount }}</span>
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
<mat-icon [color]="user.is_present ? 'primary' : ''" class="menu-icon">
|
<mat-icon [color]="user.is_present ? 'primary' : ''" class="menu-icon">
|
||||||
{{ user.is_present ? 'check_box' : 'check_box_outline_blank' }}
|
{{ user.is_present ? 'check_box' : 'check_box_outline_blank' }}
|
||||||
</mat-icon>
|
</mat-icon>
|
||||||
<span class="menu-text" translate>Present</span>
|
<span class="menu-text">{{ 'Present' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<!-- Show profile -->
|
<!-- Show profile -->
|
||||||
<a
|
<a
|
||||||
@ -30,7 +30,7 @@
|
|||||||
mat-list-item
|
mat-list-item
|
||||||
>
|
>
|
||||||
<mat-icon class="menu-icon">person</mat-icon>
|
<mat-icon class="menu-icon">person</mat-icon>
|
||||||
<span class="menu-text" translate>Show profile</span>
|
<span class="menu-text">{{ 'Show profile' | translate }}</span>
|
||||||
</a>
|
</a>
|
||||||
<!-- Change password -->
|
<!-- Change password -->
|
||||||
<ng-container *ngIf="authType === 'default'">
|
<ng-container *ngIf="authType === 'default'">
|
||||||
@ -42,19 +42,19 @@
|
|||||||
mat-list-item
|
mat-list-item
|
||||||
>
|
>
|
||||||
<mat-icon class="menu-icon">vpn_key</mat-icon>
|
<mat-icon class="menu-icon">vpn_key</mat-icon>
|
||||||
<span class="menu-text" translate>Change password</span>
|
<span class="menu-text">{{ 'Change password' | translate }}</span>
|
||||||
</a>
|
</a>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<ng-container *ngIf="authType === 'saml'">
|
<ng-container *ngIf="authType === 'saml'">
|
||||||
<a *osPerms="'users.can_change_password'" [href]="samlChangePasswordUrl" mat-list-item>
|
<a *osPerms="'users.can_change_password'" [href]="samlChangePasswordUrl" mat-list-item>
|
||||||
<mat-icon class="menu-icon">vpn_key</mat-icon>
|
<mat-icon class="menu-icon">vpn_key</mat-icon>
|
||||||
<span class="menu-text" translate>Change password</span>
|
<span class="menu-text">{{ 'Change password' | translate }}</span>
|
||||||
</a>
|
</a>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<!-- logout -->
|
<!-- logout -->
|
||||||
<a (click)="logout()" mat-list-item>
|
<a (click)="logout()" mat-list-item>
|
||||||
<mat-icon class="menu-icon">exit_to_app</mat-icon>
|
<mat-icon class="menu-icon">exit_to_app</mat-icon>
|
||||||
<span class="menu-text" translate>Logout</span>
|
<span class="menu-text">{{ 'Logout' | translate }}</span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</mat-nav-list>
|
</mat-nav-list>
|
||||||
@ -62,7 +62,7 @@
|
|||||||
<mat-nav-list *ngIf="!isLoggedIn">
|
<mat-nav-list *ngIf="!isLoggedIn">
|
||||||
<a routerLink="/login" mat-list-item>
|
<a routerLink="/login" mat-list-item>
|
||||||
<mat-icon class="menu-icon">exit_to_app</mat-icon>
|
<mat-icon class="menu-icon">exit_to_app</mat-icon>
|
||||||
<span class="menu-text" translate>Login</span>
|
<span class="menu-text">{{ 'Login' | translate }}</span>
|
||||||
</a>
|
</a>
|
||||||
</mat-nav-list>
|
</mat-nav-list>
|
||||||
|
|
||||||
|
@ -1,15 +1,20 @@
|
|||||||
<h1 mat-dialog-title>
|
<h1 mat-dialog-title>
|
||||||
<span translate>Secret voting can not be guaranteed</span>
|
<span>{{ 'Secret voting can not be guaranteed' | translate }}</span>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<div mat-dialog-content>
|
<div mat-dialog-content>
|
||||||
<span translate>
|
<span>
|
||||||
During non-nominal voting OpenSlides does NOT store the individual user ID of the voter. This in no way means that a non-nominal vote is completely anonymous and secure. The votes cannot track their individual votes after the data has been submitted. The validity of the data cannot always be guaranteed.
|
{{
|
||||||
|
'During non-nominal voting OpenSlides does NOT store the individual user ID of the voter. This in no way means
|
||||||
|
that a non-nominal vote is completely anonymous and secure. The votes cannot track their individual votes after
|
||||||
|
the data has been submitted. The validity of the data cannot always be guaranteed.'
|
||||||
|
| translate
|
||||||
|
}}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div mat-dialog-actions>
|
<div mat-dialog-actions>
|
||||||
<button type="button" mat-button [mat-dialog-close]="null">
|
<button type="button" mat-button [mat-dialog-close]="null">
|
||||||
<span translate>I know the risk</span>
|
<span>{{ 'I know the risk' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
<os-head-bar [hasMainButton]="canManage" (mainEvent)="onPlusButton()" [multiSelectMode]="isMultiSelect">
|
<os-head-bar [hasMainButton]="canManage" (mainEvent)="onPlusButton()" [multiSelectMode]="isMultiSelect">
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot"><h2 translate>Agenda</h2></div>
|
<div class="title-slot">
|
||||||
|
<h2>{{ 'Agenda' | translate }}</h2>
|
||||||
|
</div>
|
||||||
<!-- Menu -->
|
<!-- Menu -->
|
||||||
<div class="menu-slot">
|
<div class="menu-slot">
|
||||||
<button type="button" mat-icon-button [matMenuTriggerFor]="agendaMenu"><mat-icon>more_vert</mat-icon></button>
|
<button type="button" mat-icon-button [matMenuTriggerFor]="agendaMenu"><mat-icon>more_vert</mat-icon></button>
|
||||||
@ -9,7 +11,7 @@
|
|||||||
<!-- Multiselect info -->
|
<!-- Multiselect info -->
|
||||||
<div class="central-info-slot">
|
<div class="central-info-slot">
|
||||||
<button mat-icon-button (click)="toggleMultiSelect()"><mat-icon>arrow_back</mat-icon></button>
|
<button mat-icon-button (click)="toggleMultiSelect()"><mat-icon>arrow_back</mat-icon></button>
|
||||||
<span>{{ selectedRows.length }} </span><span translate>selected</span>
|
<span>{{ selectedRows.length }} </span><span>{{ 'selected' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
</os-head-bar>
|
</os-head-bar>
|
||||||
|
|
||||||
@ -79,17 +81,17 @@
|
|||||||
<!-- Enable multi select -->
|
<!-- Enable multi select -->
|
||||||
<button mat-menu-item (click)="toggleMultiSelect()">
|
<button mat-menu-item (click)="toggleMultiSelect()">
|
||||||
<mat-icon>library_add</mat-icon>
|
<mat-icon>library_add</mat-icon>
|
||||||
<span translate>Multiselect</span>
|
<span>{{ 'Multiselect' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<!-- automatic numbering -->
|
<!-- automatic numbering -->
|
||||||
<button mat-menu-item *ngIf="isNumberingAllowed" (click)="onAutoNumbering()">
|
<button mat-menu-item *ngIf="isNumberingAllowed" (click)="onAutoNumbering()">
|
||||||
<mat-icon>format_list_numbered</mat-icon>
|
<mat-icon>format_list_numbered</mat-icon>
|
||||||
<span translate>Numbering</span>
|
<span>{{ 'Numbering' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-menu-item routerLink="sort-agenda">
|
<button mat-menu-item routerLink="sort-agenda">
|
||||||
<mat-icon>sort</mat-icon>
|
<mat-icon>sort</mat-icon>
|
||||||
<span translate>Sort</span>
|
<span>{{ 'Sort' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -99,28 +101,28 @@
|
|||||||
<!-- Current list of speakers -->
|
<!-- Current list of speakers -->
|
||||||
<button mat-menu-item *osPerms="'agenda.can_see_list_of_speakers'" routerLink="speakers">
|
<button mat-menu-item *osPerms="'agenda.can_see_list_of_speakers'" routerLink="speakers">
|
||||||
<mat-icon>mic</mat-icon>
|
<mat-icon>mic</mat-icon>
|
||||||
<span translate>Current list of speakers</span>
|
<span>{{ 'Current list of speakers' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<!-- CSV export -->
|
<!-- CSV export -->
|
||||||
<button mat-menu-item *osPerms="'agenda.can_manage'" (click)="csvExportItemList()">
|
<button mat-menu-item *osPerms="'agenda.can_manage'" (click)="csvExportItemList()">
|
||||||
<mat-icon>archive</mat-icon>
|
<mat-icon>archive</mat-icon>
|
||||||
<span translate>Export as CSV</span>
|
<span>{{ 'Export as CSV' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<!-- PDF export -->
|
<!-- PDF export -->
|
||||||
<button mat-menu-item (click)="onDownloadPdf()">
|
<button mat-menu-item (click)="onDownloadPdf()">
|
||||||
<mat-icon>picture_as_pdf</mat-icon>
|
<mat-icon>picture_as_pdf</mat-icon>
|
||||||
<span translate>Export as PDF</span>
|
<span>{{ 'Export as PDF' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<!-- Import -->
|
<!-- Import -->
|
||||||
<button mat-menu-item *osPerms="'agenda.can_manage'" routerLink="import">
|
<button mat-menu-item *osPerms="'agenda.can_manage'" routerLink="import">
|
||||||
<mat-icon>cloud_upload</mat-icon>
|
<mat-icon>cloud_upload</mat-icon>
|
||||||
<span translate>Import</span>
|
<span>{{ 'Import' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
<!-- Settings -->
|
<!-- Settings -->
|
||||||
<button mat-menu-item *osPerms="'core.can_manage_config'" routerLink="/settings/agenda">
|
<button mat-menu-item *osPerms="'core.can_manage_config'" routerLink="/settings/agenda">
|
||||||
<mat-icon>settings</mat-icon>
|
<mat-icon>settings</mat-icon>
|
||||||
<span translate>Settings</span>
|
<span>{{ 'Settings' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -128,26 +130,26 @@
|
|||||||
<!-- Select all -->
|
<!-- Select all -->
|
||||||
<button mat-menu-item (click)="selectAll()">
|
<button mat-menu-item (click)="selectAll()">
|
||||||
<mat-icon>done_all</mat-icon>
|
<mat-icon>done_all</mat-icon>
|
||||||
<span translate>Select all</span>
|
<span>{{ 'Select all' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<!-- Deselect all -->
|
<!-- Deselect all -->
|
||||||
<button mat-menu-item [disabled]="!selectedRows.length" (click)="deselectAll()">
|
<button mat-menu-item [disabled]="!selectedRows.length" (click)="deselectAll()">
|
||||||
<mat-icon>clear</mat-icon>
|
<mat-icon>clear</mat-icon>
|
||||||
<span translate>Deselect all</span>
|
<span>{{ 'Deselect all' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
<div *osPerms="'agenda.can_manage'">
|
<div *osPerms="'agenda.can_manage'">
|
||||||
<!-- Close selected -->
|
<!-- Close selected -->
|
||||||
<button mat-menu-item [disabled]="!selectedRows.length" (click)="setClosedSelected(true)">
|
<button mat-menu-item [disabled]="!selectedRows.length" (click)="setClosedSelected(true)">
|
||||||
<mat-icon>done</mat-icon>
|
<mat-icon>done</mat-icon>
|
||||||
<span translate>Close</span>
|
<span>{{ 'Close' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<!-- Open selected -->
|
<!-- Open selected -->
|
||||||
<button mat-menu-item [disabled]="!selectedRows.length" (click)="setClosedSelected(false)">
|
<button mat-menu-item [disabled]="!selectedRows.length" (click)="setClosedSelected(false)">
|
||||||
<mat-icon>redo</mat-icon>
|
<mat-icon>redo</mat-icon>
|
||||||
<span translate>Open</span>
|
<span>{{ 'Open' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
@ -155,26 +157,26 @@
|
|||||||
<!-- Set multiple to public -->
|
<!-- Set multiple to public -->
|
||||||
<button mat-menu-item [disabled]="!selectedRows.length" (click)="setAgendaType(1)">
|
<button mat-menu-item [disabled]="!selectedRows.length" (click)="setAgendaType(1)">
|
||||||
<mat-icon>public</mat-icon>
|
<mat-icon>public</mat-icon>
|
||||||
<span translate>Set public</span>
|
<span>{{ 'Set public' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<!-- Set multiple to internal -->
|
<!-- Set multiple to internal -->
|
||||||
<button mat-menu-item [disabled]="!selectedRows.length" (click)="setAgendaType(2)">
|
<button mat-menu-item [disabled]="!selectedRows.length" (click)="setAgendaType(2)">
|
||||||
<mat-icon>visibility</mat-icon>
|
<mat-icon>visibility</mat-icon>
|
||||||
<span translate>Set internal</span>
|
<span>{{ 'Set internal' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<!-- Set multiple to hidden -->
|
<!-- Set multiple to hidden -->
|
||||||
<button mat-menu-item [disabled]="!selectedRows.length" (click)="setAgendaType(3)">
|
<button mat-menu-item [disabled]="!selectedRows.length" (click)="setAgendaType(3)">
|
||||||
<mat-icon>visibility_off</mat-icon>
|
<mat-icon>visibility_off</mat-icon>
|
||||||
<span translate>Set hidden</span>
|
<span>{{ 'Set hidden' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
|
|
||||||
<!-- Delete selected -->
|
<!-- Delete selected -->
|
||||||
<button mat-menu-item [disabled]="!selectedRows.length" (click)="removeSelected()">
|
<button mat-menu-item [disabled]="!selectedRows.length" (click)="removeSelected()">
|
||||||
<mat-icon>remove</mat-icon>
|
<mat-icon>remove</mat-icon>
|
||||||
<span translate>Remove from agenda</span>
|
<span>{{ 'Remove from agenda' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -193,13 +195,13 @@
|
|||||||
<!-- Done check -->
|
<!-- Done check -->
|
||||||
<button mat-menu-item (click)="onDoneSingleButton(item)">
|
<button mat-menu-item (click)="onDoneSingleButton(item)">
|
||||||
<mat-icon color="accent"> {{ item.closed ? 'check_box' : 'check_box_outline_blank' }} </mat-icon>
|
<mat-icon color="accent"> {{ item.closed ? 'check_box' : 'check_box_outline_blank' }} </mat-icon>
|
||||||
<span translate>Done</span>
|
<span>{{ 'Done' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<!-- Edit button -->
|
<!-- Edit button -->
|
||||||
<button mat-menu-item (click)="openEditInfo(item, $event)">
|
<button mat-menu-item (click)="openEditInfo(item, $event)">
|
||||||
<mat-icon>edit</mat-icon>
|
<mat-icon>edit</mat-icon>
|
||||||
<span translate>Edit details</span>
|
<span>{{ 'Edit details' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<!-- Delete Button -->
|
<!-- Delete Button -->
|
||||||
@ -209,7 +211,7 @@
|
|||||||
*ngIf="item.contentObjectData.collection !== 'topics/topic'"
|
*ngIf="item.contentObjectData.collection !== 'topics/topic'"
|
||||||
>
|
>
|
||||||
<mat-icon>remove</mat-icon>
|
<mat-icon>remove</mat-icon>
|
||||||
<span translate>Remove from agenda</span>
|
<span>{{ 'Remove from agenda' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
@ -219,7 +221,7 @@
|
|||||||
*ngIf="item.contentObjectData.collection === 'topics/topic'"
|
*ngIf="item.contentObjectData.collection === 'topics/topic'"
|
||||||
>
|
>
|
||||||
<mat-icon>delete</mat-icon>
|
<mat-icon>delete</mat-icon>
|
||||||
<span translate>Delete</span>
|
<span>{{ 'Delete' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { Component, OnInit } from '@angular/core';
|
import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
|
||||||
import { MatDialog } from '@angular/material/dialog';
|
import { MatDialog } from '@angular/material/dialog';
|
||||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||||
import { Title } from '@angular/platform-browser';
|
import { Title } from '@angular/platform-browser';
|
||||||
@ -36,6 +36,7 @@ import { ViewListOfSpeakers } from '../../models/view-list-of-speakers';
|
|||||||
@Component({
|
@Component({
|
||||||
selector: 'os-agenda-list',
|
selector: 'os-agenda-list',
|
||||||
templateUrl: './agenda-list.component.html',
|
templateUrl: './agenda-list.component.html',
|
||||||
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||||
styleUrls: ['./agenda-list.component.scss']
|
styleUrls: ['./agenda-list.component.scss']
|
||||||
})
|
})
|
||||||
export class AgendaListComponent extends BaseListViewComponent<ViewItem> implements OnInit {
|
export class AgendaListComponent extends BaseListViewComponent<ViewItem> implements OnInit {
|
||||||
|
@ -1,11 +1,8 @@
|
|||||||
<os-head-bar
|
<os-head-bar [nav]="false" [editMode]="hasChanged" (mainEvent)="onCancel()" (saveEvent)="onSave()">
|
||||||
[nav]="false"
|
|
||||||
[editMode]="hasChanged"
|
|
||||||
(mainEvent)="onCancel()"
|
|
||||||
(saveEvent)="onSave()">
|
|
||||||
|
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot"><h2 translate>Sort agenda</h2></div>
|
<div class="title-slot">
|
||||||
|
<h2>{{ 'Sort agenda' | translate }}</h2>
|
||||||
|
</div>
|
||||||
</os-head-bar>
|
</os-head-bar>
|
||||||
<div class="custom-table-header sort-header">
|
<div class="custom-table-header sort-header">
|
||||||
<div class="button-menu left">
|
<div class="button-menu left">
|
||||||
@ -13,7 +10,10 @@
|
|||||||
<button mat-button (click)="onStateChange(false)">{{ 'Collapse all' | translate }}</button>
|
<button mat-button (click)="onStateChange(false)">{{ 'Collapse all' | translate }}</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="current-filters" *ngIf="hasActiveFilter">
|
<div class="current-filters" *ngIf="hasActiveFilter">
|
||||||
<div><span translate>Active filters</span>: </div>
|
<div>
|
||||||
|
<span>{{ 'Active filters' | translate }}</span
|
||||||
|
>:
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<button mat-button (click)="resetFilters()">
|
<button mat-button (click)="resetFilters()">
|
||||||
<mat-icon inline>cancel</mat-icon>
|
<mat-icon inline>cancel</mat-icon>
|
||||||
@ -22,7 +22,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="button-menu right">
|
<div class="button-menu right">
|
||||||
<button mat-button (click)="visibilityFilter.opened ? visibilityFilter.close() : visibilityFilter.open()">Filter</button>
|
<button mat-button (click)="visibilityFilter.opened ? visibilityFilter.close() : visibilityFilter.open()">
|
||||||
|
Filter
|
||||||
|
</button>
|
||||||
<mat-drawer #visibilityFilter mode="over" position="end">
|
<mat-drawer #visibilityFilter mode="over" position="end">
|
||||||
<section class="sort-drawer-content">
|
<section class="sort-drawer-content">
|
||||||
<button mat-button (click)="visibilityFilter.toggle()">
|
<button mat-button (click)="visibilityFilter.toggle()">
|
||||||
@ -31,8 +33,13 @@
|
|||||||
<span class="sort-grid">
|
<span class="sort-grid">
|
||||||
<div class="hint">{{ 'Visibility' | translate }}</div>
|
<div class="hint">{{ 'Visibility' | translate }}</div>
|
||||||
<div>
|
<div>
|
||||||
<mat-checkbox *ngFor="let option of filterOptions" [(ngModel)]="option.state" (change)="onFilterChange(option.id)">
|
<mat-checkbox
|
||||||
<mat-icon matTooltip="{{ option.label | translate }}">{{ getIcon(option.label) }}</mat-icon> {{ option.label | translate }}
|
*ngFor="let option of filterOptions"
|
||||||
|
[(ngModel)]="option.state"
|
||||||
|
(change)="onFilterChange(option.id)"
|
||||||
|
>
|
||||||
|
<mat-icon matTooltip="{{ option.label | translate }}">{{ getIcon(option.label) }}</mat-icon>
|
||||||
|
{{ option.label | translate }}
|
||||||
</mat-checkbox>
|
</mat-checkbox>
|
||||||
</div>
|
</div>
|
||||||
</span>
|
</span>
|
||||||
@ -42,8 +49,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<mat-card>
|
<mat-card>
|
||||||
<div class="current-nodes">
|
<div class="current-nodes">
|
||||||
{{ seenNodes[0] }} <span translate>of</span> {{ seenNodes[1] }}
|
{{ seenNodes[0] }} <span>{{ 'of' | translate }}</span> {{ seenNodes[1] }}
|
||||||
<span translate>items</span>
|
<span>{{ 'items' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
<os-sorting-tree
|
<os-sorting-tree
|
||||||
#osSortedTree
|
#osSortedTree
|
||||||
|
@ -13,9 +13,9 @@
|
|||||||
<!-- Duration -->
|
<!-- Duration -->
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<input type="string" matInput placeholder="{{ 'Duration' | translate }}" formControlName="durationText" />
|
<input type="string" matInput placeholder="{{ 'Duration' | translate }}" formControlName="durationText" />
|
||||||
<mat-error *ngIf="agendaInfoForm.invalid"
|
<mat-error *ngIf="agendaInfoForm.invalid">
|
||||||
>Your input does not match the following structure 'hh:mm'...</mat-error
|
{{ 'Your input does not match the following structure: "hh:mm"' | translate }}
|
||||||
>
|
</mat-error>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
|
|
||||||
<!-- Item number (prefix) -->
|
<!-- Item number (prefix) -->
|
||||||
@ -37,6 +37,10 @@
|
|||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div mat-dialog-actions>
|
<div mat-dialog-actions>
|
||||||
<button mat-button (click)="saveItemInfo()" [disabled]="agendaInfoForm.invalid"><span translate>Save</span></button>
|
<button mat-button (click)="saveItemInfo()" [disabled]="agendaInfoForm.invalid">
|
||||||
<button mat-button (click)="onCancelButton()"><span translate>Cancel</span></button>
|
<span>{{ 'Save' | translate }}</span>
|
||||||
|
</button>
|
||||||
|
<button mat-button (click)="onCancelButton()">
|
||||||
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -8,9 +8,9 @@
|
|||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot">
|
<div class="title-slot">
|
||||||
<h2>
|
<h2>
|
||||||
<span *ngIf="!isCurrentListOfSpeakers && !isSortMode" translate>List of speakers</span>
|
<span *ngIf="!isCurrentListOfSpeakers && !isSortMode">{{ 'List of speakers' | translate }}</span>
|
||||||
<span *ngIf="isCurrentListOfSpeakers && !isSortMode" translate>Current list of speakers</span>
|
<span *ngIf="isCurrentListOfSpeakers && !isSortMode">{{ 'Current list of speakers' | translate }}</span>
|
||||||
<span *ngIf="isSortMode" translate>Sort list of speakers</span>
|
<span *ngIf="isSortMode">{{ 'Sort list of speakers' | translate }}</span>
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="menu-slot" *osPerms="['agenda.can_manage_list_of_speakers', 'core.can_manage_projector']">
|
<div class="menu-slot" *osPerms="['agenda.can_manage_list_of_speakers', 'core.can_manage_projector']">
|
||||||
@ -39,7 +39,7 @@
|
|||||||
<!-- List of finished speakers -->
|
<!-- List of finished speakers -->
|
||||||
<mat-expansion-panel *ngIf="finishedSpeakers && finishedSpeakers.length > 0" class="finished-list">
|
<mat-expansion-panel *ngIf="finishedSpeakers && finishedSpeakers.length > 0" class="finished-list">
|
||||||
<mat-expansion-panel-header>
|
<mat-expansion-panel-header>
|
||||||
<mat-panel-title translate> Last speakers </mat-panel-title>
|
<mat-panel-title>{{ 'Last speakers' | translate }}</mat-panel-title>
|
||||||
</mat-expansion-panel-header>
|
</mat-expansion-panel-header>
|
||||||
<mat-list>
|
<mat-list>
|
||||||
<mat-list-item *ngFor="let speaker of finishedSpeakers; let number = index">
|
<mat-list-item *ngFor="let speaker of finishedSpeakers; let number = index">
|
||||||
@ -96,7 +96,7 @@
|
|||||||
<ng-template let-speaker>
|
<ng-template let-speaker>
|
||||||
<span *osPerms="'agenda.can_manage_list_of_speakers'">
|
<span *osPerms="'agenda.can_manage_list_of_speakers'">
|
||||||
<span *ngIf="hasSpokenCount(speaker)" class="red-warning-text speaker-warning">
|
<span *ngIf="hasSpokenCount(speaker)" class="red-warning-text speaker-warning">
|
||||||
{{ hasSpokenCount(speaker) + 1 }}. <span translate>contribution</span>
|
{{ hasSpokenCount(speaker) + 1 }}. <span>{{ 'contribution' | translate }}</span>
|
||||||
</span>
|
</span>
|
||||||
<span *ngIf="speaker.gender">({{ speaker.gender | translate }})</span>
|
<span *ngIf="speaker.gender">({{ speaker.gender | translate }})</span>
|
||||||
</span>
|
</span>
|
||||||
@ -154,11 +154,11 @@
|
|||||||
*ngIf="!isOpInList() && canAddSelf"
|
*ngIf="!isOpInList() && canAddSelf"
|
||||||
>
|
>
|
||||||
<mat-icon>add</mat-icon>
|
<mat-icon>add</mat-icon>
|
||||||
<span translate>Add me</span>
|
<span>{{ 'Add me' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-stroked-button (click)="onDeleteButton()" *ngIf="isOpInList()">
|
<button mat-stroked-button (click)="onDeleteButton()" *ngIf="isOpInList()">
|
||||||
<mat-icon>remove</mat-icon>
|
<mat-icon>remove</mat-icon>
|
||||||
<span translate>Remove me</span>
|
<span>{{ 'Remove me' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -167,7 +167,7 @@
|
|||||||
<mat-menu #speakerMenu="matMenu">
|
<mat-menu #speakerMenu="matMenu">
|
||||||
<button mat-menu-item (click)="isSortMode = true">
|
<button mat-menu-item (click)="isSortMode = true">
|
||||||
<mat-icon>sort</mat-icon>
|
<mat-icon>sort</mat-icon>
|
||||||
<span translate>Sort</span>
|
<span>{{ 'Sort' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<os-projector-button
|
<os-projector-button
|
||||||
@ -193,18 +193,18 @@
|
|||||||
|
|
||||||
<button mat-menu-item *ngIf="isListOfSpeakersClosed" (click)="openSpeakerList()">
|
<button mat-menu-item *ngIf="isListOfSpeakersClosed" (click)="openSpeakerList()">
|
||||||
<mat-icon>lock_open</mat-icon>
|
<mat-icon>lock_open</mat-icon>
|
||||||
<span translate>Open list of speakers</span>
|
<span>{{ 'Open list of speakers' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<button mat-menu-item *ngIf="!isListOfSpeakersClosed" (click)="closeSpeakerList()">
|
<button mat-menu-item *ngIf="!isListOfSpeakersClosed" (click)="closeSpeakerList()">
|
||||||
<mat-icon>lock</mat-icon>
|
<mat-icon>lock</mat-icon>
|
||||||
<span translate>Close list of speakers</span>
|
<span>{{ 'Close list of speakers' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<mat-divider *ngIf="!isListOfSpeakersEmpty"></mat-divider>
|
<mat-divider *ngIf="!isListOfSpeakersEmpty"></mat-divider>
|
||||||
|
|
||||||
<button mat-menu-item (click)="clearSpeakerList()" *ngIf="!isListOfSpeakersEmpty" class="red-warning-text">
|
<button mat-menu-item (click)="clearSpeakerList()" *ngIf="!isListOfSpeakersEmpty" class="red-warning-text">
|
||||||
<mat-icon>delete</mat-icon>
|
<mat-icon>delete</mat-icon>
|
||||||
<span translate>Remove all speakers</span>
|
<span>{{ 'Remove all speakers' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
|
@ -9,8 +9,8 @@
|
|||||||
>
|
>
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot">
|
<div class="title-slot">
|
||||||
<h2 *ngIf="!newAssignment" translate>Election</h2>
|
<h2 *ngIf="!newAssignment">{{ 'Election' | translate }}</h2>
|
||||||
<h2 *ngIf="newAssignment" translate>New election</h2>
|
<h2 *ngIf="newAssignment">{{ 'New election' | translate }}</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Menu -->
|
<!-- Menu -->
|
||||||
@ -25,7 +25,7 @@
|
|||||||
<!-- PDF -->
|
<!-- PDF -->
|
||||||
<button mat-menu-item (click)="onDownloadPdf()">
|
<button mat-menu-item (click)="onDownloadPdf()">
|
||||||
<mat-icon>picture_as_pdf</mat-icon>
|
<mat-icon>picture_as_pdf</mat-icon>
|
||||||
<span translate>PDF</span>
|
<span>{{ 'PDF' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<!-- List of speakers -->
|
<!-- List of speakers -->
|
||||||
<os-speaker-button [object]="assignment" [menuItem]="true"></os-speaker-button>
|
<os-speaker-button [object]="assignment" [menuItem]="true"></os-speaker-button>
|
||||||
@ -37,11 +37,11 @@
|
|||||||
<div *osPerms="'agenda.can_manage'">
|
<div *osPerms="'agenda.can_manage'">
|
||||||
<button mat-menu-item (click)="addToAgenda()" *ngIf="assignment && !assignment.item">
|
<button mat-menu-item (click)="addToAgenda()" *ngIf="assignment && !assignment.item">
|
||||||
<mat-icon>add</mat-icon>
|
<mat-icon>add</mat-icon>
|
||||||
<span translate>Add to agenda</span>
|
<span>{{ 'Add to agenda' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-menu-item (click)="removeFromAgenda()" *ngIf="assignment && assignment.item">
|
<button mat-menu-item (click)="removeFromAgenda()" *ngIf="assignment && assignment.item">
|
||||||
<mat-icon>remove</mat-icon>
|
<mat-icon>remove</mat-icon>
|
||||||
<span translate>Remove from agenda</span>
|
<span>{{ 'Remove from agenda' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -51,7 +51,7 @@
|
|||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
<button mat-menu-item class="red-warning-text" (click)="onDeleteAssignmentButton()">
|
<button mat-menu-item class="red-warning-text" (click)="onDeleteAssignmentButton()">
|
||||||
<mat-icon>delete</mat-icon>
|
<mat-icon>delete</mat-icon>
|
||||||
<span translate>Delete</span>
|
<span>{{ 'Delete' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
@ -76,7 +76,7 @@
|
|||||||
<div class="new-ballot-button" *ngIf="assignment && hasPerms('createPoll')">
|
<div class="new-ballot-button" *ngIf="assignment && hasPerms('createPoll')">
|
||||||
<button mat-stroked-button (click)="openDialog()">
|
<button mat-stroked-button (click)="openDialog()">
|
||||||
<mat-icon>add</mat-icon>
|
<mat-icon>add</mat-icon>
|
||||||
<span translate>New ballot</span>
|
<span>{{ 'New ballot' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -98,11 +98,11 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="meta-info-grid">
|
<div class="meta-info-grid">
|
||||||
<div class="number-of-elected">
|
<div class="number-of-elected">
|
||||||
<h4 translate>Number of persons to be elected</h4>
|
<h4>{{ 'Number of persons to be elected' | translate }}</h4>
|
||||||
<span>{{ assignment.assignment.open_posts }}</span>
|
<span>{{ assignment.assignment.open_posts }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="current-phase">
|
<div class="current-phase">
|
||||||
<h4 translate>Phase</h4>
|
<h4>{{ 'Phase' | translate }}</h4>
|
||||||
<mat-basic-chip
|
<mat-basic-chip
|
||||||
*ngIf="hasPerms('manage')"
|
*ngIf="hasPerms('manage')"
|
||||||
[matMenuTriggerFor]="phaseMenu"
|
[matMenuTriggerFor]="phaseMenu"
|
||||||
@ -123,7 +123,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div *ngIf="assignment.attachments.length">
|
<div *ngIf="assignment.attachments.length">
|
||||||
<h4 translate>Election documents</h4>
|
<h4>{{ 'Election documents' | translate }}</h4>
|
||||||
<mat-list dense class="election-document-list">
|
<mat-list dense class="election-document-list">
|
||||||
<mat-list-item *ngFor="let file of assignment.attachments">
|
<mat-list-item *ngFor="let file of assignment.attachments">
|
||||||
<a [routerLink]="file.url" target="_blank">{{ file.getTitle() }}</a>
|
<a [routerLink]="file.url" target="_blank">{{ file.getTitle() }}</a>
|
||||||
@ -136,7 +136,7 @@
|
|||||||
<ng-template #candidatesTemplate>
|
<ng-template #candidatesTemplate>
|
||||||
<mat-card class="os-card" *ngIf="assignment && !assignment.isFinished">
|
<mat-card class="os-card" *ngIf="assignment && !assignment.isFinished">
|
||||||
<ng-container>
|
<ng-container>
|
||||||
<h3 translate>Candidates</h3>
|
<h3>{{ 'Candidates' | translate }}</h3>
|
||||||
<div>
|
<div>
|
||||||
<div
|
<div
|
||||||
class="candidates-list"
|
class="candidates-list"
|
||||||
@ -196,11 +196,11 @@
|
|||||||
<div>
|
<div>
|
||||||
<button mat-button color="accent" (click)="addSelf()" *ngIf="!isSelfCandidate">
|
<button mat-button color="accent" (click)="addSelf()" *ngIf="!isSelfCandidate">
|
||||||
<mat-icon>add</mat-icon>
|
<mat-icon>add</mat-icon>
|
||||||
<span translate>Add me</span>
|
<span>{{ 'Add me' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-button color="accent" (click)="removeSelf()" *ngIf="isSelfCandidate">
|
<button mat-button color="accent" (click)="removeSelf()" *ngIf="isSelfCandidate">
|
||||||
<mat-icon>remove</mat-icon>
|
<mat-icon>remove</mat-icon>
|
||||||
<span translate>Remove me</span>
|
<span>{{ 'Remove me' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -291,7 +291,7 @@
|
|||||||
<!-- Number candidates -->
|
<!-- Number candidates -->
|
||||||
<div>
|
<div>
|
||||||
<mat-checkbox formControlName="number_poll_candidates">
|
<mat-checkbox formControlName="number_poll_candidates">
|
||||||
<span translate>Number candidates</span>
|
<span>{{ 'Number candidates' | translate }}</span>
|
||||||
</mat-checkbox>
|
</mat-checkbox>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
@ -4,7 +4,9 @@
|
|||||||
[multiSelectMode]="isMultiSelect"
|
[multiSelectMode]="isMultiSelect"
|
||||||
>
|
>
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot"><h2 translate>Elections</h2></div>
|
<div class="title-slot">
|
||||||
|
<h2>{{ 'Elections' | translate }}</h2>
|
||||||
|
</div>
|
||||||
<!-- Menu -->
|
<!-- Menu -->
|
||||||
<div class="menu-slot">
|
<div class="menu-slot">
|
||||||
<button type="button" mat-icon-button [matMenuTriggerFor]="assignmentMenu">
|
<button type="button" mat-icon-button [matMenuTriggerFor]="assignmentMenu">
|
||||||
@ -15,7 +17,7 @@
|
|||||||
<!-- Multiselect info -->
|
<!-- Multiselect info -->
|
||||||
<div class="central-info-slot">
|
<div class="central-info-slot">
|
||||||
<button mat-icon-button (click)="toggleMultiSelect()"><mat-icon>arrow_back</mat-icon></button>
|
<button mat-icon-button (click)="toggleMultiSelect()"><mat-icon>arrow_back</mat-icon></button>
|
||||||
<span>{{ selectedRows.length }} </span><span translate>selected</span>
|
<span>{{ selectedRows.length }} </span><span>{{ 'selected' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
</os-head-bar>
|
</os-head-bar>
|
||||||
|
|
||||||
@ -90,28 +92,28 @@
|
|||||||
<div *ngIf="!isMultiSelect">
|
<div *ngIf="!isMultiSelect">
|
||||||
<button mat-menu-item *osPerms="'assignment.can_manage'" (click)="toggleMultiSelect()">
|
<button mat-menu-item *osPerms="'assignment.can_manage'" (click)="toggleMultiSelect()">
|
||||||
<mat-icon>library_add</mat-icon>
|
<mat-icon>library_add</mat-icon>
|
||||||
<span translate>Multiselect</span>
|
<span>{{ 'Multiselect' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-menu-item (click)="downloadAssignmentButton()">
|
<button mat-menu-item (click)="downloadAssignmentButton()">
|
||||||
<mat-icon>archive</mat-icon>
|
<mat-icon>archive</mat-icon>
|
||||||
<span translate>Export ...</span>
|
<span>{{ 'Export ...' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
<!-- Settings -->
|
<!-- Settings -->
|
||||||
<button mat-menu-item *osPerms="'core.can_manage_config'" routerLink="/settings/elections">
|
<button mat-menu-item *osPerms="'core.can_manage_config'" routerLink="/settings/elections">
|
||||||
<mat-icon>settings</mat-icon>
|
<mat-icon>settings</mat-icon>
|
||||||
<span translate>Settings</span>
|
<span>{{ 'Settings' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div *ngIf="isMultiSelect">
|
<div *ngIf="isMultiSelect">
|
||||||
<button mat-menu-item (click)="selectAll()">
|
<button mat-menu-item (click)="selectAll()">
|
||||||
<mat-icon>done_all</mat-icon>
|
<mat-icon>done_all</mat-icon>
|
||||||
<span translate>Select all</span>
|
<span>{{ 'Select all' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-menu-item [disabled]="!selectedRows.length" (click)="deselectAll()">
|
<button mat-menu-item [disabled]="!selectedRows.length" (click)="deselectAll()">
|
||||||
<mat-icon>clear</mat-icon>
|
<mat-icon>clear</mat-icon>
|
||||||
<span translate>Deselect all</span>
|
<span>{{ 'Deselect all' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
<button
|
<button
|
||||||
@ -132,7 +134,7 @@
|
|||||||
(click)="deleteSelected()"
|
(click)="deleteSelected()"
|
||||||
>
|
>
|
||||||
<mat-icon>delete</mat-icon>
|
<mat-icon>delete</mat-icon>
|
||||||
<span translate>Delete</span>
|
<span>{{ 'Delete' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { Component, OnInit } from '@angular/core';
|
import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
|
||||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||||
import { Title } from '@angular/platform-browser';
|
import { Title } from '@angular/platform-browser';
|
||||||
import { ActivatedRoute, Router } from '@angular/router';
|
import { ActivatedRoute, Router } from '@angular/router';
|
||||||
@ -23,6 +23,7 @@ import { AssignmentPhases, ViewAssignment } from '../../models/view-assignment';
|
|||||||
@Component({
|
@Component({
|
||||||
selector: 'os-assignment-list',
|
selector: 'os-assignment-list',
|
||||||
templateUrl: './assignment-list.component.html',
|
templateUrl: './assignment-list.component.html',
|
||||||
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||||
styleUrls: ['./assignment-list.component.scss']
|
styleUrls: ['./assignment-list.component.scss']
|
||||||
})
|
})
|
||||||
export class AssignmentListComponent extends BaseListViewComponent<ViewAssignment> implements OnInit {
|
export class AssignmentListComponent extends BaseListViewComponent<ViewAssignment> implements OnInit {
|
||||||
|
@ -111,7 +111,7 @@
|
|||||||
<os-projector-button [menuItem]="true" [object]="poll" *osPerms="'core.can_manage_projector'"></os-projector-button>
|
<os-projector-button [menuItem]="true" [object]="poll" *osPerms="'core.can_manage_projector'"></os-projector-button>
|
||||||
<button *osPerms="'assignments.can_manage'" mat-menu-item (click)="openDialog(poll)">
|
<button *osPerms="'assignments.can_manage'" mat-menu-item (click)="openDialog(poll)">
|
||||||
<mat-icon>edit</mat-icon>
|
<mat-icon>edit</mat-icon>
|
||||||
<span translate>Edit</span>
|
<span>{{ 'Edit' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
mat-menu-item
|
mat-menu-item
|
||||||
@ -119,11 +119,11 @@
|
|||||||
(click)="pseudoanonymizePoll()"
|
(click)="pseudoanonymizePoll()"
|
||||||
>
|
>
|
||||||
<mat-icon>warning</mat-icon>
|
<mat-icon>warning</mat-icon>
|
||||||
<span translate>Anonymize votes</span>
|
<span>{{ 'Anonymize votes' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
<button *osPerms="'assignments.can_manage'" mat-menu-item (click)="deletePoll()">
|
<button *osPerms="'assignments.can_manage'" mat-menu-item (click)="deletePoll()">
|
||||||
<mat-icon color="warn">delete</mat-icon>
|
<mat-icon color="warn">delete</mat-icon>
|
||||||
<span translate>Delete</span>
|
<span>{{ 'Delete' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
|
@ -68,11 +68,9 @@
|
|||||||
<!-- Publish Check -->
|
<!-- Publish Check -->
|
||||||
<div class="spacer-top-20">
|
<div class="spacer-top-20">
|
||||||
<mat-checkbox [(ngModel)]="publishImmediately" (change)="publishStateChanged($event.checked)">
|
<mat-checkbox [(ngModel)]="publishImmediately" (change)="publishStateChanged($event.checked)">
|
||||||
<span translate>Publish immediately</span>
|
<span>{{ 'Publish immediately' | translate }}</span>
|
||||||
</mat-checkbox>
|
</mat-checkbox>
|
||||||
<mat-error *ngIf="!dialogVoteForm.valid" translate>
|
<mat-error *ngIf="!dialogVoteForm.valid"> {{ 'Error in form field.' | translate }}</mat-error>
|
||||||
Error in form field.
|
|
||||||
</mat-error>
|
|
||||||
</div>
|
</div>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
@ -85,11 +83,11 @@
|
|||||||
*ngIf="pollForm && dialogVoteForm && pollForm.contentForm"
|
*ngIf="pollForm && dialogVoteForm && pollForm.contentForm"
|
||||||
[disabled]="pollForm.contentForm.invalid || dialogVoteForm.invalid"
|
[disabled]="pollForm.contentForm.invalid || dialogVoteForm.invalid"
|
||||||
>
|
>
|
||||||
<span translate>Save</span>
|
<span>{{ 'Save' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<!-- Cancel Button -->
|
<!-- Cancel Button -->
|
||||||
<button mat-button [mat-dialog-close]="false">
|
<button mat-button [mat-dialog-close]="false">
|
||||||
<span translate>Cancel</span>
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -103,7 +103,7 @@
|
|||||||
<div *osPerms="'assignments.can_manage'">
|
<div *osPerms="'assignments.can_manage'">
|
||||||
<button mat-menu-item (click)="openDialog()">
|
<button mat-menu-item (click)="openDialog()">
|
||||||
<mat-icon>edit</mat-icon>
|
<mat-icon>edit</mat-icon>
|
||||||
<span translate>Edit</span>
|
<span>{{ 'Edit' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div *osPerms="'core.can_manage_projector'">
|
<div *osPerms="'core.can_manage_projector'">
|
||||||
@ -112,17 +112,17 @@
|
|||||||
<div *osPerms="'assignments.can_manage'">
|
<div *osPerms="'assignments.can_manage'">
|
||||||
<button mat-menu-item (click)="printBallot()">
|
<button mat-menu-item (click)="printBallot()">
|
||||||
<mat-icon>picture_as_pdf</mat-icon>
|
<mat-icon>picture_as_pdf</mat-icon>
|
||||||
<span translate>Ballot papers</span>
|
<span>{{ 'Ballot papers' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
<!-- Reset Button -->
|
<!-- Reset Button -->
|
||||||
<button mat-menu-item (click)="resetState()">
|
<button mat-menu-item (click)="resetState()">
|
||||||
<mat-icon color="warn">replay</mat-icon>
|
<mat-icon color="warn">replay</mat-icon>
|
||||||
<span translate>Reset state</span>
|
<span>{{ 'Reset state' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-menu-item class="red-warning-text" (click)="onDeletePoll()">
|
<button mat-menu-item class="red-warning-text" (click)="onDeletePoll()">
|
||||||
<mat-icon>delete</mat-icon>
|
<mat-icon>delete</mat-icon>
|
||||||
<span translate>Delete</span>
|
<span>{{ 'Delete' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
|
@ -1,22 +1,24 @@
|
|||||||
<mat-card class="os-card" *osPerms="'users.can_manage'">
|
<mat-card class="os-card" *osPerms="'users.can_manage'">
|
||||||
<button type="button" mat-button (click)="countUsers()" *ngIf="!this.token">
|
<button type="button" mat-button (click)="countUsers()" *ngIf="!this.token">
|
||||||
<span translate>Count active users</span>
|
<span>{{ 'Count active users' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" mat-button (click)="stopCounting()" *ngIf="this.token">
|
<button type="button" mat-button (click)="stopCounting()" *ngIf="this.token">
|
||||||
<span translate>Stop counting</span>
|
<span>{{ 'Stop counting' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<div *ngIf="stats">
|
<div *ngIf="stats">
|
||||||
<p>
|
<p>
|
||||||
{{ userIds().length }} <span translate>active users</span> ({{ stats.activeUserHandles }}
|
{{ userIds().length }} <span>{{ 'active users' | translate }}</span> ({{ stats.activeUserHandles }}
|
||||||
<span translate>connections</span>)
|
<span>{{ 'connections' | translate }}</span
|
||||||
|
>)
|
||||||
</p>
|
</p>
|
||||||
<h3 translate>Groups</h3>
|
<h3>{{ 'Groups' | translate }}</h3>
|
||||||
<ul>
|
<ul>
|
||||||
<li *ngFor="let groupId of groupIds()">
|
<li *ngFor="let groupId of groupIds()">
|
||||||
<strong>{{ stats.groups[groupId].name }}</strong>
|
<strong>{{ stats.groups[groupId].name }}</strong>
|
||||||
<span> : {{ userInGroupIds(groupId).length }} </span>
|
<span> : {{ userInGroupIds(groupId).length }} </span>
|
||||||
<span translate>active users</span>
|
<span>{{ 'active users' | translate }}</span>
|
||||||
(<span>{{ stats.groups[groupId].userHandleCount }}</span> <span translate>connections</span>)
|
(<span>{{ stats.groups[groupId].userHandleCount }}</span> <span>{{ 'connections' | translate }}</span
|
||||||
|
>)
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
<os-head-bar>
|
<os-head-bar>
|
||||||
<div class="title-slot">
|
<div class="title-slot">
|
||||||
<h2 translate>Error</h2>
|
<h2>{{ 'Error' | translate }}</h2>
|
||||||
</div>
|
</div>
|
||||||
</os-head-bar>
|
</os-head-bar>
|
||||||
|
|
||||||
<mat-card class="os-card">
|
<mat-card class="os-card">
|
||||||
<h1 translate>You do not have the required permission to see that page!</h1>
|
<h1>{{ 'You do not have the required permission to see that page!' | translate }}</h1>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
(saveEvent)="saveChanges()"
|
(saveEvent)="saveChanges()"
|
||||||
>
|
>
|
||||||
<div class="title-slot">
|
<div class="title-slot">
|
||||||
<h2 translate>Legal notice</h2>
|
<h2>{{ 'Legal notice' | translate }}</h2>
|
||||||
</div>
|
</div>
|
||||||
</os-head-bar>
|
</os-head-bar>
|
||||||
|
|
||||||
@ -23,13 +23,13 @@
|
|||||||
<mat-card class="os-card">
|
<mat-card class="os-card">
|
||||||
<div>
|
<div>
|
||||||
<button type="button" mat-button (click)="resetCache()">
|
<button type="button" mat-button (click)="resetCache()">
|
||||||
<span translate>Reset cache</span>
|
<span>{{ 'Reset cache' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<button type="button" mat-button (click)="checkForUpdate()">
|
<button type="button" mat-button (click)="checkForUpdate()">
|
||||||
<span translate>Check for updates</span>
|
<span>{{ 'Check for updates' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
(saveEvent)="saveChanges()"
|
(saveEvent)="saveChanges()"
|
||||||
>
|
>
|
||||||
<div class="title-slot">
|
<div class="title-slot">
|
||||||
<h2 translate>Privacy Policy</h2>
|
<h2>{{ 'Privacy Policy' | translate }}</h2>
|
||||||
</div>
|
</div>
|
||||||
</os-head-bar>
|
</os-head-bar>
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
(cancelEditEvent)="isEditing = !isEditing"
|
(cancelEditEvent)="isEditing = !isEditing"
|
||||||
>
|
>
|
||||||
<div class="title-slot">
|
<div class="title-slot">
|
||||||
<h2 translate>Home</h2>
|
<h2>{{ 'Home' | translate }}</h2>
|
||||||
</div>
|
</div>
|
||||||
</os-head-bar>
|
</os-head-bar>
|
||||||
|
|
||||||
@ -30,7 +30,7 @@
|
|||||||
required
|
required
|
||||||
placeholder="{{ 'Front page title' | translate }}"
|
placeholder="{{ 'Front page title' | translate }}"
|
||||||
/>
|
/>
|
||||||
<mat-error translate>The title is required</mat-error>
|
<mat-error>{{ 'The title is required' | translate }}</mat-error>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<editor formControlName="general_event_welcome_text" [init]="tinyMceSettings"></editor>
|
<editor formControlName="general_event_welcome_text" [init]="tinyMceSettings"></editor>
|
||||||
</form>
|
</form>
|
||||||
|
@ -90,7 +90,7 @@
|
|||||||
</ng-container>
|
</ng-container>
|
||||||
</mat-accordion>
|
</mat-accordion>
|
||||||
<div class="no-results" *ngIf="!selectedModel && searchString.length > 0">
|
<div class="no-results" *ngIf="!selectedModel && searchString.length > 0">
|
||||||
<span translate>No search result found</span>
|
<span>{{ 'No search result found' | translate }}</span>
|
||||||
<span *ngIf="searchCollection"
|
<span *ngIf="searchCollection"
|
||||||
> ({{ 'with filter' | translate }} "{{ searchCollection | translate }}")</span
|
> ({{ 'with filter' | translate }} "{{ searchCollection | translate }}")</span
|
||||||
>.
|
>.
|
||||||
|
@ -40,6 +40,6 @@
|
|||||||
<mat-menu #settingsMenu="matMenu">
|
<mat-menu #settingsMenu="matMenu">
|
||||||
<button mat-menu-item (click)="resetAll()">
|
<button mat-menu-item (click)="resetAll()">
|
||||||
<mat-icon>undo</mat-icon>
|
<mat-icon>undo</mat-icon>
|
||||||
<span translate>Reset to factory defaults</span>
|
<span>{{ 'Reset to factory defaults' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<os-head-bar [isSearchEnabled]="false">
|
<os-head-bar [isSearchEnabled]="false">
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot">
|
<div class="title-slot">
|
||||||
<h2 translate>Settings</h2>
|
<h2>{{ 'Settings' | translate }}</h2>
|
||||||
</div>
|
</div>
|
||||||
<!-- Menu -->
|
<!-- Menu -->
|
||||||
<div class="menu-slot">
|
<div class="menu-slot">
|
||||||
@ -45,6 +45,6 @@
|
|||||||
<mat-menu #settingsMenu="matMenu">
|
<mat-menu #settingsMenu="matMenu">
|
||||||
<button mat-menu-item (click)="resetAll()">
|
<button mat-menu-item (click)="resetAll()">
|
||||||
<mat-icon>undo</mat-icon>
|
<mat-icon>undo</mat-icon>
|
||||||
<span translate>Reset to factory defaults</span>
|
<span>{{ 'Reset to factory defaults' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
|
@ -7,12 +7,12 @@
|
|||||||
<ng-container [formGroupName]="i">
|
<ng-container [formGroupName]="i">
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<input formControlName="original" matInput placeholder="{{ 'Original' | translate }}" />
|
<input formControlName="original" matInput placeholder="{{ 'Original' | translate }}" />
|
||||||
<mat-error translate>You have to fill this field.</mat-error>
|
<mat-error>{{ 'You have to fill this field.' | translate }}</mat-error>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<mat-icon>arrow_forward</mat-icon>
|
<mat-icon>arrow_forward</mat-icon>
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<input formControlName="translation" matInput placeholder="{{ 'Translation' | translate }}" />
|
<input formControlName="translation" matInput placeholder="{{ 'Translation' | translate }}" />
|
||||||
<mat-error translate>You have to fill this field.</mat-error>
|
<mat-error>{{ 'You have to fill this field.' | translate }}</mat-error>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<button
|
<button
|
||||||
mat-icon-button
|
mat-icon-button
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<os-head-bar>
|
<os-head-bar>
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot" translate>History</div>
|
<div class="title-slot">{{ 'History' | translate }}</div>
|
||||||
|
|
||||||
<!-- Menu -->
|
<!-- Menu -->
|
||||||
<div class="menu-slot">
|
<div class="menu-slot">
|
||||||
@ -27,7 +27,7 @@
|
|||||||
<span class="spacer-left-20">
|
<span class="spacer-left-20">
|
||||||
<button mat-button (click)="refresh()" *ngIf="currentModelId">
|
<button mat-button (click)="refresh()" *ngIf="currentModelId">
|
||||||
<mat-icon>refresh</mat-icon>
|
<mat-icon>refresh</mat-icon>
|
||||||
<span translate>Refresh</span>
|
<span>{{ 'Refresh' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@ -42,13 +42,13 @@
|
|||||||
<mat-table [dataSource]="dataSource" matSort class="os-headed-listview-table">
|
<mat-table [dataSource]="dataSource" matSort class="os-headed-listview-table">
|
||||||
<!-- Timestamp -->
|
<!-- Timestamp -->
|
||||||
<ng-container matColumnDef="time">
|
<ng-container matColumnDef="time">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Timestamp</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Timestamp' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let history">{{ getTimestamp(history) }}</mat-cell>
|
<mat-cell *matCellDef="let history">{{ getTimestamp(history) }}</mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<!-- Element -->
|
<!-- Element -->
|
||||||
<ng-container matColumnDef="element">
|
<ng-container matColumnDef="element">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Element</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Element' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let history">
|
<mat-cell *matCellDef="let history">
|
||||||
<div *ngIf="getElementInfo(history)">{{ getElementInfo(history) | translate }}</div>
|
<div *ngIf="getElementInfo(history)">{{ getElementInfo(history) | translate }}</div>
|
||||||
<div
|
<div
|
||||||
@ -63,13 +63,13 @@
|
|||||||
|
|
||||||
<!-- Info -->
|
<!-- Info -->
|
||||||
<ng-container matColumnDef="info">
|
<ng-container matColumnDef="info">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Comment</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Comment' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let history">{{ parseInformation(history) }}</mat-cell>
|
<mat-cell *matCellDef="let history">{{ parseInformation(history) }}</mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<!-- User -->
|
<!-- User -->
|
||||||
<ng-container matColumnDef="user">
|
<ng-container matColumnDef="user">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Changed by</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Changed by' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let history">{{ getUserName(history) }}</mat-cell>
|
<mat-cell *matCellDef="let history">{{ getUserName(history) }}</mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
@ -82,6 +82,6 @@
|
|||||||
<mat-menu #historyMenu="matMenu">
|
<mat-menu #historyMenu="matMenu">
|
||||||
<button mat-menu-item class="red-warning-text" (click)="clearHistory()">
|
<button mat-menu-item class="red-warning-text" (click)="clearHistory()">
|
||||||
<mat-icon>delete</mat-icon>
|
<mat-icon>delete</mat-icon>
|
||||||
<span translate>Delete whole history</span>
|
<span>{{ 'Delete whole history' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<main>
|
<main>
|
||||||
<h1 class="center spacer-top-20" translate>Legal notice</h1>
|
<h1 class="center spacer-top-20">{{ 'Legal notice' | translate }}</h1>
|
||||||
|
|
||||||
<os-legal-notice-content></os-legal-notice-content>
|
<os-legal-notice-content></os-legal-notice-content>
|
||||||
</main>
|
</main>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<main>
|
<main>
|
||||||
<h1 class="center spacer-top-20" translate>Privacy Policy</h1>
|
<h1 class="center spacer-top-20">{{ 'Privacy Policy' | translate }}</h1>
|
||||||
|
|
||||||
<os-privacy-policy-content></os-privacy-policy-content>
|
<os-privacy-policy-content></os-privacy-policy-content>
|
||||||
</main>
|
</main>
|
||||||
|
@ -1,16 +1,22 @@
|
|||||||
<!-- The actual form -->
|
<!-- The actual form -->
|
||||||
<header>
|
<header>
|
||||||
<mat-toolbar class="login-logo-bar" color="primary">
|
<mat-toolbar class="login-logo-bar" color="primary">
|
||||||
<a routerLink="/login"><img src="assets/img/openslides-logo-dark.svg" alt="OpenSlides-logo"></a>
|
<a routerLink="/login"><img src="assets/img/openslides-logo-dark.svg" alt="OpenSlides-logo" /></a>
|
||||||
</mat-toolbar>
|
</mat-toolbar>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<main>
|
<main>
|
||||||
<router-outlet></router-outlet>
|
<router-outlet></router-outlet>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<a href='https://openslides.com' target='_bank'>© Copyright by OpenSlides</a>
|
<a href="https://openslides.com" target="_bank">© Copyright by OpenSlides</a>
|
||||||
·
|
·
|
||||||
<a routerLink='/login/legalnotice' translate>Legal notice</a>
|
<a routerLink="/login/legalnotice">
|
||||||
|
{{ 'Legal notice' | translate }}
|
||||||
|
</a>
|
||||||
·
|
·
|
||||||
<a routerLink='/login/privacypolicy' translate>Privacy policy</a>
|
<a routerLink="/login/privacypolicy">
|
||||||
|
{{ 'Privacy policy' | translate }}
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<div class="form-wrapper">
|
<div class="form-wrapper">
|
||||||
<form [formGroup]="newPasswordForm" (ngSubmit)="submitNewPassword()" autocomplete="off">
|
<form [formGroup]="newPasswordForm" (ngSubmit)="submitNewPassword()" autocomplete="off">
|
||||||
<h3 translate>Please enter your new password</h3>
|
<h3>{{ 'Please enter your new password' | translate }}</h3>
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<input
|
<input
|
||||||
matInput
|
matInput
|
||||||
@ -10,8 +10,8 @@
|
|||||||
formControlName="password"
|
formControlName="password"
|
||||||
type="password"
|
type="password"
|
||||||
/>
|
/>
|
||||||
<mat-error *ngIf="newPasswordForm.get('password').hasError('required')" translate>
|
<mat-error *ngIf="newPasswordForm.get('password').hasError('required')">
|
||||||
A password is required
|
{{ 'A password is required' | translate }}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<br />
|
<br />
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<div class="form-wrapper">
|
<div class="form-wrapper">
|
||||||
<form [formGroup]="resetPasswordForm" (ngSubmit)="resetPassword()" autocomplete="off">
|
<form [formGroup]="resetPasswordForm" (ngSubmit)="resetPassword()" autocomplete="off">
|
||||||
<h3 translate>Enter your email to send the password reset link</h3>
|
<h3>{{ 'Enter your email to send the password reset link' | translate }}</h3>
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<input
|
<input
|
||||||
matInput
|
matInput
|
||||||
@ -10,8 +10,8 @@
|
|||||||
type="email"
|
type="email"
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
/>
|
/>
|
||||||
<mat-error *ngIf="resetPasswordForm.get('email').invalid" translate>
|
<mat-error *ngIf="resetPasswordForm.get('email').invalid">
|
||||||
Please enter a valid email address!
|
{{ 'Please enter a valid email address!' | translate }}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<br />
|
<br />
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
<os-head-bar [nav]="false" [goBack]="true">
|
<os-head-bar [nav]="false" [goBack]="true">
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot"><h2 translate>Upload files</h2></div>
|
<div class="title-slot">
|
||||||
|
<h2>{{ 'Upload files' | translate }}</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Menu -->
|
<!-- Menu -->
|
||||||
<div class="menu-slot">
|
<div class="menu-slot">
|
||||||
@ -23,6 +25,6 @@
|
|||||||
<!-- Select upload strategy -->
|
<!-- Select upload strategy -->
|
||||||
<button mat-menu-item (click)="setUploadStrategy(!parallel)">
|
<button mat-menu-item (click)="setUploadStrategy(!parallel)">
|
||||||
<mat-icon color="accent">{{ parallel ? 'check_box' : 'check_box_outline_blank' }}</mat-icon>
|
<mat-icon color="accent">{{ parallel ? 'check_box' : 'check_box_outline_blank' }}</mat-icon>
|
||||||
<span translate>Parallel upload</span>
|
<span>{{ 'Parallel upload' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<os-head-bar [hasMainButton]="canEdit" [multiSelectMode]="isMultiSelect" (mainEvent)="onMainEvent()">
|
<os-head-bar [hasMainButton]="canEdit" [multiSelectMode]="isMultiSelect" (mainEvent)="onMainEvent()">
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot">
|
<div class="title-slot">
|
||||||
<h2 translate>Files</h2>
|
<h2>{{ 'Files' | translate }}</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Menu -->
|
<!-- Menu -->
|
||||||
@ -17,7 +17,7 @@
|
|||||||
<!-- Multiselect info -->
|
<!-- Multiselect info -->
|
||||||
<div *ngIf="isMultiSelect" class="central-info-slot">
|
<div *ngIf="isMultiSelect" class="central-info-slot">
|
||||||
<button mat-icon-button (click)="toggleMultiSelect()"><mat-icon>arrow_back</mat-icon></button>
|
<button mat-icon-button (click)="toggleMultiSelect()"><mat-icon>arrow_back</mat-icon></button>
|
||||||
<span>{{ selectedRows.length }} </span><span translate>selected</span>
|
<span>{{ selectedRows.length }} </span><span>{{ 'selected' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
</os-head-bar>
|
</os-head-bar>
|
||||||
|
|
||||||
@ -93,7 +93,12 @@
|
|||||||
>
|
>
|
||||||
<!-- Icon column -->
|
<!-- Icon column -->
|
||||||
<div *pblNgridCellDef="'icon'; row as mediafile" class="fill clickable">
|
<div *pblNgridCellDef="'icon'; row as mediafile" class="fill clickable">
|
||||||
<a class="detail-link" target="_blank" [routerLink]="mediafile.url" *ngIf="!mediafile.is_directory && !isMultiSelect">
|
<a
|
||||||
|
class="detail-link"
|
||||||
|
target="_blank"
|
||||||
|
[routerLink]="mediafile.url"
|
||||||
|
*ngIf="!mediafile.is_directory && !isMultiSelect"
|
||||||
|
>
|
||||||
</a>
|
</a>
|
||||||
<a class="detail-link" (click)="changeDirectory(mediafile.id)" *ngIf="mediafile.is_directory && !isMultiSelect">
|
<a class="detail-link" (click)="changeDirectory(mediafile.id)" *ngIf="mediafile.is_directory && !isMultiSelect">
|
||||||
</a>
|
</a>
|
||||||
@ -102,7 +107,12 @@
|
|||||||
|
|
||||||
<!-- Title column -->
|
<!-- Title column -->
|
||||||
<div *pblNgridCellDef="'title'; row as mediafile" class="fill clickable">
|
<div *pblNgridCellDef="'title'; row as mediafile" class="fill clickable">
|
||||||
<a class="detail-link" target="_blank" [routerLink]="mediafile.url" *ngIf="!mediafile.is_directory && !isMultiSelect">
|
<a
|
||||||
|
class="detail-link"
|
||||||
|
target="_blank"
|
||||||
|
[routerLink]="mediafile.url"
|
||||||
|
*ngIf="!mediafile.is_directory && !isMultiSelect"
|
||||||
|
>
|
||||||
</a>
|
</a>
|
||||||
<a class="detail-link" (click)="changeDirectory(mediafile.id)" *ngIf="mediafile.is_directory && !isMultiSelect">
|
<a class="detail-link" (click)="changeDirectory(mediafile.id)" *ngIf="mediafile.is_directory && !isMultiSelect">
|
||||||
</a>
|
</a>
|
||||||
@ -155,7 +165,7 @@
|
|||||||
|
|
||||||
<!-- No Results -->
|
<!-- No Results -->
|
||||||
<div *pblNgridNoDataRef class="pbl-ngrid-no-data">
|
<div *pblNgridNoDataRef class="pbl-ngrid-no-data">
|
||||||
<span translate>No data</span>
|
<span>{{ 'No data' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
</pbl-ngrid>
|
</pbl-ngrid>
|
||||||
|
|
||||||
@ -203,15 +213,15 @@
|
|||||||
<div *ngIf="canEdit">
|
<div *ngIf="canEdit">
|
||||||
<button mat-menu-item (click)="onEditFile(mediafile)">
|
<button mat-menu-item (click)="onEditFile(mediafile)">
|
||||||
<mat-icon>edit</mat-icon>
|
<mat-icon>edit</mat-icon>
|
||||||
<span translate>Edit</span>
|
<span>{{ 'Edit' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-menu-item (click)="move(moveDialog, [mediafile])">
|
<button mat-menu-item (click)="move(moveDialog, [mediafile])">
|
||||||
<mat-icon>near_me</mat-icon>
|
<mat-icon>near_me</mat-icon>
|
||||||
<span translate>Move</span>
|
<span>{{ 'Move' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-menu-item class="red-warning-text" (click)="onDelete(mediafile)">
|
<button mat-menu-item class="red-warning-text" (click)="onDelete(mediafile)">
|
||||||
<mat-icon>delete</mat-icon>
|
<mat-icon>delete</mat-icon>
|
||||||
<span translate>Delete</span>
|
<span>{{ 'Delete' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
@ -222,22 +232,22 @@
|
|||||||
<div *ngIf="!isMultiSelect">
|
<div *ngIf="!isMultiSelect">
|
||||||
<button mat-menu-item *osPerms="'mediafiles.can_manage'" (click)="toggleMultiSelect()">
|
<button mat-menu-item *osPerms="'mediafiles.can_manage'" (click)="toggleMultiSelect()">
|
||||||
<mat-icon>library_add</mat-icon>
|
<mat-icon>library_add</mat-icon>
|
||||||
<span translate>Multiselect</span>
|
<span>{{ 'Multiselect' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="isMultiSelect">
|
<div *ngIf="isMultiSelect">
|
||||||
<button mat-menu-item [disabled]="!selectedRows.length" (click)="move(moveDialog, selectedRows)">
|
<button mat-menu-item [disabled]="!selectedRows.length" (click)="move(moveDialog, selectedRows)">
|
||||||
<mat-icon>near_me</mat-icon>
|
<mat-icon>near_me</mat-icon>
|
||||||
<span translate>Move</span>
|
<span>{{ 'Move' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
<button mat-menu-item (click)="selectAll()">
|
<button mat-menu-item (click)="selectAll()">
|
||||||
<mat-icon>done_all</mat-icon>
|
<mat-icon>done_all</mat-icon>
|
||||||
<span translate>Select all</span>
|
<span>{{ 'Select all' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-menu-item [disabled]="!selectedRows.length" (click)="deselectAll()">
|
<button mat-menu-item [disabled]="!selectedRows.length" (click)="deselectAll()">
|
||||||
<mat-icon>clear</mat-icon>
|
<mat-icon>clear</mat-icon>
|
||||||
<span translate>Deselect all</span>
|
<span>{{ 'Deselect all' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
<button
|
<button
|
||||||
@ -247,7 +257,7 @@
|
|||||||
(click)="deleteSelected()"
|
(click)="deleteSelected()"
|
||||||
>
|
>
|
||||||
<mat-icon color="warn">delete</mat-icon>
|
<mat-icon color="warn">delete</mat-icon>
|
||||||
<span translate>Delete</span>
|
<span>{{ 'Delete' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
@ -266,7 +276,7 @@
|
|||||||
formControlName="title"
|
formControlName="title"
|
||||||
placeholder="{{ 'New file name' | translate }}"
|
placeholder="{{ 'New file name' | translate }}"
|
||||||
/>
|
/>
|
||||||
<mat-error *ngIf="fileEditForm.invalid" translate>Required</mat-error>
|
<mat-error *ngIf="fileEditForm.invalid">{{ 'Required' | translate }}</mat-error>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
|
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
@ -287,10 +297,10 @@
|
|||||||
color="primary"
|
color="primary"
|
||||||
(click)="onSaveEditedFile(fileEditForm.value)"
|
(click)="onSaveEditedFile(fileEditForm.value)"
|
||||||
>
|
>
|
||||||
<span translate>Save</span>
|
<span>{{ 'Save' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" mat-button [mat-dialog-close]="null">
|
<button type="button" mat-button [mat-dialog-close]="null">
|
||||||
<span translate>Cancel</span>
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
@ -300,7 +310,7 @@
|
|||||||
<h1 mat-dialog-title>{{ 'New directory' | translate }}</h1>
|
<h1 mat-dialog-title>{{ 'New directory' | translate }}</h1>
|
||||||
<div class="os-form-card-mobile" mat-dialog-content>
|
<div class="os-form-card-mobile" mat-dialog-content>
|
||||||
<form class="edit-file-form" [formGroup]="newDirectoryForm">
|
<form class="edit-file-form" [formGroup]="newDirectoryForm">
|
||||||
<p translate>Please enter a name for the new directory:</p>
|
<p>{{ 'Please enter a name for the new directory:' | translate }}</p>
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<input matInput osAutofocus formControlName="title" placeholder="{{ 'Title' | translate }}" required />
|
<input matInput osAutofocus formControlName="title" placeholder="{{ 'Title' | translate }}" required />
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
@ -317,10 +327,10 @@
|
|||||||
</div>
|
</div>
|
||||||
<div mat-dialog-actions>
|
<div mat-dialog-actions>
|
||||||
<button type="submit" mat-button [disabled]="!newDirectoryForm.valid" color="primary" [mat-dialog-close]="true">
|
<button type="submit" mat-button [disabled]="!newDirectoryForm.valid" color="primary" [mat-dialog-close]="true">
|
||||||
<span translate>Save</span>
|
<span>{{ 'Save' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" mat-button [mat-dialog-close]="null">
|
<button type="button" mat-button [mat-dialog-close]="null">
|
||||||
<span translate>Cancel</span>
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
@ -328,10 +338,10 @@
|
|||||||
<!-- Move dialog -->
|
<!-- Move dialog -->
|
||||||
<ng-template #moveDialog>
|
<ng-template #moveDialog>
|
||||||
<h1 mat-dialog-title>
|
<h1 mat-dialog-title>
|
||||||
<span translate>Move into directory</span>
|
<span>{{ 'Move into directory' | translate }}</span>
|
||||||
</h1>
|
</h1>
|
||||||
<div class="os-form-card-mobile" [formGroup]="moveForm" mat-dialog-content>
|
<div class="os-form-card-mobile" [formGroup]="moveForm" mat-dialog-content>
|
||||||
<p translate>Please select the directory:</p>
|
<p>{{ 'Please select the directory:' | translate }}</p>
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<os-search-value-selector
|
<os-search-value-selector
|
||||||
formControlName="directory_id"
|
formControlName="directory_id"
|
||||||
@ -344,10 +354,10 @@
|
|||||||
</div>
|
</div>
|
||||||
<div mat-dialog-actions>
|
<div mat-dialog-actions>
|
||||||
<button type="submit" mat-button color="primary" [mat-dialog-close]="true">
|
<button type="submit" mat-button color="primary" [mat-dialog-close]="true">
|
||||||
<span translate>Move</span>
|
<span>{{ 'Move' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" mat-button [mat-dialog-close]="null">
|
<button type="button" mat-button [mat-dialog-close]="null">
|
||||||
<span translate>Cancel</span>
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
<os-head-bar prevUrl="../.." [nav]="false" [multiSelectMode]="isMultiSelect">
|
<os-head-bar prevUrl="../.." [nav]="false" [multiSelectMode]="isMultiSelect">
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot" *ngIf="!parentMotion"><h2 translate>Amendments</h2></div>
|
<div class="title-slot" *ngIf="!parentMotion">
|
||||||
|
<h2>{{ 'Amendments' | translate }}</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- TODO would require translations with parameters -->
|
<!-- TODO would require translations with parameters -->
|
||||||
<div class="title-slot" *ngIf="parentMotion">
|
<div class="title-slot" *ngIf="parentMotion">
|
||||||
@ -20,7 +22,7 @@
|
|||||||
<!-- Multiselect info -->
|
<!-- Multiselect info -->
|
||||||
<div class="central-info-slot">
|
<div class="central-info-slot">
|
||||||
<button mat-icon-button (click)="toggleMultiSelect()"><mat-icon>arrow_back</mat-icon></button>
|
<button mat-icon-button (click)="toggleMultiSelect()"><mat-icon>arrow_back</mat-icon></button>
|
||||||
<span>{{ selectedRows.length }} </span><span translate>selected</span>
|
<span>{{ selectedRows.length }} </span><span>{{ 'selected' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
</os-head-bar>
|
</os-head-bar>
|
||||||
|
|
||||||
@ -45,7 +47,7 @@
|
|||||||
<span>{{ motion.identifier }}</span>
|
<span>{{ motion.identifier }}</span>
|
||||||
<span *ngIf="motion.diffLines && motion.diffLines.length">
|
<span *ngIf="motion.diffLines && motion.diffLines.length">
|
||||||
<span *ngIf="motion.identifier"> · </span>
|
<span *ngIf="motion.identifier"> · </span>
|
||||||
<span translate>Line</span>
|
<span>{{ 'Line' | translate }}</span>
|
||||||
<span> {{ motion.getChangeLines() }}</span>
|
<span> {{ motion.getChangeLines() }}</span>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@ -53,14 +55,14 @@
|
|||||||
<!-- Submitter -->
|
<!-- Submitter -->
|
||||||
<div class="submitters-line one-line">
|
<div class="submitters-line one-line">
|
||||||
<span *ngIf="motion.submitters.length">
|
<span *ngIf="motion.submitters.length">
|
||||||
<span translate>by</span>
|
<span>{{ 'by' | translate }}</span>
|
||||||
{{ motion.submitters }}
|
{{ motion.submitters }}
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<span *ngIf="motion.submitters.length">
|
<span *ngIf="motion.submitters.length">
|
||||||
·
|
·
|
||||||
</span>
|
</span>
|
||||||
<span translate>Sequential number</span>
|
<span>{{ 'Sequential number' | translate }}</span>
|
||||||
{{ motion.id }}
|
{{ motion.id }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -115,26 +117,26 @@
|
|||||||
<div *osPerms="'motions.can_manage'">
|
<div *osPerms="'motions.can_manage'">
|
||||||
<button mat-menu-item (click)="toggleMultiSelect()">
|
<button mat-menu-item (click)="toggleMultiSelect()">
|
||||||
<mat-icon>library_add</mat-icon>
|
<mat-icon>library_add</mat-icon>
|
||||||
<span translate>Multiselect</span>
|
<span>{{ 'Multiselect' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<button mat-menu-item (click)="openExportDialog()">
|
<button mat-menu-item (click)="openExportDialog()">
|
||||||
<mat-icon>archive</mat-icon>
|
<mat-icon>archive</mat-icon>
|
||||||
<span translate>Export</span>
|
<span>{{ 'Export' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-menu-item (click)="exportAmendmentListPdf()">
|
<button mat-menu-item (click)="exportAmendmentListPdf()">
|
||||||
<mat-icon>picture_as_pdf</mat-icon>
|
<mat-icon>picture_as_pdf</mat-icon>
|
||||||
<span translate>Amendment list (PDF)</span>
|
<span>{{ 'Amendment list (PDF)' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="isMultiSelect">
|
<div *ngIf="isMultiSelect">
|
||||||
<button mat-menu-item (click)="selectAll()">
|
<button mat-menu-item (click)="selectAll()">
|
||||||
<mat-icon>done_all</mat-icon>
|
<mat-icon>done_all</mat-icon>
|
||||||
<span translate>Select all</span>
|
<span>{{ 'Select all' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-menu-item [disabled]="!selectedRows.length" (click)="deselectAll()">
|
<button mat-menu-item [disabled]="!selectedRows.length" (click)="deselectAll()">
|
||||||
<mat-icon>clear</mat-icon>
|
<mat-icon>clear</mat-icon>
|
||||||
<span translate>Deselect all</span>
|
<span>{{ 'Deselect all' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<ng-container *osPerms="'motions.can_manage'; or: 'motions.can_manage_metadata'">
|
<ng-container *osPerms="'motions.can_manage'; or: 'motions.can_manage_metadata'">
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<os-head-bar prevUrl="../.." [nav]="false" [editMode]="hasChanged" (mainEvent)="onCancel()" (saveEvent)="onSave()">
|
<os-head-bar prevUrl="../.." [nav]="false" [editMode]="hasChanged" (mainEvent)="onCancel()" (saveEvent)="onSave()">
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot">
|
<div class="title-slot">
|
||||||
<h2 translate>Call list</h2>
|
<h2>{{ 'Call list' | translate }}</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Export menu -->
|
<!-- Export menu -->
|
||||||
@ -14,15 +14,18 @@
|
|||||||
|
|
||||||
<div class="custom-table-header flex-spaced">
|
<div class="custom-table-header flex-spaced">
|
||||||
<div class="filter-count">
|
<div class="filter-count">
|
||||||
<span> {{ seenNodes[0] }} </span><span translate>of</span>
|
<span> {{ seenNodes[0] }} </span><span>{{ 'of' | translate }}</span>
|
||||||
<span> {{ seenNodes[1] }}</span>
|
<span> {{ seenNodes[1] }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="current-filters" *ngIf="hasActiveFilter">
|
<div class="current-filters" *ngIf="hasActiveFilter">
|
||||||
<div><span translate>Active filters</span>: </div>
|
<div>
|
||||||
|
<span>{{ 'Active filters' | translate }}</span
|
||||||
|
>:
|
||||||
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<button mat-button (click)="resetFilters()">
|
<button mat-button (click)="resetFilters()">
|
||||||
<mat-icon inline>cancel</mat-icon>
|
<mat-icon inline>cancel</mat-icon>
|
||||||
<span translate>Clear all</span>
|
<span>{{ 'Clear all' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -34,9 +37,8 @@
|
|||||||
[matBadge]="activeCatFilterCount > 0 ? activeCatFilterCount : null"
|
[matBadge]="activeCatFilterCount > 0 ? activeCatFilterCount : null"
|
||||||
matBadgeColor="accent"
|
matBadgeColor="accent"
|
||||||
[matBadgeOverlap]="false"
|
[matBadgeOverlap]="false"
|
||||||
translate
|
|
||||||
>
|
>
|
||||||
Categories
|
{{ 'Categories' | translate }}
|
||||||
</span>
|
</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@ -47,9 +49,8 @@
|
|||||||
[matBadge]="activeTagFilterCount > 0 ? activeTagFilterCount : null"
|
[matBadge]="activeTagFilterCount > 0 ? activeTagFilterCount : null"
|
||||||
matBadgeColor="accent"
|
matBadgeColor="accent"
|
||||||
[matBadgeOverlap]="false"
|
[matBadgeOverlap]="false"
|
||||||
translate
|
|
||||||
>
|
>
|
||||||
Tags
|
{{ 'Tags' | translate }}
|
||||||
</span>
|
</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@ -103,18 +104,18 @@
|
|||||||
<mat-menu #mainMenu="matMenu">
|
<mat-menu #mainMenu="matMenu">
|
||||||
<button mat-menu-item (click)="sortMotionsByIdentifier()">
|
<button mat-menu-item (click)="sortMotionsByIdentifier()">
|
||||||
<mat-icon>sort</mat-icon>
|
<mat-icon>sort</mat-icon>
|
||||||
<span translate>Sort by identifier</span>
|
<span>{{ 'Sort by identifier' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
|
|
||||||
<button mat-menu-item (click)="pdfExportCallList()">
|
<button mat-menu-item (click)="pdfExportCallList()">
|
||||||
<mat-icon>picture_as_pdf</mat-icon>
|
<mat-icon>picture_as_pdf</mat-icon>
|
||||||
<span translate>Export as PDF</span>
|
<span>{{ 'Export as PDF' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<button mat-menu-item (click)="csvExportCallList()">
|
<button mat-menu-item (click)="csvExportCallList()">
|
||||||
<mat-icon>archive</mat-icon>
|
<mat-icon>archive</mat-icon>
|
||||||
<span translate>Export as CSV</span>
|
<span>{{ 'Export as CSV' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
|
@ -1,11 +1,7 @@
|
|||||||
<os-head-bar
|
<os-head-bar [editMode]="hasChanged" (saveEvent)="onSave()" (mainEvent)="onCancel()" [nav]="false">
|
||||||
[editMode]="hasChanged"
|
|
||||||
(saveEvent)="onSave()"
|
|
||||||
(mainEvent)="onCancel()"
|
|
||||||
[nav]="false">
|
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot">
|
<div class="title-slot">
|
||||||
<h2 translate>Sort categories</h2>
|
<h2>{{ 'Sort categories' | translate }}</h2>
|
||||||
</div>
|
</div>
|
||||||
</os-head-bar>
|
</os-head-bar>
|
||||||
|
|
||||||
@ -15,7 +11,8 @@
|
|||||||
parentKey="parent_id"
|
parentKey="parent_id"
|
||||||
weightKey="weight"
|
weightKey="weight"
|
||||||
(hasChanged)="receiveChanges($event)"
|
(hasChanged)="receiveChanges($event)"
|
||||||
[model]="categoriesObservable">
|
[model]="categoriesObservable"
|
||||||
|
>
|
||||||
<ng-template #innerNode let-item="item">
|
<ng-template #innerNode let-item="item">
|
||||||
{{ item.getTitle() }}
|
{{ item.getTitle() }}
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
@ -25,7 +25,9 @@
|
|||||||
<table class="os-headed-listview-table" mat-table [dataSource]="dataSources[category.id]">
|
<table class="os-headed-listview-table" mat-table [dataSource]="dataSources[category.id]">
|
||||||
<!-- title column -->
|
<!-- title column -->
|
||||||
<ng-container matColumnDef="title">
|
<ng-container matColumnDef="title">
|
||||||
<mat-header-cell *matHeaderCellDef> <span translate>Motion</span> </mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>
|
||||||
|
<span>{{ 'Motion' | translate }}</span>
|
||||||
|
</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let motion">
|
<mat-cell *matCellDef="let motion">
|
||||||
{{ motion.getTitle() }}
|
{{ motion.getTitle() }}
|
||||||
</mat-cell>
|
</mat-cell>
|
||||||
@ -33,7 +35,9 @@
|
|||||||
|
|
||||||
<!-- state column -->
|
<!-- state column -->
|
||||||
<ng-container matColumnDef="state">
|
<ng-container matColumnDef="state">
|
||||||
<mat-header-cell *matHeaderCellDef> <span translate>State</span> </mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>
|
||||||
|
<span>{{ 'State' | translate }}</span>
|
||||||
|
</mat-header-cell>
|
||||||
<mat-cell class="chip-container" *matCellDef="let motion">
|
<mat-cell class="chip-container" *matCellDef="let motion">
|
||||||
<mat-basic-chip disableRipple [ngClass]="motion.stateCssColor">
|
<mat-basic-chip disableRipple [ngClass]="motion.stateCssColor">
|
||||||
{{ getStateLabel(motion) }}
|
{{ getStateLabel(motion) }}
|
||||||
@ -43,7 +47,9 @@
|
|||||||
|
|
||||||
<!-- Recommendation column -->
|
<!-- Recommendation column -->
|
||||||
<ng-container matColumnDef="recommendation">
|
<ng-container matColumnDef="recommendation">
|
||||||
<mat-header-cell *matHeaderCellDef> <span translate>Recommendation</span> </mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>
|
||||||
|
<span>{{ 'Recommendation' | translate }}</span>
|
||||||
|
</mat-header-cell>
|
||||||
<mat-cell class="chip-container" *matCellDef="let motion">
|
<mat-cell class="chip-container" *matCellDef="let motion">
|
||||||
<mat-basic-chip *ngIf="motion.recommendation" disableRipple class="bluegrey">
|
<mat-basic-chip *ngIf="motion.recommendation" disableRipple class="bluegrey">
|
||||||
{{ getRecommendationLabel(motion) }}
|
{{ getRecommendationLabel(motion) }}
|
||||||
@ -69,20 +75,20 @@
|
|||||||
<mat-menu #categoryMenu="matMenu">
|
<mat-menu #categoryMenu="matMenu">
|
||||||
<button mat-menu-item (click)="toggleEditMode()">
|
<button mat-menu-item (click)="toggleEditMode()">
|
||||||
<mat-icon>edit</mat-icon>
|
<mat-icon>edit</mat-icon>
|
||||||
<span translate>Edit</span>
|
<span>{{ 'Edit' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-menu-item [routerLink]="'./sort'">
|
<button mat-menu-item [routerLink]="'./sort'">
|
||||||
<mat-icon>sort</mat-icon>
|
<mat-icon>sort</mat-icon>
|
||||||
<span translate>Sort motions</span>
|
<span>{{ 'Sort motions' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-menu-item (click)="numberMotions()">
|
<button mat-menu-item (click)="numberMotions()">
|
||||||
<mat-icon>format_list_numbered</mat-icon>
|
<mat-icon>format_list_numbered</mat-icon>
|
||||||
<span translate>Number motions</span>
|
<span>{{ 'Number motions' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
<button mat-menu-item class="red-warning-text" (click)="onDeleteButton()">
|
<button mat-menu-item class="red-warning-text" (click)="onDeleteButton()">
|
||||||
<mat-icon>delete</mat-icon>
|
<mat-icon>delete</mat-icon>
|
||||||
<span translate>Delete</span>
|
<span>{{ 'Delete' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
|
|
||||||
@ -102,10 +108,10 @@
|
|||||||
</div>
|
</div>
|
||||||
<div mat-dialog-actions>
|
<div mat-dialog-actions>
|
||||||
<button type="submit" mat-button [disabled]="!editForm.valid" color="primary" (click)="save()">
|
<button type="submit" mat-button [disabled]="!editForm.valid" color="primary" (click)="save()">
|
||||||
<span translate>Save</span>
|
<span>{{ 'Save' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" mat-button [mat-dialog-close]="null">
|
<button type="button" mat-button [mat-dialog-close]="null">
|
||||||
<span translate>Cancel</span>
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<os-head-bar prevUrl="../.." [nav]="false" [hasMainButton]="canEdit" (mainEvent)="onPlusButton()">
|
<os-head-bar prevUrl="../.." [nav]="false" [hasMainButton]="canEdit" (mainEvent)="onPlusButton()">
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot">
|
<div class="title-slot">
|
||||||
<h2 translate>Categories</h2>
|
<h2>{{ 'Categories' | translate }}</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Menu -->
|
<!-- Menu -->
|
||||||
@ -38,14 +38,14 @@
|
|||||||
<mat-menu #categoryMenu="matMenu">
|
<mat-menu #categoryMenu="matMenu">
|
||||||
<button mat-menu-item [routerLink]="'./sort'">
|
<button mat-menu-item [routerLink]="'./sort'">
|
||||||
<mat-icon>sort</mat-icon>
|
<mat-icon>sort</mat-icon>
|
||||||
<span translate>Sort categories</span>
|
<span>{{ 'Sort categories' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
|
|
||||||
<!-- Template for new motion block dialog -->
|
<!-- Template for new motion block dialog -->
|
||||||
<ng-template #newCategoryDialog>
|
<ng-template #newCategoryDialog>
|
||||||
<h1 mat-dialog-title>
|
<h1 mat-dialog-title>
|
||||||
<span translate>New category</span>
|
<span>{{ 'New category' | translate }}</span>
|
||||||
</h1>
|
</h1>
|
||||||
<div class="os-form-card-mobile" mat-dialog-content>
|
<div class="os-form-card-mobile" mat-dialog-content>
|
||||||
<form [formGroup]="createForm" (keydown)="onKeyDown($event)">
|
<form [formGroup]="createForm" (keydown)="onKeyDown($event)">
|
||||||
@ -60,8 +60,8 @@
|
|||||||
<p>
|
<p>
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<input formControlName="name" matInput placeholder="{{ 'Name' | translate }}" required />
|
<input formControlName="name" matInput placeholder="{{ 'Name' | translate }}" required />
|
||||||
<mat-error *ngIf="!createForm.controls.name.valid" translate>
|
<mat-error *ngIf="!createForm.controls.name.valid">
|
||||||
A name is required
|
{{ 'A name is required' | translate }}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</p>
|
</p>
|
||||||
@ -69,10 +69,10 @@
|
|||||||
</div>
|
</div>
|
||||||
<div mat-dialog-actions>
|
<div mat-dialog-actions>
|
||||||
<button mat-button [disabled]="!createForm.valid" [mat-dialog-close]="true">
|
<button mat-button [disabled]="!createForm.valid" [mat-dialog-close]="true">
|
||||||
<span translate>Save</span>
|
<span>{{ 'Save' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-button [mat-dialog-close]="false">
|
<button mat-button [mat-dialog-close]="false">
|
||||||
<span translate>Cancel</span>
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
@ -8,8 +8,10 @@
|
|||||||
<mat-card class="os-form-card">
|
<mat-card class="os-form-card">
|
||||||
<div *ngIf="isMultiSelect">
|
<div *ngIf="isMultiSelect">
|
||||||
<span>{{ sortSelector.multiSelectedIndex.length }} </span>
|
<span>{{ sortSelector.multiSelectedIndex.length }} </span>
|
||||||
<span translate>selected</span>
|
<span>{{ 'selected' | translate }}</span>
|
||||||
<button mat-button (click)="moveToPosition()"><span translate>move ...</span></button>
|
<button mat-button (click)="moveToPosition()">
|
||||||
|
<span>{{ 'move ...' | translate }}</span>
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<os-sorting-list (sortEvent)="onListUpdate($event)" [input]="motionObservable" #sorter>
|
<os-sorting-list (sortEvent)="onListUpdate($event)" [input]="motionObservable" #sorter>
|
||||||
<ng-template let-motion>
|
<ng-template let-motion>
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
[disabled]="isFollowingProhibited()"
|
[disabled]="isFollowingProhibited()"
|
||||||
>
|
>
|
||||||
<os-icon-container icon="done_all">
|
<os-icon-container icon="done_all">
|
||||||
<span translate>Follow recommendations for all motions</span>
|
<span>{{ 'Follow recommendations for all motions' | translate }}</span>
|
||||||
</os-icon-container>
|
</os-icon-container>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@ -85,7 +85,7 @@
|
|||||||
<!-- Submitters -->
|
<!-- Submitters -->
|
||||||
<div class="submitters-line ellipsis-overflow">
|
<div class="submitters-line ellipsis-overflow">
|
||||||
<span *ngIf="motion.submitters.length">
|
<span *ngIf="motion.submitters.length">
|
||||||
<span translate>by</span>
|
<span>{{ 'by' | translate }}</span>
|
||||||
{{ motion.submitters }}
|
{{ motion.submitters }}
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
@ -93,7 +93,7 @@
|
|||||||
<span *ngIf="motion.submitters.length">
|
<span *ngIf="motion.submitters.length">
|
||||||
·
|
·
|
||||||
</span>
|
</span>
|
||||||
<span translate>Sequential number</span>
|
<span>{{ 'Sequential number' | translate }}</span>
|
||||||
{{ motion.id }}
|
{{ motion.id }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@ -148,7 +148,7 @@
|
|||||||
<os-speaker-button [object]="motion" [menuItem]="true"></os-speaker-button>
|
<os-speaker-button [object]="motion" [menuItem]="true"></os-speaker-button>
|
||||||
<button mat-menu-item class="red-warning-text" (click)="onRemoveMotionButton(motion)">
|
<button mat-menu-item class="red-warning-text" (click)="onRemoveMotionButton(motion)">
|
||||||
<mat-icon>close</mat-icon>
|
<mat-icon>close</mat-icon>
|
||||||
<span translate>Remove from motion block</span>
|
<span>{{ 'Remove from motion block' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
@ -163,7 +163,7 @@
|
|||||||
[disabled]="isFollowingProhibited()"
|
[disabled]="isFollowingProhibited()"
|
||||||
>
|
>
|
||||||
<mat-icon>done_all</mat-icon>
|
<mat-icon>done_all</mat-icon>
|
||||||
<span translate>Follow recommendations for all motions</span>
|
<span>{{ 'Follow recommendations for all motions' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -174,24 +174,24 @@
|
|||||||
<div *osPerms="'agenda.can_manage'">
|
<div *osPerms="'agenda.can_manage'">
|
||||||
<button mat-menu-item (click)="addToAgenda()" *ngIf="block && !block.item">
|
<button mat-menu-item (click)="addToAgenda()" *ngIf="block && !block.item">
|
||||||
<mat-icon>add</mat-icon>
|
<mat-icon>add</mat-icon>
|
||||||
<span translate>Add to agenda</span>
|
<span>{{ 'Add to agenda' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-menu-item (click)="removeFromAgenda()" *ngIf="block && block.item">
|
<button mat-menu-item (click)="removeFromAgenda()" *ngIf="block && block.item">
|
||||||
<mat-icon>remove</mat-icon>
|
<mat-icon>remove</mat-icon>
|
||||||
<span translate>Remove from agenda</span>
|
<span>{{ 'Remove from agenda' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div *osPerms="['motions.can_manage', 'motions.can_manage_metadata']">
|
<div *osPerms="['motions.can_manage', 'motions.can_manage_metadata']">
|
||||||
<button mat-menu-item (click)="toggleEditMode()">
|
<button mat-menu-item (click)="toggleEditMode()">
|
||||||
<mat-icon>edit</mat-icon>
|
<mat-icon>edit</mat-icon>
|
||||||
<span translate>Edit</span>
|
<span>{{ 'Edit' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
|
|
||||||
<button mat-menu-item class="red-warning-text" (click)="onDeleteBlockButton()">
|
<button mat-menu-item class="red-warning-text" (click)="onDeleteBlockButton()">
|
||||||
<mat-icon>delete</mat-icon>
|
<mat-icon>delete</mat-icon>
|
||||||
<span translate>Delete</span>
|
<span>{{ 'Delete' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
@ -210,10 +210,10 @@
|
|||||||
</div>
|
</div>
|
||||||
<div mat-dialog-actions>
|
<div mat-dialog-actions>
|
||||||
<button type="submit" mat-button [disabled]="!blockEditForm.valid" color="primary" (click)="saveBlock()">
|
<button type="submit" mat-button [disabled]="!blockEditForm.valid" color="primary" (click)="saveBlock()">
|
||||||
<span translate>Save</span>
|
<span>{{ 'Save' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" mat-button [mat-dialog-close]="null">
|
<button type="button" mat-button [mat-dialog-close]="null">
|
||||||
<span translate>Cancel</span>
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
<os-head-bar prevUrl="../.." [nav]="false" [hasMainButton]="canEdit" (mainEvent)="onPlusButton()">
|
<os-head-bar prevUrl="../.." [nav]="false" [hasMainButton]="canEdit" (mainEvent)="onPlusButton()">
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot"><h2 translate>Motion blocks</h2></div>
|
<div class="title-slot">
|
||||||
|
<h2>{{ 'Motion blocks' | translate }}</h2>
|
||||||
|
</div>
|
||||||
</os-head-bar>
|
</os-head-bar>
|
||||||
|
|
||||||
<os-list-view-table
|
<os-list-view-table
|
||||||
@ -28,7 +30,7 @@
|
|||||||
[noWrap]="true"
|
[noWrap]="true"
|
||||||
[icon]="block.isFinished ? 'check' : block.internal ? 'lock' : null"
|
[icon]="block.isFinished ? 'check' : block.internal ? 'lock' : null"
|
||||||
size="large"
|
size="large"
|
||||||
[iconTooltip]="block.isFinished ? 'Finished' : block.internal ? 'Internal' : '' | translate"
|
[iconTooltip]="block.isFinished ? 'Finished' : block.internal ? 'Internal' : ('' | translate)"
|
||||||
>
|
>
|
||||||
<os-icon-container
|
<os-icon-container
|
||||||
[noWrap]="true"
|
[noWrap]="true"
|
||||||
@ -75,21 +77,23 @@
|
|||||||
<!-- Template for new motion block dialog -->
|
<!-- Template for new motion block dialog -->
|
||||||
<ng-template #newMotionBlockDialog>
|
<ng-template #newMotionBlockDialog>
|
||||||
<h1 mat-dialog-title>
|
<h1 mat-dialog-title>
|
||||||
<span translate>New motion block</span>
|
<span>{{ 'New motion block' | translate }}</span>
|
||||||
</h1>
|
</h1>
|
||||||
<form [formGroup]="createBlockForm" (keydown)="onKeyDown($event)">
|
<form [formGroup]="createBlockForm" (keydown)="onKeyDown($event)">
|
||||||
<div mat-dialog-content>
|
<div mat-dialog-content>
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<input formControlName="title" matInput placeholder="{{ 'Title' | translate }}" required />
|
<input formControlName="title" matInput placeholder="{{ 'Title' | translate }}" required />
|
||||||
<mat-error *ngIf="createBlockForm.get('title').hasError('required')" translate>
|
<mat-error *ngIf="createBlockForm.get('title').hasError('required')">
|
||||||
A title is required
|
{{ 'A title is required' | translate }}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
|
|
||||||
<!-- Internal -->
|
<!-- Internal -->
|
||||||
<p>
|
<p>
|
||||||
<mat-checkbox formControlName="internal"><span translate>Internal</span></mat-checkbox>
|
<mat-checkbox formControlName="internal"
|
||||||
|
><span>{{ 'Internal' | translate }}</span></mat-checkbox
|
||||||
|
>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<os-agenda-content-object-form [form]="createBlockForm"></os-agenda-content-object-form>
|
<os-agenda-content-object-form [form]="createBlockForm"></os-agenda-content-object-form>
|
||||||
@ -97,8 +101,10 @@
|
|||||||
</form>
|
</form>
|
||||||
<div mat-dialog-actions>
|
<div mat-dialog-actions>
|
||||||
<button mat-button [disabled]="!createBlockForm.valid" [mat-dialog-close]="true">
|
<button mat-button [disabled]="!createBlockForm.valid" [mat-dialog-close]="true">
|
||||||
<span translate>Save</span>
|
<span>{{ 'Save' | translate }}</span>
|
||||||
|
</button>
|
||||||
|
<button mat-button [mat-dialog-close]="false">
|
||||||
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-button [mat-dialog-close]="false"><span translate>Cancel</span></button>
|
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<os-head-bar prevUrl="../.." [nav]="false" [hasMainButton]="true" (mainEvent)="openDialog()">
|
<os-head-bar prevUrl="../.." [nav]="false" [hasMainButton]="true" (mainEvent)="openDialog()">
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot">
|
<div class="title-slot">
|
||||||
<h2 translate>Comment fields</h2>
|
<h2>{{ 'Comment fields' | translate }}</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Menu -->
|
<!-- Menu -->
|
||||||
@ -40,18 +40,18 @@
|
|||||||
</div>
|
</div>
|
||||||
</mat-panel-title>
|
</mat-panel-title>
|
||||||
</mat-expansion-panel-header>
|
</mat-expansion-panel-header>
|
||||||
<h3 translate>Name</h3>
|
<h3>{{ 'Name' | translate }}</h3>
|
||||||
<div class="spacer-left">{{ section.name }}</div>
|
<div class="spacer-left">{{ section.name }}</div>
|
||||||
<h3 translate>Groups with read permissions</h3>
|
<h3>{{ 'Groups with read permissions' | translate }}</h3>
|
||||||
<ul *ngFor="let group of section.read_groups">
|
<ul *ngFor="let group of section.read_groups">
|
||||||
<li>{{ group.getTitle() }}</li>
|
<li>{{ group.getTitle() }}</li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="spacer-left" *ngIf="section.read_groups.length === 0" translate>No groups selected</div>
|
<div class="spacer-left" *ngIf="section.read_groups.length === 0">{{ 'No groups selected' | translate }}</div>
|
||||||
<h3 translate>Groups with write permissions</h3>
|
<h3>{{ 'Groups with write permissions' | translate }}</h3>
|
||||||
<ul *ngFor="let group of section.write_groups">
|
<ul *ngFor="let group of section.write_groups">
|
||||||
<li>{{ group.getTitle() }}</li>
|
<li>{{ group.getTitle() }}</li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="spacer-left" *ngIf="section.write_groups.length === 0" translate>No groups selected</div>
|
<div class="spacer-left" *ngIf="section.write_groups.length === 0">{{ 'No groups selected' | translate }}</div>
|
||||||
<mat-action-row>
|
<mat-action-row>
|
||||||
<button mat-button (click)="openDialog(section)" mat-icon-button>
|
<button mat-button (click)="openDialog(section)" mat-icon-button>
|
||||||
<mat-icon>edit</mat-icon>
|
<mat-icon>edit</mat-icon>
|
||||||
@ -66,15 +66,15 @@
|
|||||||
<mat-menu #commentListMenu="matMenu">
|
<mat-menu #commentListMenu="matMenu">
|
||||||
<button mat-menu-item routerLink="sort">
|
<button mat-menu-item routerLink="sort">
|
||||||
<mat-icon>sort</mat-icon>
|
<mat-icon>sort</mat-icon>
|
||||||
<span translate>Sort</span>
|
<span>{{ 'Sort' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
|
|
||||||
<!-- Template for motion comment dialog -->
|
<!-- Template for motion comment dialog -->
|
||||||
<ng-template #motionCommentDialog>
|
<ng-template #motionCommentDialog>
|
||||||
<h1 mat-dialog-title>
|
<h1 mat-dialog-title>
|
||||||
<span *ngIf="currentComment" translate>Edit comment field</span>
|
<span *ngIf="currentComment">{{ 'Edit comment field' | translate }}</span>
|
||||||
<span *ngIf="!currentComment" translate>New comment field</span>
|
<span *ngIf="!currentComment">{{ 'New comment field' | translate }}</span>
|
||||||
</h1>
|
</h1>
|
||||||
<div class="os-form-card-mobile" mat-dialog-content>
|
<div class="os-form-card-mobile" mat-dialog-content>
|
||||||
<form [formGroup]="commentFieldForm" (keydown)="onKeyDown($event)">
|
<form [formGroup]="commentFieldForm" (keydown)="onKeyDown($event)">
|
||||||
@ -82,7 +82,7 @@
|
|||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<input formControlName="name" matInput placeholder="{{ 'Name' | translate }}" required />
|
<input formControlName="name" matInput placeholder="{{ 'Name' | translate }}" required />
|
||||||
<mat-error *ngIf="!commentFieldForm.controls.name.valid">
|
<mat-error *ngIf="!commentFieldForm.controls.name.valid">
|
||||||
<span translate>Required</span>
|
<span>{{ 'Required' | translate }}</span>
|
||||||
</mat-error>
|
</mat-error>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</p>
|
</p>
|
||||||
@ -110,10 +110,10 @@
|
|||||||
</div>
|
</div>
|
||||||
<div mat-dialog-actions>
|
<div mat-dialog-actions>
|
||||||
<button [disabled]="commentFieldForm.invalid" mat-button [mat-dialog-close]="true">
|
<button [disabled]="commentFieldForm.invalid" mat-button [mat-dialog-close]="true">
|
||||||
<span translate>Save</span>
|
<span>{{ 'Save' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-button [mat-dialog-close]="false">
|
<button mat-button [mat-dialog-close]="false">
|
||||||
<span translate>Cancel</span>
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
@ -1,13 +1,12 @@
|
|||||||
<os-head-bar [nav]="false">
|
<os-head-bar [nav]="false">
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot">
|
<div class="title-slot">
|
||||||
<h2 translate>Sort comments</h2>
|
<h2>{{ 'Sort comments' | translate }}</h2>
|
||||||
</div>
|
</div>
|
||||||
</os-head-bar>
|
</os-head-bar>
|
||||||
|
|
||||||
<!-- Content -->
|
<!-- Content -->
|
||||||
<mat-card class="os-form-card">
|
<mat-card class="os-form-card">
|
||||||
<!-- The sorting component -->
|
<!-- The sorting component -->
|
||||||
<os-sorting-list (sortEvent)="onSortingChange($event)" [live]="true" [input]="comments" #sorter>
|
<os-sorting-list (sortEvent)="onSortingChange($event)" [live]="true" [input]="comments" #sorter> </os-sorting-list>
|
||||||
</os-sorting-list>
|
|
||||||
</mat-card>
|
</mat-card>
|
||||||
|
@ -7,7 +7,9 @@
|
|||||||
(cancelEditEvent)="cancelCreation()"
|
(cancelEditEvent)="cancelCreation()"
|
||||||
>
|
>
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot"><h2 translate>New amendment</h2></div>
|
<div class="title-slot">
|
||||||
|
<h2>{{ 'New amendment' | translate }}</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Next-button -->
|
<!-- Next-button -->
|
||||||
<div class="extra-controls-slot">
|
<div class="extra-controls-slot">
|
||||||
@ -17,12 +19,12 @@
|
|||||||
[disabled]="contentForm.value.selectedParagraphs.length === 0"
|
[disabled]="contentForm.value.selectedParagraphs.length === 0"
|
||||||
(click)="matStepper.next()"
|
(click)="matStepper.next()"
|
||||||
>
|
>
|
||||||
<span class="upper" translate>Next</span>
|
<span class="upper">{{ 'Next' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="matStepper.selectedIndex === 1">
|
<div *ngIf="matStepper.selectedIndex === 1">
|
||||||
<button type="button" mat-button (click)="matStepper.previous()">
|
<button type="button" mat-button (click)="matStepper.previous()">
|
||||||
<span class="upper" translate>Previous</span>
|
<span class="upper">{{ 'Previous' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -59,7 +61,9 @@
|
|||||||
<mat-step>
|
<mat-step>
|
||||||
<ng-template matStepLabel>{{ 'Change paragraph' | translate }}</ng-template>
|
<ng-template matStepLabel>{{ 'Change paragraph' | translate }}</ng-template>
|
||||||
|
|
||||||
<h3><span translate>Amendment text</span></h3>
|
<h3>
|
||||||
|
<span>{{ 'Amendment text' | translate }}</span>
|
||||||
|
</h3>
|
||||||
|
|
||||||
<!-- Text -->
|
<!-- Text -->
|
||||||
<section *ngFor="let paragraph of contentForm.value.selectedParagraphs">
|
<section *ngFor="let paragraph of contentForm.value.selectedParagraphs">
|
||||||
@ -84,7 +88,8 @@
|
|||||||
: ''
|
: ''
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<span translate>Reason</span> <span *ngIf="reasonRequired">*</span>
|
<span>{{ 'Reason' | translate }}</span
|
||||||
|
> <span *ngIf="reasonRequired">*</span>
|
||||||
</h3>
|
</h3>
|
||||||
|
|
||||||
<editor formControlName="reason" [init]="tinyMceSettings" required></editor>
|
<editor formControlName="reason" [init]="tinyMceSettings" required></editor>
|
||||||
@ -95,9 +100,8 @@
|
|||||||
(contentForm.get('reason').dirty || contentForm.get('reason').touched)
|
(contentForm.get('reason').dirty || contentForm.get('reason').touched)
|
||||||
"
|
"
|
||||||
class="red-warning-text"
|
class="red-warning-text"
|
||||||
translate
|
|
||||||
>
|
>
|
||||||
This field is required.
|
{{ 'This field is required.' | translate }}
|
||||||
</div>
|
</div>
|
||||||
</mat-step>
|
</mat-step>
|
||||||
</mat-horizontal-stepper>
|
</mat-horizontal-stepper>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<h4>
|
<h4>
|
||||||
<span translate>Submitters</span>
|
<span>{{ 'Submitters' | translate }}</span>
|
||||||
<button
|
<button
|
||||||
class="small-button"
|
class="small-button"
|
||||||
type="button"
|
type="button"
|
||||||
@ -45,7 +45,11 @@
|
|||||||
</form>
|
</form>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<button type="button" mat-button (click)="onSave()"><span translate>Save</span></button>
|
<button type="button" mat-button (click)="onSave()">
|
||||||
<button type="button" mat-button (click)="onCancel()"><span translate>Cancel</span></button>
|
<span>{{ 'Save' | translate }}</span>
|
||||||
|
</button>
|
||||||
|
<button type="button" mat-button (click)="onCancel()">
|
||||||
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
|
</button>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
<h1 mat-dialog-title translate>New change recommendation</h1>
|
<h1 mat-dialog-title>{{ 'New change recommendation' | translate }}</h1>
|
||||||
<div mat-dialog-content>
|
<div mat-dialog-content>
|
||||||
<form class="motion-content" [formGroup]="contentForm" (ngSubmit)="saveChangeRecommendation()">
|
<form class="motion-content" [formGroup]="contentForm" (ngSubmit)="saveChangeRecommendation()">
|
||||||
<mat-radio-group #rGroup formControlName="diffType">
|
<mat-radio-group #rGroup formControlName="diffType">
|
||||||
@ -9,11 +9,11 @@
|
|||||||
|
|
||||||
<!-- The HTML Editor -->
|
<!-- The HTML Editor -->
|
||||||
<h4 *ngIf="lineRange.to == lineRange.from + 1">
|
<h4 *ngIf="lineRange.to == lineRange.from + 1">
|
||||||
<span translate>Changed version in line</span> {{ lineRange.from }}:
|
<span>{{ 'Changed version in line' | translate }}</span> {{ lineRange.from }}:
|
||||||
</h4>
|
</h4>
|
||||||
<h4 *ngIf="lineRange.to != lineRange.from + 1">
|
<h4 *ngIf="lineRange.to != lineRange.from + 1">
|
||||||
<span translate>Changed version in line</span> {{ lineRange.from }} <span translate>to</span>
|
<span>{{ 'Changed version in line' | translate }}</span> {{ lineRange.from }}
|
||||||
{{ lineRange.to - 1 }}:
|
<span>{{ 'to' | translate }}</span> {{ lineRange.to - 1 }}:
|
||||||
</h4>
|
</h4>
|
||||||
<div>
|
<div>
|
||||||
<editor formControlName="text" [init]="tinyMceSettings"></editor>
|
<editor formControlName="text" [init]="tinyMceSettings"></editor>
|
||||||
@ -25,9 +25,9 @@
|
|||||||
<div mat-dialog-actions>
|
<div mat-dialog-actions>
|
||||||
<!-- The mat-dialog-close directive optionally accepts a value as a result for the dialog. -->
|
<!-- The mat-dialog-close directive optionally accepts a value as a result for the dialog. -->
|
||||||
<button mat-button (click)="saveChangeRecommendation()">
|
<button mat-button (click)="saveChangeRecommendation()">
|
||||||
<span translate>Save</span>
|
<span>{{ 'Save' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-button mat-dialog-close>
|
<button mat-button mat-dialog-close>
|
||||||
<span translate>Cancel</span>
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -12,8 +12,8 @@
|
|||||||
<ng-container class="meta-text-block-content">
|
<ng-container class="meta-text-block-content">
|
||||||
<ng-container *ngIf="!isCommentEdited(section)">
|
<ng-container *ngIf="!isCommentEdited(section)">
|
||||||
<div *ngIf="comments[section.id]" [innerHTML]="comments[section.id].comment | trust: 'html'"></div>
|
<div *ngIf="comments[section.id]" [innerHTML]="comments[section.id].comment | trust: 'html'"></div>
|
||||||
<div class="no-content" *ngIf="!comments[section.id] || !comments[section.id].comment" translate>
|
<div class="no-content" *ngIf="!comments[section.id] || !comments[section.id].comment">
|
||||||
No comment
|
{{ 'No comment' | translate }}
|
||||||
</div>
|
</div>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<form [formGroup]="commentForms[section.id]" *ngIf="isCommentEdited(section)">
|
<form [formGroup]="commentForms[section.id]" *ngIf="isCommentEdited(section)">
|
||||||
@ -27,9 +27,9 @@
|
|||||||
></editor>
|
></editor>
|
||||||
</form>
|
</form>
|
||||||
<div *ngIf="saveHint">
|
<div *ngIf="saveHint">
|
||||||
<span translate>Touch the book icon to enter text</span>
|
<span>{{ 'Touch the book icon to enter text' | translate }}</span>
|
||||||
<br />
|
<br />
|
||||||
<span class="red-warning-text" translate>Do not forget to save your changes!</span>
|
<span class="red-warning-text">{{ 'Do not forget to save your changes!' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
|
@ -26,7 +26,9 @@
|
|||||||
-->
|
-->
|
||||||
</span>
|
</span>
|
||||||
<span class="status">
|
<span class="status">
|
||||||
<ng-container *ngIf="change.isRejected()"> – <span translate>Rejected</span></ng-container>
|
<ng-container *ngIf="change.isRejected()">
|
||||||
|
– <span>{{ 'Rejected' | translate }}</span></ng-container
|
||||||
|
>
|
||||||
<ng-container *ngIf="change.isAccepted() && isAmendment(change)">
|
<ng-container *ngIf="change.isAccepted() && isAmendment(change)">
|
||||||
– {{ change.stateName | translate }}</ng-container
|
– {{ change.stateName | translate }}</ng-container
|
||||||
>
|
>
|
||||||
@ -150,7 +152,7 @@
|
|||||||
(click)="setAcceptanceValue(change, 'accepted')"
|
(click)="setAcceptanceValue(change, 'accepted')"
|
||||||
>
|
>
|
||||||
<mat-icon>thumb_up</mat-icon>
|
<mat-icon>thumb_up</mat-icon>
|
||||||
<span translate>Accept</span>
|
<span>{{ 'Accept' | translate }}</span>
|
||||||
<mat-icon class="active-indicator">{{ change.isAccepted() ? 'done' : '' }}</mat-icon>
|
<mat-icon class="active-indicator">{{ change.isAccepted() ? 'done' : '' }}</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
@ -160,16 +162,16 @@
|
|||||||
(click)="setAcceptanceValue(change, 'rejected')"
|
(click)="setAcceptanceValue(change, 'rejected')"
|
||||||
>
|
>
|
||||||
<mat-icon>thumb_down</mat-icon>
|
<mat-icon>thumb_down</mat-icon>
|
||||||
<span translate>Reject</span>
|
<span>{{ 'Reject' | translate }}</span>
|
||||||
<mat-icon class="active-indicator">{{ change.isRejected() ? 'done' : '' }}</mat-icon>
|
<mat-icon class="active-indicator">{{ change.isRejected() ? 'done' : '' }}</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" mat-menu-item (click)="setInternal(change, !change.internal)">
|
<button type="button" mat-menu-item (click)="setInternal(change, !change.internal)">
|
||||||
<mat-icon>{{ change.internal ? 'check_box_outline_blank' : 'check_box' }}</mat-icon>
|
<mat-icon>{{ change.internal ? 'check_box_outline_blank' : 'check_box' }}</mat-icon>
|
||||||
<span translate>Public</span>
|
<span>{{ 'Public' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" mat-menu-item (click)="deleteChangeRecommendation(change, $event)">
|
<button type="button" mat-menu-item (click)="deleteChangeRecommendation(change, $event)">
|
||||||
<mat-icon>delete</mat-icon>
|
<mat-icon>delete</mat-icon>
|
||||||
<span translate>Delete</span>
|
<span>{{ 'Delete' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
@ -178,7 +180,7 @@
|
|||||||
*ngIf="!change.isTitleChange()"
|
*ngIf="!change.isTitleChange()"
|
||||||
>
|
>
|
||||||
<mat-icon>edit</mat-icon>
|
<mat-icon>edit</mat-icon>
|
||||||
<span translate>Edit</span>
|
<span>{{ 'Edit' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
@ -187,7 +189,7 @@
|
|||||||
*ngIf="change.isTitleChange()"
|
*ngIf="change.isTitleChange()"
|
||||||
>
|
>
|
||||||
<mat-icon>edit</mat-icon>
|
<mat-icon>edit</mat-icon>
|
||||||
<span translate>Edit</span>
|
<span>{{ 'Edit' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
|
@ -12,13 +12,13 @@
|
|||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot">
|
<div class="title-slot">
|
||||||
<h2 *ngIf="motion && !newMotion">
|
<h2 *ngIf="motion && !newMotion">
|
||||||
<span translate>Motion</span>
|
<span>{{ 'Motion' | translate }}</span>
|
||||||
<!-- Whitespace between "Motion" and identifier -->
|
<!-- Whitespace between "Motion" and identifier -->
|
||||||
<span> </span> <span *ngIf="!editMotion">{{ motion.identifier }}</span>
|
<span> </span> <span *ngIf="!editMotion">{{ motion.identifier }}</span>
|
||||||
<span *ngIf="editMotion">{{ contentForm.get('identifier').value }}</span>
|
<span *ngIf="editMotion">{{ contentForm.get('identifier').value }}</span>
|
||||||
</h2>
|
</h2>
|
||||||
<h2 *ngIf="newMotion && !amendmentEdit" translate>New motion</h2>
|
<h2 *ngIf="newMotion && !amendmentEdit">{{ 'New motion' | translate }}</h2>
|
||||||
<h2 *ngIf="amendmentEdit" translate>New amendment</h2>
|
<h2 *ngIf="amendmentEdit">{{ 'New amendment' | translate }}</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Back and forth buttons -->
|
<!-- Back and forth buttons -->
|
||||||
@ -62,7 +62,7 @@
|
|||||||
<!-- PDF -->
|
<!-- PDF -->
|
||||||
<button mat-menu-item (click)="onDownloadPdf()">
|
<button mat-menu-item (click)="onDownloadPdf()">
|
||||||
<mat-icon>picture_as_pdf</mat-icon>
|
<mat-icon>picture_as_pdf</mat-icon>
|
||||||
<span translate>PDF</span>
|
<span>{{ 'PDF' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
<!-- Project -->
|
<!-- Project -->
|
||||||
@ -75,11 +75,11 @@
|
|||||||
<div *osPerms="'agenda.can_manage'">
|
<div *osPerms="'agenda.can_manage'">
|
||||||
<button mat-menu-item (click)="addToAgenda()" *ngIf="motion && !motion.item">
|
<button mat-menu-item (click)="addToAgenda()" *ngIf="motion && !motion.item">
|
||||||
<mat-icon>add</mat-icon>
|
<mat-icon>add</mat-icon>
|
||||||
<span translate>Add to agenda</span>
|
<span>{{ 'Add to agenda' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-menu-item (click)="removeFromAgenda()" *ngIf="motion && motion.item">
|
<button mat-menu-item (click)="removeFromAgenda()" *ngIf="motion && motion.item">
|
||||||
<mat-icon>remove</mat-icon>
|
<mat-icon>remove</mat-icon>
|
||||||
<span translate>Remove from agenda</span>
|
<span>{{ 'Remove from agenda' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button
|
||||||
@ -89,15 +89,15 @@
|
|||||||
[queryParams]="{ element: motion.elementId }"
|
[queryParams]="{ element: motion.elementId }"
|
||||||
>
|
>
|
||||||
<mat-icon>history</mat-icon>
|
<mat-icon>history</mat-icon>
|
||||||
<span translate>
|
<span>
|
||||||
History
|
{{ 'History' | translate }}
|
||||||
</span>
|
</span>
|
||||||
</button>
|
</button>
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
<!-- Edit-->
|
<!-- Edit-->
|
||||||
<button mat-menu-item (click)="setEditMode(true)" *ngIf="perms.isAllowed('update', motion)">
|
<button mat-menu-item (click)="setEditMode(true)" *ngIf="perms.isAllowed('update', motion)">
|
||||||
<mat-icon>edit</mat-icon>
|
<mat-icon>edit</mat-icon>
|
||||||
<span translate>Edit</span>
|
<span>{{ 'Edit' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<!-- Delete -->
|
<!-- Delete -->
|
||||||
<button
|
<button
|
||||||
@ -107,7 +107,7 @@
|
|||||||
*ngIf="perms.isAllowed('manage')"
|
*ngIf="perms.isAllowed('manage')"
|
||||||
>
|
>
|
||||||
<mat-icon>delete</mat-icon>
|
<mat-icon>delete</mat-icon>
|
||||||
<span translate>Delete</span>
|
<span>{{ 'Delete' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
@ -145,14 +145,15 @@
|
|||||||
|
|
||||||
<!-- Sequential number -->
|
<!-- Sequential number -->
|
||||||
<span class="main-nav-color title-font">
|
<span class="main-nav-color title-font">
|
||||||
<span *ngIf="showSequential"> <span translate>Sequential number</span> {{ motion.id }} </span>
|
<span *ngIf="showSequential">
|
||||||
|
<span>{{ 'Sequential number' | translate }}</span
|
||||||
|
> {{ motion.id }}
|
||||||
|
</span>
|
||||||
<span *ngIf="showSequential && motion.parent_id">· </span>
|
<span *ngIf="showSequential && motion.parent_id">· </span>
|
||||||
<span *ngIf="motion.parent_id">
|
<span *ngIf="motion.parent_id">
|
||||||
<span>
|
<span>
|
||||||
<span translate>Amendment to</span> <a
|
<span>{{ 'Amendment to' | translate }}</span
|
||||||
[routerLink]="motion.parent.getDetailStateURL()"
|
> <a [routerLink]="motion.parent.getDetailStateURL()" [state]="{ back: 'true' }">
|
||||||
[state]="{ back: 'true' }"
|
|
||||||
>
|
|
||||||
{{ motion.parent.identifier || motion.parent.title }}
|
{{ motion.parent.identifier || motion.parent.title }}
|
||||||
</a>
|
</a>
|
||||||
</span>
|
</span>
|
||||||
@ -208,7 +209,7 @@
|
|||||||
|
|
||||||
<!-- do Support -->
|
<!-- do Support -->
|
||||||
<div *ngIf="minSupporters && !editMotion">
|
<div *ngIf="minSupporters && !editMotion">
|
||||||
<h4 *ngIf="perms.isAllowed('support', motion) || motion.hasSupporters()" translate>Supporters</h4>
|
<h4 *ngIf="perms.isAllowed('support', motion) || motion.hasSupporters()">{{ 'Supporters' | translate }}</h4>
|
||||||
|
|
||||||
<!-- support button -->
|
<!-- support button -->
|
||||||
<button
|
<button
|
||||||
@ -321,13 +322,13 @@
|
|||||||
(click)="onFollowRecButton()"
|
(click)="onFollowRecButton()"
|
||||||
class="spacer-top-10"
|
class="spacer-top-10"
|
||||||
>
|
>
|
||||||
<span translate>Follow recommendation</span>
|
<span>{{ 'Follow recommendation' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- recommendation referencing motions -->
|
<!-- recommendation referencing motions -->
|
||||||
<div *ngIf="!editMotion && recommendationReferencingMotions.length > 0 && showReferringMotions">
|
<div *ngIf="!editMotion && recommendationReferencingMotions.length > 0 && showReferringMotions">
|
||||||
<h4 translate>Referring motions</h4>
|
<h4>{{ 'Referring motions' | translate }}</h4>
|
||||||
<span *ngFor="let motion of recommendationReferencingMotions; let last = last">
|
<span *ngFor="let motion of recommendationReferencingMotions; let last = last">
|
||||||
<a [routerLink]="motion.getDetailStateURL()" class="nowrap">{{ motion.identifierOrTitle }}</a>
|
<a [routerLink]="motion.getDetailStateURL()" class="nowrap">{{ motion.identifierOrTitle }}</a>
|
||||||
<span *ngIf="!last"> · </span>
|
<span *ngIf="!last"> · </span>
|
||||||
@ -337,7 +338,7 @@
|
|||||||
<!-- Category -->
|
<!-- Category -->
|
||||||
<!-- Disabled during "new motion" since changing has no effect -->
|
<!-- Disabled during "new motion" since changing has no effect -->
|
||||||
<div *ngIf="!editMotion && categoryObserver.value.length">
|
<div *ngIf="!editMotion && categoryObserver.value.length">
|
||||||
<h4 *ngIf="perms.isAllowed('change_metadata', motion) || motion.category" translate>Category</h4>
|
<h4 *ngIf="perms.isAllowed('change_metadata', motion) || motion.category">{{ 'Category' | translate }}</h4>
|
||||||
<mat-menu #categoryMenu="matMenu">
|
<mat-menu #categoryMenu="matMenu">
|
||||||
<button
|
<button
|
||||||
mat-menu-item
|
mat-menu-item
|
||||||
@ -382,7 +383,7 @@
|
|||||||
<!-- Tags -->
|
<!-- Tags -->
|
||||||
<!-- Disabled during "new motion" since changing has no effect -->
|
<!-- Disabled during "new motion" since changing has no effect -->
|
||||||
<div *ngIf="!editMotion && tagObserver.value.length > 0">
|
<div *ngIf="!editMotion && tagObserver.value.length > 0">
|
||||||
<h4 *ngIf="perms.isAllowed('change_metadata', motion) || motion.hasTags()" translate>Tags</h4>
|
<h4 *ngIf="perms.isAllowed('change_metadata', motion) || motion.hasTags()">{{ 'Tags' | translate }}</h4>
|
||||||
|
|
||||||
<!-- For privileged users -->
|
<!-- For privileged users -->
|
||||||
<div *ngIf="perms.isAllowed('change_metadata', motion)">
|
<div *ngIf="perms.isAllowed('change_metadata', motion)">
|
||||||
@ -422,7 +423,9 @@
|
|||||||
|
|
||||||
<!-- Block -->
|
<!-- Block -->
|
||||||
<div *ngIf="!editMotion && blockObserver.value.length > 0">
|
<div *ngIf="!editMotion && blockObserver.value.length > 0">
|
||||||
<h4 *ngIf="perms.isAllowed('change_metadata', motion) || motion.motion_block" translate>Motion block</h4>
|
<h4 *ngIf="perms.isAllowed('change_metadata', motion) || motion.motion_block">
|
||||||
|
{{ 'Motion block' | translate }}
|
||||||
|
</h4>
|
||||||
<mat-menu #blockMenu="matMenu">
|
<mat-menu #blockMenu="matMenu">
|
||||||
<button mat-menu-item *ngFor="let block of blockObserver.value" (click)="setBlock(block.id)">
|
<button mat-menu-item *ngFor="let block of blockObserver.value" (click)="setBlock(block.id)">
|
||||||
<mat-icon *ngIf="motion.motion_block_id === block.id">check</mat-icon>
|
<mat-icon *ngIf="motion.motion_block_id === block.id">check</mat-icon>
|
||||||
@ -448,17 +451,17 @@
|
|||||||
|
|
||||||
<!-- Origin - display only -->
|
<!-- Origin - display only -->
|
||||||
<div *ngIf="!editMotion && motion.origin">
|
<div *ngIf="!editMotion && motion.origin">
|
||||||
<h4 translate>Origin</h4>
|
<h4>{{ 'Origin' | translate }}</h4>
|
||||||
{{ motion.origin }}
|
{{ motion.origin }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Ammendments -->
|
<!-- Ammendments -->
|
||||||
<div *ngIf="!editMotion && amendments && amendments.length > 0">
|
<div *ngIf="!editMotion && amendments && amendments.length > 0">
|
||||||
<h4 translate>Amendments</h4>
|
<h4>{{ 'Amendments' | translate }}</h4>
|
||||||
<a [routerLink]="['/motions/amendments', motion.id]" [state]="{ back: 'true' }">
|
<a [routerLink]="['/motions/amendments', motion.id]" [state]="{ back: 'true' }">
|
||||||
{{ amendments.length }}
|
{{ amendments.length }}
|
||||||
<span *ngIf="amendments.length === 1" translate>Amendment</span>
|
<span *ngIf="amendments.length === 1">{{ 'Amendment' | translate }}</span>
|
||||||
<span *ngIf="amendments.length > 1" translate>Amendments</span>
|
<span *ngIf="amendments.length > 1">{{ 'Amendments' | translate }}</span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -473,7 +476,7 @@
|
|||||||
*ngIf="perms.isAllowed('createpoll', motion)"
|
*ngIf="perms.isAllowed('createpoll', motion)"
|
||||||
>
|
>
|
||||||
<mat-icon class="main-nav-color">add</mat-icon>
|
<mat-icon class="main-nav-color">add</mat-icon>
|
||||||
<span translate>New vote</span>
|
<span>{{ 'New vote' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -496,7 +499,7 @@
|
|||||||
[ngModelOptions]="{ standalone: true }"
|
[ngModelOptions]="{ standalone: true }"
|
||||||
[errorStateMatcher]="highlightedLineMatcher"
|
[errorStateMatcher]="highlightedLineMatcher"
|
||||||
/>
|
/>
|
||||||
<mat-error *ngIf="highlightedLineTyping > 10" translate>Invalid line number</mat-error>
|
<mat-error *ngIf="highlightedLineTyping > 10">{{ 'Invalid line number' | translate }}</mat-error>
|
||||||
<button
|
<button
|
||||||
type="submit"
|
type="submit"
|
||||||
mat-button
|
mat-button
|
||||||
@ -515,8 +518,11 @@
|
|||||||
|
|
||||||
<button type="button" mat-button [matMenuTriggerFor]="lineNumberingMenu">
|
<button type="button" mat-button [matMenuTriggerFor]="lineNumberingMenu">
|
||||||
<mat-icon>format_list_numbered</mat-icon>
|
<mat-icon>format_list_numbered</mat-icon>
|
||||||
<span translate>Line numbering</span>
|
<span>{{ 'Line numbering' | translate }}</span>
|
||||||
<span *ngIf="lnMode === LineNumberingMode.None"> (<span translate>none</span>) </span>
|
<span *ngIf="lnMode === LineNumberingMode.None">
|
||||||
|
(<span>{{ 'none' | translate }}</span
|
||||||
|
>)
|
||||||
|
</span>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
@ -695,9 +701,8 @@
|
|||||||
contentForm.get('modified_final_version').touched)
|
contentForm.get('modified_final_version').touched)
|
||||||
"
|
"
|
||||||
class="red-warning-text"
|
class="red-warning-text"
|
||||||
translate
|
|
||||||
>
|
>
|
||||||
This field is required.
|
{{ 'This field is required.' | translate }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
@ -718,9 +723,8 @@
|
|||||||
(contentForm.get('text').dirty || contentForm.get('text').touched)
|
(contentForm.get('text').dirty || contentForm.get('text').touched)
|
||||||
"
|
"
|
||||||
class="red-warning-text"
|
class="red-warning-text"
|
||||||
translate
|
|
||||||
>
|
>
|
||||||
This field is required.
|
{{ 'This field is required.' | translate }}
|
||||||
</div>
|
</div>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
@ -743,9 +747,8 @@
|
|||||||
contentForm.get('text_' + paragraph.paragraphNo).touched)
|
contentForm.get('text_' + paragraph.paragraphNo).touched)
|
||||||
"
|
"
|
||||||
class="red-warning-text"
|
class="red-warning-text"
|
||||||
translate
|
|
||||||
>
|
>
|
||||||
This field is required.
|
{{ 'This field is required.' | translate }}
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
@ -766,7 +769,8 @@
|
|||||||
: ''
|
: ''
|
||||||
"
|
"
|
||||||
>
|
>
|
||||||
<span translate>Reason</span> <span *ngIf="reasonRequired && editMotion">*</span>
|
<span>{{ 'Reason' | translate }}</span
|
||||||
|
> <span *ngIf="reasonRequired && editMotion">*</span>
|
||||||
</h3>
|
</h3>
|
||||||
<div class="motion-text" *ngIf="!editMotion" [innerHtml]="motion.reason | trust: 'html'"></div>
|
<div class="motion-text" *ngIf="!editMotion" [innerHtml]="motion.reason | trust: 'html'"></div>
|
||||||
|
|
||||||
@ -784,9 +788,8 @@
|
|||||||
(contentForm.get('reason').dirty || contentForm.get('reason').touched)
|
(contentForm.get('reason').dirty || contentForm.get('reason').touched)
|
||||||
"
|
"
|
||||||
class="red-warning-text"
|
class="red-warning-text"
|
||||||
translate
|
|
||||||
>
|
>
|
||||||
This field is required.
|
{{ 'This field is required.' | translate }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -869,7 +872,7 @@
|
|||||||
<!-- If the array exists, we do not have an error -->
|
<!-- If the array exists, we do not have an error -->
|
||||||
<div *ngIf="motion.diffLines">
|
<div *ngIf="motion.diffLines">
|
||||||
<div class="alert alert-info" *ngIf="motion.diffLines.length === 0">
|
<div class="alert alert-info" *ngIf="motion.diffLines.length === 0">
|
||||||
<span translate>No changes at the text.</span>
|
<span>{{ 'No changes at the text.' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
*ngFor="let paragraph of getAmendmentParagraphs(showAmendmentContext)"
|
*ngFor="let paragraph of getAmendmentParagraphs(showAmendmentContext)"
|
||||||
@ -900,9 +903,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="!motion.diffLines">
|
<div *ngIf="!motion.diffLines">
|
||||||
<span class="red-warning-text" translate>
|
<span class="red-warning-text">{{
|
||||||
There is an error with this amendment. Please edit it manually.
|
'There is an error with this amendment. Please edit it manually.' | translate
|
||||||
</span>
|
}}</span>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
@ -913,7 +916,7 @@
|
|||||||
*ngIf="motion && motion.isParagraphBasedAmendment()"
|
*ngIf="motion && motion.isParagraphBasedAmendment()"
|
||||||
class="show-entire-text-check"
|
class="show-entire-text-check"
|
||||||
>
|
>
|
||||||
<span translate>Show entire motion text</span>
|
<span>{{ 'Show entire motion text' | translate }}</span>
|
||||||
</mat-checkbox>
|
</mat-checkbox>
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
@ -923,32 +926,29 @@
|
|||||||
<div *ngIf="motion">
|
<div *ngIf="motion">
|
||||||
<button
|
<button
|
||||||
mat-menu-item
|
mat-menu-item
|
||||||
translate
|
|
||||||
(click)="setLineNumberingMode(LineNumberingMode.None)"
|
(click)="setLineNumberingMode(LineNumberingMode.None)"
|
||||||
[ngClass]="{ selected: lnMode === LineNumberingMode.None }"
|
[ngClass]="{ selected: lnMode === LineNumberingMode.None }"
|
||||||
>
|
>
|
||||||
none
|
{{ 'none' | translate }}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
mat-menu-item
|
mat-menu-item
|
||||||
translate
|
|
||||||
(click)="setLineNumberingMode(LineNumberingMode.Inside)"
|
(click)="setLineNumberingMode(LineNumberingMode.Inside)"
|
||||||
[ngClass]="{ selected: lnMode === LineNumberingMode.Inside }"
|
[ngClass]="{ selected: lnMode === LineNumberingMode.Inside }"
|
||||||
>
|
>
|
||||||
inline
|
{{ 'inline' | translate }}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
mat-menu-item
|
mat-menu-item
|
||||||
translate
|
|
||||||
(click)="setLineNumberingMode(LineNumberingMode.Outside)"
|
(click)="setLineNumberingMode(LineNumberingMode.Outside)"
|
||||||
[ngClass]="{ selected: lnMode === LineNumberingMode.Outside }"
|
[ngClass]="{ selected: lnMode === LineNumberingMode.Outside }"
|
||||||
>
|
>
|
||||||
outside
|
{{ 'outside' | translate }}
|
||||||
</button>
|
</button>
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
<button mat-menu-item *ngIf="!highlightedLineOpened" (click)="highlightedLineOpened = true">
|
<button mat-menu-item *ngIf="!highlightedLineOpened" (click)="highlightedLineOpened = true">
|
||||||
<mat-icon>redo</mat-icon>
|
<mat-icon>redo</mat-icon>
|
||||||
<span translate>Go to line</span>
|
<span>{{ 'Go to line' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
@ -957,46 +957,41 @@
|
|||||||
<mat-menu #changeRecoMenu="matMenu">
|
<mat-menu #changeRecoMenu="matMenu">
|
||||||
<button
|
<button
|
||||||
mat-menu-item
|
mat-menu-item
|
||||||
translate
|
|
||||||
(click)="setChangeRecoMode(ChangeRecoMode.Original)"
|
(click)="setChangeRecoMode(ChangeRecoMode.Original)"
|
||||||
[ngClass]="{ selected: crMode === ChangeRecoMode.Original }"
|
[ngClass]="{ selected: crMode === ChangeRecoMode.Original }"
|
||||||
>
|
>
|
||||||
Original version
|
{{ 'Original version' | translate }}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
mat-menu-item
|
mat-menu-item
|
||||||
translate
|
|
||||||
(click)="setChangeRecoMode(ChangeRecoMode.Changed)"
|
(click)="setChangeRecoMode(ChangeRecoMode.Changed)"
|
||||||
[ngClass]="{ selected: crMode === ChangeRecoMode.Changed }"
|
[ngClass]="{ selected: crMode === ChangeRecoMode.Changed }"
|
||||||
*ngIf="allChangingObjects && allChangingObjects.length"
|
*ngIf="allChangingObjects && allChangingObjects.length"
|
||||||
>
|
>
|
||||||
Changed version
|
{{ 'Changed version' | translate }}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
mat-menu-item
|
mat-menu-item
|
||||||
translate
|
|
||||||
(click)="setChangeRecoMode(ChangeRecoMode.Diff)"
|
(click)="setChangeRecoMode(ChangeRecoMode.Diff)"
|
||||||
[ngClass]="{ selected: crMode === ChangeRecoMode.Diff }"
|
[ngClass]="{ selected: crMode === ChangeRecoMode.Diff }"
|
||||||
*ngIf="allChangingObjects && allChangingObjects.length"
|
*ngIf="allChangingObjects && allChangingObjects.length"
|
||||||
>
|
>
|
||||||
Diff version
|
{{ 'Diff version' | translate }}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
mat-menu-item
|
mat-menu-item
|
||||||
translate
|
|
||||||
(click)="setChangeRecoMode(ChangeRecoMode.Final)"
|
(click)="setChangeRecoMode(ChangeRecoMode.Final)"
|
||||||
[ngClass]="{ selected: crMode === ChangeRecoMode.Final }"
|
[ngClass]="{ selected: crMode === ChangeRecoMode.Final }"
|
||||||
*ngIf="allChangingObjects && allChangingObjects.length"
|
*ngIf="allChangingObjects && allChangingObjects.length"
|
||||||
>
|
>
|
||||||
Final version
|
{{ 'Final version' | translate }}
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
mat-menu-item
|
mat-menu-item
|
||||||
translate
|
|
||||||
*ngIf="motion && motion.modified_final_version"
|
*ngIf="motion && motion.modified_final_version"
|
||||||
(click)="setChangeRecoMode(ChangeRecoMode.ModifiedFinal)"
|
(click)="setChangeRecoMode(ChangeRecoMode.ModifiedFinal)"
|
||||||
[ngClass]="{ selected: crMode === ChangeRecoMode.ModifiedFinal }"
|
[ngClass]="{ selected: crMode === ChangeRecoMode.ModifiedFinal }"
|
||||||
>
|
>
|
||||||
Final print template
|
{{ 'Final print template' | translate }}
|
||||||
</button>
|
</button>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
<h1 mat-dialog-title translate>New change recommendation</h1>
|
<h1 mat-dialog-title>{{ 'New change recommendation' | translate }}</h1>
|
||||||
<mat-dialog-content>
|
<mat-dialog-content>
|
||||||
<form class="motion-content" [formGroup]="contentForm" (ngSubmit)="saveChangeRecommendation()">
|
<form class="motion-content" [formGroup]="contentForm" (ngSubmit)="saveChangeRecommendation()">
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
@ -11,9 +11,9 @@
|
|||||||
<mat-dialog-actions>
|
<mat-dialog-actions>
|
||||||
<!-- The mat-dialog-close directive optionally accepts a value as a result for the dialog. -->
|
<!-- The mat-dialog-close directive optionally accepts a value as a result for the dialog. -->
|
||||||
<button mat-button (click)="saveChangeRecommendation()">
|
<button mat-button (click)="saveChangeRecommendation()">
|
||||||
<span translate>Save</span>
|
<span>{{ 'Save' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-button mat-dialog-close>
|
<button mat-button mat-dialog-close>
|
||||||
<span translate>Cancel</span>
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</mat-dialog-actions>
|
</mat-dialog-actions>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<os-meta-text-block showActionRow="true" icon="speaker_notes" [disableExpandControl]="true">
|
<os-meta-text-block showActionRow="true" icon="speaker_notes" [disableExpandControl]="true">
|
||||||
<!-- Title row -->
|
<!-- Title row -->
|
||||||
<ng-container class="meta-text-block-title">
|
<ng-container class="meta-text-block-title">
|
||||||
<span translate>Personal note</span>
|
<span>{{ 'Personal note' | translate }}</span>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<!-- Actions -->
|
<!-- Actions -->
|
||||||
@ -40,8 +40,8 @@
|
|||||||
<ng-container class="meta-text-block-content">
|
<ng-container class="meta-text-block-content">
|
||||||
<ng-container *ngIf="!isEditMode">
|
<ng-container *ngIf="!isEditMode">
|
||||||
<div *ngIf="motion && motion.personalNote" [innerHTML]="personalNoteText | trust: 'html'"></div>
|
<div *ngIf="motion && motion.personalNote" [innerHTML]="personalNoteText | trust: 'html'"></div>
|
||||||
<div class="no-content" *ngIf="!motion || !motion.hasNotes" translate>
|
<div class="no-content" *ngIf="!motion || !motion.hasNotes">
|
||||||
No personal note
|
{{ 'No personal note' | translate }}
|
||||||
</div>
|
</div>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<form [formGroup]="personalNoteForm" *ngIf="isEditMode">
|
<form [formGroup]="personalNoteForm" *ngIf="isEditMode">
|
||||||
@ -54,9 +54,9 @@
|
|||||||
></editor>
|
></editor>
|
||||||
</form>
|
</form>
|
||||||
<div *ngIf="saveHint">
|
<div *ngIf="saveHint">
|
||||||
<span translate>Touch the book icon to enter text</span>
|
<span>{{ 'Touch the book icon to enter text' | translate }}</span>
|
||||||
<br />
|
<br />
|
||||||
<span class="red-warning-text" translate>Do not forget to save your changes!</span>
|
<span class="red-warning-text">{{ 'Do not forget to save your changes!' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</os-meta-text-block>
|
</os-meta-text-block>
|
||||||
|
@ -1,16 +1,20 @@
|
|||||||
<os-head-bar prevUrl="../.." [nav]="false">
|
<os-head-bar prevUrl="../.." [nav]="false">
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot"><h2 translate>Import motions</h2></div>
|
<div class="title-slot">
|
||||||
|
<h2>{{ 'Import motions' | translate }}</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="menu-slot">
|
<div class="menu-slot">
|
||||||
<button *ngIf="hasFile && newCount" mat-button (click)="doImport()">
|
<button *ngIf="hasFile && newCount" mat-button (click)="doImport()">
|
||||||
<span class="upper" translate> Import</span>
|
<span class="upper">{{ 'Import' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</os-head-bar>
|
</os-head-bar>
|
||||||
|
|
||||||
<mat-card class="os-form-card import-table">
|
<mat-card class="os-form-card import-table">
|
||||||
<span translate>Required comma or semicolon separated values with these column header names in the first row:</span>
|
<span>{{
|
||||||
|
'Required comma or semicolon separated values with these column header names in the first row:' | translate
|
||||||
|
}}</span>
|
||||||
<br />
|
<br />
|
||||||
<div class="code red-warning-text">
|
<div class="code red-warning-text">
|
||||||
<span *ngFor="let header of this.expectedHeader; let last = last">
|
<span *ngFor="let header of this.expectedHeader; let last = last">
|
||||||
@ -19,18 +23,27 @@
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<ul>
|
<ul>
|
||||||
<li translate>
|
<li>
|
||||||
Identifier, reason, submitter, category, origin and motion block are optional and may be empty.
|
{{
|
||||||
|
'Identifier, reason, submitter, category, origin and motion block are optional and may be empty.'
|
||||||
|
| translate
|
||||||
|
}}
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
{{
|
||||||
|
'Additional columns after the required ones may be present and will not affect the import.' | translate
|
||||||
|
}}
|
||||||
</li>
|
</li>
|
||||||
<li translate>Additional columns after the required ones may be present and won't affect the import.</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
<button mat-button color="accent" (click)="downloadCsvExample()" translate>Download CSV example file</button>
|
<button mat-button color="accent" (click)="downloadCsvExample()">
|
||||||
|
{{ 'Download CSV example file' | translate }}
|
||||||
|
</button>
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<mat-label translate>Encoding of the file</mat-label>
|
<mat-label>{{ 'Encoding of the file' | translate }}</mat-label>
|
||||||
<mat-select
|
<mat-select
|
||||||
class="selection"
|
class="selection"
|
||||||
placeholder="translate.instant('Select encoding')"
|
placeholder="{{ 'Select encoding' | translate }}"
|
||||||
(selectionChange)="selectEncoding($event)"
|
(selectionChange)="selectEncoding($event)"
|
||||||
[value]="encodings[0].value"
|
[value]="encodings[0].value"
|
||||||
>
|
>
|
||||||
@ -40,7 +53,7 @@
|
|||||||
</mat-select>
|
</mat-select>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<mat-label translate>Column separator</mat-label>
|
<mat-label>{{ 'Column separator' | translate }}</mat-label>
|
||||||
<mat-select class="selection" (selectionChange)="selectColSep($event)" value="">
|
<mat-select class="selection" (selectionChange)="selectColSep($event)" value="">
|
||||||
<mat-option *ngFor="let option of columnSeparators" [value]="option.value">
|
<mat-option *ngFor="let option of columnSeparators" [value]="option.value">
|
||||||
{{ option.label | translate }}
|
{{ option.label | translate }}
|
||||||
@ -48,7 +61,7 @@
|
|||||||
</mat-select>
|
</mat-select>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<mat-label translate>Text separator</mat-label>
|
<mat-label>{{ 'Text separator' | translate }}</mat-label>
|
||||||
<mat-select class="selection" (selectionChange)="selectTextSep($event)" value='"'>
|
<mat-select class="selection" (selectionChange)="selectTextSep($event)" value='"'>
|
||||||
<mat-option *ngFor="let option of textSeparators" [value]="option.value">
|
<mat-option *ngFor="let option of textSeparators" [value]="option.value">
|
||||||
{{ option.label | translate }}
|
{{ option.label | translate }}
|
||||||
@ -67,7 +80,7 @@
|
|||||||
(change)="onSelectFile($event)"
|
(change)="onSelectFile($event)"
|
||||||
/>
|
/>
|
||||||
<button mat-button osAutofocus onclick="document.getElementById('motion-import-file-input').click()">
|
<button mat-button osAutofocus onclick="document.getElementById('motion-import-file-input').click()">
|
||||||
<span translate> Select file</span>
|
<span>{{ 'Select file' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -75,35 +88,35 @@
|
|||||||
|
|
||||||
<!-- preview table -->
|
<!-- preview table -->
|
||||||
<mat-card *ngIf="hasFile" class="os-form-card import-table">
|
<mat-card *ngIf="hasFile" class="os-form-card import-table">
|
||||||
<h3 translate>Preview</h3>
|
<h3>{{ 'Preview' | translate }}</h3>
|
||||||
<div class="summary">
|
<div class="summary">
|
||||||
<!-- new entries -->
|
<!-- new entries -->
|
||||||
<div *ngIf="newCount">
|
<div *ngIf="newCount">
|
||||||
|
|
||||||
<mat-icon inline>playlist_add</mat-icon>
|
<mat-icon inline>playlist_add</mat-icon>
|
||||||
<span> {{ newCount }} </span> <span translate>Motion(s) will be imported.</span>
|
<span> {{ newCount }} </span> <span>{{ 'Motion(s) will be imported.' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
<!-- errors/duplicates -->
|
<!-- errors/duplicates -->
|
||||||
<div *ngIf="nonImportableCount" class="red-warning-text">
|
<div *ngIf="nonImportableCount" class="red-warning-text">
|
||||||
|
|
||||||
<mat-icon inline>warning</mat-icon>
|
<mat-icon inline>warning</mat-icon>
|
||||||
<span> {{ nonImportableCount }} </span> <span translate>entries will be ommitted.</span>
|
<span> {{ nonImportableCount }} </span> <span>{{ 'entries will be ommitted.' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
<!-- have been imported -->
|
<!-- have been imported -->
|
||||||
<div *ngIf="doneCount" class="green-text">
|
<div *ngIf="doneCount" class="green-text">
|
||||||
|
|
||||||
<mat-icon inline>done</mat-icon>
|
<mat-icon inline>done</mat-icon>
|
||||||
<span> {{ doneCount }} </span> <span translate>Motions have been imported.</span>
|
<span> {{ doneCount }} </span> <span>{{ 'Motions have been imported.' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="newCount">
|
<div *ngIf="newCount">
|
||||||
<span translate>After verifiy the preview click on 'import' please (see top right).</span>
|
<span>{{ 'After verifiy the preview click on "import" please (see top right).' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<mat-select *ngIf="nonImportableCount" class="filter-imports" [(value)]="shown" (selectionChange)="setFilter()">
|
<mat-select *ngIf="nonImportableCount" class="filter-imports" [(value)]="shown" (selectionChange)="setFilter()">
|
||||||
<mat-option value="all" translate> Show all </mat-option>
|
<mat-option value="all">{{ 'Show all' | translate }}</mat-option>
|
||||||
<mat-option value="error" translate> Show errors only </mat-option>
|
<mat-option value="error">{{ 'Show errors only' | translate }}</mat-option>
|
||||||
<mat-option value="noerror" translate> Show correct entries </mat-option>
|
<mat-option value="noerror">{{ 'Show correct entries' | translate }}</mat-option>
|
||||||
</mat-select>
|
</mat-select>
|
||||||
</div>
|
</div>
|
||||||
<div class="table-container">
|
<div class="table-container">
|
||||||
@ -135,7 +148,7 @@
|
|||||||
|
|
||||||
<!-- identifier column -->
|
<!-- identifier column -->
|
||||||
<ng-container matColumnDef="identifier">
|
<ng-container matColumnDef="identifier">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Identifier</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Identifier' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry">
|
<mat-cell *matCellDef="let entry">
|
||||||
<mat-icon
|
<mat-icon
|
||||||
color="warn"
|
color="warn"
|
||||||
@ -151,7 +164,7 @@
|
|||||||
|
|
||||||
<!-- title column -->
|
<!-- title column -->
|
||||||
<ng-container matColumnDef="title">
|
<ng-container matColumnDef="title">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Title</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Title' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry">
|
<mat-cell *matCellDef="let entry">
|
||||||
<mat-icon
|
<mat-icon
|
||||||
color="warn"
|
color="warn"
|
||||||
@ -166,7 +179,7 @@
|
|||||||
|
|
||||||
<!-- text column -->
|
<!-- text column -->
|
||||||
<ng-container matColumnDef="text">
|
<ng-container matColumnDef="text">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Motion text</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Motion text' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry" matTooltip="{{ getLongPreview(entry.newEntry.text) }}">
|
<mat-cell *matCellDef="let entry" matTooltip="{{ getLongPreview(entry.newEntry.text) }}">
|
||||||
<mat-icon
|
<mat-icon
|
||||||
color="warn"
|
color="warn"
|
||||||
@ -181,7 +194,7 @@
|
|||||||
|
|
||||||
<!-- reason column -->
|
<!-- reason column -->
|
||||||
<ng-container matColumnDef="reason">
|
<ng-container matColumnDef="reason">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Reason</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Reason' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry" matTooltip="{{ getLongPreview(entry.newEntry.reason) }}">
|
<mat-cell *matCellDef="let entry" matTooltip="{{ getLongPreview(entry.newEntry.reason) }}">
|
||||||
{{ getShortPreview(entry.newEntry.reason) }}
|
{{ getShortPreview(entry.newEntry.reason) }}
|
||||||
</mat-cell>
|
</mat-cell>
|
||||||
@ -189,7 +202,7 @@
|
|||||||
|
|
||||||
<!-- submitters column -->
|
<!-- submitters column -->
|
||||||
<ng-container matColumnDef="submitters">
|
<ng-container matColumnDef="submitters">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Submitters</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Submitters' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry">
|
<mat-cell *matCellDef="let entry">
|
||||||
<div *ngIf="entry.newEntry.csvSubmitters && entry.newEntry.csvSubmitters.length">
|
<div *ngIf="entry.newEntry.csvSubmitters && entry.newEntry.csvSubmitters.length">
|
||||||
<mat-icon
|
<mat-icon
|
||||||
@ -210,7 +223,7 @@
|
|||||||
|
|
||||||
<!-- category column -->
|
<!-- category column -->
|
||||||
<ng-container matColumnDef="category">
|
<ng-container matColumnDef="category">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Category</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Category' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry">
|
<mat-cell *matCellDef="let entry">
|
||||||
<div *ngIf="entry.newEntry.csvCategory">
|
<div *ngIf="entry.newEntry.csvCategory">
|
||||||
<mat-icon
|
<mat-icon
|
||||||
@ -230,7 +243,7 @@
|
|||||||
|
|
||||||
<!-- tag column -->
|
<!-- tag column -->
|
||||||
<ng-container matColumnDef="tags">
|
<ng-container matColumnDef="tags">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Tags</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Tags' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry">
|
<mat-cell *matCellDef="let entry">
|
||||||
<div *ngIf="entry.newEntry.csvTags">
|
<div *ngIf="entry.newEntry.csvTags">
|
||||||
<mat-icon
|
<mat-icon
|
||||||
@ -250,13 +263,13 @@
|
|||||||
|
|
||||||
<!-- origin column -->
|
<!-- origin column -->
|
||||||
<ng-container matColumnDef="origin">
|
<ng-container matColumnDef="origin">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Origin</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Origin' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry">{{ entry.newEntry.origin }}</mat-cell>
|
<mat-cell *matCellDef="let entry">{{ entry.newEntry.origin }}</mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<!-- motion block column -->
|
<!-- motion block column -->
|
||||||
<ng-container matColumnDef="motion_block">
|
<ng-container matColumnDef="motion_block">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Motion block</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Motion block' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry">
|
<mat-cell *matCellDef="let entry">
|
||||||
<div *ngIf="entry.newEntry.csvMotionblock">
|
<div *ngIf="entry.newEntry.csvMotionblock">
|
||||||
<mat-icon
|
<mat-icon
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
<os-head-bar [hasMainButton]="perms.isAllowed('create')" (mainEvent)="onPlusButton()" [multiSelectMode]="isMultiSelect">
|
<os-head-bar [hasMainButton]="perms.isAllowed('create')" (mainEvent)="onPlusButton()" [multiSelectMode]="isMultiSelect">
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot"><h2 translate>Motions</h2></div>
|
<div class="title-slot">
|
||||||
|
<h2>{{ 'Motions' | translate }}</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Menu -->
|
<!-- Menu -->
|
||||||
<div class="menu-slot">
|
<div class="menu-slot">
|
||||||
@ -12,7 +14,7 @@
|
|||||||
<!-- Multiselect info -->
|
<!-- Multiselect info -->
|
||||||
<div class="central-info-slot">
|
<div class="central-info-slot">
|
||||||
<button mat-icon-button (click)="toggleMultiSelect()"><mat-icon>arrow_back</mat-icon></button>
|
<button mat-icon-button (click)="toggleMultiSelect()"><mat-icon>arrow_back</mat-icon></button>
|
||||||
<span>{{ selectedRows.length }} </span><span translate>selected</span>
|
<span>{{ selectedRows.length }} </span><span>{{ 'selected' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="extra-controls-slot">
|
<div class="extra-controls-slot">
|
||||||
@ -89,7 +91,7 @@
|
|||||||
<!-- Submitters -->
|
<!-- Submitters -->
|
||||||
<div class="submitters-line ellipsis-overflow">
|
<div class="submitters-line ellipsis-overflow">
|
||||||
<span *ngIf="motion.submitters.length">
|
<span *ngIf="motion.submitters.length">
|
||||||
<span translate>by</span>
|
<span>{{ 'by' | translate }}</span>
|
||||||
{{ motion.submitters }}
|
{{ motion.submitters }}
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
@ -97,7 +99,7 @@
|
|||||||
<span *ngIf="motion.submitters.length">
|
<span *ngIf="motion.submitters.length">
|
||||||
·
|
·
|
||||||
</span>
|
</span>
|
||||||
<span translate>Sequential number</span>
|
<span>{{ 'Sequential number' | translate }}</span>
|
||||||
{{ motion.id }}
|
{{ motion.id }}
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@ -228,7 +230,7 @@
|
|||||||
<div *ngIf="perms.isAllowed('change_metadata') && selectedView === 'list'">
|
<div *ngIf="perms.isAllowed('change_metadata') && selectedView === 'list'">
|
||||||
<button mat-menu-item (click)="toggleMultiSelect()">
|
<button mat-menu-item (click)="toggleMultiSelect()">
|
||||||
<mat-icon>library_add</mat-icon>
|
<mat-icon>library_add</mat-icon>
|
||||||
<span translate>Multiselect</span>
|
<span>{{ 'Multiselect' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
</div>
|
</div>
|
||||||
@ -239,7 +241,7 @@
|
|||||||
<!-- color_lens -->
|
<!-- color_lens -->
|
||||||
<!-- format_paint -->
|
<!-- format_paint -->
|
||||||
<mat-icon>color_lens</mat-icon>
|
<mat-icon>color_lens</mat-icon>
|
||||||
<span translate>Amendments</span>
|
<span>{{ 'Amendments' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -247,7 +249,7 @@
|
|||||||
<div *ngIf="perms.isAllowed('manage') || categories.length">
|
<div *ngIf="perms.isAllowed('manage') || categories.length">
|
||||||
<button mat-menu-item routerLink="category">
|
<button mat-menu-item routerLink="category">
|
||||||
<mat-icon>category</mat-icon>
|
<mat-icon>category</mat-icon>
|
||||||
<span translate>Categories</span>
|
<span>{{ 'Categories' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -255,7 +257,7 @@
|
|||||||
<div *ngIf="perms.isAllowed('manage') || motionBlocks.length">
|
<div *ngIf="perms.isAllowed('manage') || motionBlocks.length">
|
||||||
<button mat-menu-item routerLink="blocks">
|
<button mat-menu-item routerLink="blocks">
|
||||||
<mat-icon>widgets</mat-icon>
|
<mat-icon>widgets</mat-icon>
|
||||||
<span translate>Motion blocks</span>
|
<span>{{ 'Motion blocks' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -267,31 +269,31 @@
|
|||||||
<!-- Call list -->
|
<!-- Call list -->
|
||||||
<button mat-menu-item routerLink="call-list">
|
<button mat-menu-item routerLink="call-list">
|
||||||
<mat-icon>sort</mat-icon>
|
<mat-icon>sort</mat-icon>
|
||||||
<span translate>Call list</span>
|
<span>{{ 'Call list' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<!-- Statutes -->
|
<!-- Statutes -->
|
||||||
<button mat-menu-item routerLink="statute-paragraphs" *ngIf="statutesEnabled">
|
<button mat-menu-item routerLink="statute-paragraphs" *ngIf="statutesEnabled">
|
||||||
<mat-icon>account_balance</mat-icon>
|
<mat-icon>account_balance</mat-icon>
|
||||||
<span translate>Statute</span>
|
<span>{{ 'Statute' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<!-- Comments -->
|
<!-- Comments -->
|
||||||
<button mat-menu-item routerLink="comment-section">
|
<button mat-menu-item routerLink="comment-section">
|
||||||
<mat-icon>speaker_notes</mat-icon>
|
<mat-icon>speaker_notes</mat-icon>
|
||||||
<span translate>Comment fields</span>
|
<span>{{ 'Comment fields' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<!-- Workflows -->
|
<!-- Workflows -->
|
||||||
<button mat-menu-item routerLink="workflow">
|
<button mat-menu-item routerLink="workflow">
|
||||||
<mat-icon>build</mat-icon>
|
<mat-icon>build</mat-icon>
|
||||||
<span translate>Workflows</span>
|
<span>{{ 'Workflows' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<!-- Tags -->
|
<!-- Tags -->
|
||||||
<button mat-menu-item routerLink="/tags" *osPerms="'core.can_manage_tags'">
|
<button mat-menu-item routerLink="/tags" *osPerms="'core.can_manage_tags'">
|
||||||
<mat-icon>local_offer</mat-icon>
|
<mat-icon>local_offer</mat-icon>
|
||||||
<span translate>Tags</span>
|
<span>{{ 'Tags' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
@ -300,14 +302,14 @@
|
|||||||
<!-- Export -->
|
<!-- Export -->
|
||||||
<button mat-menu-item *ngIf="selectedView === 'list'" (click)="openExportDialog()">
|
<button mat-menu-item *ngIf="selectedView === 'list'" (click)="openExportDialog()">
|
||||||
<mat-icon>archive</mat-icon>
|
<mat-icon>archive</mat-icon>
|
||||||
<span translate>Export</span>
|
<span>{{ 'Export' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<!-- Import -->
|
<!-- Import -->
|
||||||
<div *ngIf="perms.isAllowed('manage')">
|
<div *ngIf="perms.isAllowed('manage')">
|
||||||
<button mat-menu-item routerLink="import">
|
<button mat-menu-item routerLink="import">
|
||||||
<mat-icon>cloud_upload</mat-icon>
|
<mat-icon>cloud_upload</mat-icon>
|
||||||
<span translate>Import</span>
|
<span>{{ 'Import' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -316,17 +318,17 @@
|
|||||||
<!-- Settings -->
|
<!-- Settings -->
|
||||||
<button mat-menu-item *osPerms="'core.can_manage_config'" routerLink="/settings/motions">
|
<button mat-menu-item *osPerms="'core.can_manage_config'" routerLink="/settings/motions">
|
||||||
<mat-icon>settings</mat-icon>
|
<mat-icon>settings</mat-icon>
|
||||||
<span translate>Settings</span>
|
<span>{{ 'Settings' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="isMultiSelect">
|
<div *ngIf="isMultiSelect">
|
||||||
<button mat-menu-item (click)="selectAll()">
|
<button mat-menu-item (click)="selectAll()">
|
||||||
<mat-icon>done_all</mat-icon>
|
<mat-icon>done_all</mat-icon>
|
||||||
<span translate>Select all</span>
|
<span>{{ 'Select all' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-menu-item [disabled]="!selectedRows.length" (click)="deselectAll()">
|
<button mat-menu-item [disabled]="!selectedRows.length" (click)="deselectAll()">
|
||||||
<mat-icon>clear</mat-icon>
|
<mat-icon>clear</mat-icon>
|
||||||
<span translate>Deselect all</span>
|
<span>{{ 'Deselect all' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<ng-container *ngIf="perms.isAllowed('change_metadata')">
|
<ng-container *ngIf="perms.isAllowed('change_metadata')">
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
@ -337,7 +339,7 @@
|
|||||||
(click)="multiselectWrapper(multiselectService.moveToItem(selectedRows))"
|
(click)="multiselectWrapper(multiselectService.moveToItem(selectedRows))"
|
||||||
>
|
>
|
||||||
<mat-icon>sort</mat-icon>
|
<mat-icon>sort</mat-icon>
|
||||||
<span translate>Move to agenda item</span>
|
<span>{{ 'Move to agenda item' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
mat-menu-item
|
mat-menu-item
|
||||||
@ -345,7 +347,7 @@
|
|||||||
(click)="multiselectWrapper(multiselectService.bulkMoveItems(selectedRows))"
|
(click)="multiselectWrapper(multiselectService.bulkMoveItems(selectedRows))"
|
||||||
>
|
>
|
||||||
<mat-icon>format_indent_increase</mat-icon>
|
<mat-icon>format_indent_increase</mat-icon>
|
||||||
<span translate>Move in call list</span>
|
<span>{{ 'Move in call list' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</os-motion-multiselect-actions>
|
</os-motion-multiselect-actions>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
@ -406,10 +408,10 @@
|
|||||||
|
|
||||||
<div mat-dialog-actions>
|
<div mat-dialog-actions>
|
||||||
<button type="submit" mat-button color="primary" [mat-dialog-close]="infoDialog">
|
<button type="submit" mat-button color="primary" [mat-dialog-close]="infoDialog">
|
||||||
<span translate>Save</span>
|
<span>{{ 'Save' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" mat-button [mat-dialog-close]="null">
|
<button type="button" mat-button [mat-dialog-close]="null">
|
||||||
<span translate>Cancel</span>
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { Component, OnInit, TemplateRef, ViewChild } from '@angular/core';
|
import { ChangeDetectionStrategy, Component, OnInit, TemplateRef, ViewChild } from '@angular/core';
|
||||||
import { MatDialog } from '@angular/material/dialog';
|
import { MatDialog } from '@angular/material/dialog';
|
||||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||||
import { Title } from '@angular/platform-browser';
|
import { Title } from '@angular/platform-browser';
|
||||||
@ -89,7 +89,8 @@ interface InfoDialog {
|
|||||||
@Component({
|
@Component({
|
||||||
selector: 'os-motion-list',
|
selector: 'os-motion-list',
|
||||||
templateUrl: './motion-list.component.html',
|
templateUrl: './motion-list.component.html',
|
||||||
styleUrls: ['./motion-list.component.scss']
|
styleUrls: ['./motion-list.component.scss'],
|
||||||
|
changeDetection: ChangeDetectionStrategy.OnPush
|
||||||
})
|
})
|
||||||
export class MotionListComponent extends BaseListViewComponent<ViewMotion> implements OnInit {
|
export class MotionListComponent extends BaseListViewComponent<ViewMotion> implements OnInit {
|
||||||
/**
|
/**
|
||||||
|
@ -90,7 +90,7 @@
|
|||||||
<os-projector-button [menuItem]="true" [object]="poll" *osPerms="'core.can_manage_projector'"></os-projector-button>
|
<os-projector-button [menuItem]="true" [object]="poll" *osPerms="'core.can_manage_projector'"></os-projector-button>
|
||||||
<button *osPerms="'motions.can_manage_polls'" mat-menu-item (click)="openDialog(poll)">
|
<button *osPerms="'motions.can_manage_polls'" mat-menu-item (click)="openDialog(poll)">
|
||||||
<mat-icon>edit</mat-icon>
|
<mat-icon>edit</mat-icon>
|
||||||
<span translate>Edit</span>
|
<span>{{ 'Edit' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
mat-menu-item
|
mat-menu-item
|
||||||
@ -98,11 +98,11 @@
|
|||||||
(click)="pseudoanonymizePoll()"
|
(click)="pseudoanonymizePoll()"
|
||||||
>
|
>
|
||||||
<mat-icon>warning</mat-icon>
|
<mat-icon>warning</mat-icon>
|
||||||
<span translate>Anonymize votes</span>
|
<span>{{ 'Anonymize votes' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
<button *osPerms="'motions.can_manage_polls'" mat-menu-item (click)="deletePoll()">
|
<button *osPerms="'motions.can_manage_polls'" mat-menu-item (click)="deletePoll()">
|
||||||
<mat-icon color="warn">delete</mat-icon>
|
<mat-icon color="warn">delete</mat-icon>
|
||||||
<span translate>Delete</span>
|
<span>{{ 'Delete' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { Component, ViewEncapsulation } from '@angular/core';
|
import { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';
|
||||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||||
import { Title } from '@angular/platform-browser';
|
import { Title } from '@angular/platform-browser';
|
||||||
import { ActivatedRoute, Router } from '@angular/router';
|
import { ActivatedRoute, Router } from '@angular/router';
|
||||||
@ -21,6 +21,7 @@ import { BasePollDetailComponent } from 'app/site/polls/components/base-poll-det
|
|||||||
selector: 'os-motion-poll-detail',
|
selector: 'os-motion-poll-detail',
|
||||||
templateUrl: './motion-poll-detail.component.html',
|
templateUrl: './motion-poll-detail.component.html',
|
||||||
styleUrls: ['./motion-poll-detail.component.scss'],
|
styleUrls: ['./motion-poll-detail.component.scss'],
|
||||||
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||||
encapsulation: ViewEncapsulation.None
|
encapsulation: ViewEncapsulation.None
|
||||||
})
|
})
|
||||||
export class MotionPollDetailComponent extends BasePollDetailComponent<ViewMotionPoll, MotionPollService> {
|
export class MotionPollDetailComponent extends BasePollDetailComponent<ViewMotionPoll, MotionPollService> {
|
||||||
|
@ -49,18 +49,16 @@
|
|||||||
<!-- Publish immediately button. Only show for new polls -->
|
<!-- Publish immediately button. Only show for new polls -->
|
||||||
<div *ngIf="!pollData.isPublished">
|
<div *ngIf="!pollData.isPublished">
|
||||||
<mat-checkbox [(ngModel)]="publishImmediately" (change)="publishStateChanged($event.checked)">
|
<mat-checkbox [(ngModel)]="publishImmediately" (change)="publishStateChanged($event.checked)">
|
||||||
<span translate>Publish immediately</span>
|
<span>{{ 'Publish immediately' | translate }}</span>
|
||||||
</mat-checkbox>
|
</mat-checkbox>
|
||||||
<mat-error *ngIf="!dialogVoteForm.valid" translate>
|
<mat-error *ngIf="!dialogVoteForm.valid"> {{ 'Error in form field.' | translate }}</mat-error>
|
||||||
Error in form field.
|
|
||||||
</mat-error>
|
|
||||||
</div>
|
</div>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<div mat-dialog-actions>
|
<div mat-dialog-actions>
|
||||||
<button mat-button (click)="submitPoll()" [disabled]="pollForm.contentForm.invalid || dialogVoteForm.invalid">
|
<button mat-button (click)="submitPoll()" [disabled]="pollForm.contentForm.invalid || dialogVoteForm.invalid">
|
||||||
<span translate>Save</span>
|
<span>{{ 'Save' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-button [mat-dialog-close]="false">
|
<button mat-button [mat-dialog-close]="false">
|
||||||
<span translate>Cancel</span>
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -109,25 +109,25 @@
|
|||||||
<mat-menu #pollDetailMenu="matMenu">
|
<mat-menu #pollDetailMenu="matMenu">
|
||||||
<button *osPerms="'motions.can_manage_polls'" mat-menu-item (click)="openDialog()">
|
<button *osPerms="'motions.can_manage_polls'" mat-menu-item (click)="openDialog()">
|
||||||
<mat-icon>edit</mat-icon>
|
<mat-icon>edit</mat-icon>
|
||||||
<span translate>Edit</span>
|
<span>{{ 'Edit' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<os-projector-button [menuItem]="true" [object]="poll" *osPerms="'core.can_manage_projector'"></os-projector-button>
|
<os-projector-button [menuItem]="true" [object]="poll" *osPerms="'core.can_manage_projector'"></os-projector-button>
|
||||||
<button mat-menu-item (click)="downloadPdf()">
|
<button mat-menu-item (click)="downloadPdf()">
|
||||||
<mat-icon>picture_as_pdf</mat-icon>
|
<mat-icon>picture_as_pdf</mat-icon>
|
||||||
<span translate>Ballot papers</span>
|
<span>{{ 'Ballot papers' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<div *osPerms="'motions.can_manage_polls'">
|
<div *osPerms="'motions.can_manage_polls'">
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
<!-- Reset Button -->
|
<!-- Reset Button -->
|
||||||
<button mat-menu-item (click)="resetState()">
|
<button mat-menu-item (click)="resetState()">
|
||||||
<mat-icon color="warn">replay</mat-icon>
|
<mat-icon color="warn">replay</mat-icon>
|
||||||
<span translate>Reset state</span>
|
<span>{{ 'Reset state' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<!-- Delete button -->
|
<!-- Delete button -->
|
||||||
<button mat-menu-item (click)="deletePoll()">
|
<button mat-menu-item (click)="deletePoll()">
|
||||||
<mat-icon color="warn">delete</mat-icon>
|
<mat-icon color="warn">delete</mat-icon>
|
||||||
<span translate>Delete</span>
|
<span>{{ 'Delete' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
|
@ -18,7 +18,8 @@
|
|||||||
<div *ngIf="workflow">
|
<div *ngIf="workflow">
|
||||||
<div class="title-line">
|
<div class="title-line">
|
||||||
<strong>
|
<strong>
|
||||||
<span translate>First state</span>:
|
<span>{{ 'First state' | translate }}</span
|
||||||
|
>:
|
||||||
<span>{{ workflow.first_state.name | translate }}</span>
|
<span>{{ workflow.first_state.name | translate }}</span>
|
||||||
</strong>
|
</strong>
|
||||||
</div>
|
</div>
|
||||||
@ -26,7 +27,7 @@
|
|||||||
<div class="scrollable-matrix">
|
<div class="scrollable-matrix">
|
||||||
<table mat-table [dataSource]="getTableDataSource()">
|
<table mat-table [dataSource]="getTableDataSource()">
|
||||||
<ng-container matColumnDef="perm" sticky>
|
<ng-container matColumnDef="perm" sticky>
|
||||||
<th mat-header-cell class="group-head-table-cell" *matHeaderCellDef translate>Permissions</th>
|
<th mat-header-cell class="group-head-table-cell" *matHeaderCellDef>{{ 'Permissions' | translate }}</th>
|
||||||
<td mat-cell *matCellDef="let perm">
|
<td mat-cell *matCellDef="let perm">
|
||||||
<div class="permission-name">
|
<div class="permission-name">
|
||||||
{{ perm.name | translate }}
|
{{ perm.name | translate }}
|
||||||
@ -144,10 +145,10 @@
|
|||||||
color="primary"
|
color="primary"
|
||||||
[mat-dialog-close]="{ action: 'update', value: dialogData.value }"
|
[mat-dialog-close]="{ action: 'update', value: dialogData.value }"
|
||||||
>
|
>
|
||||||
<span translate>Save</span>
|
<span>{{ 'Save' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" mat-button [mat-dialog-close]="null">
|
<button type="button" mat-button [mat-dialog-close]="null">
|
||||||
<span translate>Cancel</span>
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
@ -156,7 +157,7 @@
|
|||||||
*ngIf="dialogData.deletable"
|
*ngIf="dialogData.deletable"
|
||||||
[mat-dialog-close]="{ action: 'delete' }"
|
[mat-dialog-close]="{ action: 'delete' }"
|
||||||
>
|
>
|
||||||
<span translate>Delete</span>
|
<span>{{ 'Delete' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
<os-head-bar prevUrl="../.." [nav]="false" [hasMainButton]="true" (mainEvent)="onNewButton(newWorkflowDialog)">
|
<os-head-bar prevUrl="../.." [nav]="false" [hasMainButton]="true" (mainEvent)="onNewButton(newWorkflowDialog)">
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot"><h2 translate>Workflows</h2></div>
|
<div class="title-slot">
|
||||||
|
<h2>{{ 'Workflows' | translate }}</h2>
|
||||||
|
</div>
|
||||||
</os-head-bar>
|
</os-head-bar>
|
||||||
|
|
||||||
<os-list-view-table
|
<os-list-view-table
|
||||||
@ -30,10 +32,10 @@
|
|||||||
<!-- New workflow dialog -->
|
<!-- New workflow dialog -->
|
||||||
<ng-template #newWorkflowDialog>
|
<ng-template #newWorkflowDialog>
|
||||||
<h1 mat-dialog-title>
|
<h1 mat-dialog-title>
|
||||||
<span translate>New workflow</span>
|
<span>{{ 'New workflow' | translate }}</span>
|
||||||
</h1>
|
</h1>
|
||||||
<div mat-dialog-content>
|
<div mat-dialog-content>
|
||||||
<p translate>Please enter a name for the new workflow:</p>
|
<p>{{ 'Please enter a name for the new workflow:' | translate }}</p>
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<input matInput osAutofocus [(ngModel)]="newWorkflowTitle" required />
|
<input matInput osAutofocus [(ngModel)]="newWorkflowTitle" required />
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
@ -46,10 +48,10 @@
|
|||||||
[disabled]="newWorkflowTitle === ''"
|
[disabled]="newWorkflowTitle === ''"
|
||||||
[mat-dialog-close]="newWorkflowTitle"
|
[mat-dialog-close]="newWorkflowTitle"
|
||||||
>
|
>
|
||||||
<span translate>Save</span>
|
<span>{{ 'Save' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" mat-button [mat-dialog-close]="null">
|
<button type="button" mat-button [mat-dialog-close]="null">
|
||||||
<span translate>Cancel</span>
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<!-- Content -->
|
<!-- Content -->
|
||||||
<div mat-dialog-content class="motion-export-dialog-wrapper">
|
<div mat-dialog-content class="motion-export-dialog-wrapper">
|
||||||
<div>
|
<div>
|
||||||
<p class="toggle-group-head" translate>Format</p>
|
<p class="toggle-group-head">{{ 'Format' | translate }}</p>
|
||||||
<mat-button-toggle-group class="smaller-buttons" formControlName="format">
|
<mat-button-toggle-group class="smaller-buttons" formControlName="format">
|
||||||
<mat-button-toggle [value]="fileFormat.PDF">PDF</mat-button-toggle>
|
<mat-button-toggle [value]="fileFormat.PDF">PDF</mat-button-toggle>
|
||||||
<mat-button-toggle [value]="fileFormat.CSV">CSV</mat-button-toggle>
|
<mat-button-toggle [value]="fileFormat.CSV">CSV</mat-button-toggle>
|
||||||
@ -13,64 +13,84 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<p class="toggle-group-head" translate>Line numbering</p>
|
<p class="toggle-group-head">{{ 'Line numbering' | translate }}</p>
|
||||||
<mat-button-toggle-group class="smaller-buttons" formControlName="lnMode">
|
<mat-button-toggle-group class="smaller-buttons" formControlName="lnMode">
|
||||||
<mat-button-toggle [value]="lnMode.None"> <span translate>None</span> </mat-button-toggle>
|
<mat-button-toggle [value]="lnMode.None">
|
||||||
<mat-button-toggle [value]="lnMode.Outside"> <span translate>Outside</span> </mat-button-toggle>
|
<span>{{ 'None' | translate }}</span>
|
||||||
|
</mat-button-toggle>
|
||||||
|
<mat-button-toggle [value]="lnMode.Outside">
|
||||||
|
<span>{{ 'Outside' | translate }}</span>
|
||||||
|
</mat-button-toggle>
|
||||||
</mat-button-toggle-group>
|
</mat-button-toggle-group>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<p class="toggle-group-head" translate>Change recommendations</p>
|
<p class="toggle-group-head">{{ 'Change recommendations' | translate }}</p>
|
||||||
<mat-button-toggle-group class="smaller-buttons" formControlName="crMode">
|
<mat-button-toggle-group class="smaller-buttons" formControlName="crMode">
|
||||||
<mat-button-toggle [value]="crMode.Original">
|
<mat-button-toggle [value]="crMode.Original">
|
||||||
<span translate>Original version</span>
|
<span>{{ 'Original version' | translate }}</span>
|
||||||
|
</mat-button-toggle>
|
||||||
|
<mat-button-toggle [value]="crMode.Changed">
|
||||||
|
<span>{{ 'Changed version' | translate }}</span>
|
||||||
</mat-button-toggle>
|
</mat-button-toggle>
|
||||||
<mat-button-toggle [value]="crMode.Changed"> <span translate>Changed version</span> </mat-button-toggle>
|
|
||||||
<mat-button-toggle [value]="crMode.Diff" #diffVersionButton>
|
<mat-button-toggle [value]="crMode.Diff" #diffVersionButton>
|
||||||
<span translate>Diff version</span>
|
<span>{{ 'Diff version' | translate }}</span>
|
||||||
|
</mat-button-toggle>
|
||||||
|
<mat-button-toggle [value]="crMode.ModifiedFinal">
|
||||||
|
<span>{{ 'Final version' | translate }}</span>
|
||||||
</mat-button-toggle>
|
</mat-button-toggle>
|
||||||
<mat-button-toggle [value]="crMode.ModifiedFinal"> <span translate>Final version</span> </mat-button-toggle>
|
|
||||||
</mat-button-toggle-group>
|
</mat-button-toggle-group>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<p class="toggle-group-head" translate>Content</p>
|
<p class="toggle-group-head">{{ 'Content' | translate }}</p>
|
||||||
<mat-button-toggle-group class="smaller-buttons" multiple formControlName="content">
|
<mat-button-toggle-group class="smaller-buttons" multiple formControlName="content">
|
||||||
<mat-button-toggle value="text"> <span translate>Text</span> </mat-button-toggle>
|
<mat-button-toggle value="text">
|
||||||
<mat-button-toggle value="reason"> <span translate>Reason</span> </mat-button-toggle>
|
<span>{{ 'Text' | translate }}</span>
|
||||||
|
</mat-button-toggle>
|
||||||
|
<mat-button-toggle value="reason">
|
||||||
|
<span>{{ 'Reason' | translate }}</span>
|
||||||
|
</mat-button-toggle>
|
||||||
</mat-button-toggle-group>
|
</mat-button-toggle-group>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<p class="toggle-group-head" translate>Meta information</p>
|
<p class="toggle-group-head">{{ 'Meta information' | translate }}</p>
|
||||||
<mat-button-toggle-group class="smaller-buttons" multiple formControlName="metaInfo">
|
<mat-button-toggle-group class="smaller-buttons" multiple formControlName="metaInfo">
|
||||||
<mat-button-toggle *ngFor="let metaInfo of metaInfoExportOrder" [value]="metaInfo">
|
<mat-button-toggle *ngFor="let metaInfo of metaInfoExportOrder" [value]="metaInfo">
|
||||||
<span>{{ getLabelForMetadata(metaInfo) | translate }}</span>
|
<span>{{ getLabelForMetadata(metaInfo) | translate }}</span>
|
||||||
</mat-button-toggle>
|
</mat-button-toggle>
|
||||||
<mat-button-toggle *osPerms="'agenda.can_see_list_of_speakers'" value="speakers" #speakersButton>
|
<mat-button-toggle *osPerms="'agenda.can_see_list_of_speakers'" value="speakers" #speakersButton>
|
||||||
<span translate>Speakers</span>
|
<span>{{ 'Speakers' | translate }}</span>
|
||||||
</mat-button-toggle>
|
</mat-button-toggle>
|
||||||
<mat-button-toggle value="polls" #votingResultButton>
|
<mat-button-toggle value="polls" #votingResultButton>
|
||||||
<span translate>Voting result</span>
|
<span>{{ 'Voting result' | translate }}</span>
|
||||||
</mat-button-toggle>
|
</mat-button-toggle>
|
||||||
</mat-button-toggle-group>
|
</mat-button-toggle-group>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<p class="toggle-group-head" translate>PDF options</p>
|
<p class="toggle-group-head">{{ 'PDF options' | translate }}</p>
|
||||||
<mat-button-toggle-group class="smaller-buttons" multiple formControlName="pdfOptions">
|
<mat-button-toggle-group class="smaller-buttons" multiple formControlName="pdfOptions">
|
||||||
<mat-button-toggle value="toc"> <span translate>Table of contents</span> </mat-button-toggle>
|
<mat-button-toggle value="toc">
|
||||||
<mat-button-toggle value="page"> <span translate>Page numbers</span> </mat-button-toggle>
|
<span>{{ 'Table of contents' | translate }}</span>
|
||||||
<mat-button-toggle value="date"> <span translate>Current date</span> </mat-button-toggle>
|
</mat-button-toggle>
|
||||||
<mat-button-toggle value="addBreaks"> <span translate>Enforce page breaks</span> </mat-button-toggle>
|
<mat-button-toggle value="page">
|
||||||
|
<span>{{ 'Page numbers' | translate }}</span>
|
||||||
|
</mat-button-toggle>
|
||||||
|
<mat-button-toggle value="date">
|
||||||
|
<span>{{ 'Current date' | translate }}</span>
|
||||||
|
</mat-button-toggle>
|
||||||
|
<mat-button-toggle value="addBreaks">
|
||||||
|
<span>{{ 'Enforce page breaks' | translate }}</span>
|
||||||
|
</mat-button-toggle>
|
||||||
</mat-button-toggle-group>
|
</mat-button-toggle-group>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<p class="toggle-group-head" translate>Comments</p>
|
<p class="toggle-group-head">{{ 'Comments' | translate }}</p>
|
||||||
<mat-button-toggle-group class="smaller-buttons" multiple formControlName="comments">
|
<mat-button-toggle-group class="smaller-buttons" multiple formControlName="comments">
|
||||||
<mat-button-toggle [value]="PERSONAL_NOTE_ID">
|
<mat-button-toggle [value]="PERSONAL_NOTE_ID">
|
||||||
<span translate>Personal note</span>
|
<span>{{ 'Personal note' | translate }}</span>
|
||||||
</mat-button-toggle>
|
</mat-button-toggle>
|
||||||
<mat-button-toggle *ngFor="let comment of commentsToExport" [value]="comment.id">
|
<mat-button-toggle *ngFor="let comment of commentsToExport" [value]="comment.id">
|
||||||
<span>{{ comment.name }}</span>
|
<span>{{ comment.name }}</span>
|
||||||
@ -85,8 +105,10 @@
|
|||||||
<!-- Action buttons -->
|
<!-- Action buttons -->
|
||||||
<div mat-dialog-actions>
|
<div mat-dialog-actions>
|
||||||
<button mat-button type="button" color="primary" [mat-dialog-close]="exportForm.value">
|
<button mat-button type="button" color="primary" [mat-dialog-close]="exportForm.value">
|
||||||
<span translate>Export</span>
|
<span>{{ 'Export' | translate }}</span>
|
||||||
|
</button>
|
||||||
|
<button mat-button type="button" (click)="onCloseClick()">
|
||||||
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-button type="button" (click)="onCloseClick()"><span translate>Cancel</span></button>
|
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
(click)="action.emit(multiselectService.bulkSetFavorite(selectedMotions))"
|
(click)="action.emit(multiselectService.bulkSetFavorite(selectedMotions))"
|
||||||
>
|
>
|
||||||
<mat-icon>star</mat-icon>
|
<mat-icon>star</mat-icon>
|
||||||
<span translate>Set favorite</span>
|
<span>{{ 'Set favorite' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
mat-menu-item
|
mat-menu-item
|
||||||
@ -12,7 +12,7 @@
|
|||||||
(click)="action.emit(multiselectService.setStateOfMultiple(selectedMotions))"
|
(click)="action.emit(multiselectService.setStateOfMultiple(selectedMotions))"
|
||||||
>
|
>
|
||||||
<mat-icon>label</mat-icon>
|
<mat-icon>label</mat-icon>
|
||||||
<span translate>Set status</span>
|
<span>{{ 'Set status' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
*ngIf="recommendationEnabled"
|
*ngIf="recommendationEnabled"
|
||||||
@ -22,7 +22,7 @@
|
|||||||
>
|
>
|
||||||
<mat-icon>report</mat-icon>
|
<mat-icon>report</mat-icon>
|
||||||
<!-- TODO: better icon -->
|
<!-- TODO: better icon -->
|
||||||
<span translate>Set recommendation</span>
|
<span>{{ 'Set recommendation' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
mat-menu-item
|
mat-menu-item
|
||||||
@ -32,7 +32,7 @@
|
|||||||
>
|
>
|
||||||
<mat-icon>category</mat-icon>
|
<mat-icon>category</mat-icon>
|
||||||
<!-- TODO: icon -->
|
<!-- TODO: icon -->
|
||||||
<span translate>Set category</span>
|
<span>{{ 'Set category' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
mat-menu-item
|
mat-menu-item
|
||||||
@ -42,7 +42,7 @@
|
|||||||
>
|
>
|
||||||
<mat-icon>widgets</mat-icon>
|
<mat-icon>widgets</mat-icon>
|
||||||
<!-- TODO: icon -->
|
<!-- TODO: icon -->
|
||||||
<span translate>Set motion block</span>
|
<span>{{ 'Set motion block' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
@ -52,7 +52,7 @@
|
|||||||
>
|
>
|
||||||
<mat-icon>person_add</mat-icon>
|
<mat-icon>person_add</mat-icon>
|
||||||
<!-- TODO: icon -->
|
<!-- TODO: icon -->
|
||||||
<span translate>Add/remove submitters</span>
|
<span>{{ 'Add/remove submitters' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
mat-menu-item
|
mat-menu-item
|
||||||
@ -62,7 +62,7 @@
|
|||||||
>
|
>
|
||||||
<mat-icon>bookmarks</mat-icon>
|
<mat-icon>bookmarks</mat-icon>
|
||||||
<!-- TODO: icon -->
|
<!-- TODO: icon -->
|
||||||
<span translate>Add/remove tags</span>
|
<span>{{ 'Add/remove tags' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<ng-content></ng-content>
|
<ng-content></ng-content>
|
||||||
@ -70,7 +70,7 @@
|
|||||||
<ng-container *osPerms="'motions.can_manage'">
|
<ng-container *osPerms="'motions.can_manage'">
|
||||||
<button mat-menu-item [disabled]="!selectedMotions.length" (click)="openExportDialog()">
|
<button mat-menu-item [disabled]="!selectedMotions.length" (click)="openExportDialog()">
|
||||||
<mat-icon>archive</mat-icon>
|
<mat-icon>archive</mat-icon>
|
||||||
<span translate>Export selected motions</span>
|
<span>{{ 'Export selected motions' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
<button
|
<button
|
||||||
@ -80,6 +80,6 @@
|
|||||||
(click)="action.emit(multiselectService.delete(selectedMotions))"
|
(click)="action.emit(multiselectService.delete(selectedMotions))"
|
||||||
>
|
>
|
||||||
<mat-icon>delete</mat-icon>
|
<mat-icon>delete</mat-icon>
|
||||||
<span translate>Delete</span>
|
<span>{{ 'Delete' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
@ -1,28 +1,40 @@
|
|||||||
<os-head-bar [nav]="false">
|
<os-head-bar [nav]="false">
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot"><h2 translate>Import statute</h2></div>
|
<div class="title-slot">
|
||||||
|
<h2>{{ 'Import statute' | translate }}</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="menu-slot">
|
<div class="menu-slot">
|
||||||
<button *ngIf="hasFile && newCount" mat-button (click)="doImport()">
|
<button *ngIf="hasFile && newCount" mat-button (click)="doImport()">
|
||||||
<span class="upper" translate>Import</span>
|
<span class="upper">{{ 'Import' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</os-head-bar>
|
</os-head-bar>
|
||||||
|
|
||||||
<mat-card class="os-form-card import-table">
|
<mat-card class="os-form-card import-table">
|
||||||
<span translate>Required comma or semicolon separated values with these column header names in the first row:</span>
|
<span>{{
|
||||||
|
'Required comma or semicolon separated values with these column header names in the first row:' | translate
|
||||||
|
}}</span>
|
||||||
<br />
|
<br />
|
||||||
<div class="code red-warning-text"><span translate>Title</span>, <span translate>Text</span></div>
|
<div class="code red-warning-text">
|
||||||
|
<span>{{ 'Title' | translate }}</span
|
||||||
|
>, <span>{{ 'Text' | translate }}</span>
|
||||||
|
</div>
|
||||||
<ul>
|
<ul>
|
||||||
<li translate>Additional columns after the required ones may be present and won't affect the import.</li>
|
<li>
|
||||||
|
{{
|
||||||
|
'Additional columns after the required ones may be present and will not affect the import.' | translate
|
||||||
|
}}
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<button mat-button color="accent" (click)="downloadCsvExample()" translate>Download CSV example file</button>
|
<button mat-button color="accent" (click)="downloadCsvExample()">
|
||||||
|
{{ 'Download CSV example file' | translate }}
|
||||||
|
</button>
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<mat-label translate>Encoding of the file</mat-label>
|
<mat-label>{{ 'Encoding of the file' | translate }}</mat-label>
|
||||||
<mat-select
|
<mat-select
|
||||||
class="selection"
|
class="selection"
|
||||||
placeholder="translate.instant('Select encoding')"
|
|
||||||
(selectionChange)="selectEncoding($event)"
|
(selectionChange)="selectEncoding($event)"
|
||||||
[value]="encodings[0].value"
|
[value]="encodings[0].value"
|
||||||
>
|
>
|
||||||
@ -32,7 +44,7 @@
|
|||||||
</mat-select>
|
</mat-select>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<mat-label translate>Column separator</mat-label>
|
<mat-label>{{ 'Column separator' | translate }}</mat-label>
|
||||||
<mat-select class="selection" (selectionChange)="selectColSep($event)" value="">
|
<mat-select class="selection" (selectionChange)="selectColSep($event)" value="">
|
||||||
<mat-option *ngFor="let option of columnSeparators" [value]="option.value">
|
<mat-option *ngFor="let option of columnSeparators" [value]="option.value">
|
||||||
{{ option.label | translate }}
|
{{ option.label | translate }}
|
||||||
@ -40,7 +52,7 @@
|
|||||||
</mat-select>
|
</mat-select>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<mat-label translate>Text separator</mat-label>
|
<mat-label>{{ 'Text separator' | translate }}</mat-label>
|
||||||
<mat-select class="selection" (selectionChange)="selectTextSep($event)" value='"'>
|
<mat-select class="selection" (selectionChange)="selectTextSep($event)" value='"'>
|
||||||
<mat-option *ngFor="let option of textSeparators" [value]="option.value">
|
<mat-option *ngFor="let option of textSeparators" [value]="option.value">
|
||||||
{{ option.label | translate }}
|
{{ option.label | translate }}
|
||||||
@ -58,42 +70,44 @@
|
|||||||
(change)="onSelectFile($event)"
|
(change)="onSelectFile($event)"
|
||||||
/>
|
/>
|
||||||
<button mat-button osAutofocus onclick="document.getElementById('statute-import-file-input').click()">
|
<button mat-button osAutofocus onclick="document.getElementById('statute-import-file-input').click()">
|
||||||
<span translate> Select file</span>
|
<span>{{ 'Select file' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
|
|
||||||
<!-- preview table -->
|
<!-- preview table -->
|
||||||
<mat-card *ngIf="hasFile" class="os-form-card import-table">
|
<mat-card *ngIf="hasFile" class="os-form-card import-table">
|
||||||
<h3 translate>Preview</h3>
|
<h3>{{ 'Preview' | translate }}</h3>
|
||||||
<div class="summary">
|
<div class="summary">
|
||||||
<!-- new entries -->
|
<!-- new entries -->
|
||||||
<div *ngIf="newCount">
|
<div *ngIf="newCount">
|
||||||
|
|
||||||
<mat-icon inline>playlist_add</mat-icon>
|
<mat-icon inline>playlist_add</mat-icon>
|
||||||
<span> {{ newCount }} </span> <span translate>statute paragraphs(s) will be imported.</span>
|
<span> {{ newCount }} </span>
|
||||||
|
<span>{{ 'statute paragraphs(s) will be imported.' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
<!-- errors/duplicates -->
|
<!-- errors/duplicates -->
|
||||||
<div *ngIf="nonImportableCount" class="red-warning-text">
|
<div *ngIf="nonImportableCount" class="red-warning-text">
|
||||||
|
|
||||||
<mat-icon inline>warning</mat-icon>
|
<mat-icon inline>warning</mat-icon>
|
||||||
<span> {{ nonImportableCount }} </span> <span translate>entries will be ommitted.</span>
|
<span> {{ nonImportableCount }} </span> <span>{{ 'entries will be ommitted.' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
<!-- have been imported -->
|
<!-- have been imported -->
|
||||||
<div *ngIf="doneCount" class="green-text">
|
<div *ngIf="doneCount" class="green-text">
|
||||||
|
|
||||||
<mat-icon inline>done</mat-icon>
|
<mat-icon inline>done</mat-icon>
|
||||||
<span> {{ doneCount }} </span> <span translate>statute paragraphs have been imported.</span>
|
<span> {{ doneCount }} </span>
|
||||||
|
<span>{{ 'statute paragraphs have been imported.' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="newCount">
|
<div *ngIf="newCount">
|
||||||
<span translate>After verifiy the preview click on 'import' please (see top right).</span>
|
<span>{{ 'After verifiy the preview click on "import" please (see top right).' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<mat-select *ngIf="nonImportableCount" class="filter-imports" [(value)]="shown" (selectionChange)="setFilter()">
|
<mat-select *ngIf="nonImportableCount" class="filter-imports" [(value)]="shown" (selectionChange)="setFilter()">
|
||||||
<mat-option value="all" translate> Show all </mat-option>
|
<mat-option value="all">{{ 'Show all' | translate }}</mat-option>
|
||||||
<mat-option value="error" translate> Show errors only </mat-option>
|
<mat-option value="error">{{ 'Show errors only' | translate }}</mat-option>
|
||||||
<mat-option value="noerror" translate> Show correct entries </mat-option>
|
<mat-option value="noerror">{{ 'Show correct entries' | translate }}</mat-option>
|
||||||
</mat-select>
|
</mat-select>
|
||||||
</div>
|
</div>
|
||||||
<div class="table-container">
|
<div class="table-container">
|
||||||
@ -125,7 +139,7 @@
|
|||||||
|
|
||||||
<!-- title column -->
|
<!-- title column -->
|
||||||
<ng-container matColumnDef="title">
|
<ng-container matColumnDef="title">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Title</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Title' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry">
|
<mat-cell *matCellDef="let entry">
|
||||||
<mat-icon
|
<mat-icon
|
||||||
color="warn"
|
color="warn"
|
||||||
@ -140,7 +154,7 @@
|
|||||||
|
|
||||||
<!-- text column -->
|
<!-- text column -->
|
||||||
<ng-container matColumnDef="text">
|
<ng-container matColumnDef="text">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Text</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Text' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry" matTooltip="{{ getLongPreview(entry.newEntry.text) }}">
|
<mat-cell *matCellDef="let entry" matTooltip="{{ getLongPreview(entry.newEntry.text) }}">
|
||||||
<mat-icon
|
<mat-icon
|
||||||
color="warn"
|
color="warn"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<os-head-bar prevUrl="../.." [nav]="false" [hasMainButton]="true" (mainEvent)="openDialog()">
|
<os-head-bar prevUrl="../.." [nav]="false" [hasMainButton]="true" (mainEvent)="openDialog()">
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot">
|
<div class="title-slot">
|
||||||
<h2 translate>Statute</h2>
|
<h2>{{ 'Statute' | translate }}</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Use the menu slot for an add button -->
|
<!-- Use the menu slot for an add button -->
|
||||||
@ -14,10 +14,7 @@
|
|||||||
|
|
||||||
<cdk-virtual-scroll-viewport itemSize="50" [ngClass]="statuteParagraphs.length ? 'virtual-scroll-full-page' : ''">
|
<cdk-virtual-scroll-viewport itemSize="50" [ngClass]="statuteParagraphs.length ? 'virtual-scroll-full-page' : ''">
|
||||||
<mat-accordion class="os-card">
|
<mat-accordion class="os-card">
|
||||||
<mat-expansion-panel
|
<mat-expansion-panel *cdkVirtualFor="let statuteParagraph of statuteParagraphs" multiple="false">
|
||||||
*cdkVirtualFor="let statuteParagraph of statuteParagraphs"
|
|
||||||
multiple="false"
|
|
||||||
>
|
|
||||||
<mat-expansion-panel-header>
|
<mat-expansion-panel-header>
|
||||||
<mat-panel-title>
|
<mat-panel-title>
|
||||||
{{ statuteParagraph.title }}
|
{{ statuteParagraph.title }}
|
||||||
@ -43,26 +40,26 @@
|
|||||||
|
|
||||||
<mat-card *ngIf="statuteParagraphs.length === 0">
|
<mat-card *ngIf="statuteParagraphs.length === 0">
|
||||||
<mat-card-content>
|
<mat-card-content>
|
||||||
<div class="no-content" translate>No statute paragraphs</div>
|
<div class="no-content">{{ 'No statute paragraphs' | translate }}</div>
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
|
|
||||||
<mat-menu #commentMenu="matMenu">
|
<mat-menu #commentMenu="matMenu">
|
||||||
<button mat-menu-item (click)="onCsvExport()">
|
<button mat-menu-item (click)="onCsvExport()">
|
||||||
<mat-icon>archive</mat-icon>
|
<mat-icon>archive</mat-icon>
|
||||||
<span translate>Export as CSV</span>
|
<span>{{ 'Export as CSV' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-menu-item *osPerms="'motions.can_manage'" routerLink="import">
|
<button mat-menu-item *osPerms="'motions.can_manage'" routerLink="import">
|
||||||
<mat-icon>cloud_upload</mat-icon>
|
<mat-icon>cloud_upload</mat-icon>
|
||||||
<span translate>Import</span>
|
<span>{{ 'Import' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
|
|
||||||
<!-- Template for statute paragraph dialog -->
|
<!-- Template for statute paragraph dialog -->
|
||||||
<ng-template #statuteParagraphDialog>
|
<ng-template #statuteParagraphDialog>
|
||||||
<h1 mat-dialog-title>
|
<h1 mat-dialog-title>
|
||||||
<span *ngIf="currentStatuteParagraph" translate>Edit statute paragraph</span>
|
<span *ngIf="currentStatuteParagraph">{{ 'Edit statute paragraph' | translate }}</span>
|
||||||
<span *ngIf="!currentStatuteParagraph" translate>New statute paragraph</span>
|
<span *ngIf="!currentStatuteParagraph">{{ 'New statute paragraph' | translate }}</span>
|
||||||
</h1>
|
</h1>
|
||||||
<div class="os-form-card-mobile" mat-dialog-content>
|
<div class="os-form-card-mobile" mat-dialog-content>
|
||||||
<form [formGroup]="statuteParagraphForm" (keydown)="onKeyDown($event)">
|
<form [formGroup]="statuteParagraphForm" (keydown)="onKeyDown($event)">
|
||||||
@ -70,23 +67,23 @@
|
|||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<input formControlName="title" matInput placeholder="{{ 'Title' | translate }}" required />
|
<input formControlName="title" matInput placeholder="{{ 'Title' | translate }}" required />
|
||||||
<mat-hint *ngIf="!statuteParagraphForm.controls.title.valid">
|
<mat-hint *ngIf="!statuteParagraphForm.controls.title.valid">
|
||||||
<span translate>Required</span>
|
<span>{{ 'Required' | translate }}</span>
|
||||||
</mat-hint>
|
</mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</p>
|
</p>
|
||||||
<span>
|
<span>
|
||||||
<!-- The HTML Editor -->
|
<!-- The HTML Editor -->
|
||||||
<h4 translate>Statute paragraph</h4>
|
<h4>{{ 'Statute paragraph' | translate }}</h4>
|
||||||
<editor formControlName="text" [init]="tinyMceSettings"></editor>
|
<editor formControlName="text" [init]="tinyMceSettings"></editor>
|
||||||
</span>
|
</span>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div mat-dialog-actions>
|
<div mat-dialog-actions>
|
||||||
<button mat-button [mat-dialog-close]="true" [disabled]="!statuteParagraphForm.valid">
|
<button mat-button [mat-dialog-close]="true" [disabled]="!statuteParagraphForm.valid">
|
||||||
<span translate>Save</span>
|
<span>{{ 'Save' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button mat-button [mat-dialog-close]="false">
|
<button mat-button [mat-dialog-close]="false">
|
||||||
<span translate>Cancel</span>
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
{{ option.value | translate }}
|
{{ option.value | translate }}
|
||||||
</mat-option>
|
</mat-option>
|
||||||
</mat-select>
|
</mat-select>
|
||||||
<mat-error translate>This field is required.</mat-error>
|
<mat-error>{{ 'This field is required.' | translate }}</mat-error>
|
||||||
<mat-hint (click)="openVotingWarning()" *ngIf="showNonNominalWarning">
|
<mat-hint (click)="openVotingWarning()" *ngIf="showNonNominalWarning">
|
||||||
{{ 'Not suitable for formal secret voting!' | translate }}</mat-hint
|
{{ 'Not suitable for formal secret voting!' | translate }}</mat-hint
|
||||||
>
|
>
|
||||||
@ -46,7 +46,7 @@
|
|||||||
{{ option.value | translate }}
|
{{ option.value | translate }}
|
||||||
</mat-option>
|
</mat-option>
|
||||||
</mat-select>
|
</mat-select>
|
||||||
<mat-error translate>This field is required.</mat-error>
|
<mat-error>{{ 'This field is required.' | translate }}</mat-error>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<os-head-bar>
|
<os-head-bar>
|
||||||
<div class="title-slot" translate>List of electronic votes</div>
|
<div class="title-slot">{{ 'List of electronic votes' | translate }}</div>
|
||||||
</os-head-bar>
|
</os-head-bar>
|
||||||
|
|
||||||
<os-list-view-table
|
<os-list-view-table
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
<span>{{ poll.votescast }} / {{ max }}</span>
|
<span>{{ poll.votescast }} / {{ max }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span translate>Received votes</span>
|
<span>{{ 'Received votes' | translate }}</span>
|
||||||
<mat-progress-bar class="voting-progress-bar" [value]="valueInPercent"></mat-progress-bar>
|
<mat-progress-bar class="voting-progress-bar" [value]="valueInPercent"></mat-progress-bar>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<h1 mat-dialog-title>
|
<h1 mat-dialog-title>
|
||||||
<span translate>Countdown</span>
|
<span>{{ 'Countdown' | translate }}</span>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<form [formGroup]="countdownForm">
|
<form [formGroup]="countdownForm">
|
||||||
@ -34,12 +34,12 @@
|
|||||||
[mat-dialog-close]="countdownForm.value"
|
[mat-dialog-close]="countdownForm.value"
|
||||||
[disabled]="!countdownForm.valid"
|
[disabled]="!countdownForm.valid"
|
||||||
>
|
>
|
||||||
<span translate>Save</span>
|
<span>{{ 'Save' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<!-- Cancel Countdown button -->
|
<!-- Cancel Countdown button -->
|
||||||
<button type="button" mat-button [mat-dialog-close]="null">
|
<button type="button" mat-button [mat-dialog-close]="null">
|
||||||
<span translate>Cancel</span>
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<h1 mat-dialog-title>
|
<h1 mat-dialog-title>
|
||||||
<span translate>Message</span>
|
<span>{{ 'Message' | translate }}</span>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<form [formGroup]="messageForm">
|
<form [formGroup]="messageForm">
|
||||||
@ -16,12 +16,12 @@
|
|||||||
[mat-dialog-close]="messageForm.value"
|
[mat-dialog-close]="messageForm.value"
|
||||||
[disabled]="!messageForm.valid"
|
[disabled]="!messageForm.valid"
|
||||||
>
|
>
|
||||||
<span translate>Save</span>
|
<span>{{ 'Save' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<!-- Cancel Countdown button -->
|
<!-- Cancel Countdown button -->
|
||||||
<button type="button" mat-button [mat-dialog-close]="null">
|
<button type="button" mat-button [mat-dialog-close]="null">
|
||||||
<span translate>Cancel</span>
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<mat-expansion-panel *ngIf="elements.length">
|
<mat-expansion-panel *ngIf="elements.length">
|
||||||
<mat-expansion-panel-header>
|
<mat-expansion-panel-header>
|
||||||
<span translate>Media file</span>
|
<span>{{ 'Media file' | translate }}</span>
|
||||||
</mat-expansion-panel-header>
|
</mat-expansion-panel-header>
|
||||||
<div *ngFor="let element of elements">
|
<div *ngFor="let element of elements">
|
||||||
<i>{{ getMediafile(element).getTitle() }}</i>
|
<i>{{ getMediafile(element).getTitle() }}</i>
|
||||||
@ -11,18 +11,23 @@
|
|||||||
<button type="button" *ngIf="!!element.fullscreen" mat-icon-button (click)="fullscreen(element)">
|
<button type="button" *ngIf="!!element.fullscreen" mat-icon-button (click)="fullscreen(element)">
|
||||||
<mat-icon>check_box</mat-icon>
|
<mat-icon>check_box</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
<span translate>fullscreen</span>
|
<span>{{ 'fullscreen' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="getMediafile(element).isPdf()">
|
<div *ngIf="getMediafile(element).isPdf()">
|
||||||
<button type="button" mat-icon-button (click)="pdfBackward(element)" [disabled]="getPage(element) <= 1">
|
<button type="button" mat-icon-button (click)="pdfBackward(element)" [disabled]="getPage(element) <= 1">
|
||||||
<mat-icon>arrow_back</mat-icon>
|
<mat-icon>arrow_back</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" mat-icon-button (click)="pdfForward(element)" [disabled]="getPage(element) >= getMediafile(element).pages">
|
<button
|
||||||
|
type="button"
|
||||||
|
mat-icon-button
|
||||||
|
(click)="pdfForward(element)"
|
||||||
|
[disabled]="getPage(element) >= getMediafile(element).pages"
|
||||||
|
>
|
||||||
<mat-icon>arrow_forward</mat-icon>
|
<mat-icon>arrow_forward</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
<!-- TODO: Use form for page number; use pdfSetPage then. -->
|
<!-- TODO: Use form for page number; use pdfSetPage then. -->
|
||||||
<span translate>Page</span> {{ getPage(element) }}/{{ getMediafile(element).pages }}
|
<span>{{ 'Page' | translate }}</span> {{ getPage(element) }}/{{ getMediafile(element).pages }}
|
||||||
<br>
|
<br />
|
||||||
<button type="button" mat-icon-button (click)="zoom(element, 'in')">
|
<button type="button" mat-icon-button (click)="zoom(element, 'in')">
|
||||||
<mat-icon>zoom_in</mat-icon>
|
<mat-icon>zoom_in</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
<!-- delete -->
|
<!-- delete -->
|
||||||
<button mat-menu-item class="red-warning-text" (click)="onDeleteProjectorButton()">
|
<button mat-menu-item class="red-warning-text" (click)="onDeleteProjectorButton()">
|
||||||
<mat-icon>delete</mat-icon>
|
<mat-icon>delete</mat-icon>
|
||||||
<span translate>Delete</span>
|
<span>{{ 'Delete' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
</os-head-bar>
|
</os-head-bar>
|
||||||
@ -143,7 +143,7 @@
|
|||||||
[disabled]="projector?.elements_history.length === 0"
|
[disabled]="projector?.elements_history.length === 0"
|
||||||
>
|
>
|
||||||
<mat-icon>arrow_back</mat-icon>
|
<mat-icon>arrow_back</mat-icon>
|
||||||
<span translate>Previous</span>
|
<span>{{ 'Previous' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
@ -151,7 +151,7 @@
|
|||||||
(click)="projectNextSlide()"
|
(click)="projectNextSlide()"
|
||||||
[disabled]="projector?.elements_preview.length === 0"
|
[disabled]="projector?.elements_preview.length === 0"
|
||||||
>
|
>
|
||||||
<span translate>Next</span>
|
<span>{{ 'Next' | translate }}</span>
|
||||||
<mat-icon>arrow_forward</mat-icon>
|
<mat-icon>arrow_forward</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
<hr />
|
<hr />
|
||||||
@ -186,7 +186,7 @@
|
|||||||
<!-- Queue -->
|
<!-- Queue -->
|
||||||
<mat-expansion-panel *ngIf="projector.elements_preview.length" [expanded]="true" class="queue">
|
<mat-expansion-panel *ngIf="projector.elements_preview.length" [expanded]="true" class="queue">
|
||||||
<mat-expansion-panel-header>
|
<mat-expansion-panel-header>
|
||||||
<span translate>Queue</span>
|
<span>{{ 'Queue' | translate }}</span>
|
||||||
</mat-expansion-panel-header>
|
</mat-expansion-panel-header>
|
||||||
<div
|
<div
|
||||||
cdkDropList
|
cdkDropList
|
||||||
@ -232,7 +232,7 @@
|
|||||||
<!-- countdowns -->
|
<!-- countdowns -->
|
||||||
<mat-expansion-panel>
|
<mat-expansion-panel>
|
||||||
<mat-expansion-panel-header>
|
<mat-expansion-panel-header>
|
||||||
<span translate>Countdowns</span>
|
<span>{{ 'Countdowns' | translate }}</span>
|
||||||
</mat-expansion-panel-header>
|
</mat-expansion-panel-header>
|
||||||
<mat-list>
|
<mat-list>
|
||||||
<mat-list-item *ngFor="let countdown of countdowns" class="larger-mat-list-item">
|
<mat-list-item *ngFor="let countdown of countdowns" class="larger-mat-list-item">
|
||||||
@ -247,7 +247,7 @@
|
|||||||
<mat-action-row>
|
<mat-action-row>
|
||||||
<button type="button" mat-button (click)="openCountdownDialog()">
|
<button type="button" mat-button (click)="openCountdownDialog()">
|
||||||
<mat-icon>add</mat-icon>
|
<mat-icon>add</mat-icon>
|
||||||
<span translate>Add countdown</span>
|
<span>{{ 'Add countdown' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</mat-action-row>
|
</mat-action-row>
|
||||||
</mat-expansion-panel>
|
</mat-expansion-panel>
|
||||||
@ -255,7 +255,7 @@
|
|||||||
<!-- messages -->
|
<!-- messages -->
|
||||||
<mat-expansion-panel>
|
<mat-expansion-panel>
|
||||||
<mat-expansion-panel-header>
|
<mat-expansion-panel-header>
|
||||||
<span translate>Messages</span>
|
<span>{{ 'Messages' | translate }}</span>
|
||||||
</mat-expansion-panel-header>
|
</mat-expansion-panel-header>
|
||||||
<mat-list>
|
<mat-list>
|
||||||
<mat-list-item *ngFor="let message of messages" class="larger-mat-list-item">
|
<mat-list-item *ngFor="let message of messages" class="larger-mat-list-item">
|
||||||
@ -271,7 +271,7 @@
|
|||||||
<mat-action-row>
|
<mat-action-row>
|
||||||
<button type="button" mat-button (click)="openMessagesDialog()">
|
<button type="button" mat-button (click)="openMessagesDialog()">
|
||||||
<mat-icon>add</mat-icon>
|
<mat-icon>add</mat-icon>
|
||||||
<span translate>Add message</span>
|
<span>{{ 'Add message' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</mat-action-row>
|
</mat-action-row>
|
||||||
</mat-expansion-panel>
|
</mat-expansion-panel>
|
||||||
@ -279,7 +279,7 @@
|
|||||||
<!-- Current list of speakers -->
|
<!-- Current list of speakers -->
|
||||||
<mat-expansion-panel>
|
<mat-expansion-panel>
|
||||||
<mat-expansion-panel-header>
|
<mat-expansion-panel-header>
|
||||||
<span translate>Current list of speakers</span>
|
<span>{{ 'Current list of speakers' | translate }}</span>
|
||||||
</mat-expansion-panel-header>
|
</mat-expansion-panel-header>
|
||||||
|
|
||||||
<!-- Slide-->
|
<!-- Slide-->
|
||||||
@ -293,7 +293,7 @@
|
|||||||
>
|
>
|
||||||
<mat-icon>videocam</mat-icon>
|
<mat-icon>videocam</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
<span class="spacer-left-10" translate>Slide</span>
|
<span class="spacer-left-10">{{ 'Slide' | translate }}</span>
|
||||||
</mat-list-item>
|
</mat-list-item>
|
||||||
</mat-list>
|
</mat-list>
|
||||||
|
|
||||||
@ -308,7 +308,7 @@
|
|||||||
>
|
>
|
||||||
<mat-icon>videocam</mat-icon>
|
<mat-icon>videocam</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
<span class="spacer-left-10" translate>Overlay</span>
|
<span class="spacer-left-10">{{ 'Overlay' | translate }}</span>
|
||||||
</mat-list-item>
|
</mat-list-item>
|
||||||
</mat-list>
|
</mat-list>
|
||||||
|
|
||||||
@ -323,14 +323,14 @@
|
|||||||
>
|
>
|
||||||
<mat-icon>videocam</mat-icon>
|
<mat-icon>videocam</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
<span class="spacer-left-10" translate>Chyron</span>
|
<span class="spacer-left-10">{{ 'Chyron' | translate }}</span>
|
||||||
</mat-list-item>
|
</mat-list-item>
|
||||||
</mat-list>
|
</mat-list>
|
||||||
</mat-expansion-panel>
|
</mat-expansion-panel>
|
||||||
|
|
||||||
<mat-expansion-panel *ngIf="projector.elements_history.length">
|
<mat-expansion-panel *ngIf="projector.elements_history.length">
|
||||||
<mat-expansion-panel-header>
|
<mat-expansion-panel-header>
|
||||||
<span translate>Previous slides</span>
|
<span>{{ 'Previous slides' | translate }}</span>
|
||||||
</mat-expansion-panel-header>
|
</mat-expansion-panel-header>
|
||||||
<ol>
|
<ol>
|
||||||
<li *ngFor="let elements of projector.elements_history">
|
<li *ngFor="let elements of projector.elements_history">
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<h1 mat-dialog-title>
|
<h1 mat-dialog-title>
|
||||||
<span translate>Edit projector</span>
|
<span>{{ 'Edit projector' | translate }}</span>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<div class="settings-grid">
|
<div class="settings-grid">
|
||||||
@ -9,11 +9,11 @@
|
|||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<input formControlName="name" matInput placeholder="{{ 'Name' | translate }}" required />
|
<input formControlName="name" matInput placeholder="{{ 'Name' | translate }}" required />
|
||||||
<mat-hint *ngIf="!updateForm.controls.name.valid">
|
<mat-hint *ngIf="!updateForm.controls.name.valid">
|
||||||
<span translate>Required</span>
|
<span>{{ 'Required' | translate }}</span>
|
||||||
</mat-hint>
|
</mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
|
|
||||||
<h3 translate>Resolution and size</h3>
|
<h3>{{ 'Resolution and size' | translate }}</h3>
|
||||||
<!-- Aspect ratio field -->
|
<!-- Aspect ratio field -->
|
||||||
<div>
|
<div>
|
||||||
<mat-radio-group formControlName="aspectRatio" name="aspectRatio">
|
<mat-radio-group formControlName="aspectRatio" name="aspectRatio">
|
||||||
@ -72,28 +72,28 @@
|
|||||||
<div>
|
<div>
|
||||||
<div>
|
<div>
|
||||||
<mat-checkbox formControlName="show_header_footer">
|
<mat-checkbox formControlName="show_header_footer">
|
||||||
<span translate>Show header and footer</span>
|
<span>{{ 'Show header and footer' | translate }}</span>
|
||||||
</mat-checkbox>
|
</mat-checkbox>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<mat-checkbox formControlName="show_title">
|
<mat-checkbox formControlName="show_title">
|
||||||
<span translate>Show title</span>
|
<span>{{ 'Show title' | translate }}</span>
|
||||||
</mat-checkbox>
|
</mat-checkbox>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<mat-checkbox formControlName="show_logo">
|
<mat-checkbox formControlName="show_logo">
|
||||||
<span translate>Show logo</span>
|
<span>{{ 'Show logo' | translate }}</span>
|
||||||
</mat-checkbox>
|
</mat-checkbox>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<mat-checkbox formControlName="clock">
|
<mat-checkbox formControlName="clock">
|
||||||
<span translate>Show clock</span>
|
<span>{{ 'Show clock' | translate }}</span>
|
||||||
</mat-checkbox>
|
</mat-checkbox>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- projection defaults -->
|
<!-- projection defaults -->
|
||||||
<h3 translate>Projection defaults</h3>
|
<h3>{{ 'Projection defaults' | translate }}</h3>
|
||||||
<mat-select
|
<mat-select
|
||||||
formControlName="projectiondefaults_id"
|
formControlName="projectiondefaults_id"
|
||||||
placeholder="{{ 'Projection defaults' | translate }}"
|
placeholder="{{ 'Projection defaults' | translate }}"
|
||||||
@ -130,43 +130,49 @@
|
|||||||
|
|
||||||
<ng-template
|
<ng-template
|
||||||
[ngTemplateOutlet]="colorFormField"
|
[ngTemplateOutlet]="colorFormField"
|
||||||
[ngTemplateOutletContext]="{ title: 'Foreground color' | translate, form: 'color' }"
|
[ngTemplateOutletContext]="{ title: 'Foreground color', form: 'color' }"
|
||||||
>
|
>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
|
||||||
<ng-template
|
<ng-template
|
||||||
[ngTemplateOutlet]="colorFormField"
|
[ngTemplateOutlet]="colorFormField"
|
||||||
[ngTemplateOutletContext]="{ title: 'Background color' | translate, form: 'background_color' }"
|
[ngTemplateOutletContext]="{ title: 'Background color', form: 'background_color' }"
|
||||||
>
|
>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
|
||||||
<ng-template
|
<ng-template
|
||||||
[ngTemplateOutlet]="colorFormField"
|
[ngTemplateOutlet]="colorFormField"
|
||||||
[ngTemplateOutletContext]="{ title: 'Header background color' | translate, form: 'header_background_color' }"
|
[ngTemplateOutletContext]="{
|
||||||
|
title: 'Header background color',
|
||||||
|
form: 'header_background_color'
|
||||||
|
}"
|
||||||
>
|
>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
|
||||||
<ng-template
|
<ng-template
|
||||||
[ngTemplateOutlet]="colorFormField"
|
[ngTemplateOutlet]="colorFormField"
|
||||||
[ngTemplateOutletContext]="{ title: 'Header font color' | translate, form: 'header_font_color' }"
|
[ngTemplateOutletContext]="{ title: 'Header font color', form: 'header_font_color' }"
|
||||||
>
|
>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
|
||||||
<ng-template
|
<ng-template
|
||||||
[ngTemplateOutlet]="colorFormField"
|
[ngTemplateOutlet]="colorFormField"
|
||||||
[ngTemplateOutletContext]="{ title: 'Headline color' | translate, form: 'header_h1_color' }"
|
[ngTemplateOutletContext]="{ title: 'Headline color', form: 'header_h1_color' }"
|
||||||
>
|
>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
|
||||||
<ng-template
|
<ng-template
|
||||||
[ngTemplateOutlet]="colorFormField"
|
[ngTemplateOutlet]="colorFormField"
|
||||||
[ngTemplateOutletContext]="{ title: 'Chyron background color' | translate, form: 'chyron_background_color' }"
|
[ngTemplateOutletContext]="{
|
||||||
|
title: 'Chyron background color',
|
||||||
|
form: 'chyron_background_color'
|
||||||
|
}"
|
||||||
>
|
>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
|
||||||
<ng-template
|
<ng-template
|
||||||
[ngTemplateOutlet]="colorFormField"
|
[ngTemplateOutlet]="colorFormField"
|
||||||
[ngTemplateOutletContext]="{ title: 'Chyron font color' | translate, form: 'chyron_font_color' }"
|
[ngTemplateOutletContext]="{ title: 'Chyron font color', form: 'chyron_font_color' }"
|
||||||
>
|
>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
</div>
|
</div>
|
||||||
@ -176,18 +182,18 @@
|
|||||||
<div mat-dialog-actions>
|
<div mat-dialog-actions>
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
<button type="submit" mat-button color="primary">
|
<button type="submit" mat-button color="primary">
|
||||||
<span translate>Save</span>
|
<span>{{ 'Save' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" mat-button [mat-dialog-close]="null">
|
<button type="button" mat-button [mat-dialog-close]="null">
|
||||||
<span translate>Cancel</span>
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" mat-button (click)="applyChanges()">
|
<button type="button" mat-button (click)="applyChanges()">
|
||||||
<span translate>Apply</span>
|
<span>{{ 'Apply' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
<div>
|
<div>
|
||||||
<h3 translate>Preview</h3>
|
<h3>{{ 'Preview' | translate }}</h3>
|
||||||
<div class="preview-container">
|
<div class="preview-container">
|
||||||
<os-projector #preview *ngIf="previewProjector" [projector]="previewProjector"></os-projector>
|
<os-projector #preview *ngIf="previewProjector" [projector]="previewProjector"></os-projector>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
<os-head-bar [nav]="true" [hasMainButton]="canManage" (mainEvent)="createNewProjector(projectorDialog)">
|
<os-head-bar [nav]="true" [hasMainButton]="canManage" (mainEvent)="createNewProjector(projectorDialog)">
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot">
|
<div class="title-slot">
|
||||||
<h2 translate>Projectors</h2>
|
<h2>{{ 'Projectors' | translate }}</h2>
|
||||||
</div>
|
</div>
|
||||||
</os-head-bar>
|
</os-head-bar>
|
||||||
|
|
||||||
<!-- Create projector dialog -->
|
<!-- Create projector dialog -->
|
||||||
<ng-template #projectorDialog>
|
<ng-template #projectorDialog>
|
||||||
<h1 mat-dialog-title>
|
<h1 mat-dialog-title>
|
||||||
<span translate>New Projector</span>
|
<span>{{ 'New Projector' | translate }}</span>
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<form [formGroup]="createForm">
|
<form [formGroup]="createForm">
|
||||||
@ -16,17 +16,17 @@
|
|||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<input formControlName="name" matInput placeholder="{{ 'Name' | translate }}" required />
|
<input formControlName="name" matInput placeholder="{{ 'Name' | translate }}" required />
|
||||||
<mat-hint *ngIf="!createForm.controls.name.valid">
|
<mat-hint *ngIf="!createForm.controls.name.valid">
|
||||||
<span translate>Required</span>
|
<span>{{ 'Required' | translate }}</span>
|
||||||
</mat-hint>
|
</mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div mat-dialog-actions>
|
<div mat-dialog-actions>
|
||||||
<button type="submit" mat-button [disabled]="!createForm.valid" color="primary" [mat-dialog-close]="true">
|
<button type="submit" mat-button [disabled]="!createForm.valid" color="primary" [mat-dialog-close]="true">
|
||||||
<span translate>Create</span>
|
<span>{{ 'Create' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" mat-button [mat-dialog-close]="null">
|
<button type="button" mat-button [mat-dialog-close]="null">
|
||||||
<span translate>Cancel</span>
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
@ -48,7 +48,7 @@
|
|||||||
(click)="mobileAutoCloseNav()"
|
(click)="mobileAutoCloseNav()"
|
||||||
>
|
>
|
||||||
<mat-icon>info</mat-icon>
|
<mat-icon>info</mat-icon>
|
||||||
<span translate>Legal notice</span>
|
<span>{{ 'Legal notice' | translate }}</span>
|
||||||
</a>
|
</a>
|
||||||
<a
|
<a
|
||||||
[@navItemAnim]
|
[@navItemAnim]
|
||||||
@ -58,7 +58,7 @@
|
|||||||
(click)="mobileAutoCloseNav()"
|
(click)="mobileAutoCloseNav()"
|
||||||
>
|
>
|
||||||
<mat-icon>security</mat-icon>
|
<mat-icon>security</mat-icon>
|
||||||
<span translate>Privacy policy</span>
|
<span>{{ 'Privacy policy' | translate }}</span>
|
||||||
</a>
|
</a>
|
||||||
<a
|
<a
|
||||||
[@navItemAnim]
|
[@navItemAnim]
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
<os-head-bar [hasMainButton]="true" [nav]="true" (mainEvent)="openTagDialog()" [multiSelectMode]="isMultiSelect">
|
<os-head-bar [hasMainButton]="true" [nav]="true" (mainEvent)="openTagDialog()" [multiSelectMode]="isMultiSelect">
|
||||||
<div class="title-slot"><h2 translate>Tags</h2></div>
|
<div class="title-slot">
|
||||||
|
<h2>{{ 'Tags' | translate }}</h2>
|
||||||
|
</div>
|
||||||
</os-head-bar>
|
</os-head-bar>
|
||||||
|
|
||||||
<os-list-view-table
|
<os-list-view-table
|
||||||
@ -35,8 +37,8 @@
|
|||||||
<!-- Template for dialog for quick editing -->
|
<!-- Template for dialog for quick editing -->
|
||||||
<ng-template #tagDialog>
|
<ng-template #tagDialog>
|
||||||
<h1 mat-dialog-title>
|
<h1 mat-dialog-title>
|
||||||
<span *ngIf="currentTag" translate>Edit tag</span>
|
<span *ngIf="currentTag">{{ 'Edit tag' | translate }}</span>
|
||||||
<span *ngIf="!currentTag" translate>New tag</span>
|
<span *ngIf="!currentTag">{{ 'New tag' | translate }}</span>
|
||||||
</h1>
|
</h1>
|
||||||
<div class="os-form-card-mobile" mat-dialog-content>
|
<div class="os-form-card-mobile" mat-dialog-content>
|
||||||
<form [formGroup]="tagForm" (keydown)="onKeyDown($event)">
|
<form [formGroup]="tagForm" (keydown)="onKeyDown($event)">
|
||||||
@ -48,10 +50,10 @@
|
|||||||
|
|
||||||
<div mat-dialog-actions>
|
<div mat-dialog-actions>
|
||||||
<button type="submit" mat-button [mat-dialog-close]="true" color="primary">
|
<button type="submit" mat-button [mat-dialog-close]="true" color="primary">
|
||||||
<span translate>Save</span>
|
<span>{{ 'Save' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" mat-button [mat-dialog-close]="false">
|
<button type="button" mat-button [mat-dialog-close]="false">
|
||||||
<span translate>Cancel</span>
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
@ -11,9 +11,9 @@
|
|||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot">
|
<div class="title-slot">
|
||||||
<h2>
|
<h2>
|
||||||
<span *ngIf="newTopic" translate>New topic</span>
|
<span *ngIf="newTopic">{{ 'New topic' | translate }}</span>
|
||||||
<span *ngIf="editTopic && !newTopic" translate>Edit topic</span>
|
<span *ngIf="editTopic && !newTopic">{{ 'Edit topic' | translate }}</span>
|
||||||
<span *ngIf="!newTopic && !editTopic" translate>Topic</span>
|
<span *ngIf="!newTopic && !editTopic">{{ 'Topic' | translate }}</span>
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -38,7 +38,8 @@
|
|||||||
|
|
||||||
<div *ngIf="topic.hasAttachments() && !editTopic">
|
<div *ngIf="topic.hasAttachments() && !editTopic">
|
||||||
<h3>
|
<h3>
|
||||||
<span translate>Attachments</span>:
|
<span>{{ 'Attachments' | translate }}</span
|
||||||
|
>:
|
||||||
<mat-list dense>
|
<mat-list dense>
|
||||||
<mat-list-item *ngFor="let file of topic.attachments">
|
<mat-list-item *ngFor="let file of topic.attachments">
|
||||||
<a [routerLink]="file.url" target="_blank">{{ file.getTitle() }}</a>
|
<a [routerLink]="file.url" target="_blank">{{ file.getTitle() }}</a>
|
||||||
@ -58,13 +59,13 @@
|
|||||||
formControlName="title"
|
formControlName="title"
|
||||||
placeholder="{{ 'Title' | translate }}"
|
placeholder="{{ 'Title' | translate }}"
|
||||||
/>
|
/>
|
||||||
<mat-error *ngIf="topicForm.invalid" translate>A name is required</mat-error>
|
<mat-error *ngIf="topicForm.invalid">{{ 'A name is required' | translate }}</mat-error>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- The editor -->
|
<!-- The editor -->
|
||||||
<div class="spacer-bottom-20">
|
<div class="spacer-bottom-20">
|
||||||
<h4 translate>Text</h4>
|
<h4>{{ 'Text' | translate }}</h4>
|
||||||
<editor formControlName="text" [init]="tinyMceSettings"></editor>
|
<editor formControlName="text" [init]="tinyMceSettings"></editor>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -108,7 +109,7 @@
|
|||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
<button *osPerms="'agenda.can_manage'" mat-menu-item class="red-warning-text" (click)="onDeleteButton()">
|
<button *osPerms="'agenda.can_manage'" mat-menu-item class="red-warning-text" (click)="onDeleteButton()">
|
||||||
<mat-icon>delete</mat-icon>
|
<mat-icon>delete</mat-icon>
|
||||||
<span translate>Delete</span>
|
<span>{{ 'Delete' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
<os-head-bar [nav]="false">
|
<os-head-bar [nav]="false">
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot"><h2 translate>Import topics</h2></div>
|
<div class="title-slot">
|
||||||
|
<h2>{{ 'Import topics' | translate }}</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="menu-slot">
|
<div class="menu-slot">
|
||||||
<button *ngIf="hasFile && newCount" mat-button (click)="doImport()">
|
<button *ngIf="hasFile && newCount" mat-button (click)="doImport()">
|
||||||
<span class="upper" translate> Import</span>
|
<span class="upper">{{ 'Import' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</os-head-bar>
|
</os-head-bar>
|
||||||
@ -15,8 +17,8 @@
|
|||||||
<mat-tab label="{{ 'Text import' | translate }}">
|
<mat-tab label="{{ 'Text import' | translate }}">
|
||||||
<div [formGroup]="textAreaForm">
|
<div [formGroup]="textAreaForm">
|
||||||
<div>
|
<div>
|
||||||
<span translate> Paste/write your topics in this textbox.</span>
|
<span>{{ 'Paste/write your topics in this textbox.' | translate }}</span>
|
||||||
<span translate> Keep each item in a single line. </span>
|
<span>{{ 'Keep each item in a single line.' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<textarea
|
<textarea
|
||||||
@ -31,36 +33,45 @@
|
|||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<button mat-button color="accent" (click)="parseTextArea()"><span translate>Preview</span></button>
|
<button mat-button color="accent" (click)="parseTextArea()">
|
||||||
|
<span>{{ 'Preview' | translate }}</span>
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</mat-tab>
|
</mat-tab>
|
||||||
|
|
||||||
<!-- CSV import tab -->
|
<!-- CSV import tab -->
|
||||||
<mat-tab label="{{ 'CSV import' | translate }}">
|
<mat-tab label="{{ 'CSV import' | translate }}">
|
||||||
<span translate
|
<span>{{
|
||||||
>Required comma or semicolon separated values with these column header names in the first row:</span
|
'Required comma or semicolon separated values with these column header names in the first row:'
|
||||||
>
|
| translate
|
||||||
|
}}</span>
|
||||||
<br />
|
<br />
|
||||||
<div class="code red-warning-text">
|
<div class="code red-warning-text">
|
||||||
<span translate>Title</span>, <span translate>Text</span>,
|
<span>{{ 'Title' | translate }}</span
|
||||||
<span translate>Duration</span>, <span translate>Comment</span>,
|
>, <span>{{ 'Text' | translate }}</span
|
||||||
<span translate>Internal item</span>
|
>, <span>{{ 'Duration' | translate }}</span
|
||||||
|
>, <span>{{ 'Comment' | translate }}</span
|
||||||
|
>,
|
||||||
|
<span>{{ 'Internal item' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
<ul>
|
<ul>
|
||||||
<li translate>Title is required. All other fields are optional and may be empty.</li>
|
<li>{{ 'Title is required. All other fields are optional and may be empty.' | translate }}</li>
|
||||||
<li translate>
|
<li>
|
||||||
Additional columns after the required ones may be present and won't affect the import.
|
{{
|
||||||
|
'Additional columns after the required ones may be present and will not affect the import.'
|
||||||
|
| translate
|
||||||
|
}}
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<button mat-button color="accent" (click)="downloadCsvExample()" translate>
|
<button mat-button color="accent" (click)="downloadCsvExample()">
|
||||||
Download CSV example file
|
{{ 'Download CSV example file' | translate }}
|
||||||
</button>
|
</button>
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<mat-label translate>Encoding of the file</mat-label>
|
<mat-label>{{ 'Encoding of the file' | translate }}</mat-label>
|
||||||
<mat-select
|
<mat-select
|
||||||
class="selection"
|
class="selection"
|
||||||
placeholder="translate.instant('Select encoding')"
|
placeholder="{{ 'Select encoding' | translate }}"
|
||||||
(selectionChange)="selectEncoding($event)"
|
(selectionChange)="selectEncoding($event)"
|
||||||
[value]="encodings[0].value"
|
[value]="encodings[0].value"
|
||||||
>
|
>
|
||||||
@ -70,7 +81,7 @@
|
|||||||
</mat-select>
|
</mat-select>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<mat-label translate>Column separator</mat-label>
|
<mat-label>{{ 'Column separator' | translate }}</mat-label>
|
||||||
<mat-select class="selection" (selectionChange)="selectColSep($event)" value="">
|
<mat-select class="selection" (selectionChange)="selectColSep($event)" value="">
|
||||||
<mat-option *ngFor="let option of columnSeparators" [value]="option.value">
|
<mat-option *ngFor="let option of columnSeparators" [value]="option.value">
|
||||||
{{ option.label | translate }}
|
{{ option.label | translate }}
|
||||||
@ -78,7 +89,7 @@
|
|||||||
</mat-select>
|
</mat-select>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<mat-label translate>Text separator</mat-label>
|
<mat-label>{{ 'Text separator' | translate }}</mat-label>
|
||||||
<mat-select class="selection" (selectionChange)="selectTextSep($event)" value='"'>
|
<mat-select class="selection" (selectionChange)="selectTextSep($event)" value='"'>
|
||||||
<mat-option *ngFor="let option of textSeparators" [value]="option.value">
|
<mat-option *ngFor="let option of textSeparators" [value]="option.value">
|
||||||
{{ option.label | translate }}
|
{{ option.label | translate }}
|
||||||
@ -97,7 +108,7 @@
|
|||||||
(change)="onSelectFile($event)"
|
(change)="onSelectFile($event)"
|
||||||
/>
|
/>
|
||||||
<button mat-button onclick="document.getElementById('agenda-import-file-input').click()">
|
<button mat-button onclick="document.getElementById('agenda-import-file-input').click()">
|
||||||
<span translate>Select file</span>
|
<span>{{ 'Select file' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -107,35 +118,35 @@
|
|||||||
|
|
||||||
<!-- preview table -->
|
<!-- preview table -->
|
||||||
<mat-card *ngIf="hasFile" class="os-form-card import-table">
|
<mat-card *ngIf="hasFile" class="os-form-card import-table">
|
||||||
<h3 translate>Preview</h3>
|
<h3>{{ 'Preview' | translate }}</h3>
|
||||||
<div class="summary">
|
<div class="summary">
|
||||||
<!-- new entries -->
|
<!-- new entries -->
|
||||||
<div *ngIf="newCount">
|
<div *ngIf="newCount">
|
||||||
|
|
||||||
<mat-icon inline>playlist_add</mat-icon>
|
<mat-icon inline>playlist_add</mat-icon>
|
||||||
<span> {{ newCount }} </span> <span translate>Topics(s) will be imported.</span>
|
<span> {{ newCount }} </span> <span>{{ 'Topics(s) will be imported.' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
<!-- errors/duplicates -->
|
<!-- errors/duplicates -->
|
||||||
<div *ngIf="nonImportableCount" class="red-warning-text">
|
<div *ngIf="nonImportableCount" class="red-warning-text">
|
||||||
|
|
||||||
<mat-icon inline>warning</mat-icon>
|
<mat-icon inline>warning</mat-icon>
|
||||||
<span> {{ nonImportableCount }} </span> <span translate>entries will be ommitted.</span>
|
<span> {{ nonImportableCount }} </span> <span>{{ 'entries will be ommitted.' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
<!-- have been imported -->
|
<!-- have been imported -->
|
||||||
<div *ngIf="doneCount" class="green-text">
|
<div *ngIf="doneCount" class="green-text">
|
||||||
|
|
||||||
<mat-icon inline>done</mat-icon>
|
<mat-icon inline>done</mat-icon>
|
||||||
<span> {{ doneCount }} </span> <span translate>Topics have been imported.</span>
|
<span> {{ doneCount }} </span> <span>{{ 'Topics have been imported.' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="newCount">
|
<div *ngIf="newCount">
|
||||||
<span translate>After verifiy the preview click on 'import' please (see top right).</span>
|
<span>{{ 'After verifiy the preview click on "import" please (see top right).' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<mat-select *ngIf="nonImportableCount" class="filter-imports" [(value)]="shown" (selectionChange)="setFilter()">
|
<mat-select *ngIf="nonImportableCount" class="filter-imports" [(value)]="shown" (selectionChange)="setFilter()">
|
||||||
<mat-option value="all" translate>Show all</mat-option>
|
<mat-option value="all">{{ 'Show all' | translate }}</mat-option>
|
||||||
<mat-option value="error" translate>Show errors only</mat-option>
|
<mat-option value="error">{{ 'Show errors only' | translate }}</mat-option>
|
||||||
<mat-option value="noerror" translate>Show correct entries only</mat-option>
|
<mat-option value="noerror">{{ 'Show correct entries only' | translate }}</mat-option>
|
||||||
</mat-select>
|
</mat-select>
|
||||||
</div>
|
</div>
|
||||||
<div class="table-container">
|
<div class="table-container">
|
||||||
@ -167,7 +178,7 @@
|
|||||||
|
|
||||||
<!-- title column -->
|
<!-- title column -->
|
||||||
<ng-container matColumnDef="title">
|
<ng-container matColumnDef="title">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Title</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Title' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry">
|
<mat-cell *matCellDef="let entry">
|
||||||
<mat-icon
|
<mat-icon
|
||||||
color="warn"
|
color="warn"
|
||||||
@ -190,7 +201,7 @@
|
|||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<ng-container matColumnDef="text">
|
<ng-container matColumnDef="text">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Text</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Text' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry" matTooltip="{{ getLongPreview(entry.newEntry.text) }}">
|
<mat-cell *matCellDef="let entry" matTooltip="{{ getLongPreview(entry.newEntry.text) }}">
|
||||||
{{ getShortPreview(entry.newEntry.text) }}
|
{{ getShortPreview(entry.newEntry.text) }}
|
||||||
</mat-cell>
|
</mat-cell>
|
||||||
@ -198,20 +209,22 @@
|
|||||||
|
|
||||||
<!-- duration column -->
|
<!-- duration column -->
|
||||||
<ng-container matColumnDef="agenda_duration">
|
<ng-container matColumnDef="agenda_duration">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Duration</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Duration' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry"> {{ getDuration(entry.newEntry.agenda_duration) }} </mat-cell>
|
<mat-cell *matCellDef="let entry"> {{ getDuration(entry.newEntry.agenda_duration) }} </mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<!-- comment column-->
|
<!-- comment column-->
|
||||||
<ng-container matColumnDef="agenda_comment">
|
<ng-container matColumnDef="agenda_comment">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Comment</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Comment' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry"> {{ entry.newEntry.agenda_comment }} </mat-cell>
|
<mat-cell *matCellDef="let entry"> {{ entry.newEntry.agenda_comment }} </mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<!-- type column -->
|
<!-- type column -->
|
||||||
<ng-container matColumnDef="agenda_type">
|
<ng-container matColumnDef="agenda_type">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Type</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Type' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry"> {{ getTypeString(entry.newEntry.agenda_type) | translate }} </mat-cell>
|
<mat-cell *matCellDef="let entry">
|
||||||
|
{{ getTypeString(entry.newEntry.agenda_type) | translate }}
|
||||||
|
</mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<mat-header-row *matHeaderRowDef="getColumnDefinition()"></mat-header-row>
|
<mat-header-row *matHeaderRowDef="getColumnDefinition()"></mat-header-row>
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
<os-head-bar [hasMainButton]="true" [nav]="false" (mainEvent)="setEditMode(!editGroup)">
|
<os-head-bar [hasMainButton]="true" [nav]="false" (mainEvent)="setEditMode(!editGroup)">
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot">
|
<div class="title-slot">
|
||||||
<h2 translate>Groups</h2>
|
<h2>{{ 'Groups' | translate }}</h2>
|
||||||
</div>
|
</div>
|
||||||
</os-head-bar>
|
</os-head-bar>
|
||||||
|
|
||||||
<div class="hint-text">
|
<div class="hint-text">
|
||||||
<span translate>All your changes are saved immediately.</span>
|
<span>{{ 'All your changes are saved immediately.' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<mat-accordion *ngFor="let app of appPermissions">
|
<mat-accordion *ngFor="let app of appPermissions">
|
||||||
@ -20,7 +20,7 @@
|
|||||||
<div class="scrollable-perm-matrix">
|
<div class="scrollable-perm-matrix">
|
||||||
<table mat-table [dataSource]="getTableDataSource(app.permissions)">
|
<table mat-table [dataSource]="getTableDataSource(app.permissions)">
|
||||||
<ng-container matColumnDef="perm" sticky>
|
<ng-container matColumnDef="perm" sticky>
|
||||||
<mat-header-cell *matHeaderCellDef translate>Permissions</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Permissions' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let perm">
|
<mat-cell *matCellDef="let perm">
|
||||||
{{ perm.display_name | translate }}
|
{{ perm.display_name | translate }}
|
||||||
</mat-cell>
|
</mat-cell>
|
||||||
@ -68,7 +68,7 @@
|
|||||||
formControlName="name"
|
formControlName="name"
|
||||||
placeholder="{{ 'New group name' | translate }}"
|
placeholder="{{ 'New group name' | translate }}"
|
||||||
/>
|
/>
|
||||||
<mat-error *ngIf="!groupForm.valid" translate>Required</mat-error>
|
<mat-error *ngIf="!groupForm.valid">{{ 'Required' | translate }}</mat-error>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
@ -80,13 +80,20 @@
|
|||||||
color="primary"
|
color="primary"
|
||||||
(click)="saveGroup(groupForm.value)"
|
(click)="saveGroup(groupForm.value)"
|
||||||
>
|
>
|
||||||
<span translate>Save</span>
|
<span>{{ 'Save' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" mat-button (click)="cancelEditing()">
|
<button type="button" mat-button (click)="cancelEditing()">
|
||||||
<span translate>Cancel</span>
|
<span>{{ 'Cancel' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<button *ngIf="selectedGroup" [disabled]="!canDeleteGroup(selectedGroup)" type="button" mat-button color="warn" (click)="deleteSelectedGroup()">
|
<button
|
||||||
<span translate>Delete</span>
|
*ngIf="selectedGroup"
|
||||||
|
[disabled]="!canDeleteGroup(selectedGroup)"
|
||||||
|
type="button"
|
||||||
|
mat-button
|
||||||
|
color="warn"
|
||||||
|
(click)="deleteSelectedGroup()"
|
||||||
|
>
|
||||||
|
<span>{{ 'Delete' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
@ -1,20 +1,25 @@
|
|||||||
<os-head-bar (mainEvent)="goBack()" [hasMainButton]="true" [nav]="false" [editMode]="true" (saveEvent)="save()">a
|
<os-head-bar (mainEvent)="goBack()" [hasMainButton]="true" [nav]="false" [editMode]="true" (saveEvent)="save()"
|
||||||
|
>a
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot"><h2 translate>Change password</h2></div>
|
<div class="title-slot">
|
||||||
|
<h2>{{ 'Change password' | translate }}</h2>
|
||||||
|
</div>
|
||||||
</os-head-bar>
|
</os-head-bar>
|
||||||
<mat-card class="os-card">
|
<mat-card class="os-card">
|
||||||
<div *ngIf="!this.canManage && !this.ownPage">
|
<div *ngIf="!this.canManage && !this.ownPage">
|
||||||
<!-- no Admin, cannot Manage (a.k.a Attack Prevention) -->
|
<!-- no Admin, cannot Manage (a.k.a Attack Prevention) -->
|
||||||
<span translate>You are not supposed to be here...</span>
|
<span>{{ 'You are not supposed to be here...' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="this.canManage && !this.ownPage">
|
<div *ngIf="this.canManage && !this.ownPage">
|
||||||
<!-- can Manage, but not own Page (a.k.a. Admin) -->
|
<!-- can Manage, but not own Page (a.k.a. Admin) -->
|
||||||
<div *ngIf="user">
|
<div *ngIf="user">
|
||||||
<h1><span translate>Change password for</span> {{ user.full_name }}</h1>
|
<h1>
|
||||||
|
<span>{{ 'Change password for' | translate }}</span> {{ user.full_name }}
|
||||||
|
</h1>
|
||||||
<mat-icon>warning</mat-icon>
|
<mat-icon>warning</mat-icon>
|
||||||
<span translate>You override the personally set password!</span>
|
<span>{{ 'You override the personally set password!' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
<br>
|
<br />
|
||||||
<form [formGroup]="adminPasswordForm" (keydown)="onKeyDown($event)">
|
<form [formGroup]="adminPasswordForm" (keydown)="onKeyDown($event)">
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<input
|
<input
|
||||||
@ -29,7 +34,8 @@
|
|||||||
matSuffix
|
matSuffix
|
||||||
mat-icon-button
|
mat-icon-button
|
||||||
matTooltip="{{ hidePassword ? ('Show password' | translate) : ('Hide password' | translate) }}"
|
matTooltip="{{ hidePassword ? ('Show password' | translate) : ('Hide password' | translate) }}"
|
||||||
(click)="hidePassword = !hidePassword">
|
(click)="hidePassword = !hidePassword"
|
||||||
|
>
|
||||||
{{ hidePassword ? 'visibility' : 'visibility_off' }}
|
{{ hidePassword ? 'visibility' : 'visibility_off' }}
|
||||||
</mat-icon>
|
</mat-icon>
|
||||||
<mat-icon
|
<mat-icon
|
||||||
@ -37,16 +43,18 @@
|
|||||||
matSuffix
|
matSuffix
|
||||||
mat-icon-button
|
mat-icon-button
|
||||||
matTooltip="{{ 'Generate password' | translate }}"
|
matTooltip="{{ 'Generate password' | translate }}"
|
||||||
(click)="generatePassword()">
|
(click)="generatePassword()"
|
||||||
|
>
|
||||||
settings
|
settings
|
||||||
</mat-icon>
|
</mat-icon>
|
||||||
|
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</form>
|
</form>
|
||||||
<br>
|
<br />
|
||||||
<div *ngIf="user">
|
<div *ngIf="user">
|
||||||
<span translate>Initial password</span>: {{ user.default_password }}<br>
|
<span>{{ 'Initial password' | translate }}</span
|
||||||
<span translate>Username</span>: {{ user.username }}
|
>: {{ user.default_password }}<br />
|
||||||
|
<span>{{ 'Username' | translate }}</span
|
||||||
|
>: {{ user.username }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -63,8 +71,8 @@
|
|||||||
/>
|
/>
|
||||||
<mat-icon mat-button matSuffix mat-icon-button (click)="hideOldPassword = !hideOldPassword">
|
<mat-icon mat-button matSuffix mat-icon-button (click)="hideOldPassword = !hideOldPassword">
|
||||||
{{ hideOldPassword ? 'visibility' : 'visibility_off' }}
|
{{ hideOldPassword ? 'visibility' : 'visibility_off' }}
|
||||||
</mat-icon>
|
</mat-icon> </mat-form-field
|
||||||
</mat-form-field><br>
|
><br />
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<input
|
<input
|
||||||
[type]="hidePassword ? 'password' : 'text'"
|
[type]="hidePassword ? 'password' : 'text'"
|
||||||
@ -73,12 +81,10 @@
|
|||||||
placeholder="{{ 'New password' | translate }}"
|
placeholder="{{ 'New password' | translate }}"
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
<mat-icon
|
<mat-icon mat-button matSuffix mat-icon-button (click)="hidePassword = !hidePassword">
|
||||||
mat-button matSuffix mat-icon-button
|
|
||||||
(click)="hidePassword = !hidePassword">
|
|
||||||
{{ hidePassword ? 'visibility' : 'visibility_off' }}
|
{{ hidePassword ? 'visibility' : 'visibility_off' }}
|
||||||
</mat-icon>
|
</mat-icon> </mat-form-field
|
||||||
</mat-form-field><br>
|
><br />
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<input
|
<input
|
||||||
[type]="hidePassword ? 'password' : 'text'"
|
[type]="hidePassword ? 'password' : 'text'"
|
||||||
|
@ -1,13 +1,16 @@
|
|||||||
<os-head-bar [hasMainButton]="false" [nav]="false">
|
<os-head-bar [hasMainButton]="false" [nav]="false">
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot"><h2 translate>Presence</h2></div>
|
<div class="title-slot">
|
||||||
|
<h2>{{ 'Presence' | translate }}</h2>
|
||||||
|
</div>
|
||||||
</os-head-bar>
|
</os-head-bar>
|
||||||
|
|
||||||
<mat-card *ngIf="permission">
|
<mat-card *ngIf="permission">
|
||||||
<p translate>Check in or check out participants based on their participant numbers:</p>
|
<p>{{ 'Check in or check out participants based on their participant numbers:' | translate }}</p>
|
||||||
|
|
||||||
<mat-form-field [formGroup]="userForm">
|
<mat-form-field [formGroup]="userForm">
|
||||||
<input osAutofocus
|
<input
|
||||||
|
osAutofocus
|
||||||
matInput
|
matInput
|
||||||
[formControl]="userForm.get('number')"
|
[formControl]="userForm.get('number')"
|
||||||
placeholder="{{ 'Enter participant number' | translate }}"
|
placeholder="{{ 'Enter participant number' | translate }}"
|
||||||
@ -16,7 +19,8 @@
|
|||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<button mat-button (click)="changePresence()">{{ 'Change presence' | translate }}</button>
|
<button mat-button (click)="changePresence()">{{ 'Change presence' | translate }}</button>
|
||||||
<mat-card *ngIf="lastChangedUser" [ngClass]="lastChangedUser.is_present ? 'success' : 'warning'">
|
<mat-card *ngIf="lastChangedUser" [ngClass]="lastChangedUser.is_present ? 'success' : 'warning'">
|
||||||
<span>{{ lastChangedUser.full_name }} </span> <span translate>is now</span>:
|
<span>{{ lastChangedUser.full_name }} </span> <span>{{ 'is now' | translate }}</span
|
||||||
|
>:
|
||||||
<span> {{ lastChangedUser.is_present ? ('present' | translate) : ('absent' | translate) }}</span>
|
<span> {{ lastChangedUser.is_present ? ('present' | translate) : ('absent' | translate) }}</span>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
<mat-card *ngIf="errorMsg" class="error">{{ errorMsg | translate }}</mat-card>
|
<mat-card *ngIf="errorMsg" class="error">{{ errorMsg | translate }}</mat-card>
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot">
|
<div class="title-slot">
|
||||||
<h2>
|
<h2>
|
||||||
<span *ngIf="newUser" translate>New participant</span>
|
<span *ngIf="newUser">{{ 'New participant' | translate }}</span>
|
||||||
<span *ngIf="!newUser && user">{{ user.full_name }}</span>
|
<span *ngIf="!newUser && user">{{ user.full_name }}</span>
|
||||||
</h2>
|
</h2>
|
||||||
</div>
|
</div>
|
||||||
@ -31,24 +31,24 @@
|
|||||||
<mat-menu #userExtraMenu="matMenu">
|
<mat-menu #userExtraMenu="matMenu">
|
||||||
<button mat-menu-item *ngIf="isAllowed('changePassword')" (click)="changePassword()">
|
<button mat-menu-item *ngIf="isAllowed('changePassword')" (click)="changePassword()">
|
||||||
<mat-icon>security</mat-icon>
|
<mat-icon>security</mat-icon>
|
||||||
<span translate>Change password</span>
|
<span>{{ 'Change password' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<!-- invitation email -->
|
<!-- invitation email -->
|
||||||
<button mat-menu-item *ngIf="isAllowed('manage') && user && user.email" (click)="sendInvitationEmail()">
|
<button mat-menu-item *ngIf="isAllowed('manage') && user && user.email" (click)="sendInvitationEmail()">
|
||||||
<mat-icon>mail</mat-icon>
|
<mat-icon>mail</mat-icon>
|
||||||
<span translate>Send invitation email</span>
|
<span>{{ 'Send invitation email' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<!-- PDF -->
|
<!-- PDF -->
|
||||||
<button mat-menu-item *ngIf="isAllowed('manage')" (click)="onDownloadPdf()">
|
<button mat-menu-item *ngIf="isAllowed('manage')" (click)="onDownloadPdf()">
|
||||||
<mat-icon>picture_as_pdf</mat-icon>
|
<mat-icon>picture_as_pdf</mat-icon>
|
||||||
<span translate>PDF</span>
|
<span>{{ 'PDF' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
<!-- delete button -->
|
<!-- delete button -->
|
||||||
<div *ngIf="isAllowed('delete')">
|
<div *ngIf="isAllowed('delete')">
|
||||||
<mat-divider></mat-divider>
|
<mat-divider></mat-divider>
|
||||||
<button mat-menu-item class="red-warning-text" (click)="deleteUserButton()">
|
<button mat-menu-item class="red-warning-text" (click)="deleteUserButton()">
|
||||||
<mat-icon>delete</mat-icon>
|
<mat-icon>delete</mat-icon>
|
||||||
<span translate>Delete</span>
|
<span>{{ 'Delete' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</mat-menu>
|
</mat-menu>
|
||||||
@ -95,8 +95,8 @@
|
|||||||
name="email"
|
name="email"
|
||||||
formControlName="email"
|
formControlName="email"
|
||||||
/>
|
/>
|
||||||
<mat-error *ngIf="personalInfoForm.get('email').hasError('email')" translate>
|
<mat-error *ngIf="personalInfoForm.get('email').hasError('email')">
|
||||||
Please enter a valid email address
|
{{ 'Please enter a valid email address' | translate }}
|
||||||
</mat-error>
|
</mat-error>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
|
|
||||||
@ -168,7 +168,7 @@
|
|||||||
<!-- About me -->
|
<!-- About me -->
|
||||||
<div *ngIf="isAllowed('seePersonal')" class="spacer-bottom-20">
|
<div *ngIf="isAllowed('seePersonal')" class="spacer-bottom-20">
|
||||||
<!-- The HTML Editor -->
|
<!-- The HTML Editor -->
|
||||||
<h4 translate>About me</h4>
|
<h4>{{ 'About me' | translate }}</h4>
|
||||||
<editor formControlName="about_me" [init]="tinyMceSettings"></editor>
|
<editor formControlName="about_me" [init]="tinyMceSettings"></editor>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -183,7 +183,7 @@
|
|||||||
<!-- Comment -->
|
<!-- Comment -->
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<input matInput placeholder="{{ 'Comment' | translate }}" formControlName="comment" />
|
<input matInput placeholder="{{ 'Comment' | translate }}" formControlName="comment" />
|
||||||
<mat-hint translate>Only for internal notes.</mat-hint>
|
<mat-hint>{{ 'Only for internal notes.' | translate }}</mat-hint>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -193,7 +193,7 @@
|
|||||||
formControlName="is_present"
|
formControlName="is_present"
|
||||||
matTooltip="{{ 'Designates whether this user is in the room.' | translate }}"
|
matTooltip="{{ 'Designates whether this user is in the room.' | translate }}"
|
||||||
>
|
>
|
||||||
<span translate>Is present</span>
|
<span>{{ 'Is present' | translate }}</span>
|
||||||
</mat-checkbox>
|
</mat-checkbox>
|
||||||
|
|
||||||
<!-- Active? -->
|
<!-- Active? -->
|
||||||
@ -205,7 +205,7 @@
|
|||||||
| translate
|
| translate
|
||||||
}}"
|
}}"
|
||||||
>
|
>
|
||||||
<span translate>Is active</span>
|
<span>{{ 'Is active' | translate }}</span>
|
||||||
</mat-checkbox>
|
</mat-checkbox>
|
||||||
|
|
||||||
<!-- Commitee? -->
|
<!-- Commitee? -->
|
||||||
@ -213,7 +213,7 @@
|
|||||||
formControlName="is_committee"
|
formControlName="is_committee"
|
||||||
matTooltip="{{ 'Designates whether this user should be treated as a committee.' | translate }}"
|
matTooltip="{{ 'Designates whether this user should be treated as a committee.' | translate }}"
|
||||||
>
|
>
|
||||||
<span translate>Is a committee</span>
|
<span>{{ 'Is a committee' | translate }}</span>
|
||||||
</mat-checkbox>
|
</mat-checkbox>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
@ -223,7 +223,7 @@
|
|||||||
<ng-container *ngIf="user">
|
<ng-container *ngIf="user">
|
||||||
<!-- User name -->
|
<!-- User name -->
|
||||||
<div *ngIf="isAllowed('seeName')">
|
<div *ngIf="isAllowed('seeName')">
|
||||||
<h4 translate>Name</h4>
|
<h4>{{ 'Name' | translate }}</h4>
|
||||||
<span class="state-icons">
|
<span class="state-icons">
|
||||||
<span>{{ user.short_name }}</span>
|
<span>{{ user.short_name }}</span>
|
||||||
<mat-icon *ngIf="user.is_present" matTooltip="{{ 'Is present' | translate }}">check_box</mat-icon>
|
<mat-icon *ngIf="user.is_present" matTooltip="{{ 'Is present' | translate }}">check_box</mat-icon>
|
||||||
@ -239,45 +239,45 @@
|
|||||||
<div *ngIf="isAllowed('seePersonal')">
|
<div *ngIf="isAllowed('seePersonal')">
|
||||||
<!-- Mail -->
|
<!-- Mail -->
|
||||||
<div *ngIf="user.email">
|
<div *ngIf="user.email">
|
||||||
<h4 translate>Email</h4>
|
<h4>{{ 'Email' | translate }}</h4>
|
||||||
<span>{{ user.email }}</span>
|
<span>{{ user.email }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Gender -->
|
<!-- Gender -->
|
||||||
<div *ngIf="user.gender">
|
<div *ngIf="user.gender">
|
||||||
<h4 translate>Gender</h4>
|
<h4>{{ 'Gender' | translate }}</h4>
|
||||||
<span>{{ user.gender | translate }}</span>
|
<span>{{ user.gender | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Structure Level -->
|
<!-- Structure Level -->
|
||||||
<div *ngIf="user.structure_level">
|
<div *ngIf="user.structure_level">
|
||||||
<h4 translate>Structure level</h4>
|
<h4>{{ 'Structure level' | translate }}</h4>
|
||||||
<span>{{ user.structure_level }}</span>
|
<span>{{ user.structure_level }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Participant number -->
|
<!-- Participant number -->
|
||||||
<div *ngIf="user.number">
|
<div *ngIf="user.number">
|
||||||
<h4 translate>Participant number</h4>
|
<h4>{{ 'Participant number' | translate }}</h4>
|
||||||
<span>{{ user.number }}</span>
|
<span>{{ user.number }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Groups -->
|
<!-- Groups -->
|
||||||
<div *ngIf="user.groups && user.groups.length > 0">
|
<div *ngIf="user.groups && user.groups.length > 0">
|
||||||
<h4 translate>Groups</h4>
|
<h4>{{ 'Groups' | translate }}</h4>
|
||||||
<span *ngFor="let group of user.groups; let last = last">
|
<span *ngFor="let group of user.groups; let last = last">
|
||||||
{{ group.getTitle() | translate }}<span *ngIf="!last">, </span>
|
{{ group.getTitle() | translate }}<span *ngIf="!last">, </span>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="!user.groups || user.groups.length === 0">
|
<div *ngIf="!user.groups || user.groups.length === 0">
|
||||||
<h4 translate>Groups</h4>
|
<h4>{{ 'Groups' | translate }}</h4>
|
||||||
<span translate>Default group</span>
|
<span>{{ 'Default group' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div *ngIf="isAllowed('manage')">
|
<div *ngIf="isAllowed('manage')">
|
||||||
<!-- Initial Password -->
|
<!-- Initial Password -->
|
||||||
<div *ngIf="user.default_password">
|
<div *ngIf="user.default_password">
|
||||||
<h4 translate>Initial password</h4>
|
<h4>{{ 'Initial password' | translate }}</h4>
|
||||||
<span>{{ user.default_password }}</span>
|
<span>{{ user.default_password }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -285,13 +285,13 @@
|
|||||||
<div *ngIf="isAllowed('seePersonal')">
|
<div *ngIf="isAllowed('seePersonal')">
|
||||||
<!-- About me -->
|
<!-- About me -->
|
||||||
<div *ngIf="user.about_me">
|
<div *ngIf="user.about_me">
|
||||||
<h4 translate>About me</h4>
|
<h4>{{ 'About me' | translate }}</h4>
|
||||||
<div [innerHTML]="user.about_me | trust: 'html'"></div>
|
<div [innerHTML]="user.about_me | trust: 'html'"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Username -->
|
<!-- Username -->
|
||||||
<div *ngIf="user.username">
|
<div *ngIf="user.username">
|
||||||
<h4 translate>Username</h4>
|
<h4>{{ 'Username' | translate }}</h4>
|
||||||
<span>{{ user.username }}</span>
|
<span>{{ user.username }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -299,14 +299,14 @@
|
|||||||
<div *ngIf="isAllowed('seeExtra')">
|
<div *ngIf="isAllowed('seeExtra')">
|
||||||
<!-- Comment -->
|
<!-- Comment -->
|
||||||
<div *ngIf="user.comment">
|
<div *ngIf="user.comment">
|
||||||
<h4 translate>Comment</h4>
|
<h4>{{ 'Comment' | translate }}</h4>
|
||||||
<span>{{ user.comment }}</span>
|
<span>{{ user.comment }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div *ngIf="isAllowed('seePersonal') && user.isLastEmailSend">
|
<div *ngIf="isAllowed('seePersonal') && user.isLastEmailSend">
|
||||||
<div>
|
<div>
|
||||||
<h4 translate>Last email sent</h4>
|
<h4>{{ 'Last email sent' | translate }}</h4>
|
||||||
<span>{{ getEmailSentTime() }}</span>
|
<span>{{ getEmailSentTime() }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
<os-head-bar [nav]="false">
|
<os-head-bar [nav]="false">
|
||||||
<!-- Title -->
|
<!-- Title -->
|
||||||
<div class="title-slot"><h2 translate>Import participants</h2></div>
|
<div class="title-slot">
|
||||||
|
<h2>{{ 'Import participants' | translate }}</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="menu-slot">
|
<div class="menu-slot">
|
||||||
<button *ngIf="hasFile && newCount" mat-button (click)="doImport()">
|
<button *ngIf="hasFile && newCount" mat-button (click)="doImport()">
|
||||||
<span class="upper" translate> Import</span>
|
<span class="upper">{{ 'Import' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</os-head-bar>
|
</os-head-bar>
|
||||||
@ -12,12 +14,13 @@
|
|||||||
<mat-tab-group (selectedTabChange)="onTabChange()">
|
<mat-tab-group (selectedTabChange)="onTabChange()">
|
||||||
<!-- textarea import tab -->
|
<!-- textarea import tab -->
|
||||||
<mat-tab label="{{ 'Text import' | translate }}">
|
<mat-tab label="{{ 'Text import' | translate }}">
|
||||||
<br>
|
<br />
|
||||||
<div [formGroup]="textAreaForm">
|
<div [formGroup]="textAreaForm">
|
||||||
<div>
|
<div>
|
||||||
<span translate> Copy and paste your participant names in this textbox.</span>
|
<span>{{ 'Copy and paste your participant names in this textbox.' | translate }}</span>
|
||||||
<span translate> Keep each person in a single line. </span><br />
|
<span>{{ 'Keep each person in a single line.' | translate }}</span
|
||||||
<span translate> Comma separated names will be read as 'Surname, given name(s)'. </span>
|
><br />
|
||||||
|
<span>{{ 'Comma separated names will be read as "Surname, given name(s)".' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<textarea
|
<textarea
|
||||||
@ -32,39 +35,59 @@
|
|||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<button mat-button color="accent" (click)="parseTextArea()"><span translate>Preview</span></button>
|
<button mat-button color="accent" (click)="parseTextArea()">
|
||||||
|
<span>{{ 'Preview' | translate }}</span>
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</mat-tab>
|
</mat-tab>
|
||||||
<!-- CSV import tab -->
|
<!-- CSV import tab -->
|
||||||
<mat-tab label="{{ 'CSV import' | translate }}">
|
<mat-tab label="{{ 'CSV import' | translate }}">
|
||||||
<br>
|
<br />
|
||||||
<span translate
|
<span>
|
||||||
>Required comma or semicolon separated values with these column header names in the first row:</span
|
{{
|
||||||
><br />
|
'Required comma or semicolon separated values with these column header names in the first row:'
|
||||||
|
| translate
|
||||||
|
}}
|
||||||
|
</span>
|
||||||
|
<br />
|
||||||
<div class="code red-warning-text">
|
<div class="code red-warning-text">
|
||||||
<span translate>Title</span>, <span translate>Given name</span>, <span translate>Surname</span>,
|
<span>{{ 'Title' | translate }}</span
|
||||||
<span translate>Structure level</span>, <span translate>Participant number</span>,
|
>, <span>{{ 'Given name' | translate }}</span
|
||||||
<span translate>Groups</span>, <span translate>Comment</span>, <span translate>Is active</span>,
|
>, <span>{{ 'Surname' | translate }}</span
|
||||||
<span translate>Is present</span>, <span translate>Is committee</span>, <span translate>Initial password</span>,
|
>, <span>{{ 'Structure level' | translate }}</span
|
||||||
<span translate>Email</span>, <span translate>Username</span>, <span translate>Gender</span>
|
>, <span>{{ 'Participant number' | translate }}</span
|
||||||
|
>, <span>{{ 'Groups' | translate }}</span
|
||||||
|
>, <span>{{ 'Comment' | translate }}</span
|
||||||
|
>, <span>{{ 'Is active' | translate }}</span
|
||||||
|
>, <span>{{ 'Is present' | translate }}</span
|
||||||
|
>, <span>{{ 'Is committee' | translate }}</span
|
||||||
|
>, <span>{{ 'Initial password' | translate }}</span
|
||||||
|
>, <span>{{ 'Email' | translate }}</span
|
||||||
|
>, <span>{{ 'Username' | translate }}</span
|
||||||
|
>, <span>{{ 'Gender' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
<ul>
|
<ul>
|
||||||
<li translate>
|
<li>
|
||||||
One of given name, surname and username has to be filled in. All other fields are optional and may be empty.
|
{{
|
||||||
|
'One of given name, surname and username has to be filled in. All other fields are optional and may be empty.'
|
||||||
|
| translate
|
||||||
|
}}
|
||||||
</li>
|
</li>
|
||||||
<li translate>
|
<li>
|
||||||
Additional columns after the required ones may be present and won't affect the import.
|
{{
|
||||||
|
'Additional columns after the required ones may be present and will not affect the import.'
|
||||||
|
| translate
|
||||||
|
}}
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<button mat-button color="accent" (click)="downloadCsvExample()" translate>
|
<button mat-button color="accent" (click)="downloadCsvExample()">
|
||||||
Download CSV example file
|
{{ 'Download CSV example file' | translate }}
|
||||||
</button>
|
</button>
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<mat-label translate>Encoding of the file</mat-label>
|
<mat-label>{{ 'Encoding of the file' | translate }}</mat-label>
|
||||||
<mat-select
|
<mat-select
|
||||||
class="selection"
|
class="selection"
|
||||||
placeholder="translate.instant('Select encoding')"
|
|
||||||
(selectionChange)="selectEncoding($event)"
|
(selectionChange)="selectEncoding($event)"
|
||||||
[value]="encodings[0].value"
|
[value]="encodings[0].value"
|
||||||
>
|
>
|
||||||
@ -74,7 +97,7 @@
|
|||||||
</mat-select>
|
</mat-select>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<mat-label translate>Column separator</mat-label>
|
<mat-label>{{ 'Column separator' | translate }}</mat-label>
|
||||||
<mat-select class="selection" (selectionChange)="selectColSep($event)" value="">
|
<mat-select class="selection" (selectionChange)="selectColSep($event)" value="">
|
||||||
<mat-option *ngFor="let option of columnSeparators" [value]="option.value">
|
<mat-option *ngFor="let option of columnSeparators" [value]="option.value">
|
||||||
{{ option.label | translate }}
|
{{ option.label | translate }}
|
||||||
@ -82,7 +105,7 @@
|
|||||||
</mat-select>
|
</mat-select>
|
||||||
</mat-form-field>
|
</mat-form-field>
|
||||||
<mat-form-field>
|
<mat-form-field>
|
||||||
<mat-label translate>Text separator</mat-label>
|
<mat-label>{{ 'Text separator' | translate }}</mat-label>
|
||||||
<mat-select class="selection" (selectionChange)="selectTextSep($event)" value='"'>
|
<mat-select class="selection" (selectionChange)="selectTextSep($event)" value='"'>
|
||||||
<mat-option *ngFor="let option of textSeparators" [value]="option.value">
|
<mat-option *ngFor="let option of textSeparators" [value]="option.value">
|
||||||
{{ option.label | translate }}
|
{{ option.label | translate }}
|
||||||
@ -105,7 +128,7 @@
|
|||||||
color="accent"
|
color="accent"
|
||||||
onclick="document.getElementById('user-import-file-input').click()"
|
onclick="document.getElementById('user-import-file-input').click()"
|
||||||
>
|
>
|
||||||
<span translate> Select file</span>
|
<span>{{ 'Select file' | translate }}</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -115,34 +138,34 @@
|
|||||||
|
|
||||||
<!-- preview table -->
|
<!-- preview table -->
|
||||||
<mat-card *ngIf="hasFile" class="os-form-card import-table">
|
<mat-card *ngIf="hasFile" class="os-form-card import-table">
|
||||||
<h3 translate>Preview</h3>
|
<h3>{{ 'Preview' | translate }}</h3>
|
||||||
<div class="summary">
|
<div class="summary">
|
||||||
<!-- new entries -->
|
<!-- new entries -->
|
||||||
<div *ngIf="newCount">
|
<div *ngIf="newCount">
|
||||||
|
|
||||||
<mat-icon inline>playlist_add</mat-icon>
|
<mat-icon inline>playlist_add</mat-icon>
|
||||||
<span> {{ newCount }} </span> <span translate>Participant(s) will be imported.</span>
|
<span> {{ newCount }} </span> <span>{{ 'Participant(s) will be imported.' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
<!-- errors/duplicates -->
|
<!-- errors/duplicates -->
|
||||||
<div *ngIf="nonImportableCount" class="red-warning-text">
|
<div *ngIf="nonImportableCount" class="red-warning-text">
|
||||||
|
|
||||||
<mat-icon inline>warning</mat-icon>
|
<mat-icon inline>warning</mat-icon>
|
||||||
<span> {{ nonImportableCount }} </span> <span translate>entries will be ommitted.</span>
|
<span> {{ nonImportableCount }} </span> <span>{{ 'entries will be ommitted.' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
<!-- have been imported -->
|
<!-- have been imported -->
|
||||||
<div *ngIf="doneCount" class="green-text">
|
<div *ngIf="doneCount" class="green-text">
|
||||||
|
|
||||||
<mat-icon inline>done</mat-icon>
|
<mat-icon inline>done</mat-icon>
|
||||||
<span> {{ doneCount }} </span> <span translate>Participants have been imported.</span>
|
<span> {{ doneCount }} </span> <span>{{ 'Participants have been imported.' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div *ngIf="newCount">
|
<div *ngIf="newCount">
|
||||||
<span translate>After verifiy the preview click on 'import' please (see top right).</span>
|
<span>{{ 'After verifiy the preview click on "import" please (see top right).' | translate }}</span>
|
||||||
</div>
|
</div>
|
||||||
<mat-select *ngIf="nonImportableCount" class="filter-imports" [(value)]="shown" (selectionChange)="setFilter()">
|
<mat-select *ngIf="nonImportableCount" class="filter-imports" [(value)]="shown" (selectionChange)="setFilter()">
|
||||||
<mat-option value="all" translate>Show all</mat-option>
|
<mat-option value="all">{{ 'Show all' | translate }}</mat-option>
|
||||||
<mat-option value="error" translate>Show errors only</mat-option>
|
<mat-option value="error">{{ 'Show errors only' | translate }}</mat-option>
|
||||||
<mat-option value="noerror" translate>Show correct entries only</mat-option>
|
<mat-option value="noerror">{{ 'Show correct entries only' | translate }}</mat-option>
|
||||||
</mat-select>
|
</mat-select>
|
||||||
<div class="table-container">
|
<div class="table-container">
|
||||||
<table mat-table [dataSource]="dataSource" matSort>
|
<table mat-table [dataSource]="dataSource" matSort>
|
||||||
@ -180,7 +203,7 @@
|
|||||||
|
|
||||||
<!-- Title column -->
|
<!-- Title column -->
|
||||||
<ng-container matColumnDef="title">
|
<ng-container matColumnDef="title">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Title</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Title' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry">
|
<mat-cell *matCellDef="let entry">
|
||||||
<span *ngIf="nameErrors(entry)">
|
<span *ngIf="nameErrors(entry)">
|
||||||
<mat-icon color="warn" inline matTooltip="{{ nameErrors(entry) | translate }}">
|
<mat-icon color="warn" inline matTooltip="{{ nameErrors(entry) | translate }}">
|
||||||
@ -194,7 +217,7 @@
|
|||||||
|
|
||||||
<!-- title column -->
|
<!-- title column -->
|
||||||
<ng-container matColumnDef="first_name">
|
<ng-container matColumnDef="first_name">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Given name</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Given name' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry">
|
<mat-cell *matCellDef="let entry">
|
||||||
<span *ngIf="nameErrors(entry)">
|
<span *ngIf="nameErrors(entry)">
|
||||||
<mat-icon color="warn" inline matTooltip="{{ nameErrors(entry) | translate }}">
|
<mat-icon color="warn" inline matTooltip="{{ nameErrors(entry) | translate }}">
|
||||||
@ -207,7 +230,7 @@
|
|||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<ng-container matColumnDef="last_name">
|
<ng-container matColumnDef="last_name">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Surname</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Surname' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry">
|
<mat-cell *matCellDef="let entry">
|
||||||
<span *ngIf="nameErrors(entry)">
|
<span *ngIf="nameErrors(entry)">
|
||||||
<mat-icon color="warn" inline matTooltip="{{ nameErrors(entry) | translate }}">
|
<mat-icon color="warn" inline matTooltip="{{ nameErrors(entry) | translate }}">
|
||||||
@ -220,18 +243,18 @@
|
|||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<ng-container matColumnDef="structure_level">
|
<ng-container matColumnDef="structure_level">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Structure level</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Structure level' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry"> {{ entry.newEntry.structure_level }} </mat-cell>
|
<mat-cell *matCellDef="let entry"> {{ entry.newEntry.structure_level }} </mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<ng-container matColumnDef="number">
|
<ng-container matColumnDef="number">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Participant number</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Participant number' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry"> {{ entry.newEntry.number }} </mat-cell>
|
<mat-cell *matCellDef="let entry"> {{ entry.newEntry.number }} </mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<!-- groups column -->
|
<!-- groups column -->
|
||||||
<ng-container matColumnDef="groups_id">
|
<ng-container matColumnDef="groups_id">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Groups</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Groups' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry">
|
<mat-cell *matCellDef="let entry">
|
||||||
<div *ngIf="entry.newEntry.csvGroups.length">
|
<div *ngIf="entry.newEntry.csvGroups.length">
|
||||||
<span *ngIf="hasError(entry, 'Groups')">
|
<span *ngIf="hasError(entry, 'Groups')">
|
||||||
@ -249,42 +272,42 @@
|
|||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<ng-container matColumnDef="comment">
|
<ng-container matColumnDef="comment">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Comment</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Comment' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry"> {{ entry.newEntry.comment }} </mat-cell>
|
<mat-cell *matCellDef="let entry"> {{ entry.newEntry.comment }} </mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
<ng-container matColumnDef="is_active">
|
<ng-container matColumnDef="is_active">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Is active</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Is active' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry">
|
<mat-cell *matCellDef="let entry">
|
||||||
<mat-checkbox disabled [checked]="entry.newEntry.is_active"> </mat-checkbox>
|
<mat-checkbox disabled [checked]="entry.newEntry.is_active"> </mat-checkbox>
|
||||||
</mat-cell>
|
</mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<ng-container matColumnDef="is_present">
|
<ng-container matColumnDef="is_present">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Is present</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Is present' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry">
|
<mat-cell *matCellDef="let entry">
|
||||||
<mat-checkbox disabled [checked]="entry.newEntry.is_present"> </mat-checkbox>
|
<mat-checkbox disabled [checked]="entry.newEntry.is_present"> </mat-checkbox>
|
||||||
</mat-cell>
|
</mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<ng-container matColumnDef="is_committee">
|
<ng-container matColumnDef="is_committee">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Is committee</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Is committee' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry">
|
<mat-cell *matCellDef="let entry">
|
||||||
<mat-checkbox disabled [checked]="entry.newEntry.is_committee"> </mat-checkbox>
|
<mat-checkbox disabled [checked]="entry.newEntry.is_committee"> </mat-checkbox>
|
||||||
</mat-cell>
|
</mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<ng-container matColumnDef="default_password">
|
<ng-container matColumnDef="default_password">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Initial password</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Initial password' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry"> {{ entry.newEntry.default_password }} </mat-cell>
|
<mat-cell *matCellDef="let entry"> {{ entry.newEntry.default_password }} </mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<ng-container matColumnDef="email">
|
<ng-container matColumnDef="email">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Email</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Email' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry"> {{ entry.newEntry.email }} </mat-cell>
|
<mat-cell *matCellDef="let entry"> {{ entry.newEntry.email }} </mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<ng-container matColumnDef="username">
|
<ng-container matColumnDef="username">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Username</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Username' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry"> {{ entry.newEntry.username }} </mat-cell>
|
<mat-cell *matCellDef="let entry"> {{ entry.newEntry.username }} </mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
<ng-container matColumnDef="gender">
|
<ng-container matColumnDef="gender">
|
||||||
<mat-header-cell *matHeaderCellDef translate>Gender</mat-header-cell>
|
<mat-header-cell *matHeaderCellDef>{{ 'Gender' | translate }}</mat-header-cell>
|
||||||
<mat-cell *matCellDef="let entry"> {{ entry.newEntry.gender }} </mat-cell>
|
<mat-cell *matCellDef="let entry"> {{ entry.newEntry.gender }} </mat-cell>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user