@acorex/layout 6.5.27 → 6.5.29

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. package/acorex-layout.d.ts +5 -0
  2. package/esm2020/acorex-layout.mjs +5 -0
  3. package/esm2020/lib/widget-board/editors/widget-size-editor/widget-size.editor.mjs +46 -0
  4. package/esm2020/lib/widget-board/editors/widget-size-editor/widget-size.module.mjs +21 -0
  5. package/esm2020/lib/widget-board/widget-board.component.mjs +450 -0
  6. package/esm2020/lib/widget-board/widget-board.module.mjs +111 -0
  7. package/esm2020/lib/widget-board/widget-config.component.mjs +82 -0
  8. package/esm2020/lib/widget-board/widget-host.component.mjs +295 -0
  9. package/esm2020/lib/widget-board/widget-save.component.mjs +79 -0
  10. package/esm2020/lib/widget-board/widget.class.mjs +127 -0
  11. package/esm2020/public-api.mjs +7 -0
  12. package/fesm2015/acorex-layout.mjs +1180 -0
  13. package/fesm2015/acorex-layout.mjs.map +1 -0
  14. package/fesm2020/acorex-layout.mjs +1173 -0
  15. package/fesm2020/acorex-layout.mjs.map +1 -0
  16. package/lib/widget-board/editors/widget-size-editor/widget-size.editor.d.ts +19 -0
  17. package/lib/widget-board/editors/widget-size-editor/widget-size.module.d.ts +10 -0
  18. package/lib/widget-board/widget-board.component.d.ts +61 -0
  19. package/lib/widget-board/widget-board.module.d.ts +18 -0
  20. package/lib/widget-board/widget-config.component.d.ts +23 -0
  21. package/lib/widget-board/widget-host.component.d.ts +52 -0
  22. package/lib/widget-board/widget-save.component.d.ts +19 -0
  23. package/lib/widget-board/widget.class.d.ts +58 -0
  24. package/package.json +30 -10
  25. package/karma.conf.js +0 -32
  26. package/ng-package.json +0 -9
  27. package/src/lib/widget-board/editors/widget-size-editor/widget-size.editor.html +0 -6
  28. package/src/lib/widget-board/editors/widget-size-editor/widget-size.editor.ts +0 -55
  29. package/src/lib/widget-board/editors/widget-size-editor/widget-size.module.ts +0 -19
  30. package/src/lib/widget-board/widget-board.component.html +0 -7
  31. package/src/lib/widget-board/widget-board.component.scss +0 -200
  32. package/src/lib/widget-board/widget-board.component.ts +0 -521
  33. package/src/lib/widget-board/widget-board.module.ts +0 -74
  34. package/src/lib/widget-board/widget-config.component.html +0 -16
  35. package/src/lib/widget-board/widget-config.component.ts +0 -99
  36. package/src/lib/widget-board/widget-host.component.html +0 -30
  37. package/src/lib/widget-board/widget-host.component.ts +0 -350
  38. package/src/lib/widget-board/widget-save.component.html +0 -43
  39. package/src/lib/widget-board/widget-save.component.ts +0 -88
  40. package/src/lib/widget-board/widget.class.ts +0 -179
  41. package/src/test.ts +0 -28
  42. package/tsconfig.lib.json +0 -23
  43. package/tsconfig.lib.prod.json +0 -6
  44. package/tsconfig.spec.json +0 -17
  45. package/tslint.json +0 -17
  46. /package/{src/public-api.ts → public-api.d.ts} +0 -0
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@acorex/layout" />
5
+ export * from './public-api';
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcmV4LWxheW91dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Fjb3JleC9sYXlvdXQvc3JjL2Fjb3JleC1sYXlvdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,46 @@
1
+ import { Component, ChangeDetectorRef } from '@angular/core';
2
+ import { AXProperyEditorComponent } from '@acorex/components';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@acorex/components";
5
+ export class AXWidgetSizePropertyEditorComponent extends AXProperyEditorComponent {
6
+ constructor(cdr) {
7
+ super(cdr);
8
+ this.cdr = cdr;
9
+ this.minX = 1;
10
+ this.maxX = 10;
11
+ this.minY = 1;
12
+ this.maxY = 10;
13
+ }
14
+ ngOnInit() {
15
+ if (Array.isArray(this.value)) {
16
+ this.sizeX = this.value[0];
17
+ this.sizeY = this.value[1];
18
+ }
19
+ else {
20
+ this.sizeX = 2;
21
+ this.sizeY = 2;
22
+ }
23
+ }
24
+ handleMinValueChange(e) {
25
+ this.sizeX = e.value;
26
+ if (this.sizeY > 0) {
27
+ super.handleValueChange([this.sizeX, this.sizeY]);
28
+ }
29
+ }
30
+ handleMaxValueChange(e) {
31
+ this.sizeY = e.value;
32
+ if (this.sizeX > 0) {
33
+ super.handleValueChange([this.sizeX, this.sizeY]);
34
+ }
35
+ }
36
+ ngAfterViewInit() {
37
+ this.onRenderCompleted.emit();
38
+ }
39
+ }
40
+ AXWidgetSizePropertyEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AXWidgetSizePropertyEditorComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
41
+ AXWidgetSizePropertyEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: AXWidgetSizePropertyEditorComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: "<div style=\"display: grid;grid-gap: 2%; grid-template-columns: 49% 49%;\">\r\n <ax-number-box (onValueChanged)=\"handleMinValueChange($event)\" [value]=\"sizeX\" [min]=\"minX\" [max]=\"maxX\">\r\n </ax-number-box>\r\n <ax-number-box (onValueChanged)=\"handleMaxValueChange($event)\" [value]=\"sizeY\" [min]=\"minY\" [max]=\"maxY\">\r\n </ax-number-box>\r\n</div>", components: [{ type: i1.AXNumberBoxComponent, selector: "ax-number-box", inputs: ["min", "max", "showSeparator", "showCurrency", "showCounter", "scrollWeel", "showDoubleCounter", "maxLength", "intStep", "decimalNumber", "customStep"] }] });
42
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AXWidgetSizePropertyEditorComponent, decorators: [{
43
+ type: Component,
44
+ args: [{ template: "<div style=\"display: grid;grid-gap: 2%; grid-template-columns: 49% 49%;\">\r\n <ax-number-box (onValueChanged)=\"handleMinValueChange($event)\" [value]=\"sizeX\" [min]=\"minX\" [max]=\"maxX\">\r\n </ax-number-box>\r\n <ax-number-box (onValueChanged)=\"handleMaxValueChange($event)\" [value]=\"sizeY\" [min]=\"minY\" [max]=\"maxY\">\r\n </ax-number-box>\r\n</div>" }]
45
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; } });
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LXNpemUuZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWNvcmV4L2xheW91dC9zcmMvbGliL3dpZGdldC1ib2FyZC9lZGl0b3JzL3dpZGdldC1zaXplLWVkaXRvci93aWRnZXQtc2l6ZS5lZGl0b3IudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hY29yZXgvbGF5b3V0L3NyYy9saWIvd2lkZ2V0LWJvYXJkL2VkaXRvcnMvd2lkZ2V0LXNpemUtZWRpdG9yL3dpZGdldC1zaXplLmVkaXRvci5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7OztBQUs5RCxNQUFNLE9BQU8sbUNBQW9DLFNBQVEsd0JBQWtDO0lBWXZGLFlBQXNCLEdBQXNCO1FBQ3hDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQURPLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBUDVDLFNBQUksR0FBVyxDQUFDLENBQUM7UUFDakIsU0FBSSxHQUFXLEVBQUUsQ0FBQztRQUVsQixTQUFJLEdBQVcsQ0FBQyxDQUFDO1FBQ2pCLFNBQUksR0FBVyxFQUFFLENBQUM7SUFLbEIsQ0FBQztJQUVELFFBQVE7UUFDSixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDOUI7YUFDSTtZQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7U0FDbEI7SUFDTCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsQ0FBTTtRQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFFckIsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRTtZQUNoQixLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1NBQ3JEO0lBQ0wsQ0FBQztJQUVELG9CQUFvQixDQUFDLENBQU07UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3JCLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUU7WUFDaEIsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUNyRDtJQUNMLENBQUM7SUFJRCxlQUFlO1FBQ1gsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xDLENBQUM7O2lJQTlDUSxtQ0FBbUM7cUhBQW5DLG1DQUFtQywyRUNOaEQseVhBS007NEZEQ08sbUNBQW1DO2tCQUgvQyxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIENoYW5nZURldGVjdG9yUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFYUHJvcGVyeUVkaXRvckNvbXBvbmVudCB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHRlbXBsYXRlVXJsOiAnLi93aWRnZXQtc2l6ZS5lZGl0b3IuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEFYV2lkZ2V0U2l6ZVByb3BlcnR5RWRpdG9yQ29tcG9uZW50IGV4dGVuZHMgQVhQcm9wZXJ5RWRpdG9yQ29tcG9uZW50PG51bWJlcltdPiAge1xyXG5cclxuICAgIHNpemVYOiBudW1iZXI7XHJcbiAgICBzaXplWTogbnVtYmVyO1xyXG5cclxuICAgIG1pblg6IG51bWJlciA9IDE7XHJcbiAgICBtYXhYOiBudW1iZXIgPSAxMDtcclxuXHJcbiAgICBtaW5ZOiBudW1iZXIgPSAxO1xyXG4gICAgbWF4WTogbnVtYmVyID0gMTA7XHJcblxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7XHJcbiAgICAgICAgc3VwZXIoY2RyKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNpemVYID0gdGhpcy52YWx1ZVswXTtcclxuICAgICAgICAgICAgdGhpcy5zaXplWSA9IHRoaXMudmFsdWVbMV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNpemVYID0gMjtcclxuICAgICAgICAgICAgdGhpcy5zaXplWSA9IDI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZU1pblZhbHVlQ2hhbmdlKGU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuc2l6ZVggPSBlLnZhbHVlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zaXplWSA+IDApIHtcclxuICAgICAgICAgICAgc3VwZXIuaGFuZGxlVmFsdWVDaGFuZ2UoW3RoaXMuc2l6ZVgsIHRoaXMuc2l6ZVldKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlTWF4VmFsdWVDaGFuZ2UoZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5zaXplWSA9IGUudmFsdWU7XHJcbiAgICAgICAgaWYgKHRoaXMuc2l6ZVggPiAwKSB7XHJcbiAgICAgICAgICAgIHN1cGVyLmhhbmRsZVZhbHVlQ2hhbmdlKFt0aGlzLnNpemVYLCB0aGlzLnNpemVZXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICAgIHRoaXMub25SZW5kZXJDb21wbGV0ZWQuZW1pdCgpO1xyXG4gICAgfVxyXG5cclxufSIsIjxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkO2dyaWQtZ2FwOiAyJTsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA0OSUgNDklO1wiPlxyXG4gICAgPGF4LW51bWJlci1ib3ggKG9uVmFsdWVDaGFuZ2VkKT1cImhhbmRsZU1pblZhbHVlQ2hhbmdlKCRldmVudClcIiBbdmFsdWVdPVwic2l6ZVhcIiBbbWluXT1cIm1pblhcIiBbbWF4XT1cIm1heFhcIj5cclxuICAgIDwvYXgtbnVtYmVyLWJveD5cclxuICAgIDxheC1udW1iZXItYm94IChvblZhbHVlQ2hhbmdlZCk9XCJoYW5kbGVNYXhWYWx1ZUNoYW5nZSgkZXZlbnQpXCIgW3ZhbHVlXT1cInNpemVZXCIgW21pbl09XCJtaW5ZXCIgW21heF09XCJtYXhZXCI+XHJcbiAgICA8L2F4LW51bWJlci1ib3g+XHJcbjwvZGl2PiJdfQ==
@@ -0,0 +1,21 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { AXWidgetSizePropertyEditorComponent } from './widget-size.editor';
5
+ import { AXNumberBoxModule } from '@acorex/components';
6
+ import * as i0 from "@angular/core";
7
+ export class AXWidgetSizePropertyEditorModule {
8
+ }
9
+ AXWidgetSizePropertyEditorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AXWidgetSizePropertyEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
10
+ AXWidgetSizePropertyEditorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AXWidgetSizePropertyEditorModule, declarations: [AXWidgetSizePropertyEditorComponent], imports: [CommonModule, FormsModule, AXNumberBoxModule], exports: [AXWidgetSizePropertyEditorComponent] });
11
+ AXWidgetSizePropertyEditorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AXWidgetSizePropertyEditorModule, providers: [], imports: [[CommonModule, FormsModule, AXNumberBoxModule]] });
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AXWidgetSizePropertyEditorModule, decorators: [{
13
+ type: NgModule,
14
+ args: [{
15
+ declarations: [AXWidgetSizePropertyEditorComponent],
16
+ imports: [CommonModule, FormsModule, AXNumberBoxModule],
17
+ exports: [AXWidgetSizePropertyEditorComponent],
18
+ providers: []
19
+ }]
20
+ }] });
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LXNpemUubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYWNvcmV4L2xheW91dC9zcmMvbGliL3dpZGdldC1ib2FyZC9lZGl0b3JzL3dpZGdldC1zaXplLWVkaXRvci93aWRnZXQtc2l6ZS5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztBQVd2RCxNQUFNLE9BQU8sZ0NBQWdDOzs4SEFBaEMsZ0NBQWdDOytIQUFoQyxnQ0FBZ0MsaUJBTDFCLG1DQUFtQyxhQUN4QyxZQUFZLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixhQUM1QyxtQ0FBbUM7K0hBR3BDLGdDQUFnQyxhQUY5QixFQUFFLFlBRkosQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixDQUFDOzRGQUk5QyxnQ0FBZ0M7a0JBTjVDLFFBQVE7bUJBQUM7b0JBQ04sWUFBWSxFQUFFLENBQUMsbUNBQW1DLENBQUM7b0JBQ25ELE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsaUJBQWlCLENBQUM7b0JBQ3ZELE9BQU8sRUFBRSxDQUFDLG1DQUFtQyxDQUFDO29CQUM5QyxTQUFTLEVBQUUsRUFBRTtpQkFDaEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbmltcG9ydCB7IEFYV2lkZ2V0U2l6ZVByb3BlcnR5RWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi93aWRnZXQtc2l6ZS5lZGl0b3InO1xyXG5pbXBvcnQgeyBBWE51bWJlckJveE1vZHVsZSB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cyc7XHJcblxyXG5cclxuXHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gICAgZGVjbGFyYXRpb25zOiBbQVhXaWRnZXRTaXplUHJvcGVydHlFZGl0b3JDb21wb25lbnRdLFxyXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIEFYTnVtYmVyQm94TW9kdWxlXSxcclxuICAgIGV4cG9ydHM6IFtBWFdpZGdldFNpemVQcm9wZXJ0eUVkaXRvckNvbXBvbmVudF0sXHJcbiAgICBwcm92aWRlcnM6IFtdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBWFdpZGdldFNpemVQcm9wZXJ0eUVkaXRvck1vZHVsZSB7XHJcbiAgIFxyXG59Il19