@elderbyte/ngx-starter 18.13.0-beta.0 → 18.13.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 (72) hide show
  1. package/_index.scss +6 -18
  2. package/esm2022/lib/common/exceptions/public_api.mjs +2 -0
  3. package/esm2022/lib/common/exceptions/unreachable-case-error.mjs +6 -0
  4. package/esm2022/lib/common/public_api.mjs +2 -1
  5. package/esm2022/lib/components/data-transfer/http-data-transfer-indicator/http-data-transfer-indicator.component.mjs +3 -3
  6. package/esm2022/lib/components/data-transfer/http-data-transfer-overview/http-data-transfer-overview.component.mjs +3 -3
  7. package/esm2022/lib/components/forms/directives/checkbox/elder-single-state-checkbox-controller.mjs +97 -0
  8. package/esm2022/lib/components/forms/directives/checkbox/elder-single-state-checkbox.directive.mjs +50 -0
  9. package/esm2022/lib/components/forms/directives/checkbox/elder-triple-state-checkbox-controller.mjs +102 -0
  10. package/esm2022/lib/components/forms/directives/checkbox/elder-triple-state-checkbox.directive.mjs +50 -0
  11. package/esm2022/lib/components/forms/directives/elder-forms-directives.module.mjs +9 -3
  12. package/esm2022/lib/components/input/autocomplete/elder-autocomplete/elder-suggestion-panel.component.mjs +5 -12
  13. package/esm2022/lib/components/page/exit-guard/page-exit-lock-indicator/page-exit-lock-indicator.component.mjs +3 -3
  14. package/esm2022/lib/components/select/filter/elder-filter-chip-template/elder-filter-chip-template.component.mjs +3 -3
  15. package/esm2022/lib/components/select/multi/elder-multi-select-chip-options/elder-multi-select-chip-options.component.mjs +3 -3
  16. package/esm2022/lib/components/select/multi/elder-multi-select-chips/elder-multi-select-chips.component.mjs +3 -3
  17. package/esm2022/lib/components/select/popup/templated-selection-dialog/templated-selection-dialog.component.mjs +3 -3
  18. package/esm2022/lib/components/select/single/elder-select/elder-select.component.mjs +5 -3
  19. package/esm2022/lib/components/shell/header/elder-app-header/elder-app-header.component.mjs +3 -3
  20. package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker.component.mjs +3 -3
  21. package/fesm2022/elderbyte-ngx-starter.mjs +343 -174
  22. package/fesm2022/elderbyte-ngx-starter.mjs.map +1 -1
  23. package/lib/common/exceptions/public_api.d.ts +1 -0
  24. package/lib/common/exceptions/unreachable-case-error.d.ts +4 -0
  25. package/lib/common/public_api.d.ts +1 -0
  26. package/lib/components/forms/directives/checkbox/elder-single-state-checkbox-controller.d.ts +46 -0
  27. package/lib/components/forms/directives/checkbox/elder-single-state-checkbox.directive.d.ts +34 -0
  28. package/lib/components/forms/directives/checkbox/elder-triple-state-checkbox-controller.d.ts +47 -0
  29. package/lib/components/forms/directives/{elder-triple-state-checkbox.directive.d.ts → checkbox/elder-triple-state-checkbox.directive.d.ts} +10 -23
  30. package/lib/components/forms/directives/elder-forms-directives.module.d.ts +9 -7
  31. package/lib/components/input/autocomplete/elder-autocomplete/elder-suggestion-panel.component.d.ts +1 -2
  32. package/package.json +1 -1
  33. package/src/lib/components/button-group/elder-button-group/elder-button-group.component.scss +7 -1
  34. package/src/lib/components/card-organizer/card-stack/elder-card-stack.component.scss +14 -3
  35. package/src/lib/components/cards/elder-card/elder-card.component.scss +8 -2
  36. package/src/lib/components/chips/_elder-chip-theme.scss +12 -101
  37. package/src/lib/components/data-transfer/http-data-transfer-indicator/http-data-transfer-indicator.component.scss +6 -0
  38. package/src/lib/components/data-transfer/http-data-transfer-overview/http-data-transfer-overview.component.scss +0 -11
  39. package/src/lib/components/data-view/grid/elder-grid/elder-grid.component.scss +22 -15
  40. package/src/lib/components/data-view/table/elder-table/elder-table.component.scss +18 -11
  41. package/src/lib/components/errors/exception-detail/elder-exception-detail.component.scss +9 -2
  42. package/src/lib/components/expand-toggle-button/elder-expand-toggle-button.component.scss +8 -2
  43. package/src/lib/components/files/drag-n-drop/elder-drop-zone/elder-drop-zone.component.scss +10 -7
  44. package/src/lib/components/iframes/iframe-host/iframe-host.component.scss +4 -0
  45. package/src/lib/components/navigation/nav/_elder-nav-theme.scss +24 -12
  46. package/src/lib/components/page/exit-guard/page-exit-lock-indicator/page-exit-lock-indicator.component.scss +4 -1
  47. package/src/lib/components/panels/card-panel/elder-card-panel.component.scss +12 -3
  48. package/src/lib/components/panels/elder-dialog-panel/elder-dialog-panel.component.scss +12 -4
  49. package/src/lib/components/panels/flat/_elder-panel-theme.scss +9 -26
  50. package/src/lib/components/select/_elder-select-base.scss +9 -1
  51. package/src/lib/components/select/filter/elder-filter-chip-template/elder-filter-chip-template.component.scss +4 -1
  52. package/src/lib/components/select/multi/elder-multi-select-chip-options/elder-multi-select-chip-options.component.scss +39 -10
  53. package/src/lib/components/select/multi/elder-multi-select-chips/elder-multi-select-chips.component.scss +52 -19
  54. package/src/lib/components/select/single/elder-select/elder-select.component.scss +40 -24
  55. package/src/lib/components/time/_elder-time-input.theme.scss +3 -0
  56. package/theming/_elder-common.scss +399 -6
  57. package/theming/_elder-defaults.scss +7 -3
  58. package/theming/_elder-mdc-support.scss +142 -59
  59. package/theming/_elder-palettes.scss +148 -0
  60. package/theming/_elder-scrollbar-theme.scss +12 -2
  61. package/theming/_elder-style-fixes.scss +109 -41
  62. package/theming/_elder-theme.scss +51 -0
  63. package/theming/_elder-toast-theme.scss +46 -0
  64. package/theming/_elder-typography-utils.scss +11 -0
  65. package/theming/_mat-icon-button-size.scss +34 -0
  66. package/theming/_mixins.scss +0 -35
  67. package/esm2022/lib/components/forms/directives/elder-triple-state-checkbox.directive.mjs +0 -120
  68. package/src/lib/components/chips/_elder-chip-theme-old.scss +0 -122
  69. package/theming/_elder-color-variants.scss +0 -26
  70. package/theming/_elder-form.scss +0 -308
  71. package/theming/_elder-layout-system.scss +0 -242
  72. package/theming/_elder-m3-theme.scss +0 -754
@@ -0,0 +1,148 @@
1
+ @use '@angular/material' as mat;
2
+ @use 'sass:map';
3
+
4
+ /***************************************************************************
5
+ * *
6
+ * Overriding Material Base Variables *
7
+ * *
8
+ **************************************************************************/
9
+
10
+ $dark-primary-text: rgba(black, 0.87);
11
+ $light-primary-text: white;
12
+
13
+ /***************************************************************************
14
+ * *
15
+ * Material Color Palettes *
16
+ * *
17
+ **************************************************************************/
18
+
19
+ // ElderByte Theme
20
+
21
+ $elder-blue: (
22
+ 50: #dfe3e8,
23
+ 100: #b3bcc8,
24
+ 200: #8593a7,
25
+ 300: #546883,
26
+ 400: #2f4869,
27
+ 500: #0b284f,
28
+ // Official Main Color tone: #002852 (#0B284F)
29
+ 600: #0a2448,
30
+ 700: #092040,
31
+ 800: #081c38,
32
+ 900: #061529,
33
+ A100: #809ec5,
34
+ A200: #5179bf,
35
+ A400: #004390,
36
+ A700: #00006b,
37
+ contrast: (
38
+ 50: $dark-primary-text,
39
+ 100: $dark-primary-text,
40
+ 200: $dark-primary-text,
41
+ 300: $dark-primary-text,
42
+ 400: $light-primary-text,
43
+ 500: $light-primary-text,
44
+ 600: $light-primary-text,
45
+ 700: $light-primary-text,
46
+ 800: $light-primary-text,
47
+ 900: $light-primary-text,
48
+ A100: $light-primary-text,
49
+ A200: $light-primary-text,
50
+ A400: $light-primary-text,
51
+ A700: $light-primary-text,
52
+ ),
53
+ );
54
+
55
+ $elder-gold: (
56
+ 50: #f6f3ec,
57
+ 100: #e8e1d1,
58
+ 200: #dacfb4,
59
+ 300: #ccbc96,
60
+ 400: #c1ad80,
61
+ 500: #b69f6a,
62
+ // Official ElderByte Accent tone
63
+ 600: #a69160,
64
+ 700: #948156,
65
+ 800: #81714b,
66
+ 900: #5f5337,
67
+ A100: #e1d1a9,
68
+ A200: #efd08f,
69
+ A400: #dbbe7a,
70
+ A700: #af9144,
71
+ contrast: (
72
+ 50: $dark-primary-text,
73
+ 100: $dark-primary-text,
74
+ 200: $dark-primary-text,
75
+ 300: $dark-primary-text,
76
+ 400: $dark-primary-text,
77
+ 500: $dark-primary-text,
78
+ 600: $dark-primary-text,
79
+ 700: $dark-primary-text,
80
+ 800: $dark-primary-text,
81
+ 900: $dark-primary-text,
82
+ A100: $dark-primary-text,
83
+ A200: $dark-primary-text,
84
+ A400: $dark-primary-text,
85
+ A700: $dark-primary-text,
86
+ ),
87
+ );
88
+
89
+ /***************************************************************************
90
+ * *
91
+ * Dark Theme Palettes *
92
+ * *
93
+ **************************************************************************/
94
+
95
+ $grey-palette: mat.$m2-grey-palette;
96
+ $light-primary-text: rgba(white, 0.87);
97
+ $light-secondary-text: rgba(white, 0.4);
98
+ $light-disabled-text: rgba(white, 0.38);
99
+ $light-dividers: rgba(white, 0.12);
100
+ $light-focused: rgba(white, 0.12);
101
+
102
+ $dark-background-dp-01: #1f1f1f; // 5%
103
+ $dark-background-dp-02: #222222; // 7%
104
+ $dark-background-dp-03: #262626; // 8%
105
+ $dark-background-dp-04: #272727; // 9%
106
+ $dark-background-dp-06: #2c2c2c; // 11%
107
+ $dark-background-dp-08: #2d2d2d; // 12%
108
+ $dark-background-dp-12: #333333; // 14%
109
+
110
+ // Background palette for dark themes.
111
+ $elder-dark-theme-background: (
112
+ status-bar: black,
113
+ app-bar: $dark-background-dp-01,
114
+ background: #121212,
115
+ // #121212
116
+ hover: rgba(white, 0.04),
117
+ card: $dark-background-dp-03,
118
+ dialog: $dark-background-dp-12,
119
+ // $my-dark-dp-06
120
+ disabled-button: rgba(white, 0.12),
121
+ raised-button: map.get($grey-palette, 800),
122
+ focused-button: $light-focused,
123
+ selected-button: map.get($grey-palette, 900),
124
+ selected-disabled-button: map.get($grey-palette, 800),
125
+ disabled-button-toggle: black,
126
+ unselected-chip: map.get($grey-palette, 800),
127
+ disabled-list-option: rgba(white, 0.12),
128
+ tooltip: map.get($grey-palette, 800),
129
+ );
130
+
131
+ // Foreground palette for dark themes.
132
+ $elder-dark-theme-foreground: (
133
+ base: rgba(white, 0.87),
134
+ divider: $light-dividers,
135
+ dividers: $light-dividers,
136
+ disabled: $light-disabled-text,
137
+ disabled-button: rgba(white, 0.38),
138
+ disabled-text: $light-disabled-text,
139
+ elevation: black,
140
+ hint-text: $light-disabled-text,
141
+ secondary-text: $light-secondary-text,
142
+ icon: rgba(white, 0.87),
143
+ icons: rgba(white, 0.87),
144
+ text: rgba(white, 0.87),
145
+ slider-min: rgba(white, 0.87),
146
+ slider-off: rgba(white, 0.38),
147
+ slider-off-active: rgba(white, 0.38),
148
+ );
@@ -9,6 +9,11 @@
9
9
  $scrollbarStyling: map.get($theme, elder, scrollbar-styling);
10
10
 
11
11
  @if $scrollbarStyling {
12
+ $primary: map-get($theme, primary);
13
+ $accent: map-get($theme, accent);
14
+ $warn: map-get($theme, warn);
15
+ $background: map-get($theme, background);
16
+ $foreground: map-get($theme, foreground);
12
17
  $commonSizes: map.get($theme, elder, common-sizes);
13
18
 
14
19
  @include scrollbar-width(map.get($commonSizes, sm)); // default
@@ -37,15 +42,20 @@
37
42
  @include scrollbar-width(map.get($commonSizes, xxl));
38
43
  }
39
44
 
45
+ /* Track */
46
+ ::-webkit-scrollbar-track {
47
+ // background: mat.get-color-from-palette($background, background);
48
+ }
49
+
40
50
  /* Handle */
41
51
  ::-webkit-scrollbar-thumb {
42
- background: var(--md-sys-color-primary);
52
+ background: mat.m2-get-color-from-palette($primary);
43
53
  border-radius: 5px;
44
54
  }
45
55
 
46
56
  /* Handle on hover */
47
57
  ::-webkit-scrollbar-thumb:hover {
48
- background: var(--md-sys-color-primary-fixed);
58
+ background: mat.m2-get-color-from-palette($primary, 300);
49
59
  }
50
60
  }
51
61
  }
@@ -1,11 +1,10 @@
1
1
  @use '@angular/material' as mat;
2
- @use './mixins' as mixins;
2
+ @use 'mixins' as mixins;
3
3
  @use 'sass:map';
4
4
 
5
5
  @mixin elder-style-fixes($theme) {
6
6
  @include _ng-style-fixes;
7
7
  @include _mat-style-fixes($theme);
8
- @include _mat3-fixes($theme);
9
8
 
10
9
  // elder custom icons fill color
11
10
  .mat-icon.svg-icon-inherit-color svg * {
@@ -91,6 +90,88 @@
91
90
  z-index: 1;
92
91
  }
93
92
 
93
+ .mat-mdc-form-field-has-icon-prefix .mat-mdc-text-field-wrapper {
94
+ padding-left: 0 !important;
95
+ }
96
+
97
+ .mat-mdc-form-field-has-icon-suffix .mat-mdc-text-field-wrapper {
98
+ padding-right: 0 !important;
99
+ }
100
+
101
+ .mat-mdc-form-field:not(.mat-mdc-form-field.elder-dense) {
102
+ $density: map-get($theme, elder, density, form-field);
103
+
104
+ /******************************
105
+ Fix big paddings for dense form fields
106
+ *******************************/
107
+
108
+ .mat-mdc-text-field-wrapper {
109
+ padding-left: calc-side-paddings($density);
110
+ padding-right: calc-side-paddings($density);
111
+ }
112
+
113
+ /******************************
114
+ Fix icon size and placement in mat label
115
+ *******************************/
116
+
117
+ @include mixins.form-field-icons($density);
118
+
119
+ /******************************
120
+ Fix text and hover placement of small filled form fields
121
+ *******************************/
122
+
123
+ $mat-mdc-form-field-label-transform: 0.75;
124
+ $mat-mdc-form-field-label-offset-x: -16px;
125
+ $form-field-density: map-get($theme, elder, density, form-field);
126
+
127
+ @if $form-field-density < -1 {
128
+ .mdc-text-field--filled {
129
+ .mdc-floating-label--float-above {
130
+ transform: var(
131
+ $mat-mdc-form-field-label-transform,
132
+ translateY(-50%)
133
+ translateX(calc(1 * (44px + var($mat-mdc-form-field-label-offset-x, 0px))))
134
+ ) !important;
135
+ }
136
+
137
+ .mat-mdc-form-field-infix {
138
+ padding-top: calc-padding-top-form-field-inflix($form-field-density) !important;
139
+ padding-bottom: 2px !important;
140
+ min-height: 40px; // (24 + 2*16) = 56px by default
141
+ }
142
+ }
143
+ }
144
+
145
+ /******************************
146
+ Material Form Field Label stealing clicks
147
+ *******************************/
148
+
149
+ .mat-mdc-floating-label.mdc-floating-label {
150
+ pointer-events: none !important;
151
+
152
+ mat-label {
153
+ pointer-events: none !important;
154
+ }
155
+ }
156
+
157
+ .mdc-notched-outline__notch {
158
+ pointer-events: none !important;
159
+
160
+ .mdc-floating-label {
161
+ pointer-events: none !important;
162
+
163
+ mat-label {
164
+ pointer-events: none !important;
165
+ }
166
+ }
167
+ }
168
+
169
+ .mat-mdc-form-field-error-wrapper {
170
+ display: flex;
171
+ padding-right: 0;
172
+ }
173
+ }
174
+
94
175
  /******************************
95
176
  Material chip make regular chips clickable when applying this class
96
177
  *******************************/
@@ -100,49 +181,36 @@
100
181
  cursor: pointer;
101
182
  }
102
183
  }
184
+ }
103
185
 
104
- /******************************
105
- Styling toast messages
106
- *******************************/
107
- .elder-primary-text {
108
- color: var(--md-sys-color-primary);
109
- }
110
-
111
- .elder-accent-text {
112
- color: var(--md-sys-color-tertiary);
113
- }
114
-
115
- .elder-warn-text {
116
- color: var(--md-sys-color-error);
117
- }
186
+ .mat-mdc-text-field-wrapper:not(.mdc-text-field--outlined) .mat-mdc-floating-label {
187
+ display: block !important;
118
188
  }
119
189
 
120
- @mixin _mat3-fixes($theme) {
121
- --mat-sidenav-container-width: auto; // is set to around 300px by default in MAT 3 (MAT 2 was auto by default)
122
- --mat-badge-small-size-text-size: 9px; // this is the mat2 setting, mat3 somehow sets this to 0, which hides the font, unclear why.
123
- --mdc-dialog-container-shape: 16px; // make border-radius of dialog container smaller (default is 28px)
124
- --mat-dialog-container-max-width: 80vw; // 80vw is mat 2 default, mat 3 default is very narrow: 560px;
125
- --mat-toolbar-title-text-tracking: 0; // mat toolbar typography
126
- --mat-toolbar-title-text-weight: 500; // mat toolbar typography
127
-
128
- .mat-toolbar {
129
- &.mat-primary {
130
- --mat-toolbar-container-text-color: var(--md-sys-color-on-primary);
131
- --mat-toolbar-container-background-color: var(--md-sys-color-primary);
132
- .mat-mdc-icon-button {
133
- color: var(--md-sys-color-on-primary);
134
- }
135
- }
136
- &.mat-accent {
137
- --mat-toolbar-container-text-color: var(--md-sys-color-on-tertiary);
138
- --mat-toolbar-container-background-color: var(--md-sys-color-tertiary);
139
- .mat-mdc-icon-button {
140
- color: var(--md-sys-color-on-tertiary);
141
- }
142
- }
190
+ @function calc-side-paddings($density) {
191
+ $paddingDensityNeg4: 8px;
192
+ $paddingDensityNeg3: 10px;
193
+ $paddingDensityNeg2: 12px;
194
+ $paddingDensityNeg1: 14px;
195
+ $paddingDensity0: 16px;
196
+
197
+ @if $density == -4 {
198
+ @return $paddingDensityNeg4;
199
+ } @else if $density == -3 {
200
+ @return $paddingDensityNeg3;
201
+ } @else if $density == -2 {
202
+ @return $paddingDensityNeg2;
203
+ } @else if $density == -1 {
204
+ @return $paddingDensityNeg1;
205
+ } @else if $density == 0 {
206
+ @return $paddingDensity0;
143
207
  }
208
+ }
144
209
 
145
- .mat-toolbar .mat-mdc-icon-button {
146
- color: inherit;
210
+ @function calc-padding-top-form-field-inflix($density) {
211
+ @if $density > -3 {
212
+ @return 20px;
213
+ } @else {
214
+ @return 14px;
147
215
  }
148
216
  }
@@ -0,0 +1,51 @@
1
+ @use '@angular/material' as mat;
2
+ @use 'sass:map';
3
+ @use 'elder-palettes' as palettes;
4
+
5
+ /***************************************************************************
6
+ * *
7
+ * Public API *
8
+ * *
9
+ **************************************************************************/
10
+
11
+ @function define-dark-elder-theme($config) {
12
+ $result: $config;
13
+ @if map.get($config, color) {
14
+ $color-settings: map.get($config, color);
15
+ $primary: map.get($color-settings, primary);
16
+ $accent: map.get($color-settings, accent);
17
+ $warn: map.get($color-settings, warn);
18
+ $result: map.merge(
19
+ $config,
20
+ (
21
+ color: _mat-create-dark-color-config($primary, $accent, $warn),
22
+ )
23
+ );
24
+ }
25
+ @return _create-backwards-compatibility-theme($result);
26
+ }
27
+
28
+ /***************************************************************************
29
+ * *
30
+ * Private functions *
31
+ * *
32
+ **************************************************************************/
33
+
34
+ @function _mat-create-dark-color-config($primary, $accent, $warn: null) {
35
+ @return (
36
+ primary: $primary,
37
+ accent: $accent,
38
+ warn: if($warn != null, $warn, mat.m2-define-palette(mat.$m2-red-palette)),
39
+ is-dark: true,
40
+ foreground: palettes.$elder-dark-theme-foreground,
41
+ background: palettes.$elder-dark-theme-background
42
+ );
43
+ }
44
+
45
+ @function _create-backwards-compatibility-theme($theme) {
46
+ @if not map.get($theme, color) {
47
+ @return $theme;
48
+ }
49
+ $color: map.get($theme, color);
50
+ @return map.merge($theme, $color);
51
+ }
@@ -0,0 +1,46 @@
1
+ @use '@angular/material' as mat;
2
+
3
+ @mixin theme($theme) {
4
+ $primary: map-get($theme, primary);
5
+ $accent: map-get($theme, accent);
6
+ $warn: map-get($theme, warn);
7
+ $background: map-get($theme, background);
8
+ $foreground: map-get($theme, foreground);
9
+
10
+ /*
11
+ .elder-primary-toast {
12
+ background: mat.get-color-from-palette($background, dialog);
13
+ color: mat.get-color-from-palette($primary);
14
+ }
15
+
16
+ .elder-accent-toast {
17
+ background: mat.get-color-from-palette($background, dialog);
18
+ color: mat.get-color-from-palette($accent);
19
+ }
20
+
21
+ .elder-success-toast {
22
+ background: mat.get-color-from-palette($background, dialog);
23
+ color: mat.get-color-from-palette($primary);
24
+ }
25
+
26
+ .elder-warning-toast {
27
+ background: mat.get-color-from-palette($background, dialog);
28
+ color: mat.get-color-from-palette($accent);
29
+ }
30
+
31
+ .elder-error-toast {
32
+ background-color: mat.get-color-from-palette($warn);
33
+ }*/
34
+
35
+ .elder-primary-text {
36
+ color: mat.m2-get-color-from-palette($primary);
37
+ }
38
+
39
+ .elder-accent-text {
40
+ color: mat.m2-get-color-from-palette($accent);
41
+ }
42
+
43
+ .elder-warn-text {
44
+ color: mat.m2-get-color-from-palette($warn);
45
+ }
46
+ }
@@ -10,3 +10,14 @@
10
10
  @function coerce-unitless-to-em($value) {
11
11
  @return if(math.is-unitless($value), 1em * $value, $value);
12
12
  }
13
+
14
+ @function get-typography-config($config) {
15
+ $typography: mat.m2-get-typography-config($config);
16
+
17
+ // If no actual typography configuration has been specified, create a default one.
18
+ @if not $typography {
19
+ $typography: mat.m2-define-typography-config();
20
+ }
21
+
22
+ @return $typography;
23
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Based on https://github.com/btxtiger/mat-icon-button-sizes
3
+ * The default factor between button and icon size is *= 0.6
4
+ */
5
+ @mixin matIconButtonSize($buttonSize, $iconSize) {
6
+ width: $buttonSize !important;
7
+ height: $buttonSize !important;
8
+ padding: 0px !important;
9
+ display: inline-flex !important;
10
+ align-items: center;
11
+ justify-content: center;
12
+
13
+ .mat-icon,
14
+ img {
15
+ width: $iconSize;
16
+ height: $iconSize;
17
+ font-size: $iconSize;
18
+
19
+ svg {
20
+ width: $iconSize;
21
+ height: $iconSize;
22
+ }
23
+ }
24
+
25
+ svg {
26
+ width: $iconSize;
27
+ height: $iconSize;
28
+ }
29
+
30
+ .mat-mdc-button-touch-target {
31
+ width: $buttonSize !important;
32
+ height: $buttonSize !important;
33
+ }
34
+ }
@@ -50,38 +50,3 @@
50
50
  @return 40px;
51
51
  }
52
52
  }
53
-
54
- /**
55
- * Based on https://github.com/btxtiger/mat-icon-button-sizes
56
- * The default factor between button and icon size is *= 0.6
57
- */
58
- @mixin matIconButtonSize($buttonSize, $iconSize) {
59
- width: $buttonSize !important;
60
- height: $buttonSize !important;
61
- padding: 0 !important;
62
- display: inline-flex !important;
63
- align-items: center;
64
- justify-content: center;
65
-
66
- .mat-icon,
67
- img {
68
- width: $iconSize;
69
- height: $iconSize;
70
- font-size: $iconSize;
71
-
72
- svg {
73
- width: $iconSize;
74
- height: $iconSize;
75
- }
76
- }
77
-
78
- svg {
79
- width: $iconSize;
80
- height: $iconSize;
81
- }
82
-
83
- .mat-mdc-button-touch-target {
84
- width: $buttonSize !important;
85
- height: $buttonSize !important;
86
- }
87
- }
@@ -1,120 +0,0 @@
1
- import { Directive, Optional } from '@angular/core';
2
- import { ParseUtil } from '../../../common/utils/parse-util';
3
- import { LoggerFactory } from '@elderbyte/ts-logger';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/material/checkbox";
6
- import * as i2 from "@angular/forms";
7
- export var ElderCheckboxState;
8
- (function (ElderCheckboxState) {
9
- ElderCheckboxState[ElderCheckboxState["UNCHECKED"] = 0] = "UNCHECKED";
10
- ElderCheckboxState[ElderCheckboxState["CHECKED"] = 1] = "CHECKED";
11
- ElderCheckboxState[ElderCheckboxState["INDETERMINATE"] = 2] = "INDETERMINATE";
12
- })(ElderCheckboxState || (ElderCheckboxState = {}));
13
- export class ElderTripleStateCheckboxDirective {
14
- /***************************************************************************
15
- * *
16
- * Constructor *
17
- * *
18
- **************************************************************************/
19
- constructor(checkbox, ngModel) {
20
- this.checkbox = checkbox;
21
- this.ngModel = ngModel;
22
- this.log = LoggerFactory.getLogger(this.constructor.name);
23
- }
24
- /***************************************************************************
25
- * *
26
- * Life Cycle *
27
- * *
28
- **************************************************************************/
29
- ngOnInit() {
30
- this.state = this.state;
31
- this.checkbox.registerOnChange(() => this.toggleNextState());
32
- this.ngModel.valueChanges.subscribe((value) => (this.state = this.controlValueToState(value)));
33
- }
34
- /***************************************************************************
35
- * *
36
- * Properties *
37
- * *
38
- **************************************************************************/
39
- get state() {
40
- return this.controlValueToState(this.readControlValue());
41
- }
42
- set state(newState) {
43
- switch (newState) {
44
- case ElderCheckboxState.UNCHECKED:
45
- this.setCheckboxUnchecked();
46
- break;
47
- case ElderCheckboxState.CHECKED:
48
- this.setCheckboxChecked();
49
- break;
50
- case ElderCheckboxState.INDETERMINATE:
51
- this.setCheckboxIndeterminate();
52
- break;
53
- }
54
- }
55
- /***************************************************************************
56
- * *
57
- * Private methods *
58
- * *
59
- **************************************************************************/
60
- controlValueToState(value) {
61
- switch (ParseUtil.parseBoolOrUndefined(value)) {
62
- case false:
63
- return ElderCheckboxState.UNCHECKED;
64
- case true:
65
- return ElderCheckboxState.CHECKED;
66
- case undefined:
67
- return ElderCheckboxState.INDETERMINATE;
68
- }
69
- }
70
- toggleNextState() {
71
- this.state = (this.state + 1) % 3;
72
- }
73
- setCheckboxUnchecked() {
74
- this.checkbox.value = 'false';
75
- this.checkbox.checked = false;
76
- this.checkbox.indeterminate = false;
77
- this.updateModelIfPresent(false);
78
- }
79
- setCheckboxChecked() {
80
- this.checkbox.value = 'true';
81
- this.checkbox.checked = true;
82
- this.checkbox.indeterminate = false;
83
- this.updateModelIfPresent(true);
84
- }
85
- setCheckboxIndeterminate() {
86
- this.checkbox.value = undefined;
87
- this.checkbox.indeterminate = true;
88
- this.updateModelIfPresent(undefined);
89
- }
90
- readControlValue() {
91
- if (this.ngModel) {
92
- return this.ngModel.viewModel;
93
- }
94
- else {
95
- return this.checkbox.value;
96
- }
97
- }
98
- updateModelIfPresent(val) {
99
- if (this.ngModel !== null && this.ngModel.viewModel !== val) {
100
- this.ngModel.control.setValue(val, {
101
- onlySelf: false,
102
- emitEvent: true,
103
- emitModelToViewChange: true,
104
- emitViewToModelChange: true,
105
- });
106
- }
107
- }
108
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: ElderTripleStateCheckboxDirective, deps: [{ token: i1.MatCheckbox }, { token: i2.NgModel, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
109
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.5", type: ElderTripleStateCheckboxDirective, isStandalone: true, selector: "mat-checkbox[elderTripleStateCheckbox]", ngImport: i0 }); }
110
- }
111
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: ElderTripleStateCheckboxDirective, decorators: [{
112
- type: Directive,
113
- args: [{
114
- selector: 'mat-checkbox[elderTripleStateCheckbox]',
115
- standalone: true,
116
- }]
117
- }], ctorParameters: () => [{ type: i1.MatCheckbox }, { type: i2.NgModel, decorators: [{
118
- type: Optional
119
- }] }] });
120
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkZXItdHJpcGxlLXN0YXRlLWNoZWNrYm94LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VsZGVyYnl0ZS9uZ3gtc3RhcnRlci9zcmMvbGliL2NvbXBvbmVudHMvZm9ybXMvZGlyZWN0aXZlcy9lbGRlci10cmlwbGUtc3RhdGUtY2hlY2tib3guZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7Ozs7QUFFcEQsTUFBTSxDQUFOLElBQVksa0JBSVg7QUFKRCxXQUFZLGtCQUFrQjtJQUM1QixxRUFBYSxDQUFBO0lBQ2IsaUVBQVcsQ0FBQTtJQUNYLDZFQUFpQixDQUFBO0FBQ25CLENBQUMsRUFKVyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBSTdCO0FBTUQsTUFBTSxPQUFPLGlDQUFpQztJQUc1Qzs7OztnRkFJNEU7SUFFNUUsWUFDVSxRQUFxQixFQUNULE9BQWdCO1FBRDVCLGFBQVEsR0FBUixRQUFRLENBQWE7UUFDVCxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBVnJCLFFBQUcsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUE7SUFXbEUsQ0FBQztJQUVKOzs7O2dGQUk0RTtJQUVyRSxRQUFRO1FBQ2IsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUE7UUFDNUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNoRyxDQUFDO0lBRUQ7Ozs7Z0ZBSTRFO0lBRTVFLElBQVksS0FBSztRQUNmLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUE7SUFDMUQsQ0FBQztJQUVELElBQVksS0FBSyxDQUFDLFFBQTRCO1FBQzVDLFFBQVEsUUFBUSxFQUFFLENBQUM7WUFDakIsS0FBSyxrQkFBa0IsQ0FBQyxTQUFTO2dCQUMvQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQTtnQkFDM0IsTUFBSztZQUVQLEtBQUssa0JBQWtCLENBQUMsT0FBTztnQkFDN0IsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUE7Z0JBQ3pCLE1BQUs7WUFFUCxLQUFLLGtCQUFrQixDQUFDLGFBQWE7Z0JBQ25DLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFBO2dCQUMvQixNQUFLO1FBQ1QsQ0FBQztJQUNILENBQUM7SUFFRDs7OztnRkFJNEU7SUFFcEUsbUJBQW1CLENBQUMsS0FBVTtRQUNwQyxRQUFRLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlDLEtBQUssS0FBSztnQkFDUixPQUFPLGtCQUFrQixDQUFDLFNBQVMsQ0FBQTtZQUNyQyxLQUFLLElBQUk7Z0JBQ1AsT0FBTyxrQkFBa0IsQ0FBQyxPQUFPLENBQUE7WUFDbkMsS0FBSyxTQUFTO2dCQUNaLE9BQU8sa0JBQWtCLENBQUMsYUFBYSxDQUFBO1FBQzNDLENBQUM7SUFDSCxDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDbkMsQ0FBQztJQUVPLG9CQUFvQjtRQUMxQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUE7UUFDN0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFBO1FBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQTtRQUNuQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDbEMsQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUE7UUFDNUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFBO1FBQzVCLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQTtRQUNuQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDakMsQ0FBQztJQUVPLHdCQUF3QjtRQUM5QixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUE7UUFDL0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFBO1FBQ2xDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUN0QyxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUE7UUFDL0IsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFBO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsR0FBUTtRQUNuQyxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pDLFFBQVEsRUFBRSxLQUFLO2dCQUNmLFNBQVMsRUFBRSxJQUFJO2dCQUNmLHFCQUFxQixFQUFFLElBQUk7Z0JBQzNCLHFCQUFxQixFQUFFLElBQUk7YUFDNUIsQ0FBQyxDQUFBO1FBQ0osQ0FBQztJQUNILENBQUM7OEdBOUdVLGlDQUFpQztrR0FBakMsaUNBQWlDOzsyRkFBakMsaUNBQWlDO2tCQUo3QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSx3Q0FBd0M7b0JBQ2xELFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs7MEJBWUksUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgT25Jbml0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBNYXRDaGVja2JveCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94J1xuaW1wb3J0IHsgTmdNb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJ1xuaW1wb3J0IHsgUGFyc2VVdGlsIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3V0aWxzL3BhcnNlLXV0aWwnXG5pbXBvcnQgeyBMb2dnZXJGYWN0b3J5IH0gZnJvbSAnQGVsZGVyYnl0ZS90cy1sb2dnZXInXG5cbmV4cG9ydCBlbnVtIEVsZGVyQ2hlY2tib3hTdGF0ZSB7XG4gIFVOQ0hFQ0tFRCA9IDAsXG4gIENIRUNLRUQgPSAxLFxuICBJTkRFVEVSTUlOQVRFID0gMixcbn1cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnbWF0LWNoZWNrYm94W2VsZGVyVHJpcGxlU3RhdGVDaGVja2JveF0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBFbGRlclRyaXBsZVN0YXRlQ2hlY2tib3hEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKHRoaXMuY29uc3RydWN0b3IubmFtZSlcblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogQ29uc3RydWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNoZWNrYm94OiBNYXRDaGVja2JveCxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIG5nTW9kZWw6IE5nTW9kZWxcbiAgKSB7fVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBMaWZlIEN5Y2xlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlID0gdGhpcy5zdGF0ZVxuICAgIHRoaXMuY2hlY2tib3gucmVnaXN0ZXJPbkNoYW5nZSgoKSA9PiB0aGlzLnRvZ2dsZU5leHRTdGF0ZSgpKVxuICAgIHRoaXMubmdNb2RlbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4gKHRoaXMuc3RhdGUgPSB0aGlzLmNvbnRyb2xWYWx1ZVRvU3RhdGUodmFsdWUpKSlcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQcm9wZXJ0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHByaXZhdGUgZ2V0IHN0YXRlKCk6IEVsZGVyQ2hlY2tib3hTdGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuY29udHJvbFZhbHVlVG9TdGF0ZSh0aGlzLnJlYWRDb250cm9sVmFsdWUoKSlcbiAgfVxuXG4gIHByaXZhdGUgc2V0IHN0YXRlKG5ld1N0YXRlOiBFbGRlckNoZWNrYm94U3RhdGUpIHtcbiAgICBzd2l0Y2ggKG5ld1N0YXRlKSB7XG4gICAgICBjYXNlIEVsZGVyQ2hlY2tib3hTdGF0ZS5VTkNIRUNLRUQ6XG4gICAgICAgIHRoaXMuc2V0Q2hlY2tib3hVbmNoZWNrZWQoKVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIEVsZGVyQ2hlY2tib3hTdGF0ZS5DSEVDS0VEOlxuICAgICAgICB0aGlzLnNldENoZWNrYm94Q2hlY2tlZCgpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgRWxkZXJDaGVja2JveFN0YXRlLklOREVURVJNSU5BVEU6XG4gICAgICAgIHRoaXMuc2V0Q2hlY2tib3hJbmRldGVybWluYXRlKClcbiAgICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogUHJpdmF0ZSBtZXRob2RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwcml2YXRlIGNvbnRyb2xWYWx1ZVRvU3RhdGUodmFsdWU6IGFueSk6IEVsZGVyQ2hlY2tib3hTdGF0ZSB7XG4gICAgc3dpdGNoIChQYXJzZVV0aWwucGFyc2VCb29sT3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICBjYXNlIGZhbHNlOlxuICAgICAgICByZXR1cm4gRWxkZXJDaGVja2JveFN0YXRlLlVOQ0hFQ0tFRFxuICAgICAgY2FzZSB0cnVlOlxuICAgICAgICByZXR1cm4gRWxkZXJDaGVja2JveFN0YXRlLkNIRUNLRURcbiAgICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgICByZXR1cm4gRWxkZXJDaGVja2JveFN0YXRlLklOREVURVJNSU5BVEVcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRvZ2dsZU5leHRTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlID0gKHRoaXMuc3RhdGUgKyAxKSAlIDNcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q2hlY2tib3hVbmNoZWNrZWQoKSB7XG4gICAgdGhpcy5jaGVja2JveC52YWx1ZSA9ICdmYWxzZSdcbiAgICB0aGlzLmNoZWNrYm94LmNoZWNrZWQgPSBmYWxzZVxuICAgIHRoaXMuY2hlY2tib3guaW5kZXRlcm1pbmF0ZSA9IGZhbHNlXG4gICAgdGhpcy51cGRhdGVNb2RlbElmUHJlc2VudChmYWxzZSlcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q2hlY2tib3hDaGVja2VkKCkge1xuICAgIHRoaXMuY2hlY2tib3gudmFsdWUgPSAndHJ1ZSdcbiAgICB0aGlzLmNoZWNrYm94LmNoZWNrZWQgPSB0cnVlXG4gICAgdGhpcy5jaGVja2JveC5pbmRldGVybWluYXRlID0gZmFsc2VcbiAgICB0aGlzLnVwZGF0ZU1vZGVsSWZQcmVzZW50KHRydWUpXG4gIH1cblxuICBwcml2YXRlIHNldENoZWNrYm94SW5kZXRlcm1pbmF0ZSgpIHtcbiAgICB0aGlzLmNoZWNrYm94LnZhbHVlID0gdW5kZWZpbmVkXG4gICAgdGhpcy5jaGVja2JveC5pbmRldGVybWluYXRlID0gdHJ1ZVxuICAgIHRoaXMudXBkYXRlTW9kZWxJZlByZXNlbnQodW5kZWZpbmVkKVxuICB9XG5cbiAgcHJpdmF0ZSByZWFkQ29udHJvbFZhbHVlKCk6IGFueSB7XG4gICAgaWYgKHRoaXMubmdNb2RlbCkge1xuICAgICAgcmV0dXJuIHRoaXMubmdNb2RlbC52aWV3TW9kZWxcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuY2hlY2tib3gudmFsdWVcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZU1vZGVsSWZQcmVzZW50KHZhbDogYW55KSB7XG4gICAgaWYgKHRoaXMubmdNb2RlbCAhPT0gbnVsbCAmJiB0aGlzLm5nTW9kZWwudmlld01vZGVsICE9PSB2YWwpIHtcbiAgICAgIHRoaXMubmdNb2RlbC5jb250cm9sLnNldFZhbHVlKHZhbCwge1xuICAgICAgICBvbmx5U2VsZjogZmFsc2UsXG4gICAgICAgIGVtaXRFdmVudDogdHJ1ZSxcbiAgICAgICAgZW1pdE1vZGVsVG9WaWV3Q2hhbmdlOiB0cnVlLFxuICAgICAgICBlbWl0Vmlld1RvTW9kZWxDaGFuZ2U6IHRydWUsXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuIl19