Merge pull request #4080 from CatoTH/v3-LineNumbering-Config-Variables
Take motion configuration variables, some layout-fixes
This commit is contained in:
commit
f9c4f01f06
@ -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;
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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]="[]"
|
||||
|
@ -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.
|
||||
*
|
||||
|
@ -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>
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user