Skip to content

Commit cc41fef

Browse files
Issue view
1 parent 0a508f0 commit cc41fef

File tree

50 files changed

+665
-217
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+665
-217
lines changed
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import {
2+
Directive, ElementRef, AfterViewChecked, Input, HostListener
3+
} from '@angular/core';
4+
5+
@Directive({
6+
selector: '[highliteText]'
7+
})
8+
export class HighliteTextDirective implements AfterViewChecked {
9+
10+
@Input() highliteText: string;
11+
@Input() exampleText: string;
12+
oldExpression: string;
13+
oldExampleText: string;
14+
15+
constructor(private el: ElementRef) {
16+
}
17+
18+
ngAfterViewChecked() {
19+
if (this.highliteText && (this.highliteText !== this.oldExpression || this.exampleText !== this.oldExampleText)) {
20+
this.highlite(this.el.nativeElement);
21+
this.oldExpression = this.highliteText.slice();
22+
this.oldExampleText = this.exampleText.slice();
23+
} else if (!this.highliteText) {
24+
this.showBaseText(this.el.nativeElement);
25+
this.oldExpression = undefined;
26+
this.oldExampleText = this.exampleText.slice();
27+
}
28+
}
29+
30+
highlite(parent: HTMLElement) {
31+
const expression = this.highliteText.slice();
32+
const textBaseElement = parent.getElementsByClassName('text-base')[0];
33+
textBaseElement.setAttribute('style', 'display:none;');
34+
const text = this.exampleText.slice();
35+
const regexp = new RegExp(expression, 'gs');
36+
const newText = text.replace(regexp, (str) => this.getWrappedString(str));
37+
38+
const viewers = parent.getElementsByClassName('regex-viewer');
39+
let viewer: Element;
40+
if (viewers.length < 1) {
41+
viewer = document.createElement('div');
42+
viewer.classList.add('regex-viewer');
43+
parent.appendChild(viewer);
44+
} else {
45+
viewer = viewers[0];
46+
viewer.innerHTML = undefined;
47+
}
48+
49+
if (regexp.test(text)) {
50+
viewer.removeAttribute('style');
51+
} else {
52+
viewer.setAttribute('style', 'background-color: lavenderblush;');
53+
viewer.setAttribute('title', 'No matches!');
54+
}
55+
viewer.innerHTML = newText;
56+
}
57+
58+
showBaseText(parent: HTMLElement) {
59+
const viewers = parent.getElementsByClassName('regex-viewer');
60+
if (viewers.length > 0) {
61+
for (let i = 0; i < viewers.length; i++) {
62+
const viewer = viewers[i];
63+
viewer.remove();
64+
}
65+
}
66+
const textBaseElement = parent.getElementsByClassName('text-base')[0];
67+
textBaseElement.removeAttribute('style');
68+
}
69+
70+
getWrappedString = (str: string) => `<b style="
71+
margin: 0 1px;
72+
background-color: #b0d0e9;
73+
font-weight: normal;">${str}</b>`
74+
}

src/app/elements/lookup/autocomplete/lookupAutocomplete.component.html

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,19 @@
66
'has-error': lookupField.invalid && lookupField.touched,
77
'has-success': lookupField.valid && lookupField.touched
88
}">
9-
<div>
9+
<div class="input-group">
1010
<input [ngClass]="{
1111
'inline-selector': inline,
1212
'lookup-selector-sm': small
1313
}" [disabled]="disabled" autocomplete="off" [required]="!allowEmptyValue" [placeholder]="placeholder"
1414
#lookupField name="lookupField" [maxlength]="maxlength" (focus)="toggleOn()" class="form-control"
1515
(click)="toggleOn()" (keyup.esc)="toggleOff()" (ngModelChange)="onKey($event)" [ngModel]="selectedItemText">
16+
<div *ngIf="addAction && model && model.id !== 0" class="input-group-append">
17+
<label class="input-group-text btn" (click)="onActionClick(model)">
18+
<fa-icon [icon]="faExternalLinkAlt"></fa-icon>
19+
</label>
20+
</div>
21+
1622
</div>
1723
<div [hidden]="hidden" class="selector-suggestions cut-long-text"
1824
*ngIf="filteredArray && filteredArray.length > 20">
@@ -46,8 +52,9 @@
4652
class="selector-button btn-default default-option" (keyup.enter)="select(emptyValueForFilter)"
4753
(mousedown)="select(emptyValueForFilter)">Not Assigned</li>
4854
<li tabindex="0" [title]="textToShow(item)" class="selector-button btn-default wrap-text"
49-
*ngFor="let item of filteredArray" (keyup.enter)="select(item)" (mousedown)="select(item)">
50-
{{textToShow(item)}}
55+
*ngFor="let item of filteredArray" (keyup.enter)="select(item)">
56+
<p (mousedown)="select(item)">{{textToShow(item)}}</p>
57+
<fa-icon *ngIf="addAction" [icon]="faExternalLinkAlt" (click)="onActionClick(item)"></fa-icon>
5158
</li>
5259
</ul>
5360
</div>

src/app/elements/lookup/autocomplete/lookupAutocomplete.component.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Component, Input, Output, EventEmitter, OnChanges, OnInit} from '@angular/core';
22
import { BaseLookupComponent } from '../baseLookup';
33
import { TransformationsService } from '../../../services/transformations.service';
4+
import { faExternalLinkAlt } from '@fortawesome/free-solid-svg-icons';
45

56
@Component({
67
selector: 'lookup-autocomplete',
@@ -14,6 +15,7 @@ export class LookupAutocompleteComponent extends BaseLookupComponent implements
1415
@Input() maxlength = '100';
1516
@Input() allowCreation = false;
1617
@Output() searchText = new EventEmitter();
18+
faExternalLinkAlt = faExternalLinkAlt;
1719

1820
toggleOff() {
1921
this.hidden = true;

src/app/elements/lookup/baseLookup.css

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,4 +100,10 @@ li.default-option {
100100

101101
.caret {
102102
margin: 4px 0px 0px 4px;
103+
}
104+
105+
li > p {
106+
margin: 0;
107+
display: inline-block;
108+
width: calc(100% - 20px);
103109
}

src/app/elements/lookup/baseLookup.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,15 @@ export class BaseLookupComponent implements OnInit, OnChanges, A1qaLookup {
5050
@Input() model: any;
5151
@Input() disabled: boolean;
5252
@Input() sortBy: { property: string, order: string };
53+
@Input() addAction = false;
5354
@Output() modelChange = new EventEmitter();
55+
@Output() actionClick = new EventEmitter<any>();
5456
selectedItemText: string;
5557
emptyValue = undefined;
56-
emptyValueForFilter = { findEmpty: true };
58+
emptyValueForFilter = {
59+
id: 0,
60+
findEmpty: true
61+
};
5762
icons = {
5863
faCaretDown
5964
};
@@ -81,6 +86,10 @@ export class BaseLookupComponent implements OnInit, OnChanges, A1qaLookup {
8186
this.toggleOff();
8287
}
8388

89+
onActionClick(item: any) {
90+
this.actionClick.emit(item);
91+
}
92+
8493
select(item: any) {
8594
this.model = item;
8695
this.selectedItemText = this.textToShow(item);
@@ -120,7 +129,7 @@ export class BaseLookupComponent implements OnInit, OnChanges, A1qaLookup {
120129
}
121130
itemValue = itemValue[prop];
122131
});
123-
if (typeof itemValue === 'number' && itemValue.toString().length < 14 && itemValue.toString().length > 9 ) {
132+
if (typeof itemValue === 'number' && itemValue.toString().length < 14 && itemValue.toString().length > 9) {
124133
itemValue = this.datepipe.transform(new Date(itemValue), 'yyyy-MM-dd hh:mm:ss a');
125134
}
126135
textToShow = `${textToShow} ${itemValue}`;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.regexp-tester > div{
2+
white-space: pre-line;
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<div class="regexp-tester" [highliteText]="expression" [exampleText]="text">
2+
<div class="text-base">{{text}}</div>
3+
</div>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { Component, OnInit, Input } from '@angular/core';
2+
3+
@Component({
4+
selector: 'regexp-tester',
5+
templateUrl: './regexp-tester.component.html',
6+
styleUrls: ['./regexp-tester.component.css']
7+
})
8+
export class RegexpTesterComponent implements OnInit {
9+
10+
@Input() expression: string;
11+
@Input() text: string;
12+
13+
constructor() { }
14+
15+
ngOnInit() {
16+
}
17+
18+
}

src/app/elements/table/filter.helper.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ export class FilterHelper {
143143
? selectedOpts.some(y => propertyValue.find(z => z.id === +y))
144144
: selectedOpts.every(y => propertyValue.id === +y);
145145
}
146-
return selectedOpts.some(y => y === 'null');
146+
return selectedOpts.some(y => +y === 0);
147147
});
148148

149149
return data;

src/app/elements/table/table.filter.component.html

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,11 @@
8282

8383
<lookup-colored *ngIf="col.type === 'lookup-colored' && col.filter" [cutLongText]="true"
8484
[small]="true" [colorProperty]="'color'"
85-
[propertiesToShow]="[getLookupProperty(col.property, col.lookup.values)]"
85+
[propertiesToShow]="col.lookup.propToShow"
8686
[array]="col.lookup.values"
8787
[placeholder]="col.lookup.placeholder ? col.lookup.placeholder : 'None'"
8888
[allowEmptyValue]="true" [model]="getLookupFilterValue(col)[0]"
89-
(modelChange)="handleLookupFilterChange(col.lookup.objectWithId ? col.lookup.objectWithId : col.lookup.entity, [$event])">
89+
(modelChange)="handleLookupFilterChange(col.lookup.objectWithId ? col.lookup.objectWithId : col.property, [$event])">
9090
</lookup-colored>
9191

9292
<tristate-checkbox *ngIf="col.type === 'checkbox' && col.filter"
@@ -98,8 +98,8 @@
9898
[array]="col.lookup.filterValues ? col.lookup.filterValues : col.lookup.values"
9999
[placeholder]="col.lookup.placeholder ? col.lookup.placeholder : 'None'"
100100
[allowEmptyValue]="true" [model]="getLookupFilterValue(col)[0]"
101-
[emptyForFilter]="col.nullFilter"
102-
(modelChange)="handleLookupFilterChange(col.lookup.objectWithId ? col.lookup.objectWithId : col.lookup.entity, [$event])">
101+
[emptyForFilter]="col.nullFilter" [addAction]="col.lookup.addAction"
102+
(modelChange)="handleLookupFilterChange(col.lookup.objectWithId ? col.lookup.objectWithId : col.property, [$event])">
103103
</lookup-autocomplete>
104104

105105
<div *ngIf="(col.type === 'percent' || col.type === 'number') && col.filter"
@@ -171,12 +171,12 @@
171171
*ngIf="col.creation && col.type === 'lookup-autocomplete'" [small]="true"
172172
[placeholder]="col?.name" [allowEmptyValue]="!col.creation.required"
173173
[propertiesToShow]="col.lookup.propToShow" [array]="col.lookup.values"
174-
[model]="getFilterLookupModel(col.property)"
174+
[model]="getFilterLookupModel(col.property)" [addAction]="col.lookup.addAction"
175175
(modelChange)="setNewValueFromLookup(col.property, $event)"></lookup-autocomplete>
176176

177177
<lookup-colored *ngIf="col.creation && col.type === 'lookup-colored'" [cutLongText]="true"
178178
[small]="true" placeholder="col?.name" [allowEmptyValue]="!col.creation.required"
179-
[propertiesToShow]="[getLookupProperty(col.property, col.lookup.values)]"
179+
[propertiesToShow]="col.lookup.propToShow"
180180
[array]="col.lookup.values" [model]="getFilterLookupModel(col.property)"
181181
(modelChange)="setNewValueFromLookup(col.property, $event)" [colorProperty]="'color'">
182182
</lookup-colored>
@@ -221,18 +221,18 @@
221221
<lookup-autocomplete *ngIf="col.type === 'lookup-autocomplete'" [cutLongText]="true"
222222
[small]="true" [allowEmptyValue]="col.lookup.allowEmpty"
223223
[propertiesToShow]="col.lookup.propToShow" [array]="col.lookup.values"
224-
[model]="transformationsService.getPropertyValue(bulkChangeEntity, col.lookup.entity)"
225-
placeholder="Not Assigned"
226-
(modelChange)="setPropertyValue(bulkChangeEntity, col.lookup.entity, $event, false, false)">
224+
[model]="transformationsService.getPropertyValue(bulkChangeEntity, col.property)"
225+
placeholder="Not Assigned" [addAction]="col.lookup.addAction"
226+
(modelChange)="setPropertyValue(bulkChangeEntity, col.property, $event, false, false)">
227227
</lookup-autocomplete>
228228

229229
<lookup-colored *ngIf="col.type === 'lookup-colored'" [cutLongText]="true" [small]="true"
230230
[colorProperty]="'color'"
231-
[propertiesToShow]="[getLookupProperty(col.property, col.lookup.values)]"
231+
[propertiesToShow]="col.lookup.propToShow"
232232
[array]="col.lookup.values" placeholder="Not Assigned"
233233
[allowEmptyValue]="col.lookup.allowEmpty"
234-
[model]="transformationsService.getPropertyValue(bulkChangeEntity, col.lookup.entity)"
235-
(modelChange)="setPropertyValue(bulkChangeEntity, col.lookup.entity, $event, false, false)">
234+
[model]="transformationsService.getPropertyValue(bulkChangeEntity, col.property)"
235+
(modelChange)="setPropertyValue(bulkChangeEntity, col.property, $event, false, false)">
236236
</lookup-colored>
237237

238238
<input *ngIf="col.type === 'checkbox'" [name]="col.property" type="checkbox" trim="blur"
@@ -243,7 +243,7 @@
243243
*ngIf="col.type === 'multiselect'" placeholder="{{col?.name}}"
244244
[propertiesToShow]="col.lookup.propToShow" [array]="col.lookup.values"
245245
[model]="transformationsService.getPropertyValue(bulkChangeEntity, col.property)"
246-
(modelChange)="setPropertyValue(bulkChangeEntity, col.lookup.entity, $event, false, false)">
246+
(modelChange)="setPropertyValue(bulkChangeEntity, col.property, $event, false, false)">
247247
</lookup-autocomplete-multiselect>
248248

249249
<input *ngIf="col.type === 'time'" class="form-control input-sm ft-duration-input"
@@ -288,21 +288,22 @@
288288
[small]="true" [allowEmptyValue]="col.lookup.allowEmpty"
289289
[allowCreation]="col.lookup.allowCreation"
290290
[propertiesToShow]="col.lookup.propToShow" [array]="col.lookup.values"
291-
[model]="transformationsService.getPropertyValue(entity, col.lookup.entity)"
291+
[model]="transformationsService.getPropertyValue(entity, col.property)"
292292
[disabled]="!col.editable || entity.constantRow || notEditableByProperty(entity, col)"
293-
placeholder="Not Assigned"
294-
(modelChange)="setPropertyValue(entity, col.lookup.entity, $event)"
293+
placeholder="Not Assigned" [addAction]="col.lookup.addAction"
294+
(modelChange)="setPropertyValue(entity, col.property, $event)"
295+
(actionClick)="handleLookupAction($event, col, entity)"
295296
(searchText)="handleLookupCreation($event, col, entity)">
296297
</lookup-autocomplete>
297298

298299
<lookup-colored *ngIf="col.type === 'lookup-colored'" [cutLongText]="true" [small]="true"
299300
[colorProperty]="'color'"
300-
[propertiesToShow]="[getLookupProperty(col.property, col.lookup.values)]"
301+
[propertiesToShow]="col.lookup.propToShow"
301302
[array]="col.lookup.values"
302303
[disabled]="!col.editable || entity.constantRow || notEditableByProperty(entity, col)"
303304
placeholder="Not Assigned" [allowEmptyValue]="col.lookup.allowEmpty"
304-
[model]="transformationsService.getPropertyValue(entity, col.lookup.entity)"
305-
(modelChange)="setPropertyValue(entity, col.lookup.entity, $event)"></lookup-colored>
305+
[model]="transformationsService.getPropertyValue(entity, col.property)"
306+
(modelChange)="setPropertyValue(entity, col.property, $event)"></lookup-colored>
306307

307308
<large-text-container *ngIf="col.type === 'long-text'"
308309
[text]="transformationsService.getPropertyValue(entity, col.property)">Loading...
@@ -339,7 +340,7 @@
339340
placeholder="{{col?.name}}" [propertiesToShow]="col.lookup.propToShow"
340341
[array]="col.lookup.values"
341342
[model]="transformationsService.getPropertyValue(entity, col.property)"
342-
(modelChange)="setPropertyValue(entity, col.lookup.entity, $event)">
343+
(modelChange)="setPropertyValue(entity, col.property, $event)">
343344
</lookup-autocomplete-multiselect>
344345

345346
<div *ngIf="col.type === 'date' && col.format && (!col.editable || entity.constantRow || notEditableByProperty(entity, col))" class="nowrap">

0 commit comments

Comments
 (0)