Browse Source

dropdown fix.

pull/613/head
Sebastian 5 years ago
parent
commit
ed9d3d16e6
  1. 6
      frontend/app/features/schemas/pages/schema/fields/types/references-validation.component.html
  2. 2
      frontend/app/framework/angular/forms/editors/color-picker.component.ts
  3. 2
      frontend/app/framework/angular/forms/editors/dropdown.component.html
  4. 14
      frontend/app/framework/angular/forms/editors/dropdown.component.ts
  5. 2
      frontend/app/framework/angular/modals/dialog-renderer.component.ts
  6. 2
      frontend/app/framework/angular/modals/modal.directive.ts
  7. 18
      frontend/app/framework/utils/keys.ts
  8. 3
      frontend/app/framework/utils/modal-view.spec.ts
  9. 16
      frontend/app/framework/utils/modal-view.ts

6
frontend/app/features/schemas/pages/schema/fields/types/references-validation.component.html

@ -24,14 +24,14 @@
<label class="col-3 col-form-label">{{ 'schemas.fieldTypes.references.count' | sqxTranslate }}</label> <label class="col-3 col-form-label">{{ 'schemas.fieldTypes.references.count' | sqxTranslate }}</label>
<div class="col-9"> <div class="col-9">
<div class="row"> <div class="row no-gutters">
<div class="col-6"> <div class="col">
<input type="number" class="form-control" formControlName="minItems" placeholder="{{ 'schemas.fieldTypes.references.countMin' | sqxTranslate }}"> <input type="number" class="form-control" formControlName="minItems" placeholder="{{ 'schemas.fieldTypes.references.countMin' | sqxTranslate }}">
</div> </div>
<div class="col-auto"> <div class="col-auto">
<label class="col-form-label minmax">-</label> <label class="col-form-label minmax">-</label>
</div> </div>
<div class="col-6"> <div class="col">
<input type="number" class="form-control" formControlName="maxItems" placeholder="{{ 'schemas.fieldTypes.references.countMax' | sqxTranslate }}"> <input type="number" class="form-control" formControlName="maxItems" placeholder="{{ 'schemas.fieldTypes.references.countMax' | sqxTranslate }}">
</div> </div>
</div> </div>

2
frontend/app/framework/angular/forms/editors/color-picker.component.ts

@ -50,7 +50,7 @@ export class ColorPickerComponent extends StatefulControlComponent<State, string
constructor(changeDetector: ChangeDetectorRef) { constructor(changeDetector: ChangeDetectorRef) {
super(changeDetector, { foreground: 'black' }); super(changeDetector, { foreground: 'black' });
this.modal.isOpen.subscribe(open => { this.modal.isOpenChanges.subscribe(open => {
if (open) { if (open) {
this.wasOpen = true; this.wasOpen = true;
} else { } else {

2
frontend/app/framework/angular/forms/editors/dropdown.component.html

@ -4,7 +4,7 @@
autocorrect="off" autocorrect="off"
autocapitalize="off"> autocapitalize="off">
<div class="control-dropdown-item" *ngIf="selectedItem"> <div class="control-dropdown-item" *ngIf="snapshot.selectedItem; let selectedItem">
<span class="truncate" *ngIf="!templateSelection">{{selectedItem}}</span> <span class="truncate" *ngIf="!templateSelection">{{selectedItem}}</span>
<ng-template *ngIf="templateSelection" [sqxTemplateWrapper]="templateSelection" [item]="selectedItem"></ng-template> <ng-template *ngIf="templateSelection" [sqxTemplateWrapper]="templateSelection" [item]="selectedItem"></ng-template>

14
frontend/app/framework/angular/forms/editors/dropdown.component.ts

@ -25,6 +25,9 @@ interface State {
// The selected suggested index. // The selected suggested index.
selectedIndex: number; selectedIndex: number;
// The selected item.
selectedItem?: number;
// The current search query. // The current search query.
query?: RegExp; query?: RegExp;
} }
@ -66,14 +69,11 @@ export class DropdownComponent extends StatefulControlComponent<State, ReadonlyA
public queryInput = new FormControl(); public queryInput = new FormControl();
public get selectedItem() {
return this.items[this.snapshot.selectedIndex];
}
constructor(changeDetector: ChangeDetectorRef) { constructor(changeDetector: ChangeDetectorRef) {
super(changeDetector, { super(changeDetector, {
selectedIndex: -1, selectedIndex: -1,
suggestedItems: [] selectedItem: undefined,
suggestedItems: [],
}); });
} }
@ -202,7 +202,6 @@ export class DropdownComponent extends StatefulControlComponent<State, ReadonlyA
} }
public selectIndex(selectedIndex: number, fromUserAction: boolean) { public selectIndex(selectedIndex: number, fromUserAction: boolean) {
if (fromUserAction) {
const items = this.snapshot.suggestedItems || []; const items = this.snapshot.suggestedItems || [];
if (selectedIndex < 0) { if (selectedIndex < 0) {
@ -215,6 +214,7 @@ export class DropdownComponent extends StatefulControlComponent<State, ReadonlyA
const selectedItem = items[selectedIndex]; const selectedItem = items[selectedIndex];
if (fromUserAction) {
let selectedValue = selectedItem; let selectedValue = selectedItem;
if (this.valueProperty && this.valueProperty.length > 0 && selectedValue) { if (this.valueProperty && this.valueProperty.length > 0 && selectedValue) {
@ -229,7 +229,7 @@ export class DropdownComponent extends StatefulControlComponent<State, ReadonlyA
} }
} }
this.next({ selectedIndex }); this.next({ selectedIndex, selectedItem });
} }
private getSelectedIndex(value: any) { private getSelectedIndex(value: any) {

2
frontend/app/framework/angular/modals/dialog-renderer.component.ts

@ -40,7 +40,7 @@ export class DialogRendererComponent extends StatefulComponent<State> implements
public ngOnInit() { public ngOnInit() {
this.own( this.own(
this.dialogView.isOpen.subscribe(isOpen => { this.dialogView.isOpenChanges.subscribe(isOpen => {
if (!isOpen) { if (!isOpen) {
this.finishRequest(false); this.finishRequest(false);
} }

2
frontend/app/framework/angular/modals/modal.directive.ts

@ -110,7 +110,7 @@ export class ModalDirective implements OnDestroy {
if (isModel(value)) { if (isModel(value)) {
this.currentModel = value; this.currentModel = value;
this.eventsModel.own(value.isOpen.subscribe(isOpen => this.update(isOpen))); this.eventsModel.own(value.isOpenChanges.subscribe(isOpen => this.update(isOpen)));
} else { } else {
this.update(value === true); this.update(value === true);
} }

18
frontend/app/framework/utils/keys.ts

@ -20,32 +20,32 @@ export module Keys {
} }
export function isDelete(event: KeyboardEvent) { export function isDelete(event: KeyboardEvent) {
const key = event.key || event.keyCode; const key = event.key?.toUpperCase() || event.keyCode;
return key === 'Delete' || key === DELETE; return key === 'DELETE' || key === DELETE;
} }
export function isEnter(event: KeyboardEvent) { export function isEnter(event: KeyboardEvent) {
const key = event.key || event.keyCode; const key = event.key?.toUpperCase() || event.keyCode;
return key === 'ENTER' || key === ENTER; return key === 'ENTER' || key === ENTER;
} }
export function isDown(event: KeyboardEvent) { export function isDown(event: KeyboardEvent) {
const key = event.key || event.keyCode; const key = event.key?.toUpperCase() || event.keyCode;
return key === 'ArrowDown' || key === DOWN; return key === 'ARROWDOWN' || key === DOWN;
} }
export function isUp(event: KeyboardEvent) { export function isUp(event: KeyboardEvent) {
const key = event.key || event.keyCode; const key = event.key?.toUpperCase() || event.keyCode;
return key === 'ArrowUp' || key === UP; return key === 'ARROWUP' || key === UP;
} }
export function isEscape(event: KeyboardEvent) { export function isEscape(event: KeyboardEvent) {
const key = event.key || event.keyCode; const key = event.key?.toUpperCase() || event.keyCode;
return key === 'Escape' || key === 'Esc' || key === UP; return key === 'ESCAPE' || key === 'ESC' || key === UP;
} }
} }

3
frontend/app/framework/utils/modal-view.spec.ts

@ -110,9 +110,10 @@ describe('ModalModel', () => {
function checkValue(modal: Openable, expected: boolean) { function checkValue(modal: Openable, expected: boolean) {
let result: boolean; let result: boolean;
modal.isOpen.subscribe(value => { modal.isOpenChanges.subscribe(value => {
result = value; result = value;
}).unsubscribe(); }).unsubscribe();
expect(result!).toBe(expected); expect(result!).toBe(expected);
expect(modal.isOpen).toBe(expected);
} }

16
frontend/app/framework/utils/modal-view.ts

@ -8,16 +8,22 @@
import { BehaviorSubject, Observable } from 'rxjs'; import { BehaviorSubject, Observable } from 'rxjs';
export interface Openable { export interface Openable {
isOpen: Observable<boolean>; isOpenChanges: Observable<boolean>;
isOpen: boolean;
} }
export class DialogModel implements Openable { export class DialogModel implements Openable {
private readonly isOpen$: BehaviorSubject<boolean>; private readonly isOpen$: BehaviorSubject<boolean>;
public get isOpen(): Observable<boolean> { public get isOpenChanges(): Observable<boolean> {
return this.isOpen$; return this.isOpen$;
} }
public get isOpen(): boolean {
return this.isOpen$.value;
}
constructor(isOpen = false) { constructor(isOpen = false) {
this.isOpen$ = new BehaviorSubject<boolean>(isOpen); this.isOpen$ = new BehaviorSubject<boolean>(isOpen);
} }
@ -44,10 +50,14 @@ export class DialogModel implements Openable {
export class ModalModel implements Openable { export class ModalModel implements Openable {
private readonly isOpen$: BehaviorSubject<boolean>; private readonly isOpen$: BehaviorSubject<boolean>;
public get isOpen(): Observable<boolean> { public get isOpenChanges(): Observable<boolean> {
return this.isOpen$; return this.isOpen$;
} }
public get isOpen(): boolean {
return this.isOpen$.value;
}
constructor(isOpen = false) { constructor(isOpen = false) {
this.isOpen$ = new BehaviorSubject<boolean>(isOpen); this.isOpen$ = new BehaviorSubject<boolean>(isOpen);
} }

Loading…
Cancel
Save