Merge pull request #4080 from CatoTH/v3-LineNumbering-Config-Variables

Take motion configuration variables, some layout-fixes
This commit is contained in:
Emanuel Schütze 2019-01-07 09:52:09 +01:00 committed by GitHub
commit f9c4f01f06
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 134 additions and 39 deletions

View File

@ -1,3 +1,11 @@
::ng-deep h3 {
margin-top: 0.3em;
margin-bottom: 0.3em;
font-size: 1em;
}
::ng-deep .mat-dialog-content {
overflow: visible;
}
.wide-form {
textarea {
height: 100px;

View File

@ -103,6 +103,10 @@ export class MotionChangeRecommendationComponent extends BaseViewComponent {
this.changeReco = data.changeRecommendation;
this.lineRange = data.lineRange;
this.tinyMceSettings.height = 50;
this.tinyMceSettings.toolbar = `undo redo | bold italic underline strikethrough
| removeformat | bullist numlist | outdent indent | link charmap code`;
this.createForm();
}

View File

@ -50,7 +50,11 @@
<!-- The actual diff view -->
<div class="motion-text-with-diffs">
<div *ngFor="let change of changes; let i = index">
<div class="motion-text line-numbers-outside">
<div class="motion-text"
[class.line-numbers-none]="isLineNumberingNone()"
[class.line-numbers-inline]="isLineNumberingInline()"
[class.line-numbers-outside]="isLineNumberingOutside()"
>
<os-motion-detail-original-change-recommendations
[html]="getTextBetweenChanges(changes[i - 1], change)"
[changeRecommendations]="[]"
@ -90,14 +94,21 @@
</div>
<div
class="motion-text motion-text-diff line-numbers-outside"
class="motion-text motion-text-diff"
[class.line-numbers-none]="isLineNumberingNone()"
[class.line-numbers-inline]="isLineNumberingInline()"
[class.line-numbers-outside]="isLineNumberingOutside()"
[attr.data-change-id]="change.getChangeId()"
[innerHTML]="getDiff(change)"
></div>
</div>
</div>
<div class="motion-text line-numbers-outside">
<div class="motion-text"
[class.line-numbers-none]="isLineNumberingNone()"
[class.line-numbers-inline]="isLineNumberingInline()"
[class.line-numbers-outside]="isLineNumberingOutside()"
>
<os-motion-detail-original-change-recommendations
[html]="getTextRemainderAfterLastChange()"
[changeRecommendations]="[]"

View File

@ -1,5 +1,5 @@
import { AfterViewInit, Component, ElementRef, EventEmitter, Input, Output } from '@angular/core';
import { ViewMotion } from '../../models/view-motion';
import { LineNumberingMode, ViewMotion } from '../../models/view-motion';
import { ViewUnifiedChange, ViewUnifiedChangeType } from '../../models/view-unified-change';
import { DomSanitizer, SafeHtml, Title } from '@angular/platform-browser';
import { MotionRepositoryService } from '../../services/motion-repository.service';
@ -138,6 +138,33 @@ export class MotionDetailDiffComponent extends BaseViewComponent implements Afte
return change.getChangeType() === ViewUnifiedChangeType.TYPE_CHANGE_RECOMMENDATION;
}
/**
* Returns true if no line numbers are to be shown.
*
* @returns whether there are line numbers at all
*/
public isLineNumberingNone(): boolean {
return this.motion.lnMode === LineNumberingMode.None;
}
/**
* Returns true if the line numbers are to be shown within the text with no line breaks.
*
* @returns whether the line numberings are inside
*/
public isLineNumberingInline(): boolean {
return this.motion.lnMode === LineNumberingMode.Inside;
}
/**
* Returns true if the line numbers are to be shown to the left of the text.
*
* @returns whether the line numberings are outside
*/
public isLineNumberingOutside(): boolean {
return this.motion.lnMode === LineNumberingMode.Outside;
}
/**
* Returns accepted, rejected or an empty string depending on the state of this change.
*

View File

@ -599,13 +599,16 @@
<!-- Line number Menu -->
<mat-menu #lineNumberingMenu="matMenu">
<div *ngIf="motion">
<button mat-menu-item translate (click)="setLineNumberingMode(0)" [ngClass]="{ selected: motion.lnMode === 0 }">
<button mat-menu-item translate (click)="setLineNumberingMode(LineNumberingMode.None)"
[ngClass]="{ selected: motion.lnMode === LineNumberingMode.None }">
none
</button>
<button mat-menu-item translate (click)="setLineNumberingMode(1)" [ngClass]="{ selected: motion.lnMode === 1 }">
<button mat-menu-item translate (click)="setLineNumberingMode(LineNumberingMode.Inside)"
[ngClass]="{ selected: motion.lnMode === LineNumberingMode.Inside }">
inline
</button>
<button mat-menu-item translate (click)="setLineNumberingMode(2)" [ngClass]="{ selected: motion.lnMode === 2 }">
<button mat-menu-item translate (click)="setLineNumberingMode(LineNumberingMode.Outside)"
[ngClass]="{ selected: motion.lnMode === LineNumberingMode.Outside }">
outside
</button>
</div>
@ -613,8 +616,12 @@
<!-- Diff View Menu -->
<mat-menu #changeRecoMenu="matMenu">
<button mat-menu-item translate (click)="setChangeRecoMode(0)">Original version</button>
<button mat-menu-item translate (click)="setChangeRecoMode(1)">Changed version</button>
<button mat-menu-item translate (click)="setChangeRecoMode(2)">Diff version</button>
<button mat-menu-item translate (click)="setChangeRecoMode(3)">Final version</button>
<button mat-menu-item translate (click)="setChangeRecoMode(ChangeRecoMode.Original)"
[ngClass]="{ selected: motion?.crMode === ChangeRecoMode.Original }">Original version</button>
<button mat-menu-item translate (click)="setChangeRecoMode(ChangeRecoMode.Changed)"
[ngClass]="{ selected: motion?.crMode === ChangeRecoMode.Changed }">Changed version</button>
<button mat-menu-item translate (click)="setChangeRecoMode(ChangeRecoMode.Diff)"
[ngClass]="{ selected: motion?.crMode === ChangeRecoMode.Diff }">Diff version</button>
<button mat-menu-item translate (click)="setChangeRecoMode(ChangeRecoMode.Final)"
[ngClass]="{ selected: motion?.crMode === ChangeRecoMode.Final }">Final version</button>
</mat-menu>

View File

@ -229,6 +229,16 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit {
*/
public itemVisibility = itemVisibilityChoices;
/**
* For using the enum constants from the template
*/
public ChangeRecoMode = ChangeRecoMode;
/**
* For using the enum constants from the template
*/
public LineNumberingMode = LineNumberingMode;
/**
* Constuct the detail view.
*
@ -651,7 +661,7 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit {
* Sets the motions change reco mode
* @param mode Needs to fot to the enum defined in ViewMotion
*/
public setChangeRecoMode(mode: number): void {
public setChangeRecoMode(mode: ChangeRecoMode): void {
this.motion.crMode = mode;
}
@ -659,14 +669,14 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit {
* Returns true if the original version (including change recommendation annotation) is to be shown
*/
public isRecoModeOriginal(): boolean {
return this.motion.crMode === ChangeRecoMode.Original;
return this.motion.crMode === ChangeRecoMode.Original || this.allChangingObjects.length === 0;
}
/**
* Returns true if the diff version is to be shown
*/
public isRecoModeDiff(): boolean {
return this.motion.crMode === ChangeRecoMode.Diff;
return this.motion.crMode === ChangeRecoMode.Diff && this.allChangingObjects.length > 0;
}
/**

View File

@ -4,7 +4,7 @@ import { Workflow } from '../../../shared/models/motions/workflow';
import { WorkflowState } from '../../../shared/models/motions/workflow-state';
import { Item } from 'app/shared/models/agenda/item';
import { MotionBlock } from 'app/shared/models/motions/motion-block';
import { ViewMotion } from './view-motion';
import { LineNumberingMode, ViewMotion } from './view-motion';
import { CreateMotion } from './create-motion';
/**
@ -43,7 +43,7 @@ export class ViewCreateMotion extends ViewMotion {
item?: Item,
block?: MotionBlock
) {
super(motion, category, submitters, supporters, workflow, state, item, block);
super(motion, category, submitters, supporters, workflow, state, item, block, null, 80, LineNumberingMode.None);
}
/**

View File

@ -11,17 +11,24 @@ import { Item } from 'app/shared/models/agenda/item';
import { MotionBlock } from 'app/shared/models/motions/motion-block';
import { Mediafile } from 'app/shared/models/mediafiles/mediafile';
/**
* The line numbering mode for the motion detail view.
* The constants need to be in sync with the values saved in the config store.
*/
export enum LineNumberingMode {
None,
Inside,
Outside
None = 'none',
Inside = 'inline',
Outside = 'outside'
}
/**
* The change recommendation mode for the motion detail view.
*/
export enum ChangeRecoMode {
Original,
Changed,
Diff,
Final
Original = 'original',
Changed = 'changed',
Diff = 'diff',
Final = 'agreed'
}
/**
@ -236,6 +243,9 @@ export class ViewMotion extends BaseViewModel {
item?: Item,
block?: MotionBlock,
attachments?: Mediafile[],
lineLength: number = 80,
lineNumberingMode?: LineNumberingMode,
crMode?: ChangeRecoMode
) {
super();
this._motion = motion;
@ -248,15 +258,9 @@ export class ViewMotion extends BaseViewModel {
this._block = block;
this._attachments = attachments;
// TODO: Should be set using a a config variable
/*this._configService.get('motions_default_line_numbering').subscribe(
(mode: string): void => {
this.lnMode = LineNumberingMode.Outside;
}
);*/
this.lnMode = LineNumberingMode.Outside;
this.crMode = ChangeRecoMode.Original;
this.lineLength = 80;
this.lnMode = lineNumberingMode;
this.crMode = crMode;
this.lineLength = lineLength;
this.highlightedLine = null;
}
@ -417,7 +421,10 @@ export class ViewMotion extends BaseViewModel {
this._state,
this._item,
this._block,
this._attachments
this._attachments,
this.lineLength,
this.lnMode,
this.crMode
);
}
}

View File

@ -9,7 +9,7 @@ import { User } from '../../../shared/models/users/user';
import { Category } from '../../../shared/models/motions/category';
import { Workflow } from '../../../shared/models/motions/workflow';
import { WorkflowState } from '../../../shared/models/motions/workflow-state';
import { ChangeRecoMode, ViewMotion } from '../models/view-motion';
import { ChangeRecoMode, LineNumberingMode, ViewMotion } from '../models/view-motion';
import { BaseRepository } from '../../base/base-repository';
import { DataStoreService } from '../../../core/services/data-store.service';
import { LinenumberingService } from './linenumbering.service';
@ -28,6 +28,7 @@ import { ViewMotionAmendedParagraph } from '../models/view-motion-amended-paragr
import { CreateMotion } from '../models/create-motion';
import { MotionBlock } from 'app/shared/models/motions/motion-block';
import { Mediafile } from 'app/shared/models/mediafiles/mediafile';
import { ConfigService } from "../../../core/services/config.service";
/**
* Repository Services for motions (and potentially categories)
@ -43,6 +44,16 @@ import { Mediafile } from 'app/shared/models/mediafiles/mediafile';
providedIn: 'root'
})
export class MotionRepositoryService extends BaseRepository<ViewMotion, Motion> {
// The line length; comes from the config variable motions_line_length
private lineLength = 90;
// The default line numbering mode; comes from the config variable motions_default_line_numbering
private defaultLineNumbering = LineNumberingMode.Outside;
// The default line numbering mode; comes from the config variable motions_recommendation_text_mode
private defaultCrMode = ChangeRecoMode.Original;
/**
* Creates a MotionRepository
*
@ -55,6 +66,7 @@ export class MotionRepositoryService extends BaseRepository<ViewMotion, Motion>
* @param httpService OpenSlides own Http service
* @param lineNumbering Line numbering for motion text
* @param diff Display changes in motion text as diff.
* @param configService The configuration provider
*/
public constructor(
DS: DataStoreService,
@ -63,9 +75,15 @@ export class MotionRepositoryService extends BaseRepository<ViewMotion, Motion>
private httpService: HttpService,
private readonly lineNumbering: LinenumberingService,
private readonly diff: DiffService,
private readonly configService: ConfigService,
private treeService: TreeService
) {
super(DS, mapperService, Motion, [Category, User, Workflow, Item, MotionBlock, Mediafile]);
// load config variables
this.configService.get('motions_line_length').subscribe(lineLength => this.lineLength = lineLength);
this.configService.get('motions_default_line_numbering').subscribe(mode => this.defaultLineNumbering = mode);
this.configService.get('motions_recommendation_text_mode').subscribe(mode => this.defaultCrMode = mode);
}
/**
@ -88,7 +106,7 @@ export class MotionRepositoryService extends BaseRepository<ViewMotion, Motion>
if (workflow) {
state = workflow.getStateById(motion.state_id);
}
return new ViewMotion(motion, category, submitters, supporters, workflow, state, item, block, attachments);
return new ViewMotion(motion, category, submitters, supporters, workflow, state, item, block, attachments, this.lineLength, this.defaultLineNumbering, this.defaultCrMode);
}
/**
@ -315,7 +333,7 @@ export class MotionRepositoryService extends BaseRepository<ViewMotion, Motion>
const appliedChanges: ViewUnifiedChange[] = changes.filter(change => change.isAccepted());
return this.diff.getTextWithChanges(targetMotion, appliedChanges, lineLength, highlightLine);
default:
console.error('unrecognized ChangeRecoMode option');
console.error('unrecognized ChangeRecoMode option (' + crMode + ')');
return null;
}
} else {
@ -342,8 +360,7 @@ export class MotionRepositoryService extends BaseRepository<ViewMotion, Motion>
* @param {boolean} lineNumbers - weather to add line numbers to the returned HTML string
*/
public extractMotionLineRange(id: number, lineRange: LineRange, lineNumbers: boolean): string {
// @TODO flexible line numbers
const origHtml = this.formatMotion(id, ChangeRecoMode.Original, [], 80);
const origHtml = this.formatMotion(id, ChangeRecoMode.Original, [], this.lineLength);
const extracted = this.diff.extractRangeByLineNumbers(origHtml, lineRange.from, lineRange.to);
let html =
extracted.outerContextStart +
@ -370,7 +387,7 @@ export class MotionRepositoryService extends BaseRepository<ViewMotion, Motion>
changes: ViewUnifiedChange[],
highlight?: number
): string {
let maxLine = 0;
let maxLine = 1;
changes.forEach((change: ViewUnifiedChange) => {
if (change.getLineTo() > maxLine) {
maxLine = change.getLineTo();
@ -378,6 +395,10 @@ export class MotionRepositoryService extends BaseRepository<ViewMotion, Motion>
}, 0);
const numberedHtml = this.lineNumbering.insertLineNumbers(motion.text, motion.lineLength);
if (changes.length === 0) {
return numberedHtml;
}
let data;
try {