@indice/ng-components 0.2.162 → 0.2.165

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 (183) hide show
  1. package/README.md +4 -4
  2. package/_styles.css +4270 -4270
  3. package/bundles/indice-ng-components.umd.js +5000 -0
  4. package/bundles/indice-ng-components.umd.js.map +1 -0
  5. package/{esm2020/indice-ng-components.mjs → esm2015/indice-ng-components.js} +0 -0
  6. package/esm2015/lib/controls/advanced-search/advanced-search.component.js +116 -0
  7. package/esm2015/lib/controls/advanced-search/models.js +91 -0
  8. package/{esm2020/lib/controls/avatar-initials/avatar-initials.component.mjs → esm2015/lib/controls/avatar-initials/avatar-initials.component.js} +8 -5
  9. package/esm2015/lib/controls/collapsible-panel/collapsible-panel.component.js +23 -0
  10. package/esm2015/lib/controls/combobox/combobox.component.js +100 -0
  11. package/esm2015/lib/controls/date-picker/date-picker.component.js +301 -0
  12. package/esm2015/lib/controls/drop-down-menu/drop-down-menu.component.js +72 -0
  13. package/esm2015/lib/controls/kpi-tile/kpi-tile.component.js +39 -0
  14. package/esm2015/lib/controls/language-selection/language-selection.component.js +35 -0
  15. package/{esm2020/lib/controls/list-view/list-column.component.mjs → esm2015/lib/controls/list-view/list-column.component.js} +4 -4
  16. package/{esm2020/lib/controls/list-view/list-details-section.component.mjs → esm2015/lib/controls/list-view/list-details-section.component.js} +4 -4
  17. package/{esm2020/lib/controls/list-view/list-tile.component.mjs → esm2015/lib/controls/list-view/list-tile.component.js} +4 -4
  18. package/esm2015/lib/controls/list-view/list-view-empty-state.component.js +32 -0
  19. package/esm2015/lib/controls/list-view/list-view.component.js +209 -0
  20. package/esm2015/lib/controls/nav-links-list/nav-links-list.component.js +51 -0
  21. package/esm2015/lib/controls/notifications-indicator/notifications-indicator.component.js +82 -0
  22. package/esm2015/lib/controls/pager/pager.component.js +133 -0
  23. package/esm2015/lib/controls/side-pane/side-pane.component.js +76 -0
  24. package/esm2015/lib/controls/skeleton-loader/skeleton-loader.component.js +29 -0
  25. package/{esm2020/lib/controls/stepper/lib-step-info.directive.mjs → esm2015/lib/controls/stepper/lib-step-info.directive.js} +4 -4
  26. package/{esm2020/lib/controls/stepper/lib-step-label.directive.mjs → esm2015/lib/controls/stepper/lib-step-label.directive.js} +4 -4
  27. package/esm2015/lib/controls/stepper/lib-step.component.js +82 -0
  28. package/esm2015/lib/controls/stepper/lib-stepper.component.js +115 -0
  29. package/esm2015/lib/controls/stepper/types/step-selected-event.js +4 -0
  30. package/{esm2020/lib/controls/stepper/types/stepper-type.mjs → esm2015/lib/controls/stepper/types/stepper-type.js} +1 -1
  31. package/esm2015/lib/controls/tabs/lib-tab-group.component.js +67 -0
  32. package/esm2015/lib/controls/tabs/lib-tab.component.js +58 -0
  33. package/esm2015/lib/controls/toaster/toaster-container.component.js +31 -0
  34. package/esm2015/lib/controls/toaster/toaster.component.js +34 -0
  35. package/esm2015/lib/controls/toggle/toggle.component.js +68 -0
  36. package/esm2015/lib/controls/user-profile-menu/user-profile-menu.component.js +75 -0
  37. package/{esm2020/lib/directives/click-outside.directive.mjs → esm2015/lib/directives/click-outside.directive.js} +4 -4
  38. package/{esm2020/lib/directives/dynamic-component-host.directive.mjs → esm2015/lib/directives/dynamic-component-host.directive.js} +4 -4
  39. package/esm2015/lib/helpers/base-list.component.js +227 -0
  40. package/{esm2020/lib/icons.mjs → esm2015/lib/icons.js} +1 -1
  41. package/esm2015/lib/layouts/shell/shell-footer/shell-footer.component.js +22 -0
  42. package/esm2015/lib/layouts/shell/shell-header/shell-header.component.js +135 -0
  43. package/esm2015/lib/layouts/shell/shell-layout/shell-layout.component.js +106 -0
  44. package/esm2015/lib/layouts/shell/shell-sidebar/shell-sidebar.component.js +50 -0
  45. package/esm2015/lib/layouts/shell/shell-sidebar-header/shell-sidebar-header.component.js +48 -0
  46. package/esm2015/lib/layouts/shell/shell-sidebar-layout/shell-sidebar-layout.component.js +28 -0
  47. package/esm2015/lib/layouts/shell/shell-stacked-layout/shell-stacked-layout.component.js +24 -0
  48. package/esm2015/lib/layouts/views/form-layout/form-layout.component.js +85 -0
  49. package/esm2015/lib/layouts/views/model-view-layout/model-view-layout.component.js +53 -0
  50. package/esm2015/lib/layouts/views/side-view-layout/side-view-layout.component.js +101 -0
  51. package/esm2015/lib/layouts/views/view-layout/view-layout.component.js +110 -0
  52. package/{esm2020/lib/ng-components.module.mjs → esm2015/lib/ng-components.module.js} +10 -8
  53. package/esm2015/lib/pages/auth/auth-callback/auth-callback.component.js +34 -0
  54. package/{esm2020/lib/pages/auth/auth-renew/auth-renew.component.mjs → esm2015/lib/pages/auth/auth-renew/auth-renew.component.js} +4 -4
  55. package/esm2015/lib/pages/auth/logged-out/logged-out.component.js +32 -0
  56. package/esm2015/lib/pages/http-status/error/error.component.js +20 -0
  57. package/esm2015/lib/pages/http-status/page-not-found/page-not-found.component.js +18 -0
  58. package/esm2015/lib/pages/http-status/unauthorized/unauthorized.component.js +17 -0
  59. package/{esm2020/lib/pipes/address.pipe.mjs → esm2015/lib/pipes/address.pipe.js} +4 -4
  60. package/{esm2020/lib/pipes/duration-format.pipe.mjs → esm2015/lib/pipes/duration-format.pipe.js} +4 -4
  61. package/esm2015/lib/services/component-loader/component-loader-options.class.js +8 -0
  62. package/esm2015/lib/services/component-loader/component-loader.class.js +192 -0
  63. package/{esm2020/lib/services/component-loader/component-loader.factory.mjs → esm2015/lib/services/component-loader/component-loader.factory.js} +4 -4
  64. package/{esm2020/lib/services/component-loader/content-ref.class.mjs → esm2015/lib/services/component-loader/content-ref.class.js} +1 -1
  65. package/esm2015/lib/services/modal-service/modal-backdrop-component.js +44 -0
  66. package/esm2015/lib/services/modal-service/modal-container-component.js +128 -0
  67. package/esm2015/lib/services/modal-service/modal-options.class.js +35 -0
  68. package/esm2015/lib/services/modal-service/modal-service.js +220 -0
  69. package/{esm2020/lib/services/modal-service/modal-styles.class.mjs → esm2015/lib/services/modal-service/modal-styles.class.js} +1 -1
  70. package/esm2015/lib/services/modal-service/modal.class.js +27 -0
  71. package/{esm2020/lib/services/toaster.service.mjs → esm2015/lib/services/toaster.service.js} +4 -4
  72. package/{esm2020/lib/tokens.mjs → esm2015/lib/tokens.js} +1 -1
  73. package/{esm2020/lib/types.mjs → esm2015/lib/types.js} +1 -1
  74. package/{esm2020/public-api.mjs → esm2015/public-api.js} +1 -1
  75. package/fesm2015/indice-ng-components.js +4352 -0
  76. package/fesm2015/indice-ng-components.js.map +1 -0
  77. package/{index.d.ts → indice-ng-components.d.ts} +0 -0
  78. package/lib/controls/advanced-search/advanced-search.component.d.ts +1 -1
  79. package/lib/controls/avatar-initials/avatar-initials.component.d.ts +1 -1
  80. package/lib/controls/collapsible-panel/collapsible-panel.component.d.ts +1 -1
  81. package/lib/controls/combobox/combobox.component.d.ts +1 -1
  82. package/lib/controls/date-picker/date-picker.component.d.ts +1 -1
  83. package/lib/controls/drop-down-menu/drop-down-menu.component.d.ts +1 -1
  84. package/lib/controls/kpi-tile/kpi-tile.component.d.ts +1 -1
  85. package/lib/controls/language-selection/language-selection.component.d.ts +1 -1
  86. package/lib/controls/list-view/list-column.component.d.ts +1 -1
  87. package/lib/controls/list-view/list-details-section.component.d.ts +1 -1
  88. package/lib/controls/list-view/list-tile.component.d.ts +1 -1
  89. package/lib/controls/list-view/list-view-empty-state.component.d.ts +1 -1
  90. package/lib/controls/list-view/list-view.component.d.ts +1 -1
  91. package/lib/controls/nav-links-list/nav-links-list.component.d.ts +1 -1
  92. package/lib/controls/notifications-indicator/notifications-indicator.component.d.ts +1 -1
  93. package/lib/controls/pager/pager.component.d.ts +1 -1
  94. package/lib/controls/side-pane/side-pane.component.d.ts +1 -1
  95. package/lib/controls/skeleton-loader/skeleton-loader.component.d.ts +1 -1
  96. package/lib/controls/stepper/lib-step-info.directive.d.ts +1 -1
  97. package/lib/controls/stepper/lib-step-label.directive.d.ts +1 -1
  98. package/lib/controls/stepper/lib-step.component.d.ts +1 -1
  99. package/lib/controls/stepper/lib-stepper.component.d.ts +1 -1
  100. package/lib/controls/tabs/lib-tab-group.component.d.ts +1 -1
  101. package/lib/controls/tabs/lib-tab.component.d.ts +1 -1
  102. package/lib/controls/toaster/toaster-container.component.d.ts +1 -1
  103. package/lib/controls/toaster/toaster.component.d.ts +1 -1
  104. package/lib/controls/toggle/toggle.component.d.ts +1 -1
  105. package/lib/controls/user-profile-menu/user-profile-menu.component.d.ts +1 -1
  106. package/lib/directives/click-outside.directive.d.ts +1 -1
  107. package/lib/directives/dynamic-component-host.directive.d.ts +1 -1
  108. package/lib/helpers/base-list.component.d.ts +1 -1
  109. package/lib/layouts/shell/shell-footer/shell-footer.component.d.ts +1 -1
  110. package/lib/layouts/shell/shell-header/shell-header.component.d.ts +1 -1
  111. package/lib/layouts/shell/shell-layout/shell-layout.component.d.ts +1 -1
  112. package/lib/layouts/shell/shell-sidebar/shell-sidebar.component.d.ts +1 -1
  113. package/lib/layouts/shell/shell-sidebar-header/shell-sidebar-header.component.d.ts +1 -1
  114. package/lib/layouts/shell/shell-sidebar-layout/shell-sidebar-layout.component.d.ts +1 -1
  115. package/lib/layouts/shell/shell-stacked-layout/shell-stacked-layout.component.d.ts +1 -1
  116. package/lib/layouts/views/form-layout/form-layout.component.d.ts +1 -1
  117. package/lib/layouts/views/model-view-layout/model-view-layout.component.d.ts +1 -1
  118. package/lib/layouts/views/side-view-layout/side-view-layout.component.d.ts +1 -1
  119. package/lib/layouts/views/view-layout/view-layout.component.d.ts +1 -1
  120. package/lib/pages/auth/auth-callback/auth-callback.component.d.ts +1 -1
  121. package/lib/pages/auth/auth-renew/auth-renew.component.d.ts +1 -1
  122. package/lib/pages/auth/logged-out/logged-out.component.d.ts +1 -1
  123. package/lib/pages/http-status/error/error.component.d.ts +1 -1
  124. package/lib/pages/http-status/page-not-found/page-not-found.component.d.ts +1 -1
  125. package/lib/pages/http-status/unauthorized/unauthorized.component.d.ts +1 -1
  126. package/lib/pipes/address.pipe.d.ts +1 -1
  127. package/lib/pipes/duration-format.pipe.d.ts +1 -1
  128. package/lib/services/modal-service/modal-backdrop-component.d.ts +1 -1
  129. package/lib/services/modal-service/modal-container-component.d.ts +1 -1
  130. package/modal.css +157 -157
  131. package/package.json +8 -21
  132. package/esm2020/lib/controls/advanced-search/advanced-search.component.mjs +0 -112
  133. package/esm2020/lib/controls/advanced-search/models.mjs +0 -90
  134. package/esm2020/lib/controls/collapsible-panel/collapsible-panel.component.mjs +0 -20
  135. package/esm2020/lib/controls/combobox/combobox.component.mjs +0 -97
  136. package/esm2020/lib/controls/date-picker/date-picker.component.mjs +0 -292
  137. package/esm2020/lib/controls/drop-down-menu/drop-down-menu.component.mjs +0 -68
  138. package/esm2020/lib/controls/kpi-tile/kpi-tile.component.mjs +0 -36
  139. package/esm2020/lib/controls/language-selection/language-selection.component.mjs +0 -31
  140. package/esm2020/lib/controls/list-view/list-view-empty-state.component.mjs +0 -29
  141. package/esm2020/lib/controls/list-view/list-view.component.mjs +0 -206
  142. package/esm2020/lib/controls/nav-links-list/nav-links-list.component.mjs +0 -46
  143. package/esm2020/lib/controls/notifications-indicator/notifications-indicator.component.mjs +0 -77
  144. package/esm2020/lib/controls/pager/pager.component.mjs +0 -130
  145. package/esm2020/lib/controls/side-pane/side-pane.component.mjs +0 -72
  146. package/esm2020/lib/controls/skeleton-loader/skeleton-loader.component.mjs +0 -25
  147. package/esm2020/lib/controls/stepper/lib-step.component.mjs +0 -81
  148. package/esm2020/lib/controls/stepper/lib-stepper.component.mjs +0 -108
  149. package/esm2020/lib/controls/stepper/types/step-selected-event.mjs +0 -4
  150. package/esm2020/lib/controls/tabs/lib-tab-group.component.mjs +0 -60
  151. package/esm2020/lib/controls/tabs/lib-tab.component.mjs +0 -57
  152. package/esm2020/lib/controls/toaster/toaster-container.component.mjs +0 -28
  153. package/esm2020/lib/controls/toaster/toaster.component.mjs +0 -31
  154. package/esm2020/lib/controls/toggle/toggle.component.mjs +0 -64
  155. package/esm2020/lib/controls/user-profile-menu/user-profile-menu.component.mjs +0 -71
  156. package/esm2020/lib/helpers/base-list.component.mjs +0 -226
  157. package/esm2020/lib/layouts/shell/shell-footer/shell-footer.component.mjs +0 -19
  158. package/esm2020/lib/layouts/shell/shell-header/shell-header.component.mjs +0 -130
  159. package/esm2020/lib/layouts/shell/shell-layout/shell-layout.component.mjs +0 -101
  160. package/esm2020/lib/layouts/shell/shell-sidebar/shell-sidebar.component.mjs +0 -47
  161. package/esm2020/lib/layouts/shell/shell-sidebar-header/shell-sidebar-header.component.mjs +0 -45
  162. package/esm2020/lib/layouts/shell/shell-sidebar-layout/shell-sidebar-layout.component.mjs +0 -25
  163. package/esm2020/lib/layouts/shell/shell-stacked-layout/shell-stacked-layout.component.mjs +0 -21
  164. package/esm2020/lib/layouts/views/form-layout/form-layout.component.mjs +0 -80
  165. package/esm2020/lib/layouts/views/model-view-layout/model-view-layout.component.mjs +0 -49
  166. package/esm2020/lib/layouts/views/side-view-layout/side-view-layout.component.mjs +0 -98
  167. package/esm2020/lib/layouts/views/view-layout/view-layout.component.mjs +0 -104
  168. package/esm2020/lib/pages/auth/auth-callback/auth-callback.component.mjs +0 -30
  169. package/esm2020/lib/pages/auth/logged-out/logged-out.component.mjs +0 -28
  170. package/esm2020/lib/pages/http-status/error/error.component.mjs +0 -17
  171. package/esm2020/lib/pages/http-status/page-not-found/page-not-found.component.mjs +0 -15
  172. package/esm2020/lib/pages/http-status/unauthorized/unauthorized.component.mjs +0 -14
  173. package/esm2020/lib/services/component-loader/component-loader-options.class.mjs +0 -8
  174. package/esm2020/lib/services/component-loader/component-loader.class.mjs +0 -188
  175. package/esm2020/lib/services/modal-service/modal-backdrop-component.mjs +0 -44
  176. package/esm2020/lib/services/modal-service/modal-container-component.mjs +0 -126
  177. package/esm2020/lib/services/modal-service/modal-options.class.mjs +0 -35
  178. package/esm2020/lib/services/modal-service/modal-service.mjs +0 -219
  179. package/esm2020/lib/services/modal-service/modal.class.mjs +0 -27
  180. package/fesm2015/indice-ng-components.mjs +0 -4264
  181. package/fesm2015/indice-ng-components.mjs.map +0 -1
  182. package/fesm2020/indice-ng-components.mjs +0 -4191
  183. package/fesm2020/indice-ng-components.mjs.map +0 -1
package/modal.css CHANGED
@@ -1,157 +1,157 @@
1
- .modal-open {
2
- overflow: hidden;
3
- }
4
- .modal-open .modal {
5
- overflow-x: hidden;
6
- overflow-y: auto;
7
- }
8
- .modal {
9
- position: fixed;
10
- top: 0;
11
- left: 0;
12
- z-index: 1050;
13
- display: none;
14
- width: 100%;
15
- height: 100%;
16
- overflow: hidden;
17
- outline: 0;
18
- }
19
- .modal-dialog {
20
- position: relative;
21
- width: auto;
22
- margin: 0.5rem;
23
- pointer-events: none;
24
- }
25
- .modal.fade .modal-dialog {
26
- transition: transform 0.3s ease-out;
27
- transform: translate(0, -50px);
28
- }
29
-
30
- .fade {
31
- transition: opacity 0.15s linear;
32
- }
33
- .fade:not(.show) {
34
- opacity: 0;
35
- }
36
- @media (prefers-reduced-motion: reduce) {
37
- .modal.fade .modal-dialog {
38
- transition: none;
39
- }
40
- }
41
- .modal.show .modal-dialog {
42
- transform: none;
43
- }
44
- .modal.modal-static .modal-dialog {
45
- transform: scale(1.02);
46
- }
47
- .modal-dialog-scrollable {
48
- display: flex;
49
- max-height: subtract(100%, 1rem);
50
- }
51
- .modal-dialog-scrollable .modal-content {
52
- max-height: subtract(100vh, 1rem);
53
- overflow: hidden;
54
- }
55
- .modal-dialog-scrollable .modal-header,
56
- .modal-dialog-scrollable .modal-footer {
57
- flex-shrink: 0;
58
- }
59
- .modal-dialog-scrollable .modal-body {
60
- overflow-y: auto;
61
- }
62
- .modal-dialog-centered {
63
- display: flex;
64
- align-items: center;
65
- min-height: subtract(100%, 1rem);
66
- }
67
- .modal-dialog-centered::before {
68
- display: block;
69
- height: subtract(100vh, 1rem);
70
- height: -webkit-min-content;
71
- height: min-content;
72
- content: "";
73
- }
74
- .modal-dialog-centered.modal-dialog-scrollable {
75
- flex-direction: column;
76
- justify-content: center;
77
- height: 100%;
78
- }
79
- .modal-dialog-centered.modal-dialog-scrollable .modal-content {
80
- max-height: none;
81
- }
82
- .modal-dialog-centered.modal-dialog-scrollable::before {
83
- content: none;
84
- }
85
- .modal-content {
86
- position: relative;
87
- display: flex;
88
- flex-direction: column;
89
- width: 100%;
90
- pointer-events: auto;
91
- background-color: #fff;
92
- background-clip: padding-box;
93
- border: 1px solid rgba(0, 0, 0, 0.2);
94
- border-radius: 0.3rem;
95
- outline: 0;
96
- }
97
- .modal-backdrop {
98
- position: fixed;
99
- top: 0;
100
- left: 0;
101
- z-index: 1040;
102
- width: 100vw;
103
- height: 100vh;
104
- background-color: #000;
105
- }
106
- .modal-backdrop.fade {
107
- opacity: 0;
108
- }
109
- .modal-backdrop.show {
110
- opacity: 0.5;
111
- }
112
- .modal-scrollbar-measure {
113
- position: absolute;
114
- top: -9999px;
115
- width: 50px;
116
- height: 50px;
117
- overflow: scroll;
118
- }
119
- @media (min-width: 576px) {
120
- .modal-dialog {
121
- max-width: 500px;
122
- margin: 1.75rem auto;
123
- }
124
-
125
- .modal-dialog-scrollable {
126
- max-height: subtract(100%, 3.5rem);
127
- }
128
- .modal-dialog-scrollable .modal-content {
129
- max-height: subtract(100vh, 3.5rem);
130
- }
131
-
132
- .modal-dialog-centered {
133
- min-height: subtract(100%, 3.5rem);
134
- }
135
- .modal-dialog-centered::before {
136
- height: subtract(100vh, 3.5rem);
137
- height: -webkit-min-content;
138
- height: min-content;
139
- }
140
-
141
- .modal-sm {
142
- max-width: 300px;
143
- }
144
- }
145
- @media (min-width: 992px) {
146
- .modal-lg,
147
- .modal-xl {
148
- max-width: 800px;
149
- }
150
- }
151
- @media (min-width: 1200px) {
152
- .modal-xl {
153
- max-width: 1140px;
154
- }
155
- }
156
-
157
- /*# sourceMappingURL=styles.css.map*/
1
+ .modal-open {
2
+ overflow: hidden;
3
+ }
4
+ .modal-open .modal {
5
+ overflow-x: hidden;
6
+ overflow-y: auto;
7
+ }
8
+ .modal {
9
+ position: fixed;
10
+ top: 0;
11
+ left: 0;
12
+ z-index: 1050;
13
+ display: none;
14
+ width: 100%;
15
+ height: 100%;
16
+ overflow: hidden;
17
+ outline: 0;
18
+ }
19
+ .modal-dialog {
20
+ position: relative;
21
+ width: auto;
22
+ margin: 0.5rem;
23
+ pointer-events: none;
24
+ }
25
+ .modal.fade .modal-dialog {
26
+ transition: transform 0.3s ease-out;
27
+ transform: translate(0, -50px);
28
+ }
29
+
30
+ .fade {
31
+ transition: opacity 0.15s linear;
32
+ }
33
+ .fade:not(.show) {
34
+ opacity: 0;
35
+ }
36
+ @media (prefers-reduced-motion: reduce) {
37
+ .modal.fade .modal-dialog {
38
+ transition: none;
39
+ }
40
+ }
41
+ .modal.show .modal-dialog {
42
+ transform: none;
43
+ }
44
+ .modal.modal-static .modal-dialog {
45
+ transform: scale(1.02);
46
+ }
47
+ .modal-dialog-scrollable {
48
+ display: flex;
49
+ max-height: subtract(100%, 1rem);
50
+ }
51
+ .modal-dialog-scrollable .modal-content {
52
+ max-height: subtract(100vh, 1rem);
53
+ overflow: hidden;
54
+ }
55
+ .modal-dialog-scrollable .modal-header,
56
+ .modal-dialog-scrollable .modal-footer {
57
+ flex-shrink: 0;
58
+ }
59
+ .modal-dialog-scrollable .modal-body {
60
+ overflow-y: auto;
61
+ }
62
+ .modal-dialog-centered {
63
+ display: flex;
64
+ align-items: center;
65
+ min-height: subtract(100%, 1rem);
66
+ }
67
+ .modal-dialog-centered::before {
68
+ display: block;
69
+ height: subtract(100vh, 1rem);
70
+ height: -webkit-min-content;
71
+ height: min-content;
72
+ content: "";
73
+ }
74
+ .modal-dialog-centered.modal-dialog-scrollable {
75
+ flex-direction: column;
76
+ justify-content: center;
77
+ height: 100%;
78
+ }
79
+ .modal-dialog-centered.modal-dialog-scrollable .modal-content {
80
+ max-height: none;
81
+ }
82
+ .modal-dialog-centered.modal-dialog-scrollable::before {
83
+ content: none;
84
+ }
85
+ .modal-content {
86
+ position: relative;
87
+ display: flex;
88
+ flex-direction: column;
89
+ width: 100%;
90
+ pointer-events: auto;
91
+ background-color: #fff;
92
+ background-clip: padding-box;
93
+ border: 1px solid rgba(0, 0, 0, 0.2);
94
+ border-radius: 0.3rem;
95
+ outline: 0;
96
+ }
97
+ .modal-backdrop {
98
+ position: fixed;
99
+ top: 0;
100
+ left: 0;
101
+ z-index: 1040;
102
+ width: 100vw;
103
+ height: 100vh;
104
+ background-color: #000;
105
+ }
106
+ .modal-backdrop.fade {
107
+ opacity: 0;
108
+ }
109
+ .modal-backdrop.show {
110
+ opacity: 0.5;
111
+ }
112
+ .modal-scrollbar-measure {
113
+ position: absolute;
114
+ top: -9999px;
115
+ width: 50px;
116
+ height: 50px;
117
+ overflow: scroll;
118
+ }
119
+ @media (min-width: 576px) {
120
+ .modal-dialog {
121
+ max-width: 500px;
122
+ margin: 1.75rem auto;
123
+ }
124
+
125
+ .modal-dialog-scrollable {
126
+ max-height: subtract(100%, 3.5rem);
127
+ }
128
+ .modal-dialog-scrollable .modal-content {
129
+ max-height: subtract(100vh, 3.5rem);
130
+ }
131
+
132
+ .modal-dialog-centered {
133
+ min-height: subtract(100%, 3.5rem);
134
+ }
135
+ .modal-dialog-centered::before {
136
+ height: subtract(100vh, 3.5rem);
137
+ height: -webkit-min-content;
138
+ height: min-content;
139
+ }
140
+
141
+ .modal-sm {
142
+ max-width: 300px;
143
+ }
144
+ }
145
+ @media (min-width: 992px) {
146
+ .modal-lg,
147
+ .modal-xl {
148
+ max-width: 800px;
149
+ }
150
+ }
151
+ @media (min-width: 1200px) {
152
+ .modal-xl {
153
+ max-width: 1140px;
154
+ }
155
+ }
156
+
157
+ /*# sourceMappingURL=styles.css.map*/
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@indice/ng-components",
3
- "version": "0.2.162",
3
+ "version": "0.2.165",
4
4
  "description": "Indice common components for Angular v12",
5
5
  "repository": {
6
6
  "type": "git",
@@ -30,27 +30,14 @@
30
30
  "tailwindcss": ">=2.1.2",
31
31
  "uuid": "8.3.2"
32
32
  },
33
- "module": "fesm2015/indice-ng-components.mjs",
34
- "es2020": "fesm2020/indice-ng-components.mjs",
35
- "esm2020": "esm2020/indice-ng-components.mjs",
36
- "fesm2020": "fesm2020/indice-ng-components.mjs",
37
- "fesm2015": "fesm2015/indice-ng-components.mjs",
38
- "typings": "index.d.ts",
39
- "exports": {
40
- "./package.json": {
41
- "default": "./package.json"
42
- },
43
- ".": {
44
- "types": "./index.d.ts",
45
- "esm2020": "./esm2020/indice-ng-components.mjs",
46
- "es2020": "./fesm2020/indice-ng-components.mjs",
47
- "es2015": "./fesm2015/indice-ng-components.mjs",
48
- "node": "./fesm2015/indice-ng-components.mjs",
49
- "default": "./fesm2020/indice-ng-components.mjs"
50
- }
51
- },
33
+ "main": "bundles/indice-ng-components.umd.js",
34
+ "module": "fesm2015/indice-ng-components.js",
35
+ "es2015": "fesm2015/indice-ng-components.js",
36
+ "esm2015": "esm2015/indice-ng-components.js",
37
+ "fesm2015": "fesm2015/indice-ng-components.js",
38
+ "typings": "indice-ng-components.d.ts",
52
39
  "sideEffects": false,
53
40
  "dependencies": {
54
- "tslib": "^2.3.0"
41
+ "tslib": "^2.2.0"
55
42
  }
56
43
  }
@@ -1,112 +0,0 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import { FilterClause, QueryParameters, Operators } from './models';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/common";
5
- import * as i2 from "@angular/forms";
6
- import * as i3 from "../drop-down-menu/drop-down-menu.component";
7
- import * as i4 from "../date-picker/date-picker.component";
8
- export class AdvancedSearchComponent {
9
- constructor() {
10
- this.advancedSearchChanged = new EventEmitter();
11
- this.searchOptions = [];
12
- this.filters = [];
13
- this.menuOptions = [];
14
- this.menuOptionsDictionary = {};
15
- }
16
- ngOnInit() {
17
- this.searchOptions.forEach((searchOption) => {
18
- this.menuOptions.push({
19
- text: searchOption.name,
20
- value: searchOption.field,
21
- data: searchOption.dataType,
22
- description: searchOption.placeholder,
23
- icon: undefined
24
- });
25
- if (searchOption.dataType === 'array') {
26
- let menuOpts = [];
27
- searchOption.options?.forEach((selectInputOption) => {
28
- menuOpts.push({
29
- text: selectInputOption.label,
30
- value: selectInputOption.value,
31
- data: undefined,
32
- description: selectInputOption.description,
33
- icon: undefined
34
- });
35
- });
36
- this.menuOptionsDictionary[searchOption.field] = menuOpts;
37
- }
38
- });
39
- }
40
- selectedFieldChanged(field) {
41
- this.selectedField = this.searchOptions.find((searchOption) => searchOption.field === field);
42
- this.fieldValue = undefined;
43
- }
44
- selectedFieldValueChanged(fieldValue) {
45
- this.fieldValue = fieldValue;
46
- }
47
- search() {
48
- if (!this.selectedField || !this.selectedField.dataType) {
49
- return;
50
- }
51
- // the filter is of type 'daterange'
52
- if (this.selectedField.dataType === 'daterange') {
53
- if (!this.selectedField.multiTerm) {
54
- this.filters = this.filters.filter((f) => {
55
- return f.member !== QueryParameters.FILTER_FROM && f.member !== QueryParameters.FILTER_TO;
56
- });
57
- }
58
- if (this.fieldValueDateFrom) {
59
- const filterClauseFrom = new FilterClause(QueryParameters.FILTER_FROM, this.fieldValueDateFrom, Operators.GREATER_THAN_EQUAL.value, 'datetime', this.searchOptions);
60
- this.filters.push(filterClauseFrom);
61
- }
62
- if (this.fieldValueDateTo) {
63
- const filterClauseTo = new FilterClause(QueryParameters.FILTER_TO, this.fieldValueDateTo, Operators.LESS_THAN_EQUAL.value, 'datetime', this.searchOptions);
64
- this.filters.push(filterClauseTo);
65
- }
66
- }
67
- // the filter isn't of type 'daterange' (everything else)
68
- else {
69
- if (this.fieldValue === undefined) { // handle empty field value
70
- return;
71
- }
72
- // create the filterClause
73
- const filterClause = new FilterClause(this.selectedField.field, this.fieldValue, Operators.EQUALS.value, this.selectedField.dataType, this.searchOptions); // operator is always 'equals'...
74
- if (!this.selectedField.multiTerm) { // multiTerm means that we can have multiple filter values of the SAME filter clause (eg "filter case types that are Phone OR Address")
75
- this.filters = this.filters.filter((f) => {
76
- return f.member !== this.selectedField.field;
77
- });
78
- }
79
- this.filters.push(filterClause);
80
- this.fieldValue = undefined;
81
- }
82
- this.advancedSearchChanged.emit(this.filters);
83
- }
84
- removeFilter(index) {
85
- if (this.filters && this.filters.length >= index) {
86
- this.filters.splice(index, 1);
87
- this.advancedSearchChanged.emit(this.filters);
88
- }
89
- }
90
- clear() {
91
- this.fieldValueDateFrom = undefined;
92
- this.fieldValueDateTo = undefined;
93
- this.selectedField = undefined;
94
- this.fieldValue = undefined;
95
- this.filters = [];
96
- this.advancedSearchChanged.emit(this.filters);
97
- }
98
- }
99
- AdvancedSearchComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: AdvancedSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
100
- AdvancedSearchComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.0", type: AdvancedSearchComponent, selector: "lib-advanced-search", inputs: { searchOptions: ["search-options", "searchOptions"], filters: "filters" }, outputs: { advancedSearchChanged: "advancedSearchChanged" }, ngImport: i0, template: "<div class=\"advanced-search-container\">\n <div class=\"advanced-search-filter\">\n <!--SEARCH FIELDS-->\n <div class=\"advanced-search-filter-field-container\">\n <label class=\"advanced-search-filter-field-label\"\n for=\"selectedField\">\n \u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03B1\u03BD\u03AC:\n </label>\n <lib-drop-down-menu [options]=\"menuOptions\"\n (selectedChanged)=\"selectedFieldChanged($event)\"></lib-drop-down-menu>\n </div>\n <!--SEARCH FIELDS INPUT-->\n <div *ngIf=\"selectedField\"\n class=\"advanced-search-filter-value-container\">\n <div *ngIf=\"selectedField.dataType === 'array'\">\n <label class=\"advanced-search-filter-value-label\"\n for=\"fieldValue\">\n &nbsp;\n </label>\n <lib-drop-down-menu [options]=\"menuOptionsDictionary[selectedField.field]\"\n [selected]=\"fieldValue\"\n (selectedChanged)=\"selectedFieldValueChanged($event)\"></lib-drop-down-menu>\n </div>\n <div *ngIf=\"selectedField.dataType === 'string'\">\n <label class=\"advanced-search-filter-value-label\"\n for=\"fieldValue\">\n &nbsp;\n </label>\n <input (keyup.enter)=\"search()\"\n [(ngModel)]=\"fieldValue\"\n name=\"fieldValue\"\n type=\"text\"\n placeholder=\"\u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7\"\n maxlength=\"300\"\n class=\"advanced-search-filter-value-input\">\n </div>\n <ng-container *ngIf=\"selectedField.dataType === 'daterange'\">\n <div>\n <span class=\"advanced-search-filter-value-input-daterange-from\">\n \u0391\u03C0\u03CC:\n </span>\n <lib-date-picker [maxDate]=\"fieldValueDateTo\"\n [(ngModel)]=\"fieldValueDateFrom\"\n [placeholder]=\"'01/01/2022'\"></lib-date-picker>\n </div>\n <div *ngIf=\"selectedField.dataType === 'daterange'\">\n <span class=\"advanced-search-filter-value-input-daterange-to\">\n \u0388\u03C9\u03C2:\n </span>\n <lib-date-picker [minDate]=\"fieldValueDateFrom\"\n [(ngModel)]=\"fieldValueDateTo\"\n [placeholder]=\"'01/01/2022'\"></lib-date-picker>\n </div>\n </ng-container>\n </div>\n <ng-container *ngIf=\"selectedField\">\n <!--DO SEARCH-->\n <button type=\"button\"\n [ngClass]=\"{'opacity-50 cursor-not-allowed': fieldValue === undefined && fieldValueDateFrom === undefined && fieldValueDateTo === undefined}\"\n [disabled]=\"fieldValue === undefined && fieldValueDateFrom === undefined && fieldValueDateTo === undefined\"\n (click)=\"search()\">\n <i [class]=\"'ms-Icon ms-Icon--Search'\"></i>\n </button>\n <!--CLEAR-->\n <button type=\"button\"\n (click)=\"clear()\">\n <i [class]=\"'ms-Icon ms-Icon--Cancel'\"></i>\n </button>\n </ng-container>\n </div>\n <!--FILTER CHIPS-->\n <!-- This example requires Tailwind CSS v2.0+ -->\n <ng-container *ngFor=\"let filter of filters; let i = index\">\n <span *ngIf=\"filter && filter.member\"\n class=\"advanced-search-chips\">\n {{ filter.uiName }} {{ filter.uiOperator }} '{{ filter.uiValue }}'\n <button (click)=\"removeFilter(i)\"\n type=\"button\"\n class=\"advanced-search-chips-remove-filter\">\n <span class=\"sr-only\">Remove large option</span>\n <svg class=\"h-2 w-2\"\n stroke=\"currentColor\"\n fill=\"none\"\n viewBox=\"0 0 8 8\">\n <path stroke-linecap=\"round\"\n stroke-width=\"1.5\"\n d=\"M1 1l6 6m0-6L1 7\" />\n </svg>\n </button>\n </span>\n </ng-container>\n</div>", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.DropDownMenuComponent, selector: "lib-drop-down-menu", inputs: ["options", "selected", "multiple", "placeholder"], outputs: ["selectedChange", "selectedChanged"] }, { kind: "component", type: i4.DatepickerComponent, selector: "lib-date-picker", inputs: ["readonly", "disabled", "inline", "display-format", "placeholder", "value", "minDate", "maxDate"], outputs: ["valueChange"] }] });
101
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.0", ngImport: i0, type: AdvancedSearchComponent, decorators: [{
102
- type: Component,
103
- args: [{ selector: 'lib-advanced-search', template: "<div class=\"advanced-search-container\">\n <div class=\"advanced-search-filter\">\n <!--SEARCH FIELDS-->\n <div class=\"advanced-search-filter-field-container\">\n <label class=\"advanced-search-filter-field-label\"\n for=\"selectedField\">\n \u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7 \u03B1\u03BD\u03AC:\n </label>\n <lib-drop-down-menu [options]=\"menuOptions\"\n (selectedChanged)=\"selectedFieldChanged($event)\"></lib-drop-down-menu>\n </div>\n <!--SEARCH FIELDS INPUT-->\n <div *ngIf=\"selectedField\"\n class=\"advanced-search-filter-value-container\">\n <div *ngIf=\"selectedField.dataType === 'array'\">\n <label class=\"advanced-search-filter-value-label\"\n for=\"fieldValue\">\n &nbsp;\n </label>\n <lib-drop-down-menu [options]=\"menuOptionsDictionary[selectedField.field]\"\n [selected]=\"fieldValue\"\n (selectedChanged)=\"selectedFieldValueChanged($event)\"></lib-drop-down-menu>\n </div>\n <div *ngIf=\"selectedField.dataType === 'string'\">\n <label class=\"advanced-search-filter-value-label\"\n for=\"fieldValue\">\n &nbsp;\n </label>\n <input (keyup.enter)=\"search()\"\n [(ngModel)]=\"fieldValue\"\n name=\"fieldValue\"\n type=\"text\"\n placeholder=\"\u0391\u03BD\u03B1\u03B6\u03AE\u03C4\u03B7\u03C3\u03B7\"\n maxlength=\"300\"\n class=\"advanced-search-filter-value-input\">\n </div>\n <ng-container *ngIf=\"selectedField.dataType === 'daterange'\">\n <div>\n <span class=\"advanced-search-filter-value-input-daterange-from\">\n \u0391\u03C0\u03CC:\n </span>\n <lib-date-picker [maxDate]=\"fieldValueDateTo\"\n [(ngModel)]=\"fieldValueDateFrom\"\n [placeholder]=\"'01/01/2022'\"></lib-date-picker>\n </div>\n <div *ngIf=\"selectedField.dataType === 'daterange'\">\n <span class=\"advanced-search-filter-value-input-daterange-to\">\n \u0388\u03C9\u03C2:\n </span>\n <lib-date-picker [minDate]=\"fieldValueDateFrom\"\n [(ngModel)]=\"fieldValueDateTo\"\n [placeholder]=\"'01/01/2022'\"></lib-date-picker>\n </div>\n </ng-container>\n </div>\n <ng-container *ngIf=\"selectedField\">\n <!--DO SEARCH-->\n <button type=\"button\"\n [ngClass]=\"{'opacity-50 cursor-not-allowed': fieldValue === undefined && fieldValueDateFrom === undefined && fieldValueDateTo === undefined}\"\n [disabled]=\"fieldValue === undefined && fieldValueDateFrom === undefined && fieldValueDateTo === undefined\"\n (click)=\"search()\">\n <i [class]=\"'ms-Icon ms-Icon--Search'\"></i>\n </button>\n <!--CLEAR-->\n <button type=\"button\"\n (click)=\"clear()\">\n <i [class]=\"'ms-Icon ms-Icon--Cancel'\"></i>\n </button>\n </ng-container>\n </div>\n <!--FILTER CHIPS-->\n <!-- This example requires Tailwind CSS v2.0+ -->\n <ng-container *ngFor=\"let filter of filters; let i = index\">\n <span *ngIf=\"filter && filter.member\"\n class=\"advanced-search-chips\">\n {{ filter.uiName }} {{ filter.uiOperator }} '{{ filter.uiValue }}'\n <button (click)=\"removeFilter(i)\"\n type=\"button\"\n class=\"advanced-search-chips-remove-filter\">\n <span class=\"sr-only\">Remove large option</span>\n <svg class=\"h-2 w-2\"\n stroke=\"currentColor\"\n fill=\"none\"\n viewBox=\"0 0 8 8\">\n <path stroke-linecap=\"round\"\n stroke-width=\"1.5\"\n d=\"M1 1l6 6m0-6L1 7\" />\n </svg>\n </button>\n </span>\n </ng-container>\n</div>" }]
104
- }], ctorParameters: function () { return []; }, propDecorators: { advancedSearchChanged: [{
105
- type: Output
106
- }], searchOptions: [{
107
- type: Input,
108
- args: ['search-options']
109
- }], filters: [{
110
- type: Input
111
- }] } });
112
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtc2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9hZHZhbmNlZC1zZWFyY2gvYWR2YW5jZWQtc2VhcmNoLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWNvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9hZHZhbmNlZC1zZWFyY2gvYWR2YW5jZWQtc2VhcmNoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0UsT0FBTyxFQUFnQixZQUFZLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxNQUFNLFVBQVUsQ0FBQzs7Ozs7O0FBTWxGLE1BQU0sT0FBTyx1QkFBdUI7SUFXbEM7UUFWVSwwQkFBcUIsR0FBaUMsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFDMUUsa0JBQWEsR0FBbUIsRUFBRSxDQUFDO1FBQ25ELFlBQU8sR0FBbUIsRUFBRSxDQUFDO1FBQy9CLGdCQUFXLEdBQWlCLEVBQUUsQ0FBQztRQUsvQiwwQkFBcUIsR0FBb0MsRUFBRSxDQUFDO0lBRW5ELENBQUM7SUFFVixRQUFRO1FBQ2IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUMxQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztnQkFDcEIsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJO2dCQUN2QixLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUs7Z0JBQ3pCLElBQUksRUFBRSxZQUFZLENBQUMsUUFBUTtnQkFDM0IsV0FBVyxFQUFFLFlBQVksQ0FBQyxXQUFXO2dCQUNyQyxJQUFJLEVBQUUsU0FBUzthQUNoQixD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QUFxQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEQsQ0FBQzs7b0hBdEdVLHVCQUF1Qjt3R0FBdkIsdUJBQXVCLDRNQ1JwQyxxakpBMkZNOzJGRG5GTyx1QkFBdUI7a0JBSm5DLFNBQVM7K0JBQ0UscUJBQXFCOzBFQUlyQixxQkFBcUI7c0JBQTlCLE1BQU07Z0JBQ2tCLGFBQWE7c0JBQXJDLEtBQUs7dUJBQUMsZ0JBQWdCO2dCQUNkLE9BQU87c0JBQWYsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1lbnVPcHRpb24gfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBTZWFyY2hPcHRpb24sIEZpbHRlckNsYXVzZSwgUXVlcnlQYXJhbWV0ZXJzLCBPcGVyYXRvcnMgfSBmcm9tICcuL21vZGVscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1hZHZhbmNlZC1zZWFyY2gnLFxuICB0ZW1wbGF0ZVVybDogJy4vYWR2YW5jZWQtc2VhcmNoLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBBZHZhbmNlZFNlYXJjaENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBPdXRwdXQoKSBhZHZhbmNlZFNlYXJjaENoYW5nZWQ6IEV2ZW50RW1pdHRlcjxGaWx0ZXJDbGF1c2VbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPEZpbHRlckNsYXVzZVtdPigpO1xuICBASW5wdXQoJ3NlYXJjaC1vcHRpb25zJykgc2VhcmNoT3B0aW9uczogU2VhcmNoT3B0aW9uW10gPSBbXTtcbiAgQElucHV0KCkgZmlsdGVyczogRmlsdGVyQ2xhdXNlW10gPSBbXTtcbiAgcHVibGljIG1lbnVPcHRpb25zOiBNZW51T3B0aW9uW10gPSBbXTtcbiAgcHVibGljIHNlbGVjdGVkRmllbGQ/OiBTZWFyY2hPcHRpb247XG4gIHB1YmxpYyBmaWVsZFZhbHVlPzogc3RyaW5nO1xuICBwdWJsaWMgZmllbGRWYWx1ZURhdGVGcm9tOiBhbnk7XG4gIHB1YmxpYyBmaWVsZFZhbHVlRGF0ZVRvOiBhbnk7XG4gIHB1YmxpYyBtZW51T3B0aW9uc0RpY3Rpb25hcnk6IHsgW2tleTogc3RyaW5nXTogTWVudU9wdGlvbltdIH0gPSB7fTtcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaE9wdGlvbnMuZm9yRWFjaCgoc2VhcmNoT3B0aW9uKSA9PiB7XG4gICAgICB0aGlzLm1lbnVPcHRpb25zLnB1c2goe1xuICAgICAgICB0ZXh0OiBzZWFyY2hPcHRpb24ubmFtZSxcbiAgICAgICAgdmFsdWU6IHNlYXJjaE9wdGlvbi5maWVsZCxcbiAgICAgICAgZGF0YTogc2VhcmNoT3B0aW9uLmRhdGFUeXBlLFxuICAgICAgICBkZXNjcmlwdGlvbjogc2VhcmNoT3B0aW9uLnBsYWNlaG9sZGVyLFxuICAgICAgICBpY29uOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuICAgICAgaWYgKHNlYXJjaE9wdGlvbi5kYXRhVHlwZSA9PT0gJ2FycmF5Jykge1xuICAgICAgICBsZXQgbWVudU9wdHM6IE1lbnVPcHRpb25bXSA9IFtdO1xuICAgICAgICBzZWFyY2hPcHRpb24ub3B0aW9ucz8uZm9yRWFjaCgoc2VsZWN0SW5wdXRPcHRpb24pID0+IHtcbiAgICAgICAgICBtZW51T3B0cy5wdXNoKHtcbiAgICAgICAgICAgIHRleHQ6IHNlbGVjdElucHV0T3B0aW9uLmxhYmVsLFxuICAgICAgICAgICAgdmFsdWU6IHNlbGVjdElucHV0T3B0aW9uLnZhbHVlLFxuICAgICAgICAgICAgZGF0YTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHNlbGVjdElucHV0T3B0aW9uLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgaWNvbjogdW5kZWZpbmVkXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMubWVudU9wdGlvbnNEaWN0aW9uYXJ5W3NlYXJjaE9wdGlvbi5maWVsZF0gPSBtZW51T3B0cztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RlZEZpZWxkQ2hhbmdlZChmaWVsZDogc3RyaW5nKSB7XG4gICAgdGhpcy5zZWxlY3RlZEZpZWxkID0gdGhpcy5zZWFyY2hPcHRpb25zLmZpbmQoKHNlYXJjaE9wdGlvbikgPT4gc2VhcmNoT3B0aW9uLmZpZWxkID09PSBmaWVsZCk7XG4gICAgdGhpcy5maWVsZFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdGVkRmllbGRWYWx1ZUNoYW5nZWQoZmllbGRWYWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5maWVsZFZhbHVlID0gZmllbGRWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZWFyY2goKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkRmllbGQgfHwgIXRoaXMuc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyB0aGUgZmlsdGVyIGlzIG9mIHR5cGUgJ2RhdGVyYW5nZSdcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZpZWxkLmRhdGFUeXBlID09PSAnZGF0ZXJhbmdlJykge1xuICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkRmllbGQubXVsdGlUZXJtKSB7XG4gICAgICAgIHRoaXMuZmlsdGVycyA9IHRoaXMuZmlsdGVycy5maWx0ZXIoKGYpID0+IHtcbiAgICAgICAgICByZXR1cm4gZi5tZW1iZXIgIT09IFF1ZXJ5UGFyYW1ldGVycy5GSUxURVJfRlJPTSAmJiBmLm1lbWJlciAhPT0gUXVlcnlQYXJhbWV0ZXJzLkZJTFRFUl9UTztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5maWVsZFZhbHVlRGF0ZUZyb20pIHtcbiAgICAgICAgY29uc3QgZmlsdGVyQ2xhdXNlRnJvbSA9IG5ldyBGaWx0ZXJDbGF1c2UoUXVlcnlQYXJhbWV0ZXJzLkZJTFRFUl9GUk9NLCB0aGlzLmZpZWxkVmFsdWVEYXRlRnJvbSwgT3BlcmF0b3JzLkdSRUFURVJfVEhBTl9FUVVBTC52YWx1ZSBhcyBGaWx0ZXJDbGF1c2UuT3AsICdkYXRldGltZScsIHRoaXMuc2VhcmNoT3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZmlsdGVycy5wdXNoKGZpbHRlckNsYXVzZUZyb20pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5maWVsZFZhbHVlRGF0ZVRvKSB7XG4gICAgICAgIGNvbnN0IGZpbHRlckNsYXVzZVRvID0gbmV3IEZpbHRlckNsYXVzZShRdWVyeVBhcmFtZXRlcnMuRklMVEVSX1RPLCB0aGlzLmZpZWxkVmFsdWVEYXRlVG8sIE9wZXJhdG9ycy5MRVNTX1RIQU5fRVFVQUwudmFsdWUgYXMgRmlsdGVyQ2xhdXNlLk9wLCAnZGF0ZXRpbWUnLCB0aGlzLnNlYXJjaE9wdGlvbnMpO1xuICAgICAgICB0aGlzLmZpbHRlcnMucHVzaChmaWx0ZXJDbGF1c2VUbyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHRoZSBmaWx0ZXIgaXNuJ3Qgb2YgdHlwZSAnZGF0ZXJhbmdlJyAoZXZlcnl0aGluZyBlbHNlKVxuICAgIGVsc2Uge1xuICAgICAgaWYgKHRoaXMuZmllbGRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7IC8vIGhhbmRsZSBlbXB0eSBmaWVsZCB2YWx1ZVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBjcmVhdGUgdGhlIGZpbHRlckNsYXVzZVxuICAgICAgY29uc3QgZmlsdGVyQ2xhdXNlID0gbmV3IEZpbHRlckNsYXVzZSh0aGlzLnNlbGVjdGVkRmllbGQuZmllbGQsIHRoaXMuZmllbGRWYWx1ZSwgT3BlcmF0b3JzLkVRVUFMUy52YWx1ZSBhcyBGaWx0ZXJDbGF1c2UuT3AsIHRoaXMuc2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSwgdGhpcy5zZWFyY2hPcHRpb25zKTsgLy8gb3BlcmF0b3IgaXMgYWx3YXlzICdlcXVhbHMnLi4uXG5cbiAgICAgIGlmICghdGhpcy5zZWxlY3RlZEZpZWxkLm11bHRpVGVybSkgeyAvLyBtdWx0aVRlcm0gbWVhbnMgdGhhdCB3ZSBjYW4gaGF2ZSBtdWx0aXBsZSBmaWx0ZXIgdmFsdWVzIG9mIHRoZSBTQU1FIGZpbHRlciBjbGF1c2UgKGVnIFwiZmlsdGVyIGNhc2UgdHlwZXMgdGhhdCBhcmUgUGhvbmUgT1IgQWRkcmVzc1wiKVxuICAgICAgICB0aGlzLmZpbHRlcnMgPSB0aGlzLmZpbHRlcnMuZmlsdGVyKChmKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGYubWVtYmVyICE9PSB0aGlzLnNlbGVjdGVkRmllbGQhLmZpZWxkO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5maWx0ZXJzLnB1c2goZmlsdGVyQ2xhdXNlKTtcbiAgICAgIHRoaXMuZmllbGRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5hZHZhbmNlZFNlYXJjaENoYW5nZWQuZW1pdCh0aGlzLmZpbHRlcnMpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUZpbHRlcihpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZmlsdGVycyAmJiB0aGlzLmZpbHRlcnMubGVuZ3RoID49IGluZGV4KSB7XG4gICAgICB0aGlzLmZpbHRlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHRoaXMuYWR2YW5jZWRTZWFyY2hDaGFuZ2VkLmVtaXQodGhpcy5maWx0ZXJzKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgdGhpcy5maWVsZFZhbHVlRGF0ZUZyb20gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5maWVsZFZhbHVlRGF0ZVRvID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc2VsZWN0ZWRGaWVsZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmZpZWxkVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5maWx0ZXJzID0gW107XG4gICAgdGhpcy5hZHZhbmNlZFNlYXJjaENoYW5nZWQuZW1pdCh0aGlzLmZpbHRlcnMpO1xuICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJhZHZhbmNlZC1zZWFyY2gtY29udGFpbmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImFkdmFuY2VkLXNlYXJjaC1maWx0ZXJcIj5cbiAgICAgICAgPCEtLVNFQVJDSCBGSUVMRFMtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFkdmFuY2VkLXNlYXJjaC1maWx0ZXItZmllbGQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhZHZhbmNlZC1zZWFyY2gtZmlsdGVyLWZpZWxkLWxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICBmb3I9XCJzZWxlY3RlZEZpZWxkXCI+XG4gICAgICAgICAgICAgICAgzpHOvc6xzrbOrs+EzrfPg863IM6xzr3OrDpcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGliLWRyb3AtZG93bi1tZW51IFtvcHRpb25zXT1cIm1lbnVPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkQ2hhbmdlZCk9XCJzZWxlY3RlZEZpZWxkQ2hhbmdlZCgkZXZlbnQpXCI+PC9saWItZHJvcC1kb3duLW1lbnU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tU0VBUkNIIEZJRUxEUyBJTlBVVC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2VsZWN0ZWRGaWVsZFwiXG4gICAgICAgICAgICAgY2xhc3M9XCJhZHZhbmNlZC1zZWFyY2gtZmlsdGVyLXZhbHVlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkRmllbGQuZGF0YVR5cGUgPT09ICdhcnJheSdcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJhZHZhbmNlZC1zZWFyY2gtZmlsdGVyLXZhbHVlLWxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgZm9yPVwiZmllbGRWYWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAmbmJzcDtcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxsaWItZHJvcC1kb3duLW1lbnUgW29wdGlvbnNdPVwibWVudU9wdGlvbnNEaWN0aW9uYXJ5W3NlbGVjdGVkRmllbGQuZmllbGRdXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJmaWVsZFZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZENoYW5nZWQpPVwic2VsZWN0ZWRGaWVsZFZhbHVlQ2hhbmdlZCgkZXZlbnQpXCI+PC9saWItZHJvcC1kb3duLW1lbnU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzZWxlY3RlZEZpZWxkLmRhdGFUeXBlID09PSAnc3RyaW5nJ1wiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImFkdmFuY2VkLXNlYXJjaC1maWx0ZXItdmFsdWUtbGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICBmb3I9XCJmaWVsZFZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICZuYnNwO1xuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IChrZXl1cC5lbnRlcik9XCJzZWFyY2goKVwiXG4gICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmllbGRWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJmaWVsZFZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIs6Rzr3Osc62zq7PhM63z4POt1wiXG4gICAgICAgICAgICAgICAgICAgICAgIG1heGxlbmd0aD1cIjMwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWR2YW5jZWQtc2VhcmNoLWZpbHRlci12YWx1ZS1pbnB1dFwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRGaWVsZC5kYXRhVHlwZSA9PT0gJ2RhdGVyYW5nZSdcIj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFkdmFuY2VkLXNlYXJjaC1maWx0ZXItdmFsdWUtaW5wdXQtZGF0ZXJhbmdlLWZyb21cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIM6Rz4DPjDpcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWRhdGUtcGlja2VyIFttYXhEYXRlXT1cImZpZWxkVmFsdWVEYXRlVG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmllbGRWYWx1ZURhdGVGcm9tXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJzAxLzAxLzIwMjInXCI+PC9saWItZGF0ZS1waWNrZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNlbGVjdGVkRmllbGQuZGF0YVR5cGUgPT09ICdkYXRlcmFuZ2UnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWR2YW5jZWQtc2VhcmNoLWZpbHRlci12YWx1ZS1pbnB1dC1kYXRlcmFuZ2UtdG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIM6Iz4nPgjpcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8bGliLWRhdGUtcGlja2VyIFttaW5EYXRlXT1cImZpZWxkVmFsdWVEYXRlRnJvbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmaWVsZFZhbHVlRGF0ZVRvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJzAxLzAxLzIwMjInXCI+PC9saWItZGF0ZS1waWNrZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZEZpZWxkXCI+XG4gICAgICAgICAgICA8IS0tRE8gU0VBUkNILS0+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J29wYWNpdHktNTAgY3Vyc29yLW5vdC1hbGxvd2VkJzogZmllbGRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIGZpZWxkVmFsdWVEYXRlRnJvbSA9PT0gdW5kZWZpbmVkICYmIGZpZWxkVmFsdWVEYXRlVG8gPT09IHVuZGVmaW5lZH1cIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZmllbGRWYWx1ZSA9PT0gdW5kZWZpbmVkICYmIGZpZWxkVmFsdWVEYXRlRnJvbSA9PT0gdW5kZWZpbmVkICYmIGZpZWxkVmFsdWVEYXRlVG8gPT09IHVuZGVmaW5lZFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWFyY2goKVwiPlxuICAgICAgICAgICAgICAgIDxpIFtjbGFzc109XCInbXMtSWNvbiBtcy1JY29uLS1TZWFyY2gnXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8IS0tQ0xFQVItLT5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhcigpXCI+XG4gICAgICAgICAgICAgICAgPGkgW2NsYXNzXT1cIidtcy1JY29uIG1zLUljb24tLUNhbmNlbCdcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgPCEtLUZJTFRFUiBDSElQUy0tPlxuICAgIDwhLS0gVGhpcyBleGFtcGxlIHJlcXVpcmVzIFRhaWx3aW5kIENTUyB2Mi4wKyAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2YgZmlsdGVyczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICA8c3BhbiAqbmdJZj1cImZpbHRlciAmJiBmaWx0ZXIubWVtYmVyXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJhZHZhbmNlZC1zZWFyY2gtY2hpcHNcIj5cbiAgICAgICAgICAgIHt7IGZpbHRlci51aU5hbWUgfX0ge3sgZmlsdGVyLnVpT3BlcmF0b3IgfX0gJ3t7IGZpbHRlci51aVZhbHVlIH19J1xuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwicmVtb3ZlRmlsdGVyKGkpXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWR2YW5jZWQtc2VhcmNoLWNoaXBzLXJlbW92ZS1maWx0ZXJcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5SZW1vdmUgbGFyZ2Ugb3B0aW9uPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJoLTIgdy0yXCJcbiAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDggOFwiPlxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMS41XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk0xIDFsNiA2bTAtNkwxIDdcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PiJdfQ==
@@ -1,90 +0,0 @@
1
- import { formatDate } from "@angular/common";
2
- export var Operators;
3
- (function (Operators) {
4
- Operators.EQUALS = { label: '=', value: 'eq', description: 'Ίσο με' };
5
- Operators.NOT_EQUALS = { label: '≠', value: 'neq', description: 'Διάφορο του' };
6
- Operators.GREATER_THAN = { label: '>', value: 'gt', description: 'Μεγαλύτερο από' };
7
- Operators.LESS_THAN = { label: '<', value: 'lt', description: 'Μικρότερο από' };
8
- Operators.GREATER_THAN_EQUAL = { label: '≥', value: 'gte', description: 'Μεγαλύτερο ή ίσο με' };
9
- Operators.LESS_THAN_EQUAL = { label: '≤', value: 'lte', description: 'Μικρότερο ή ίσο με' };
10
- Operators.CONTAINS = { label: '∋', value: 'contains', description: 'Περιέχει' };
11
- Operators.IN = { label: '1..n', value: 'in', description: 'Μέσα σε' };
12
- })(Operators || (Operators = {}));
13
- export var QueryParameters;
14
- (function (QueryParameters) {
15
- QueryParameters["VIEW"] = "view";
16
- QueryParameters["PAGE_SIZE"] = "pagesize";
17
- QueryParameters["PAGE"] = "page";
18
- QueryParameters["SEARCH"] = "search";
19
- QueryParameters["SORT_FIELD"] = "sort";
20
- QueryParameters["SORT_DIRECTION"] = "dir";
21
- QueryParameters["FILTER"] = "filter";
22
- QueryParameters["FILTER_FROM"] = "from";
23
- QueryParameters["FILTER_TO"] = "to";
24
- })(QueryParameters || (QueryParameters = {}));
25
- export class FilterClause {
26
- constructor(member, value, operator, dataType, searchOptions) {
27
- this.member = member;
28
- this.value = value;
29
- this.operator = operator || Operators.EQUALS.value;
30
- this.dataType = dataType === undefined ? 'string' : dataType;
31
- // uiName
32
- if (this.dataType === 'datetime') { // special treatment for dates
33
- this.uiName = this.member === QueryParameters.FILTER_FROM ? 'Από' : 'Έως';
34
- }
35
- else {
36
- this.uiName = this.member;
37
- let fo = {};
38
- if (searchOptions && searchOptions.length > 0) {
39
- fo = searchOptions.find((f) => {
40
- return f.field === this.member;
41
- });
42
- }
43
- if (fo) {
44
- this.uiName = fo.name;
45
- }
46
- }
47
- // uiOperator
48
- this.uiOperator = this.dataType === 'datetime' ? '' : Operators.EQUALS.label; // that's fine (for now)...
49
- // uiValue
50
- this.uiValue = this.value;
51
- if ((this.dataType === 'datetime')) {
52
- this.uiValue = formatDate(new Date(this.value), 'dd/MM/yyyy', 'en-US');
53
- }
54
- let fo;
55
- if (searchOptions && searchOptions.length > 0) {
56
- fo = searchOptions.find((f) => {
57
- return f.field === this.member;
58
- });
59
- }
60
- if (fo && fo.options) { // special treatment for arrays, if there is an options property then it is an array
61
- this.dataType = 'array';
62
- this.uiValue = fo.options.find((option) => {
63
- return option.value === this.value;
64
- })?.label;
65
- }
66
- }
67
- static parse(text) {
68
- const pattern = /^\s*([A-Za-z_][A-Za-z0-9_\.]+)::(eq|neq|gt|lt|gte|lte|contains|in)::(\((string|integer|number|boolean|datetime)\))?(.+)\s*$/gi;
69
- if (text != null) {
70
- const matches = pattern.exec(text);
71
- if (matches != null) {
72
- const path = matches[1];
73
- const op = matches[2];
74
- const dt = matches[4];
75
- const v = matches[5];
76
- return new FilterClause(path, v, op, dt);
77
- }
78
- }
79
- return undefined;
80
- }
81
- toString() {
82
- if (this.dataType !== 'string' && this.dataType !== 'array') {
83
- return `${this.member}::${this.operator}::(${this.dataType})${this.value}`;
84
- }
85
- else {
86
- return `${this.member}::${this.operator}::${this.value}`;
87
- }
88
- }
89
- }
90
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2FkdmFuY2VkLXNlYXJjaC9tb2RlbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTdDLE1BQU0sS0FBVyxTQUFTLENBU3pCO0FBVEQsV0FBaUIsU0FBUztJQUNYLGdCQUFNLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQzVELG9CQUFVLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxDQUFDO0lBQ3RFLHNCQUFZLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixFQUFFLENBQUM7SUFDMUUsbUJBQVMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLENBQUM7SUFDdEUsNEJBQWtCLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFLENBQUM7SUFDdEYseUJBQWUsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQztJQUNsRixrQkFBUSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsQ0FBQztJQUN0RSxZQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUs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S0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDMUQ7SUFDSCxDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JtYXREYXRlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuXG5leHBvcnQgbmFtZXNwYWNlIE9wZXJhdG9ycyB7XG4gIGV4cG9ydCBjb25zdCBFUVVBTFMgPSB7IGxhYmVsOiAnPScsIHZhbHVlOiAnZXEnLCBkZXNjcmlwdGlvbjogJ86Kz4POvyDOvM61JyB9O1xuICBleHBvcnQgY29uc3QgTk9UX0VRVUFMUyA9IHsgbGFiZWw6ICfiiaAnLCB2YWx1ZTogJ25lcScsIGRlc2NyaXB0aW9uOiAnzpTOuc6sz4bOv8+Bzr8gz4TOv8+FJyB9O1xuICBleHBvcnQgY29uc3QgR1JFQVRFUl9USEFOID0geyBsYWJlbDogJz4nLCB2YWx1ZTogJ2d0JywgZGVzY3JpcHRpb246ICfOnM61zrPOsc67z43PhM61z4HOvyDOsc+Az4wnIH07XG4gIGV4cG9ydCBjb25zdCBMRVNTX1RIQU4gPSB7IGxhYmVsOiAnPCcsIHZhbHVlOiAnbHQnLCBkZXNjcmlwdGlvbjogJ86czrnOus+Bz4zPhM61z4HOvyDOsc+Az4wnIH07XG4gIGV4cG9ydCBjb25zdCBHUkVBVEVSX1RIQU5fRVFVQUwgPSB7IGxhYmVsOiAn4omlJywgdmFsdWU6ICdndGUnLCBkZXNjcmlwdGlvbjogJ86czrXOs86xzrvPjc+EzrXPgc6/IM6uIM6vz4POvyDOvM61JyB9O1xuICBleHBvcnQgY29uc3QgTEVTU19USEFOX0VRVUFMID0geyBsYWJlbDogJ+KJpCcsIHZhbHVlOiAnbHRlJywgZGVzY3JpcHRpb246ICfOnM65zrrPgc+Mz4TOtc+Bzr8gzq4gzq/Pg86/IM68zrUnIH07XG4gIGV4cG9ydCBjb25zdCBDT05UQUlOUyA9IHsgbGFiZWw6ICfiiIsnLCB2YWx1ZTogJ2NvbnRhaW5zJywgZGVzY3JpcHRpb246ICfOoM61z4HOuc6tz4fOtc65JyB9O1xuICBleHBvcnQgY29uc3QgSU4gPSB7IGxhYmVsOiAnMS4ubicsIHZhbHVlOiAnaW4nLCBkZXNjcmlwdGlvbjogJ86czq3Pg86xIM+DzrUnIH07XG59XG5cbmV4cG9ydCBlbnVtIFF1ZXJ5UGFyYW1ldGVycyB7XG4gIFZJRVcgPSAndmlldycsXG4gIFBBR0VfU0laRSA9ICdwYWdlc2l6ZScsXG4gIFBBR0UgPSAncGFnZScsXG4gIFNFQVJDSCA9ICdzZWFyY2gnLFxuICBTT1JUX0ZJRUxEID0gJ3NvcnQnLFxuICBTT1JUX0RJUkVDVElPTiA9ICdkaXInLFxuICBGSUxURVIgPSAnZmlsdGVyJyxcbiAgRklMVEVSX0ZST00gPSAnZnJvbScsXG4gIEZJTFRFUl9UTyA9ICd0bydcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hPcHRpb24ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGZpZWxkOiBzdHJpbmc7XG4gIGRhdGFUeXBlOiBGaWx0ZXJDbGF1c2UuRHQ7XG4gIGFycmF5PzogYm9vbGVhbjtcbiAgbXVsdGlUZXJtPzogYm9vbGVhbjtcbiAgb3B0aW9ucz86IFNlbGVjdElucHV0T3B0aW9uW107XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlbGVjdElucHV0T3B0aW9uIHtcbiAgdmFsdWU6IGFueTtcbiAgbGFiZWw6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgRmlsdGVyQ2xhdXNlIHtcbiAgZXhwb3J0IHR5cGUgT3AgPSAnZXEnIHwgJ25lcScgfCAnZ3QnIHwgJ2x0JyB8ICdndGUnIHwgJ2x0ZScgfCAnY29udGFpbnMnIHwgJ2luJztcbiAgZXhwb3J0IHR5cGUgRHQgPSAnc3RyaW5nJyB8ICdpbnRlZ2VyJyB8ICdudW1iZXInIHwgJ2Jvb2xlYW4nIHwgJ2RhdGV0aW1lJyB8ICdhcnJheScgfCAnZGF0ZXJhbmdlJyB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGNsYXNzIEZpbHRlckNsYXVzZSB7XG4gIC8vIE1lbWJlciBwYXRoIHRvIGNvbXBhcmVcbiAgcHVibGljIG1lbWJlcjogc3RyaW5nO1xuICAvLyBWYWx1ZSB0byBjb21wYXJlIGFnYWluc3RcbiAgcHVibGljIHZhbHVlOiBhbnk7XG4gIC8vIFRoZSBvcGVyYXRvciB0byBhcHBseSBiZXR3ZWVuIHRoZSBJbmRpY2UuVHlwZXMuRmlsdGVyQ2xhdXNlLk1lbWJlciBhbmQgSW5kaWNlLlR5cGVzLkZpbHRlckNsYXVzZS5WYWx1ZVxuICBwdWJsaWMgb3BlcmF0b3I6IEZpbHRlckNsYXVzZS5PcDtcbiAgLy8gVGhlIEluZGljZS5UeXBlcy5Kc29uRGF0YVR5cGUgb2YgdGhlIGRhdGEgSW5kaWNlLlR5cGVzLkZpbHRlckNsYXVzZS5NZW1iZXJcbiAgcHVibGljIGRhdGFUeXBlOiBGaWx0ZXJDbGF1c2UuRHQ7XG5cbiAgcHVibGljIHVpTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgdWlPcGVyYXRvcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgdWlWYWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihtZW1iZXI6IHN0cmluZywgdmFsdWU6IGFueSwgb3BlcmF0b3I/OiBGaWx0ZXJDbGF1c2UuT3AsIGRhdGFUeXBlPzogRmlsdGVyQ2xhdXNlLkR0LCBzZWFyY2hPcHRpb25zPzogU2VhcmNoT3B0aW9uW10pIHsgLy8geWVhcCwgd2UgZG8gbmVlZCBzZWFyY2hPcHRpb25zIGZvciB0aGUgdWkgdmlldyBtb2RlbFxuICAgIHRoaXMubWVtYmVyID0gbWVtYmVyO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLm9wZXJhdG9yID0gb3BlcmF0b3IgfHwgT3BlcmF0b3JzLkVRVUFMUy52YWx1ZSBhcyBGaWx0ZXJDbGF1c2UuT3A7XG4gICAgdGhpcy5kYXRhVHlwZSA9IGRhdGFUeXBlID09PSB1bmRlZmluZWQgPyAnc3RyaW5nJyA6IGRhdGFUeXBlO1xuICAgIC8vIHVpTmFtZVxuICAgIGlmICh0aGlzLmRhdGFUeXBlID09PSAnZGF0ZXRpbWUnKSB7IC8vIHNwZWNpYWwgdHJlYXRtZW50IGZvciBkYXRlc1xuICAgICAgdGhpcy51aU5hbWUgPSB0aGlzLm1lbWJlciA9PT0gUXVlcnlQYXJhbWV0ZXJzLkZJTFRFUl9GUk9NID8gJ86Rz4DPjCcgOiAnzojPic+CJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51aU5hbWUgPSB0aGlzLm1lbWJlcjtcbiAgICAgIGxldCBmbyA9IDxhbnk+e307XG4gICAgICBpZiAoc2VhcmNoT3B0aW9ucyAmJiBzZWFyY2hPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm8gPSBzZWFyY2hPcHRpb25zLmZpbmQoKGYpID0+IHtcbiAgICAgICAgICByZXR1cm4gZi5maWVsZCA9PT0gdGhpcy5tZW1iZXI7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZm8pIHtcbiAgICAgICAgdGhpcy51aU5hbWUgPSBmby5uYW1lO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyB1aU9wZXJhdG9yXG4gICAgdGhpcy51aU9wZXJhdG9yID0gdGhpcy5kYXRhVHlwZSA9PT0gJ2RhdGV0aW1lJyA/ICcnIDogT3BlcmF0b3JzLkVRVUFMUy5sYWJlbDsgLy8gdGhhdCdzIGZpbmUgKGZvciBub3cpLi4uXG4gICAgLy8gdWlWYWx1ZVxuICAgIHRoaXMudWlWYWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgaWYgKCh0aGlzLmRhdGFUeXBlID09PSAnZGF0ZXRpbWUnKSkge1xuICAgICAgdGhpcy51aVZhbHVlID0gZm9ybWF0RGF0ZShuZXcgRGF0ZSh0aGlzLnZhbHVlKSwgJ2RkL01NL3l5eXknLCAnZW4tVVMnKTtcbiAgICB9XG4gICAgbGV0IGZvOiBTZWFyY2hPcHRpb24gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHNlYXJjaE9wdGlvbnMgJiYgc2VhcmNoT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICBmbyA9IHNlYXJjaE9wdGlvbnMuZmluZCgoZikgPT4ge1xuICAgICAgICByZXR1cm4gZi5maWVsZCA9PT0gdGhpcy5tZW1iZXI7XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGZvICYmIGZvLm9wdGlvbnMpIHsgLy8gc3BlY2lhbCB0cmVhdG1lbnQgZm9yIGFycmF5cywgaWYgdGhlcmUgaXMgYW4gb3B0aW9ucyBwcm9wZXJ0eSB0aGVuIGl0IGlzIGFuIGFycmF5XG4gICAgICB0aGlzLmRhdGFUeXBlID0gJ2FycmF5JztcbiAgICAgIHRoaXMudWlWYWx1ZSA9IGZvIS5vcHRpb25zIS5maW5kKChvcHRpb24pID0+IHtcbiAgICAgICAgcmV0dXJuIG9wdGlvbi52YWx1ZSA9PT0gdGhpcy52YWx1ZTtcbiAgICAgIH0pPy5sYWJlbDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHBhcnNlKHRleHQ6IHN0cmluZyk6IEZpbHRlckNsYXVzZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGF0dGVybiA9IC9eXFxzKihbQS1aYS16X11bQS1aYS16MC05X1xcLl0rKTo6KGVxfG5lcXxndHxsdHxndGV8bHRlfGNvbnRhaW5zfGluKTo6KFxcKChzdHJpbmd8aW50ZWdlcnxudW1iZXJ8Ym9vbGVhbnxkYXRldGltZSlcXCkpPyguKylcXHMqJC9naTtcbiAgICBpZiAodGV4dCAhPSBudWxsKSB7XG4gICAgICBjb25zdCBtYXRjaGVzID0gcGF0dGVybi5leGVjKHRleHQpO1xuICAgICAgaWYgKG1hdGNoZXMgIT0gbnVsbCkge1xuICAgICAgICBjb25zdCBwYXRoID0gbWF0Y2hlc1sxXTtcbiAgICAgICAgY29uc3Qgb3AgPSA8RmlsdGVyQ2xhdXNlLk9wPm1hdGNoZXNbMl07XG4gICAgICAgIGNvbnN0IGR0ID0gPEZpbHRlckNsYXVzZS5EdD5tYXRjaGVzWzRdO1xuICAgICAgICBjb25zdCB2ID0gbWF0Y2hlc1s1XTtcblxuICAgICAgICByZXR1cm4gbmV3IEZpbHRlckNsYXVzZShwYXRoLCB2LCBvcCwgZHQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZGF0YVR5cGUgIT09ICdzdHJpbmcnICYmIHRoaXMuZGF0YVR5cGUgIT09ICdhcnJheScpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLm1lbWJlcn06OiR7dGhpcy5vcGVyYXRvcn06Oigke3RoaXMuZGF0YVR5cGV9KSR7dGhpcy52YWx1ZX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5tZW1iZXJ9Ojoke3RoaXMub3BlcmF0b3J9Ojoke3RoaXMudmFsdWV9YDtcbiAgICB9XG4gIH1cblxufVxuIl19