@codetectonics/mantle 0.0.7 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/bundles/codetectonics-mantle.umd.js +7870 -6899
  2. package/bundles/codetectonics-mantle.umd.js.map +1 -1
  3. package/esm2015/lib/components/dashboard/containers/plain-dashboard-container/plain-dashboard-container.component.js +1 -1
  4. package/esm2015/lib/components/dashboard/dashboard-card/dashboard-card.component.js +3 -2
  5. package/esm2015/lib/components/dashboard/widgets/dashboard-info-card/dashboard-info-card.component.js +1 -1
  6. package/esm2015/lib/components/dashboard/widgets/dashboard-table/dashboard-table.component.js +6 -2
  7. package/esm2015/lib/components/dashboard/widgets/dynamic-chart/dynamic-chart.component.js +9 -2
  8. package/esm2015/lib/components/dashboard/widgets/dynamic-widget-display/dynamic-widget-display.component.js +2 -2
  9. package/esm2015/lib/components/details/dialog-details/dialog-details.component.js +11 -4
  10. package/esm2015/lib/components/details/dialog-nested-details/dialog-nested-details.component.js +3 -2
  11. package/esm2015/lib/components/details/fields/dynamic-attribute-display/dynamic-attribute-display.component.js +5 -4
  12. package/esm2015/lib/components/details/fields/icon-attribute-display/icon-attribute-display.component.js +22 -0
  13. package/esm2015/lib/components/details/sections/dynamic-details-section/dynamic-details-section.component.js +7 -3
  14. package/esm2015/lib/components/details/sections/grid-details-section/grid-details-section.component.js +17 -5
  15. package/esm2015/lib/components/details/sections/roster-shift-list-details-section/roster-shift-list-details-section.component.js +21 -0
  16. package/esm2015/lib/components/details/sections/table-details-section/table-details-section.component.js +7 -2
  17. package/esm2015/lib/components/form/dialog-form/dialog-form.component.js +18 -5
  18. package/esm2015/lib/components/form/dialog-nested-form/dialog-nested-form.component.js +13 -3
  19. package/esm2015/lib/components/form/dynamic-form/dynamic-form.component.js +6 -2
  20. package/esm2015/lib/components/form/fields/autocomplete-input/autocomplete-input.component.js +3 -2
  21. package/esm2015/lib/components/form/fields/chip-input/chip-input.component.js +3 -2
  22. package/esm2015/lib/components/form/fields/datepicker/datepicker.component.js +3 -2
  23. package/esm2015/lib/components/form/fields/datetimepicker/datetimepicker.component.js +3 -2
  24. package/esm2015/lib/components/form/fields/dropdown/dropdown.component.js +3 -2
  25. package/esm2015/lib/components/form/fields/dynamic-form-field/dynamic-form-field.component.js +15 -11
  26. package/esm2015/lib/components/form/fields/filepicker/filepicker.component.js +3 -2
  27. package/esm2015/lib/components/form/fields/image-cropper/image-cropper.component.js +3 -2
  28. package/esm2015/lib/components/form/fields/imagepicker/imagepicker.component.js +3 -2
  29. package/esm2015/lib/components/form/fields/markdown-input/markdown-input.component.js +3 -2
  30. package/esm2015/lib/components/form/fields/number-input/number-input.component.js +3 -2
  31. package/esm2015/lib/components/form/fields/password-input/password-input.component.js +3 -2
  32. package/esm2015/lib/components/form/fields/text-input/text-input.component.js +3 -2
  33. package/esm2015/lib/components/form/fields/textarea/textarea.component.js +3 -2
  34. package/esm2015/lib/components/form/fields/time-input/time-input.component.js +80 -0
  35. package/esm2015/lib/components/form/sections/dynamic-form-section/dynamic-form-section.component.js +15 -7
  36. package/esm2015/lib/components/form/sections/grid-form-section/grid-form-section.component.js +11 -2
  37. package/esm2015/lib/components/form/sections/roster-shift-list-form-section/roster-shift-list-form-section.component.js +69 -0
  38. package/esm2015/lib/components/form/sections/table-form-section/table-form-section.component.js +13 -3
  39. package/esm2015/lib/components/navigation/nav-tree/nav-tree.component.js +5 -4
  40. package/esm2015/lib/components/navigation/paginator/custom-paginator-intl.js +33 -0
  41. package/esm2015/lib/components/pages/dashboard-page/dashboard-page.component.js +4 -3
  42. package/esm2015/lib/components/pages/detail-page/detail-page.component.js +25 -19
  43. package/esm2015/lib/components/pages/documents-page/documents-page.component.js +4 -3
  44. package/esm2015/lib/components/pages/export-page/export-page.component.js +4 -3
  45. package/esm2015/lib/components/pages/form-page/form-page.component.js +7 -6
  46. package/esm2015/lib/components/pages/layout-editor-page/layout-editor-page.component.js +12 -8
  47. package/esm2015/lib/components/pages/list-page/list-page-datasource.js +2 -2
  48. package/esm2015/lib/components/pages/list-page/list-page.component.js +22 -11
  49. package/esm2015/lib/components/pages/roster-page/roster-gantt.data.js +50 -0
  50. package/esm2015/lib/components/pages/roster-page/roster-page.component.js +134 -0
  51. package/esm2015/lib/components/pages/tabbed-page/tabbed-page.component.js +3 -2
  52. package/esm2015/lib/components/titles/page-title/page-title.component.js +11 -9
  53. package/esm2015/lib/components/titles/section-title/section-title.component.js +3 -2
  54. package/esm2015/lib/components/widgets/delete-confirmation-dialog/delete-confirmation-dialog.component.js +3 -2
  55. package/esm2015/lib/components/widgets/draggable-table/draggable-table-datasource.js +31 -0
  56. package/esm2015/lib/components/widgets/draggable-table/draggable-table.component.js +79 -0
  57. package/esm2015/lib/components/widgets/dynamic-table/dynamic-table.component.js +4 -5
  58. package/esm2015/lib/components/widgets/file-preview-dialog/file-preview-dialog.component.js +3 -2
  59. package/esm2015/lib/components/widgets/qr-code-dialog/qr-code-dialog.component.js +37 -0
  60. package/esm2015/lib/components/widgets/save-confirmation-dialog/save-confirmation-dialog.component.js +4 -3
  61. package/esm2015/lib/components/widgets/search-panel/search-panel.component.js +3 -2
  62. package/esm2015/lib/components/widgets/snackbar/snackbar.component.js +3 -2
  63. package/esm2015/lib/data-structures/dynamic-layout.structure.js +1 -1
  64. package/esm2015/lib/guards/feature.guard.js +2 -2
  65. package/esm2015/lib/language-packs/en.data.js +62 -0
  66. package/esm2015/lib/language-packs/ms.data.js +62 -0
  67. package/esm2015/lib/mantle.module.js +49 -4
  68. package/esm2015/lib/material.module.js +12 -2
  69. package/esm2015/lib/services/confirmation.service.js +2 -2
  70. package/esm2015/lib/services/current-user.service.js +55 -21
  71. package/esm2015/lib/services/data-broadcast.service.js +18 -0
  72. package/esm2015/lib/services/dynamic-form.service.js +2 -1
  73. package/esm2015/lib/services/feature-config.service.js +34 -12
  74. package/esm2015/lib/services/interfaces/detail-page.service.js +1 -1
  75. package/esm2015/lib/services/interfaces/form-page.service.js +1 -1
  76. package/esm2015/lib/services/interfaces/list-page.service.js +1 -1
  77. package/esm2015/lib/services/interfaces/roster-page.service.js +2 -0
  78. package/esm2015/lib/services/interfaces/roster-schedule.service.js +2 -0
  79. package/esm2015/lib/services/locale.service.js +75 -0
  80. package/esm2015/lib/services/object.service.js +9 -1
  81. package/esm2015/lib/services/password-check.service.js +10 -8
  82. package/esm2015/public-api.js +15 -1
  83. package/fesm2015/codetectonics-mantle.js +1158 -255
  84. package/fesm2015/codetectonics-mantle.js.map +1 -1
  85. package/lib/components/dashboard/widgets/dashboard-table/dashboard-table.component.d.ts +2 -1
  86. package/lib/components/details/dialog-details/dialog-details.component.d.ts +1 -0
  87. package/lib/components/details/fields/icon-attribute-display/icon-attribute-display.component.d.ts +6 -0
  88. package/lib/components/details/sections/dynamic-details-section/dynamic-details-section.component.d.ts +2 -1
  89. package/lib/components/details/sections/roster-shift-list-details-section/roster-shift-list-details-section.component.d.ts +9 -0
  90. package/lib/components/details/sections/table-details-section/table-details-section.component.d.ts +3 -1
  91. package/lib/components/form/dialog-form/dialog-form.component.d.ts +5 -1
  92. package/lib/components/form/dialog-nested-form/dialog-nested-form.component.d.ts +3 -0
  93. package/lib/components/form/fields/time-input/time-input.component.d.ts +22 -0
  94. package/lib/components/form/sections/dynamic-form-section/dynamic-form-section.component.d.ts +4 -1
  95. package/lib/components/form/sections/roster-shift-list-form-section/roster-shift-list-form-section.component.d.ts +23 -0
  96. package/lib/components/form/sections/table-form-section/table-form-section.component.d.ts +3 -1
  97. package/lib/components/navigation/nav-tree/nav-tree.component.d.ts +2 -2
  98. package/lib/components/navigation/paginator/custom-paginator-intl.d.ts +12 -0
  99. package/lib/components/pages/detail-page/detail-page.component.d.ts +4 -3
  100. package/lib/components/pages/layout-editor-page/layout-editor-page.component.d.ts +2 -1
  101. package/lib/components/pages/list-page/list-page.component.d.ts +4 -1
  102. package/lib/components/pages/roster-page/roster-gantt.data.d.ts +1 -0
  103. package/lib/components/pages/roster-page/roster-page.component.d.ts +40 -0
  104. package/lib/components/titles/page-title/page-title.component.d.ts +3 -1
  105. package/lib/components/widgets/delete-confirmation-dialog/delete-confirmation-dialog.component.d.ts +1 -1
  106. package/lib/components/widgets/draggable-table/draggable-table-datasource.d.ts +23 -0
  107. package/lib/components/widgets/draggable-table/draggable-table.component.d.ts +24 -0
  108. package/lib/components/widgets/qr-code-dialog/qr-code-dialog.component.d.ts +18 -0
  109. package/lib/components/widgets/save-confirmation-dialog/save-confirmation-dialog.component.d.ts +0 -2
  110. package/lib/data-structures/dynamic-layout.structure.d.ts +13 -0
  111. package/lib/language-packs/en.data.d.ts +61 -0
  112. package/lib/language-packs/ms.data.d.ts +61 -0
  113. package/lib/mantle.module.d.ts +104 -94
  114. package/lib/material.module.d.ts +12 -11
  115. package/lib/services/current-user.service.d.ts +14 -7
  116. package/lib/services/data-broadcast.service.d.ts +8 -0
  117. package/lib/services/dynamic-form.service.d.ts +2 -0
  118. package/lib/services/feature-config.service.d.ts +15 -3
  119. package/lib/services/interfaces/detail-page.service.d.ts +4 -2
  120. package/lib/services/interfaces/form-page.service.d.ts +11 -3
  121. package/lib/services/interfaces/list-page.service.d.ts +14 -1
  122. package/lib/services/interfaces/roster-page.service.d.ts +20 -0
  123. package/lib/services/interfaces/roster-schedule.service.d.ts +22 -0
  124. package/lib/services/locale.service.d.ts +21 -0
  125. package/lib/services/object.service.d.ts +2 -0
  126. package/lib/services/password-check.service.d.ts +3 -1
  127. package/package.json +3 -1
  128. package/public-api.d.ts +14 -0
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { NgModule, Pipe, InjectionToken, Injectable, Inject, Directive, HostListener, EventEmitter, HostBinding, Output, Component, Input, ViewChild, forwardRef } from '@angular/core';
2
+ import { Injectable, NgModule, Pipe, InjectionToken, Inject, Directive, HostListener, EventEmitter, HostBinding, Output, Component, Input, ViewChild, forwardRef } from '@angular/core';
3
3
  import * as i4 from '@angular/common';
4
4
  import { CommonModule, DatePipe } from '@angular/common';
5
5
  import * as i1 from '@angular/common/http';
@@ -9,27 +9,33 @@ import { NavigationStart, RouterModule } from '@angular/router';
9
9
  import * as i1$2 from '@angular/cdk/layout';
10
10
  import { Breakpoints, LayoutModule } from '@angular/cdk/layout';
11
11
  import { FlexLayoutModule } from '@angular/flex-layout';
12
+ import * as i6$1 from '@angular/cdk/drag-drop';
13
+ import { moveItemInArray, DragDropModule } from '@angular/cdk/drag-drop';
12
14
  import { BrowserModule } from '@angular/platform-browser';
13
15
  import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
14
- import * as i5$2 from '@angular/forms';
16
+ import * as i3$3 from '@angular/forms';
15
17
  import { FormControl, FormGroup, NG_VALUE_ACCESSOR, NG_VALIDATORS, FormsModule, ReactiveFormsModule } from '@angular/forms';
16
18
  import * as i4$3 from 'ngx-image-cropper';
17
19
  import { base64ToFile, ImageCropperModule } from 'ngx-image-cropper';
18
- import * as i2$5 from 'highcharts-angular';
20
+ import * as i2$6 from 'highcharts-angular';
19
21
  import { HighchartsChartModule } from 'highcharts-angular';
20
22
  import * as i1$5 from 'ngx-markdown';
21
23
  import { MarkdownModule } from 'ngx-markdown';
24
+ import * as i5$1 from 'ng-qrcode';
25
+ import { QrCodeModule } from 'ng-qrcode';
26
+ import * as i5 from '@ngx-translate/core';
27
+ import { TranslateModule } from '@ngx-translate/core';
22
28
  import * as i8 from '@angular/material/badge';
23
29
  import { MatBadgeModule } from '@angular/material/badge';
24
- import * as i5 from '@angular/material/button';
30
+ import * as i3$1 from '@angular/material/button';
25
31
  import { MatButtonModule } from '@angular/material/button';
26
32
  import * as i3$6 from '@angular/material/card';
27
33
  import { MatCardModule } from '@angular/material/card';
28
- import * as i10 from '@angular/material/checkbox';
34
+ import * as i11 from '@angular/material/checkbox';
29
35
  import { MatCheckboxModule } from '@angular/material/checkbox';
30
36
  import * as i2 from '@angular/material/chips';
31
37
  import { MatChipsModule, MAT_CHIPS_DEFAULT_OPTIONS } from '@angular/material/chips';
32
- import * as i2$3 from '@angular/material/datepicker';
38
+ import * as i2$4 from '@angular/material/datepicker';
33
39
  import { MatDatepickerModule } from '@angular/material/datepicker';
34
40
  import * as i1$3 from '@angular/material/dialog';
35
41
  import { MatDialogModule, MAT_DIALOG_DATA, MatDialogConfig } from '@angular/material/dialog';
@@ -37,27 +43,29 @@ import * as i1$7 from '@angular/material/expansion';
37
43
  import { MatExpansionModule } from '@angular/material/expansion';
38
44
  import * as i3$2 from '@angular/material/grid-list';
39
45
  import { MatGridListModule } from '@angular/material/grid-list';
40
- import * as i3$1 from '@angular/material/icon';
46
+ import * as i4$1 from '@angular/material/icon';
41
47
  import { MatIconModule } from '@angular/material/icon';
42
- import * as i4$2 from '@angular/material/input';
48
+ import * as i2$2 from '@angular/material/input';
43
49
  import { MatInputModule } from '@angular/material/input';
44
50
  import { MatListModule } from '@angular/material/list';
45
- import * as i6$1 from '@angular/material/menu';
51
+ import * as i4$4 from '@angular/material/menu';
46
52
  import { MatMenuModule, MatMenuTrigger } from '@angular/material/menu';
47
- import * as i2$2 from '@angular/material/select';
53
+ import * as i2$3 from '@angular/material/select';
48
54
  import { MatSelectModule } from '@angular/material/select';
49
- import * as i7 from '@angular/material/sidenav';
55
+ import * as i7$1 from '@angular/material/sidenav';
50
56
  import { MatSidenavModule } from '@angular/material/sidenav';
51
- import * as i2$7 from '@angular/material/tabs';
57
+ import * as i2$8 from '@angular/material/tabs';
52
58
  import { MatTabsModule } from '@angular/material/tabs';
53
59
  import { MatToolbarModule } from '@angular/material/toolbar';
60
+ import * as i7 from '@angular/material/tooltip';
61
+ import { MatTooltipModule } from '@angular/material/tooltip';
54
62
  import * as i6 from '@angular/material/progress-spinner';
55
63
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
56
64
  import * as i2$1 from '@angular/material/table';
57
65
  import { MatTableModule, MatTable } from '@angular/material/table';
58
- import * as i5$1 from '@angular/material/paginator';
59
- import { MatPaginatorModule, MatPaginator } from '@angular/material/paginator';
60
- import * as i3$3 from '@angular/material/sort';
66
+ import * as i14 from '@angular/material/paginator';
67
+ import { MatPaginatorIntl, MatPaginatorModule, MatPaginator } from '@angular/material/paginator';
68
+ import * as i12 from '@angular/material/sort';
61
69
  import { MatSortModule, MatSort } from '@angular/material/sort';
62
70
  import { MatMomentDateModule, MomentDateAdapter, MAT_MOMENT_DATE_ADAPTER_OPTIONS } from '@angular/material-moment-adapter';
63
71
  import * as i1$8 from '@angular/material/snack-bar';
@@ -70,23 +78,211 @@ import { NgxMatMomentModule } from '@angular-material-components/moment-adapter'
70
78
  import * as i1$9 from '@angular/material/tree';
71
79
  import { MatTreeModule, MatTreeFlattener, MatTreeFlatDataSource } from '@angular/material/tree';
72
80
  import { ENTER, COMMA } from '@angular/cdk/keycodes';
73
- import * as i2$4 from '@angular/material/autocomplete';
81
+ import * as i2$5 from '@angular/material/autocomplete';
74
82
  import { MatAutocompleteModule } from '@angular/material/autocomplete';
83
+ import { BehaviorSubject, Observable, Subject, merge, of } from 'rxjs';
75
84
  import * as moment from 'moment';
76
- import { Observable, BehaviorSubject, Subject, merge, of } from 'rxjs';
77
85
  import { DirectUpload } from '@rails/activestorage';
78
86
  import { map, takeUntil, startWith, switchMap, filter, retryWhen, delay, tap, finalize } from 'rxjs/operators';
79
87
  import * as i1$1 from 'angular-token';
80
88
  import * as i3 from '@angular/flex-layout/extended';
81
- import * as i4$1 from '@angular/flex-layout/flex';
89
+ import * as i4$2 from '@angular/flex-layout/flex';
82
90
  import { DataSource } from '@angular/cdk/collections';
83
91
  import * as i1$6 from '@angular/material/form-field';
84
92
  import * as Highcharts from 'highcharts';
85
- import * as i2$6 from '@angular/material/divider';
93
+ import * as i2$7 from '@angular/material/divider';
86
94
  import { trigger, state, style, AUTO_STYLE, transition, sequence, animate } from '@angular/animations';
87
95
  import { FlatTreeControl } from '@angular/cdk/tree';
88
96
  import * as ActionCable from '@rails/actioncable';
89
97
 
98
+ class DataBroadcastService {
99
+ constructor() {
100
+ this.sessionData = new BehaviorSubject({});
101
+ this.locale = new BehaviorSubject({});
102
+ }
103
+ }
104
+ DataBroadcastService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DataBroadcastService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
105
+ DataBroadcastService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DataBroadcastService, providedIn: 'root' });
106
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DataBroadcastService, decorators: [{
107
+ type: Injectable,
108
+ args: [{
109
+ providedIn: 'root'
110
+ }]
111
+ }] });
112
+
113
+ class ObjectService {
114
+ constructor() { }
115
+ removeEmptyAttributes(object = {}) {
116
+ for (var attr in object) {
117
+ if (object[attr] === null || object[attr] === undefined || object[attr] === '') {
118
+ delete object[attr];
119
+ }
120
+ }
121
+ }
122
+ removeAllAttributes(object = {}) {
123
+ for (var attr in object) {
124
+ delete object[attr];
125
+ }
126
+ }
127
+ deepMerge(...objects) {
128
+ let result = {};
129
+ objects.forEach((object) => {
130
+ if (!this.isObject(result) || !this.isObject(object)) {
131
+ result = object;
132
+ }
133
+ else {
134
+ Object.entries(object).forEach(([key, value]) => {
135
+ if (this.isObject(value)) {
136
+ result[key] = this.deepMerge(result[key] || {}, value);
137
+ }
138
+ else {
139
+ result[key] = value;
140
+ }
141
+ });
142
+ }
143
+ });
144
+ return result;
145
+ }
146
+ deepClone(object) {
147
+ let objectService = this;
148
+ let copyFunction = function (value) {
149
+ if (objectService.isObject(value)) {
150
+ return objectService.deepClone(value);
151
+ }
152
+ else if (value instanceof Array) {
153
+ return value.map((item) => {
154
+ return copyFunction(item);
155
+ });
156
+ }
157
+ else {
158
+ return value;
159
+ }
160
+ };
161
+ let result = {};
162
+ Object.entries(object).forEach(([key, value]) => {
163
+ result[key] = copyFunction(value);
164
+ });
165
+ return result;
166
+ }
167
+ findKeyByValue(object, value) {
168
+ return Object.keys(object).find((currentValue) => {
169
+ return value == object[currentValue];
170
+ });
171
+ }
172
+ isObject(objValue) {
173
+ return objValue && typeof objValue === 'object' && objValue.constructor === Object;
174
+ }
175
+ isEmpty(object) {
176
+ return Object.keys(object).length == 0;
177
+ }
178
+ }
179
+ ObjectService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ObjectService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
180
+ ObjectService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ObjectService, providedIn: 'root' });
181
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ObjectService, decorators: [{
182
+ type: Injectable,
183
+ args: [{
184
+ providedIn: 'root'
185
+ }]
186
+ }], ctorParameters: function () { return []; } });
187
+
188
+ class LocaleService {
189
+ constructor(translate, dataBroadcastService, objectService) {
190
+ this.translate = translate;
191
+ this.dataBroadcastService = dataBroadcastService;
192
+ this.objectService = objectService;
193
+ this.AVAILABLE_LOCALES = {
194
+ 'English': 'en',
195
+ 'Melayu': 'ms'
196
+ };
197
+ this.DEFAULT_LOCALE = 'ms';
198
+ this.translate.addLangs(this.availableLocaleCodes);
199
+ this.translate.setDefaultLang(this.DEFAULT_LOCALE);
200
+ const storedLocale = localStorage.getItem('locale');
201
+ if (storedLocale) {
202
+ this.translate.use(storedLocale);
203
+ }
204
+ else {
205
+ this.setDefaultLocale();
206
+ }
207
+ this.dataBroadcastService.locale.next(this.currentLocale);
208
+ this.dataBroadcastService.locale.subscribe((locale) => {
209
+ if (locale == this.currentLocale)
210
+ return;
211
+ if (locale) {
212
+ if (!this.availableLocales.includes(locale))
213
+ return;
214
+ localStorage.setItem('locale', this.AVAILABLE_LOCALES[locale]);
215
+ this.translate.use(this.AVAILABLE_LOCALES[locale]);
216
+ }
217
+ else {
218
+ const locale = this.setDefaultLocale();
219
+ localStorage.setItem('locale', locale);
220
+ this.translate.use(locale);
221
+ }
222
+ });
223
+ }
224
+ setDefaultLocale() {
225
+ const browserLocale = this.translate.getBrowserLang();
226
+ const locale = this.availableLocaleCodes.includes(browserLocale) ? browserLocale : this.DEFAULT_LOCALE;
227
+ this.translate.use(locale);
228
+ return locale;
229
+ }
230
+ clearLocale() {
231
+ this.dataBroadcastService.locale.next(undefined);
232
+ }
233
+ get availableLocales() {
234
+ return Object.keys(this.AVAILABLE_LOCALES);
235
+ }
236
+ get availableLocaleCodes() {
237
+ return Object.values(this.AVAILABLE_LOCALES);
238
+ }
239
+ get currentLocale() {
240
+ return this.objectService.findKeyByValue(this.AVAILABLE_LOCALES, this.translate.currentLang) || '';
241
+ }
242
+ get currentLocaleCode() {
243
+ return this.translate.currentLang;
244
+ }
245
+ getTranslation(key) {
246
+ return this.translate.instant(key);
247
+ }
248
+ }
249
+ LocaleService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: LocaleService, deps: [{ token: i5.TranslateService }, { token: DataBroadcastService }, { token: ObjectService }], target: i0.ɵɵFactoryTarget.Injectable });
250
+ LocaleService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: LocaleService, providedIn: 'root' });
251
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: LocaleService, decorators: [{
252
+ type: Injectable,
253
+ args: [{
254
+ providedIn: 'root'
255
+ }]
256
+ }], ctorParameters: function () { return [{ type: i5.TranslateService }, { type: DataBroadcastService }, { type: ObjectService }]; } });
257
+
258
+ class CustomPaginatorIntl extends MatPaginatorIntl {
259
+ constructor(dataBroadcastService, localeService) {
260
+ super();
261
+ this.dataBroadcastService = dataBroadcastService;
262
+ this.localeService = localeService;
263
+ this.getRangeLabel = (page, pageSize, length) => {
264
+ length = Math.max(length, 0);
265
+ const startIndex = (page * pageSize) + 1;
266
+ const endIndex = startIndex < length ? Math.min(startIndex + pageSize, length) : startIndex + pageSize;
267
+ const ofLabel = this.localeService.getTranslation('mantle.paginator.of');
268
+ return `${startIndex} - ${endIndex} ${ofLabel} ${length}`;
269
+ };
270
+ this.dataBroadcastService.locale.subscribe((locale) => {
271
+ this.itemsPerPageLabel = this.localeService.getTranslation('mantle.paginator.items_per_page');
272
+ this.firstPageLabel = this.localeService.getTranslation('mantle.paginator.first_page');
273
+ this.previousPageLabel = this.localeService.getTranslation('mantle.paginator.previous_page');
274
+ this.nextPageLabel = this.localeService.getTranslation('mantle.paginator.next_page');
275
+ this.lastPageLabel = this.localeService.getTranslation('mantle.paginator.last_page');
276
+ this.changes.next();
277
+ });
278
+ }
279
+ }
280
+ CustomPaginatorIntl.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: CustomPaginatorIntl, deps: [{ token: DataBroadcastService }, { token: LocaleService }], target: i0.ɵɵFactoryTarget.Injectable });
281
+ CustomPaginatorIntl.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: CustomPaginatorIntl });
282
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: CustomPaginatorIntl, decorators: [{
283
+ type: Injectable
284
+ }], ctorParameters: function () { return [{ type: DataBroadcastService }, { type: LocaleService }]; } });
285
+
90
286
  class MaterialModule {
91
287
  }
92
288
  MaterialModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: MaterialModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
@@ -108,6 +304,7 @@ MaterialModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version:
108
304
  MatSidenavModule,
109
305
  MatTabsModule,
110
306
  MatToolbarModule,
307
+ MatTooltipModule,
111
308
  MatProgressSpinnerModule,
112
309
  MatTableModule,
113
310
  MatPaginatorModule,
@@ -135,6 +332,7 @@ MaterialModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version:
135
332
  MatSidenavModule,
136
333
  MatTabsModule,
137
334
  MatToolbarModule,
335
+ MatTooltipModule,
138
336
  MatProgressSpinnerModule,
139
337
  MatTableModule,
140
338
  MatPaginatorModule,
@@ -182,6 +380,7 @@ MaterialModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version:
182
380
  }
183
381
  }
184
382
  },
383
+ { provide: MatPaginatorIntl, useClass: CustomPaginatorIntl },
185
384
  ], imports: [[
186
385
  CommonModule,
187
386
  MatBadgeModule,
@@ -201,6 +400,7 @@ MaterialModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version:
201
400
  MatSidenavModule,
202
401
  MatTabsModule,
203
402
  MatToolbarModule,
403
+ MatTooltipModule,
204
404
  MatProgressSpinnerModule,
205
405
  MatTableModule,
206
406
  MatPaginatorModule,
@@ -229,6 +429,7 @@ MaterialModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version:
229
429
  MatSidenavModule,
230
430
  MatTabsModule,
231
431
  MatToolbarModule,
432
+ MatTooltipModule,
232
433
  MatProgressSpinnerModule,
233
434
  MatTableModule,
234
435
  MatPaginatorModule,
@@ -263,6 +464,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
263
464
  MatSidenavModule,
264
465
  MatTabsModule,
265
466
  MatToolbarModule,
467
+ MatTooltipModule,
266
468
  MatProgressSpinnerModule,
267
469
  MatTableModule,
268
470
  MatPaginatorModule,
@@ -293,6 +495,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
293
495
  MatSidenavModule,
294
496
  MatTabsModule,
295
497
  MatToolbarModule,
498
+ MatTooltipModule,
296
499
  MatProgressSpinnerModule,
297
500
  MatTableModule,
298
501
  MatPaginatorModule,
@@ -341,6 +544,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
341
544
  }
342
545
  }
343
546
  },
547
+ { provide: MatPaginatorIntl, useClass: CustomPaginatorIntl },
344
548
  ]
345
549
  }]
346
550
  }] });
@@ -581,7 +785,7 @@ class SectionTitleComponent {
581
785
  constructor() { }
582
786
  }
583
787
  SectionTitleComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: SectionTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
584
- SectionTitleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: SectionTitleComponent, selector: "mantle-section-title", inputs: { title: "title" }, ngImport: i0, template: "<h3 class=\"section-title\">\n {{ title }}\n</h3>\n", styles: [".section-title{text-transform:uppercase;line-height:1rem;padding:.75rem 1.25rem}\n"] });
788
+ SectionTitleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: SectionTitleComponent, selector: "mantle-section-title", inputs: { title: "title" }, ngImport: i0, template: "<h3 class=\"section-title\">\n {{ title | translate }}\n</h3>\n", styles: [".section-title{text-transform:uppercase;line-height:1rem;padding:.75rem 1.25rem}\n"], pipes: { "translate": i5.TranslatePipe } });
585
789
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: SectionTitleComponent, decorators: [{
586
790
  type: Component,
587
791
  args: [{
@@ -628,73 +832,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
628
832
  }]
629
833
  }], ctorParameters: function () { return [{ type: i1$2.BreakpointObserver }]; } });
630
834
 
631
- class ObjectService {
632
- constructor() { }
633
- removeEmptyAttributes(object = {}) {
634
- for (var attr in object) {
635
- if (object[attr] === null || object[attr] === undefined || object[attr] === '') {
636
- delete object[attr];
637
- }
638
- }
639
- }
640
- removeAllAttributes(object = {}) {
641
- for (var attr in object) {
642
- delete object[attr];
643
- }
644
- }
645
- deepMerge(...objects) {
646
- let result = {};
647
- objects.forEach((object) => {
648
- if (!this.isObject(result) || !this.isObject(object)) {
649
- result = object;
650
- }
651
- else {
652
- Object.entries(object).forEach(([key, value]) => {
653
- if (this.isObject(value)) {
654
- result[key] = this.deepMerge(result[key] || {}, value);
655
- }
656
- else {
657
- result[key] = value;
658
- }
659
- });
660
- }
661
- });
662
- return result;
663
- }
664
- deepClone(object) {
665
- let objectService = this;
666
- let copyFunction = function (value) {
667
- if (objectService.isObject(value)) {
668
- return objectService.deepClone(value);
669
- }
670
- else if (value instanceof Array) {
671
- return value.map((item) => {
672
- return copyFunction(item);
673
- });
674
- }
675
- else {
676
- return value;
677
- }
678
- };
679
- let result = {};
680
- Object.entries(object).forEach(([key, value]) => {
681
- result[key] = copyFunction(value);
682
- });
683
- return result;
684
- }
685
- isObject(objValue) {
686
- return objValue && typeof objValue === 'object' && objValue.constructor === Object;
687
- }
688
- }
689
- ObjectService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ObjectService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
690
- ObjectService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ObjectService, providedIn: 'root' });
691
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ObjectService, decorators: [{
692
- type: Injectable,
693
- args: [{
694
- providedIn: 'root'
695
- }]
696
- }], ctorParameters: function () { return []; } });
697
-
698
835
  class ArrayService {
699
836
  constructor(objectService) {
700
837
  this.objectService = objectService;
@@ -825,7 +962,7 @@ class FilePreviewDialogComponent {
825
962
  }
826
963
  }
827
964
  FilePreviewDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: FilePreviewDialogComponent, deps: [{ token: i1$3.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: WebApiService }], target: i0.ɵɵFactoryTarget.Component });
828
- FilePreviewDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: FilePreviewDialogComponent, selector: "mantle-file-preview-dialog", ngImport: i0, template: "<div mat-dialog-title fxLayout=\"row\" fxLayoutAlign=\"start\" fxLayoutGap=\"8px\" class=\"dialog-title-section\">\n <mantle-section-title fxFlex=\"1 0 1px\" title=\"Preview\"></mantle-section-title>\n <button fxFlex=\"0 0 auto\" mat-icon-button tabindex=\"-1\" (click)=\"onCancel()\">\n <mat-icon>cancel</mat-icon>\n </button>\n</div>\n\n<mat-dialog-content class=\"content-section\">\n\n <img *ngIf=\"previewUrl\" class=\"preview-image\" [attr.src]=\"previewUrl | secureImage | async\" />\n\n <h2 Adding *ngIf=\"!previewUrl\">Unable to preview file.</h2>\n\n</mat-dialog-content>\n\n<mat-dialog-actions fxLayout=\"row\" class=\"actions-section\">\n <div fxFlex=\"1 1 auto\"></div>\n <button fxFlex=\"0 0 auto\" mat-button (click)=\"onDownload()\">Download</button>\n</mat-dialog-actions>\n", styles: [".content-section{text-align:center}.preview-image{width:400px;max-width:100%}\n"], components: [{ type: SectionTitleComponent, selector: "mantle-section-title", inputs: ["title"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i1$3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i1$3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }], pipes: { "async": i4.AsyncPipe, "secureImage": SecureImagePipe } });
965
+ FilePreviewDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: FilePreviewDialogComponent, selector: "mantle-file-preview-dialog", ngImport: i0, template: "<div mat-dialog-title fxLayout=\"row\" fxLayoutAlign=\"start\" fxLayoutGap=\"8px\" class=\"dialog-title-section\">\n <mantle-section-title fxFlex=\"1 0 1px\" title=\"Preview\"></mantle-section-title>\n <button fxFlex=\"0 0 auto\" mat-icon-button tabindex=\"-1\" (click)=\"onCancel()\">\n <mat-icon>cancel</mat-icon>\n </button>\n</div>\n\n<mat-dialog-content class=\"content-section\">\n\n <img *ngIf=\"previewUrl\" class=\"preview-image\" [attr.src]=\"previewUrl | secureImage | async\" />\n\n <h2 Adding *ngIf=\"!previewUrl\">{{ 'mantle.file_preview.unable_to_preview_file' | translate }}</h2>\n\n</mat-dialog-content>\n\n<mat-dialog-actions fxLayout=\"row\" class=\"actions-section\">\n <div fxFlex=\"1 1 auto\"></div>\n <button fxFlex=\"0 0 auto\" mat-button (click)=\"onDownload()\">{{ 'mantle.buttons.download' | translate }}</button>\n</mat-dialog-actions>\n", styles: [".content-section{text-align:center}.preview-image{width:400px;max-width:100%}\n"], components: [{ type: SectionTitleComponent, selector: "mantle-section-title", inputs: ["title"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i1$3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i1$3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }], pipes: { "async": i4.AsyncPipe, "secureImage": SecureImagePipe, "translate": i5.TranslatePipe } });
829
966
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: FilePreviewDialogComponent, decorators: [{
830
967
  type: Component,
831
968
  args: [{
@@ -853,7 +990,7 @@ class FileAttributeDisplayComponent {
853
990
  isString(val) { return (typeof val === 'string') && (val.length > 0); }
854
991
  }
855
992
  FileAttributeDisplayComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: FileAttributeDisplayComponent, deps: [{ token: i1$3.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
856
- FileAttributeDisplayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: FileAttributeDisplayComponent, selector: "mantle-file-attribute-display", inputs: { value: "value" }, ngImport: i0, template: "<div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\">\n <div fxFlex=\"0 1 auto\">{{ value?.filename }}</div>\n <div fxFlex=\"1 1 auto\">\n <button *ngIf=\"value?.source_url\"\n mat-mini-fab\n color=\"primary\"\n class=\"preview-button\"\n click-stop-propagation\n (click)=\"openPreviewDialog()\">\n <mat-icon>attach_file</mat-icon>\n </button>\n <mat-icon class=\"unsaved-upload-indicator\" *ngIf=\"isString(value)\">attach_file</mat-icon>\n </div>\n</div>\n", styles: [".preview-button{width:32px;height:32px;line-height:20px;font-size:20px}.preview-button::ng-deep .mat-button-wrapper{line-height:20px;padding:0}.preview-button::ng-deep .mat-button-wrapper .mat-icon{font-size:20px;padding-top:4px}.unsaved-upload-indicator{font-size:20px;padding-top:4px}\n"], components: [{ type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: ClickStopPropagationDirective, selector: "[click-stop-propagation]" }] });
993
+ FileAttributeDisplayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: FileAttributeDisplayComponent, selector: "mantle-file-attribute-display", inputs: { value: "value" }, ngImport: i0, template: "<div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\">\n <div fxFlex=\"0 1 auto\">{{ value?.filename }}</div>\n <div fxFlex=\"1 1 auto\">\n <button *ngIf=\"value?.source_url\"\n mat-mini-fab\n color=\"primary\"\n class=\"preview-button\"\n click-stop-propagation\n (click)=\"openPreviewDialog()\">\n <mat-icon>attach_file</mat-icon>\n </button>\n <mat-icon class=\"unsaved-upload-indicator\" *ngIf=\"isString(value)\">attach_file</mat-icon>\n </div>\n</div>\n", styles: [".preview-button{width:32px;height:32px;line-height:20px;font-size:20px}.preview-button::ng-deep .mat-button-wrapper{line-height:20px;padding:0}.preview-button::ng-deep .mat-button-wrapper .mat-icon{font-size:20px;padding-top:4px}.unsaved-upload-indicator{font-size:20px;padding-top:4px}\n"], components: [{ type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: ClickStopPropagationDirective, selector: "[click-stop-propagation]" }] });
857
994
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: FileAttributeDisplayComponent, decorators: [{
858
995
  type: Component,
859
996
  args: [{
@@ -879,7 +1016,7 @@ class ImageAttributeDisplayComponent {
879
1016
  isString(val) { return (typeof val === 'string') && (val.length > 0); }
880
1017
  }
881
1018
  ImageAttributeDisplayComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ImageAttributeDisplayComponent, deps: [{ token: i1$3.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
882
- ImageAttributeDisplayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: ImageAttributeDisplayComponent, selector: "mantle-image-attribute-display", inputs: { value: "value" }, ngImport: i0, template: "<div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\">\n <div fxFlex=\"0 1 auto\">{{ value?.filename }}</div>\n <div fxFlex=\"1 1 auto\">\n <button *ngIf=\"value?.source_url\"\n mat-mini-fab\n color=\"primary\"\n class=\"preview-button\"\n click-stop-propagation\n (click)=\"openPreviewDialog()\">\n <mat-icon>image</mat-icon>\n </button>\n </div>\n <mat-icon class=\"unsaved-upload-indicator\" *ngIf=\"isString(value)\">image</mat-icon>\n</div>\n", styles: [".preview-button{width:32px;height:32px;line-height:20px;font-size:20px}.preview-button::ng-deep .mat-button-wrapper{line-height:20px;padding:0}.preview-button::ng-deep .mat-button-wrapper .mat-icon{font-size:20px;padding-top:4px}.unsaved-upload-indicator{font-size:20px;padding-top:4px}\n"], components: [{ type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: ClickStopPropagationDirective, selector: "[click-stop-propagation]" }] });
1019
+ ImageAttributeDisplayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: ImageAttributeDisplayComponent, selector: "mantle-image-attribute-display", inputs: { value: "value" }, ngImport: i0, template: "<div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\">\n <div fxFlex=\"0 1 auto\">{{ value?.filename }}</div>\n <div fxFlex=\"1 1 auto\">\n <button *ngIf=\"value?.source_url\"\n mat-mini-fab\n color=\"primary\"\n class=\"preview-button\"\n click-stop-propagation\n (click)=\"openPreviewDialog()\">\n <mat-icon>image</mat-icon>\n </button>\n </div>\n <mat-icon class=\"unsaved-upload-indicator\" *ngIf=\"isString(value)\">image</mat-icon>\n</div>\n", styles: [".preview-button{width:32px;height:32px;line-height:20px;font-size:20px}.preview-button::ng-deep .mat-button-wrapper{line-height:20px;padding:0}.preview-button::ng-deep .mat-button-wrapper .mat-icon{font-size:20px;padding-top:4px}.unsaved-upload-indicator{font-size:20px;padding-top:4px}\n"], components: [{ type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: ClickStopPropagationDirective, selector: "[click-stop-propagation]" }] });
883
1020
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ImageAttributeDisplayComponent, decorators: [{
884
1021
  type: Component,
885
1022
  args: [{
@@ -901,7 +1038,7 @@ class LinkAttributeDisplayComponent {
901
1038
  }
902
1039
  }
903
1040
  LinkAttributeDisplayComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: LinkAttributeDisplayComponent, deps: [{ token: i1$4.Router }], target: i0.ɵɵFactoryTarget.Component });
904
- LinkAttributeDisplayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: LinkAttributeDisplayComponent, selector: "mantle-link-attribute-display", inputs: { value: "value" }, ngImport: i0, template: "<a *ngIf=\"value\"\n [href]=\"value\"\n mat-mini-fab\n color=\"primary\"\n class=\"link-button\"\n click-stop-propagation>\n <mat-icon>link</mat-icon>\n</a>\n", styles: [".link-button{width:32px;height:32px;line-height:20px;font-size:20px}.link-button::ng-deep .mat-button-wrapper{line-height:20px;padding:0}.link-button::ng-deep .mat-button-wrapper .mat-icon{font-size:20px;padding-top:6px}\n"], components: [{ type: i5.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-icon-button], a[mat-fab], a[mat-mini-fab], a[mat-stroked-button], a[mat-flat-button]", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matButton", "matAnchor"] }, { type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: ClickStopPropagationDirective, selector: "[click-stop-propagation]" }] });
1041
+ LinkAttributeDisplayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: LinkAttributeDisplayComponent, selector: "mantle-link-attribute-display", inputs: { value: "value" }, ngImport: i0, template: "<a *ngIf=\"value\"\n [href]=\"value\"\n mat-mini-fab\n color=\"primary\"\n class=\"link-button\"\n click-stop-propagation>\n <mat-icon>link</mat-icon>\n</a>\n", styles: [".link-button{width:32px;height:32px;line-height:20px;font-size:20px}.link-button::ng-deep .mat-button-wrapper{line-height:20px;padding:0}.link-button::ng-deep .mat-button-wrapper .mat-icon{font-size:20px;padding-top:6px}\n"], components: [{ type: i3$1.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-icon-button], a[mat-fab], a[mat-mini-fab], a[mat-stroked-button], a[mat-flat-button]", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matButton", "matAnchor"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: ClickStopPropagationDirective, selector: "[click-stop-propagation]" }] });
905
1042
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: LinkAttributeDisplayComponent, decorators: [{
906
1043
  type: Component,
907
1044
  args: [{
@@ -922,7 +1059,7 @@ class ThumbnailDisplayComponent {
922
1059
  }
923
1060
  }
924
1061
  ThumbnailDisplayComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ThumbnailDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
925
- ThumbnailDisplayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: ThumbnailDisplayComponent, selector: "mantle-thumbnail-display", inputs: { value: "value", size: "size", placeholder: "placeholder", circular: "circular" }, ngImport: i0, template: "<div class=\"thumbnail-wrapper\" [ngStyle]=\"{ width: size, height: size }\">\n <img *ngIf=\"value\" [attr.src]=\"value | secureImage | async\" [class.circular]=\"circular\" />\n <mat-icon *ngIf=\"!value && placeholder\" [style.font-size]=\"size\">{{ placeholder }}</mat-icon>\n</div>\n", styles: [".thumbnail-wrapper{vertical-align:middle}img{box-sizing:border-box;width:100%;height:100%;padding:2px}img.circular{border-radius:50%}.mat-icon{width:100%;height:100%}\n"], components: [{ type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i3.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "async": i4.AsyncPipe, "secureImage": SecureImagePipe } });
1062
+ ThumbnailDisplayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: ThumbnailDisplayComponent, selector: "mantle-thumbnail-display", inputs: { value: "value", size: "size", placeholder: "placeholder", circular: "circular" }, ngImport: i0, template: "<div class=\"thumbnail-wrapper\" [ngStyle]=\"{ width: size, height: size }\">\n <img *ngIf=\"value\" [attr.src]=\"value | secureImage | async\" [class.circular]=\"circular\" />\n <mat-icon *ngIf=\"!value && placeholder\" [style.font-size]=\"size\">{{ placeholder }}</mat-icon>\n</div>\n", styles: [".thumbnail-wrapper{vertical-align:middle}img{box-sizing:border-box;width:100%;height:100%;padding:2px}img.circular{border-radius:50%}.mat-icon{width:100%;height:100%}\n"], components: [{ type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i3.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "async": i4.AsyncPipe, "secureImage": SecureImagePipe } });
926
1063
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ThumbnailDisplayComponent, decorators: [{
927
1064
  type: Component,
928
1065
  args: [{
@@ -965,7 +1102,7 @@ class ActionsAttributeDisplayComponent {
965
1102
  }
966
1103
  }
967
1104
  ActionsAttributeDisplayComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ActionsAttributeDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
968
- ActionsAttributeDisplayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: ActionsAttributeDisplayComponent, selector: "mantle-actions-attribute-display", inputs: { value: "value", actions: "actions" }, ngImport: i0, template: "<ng-container *ngFor=\"let action of actions\">\n <button mat-icon-button\n *ngIf=\"action.show\"\n click-stop-propagation\n [color]=\"action.colour\"\n type=\"button\"\n (click)=\"action.onClick(value)\">\n <mat-icon>{{ action.icon }}</mat-icon>\n </button>\n</ng-container>\n", styles: [""], components: [{ type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: ClickStopPropagationDirective, selector: "[click-stop-propagation]" }] });
1105
+ ActionsAttributeDisplayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: ActionsAttributeDisplayComponent, selector: "mantle-actions-attribute-display", inputs: { value: "value", actions: "actions" }, ngImport: i0, template: "<ng-container *ngFor=\"let action of actions\">\n <button mat-icon-button\n *ngIf=\"action.show\"\n click-stop-propagation\n [color]=\"action.colour\"\n type=\"button\"\n (click)=\"action.onClick(value)\">\n <mat-icon>{{ action.icon }}</mat-icon>\n </button>\n</ng-container>\n", styles: [""], components: [{ type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: ClickStopPropagationDirective, selector: "[click-stop-propagation]" }] });
969
1106
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ActionsAttributeDisplayComponent, decorators: [{
970
1107
  type: Component,
971
1108
  args: [{
@@ -979,6 +1116,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
979
1116
  type: Input
980
1117
  }] } });
981
1118
 
1119
+ class IconAttributeDisplayComponent {
1120
+ constructor() {
1121
+ this.value = {};
1122
+ }
1123
+ }
1124
+ IconAttributeDisplayComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: IconAttributeDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1125
+ IconAttributeDisplayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: IconAttributeDisplayComponent, selector: "mantle-icon-attribute-display", inputs: { value: "value" }, ngImport: i0, template: "<mat-icon *ngIf=\"value\">{{ value }}</mat-icon>\n", styles: [""], components: [{ type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
1126
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: IconAttributeDisplayComponent, decorators: [{
1127
+ type: Component,
1128
+ args: [{
1129
+ selector: 'mantle-icon-attribute-display',
1130
+ templateUrl: './icon-attribute-display.component.html',
1131
+ styleUrls: ['./icon-attribute-display.component.scss']
1132
+ }]
1133
+ }], propDecorators: { value: [{
1134
+ type: Input
1135
+ }] } });
1136
+
982
1137
  class DynamicAttributeDisplayComponent {
983
1138
  constructor(arrayService) {
984
1139
  this.arrayService = arrayService;
@@ -994,7 +1149,7 @@ class DynamicAttributeDisplayComponent {
994
1149
  }
995
1150
  }
996
1151
  DynamicAttributeDisplayComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DynamicAttributeDisplayComponent, deps: [{ token: ArrayService }], target: i0.ɵɵFactoryTarget.Component });
997
- DynamicAttributeDisplayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DynamicAttributeDisplayComponent, selector: "mantle-dynamic-attribute-display", inputs: { value: "value", field: "field", fieldType: "fieldType", options: "options" }, ngImport: i0, template: "<ng-container [ngSwitch]=\"field?.type || fieldType\">\n\n <ng-container *ngSwitchCase=\"'chips'\">\n <mantle-chip-attribute-display [value]=\"value\" [options]=\"options\">\n </mantle-chip-attribute-display>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'file'\">\n <mantle-file-attribute-display [value]=\"value\">\n </mantle-file-attribute-display>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'image'\">\n <mantle-image-attribute-display [value]=\"value\">\n </mantle-image-attribute-display>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'link'\">\n <mantle-link-attribute-display [value]=\"value\">\n </mantle-link-attribute-display>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'thumbnail'\">\n <mantle-thumbnail-display [value]=\"value\"\n [size]=\"options.size\" [placeholder]=\"options.placeholder\" [circular]=\"options.circular\">\n </mantle-thumbnail-display>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'dropdown'\">\n {{ dropdownValueLabel(value) | dynamicPipe: fieldType }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'markdown'\">\n <mantle-markdown-attribute-display [value]=\"value\">\n </mantle-markdown-attribute-display>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'actions'\">\n <mantle-actions-attribute-display [actions]=\"field?.options?.actions!\" [value]=\"value\">\n </mantle-actions-attribute-display>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n {{ value | dynamicPipe: fieldType }}\n </ng-container>\n\n</ng-container>\n", styles: [""], components: [{ type: ChipAttributeDisplayComponent, selector: "mantle-chip-attribute-display", inputs: ["value", "options"] }, { type: FileAttributeDisplayComponent, selector: "mantle-file-attribute-display", inputs: ["value"] }, { type: ImageAttributeDisplayComponent, selector: "mantle-image-attribute-display", inputs: ["value"] }, { type: LinkAttributeDisplayComponent, selector: "mantle-link-attribute-display", inputs: ["value"] }, { type: ThumbnailDisplayComponent, selector: "mantle-thumbnail-display", inputs: ["value", "size", "placeholder", "circular"] }, { type: MarkdownAttributeDisplayComponent, selector: "mantle-markdown-attribute-display", inputs: ["value"] }, { type: ActionsAttributeDisplayComponent, selector: "mantle-actions-attribute-display", inputs: ["value", "actions"] }], directives: [{ type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }], pipes: { "dynamicPipe": DynamicPipe } });
1152
+ DynamicAttributeDisplayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DynamicAttributeDisplayComponent, selector: "mantle-dynamic-attribute-display", inputs: { value: "value", field: "field", fieldType: "fieldType", options: "options" }, ngImport: i0, template: "<ng-container [ngSwitch]=\"field?.type || fieldType\">\n\n <ng-container *ngSwitchCase=\"'chips'\">\n <mantle-chip-attribute-display [value]=\"value\" [options]=\"options\">\n </mantle-chip-attribute-display>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'chips-lg'\">\n <mantle-chip-attribute-display [value]=\"value\" [options]=\"options\">\n </mantle-chip-attribute-display>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'file'\">\n <mantle-file-attribute-display [value]=\"value\">\n </mantle-file-attribute-display>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'image'\">\n <mantle-image-attribute-display [value]=\"value\">\n </mantle-image-attribute-display>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'link'\">\n <mantle-link-attribute-display [value]=\"value\">\n </mantle-link-attribute-display>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'thumbnail'\">\n <mantle-thumbnail-display [value]=\"value\"\n [size]=\"options.size\" [placeholder]=\"options.placeholder\" [circular]=\"options.circular\">\n </mantle-thumbnail-display>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'dropdown'\">\n {{ dropdownValueLabel(value) | dynamicPipe: fieldType }}\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'markdown'\">\n <mantle-markdown-attribute-display [value]=\"value\">\n </mantle-markdown-attribute-display>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'actions'\">\n <mantle-actions-attribute-display [actions]=\"field?.options?.actions!\" [value]=\"value\">\n </mantle-actions-attribute-display>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'icon'\">\n <mantle-icon-attribute-display [value]=\"value\">\n </mantle-icon-attribute-display>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n {{ value | dynamicPipe: fieldType }}\n </ng-container>\n\n</ng-container>\n", styles: [""], components: [{ type: ChipAttributeDisplayComponent, selector: "mantle-chip-attribute-display", inputs: ["value", "options"] }, { type: FileAttributeDisplayComponent, selector: "mantle-file-attribute-display", inputs: ["value"] }, { type: ImageAttributeDisplayComponent, selector: "mantle-image-attribute-display", inputs: ["value"] }, { type: LinkAttributeDisplayComponent, selector: "mantle-link-attribute-display", inputs: ["value"] }, { type: ThumbnailDisplayComponent, selector: "mantle-thumbnail-display", inputs: ["value", "size", "placeholder", "circular"] }, { type: MarkdownAttributeDisplayComponent, selector: "mantle-markdown-attribute-display", inputs: ["value"] }, { type: ActionsAttributeDisplayComponent, selector: "mantle-actions-attribute-display", inputs: ["value", "actions"] }, { type: IconAttributeDisplayComponent, selector: "mantle-icon-attribute-display", inputs: ["value"] }], directives: [{ type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }], pipes: { "dynamicPipe": DynamicPipe } });
998
1153
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DynamicAttributeDisplayComponent, decorators: [{
999
1154
  type: Component,
1000
1155
  args: [{
@@ -1035,14 +1190,23 @@ class GridDetailsSectionComponent {
1035
1190
  });
1036
1191
  }
1037
1192
  getColSpanForField(attribute) {
1038
- return (attribute.type == 'text' || attribute.type == 'string-lg' || attribute.type == 'markdown') ? this.numColumns : 1;
1193
+ if (this.numColumns == 1)
1194
+ return 1;
1195
+ else if (['text', 'markdown'].includes(attribute.type))
1196
+ return this.numColumns;
1197
+ else if (attribute.type.endsWith('-lg'))
1198
+ return this.numColumns;
1199
+ else if (attribute.type.endsWith('-md'))
1200
+ return 2;
1201
+ else
1202
+ return 1;
1039
1203
  }
1040
1204
  getRowSpanForField(attribute) {
1041
1205
  return (attribute.type == 'text' || attribute.type == 'markdown') ? 2 : 1;
1042
1206
  }
1043
1207
  }
1044
1208
  GridDetailsSectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: GridDetailsSectionComponent, deps: [{ token: ScreenSizeService }], target: i0.ɵɵFactoryTarget.Component });
1045
- GridDetailsSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: GridDetailsSectionComponent, selector: "mantle-grid-details-section", inputs: { data: "data", section: "section", defaultRowHeight: "defaultRowHeight" }, ngImport: i0, template: "<div class=\"grid-details-layout\">\n <mat-grid-list\n [rowHeight]=\"section.rowHeight || defaultRowHeight\"\n [cols]=\"section.singleColumn ? 1 : numColumns\"\n [class.multi-column]=\"section.singleColumn ? false : numColumns > 1\">\n\n <ng-container *ngFor=\"let field of section.elements\">\n <mat-grid-tile *ngIf=\"!field.hidden\" [colspan]=\"section.singleColumn ? 1 : getColSpanForField(field)\" [rowspan]=\"getRowSpanForField(field)\">\n <div class=\"value-area\">\n <div class=\"attribute-label\">\n {{ field.label }}\n </div>\n <div class=\"attribute-value\">\n <mantle-dynamic-attribute-display [fieldType]=\"field.type\" [value]=\"data[field.attr]\" [field]=\"field\"></mantle-dynamic-attribute-display>\n </div>\n </div>\n </mat-grid-tile>\n </ng-container>\n\n </mat-grid-list>\n</div>\n", styles: [".value-area{height:100%;box-sizing:border-box;padding-top:10px;padding-bottom:10px}.value-area .attribute-label{text-transform:uppercase;font-size:11px;line-height:1rem;height:1rem;font-weight:400;color:#0000008a;margin-bottom:4px}\n"], components: [{ type: i3$2.MatGridList, selector: "mat-grid-list", inputs: ["cols", "gutterSize", "rowHeight"], exportAs: ["matGridList"] }, { type: i3$2.MatGridTile, selector: "mat-grid-tile", inputs: ["rowspan", "colspan"], exportAs: ["matGridTile"] }, { type: DynamicAttributeDisplayComponent, selector: "mantle-dynamic-attribute-display", inputs: ["value", "field", "fieldType", "options"] }], directives: [{ type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
1209
+ GridDetailsSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: GridDetailsSectionComponent, selector: "mantle-grid-details-section", inputs: { data: "data", section: "section", defaultRowHeight: "defaultRowHeight" }, ngImport: i0, template: "<div class=\"grid-details-layout\">\n <mat-grid-list\n [rowHeight]=\"section.rowHeight || defaultRowHeight\"\n [cols]=\"section.singleColumn ? 1 : numColumns\"\n [class.multi-column]=\"section.singleColumn ? false : numColumns > 1\">\n\n <ng-container *ngFor=\"let field of section.elements\">\n <mat-grid-tile *ngIf=\"!field.hidden\" [colspan]=\"section.singleColumn ? 1 : getColSpanForField(field)\" [rowspan]=\"getRowSpanForField(field)\">\n <div class=\"value-area\">\n <div class=\"attribute-label\" [class.with-tooltip]=\"field.tooltip\">\n {{ field.label }}\n <button *ngIf=\"field.tooltip\"\n mat-icon-button\n disabled\n disabledInteractive\n disableRipple\n [matTooltip]=\"field.tooltip\"\n matTooltipPosition=\"right\">\n <mat-icon>help</mat-icon>\n </button>\n </div>\n <div class=\"attribute-value\">\n <mantle-dynamic-attribute-display [fieldType]=\"field.type\" [value]=\"data[field.attr]\" [field]=\"field\"></mantle-dynamic-attribute-display>\n </div>\n </div>\n </mat-grid-tile>\n </ng-container>\n\n </mat-grid-list>\n</div>\n", styles: [".value-area{height:100%;box-sizing:border-box;padding-top:10px;padding-bottom:10px}.value-area .attribute-label{text-transform:uppercase;font-size:11px;line-height:1rem;height:1rem;font-weight:400;color:#0000008a;margin-bottom:4px}.value-area .with-tooltip .mat-icon-button{line-height:1rem;width:1rem;height:1rem}.value-area .with-tooltip .mat-icon-button .mat-icon{font-size:16px}\n"], components: [{ type: i3$2.MatGridList, selector: "mat-grid-list", inputs: ["cols", "gutterSize", "rowHeight"], exportAs: ["matGridList"] }, { type: i3$2.MatGridTile, selector: "mat-grid-tile", inputs: ["rowspan", "colspan"], exportAs: ["matGridTile"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: DynamicAttributeDisplayComponent, selector: "mantle-dynamic-attribute-display", inputs: ["value", "field", "fieldType", "options"] }], directives: [{ type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
1046
1210
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: GridDetailsSectionComponent, decorators: [{
1047
1211
  type: Component,
1048
1212
  args: [{
@@ -1075,7 +1239,7 @@ class DialogNestedDetailsComponent {
1075
1239
  }
1076
1240
  }
1077
1241
  DialogNestedDetailsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DialogNestedDetailsComponent, deps: [{ token: i1$3.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
1078
- DialogNestedDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DialogNestedDetailsComponent, selector: "mantle-dialog-nested-details", ngImport: i0, template: "<div mat-dialog-title fxLayout=\"row\" fxLayoutAlign=\"start\" fxLayoutGap=\"8px\" class=\"dialog-title-section\">\n <mantle-section-title fxFlex=\"1 0 1px\" [title]=\"title\"></mantle-section-title>\n <button fxFlex=\"0 0 auto\" mat-icon-button tabindex=\"-1\" (click)=\"onClose()\">\n <mat-icon>cancel</mat-icon>\n </button>\n</div>\n\n<mat-dialog-content>\n\n <mantle-grid-details-section\n [section]=\"section\"\n [data]=\"data\">>\n </mantle-grid-details-section>\n\n</mat-dialog-content>\n\n<mat-dialog-actions *ngIf=\"showEditButton\" fxLayout=\"row\" class=\"actions-section\">\n <div fxFlex=\"1 1 auto\"></div>\n <button fxFlex=\"0 0 auto\" mat-button color=\"primary\" (click)=\"onEdit()\">Edit</button>\n</mat-dialog-actions>\n", styles: [""], components: [{ type: SectionTitleComponent, selector: "mantle-section-title", inputs: ["title"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: GridDetailsSectionComponent, selector: "mantle-grid-details-section", inputs: ["data", "section", "defaultRowHeight"] }], directives: [{ type: i1$3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i1$3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }] });
1242
+ DialogNestedDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DialogNestedDetailsComponent, selector: "mantle-dialog-nested-details", ngImport: i0, template: "<div mat-dialog-title fxLayout=\"row\" fxLayoutAlign=\"start\" fxLayoutGap=\"8px\" class=\"dialog-title-section\">\n <mantle-section-title fxFlex=\"1 0 1px\" [title]=\"title\"></mantle-section-title>\n <button fxFlex=\"0 0 auto\" mat-icon-button tabindex=\"-1\" (click)=\"onClose()\">\n <mat-icon>cancel</mat-icon>\n </button>\n</div>\n\n<mat-dialog-content>\n\n <mantle-grid-details-section\n [section]=\"section\"\n [data]=\"data\">>\n </mantle-grid-details-section>\n\n</mat-dialog-content>\n\n<mat-dialog-actions *ngIf=\"showEditButton\" fxLayout=\"row\" class=\"actions-section\">\n <div fxFlex=\"1 1 auto\"></div>\n <button fxFlex=\"0 0 auto\" mat-button color=\"primary\" (click)=\"onEdit()\">{{ 'mantle.buttons.edit' | translate }}</button>\n</mat-dialog-actions>\n", styles: [""], components: [{ type: SectionTitleComponent, selector: "mantle-section-title", inputs: ["title"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: GridDetailsSectionComponent, selector: "mantle-grid-details-section", inputs: ["data", "section", "defaultRowHeight"] }], directives: [{ type: i1$3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i1$3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }], pipes: { "translate": i5.TranslatePipe } });
1079
1243
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DialogNestedDetailsComponent, decorators: [{
1080
1244
  type: Component,
1081
1245
  args: [{
@@ -1190,9 +1354,8 @@ class DynamicTableComponent {
1190
1354
  this.dataSource.listSubject.next(this.items);
1191
1355
  }
1192
1356
  listColumnAttrs() {
1193
- return this.columns.map(column => {
1194
- return column.attr;
1195
- });
1357
+ return this.columns.filter(column => { return !column.hidden; })
1358
+ .map(column => { return column.attr; });
1196
1359
  }
1197
1360
  onRowClicked(row) {
1198
1361
  if (!this.withClickableRows)
@@ -1201,7 +1364,7 @@ class DynamicTableComponent {
1201
1364
  }
1202
1365
  }
1203
1366
  DynamicTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DynamicTableComponent, deps: [{ token: ArrayService }], target: i0.ɵɵFactoryTarget.Component });
1204
- DynamicTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DynamicTableComponent, selector: "mantle-dynamic-table", inputs: { columns: "columns", items: "items", withClickableRows: "withClickableRows" }, outputs: { rowClicked: "rowClicked" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "table", first: true, predicate: MatTable, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"horizontal-scroll-table\">\n <table mat-table class=\"full-width\" matSort>\n\n <ng-container *ngFor=\"let column of columns\">\n <ng-container matColumnDef=\"{{ column.attr }}\" *ngIf=\"column.type != 'actions'\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>{{ column.header }}</th>\n <td mat-cell *matCellDef=\"let row\">\n <mantle-dynamic-attribute-display [fieldType]=\"column.type\" [value]=\"row[column.attr]\" [field]=\"column\"></mantle-dynamic-attribute-display>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"{{ column.attr }}\" *ngIf=\"column.type == 'actions'\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header [disabled]=\"true\">{{ column.header }}</th>\n <td mat-cell *matCellDef=\"let row\" class=\"actions-column\">\n <mantle-dynamic-attribute-display [fieldType]=\"column.type\" [value]=\"row\" [field]=\"column\"></mantle-dynamic-attribute-display>\n </td>\n </ng-container>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"listColumnAttrs()\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: listColumnAttrs();\"\n (click)=\"onRowClicked(row)\"\n [class.clickable-row]=\"withClickableRows\">\n </tr>\n\n </table>\n</div>\n\n<mat-paginator #paginator\n [length]=\"items.length\"\n [pageIndex]=\"0\"\n [pageSize]=\"10\"\n [pageSizeOptions]=\"[5, 10, 20]\">\n</mat-paginator>\n", styles: [".actions-column{width:1px;text-align:right}\n"], components: [{ type: i2$1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { type: i3$3.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "arrowPosition", "sortActionDescription", "disableClear", "mat-sort-header", "start"], exportAs: ["matSortHeader"] }, { type: DynamicAttributeDisplayComponent, selector: "mantle-dynamic-attribute-display", inputs: ["value", "field", "fieldType", "options"] }, { type: i2$1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { type: i2$1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { type: i5$1.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }], directives: [{ type: i3$3.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortActive"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2$1.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { type: i2$1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { type: i2$1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { type: i2$1.MatCellDef, selector: "[matCellDef]" }, { type: i2$1.MatCell, selector: "mat-cell, td[mat-cell]" }, { type: i2$1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { type: i2$1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }] });
1367
+ DynamicTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DynamicTableComponent, selector: "mantle-dynamic-table", inputs: { columns: "columns", items: "items", withClickableRows: "withClickableRows" }, outputs: { rowClicked: "rowClicked" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "table", first: true, predicate: MatTable, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"horizontal-scroll-table\">\n <table mat-table class=\"full-width\" matSort>\n\n <ng-container *ngFor=\"let column of columns\">\n <ng-container *ngIf=\"!column.hidden\">\n <ng-container matColumnDef=\"{{ column.attr }}\" *ngIf=\"column.type != 'actions'\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>{{ column.header }}</th>\n <td mat-cell *matCellDef=\"let row\">\n <mantle-dynamic-attribute-display [fieldType]=\"column.type\" [value]=\"row[column.attr]\" [field]=\"column\"></mantle-dynamic-attribute-display>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"{{ column.attr }}\" *ngIf=\"column.type == 'actions'\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header [disabled]=\"true\">{{ column.header }}</th>\n <td mat-cell *matCellDef=\"let row\" class=\"actions-column\">\n <mantle-dynamic-attribute-display [fieldType]=\"column.type\" [value]=\"row\" [field]=\"column\"></mantle-dynamic-attribute-display>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"listColumnAttrs()\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: listColumnAttrs();\"\n (click)=\"onRowClicked(row)\"\n [class.clickable-row]=\"withClickableRows\">\n </tr>\n\n </table>\n</div>\n\n<mat-paginator #paginator\n [length]=\"items.length\"\n [pageIndex]=\"0\"\n [pageSize]=\"10\"\n [pageSizeOptions]=\"[5, 10, 20]\">\n</mat-paginator>\n", styles: [".actions-column{width:1px;text-align:right}\n"], components: [{ type: i2$1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { type: i12.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "arrowPosition", "sortActionDescription", "disableClear", "mat-sort-header", "start"], exportAs: ["matSortHeader"] }, { type: DynamicAttributeDisplayComponent, selector: "mantle-dynamic-attribute-display", inputs: ["value", "field", "fieldType", "options"] }, { type: i2$1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { type: i2$1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { type: i14.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }], directives: [{ type: i12.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortActive"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2$1.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { type: i2$1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { type: i2$1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { type: i2$1.MatCellDef, selector: "[matCellDef]" }, { type: i2$1.MatCell, selector: "mat-cell, td[mat-cell]" }, { type: i2$1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { type: i2$1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }] });
1205
1368
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DynamicTableComponent, decorators: [{
1206
1369
  type: Component,
1207
1370
  args: [{
@@ -1241,11 +1404,14 @@ class TableDetailsSectionComponent {
1241
1404
  showEditButton: false
1242
1405
  };
1243
1406
  dialogConfig.width = '80%';
1407
+ if (this.section.config.modal_section) {
1408
+ dialogConfig.data.section = this.detailPageService.detailDialogLayoutChanges(this.section.config.modal_section, record);
1409
+ }
1244
1410
  this.dialog.open(DialogNestedDetailsComponent, dialogConfig);
1245
1411
  }
1246
1412
  }
1247
1413
  TableDetailsSectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: TableDetailsSectionComponent, deps: [{ token: i1$3.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
1248
- TableDetailsSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: TableDetailsSectionComponent, selector: "mantle-table-details-section", inputs: { data: "data", section: "section" }, ngImport: i0, template: "<div class=\"table-section-content\">\n <mantle-dynamic-table\n [columns]=\"section.elements\"\n [items]=\"data[section.config.attr]\"\n [withClickableRows]=\"true\"\n (rowClicked)=\"openDetailsDialog($event)\">\n </mantle-dynamic-table>\n</div>\n", styles: [""], components: [{ type: DynamicTableComponent, selector: "mantle-dynamic-table", inputs: ["columns", "items", "withClickableRows"], outputs: ["rowClicked"] }] });
1414
+ TableDetailsSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: TableDetailsSectionComponent, selector: "mantle-table-details-section", inputs: { data: "data", section: "section", detailPageService: "detailPageService" }, ngImport: i0, template: "<div class=\"table-section-content\">\n <mantle-dynamic-table\n [columns]=\"section.elements\"\n [items]=\"data[section.config.attr]\"\n [withClickableRows]=\"true\"\n (rowClicked)=\"openDetailsDialog($event)\">\n </mantle-dynamic-table>\n</div>\n", styles: [""], components: [{ type: DynamicTableComponent, selector: "mantle-dynamic-table", inputs: ["columns", "items", "withClickableRows"], outputs: ["rowClicked"] }] });
1249
1415
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: TableDetailsSectionComponent, decorators: [{
1250
1416
  type: Component,
1251
1417
  args: [{
@@ -1257,11 +1423,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
1257
1423
  type: Input
1258
1424
  }], section: [{
1259
1425
  type: Input
1426
+ }], detailPageService: [{
1427
+ type: Input
1260
1428
  }] } });
1261
1429
 
1262
1430
  class DynamicFormField {
1263
1431
  constructor(options) {
1264
1432
  this.label = options.label;
1433
+ this.tooltip = options.tooltip || '';
1265
1434
  this.attr = options.attr;
1266
1435
  this.type = options.type;
1267
1436
  this.options = options.options || {};
@@ -1338,7 +1507,7 @@ TextInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ver
1338
1507
  useExisting: forwardRef(() => TextInputComponent),
1339
1508
  multi: true
1340
1509
  }
1341
- ], ngImport: i0, template: "<mat-form-field [class.mat-form-field-invalid]=\"error\">\n <mat-label>{{ label }}</mat-label>\n <input matInput\n type=\"text\"\n [(ngModel)]=\"value\"\n (keyup)=\"onValueChanged($event)\"\n (change)=\"onValueChanged($event)\"\n [required]=\"required\"\n [disabled]=\"disable\"\n autocomplete=\"off\">\n\n <mat-hint *ngIf=\"error\" class=\"error-message\">{{ error }}</mat-hint>\n</mat-form-field>\n", styles: [""], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }], directives: [{ type: i1$6.MatLabel, selector: "mat-label" }, { type: i4$2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i5$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i5$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i5$2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }] });
1510
+ ], ngImport: i0, template: "<mat-form-field [class.mat-form-field-invalid]=\"error\">\n <mat-label>{{ label | translate }}</mat-label>\n <input matInput\n type=\"text\"\n [(ngModel)]=\"value\"\n (keyup)=\"onValueChanged($event)\"\n (change)=\"onValueChanged($event)\"\n [required]=\"required\"\n [disabled]=\"disable\"\n autocomplete=\"off\">\n\n <mat-hint *ngIf=\"error\" class=\"error-message\">{{ error }}</mat-hint>\n</mat-form-field>\n", styles: [""], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }], directives: [{ type: i1$6.MatLabel, selector: "mat-label" }, { type: i2$2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i3$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3$3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }], pipes: { "translate": i5.TranslatePipe } });
1342
1511
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: TextInputComponent, decorators: [{
1343
1512
  type: Component,
1344
1513
  args: [{
@@ -1387,7 +1556,7 @@ TextareaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", vers
1387
1556
  useExisting: forwardRef(() => TextareaComponent),
1388
1557
  multi: true
1389
1558
  }
1390
- ], ngImport: i0, template: "<mat-form-field [class.mat-form-field-invalid]=\"error\">\n <mat-label>{{ label }}</mat-label>\n <textarea matInput\n [rows]=\"rows\"\n [(ngModel)]=\"value\"\n (keyup)=\"onValueChanged($event)\"\n (change)=\"onValueChanged($event)\"\n [required]=\"required\"\n [disabled]=\"disable\"\n autocomplete=\"off\">\n </textarea>\n\n <mat-hint *ngIf=\"error\" class=\"error-message\">{{ error }}</mat-hint>\n</mat-form-field>\n", styles: ["textarea{resize:none}\n"], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }], directives: [{ type: i1$6.MatLabel, selector: "mat-label" }, { type: i4$2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i5$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i5$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i5$2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }] });
1559
+ ], ngImport: i0, template: "<mat-form-field [class.mat-form-field-invalid]=\"error\">\n <mat-label>{{ label | translate }}</mat-label>\n <textarea matInput\n [rows]=\"rows\"\n [(ngModel)]=\"value\"\n (keyup)=\"onValueChanged($event)\"\n (change)=\"onValueChanged($event)\"\n [required]=\"required\"\n [disabled]=\"disable\"\n autocomplete=\"off\">\n </textarea>\n\n <mat-hint *ngIf=\"error\" class=\"error-message\">{{ error }}</mat-hint>\n</mat-form-field>\n", styles: ["textarea{resize:none}\n"], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }], directives: [{ type: i1$6.MatLabel, selector: "mat-label" }, { type: i2$2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i3$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3$3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }], pipes: { "translate": i5.TranslatePipe } });
1391
1560
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: TextareaComponent, decorators: [{
1392
1561
  type: Component,
1393
1562
  args: [{
@@ -1452,7 +1621,7 @@ DropdownComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", vers
1452
1621
  useExisting: forwardRef(() => DropdownComponent),
1453
1622
  multi: true
1454
1623
  }
1455
- ], usesOnChanges: true, ngImport: i0, template: "<mat-form-field [class.mat-form-field-invalid]=\"error\">\n <mat-label>{{ label }}</mat-label>\n <mat-select\n [(ngModel)]=\"value\"\n (selectionChange)=\"onValueChanged($event)\"\n [required]=\"required\"\n [disabled]=\"disable\">\n <mat-option value=\"\"></mat-option>\n <mat-option *ngFor=\"let option of dropdownValues\" [value]=\"option.value\">\n {{option.label}}\n </mat-option>\n </mat-select>\n\n <mat-hint *ngIf=\"error\" class=\"error-message\">{{ error }}</mat-hint>\n</mat-form-field>\n", styles: [""], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i2$2.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3$4.MatOption, selector: "mat-option", exportAs: ["matOption"] }], directives: [{ type: i1$6.MatLabel, selector: "mat-label" }, { type: i5$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i5$2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }] });
1624
+ ], usesOnChanges: true, ngImport: i0, template: "<mat-form-field [class.mat-form-field-invalid]=\"error\">\n <mat-label>{{ label | translate }}</mat-label>\n <mat-select\n [(ngModel)]=\"value\"\n (selectionChange)=\"onValueChanged($event)\"\n [required]=\"required\"\n [disabled]=\"disable\">\n <mat-option value=\"\"></mat-option>\n <mat-option *ngFor=\"let option of dropdownValues\" [value]=\"option.value\">\n {{option.label}}\n </mat-option>\n </mat-select>\n\n <mat-hint *ngIf=\"error\" class=\"error-message\">{{ error }}</mat-hint>\n</mat-form-field>\n", styles: [""], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i2$3.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { type: i3$4.MatOption, selector: "mat-option", exportAs: ["matOption"] }], directives: [{ type: i1$6.MatLabel, selector: "mat-label" }, { type: i3$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3$3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }], pipes: { "translate": i5.TranslatePipe } });
1456
1625
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DropdownComponent, decorators: [{
1457
1626
  type: Component,
1458
1627
  args: [{
@@ -1536,7 +1705,7 @@ DatepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ve
1536
1705
  useExisting: forwardRef(() => DatepickerComponent),
1537
1706
  multi: true
1538
1707
  }
1539
- ], ngImport: i0, template: "<mat-form-field [class.mat-form-field-invalid]=\"error\">\n <mat-label>{{ label }}</mat-label>\n <input matInput\n [matDatepicker]=\"picker\"\n [(ngModel)]=\"selectedDate\"\n (change)=\"onDateEntered($event)\"\n [required]=\"required\"\n [disabled]=\"disable\"\n (dateChange)=\"onDateSelected($event.value)\"\n autocomplete=\"off\">\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n\n <mat-hint *ngIf=\"error\" class=\"error-message\">{{ error }}</mat-hint>\n</mat-form-field>\n", styles: [""], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i2$3.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["tabIndex", "disabled", "for", "aria-label", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { type: i2$3.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }], directives: [{ type: i1$6.MatLabel, selector: "mat-label" }, { type: i4$2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i2$3.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { type: i5$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i5$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i5$2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i1$6.MatSuffix, selector: "[matSuffix]" }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }] });
1708
+ ], ngImport: i0, template: "<mat-form-field [class.mat-form-field-invalid]=\"error\">\n <mat-label>{{ label | translate }}</mat-label>\n <input matInput\n [matDatepicker]=\"picker\"\n [(ngModel)]=\"selectedDate\"\n (change)=\"onDateEntered($event)\"\n [required]=\"required\"\n [disabled]=\"disable\"\n (dateChange)=\"onDateSelected($event.value)\"\n autocomplete=\"off\">\n <mat-datepicker-toggle matSuffix [for]=\"picker\" tabindex=\"-1\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n\n <mat-hint *ngIf=\"error\" class=\"error-message\">{{ error }}</mat-hint>\n</mat-form-field>\n", styles: [""], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i2$4.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["tabIndex", "disabled", "for", "aria-label", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { type: i2$4.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }], directives: [{ type: i1$6.MatLabel, selector: "mat-label" }, { type: i2$2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i2$4.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { type: i3$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3$3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i1$6.MatSuffix, selector: "[matSuffix]" }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }], pipes: { "translate": i5.TranslatePipe } });
1540
1709
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DatepickerComponent, decorators: [{
1541
1710
  type: Component,
1542
1711
  args: [{
@@ -1618,7 +1787,7 @@ DatetimepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0"
1618
1787
  useExisting: forwardRef(() => DatetimepickerComponent),
1619
1788
  multi: true
1620
1789
  }
1621
- ], ngImport: i0, template: "<mat-form-field [class.mat-form-field-invalid]=\"error\">\n <mat-label>{{ label }}</mat-label>\n <input matInput\n [ngxMatDatetimePicker]=\"picker\"\n [(ngModel)]=\"selectedDateTime\"\n (change)=\"onDateTimeEntered($event)\"\n [required]=\"required\"\n [disabled]=\"disable\"\n (dateChange)=\"onDateTimeSelected($event.value)\"\n autocomplete=\"off\">\n <mat-datepicker-toggle matSuffix [for]=\"$any(picker)\"></mat-datepicker-toggle>\n <ngx-mat-datetime-picker #picker [defaultTime]=\"[8,0,0]\"></ngx-mat-datetime-picker>\n\n <mat-hint *ngIf=\"error\" class=\"error-message\">{{ error }}</mat-hint>\n</mat-form-field>\n", styles: [""], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i2$3.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["tabIndex", "disabled", "for", "aria-label", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { type: i3$5.NgxMatDatetimePicker, selector: "ngx-mat-datetime-picker", inputs: ["startView", "startAt", "defaultColor", "color", "touchUi", "hideTime", "disabled", "opened", "showSpinners", "showSeconds", "stepHour", "stepMinute", "stepSecond", "enableMeridian", "disableMinute", "defaultTime", "calendarHeaderComponent", "panelClass", "dateClass"], outputs: ["yearSelected", "monthSelected", "opened", "closed"], exportAs: ["ngxMatDatetimePicker"] }], directives: [{ type: i1$6.MatLabel, selector: "mat-label" }, { type: i4$2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i3$5.NgxMatDatetimeInput, selector: "input[ngxMatDatetimePicker]", inputs: ["value", "ngxMatDatetimePicker", "ngxMatDatetimePickerFilter", "min", "max", "disabled"], outputs: ["dateChange", "dateInput"], exportAs: ["ngxMatDatetimePickerInput"] }, { type: i5$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i5$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i5$2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i1$6.MatSuffix, selector: "[matSuffix]" }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }] });
1790
+ ], ngImport: i0, template: "<mat-form-field [class.mat-form-field-invalid]=\"error\">\n <mat-label>{{ label | translate }}</mat-label>\n <input matInput\n [ngxMatDatetimePicker]=\"picker\"\n [(ngModel)]=\"selectedDateTime\"\n (change)=\"onDateTimeEntered($event)\"\n [required]=\"required\"\n [disabled]=\"disable\"\n (dateChange)=\"onDateTimeSelected($event.value)\"\n autocomplete=\"off\">\n <mat-datepicker-toggle matSuffix [for]=\"$any(picker)\" tabindex=\"-1\"></mat-datepicker-toggle>\n <ngx-mat-datetime-picker #picker [defaultTime]=\"[8,0,0]\"></ngx-mat-datetime-picker>\n\n <mat-hint *ngIf=\"error\" class=\"error-message\">{{ error }}</mat-hint>\n</mat-form-field>\n", styles: [""], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i2$4.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["tabIndex", "disabled", "for", "aria-label", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { type: i3$5.NgxMatDatetimePicker, selector: "ngx-mat-datetime-picker", inputs: ["startView", "startAt", "defaultColor", "color", "touchUi", "hideTime", "disabled", "opened", "showSpinners", "showSeconds", "stepHour", "stepMinute", "stepSecond", "enableMeridian", "disableMinute", "defaultTime", "calendarHeaderComponent", "panelClass", "dateClass"], outputs: ["yearSelected", "monthSelected", "opened", "closed"], exportAs: ["ngxMatDatetimePicker"] }], directives: [{ type: i1$6.MatLabel, selector: "mat-label" }, { type: i2$2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i3$5.NgxMatDatetimeInput, selector: "input[ngxMatDatetimePicker]", inputs: ["value", "ngxMatDatetimePicker", "ngxMatDatetimePickerFilter", "min", "max", "disabled"], outputs: ["dateChange", "dateInput"], exportAs: ["ngxMatDatetimePickerInput"] }, { type: i3$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3$3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i1$6.MatSuffix, selector: "[matSuffix]" }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }], pipes: { "translate": i5.TranslatePipe } });
1622
1791
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DatetimepickerComponent, decorators: [{
1623
1792
  type: Component,
1624
1793
  args: [{
@@ -1643,6 +1812,78 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
1643
1812
  type: Input
1644
1813
  }] } });
1645
1814
 
1815
+ class TimeInputComponent {
1816
+ constructor() {
1817
+ this.value = null;
1818
+ this.onChange = (newValue) => { };
1819
+ this.onTouched = () => { };
1820
+ }
1821
+ registerOnChange(fn) { this.onChange = fn; }
1822
+ registerOnTouched(fn) { this.onTouched = fn; }
1823
+ ngOnChanges() { }
1824
+ writeValue(newValue) {
1825
+ this.value = newValue;
1826
+ this.onChange(newValue);
1827
+ }
1828
+ onValueChanged(event) {
1829
+ this.onChange(this.value);
1830
+ }
1831
+ validate(control) {
1832
+ if (!control.value) {
1833
+ this.errorMessage = this.error;
1834
+ return null;
1835
+ }
1836
+ this.errorMessage = '';
1837
+ if (control.value === null || control.value === '')
1838
+ return null;
1839
+ if (/^([0-1][0-9]|2[0-3]):[0-5][0-9]$/.test(control.value))
1840
+ return null;
1841
+ this.errorMessage = 'must have format HH:mm';
1842
+ return [this.errorMessage];
1843
+ }
1844
+ }
1845
+ TimeInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: TimeInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1846
+ TimeInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: TimeInputComponent, selector: "mantle-time-input", inputs: { label: "label", disable: "disable", required: "required", error: "error" }, providers: [
1847
+ {
1848
+ provide: NG_VALUE_ACCESSOR,
1849
+ useExisting: forwardRef(() => TimeInputComponent),
1850
+ multi: true
1851
+ },
1852
+ {
1853
+ provide: NG_VALIDATORS,
1854
+ useExisting: forwardRef(() => TimeInputComponent),
1855
+ multi: true,
1856
+ },
1857
+ ], usesOnChanges: true, ngImport: i0, template: "<mat-form-field [class.mat-form-field-invalid]=\"errorMessage\">\n <mat-label>{{ label | translate }}</mat-label>\n <input matInput\n type=\"text\"\n [(ngModel)]=\"value\"\n (keyup)=\"onValueChanged($event)\"\n (change)=\"onValueChanged($event)\"\n [required]=\"required\"\n [disabled]=\"disable\"\n autocomplete=\"off\">\n\n <mat-hint *ngIf=\"errorMessage\" class=\"error-message\">{{ errorMessage }}</mat-hint>\n</mat-form-field>\n", styles: ["input{text-align:right}\n"], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }], directives: [{ type: i1$6.MatLabel, selector: "mat-label" }, { type: i2$2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i3$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3$3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }], pipes: { "translate": i5.TranslatePipe } });
1858
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: TimeInputComponent, decorators: [{
1859
+ type: Component,
1860
+ args: [{
1861
+ selector: 'mantle-time-input',
1862
+ templateUrl: './time-input.component.html',
1863
+ styleUrls: ['./time-input.component.scss'],
1864
+ providers: [
1865
+ {
1866
+ provide: NG_VALUE_ACCESSOR,
1867
+ useExisting: forwardRef(() => TimeInputComponent),
1868
+ multi: true
1869
+ },
1870
+ {
1871
+ provide: NG_VALIDATORS,
1872
+ useExisting: forwardRef(() => TimeInputComponent),
1873
+ multi: true,
1874
+ },
1875
+ ]
1876
+ }]
1877
+ }], ctorParameters: function () { return []; }, propDecorators: { label: [{
1878
+ type: Input
1879
+ }], disable: [{
1880
+ type: Input
1881
+ }], required: [{
1882
+ type: Input
1883
+ }], error: [{
1884
+ type: Input
1885
+ }] } });
1886
+
1646
1887
  class NumberInputComponent {
1647
1888
  constructor() {
1648
1889
  this.value = null;
@@ -1695,7 +1936,7 @@ NumberInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", v
1695
1936
  useExisting: forwardRef(() => NumberInputComponent),
1696
1937
  multi: true,
1697
1938
  },
1698
- ], usesOnChanges: true, ngImport: i0, template: "<mat-form-field [class.mat-form-field-invalid]=\"errorMessage\">\n <mat-label>{{ label }}</mat-label>\n <input matInput\n type=\"number\"\n [(ngModel)]=\"value\"\n (keyup)=\"onValueChanged($event)\"\n (change)=\"onValueChanged($event)\"\n [required]=\"required\"\n [disabled]=\"disable\"\n autocomplete=\"off\">\n\n <mat-hint *ngIf=\"errorMessage\" class=\"error-message\">{{ errorMessage }}</mat-hint>\n</mat-form-field>\n", styles: ["input{text-align:right}\n"], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }], directives: [{ type: i1$6.MatLabel, selector: "mat-label" }, { type: i4$2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i5$2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i5$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i5$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i5$2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }] });
1939
+ ], usesOnChanges: true, ngImport: i0, template: "<mat-form-field [class.mat-form-field-invalid]=\"errorMessage\">\n <mat-label>{{ label | translate }}</mat-label>\n <input matInput\n type=\"number\"\n [(ngModel)]=\"value\"\n (keyup)=\"onValueChanged($event)\"\n (change)=\"onValueChanged($event)\"\n [required]=\"required\"\n [disabled]=\"disable\"\n autocomplete=\"off\">\n\n <mat-hint *ngIf=\"errorMessage\" class=\"error-message\">{{ errorMessage }}</mat-hint>\n</mat-form-field>\n", styles: ["input{text-align:right}\n"], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }], directives: [{ type: i1$6.MatLabel, selector: "mat-label" }, { type: i2$2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i3$3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i3$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3$3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }], pipes: { "translate": i5.TranslatePipe } });
1699
1940
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: NumberInputComponent, decorators: [{
1700
1941
  type: Component,
1701
1942
  args: [{
@@ -1784,7 +2025,7 @@ FilepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ve
1784
2025
  useExisting: forwardRef(() => FilepickerComponent),
1785
2026
  multi: true
1786
2027
  }
1787
- ], viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: "<mat-form-field [class.mat-form-field-invalid]=\"error\">\n <mat-label>{{ label }}</mat-label>\n <input matInput\n type=\"text\"\n [attr.value]=\"currentAttachment?.filename\"\n (click)=\"fileInput.click()\"\n [required]=\"required\"\n [disabled]=\"disable\"\n autocomplete=\"off\">\n\n <button *ngIf=\"currentAttachment?.filename\" mat-icon-button matSuffix (click)=\"clearAttachment()\" [disabled]=\"disable\" click-stop-propagation>\n <mat-icon>close</mat-icon>\n </button>\n\n <button *ngIf=\"!uploadInProgress\" mat-icon-button matSuffix (click)=\"fileInput.click()\" [disabled]=\"disable\">\n <mat-icon>attach_file</mat-icon>\n </button>\n\n <mat-spinner *ngIf=\"uploadInProgress\" matSuffix [diameter]=\"18\"></mat-spinner>\n\n <input #fileInput\n type=\"file\"\n hidden\n (change)=\"onFileSelected($event)\">\n\n <mat-hint *ngIf=\"error\" class=\"error-message\">{{ error }}</mat-hint>\n</mat-form-field>\n", styles: [""], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i6.MatSpinner, selector: "mat-spinner", inputs: ["color"] }], directives: [{ type: i1$6.MatLabel, selector: "mat-label" }, { type: i4$2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatSuffix, selector: "[matSuffix]" }, { type: ClickStopPropagationDirective, selector: "[click-stop-propagation]" }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }] });
2028
+ ], viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], ngImport: i0, template: "<mat-form-field [class.mat-form-field-invalid]=\"error\">\n <mat-label>{{ label | translate }}</mat-label>\n <input matInput\n type=\"text\"\n [attr.value]=\"currentAttachment?.filename\"\n (click)=\"fileInput.click()\"\n [required]=\"required\"\n [disabled]=\"disable\"\n autocomplete=\"off\">\n\n <button *ngIf=\"currentAttachment?.filename\" mat-icon-button matSuffix tabindex=\"-1\" (click)=\"clearAttachment()\" [disabled]=\"disable\" click-stop-propagation>\n <mat-icon>close</mat-icon>\n </button>\n\n <button *ngIf=\"!uploadInProgress\" mat-icon-button matSuffix tabindex=\"-1\" (click)=\"fileInput.click()\" [disabled]=\"disable\">\n <mat-icon>attach_file</mat-icon>\n </button>\n\n <mat-spinner *ngIf=\"uploadInProgress\" matSuffix [diameter]=\"18\"></mat-spinner>\n\n <input #fileInput\n type=\"file\"\n hidden\n (change)=\"onFileSelected($event)\">\n\n <mat-hint *ngIf=\"error\" class=\"error-message\">{{ error }}</mat-hint>\n</mat-form-field>\n", styles: [""], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i6.MatSpinner, selector: "mat-spinner", inputs: ["color"] }], directives: [{ type: i1$6.MatLabel, selector: "mat-label" }, { type: i2$2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatSuffix, selector: "[matSuffix]" }, { type: ClickStopPropagationDirective, selector: "[click-stop-propagation]" }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }], pipes: { "translate": i5.TranslatePipe } });
1788
2029
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: FilepickerComponent, decorators: [{
1789
2030
  type: Component,
1790
2031
  args: [{
@@ -1842,7 +2083,7 @@ class ImageCropperComponent {
1842
2083
  }
1843
2084
  }
1844
2085
  ImageCropperComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ImageCropperComponent, deps: [{ token: i1$3.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
1845
- ImageCropperComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: ImageCropperComponent, selector: "mantle-image-cropper", ngImport: i0, template: "<div mat-dialog-title fxLayout=\"row\" fxLayoutAlign=\"center center\" class=\"dialog-title-section\">\n <h2 fxFlex=\"1 1 auto\">Crop Image</h2>\n <button fxFlex=\"0 0 auto\" mat-icon-button tabindex=\"-1\" (click)=\"onCancel()\">\n <mat-icon>cancel</mat-icon>\n </button>\n</div>\n<mat-dialog-content>\n <div class=\"cropper-wrapper\" fxLayout=\"row\" fxLayoutAlign=\"start\" fxLayoutGap=\"32px\">\n <div fxFlex=\"1 0 1px\">\n <h5>Original</h5>\n </div>\n <div fxFlex=\"0 0 100px\">\n <h5>Preview</h5>\n </div>\n </div>\n\n <div class=\"cropper-wrapper\" fxLayout=\"row\" fxLayoutAlign=\"start\" fxLayoutGap=\"32px\">\n\n <image-cropper\n [imageChangedEvent]=\"imageChangedEvent\"\n [maintainAspectRatio]=\"maintainAspectRatio\"\n [aspectRatio]=\"aspectRatio\"\n [resizeToWidth]=\"resizeToWidth\"\n format=\"png\"\n (imageCropped)=\"imageCropped($event)\"\n (loadImageFailed)=\"loadImageFailed()\">\n </image-cropper>\n\n <div fxFlex=\"0 0 100px\" class=\"preview-section\">\n <img [src]=\"croppedImage\" />\n </div>\n </div>\n</mat-dialog-content>\n<mat-dialog-actions fxLayout=\"row\" fxLayoutAlign=\"end\" class=\"actions-section\">\n <button fxFlex=\"0 0 auto\" mat-button (click)=\"onCropComplete()\">Save</button>\n</mat-dialog-actions>\n", styles: [".dialog-title-section h2{margin:0;padding-left:16px}.cropper-wrapper{max-width:532px}.preview-section img{width:100%;border:1px solid lightgrey}.actions-section button{text-transform:uppercase}\n"], components: [{ type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i4$3.ImageCropperComponent, selector: "image-cropper", inputs: ["format", "transform", "maintainAspectRatio", "aspectRatio", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "autoCrop", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "cropper", "alignImage", "disabled", "imageChangedEvent", "imageURL", "imageBase64", "imageFile"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed"] }], directives: [{ type: i1$3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i1$3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i4$1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i1$3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }] });
2086
+ ImageCropperComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: ImageCropperComponent, selector: "mantle-image-cropper", ngImport: i0, template: "<div mat-dialog-title fxLayout=\"row\" fxLayoutAlign=\"center center\" class=\"dialog-title-section\">\n <h2 fxFlex=\"1 1 auto\">{{ 'mantle.image_cropper.crop_image' | translate }}</h2>\n <button fxFlex=\"0 0 auto\" mat-icon-button tabindex=\"-1\" (click)=\"onCancel()\">\n <mat-icon>cancel</mat-icon>\n </button>\n</div>\n<mat-dialog-content>\n <div class=\"cropper-wrapper\" fxLayout=\"row\" fxLayoutAlign=\"start\" fxLayoutGap=\"32px\">\n <div fxFlex=\"1 0 1px\">\n <h5>{{ 'mantle.image_cropper.original' | translate }}</h5>\n </div>\n <div fxFlex=\"0 0 100px\">\n <h5>{{ 'mantle.image_cropper.preview' | translate }}</h5>\n </div>\n </div>\n\n <div class=\"cropper-wrapper\" fxLayout=\"row\" fxLayoutAlign=\"start\" fxLayoutGap=\"32px\">\n\n <image-cropper\n [imageChangedEvent]=\"imageChangedEvent\"\n [maintainAspectRatio]=\"maintainAspectRatio\"\n [aspectRatio]=\"aspectRatio\"\n [resizeToWidth]=\"resizeToWidth\"\n format=\"png\"\n (imageCropped)=\"imageCropped($event)\"\n (loadImageFailed)=\"loadImageFailed()\">\n </image-cropper>\n\n <div fxFlex=\"0 0 100px\" class=\"preview-section\">\n <img [src]=\"croppedImage\" />\n </div>\n </div>\n</mat-dialog-content>\n<mat-dialog-actions fxLayout=\"row\" fxLayoutAlign=\"end\" class=\"actions-section\">\n <button fxFlex=\"0 0 auto\" mat-button (click)=\"onCropComplete()\">{{ 'mantle.buttons.save' | translate }}</button>\n</mat-dialog-actions>\n", styles: [".dialog-title-section h2{margin:0;padding-left:16px}.cropper-wrapper{max-width:532px}.preview-section img{width:100%;border:1px solid lightgrey}.actions-section button{text-transform:uppercase}\n"], components: [{ type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i4$3.ImageCropperComponent, selector: "image-cropper", inputs: ["format", "transform", "maintainAspectRatio", "aspectRatio", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "autoCrop", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "cropper", "alignImage", "disabled", "imageChangedEvent", "imageURL", "imageBase64", "imageFile"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed"] }], directives: [{ type: i1$3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i1$3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i4$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i1$3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }], pipes: { "translate": i5.TranslatePipe } });
1846
2087
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ImageCropperComponent, decorators: [{
1847
2088
  type: Component,
1848
2089
  args: [{
@@ -1949,7 +2190,7 @@ ImagepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", v
1949
2190
  useExisting: forwardRef(() => ImagepickerComponent),
1950
2191
  multi: true
1951
2192
  }
1952
- ], viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<mat-form-field [class.mat-form-field-invalid]=\"error\">\n <mat-label>{{ label }}</mat-label>\n <input matInput\n type=\"text\"\n [attr.value]=\"currentAttachment?.filename\"\n (click)=\"fileInput.click()\"\n [required]=\"required\"\n [disabled]=\"disable\"\n autocomplete=\"off\">\n\n <button *ngIf=\"currentAttachment?.filename\" mat-icon-button matSuffix (click)=\"clearAttachment()\" [disabled]=\"disable\" click-stop-propagation>\n <mat-icon>close</mat-icon>\n </button>\n\n <button *ngIf=\"!uploadInProgress\" mat-icon-button matSuffix (click)=\"fileInput.click()\" [disabled]=\"disable\">\n <mat-icon>image</mat-icon>\n </button>\n\n <mat-spinner *ngIf=\"uploadInProgress\" matSuffix [diameter]=\"18\"></mat-spinner>\n\n <input #fileInput\n type=\"file\"\n accept=\"image/*\"\n hidden\n (change)=\"onFileSelected($event)\">\n\n <mat-hint *ngIf=\"error\" class=\"error-message\">{{ error }}</mat-hint>\n</mat-form-field>\n", styles: [""], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i6.MatSpinner, selector: "mat-spinner", inputs: ["color"] }], directives: [{ type: i1$6.MatLabel, selector: "mat-label" }, { type: i4$2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatSuffix, selector: "[matSuffix]" }, { type: ClickStopPropagationDirective, selector: "[click-stop-propagation]" }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }] });
2193
+ ], viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<mat-form-field [class.mat-form-field-invalid]=\"error\">\n <mat-label>{{ label | translate }}</mat-label>\n <input matInput\n type=\"text\"\n [attr.value]=\"currentAttachment?.filename\"\n (click)=\"fileInput.click()\"\n [required]=\"required\"\n [disabled]=\"disable\"\n autocomplete=\"off\">\n\n <button *ngIf=\"currentAttachment?.filename\" mat-icon-button matSuffix tabindex=\"-1\" (click)=\"clearAttachment()\" [disabled]=\"disable\" click-stop-propagation>\n <mat-icon>close</mat-icon>\n </button>\n\n <button *ngIf=\"!uploadInProgress\" mat-icon-button matSuffix tabindex=\"-1\" (click)=\"fileInput.click()\" [disabled]=\"disable\">\n <mat-icon>image</mat-icon>\n </button>\n\n <mat-spinner *ngIf=\"uploadInProgress\" matSuffix [diameter]=\"18\"></mat-spinner>\n\n <input #fileInput\n type=\"file\"\n accept=\"image/*\"\n hidden\n (change)=\"onFileSelected($event)\">\n\n <mat-hint *ngIf=\"error\" class=\"error-message\">{{ error }}</mat-hint>\n</mat-form-field>\n", styles: [""], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i6.MatSpinner, selector: "mat-spinner", inputs: ["color"] }], directives: [{ type: i1$6.MatLabel, selector: "mat-label" }, { type: i2$2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatSuffix, selector: "[matSuffix]" }, { type: ClickStopPropagationDirective, selector: "[click-stop-propagation]" }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }], pipes: { "translate": i5.TranslatePipe } });
1953
2194
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ImagepickerComponent, decorators: [{
1954
2195
  type: Component,
1955
2196
  args: [{
@@ -2031,7 +2272,7 @@ ChipInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", ver
2031
2272
  useExisting: forwardRef(() => ChipInputComponent),
2032
2273
  multi: true
2033
2274
  }
2034
- ], ngImport: i0, template: "<mat-form-field [class.mat-form-field-invalid]=\"error\">\n <mat-label>{{ label }}</mat-label>\n <mat-chip-list #chipList\n [disabled]=\"disable\">\n <mat-chip *ngFor=\"let chip of chips\"\n color=\"accent\" selected\n [removable]=\"removable\"\n (removed)=\"remove(chip)\">\n {{ chip.name }}\n <mat-icon matChipRemove *ngIf=\"removable\">cancel</mat-icon>\n </mat-chip>\n\n <input [matChipInputFor]=\"chipList\"\n [matChipInputAddOnBlur]=\"true\"\n (matChipInputTokenEnd)=\"add($event)\"\n autocomplete=\"off\">\n </mat-chip-list>\n\n <mat-hint *ngIf=\"error\" class=\"error-message\">{{ error }}</mat-hint>\n</mat-form-field>\n", styles: [""], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i2.MatChipList, selector: "mat-chip-list", inputs: ["aria-orientation", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "selectable", "tabIndex", "errorStateMatcher"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i1$6.MatLabel, selector: "mat-label" }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.MatChipRemove, selector: "[matChipRemove]" }, { type: i2.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputSeparatorKeyCodes", "placeholder", "id", "matChipInputFor", "matChipInputAddOnBlur", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }] });
2275
+ ], ngImport: i0, template: "<mat-form-field [class.mat-form-field-invalid]=\"error\">\n <mat-label>{{ label | translate }}</mat-label>\n <mat-chip-list #chipList\n [disabled]=\"disable\">\n <mat-chip *ngFor=\"let chip of chips\"\n color=\"accent\" selected\n [removable]=\"removable\"\n (removed)=\"remove(chip)\">\n {{ chip.name }}\n <mat-icon matChipRemove *ngIf=\"removable\">cancel</mat-icon>\n </mat-chip>\n\n <input [matChipInputFor]=\"chipList\"\n [matChipInputAddOnBlur]=\"true\"\n (matChipInputTokenEnd)=\"add($event)\"\n autocomplete=\"off\">\n </mat-chip-list>\n\n <mat-hint *ngIf=\"error\" class=\"error-message\">{{ error }}</mat-hint>\n</mat-form-field>\n", styles: [""], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i2.MatChipList, selector: "mat-chip-list", inputs: ["aria-orientation", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "selectable", "tabIndex", "errorStateMatcher"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i1$6.MatLabel, selector: "mat-label" }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.MatChipRemove, selector: "[matChipRemove]" }, { type: i2.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputSeparatorKeyCodes", "placeholder", "id", "matChipInputFor", "matChipInputAddOnBlur", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }], pipes: { "translate": i5.TranslatePipe } });
2035
2276
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ChipInputComponent, decorators: [{
2036
2277
  type: Component,
2037
2278
  args: [{
@@ -2080,7 +2321,7 @@ PasswordInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
2080
2321
  useExisting: forwardRef(() => PasswordInputComponent),
2081
2322
  multi: true
2082
2323
  }
2083
- ], ngImport: i0, template: "<mat-form-field [class.mat-form-field-invalid]=\"error\">\n <mat-label>{{ label }}</mat-label>\n <input matInput\n [type]=\"hide ? 'password' : 'text'\"\n [(ngModel)]=\"value\"\n (keyup)=\"onValueChanged($event)\"\n (change)=\"onValueChanged($event)\"\n [required]=\"required\"\n [disabled]=\"disable\"\n autocomplete=\"off\">\n\n <button mat-icon-button matSuffix type=\"button\" (click)=\"hide = !hide\">\n <mat-icon>{{hide ? 'visibility_off' : 'visibility'}}</mat-icon>\n </button>\n\n <mat-hint *ngIf=\"error\" class=\"error-message\">{{ error }}</mat-hint>\n</mat-form-field>\n", styles: [""], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i1$6.MatLabel, selector: "mat-label" }, { type: i4$2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i5$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i5$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i5$2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i1$6.MatSuffix, selector: "[matSuffix]" }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }] });
2324
+ ], ngImport: i0, template: "<mat-form-field [class.mat-form-field-invalid]=\"error\">\n <mat-label>{{ label | translate }}</mat-label>\n <input matInput\n [type]=\"hide ? 'password' : 'text'\"\n [(ngModel)]=\"value\"\n (keyup)=\"onValueChanged($event)\"\n (change)=\"onValueChanged($event)\"\n [required]=\"required\"\n [disabled]=\"disable\"\n autocomplete=\"off\">\n\n <button mat-icon-button matSuffix type=\"button\" tabindex=\"-1\" (click)=\"hide = !hide\">\n <mat-icon>{{hide ? 'visibility_off' : 'visibility'}}</mat-icon>\n </button>\n\n <mat-hint *ngIf=\"error\" class=\"error-message\">{{ error }}</mat-hint>\n</mat-form-field>\n", styles: [""], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i1$6.MatLabel, selector: "mat-label" }, { type: i2$2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i3$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3$3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i1$6.MatSuffix, selector: "[matSuffix]" }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }], pipes: { "translate": i5.TranslatePipe } });
2084
2325
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: PasswordInputComponent, decorators: [{
2085
2326
  type: Component,
2086
2327
  args: [{
@@ -2125,7 +2366,7 @@ MarkdownInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0",
2125
2366
  useExisting: forwardRef(() => MarkdownInputComponent),
2126
2367
  multi: true
2127
2368
  }
2128
- ], ngImport: i0, template: "<div class=\"markdown-input-disabled\" *ngIf=\"disable\">\n <mat-form-field [class.mat-form-field-invalid]=\"error\">\n <mat-label>{{ label }}</mat-label>\n\n <markdown ngPreserveWhitespaces>\n {{ value }}\n </markdown>\n\n <input matInput\n type=\"text\"\n [(ngModel)]=\"value\"\n [required]=\"required\"\n [disabled]=true\n [hidden]=true\n autocomplete=\"off\">\n\n <mat-hint *ngIf=\"error\" class=\"error-message\">{{ error }}</mat-hint>\n </mat-form-field>\n</div>\n", styles: [".markdown-input-disabled ::ng-deep .mat-form-field-underline{display:none}\n"], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i1$5.MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "emoji", "katex", "katexOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start"], outputs: ["error", "load", "ready"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatLabel, selector: "mat-label" }, { type: i4$2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i5$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i5$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i5$2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }] });
2369
+ ], ngImport: i0, template: "<div class=\"markdown-input-disabled\" *ngIf=\"disable\">\n <mat-form-field [class.mat-form-field-invalid]=\"error\">\n <mat-label>{{ label | translate }}</mat-label>\n\n <markdown ngPreserveWhitespaces>\n {{ value }}\n </markdown>\n\n <input matInput\n type=\"text\"\n [(ngModel)]=\"value\"\n [required]=\"required\"\n [disabled]=true\n [hidden]=true\n autocomplete=\"off\">\n\n <mat-hint *ngIf=\"error\" class=\"error-message\">{{ error }}</mat-hint>\n </mat-form-field>\n</div>\n", styles: [".markdown-input-disabled ::ng-deep .mat-form-field-underline{display:none}\n"], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i1$5.MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "emoji", "katex", "katexOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start"], outputs: ["error", "load", "ready"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatLabel, selector: "mat-label" }, { type: i2$2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i3$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3$3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }], pipes: { "translate": i5.TranslatePipe } });
2129
2370
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: MarkdownInputComponent, decorators: [{
2130
2371
  type: Component,
2131
2372
  args: [{
@@ -2182,7 +2423,7 @@ AutocompleteInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0
2182
2423
  useExisting: forwardRef(() => AutocompleteInputComponent),
2183
2424
  multi: true
2184
2425
  }
2185
- ], ngImport: i0, template: "<mat-form-field [class.mat-form-field-invalid]=\"error\">\n <mat-label>{{ label }}</mat-label>\n <input matInput\n type=\"text\"\n [(ngModel)]=\"value\"\n (keyup)=\"onValueChanged($event)\"\n (change)=\"onValueChanged($event)\"\n [required]=\"required\"\n [disabled]=\"disable\"\n [matAutocomplete]=\"auto\">\n\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"onValueChanged($event)\">\n <mat-option *ngFor=\"let option of filteredOptions$ | async\" [value]=\"option.value\">\n {{option.label}}\n </mat-option>\n </mat-autocomplete>\n\n <mat-hint *ngIf=\"error\" class=\"error-message\">{{ error }}</mat-hint>\n</mat-form-field>\n", styles: [""], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i2$4.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { type: i3$4.MatOption, selector: "mat-option", exportAs: ["matOption"] }], directives: [{ type: i1$6.MatLabel, selector: "mat-label" }, { type: i4$2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i5$2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i2$4.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { type: i5$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i5$2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }], pipes: { "async": i4.AsyncPipe } });
2426
+ ], ngImport: i0, template: "<mat-form-field [class.mat-form-field-invalid]=\"error\">\n <mat-label>{{ label | translate }}</mat-label>\n <input matInput\n type=\"text\"\n [(ngModel)]=\"value\"\n (keyup)=\"onValueChanged($event)\"\n (change)=\"onValueChanged($event)\"\n [required]=\"required\"\n [disabled]=\"disable\"\n [matAutocomplete]=\"auto\">\n\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"onValueChanged($event)\">\n <mat-option *ngFor=\"let option of filteredOptions$ | async\" [value]=\"option.value\">\n {{option.label}}\n </mat-option>\n </mat-autocomplete>\n\n <mat-hint *ngIf=\"error\" class=\"error-message\">{{ error }}</mat-hint>\n</mat-form-field>\n", styles: [""], components: [{ type: i1$6.MatFormField, selector: "mat-form-field", inputs: ["color", "floatLabel", "appearance", "hideRequiredMarker", "hintLabel"], exportAs: ["matFormField"] }, { type: i2$5.MatAutocomplete, selector: "mat-autocomplete", inputs: ["disableRipple"], exportAs: ["matAutocomplete"] }, { type: i3$4.MatOption, selector: "mat-option", exportAs: ["matOption"] }], directives: [{ type: i1$6.MatLabel, selector: "mat-label" }, { type: i2$2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["id", "disabled", "required", "type", "value", "readonly", "placeholder", "errorStateMatcher", "aria-describedby"], exportAs: ["matInput"] }, { type: i3$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i2$5.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", exportAs: ["matAutocompleteTrigger"] }, { type: i3$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3$3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }], pipes: { "translate": i5.TranslatePipe, "async": i4.AsyncPipe } });
2186
2427
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: AutocompleteInputComponent, decorators: [{
2187
2428
  type: Component,
2188
2429
  args: [{
@@ -2212,7 +2453,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
2212
2453
  class DynamicFormFieldComponent {
2213
2454
  }
2214
2455
  DynamicFormFieldComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DynamicFormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2215
- DynamicFormFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DynamicFormFieldComponent, selector: "mantle-dynamic-form-field", inputs: { field: "field", form: "form", error: "error" }, ngImport: i0, template: "<div [formGroup]=\"form\">\n <ng-container [ngSwitch]=\"field.type\">\n\n <mantle-text-input *ngSwitchCase=\"'string'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-text-input>\n\n <mantle-text-input *ngSwitchCase=\"'string-lg'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-text-input>\n\n <mantle-textarea *ngSwitchCase=\"'text'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [rows]=\"6\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-textarea>\n\n <mantle-dropdown *ngSwitchCase=\"'dropdown'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [options]=\"field.options\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-dropdown>\n\n <mantle-datepicker *ngSwitchCase=\"'date'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-datepicker>\n\n <mantle-datetimepicker *ngSwitchCase=\"'datetime'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-datetimepicker>\n\n <mantle-number-input *ngSwitchCase=\"'number'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [options]=\"field.options\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-number-input>\n\n <mantle-number-input *ngSwitchCase=\"'currency'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-number-input>\n\n <mantle-filepicker *ngSwitchCase=\"'file'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-filepicker>\n\n <mantle-imagepicker *ngSwitchCase=\"'image'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [options]=\"field.options\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-imagepicker>\n\n <mantle-chip-input *ngSwitchCase=\"'chips'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-chip-input>\n\n <mantle-password-input *ngSwitchCase=\"'password'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-password-input>\n\n <mantle-markdown-input *ngSwitchCase=\"'markdown'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-markdown-input>\n\n <mantle-autocomplete-input *ngSwitchCase=\"'autocomplete'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [options]=\"field.options\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-autocomplete-input>\n\n </ng-container>\n</div>\n", styles: [""], components: [{ type: TextInputComponent, selector: "mantle-text-input", inputs: ["label", "disable", "required", "error"] }, { type: TextareaComponent, selector: "mantle-textarea", inputs: ["label", "rows", "disable", "required", "error"] }, { type: DropdownComponent, selector: "mantle-dropdown", inputs: ["label", "options", "disable", "required", "error"] }, { type: DatepickerComponent, selector: "mantle-datepicker", inputs: ["label", "disable", "required", "error"] }, { type: DatetimepickerComponent, selector: "mantle-datetimepicker", inputs: ["label", "disable", "required", "error"] }, { type: NumberInputComponent, selector: "mantle-number-input", inputs: ["label", "options", "disable", "required", "error"] }, { type: FilepickerComponent, selector: "mantle-filepicker", inputs: ["label", "disable", "required", "error"] }, { type: ImagepickerComponent, selector: "mantle-imagepicker", inputs: ["label", "options", "disable", "required", "error"] }, { type: ChipInputComponent, selector: "mantle-chip-input", inputs: ["label", "disable", "required", "error"] }, { type: PasswordInputComponent, selector: "mantle-password-input", inputs: ["label", "disable", "required", "error"] }, { type: MarkdownInputComponent, selector: "mantle-markdown-input", inputs: ["label", "disable", "required", "error"] }, { type: AutocompleteInputComponent, selector: "mantle-autocomplete-input", inputs: ["label", "options", "disable", "required", "error"] }], directives: [{ type: i5$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i5$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i5$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i5$2.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }, { type: i5$2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }] });
2456
+ DynamicFormFieldComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DynamicFormFieldComponent, selector: "mantle-dynamic-form-field", inputs: { field: "field", form: "form", error: "error" }, ngImport: i0, template: "<div [formGroup]=\"form\" [class.with-tooltip]=\"field.tooltip\">\n <ng-container [ngSwitch]=\"field.type\">\n\n <mantle-text-input *ngSwitchCase=\"'string'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-text-input>\n\n <mantle-text-input *ngSwitchCase=\"'string-md'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-text-input>\n\n <mantle-text-input *ngSwitchCase=\"'string-lg'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-text-input>\n\n <mantle-textarea *ngSwitchCase=\"'text'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [rows]=\"6\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-textarea>\n\n <mantle-dropdown *ngSwitchCase=\"'dropdown'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [options]=\"field.options\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-dropdown>\n\n <mantle-datepicker *ngSwitchCase=\"'date'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-datepicker>\n\n <mantle-datetimepicker *ngSwitchCase=\"'datetime'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-datetimepicker>\n\n <mantle-time-input *ngSwitchCase=\"'time'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-time-input>\n\n <mantle-number-input *ngSwitchCase=\"'number'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [options]=\"field.options\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-number-input>\n\n <mantle-number-input *ngSwitchCase=\"'currency'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-number-input>\n\n <mantle-filepicker *ngSwitchCase=\"'file'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-filepicker>\n\n <mantle-imagepicker *ngSwitchCase=\"'image'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [options]=\"field.options\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-imagepicker>\n\n <mantle-chip-input *ngSwitchCase=\"'chips'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-chip-input>\n\n <mantle-chip-input *ngSwitchCase=\"'chips-lg'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-chip-input>\n\n <mantle-password-input *ngSwitchCase=\"'password'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-password-input>\n\n <mantle-markdown-input *ngSwitchCase=\"'markdown'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-markdown-input>\n\n <mantle-autocomplete-input *ngSwitchCase=\"'autocomplete'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [options]=\"field.options\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-autocomplete-input>\n\n <mantle-text-input *ngSwitchCase=\"'link'\"\n [id]=\"field.attr\"\n [formControlName]=\"field.attr\"\n [label]=\"field.label\"\n [required]=\"field.required\"\n [disable]=\"field.disabled\"\n [error]=\"error\">\n </mantle-text-input>\n\n <button *ngIf=\"field.tooltip\"\n mat-icon-button\n disabled\n disabledInteractive\n disableRipple\n [matTooltip]=\"field.tooltip\"\n matTooltipPosition=\"right\">\n <mat-icon>help</mat-icon>\n </button>\n </ng-container>\n</div>\n", styles: [".with-tooltip mantle-text-input,.with-tooltip mantle-textarea,.with-tooltip mantle-dropdown,.with-tooltip mantle-datepicker,.with-tooltip mantle-datetimepicker,.with-tooltip mantle-time-input,.with-tooltip mantle-number-input,.with-tooltip mantle-filepicker,.with-tooltip mantle-imagepicker,.with-tooltip mantle-chip-input,.with-tooltip mantle-password-input,.with-tooltip mantle-markdown-input,.with-tooltip mantle-autocomplete-input{display:inline-block;width:90%}.with-tooltip .mat-icon-button{width:10%}.with-tooltip .mat-icon-button .mat-icon{font-size:18px}\n"], components: [{ type: TextInputComponent, selector: "mantle-text-input", inputs: ["label", "disable", "required", "error"] }, { type: TextareaComponent, selector: "mantle-textarea", inputs: ["label", "rows", "disable", "required", "error"] }, { type: DropdownComponent, selector: "mantle-dropdown", inputs: ["label", "options", "disable", "required", "error"] }, { type: DatepickerComponent, selector: "mantle-datepicker", inputs: ["label", "disable", "required", "error"] }, { type: DatetimepickerComponent, selector: "mantle-datetimepicker", inputs: ["label", "disable", "required", "error"] }, { type: TimeInputComponent, selector: "mantle-time-input", inputs: ["label", "disable", "required", "error"] }, { type: NumberInputComponent, selector: "mantle-number-input", inputs: ["label", "options", "disable", "required", "error"] }, { type: FilepickerComponent, selector: "mantle-filepicker", inputs: ["label", "disable", "required", "error"] }, { type: ImagepickerComponent, selector: "mantle-imagepicker", inputs: ["label", "options", "disable", "required", "error"] }, { type: ChipInputComponent, selector: "mantle-chip-input", inputs: ["label", "disable", "required", "error"] }, { type: PasswordInputComponent, selector: "mantle-password-input", inputs: ["label", "disable", "required", "error"] }, { type: MarkdownInputComponent, selector: "mantle-markdown-input", inputs: ["label", "disable", "required", "error"] }, { type: AutocompleteInputComponent, selector: "mantle-autocomplete-input", inputs: ["label", "options", "disable", "required", "error"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i3$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i3$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i3$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3$3.FormControlName, selector: "[formControlName]", inputs: ["disabled", "formControlName", "ngModel"], outputs: ["ngModelChange"] }, { type: i3$3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
2216
2457
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DynamicFormFieldComponent, decorators: [{
2217
2458
  type: Component,
2218
2459
  args: [{
@@ -2251,7 +2492,16 @@ class GridFormSectionComponent {
2251
2492
  });
2252
2493
  }
2253
2494
  getColSpanForField(field) {
2254
- return (field.type == 'text' || field.type == 'string-lg' || field.type == 'markdown') ? this.numColumns : 1;
2495
+ if (this.numColumns == 1)
2496
+ return 1;
2497
+ else if (['text', 'markdown'].includes(field.type))
2498
+ return this.numColumns;
2499
+ else if (field.type.endsWith('-lg'))
2500
+ return this.numColumns;
2501
+ else if (field.type.endsWith('-md'))
2502
+ return 2;
2503
+ else
2504
+ return 1;
2255
2505
  }
2256
2506
  getRowSpanForField(field) {
2257
2507
  return (field.type == 'text' || field.type == 'markdown') ? 2 : 1;
@@ -2267,7 +2517,7 @@ class GridFormSectionComponent {
2267
2517
  }
2268
2518
  }
2269
2519
  GridFormSectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: GridFormSectionComponent, deps: [{ token: ScreenSizeService }], target: i0.ɵɵFactoryTarget.Component });
2270
- GridFormSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: GridFormSectionComponent, selector: "mantle-grid-form-section", inputs: { title: "title", section: "section", form: "form", errors: "errors", defaultRowHeight: "defaultRowHeight" }, ngImport: i0, template: "<mantle-section-title *ngIf=\"title\" [title]=\"title\"></mantle-section-title>\n\n<form [formGroup]=\"form\" class=\"grid-form-layout\">\n <mat-grid-list\n [rowHeight]=\"section.rowHeight || defaultRowHeight\"\n [cols]=\"section.singleColumn ? 1 : numColumns\"\n [class.multi-column]=\"section.singleColumn ? false : numColumns > 1\">\n\n <ng-container *ngFor=\"let field of section.elements\">\n <mat-grid-tile *ngIf=\"!field.hidden\" [colspan]=\"section.singleColumn ? 1 : getColSpanForField(field)\" [rowspan]=\"getRowSpanForField(field)\">\n <mantle-dynamic-form-field [field]=\"field\" [form]=\"form\" [error]=\"errors[field.attr]\"></mantle-dynamic-form-field>\n </mat-grid-tile>\n </ng-container>\n\n </mat-grid-list>\n</form>\n", styles: ["mantle-dynamic-form-field{height:100%}\n"], components: [{ type: SectionTitleComponent, selector: "mantle-section-title", inputs: ["title"] }, { type: i3$2.MatGridList, selector: "mat-grid-list", inputs: ["cols", "gutterSize", "rowHeight"], exportAs: ["matGridList"] }, { type: i3$2.MatGridTile, selector: "mat-grid-tile", inputs: ["rowspan", "colspan"], exportAs: ["matGridTile"] }, { type: DynamicFormFieldComponent, selector: "mantle-dynamic-form-field", inputs: ["field", "form", "error"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5$2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i5$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i5$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
2520
+ GridFormSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: GridFormSectionComponent, selector: "mantle-grid-form-section", inputs: { title: "title", section: "section", form: "form", errors: "errors", defaultRowHeight: "defaultRowHeight" }, ngImport: i0, template: "<mantle-section-title *ngIf=\"title\" [title]=\"title\"></mantle-section-title>\n\n<form [formGroup]=\"form\" class=\"grid-form-layout\">\n <mat-grid-list\n [rowHeight]=\"section.rowHeight || defaultRowHeight\"\n [cols]=\"section.singleColumn ? 1 : numColumns\"\n [class.multi-column]=\"section.singleColumn ? false : numColumns > 1\">\n\n <ng-container *ngFor=\"let field of section.elements\">\n <mat-grid-tile *ngIf=\"!field.hidden\" [colspan]=\"section.singleColumn ? 1 : getColSpanForField(field)\" [rowspan]=\"getRowSpanForField(field)\">\n <mantle-dynamic-form-field [field]=\"field\" [form]=\"form\" [error]=\"errors[field.attr]\"></mantle-dynamic-form-field>\n </mat-grid-tile>\n </ng-container>\n\n </mat-grid-list>\n</form>\n", styles: ["mantle-dynamic-form-field{height:100%}\n"], components: [{ type: SectionTitleComponent, selector: "mantle-section-title", inputs: ["title"] }, { type: i3$2.MatGridList, selector: "mat-grid-list", inputs: ["cols", "gutterSize", "rowHeight"], exportAs: ["matGridList"] }, { type: i3$2.MatGridTile, selector: "mat-grid-tile", inputs: ["rowspan", "colspan"], exportAs: ["matGridTile"] }, { type: DynamicFormFieldComponent, selector: "mantle-dynamic-form-field", inputs: ["field", "form", "error"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3$3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i3$3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i3$3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
2271
2521
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: GridFormSectionComponent, decorators: [{
2272
2522
  type: Component,
2273
2523
  args: [{
@@ -2355,6 +2605,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
2355
2605
 
2356
2606
  require('highcharts/modules/item-series')(Highcharts);
2357
2607
  require('highcharts/modules/gantt')(Highcharts);
2608
+ require('highcharts/modules/exporting')(Highcharts);
2358
2609
  class DynamicChartComponent {
2359
2610
  constructor(objectService) {
2360
2611
  this.objectService = objectService;
@@ -2370,11 +2621,15 @@ class DynamicChartComponent {
2370
2621
  plotBackgroundColor: undefined,
2371
2622
  plotBorderWidth: undefined,
2372
2623
  plotShadow: false,
2624
+ styledMode: false,
2373
2625
  type: ''
2374
2626
  },
2375
2627
  credits: {
2376
2628
  enabled: false
2377
2629
  },
2630
+ exporting: {
2631
+ enabled: false
2632
+ },
2378
2633
  plotOptions: {
2379
2634
  column: {
2380
2635
  pointPadding: 0.2,
@@ -2384,6 +2639,7 @@ class DynamicChartComponent {
2384
2639
  minPointLength: 4
2385
2640
  }
2386
2641
  },
2642
+ tooltip: {},
2387
2643
  series: [],
2388
2644
  title: {
2389
2645
  text: ''
@@ -2417,7 +2673,7 @@ class DynamicChartComponent {
2417
2673
  }
2418
2674
  }
2419
2675
  DynamicChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DynamicChartComponent, deps: [{ token: ObjectService }], target: i0.ɵɵFactoryTarget.Component });
2420
- DynamicChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DynamicChartComponent, selector: "mantle-dynamic-chart", inputs: { label: "label", data: "data" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"label\" class=\"header\">\n <p class=\"header-text\">{{ label }}</p>\n</div>\n\n<highcharts-chart\n [Highcharts]=\"Highcharts\"\n [constructorType]=\"chartConstructor\"\n [options]=\"chartOptions\"\n [(update)]=\"updateFlag\"\n [oneToOne]=\"oneToOneFlag\"\n [callbackFunction]=\"chartCallback\">\n</highcharts-chart>\n", styles: [".header{text-align:left;width:90%;padding-top:5px}.header .header-text{font-size:15px;font-weight:500}highcharts-chart{display:block;max-width:100%;max-height:100%;width:100%;height:100%}\n"], components: [{ type: i2$5.HighchartsChartComponent, selector: "highcharts-chart", inputs: ["Highcharts", "constructorType", "callbackFunction", "oneToOne", "runOutsideAngular", "options", "update"], outputs: ["updateChange", "chartInstance"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
2676
+ DynamicChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DynamicChartComponent, selector: "mantle-dynamic-chart", inputs: { label: "label", data: "data" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"label\" class=\"header\">\n <p class=\"header-text\">{{ label | translate }}</p>\n</div>\n\n<highcharts-chart\n [Highcharts]=\"Highcharts\"\n [constructorType]=\"chartConstructor\"\n [options]=\"chartOptions\"\n [(update)]=\"updateFlag\"\n [oneToOne]=\"oneToOneFlag\"\n [callbackFunction]=\"chartCallback\">\n</highcharts-chart>\n", styles: [".header{text-align:left;width:90%;padding-top:5px}.header .header-text{font-size:15px;font-weight:500}highcharts-chart{display:block;max-width:100%;max-height:100%;width:100%;height:100%}\n"], components: [{ type: i2$6.HighchartsChartComponent, selector: "highcharts-chart", inputs: ["Highcharts", "constructorType", "callbackFunction", "oneToOne", "runOutsideAngular", "options", "update"], outputs: ["updateChange", "chartInstance"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "translate": i5.TranslatePipe } });
2421
2677
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DynamicChartComponent, decorators: [{
2422
2678
  type: Component,
2423
2679
  args: [{
@@ -2438,7 +2694,7 @@ class DashboardInfoCardComponent {
2438
2694
  }
2439
2695
  }
2440
2696
  DashboardInfoCardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DashboardInfoCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2441
- DashboardInfoCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DashboardInfoCardComponent, selector: "mantle-dashboard-info-card", inputs: { data: "data", options: "options" }, ngImport: i0, template: "<div class=\"info-card\">\n <div *ngIf=\"data.key_value\">\n <div *ngIf=\"data.key_value.label\" class=\"sub-header\">{{ data.key_value.label }}</div>\n <span class=\"header\">\n <h1 class=\"header-value\" [ngStyle]=\"{ 'color': data.color }\">{{ data.key_value.value }}</h1> <span class=\"header-units\">{{ data.key_value.unit }}</span>\n </span>\n <div *ngIf=\"data.showSubLabel\">\n <span class=\"header-date\">{{ data.key_value.sub_label }}</span>\n </div>\n </div>\n\n <small *ngIf=\"data.comparison\" class=\"comparison\">\n <mat-icon>{{ (data.comparison.value < 0) ? 'keyboard_arrow_down' : 'keyboard_arrow_up' }}</mat-icon>\n {{ data.comparison.value }} {{ data.comparison.unit }} {{ data.comparison.label }}\n </small>\n\n <table *ngIf=\"data.bulletpoints && data.bulletpoints.length > 0\" class=\"bulletpoints\">\n <tr *ngFor=\"let bulletpoint of data.bulletpoints\" class=\"bulletpoint\">\n <td class=\"bulletpoint-icon\"><mat-icon>chevron_right</mat-icon></td><td class=\"bulletpoint-value\"><b>{{ bulletpoint.value }}</b></td><td class=\"bulletpoint-label\">{{ bulletpoint.label }}</td>\n </tr>\n </table>\n</div>\n", styles: [".info-card{padding:10px;margin:0 auto auto;max-width:100%;max-height:100%}.header{padding-bottom:4px;min-width:100px;margin:auto;word-wrap:normal}.header .header-value{display:inline-block;margin-bottom:10px;font-size:46px;font-weight:500}.header .header-units{display:inline-block;margin-left:4px;margin-bottom:0;font-size:16px;text-transform:uppercase}.sub-header{margin-top:4px;margin-bottom:30px;font-size:15px;font-weight:500}.header-date{margin-top:4px;margin-bottom:30px;font-size:12px;color:gray}.comparison .mat-icon{font-size:14px!important;height:14px}.bulletpoints{margin-top:16px;border-collapse:collapse}.bulletpoints .bulletpoint .bulletpoint-icon{padding-right:4px!important}.bulletpoints .bulletpoint .bulletpoint-value{font-weight:500;font-size:16px;text-align:right;padding-left:2px!important;padding-right:4px!important}.bulletpoints .bulletpoint .bulletpoint-label{text-align:left;padding-left:2px!important}\n"], components: [{ type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i3.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
2697
+ DashboardInfoCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DashboardInfoCardComponent, selector: "mantle-dashboard-info-card", inputs: { data: "data", options: "options" }, ngImport: i0, template: "<div class=\"info-card\">\n <div *ngIf=\"data.key_value\">\n <div *ngIf=\"data.key_value.label\" class=\"sub-header\">{{ data.key_value.label }}</div>\n <span class=\"header\">\n <h1 class=\"header-value\" [ngStyle]=\"{ 'color': data.color }\">{{ data.key_value.value }}</h1> <span class=\"header-units\">{{ data.key_value.unit }}</span>\n </span>\n <div *ngIf=\"data.showSubLabel\">\n <span class=\"header-date\">{{ data.key_value.sub_label }}</span>\n </div>\n </div>\n\n <small *ngIf=\"data.comparison\" class=\"comparison\">\n <mat-icon>{{ (data.comparison.value < 0) ? 'keyboard_arrow_down' : 'keyboard_arrow_up' }}</mat-icon>\n {{ data.comparison.value }} {{ data.comparison.unit }} {{ data.comparison.label }}\n </small>\n\n <table *ngIf=\"data.bulletpoints && data.bulletpoints.length > 0\" class=\"bulletpoints\">\n <tr *ngFor=\"let bulletpoint of data.bulletpoints\" class=\"bulletpoint\">\n <td class=\"bulletpoint-icon\"><mat-icon>chevron_right</mat-icon></td><td class=\"bulletpoint-value\"><b>{{ bulletpoint.value }}</b></td><td class=\"bulletpoint-label\">{{ bulletpoint.label }}</td>\n </tr>\n </table>\n</div>\n", styles: [".info-card{padding:10px;margin:auto;max-width:100%;max-height:100%}.header{padding-bottom:4px;min-width:100px;margin:auto;word-wrap:normal}.header .header-value{display:inline-block;margin-bottom:10px;font-size:46px;font-weight:500}.header .header-units{display:inline-block;margin-left:4px;margin-bottom:0;font-size:16px;text-transform:uppercase}.sub-header{margin-top:4px;margin-bottom:30px;font-size:15px;font-weight:500}.header-date{margin-top:4px;margin-bottom:30px;font-size:12px;color:gray}.comparison .mat-icon{font-size:14px!important;height:14px}.bulletpoints{margin-top:16px;border-collapse:collapse}.bulletpoints .bulletpoint .bulletpoint-icon{padding-right:4px!important}.bulletpoints .bulletpoint .bulletpoint-value{font-weight:500;font-size:16px;text-align:right;padding-left:2px!important;padding-right:4px!important}.bulletpoints .bulletpoint .bulletpoint-label{text-align:left;padding-left:2px!important}\n"], components: [{ type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i3.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
2442
2698
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DashboardInfoCardComponent, decorators: [{
2443
2699
  type: Component,
2444
2700
  args: [{
@@ -2482,6 +2738,7 @@ class DashboardTableDataSource extends DataSource {
2482
2738
  class DashboardTableComponent {
2483
2739
  constructor(dialog) {
2484
2740
  this.dialog = dialog;
2741
+ this.label = '';
2485
2742
  this.dataSource = new DashboardTableDataSource();
2486
2743
  }
2487
2744
  ngAfterViewInit() {
@@ -2503,7 +2760,7 @@ class DashboardTableComponent {
2503
2760
  }
2504
2761
  }
2505
2762
  DashboardTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DashboardTableComponent, deps: [{ token: i1$3.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
2506
- DashboardTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DashboardTableComponent, selector: "mantle-dashboard-table", inputs: { columns: "columns", items: "items", hideHeaders: "hideHeaders", withStripedRows: "withStripedRows", withClickableRows: "withClickableRows", onRecordClicked: "onRecordClicked" }, viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"vertically-scrollable horizontal-scroll-table\">\n <table mat-table class=\"full-width\">\n\n <ng-container *ngFor=\"let column of columns\">\n <ng-container matColumnDef=\"{{ column.attr }}\">\n <th mat-header-cell *matHeaderCellDef>{{ column.header }}</th>\n <td mat-cell *matCellDef=\"let row\">\n <mantle-dynamic-attribute-display [fieldType]=\"column.type\" [value]=\"row[column.attr]\" [field]=\"column\"></mantle-dynamic-attribute-display>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"!hideHeaders\">\n <tr mat-header-row *matHeaderRowDef=\"listColumnAttrs()\"></tr>\n </ng-container>\n <tr mat-row *matRowDef=\"let row; columns: listColumnAttrs();\"\n (click)=\"onRowClicked(row)\"\n [class.clickable-row]=\"withClickableRows\"\n [class.striped-row]=\"withStripedRows\">\n </tr>\n\n </table>\n</div>\n", styles: [".horizontal-scroll-table{width:100%}.mat-header-row,th{font-weight:bold}.mat-row{text-align:left}\n"], components: [{ type: i2$1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { type: DynamicAttributeDisplayComponent, selector: "mantle-dynamic-attribute-display", inputs: ["value", "field", "fieldType", "options"] }, { type: i2$1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { type: i2$1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }], directives: [{ type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2$1.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { type: i2$1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { type: i2$1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { type: i2$1.MatCellDef, selector: "[matCellDef]" }, { type: i2$1.MatCell, selector: "mat-cell, td[mat-cell]" }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2$1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { type: i2$1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }] });
2763
+ DashboardTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DashboardTableComponent, selector: "mantle-dashboard-table", inputs: { label: "label", columns: "columns", items: "items", hideHeaders: "hideHeaders", withStripedRows: "withStripedRows", withClickableRows: "withClickableRows", onRecordClicked: "onRecordClicked" }, viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"label\" class=\"header\">\n <p class=\"header-text\">{{ label | translate }}</p>\n</div>\n\n<div class=\"vertically-scrollable horizontal-scroll-table\">\n <table mat-table class=\"full-width\">\n\n <ng-container *ngFor=\"let column of columns\">\n <ng-container matColumnDef=\"{{ column.attr }}\">\n <th mat-header-cell *matHeaderCellDef>{{ column.header | translate }}</th>\n <td mat-cell *matCellDef=\"let row\">\n <mantle-dynamic-attribute-display [fieldType]=\"column.type\" [value]=\"row[column.attr]\" [field]=\"column\"></mantle-dynamic-attribute-display>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"!hideHeaders\">\n <tr mat-header-row *matHeaderRowDef=\"listColumnAttrs()\"></tr>\n </ng-container>\n <tr mat-row *matRowDef=\"let row; columns: listColumnAttrs();\"\n (click)=\"onRowClicked(row)\"\n [class.clickable-row]=\"withClickableRows\"\n [class.striped-row]=\"withStripedRows\">\n </tr>\n\n </table>\n</div>\n", styles: [".horizontal-scroll-table{width:100%}.mat-header-row,th{font-weight:bold}.mat-row{text-align:left}.header{text-align:left;width:95%;padding-top:5px}.header .header-text{font-size:15px;font-weight:500}\n"], components: [{ type: i2$1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { type: DynamicAttributeDisplayComponent, selector: "mantle-dynamic-attribute-display", inputs: ["value", "field", "fieldType", "options"] }, { type: i2$1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { type: i2$1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2$1.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { type: i2$1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { type: i2$1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { type: i2$1.MatCellDef, selector: "[matCellDef]" }, { type: i2$1.MatCell, selector: "mat-cell, td[mat-cell]" }, { type: i2$1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { type: i2$1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }], pipes: { "translate": i5.TranslatePipe } });
2507
2764
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DashboardTableComponent, decorators: [{
2508
2765
  type: Component,
2509
2766
  args: [{
@@ -2514,6 +2771,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
2514
2771
  }], ctorParameters: function () { return [{ type: i1$3.MatDialog }]; }, propDecorators: { table: [{
2515
2772
  type: ViewChild,
2516
2773
  args: [MatTable]
2774
+ }], label: [{
2775
+ type: Input
2517
2776
  }], columns: [{
2518
2777
  type: Input
2519
2778
  }], items: [{
@@ -2535,7 +2794,7 @@ class DynamicWidgetDisplayComponent {
2535
2794
  }
2536
2795
  }
2537
2796
  DynamicWidgetDisplayComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DynamicWidgetDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2538
- DynamicWidgetDisplayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DynamicWidgetDisplayComponent, selector: "mantle-dynamic-widget-display", inputs: { widgetItem: "widgetItem", data: "data", options: "options" }, ngImport: i0, template: "<ng-container [ngSwitch]=\"widgetItem.type\">\n\n <ng-container *ngSwitchCase=\"'chart'\">\n <mantle-dynamic-chart class=\"widget-item\" [label]=\"widgetItem.label\" [data]=\"data\">\n </mantle-dynamic-chart>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'info'\">\n <mantle-dashboard-info-card class=\"widget-item\" [data]=\"data\" [options]=\"options\">\n </mantle-dashboard-info-card>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'table'\">\n <mantle-dashboard-table class=\"widget-item\"\n [columns]=\"data.columns\" [items]=\"data.items\"\n [hideHeaders]=\"data.hideHeaders\"\n [withStripedRows]=\"data.withStripedRows\"\n [withClickableRows]=\"data.withClickableRows\"\n [onRecordClicked]=\"data.onRecordClicked\">\n </mantle-dashboard-table>\n </ng-container>\n\n</ng-container>\n", styles: [".widget-item{width:100%;height:100%;max-width:100%;max-height:100%;display:flex;align-items:center;flex-direction:column}\n"], components: [{ type: DynamicChartComponent, selector: "mantle-dynamic-chart", inputs: ["label", "data"] }, { type: DashboardInfoCardComponent, selector: "mantle-dashboard-info-card", inputs: ["data", "options"] }, { type: DashboardTableComponent, selector: "mantle-dashboard-table", inputs: ["columns", "items", "hideHeaders", "withStripedRows", "withClickableRows", "onRecordClicked"] }], directives: [{ type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }] });
2797
+ DynamicWidgetDisplayComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DynamicWidgetDisplayComponent, selector: "mantle-dynamic-widget-display", inputs: { widgetItem: "widgetItem", data: "data", options: "options" }, ngImport: i0, template: "<ng-container [ngSwitch]=\"widgetItem.type\">\n\n <ng-container *ngSwitchCase=\"'chart'\">\n <mantle-dynamic-chart class=\"widget-item\" [label]=\"widgetItem.label\" [data]=\"data\">\n </mantle-dynamic-chart>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'info'\">\n <mantle-dashboard-info-card class=\"widget-item\" [data]=\"data\" [options]=\"options\">\n </mantle-dashboard-info-card>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'table'\">\n <mantle-dashboard-table class=\"widget-item\"\n [label]=\"widgetItem.label\"\n [columns]=\"data.columns\" [items]=\"data.items\"\n [hideHeaders]=\"data.hideHeaders\"\n [withStripedRows]=\"data.withStripedRows\"\n [withClickableRows]=\"data.withClickableRows\"\n [onRecordClicked]=\"data.onRecordClicked\">\n </mantle-dashboard-table>\n </ng-container>\n\n</ng-container>\n", styles: [".widget-item{width:100%;height:100%;max-width:100%;max-height:100%;display:flex;align-items:center;flex-direction:column}\n"], components: [{ type: DynamicChartComponent, selector: "mantle-dynamic-chart", inputs: ["label", "data"] }, { type: DashboardInfoCardComponent, selector: "mantle-dashboard-info-card", inputs: ["data", "options"] }, { type: DashboardTableComponent, selector: "mantle-dashboard-table", inputs: ["label", "columns", "items", "hideHeaders", "withStripedRows", "withClickableRows", "onRecordClicked"] }], directives: [{ type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }] });
2539
2798
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DynamicWidgetDisplayComponent, decorators: [{
2540
2799
  type: Component,
2541
2800
  args: [{
@@ -2637,7 +2896,7 @@ class DashboardCardComponent {
2637
2896
  }
2638
2897
  }
2639
2898
  DashboardCardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DashboardCardComponent, deps: [{ token: ObjectService }, { token: ScreenSizeService }], target: i0.ɵɵFactoryTarget.Component });
2640
- DashboardCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DashboardCardComponent, selector: "mantle-dashboard-card", inputs: { widget: "widget", widgetConfig: "widgetConfig", widgetItems: "widgetItems", rowHeight: "rowHeight", dashboardWidgetService: "dashboardWidgetService", dashboardPageService: "dashboardPageService" }, viewQueries: [{ propertyName: "searchForm", first: true, predicate: DashboardCardSearchMenuComponent, descendants: true }, { propertyName: "menuTrigger", first: true, predicate: MatMenuTrigger, descendants: true }], ngImport: i0, template: "<mat-card fxLayout=\"column\" fxLayoutAlign=\"stretch\" fxLayoutGap=\"0px\" class=\"dashboard-card\">\n <mat-card-header fxFlex=\"0 0 auto\">\n <mat-card-title>\n <span *ngIf=\"!dashboardWidgetService.icon; else iconHeader\" class=\"sub-card-title\">{{ widget.label }}</span>\n <ng-template #iconHeader>\n <div>\n <mat-icon class=\"card-title-icon\">{{ dashboardWidgetService.icon }}</mat-icon>\n <span class=\"main-card-title\">\n {{ widget.label }}\n </span>\n </div>\n </ng-template>\n\n <ng-container *ngFor=\"let exportOption of exportOptions\">\n <button mat-button type=\"button\" class=\"export-button\" (click)=\"exportOption.export(options).subscribe()\">\n <span class=\"export-button-label\">{{ exportOption.label }}</span>\n <mat-icon>download</mat-icon>\n </button>\n </ng-container>\n\n <ng-container *ngIf=\"additionalWidgetButtons\">\n <div class=\"widget-button-container\" [ngClass]=\"{ 'with-menu-button': dashboardWidgetService.showMenuButton }\">\n <button *ngFor=\"let button of additionalWidgetButtons\"\n mat-raised-button\n color=\"{{ button.color }}\"\n type=\"button\"\n class=\"widget-button\"\n [ngStyle]=\"button.styling\"\n (click)=\"onAdditionalWidgetButtonClicked(button.onClick)\"\n [disabled]=\"button.disabled\">\n {{ button.label }}\n </button>\n </div>\n </ng-container>\n\n <button #menuTrigger mat-icon-button class=\"more-button\" [matMenuTriggerFor]=\"menu\" *ngIf=\"dashboardWidgetService.showMenuButton\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\" xPosition=\"before\">\n <div class=\"menu-form\" click-stop-propagation>\n <mantle-dashboard-card-search-menu #searchForm [content]=\"formContent\"></mantle-dashboard-card-search-menu>\n\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\">\n <div fxFlex=\"1 1 auto\"></div>\n <div fxFlex=\"0 0 auto\">\n <button mat-raised-button color=\"primary\" type=\"button\" class=\"search-button\" (click)=\"onSearchClicked(); menuTrigger.closeMenu();\">\n Search\n </button>\n </div>\n </div>\n </div>\n </mat-menu>\n </mat-card-title>\n </mat-card-header>\n\n <mat-card-content fxFlex=\"1 0 1px\" fxAlign=\"center center\" class=\"dashboard-card-content\">\n\n <div class=\"grid-container\">\n <mat-grid-list\n [rowHeight]=\"widgetRowHeight\"\n [cols]=\"WIDGET_COLUMNS\">\n <mat-grid-tile *ngFor=\"let context of widgetItemContexts\" [colspan]=\"getWidgetItemColspan(context.config)\" [rowspan]=\"getWidgetItemRowspan(context.config)\">\n <mantle-dynamic-widget-display\n class=\"card-content-wrapper\"\n [widgetItem]=\"context.config\"\n [data]=\"context.data\"\n [options]=\"context.options\">\n </mantle-dynamic-widget-display>\n </mat-grid-tile>\n </mat-grid-list>\n </div>\n\n </mat-card-content>\n</mat-card>\n", styles: [".dashboard-card{position:absolute;top:15px;left:15px;right:15px;bottom:15px;padding:10px 15px}.more-button{position:absolute;top:5px;right:10px}.dashboard-card-content{text-align:center}.mat-card-title{margin-bottom:10px;padding-top:5px;font-weight:400}.mat-card-title .main-card-title{font-size:19px;text-transform:uppercase;font-weight:500;vertical-align:middle}.mat-card-title .card-title-icon{font-size:2rem;vertical-align:middle;padding-right:7px}.mat-card-title .sub-card-title{font-size:18px;font-weight:500}.card-content-wrapper{width:100%;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:stretch}.menu-form{width:140px;padding:0 8px}.export-button{display:inline-block;width:110px;background-color:transparent;white-space:nowrap;padding:0;position:absolute;top:8px;right:50px}.export-button .export-button-label{display:inline-block;width:80px;white-space:normal;text-align:right;text-transform:uppercase;font-weight:normal;font-size:12px;line-height:1.25rem;margin-right:.25rem}.widget-button-container{display:inline-block;position:absolute;top:15px;right:20px}.widget-button-container .widget-button{margin-left:7px}.with-menu-button{right:50px}.mat-icon{height:auto;width:auto;font-size:1.5rem}\n"], components: [{ type: i3$6.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i3$6.MatCardHeader, selector: "mat-card-header" }, { type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i6$1.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: DashboardCardSearchMenuComponent, selector: "mantle-dashboard-card-search-menu", inputs: ["content"] }, { type: i3$2.MatGridList, selector: "mat-grid-list", inputs: ["cols", "gutterSize", "rowHeight"], exportAs: ["matGridList"] }, { type: i3$2.MatGridTile, selector: "mat-grid-tile", inputs: ["rowspan", "colspan"], exportAs: ["matGridTile"] }, { type: DynamicWidgetDisplayComponent, selector: "mantle-dynamic-widget-display", inputs: ["widgetItem", "data", "options"] }], directives: [{ type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i3$6.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i3.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { type: i6$1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { type: ClickStopPropagationDirective, selector: "[click-stop-propagation]" }, { type: i3$6.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }] });
2899
+ DashboardCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DashboardCardComponent, selector: "mantle-dashboard-card", inputs: { widget: "widget", widgetConfig: "widgetConfig", widgetItems: "widgetItems", rowHeight: "rowHeight", dashboardWidgetService: "dashboardWidgetService", dashboardPageService: "dashboardPageService" }, viewQueries: [{ propertyName: "searchForm", first: true, predicate: DashboardCardSearchMenuComponent, descendants: true }, { propertyName: "menuTrigger", first: true, predicate: MatMenuTrigger, descendants: true }], ngImport: i0, template: "<mat-card fxLayout=\"column\" fxLayoutAlign=\"stretch\" fxLayoutGap=\"0px\" class=\"dashboard-card\">\n <mat-card-header fxFlex=\"0 0 auto\">\n <mat-card-title>\n <span *ngIf=\"!dashboardWidgetService.icon; else iconHeader\" class=\"sub-card-title\">{{ widget.label }}</span>\n <ng-template #iconHeader>\n <div>\n <mat-icon class=\"card-title-icon\">{{ dashboardWidgetService.icon }}</mat-icon>\n <span class=\"main-card-title\">\n {{ widget.label }}\n </span>\n </div>\n </ng-template>\n\n <ng-container *ngFor=\"let exportOption of exportOptions\">\n <button mat-button type=\"button\" class=\"export-button\" (click)=\"exportOption.export(options).subscribe()\">\n <span class=\"export-button-label\">{{ exportOption.label | translate }}</span>\n <mat-icon>download</mat-icon>\n </button>\n </ng-container>\n\n <ng-container *ngIf=\"additionalWidgetButtons\">\n <div class=\"widget-button-container\" [ngClass]=\"{ 'with-menu-button': dashboardWidgetService.showMenuButton }\">\n <button *ngFor=\"let button of additionalWidgetButtons\"\n mat-raised-button\n color=\"{{ button.color }}\"\n type=\"button\"\n class=\"widget-button\"\n [ngStyle]=\"button.styling\"\n (click)=\"onAdditionalWidgetButtonClicked(button.onClick)\"\n [disabled]=\"button.disabled\">\n {{ button.label | translate }}\n </button>\n </div>\n </ng-container>\n\n <button #menuTrigger mat-icon-button class=\"more-button\" [matMenuTriggerFor]=\"menu\" *ngIf=\"dashboardWidgetService.showMenuButton\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\" xPosition=\"before\">\n <div class=\"menu-form\" click-stop-propagation>\n <mantle-dashboard-card-search-menu #searchForm [content]=\"formContent\"></mantle-dashboard-card-search-menu>\n\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\">\n <div fxFlex=\"1 1 auto\"></div>\n <div fxFlex=\"0 0 auto\">\n <button mat-raised-button color=\"primary\" type=\"button\" class=\"search-button\" (click)=\"onSearchClicked(); menuTrigger.closeMenu();\">\n {{ 'mantle.buttons.search' | translate }}\n </button>\n </div>\n </div>\n </div>\n </mat-menu>\n </mat-card-title>\n </mat-card-header>\n\n <mat-card-content fxFlex=\"1 0 1px\" fxAlign=\"center center\" class=\"dashboard-card-content\">\n\n <div class=\"grid-container\">\n <mat-grid-list\n [rowHeight]=\"widgetRowHeight\"\n [cols]=\"WIDGET_COLUMNS\">\n <mat-grid-tile *ngFor=\"let context of widgetItemContexts\" [colspan]=\"getWidgetItemColspan(context.config)\" [rowspan]=\"getWidgetItemRowspan(context.config)\">\n <mantle-dynamic-widget-display\n class=\"card-content-wrapper\"\n [widgetItem]=\"context.config\"\n [data]=\"context.data\"\n [options]=\"context.options\">\n </mantle-dynamic-widget-display>\n </mat-grid-tile>\n </mat-grid-list>\n </div>\n\n </mat-card-content>\n</mat-card>\n", styles: [".dashboard-card{position:absolute;top:15px;left:15px;right:15px;bottom:15px;padding:10px 15px}.more-button{position:absolute;top:5px;right:10px}.dashboard-card-content{text-align:center}.mat-card-title{margin-bottom:10px;padding-top:5px;font-weight:400}.mat-card-title .main-card-title{font-size:19px;text-transform:uppercase;font-weight:500;vertical-align:middle}.mat-card-title .card-title-icon{font-size:2rem;vertical-align:middle;padding-right:7px}.mat-card-title .sub-card-title{font-size:18px;font-weight:500}.card-content-wrapper{width:100%;height:100%;display:flex;flex-direction:column;justify-content:center;align-items:stretch}.menu-form{width:140px;padding:0 8px}.export-button{display:inline-block;width:110px;background-color:transparent;white-space:nowrap;padding:0;position:absolute;top:8px;right:50px}.export-button .export-button-label{display:inline-block;width:80px;white-space:normal;text-align:right;text-transform:uppercase;font-weight:normal;font-size:12px;line-height:1.25rem;margin-right:.25rem}.widget-button-container{display:inline-block;position:absolute;z-index:100;top:15px;right:20px}.widget-button-container .widget-button{margin-left:7px}.with-menu-button{right:50px}.mat-icon{height:auto;width:auto;font-size:1.5rem}\n"], components: [{ type: i3$6.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i3$6.MatCardHeader, selector: "mat-card-header" }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$4.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: DashboardCardSearchMenuComponent, selector: "mantle-dashboard-card-search-menu", inputs: ["content"] }, { type: i3$2.MatGridList, selector: "mat-grid-list", inputs: ["cols", "gutterSize", "rowHeight"], exportAs: ["matGridList"] }, { type: i3$2.MatGridTile, selector: "mat-grid-tile", inputs: ["rowspan", "colspan"], exportAs: ["matGridTile"] }, { type: DynamicWidgetDisplayComponent, selector: "mantle-dynamic-widget-display", inputs: ["widgetItem", "data", "options"] }], directives: [{ type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i3$6.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i3.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { type: i4$4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { type: ClickStopPropagationDirective, selector: "[click-stop-propagation]" }, { type: i3$6.MatCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }], pipes: { "translate": i5.TranslatePipe } });
2641
2900
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DashboardCardComponent, decorators: [{
2642
2901
  type: Component,
2643
2902
  args: [{
@@ -2708,37 +2967,148 @@ class DashboardSectionComponent {
2708
2967
  }
2709
2968
  }
2710
2969
  }
2711
- DashboardSectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DashboardSectionComponent, deps: [{ token: ArrayService }, { token: ScreenSizeService }], target: i0.ɵɵFactoryTarget.Component });
2712
- DashboardSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DashboardSectionComponent, selector: "mantle-dashboard-section", inputs: { dashboardPageService: "dashboardPageService", slug: "slug", data: "data", section: "section" }, ngImport: i0, template: "<div class=\"grid-container\">\n <mat-grid-list\n [rowHeight]=\"rowHeight\"\n [cols]=\"SECTION_COLUMNS\"\n [class.multi-column]=\"true\">\n\n <mat-grid-tile *ngFor=\"let widget of section.elements\" [colspan]=\"getColSpanForWidget(widget.slug)\" [rowspan]=\"getRowSpanForWidget(widget.slug)\">\n <mantle-dashboard-card\n [widget]=\"widget\"\n [widgetConfig]=\"data.widget_configs[widget.slug]\"\n [widgetItems]=\"data.widget_items\"\n [rowHeight]=\"rowHeight\"\n [dashboardWidgetService]=\"getDashboardWidgetService(widget.slug)\"\n [dashboardPageService]=\"dashboardPageService\">\n </mantle-dashboard-card>\n </mat-grid-tile>\n\n </mat-grid-list>\n</div>\n", styles: [""], components: [{ type: i3$2.MatGridList, selector: "mat-grid-list", inputs: ["cols", "gutterSize", "rowHeight"], exportAs: ["matGridList"] }, { type: i3$2.MatGridTile, selector: "mat-grid-tile", inputs: ["rowspan", "colspan"], exportAs: ["matGridTile"] }, { type: DashboardCardComponent, selector: "mantle-dashboard-card", inputs: ["widget", "widgetConfig", "widgetItems", "rowHeight", "dashboardWidgetService", "dashboardPageService"] }], directives: [{ type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
2713
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DashboardSectionComponent, decorators: [{
2970
+ DashboardSectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DashboardSectionComponent, deps: [{ token: ArrayService }, { token: ScreenSizeService }], target: i0.ɵɵFactoryTarget.Component });
2971
+ DashboardSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DashboardSectionComponent, selector: "mantle-dashboard-section", inputs: { dashboardPageService: "dashboardPageService", slug: "slug", data: "data", section: "section" }, ngImport: i0, template: "<div class=\"grid-container\">\n <mat-grid-list\n [rowHeight]=\"rowHeight\"\n [cols]=\"SECTION_COLUMNS\"\n [class.multi-column]=\"true\">\n\n <mat-grid-tile *ngFor=\"let widget of section.elements\" [colspan]=\"getColSpanForWidget(widget.slug)\" [rowspan]=\"getRowSpanForWidget(widget.slug)\">\n <mantle-dashboard-card\n [widget]=\"widget\"\n [widgetConfig]=\"data.widget_configs[widget.slug]\"\n [widgetItems]=\"data.widget_items\"\n [rowHeight]=\"rowHeight\"\n [dashboardWidgetService]=\"getDashboardWidgetService(widget.slug)\"\n [dashboardPageService]=\"dashboardPageService\">\n </mantle-dashboard-card>\n </mat-grid-tile>\n\n </mat-grid-list>\n</div>\n", styles: [""], components: [{ type: i3$2.MatGridList, selector: "mat-grid-list", inputs: ["cols", "gutterSize", "rowHeight"], exportAs: ["matGridList"] }, { type: i3$2.MatGridTile, selector: "mat-grid-tile", inputs: ["rowspan", "colspan"], exportAs: ["matGridTile"] }, { type: DashboardCardComponent, selector: "mantle-dashboard-card", inputs: ["widget", "widgetConfig", "widgetItems", "rowHeight", "dashboardWidgetService", "dashboardPageService"] }], directives: [{ type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
2972
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DashboardSectionComponent, decorators: [{
2973
+ type: Component,
2974
+ args: [{
2975
+ selector: 'mantle-dashboard-section',
2976
+ templateUrl: './dashboard-section.component.html',
2977
+ styleUrls: ['./dashboard-section.component.scss']
2978
+ }]
2979
+ }], ctorParameters: function () { return [{ type: ArrayService }, { type: ScreenSizeService }]; }, propDecorators: { dashboardPageService: [{
2980
+ type: Input
2981
+ }], slug: [{
2982
+ type: Input
2983
+ }], data: [{
2984
+ type: Input
2985
+ }], section: [{
2986
+ type: Input
2987
+ }] } });
2988
+
2989
+ class MarkdownDetailsSectionComponent {
2990
+ }
2991
+ MarkdownDetailsSectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: MarkdownDetailsSectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2992
+ MarkdownDetailsSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: MarkdownDetailsSectionComponent, selector: "mantle-markdown-details-section", inputs: { section: "section" }, ngImport: i0, template: "<div class=\"markdown-wrapper\">\n <markdown ngPreserveWhitespaces *ngFor=\"let element of section.elements\">\n {{ element.text }}\n </markdown>\n</div>\n", styles: [""], components: [{ type: i1$5.MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "emoji", "katex", "katexOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start"], outputs: ["error", "load", "ready"] }], directives: [{ type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
2993
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: MarkdownDetailsSectionComponent, decorators: [{
2994
+ type: Component,
2995
+ args: [{
2996
+ selector: 'mantle-markdown-details-section',
2997
+ templateUrl: './markdown-details-section.component.html',
2998
+ styleUrls: ['./markdown-details-section.component.scss']
2999
+ }]
3000
+ }], propDecorators: { section: [{
3001
+ type: Input
3002
+ }] } });
3003
+
3004
+ /**
3005
+ * Data source for the List Page view. This class should
3006
+ * encapsulate all logic for fetching and manipulating the displayed data
3007
+ * (including sorting, pagination, and searching).
3008
+ */
3009
+ class DraggableTableDataSource extends DataSource {
3010
+ constructor() {
3011
+ super();
3012
+ this.columns = [];
3013
+ this.listSubject = new BehaviorSubject([]);
3014
+ }
3015
+ /**
3016
+ * Connect this data source to the table. The table will only update when
3017
+ * the returned stream emits new items.
3018
+ * @returns A stream of the items to be rendered.
3019
+ */
3020
+ connect() {
3021
+ return this.listSubject.pipe(map(() => {
3022
+ return this.listSubject.value.filter(item => { return !item._destroy; });
3023
+ }));
3024
+ }
3025
+ /**
3026
+ * Called when the table is being destroyed. Use this function, to clean up
3027
+ * any open connections or free any held resources that were set up during connect.
3028
+ */
3029
+ disconnect() { }
3030
+ }
3031
+
3032
+ class DraggableTableComponent {
3033
+ constructor(arrayService) {
3034
+ this.arrayService = arrayService;
3035
+ this.dataSource = new DraggableTableDataSource();
3036
+ }
3037
+ ngOnChanges() {
3038
+ this.dataSource.columns = this.listColumnAttrs();
3039
+ this.dataSource.listSubject.next(this.items);
3040
+ }
3041
+ listColumnAttrs() {
3042
+ let columnAttrs = this.columns.map(column => { return column.attr; });
3043
+ if (this.writable)
3044
+ columnAttrs.unshift('drag');
3045
+ if (this.writable)
3046
+ columnAttrs.push('delete');
3047
+ return columnAttrs;
3048
+ }
3049
+ onDropped(event) {
3050
+ const previousIndex = this.items.findIndex(item => item === event.item.data);
3051
+ moveItemInArray(this.items, previousIndex, event.currentIndex);
3052
+ this.refreshOrdinals();
3053
+ this.dataSource.listSubject.next(this.items);
3054
+ }
3055
+ onDeleteClicked(row) {
3056
+ if (row.id) {
3057
+ row._destroy = 1;
3058
+ }
3059
+ else {
3060
+ this.arrayService.removeItem(this.items, row);
3061
+ }
3062
+ this.refreshOrdinals();
3063
+ this.dataSource.listSubject.next(this.items);
3064
+ }
3065
+ refreshOrdinals() {
3066
+ let currentOrdinal = 1;
3067
+ this.items.forEach((item) => {
3068
+ if (item._destroy)
3069
+ return;
3070
+ item[this.sortAttr] = currentOrdinal;
3071
+ currentOrdinal += 1;
3072
+ });
3073
+ }
3074
+ }
3075
+ DraggableTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DraggableTableComponent, deps: [{ token: ArrayService }], target: i0.ɵɵFactoryTarget.Component });
3076
+ DraggableTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DraggableTableComponent, selector: "mantle-draggable-table", inputs: { columns: "columns", items: "items", sortAttr: "sortAttr", writable: "writable" }, viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<mat-table\n #table\n [ngClass]=\"{ 'draggable-table-details': !writable, 'draggable-table-form': writable }\"\n [dataSource]=\"dataSource\"\n cdkDropList\n (cdkDropListDropped)=\"onDropped($event)\"\n cdkDropListData=\"items\"\n [cdkDropListDisabled]=\"!writable\"\n [cdkDropListSortingDisabled]=\"!writable\">\n\n <!-- Drag Column -->\n <ng-container matColumnDef=\"drag\" *ngIf=\"writable\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-icon class=\"drag-cursor\" (mousedown)=\"true;\">\n drag_indicator\n </mat-icon>\n </td>\n </ng-container>\n\n <ng-container *ngFor=\"let column of columns\">\n <ng-container matColumnDef=\"{{ column.attr }}\">\n <th mat-header-cell *matHeaderCellDef>{{ column.header | translate }}</th>\n <td mat-cell *matCellDef=\"let row\">\n <mantle-dynamic-attribute-display [fieldType]=\"column.type\" [value]=\"row[column.attr]\" [field]=\"column\"></mantle-dynamic-attribute-display>\n </td>\n </ng-container>\n </ng-container>\n\n <ng-container matColumnDef=\"delete\" *ngIf=\"writable\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let row\">\n <button mat-icon-button (click)=\"onDeleteClicked(row)\">\n <mat-icon>\n delete\n </mat-icon>\n </button>\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"dataSource.columns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: dataSource.columns;\"\n cdkDrag\n [cdkDragData]=\"row\">\n </tr>\n</mat-table>\n", styles: ["mat-table{width:100%}mat-table tr{height:40px;vertical-align:middle}mat-table th,mat-table td{padding-left:10px!important;padding-right:10px!important;border-width:0px}mat-table th:first-of-type,mat-table td:first-of-type{padding-left:5px!important}mat-table th:last-of-type,mat-table td:last-of-type{padding-right:5px!important}.draggable-table-details th,.draggable-table-details td{border-width:0px}.draggable-table-form tr{border-width:1px;border-style:solid}.draggable-table-form td{border-top:1px solid gray;border-bottom:1px solid gray}.draggable-table-form td:first-of-type{border-left:1px solid gray}.draggable-table-form td:last-of-type{border-right:1px solid gray}.drag-cursor{margin-right:16px;cursor:move}.cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f;background-color:#fff}.cdk-drag-placeholder{opacity:0}.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.cdk-drop-list-dragging .mat-row:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}\n"], components: [{ type: i2$1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: DynamicAttributeDisplayComponent, selector: "mantle-dynamic-attribute-display", inputs: ["value", "field", "fieldType", "options"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i2$1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { type: i2$1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }], directives: [{ type: i6$1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "id", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListAutoScrollDisabled", "cdkDropListOrientation", "cdkDropListLockAxis", "cdkDropListData", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2$1.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { type: i2$1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { type: i2$1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { type: i2$1.MatCellDef, selector: "[matCellDef]" }, { type: i2$1.MatCell, selector: "mat-cell, td[mat-cell]" }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2$1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { type: i2$1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { type: i6$1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragDisabled", "cdkDragStartDelay", "cdkDragLockAxis", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragBoundary", "cdkDragRootElement", "cdkDragPreviewContainer", "cdkDragData", "cdkDragFreeDragPosition"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }], pipes: { "translate": i5.TranslatePipe } });
3077
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DraggableTableComponent, decorators: [{
2714
3078
  type: Component,
2715
3079
  args: [{
2716
- selector: 'mantle-dashboard-section',
2717
- templateUrl: './dashboard-section.component.html',
2718
- styleUrls: ['./dashboard-section.component.scss']
3080
+ selector: 'mantle-draggable-table',
3081
+ templateUrl: './draggable-table.component.html',
3082
+ styleUrls: ['./draggable-table.component.scss']
2719
3083
  }]
2720
- }], ctorParameters: function () { return [{ type: ArrayService }, { type: ScreenSizeService }]; }, propDecorators: { dashboardPageService: [{
3084
+ }], ctorParameters: function () { return [{ type: ArrayService }]; }, propDecorators: { table: [{
3085
+ type: ViewChild,
3086
+ args: [MatTable]
3087
+ }], columns: [{
2721
3088
  type: Input
2722
- }], slug: [{
3089
+ }], items: [{
2723
3090
  type: Input
2724
- }], data: [{
3091
+ }], sortAttr: [{
2725
3092
  type: Input
2726
- }], section: [{
3093
+ }], writable: [{
2727
3094
  type: Input
2728
3095
  }] } });
2729
3096
 
2730
- class MarkdownDetailsSectionComponent {
3097
+ class RosterShiftListDetailsSectionComponent {
3098
+ constructor() { }
2731
3099
  }
2732
- MarkdownDetailsSectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: MarkdownDetailsSectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2733
- MarkdownDetailsSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: MarkdownDetailsSectionComponent, selector: "mantle-markdown-details-section", inputs: { section: "section" }, ngImport: i0, template: "<div class=\"markdown-wrapper\">\n <markdown ngPreserveWhitespaces *ngFor=\"let element of section.elements\">\n {{ element.text }}\n </markdown>\n</div>\n", styles: [""], components: [{ type: i1$5.MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "emoji", "katex", "katexOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start"], outputs: ["error", "load", "ready"] }], directives: [{ type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
2734
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: MarkdownDetailsSectionComponent, decorators: [{
3100
+ RosterShiftListDetailsSectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: RosterShiftListDetailsSectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3101
+ RosterShiftListDetailsSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: RosterShiftListDetailsSectionComponent, selector: "mantle-roster-shift-list-details-section", inputs: { data: "data", section: "section" }, ngImport: i0, template: "<div class=\"roster-shift-list-content\">\n <mantle-draggable-table\n [columns]=\"section.elements\"\n [items]=\"data[section.config.attr]\"\n [sortAttr]=\"section.options.ordinal\"\n [writable]=\"false\">\n </mantle-draggable-table>\n</div>\n", styles: [""], components: [{ type: DraggableTableComponent, selector: "mantle-draggable-table", inputs: ["columns", "items", "sortAttr", "writable"] }] });
3102
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: RosterShiftListDetailsSectionComponent, decorators: [{
2735
3103
  type: Component,
2736
3104
  args: [{
2737
- selector: 'mantle-markdown-details-section',
2738
- templateUrl: './markdown-details-section.component.html',
2739
- styleUrls: ['./markdown-details-section.component.scss']
3105
+ selector: 'mantle-roster-shift-list-details-section',
3106
+ templateUrl: './roster-shift-list-details-section.component.html',
3107
+ styleUrls: ['./roster-shift-list-details-section.component.scss']
2740
3108
  }]
2741
- }], propDecorators: { section: [{
3109
+ }], ctorParameters: function () { return []; }, propDecorators: { data: [{
3110
+ type: Input
3111
+ }], section: [{
2742
3112
  type: Input
2743
3113
  }] } });
2744
3114
 
@@ -2756,12 +3126,15 @@ class DynamicDetailsSectionComponent {
2756
3126
  asDynamicLayoutDashboardSection(section) {
2757
3127
  return section;
2758
3128
  }
3129
+ asDynamicLayoutRosterShiftListSection(section) {
3130
+ return section;
3131
+ }
2759
3132
  asDashboardPageService(detailPageService) {
2760
3133
  return detailPageService;
2761
3134
  }
2762
3135
  }
2763
3136
  DynamicDetailsSectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DynamicDetailsSectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2764
- DynamicDetailsSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DynamicDetailsSectionComponent, selector: "mantle-dynamic-details-section", inputs: { detailPageService: "detailPageService", content: "content", section: "section" }, ngImport: i0, template: "<ng-container [ngSwitch]=\"section.layout\">\n\n <ng-container *ngSwitchCase=\"'grid'\">\n <mantle-grid-details-section\n [section]=\"asDynamicLayoutGridSection(section)\"\n [data]=\"content.data\">\n </mantle-grid-details-section>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'table'\">\n <mantle-table-details-section\n [section]=\"asDynamicLayoutTableSection(section)\"\n [data]=\"content.data\">\n </mantle-table-details-section>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'dashboard'\">\n <mantle-dashboard-section\n [slug]=\"section.slug\"\n [section]=\"asDynamicLayoutDashboardSection(section)\"\n [data]=\"content.data\"\n [dashboardPageService]=\"asDashboardPageService(detailPageService)\">\n </mantle-dashboard-section>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'markdown'\">\n <mantle-markdown-details-section\n [section]=\"asDynamicLayoutMarkdownSection(section)\">\n </mantle-markdown-details-section>\n </ng-container>\n\n</ng-container>\n", styles: [""], components: [{ type: GridDetailsSectionComponent, selector: "mantle-grid-details-section", inputs: ["data", "section", "defaultRowHeight"] }, { type: TableDetailsSectionComponent, selector: "mantle-table-details-section", inputs: ["data", "section"] }, { type: DashboardSectionComponent, selector: "mantle-dashboard-section", inputs: ["dashboardPageService", "slug", "data", "section"] }, { type: MarkdownDetailsSectionComponent, selector: "mantle-markdown-details-section", inputs: ["section"] }], directives: [{ type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }] });
3137
+ DynamicDetailsSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DynamicDetailsSectionComponent, selector: "mantle-dynamic-details-section", inputs: { detailPageService: "detailPageService", content: "content", section: "section" }, ngImport: i0, template: "<ng-container [ngSwitch]=\"section.layout\">\n\n <ng-container *ngSwitchCase=\"'grid'\">\n <mantle-grid-details-section\n [section]=\"asDynamicLayoutGridSection(section)\"\n [data]=\"content.data\">\n </mantle-grid-details-section>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'table'\">\n <mantle-table-details-section\n [section]=\"asDynamicLayoutTableSection(section)\"\n [data]=\"content.data\"\n [detailPageService]=\"detailPageService\">\n </mantle-table-details-section>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'dashboard'\">\n <mantle-dashboard-section\n [slug]=\"section.slug\"\n [section]=\"asDynamicLayoutDashboardSection(section)\"\n [data]=\"content.data\"\n [dashboardPageService]=\"asDashboardPageService(detailPageService)\">\n </mantle-dashboard-section>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'markdown'\">\n <mantle-markdown-details-section\n [section]=\"asDynamicLayoutMarkdownSection(section)\">\n </mantle-markdown-details-section>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'roster-shift-list'\">\n <mantle-roster-shift-list-details-section\n [section]=\"asDynamicLayoutRosterShiftListSection(section)\"\n [data]=\"content.data\">\n </mantle-roster-shift-list-details-section>\n </ng-container>\n\n</ng-container>\n", styles: [""], components: [{ type: GridDetailsSectionComponent, selector: "mantle-grid-details-section", inputs: ["data", "section", "defaultRowHeight"] }, { type: TableDetailsSectionComponent, selector: "mantle-table-details-section", inputs: ["data", "section", "detailPageService"] }, { type: DashboardSectionComponent, selector: "mantle-dashboard-section", inputs: ["dashboardPageService", "slug", "data", "section"] }, { type: MarkdownDetailsSectionComponent, selector: "mantle-markdown-details-section", inputs: ["section"] }, { type: RosterShiftListDetailsSectionComponent, selector: "mantle-roster-shift-list-details-section", inputs: ["data", "section"] }], directives: [{ type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }] });
2765
3138
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DynamicDetailsSectionComponent, decorators: [{
2766
3139
  type: Component,
2767
3140
  args: [{
@@ -2801,7 +3174,7 @@ class AccordionDetailsContainerComponent {
2801
3174
  constructor() { }
2802
3175
  }
2803
3176
  AccordionDetailsContainerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: AccordionDetailsContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2804
- AccordionDetailsContainerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: AccordionDetailsContainerComponent, selector: "mantle-accordion-details-container", inputs: { detailPageService: "detailPageService", content: "content", container: "container" }, ngImport: i0, template: "<mat-accordion multi class=\"dynamic-details accordion\">\n <ng-container *ngFor=\"let section of container.sections\">\n <mat-expansion-panel *ngIf=\"!section.hidden\" [expanded]=\"!section.collapsed\" class=\"dynamic-details-section\">\n <mat-expansion-panel-header>\n <mat-panel-title *ngIf=\"section.title\">\n <div class=\"title-wrapper\">\n <h4>{{ section.title }}</h4>\n <mat-divider></mat-divider>\n </div>\n </mat-panel-title>\n </mat-expansion-panel-header>\n <mantle-dynamic-details-section [detailPageService]=\"detailPageService\" [section]=\"section\" [content]=\"content\">\n </mantle-dynamic-details-section>\n </mat-expansion-panel>\n </ng-container>\n</mat-accordion>\n", styles: [""], components: [{ type: i1$7.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { type: i1$7.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { type: i2$6.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { type: DynamicDetailsSectionComponent, selector: "mantle-dynamic-details-section", inputs: ["detailPageService", "content", "section"] }], directives: [{ type: i1$7.MatAccordion, selector: "mat-accordion", inputs: ["multi", "displayMode", "togglePosition", "hideToggle"], exportAs: ["matAccordion"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$7.MatExpansionPanelTitle, selector: "mat-panel-title" }] });
3177
+ AccordionDetailsContainerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: AccordionDetailsContainerComponent, selector: "mantle-accordion-details-container", inputs: { detailPageService: "detailPageService", content: "content", container: "container" }, ngImport: i0, template: "<mat-accordion multi class=\"dynamic-details accordion\">\n <ng-container *ngFor=\"let section of container.sections\">\n <mat-expansion-panel *ngIf=\"!section.hidden\" [expanded]=\"!section.collapsed\" class=\"dynamic-details-section\">\n <mat-expansion-panel-header>\n <mat-panel-title *ngIf=\"section.title\">\n <div class=\"title-wrapper\">\n <h4>{{ section.title }}</h4>\n <mat-divider></mat-divider>\n </div>\n </mat-panel-title>\n </mat-expansion-panel-header>\n <mantle-dynamic-details-section [detailPageService]=\"detailPageService\" [section]=\"section\" [content]=\"content\">\n </mantle-dynamic-details-section>\n </mat-expansion-panel>\n </ng-container>\n</mat-accordion>\n", styles: [""], components: [{ type: i1$7.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { type: i1$7.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { type: i2$7.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { type: DynamicDetailsSectionComponent, selector: "mantle-dynamic-details-section", inputs: ["detailPageService", "content", "section"] }], directives: [{ type: i1$7.MatAccordion, selector: "mat-accordion", inputs: ["multi", "displayMode", "togglePosition", "hideToggle"], exportAs: ["matAccordion"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$7.MatExpansionPanelTitle, selector: "mat-panel-title" }] });
2805
3178
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: AccordionDetailsContainerComponent, decorators: [{
2806
3179
  type: Component,
2807
3180
  args: [{
@@ -2864,11 +3237,20 @@ class DialogNestedFormComponent {
2864
3237
  this.title = this.dialogNestedFormParams.title;
2865
3238
  this.section = this.dialogNestedFormParams.section;
2866
3239
  this.showDeleteButton = this.dialogNestedFormParams.showDeleteButton;
3240
+ this.formPageService = this.dialogNestedFormParams.formPageService;
2867
3241
  if (!this.dialogNestedFormParams.data) {
2868
3242
  this.dialogNestedFormParams.data = this.dynamicFormService.generateFormInitData(this.dialogNestedFormParams.section.elements);
2869
3243
  }
2870
- this.saveButtonText = this.dialogNestedFormParams.saveButtonText || 'Save';
3244
+ this.saveButtonText = this.dialogNestedFormParams.saveButtonText || 'mantle.buttons.save';
2871
3245
  this.form = this.dynamicFormService.toFormGroup(this.dialogNestedFormParams.data);
3246
+ if (this.formPageService) {
3247
+ this.formPageService.onDialogFormContentLoaded(this.dialogNestedFormParams);
3248
+ this.form.valueChanges.subscribe(val => {
3249
+ let changes = this.formPageService.onDialogFormValueChanged(this.dialogNestedFormParams, this.form.getRawValue());
3250
+ if (changes)
3251
+ this.form.patchValue(changes);
3252
+ });
3253
+ }
2872
3254
  }
2873
3255
  ngAfterViewChecked() {
2874
3256
  this.changeDetectorRef.detectChanges();
@@ -2887,7 +3269,7 @@ class DialogNestedFormComponent {
2887
3269
  }
2888
3270
  }
2889
3271
  DialogNestedFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DialogNestedFormComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1$3.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: DynamicFormService }], target: i0.ɵɵFactoryTarget.Component });
2890
- DialogNestedFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DialogNestedFormComponent, selector: "mantle-dialog-nested-form", ngImport: i0, template: "<div mat-dialog-title fxLayout=\"row\" fxLayoutAlign=\"start\" fxLayoutGap=\"8px\" class=\"dialog-title-section\">\n <mantle-section-title fxFlex=\"1 0 1px\" [title]=\"title\"></mantle-section-title>\n <button fxFlex=\"0 0 auto\" mat-icon-button tabindex=\"-1\" (click)=\"onCancel()\">\n <mat-icon>cancel</mat-icon>\n </button>\n</div>\n\n<mat-dialog-content>\n\n <mantle-grid-form-section\n [section]=\"section\"\n [form]=\"form\">\n </mantle-grid-form-section>\n\n</mat-dialog-content>\n\n<mat-dialog-actions fxLayout=\"row\" class=\"actions-section\">\n <button fxFlex=\"0 0 auto\" *ngIf=\"showDeleteButton\" mat-button (click)=\"onDelete()\" color=\"warn\">Delete</button>\n <div fxFlex=\"1 1 auto\"></div>\n <button fxFlex=\"0 0 auto\" mat-button (click)=\"onSave()\" [disabled]=\"!form.valid\">{{ saveButtonText }}</button>\n</mat-dialog-actions>\n", styles: [""], components: [{ type: SectionTitleComponent, selector: "mantle-section-title", inputs: ["title"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: GridFormSectionComponent, selector: "mantle-grid-form-section", inputs: ["title", "section", "form", "errors", "defaultRowHeight"] }], directives: [{ type: i1$3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i1$3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i1$3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
3272
+ DialogNestedFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DialogNestedFormComponent, selector: "mantle-dialog-nested-form", ngImport: i0, template: "<div mat-dialog-title fxLayout=\"row\" fxLayoutAlign=\"start\" fxLayoutGap=\"8px\" class=\"dialog-title-section\">\n <mantle-section-title fxFlex=\"1 0 1px\" [title]=\"title\"></mantle-section-title>\n <button fxFlex=\"0 0 auto\" mat-icon-button tabindex=\"-1\" (click)=\"onCancel()\">\n <mat-icon>cancel</mat-icon>\n </button>\n</div>\n\n<mat-dialog-content>\n\n <mantle-grid-form-section\n [section]=\"section\"\n [form]=\"form\">\n </mantle-grid-form-section>\n\n</mat-dialog-content>\n\n<mat-dialog-actions fxLayout=\"row\" class=\"actions-section\">\n <button fxFlex=\"0 0 auto\" *ngIf=\"showDeleteButton\" mat-button (click)=\"onDelete()\" color=\"warn\">{{ 'mantle.buttons.delete' | translate }}</button>\n <div fxFlex=\"1 1 auto\"></div>\n <button fxFlex=\"0 0 auto\" mat-button (click)=\"onSave()\" [disabled]=\"!form.valid\">{{ saveButtonText | translate }}</button>\n</mat-dialog-actions>\n", styles: [""], components: [{ type: SectionTitleComponent, selector: "mantle-section-title", inputs: ["title"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: GridFormSectionComponent, selector: "mantle-grid-form-section", inputs: ["title", "section", "form", "errors", "defaultRowHeight"] }], directives: [{ type: i1$3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i1$3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i1$3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "translate": i5.TranslatePipe } });
2891
3273
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DialogNestedFormComponent, decorators: [{
2892
3274
  type: Component,
2893
3275
  args: [{
@@ -2924,6 +3306,9 @@ class TableFormSectionComponent {
2924
3306
  showEditButton: this.section.config.can_edit
2925
3307
  };
2926
3308
  dialogConfig.width = '80%';
3309
+ if (this.section.config.modal_section) {
3310
+ dialogConfig.data.section = this.formPageService.formDialogLayoutChanges(this.section.config.modal_section, record);
3311
+ }
2927
3312
  const dialogRef = this.dialog.open(DialogNestedDetailsComponent, dialogConfig);
2928
3313
  dialogRef.afterClosed().subscribe((dialogResponse) => {
2929
3314
  if (dialogResponse && dialogResponse.edit) {
@@ -2937,9 +3322,13 @@ class TableFormSectionComponent {
2937
3322
  title: record ? 'Edit Item' : 'Add Item',
2938
3323
  section: this.section.config.modal_section,
2939
3324
  data: record,
2940
- showDeleteButton: this.section.config.can_delete
3325
+ showDeleteButton: this.section.config.can_delete,
3326
+ formPageService: this.formPageService
2941
3327
  };
2942
3328
  dialogConfig.width = '80%';
3329
+ if (this.section.config.modal_section) {
3330
+ dialogConfig.data.section = this.formPageService.formDialogLayoutChanges(this.section.config.modal_section, record || null);
3331
+ }
2943
3332
  const dialogRef = this.dialog.open(DialogNestedFormComponent, dialogConfig);
2944
3333
  dialogRef.afterClosed().subscribe((formData) => {
2945
3334
  if (formData) {
@@ -2978,7 +3367,7 @@ class TableFormSectionComponent {
2978
3367
  }
2979
3368
  }
2980
3369
  TableFormSectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: TableFormSectionComponent, deps: [{ token: i1$3.MatDialog }, { token: ArrayService }], target: i0.ɵɵFactoryTarget.Component });
2981
- TableFormSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: TableFormSectionComponent, selector: "mantle-table-form-section", inputs: { title: "title", section: "section", form: "form" }, ngImport: i0, template: "<mantle-section-title *ngIf=\"title\" [title]=\"title\"></mantle-section-title>\n\n<div class=\"table-section-content\">\n <button *ngIf=\"canAddRecord()\" mat-raised-button color=\"primary\" type=\"button\" class=\"add-button\" (click)=\"openFormDialog()\">\n + Add Item\n </button>\n\n <mantle-dynamic-table\n [columns]=\"section.elements\"\n [items]=\"form.value[section.config.attr]\"\n [withClickableRows]=\"true\"\n (rowClicked)=\"openDetailsDialog($event)\">\n </mantle-dynamic-table>\n</div>\n", styles: [".add-button{text-transform:uppercase;border-radius:0}\n"], components: [{ type: SectionTitleComponent, selector: "mantle-section-title", inputs: ["title"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: DynamicTableComponent, selector: "mantle-dynamic-table", inputs: ["columns", "items", "withClickableRows"], outputs: ["rowClicked"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
3370
+ TableFormSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: TableFormSectionComponent, selector: "mantle-table-form-section", inputs: { title: "title", section: "section", form: "form", formPageService: "formPageService" }, ngImport: i0, template: "<mantle-section-title *ngIf=\"title\" [title]=\"title\"></mantle-section-title>\n\n<div class=\"table-section-content\">\n <button *ngIf=\"canAddRecord()\" mat-raised-button color=\"primary\" type=\"button\" class=\"add-button\" (click)=\"openFormDialog()\">\n + {{ 'mantle.buttons.add_item' | translate }}\n </button>\n\n <mantle-dynamic-table\n [columns]=\"section.elements\"\n [items]=\"form.value[section.config.attr]\"\n [withClickableRows]=\"true\"\n (rowClicked)=\"openDetailsDialog($event)\">\n </mantle-dynamic-table>\n</div>\n", styles: [".add-button{text-transform:uppercase;border-radius:0}\n"], components: [{ type: SectionTitleComponent, selector: "mantle-section-title", inputs: ["title"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: DynamicTableComponent, selector: "mantle-dynamic-table", inputs: ["columns", "items", "withClickableRows"], outputs: ["rowClicked"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "translate": i5.TranslatePipe } });
2982
3371
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: TableFormSectionComponent, decorators: [{
2983
3372
  type: Component,
2984
3373
  args: [{
@@ -2992,6 +3381,69 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
2992
3381
  type: Input
2993
3382
  }], form: [{
2994
3383
  type: Input
3384
+ }], formPageService: [{
3385
+ type: Input
3386
+ }] } });
3387
+
3388
+ class RosterShiftListFormSectionComponent {
3389
+ constructor() { }
3390
+ ngOnInit() {
3391
+ this.setDropdownValues();
3392
+ }
3393
+ canAddRecord() {
3394
+ if (!this.section.config.can_add)
3395
+ return false;
3396
+ if (!this.section.options.max_record_count)
3397
+ return true;
3398
+ let recordCount = this.form.value[this.section.config.attr].filter((item) => {
3399
+ return !item._destroy;
3400
+ }).length;
3401
+ return this.section.options.max_record_count > recordCount;
3402
+ }
3403
+ setDropdownValues() {
3404
+ let primaryColumnIndex = this.section.elements.findIndex((element) => element.attr == this.section.options.draggable_attr);
3405
+ if (primaryColumnIndex == -1)
3406
+ return;
3407
+ this.dropdownValues = this.section.elements[primaryColumnIndex].options.values.filter((option) => { return !option.hidden; });
3408
+ ;
3409
+ }
3410
+ onAddClicked(value) {
3411
+ let sortAttr = this.section.options.ordinal;
3412
+ let attribute = this.section.options.draggable_attr;
3413
+ let tableContent = [...this.form.getRawValue()[this.section.config.attr]];
3414
+ let formData = {};
3415
+ formData[sortAttr] = tableContent.filter(item => { return !item._destroy; }).length + 1;
3416
+ formData[attribute] = value;
3417
+ tableContent.push(formData);
3418
+ this.form.patchValue({
3419
+ [this.section.config.attr]: tableContent
3420
+ });
3421
+ }
3422
+ get valid() {
3423
+ return this.form.valid;
3424
+ }
3425
+ get value() {
3426
+ return this.form.getRawValue();
3427
+ }
3428
+ reset() {
3429
+ this.form.reset();
3430
+ }
3431
+ }
3432
+ RosterShiftListFormSectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: RosterShiftListFormSectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3433
+ RosterShiftListFormSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: RosterShiftListFormSectionComponent, selector: "mantle-roster-shift-list-form-section", inputs: { title: "title", section: "section", form: "form" }, ngImport: i0, template: "<mantle-section-title *ngIf=\"title\" [title]=\"title\"></mantle-section-title>\n\n<div class=\"roster-shift-list-content\">\n <mantle-draggable-table\n [columns]=\"section.elements\"\n [items]=\"form.value[section.config.attr]\"\n [sortAttr]=\"section.options.ordinal\"\n [writable]=\"true\">\n </mantle-draggable-table>\n\n <div class=\"dropdown-add-button-section\" *ngIf=\"canAddRecord()\">\n <button mat-raised-button color=\"primary\"\n type=\"button\" class=\"add-button\"\n [matMenuTriggerFor]=\"dropdownMenu\">\n + {{ 'mantle.buttons.add_item' | translate }} \n </button>\n <mat-menu #dropdownMenu=\"matMenu\">\n <button *ngFor=\"let dropdownValue of dropdownValues\"\n mat-menu-item\n (click)=\"onAddClicked(dropdownValue.value)\">\n {{ dropdownValue.label }}\n </button>\n </mat-menu>\n </div>\n</div>\n", styles: [".add-button{text-transform:uppercase;border-radius:0}.dropdown-add-button-section{padding-top:20px}\n"], components: [{ type: SectionTitleComponent, selector: "mantle-section-title", inputs: ["title"] }, { type: DraggableTableComponent, selector: "mantle-draggable-table", inputs: ["columns", "items", "sortAttr", "writable"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$4.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: i4$4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4$4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "translate": i5.TranslatePipe } });
3434
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: RosterShiftListFormSectionComponent, decorators: [{
3435
+ type: Component,
3436
+ args: [{
3437
+ selector: 'mantle-roster-shift-list-form-section',
3438
+ templateUrl: './roster-shift-list-form-section.component.html',
3439
+ styleUrls: ['./roster-shift-list-form-section.component.scss']
3440
+ }]
3441
+ }], ctorParameters: function () { return []; }, propDecorators: { title: [{
3442
+ type: Input
3443
+ }], section: [{
3444
+ type: Input
3445
+ }], form: [{
3446
+ type: Input
2995
3447
  }] } });
2996
3448
 
2997
3449
  class DynamicFormSectionComponent {
@@ -3008,12 +3460,18 @@ class DynamicFormSectionComponent {
3008
3460
  asDynamicLayoutDashboardSection(section) {
3009
3461
  return section;
3010
3462
  }
3463
+ asDynamicLayoutRosterShiftListSection(section) {
3464
+ return section;
3465
+ }
3011
3466
  asDashboardPageService(formPageService) {
3012
3467
  return formPageService;
3013
3468
  }
3469
+ asDetailPageService(formPageService) {
3470
+ return formPageService;
3471
+ }
3014
3472
  }
3015
3473
  DynamicFormSectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DynamicFormSectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3016
- DynamicFormSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DynamicFormSectionComponent, selector: "mantle-dynamic-form-section", inputs: { formPageService: "formPageService", section: "section", content: "content", form: "form" }, ngImport: i0, template: "<ng-container *ngIf=\"section.writable\">\n <ng-container *ngTemplateOutlet=\"dynamicFormContent; context: { form: form, section: section, content: content };\"></ng-container>\n</ng-container>\n<ng-container *ngIf=\"!section.writable\">\n <ng-container *ngTemplateOutlet=\"dynamicDetailsContent; context: { section: section, content: content };\"></ng-container>\n</ng-container>\n\n<ng-template #dynamicFormContent let-form=\"form\" let-content=\"content\" let-section=\"section\">\n <ng-container [ngSwitch]=\"section.layout\">\n\n <ng-container *ngSwitchCase=\"'grid'\">\n <mantle-grid-form-section\n [section]=\"asDynamicLayoutGridSection(section)\"\n [form]=\"form\"\n [errors]=\"content.errors || {}\">\n </mantle-grid-form-section>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'table'\">\n <mantle-table-form-section\n [section]=\"asDynamicLayoutTableSection(section)\"\n [form]=\"form\">\n </mantle-table-form-section>\n </ng-container>\n\n </ng-container>\n</ng-template>\n\n<ng-template #dynamicDetailsContent let-content=\"content\" let-section=\"section\">\n <ng-container [ngSwitch]=\"section.layout\">\n\n <ng-container *ngSwitchCase=\"'grid'\">\n <mantle-grid-details-section\n [section]=\"asDynamicLayoutGridSection(section)\"\n [data]=\"content.data\">\n </mantle-grid-details-section>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'table'\">\n <mantle-table-details-section\n [section]=\"asDynamicLayoutTableSection(section)\"\n [data]=\"content.data\">\n </mantle-table-details-section>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'dashboard'\">\n <mantle-dashboard-section\n [slug]=\"section.slug\"\n [section]=\"asDynamicLayoutDashboardSection(section)\"\n [data]=\"content.data\"\n [dashboardPageService]=\"asDashboardPageService(formPageService)\">\n </mantle-dashboard-section>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'markdown'\">\n <mantle-markdown-details-section\n [section]=\"asDynamicLayoutMarkdownSection(section)\">\n </mantle-markdown-details-section>\n </ng-container>\n\n </ng-container>\n</ng-template>\n", styles: [""], components: [{ type: GridFormSectionComponent, selector: "mantle-grid-form-section", inputs: ["title", "section", "form", "errors", "defaultRowHeight"] }, { type: TableFormSectionComponent, selector: "mantle-table-form-section", inputs: ["title", "section", "form"] }, { type: GridDetailsSectionComponent, selector: "mantle-grid-details-section", inputs: ["data", "section", "defaultRowHeight"] }, { type: TableDetailsSectionComponent, selector: "mantle-table-details-section", inputs: ["data", "section"] }, { type: DashboardSectionComponent, selector: "mantle-dashboard-section", inputs: ["dashboardPageService", "slug", "data", "section"] }, { type: MarkdownDetailsSectionComponent, selector: "mantle-markdown-details-section", inputs: ["section"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }] });
3474
+ DynamicFormSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DynamicFormSectionComponent, selector: "mantle-dynamic-form-section", inputs: { formPageService: "formPageService", section: "section", content: "content", form: "form" }, ngImport: i0, template: "<ng-container *ngIf=\"section.writable\">\n <ng-container *ngTemplateOutlet=\"dynamicFormContent; context: { form: form, section: section, content: content };\"></ng-container>\n</ng-container>\n<ng-container *ngIf=\"!section.writable\">\n <ng-container *ngTemplateOutlet=\"dynamicDetailsContent; context: { section: section, content: content };\"></ng-container>\n</ng-container>\n\n<ng-template #dynamicFormContent let-form=\"form\" let-content=\"content\" let-section=\"section\">\n <ng-container [ngSwitch]=\"section.layout\">\n\n <ng-container *ngSwitchCase=\"'grid'\">\n <mantle-grid-form-section\n [section]=\"asDynamicLayoutGridSection(section)\"\n [form]=\"form\"\n [errors]=\"content.errors || {}\">\n </mantle-grid-form-section>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'table'\">\n <mantle-table-form-section\n [section]=\"asDynamicLayoutTableSection(section)\"\n [form]=\"form\"\n [formPageService]=\"formPageService\">\n </mantle-table-form-section>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'roster-shift-list'\">\n <mantle-roster-shift-list-form-section\n [section]=\"asDynamicLayoutRosterShiftListSection(section)\"\n [form]=\"form\">\n </mantle-roster-shift-list-form-section>\n </ng-container>\n\n </ng-container>\n</ng-template>\n\n<ng-template #dynamicDetailsContent let-content=\"content\" let-section=\"section\">\n <ng-container [ngSwitch]=\"section.layout\">\n\n <ng-container *ngSwitchCase=\"'grid'\">\n <mantle-grid-details-section\n [section]=\"asDynamicLayoutGridSection(section)\"\n [data]=\"content.data\">\n </mantle-grid-details-section>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'table'\">\n <mantle-table-details-section\n [section]=\"asDynamicLayoutTableSection(section)\"\n [data]=\"content.data\"\n [detailPageService]=\"asDetailPageService(formPageService)\">\n </mantle-table-details-section>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'dashboard'\">\n <mantle-dashboard-section\n [slug]=\"section.slug\"\n [section]=\"asDynamicLayoutDashboardSection(section)\"\n [data]=\"content.data\"\n [dashboardPageService]=\"asDashboardPageService(formPageService)\">\n </mantle-dashboard-section>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'markdown'\">\n <mantle-markdown-details-section\n [section]=\"asDynamicLayoutMarkdownSection(section)\">\n </mantle-markdown-details-section>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'roster-shift-list'\">\n <mantle-roster-shift-list-details-section\n [section]=\"asDynamicLayoutRosterShiftListSection(section)\"\n [data]=\"content.data\">\n </mantle-roster-shift-list-details-section>\n </ng-container>\n\n </ng-container>\n</ng-template>\n", styles: [""], components: [{ type: GridFormSectionComponent, selector: "mantle-grid-form-section", inputs: ["title", "section", "form", "errors", "defaultRowHeight"] }, { type: TableFormSectionComponent, selector: "mantle-table-form-section", inputs: ["title", "section", "form", "formPageService"] }, { type: RosterShiftListFormSectionComponent, selector: "mantle-roster-shift-list-form-section", inputs: ["title", "section", "form"] }, { type: GridDetailsSectionComponent, selector: "mantle-grid-details-section", inputs: ["data", "section", "defaultRowHeight"] }, { type: TableDetailsSectionComponent, selector: "mantle-table-details-section", inputs: ["data", "section", "detailPageService"] }, { type: DashboardSectionComponent, selector: "mantle-dashboard-section", inputs: ["dashboardPageService", "slug", "data", "section"] }, { type: MarkdownDetailsSectionComponent, selector: "mantle-markdown-details-section", inputs: ["section"] }, { type: RosterShiftListDetailsSectionComponent, selector: "mantle-roster-shift-list-details-section", inputs: ["data", "section"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }] });
3017
3475
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DynamicFormSectionComponent, decorators: [{
3018
3476
  type: Component,
3019
3477
  args: [{
@@ -3057,7 +3515,7 @@ class AccordionFormContainerComponent {
3057
3515
  constructor() { }
3058
3516
  }
3059
3517
  AccordionFormContainerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: AccordionFormContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3060
- AccordionFormContainerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: AccordionFormContainerComponent, selector: "mantle-accordion-form-container", inputs: { formPageService: "formPageService", content: "content", container: "container", form: "form" }, ngImport: i0, template: "<mat-accordion multi class=\"dynamic-form accordion\">\n <ng-container *ngFor=\"let section of container.sections\">\n <mat-expansion-panel *ngIf=\"!section.hidden\" [expanded]=\"!section.collapsed\" class=\"dynamic-form-section\">\n <mat-expansion-panel-header>\n <mat-panel-title *ngIf=\"section.title\">\n <div class=\"title-wrapper\">\n <h4>{{ section.title }}</h4>\n <mat-divider></mat-divider>\n </div>\n </mat-panel-title>\n </mat-expansion-panel-header>\n <mantle-dynamic-form-section [formPageService]=\"formPageService\" [section]=\"section\" [content]=\"content\" [form]=\"form\">\n </mantle-dynamic-form-section>\n </mat-expansion-panel>\n </ng-container>\n</mat-accordion>\n", styles: [""], components: [{ type: i1$7.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { type: i1$7.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { type: i2$6.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { type: DynamicFormSectionComponent, selector: "mantle-dynamic-form-section", inputs: ["formPageService", "section", "content", "form"] }], directives: [{ type: i1$7.MatAccordion, selector: "mat-accordion", inputs: ["multi", "displayMode", "togglePosition", "hideToggle"], exportAs: ["matAccordion"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$7.MatExpansionPanelTitle, selector: "mat-panel-title" }] });
3518
+ AccordionFormContainerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: AccordionFormContainerComponent, selector: "mantle-accordion-form-container", inputs: { formPageService: "formPageService", content: "content", container: "container", form: "form" }, ngImport: i0, template: "<mat-accordion multi class=\"dynamic-form accordion\">\n <ng-container *ngFor=\"let section of container.sections\">\n <mat-expansion-panel *ngIf=\"!section.hidden\" [expanded]=\"!section.collapsed\" class=\"dynamic-form-section\">\n <mat-expansion-panel-header>\n <mat-panel-title *ngIf=\"section.title\">\n <div class=\"title-wrapper\">\n <h4>{{ section.title }}</h4>\n <mat-divider></mat-divider>\n </div>\n </mat-panel-title>\n </mat-expansion-panel-header>\n <mantle-dynamic-form-section [formPageService]=\"formPageService\" [section]=\"section\" [content]=\"content\" [form]=\"form\">\n </mantle-dynamic-form-section>\n </mat-expansion-panel>\n </ng-container>\n</mat-accordion>\n", styles: [""], components: [{ type: i1$7.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { type: i1$7.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { type: i2$7.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { type: DynamicFormSectionComponent, selector: "mantle-dynamic-form-section", inputs: ["formPageService", "section", "content", "form"] }], directives: [{ type: i1$7.MatAccordion, selector: "mat-accordion", inputs: ["multi", "displayMode", "togglePosition", "hideToggle"], exportAs: ["matAccordion"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$7.MatExpansionPanelTitle, selector: "mat-panel-title" }] });
3061
3519
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: AccordionFormContainerComponent, decorators: [{
3062
3520
  type: Component,
3063
3521
  args: [{
@@ -3107,7 +3565,11 @@ class DynamicFormComponent {
3107
3565
  this.form = this.dynamicFormService.toFormGroup(this.content.data);
3108
3566
  if (this.formPageService) {
3109
3567
  this.form.valueChanges.subscribe(val => {
3110
- this.formPageService.onFormValueChanged(this.content, this.form.getRawValue());
3568
+ let changes = this.formPageService.onFormValueChanged(this.content, this.form.getRawValue());
3569
+ if (changes) {
3570
+ this.content.data = Object.assign(Object.assign({}, this.content.data), changes);
3571
+ this.form.patchValue(changes);
3572
+ }
3111
3573
  });
3112
3574
  }
3113
3575
  }
@@ -3164,7 +3626,7 @@ class SnackbarComponent {
3164
3626
  }
3165
3627
  }
3166
3628
  SnackbarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: SnackbarComponent, deps: [{ token: MAT_SNACK_BAR_DATA }, { token: i1$8.MatSnackBarRef }], target: i0.ɵɵFactoryTarget.Component });
3167
- SnackbarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: SnackbarComponent, selector: "mantle-snackbar", ngImport: i0, template: "<div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"8px\" class=\"snack-container\">\n <div fxFlex=\"0 0 auto\">\n <mat-icon class=\"large-icon\">{{ icon }}</mat-icon>\n </div>\n <div fxFlex=\"1 0 1px\">\n <span>{{ data.message }}</span>\n </div>\n <div fxFlex=\"0 0 auto\">\n <button mat-icon-button (click)=\"close()\"><mat-icon>done</mat-icon></button>\n </div>\n</div>\n", styles: [".large-icon{width:32px;height:32px;font-size:32px}\n"], components: [{ type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }] });
3629
+ SnackbarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: SnackbarComponent, selector: "mantle-snackbar", ngImport: i0, template: "<div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"8px\" class=\"snack-container\">\n <div fxFlex=\"0 0 auto\">\n <mat-icon class=\"large-icon\">{{ icon }}</mat-icon>\n </div>\n <div fxFlex=\"1 0 1px\">\n <span>{{ data.message | translate }}</span>\n </div>\n <div fxFlex=\"0 0 auto\">\n <button mat-icon-button (click)=\"close()\"><mat-icon>done</mat-icon></button>\n </div>\n</div>\n", styles: [".large-icon{width:32px;height:32px;font-size:32px}\n"], components: [{ type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }], pipes: { "translate": i5.TranslatePipe } });
3168
3630
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: SnackbarComponent, decorators: [{
3169
3631
  type: Component,
3170
3632
  args: [{
@@ -3225,7 +3687,7 @@ class DialogFormComponent {
3225
3687
  this.formPageService = this.dialogFormParams.formPageService;
3226
3688
  this.id = this.dialogFormParams.id;
3227
3689
  this.title = this.dialogFormParams.title;
3228
- let responseObservable = this.id ? this.formPageService.getEdit(this.id) : this.formPageService.getNew();
3690
+ let responseObservable = this.id ? this.formPageService.getEdit(this.id) : this.formPageService.getNew(this.dialogFormParams.initData);
3229
3691
  this.content$ = responseObservable.pipe(map((res) => {
3230
3692
  if (this.dialogFormParams.initData) {
3231
3693
  res.content.data = this.objectService.deepMerge(res.content.data, this.dialogFormParams.initData);
@@ -3248,7 +3710,7 @@ class DialogFormComponent {
3248
3710
  onSaveSuccess(res) {
3249
3711
  this.id = res.id;
3250
3712
  this.content$ = of(res.content);
3251
- this.announcementService.success('Save successful!');
3713
+ this.announcementService.success('mantle.messages.save_successful');
3252
3714
  this.close(res.content.data);
3253
3715
  this.isSaveInProgress = false;
3254
3716
  }
@@ -3260,18 +3722,30 @@ class DialogFormComponent {
3260
3722
  else {
3261
3723
  this.close();
3262
3724
  }
3263
- this.announcementService.error('Save failed!');
3725
+ this.announcementService.error('mantle.messages.save_failed');
3264
3726
  if (!!((_a = res.error.alert) === null || _a === void 0 ? void 0 : _a.message)) {
3265
3727
  this.announcementService.error(res.error.alert.message);
3266
3728
  }
3267
3729
  this.isSaveInProgress = false;
3268
3730
  }
3731
+ onDeleteClicked() {
3732
+ this.formPageService.delete(this.id, () => { this.isDeleteInProgress = true; }, (res) => { this.onDeleteSuccess(res); }, (res) => { this.onDeleteFailure(res); });
3733
+ }
3734
+ onDeleteSuccess(res) {
3735
+ this.announcementService.success('mantle.messages.delete_successful');
3736
+ this.close({ id: this.id, _destroy: true });
3737
+ this.isDeleteInProgress = false;
3738
+ }
3739
+ onDeleteFailure(res) {
3740
+ this.announcementService.error('mantle.messages.delete_failed');
3741
+ this.isDeleteInProgress = false;
3742
+ }
3269
3743
  close(result = false) {
3270
3744
  this.dialogRef.close(result);
3271
3745
  }
3272
3746
  }
3273
3747
  DialogFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DialogFormComponent, deps: [{ token: i1$3.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i0.ChangeDetectorRef }, { token: AnnouncementService }, { token: ObjectService }], target: i0.ɵɵFactoryTarget.Component });
3274
- DialogFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DialogFormComponent, selector: "mantle-dialog-form", viewQueries: [{ propertyName: "dynamicForm", first: true, predicate: DynamicFormComponent, descendants: true }], ngImport: i0, template: "<div mat-dialog-title fxLayout=\"row\" fxLayoutAlign=\"start\" fxLayoutGap=\"8px\" class=\"dialog-title-section\">\n <mantle-section-title fxFlex=\"1 0 1px\" [title]=\"title\"></mantle-section-title>\n <button fxFlex=\"0 0 auto\" mat-icon-button tabindex=\"-1\" (click)=\"onCancelClicked()\">\n <mat-icon>cancel</mat-icon>\n </button>\n</div>\n\n<mat-dialog-content>\n <mantle-dynamic-form #dynamicForm [content]=\"content$ | async\"></mantle-dynamic-form>\n</mat-dialog-content>\n\n<mat-dialog-actions fxLayout=\"row\" class=\"actions-section\">\n <div fxFlex=\"1 1 auto\"></div>\n\n <div fxFlex=\"0 0 auto\">\n <button mat-raised-button\n *ngIf=\"!isSaveInProgress\"\n color=\"primary\"\n type=\"button\"\n class=\"save-button\"\n (click)=\"onSaveClicked()\"\n [disabled]=\"!dynamicForm?.valid\">\n Save\n </button>\n\n <button mat-raised-button\n *ngIf=\"isSaveInProgress\"\n color=\"primary\"\n type=\"button\"\n class=\"saving-button\"\n (click)=\"onSaveClicked()\"\n [disabled]=\"true\">\n Saving\n <mat-spinner matSuffix [diameter]=\"16\"></mat-spinner>\n </button>\n </div>\n</mat-dialog-actions>\n", styles: [".save-button,.saving-button{width:140px}.saving-button .mat-spinner{position:absolute;top:10px;right:12px}\n"], components: [{ type: SectionTitleComponent, selector: "mantle-section-title", inputs: ["title"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: DynamicFormComponent, selector: "mantle-dynamic-form", inputs: ["formPageService", "content"] }, { type: i6.MatSpinner, selector: "mat-spinner", inputs: ["color"] }], directives: [{ type: i1$3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i1$3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i1$3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatSuffix, selector: "[matSuffix]" }], pipes: { "async": i4.AsyncPipe } });
3748
+ DialogFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DialogFormComponent, selector: "mantle-dialog-form", viewQueries: [{ propertyName: "dynamicForm", first: true, predicate: DynamicFormComponent, descendants: true }], ngImport: i0, template: "<div mat-dialog-title fxLayout=\"row\" fxLayoutAlign=\"start\" fxLayoutGap=\"8px\" class=\"dialog-title-section\">\n <mantle-section-title fxFlex=\"1 0 1px\" [title]=\"title\"></mantle-section-title>\n <button fxFlex=\"0 0 auto\" mat-icon-button tabindex=\"-1\" (click)=\"onCancelClicked()\">\n <mat-icon>cancel</mat-icon>\n </button>\n</div>\n\n<mat-dialog-content>\n <mantle-dynamic-form #dynamicForm [content]=\"content$ | async\"></mantle-dynamic-form>\n</mat-dialog-content>\n\n<mat-dialog-actions fxLayout=\"row\" class=\"actions-section\">\n <div fxFlex=\"0 0 auto\" *ngIf=\"!!id && formPageService.showDeleteButtonInForm\">\n <button mat-button\n *ngIf=\"!isDeleteInProgress\"\n color=\"warn\"\n type=\"button\"\n class=\"delete-button\"\n (click)=\"onDeleteClicked()\">\n {{ 'mantle.buttons.delete' | translate }}\n </button>\n\n <button mat-raised-button\n *ngIf=\"isDeleteInProgress\"\n color=\"warn\"\n type=\"button\"\n class=\"deleting-button\"\n [disabled]=\"true\">\n {{ 'mantle.buttons.deleting' | translate }}\n <mat-spinner matSuffix [diameter]=\"16\"></mat-spinner>\n </button>\n </div>\n\n <div fxFlex=\"1 1 auto\"></div>\n\n <div fxFlex=\"0 0 auto\">\n <button mat-raised-button\n *ngIf=\"!isSaveInProgress\"\n color=\"primary\"\n type=\"button\"\n class=\"save-button\"\n (click)=\"onSaveClicked()\"\n [disabled]=\"!dynamicForm?.valid\">\n {{ 'mantle.buttons.save' | translate }}\n </button>\n\n <button mat-raised-button\n *ngIf=\"isSaveInProgress\"\n color=\"primary\"\n type=\"button\"\n class=\"saving-button\"\n (click)=\"onSaveClicked()\"\n [disabled]=\"true\">\n {{ 'mantle.buttons.saving' | translate }}\n <mat-spinner matSuffix [diameter]=\"16\"></mat-spinner>\n </button>\n </div>\n</mat-dialog-actions>\n", styles: [".save-button,.saving-button{width:140px}.saving-button .mat-spinner{position:absolute;top:10px;right:12px}\n"], components: [{ type: SectionTitleComponent, selector: "mantle-section-title", inputs: ["title"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: DynamicFormComponent, selector: "mantle-dynamic-form", inputs: ["formPageService", "content"] }, { type: i6.MatSpinner, selector: "mat-spinner", inputs: ["color"] }], directives: [{ type: i1$3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i1$3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i1$3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatSuffix, selector: "[matSuffix]" }], pipes: { "async": i4.AsyncPipe, "translate": i5.TranslatePipe } });
3275
3749
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DialogFormComponent, decorators: [{
3276
3750
  type: Component,
3277
3751
  args: [{
@@ -3339,7 +3813,7 @@ class LayoutEditorFieldElementComponent {
3339
3813
  }
3340
3814
  }
3341
3815
  LayoutEditorFieldElementComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: LayoutEditorFieldElementComponent, deps: [{ token: i1$3.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
3342
- LayoutEditorFieldElementComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: LayoutEditorFieldElementComponent, selector: "mantle-layout-editor-field-element", inputs: { element: "element", showControls: "showControls" }, ngImport: i0, template: "<mat-card>\n <div class=\"element-content\" fxLayout=\"column\" fxLayoutAlign=\"stretch\">\n\n <div fxFlex=\"0 0 40px\">\n <div *ngIf=\"showControls\" fxLayout=\"row\" fxLayoutAlign=\"center start\" class=\"element-controls\">\n <div fxFlex=\"0 0 auto\">\n <button mat-icon-button\n type=\"button\">\n <mat-icon>drag_indicator</mat-icon>\n </button>\n </div>\n <div fxFlex=\"1 1 auto\"></div>\n <div *ngIf=\"element.user_specified\" fxFlex=\"0 0 auto\">\n <button mat-icon-button\n color=\"primary\"\n type=\"button\"\n (click)=\"onEditElementClicked()\">\n <mat-icon>edit</mat-icon>\n </button>\n </div>\n <div *ngIf=\"element.user_specified\" fxFlex=\"0 0 auto\">\n <button mat-icon-button\n color=\"warn\"\n type=\"button\"\n (click)=\"onDeleteElementClicked()\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </div>\n </div>\n\n <div fxFlex=\"1 0 0\"></div>\n\n <div fxFlex=\"0 0 auto\">\n <h4 class=\"label\">{{ element.label }}</h4>\n </div>\n\n <div fxFlex=\"1 0 0\"></div>\n\n <div fxFlex=\"0 0 auto\">\n <h5 class=\"properties\"><b>{{ '{' }}</b> {{ element.attr_type }} <b>{{ '}' }}</b></h5>\n </div>\n\n </div>\n</mat-card>\n", styles: [".mat-card{height:100px;padding:8px}.mat-card .element-content{height:100%}.mat-card .element-content .label{width:100%;margin-bottom:0;text-align:center;font-weight:bold}.mat-card .element-content .properties{width:100%;margin-bottom:0;text-align:right}.mat-card .element-content .element-controls .mat-icon{font-size:20px}\n"], components: [{ type: i3$6.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
3816
+ LayoutEditorFieldElementComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: LayoutEditorFieldElementComponent, selector: "mantle-layout-editor-field-element", inputs: { element: "element", showControls: "showControls" }, ngImport: i0, template: "<mat-card>\n <div class=\"element-content\" fxLayout=\"column\" fxLayoutAlign=\"stretch\">\n\n <div fxFlex=\"0 0 40px\">\n <div *ngIf=\"showControls\" fxLayout=\"row\" fxLayoutAlign=\"center start\" class=\"element-controls\">\n <div fxFlex=\"0 0 auto\">\n <button mat-icon-button\n type=\"button\">\n <mat-icon>drag_indicator</mat-icon>\n </button>\n </div>\n <div fxFlex=\"1 1 auto\"></div>\n <div *ngIf=\"element.user_specified\" fxFlex=\"0 0 auto\">\n <button mat-icon-button\n color=\"primary\"\n type=\"button\"\n (click)=\"onEditElementClicked()\">\n <mat-icon>edit</mat-icon>\n </button>\n </div>\n <div *ngIf=\"element.user_specified\" fxFlex=\"0 0 auto\">\n <button mat-icon-button\n color=\"warn\"\n type=\"button\"\n (click)=\"onDeleteElementClicked()\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </div>\n </div>\n\n <div fxFlex=\"1 0 0\"></div>\n\n <div fxFlex=\"0 0 auto\">\n <h4 class=\"label\">{{ element.label }}</h4>\n </div>\n\n <div fxFlex=\"1 0 0\"></div>\n\n <div fxFlex=\"0 0 auto\">\n <h5 class=\"properties\"><b>{{ '{' }}</b> {{ element.attr_type }} <b>{{ '}' }}</b></h5>\n </div>\n\n </div>\n</mat-card>\n", styles: [".mat-card{height:100px;padding:8px}.mat-card .element-content{height:100%}.mat-card .element-content .label{width:100%;margin-bottom:0;text-align:center;font-weight:bold}.mat-card .element-content .properties{width:100%;margin-bottom:0;text-align:right}.mat-card .element-content .element-controls .mat-icon{font-size:20px}\n"], components: [{ type: i3$6.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
3343
3817
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: LayoutEditorFieldElementComponent, decorators: [{
3344
3818
  type: Component,
3345
3819
  args: [{
@@ -3405,7 +3879,7 @@ class LayoutEditorTableColumnElementComponent {
3405
3879
  }
3406
3880
  }
3407
3881
  LayoutEditorTableColumnElementComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: LayoutEditorTableColumnElementComponent, deps: [{ token: i1$3.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
3408
- LayoutEditorTableColumnElementComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: LayoutEditorTableColumnElementComponent, selector: "mantle-layout-editor-table-column-element", inputs: { element: "element", showControls: "showControls" }, ngImport: i0, template: "<mat-card>\n <div class=\"element-content\" fxLayout=\"column\" fxLayoutAlign=\"stretch\">\n\n <div fxFlex=\"0 0 40px\">\n <div *ngIf=\"showControls\" fxLayout=\"row\" fxLayoutAlign=\"center start\" class=\"element-controls\">\n <div fxFlex=\"0 0 auto\">\n <button mat-icon-button\n type=\"button\">\n <mat-icon>drag_indicator</mat-icon>\n </button>\n </div>\n <div fxFlex=\"1 1 auto\"></div>\n <div *ngIf=\"element.user_specified\" fxFlex=\"0 0 auto\">\n <button mat-icon-button\n color=\"primary\"\n type=\"button\"\n (click)=\"onEditElementClicked()\">\n <mat-icon>edit</mat-icon>\n </button>\n </div>\n <div *ngIf=\"element.user_specified\" fxFlex=\"0 0 auto\">\n <button mat-icon-button\n color=\"warn\"\n type=\"button\"\n (click)=\"onDeleteElementClicked()\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </div>\n </div>\n\n <div fxFlex=\"1 0 0\"></div>\n\n <div fxFlex=\"0 0 auto\">\n <h4 class=\"label\">{{ element.label }}</h4>\n </div>\n\n <div fxFlex=\"1 0 0\"></div>\n\n <div fxFlex=\"0 0 auto\">\n <h5 class=\"properties\"><b>{{ '{' }}</b> {{ element.attr_type }} <b>{{ '}' }}</b></h5>\n </div>\n\n </div>\n</mat-card>\n", styles: [".mat-card{height:100px;padding:8px}.mat-card .element-content{height:100%}.mat-card .element-content .label{width:100%;margin-bottom:0;text-align:center;font-weight:bold}.mat-card .element-content .properties{width:100%;margin-bottom:0;text-align:right}.mat-card .element-content .element-controls .mat-icon{font-size:20px}\n"], components: [{ type: i3$6.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
3882
+ LayoutEditorTableColumnElementComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: LayoutEditorTableColumnElementComponent, selector: "mantle-layout-editor-table-column-element", inputs: { element: "element", showControls: "showControls" }, ngImport: i0, template: "<mat-card>\n <div class=\"element-content\" fxLayout=\"column\" fxLayoutAlign=\"stretch\">\n\n <div fxFlex=\"0 0 40px\">\n <div *ngIf=\"showControls\" fxLayout=\"row\" fxLayoutAlign=\"center start\" class=\"element-controls\">\n <div fxFlex=\"0 0 auto\">\n <button mat-icon-button\n type=\"button\">\n <mat-icon>drag_indicator</mat-icon>\n </button>\n </div>\n <div fxFlex=\"1 1 auto\"></div>\n <div *ngIf=\"element.user_specified\" fxFlex=\"0 0 auto\">\n <button mat-icon-button\n color=\"primary\"\n type=\"button\"\n (click)=\"onEditElementClicked()\">\n <mat-icon>edit</mat-icon>\n </button>\n </div>\n <div *ngIf=\"element.user_specified\" fxFlex=\"0 0 auto\">\n <button mat-icon-button\n color=\"warn\"\n type=\"button\"\n (click)=\"onDeleteElementClicked()\">\n <mat-icon>delete</mat-icon>\n </button>\n </div>\n </div>\n </div>\n\n <div fxFlex=\"1 0 0\"></div>\n\n <div fxFlex=\"0 0 auto\">\n <h4 class=\"label\">{{ element.label }}</h4>\n </div>\n\n <div fxFlex=\"1 0 0\"></div>\n\n <div fxFlex=\"0 0 auto\">\n <h5 class=\"properties\"><b>{{ '{' }}</b> {{ element.attr_type }} <b>{{ '}' }}</b></h5>\n </div>\n\n </div>\n</mat-card>\n", styles: [".mat-card{height:100px;padding:8px}.mat-card .element-content{height:100%}.mat-card .element-content .label{width:100%;margin-bottom:0;text-align:center;font-weight:bold}.mat-card .element-content .properties{width:100%;margin-bottom:0;text-align:right}.mat-card .element-content .element-controls .mat-icon{font-size:20px}\n"], components: [{ type: i3$6.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
3409
3883
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: LayoutEditorTableColumnElementComponent, decorators: [{
3410
3884
  type: Component,
3411
3885
  args: [{
@@ -3540,7 +4014,7 @@ class GridLayoutEditorSectionComponent {
3540
4014
  }
3541
4015
  }
3542
4016
  GridLayoutEditorSectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: GridLayoutEditorSectionComponent, deps: [{ token: ScreenSizeService }, { token: i1$3.MatDialog }, { token: ArrayService }], target: i0.ɵɵFactoryTarget.Component });
3543
- GridLayoutEditorSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: GridLayoutEditorSectionComponent, selector: "mantle-grid-layout-editor-section", inputs: { section: "section", defaultRowHeight: "defaultRowHeight" }, ngImport: i0, template: "<div class=\"grid-layout-editor-section\">\n <mat-grid-list\n [rowHeight]=\"section.rowHeight || defaultRowHeight\"\n [cols]=\"section.singleColumn ? 1 : numColumns\"\n [class.multi-column]=\"section.singleColumn ? false : numColumns > 1\">\n\n <ng-container *ngFor=\"let element of section.dynamic_layout_grid_fields_attributes\">\n <mat-grid-tile *ngIf=\"!element._destroy\" [colspan]=\"section.singleColumn ? 1 : getColSpanForField(element)\" [rowspan]=\"getRowSpanForField(element)\">\n <mantle-dynamic-layout-editor-element\n elementType=\"field\"\n [element]=\"element\"\n [showControls]=\"!section.elements_locked\">\n </mantle-dynamic-layout-editor-element>\n </mat-grid-tile>\n </ng-container>\n\n </mat-grid-list>\n</div>\n\n<div fxLayout=\"row\" fxLayoutAlign=\"center start\" fxLayoutGap=\"16px\" class=\"section-controls\">\n <div fxFlex=\"1 1 auto\"></div>\n <div fxFlex=\"0 0 auto\" *ngIf=\"!section.elements_locked\">\n <button mat-raised-button\n color=\"primary\"\n type=\"button\"\n (click)=\"onAddElementClicked()\">\n <mat-icon>add</mat-icon>\n </button>\n </div>\n</div>\n", styles: [".section-controls{margin-top:16px}.section-controls button{padding:0;min-width:36px}\n"], components: [{ type: i3$2.MatGridList, selector: "mat-grid-list", inputs: ["cols", "gutterSize", "rowHeight"], exportAs: ["matGridList"] }, { type: i3$2.MatGridTile, selector: "mat-grid-tile", inputs: ["rowspan", "colspan"], exportAs: ["matGridTile"] }, { type: DynamicLayoutEditorElementComponent, selector: "mantle-dynamic-layout-editor-element", inputs: ["element", "elementType", "showControls"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }] });
4017
+ GridLayoutEditorSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: GridLayoutEditorSectionComponent, selector: "mantle-grid-layout-editor-section", inputs: { section: "section", defaultRowHeight: "defaultRowHeight" }, ngImport: i0, template: "<div class=\"grid-layout-editor-section\">\n <mat-grid-list\n [rowHeight]=\"section.rowHeight || defaultRowHeight\"\n [cols]=\"section.singleColumn ? 1 : numColumns\"\n [class.multi-column]=\"section.singleColumn ? false : numColumns > 1\">\n\n <ng-container *ngFor=\"let element of section.dynamic_layout_grid_fields_attributes\">\n <mat-grid-tile *ngIf=\"!element._destroy\" [colspan]=\"section.singleColumn ? 1 : getColSpanForField(element)\" [rowspan]=\"getRowSpanForField(element)\">\n <mantle-dynamic-layout-editor-element\n elementType=\"field\"\n [element]=\"element\"\n [showControls]=\"!section.elements_locked\">\n </mantle-dynamic-layout-editor-element>\n </mat-grid-tile>\n </ng-container>\n\n </mat-grid-list>\n</div>\n\n<div fxLayout=\"row\" fxLayoutAlign=\"center start\" fxLayoutGap=\"16px\" class=\"section-controls\">\n <div fxFlex=\"1 1 auto\"></div>\n <div fxFlex=\"0 0 auto\" *ngIf=\"!section.elements_locked\">\n <button mat-raised-button\n color=\"primary\"\n type=\"button\"\n (click)=\"onAddElementClicked()\">\n <mat-icon>add</mat-icon>\n </button>\n </div>\n</div>\n", styles: [".section-controls{margin-top:16px}.section-controls button{padding:0;min-width:36px}\n"], components: [{ type: i3$2.MatGridList, selector: "mat-grid-list", inputs: ["cols", "gutterSize", "rowHeight"], exportAs: ["matGridList"] }, { type: i3$2.MatGridTile, selector: "mat-grid-tile", inputs: ["rowspan", "colspan"], exportAs: ["matGridTile"] }, { type: DynamicLayoutEditorElementComponent, selector: "mantle-dynamic-layout-editor-element", inputs: ["element", "elementType", "showControls"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }] });
3544
4018
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: GridLayoutEditorSectionComponent, decorators: [{
3545
4019
  type: Component,
3546
4020
  args: [{
@@ -3602,7 +4076,7 @@ class TableLayoutEditorSectionComponent {
3602
4076
  }
3603
4077
  }
3604
4078
  TableLayoutEditorSectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: TableLayoutEditorSectionComponent, deps: [{ token: i1$3.MatDialog }, { token: ArrayService }], target: i0.ɵɵFactoryTarget.Component });
3605
- TableLayoutEditorSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: TableLayoutEditorSectionComponent, selector: "mantle-table-layout-editor-section", inputs: { section: "section" }, ngImport: i0, template: "<div class=\"table-layout-editor-section\">\n <h4 class=\"section-type-label\">Table</h4>\n <mat-grid-list rowHeight=\"120px\" [cols]=\"section.dynamic_layout_table_columns_attributes.length\" [class.multi-column]=\"true\" [ngStyle]=\"{ 'width.px': section.dynamic_layout_table_columns_attributes.length * 300 }\">\n\n <ng-container *ngFor=\"let element of section.dynamic_layout_table_columns_attributes\">\n <mat-grid-tile *ngIf=\"!element._destroy\" colspan=\"1\" rowspan=\"1\">\n <mantle-dynamic-layout-editor-element\n elementType=\"table-column\"\n [element]=\"element\"\n [showControls]=\"!section.elements_locked\">\n </mantle-dynamic-layout-editor-element>\n </mat-grid-tile>\n </ng-container>\n\n </mat-grid-list>\n</div>\n\n<div fxLayout=\"row\" fxLayoutAlign=\"center start\" fxLayoutGap=\"16px\" class=\"section-controls\">\n <div fxFlex=\"1 1 auto\"></div>\n <div fxFlex=\"0 0 auto\" *ngIf=\"!section.elements_locked\">\n <button mat-raised-button\n color=\"primary\"\n type=\"button\"\n (click)=\"onAddElementClicked()\">\n <mat-icon>add</mat-icon>\n </button>\n </div>\n</div>\n", styles: [".section-controls{margin-top:16px}.section-controls button{padding:0;min-width:36px}\n"], components: [{ type: i3$2.MatGridList, selector: "mat-grid-list", inputs: ["cols", "gutterSize", "rowHeight"], exportAs: ["matGridList"] }, { type: i3$2.MatGridTile, selector: "mat-grid-tile", inputs: ["rowspan", "colspan"], exportAs: ["matGridTile"] }, { type: DynamicLayoutEditorElementComponent, selector: "mantle-dynamic-layout-editor-element", inputs: ["element", "elementType", "showControls"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i3.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }] });
4079
+ TableLayoutEditorSectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: TableLayoutEditorSectionComponent, selector: "mantle-table-layout-editor-section", inputs: { section: "section" }, ngImport: i0, template: "<div class=\"table-layout-editor-section\">\n <h4 class=\"section-type-label\">Table</h4>\n <mat-grid-list rowHeight=\"120px\" [cols]=\"section.dynamic_layout_table_columns_attributes.length\" [class.multi-column]=\"true\" [ngStyle]=\"{ 'width.px': section.dynamic_layout_table_columns_attributes.length * 300 }\">\n\n <ng-container *ngFor=\"let element of section.dynamic_layout_table_columns_attributes\">\n <mat-grid-tile *ngIf=\"!element._destroy\" colspan=\"1\" rowspan=\"1\">\n <mantle-dynamic-layout-editor-element\n elementType=\"table-column\"\n [element]=\"element\"\n [showControls]=\"!section.elements_locked\">\n </mantle-dynamic-layout-editor-element>\n </mat-grid-tile>\n </ng-container>\n\n </mat-grid-list>\n</div>\n\n<div fxLayout=\"row\" fxLayoutAlign=\"center start\" fxLayoutGap=\"16px\" class=\"section-controls\">\n <div fxFlex=\"1 1 auto\"></div>\n <div fxFlex=\"0 0 auto\" *ngIf=\"!section.elements_locked\">\n <button mat-raised-button\n color=\"primary\"\n type=\"button\"\n (click)=\"onAddElementClicked()\">\n <mat-icon>add</mat-icon>\n </button>\n </div>\n</div>\n", styles: [".section-controls{margin-top:16px}.section-controls button{padding:0;min-width:36px}\n"], components: [{ type: i3$2.MatGridList, selector: "mat-grid-list", inputs: ["cols", "gutterSize", "rowHeight"], exportAs: ["matGridList"] }, { type: i3$2.MatGridTile, selector: "mat-grid-tile", inputs: ["rowspan", "colspan"], exportAs: ["matGridTile"] }, { type: DynamicLayoutEditorElementComponent, selector: "mantle-dynamic-layout-editor-element", inputs: ["element", "elementType", "showControls"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i3.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }] });
3606
4080
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: TableLayoutEditorSectionComponent, decorators: [{
3607
4081
  type: Component,
3608
4082
  args: [{
@@ -3667,7 +4141,7 @@ class AccordionLayoutEditorContainerComponent {
3667
4141
  constructor() { }
3668
4142
  }
3669
4143
  AccordionLayoutEditorContainerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: AccordionLayoutEditorContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3670
- AccordionLayoutEditorContainerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: AccordionLayoutEditorContainerComponent, selector: "mantle-accordion-layout-editor-container", inputs: { layoutEditorPageService: "layoutEditorPageService", container: "container" }, ngImport: i0, template: "<mat-accordion multi class=\"dynamic-details accordion\">\n <ng-container *ngFor=\"let section of container.dynamic_layout_sections_attributes\">\n <mat-expansion-panel [expanded]=\"!section.collapsed\" class=\"dynamic-details-section\">\n <mat-expansion-panel-header>\n <mat-panel-title *ngIf=\"section.title\">\n <div class=\"title-wrapper\">\n <h4>{{ section.title }}</h4>\n <mat-divider></mat-divider>\n </div>\n </mat-panel-title>\n </mat-expansion-panel-header>\n <mantle-dynamic-layout-editor-section [layoutEditorPageService]=\"layoutEditorPageService\" [section]=\"section\">\n </mantle-dynamic-layout-editor-section>\n </mat-expansion-panel>\n </ng-container>\n</mat-accordion>\n", styles: [""], components: [{ type: i1$7.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { type: i1$7.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { type: i2$6.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { type: DynamicLayoutEditorSectionComponent, selector: "mantle-dynamic-layout-editor-section", inputs: ["layoutEditorPageService", "section"] }], directives: [{ type: i1$7.MatAccordion, selector: "mat-accordion", inputs: ["multi", "displayMode", "togglePosition", "hideToggle"], exportAs: ["matAccordion"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$7.MatExpansionPanelTitle, selector: "mat-panel-title" }] });
4144
+ AccordionLayoutEditorContainerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: AccordionLayoutEditorContainerComponent, selector: "mantle-accordion-layout-editor-container", inputs: { layoutEditorPageService: "layoutEditorPageService", container: "container" }, ngImport: i0, template: "<mat-accordion multi class=\"dynamic-details accordion\">\n <ng-container *ngFor=\"let section of container.dynamic_layout_sections_attributes\">\n <mat-expansion-panel [expanded]=\"!section.collapsed\" class=\"dynamic-details-section\">\n <mat-expansion-panel-header>\n <mat-panel-title *ngIf=\"section.title\">\n <div class=\"title-wrapper\">\n <h4>{{ section.title }}</h4>\n <mat-divider></mat-divider>\n </div>\n </mat-panel-title>\n </mat-expansion-panel-header>\n <mantle-dynamic-layout-editor-section [layoutEditorPageService]=\"layoutEditorPageService\" [section]=\"section\">\n </mantle-dynamic-layout-editor-section>\n </mat-expansion-panel>\n </ng-container>\n</mat-accordion>\n", styles: [""], components: [{ type: i1$7.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["disabled", "expanded", "hideToggle", "togglePosition"], outputs: ["opened", "closed", "expandedChange", "afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { type: i1$7.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["tabIndex", "expandedHeight", "collapsedHeight"] }, { type: i2$7.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { type: DynamicLayoutEditorSectionComponent, selector: "mantle-dynamic-layout-editor-section", inputs: ["layoutEditorPageService", "section"] }], directives: [{ type: i1$7.MatAccordion, selector: "mat-accordion", inputs: ["multi", "displayMode", "togglePosition", "hideToggle"], exportAs: ["matAccordion"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$7.MatExpansionPanelTitle, selector: "mat-panel-title" }] });
3671
4145
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: AccordionLayoutEditorContainerComponent, decorators: [{
3672
4146
  type: Component,
3673
4147
  args: [{
@@ -3736,17 +4210,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
3736
4210
  }] } });
3737
4211
 
3738
4212
  class PageTitleComponent {
3739
- constructor(screenSizeService) {
4213
+ constructor(localeService, screenSizeService) {
4214
+ this.localeService = localeService;
3740
4215
  this.screenSizeService = screenSizeService;
3741
4216
  this.isSmallScreen = false;
3742
- this.today = moment().format('dddd | DD MMM YYYY');
4217
+ this.today = moment().locale(this.localeService.currentLocaleCode).format('dddd | DD MMM YYYY');
3743
4218
  this.screenSizeService.screenSize.subscribe((screenSize) => {
3744
4219
  this.isSmallScreen = screenSize == 'xs' || screenSize == 'sm';
3745
4220
  });
3746
4221
  }
3747
4222
  }
3748
- PageTitleComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: PageTitleComponent, deps: [{ token: ScreenSizeService }], target: i0.ɵɵFactoryTarget.Component });
3749
- PageTitleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: PageTitleComponent, selector: "mantle-page-title", ngImport: i0, template: "<h1 fxLayout=\"row wrap\" fxLayoutGap=\"8px\">\n <div fxFlex=\"0 0 auto\" class=\"title-text\"><ng-content></ng-content></div>\n <div fxFlex=\"1 0 1px\"></div>\n <div fxFlex=\"0 0 auto\" [fxHide]=\"isSmallScreen\" class=\"title-date\">{{ today }}</div>\n</h1>\n\n<hr />\n", styles: ["h1{margin-bottom:12px}.title-text{max-width:100%;text-transform:uppercase}.title-date{font-weight:lighter;text-align:right;white-space:nowrap}\n"], directives: [{ type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i3.DefaultShowHideDirective, selector: " [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]", inputs: ["fxShow", "fxShow.print", "fxShow.xs", "fxShow.sm", "fxShow.md", "fxShow.lg", "fxShow.xl", "fxShow.lt-sm", "fxShow.lt-md", "fxShow.lt-lg", "fxShow.lt-xl", "fxShow.gt-xs", "fxShow.gt-sm", "fxShow.gt-md", "fxShow.gt-lg", "fxHide", "fxHide.print", "fxHide.xs", "fxHide.sm", "fxHide.md", "fxHide.lg", "fxHide.xl", "fxHide.lt-sm", "fxHide.lt-md", "fxHide.lt-lg", "fxHide.lt-xl", "fxHide.gt-xs", "fxHide.gt-sm", "fxHide.gt-md", "fxHide.gt-lg"] }] });
4223
+ PageTitleComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: PageTitleComponent, deps: [{ token: LocaleService }, { token: ScreenSizeService }], target: i0.ɵɵFactoryTarget.Component });
4224
+ PageTitleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: PageTitleComponent, selector: "mantle-page-title", ngImport: i0, template: "<h1 fxLayout=\"row wrap\" fxLayoutGap=\"8px\">\n <div fxFlex=\"0 0 auto\" class=\"title-text\"><ng-content></ng-content></div>\n <div fxFlex=\"1 0 1px\"></div>\n <div fxFlex=\"0 0 auto\" [fxHide]=\"isSmallScreen\" class=\"title-date\">{{ today }}</div>\n</h1>\n\n<hr />\n", styles: ["h1{margin-bottom:12px}.title-text{max-width:100%;text-transform:uppercase}.title-date{font-weight:lighter;text-align:right;white-space:nowrap}\n"], directives: [{ type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i3.DefaultShowHideDirective, selector: " [fxShow], [fxShow.print], [fxShow.xs], [fxShow.sm], [fxShow.md], [fxShow.lg], [fxShow.xl], [fxShow.lt-sm], [fxShow.lt-md], [fxShow.lt-lg], [fxShow.lt-xl], [fxShow.gt-xs], [fxShow.gt-sm], [fxShow.gt-md], [fxShow.gt-lg], [fxHide], [fxHide.print], [fxHide.xs], [fxHide.sm], [fxHide.md], [fxHide.lg], [fxHide.xl], [fxHide.lt-sm], [fxHide.lt-md], [fxHide.lt-lg], [fxHide.lt-xl], [fxHide.gt-xs], [fxHide.gt-sm], [fxHide.gt-md], [fxHide.gt-lg]", inputs: ["fxShow", "fxShow.print", "fxShow.xs", "fxShow.sm", "fxShow.md", "fxShow.lg", "fxShow.xl", "fxShow.lt-sm", "fxShow.lt-md", "fxShow.lt-lg", "fxShow.lt-xl", "fxShow.gt-xs", "fxShow.gt-sm", "fxShow.gt-md", "fxShow.gt-lg", "fxHide", "fxHide.print", "fxHide.xs", "fxHide.sm", "fxHide.md", "fxHide.lg", "fxHide.xl", "fxHide.lt-sm", "fxHide.lt-md", "fxHide.lt-lg", "fxHide.lt-xl", "fxHide.gt-xs", "fxHide.gt-sm", "fxHide.gt-md", "fxHide.gt-lg"] }] });
3750
4225
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: PageTitleComponent, decorators: [{
3751
4226
  type: Component,
3752
4227
  args: [{
@@ -3754,7 +4229,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
3754
4229
  templateUrl: './page-title.component.html',
3755
4230
  styleUrls: ['./page-title.component.scss']
3756
4231
  }]
3757
- }], ctorParameters: function () { return [{ type: ScreenSizeService }]; } });
4232
+ }], ctorParameters: function () { return [{ type: LocaleService }, { type: ScreenSizeService }]; } });
3758
4233
 
3759
4234
  class PlainDashboardContainerComponent {
3760
4235
  constructor() { }
@@ -3769,7 +4244,7 @@ class PlainDashboardContainerComponent {
3769
4244
  }
3770
4245
  }
3771
4246
  PlainDashboardContainerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: PlainDashboardContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3772
- PlainDashboardContainerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: PlainDashboardContainerComponent, selector: "mantle-plain-dashboard-container", inputs: { dashboardPageService: "dashboardPageService", content: "content", container: "container" }, ngImport: i0, template: "<ng-container *ngFor=\"let section of container.sections\">\n <ng-container *ngIf=\"!section.hidden\">\n <ng-container [ngSwitch]=\"section.layout\">\n\n <ng-container *ngSwitchCase=\"'dashboard'\">\n <mantle-dashboard-section\n [slug]=\"section.slug\"\n [section]=\"asDynamicLayoutDashboardSection(section)\"\n [data]=\"content.data\"\n [dashboardPageService]=\"dashboardPageService\">\n </mantle-dashboard-section>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'grid'\">\n <mantle-grid-details-section\n [section]=\"asDynamicLayoutGridSection(section)\"\n [data]=\"content.data\">\n </mantle-grid-details-section>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'table'\">\n <mantle-table-details-section\n [section]=\"asDynamicLayoutTableSection(section)\"\n [data]=\"content.data\">\n </mantle-table-details-section>\n </ng-container>\n\n </ng-container>\n </ng-container>\n</ng-container>\n", styles: [""], components: [{ type: DashboardSectionComponent, selector: "mantle-dashboard-section", inputs: ["dashboardPageService", "slug", "data", "section"] }, { type: GridDetailsSectionComponent, selector: "mantle-grid-details-section", inputs: ["data", "section", "defaultRowHeight"] }, { type: TableDetailsSectionComponent, selector: "mantle-table-details-section", inputs: ["data", "section"] }], directives: [{ type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }] });
4247
+ PlainDashboardContainerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: PlainDashboardContainerComponent, selector: "mantle-plain-dashboard-container", inputs: { dashboardPageService: "dashboardPageService", content: "content", container: "container" }, ngImport: i0, template: "<ng-container *ngFor=\"let section of container.sections\">\n <ng-container *ngIf=\"!section.hidden\">\n <ng-container [ngSwitch]=\"section.layout\">\n\n <ng-container *ngSwitchCase=\"'dashboard'\">\n <mantle-dashboard-section\n [slug]=\"section.slug\"\n [section]=\"asDynamicLayoutDashboardSection(section)\"\n [data]=\"content.data\"\n [dashboardPageService]=\"dashboardPageService\">\n </mantle-dashboard-section>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'grid'\">\n <mantle-grid-details-section\n [section]=\"asDynamicLayoutGridSection(section)\"\n [data]=\"content.data\">\n </mantle-grid-details-section>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'table'\">\n <mantle-table-details-section\n [section]=\"asDynamicLayoutTableSection(section)\"\n [data]=\"content.data\">\n </mantle-table-details-section>\n </ng-container>\n\n </ng-container>\n </ng-container>\n</ng-container>\n", styles: [""], components: [{ type: DashboardSectionComponent, selector: "mantle-dashboard-section", inputs: ["dashboardPageService", "slug", "data", "section"] }, { type: GridDetailsSectionComponent, selector: "mantle-grid-details-section", inputs: ["data", "section", "defaultRowHeight"] }, { type: TableDetailsSectionComponent, selector: "mantle-table-details-section", inputs: ["data", "section", "detailPageService"] }], directives: [{ type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }] });
3773
4248
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: PlainDashboardContainerComponent, decorators: [{
3774
4249
  type: Component,
3775
4250
  args: [{
@@ -3838,7 +4313,7 @@ class DashboardPageComponent {
3838
4313
  }
3839
4314
  }
3840
4315
  DashboardPageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DashboardPageComponent, deps: [{ token: i1$4.ActivatedRoute }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
3841
- DashboardPageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DashboardPageComponent, selector: "mantle-dashboard-page", ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutAlign=\"stretch\" fxLayoutGap=\"16px\" class=\"page dashboard-page full-height-only vertically-scrollable\">\n\n <div fxFlex=\"0 0 auto\">\n <mantle-page-title>{{ pageTitle }}</mantle-page-title>\n </div>\n\n <div fxFlex=\"1 0 auto\">\n <mantle-dynamic-dashboard [content]=\"content$ | async\" [dashboardPageService]=\"dashboardPageService\"></mantle-dynamic-dashboard>\n </div>\n\n</div>\n", styles: [""], components: [{ type: PageTitleComponent, selector: "mantle-page-title" }, { type: DynamicDashboardComponent, selector: "mantle-dynamic-dashboard", inputs: ["dashboardPageService", "content"] }], directives: [{ type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }], pipes: { "async": i4.AsyncPipe } });
4316
+ DashboardPageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DashboardPageComponent, selector: "mantle-dashboard-page", ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutAlign=\"stretch\" fxLayoutGap=\"16px\" class=\"page dashboard-page full-height-only vertically-scrollable\">\n\n <div fxFlex=\"0 0 auto\">\n <mantle-page-title>{{ pageTitle | translate }}</mantle-page-title>\n </div>\n\n <div fxFlex=\"1 0 auto\">\n <mantle-dynamic-dashboard [content]=\"content$ | async\" [dashboardPageService]=\"dashboardPageService\"></mantle-dynamic-dashboard>\n </div>\n\n</div>\n", styles: [""], components: [{ type: PageTitleComponent, selector: "mantle-page-title" }, { type: DynamicDashboardComponent, selector: "mantle-dynamic-dashboard", inputs: ["dashboardPageService", "content"] }], directives: [{ type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }], pipes: { "translate": i5.TranslatePipe, "async": i4.AsyncPipe } });
3842
4317
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DashboardPageComponent, decorators: [{
3843
4318
  type: Component,
3844
4319
  args: [{
@@ -3852,7 +4327,7 @@ class ContentTitleComponent {
3852
4327
  constructor() { }
3853
4328
  }
3854
4329
  ContentTitleComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ContentTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3855
- ContentTitleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: ContentTitleComponent, selector: "mantle-content-title", inputs: { thumbnail: "thumbnail", title: "title" }, ngImport: i0, template: "<div fxLayout=\"row\" fxLayoutAlign=\"center center\" class=\"content-title\">\n <div *ngIf=\"thumbnail\" fxFlex=\"0 0 auto\">\n <img class=\"content-title-thumbnail\" [attr.src]=\"thumbnail | secureImage | async\" />\n </div>\n\n <div fxFlex=\"1 0 1px\">\n <h1 *ngIf=\"title\" class=\"content-title-title\">{{ title }}</h1>\n </div>\n</div>\n", styles: [".content-title .content-title-thumbnail{width:60px;height:60px;border-radius:50%;margin:0 16px}.content-title .content-title-title{max-width:100%;text-transform:uppercase;margin-bottom:0}\n"], directives: [{ type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }], pipes: { "async": i4.AsyncPipe, "secureImage": SecureImagePipe } });
4330
+ ContentTitleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: ContentTitleComponent, selector: "mantle-content-title", inputs: { thumbnail: "thumbnail", title: "title" }, ngImport: i0, template: "<div fxLayout=\"row\" fxLayoutAlign=\"center center\" class=\"content-title\">\n <div *ngIf=\"thumbnail\" fxFlex=\"0 0 auto\">\n <img class=\"content-title-thumbnail\" [attr.src]=\"thumbnail | secureImage | async\" />\n </div>\n\n <div fxFlex=\"1 0 1px\">\n <h1 *ngIf=\"title\" class=\"content-title-title\">{{ title }}</h1>\n </div>\n</div>\n", styles: [".content-title .content-title-thumbnail{width:60px;height:60px;border-radius:50%;margin:0 16px}.content-title .content-title-title{max-width:100%;text-transform:uppercase;margin-bottom:0}\n"], directives: [{ type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }], pipes: { "async": i4.AsyncPipe, "secureImage": SecureImagePipe } });
3856
4331
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ContentTitleComponent, decorators: [{
3857
4332
  type: Component,
3858
4333
  args: [{
@@ -3877,17 +4352,20 @@ class LayoutEditorPageComponent {
3877
4352
  this.isTabbedContent = this.route.snapshot.data['isTabbedContent'];
3878
4353
  }
3879
4354
  ngOnInit() {
3880
- this.loadData();
4355
+ this.pullContent();
3881
4356
  }
3882
- loadData() {
4357
+ pullContent() {
3883
4358
  this.route.params.subscribe(params => {
3884
4359
  this.id = this.route.snapshot.params['id'];
3885
4360
  this.layoutEditorPageService.getEdit(this.id).subscribe((res) => {
3886
- this.header = res.header;
3887
- this.content = res.content;
4361
+ this.loadContent(res);
3888
4362
  });
3889
4363
  });
3890
4364
  }
4365
+ loadContent(response) {
4366
+ this.header = response.header;
4367
+ this.content = response.content;
4368
+ }
3891
4369
  onSaveClicked() {
3892
4370
  this.isSaveInProgress = true;
3893
4371
  this.layoutEditorPageService.save(this.id, this.content.data, (res) => { this.onSaveSuccess(res); }, (res) => { this.onSaveFailure(res); });
@@ -3895,7 +4373,7 @@ class LayoutEditorPageComponent {
3895
4373
  onSaveSuccess(res) {
3896
4374
  this.id = res.id;
3897
4375
  this.content = res.content;
3898
- this.announcementService.success('Save successful!');
4376
+ this.announcementService.success('mantle.messages.save_successful');
3899
4377
  this.back();
3900
4378
  this.isSaveInProgress = false;
3901
4379
  }
@@ -3906,7 +4384,7 @@ class LayoutEditorPageComponent {
3906
4384
  else {
3907
4385
  this.back();
3908
4386
  }
3909
- this.announcementService.error('Save failed!');
4387
+ this.announcementService.error('mantle.messages.save_failed');
3910
4388
  this.isSaveInProgress = false;
3911
4389
  }
3912
4390
  back() {
@@ -3914,7 +4392,7 @@ class LayoutEditorPageComponent {
3914
4392
  }
3915
4393
  }
3916
4394
  LayoutEditorPageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: LayoutEditorPageComponent, deps: [{ token: i1$4.ActivatedRoute }, { token: i0.Injector }, { token: AnnouncementService }], target: i0.ɵɵFactoryTarget.Component });
3917
- LayoutEditorPageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: LayoutEditorPageComponent, selector: "mantle-layout-editor-page", ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutAlign=\"stretch\" class=\"full-height-min\" [ngClass]=\"{'page full-height-only vertically-scrollable': !isTabbedContent}\">\n <div fxFlex=\"0 0 auto\" class=\"page-header\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center start\" fxLayoutGap=\"16px\">\n <div fxFlex=\"1 1 auto\">\n <mantle-content-title *ngIf=\"header\" [title]=\"header.title\"></mantle-content-title>\n </div>\n </div>\n </div>\n\n <div fxFlex=\"1 0 auto\" class=\"main-content\">\n <mantle-dynamic-layout-editor [content]=\"content\" [layoutEditorPageService]=\"layoutEditorPageService\"></mantle-dynamic-layout-editor>\n </div>\n\n <div fxFlex=\"0 0 auto\" class=\"page-footer\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\">\n <div fxFlex=\"1 1 auto\"></div>\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"layoutEditorPageService.showSaveButton\">\n <button mat-raised-button\n color=\"primary\"\n type=\"button\"\n class=\"save-button\"\n [ngClass]=\"{ 'in-progress-button': isSaveInProgress }\"\n [disabled]=\"layoutEditorPageService.isCommitInProgress\"\n (click)=\"onSaveClicked()\"> <!-- TODO || !dynamicForm?.valid -->\n Save\n <mat-spinner *ngIf=\"isSaveInProgress\" matSuffix [diameter]=\"16\"></mat-spinner>\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [".save-button{width:140px}.in-progress-button .mat-spinner{position:absolute;top:10px;right:12px}\n"], components: [{ type: ContentTitleComponent, selector: "mantle-content-title", inputs: ["thumbnail", "title"] }, { type: DynamicLayoutEditorComponent, selector: "mantle-dynamic-layout-editor", inputs: ["layoutEditorPageService", "content"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i6.MatSpinner, selector: "mat-spinner", inputs: ["color"] }], directives: [{ type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4$1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatSuffix, selector: "[matSuffix]" }] });
4395
+ LayoutEditorPageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: LayoutEditorPageComponent, selector: "mantle-layout-editor-page", ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutAlign=\"stretch\" class=\"full-height-min\" [ngClass]=\"{'page full-height-only vertically-scrollable': !isTabbedContent}\">\n <div fxFlex=\"0 0 auto\" class=\"page-header\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center start\" fxLayoutGap=\"16px\">\n <div fxFlex=\"1 1 auto\">\n <mantle-content-title *ngIf=\"header\" [title]=\"header.title\"></mantle-content-title>\n </div>\n </div>\n </div>\n\n <div fxFlex=\"1 0 auto\" class=\"main-content\">\n <mantle-dynamic-layout-editor [content]=\"content\" [layoutEditorPageService]=\"layoutEditorPageService\"></mantle-dynamic-layout-editor>\n </div>\n\n <div fxFlex=\"0 0 auto\" class=\"page-footer\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\">\n <div fxFlex=\"1 1 auto\"></div>\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"layoutEditorPageService.showSaveButton\">\n <button mat-raised-button\n color=\"primary\"\n type=\"button\"\n class=\"save-button\"\n [ngClass]=\"{ 'in-progress-button': isSaveInProgress }\"\n [disabled]=\"layoutEditorPageService.isCommitInProgress\"\n (click)=\"onSaveClicked()\"> <!-- TODO || !dynamicForm?.valid -->\n {{ 'mantle.buttons.save' | translate }}\n <mat-spinner *ngIf=\"isSaveInProgress\" matSuffix [diameter]=\"16\"></mat-spinner>\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [".save-button{width:140px}.in-progress-button .mat-spinner{position:absolute;top:10px;right:12px}\n"], components: [{ type: ContentTitleComponent, selector: "mantle-content-title", inputs: ["thumbnail", "title"] }, { type: DynamicLayoutEditorComponent, selector: "mantle-dynamic-layout-editor", inputs: ["layoutEditorPageService", "content"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i6.MatSpinner, selector: "mat-spinner", inputs: ["color"] }], directives: [{ type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatSuffix, selector: "[matSuffix]" }], pipes: { "translate": i5.TranslatePipe } });
3918
4396
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: LayoutEditorPageComponent, decorators: [{
3919
4397
  type: Component,
3920
4398
  args: [{
@@ -3967,7 +4445,7 @@ class ListPageDataSource extends DataSource {
3967
4445
  if (this.paginator && this.sort && this.searchPanel) {
3968
4446
  // Combine everything that affects the rendered data into one update
3969
4447
  // stream for the data-table to consume.
3970
- return merge(this.paginator.page, this.sort.sortChange, this.searchPanel.search, this.dataService.webRtcEvents, this.dataService.listContentChangeEvents).pipe(startWith(null), switchMap(() => {
4448
+ return merge(this.paginator.page, this.sort.sortChange, this.searchPanel.search, this.dataService.webRtcEvents, this.dataService.subContentChangeEvents).pipe(startWith(null), switchMap(() => {
3971
4449
  var _a, _b, _c, _d, _e;
3972
4450
  let params = new WebApiListRequest({
3973
4451
  search: (_a = this.searchPanel) === null || _a === void 0 ? void 0 : _a.searchParams,
@@ -4042,7 +4520,7 @@ class SearchPanelComponent {
4042
4520
  }
4043
4521
  }
4044
4522
  SearchPanelComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: SearchPanelComponent, deps: [{ token: DynamicFormService }, { token: ObjectService }], target: i0.ɵɵFactoryTarget.Component });
4045
- SearchPanelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: SearchPanelComponent, selector: "mantle-search-panel", inputs: { searchFields: "searchFields" }, outputs: { search: "search" }, viewQueries: [{ propertyName: "searchForm", first: true, predicate: DynamicFormComponent, descendants: true }], ngImport: i0, template: "<div class=\"search-panel\">\n <div fxLayout=\"row\" fxLayoutAlign=\"stretch\">\n <div fxFlex=\"1 0 1px\"><h3 class=\"search-panel-title\">Search</h3></div> <div fxFlex=\"0 0 auto\"><mat-icon>search</mat-icon></div>\n </div>\n <hr />\n\n <div class=\"filter-subtitle\">Filter By</div>\n\n <mantle-dynamic-form #searchForm [content]=\"content\"></mantle-dynamic-form>\n\n <button mat-button type=\"button\" class=\"reset-button\" (click)=\"onResetClicked()\">\n Reset\n </button>\n\n <button mat-raised-button color=\"primary\" type=\"button\" class=\"search-button\" (click)=\"onSearchClicked();\">\n Search\n </button>\n</div>\n", styles: [".search-panel{width:200px}.search-panel .search-panel-title{text-transform:uppercase;margin:0}.search-panel hr{margin-top:0}.search-panel .filter-subtitle{text-transform:uppercase;font-weight:bold;margin-top:16px;margin-bottom:8px}.search-panel .reset-button{display:block;min-width:auto;background-color:transparent;text-transform:uppercase;font-weight:bold;padding:0}.search-panel .search-button{display:block;width:100%;text-transform:uppercase;border-radius:0;margin:16px 0}\n"], components: [{ type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: DynamicFormComponent, selector: "mantle-dynamic-form", inputs: ["formPageService", "content"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }] });
4523
+ SearchPanelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: SearchPanelComponent, selector: "mantle-search-panel", inputs: { searchFields: "searchFields" }, outputs: { search: "search" }, viewQueries: [{ propertyName: "searchForm", first: true, predicate: DynamicFormComponent, descendants: true }], ngImport: i0, template: "<div class=\"search-panel\">\n <div fxLayout=\"row\" fxLayoutAlign=\"stretch\">\n <div fxFlex=\"1 0 1px\"><h3 class=\"search-panel-title\">{{ 'mantle.search_panel.search' | translate }}</h3></div> <div fxFlex=\"0 0 auto\"><mat-icon>search</mat-icon></div>\n </div>\n <hr />\n\n <div class=\"filter-subtitle\">{{ 'mantle.search_panel.filter_by' | translate }}</div>\n\n <mantle-dynamic-form #searchForm [content]=\"content\"></mantle-dynamic-form>\n\n <button mat-button type=\"button\" class=\"reset-button\" (click)=\"onResetClicked()\">\n {{ 'mantle.buttons.reset' | translate }}\n </button>\n\n <button mat-raised-button color=\"primary\" type=\"button\" class=\"search-button\" (click)=\"onSearchClicked();\">\n {{ 'mantle.buttons.search' | translate }}\n </button>\n</div>\n", styles: [".search-panel{width:200px}.search-panel .search-panel-title{text-transform:uppercase;margin:0}.search-panel hr{margin-top:0}.search-panel .filter-subtitle{text-transform:uppercase;font-weight:bold;margin-top:16px;margin-bottom:8px}.search-panel .reset-button{display:block;min-width:auto;background-color:transparent;text-transform:uppercase;font-weight:bold;padding:0}.search-panel .search-button{display:block;width:100%;text-transform:uppercase;border-radius:0;margin:16px 0}\n"], components: [{ type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: DynamicFormComponent, selector: "mantle-dynamic-form", inputs: ["formPageService", "content"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }], pipes: { "translate": i5.TranslatePipe } });
4046
4524
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: SearchPanelComponent, decorators: [{
4047
4525
  type: Component,
4048
4526
  args: [{
@@ -4069,6 +4547,7 @@ class ListPageComponent {
4069
4547
  this.isTabbedContent = false;
4070
4548
  this.withCollapsibleColumns = false;
4071
4549
  this.expandCollapsibleColumns = false;
4550
+ this.additionalButtons = [];
4072
4551
  this.isActionPanelOpen = false;
4073
4552
  this.isSmallScreen = false;
4074
4553
  const listPageServiceInjectionToken = this.route.snapshot.data['listPageService'];
@@ -4090,6 +4569,7 @@ class ListPageComponent {
4090
4569
  this.isSmallScreen = screenSize == 'xs' || screenSize == 'sm';
4091
4570
  this.isActionPanelOpen = !this.isSmallScreen;
4092
4571
  });
4572
+ this.loadAdditionalButtons();
4093
4573
  }
4094
4574
  ngAfterViewInit() {
4095
4575
  if (this.listPageService.defaultOrder) {
@@ -4110,6 +4590,9 @@ class ListPageComponent {
4110
4590
  onAddClicked() {
4111
4591
  this.listPageService.openForm();
4112
4592
  }
4593
+ onBackToParentClicked() {
4594
+ this.listPageService.openParent();
4595
+ }
4113
4596
  isRecordChecked(record) {
4114
4597
  return this.arrayService.hasItem(this.dataSource.selectedRecordIds, record.id);
4115
4598
  }
@@ -4136,12 +4619,15 @@ class ListPageComponent {
4136
4619
  onBulkExportClicked(exportOption) {
4137
4620
  exportOption.export(this.dataSource.selectedRecordIds);
4138
4621
  }
4622
+ loadAdditionalButtons() {
4623
+ this.additionalButtons = this.listPageService.additionalListPageButtons();
4624
+ }
4139
4625
  toggleCollapsibleColumns() {
4140
4626
  this.expandCollapsibleColumns = !this.expandCollapsibleColumns;
4141
4627
  }
4142
4628
  }
4143
4629
  ListPageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ListPageComponent, deps: [{ token: i1$4.ActivatedRoute }, { token: i0.Injector }, { token: i0.ChangeDetectorRef }, { token: ArrayService }, { token: ScreenSizeService }], target: i0.ɵɵFactoryTarget.Component });
4144
- ListPageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: ListPageComponent, selector: "mantle-list-page", viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "table", first: true, predicate: MatTable, descendants: true }, { propertyName: "searchPanel", first: true, predicate: SearchPanelComponent, descendants: true }], ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutAlign=\"stretch\" fxLayoutGap=\"16px\" class=\"list-page full-height-only\" [ngClass]=\"{'page': !isTabbedContent}\">\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"!isTabbedContent\">\n <mantle-page-title>{{ pageTitle }}</mantle-page-title>\n </div>\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"withCollapsibleColumns\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\">\n <div fxFlex=\"1 1 auto\"></div>\n\n <div fxFlex=\"0 0 auto\">\n <button mat-raised-button\n color=\"primary\"\n type=\"button\"\n class=\"toggle-collapsible-columns-button button-with-icon\"\n (click)=\"toggleCollapsibleColumns()\">\n <ng-container *ngIf=\"expandCollapsibleColumns\">\n <mat-icon class=\"left-icon\">keyboard_double_arrow_left</mat-icon>\n <span>Collapse Table</span>\n </ng-container>\n <ng-container *ngIf=\"!expandCollapsibleColumns\">\n <span>Expand Table</span>\n <mat-icon class=\"right-icon\">keyboard_double_arrow_right</mat-icon>\n </ng-container>\n </button>\n </div>\n </div>\n </div>\n\n <div fxFlex=\"1 0 1px\">\n <mat-drawer-container class=\"full-height-only\" [hasBackdrop]=\"isSmallScreen\">\n <mat-drawer #drawer\n [mode]=\"isSmallScreen ? 'over' : 'side'\"\n [position]=\"isSmallScreen ? 'end' : 'start'\"\n [opened]=\"isActionPanelOpen\"\n [disableClose]=\"!isSmallScreen\"\n (closedStart)=\"isActionPanelOpen = false\"\n (openedStart)=\"isActionPanelOpen = true\">\n\n <button *ngIf=\"listPageService.showAddButton && listPageService.canWrite()\"\n mat-raised-button\n color=\"accent\"\n type=\"button\"\n class=\"add-button\"\n (click)=\"onAddClicked()\">\n + New {{ listPageService?.noun() }}\n </button>\n\n <div class=\"search-section\">\n <mantle-search-panel #searchPanel\n [searchFields]=\"listPageService.searchFields()\">\n </mantle-search-panel>\n </div>\n\n <ng-container *ngFor=\"let exportOption of exportOptions\">\n <button mat-button type=\"button\" class=\"export-button\" (click)=\"exportOption.export(searchPanel.searchParams).subscribe()\">\n <span class=\"export-button-label\">{{ exportOption.label }}</span>\n <mat-icon>download</mat-icon>\n </button>\n </ng-container>\n\n <ng-container *ngIf=\"dataSource.selectedRecordIds.length > 0\">\n <ng-container *ngFor=\"let exportOption of bulkExportOptions\">\n <button mat-button type=\"button\" class=\"export-button\" (click)=\"onBulkExportClicked(exportOption)\">\n <span class=\"export-button-label\">{{ exportOption.label }}</span>\n <mat-icon>download</mat-icon>\n </button>\n </ng-container>\n </ng-container>\n\n </mat-drawer>\n\n <div fxLayout=\"column\" fxLayoutAlign=\"stretch\" class=\"main-content full-height-only\">\n\n <div fxFlex=\"1 0 1px\" class=\"vertically-scrollable\">\n <table mat-table class=\"full-width horizontal-scroll-table\" matSort>\n\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef>\n <mat-checkbox click-stop-propagation (change)=\"onCheckAll($event.checked)\" [checked]=\"dataSource.selectAll\"></mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox click-stop-propagation (change)=\"onRecordChecked(row, $event.checked)\" [checked]=\"isRecordChecked(row)\"></mat-checkbox>\n </td>\n </ng-container>\n\n <ng-container *ngFor=\"let column of displayedColumns; let i = index\">\n <ng-container matColumnDef=\"{{ column.attr }}\">\n <th mat-header-cell *matHeaderCellDef\n mat-sort-header=\"{{column.sortAttr || column.attr}}\" [disabled]=\"column.disableSort\"\n [@collapse]=\"column.enableCollapse && !expandCollapsibleColumns\"\n [ngClass]=\"{\n 'collapsible-column': column.enableCollapse,\n 'collapsible-column-left': column.enableCollapse && (!displayedColumns[i - 1] || !displayedColumns[i - 1].enableCollapse),\n 'collapsible-column-right': column.enableCollapse && (!displayedColumns[i + 1] || !displayedColumns[i + 1].enableCollapse)\n }\">\n {{ column.header }}\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [@collapse]=\"column.enableCollapse && !expandCollapsibleColumns\"\n [ngClass]=\"{\n 'collapsible-column': column.enableCollapse,\n 'collapsible-column-left': column.enableCollapse && (!displayedColumns[i - 1] || !displayedColumns[i - 1].enableCollapse),\n 'collapsible-column-right': column.enableCollapse && (!displayedColumns[i + 1] || !displayedColumns[i + 1].enableCollapse)\n }\">\n <mantle-dynamic-attribute-display\n [fieldType]=\"column.type\"\n [value]=\"row[column.attr]\"\n [options]=\"column.options\">\n </mantle-dynamic-attribute-display>\n </td>\n </ng-container>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumnAttrs\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumnAttrs;\"\n (click)=\"onRecordClicked(row)\"\n [class.clickable-row]=\"withClickableRows\">\n </tr>\n </table>\n </div>\n\n <mat-paginator #paginator\n fxFlex=\"0 0 auto\"\n [length]=\"0\"\n [pageIndex]=\"0\"\n [pageSize]=\"10\"\n [pageSizeOptions]=\"[10, 20, 50]\">\n </mat-paginator>\n\n </div>\n\n </mat-drawer-container>\n </div>\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"isSmallScreen\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\">\n\n <button *ngIf=\"isActionPanelOpen\" type=\"button\" mat-button (click)=\"drawer.toggle()\">\n <ng-container *ngIf=\"isActionPanelOpen\">\n Close Actions<mat-icon>chevron_right</mat-icon>\n </ng-container>\n </button>\n\n <div fxFlex=\"1 1 auto\"></div>\n\n <button *ngIf=\"!isActionPanelOpen\" type=\"button\" mat-button (click)=\"drawer.toggle()\">\n <ng-container>\n <mat-icon>chevron_left</mat-icon> Open Actions\n </ng-container>\n </button>\n\n </div>\n </div>\n</div>\n", styles: [".main-content{padding-top:0;padding-bottom:0}.mat-drawer{padding:0 16px 0 0}.mat-drawer .add-button{display:block;width:100%;text-transform:uppercase;border-radius:0;margin:16px 0 0}.mat-drawer-end{padding:0 16px}.search-section{margin:16px 0 0}.export-button{display:block;width:144px;background-color:transparent;white-space:nowrap;padding:0;margin:16px 0 16px auto}.export-button .export-button-label{display:inline-block;width:100px;white-space:normal;text-align:right;text-transform:uppercase;font-weight:normal;line-height:1.25rem;margin-right:.25rem}.export-button .mat-icon{height:auto;width:auto;font-size:2.5rem}.toggle-collapsible-columns-button{width:200px;text-transform:uppercase}.toggle-collapsible-columns-button .mat-icon{font-size:1.2rem}.collapsible-column-left{border-left:1px solid lightgray}.collapsible-column-right{border-right:1px solid lightgray}th.collapsible-column{border-top:1px solid lightgray}th.collapsible-column-left{border-radius:2px 0 0}th.collapsible-column-right{border-radius:0 2px 0 0}\n"], components: [{ type: PageTitleComponent, selector: "mantle-page-title" }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i7.MatDrawerContainer, selector: "mat-drawer-container", inputs: ["autosize", "hasBackdrop"], outputs: ["backdropClick"], exportAs: ["matDrawerContainer"] }, { type: i7.MatDrawer, selector: "mat-drawer", inputs: ["position", "mode", "disableClose", "autoFocus", "opened"], outputs: ["openedChange", "opened", "openedStart", "closed", "closedStart", "positionChanged"], exportAs: ["matDrawer"] }, { type: SearchPanelComponent, selector: "mantle-search-panel", inputs: ["searchFields"], outputs: ["search"] }, { type: i2$1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { type: i10.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "id", "labelPosition", "name", "required", "checked", "disabled", "indeterminate", "aria-describedby", "value"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i3$3.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "arrowPosition", "sortActionDescription", "disableClear", "mat-sort-header", "start"], exportAs: ["matSortHeader"] }, { type: DynamicAttributeDisplayComponent, selector: "mantle-dynamic-attribute-display", inputs: ["value", "field", "fieldType", "options"] }, { type: i2$1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { type: i2$1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { type: i5$1.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }], directives: [{ type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3$3.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortActive"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { type: i2$1.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { type: i2$1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { type: i2$1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { type: ClickStopPropagationDirective, selector: "[click-stop-propagation]" }, { type: i2$1.MatCellDef, selector: "[matCellDef]" }, { type: i2$1.MatCell, selector: "mat-cell, td[mat-cell]" }, { type: i2$1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { type: i2$1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }], animations: [
4630
+ ListPageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: ListPageComponent, selector: "mantle-list-page", viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "table", first: true, predicate: MatTable, descendants: true }, { propertyName: "searchPanel", first: true, predicate: SearchPanelComponent, descendants: true }], ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutAlign=\"stretch\" fxLayoutGap=\"16px\" class=\"list-page full-height-only\" [ngClass]=\"{'page': !isTabbedContent}\">\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"!isTabbedContent\">\n <mantle-page-title>{{ pageTitle | translate }}</mantle-page-title>\n </div>\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"listPageService.showBackToParentButton || withCollapsibleColumns\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\">\n <div fxFlex=\"0 0 auto\" *ngIf=\"listPageService.showBackToParentButton\">\n <button class=\"back-button\" mat-mini-fab color=\"primary\" type=\"button\" (click)=\"onBackToParentClicked()\">\n <mat-icon>arrow_back</mat-icon>\n </button>\n </div>\n\n <div fxFlex=\"1 1 auto\"></div>\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"withCollapsibleColumns\">\n <button mat-raised-button\n color=\"primary\"\n type=\"button\"\n class=\"toggle-collapsible-columns-button button-with-icon\"\n (click)=\"toggleCollapsibleColumns()\">\n <ng-container *ngIf=\"expandCollapsibleColumns\">\n <mat-icon class=\"left-icon\">keyboard_double_arrow_left</mat-icon>\n <span>{{ 'mantle.buttons.collapse_table' | translate }}</span>\n </ng-container>\n <ng-container *ngIf=\"!expandCollapsibleColumns\">\n <span>{{ 'mantle.buttons.expand_table' | translate }}</span>\n <mat-icon class=\"right-icon\">keyboard_double_arrow_right</mat-icon>\n </ng-container>\n </button>\n </div>\n </div>\n </div>\n\n <div fxFlex=\"1 0 1px\">\n <mat-drawer-container class=\"full-height-only\" [hasBackdrop]=\"isSmallScreen\">\n <mat-drawer #drawer\n [mode]=\"isSmallScreen ? 'over' : 'side'\"\n [position]=\"isSmallScreen ? 'end' : 'start'\"\n [opened]=\"isActionPanelOpen\"\n [disableClose]=\"!isSmallScreen\"\n (closedStart)=\"isActionPanelOpen = false\"\n (openedStart)=\"isActionPanelOpen = true\">\n\n <button *ngIf=\"listPageService.showAddButton && listPageService.canWrite()\"\n mat-raised-button\n color=\"accent\"\n type=\"button\"\n class=\"add-button\"\n (click)=\"onAddClicked()\">\n <ng-container *ngIf=\"listPageService.customAddButtonLabel; else standardAddButtonLabel\">\n {{ listPageService.customAddButtonLabel | translate }}\n </ng-container>\n <ng-template #standardAddButtonLabel>\n + {{ 'mantle.buttons.add' | translate }} {{ listPageService.noun() | translate }}\n </ng-template>\n </button>\n\n <div class=\"search-section\">\n <mantle-search-panel #searchPanel\n [searchFields]=\"listPageService.searchFields()\">\n </mantle-search-panel>\n </div>\n\n <ng-container *ngFor=\"let exportOption of exportOptions\">\n <button mat-button type=\"button\" class=\"export-button\" (click)=\"exportOption.export(searchPanel.searchParams).subscribe()\">\n <span class=\"export-button-label\">{{ exportOption.label | translate }}</span>\n <mat-icon>download</mat-icon>\n </button>\n </ng-container>\n\n <ng-container *ngIf=\"dataSource.selectedRecordIds.length > 0\">\n <ng-container *ngFor=\"let exportOption of bulkExportOptions\">\n <button mat-button type=\"button\" class=\"export-button\" (click)=\"onBulkExportClicked(exportOption)\">\n <span class=\"export-button-label\">{{ exportOption.label | translate }}</span>\n <mat-icon>download</mat-icon>\n </button>\n </ng-container>\n </ng-container>\n\n <ng-container *ngFor=\"let button of additionalButtons\">\n <div *ngIf=\"button.show\">\n <button mat-raised-button\n color=\"{{ button.color }}\"\n type=\"button\"\n class=\"additional-button\"\n [ngClass]=\"{ 'in-progress-button': button.isInProgress() }\"\n [disabled]=\"listPageService.isCommitInProgress || button.disabled || dataSource.selectedRecordIds.length <= 0\"\n (click)=\"button.onClick(dataSource.selectedRecordIds)\">\n {{ button.label | translate }}\n <mat-spinner *ngIf=\"button.isInProgress()\" matSuffix [diameter]=\"16\"></mat-spinner>\n </button>\n </div>\n </ng-container>\n\n </mat-drawer>\n\n <div fxLayout=\"column\" fxLayoutAlign=\"stretch\" class=\"main-content full-height-only\">\n\n <div fxFlex=\"1 0 1px\" class=\"vertically-scrollable\">\n <table mat-table class=\"full-width horizontal-scroll-table\" matSort>\n\n <ng-container matColumnDef=\"select\">\n <th mat-header-cell *matHeaderCellDef>\n <mat-checkbox click-stop-propagation (change)=\"onCheckAll($event.checked)\" [checked]=\"dataSource.selectAll\"></mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n <mat-checkbox click-stop-propagation (change)=\"onRecordChecked(row, $event.checked)\" [checked]=\"isRecordChecked(row)\"></mat-checkbox>\n </td>\n </ng-container>\n\n <ng-container *ngFor=\"let column of displayedColumns; let i = index\">\n <ng-container matColumnDef=\"{{ column.attr }}\">\n <th mat-header-cell *matHeaderCellDef\n mat-sort-header=\"{{column.sortAttr || column.attr}}\" [disabled]=\"column.disableSort\"\n [@collapse]=\"column.enableCollapse && !expandCollapsibleColumns\"\n [ngClass]=\"{\n 'collapsible-column': column.enableCollapse,\n 'collapsible-column-left': column.enableCollapse && (!displayedColumns[i - 1] || !displayedColumns[i - 1].enableCollapse),\n 'collapsible-column-right': column.enableCollapse && (!displayedColumns[i + 1] || !displayedColumns[i + 1].enableCollapse)\n }\">\n {{ column.header | translate }}\n </th>\n <td mat-cell *matCellDef=\"let row\"\n [@collapse]=\"column.enableCollapse && !expandCollapsibleColumns\"\n [ngClass]=\"{\n 'collapsible-column': column.enableCollapse,\n 'collapsible-column-left': column.enableCollapse && (!displayedColumns[i - 1] || !displayedColumns[i - 1].enableCollapse),\n 'collapsible-column-right': column.enableCollapse && (!displayedColumns[i + 1] || !displayedColumns[i + 1].enableCollapse)\n }\">\n <mantle-dynamic-attribute-display\n [fieldType]=\"column.type\"\n [value]=\"row[column.attr]\"\n [options]=\"column.options\">\n </mantle-dynamic-attribute-display>\n </td>\n </ng-container>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumnAttrs\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumnAttrs;\"\n (click)=\"onRecordClicked(row)\"\n [class.clickable-row]=\"withClickableRows\">\n </tr>\n </table>\n </div>\n\n <mat-paginator #paginator\n fxFlex=\"0 0 auto\"\n [length]=\"0\"\n [pageIndex]=\"0\"\n [pageSize]=\"10\"\n [pageSizeOptions]=\"[10, 20, 50]\">\n </mat-paginator>\n\n </div>\n\n </mat-drawer-container>\n </div>\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"isSmallScreen\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\">\n\n <button *ngIf=\"isActionPanelOpen\" type=\"button\" mat-button (click)=\"drawer.toggle()\">\n <ng-container *ngIf=\"isActionPanelOpen\">\n {{ 'mantle.buttons.close_actions' | translate }}<mat-icon>chevron_right</mat-icon>\n </ng-container>\n </button>\n\n <div fxFlex=\"1 1 auto\"></div>\n\n <button *ngIf=\"!isActionPanelOpen\" type=\"button\" mat-button (click)=\"drawer.toggle()\">\n <ng-container>\n <mat-icon>chevron_left</mat-icon> {{ 'mantle.buttons.open_actions' | translate }}\n </ng-container>\n </button>\n\n </div>\n </div>\n</div>\n", styles: [".main-content{padding-top:0;padding-bottom:0}.mat-drawer{padding:0 16px 0 0}.mat-drawer .add-button{display:block;width:200px;text-transform:uppercase;text-wrap-mode:wrap;border-radius:0;margin:16px 0 0;line-height:16px;padding:10px 16px}.mat-drawer-end{padding:0 16px}.search-section{margin:16px 0 0}.export-button{display:block;width:144px;background-color:transparent;white-space:nowrap;padding:0;margin:16px 0 16px auto}.export-button .export-button-label{display:inline-block;width:100px;white-space:normal;text-align:right;text-transform:uppercase;font-weight:normal;line-height:1.25rem;margin-right:.25rem}.export-button .mat-icon{height:auto;width:auto;font-size:2.5rem}.toggle-collapsible-columns-button{width:200px;text-transform:uppercase}.toggle-collapsible-columns-button .mat-icon{font-size:1.2rem}.collapsible-column-left{border-left:1px solid lightgray}.collapsible-column-right{border-right:1px solid lightgray}th.collapsible-column{border-top:1px solid lightgray}th.collapsible-column-left{border-radius:2px 0 0}th.collapsible-column-right{border-radius:0 2px 0 0}.additional-button{display:block;width:100%;text-transform:uppercase;border-radius:0;margin:16px 0 0}.in-progress-button .mat-spinner{position:absolute;top:10px;right:12px}\n"], components: [{ type: PageTitleComponent, selector: "mantle-page-title" }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i7$1.MatDrawerContainer, selector: "mat-drawer-container", inputs: ["autosize", "hasBackdrop"], outputs: ["backdropClick"], exportAs: ["matDrawerContainer"] }, { type: i7$1.MatDrawer, selector: "mat-drawer", inputs: ["position", "mode", "disableClose", "autoFocus", "opened"], outputs: ["openedChange", "opened", "openedStart", "closed", "closedStart", "positionChanged"], exportAs: ["matDrawer"] }, { type: SearchPanelComponent, selector: "mantle-search-panel", inputs: ["searchFields"], outputs: ["search"] }, { type: i6.MatSpinner, selector: "mat-spinner", inputs: ["color"] }, { type: i2$1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { type: i11.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex", "aria-label", "aria-labelledby", "id", "labelPosition", "name", "required", "checked", "disabled", "indeterminate", "aria-describedby", "value"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { type: i12.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "arrowPosition", "sortActionDescription", "disableClear", "mat-sort-header", "start"], exportAs: ["matSortHeader"] }, { type: DynamicAttributeDisplayComponent, selector: "mantle-dynamic-attribute-display", inputs: ["value", "field", "fieldType", "options"] }, { type: i2$1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { type: i2$1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { type: i14.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }], directives: [{ type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1$6.MatSuffix, selector: "[matSuffix]" }, { type: i12.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortActive"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { type: i2$1.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { type: i2$1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { type: i2$1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { type: ClickStopPropagationDirective, selector: "[click-stop-propagation]" }, { type: i2$1.MatCellDef, selector: "[matCellDef]" }, { type: i2$1.MatCell, selector: "mat-cell, td[mat-cell]" }, { type: i2$1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { type: i2$1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }], pipes: { "translate": i5.TranslatePipe }, animations: [
4145
4631
  trigger('collapse', [
4146
4632
  state('false', style({ display: AUTO_STYLE, opacity: 1 })),
4147
4633
  state('true', style({ display: 'none', opacity: 0 })),
@@ -4206,7 +4692,7 @@ class DeleteConfirmationDialogComponent {
4206
4692
  }
4207
4693
  }
4208
4694
  DeleteConfirmationDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DeleteConfirmationDialogComponent, deps: [{ token: i1$3.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
4209
- DeleteConfirmationDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DeleteConfirmationDialogComponent, selector: "mantle-delete-confirmation-dialog", ngImport: i0, template: "<mat-dialog-content class=\"content-section\">\n\n <h1 class=\"warn-text\">Are you sure?</h1>\n <h3>{{ message }}</h3>\n\n</mat-dialog-content>\n\n<mat-dialog-actions fxLayout=\"row\" class=\"actions-section\">\n <button fxFlex=\"0 0 auto\" mat-button (click)=\"onCancel()\">Cancel</button>\n <div fxFlex=\"1 1 auto\"></div>\n <button fxFlex=\"0 0 auto\" *ngFor=\"let button of buttons\"\n mat-button\n color=\"warn\"\n (click)=\"onDeleteClicked(button.onClick)\">\n {{ button.label }}\n </button>\n</mat-dialog-actions>\n", styles: ["h1,h3{margin-bottom:8px}\n"], components: [{ type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i1$3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i1$3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }, { type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
4695
+ DeleteConfirmationDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DeleteConfirmationDialogComponent, selector: "mantle-delete-confirmation-dialog", ngImport: i0, template: "<mat-dialog-content class=\"content-section\">\n\n <h1 class=\"warn-text\">{{ 'mantle.messages.are_you_sure' | translate }} </h1>\n <h3>{{ message | translate }}</h3>\n\n</mat-dialog-content>\n\n<mat-dialog-actions fxLayout=\"row\" class=\"actions-section\">\n <button fxFlex=\"0 0 auto\" mat-button (click)=\"onCancel()\">{{ 'mantle.buttons.cancel' | translate }}</button>\n <div fxFlex=\"1 1 auto\"></div>\n <button fxFlex=\"0 0 auto\" *ngFor=\"let button of buttons\"\n mat-button\n color=\"warn\"\n (click)=\"onDeleteClicked(button.onClick)\">\n {{ button.label | translate }}\n </button>\n</mat-dialog-actions>\n", styles: ["h1,h3{margin-bottom:8px}\n"], components: [{ type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i1$3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i1$3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }, { type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "translate": i5.TranslatePipe } });
4210
4696
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DeleteConfirmationDialogComponent, decorators: [{
4211
4697
  type: Component,
4212
4698
  args: [{
@@ -4223,7 +4709,6 @@ class SaveConfirmationDialogComponent {
4223
4709
  constructor(dialogRef, params) {
4224
4710
  this.dialogRef = dialogRef;
4225
4711
  this.params = params;
4226
- this.noun = this.params.noun;
4227
4712
  this.message = this.params.message;
4228
4713
  }
4229
4714
  onSaveClicked() {
@@ -4234,7 +4719,7 @@ class SaveConfirmationDialogComponent {
4234
4719
  }
4235
4720
  }
4236
4721
  SaveConfirmationDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: SaveConfirmationDialogComponent, deps: [{ token: i1$3.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
4237
- SaveConfirmationDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: SaveConfirmationDialogComponent, selector: "mantle-save-confirmation-dialog", ngImport: i0, template: "<mat-dialog-content class=\"content-section\">\n\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\">\n\n <div fxFlex=\"0 0 auto\">\n <mat-icon class=\"large-icon\">error_outline</mat-icon>\n </div>\n\n <div fxFlex=\"1 0 1px\">\n <h3 [innerHtml]=\"message\"></h3>\n </div>\n\n <div fxFlex=\"0 0 auto\">\n <button mat-button mat-stroked-button (click)=\"onSaveClicked()\">Confirm</button>\n </div>\n\n </div>\n\n</mat-dialog-content>\n", styles: ["h1,h3{margin-bottom:8px}.large-icon{font-size:40px;height:40px;width:40px}\n"], components: [{ type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i1$3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }] });
4722
+ SaveConfirmationDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: SaveConfirmationDialogComponent, selector: "mantle-save-confirmation-dialog", ngImport: i0, template: "<mat-dialog-content class=\"content-section\">\n\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\">\n\n <div fxFlex=\"0 0 auto\">\n <mat-icon class=\"large-icon\">error_outline</mat-icon>\n </div>\n\n <div *ngIf=\"message\" fxFlex=\"1 0 1px\">\n <h3>{{ message | translate }}</h3>\n </div>\n\n <div fxFlex=\"0 0 auto\">\n <button mat-button mat-stroked-button (click)=\"onSaveClicked()\">{{ 'mantle.buttons.confirm' | translate }}</button>\n </div>\n\n </div>\n\n</mat-dialog-content>\n", styles: ["h1,h3{margin-bottom:8px}.large-icon{width:32px;height:32px;font-size:32px}\n"], components: [{ type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }], directives: [{ type: i1$3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "translate": i5.TranslatePipe } });
4238
4723
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: SaveConfirmationDialogComponent, decorators: [{
4239
4724
  type: Component,
4240
4725
  args: [{
@@ -4256,7 +4741,7 @@ class ConfirmationService {
4256
4741
  dialogConfig.data = configData;
4257
4742
  dialogConfig.minWidth = '400px';
4258
4743
  dialogConfig.maxWidth = '80%';
4259
- dialogConfig.position = { right: '8px', bottom: '8px' };
4744
+ dialogConfig.position = { bottom: '8px' };
4260
4745
  dialogConfig.autoFocus = false;
4261
4746
  dialogConfig.panelClass = 'confirmation-dialog';
4262
4747
  let dialogRef = this.dialog.open(SaveConfirmationDialogComponent, dialogConfig);
@@ -4345,7 +4830,7 @@ class FormPageComponent {
4345
4830
  this.formPageService.onFormContentLoaded(res.content);
4346
4831
  this.loadAdditionalButtons(res.content.data);
4347
4832
  this.content$ = of(res.content);
4348
- this.announcementService.success('Save successful!');
4833
+ this.announcementService.success('mantle.messages.save_successful');
4349
4834
  this.back();
4350
4835
  this.isSaveInProgress = false;
4351
4836
  }
@@ -4365,11 +4850,11 @@ class FormPageComponent {
4365
4850
  if (confirmed)
4366
4851
  this.onSaveClicked();
4367
4852
  else
4368
- this.announcementService.error('Save failed!');
4369
- }, { noun: this.formPageService.noun(), message: res.confirmationRequest.message });
4853
+ this.announcementService.error('mantle.messages.save_failed');
4854
+ }, { message: res.confirmationRequest.message });
4370
4855
  }
4371
4856
  else {
4372
- this.announcementService.error('Save failed!');
4857
+ this.announcementService.error('mantle.messages.save_failed');
4373
4858
  }
4374
4859
  if (!!((_a = res.alert) === null || _a === void 0 ? void 0 : _a.message)) {
4375
4860
  this.announcementService.error(res.alert.message);
@@ -4386,7 +4871,7 @@ class FormPageComponent {
4386
4871
  }
4387
4872
  }
4388
4873
  FormPageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: FormPageComponent, deps: [{ token: i1$4.ActivatedRoute }, { token: i0.Injector }, { token: i0.ChangeDetectorRef }, { token: AnnouncementService }, { token: ConfirmationService }], target: i0.ɵɵFactoryTarget.Component });
4389
- FormPageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: FormPageComponent, selector: "mantle-form-page", viewQueries: [{ propertyName: "dynamicForm", first: true, predicate: DynamicFormComponent, descendants: true }], ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutAlign=\"stretch\" class=\"full-height-min\" [ngClass]=\"{'page full-height-only vertically-scrollable': !isTabbedContent}\">\n <div fxFlex=\"0 0 auto\" class=\"page-header\">\n <div fxLayout=\"row\" fxLayoutAlign=\"stretch\" fxLayoutGap=\"16px\">\n <mantle-content-title *ngIf=\"header\" fxFlex=\"0 0 auto\" [thumbnail]=\"header.thumbnail\" [title]=\"header.title\"></mantle-content-title>\n\n <div fxFlex=\"1 1 auto\"></div>\n\n <div fxFlex=\"0 0 auto\">\n <button mat-icon-button\n type=\"button\"\n (click)=\"onCancelClicked()\"\n [disabled]=\"formPageService.isCommitInProgress\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n </div>\n\n <div fxFlex=\"1 0 auto\" class=\"main-content\">\n <mantle-dynamic-form #dynamicForm [content]=\"content$ | async\" [formPageService]=\"formPageService\"></mantle-dynamic-form>\n </div>\n\n <div fxFlex=\"0 0 auto\" class=\"page-footer\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\">\n <ng-container *ngFor=\"let button of bottomLeftButtons\">\n <div fxFlex=\"0 0 auto\" *ngIf=\"button.show\">\n <button mat-raised-button\n color=\"{{ button.color }}\"\n type=\"button\"\n class=\"additional-button\"\n [ngClass]=\"{ 'in-progress-button': button.isInProgress() }\"\n [disabled]=\"formPageService.isCommitInProgress || button.disabled\"\n (click)=\"button.onClick(dynamicForm?.value)\">\n {{ button.label }}\n <mat-spinner *ngIf=\"button.isInProgress()\" matSuffix [diameter]=\"16\"></mat-spinner>\n </button>\n </div>\n </ng-container>\n\n <div fxFlex=\"1 1 auto\"></div>\n\n <ng-container *ngFor=\"let button of bottomRightButtons\">\n <div fxFlex=\"0 0 auto\" *ngIf=\"button.show\">\n <button mat-raised-button\n color=\"{{ button.color }}\"\n type=\"button\"\n class=\"additional-button\"\n [ngClass]=\"{ 'in-progress-button': button.isInProgress() }\"\n [disabled]=\"formPageService.isCommitInProgress || button.disabled\"\n (click)=\"button.onClick(dynamicForm?.value)\">\n {{ button.label }}\n <mat-spinner *ngIf=\"button.isInProgress()\" matSuffix [diameter]=\"16\"></mat-spinner>\n </button>\n </div>\n </ng-container>\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"formPageService.showSaveButton\">\n <button mat-raised-button\n color=\"primary\"\n type=\"button\"\n class=\"save-button\"\n [ngClass]=\"{ 'in-progress-button': isSaveInProgress }\"\n [disabled]=\"formPageService.isCommitInProgress || !dynamicForm?.valid\"\n (click)=\"onSaveClicked()\">\n Save\n <mat-spinner *ngIf=\"isSaveInProgress\" matSuffix [diameter]=\"16\"></mat-spinner>\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [".save-button,.additional-button{width:140px}.in-progress-button .mat-spinner{position:absolute;top:10px;right:12px}\n"], components: [{ type: ContentTitleComponent, selector: "mantle-content-title", inputs: ["thumbnail", "title"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: DynamicFormComponent, selector: "mantle-dynamic-form", inputs: ["formPageService", "content"] }, { type: i6.MatSpinner, selector: "mat-spinner", inputs: ["color"] }], directives: [{ type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4$1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1$6.MatSuffix, selector: "[matSuffix]" }], pipes: { "async": i4.AsyncPipe } });
4874
+ FormPageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: FormPageComponent, selector: "mantle-form-page", viewQueries: [{ propertyName: "dynamicForm", first: true, predicate: DynamicFormComponent, descendants: true }], ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutAlign=\"stretch\" class=\"full-height-min\" [ngClass]=\"{'page full-height-only vertically-scrollable': !isTabbedContent}\">\n <div fxFlex=\"0 0 auto\" class=\"page-header\">\n <div fxLayout=\"row\" fxLayoutAlign=\"stretch\" fxLayoutGap=\"16px\">\n <mantle-content-title *ngIf=\"header\" fxFlex=\"0 0 auto\" [thumbnail]=\"header.thumbnail\" [title]=\"header.title\"></mantle-content-title>\n\n <div fxFlex=\"1 1 auto\"></div>\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"!formPageService.hideCancelButton\">\n <button mat-icon-button\n type=\"button\"\n (click)=\"onCancelClicked()\"\n [disabled]=\"formPageService.isCommitInProgress\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n </div>\n\n <div fxFlex=\"1 0 auto\" class=\"main-content\">\n <mantle-dynamic-form #dynamicForm [content]=\"content$ | async\" [formPageService]=\"formPageService\"></mantle-dynamic-form>\n </div>\n\n <div fxFlex=\"0 0 auto\" class=\"page-footer\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\">\n <ng-container *ngFor=\"let button of bottomLeftButtons\">\n <div fxFlex=\"0 0 auto\" *ngIf=\"button.show\">\n <button mat-raised-button\n color=\"{{ button.color }}\"\n type=\"button\"\n class=\"additional-button\"\n [ngClass]=\"{ 'in-progress-button': button.isInProgress() }\"\n [disabled]=\"formPageService.isCommitInProgress || button.disabled\"\n (click)=\"button.onClick(dynamicForm?.value)\">\n {{ button.label | translate }}\n <mat-spinner *ngIf=\"button.isInProgress()\" matSuffix [diameter]=\"16\"></mat-spinner>\n </button>\n </div>\n </ng-container>\n\n <div fxFlex=\"1 1 auto\"></div>\n\n <ng-container *ngFor=\"let button of bottomRightButtons\">\n <div fxFlex=\"0 0 auto\" *ngIf=\"button.show\">\n <button mat-raised-button\n color=\"{{ button.color }}\"\n type=\"button\"\n class=\"additional-button\"\n [ngClass]=\"{ 'in-progress-button': button.isInProgress() }\"\n [disabled]=\"formPageService.isCommitInProgress || button.disabled\"\n (click)=\"button.onClick(dynamicForm?.value)\">\n {{ button.label | translate }}\n <mat-spinner *ngIf=\"button.isInProgress()\" matSuffix [diameter]=\"16\"></mat-spinner>\n </button>\n </div>\n </ng-container>\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"formPageService.showSaveButton\">\n <button mat-raised-button\n color=\"primary\"\n type=\"button\"\n class=\"save-button\"\n [ngClass]=\"{ 'in-progress-button': isSaveInProgress }\"\n [disabled]=\"formPageService.isCommitInProgress || !dynamicForm?.valid\"\n (click)=\"onSaveClicked()\">\n {{ 'mantle.buttons.save' | translate }}\n <mat-spinner *ngIf=\"isSaveInProgress\" matSuffix [diameter]=\"16\"></mat-spinner>\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [".save-button,.additional-button{width:140px}.in-progress-button .mat-spinner{position:absolute;top:10px;right:12px}\n"], components: [{ type: ContentTitleComponent, selector: "mantle-content-title", inputs: ["thumbnail", "title"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: DynamicFormComponent, selector: "mantle-dynamic-form", inputs: ["formPageService", "content"] }, { type: i6.MatSpinner, selector: "mat-spinner", inputs: ["color"] }], directives: [{ type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1$6.MatSuffix, selector: "[matSuffix]" }], pipes: { "async": i4.AsyncPipe, "translate": i5.TranslatePipe } });
4390
4875
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: FormPageComponent, decorators: [{
4391
4876
  type: Component,
4392
4877
  args: [{
@@ -4414,24 +4899,27 @@ class DetailPageComponent {
4414
4899
  this.isTabbedContent = this.route.snapshot.data['isTabbedContent'];
4415
4900
  }
4416
4901
  ngOnInit() {
4417
- this.loadData();
4902
+ this.pullContent();
4418
4903
  }
4419
- loadData() {
4904
+ pullContent() {
4420
4905
  this.route.params.subscribe(params => {
4421
4906
  this.id = this.route.snapshot.params['id'];
4422
- this.content$ = this.detailPageService.get(this.id).pipe(map(res => {
4423
- this.header = res.header;
4424
- this.detailPageService.onDetailContentLoaded(res.content);
4425
- res.content.containers.forEach((container) => {
4426
- container.sections.forEach((section) => {
4427
- this.loadSectionActions(section);
4428
- });
4429
- });
4430
- this.loadAdditionalButtons(res.content.data);
4431
- this.exportOptions = this.detailPageService.detailPageExportOptions(res.content.data);
4432
- return res.content;
4433
- }));
4907
+ this.detailPageService.get(this.id).subscribe((res) => {
4908
+ this.loadContent(res);
4909
+ });
4910
+ });
4911
+ }
4912
+ loadContent(response) {
4913
+ this.header = response.header;
4914
+ this.content = response.content;
4915
+ this.detailPageService.onDetailContentLoaded(this.content);
4916
+ this.content.containers.forEach((container) => {
4917
+ container.sections.forEach((section) => {
4918
+ this.loadSectionActions(section);
4919
+ });
4434
4920
  });
4921
+ this.loadAdditionalButtons(this.content.data);
4922
+ this.exportOptions = this.detailPageService.detailPageExportOptions(this.content.data);
4435
4923
  }
4436
4924
  loadSectionActions(section) {
4437
4925
  let sectionActions = this.detailPageService.detailPageSectionActions(section.slug);
@@ -4454,6 +4942,9 @@ class DetailPageComponent {
4454
4942
  onEditClicked() {
4455
4943
  this.detailPageService.openForm({ id: this.id });
4456
4944
  }
4945
+ onCloneClicked() {
4946
+ this.detailPageService.openForm({}, { clone_id: this.id });
4947
+ }
4457
4948
  onBackClicked() {
4458
4949
  this.detailPageService.openList();
4459
4950
  }
@@ -4461,12 +4952,12 @@ class DetailPageComponent {
4461
4952
  this.detailPageService.delete(this.id, () => { this.isDeleteInProgress = true; }, (res) => { this.onDeleteSuccess(res); }, (res) => { this.onDeleteFailure(res); });
4462
4953
  }
4463
4954
  onDeleteSuccess(res) {
4464
- this.announcementService.success('Delete successful!');
4955
+ this.announcementService.success('mantle.messages.delete_successful');
4465
4956
  this.back();
4466
4957
  this.isDeleteInProgress = false;
4467
4958
  }
4468
4959
  onDeleteFailure(res) {
4469
- this.announcementService.error('Delete failed!');
4960
+ this.announcementService.error('mantle.messages.delete_failed');
4470
4961
  this.isDeleteInProgress = false;
4471
4962
  }
4472
4963
  back() {
@@ -4474,7 +4965,7 @@ class DetailPageComponent {
4474
4965
  }
4475
4966
  }
4476
4967
  DetailPageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DetailPageComponent, deps: [{ token: i1$4.ActivatedRoute }, { token: i0.Injector }, { token: AnnouncementService }], target: i0.ɵɵFactoryTarget.Component });
4477
- DetailPageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DetailPageComponent, selector: "mantle-detail-page", ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutAlign=\"stretch\" class=\"full-height-min\" [ngClass]=\"{'page full-height-only vertically-scrollable': !isTabbedContent}\">\n <div fxFlex=\"0 0 auto\" class=\"page-header\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center start\" fxLayoutGap=\"16px\">\n <div fxFlex=\"0 0 auto\" *ngIf=\"!detailPageService.hideBackButton\">\n <button class=\"back-button\" mat-mini-fab color=\"primary\" type=\"button\" (click)=\"onBackClicked()\">\n <mat-icon>arrow_back</mat-icon>\n </button>\n </div>\n\n <div fxFlex=\"1 1 auto\">\n <mantle-content-title *ngIf=\"header\" [thumbnail]=\"header.thumbnail\" [title]=\"header.title\"></mantle-content-title>\n </div>\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"detailPageService.showEditButton && detailPageService.canWrite()\">\n <button mat-mini-fab\n color=\"primary\"\n type=\"button\"\n class=\"edit-button\"\n (click)=\"onEditClicked()\"\n [disabled]=\"detailPageService.isCommitInProgress\">\n <mat-icon>edit</mat-icon>\n </button>\n </div>\n </div>\n </div>\n\n <div fxFlex=\"1 0 auto\" class=\"main-content\">\n <mantle-dynamic-details [content]=\"content$ | async\" [detailPageService]=\"detailPageService\"></mantle-dynamic-details>\n </div>\n\n <div fxFlex=\"0 0 auto\" class=\"page-footer\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\">\n <ng-container *ngFor=\"let button of bottomLeftButtons\">\n <div fxFlex=\"0 0 auto\" *ngIf=\"button.show\">\n <button mat-raised-button\n color=\"{{ button.color }}\"\n type=\"button\"\n class=\"additional-button\"\n [ngClass]=\"{ 'in-progress-button': button.isInProgress() }\"\n [disabled]=\"detailPageService.isCommitInProgress || button.disabled\"\n (click)=\"button.onClick(id)\">\n {{ button.label }}\n <mat-spinner *ngIf=\"button.isInProgress()\" matSuffix [diameter]=\"16\"></mat-spinner>\n </button>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"content$ | async as content\">\n <div fxFlex=\"0 0 auto\" *ngFor=\"let exportOption of exportOptions\">\n <div *ngIf=\"(exportOption.show == null) || (exportOption.show)\">\n <button mat-button\n type=\"button\"\n class=\"export-button\"\n (click)=\"exportOption.export(content.data).subscribe()\"\n [disabled]=\"detailPageService.isCommitInProgress\">\n <span class=\"export-button-label\">{{ exportOption.label }}</span>\n <mat-icon>download</mat-icon>\n </button>\n </div>\n </div>\n </ng-container>\n\n <div fxFlex=\"1 1 auto\"></div>\n\n <ng-container *ngFor=\"let button of bottomRightButtons\">\n <div fxFlex=\"0 0 auto\" *ngIf=\"button.show\">\n <button mat-raised-button\n color=\"{{ button.color }}\"\n type=\"button\"\n class=\"additional-button\"\n [ngClass]=\"{ 'in-progress-button': button.isInProgress() }\"\n [disabled]=\"detailPageService.isCommitInProgress || button.disabled\"\n (click)=\"button.onClick(id)\">\n {{ button.label }}\n <mat-spinner *ngIf=\"button.isInProgress()\" matSuffix [diameter]=\"16\"></mat-spinner>\n </button>\n </div>\n </ng-container>\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"detailPageService.showDeleteButton && detailPageService.canWrite()\">\n <button mat-button\n color=\"warn\"\n type=\"button\"\n class=\"delete-button\"\n [ngClass]=\"{ 'in-progress-button': isDeleteInProgress }\"\n [disabled]=\"detailPageService.isCommitInProgress\"\n (click)=\"onDeleteClicked()\">\n Delete {{ detailPageService.noun() }}\n <mat-spinner *ngIf=\"isDeleteInProgress\" matSuffix [diameter]=\"16\"></mat-spinner>\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [".edit-button{margin-bottom:8px}.export-button{display:block;width:144px;background-color:transparent;white-space:nowrap;padding:0;margin:16px 0 16px auto}.export-button .export-button-label{display:inline-block;width:100px;white-space:normal;text-align:right;text-transform:uppercase;font-weight:normal;line-height:1.25rem;margin-right:.25rem}.export-button .mat-icon{height:auto;width:auto;font-size:2.5rem}.additional-button{min-width:140px}.in-progress-button .mat-spinner{position:absolute;top:10px;right:12px}\n"], components: [{ type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: ContentTitleComponent, selector: "mantle-content-title", inputs: ["thumbnail", "title"] }, { type: DynamicDetailsComponent, selector: "mantle-dynamic-details", inputs: ["detailPageService", "content"] }, { type: i6.MatSpinner, selector: "mat-spinner", inputs: ["color"] }], directives: [{ type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4$1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1$6.MatSuffix, selector: "[matSuffix]" }], pipes: { "async": i4.AsyncPipe } });
4968
+ DetailPageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DetailPageComponent, selector: "mantle-detail-page", ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutAlign=\"stretch\" class=\"full-height-min\" [ngClass]=\"{'page full-height-only vertically-scrollable': !isTabbedContent}\">\n <div fxFlex=\"0 0 auto\" class=\"page-header\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center start\" fxLayoutGap=\"16px\">\n <div fxFlex=\"0 0 auto\" *ngIf=\"!detailPageService.hideBackButton\">\n <button class=\"back-button\" mat-mini-fab color=\"primary\" type=\"button\" (click)=\"onBackClicked()\">\n <mat-icon>arrow_back</mat-icon>\n </button>\n </div>\n\n <div fxFlex=\"1 1 auto\">\n <mantle-content-title *ngIf=\"header\" [thumbnail]=\"header.thumbnail\" [title]=\"header.title\"></mantle-content-title>\n </div>\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"detailPageService.showEditButton && detailPageService.canWrite()\">\n <button mat-mini-fab\n color=\"primary\"\n type=\"button\"\n class=\"edit-button\"\n (click)=\"onEditClicked()\"\n [disabled]=\"detailPageService.isCommitInProgress\">\n <mat-icon>edit</mat-icon>\n </button>\n </div>\n </div>\n </div>\n\n <div fxFlex=\"1 0 auto\" class=\"main-content\">\n <mantle-dynamic-details [content]=\"content\" [detailPageService]=\"detailPageService\"></mantle-dynamic-details>\n </div>\n\n <div fxFlex=\"0 0 auto\" class=\"page-footer\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\">\n <ng-container *ngFor=\"let button of bottomLeftButtons\">\n <div fxFlex=\"0 0 auto\" *ngIf=\"button.show\">\n <button mat-raised-button\n color=\"{{ button.color }}\"\n type=\"button\"\n class=\"additional-button\"\n [ngClass]=\"{ 'in-progress-button': button.isInProgress() }\"\n [disabled]=\"detailPageService.isCommitInProgress || button.disabled\"\n (click)=\"button.onClick(id)\">\n {{ button.label | translate }}\n <mat-spinner *ngIf=\"button.isInProgress()\" matSuffix [diameter]=\"16\"></mat-spinner>\n </button>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"content\">\n <div fxFlex=\"0 0 auto\" *ngFor=\"let exportOption of exportOptions\">\n <div *ngIf=\"(exportOption.show == null) || (exportOption.show)\">\n <button mat-button\n type=\"button\"\n class=\"export-button\"\n (click)=\"exportOption.export(content.data).subscribe()\"\n [disabled]=\"detailPageService.isCommitInProgress\">\n <span class=\"export-button-label\">{{ exportOption.label | translate }}</span>\n <mat-icon>download</mat-icon>\n </button>\n </div>\n </div>\n </ng-container>\n\n <div fxFlex=\"1 1 auto\"></div>\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"detailPageService.showCloneButton && detailPageService.canWrite()\">\n <button mat-raised-button\n color=\"accent\"\n type=\"button\"\n class=\"clone-button\"\n (click)=\"onCloneClicked()\">\n {{ 'mantle.buttons.clone' | translate }}\n </button>\n </div>\n\n <ng-container *ngFor=\"let button of bottomRightButtons\">\n <div fxFlex=\"0 0 auto\" *ngIf=\"button.show\">\n <button mat-raised-button\n color=\"{{ button.color }}\"\n type=\"button\"\n class=\"additional-button\"\n [ngClass]=\"{ 'in-progress-button': button.isInProgress() }\"\n [disabled]=\"detailPageService.isCommitInProgress || button.disabled\"\n (click)=\"button.onClick(id)\">\n {{ button.label | translate }}\n <mat-spinner *ngIf=\"button.isInProgress()\" matSuffix [diameter]=\"16\"></mat-spinner>\n </button>\n </div>\n </ng-container>\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"detailPageService.showDeleteButton && detailPageService.canWrite()\">\n <button mat-button\n color=\"warn\"\n type=\"button\"\n class=\"delete-button\"\n [ngClass]=\"{ 'in-progress-button': isDeleteInProgress }\"\n [disabled]=\"detailPageService.isCommitInProgress\"\n (click)=\"onDeleteClicked()\">\n {{ 'mantle.buttons.delete' | translate }} {{ detailPageService.noun() | translate }}\n <mat-spinner *ngIf=\"isDeleteInProgress\" matSuffix [diameter]=\"16\"></mat-spinner>\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [".edit-button{margin-bottom:8px}.export-button{display:block;width:144px;background-color:transparent;white-space:nowrap;padding:0;margin:16px 0 16px auto}.export-button .export-button-label{display:inline-block;width:100px;white-space:normal;text-align:right;text-transform:uppercase;font-weight:normal;line-height:1.25rem;margin-right:.25rem}.export-button .mat-icon{height:auto;width:auto;font-size:2.5rem}.additional-button{min-width:140px}.clone-button{min-width:140px}.in-progress-button .mat-spinner{position:absolute;top:10px;right:12px}\n"], components: [{ type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: ContentTitleComponent, selector: "mantle-content-title", inputs: ["thumbnail", "title"] }, { type: DynamicDetailsComponent, selector: "mantle-dynamic-details", inputs: ["detailPageService", "content"] }, { type: i6.MatSpinner, selector: "mat-spinner", inputs: ["color"] }], directives: [{ type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1$6.MatSuffix, selector: "[matSuffix]" }], pipes: { "translate": i5.TranslatePipe } });
4478
4969
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DetailPageComponent, decorators: [{
4479
4970
  type: Component,
4480
4971
  args: [{
@@ -4536,13 +5027,13 @@ class DocumentsPageComponent {
4536
5027
  this.listPageService.openForm({}, { document: document });
4537
5028
  this.uploadInProgress = false;
4538
5029
  }, (response) => {
4539
- this.announcementService.error('Unable to upload file');
5030
+ this.announcementService.error('mantle.messages.unable_to_upload_file');
4540
5031
  this.uploadInProgress = false;
4541
5032
  });
4542
5033
  }
4543
5034
  }
4544
5035
  DocumentsPageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DocumentsPageComponent, deps: [{ token: i1$4.ActivatedRoute }, { token: i0.Injector }, { token: AnnouncementService }, { token: WebApiService }, { token: ScreenSizeService }], target: i0.ɵɵFactoryTarget.Component });
4545
- DocumentsPageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DocumentsPageComponent, selector: "mantle-documents-page", viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "table", first: true, predicate: MatTable, descendants: true }, { propertyName: "searchPanel", first: true, predicate: SearchPanelComponent, descendants: true }], ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutAlign=\"stretch\" fxLayoutGap=\"16px\" class=\"list-page full-height-only\" [ngClass]=\"{'page': !isTabbedContent}\">\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"!isTabbedContent\">\n <mantle-page-title>{{ pageTitle }}</mantle-page-title>\n </div>\n\n <div fxFlex=\"1 0 1px\">\n <mat-drawer-container class=\"full-height-only\" [hasBackdrop]=\"isSmallScreen\">\n <mat-drawer #drawer\n [mode]=\"isSmallScreen ? 'over' : 'side'\"\n [position]=\"isSmallScreen ? 'end' : 'start'\"\n [opened]=\"isActionPanelOpen\"\n [disableClose]=\"!isSmallScreen\"\n (closedStart)=\"isActionPanelOpen = false\"\n (openedStart)=\"isActionPanelOpen = true\">\n\n <button *ngIf=\"listPageService.showAddButton && listPageService.canWrite()\"\n mat-raised-button\n color=\"accent\"\n type=\"button\"\n class=\"add-button\"\n (click)=\"onAddClicked()\">\n + New {{ listPageService?.noun() }}\n </button>\n\n <div class=\"search-section\">\n <mantle-search-panel #searchPanel\n [searchFields]=\"listPageService.searchFields()\">\n </mantle-search-panel>\n </div>\n\n <ng-container *ngFor=\"let exportOption of exportOptions\">\n <button mat-button type=\"button\" class=\"export-button\" (click)=\"exportOption.export(searchPanel.searchParams).subscribe()\">\n <span class=\"export-button-label\">{{ exportOption.label }}</span>\n <mat-icon>download</mat-icon>\n </button>\n </ng-container>\n\n </mat-drawer>\n\n <div fxLayout=\"column\" fxLayoutAlign=\"stretch\" class=\"main-content full-height-only\"\n file-dropzone (fileDropped)=\"onFileDropped($event[0])\" [class.uploading]=\"uploadInProgress\">\n\n <div *ngIf=\"uploadInProgress\" class=\"uploading-indicator-overlay\">\n <div class=\"uploading-indicator\">Uploading...</div>\n <mantle-loader></mantle-loader>\n </div>\n\n <div fxFlex=\"1 0 1px\" class=\"vertically-scrollable\">\n <table mat-table class=\"full-width horizontal-scroll-table\" matSort>\n\n <ng-container *ngFor=\"let column of displayedColumns\">\n <ng-container matColumnDef=\"{{ column.attr }}\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>{{ column.header }}</th>\n <td mat-cell *matCellDef=\"let row\">\n <mantle-dynamic-attribute-display\n [fieldType]=\"column.type\"\n [value]=\"row[column.attr]\">\n </mantle-dynamic-attribute-display>\n </td>\n </ng-container>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumnAttrs\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumnAttrs;\"\n (click)=\"onRecordClicked(row)\"\n [class.clickable-row]=\"withClickableRows\">\n </tr>\n </table>\n </div>\n\n <mat-paginator #paginator\n fxFlex=\"0 0 auto\"\n [length]=\"0\"\n [pageIndex]=\"0\"\n [pageSize]=\"10\"\n [pageSizeOptions]=\"[10, 20, 50]\">\n </mat-paginator>\n\n </div>\n\n </mat-drawer-container>\n </div>\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"isSmallScreen\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\">\n\n <button *ngIf=\"isActionPanelOpen\" type=\"button\" mat-button (click)=\"drawer.toggle()\">\n <ng-container *ngIf=\"isActionPanelOpen\">\n Close Actions<mat-icon>chevron_right</mat-icon>\n </ng-container>\n </button>\n\n <div fxFlex=\"1 1 auto\"></div>\n\n <button *ngIf=\"!isActionPanelOpen\" type=\"button\" mat-button (click)=\"drawer.toggle()\">\n <ng-container>\n <mat-icon>chevron_left</mat-icon> Open Actions\n </ng-container>\n </button>\n\n </div>\n </div>\n</div>\n", styles: [".main-content{padding-top:0;padding-bottom:0}.mat-drawer{padding:0 16px 0 0}.mat-drawer .add-button{display:block;width:100%;text-transform:uppercase;border-radius:0;margin:16px 0 0}.mat-drawer-end{padding:0 16px}.search-section{margin:16px 0 0}.export-button{display:block;width:144px;background-color:transparent;white-space:nowrap;padding:0;margin:16px 0 16px auto}.export-button .export-button-label{display:inline-block;width:100px;white-space:normal;text-align:right;text-transform:uppercase;font-weight:normal;line-height:1.25rem;margin-right:.25rem}.export-button .mat-icon{height:auto;width:auto;font-size:2.5rem}.toggle-collapsible-columns-button{width:200px;text-transform:uppercase}.toggle-collapsible-columns-button .mat-icon{font-size:1.2rem}.collapsible-column-left{border-left:1px solid lightgray}.collapsible-column-right{border-right:1px solid lightgray}th.collapsible-column{border-top:1px solid lightgray}th.collapsible-column-left{border-radius:2px 0 0}th.collapsible-column-right{border-radius:0 2px 0 0}\n"], components: [{ type: PageTitleComponent, selector: "mantle-page-title" }, { type: i7.MatDrawerContainer, selector: "mat-drawer-container", inputs: ["autosize", "hasBackdrop"], outputs: ["backdropClick"], exportAs: ["matDrawerContainer"] }, { type: i7.MatDrawer, selector: "mat-drawer", inputs: ["position", "mode", "disableClose", "autoFocus", "opened"], outputs: ["openedChange", "opened", "openedStart", "closed", "closedStart", "positionChanged"], exportAs: ["matDrawer"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: SearchPanelComponent, selector: "mantle-search-panel", inputs: ["searchFields"], outputs: ["search"] }, { type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: LoaderComponent, selector: "mantle-loader", inputs: ["delay"] }, { type: i2$1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { type: i3$3.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "arrowPosition", "sortActionDescription", "disableClear", "mat-sort-header", "start"], exportAs: ["matSortHeader"] }, { type: DynamicAttributeDisplayComponent, selector: "mantle-dynamic-attribute-display", inputs: ["value", "field", "fieldType", "options"] }, { type: i2$1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { type: i2$1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { type: i5$1.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }], directives: [{ type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: FileDropzoneDirective, selector: "[file-dropzone]", outputs: ["fileDropped"] }, { type: i3$3.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortActive"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { type: i2$1.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { type: i2$1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { type: i2$1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { type: i2$1.MatCellDef, selector: "[matCellDef]" }, { type: i2$1.MatCell, selector: "mat-cell, td[mat-cell]" }, { type: i2$1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { type: i2$1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }] });
5036
+ DocumentsPageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DocumentsPageComponent, selector: "mantle-documents-page", viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "table", first: true, predicate: MatTable, descendants: true }, { propertyName: "searchPanel", first: true, predicate: SearchPanelComponent, descendants: true }], ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutAlign=\"stretch\" fxLayoutGap=\"16px\" class=\"list-page full-height-only\" [ngClass]=\"{'page': !isTabbedContent}\">\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"!isTabbedContent\">\n <mantle-page-title>{{ pageTitle | translate }}</mantle-page-title>\n </div>\n\n <div fxFlex=\"1 0 1px\">\n <mat-drawer-container class=\"full-height-only\" [hasBackdrop]=\"isSmallScreen\">\n <mat-drawer #drawer\n [mode]=\"isSmallScreen ? 'over' : 'side'\"\n [position]=\"isSmallScreen ? 'end' : 'start'\"\n [opened]=\"isActionPanelOpen\"\n [disableClose]=\"!isSmallScreen\"\n (closedStart)=\"isActionPanelOpen = false\"\n (openedStart)=\"isActionPanelOpen = true\">\n\n <button *ngIf=\"listPageService.showAddButton && listPageService.canWrite()\"\n mat-raised-button\n color=\"accent\"\n type=\"button\"\n class=\"add-button\"\n (click)=\"onAddClicked()\">\n + {{ 'mantle.buttons.add' | translate }} {{ listPageService.noun() | translate }}\n </button>\n\n <div class=\"search-section\">\n <mantle-search-panel #searchPanel\n [searchFields]=\"listPageService.searchFields()\">\n </mantle-search-panel>\n </div>\n\n <ng-container *ngFor=\"let exportOption of exportOptions\">\n <button mat-button type=\"button\" class=\"export-button\" (click)=\"exportOption.export(searchPanel.searchParams).subscribe()\">\n <span class=\"export-button-label\">{{ exportOption.label | translate }}</span>\n <mat-icon>download</mat-icon>\n </button>\n </ng-container>\n\n </mat-drawer>\n\n <div fxLayout=\"column\" fxLayoutAlign=\"stretch\" class=\"main-content full-height-only\"\n file-dropzone (fileDropped)=\"onFileDropped($event[0])\" [class.uploading]=\"uploadInProgress\">\n\n <div *ngIf=\"uploadInProgress\" class=\"uploading-indicator-overlay\">\n <div class=\"uploading-indicator\">Uploading...</div>\n <mantle-loader></mantle-loader>\n </div>\n\n <div fxFlex=\"1 0 1px\" class=\"vertically-scrollable\">\n <table mat-table class=\"full-width horizontal-scroll-table\" matSort>\n\n <ng-container *ngFor=\"let column of displayedColumns\">\n <ng-container matColumnDef=\"{{ column.attr }}\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>{{ column.header | translate }}</th>\n <td mat-cell *matCellDef=\"let row\">\n <mantle-dynamic-attribute-display\n [fieldType]=\"column.type\"\n [value]=\"row[column.attr]\">\n </mantle-dynamic-attribute-display>\n </td>\n </ng-container>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumnAttrs\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumnAttrs;\"\n (click)=\"onRecordClicked(row)\"\n [class.clickable-row]=\"withClickableRows\">\n </tr>\n </table>\n </div>\n\n <mat-paginator #paginator\n fxFlex=\"0 0 auto\"\n [length]=\"0\"\n [pageIndex]=\"0\"\n [pageSize]=\"10\"\n [pageSizeOptions]=\"[10, 20, 50]\">\n </mat-paginator>\n\n </div>\n\n </mat-drawer-container>\n </div>\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"isSmallScreen\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\">\n\n <button *ngIf=\"isActionPanelOpen\" type=\"button\" mat-button (click)=\"drawer.toggle()\">\n <ng-container *ngIf=\"isActionPanelOpen\">\n {{ 'mantle.buttons.close_actions' | translate }}<mat-icon>chevron_right</mat-icon>\n </ng-container>\n </button>\n\n <div fxFlex=\"1 1 auto\"></div>\n\n <button *ngIf=\"!isActionPanelOpen\" type=\"button\" mat-button (click)=\"drawer.toggle()\">\n <ng-container>\n <mat-icon>chevron_left</mat-icon> {{ 'mantle.buttons.open_actions' | translate }}\n </ng-container>\n </button>\n\n </div>\n </div>\n</div>\n", styles: [".main-content{padding-top:0;padding-bottom:0}.mat-drawer{padding:0 16px 0 0}.mat-drawer .add-button{display:block;width:200px;text-transform:uppercase;text-wrap-mode:wrap;border-radius:0;margin:16px 0 0;line-height:16px;padding:10px 16px}.mat-drawer-end{padding:0 16px}.search-section{margin:16px 0 0}.export-button{display:block;width:144px;background-color:transparent;white-space:nowrap;padding:0;margin:16px 0 16px auto}.export-button .export-button-label{display:inline-block;width:100px;white-space:normal;text-align:right;text-transform:uppercase;font-weight:normal;line-height:1.25rem;margin-right:.25rem}.export-button .mat-icon{height:auto;width:auto;font-size:2.5rem}.toggle-collapsible-columns-button{width:200px;text-transform:uppercase}.toggle-collapsible-columns-button .mat-icon{font-size:1.2rem}.collapsible-column-left{border-left:1px solid lightgray}.collapsible-column-right{border-right:1px solid lightgray}th.collapsible-column{border-top:1px solid lightgray}th.collapsible-column-left{border-radius:2px 0 0}th.collapsible-column-right{border-radius:0 2px 0 0}.additional-button{display:block;width:100%;text-transform:uppercase;border-radius:0;margin:16px 0 0}.in-progress-button .mat-spinner{position:absolute;top:10px;right:12px}\n"], components: [{ type: PageTitleComponent, selector: "mantle-page-title" }, { type: i7$1.MatDrawerContainer, selector: "mat-drawer-container", inputs: ["autosize", "hasBackdrop"], outputs: ["backdropClick"], exportAs: ["matDrawerContainer"] }, { type: i7$1.MatDrawer, selector: "mat-drawer", inputs: ["position", "mode", "disableClose", "autoFocus", "opened"], outputs: ["openedChange", "opened", "openedStart", "closed", "closedStart", "positionChanged"], exportAs: ["matDrawer"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: SearchPanelComponent, selector: "mantle-search-panel", inputs: ["searchFields"], outputs: ["search"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: LoaderComponent, selector: "mantle-loader", inputs: ["delay"] }, { type: i2$1.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { type: i12.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "arrowPosition", "sortActionDescription", "disableClear", "mat-sort-header", "start"], exportAs: ["matSortHeader"] }, { type: DynamicAttributeDisplayComponent, selector: "mantle-dynamic-attribute-display", inputs: ["value", "field", "fieldType", "options"] }, { type: i2$1.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { type: i2$1.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { type: i14.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }], directives: [{ type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: FileDropzoneDirective, selector: "[file-dropzone]", outputs: ["fileDropped"] }, { type: i12.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortActive"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { type: i2$1.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { type: i2$1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { type: i2$1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { type: i2$1.MatCellDef, selector: "[matCellDef]" }, { type: i2$1.MatCell, selector: "mat-cell, td[mat-cell]" }, { type: i2$1.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { type: i2$1.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }], pipes: { "translate": i5.TranslatePipe } });
4546
5037
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DocumentsPageComponent, decorators: [{
4547
5038
  type: Component,
4548
5039
  args: [{
@@ -4582,7 +5073,7 @@ class TabbedPageComponent {
4582
5073
  }
4583
5074
  }
4584
5075
  TabbedPageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: TabbedPageComponent, deps: [{ token: i1$4.ActivatedRoute }, { token: i1$4.Router }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
4585
- TabbedPageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: TabbedPageComponent, selector: "mantle-tabbed-page", ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutAlign=\"stretch\" fxLayoutGap=\"4px\" class=\"tabbed-page full-height-only\">\n\n <div fxFlex=\"0 0 auto\" class=\"tab-bar\">\n <nav mat-tab-nav-bar>\n <a mat-tab-link *ngFor=\"let link of links\"\n (click)=\"activeLink = link.route\"\n [active]=\"activeLink == link.route\"\n [routerLink]=\"link.route\"> {{link.label}} </a>\n </nav>\n </div>\n\n <div fxFlex=\"1 0 1px\" class=\"tab-content vertically-scrollable\">\n <router-outlet></router-outlet>\n </div>\n\n</div>\n", styles: [""], components: [{ type: i2$7.MatTabNav, selector: "[mat-tab-nav-bar]", inputs: ["color"], exportAs: ["matTabNavBar", "matTabNav"] }], directives: [{ type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1$4.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["routerLink", "target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo"] }, { type: i2$7.MatTabLink, selector: "[mat-tab-link], [matTabLink]", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matTabLink"] }, { type: i1$4.RouterOutlet, selector: "router-outlet", outputs: ["activate", "deactivate"], exportAs: ["outlet"] }] });
5076
+ TabbedPageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: TabbedPageComponent, selector: "mantle-tabbed-page", ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutAlign=\"stretch\" fxLayoutGap=\"4px\" class=\"tabbed-page full-height-only\">\n\n <div fxFlex=\"0 0 auto\" class=\"tab-bar\">\n <nav mat-tab-nav-bar>\n <a mat-tab-link *ngFor=\"let link of links\"\n (click)=\"activeLink = link.route\"\n [active]=\"activeLink == link.route\"\n [routerLink]=\"link.route\"> {{ link.label | translate }} </a>\n </nav>\n </div>\n\n <div fxFlex=\"1 0 1px\" class=\"tab-content vertically-scrollable\">\n <router-outlet></router-outlet>\n </div>\n\n</div>\n", styles: [""], components: [{ type: i2$8.MatTabNav, selector: "[mat-tab-nav-bar]", inputs: ["color"], exportAs: ["matTabNavBar", "matTabNav"] }], directives: [{ type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1$4.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["routerLink", "target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo"] }, { type: i2$8.MatTabLink, selector: "[mat-tab-link], [matTabLink]", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matTabLink"] }, { type: i1$4.RouterOutlet, selector: "router-outlet", outputs: ["activate", "deactivate"], exportAs: ["outlet"] }], pipes: { "translate": i5.TranslatePipe } });
4586
5077
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: TabbedPageComponent, decorators: [{
4587
5078
  type: Component,
4588
5079
  args: [{
@@ -4592,6 +5083,172 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
4592
5083
  }]
4593
5084
  }], ctorParameters: function () { return [{ type: i1$4.ActivatedRoute }, { type: i1$4.Router }, { type: i0.Injector }]; } });
4594
5085
 
5086
+ const ROSTER_GANTT_CHART = {
5087
+ chart: {
5088
+ type: 'gantt'
5089
+ },
5090
+ exporting: {
5091
+ enabled: true,
5092
+ sourceWidth: 1200,
5093
+ buttons: {
5094
+ contextButton: {
5095
+ menuItems: ["downloadCSV", "downloadPDF", "downloadJPEG"]
5096
+ }
5097
+ }
5098
+ },
5099
+ legend: { enabled: false },
5100
+ plotOptions: {
5101
+ gantt: {
5102
+ borderRadius: 0,
5103
+ pointWidth: 24
5104
+ },
5105
+ series: {
5106
+ dataLabels: {
5107
+ enabled: true,
5108
+ format: '{point.shift_type}'
5109
+ }
5110
+ }
5111
+ },
5112
+ tooltip: {
5113
+ pointFormatter: function () {
5114
+ let point = this;
5115
+ let startDate = new Date(point.start);
5116
+ let startDateString = `${startDate.toLocaleString('en-US', { month: 'short' })}. ${startDate.getDate()}`;
5117
+ let endDate = new Date(point.end);
5118
+ endDate.setDate(endDate.getDate() - 1);
5119
+ let endDateString = `${endDate.toLocaleString('en-US', { month: 'short' })}. ${endDate.getDate()}`;
5120
+ return '<b>' + point.shift_type + '</b><br/><span>From: ' + startDateString + '</span><br/><span>To: ' + endDateString + '</span><br/>';
5121
+ }
5122
+ },
5123
+ yAxis: {
5124
+ type: 'category',
5125
+ grid: {
5126
+ enabled: true,
5127
+ borderWidth: 1,
5128
+ columns: [{
5129
+ title: { text: 'Employees' }
5130
+ }]
5131
+ },
5132
+ gridLineWidth: 1
5133
+ },
5134
+ };
5135
+
5136
+ class RosterPageComponent {
5137
+ constructor(route, injector, localeService, dialog, objectService, screenSizeService) {
5138
+ this.route = route;
5139
+ this.injector = injector;
5140
+ this.localeService = localeService;
5141
+ this.dialog = dialog;
5142
+ this.objectService = objectService;
5143
+ this.screenSizeService = screenSizeService;
5144
+ this.rosterData = {}; // Roster gantt chart data
5145
+ this.startDate = '';
5146
+ this.endDate = '';
5147
+ this.month = '';
5148
+ this.isSmallScreen = false;
5149
+ const rosterPageServiceInjectionToken = this.route.snapshot.data['rosterPageService'];
5150
+ this.rosterPageService = this.injector.get(rosterPageServiceInjectionToken);
5151
+ const rosterScheduleServiceInjectionToken = this.route.snapshot.data['rosterScheduleService'];
5152
+ this.rosterScheduleService = this.injector.get(rosterScheduleServiceInjectionToken);
5153
+ this.pageTitle = this.route.snapshot.data['pageTitle'];
5154
+ this.screenSizeService.screenSize.subscribe((screenSize) => {
5155
+ this.isSmallScreen = screenSize == 'xs' || screenSize == 'sm';
5156
+ });
5157
+ }
5158
+ ngOnInit() {
5159
+ this.startDate = moment().locale(this.localeService.currentLocaleCode).startOf('month').format('YYYY-MM-DD');
5160
+ this.endDate = moment().locale(this.localeService.currentLocaleCode).endOf('month').format('YYYY-MM-DD');
5161
+ this.month = moment().locale(this.localeService.currentLocaleCode).startOf('month').format('MMMM YYYY');
5162
+ this.rosterScheduleService.subContentChangeEvents.subscribe((value) => {
5163
+ this.pullContent();
5164
+ });
5165
+ this.pullContent();
5166
+ }
5167
+ showPrevMonth() {
5168
+ this.startDate = moment(this.startDate).locale(this.localeService.currentLocaleCode).subtract(1, 'M').format('YYYY-MM-DD');
5169
+ this.endDate = moment(this.startDate).locale(this.localeService.currentLocaleCode).endOf('month').format('YYYY-MM-DD');
5170
+ this.month = moment(this.startDate).locale(this.localeService.currentLocaleCode).format('MMMM YYYY');
5171
+ this.pullContent();
5172
+ }
5173
+ showNextMonth() {
5174
+ this.startDate = moment(this.startDate).locale(this.localeService.currentLocaleCode).add(1, 'M').format('YYYY-MM-DD');
5175
+ this.endDate = moment(this.startDate).locale(this.localeService.currentLocaleCode).endOf('month').format('YYYY-MM-DD');
5176
+ this.month = moment(this.startDate).locale(this.localeService.currentLocaleCode).format('MMMM YYYY');
5177
+ this.pullContent();
5178
+ }
5179
+ pullContent() {
5180
+ this.route.params.subscribe(params => {
5181
+ this.id = this.route.snapshot.params['id'];
5182
+ this.rosterPageService.get(this.id, { date_from: this.startDate, date_to: this.endDate }).subscribe((res) => {
5183
+ this.loadRoster(res.content.data.roster_schedules.data);
5184
+ });
5185
+ });
5186
+ }
5187
+ loadRoster(data) {
5188
+ let ganttChartConfiguration = this.objectService.deepMerge(ROSTER_GANTT_CHART, {
5189
+ plotOptions: {
5190
+ series: {
5191
+ events: {
5192
+ click: (event) => {
5193
+ this.openScheduleRecord(event.point.schedule_id);
5194
+ }
5195
+ }
5196
+ }
5197
+ },
5198
+ exporting: {
5199
+ menuItemDefinitions: {
5200
+ downloadCSV: {
5201
+ text: 'Download CSV file',
5202
+ onclick: () => { this.exportCsv().subscribe(); }
5203
+ }
5204
+ }
5205
+ }
5206
+ });
5207
+ this.rosterData = this.objectService.deepMerge(ganttChartConfiguration, data);
5208
+ }
5209
+ exportCsv() {
5210
+ return this.rosterPageService.exportRosterCsv(this.id, { date_from: this.startDate, date_to: this.endDate });
5211
+ }
5212
+ onBackClicked() {
5213
+ this.rosterPageService.openList();
5214
+ }
5215
+ onEditClicked() {
5216
+ const dialogConfig = new MatDialogConfig();
5217
+ dialogConfig.data = {
5218
+ formPageService: this.rosterPageService,
5219
+ title: 'shift_management.dialogs.rosters.edit',
5220
+ id: this.id
5221
+ };
5222
+ dialogConfig.width = '80%';
5223
+ dialogConfig.autoFocus = false;
5224
+ let dialogRef = this.dialog.open(DialogFormComponent, dialogConfig);
5225
+ dialogRef.afterClosed().subscribe((response) => {
5226
+ if (response === null || response === void 0 ? void 0 : response._destroy) {
5227
+ this.rosterPageService.openList();
5228
+ }
5229
+ else if (response) {
5230
+ this.pullContent();
5231
+ }
5232
+ });
5233
+ }
5234
+ openScheduleRecord(scheduleId) {
5235
+ this.rosterScheduleService.openRecord({ id: scheduleId });
5236
+ }
5237
+ openScheduleForm(scheduleId) {
5238
+ this.rosterScheduleService.openForm({ id: scheduleId }, { roster_id: this.id });
5239
+ }
5240
+ }
5241
+ RosterPageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: RosterPageComponent, deps: [{ token: i1$4.ActivatedRoute }, { token: i0.Injector }, { token: LocaleService }, { token: i1$3.MatDialog }, { token: ObjectService }, { token: ScreenSizeService }], target: i0.ɵɵFactoryTarget.Component });
5242
+ RosterPageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: RosterPageComponent, selector: "mantle-roster-page", ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutAlign=\"stretch\" fxLayoutGap=\"16px\" class=\"page full-height-min full-height-only vertically-scrollable\">\n <mantle-page-title>{{ pageTitle | translate }}</mantle-page-title>\n\n <div fxFlex=\"0 0 auto\" fxLayout=\"column\" fxLayoutGap=\"16px\" class=\"page-header\">\n <div fxLayout=\"row\" fxLayoutAlign=\"stretch\" fxLayoutGap=\"16px\">\n <div fxFlex=\"0 0 auto\" *ngIf=\"!rosterPageService.hideBackButton\">\n <button class=\"back-button\" mat-mini-fab color=\"primary\" type=\"button\" (click)=\"onBackClicked()\">\n <mat-icon>arrow_back</mat-icon>\n </button>\n </div>\n\n <button *ngIf=\"rosterScheduleService.showAddButton && rosterPageService.canWrite()\"\n mat-raised-button\n color=\"accent\"\n type=\"button\"\n class=\"add-button\"\n (click)=\"openScheduleForm()\">\n + {{ 'mantle.buttons.add' | translate }} {{ rosterScheduleService.noun() | translate }}\n </button>\n\n <ng-container *ngIf=\"!isSmallScreen; then monthControls\">\n </ng-container>\n\n <div fxFlex=\"1 1 auto\"></div>\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"rosterPageService.showEditButton && rosterPageService.canWrite()\">\n <button mat-mini-fab\n color=\"primary\"\n type=\"button\"\n class=\"edit-button\"\n (click)=\"onEditClicked()\"\n [disabled]=\"rosterPageService.isCommitInProgress\">\n <mat-icon>edit</mat-icon>\n </button>\n </div>\n </div>\n\n <ng-container *ngIf=\"isSmallScreen; then monthControls\">\n </ng-container>\n </div>\n\n <mantle-dynamic-chart [data]=\"rosterData\"></mantle-dynamic-chart>\n</div>\n\n<ng-template #monthControls>\n <div class=\"month-controls\">\n <button type=\"button\" mat-button (click)=\"showPrevMonth()\">\n <mat-icon>chevron_left</mat-icon>\n </button>\n \n <div class=\"month-text\">{{ month }}</div>\n \n <button type=\"button\" mat-button (click)=\"showNextMonth()\">\n <mat-icon>chevron_right</mat-icon>\n </button>\n </div>\n</ng-template>\n", styles: [".add-button{display:block;text-transform:uppercase;border-radius:0}.month-controls{display:inline-flex}.month-text{margin:auto;font-weight:500}\n"], components: [{ type: PageTitleComponent, selector: "mantle-page-title" }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: DynamicChartComponent, selector: "mantle-dynamic-chart", inputs: ["label", "data"] }], directives: [{ type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "translate": i5.TranslatePipe } });
5243
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: RosterPageComponent, decorators: [{
5244
+ type: Component,
5245
+ args: [{
5246
+ selector: 'mantle-roster-page',
5247
+ templateUrl: './roster-page.component.html',
5248
+ styleUrls: ['./roster-page.component.scss']
5249
+ }]
5250
+ }], ctorParameters: function () { return [{ type: i1$4.ActivatedRoute }, { type: i0.Injector }, { type: LocaleService }, { type: i1$3.MatDialog }, { type: ObjectService }, { type: ScreenSizeService }]; } });
5251
+
4595
5252
  class ExportPageComponent {
4596
5253
  constructor(route, injector, changeDetectorRef, announcementService, objectService) {
4597
5254
  this.route = route;
@@ -4622,12 +5279,12 @@ class ExportPageComponent {
4622
5279
  this.isExportInProgress = false;
4623
5280
  }
4624
5281
  onExportFailure(res) {
4625
- this.announcementService.error('Export failed!');
5282
+ this.announcementService.error('mantle.messages.export_failed');
4626
5283
  this.isExportInProgress = false;
4627
5284
  }
4628
5285
  }
4629
5286
  ExportPageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ExportPageComponent, deps: [{ token: i1$4.ActivatedRoute }, { token: i0.Injector }, { token: i0.ChangeDetectorRef }, { token: AnnouncementService }, { token: ObjectService }], target: i0.ɵɵFactoryTarget.Component });
4630
- ExportPageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: ExportPageComponent, selector: "mantle-export-page", viewQueries: [{ propertyName: "dynamicForm", first: true, predicate: DynamicFormComponent, descendants: true }], ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutAlign=\"stretch\" fxLayoutGap=\"16px\" class=\"full-height-min\" [ngClass]=\"{'page full-height-only vertically-scrollable': !isTabbedContent}\">\n <div fxFlex=\"1 0 auto\" class=\"main-content\">\n <mantle-dynamic-form #dynamicForm [content]=\"content$ | async\"></mantle-dynamic-form>\n </div>\n\n <div fxFlex=\"0 0 auto\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\">\n <div fxFlex=\"1 1 auto\"></div>\n\n <div fxFlex=\"0 0 auto\">\n <button mat-raised-button\n *ngIf=\"!isExportInProgress\"\n color=\"primary\"\n type=\"button\"\n class=\"export-button\"\n [disabled]=\"!dynamicForm?.valid\"\n (click)=\"onExportClicked()\">\n Export\n </button>\n\n\n <button mat-raised-button\n *ngIf=\"isExportInProgress\"\n color=\"primary\"\n type=\"button\"\n class=\"exporting-button\"\n [disabled]=\"true\">\n Exporting\n <mat-spinner matSuffix [diameter]=\"16\"></mat-spinner>\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [".export-button,.exporting-button{width:140px}.exporting-button .mat-spinner{position:absolute;top:10px;right:12px}\n"], components: [{ type: DynamicFormComponent, selector: "mantle-dynamic-form", inputs: ["formPageService", "content"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i6.MatSpinner, selector: "mat-spinner", inputs: ["color"] }], directives: [{ type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatSuffix, selector: "[matSuffix]" }], pipes: { "async": i4.AsyncPipe } });
5287
+ ExportPageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: ExportPageComponent, selector: "mantle-export-page", viewQueries: [{ propertyName: "dynamicForm", first: true, predicate: DynamicFormComponent, descendants: true }], ngImport: i0, template: "<div fxLayout=\"column\" fxLayoutAlign=\"stretch\" fxLayoutGap=\"16px\" class=\"full-height-min\" [ngClass]=\"{'page full-height-only vertically-scrollable': !isTabbedContent}\">\n <div fxFlex=\"1 0 auto\" class=\"main-content\">\n <mantle-dynamic-form #dynamicForm [content]=\"content$ | async\"></mantle-dynamic-form>\n </div>\n\n <div fxFlex=\"0 0 auto\">\n <div fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\">\n <div fxFlex=\"1 1 auto\"></div>\n\n <div fxFlex=\"0 0 auto\">\n <button mat-raised-button\n *ngIf=\"!isExportInProgress\"\n color=\"primary\"\n type=\"button\"\n class=\"export-button\"\n [disabled]=\"!dynamicForm?.valid\"\n (click)=\"onExportClicked()\">\n {{ 'mantle.buttons.export' | translate }}\n </button>\n\n\n <button mat-raised-button\n *ngIf=\"isExportInProgress\"\n color=\"primary\"\n type=\"button\"\n class=\"exporting-button\"\n [disabled]=\"true\">\n {{ 'mantle.buttons.exporting' | translate }}\n <mat-spinner matSuffix [diameter]=\"16\"></mat-spinner>\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [".export-button,.exporting-button{width:140px}.exporting-button .mat-spinner{position:absolute;top:10px;right:12px}\n"], components: [{ type: DynamicFormComponent, selector: "mantle-dynamic-form", inputs: ["formPageService", "content"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i6.MatSpinner, selector: "mat-spinner", inputs: ["color"] }], directives: [{ type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatSuffix, selector: "[matSuffix]" }], pipes: { "async": i4.AsyncPipe, "translate": i5.TranslatePipe } });
4631
5288
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: ExportPageComponent, decorators: [{
4632
5289
  type: Component,
4633
5290
  args: [{
@@ -4642,7 +5299,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
4642
5299
 
4643
5300
  class NavTreeComponent {
4644
5301
  constructor() {
4645
- this.reminderCount = 0;
5302
+ this.notificationCount = 0;
4646
5303
  this.navTreeFeatures = [];
4647
5304
  this.treeFlattener = new MatTreeFlattener(this.transformer, this.getLevel, this.isExpandable, this.getChildren);
4648
5305
  this.treeControl = new FlatTreeControl(this.getLevel, this.isExpandable);
@@ -4679,7 +5336,7 @@ class NavTreeComponent {
4679
5336
  }
4680
5337
  }
4681
5338
  NavTreeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: NavTreeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4682
- NavTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: NavTreeComponent, selector: "mantle-nav-tree", inputs: { reminderCount: "reminderCount", navTreeFeatures: "navTreeFeatures" }, usesOnChanges: true, ngImport: i0, template: "<mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\n\n <!-- This is the tree node template for leaf nodes -->\n <mat-tree-node *matTreeNodeDef=\"let node\" [class.leaf-node]=\"node.level > 0\">\n <div fxLayout=\"row\" class=\"tree-node-content\">\n <div fxFlex=\"0 0 28px\" *ngIf=\"node.level > 0\" class=\"tree-node-indent\">\n <mat-divider [vertical]=\"true\" color=\"primary\"></mat-divider>\n </div>\n <div fxFlex=\"1 0 1px\">\n <button mat-button [routerLink]=\"node.link\" routerLinkActive=\"active\" class=\"tree-node-button\">\n <mat-icon *ngIf=\"node.icon\"\n [matBadge]=\"(node.name == 'Reminders' && reminderCount > 0) ? reminderCount : undefined\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"small\">\n {{ node.icon }}\n </mat-icon>\n <div class=\"node-label\">{{ node.name }}</div>\n </button>\n </div>\n </div>\n </mat-tree-node>\n\n <!-- This is the tree node template for expandable nodes -->\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" fxLayout=\"row\" [class.leaf-node]=\"node.level > 0\">\n <div fxLayout=\"row\" class=\"tree-node-content\">\n <div fxFlex=\"0 0 28px\" *ngIf=\"node.level > 0\" class=\"tree-node-indent\">\n <mat-divider [vertical]=\"true\" color=\"primary\"></mat-divider>\n </div>\n <div fxFlex=\"1 0 1px\">\n <button fxFlex=\"1 0 1px\" mat-button matTreeNodeToggle class=\"tree-node-button\">\n <mat-icon *ngIf=\"node.icon\">{{ node.icon }}</mat-icon>\n <div class=\"node-label\">{{ node.name }}</div>\n </button>\n </div>\n </div>\n </mat-tree-node>\n\n</mat-tree>\n", styles: [".mat-tree-node .tree-node-content{min-height:48px}.mat-tree-node .tree-node-content .tree-node-button{text-align:left;border-radius:0;width:239px;margin:6px 0}.mat-tree-node .tree-node-content .tree-node-button .mat-icon{margin-right:8px}.mat-tree-node .tree-node-content .tree-node-button .node-label{display:inline-block;text-align:left;white-space:normal;line-height:1.25rem;width:calc(100% - 32px)}.mat-tree-node.leaf-node .tree-node-indent{position:relative}.mat-tree-node.leaf-node .tree-node-indent .mat-divider{position:absolute;top:0;bottom:0;right:0;border-width:2px}.mat-tree-node.leaf-node .tree-node-button{width:calc(211px - 20px)!important;margin:6px 0 6px 20px!important}\n"], components: [{ type: i1$9.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { type: i2$6.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i1$9.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { type: i1$9.MatTreeNode, selector: "mat-tree-node", inputs: ["role", "disabled", "tabIndex"], exportAs: ["matTreeNode"] }, { type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i1$4.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "routerLinkActive"], exportAs: ["routerLinkActive"] }, { type: i1$4.RouterLink, selector: ":not(a):not(area)[routerLink]", inputs: ["routerLink", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo"] }, { type: i8.MatBadge, selector: "[matBadge]", inputs: ["matBadgeDisabled", "matBadgePosition", "matBadgeSize", "matBadgeColor", "matBadgeOverlap", "matBadgeDescription", "matBadgeHidden", "matBadge"] }, { type: i1$9.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }] });
5339
+ NavTreeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: NavTreeComponent, selector: "mantle-nav-tree", inputs: { notificationCount: "notificationCount", navTreeFeatures: "navTreeFeatures" }, usesOnChanges: true, ngImport: i0, template: "<mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\">\n\n <!-- This is the tree node template for leaf nodes -->\n <mat-tree-node *matTreeNodeDef=\"let node\" [class.leaf-node]=\"node.level > 0\">\n <div fxLayout=\"row\" class=\"tree-node-content\">\n <div fxFlex=\"0 0 28px\" *ngIf=\"node.level > 0\" class=\"tree-node-indent\">\n <mat-divider [vertical]=\"true\" color=\"primary\"></mat-divider>\n </div>\n <div fxFlex=\"1 0 1px\">\n <button mat-button [routerLink]=\"node.link\" routerLinkActive=\"active\" class=\"tree-node-button\">\n <mat-icon *ngIf=\"node.icon\"\n [matBadge]=\"(node.name == 'Notifications' && notificationCount > 0) ? notificationCount : undefined\"\n matBadgeColor=\"warn\"\n matBadgeSize=\"small\">\n {{ node.icon }}\n </mat-icon>\n <div class=\"node-label\">{{ node.name | translate }}</div>\n </button>\n </div>\n </div>\n </mat-tree-node>\n\n <!-- This is the tree node template for expandable nodes -->\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" fxLayout=\"row\" [class.leaf-node]=\"node.level > 0\">\n <div fxLayout=\"row\" class=\"tree-node-content\">\n <div fxFlex=\"0 0 28px\" *ngIf=\"node.level > 0\" class=\"tree-node-indent\">\n <mat-divider [vertical]=\"true\" color=\"primary\"></mat-divider>\n </div>\n <div fxFlex=\"1 0 1px\">\n <button fxFlex=\"1 0 1px\" mat-button matTreeNodeToggle class=\"tree-node-button\">\n <mat-icon *ngIf=\"node.icon\">{{ node.icon }}</mat-icon>\n <div class=\"node-label\">{{ node.name | translate }}</div>\n </button>\n </div>\n </div>\n </mat-tree-node>\n\n</mat-tree>\n", styles: [".mat-tree-node .tree-node-content{min-height:48px}.mat-tree-node .tree-node-content .tree-node-button{text-align:left;border-radius:0;width:239px;margin:6px 0}.mat-tree-node .tree-node-content .tree-node-button .mat-icon{margin-right:8px}.mat-tree-node .tree-node-content .tree-node-button .node-label{display:inline-block;text-align:left;white-space:normal;line-height:1.25rem;width:calc(100% - 32px)}.mat-tree-node.leaf-node .tree-node-indent{position:relative}.mat-tree-node.leaf-node .tree-node-indent .mat-divider{position:absolute;top:0;bottom:0;right:0;border-width:2px}.mat-tree-node.leaf-node .tree-node-button{width:calc(211px - 20px)!important;margin:6px 0 6px 20px!important}\n"], components: [{ type: i1$9.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { type: i2$7.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i1$9.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { type: i1$9.MatTreeNode, selector: "mat-tree-node", inputs: ["role", "disabled", "tabIndex"], exportAs: ["matTreeNode"] }, { type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i1$4.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "routerLinkActive"], exportAs: ["routerLinkActive"] }, { type: i1$4.RouterLink, selector: ":not(a):not(area)[routerLink]", inputs: ["routerLink", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo"] }, { type: i8.MatBadge, selector: "[matBadge]", inputs: ["matBadgeDisabled", "matBadgePosition", "matBadgeSize", "matBadgeColor", "matBadgeOverlap", "matBadgeDescription", "matBadgeHidden", "matBadge"] }, { type: i1$9.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }], pipes: { "translate": i5.TranslatePipe } });
4683
5340
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: NavTreeComponent, decorators: [{
4684
5341
  type: Component,
4685
5342
  args: [{
@@ -4687,7 +5344,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
4687
5344
  templateUrl: './nav-tree.component.html',
4688
5345
  styleUrls: ['./nav-tree.component.scss']
4689
5346
  }]
4690
- }], ctorParameters: function () { return []; }, propDecorators: { reminderCount: [{
5347
+ }], ctorParameters: function () { return []; }, propDecorators: { notificationCount: [{
4691
5348
  type: Input
4692
5349
  }], navTreeFeatures: [{
4693
5350
  type: Input
@@ -4714,6 +5371,12 @@ class DialogDetailsComponent {
4714
5371
  onCancelClicked() {
4715
5372
  this.close();
4716
5373
  }
5374
+ onCloneClicked() {
5375
+ this.close();
5376
+ setTimeout(() => {
5377
+ this.detailPageService.openForm({}, { clone_id: this.id });
5378
+ }, 500);
5379
+ }
4717
5380
  onEditClicked() {
4718
5381
  this.close();
4719
5382
  setTimeout(() => {
@@ -4724,12 +5387,12 @@ class DialogDetailsComponent {
4724
5387
  this.detailPageService.delete(this.id, () => { this.isDeleteInProgress = true; }, (res) => { this.onDeleteSuccess(res); }, (res) => { this.onDeleteFailure(res); });
4725
5388
  }
4726
5389
  onDeleteSuccess(res) {
4727
- this.announcementService.success('Delete successful!');
5390
+ this.announcementService.success('mantle.messages.delete_successful');
4728
5391
  this.close({ id: this.id, _destroy: true });
4729
5392
  this.isDeleteInProgress = false;
4730
5393
  }
4731
5394
  onDeleteFailure(res) {
4732
- this.announcementService.error('Delete failed!');
5395
+ this.announcementService.error('mantle.messages.delete_failed');
4733
5396
  this.isDeleteInProgress = false;
4734
5397
  }
4735
5398
  close(result = false) {
@@ -4740,7 +5403,7 @@ class DialogDetailsComponent {
4740
5403
  }
4741
5404
  }
4742
5405
  DialogDetailsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DialogDetailsComponent, deps: [{ token: i1$4.Router }, { token: i1$3.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: AnnouncementService }], target: i0.ɵɵFactoryTarget.Component });
4743
- DialogDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DialogDetailsComponent, selector: "mantle-dialog-details", ngImport: i0, template: "<div mat-dialog-title fxLayout=\"row\" fxLayoutAlign=\"start\" fxLayoutGap=\"8px\" class=\"dialog-title-section\">\n <mantle-section-title fxFlex=\"1 0 1px\" [title]=\"title\"></mantle-section-title>\n <button fxFlex=\"0 0 auto\" mat-icon-button tabindex=\"-1\" (click)=\"onCancelClicked()\">\n <mat-icon>cancel</mat-icon>\n </button>\n</div>\n\n<mat-dialog-content>\n <mantle-dynamic-details [content]=\"content$ | async\"></mantle-dynamic-details>\n</mat-dialog-content>\n\n<mat-dialog-actions fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\" class=\"actions-section\">\n <div fxFlex=\"0 0 auto\" *ngIf=\"detailPageService.showDeleteButton && detailPageService.canWrite()\">\n <button mat-button\n *ngIf=\"!isDeleteInProgress\"\n color=\"warn\"\n type=\"button\"\n class=\"delete-button\"\n (click)=\"onDeleteClicked()\">\n Delete\n </button>\n\n <button mat-raised-button\n *ngIf=\"isDeleteInProgress\"\n color=\"warn\"\n type=\"button\"\n class=\"deleting-button\"\n [disabled]=\"true\">\n Deleting\n <mat-spinner matSuffix [diameter]=\"16\"></mat-spinner>\n </button>\n </div>\n\n <div fxFlex=\"1 1 auto\"></div>\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"detailPageService.showEditButton && detailPageService.canWrite()\">\n <button mat-raised-button\n color=\"primary\"\n type=\"button\"\n class=\"edit-button\"\n (click)=\"onEditClicked()\">\n Edit\n </button>\n </div>\n</mat-dialog-actions>\n", styles: [".delete-button,.deleting-button{text-transform:uppercase}.deleting-button .mat-spinner{position:absolute;top:10px;right:12px}.edit-button{width:140px}\n"], components: [{ type: SectionTitleComponent, selector: "mantle-section-title", inputs: ["title"] }, { type: i5.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i3$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: DynamicDetailsComponent, selector: "mantle-dynamic-details", inputs: ["detailPageService", "content"] }, { type: i6.MatSpinner, selector: "mat-spinner", inputs: ["color"] }], directives: [{ type: i1$3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i4$1.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$1.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$1.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$1.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i1$3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i1$3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatSuffix, selector: "[matSuffix]" }], pipes: { "async": i4.AsyncPipe } });
5406
+ DialogDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: DialogDetailsComponent, selector: "mantle-dialog-details", ngImport: i0, template: "<div mat-dialog-title fxLayout=\"row\" fxLayoutAlign=\"start\" fxLayoutGap=\"8px\" class=\"dialog-title-section\">\n <mantle-section-title fxFlex=\"1 0 1px\" [title]=\"title\"></mantle-section-title>\n <button fxFlex=\"0 0 auto\" mat-icon-button tabindex=\"-1\" (click)=\"onCancelClicked()\">\n <mat-icon>cancel</mat-icon>\n </button>\n</div>\n\n<mat-dialog-content>\n <mantle-dynamic-details [content]=\"content$ | async\"></mantle-dynamic-details>\n</mat-dialog-content>\n\n<mat-dialog-actions fxLayout=\"row\" fxLayoutAlign=\"center center\" fxLayoutGap=\"16px\" class=\"actions-section\">\n <div fxFlex=\"0 0 auto\" *ngIf=\"detailPageService.showDeleteButton && detailPageService.canWrite()\">\n <button mat-button\n *ngIf=\"!isDeleteInProgress\"\n color=\"warn\"\n type=\"button\"\n class=\"delete-button\"\n (click)=\"onDeleteClicked()\">\n {{ 'mantle.buttons.delete' | translate }}\n </button>\n\n <button mat-raised-button\n *ngIf=\"isDeleteInProgress\"\n color=\"warn\"\n type=\"button\"\n class=\"deleting-button\"\n [disabled]=\"true\">\n {{ 'mantle.buttons.deleting' | translate }}\n <mat-spinner matSuffix [diameter]=\"16\"></mat-spinner>\n </button>\n </div>\n\n <div fxFlex=\"1 1 auto\"></div>\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"detailPageService.showCloneButton && detailPageService.canWrite()\">\n <button mat-raised-button\n color=\"accent\"\n type=\"button\"\n class=\"edit-button\"\n (click)=\"onCloneClicked()\">\n {{ 'mantle.buttons.clone' | translate }}\n </button>\n </div>\n\n <div fxFlex=\"0 0 auto\" *ngIf=\"detailPageService.showEditButton && detailPageService.canWrite()\">\n <button mat-raised-button\n color=\"primary\"\n type=\"button\"\n class=\"edit-button\"\n (click)=\"onEditClicked()\">\n {{ 'mantle.buttons.edit' | translate }}\n </button>\n </div>\n</mat-dialog-actions>\n", styles: [".delete-button,.deleting-button{text-transform:uppercase}.deleting-button .mat-spinner{position:absolute;top:10px;right:12px}.edit-button{width:140px}\n"], components: [{ type: SectionTitleComponent, selector: "mantle-section-title", inputs: ["title"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: DynamicDetailsComponent, selector: "mantle-dynamic-details", inputs: ["detailPageService", "content"] }, { type: i6.MatSpinner, selector: "mat-spinner", inputs: ["color"] }], directives: [{ type: i1$3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i1$3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i1$3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]" }, { type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1$6.MatSuffix, selector: "[matSuffix]" }], pipes: { "async": i4.AsyncPipe, "translate": i5.TranslatePipe } });
4744
5407
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: DialogDetailsComponent, decorators: [{
4745
5408
  type: Component,
4746
5409
  args: [{
@@ -4777,6 +5440,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
4777
5440
  }]
4778
5441
  }], ctorParameters: function () { return [{ type: i1$4.ActivatedRoute }, { type: i0.Injector }]; } });
4779
5442
 
5443
+ class QrCodeDialogComponent {
5444
+ constructor(dialogRef, params) {
5445
+ this.dialogRef = dialogRef;
5446
+ this.params = params;
5447
+ this.value = '';
5448
+ this.instructions = '';
5449
+ this.value = this.params.value;
5450
+ this.instructions = this.params.instructions;
5451
+ }
5452
+ onClose() {
5453
+ this.dialogRef.close();
5454
+ }
5455
+ }
5456
+ QrCodeDialogComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: QrCodeDialogComponent, deps: [{ token: i1$3.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
5457
+ QrCodeDialogComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: QrCodeDialogComponent, selector: "mantle-qr-code-dialog", ngImport: i0, template: "<div mat-dialog-title fxLayout=\"row\" fxLayoutAlign=\"start\" fxLayoutGap=\"8px\" class=\"dialog-title-section\">\n <mantle-section-title fxFlex=\"1 0 1px\" title=\"QR Code\"></mantle-section-title>\n <button fxFlex=\"0 0 auto\" mat-icon-button tabindex=\"-1\" (click)=\"onClose()\">\n <mat-icon>cancel</mat-icon>\n </button>\n</div>\n\n<mat-dialog-content>\n <p class=\"instructions\">{{ instructions | translate }}</p>\n <div class=\"qr-code-wrapper\">\n <qr-code [value]=\"value\"\n size=\"300\"\n cssClass=\"qr-code\"\n errorCorrectionLevel=\"M\">\n </qr-code>\n </div>\n</mat-dialog-content>\n", styles: [".instructions{text-align:justify}.qr-code-wrapper{text-align:center}\n"], components: [{ type: SectionTitleComponent, selector: "mantle-section-title", inputs: ["title"] }, { type: i3$1.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i4$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i5$1.QrCodeComponent, selector: "qr-code", inputs: ["value", "size", "darkColor", "lightColor", "errorCorrectionLevel", "centerImageSrc", "centerImageSize", "margin"] }], directives: [{ type: i1$3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i4$2.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i4$2.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i4$2.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { type: i4$2.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i1$3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }], pipes: { "translate": i5.TranslatePipe } });
5458
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: QrCodeDialogComponent, decorators: [{
5459
+ type: Component,
5460
+ args: [{
5461
+ selector: 'mantle-qr-code-dialog',
5462
+ templateUrl: './qr-code-dialog.component.html',
5463
+ styleUrls: ['./qr-code-dialog.component.scss']
5464
+ }]
5465
+ }], ctorParameters: function () { return [{ type: i1$3.MatDialogRef }, { type: undefined, decorators: [{
5466
+ type: Inject,
5467
+ args: [MAT_DIALOG_DATA]
5468
+ }] }]; } });
5469
+
4780
5470
  class MantleModule {
4781
5471
  }
4782
5472
  MantleModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: MantleModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
@@ -4787,8 +5477,10 @@ MantleModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "
4787
5477
  DynamicDetailsComponent,
4788
5478
  GridDetailsSectionComponent,
4789
5479
  TableDetailsSectionComponent,
5480
+ RosterShiftListDetailsSectionComponent,
4790
5481
  DynamicAttributeDisplayComponent,
4791
5482
  ActionsAttributeDisplayComponent,
5483
+ IconAttributeDisplayComponent,
4792
5484
  ChipAttributeDisplayComponent,
4793
5485
  FileAttributeDisplayComponent,
4794
5486
  ImageAttributeDisplayComponent,
@@ -4798,6 +5490,7 @@ MantleModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "
4798
5490
  DynamicFormComponent,
4799
5491
  GridFormSectionComponent,
4800
5492
  TableFormSectionComponent,
5493
+ RosterShiftListFormSectionComponent,
4801
5494
  DynamicFormFieldComponent,
4802
5495
  ChipInputComponent,
4803
5496
  DatepickerComponent,
@@ -4810,6 +5503,7 @@ MantleModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "
4810
5503
  PasswordInputComponent,
4811
5504
  TextareaComponent,
4812
5505
  TextInputComponent,
5506
+ TimeInputComponent,
4813
5507
  MarkdownInputComponent,
4814
5508
  AccordionLayoutEditorContainerComponent,
4815
5509
  DynamicLayoutEditorContainerComponent,
@@ -4831,6 +5525,7 @@ MantleModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "
4831
5525
  DetailPageComponent,
4832
5526
  DocumentsPageComponent,
4833
5527
  TabbedPageComponent,
5528
+ RosterPageComponent,
4834
5529
  ExportPageComponent,
4835
5530
  PageTitleComponent,
4836
5531
  SectionTitleComponent,
@@ -4867,17 +5562,22 @@ MantleModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "
4867
5562
  DynamicFormSectionComponent,
4868
5563
  DynamicDashboardContainerComponent,
4869
5564
  PlainDashboardContainerComponent,
4870
- AutocompleteInputComponent], imports: [CommonModule,
5565
+ AutocompleteInputComponent,
5566
+ QrCodeDialogComponent,
5567
+ DraggableTableComponent], imports: [CommonModule,
4871
5568
  RouterModule,
4872
5569
  HttpClientModule,
4873
5570
  LayoutModule,
4874
5571
  FlexLayoutModule,
5572
+ DragDropModule,
4875
5573
  BrowserModule,
4876
5574
  BrowserAnimationsModule,
4877
5575
  FormsModule,
4878
5576
  ReactiveFormsModule,
4879
5577
  ImageCropperModule,
4880
- HighchartsChartModule, i1$5.MarkdownModule, MaterialModule], exports: [MaterialModule,
5578
+ HighchartsChartModule, i1$5.MarkdownModule, QrCodeModule,
5579
+ TranslateModule,
5580
+ MaterialModule], exports: [MaterialModule,
4881
5581
  DynamicPipe,
4882
5582
  SecureImagePipe,
4883
5583
  ClickStopPropagationDirective,
@@ -4885,8 +5585,10 @@ MantleModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "
4885
5585
  DynamicDetailsComponent,
4886
5586
  GridDetailsSectionComponent,
4887
5587
  TableDetailsSectionComponent,
5588
+ RosterShiftListDetailsSectionComponent,
4888
5589
  DynamicAttributeDisplayComponent,
4889
5590
  ActionsAttributeDisplayComponent,
5591
+ IconAttributeDisplayComponent,
4890
5592
  ChipAttributeDisplayComponent,
4891
5593
  FileAttributeDisplayComponent,
4892
5594
  ImageAttributeDisplayComponent,
@@ -4896,6 +5598,7 @@ MantleModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "
4896
5598
  DynamicFormComponent,
4897
5599
  GridFormSectionComponent,
4898
5600
  TableFormSectionComponent,
5601
+ RosterShiftListFormSectionComponent,
4899
5602
  DynamicFormFieldComponent,
4900
5603
  ChipInputComponent,
4901
5604
  DatepickerComponent,
@@ -4908,6 +5611,7 @@ MantleModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "
4908
5611
  PasswordInputComponent,
4909
5612
  TextareaComponent,
4910
5613
  TextInputComponent,
5614
+ TimeInputComponent,
4911
5615
  MarkdownInputComponent,
4912
5616
  AccordionLayoutEditorContainerComponent,
4913
5617
  DynamicLayoutEditorContainerComponent,
@@ -4929,6 +5633,7 @@ MantleModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "
4929
5633
  DetailPageComponent,
4930
5634
  DocumentsPageComponent,
4931
5635
  TabbedPageComponent,
5636
+ RosterPageComponent,
4932
5637
  ExportPageComponent,
4933
5638
  PageTitleComponent,
4934
5639
  SectionTitleComponent,
@@ -4965,7 +5670,8 @@ MantleModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "
4965
5670
  DynamicFormSectionComponent,
4966
5671
  DynamicDashboardContainerComponent,
4967
5672
  PlainDashboardContainerComponent,
4968
- AutocompleteInputComponent] });
5673
+ AutocompleteInputComponent,
5674
+ DraggableTableComponent] });
4969
5675
  MantleModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: MantleModule, providers: [
4970
5676
  DatePipe,
4971
5677
  ], imports: [[
@@ -4974,6 +5680,7 @@ MantleModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "
4974
5680
  HttpClientModule,
4975
5681
  LayoutModule,
4976
5682
  FlexLayoutModule,
5683
+ DragDropModule,
4977
5684
  BrowserModule,
4978
5685
  BrowserAnimationsModule,
4979
5686
  FormsModule,
@@ -4981,6 +5688,8 @@ MantleModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "
4981
5688
  ImageCropperModule,
4982
5689
  HighchartsChartModule,
4983
5690
  MarkdownModule.forRoot(),
5691
+ QrCodeModule,
5692
+ TranslateModule,
4984
5693
  MaterialModule,
4985
5694
  ], MaterialModule] });
4986
5695
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: MantleModule, decorators: [{
@@ -4994,8 +5703,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
4994
5703
  DynamicDetailsComponent,
4995
5704
  GridDetailsSectionComponent,
4996
5705
  TableDetailsSectionComponent,
5706
+ RosterShiftListDetailsSectionComponent,
4997
5707
  DynamicAttributeDisplayComponent,
4998
5708
  ActionsAttributeDisplayComponent,
5709
+ IconAttributeDisplayComponent,
4999
5710
  ChipAttributeDisplayComponent,
5000
5711
  FileAttributeDisplayComponent,
5001
5712
  ImageAttributeDisplayComponent,
@@ -5005,6 +5716,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
5005
5716
  DynamicFormComponent,
5006
5717
  GridFormSectionComponent,
5007
5718
  TableFormSectionComponent,
5719
+ RosterShiftListFormSectionComponent,
5008
5720
  DynamicFormFieldComponent,
5009
5721
  ChipInputComponent,
5010
5722
  DatepickerComponent,
@@ -5017,6 +5729,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
5017
5729
  PasswordInputComponent,
5018
5730
  TextareaComponent,
5019
5731
  TextInputComponent,
5732
+ TimeInputComponent,
5020
5733
  MarkdownInputComponent,
5021
5734
  AccordionLayoutEditorContainerComponent,
5022
5735
  DynamicLayoutEditorContainerComponent,
@@ -5038,6 +5751,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
5038
5751
  DetailPageComponent,
5039
5752
  DocumentsPageComponent,
5040
5753
  TabbedPageComponent,
5754
+ RosterPageComponent,
5041
5755
  ExportPageComponent,
5042
5756
  PageTitleComponent,
5043
5757
  SectionTitleComponent,
@@ -5075,6 +5789,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
5075
5789
  DynamicDashboardContainerComponent,
5076
5790
  PlainDashboardContainerComponent,
5077
5791
  AutocompleteInputComponent,
5792
+ QrCodeDialogComponent,
5793
+ DraggableTableComponent,
5078
5794
  ],
5079
5795
  imports: [
5080
5796
  CommonModule,
@@ -5082,6 +5798,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
5082
5798
  HttpClientModule,
5083
5799
  LayoutModule,
5084
5800
  FlexLayoutModule,
5801
+ DragDropModule,
5085
5802
  BrowserModule,
5086
5803
  BrowserAnimationsModule,
5087
5804
  FormsModule,
@@ -5089,6 +5806,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
5089
5806
  ImageCropperModule,
5090
5807
  HighchartsChartModule,
5091
5808
  MarkdownModule.forRoot(),
5809
+ QrCodeModule,
5810
+ TranslateModule,
5092
5811
  MaterialModule,
5093
5812
  ],
5094
5813
  exports: [
@@ -5100,8 +5819,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
5100
5819
  DynamicDetailsComponent,
5101
5820
  GridDetailsSectionComponent,
5102
5821
  TableDetailsSectionComponent,
5822
+ RosterShiftListDetailsSectionComponent,
5103
5823
  DynamicAttributeDisplayComponent,
5104
5824
  ActionsAttributeDisplayComponent,
5825
+ IconAttributeDisplayComponent,
5105
5826
  ChipAttributeDisplayComponent,
5106
5827
  FileAttributeDisplayComponent,
5107
5828
  ImageAttributeDisplayComponent,
@@ -5111,6 +5832,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
5111
5832
  DynamicFormComponent,
5112
5833
  GridFormSectionComponent,
5113
5834
  TableFormSectionComponent,
5835
+ RosterShiftListFormSectionComponent,
5114
5836
  DynamicFormFieldComponent,
5115
5837
  ChipInputComponent,
5116
5838
  DatepickerComponent,
@@ -5123,6 +5845,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
5123
5845
  PasswordInputComponent,
5124
5846
  TextareaComponent,
5125
5847
  TextInputComponent,
5848
+ TimeInputComponent,
5126
5849
  MarkdownInputComponent,
5127
5850
  AccordionLayoutEditorContainerComponent,
5128
5851
  DynamicLayoutEditorContainerComponent,
@@ -5144,6 +5867,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
5144
5867
  DetailPageComponent,
5145
5868
  DocumentsPageComponent,
5146
5869
  TabbedPageComponent,
5870
+ RosterPageComponent,
5147
5871
  ExportPageComponent,
5148
5872
  PageTitleComponent,
5149
5873
  SectionTitleComponent,
@@ -5181,6 +5905,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
5181
5905
  DynamicDashboardContainerComponent,
5182
5906
  PlainDashboardContainerComponent,
5183
5907
  AutocompleteInputComponent,
5908
+ DraggableTableComponent,
5184
5909
  ],
5185
5910
  providers: [
5186
5911
  DatePipe,
@@ -5339,6 +6064,130 @@ const SPLINE_CHART = {
5339
6064
  }
5340
6065
  };
5341
6066
 
6067
+ const MANTLE_LANG_EN = {
6068
+ "core": {
6069
+ "auth": {
6070
+ "incorrect_password": "Incorrect password.",
6071
+ "page_access_denied": "You do not have access to this page."
6072
+ },
6073
+ "buttons": {
6074
+ "add": "Add",
6075
+ "add_item": "Add Item",
6076
+ "cancel": "Cancel",
6077
+ "clone": "Clone",
6078
+ "close_actions": "Close Actions",
6079
+ "collapse_table": "Collapse Table",
6080
+ "confirm": "Confirm",
6081
+ "delete": "Delete",
6082
+ "deleting": "Deleting",
6083
+ "download": "Download",
6084
+ "edit": "Edit",
6085
+ "expand_table": "Expand Table",
6086
+ "export": "Export",
6087
+ "exporting": "Exporting",
6088
+ "open_actions": "Open Actions",
6089
+ "reset": "Reset",
6090
+ "save": "Save",
6091
+ "saving": "Saving",
6092
+ "search": "Search"
6093
+ },
6094
+ "file_preview": {
6095
+ "unable_to_preview_file": "Unable to preview file."
6096
+ },
6097
+ "image_cropper": {
6098
+ "crop_image": "Crop Image",
6099
+ "original": "Original",
6100
+ "preview": "Preview"
6101
+ },
6102
+ "messages": {
6103
+ "are_you_sure": "Are you sure?",
6104
+ "confirm_deletion": "Do you want to delete this record?",
6105
+ "could_not_update_locale": "Could not set language",
6106
+ "delete_failed": "Delete failed!",
6107
+ "delete_successful": "Delete successful!",
6108
+ "export_failed": "Export failed!",
6109
+ "save_failed": "Save failed!",
6110
+ "save_successful": "Save successful!",
6111
+ "unable_to_upload_file": "Unable to upload file",
6112
+ "unknown_error": "Unknown error"
6113
+ },
6114
+ "paginator": {
6115
+ "items_per_page": "Items per page:",
6116
+ "first_page": "First page",
6117
+ "previous_page": "Previous page",
6118
+ "next_page": "Next page",
6119
+ "last_page": "Last page",
6120
+ "of": "of"
6121
+ },
6122
+ "search_panel": {
6123
+ "search": "Search",
6124
+ "filter_by": "Filter By"
6125
+ }
6126
+ }
6127
+ };
6128
+
6129
+ const MANTLE_LANG_MS = {
6130
+ "core": {
6131
+ "auth": {
6132
+ "incorrect_password": "Kata laluan salah.",
6133
+ "page_access_denied": "Anda tidak mempunyai akses ke halaman ini."
6134
+ },
6135
+ "buttons": {
6136
+ "add": "Tambah",
6137
+ "add_item": "Tambah Item",
6138
+ "cancel": "Batal",
6139
+ "clone": "Klon",
6140
+ "close_actions": "Tutup Tindakan",
6141
+ "collapse_table": "Runtuhkan Jadual",
6142
+ "confirm": "Sahkan",
6143
+ "delete": "Padam",
6144
+ "deleting": "Memadam",
6145
+ "download": "Muat turun",
6146
+ "edit": "Sunting",
6147
+ "expand_table": "Kembangkan Jadual",
6148
+ "export": "Eksport",
6149
+ "exporting": "Mengeksport",
6150
+ "open_actions": "Buka Tindakan",
6151
+ "reset": "Set semula",
6152
+ "save": "Simpan",
6153
+ "saving": "Menyimpan",
6154
+ "search": "Cari"
6155
+ },
6156
+ "file_preview": {
6157
+ "unable_to_preview_file": "Tidak dapat pratonton fail."
6158
+ },
6159
+ "image_cropper": {
6160
+ "crop_image": "Pangkas Imej",
6161
+ "original": "Asal",
6162
+ "preview": "Pratonton"
6163
+ },
6164
+ "messages": {
6165
+ "are_you_sure": "Adakah anda pasti?",
6166
+ "confirm_deletion": "Adakah anda mahu memadamkan rekod ini?",
6167
+ "could_not_update_locale": "Tidak dapat menetapkan bahasa",
6168
+ "delete_failed": "Padam gagal!",
6169
+ "delete_successful": "Padam berjaya!",
6170
+ "export_failed": "Eksport gagal!",
6171
+ "save_failed": "Simpanan gagal!",
6172
+ "save_successful": "Simpanan berjaya!",
6173
+ "unable_to_upload_file": "Tidak dapat memuat naik fail",
6174
+ "unknown_error": "Ralat tidak diketahui"
6175
+ },
6176
+ "paginator": {
6177
+ "items_per_page": "Item/halaman:",
6178
+ "first_page": "Muka pertama",
6179
+ "previous_page": "Halaman sebelumnya",
6180
+ "next_page": "Muka seterusnya",
6181
+ "last_page": "Muka terakhir",
6182
+ "of": "daripada"
6183
+ },
6184
+ "search_panel": {
6185
+ "search": "Cari",
6186
+ "filter_by": "Tapis Mengikut"
6187
+ }
6188
+ }
6189
+ };
6190
+
5342
6191
  class ScreenSizeMap {
5343
6192
  constructor(params) {
5344
6193
  this.entries = params;
@@ -5349,22 +6198,30 @@ class ScreenSizeMap {
5349
6198
  }
5350
6199
 
5351
6200
  class CurrentUserService {
5352
- constructor(tokenService, router, arrayService) {
6201
+ constructor(tokenService, router, announcementService, arrayService, dataBroadcastService, localeService, webApiService) {
5353
6202
  this.tokenService = tokenService;
5354
6203
  this.router = router;
6204
+ this.announcementService = announcementService;
5355
6205
  this.arrayService = arrayService;
5356
- this.sessionData = new BehaviorSubject({});
5357
- this.sessionData.next(this.getSessionData());
5358
- this.sessionData.subscribe((sessionData) => {
5359
- if (sessionData)
6206
+ this.dataBroadcastService = dataBroadcastService;
6207
+ this.localeService = localeService;
6208
+ this.webApiService = webApiService;
6209
+ this.dataBroadcastService.sessionData.next(this.getSessionData());
6210
+ this.dataBroadcastService.sessionData.subscribe((sessionData) => {
6211
+ if (sessionData === null || sessionData === void 0 ? void 0 : sessionData.id) {
5360
6212
  localStorage.setItem('sessionData', JSON.stringify(sessionData));
5361
- else
5362
- localStorage.removeItem("sessionData");
6213
+ if (sessionData.password_expired)
6214
+ this.router.navigateByUrl('/password-expired');
6215
+ this.dataBroadcastService.locale.next(sessionData.locale);
6216
+ }
6217
+ else {
6218
+ localStorage.removeItem('sessionData');
6219
+ }
5363
6220
  });
5364
6221
  }
5365
- signIn(signInData, onSuccess, onFailure) {
5366
- this.tokenService.signIn(signInData).subscribe((response) => {
5367
- this.sessionData.next(response.data);
6222
+ signIn(signInData, additionalData, onSuccess, onFailure) {
6223
+ this.tokenService.signIn(signInData, additionalData).subscribe((response) => {
6224
+ this.dataBroadcastService.sessionData.next(response.data);
5368
6225
  this.setLatestPasswordCheckTime();
5369
6226
  if (onSuccess)
5370
6227
  onSuccess(response);
@@ -5379,7 +6236,7 @@ class CurrentUserService {
5379
6236
  throw response;
5380
6237
  }
5381
6238
  })))).subscribe((response) => {
5382
- this.sessionData.next(response.data);
6239
+ this.dataBroadcastService.sessionData.next(response.data);
5383
6240
  if (onValid)
5384
6241
  onValid(response);
5385
6242
  }, (response) => {
@@ -5390,6 +6247,7 @@ class CurrentUserService {
5390
6247
  }
5391
6248
  updatePassword(updatePasswordData, onSuccess, onFailure) {
5392
6249
  this.tokenService.updatePassword(updatePasswordData).subscribe((response) => {
6250
+ this.dataBroadcastService.sessionData.next(response.data);
5393
6251
  if (onSuccess)
5394
6252
  onSuccess(response);
5395
6253
  }, (response) => {
@@ -5423,19 +6281,23 @@ class CurrentUserService {
5423
6281
  return this.tokenService.userSignedIn();
5424
6282
  }
5425
6283
  getSessionData() {
5426
- return JSON.parse(localStorage.getItem('sessionData')) || {};
6284
+ const sessionData = localStorage.getItem('sessionData');
6285
+ return sessionData ? JSON.parse(sessionData) : undefined;
5427
6286
  }
5428
6287
  clearSessionData() {
5429
- this.sessionData.next(undefined);
6288
+ this.dataBroadcastService.sessionData.next(undefined);
6289
+ this.dataBroadcastService.locale.next(undefined);
5430
6290
  }
5431
6291
  getId() {
5432
- return this.getSessionData().id;
6292
+ var _a;
6293
+ return (_a = this.getSessionData()) === null || _a === void 0 ? void 0 : _a.id;
5433
6294
  }
5434
6295
  changePassword() {
5435
- this.router.navigateByUrl('change-password');
6296
+ this.router.navigateByUrl('/app/account/change-password');
5436
6297
  }
5437
6298
  getPermissions() {
5438
- return this.getSessionData().permissions || [];
6299
+ var _a;
6300
+ return ((_a = this.getSessionData()) === null || _a === void 0 ? void 0 : _a.permissions) || [];
5439
6301
  }
5440
6302
  hasFeatureAccess(feature, action = 'Read') {
5441
6303
  return this.arrayService.hasItemWithAttributes(this.getPermissions(), { feature: feature, action: action });
@@ -5447,15 +6309,33 @@ class CurrentUserService {
5447
6309
  getLatestPasswordCheckTime() {
5448
6310
  return localStorage.getItem('latestPasswordCheckTime');
5449
6311
  }
6312
+ setLocale(locale) {
6313
+ if (locale == this.localeService.currentLocale)
6314
+ return;
6315
+ if (!this.localeService.availableLocales.includes(locale))
6316
+ return;
6317
+ if (this.isSignedIn()) {
6318
+ this.webApiService.update('my_account/locale', { locale: locale }).subscribe((response) => {
6319
+ let sessionData = this.dataBroadcastService.sessionData.getValue();
6320
+ sessionData.locale = response.content.data.locale;
6321
+ this.dataBroadcastService.sessionData.next(sessionData);
6322
+ }, (error) => {
6323
+ this.announcementService.error('mantle.messages.could_not_update_locale');
6324
+ });
6325
+ }
6326
+ else {
6327
+ this.dataBroadcastService.locale.next(locale);
6328
+ }
6329
+ }
5450
6330
  }
5451
- CurrentUserService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: CurrentUserService, deps: [{ token: i1$1.AngularTokenService }, { token: i1$4.Router }, { token: ArrayService }], target: i0.ɵɵFactoryTarget.Injectable });
6331
+ CurrentUserService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: CurrentUserService, deps: [{ token: i1$1.AngularTokenService }, { token: i1$4.Router }, { token: AnnouncementService }, { token: ArrayService }, { token: DataBroadcastService }, { token: LocaleService }, { token: WebApiService }], target: i0.ɵɵFactoryTarget.Injectable });
5452
6332
  CurrentUserService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: CurrentUserService, providedIn: 'root' });
5453
6333
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: CurrentUserService, decorators: [{
5454
6334
  type: Injectable,
5455
6335
  args: [{
5456
6336
  providedIn: 'root'
5457
6337
  }]
5458
- }], ctorParameters: function () { return [{ type: i1$1.AngularTokenService }, { type: i1$4.Router }, { type: ArrayService }]; } });
6338
+ }], ctorParameters: function () { return [{ type: i1$1.AngularTokenService }, { type: i1$4.Router }, { type: AnnouncementService }, { type: ArrayService }, { type: DataBroadcastService }, { type: LocaleService }, { type: WebApiService }]; } });
5459
6339
 
5460
6340
  class ChartService {
5461
6341
  constructor(objectService) {
@@ -5547,10 +6427,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
5547
6427
 
5548
6428
  const passwordCheckValidityMinutes = 5;
5549
6429
  class PasswordCheckService {
5550
- constructor(dialog, announcementService, currentUserService, webApiService) {
6430
+ constructor(dialog, announcementService, currentUserService, dataBroadcastService, webApiService) {
5551
6431
  this.dialog = dialog;
5552
6432
  this.announcementService = announcementService;
5553
6433
  this.currentUserService = currentUserService;
6434
+ this.dataBroadcastService = dataBroadcastService;
5554
6435
  this.webApiService = webApiService;
5555
6436
  }
5556
6437
  checkPassword() {
@@ -5563,13 +6444,13 @@ class PasswordCheckService {
5563
6444
  subscriber.complete();
5564
6445
  return;
5565
6446
  }
5566
- const username = this.currentUserService.sessionData.getValue().username;
6447
+ const username = this.dataBroadcastService.sessionData.getValue().username;
5567
6448
  this.validatePassword(username, formData['password']).subscribe((response) => {
5568
6449
  this.setLatestPasswordCheckTime();
5569
6450
  subscriber.next(true);
5570
6451
  subscriber.complete();
5571
6452
  }, (error) => {
5572
- this.announcementService.error('Incorrect password.');
6453
+ this.announcementService.error('mantle.auth.incorrect_password');
5573
6454
  subscriber.next(false);
5574
6455
  subscriber.complete();
5575
6456
  });
@@ -5610,27 +6491,27 @@ class PasswordCheckService {
5610
6491
  { label: 'Password', attr: 'password', required: true, type: 'password' }
5611
6492
  ]
5612
6493
  },
5613
- saveButtonText: 'Submit'
6494
+ saveButtonText: 'mantle.buttons.submit'
5614
6495
  };
5615
6496
  dialogConfig.width = '40%';
5616
6497
  return dialogConfig;
5617
6498
  }
5618
6499
  }
5619
- PasswordCheckService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: PasswordCheckService, deps: [{ token: i1$3.MatDialog }, { token: AnnouncementService }, { token: CurrentUserService }, { token: WebApiService }], target: i0.ɵɵFactoryTarget.Injectable });
6500
+ PasswordCheckService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: PasswordCheckService, deps: [{ token: i1$3.MatDialog }, { token: AnnouncementService }, { token: CurrentUserService }, { token: DataBroadcastService }, { token: WebApiService }], target: i0.ɵɵFactoryTarget.Injectable });
5620
6501
  PasswordCheckService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: PasswordCheckService, providedIn: 'root' });
5621
6502
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: PasswordCheckService, decorators: [{
5622
6503
  type: Injectable,
5623
6504
  args: [{
5624
6505
  providedIn: 'root'
5625
6506
  }]
5626
- }], ctorParameters: function () { return [{ type: i1$3.MatDialog }, { type: AnnouncementService }, { type: CurrentUserService }, { type: WebApiService }]; } });
6507
+ }], ctorParameters: function () { return [{ type: i1$3.MatDialog }, { type: AnnouncementService }, { type: CurrentUserService }, { type: DataBroadcastService }, { type: WebApiService }]; } });
5627
6508
 
5628
6509
  class FeatureConfigService {
5629
6510
  constructor(config) {
5630
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
6511
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
5631
6512
  this.sessionData = {};
5632
6513
  this.webRtcEvents = new EventEmitter();
5633
- this.listContentChangeEvents = new EventEmitter();
6514
+ this.subContentChangeEvents = new EventEmitter();
5634
6515
  this.isCommitInProgress = false;
5635
6516
  this.webApiBaseUrl = (_a = config.webApi) === null || _a === void 0 ? void 0 : _a.baseUrl;
5636
6517
  this.webApiService = (_b = config.webApi) === null || _b === void 0 ? void 0 : _b.service;
@@ -5638,10 +6519,11 @@ class FeatureConfigService {
5638
6519
  this.webRtcService = (_d = config.webRtc) === null || _d === void 0 ? void 0 : _d.service;
5639
6520
  this.feature = (_e = config.authorisation) === null || _e === void 0 ? void 0 : _e.feature;
5640
6521
  this.currentUserService = (_f = config.authorisation) === null || _f === void 0 ? void 0 : _f.service;
5641
- (_g = this.currentUserService) === null || _g === void 0 ? void 0 : _g.sessionData.subscribe(sessionData => { this.sessionData = sessionData; });
5642
- this.router = (_h = config.routing) === null || _h === void 0 ? void 0 : _h.service;
5643
- this.dialog = (_j = config.dialog) === null || _j === void 0 ? void 0 : _j.service;
5644
- this.confirmationService = (_k = config.confirmation) === null || _k === void 0 ? void 0 : _k.service;
6522
+ this.dataBroadcastService = (_g = config.dataBroadcast) === null || _g === void 0 ? void 0 : _g.service;
6523
+ (_h = this.dataBroadcastService) === null || _h === void 0 ? void 0 : _h.sessionData.subscribe(sessionData => { this.sessionData = sessionData; });
6524
+ this.router = (_j = config.routing) === null || _j === void 0 ? void 0 : _j.service;
6525
+ this.dialog = (_k = config.dialog) === null || _k === void 0 ? void 0 : _k.service;
6526
+ this.confirmationService = (_l = config.confirmation) === null || _l === void 0 ? void 0 : _l.service;
5645
6527
  this.onInit();
5646
6528
  }
5647
6529
  onInit() { }
@@ -5656,7 +6538,10 @@ class FeatureConfigService {
5656
6538
  this.parentComponent = parentComponent;
5657
6539
  }
5658
6540
  refreshParentComponent() {
5659
- this.parentComponent.loadData();
6541
+ this.parentComponent.pullContent();
6542
+ }
6543
+ populateParentComponent(data) {
6544
+ this.parentComponent.loadContent(data);
5660
6545
  }
5661
6546
  /*
5662
6547
  * WEB API INTERFACE
@@ -5740,6 +6625,7 @@ class FeatureConfigService {
5740
6625
  openRoute(route) {
5741
6626
  this.router.navigateByUrl(route);
5742
6627
  }
6628
+ openParent() { }
5743
6629
  /*
5744
6630
  * DIALOG
5745
6631
  */
@@ -5755,7 +6641,7 @@ class FeatureConfigService {
5755
6641
  let dialogRef = this.dialog.open(DialogDetailsComponent, dialogConfig);
5756
6642
  dialogRef.afterClosed().subscribe((response) => {
5757
6643
  if (response)
5758
- this.listContentChangeEvents.emit();
6644
+ this.subContentChangeEvents.emit();
5759
6645
  });
5760
6646
  }
5761
6647
  openFormDialog(formPageService, title, record = {}, initData = {}) {
@@ -5771,7 +6657,7 @@ class FeatureConfigService {
5771
6657
  let dialogRef = this.dialog.open(DialogFormComponent, dialogConfig);
5772
6658
  dialogRef.afterClosed().subscribe((response) => {
5773
6659
  if (response)
5774
- this.listContentChangeEvents.emit();
6660
+ this.subContentChangeEvents.emit();
5775
6661
  });
5776
6662
  }
5777
6663
  /*
@@ -5788,15 +6674,19 @@ class FeatureConfigService {
5788
6674
  return [];
5789
6675
  }
5790
6676
  // Override this method in your domain-service if you would like to use it.
6677
+ detailDialogLayoutChanges(section, record) {
6678
+ return section;
6679
+ }
6680
+ // Override this method in your domain-service if you would like to use it.
5791
6681
  additionalDetailPageButtons(record) {
5792
6682
  return [];
5793
6683
  }
5794
6684
  deletionOptions() {
5795
6685
  return {
5796
- message: `Do you want to delete this ${this.noun()}?`,
6686
+ message: 'mantle.messages.confirm_deletion',
5797
6687
  buttons: [
5798
6688
  {
5799
- label: 'Delete',
6689
+ label: 'mantle.buttons.delete',
5800
6690
  onClick: (id) => {
5801
6691
  return this.destroy(id);
5802
6692
  }
@@ -5829,6 +6719,15 @@ class FeatureConfigService {
5829
6719
  onFormValueChanged(pageContent, formValue) { }
5830
6720
  ;
5831
6721
  // Override this method in you domain-service if you would like to use it.
6722
+ onDialogFormContentLoaded(content) { }
6723
+ // Override this method in your domain-service if you would like to use it.
6724
+ formDialogLayoutChanges(section, record) {
6725
+ return section;
6726
+ }
6727
+ // Override this method in your domain-service if you would like to use it.
6728
+ onDialogFormValueChanged(dialogContent, formValue) { }
6729
+ ;
6730
+ // Override this method in you domain-service if you would like to use it.
5832
6731
  additionalFormPageButtons(record) {
5833
6732
  return [];
5834
6733
  }
@@ -5858,6 +6757,10 @@ class FeatureConfigService {
5858
6757
  listPageBulkExportOptions() {
5859
6758
  return [];
5860
6759
  }
6760
+ // Override this method in your domain-service if you would like to use it.
6761
+ additionalListPageButtons() {
6762
+ return [];
6763
+ }
5861
6764
  }
5862
6765
 
5863
6766
  class SessionGuard {
@@ -5892,7 +6795,7 @@ class FeatureGuard {
5892
6795
  const authorisableAction = route.data.authorise.action;
5893
6796
  const permitted = authorisableFeatureService.authorise(authorisableAction);
5894
6797
  if (!permitted) {
5895
- this.announcementService.error('You do not have access to this page.');
6798
+ this.announcementService.error('mantle.auth.page_access_denied');
5896
6799
  this.router.navigateByUrl('');
5897
6800
  }
5898
6801
  resolve(permitted);
@@ -5936,5 +6839,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImpor
5936
6839
  * Generated bundle index. Do not edit.
5937
6840
  */
5938
6841
 
5939
- export { AccordionDetailsContainerComponent, AccordionFormContainerComponent, AccordionLayoutEditorContainerComponent, ActionsAttributeDisplayComponent, AnnouncementService, ArrayService, AutocompleteInputComponent, COLUMN_CHART, ChartService, ChipAttributeDisplayComponent, ChipInputComponent, ClickStopPropagationDirective, ConfirmationService, ContentTitleComponent, CurrentUserService, DashboardCardComponent, DashboardCardSearchMenuComponent, DashboardInfoCardComponent, DashboardLayoutEditorSectionComponent, DashboardPageComponent, DashboardSectionComponent, DashboardTableComponent, DashboardTableDataSource, DatepickerComponent, DatetimepickerComponent, DeleteConfirmationDialogComponent, DetailPageComponent, DialogDetailsComponent, DialogFormComponent, DialogNestedDetailsComponent, DialogNestedFormComponent, DocumentsPageComponent, DropdownComponent, DynamicAttributeDisplayComponent, DynamicChartComponent, DynamicDashboardComponent, DynamicDashboardContainerComponent, DynamicDetailsComponent, DynamicDetailsContainerComponent, DynamicDetailsSectionComponent, DynamicFormComponent, DynamicFormContainerComponent, DynamicFormField, DynamicFormFieldComponent, DynamicFormSectionComponent, DynamicFormService, DynamicLayoutEditorComponent, DynamicLayoutEditorContainerComponent, DynamicLayoutEditorElementComponent, DynamicLayoutEditorSectionComponent, DynamicPipe, DynamicTableComponent, DynamicTableDataSource, DynamicWidgetDisplayComponent, ENVIRONMENT, ExportPageComponent, FeatureConfigService, FeatureGuard, FileAttributeDisplayComponent, FileDropzoneDirective, FilePreviewDialogComponent, FilepickerComponent, FormPageComponent, GANTT_CHART, GridDetailsSectionComponent, GridFormSectionComponent, GridLayoutEditorSectionComponent, ImageAttributeDisplayComponent, ImageCropperComponent, ImagepickerComponent, LayoutEditorFieldElementComponent, LayoutEditorPageComponent, LayoutEditorTableColumnElementComponent, LayoutEditorWidgetElementComponent, LinkAttributeDisplayComponent, ListPageComponent, ListPageDataSource, LoaderComponent, MantleModule, MarkdownAttributeDisplayComponent, MarkdownDetailsSectionComponent, MarkdownInputComponent, MarkdownLayoutEditorSectionComponent, MaterialModule, NavTreeComponent, NumberInputComponent, ObjectService, PIE_CHART, PROGRESS_BAR_CHART, PageTitleComponent, PasswordCheckGuard, PasswordCheckService, PasswordInputComponent, PlainDashboardContainerComponent, PlainDetailsContainerComponent, PlainFormContainerComponent, PlainLayoutEditorContainerComponent, RerouteComponent, SPLINE_CHART, SaveConfirmationDialogComponent, ScreenSizeMap, ScreenSizeService, SearchPanelComponent, SectionTitleComponent, SecureImagePipe, SessionGuard, SnackbarComponent, TabbedPageComponent, TableDetailsSectionComponent, TableFormSectionComponent, TableLayoutEditorSectionComponent, TextInputComponent, TextareaComponent, ThumbnailDisplayComponent, WebApiListRequest, WebApiService, WebsocketService };
6842
+ export { AccordionDetailsContainerComponent, AccordionFormContainerComponent, AccordionLayoutEditorContainerComponent, ActionsAttributeDisplayComponent, AnnouncementService, ArrayService, AutocompleteInputComponent, COLUMN_CHART, ChartService, ChipAttributeDisplayComponent, ChipInputComponent, ClickStopPropagationDirective, ConfirmationService, ContentTitleComponent, CurrentUserService, DashboardCardComponent, DashboardCardSearchMenuComponent, DashboardInfoCardComponent, DashboardLayoutEditorSectionComponent, DashboardPageComponent, DashboardSectionComponent, DashboardTableComponent, DashboardTableDataSource, DataBroadcastService, DatepickerComponent, DatetimepickerComponent, DeleteConfirmationDialogComponent, DetailPageComponent, DialogDetailsComponent, DialogFormComponent, DialogNestedDetailsComponent, DialogNestedFormComponent, DocumentsPageComponent, DraggableTableComponent, DraggableTableDataSource, DropdownComponent, DynamicAttributeDisplayComponent, DynamicChartComponent, DynamicDashboardComponent, DynamicDashboardContainerComponent, DynamicDetailsComponent, DynamicDetailsContainerComponent, DynamicDetailsSectionComponent, DynamicFormComponent, DynamicFormContainerComponent, DynamicFormField, DynamicFormFieldComponent, DynamicFormSectionComponent, DynamicFormService, DynamicLayoutEditorComponent, DynamicLayoutEditorContainerComponent, DynamicLayoutEditorElementComponent, DynamicLayoutEditorSectionComponent, DynamicPipe, DynamicTableComponent, DynamicTableDataSource, DynamicWidgetDisplayComponent, ENVIRONMENT, ExportPageComponent, FeatureConfigService, FeatureGuard, FileAttributeDisplayComponent, FileDropzoneDirective, FilePreviewDialogComponent, FilepickerComponent, FormPageComponent, GANTT_CHART, GridDetailsSectionComponent, GridFormSectionComponent, GridLayoutEditorSectionComponent, IconAttributeDisplayComponent, ImageAttributeDisplayComponent, ImageCropperComponent, ImagepickerComponent, LayoutEditorFieldElementComponent, LayoutEditorPageComponent, LayoutEditorTableColumnElementComponent, LayoutEditorWidgetElementComponent, LinkAttributeDisplayComponent, ListPageComponent, ListPageDataSource, LoaderComponent, LocaleService, MANTLE_LANG_EN, MANTLE_LANG_MS, MantleModule, MarkdownAttributeDisplayComponent, MarkdownDetailsSectionComponent, MarkdownInputComponent, MarkdownLayoutEditorSectionComponent, MaterialModule, NavTreeComponent, NumberInputComponent, ObjectService, PIE_CHART, PROGRESS_BAR_CHART, PageTitleComponent, PasswordCheckGuard, PasswordCheckService, PasswordInputComponent, PlainDashboardContainerComponent, PlainDetailsContainerComponent, PlainFormContainerComponent, PlainLayoutEditorContainerComponent, QrCodeDialogComponent, RerouteComponent, RosterPageComponent, RosterShiftListDetailsSectionComponent, RosterShiftListFormSectionComponent, SPLINE_CHART, SaveConfirmationDialogComponent, ScreenSizeMap, ScreenSizeService, SearchPanelComponent, SectionTitleComponent, SecureImagePipe, SessionGuard, SnackbarComponent, TabbedPageComponent, TableDetailsSectionComponent, TableFormSectionComponent, TableLayoutEditorSectionComponent, TextInputComponent, TextareaComponent, ThumbnailDisplayComponent, TimeInputComponent, WebApiListRequest, WebApiService, WebsocketService };
5940
6843
  //# sourceMappingURL=codetectonics-mantle.js.map