@iamproperty/components 3.4.7 → 3.6.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 (234) hide show
  1. package/assets/bootstrap/LICENSE +22 -0
  2. package/assets/bootstrap/README.md +246 -0
  3. package/assets/bootstrap/js/src/alert.js +87 -0
  4. package/assets/bootstrap/js/src/base-component.js +85 -0
  5. package/assets/bootstrap/js/src/button.js +72 -0
  6. package/assets/bootstrap/js/src/carousel.js +475 -0
  7. package/assets/bootstrap/js/src/collapse.js +302 -0
  8. package/assets/bootstrap/js/src/dom/data.js +55 -0
  9. package/assets/bootstrap/js/src/dom/event-handler.js +320 -0
  10. package/assets/bootstrap/js/src/dom/manipulator.js +71 -0
  11. package/assets/bootstrap/js/src/dom/selector-engine.js +83 -0
  12. package/assets/bootstrap/js/src/dropdown.js +454 -0
  13. package/assets/bootstrap/js/src/modal.js +377 -0
  14. package/assets/bootstrap/js/src/offcanvas.js +283 -0
  15. package/assets/bootstrap/js/src/popover.js +97 -0
  16. package/assets/bootstrap/js/src/scrollspy.js +294 -0
  17. package/assets/bootstrap/js/src/tab.js +305 -0
  18. package/assets/bootstrap/js/src/toast.js +225 -0
  19. package/assets/bootstrap/js/src/tooltip.js +633 -0
  20. package/assets/bootstrap/js/src/util/backdrop.js +149 -0
  21. package/assets/bootstrap/js/src/util/component-functions.js +34 -0
  22. package/assets/bootstrap/js/src/util/config.js +66 -0
  23. package/assets/bootstrap/js/src/util/focustrap.js +115 -0
  24. package/assets/bootstrap/js/src/util/index.js +336 -0
  25. package/assets/bootstrap/js/src/util/sanitizer.js +118 -0
  26. package/assets/bootstrap/js/src/util/scrollbar.js +114 -0
  27. package/assets/bootstrap/js/src/util/swipe.js +146 -0
  28. package/assets/bootstrap/js/src/util/template-factory.js +160 -0
  29. package/assets/bootstrap/package.json +181 -0
  30. package/assets/bootstrap/scss/_accordion.scss +149 -0
  31. package/assets/bootstrap/scss/_alert.scss +71 -0
  32. package/assets/bootstrap/scss/_badge.scss +38 -0
  33. package/assets/bootstrap/scss/_breadcrumb.scss +40 -0
  34. package/assets/bootstrap/scss/_button-group.scss +142 -0
  35. package/assets/bootstrap/scss/_buttons.scss +207 -0
  36. package/assets/bootstrap/scss/_card.scss +234 -0
  37. package/assets/bootstrap/scss/_carousel.scss +226 -0
  38. package/assets/bootstrap/scss/_close.scss +40 -0
  39. package/assets/bootstrap/scss/_containers.scss +41 -0
  40. package/assets/bootstrap/scss/_dropdown.scss +249 -0
  41. package/assets/bootstrap/scss/_forms.scss +9 -0
  42. package/assets/bootstrap/scss/_functions.scss +302 -0
  43. package/assets/bootstrap/scss/_grid.scss +33 -0
  44. package/assets/bootstrap/scss/_helpers.scss +10 -0
  45. package/assets/bootstrap/scss/_images.scss +42 -0
  46. package/assets/bootstrap/scss/_list-group.scss +192 -0
  47. package/assets/bootstrap/scss/_maps.scss +54 -0
  48. package/assets/bootstrap/scss/_mixins.scss +43 -0
  49. package/assets/bootstrap/scss/_modal.scss +237 -0
  50. package/assets/bootstrap/scss/_nav.scss +172 -0
  51. package/assets/bootstrap/scss/_navbar.scss +278 -0
  52. package/assets/bootstrap/scss/_offcanvas.scss +144 -0
  53. package/assets/bootstrap/scss/_pagination.scss +109 -0
  54. package/assets/bootstrap/scss/_placeholders.scss +51 -0
  55. package/assets/bootstrap/scss/_popover.scss +196 -0
  56. package/assets/bootstrap/scss/_progress.scss +59 -0
  57. package/assets/bootstrap/scss/_reboot.scss +610 -0
  58. package/assets/bootstrap/scss/_root.scss +73 -0
  59. package/assets/bootstrap/scss/_spinners.scss +85 -0
  60. package/assets/bootstrap/scss/_tables.scss +164 -0
  61. package/assets/bootstrap/scss/_toasts.scss +73 -0
  62. package/assets/bootstrap/scss/_tooltip.scss +120 -0
  63. package/assets/bootstrap/scss/_transitions.scss +27 -0
  64. package/assets/bootstrap/scss/_type.scss +106 -0
  65. package/assets/bootstrap/scss/_utilities.scss +647 -0
  66. package/assets/bootstrap/scss/_variables.scss +1634 -0
  67. package/assets/bootstrap/scss/bootstrap-grid.scss +64 -0
  68. package/assets/bootstrap/scss/bootstrap-reboot.scss +9 -0
  69. package/assets/bootstrap/scss/bootstrap-utilities.scss +18 -0
  70. package/assets/bootstrap/scss/bootstrap.scss +51 -0
  71. package/assets/bootstrap/scss/forms/_floating-labels.scss +75 -0
  72. package/assets/bootstrap/scss/forms/_form-check.scss +175 -0
  73. package/assets/bootstrap/scss/forms/_form-control.scss +194 -0
  74. package/assets/bootstrap/scss/forms/_form-range.scss +91 -0
  75. package/assets/bootstrap/scss/forms/_form-select.scss +71 -0
  76. package/assets/bootstrap/scss/forms/_form-text.scss +11 -0
  77. package/assets/bootstrap/scss/forms/_input-group.scss +132 -0
  78. package/assets/bootstrap/scss/forms/_labels.scss +36 -0
  79. package/assets/bootstrap/scss/forms/_validation.scss +12 -0
  80. package/assets/bootstrap/scss/helpers/_clearfix.scss +3 -0
  81. package/assets/bootstrap/scss/helpers/_color-bg.scss +10 -0
  82. package/assets/bootstrap/scss/helpers/_colored-links.scss +12 -0
  83. package/assets/bootstrap/scss/helpers/_position.scss +36 -0
  84. package/assets/bootstrap/scss/helpers/_ratio.scss +26 -0
  85. package/assets/bootstrap/scss/helpers/_stacks.scss +15 -0
  86. package/assets/bootstrap/scss/helpers/_stretched-link.scss +15 -0
  87. package/assets/bootstrap/scss/helpers/_text-truncation.scss +7 -0
  88. package/assets/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
  89. package/assets/bootstrap/scss/helpers/_vr.scss +8 -0
  90. package/assets/bootstrap/scss/mixins/_alert.scss +15 -0
  91. package/assets/bootstrap/scss/mixins/_backdrop.scss +14 -0
  92. package/assets/bootstrap/scss/mixins/_banner.scss +9 -0
  93. package/assets/bootstrap/scss/mixins/_border-radius.scss +78 -0
  94. package/assets/bootstrap/scss/mixins/_box-shadow.scss +18 -0
  95. package/assets/bootstrap/scss/mixins/_breakpoints.scss +127 -0
  96. package/assets/bootstrap/scss/mixins/_buttons.scss +70 -0
  97. package/assets/bootstrap/scss/mixins/_caret.scss +64 -0
  98. package/assets/bootstrap/scss/mixins/_clearfix.scss +9 -0
  99. package/assets/bootstrap/scss/mixins/_color-scheme.scss +7 -0
  100. package/assets/bootstrap/scss/mixins/_container.scss +11 -0
  101. package/assets/bootstrap/scss/mixins/_deprecate.scss +10 -0
  102. package/assets/bootstrap/scss/mixins/_forms.scss +152 -0
  103. package/assets/bootstrap/scss/mixins/_gradients.scss +47 -0
  104. package/assets/bootstrap/scss/mixins/_grid.scss +151 -0
  105. package/assets/bootstrap/scss/mixins/_image.scss +16 -0
  106. package/assets/bootstrap/scss/mixins/_list-group.scss +24 -0
  107. package/assets/bootstrap/scss/mixins/_lists.scss +7 -0
  108. package/assets/bootstrap/scss/mixins/_pagination.scss +10 -0
  109. package/assets/bootstrap/scss/mixins/_reset-text.scss +17 -0
  110. package/assets/bootstrap/scss/mixins/_resize.scss +6 -0
  111. package/assets/bootstrap/scss/mixins/_table-variants.scss +24 -0
  112. package/assets/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  113. package/assets/bootstrap/scss/mixins/_transition.scss +26 -0
  114. package/assets/bootstrap/scss/mixins/_utilities.scss +97 -0
  115. package/assets/bootstrap/scss/mixins/_visually-hidden.scss +29 -0
  116. package/assets/bootstrap/scss/utilities/_api.scss +47 -0
  117. package/assets/bootstrap/scss/vendor/_rfs.scss +354 -0
  118. package/assets/css/components/accordion.css +1 -1
  119. package/assets/css/components/accordion.css.map +1 -1
  120. package/assets/css/components/admin-panel.css +1 -0
  121. package/assets/css/components/admin-panel.css.map +1 -0
  122. package/assets/css/components/alert.css +1 -1
  123. package/assets/css/components/alert.css.map +1 -1
  124. package/assets/css/components/applied-filters.css +1 -1
  125. package/assets/css/components/applied-filters.css.map +1 -1
  126. package/assets/css/components/card.css +1 -1
  127. package/assets/css/components/card.css.map +1 -1
  128. package/assets/css/components/carousel.css +1 -1
  129. package/assets/css/components/carousel.css.map +1 -1
  130. package/assets/css/components/charts.css +1 -1
  131. package/assets/css/components/charts.css.map +1 -1
  132. package/assets/css/components/container.css.map +1 -1
  133. package/assets/css/components/dialog.css +1 -1
  134. package/assets/css/components/dialog.css.map +1 -1
  135. package/assets/css/components/forms.css +1 -1
  136. package/assets/css/components/forms.css.map +1 -1
  137. package/assets/css/components/header.css +1 -1
  138. package/assets/css/components/header.css.map +1 -1
  139. package/assets/css/components/lists.css +1 -1
  140. package/assets/css/components/lists.css.map +1 -1
  141. package/assets/css/components/nav.css +1 -1
  142. package/assets/css/components/nav.css.map +1 -1
  143. package/assets/css/components/pagination.css +1 -1
  144. package/assets/css/components/pagination.css.map +1 -1
  145. package/assets/css/components/property-searchbar.css +1 -1
  146. package/assets/css/components/property-searchbar.css.map +1 -1
  147. package/assets/css/components/stepper.css +1 -1
  148. package/assets/css/components/stepper.css.map +1 -1
  149. package/assets/css/components/table.css +1 -1
  150. package/assets/css/components/table.css.map +1 -1
  151. package/assets/css/components/tabs.css +1 -1
  152. package/assets/css/components/tabs.css.map +1 -1
  153. package/assets/css/components/tooltips.css +1 -1
  154. package/assets/css/components/tooltips.css.map +1 -1
  155. package/assets/css/core.min.css +1 -1
  156. package/assets/css/core.min.css.map +1 -1
  157. package/assets/css/style.min.css +1 -1
  158. package/assets/css/style.min.css.map +1 -1
  159. package/assets/js/components/accordion/accordion.component.min.js +1 -1
  160. package/assets/js/components/card/card.component.js +1 -1
  161. package/assets/js/components/card/card.component.min.js +5 -5
  162. package/assets/js/components/card/card.component.min.js.map +1 -1
  163. package/assets/js/components/filterlist/filterlist.component.js +13 -9
  164. package/assets/js/components/filterlist/filterlist.component.min.js +14 -5
  165. package/assets/js/components/filterlist/filterlist.component.min.js.map +1 -1
  166. package/assets/js/components/header/header.component.min.js +5 -5
  167. package/assets/js/components/table/table.component.js +16 -1
  168. package/assets/js/components/table/table.component.min.js +21 -11
  169. package/assets/js/components/table/table.component.min.js.map +1 -1
  170. package/assets/js/components/tabs/tabs.component.js +6 -2
  171. package/assets/js/components/tabs/tabs.component.min.js +6 -4
  172. package/assets/js/components/tabs/tabs.component.min.js.map +1 -1
  173. package/assets/js/dynamic.min.js +2 -2
  174. package/assets/js/dynamic.min.js.map +1 -1
  175. package/assets/js/modules/applied-filters.js +6 -2
  176. package/assets/js/modules/helpers.js +36 -6
  177. package/assets/js/modules/table.js +27 -16
  178. package/assets/js/modules/tabs.js +4 -2
  179. package/assets/js/scripts.bundle.js +42 -20
  180. package/assets/js/scripts.bundle.js.map +1 -1
  181. package/assets/js/scripts.bundle.min.js +2 -2
  182. package/assets/js/scripts.bundle.min.js.map +1 -1
  183. package/assets/js/tests/table.spec.js +3 -2
  184. package/assets/sass/_corefiles.scss +18 -15
  185. package/assets/sass/_forms.scss +7 -7
  186. package/assets/sass/_functions/functions.scss +3 -4
  187. package/assets/sass/_functions/mixins.scss +10 -28
  188. package/assets/sass/_functions/utilities.scss +83 -9
  189. package/assets/sass/_functions/variables.scss +110 -57
  190. package/assets/sass/_tests/colours.spec.scss +8 -22
  191. package/assets/sass/_tests/func.spec.scss +1 -1
  192. package/assets/sass/components/accordion.scss +13 -0
  193. package/assets/sass/components/admin-panel.scss +174 -0
  194. package/assets/sass/components/alert.scss +22 -0
  195. package/assets/sass/components/applied-filters.scss +4 -0
  196. package/assets/sass/components/card.scss +12 -8
  197. package/assets/sass/components/carousel.scss +72 -0
  198. package/assets/sass/components/charts.scss +37 -1
  199. package/assets/sass/components/container.scss +1 -1
  200. package/assets/sass/components/dialog.scss +29 -15
  201. package/assets/sass/components/forms.scss +2 -2
  202. package/assets/sass/components/lists.scss +14 -0
  203. package/assets/sass/components/nav.scss +1 -1
  204. package/assets/sass/components/pagination.scss +5 -1
  205. package/assets/sass/components/stepper.scss +3 -3
  206. package/assets/sass/components/table.scss +163 -44
  207. package/assets/sass/components/tabs.scss +54 -85
  208. package/assets/sass/components/tooltips.scss +1 -1
  209. package/assets/sass/foundations/buttons.scss +381 -0
  210. package/assets/sass/foundations/links.scss +75 -75
  211. package/assets/sass/foundations/media.scss +1 -1
  212. package/assets/sass/foundations/reboot.scss +8 -9
  213. package/assets/sass/foundations/root.scss +44 -70
  214. package/assets/sass/foundations/type.scss +5 -1
  215. package/assets/sass/helpers/max-height.scss +3 -0
  216. package/assets/ts/components/card/card.component.ts +1 -1
  217. package/assets/ts/components/filterlist/filterlist.component.ts +13 -11
  218. package/assets/ts/components/table/table.component.ts +17 -1
  219. package/assets/ts/components/tabs/tabs.component.ts +7 -2
  220. package/assets/ts/modules/applied-filters.ts +9 -3
  221. package/assets/ts/modules/helpers.ts +57 -8
  222. package/assets/ts/modules/table.ts +38 -18
  223. package/assets/ts/modules/tabs.ts +7 -2
  224. package/assets/ts/tests/table.spec.ts +3 -3
  225. package/dist/components.es.js +195 -160
  226. package/dist/components.umd.js +37 -15
  227. package/dist/style.css +1 -1
  228. package/package.json +2 -1
  229. package/assets/css/components/buttons.css +0 -1
  230. package/assets/css/components/buttons.css.map +0 -1
  231. package/assets/css/components/panel.css +0 -1
  232. package/assets/css/components/panel.css.map +0 -1
  233. package/assets/sass/components/buttons.scss +0 -252
  234. package/assets/sass/components/panel.scss +0 -161
@@ -1,6 +1,6 @@
1
1
  @use "../func" as *;
2
2
 
3
- @import "../../../node_modules/bootstrap/scss/_root.scss";
3
+ @import "../../bootstrap/scss/_root.scss";
4
4
 
5
5
  :root {
6
6
  // Print out the $vars array setup in the variables file so they can be used as CSS vars
@@ -25,109 +25,83 @@
25
25
  }
26
26
 
27
27
  // Extra vars needed
28
- --body-bg: white;
29
- --colour-underline: var(--colour-primary);
30
- --colour-heading: var(--colour-primary);
31
- --alpha: var(--bg-opacity,1);
32
- --#{$variable-prefix}gradient: #{$gradient};
33
28
  --content-max-width: #{$content-max-width};
34
29
  --colour-brand: var(--colour-primary);
35
-
36
- /* Button colours */
37
- --btn-bg: var(--colour-warning);
38
- --btn-text: var(--colour-primary);
39
- --btn-hover-text: var(--colour-primary);
40
- --btn-tertiary-bg: var(--colour-primary);
41
- --btn-tertiary-hover-text: white;
42
30
  }
43
31
 
44
32
  // Dark mode; functional colours get updated
45
33
  @media screen and (prefers-color-scheme: dark) {
46
34
  :root {
47
- --body-bg: var(--colour-primary);
48
- --colour-admin: var(--colour-primary);
35
+
36
+ @each $color, $value in $dark-mode-colors {
37
+ --colour-#{$color}: #{$value};
38
+ }
49
39
  @include invert-colours();
50
40
  }
41
+ }
42
+
43
+ @media screen and (prefers-color-scheme: light) {
51
44
 
52
- body .text-primary {
53
- color: #{$colour-inverted}!important;
45
+ // Reset the colours of lighter backgrounds to make sure they aren't over written by dark mode. Some other tweaks to colours are applied
46
+ [class*="bg-"]:not(.bg-primary):not(.bg-dark):not(.bg-danger):not(.bg-white):not(.bg-canvas):not(.bg-canvas-2):not(.invert-colours) {
47
+
48
+ @each $color, $value in $theme-colors {
49
+ --colour-#{$color}: #{$value};
50
+ }
51
+ @include reset-colours();
52
+ --colour-body: var(--colour-primary);
53
+ color: var(--colour-body);
54
54
  }
55
55
 
56
- body .bg-white {
57
- background-color: transparent!important;
56
+ // Override the colours when on a dark background, similiar to dark mode but on a module level
57
+ [class*="bg-"]:not(.bg-info):not(.bg-success):not(.bg-light):not(.bg-white):not(.bg-canvas):not(.bg-canvas-2):not(.prevent-invert),
58
+ .invert-colours {
59
+
60
+ @include invert-colours();
61
+
62
+ color: #{$colour-inverted};
58
63
  }
59
64
  }
60
65
 
61
- @media screen {
66
+ @media screen and (prefers-color-scheme: dark) {
62
67
 
63
68
  // Reset the colours of lighter backgrounds to make sure they aren't over written by dark mode. Some other tweaks to colours are applied
64
- [class*="bg-"]:not(.bg-primary):not(.bg-dark):not(.bg-danger):not(.bg-black):not(.invert-colours):not(.bg-white):not(.bg-admin) {
69
+ [class*="bg-"]:not(.bg-canvas):not(.bg-canvas-2) {
65
70
 
66
71
  @include reset-colours();
67
-
68
- --colour-body: var(--colour-primary);
69
- --colour-heading: var(--colour-primary);
72
+ --colour-body: #{$primary};
70
73
  color: var(--colour-body);
74
+ }
71
75
 
72
- --btn-bg: var(--colour-primary);
73
- --btn-text: var(--colour-white);
74
- --colour-underline: var(--colour-primary);
76
+ @each $color, $value in $theme-colors {
75
77
 
76
- .btn-secondary {
78
+ .bg-#{$color}[class*="gradient-"] {
77
79
 
78
- --btn-text: var(--colour-primary);
80
+ background-color: var(--colour-#{$color}-theme) !important;
79
81
  }
80
-
81
82
  }
82
-
83
83
 
84
+ [class*="bg-"][class*="gradient-"]:not(.bg-primary):not(.bg-dark):not(.bg-danger) {
84
85
 
85
- // Slight colour adjustments on the light background to match brand guidelines
86
- .bg-light[class*="bg-"]:not(.bg-primary):not(.bg-dark):not(.bg-danger):not(.prevent-invert) {
87
- --body-bg: var(--colour-light);
88
- --colour-heading: var(--colour-dark);
89
- color: var(--colour-dark);
90
- }
91
-
92
- // Override the colours when on a dark background, similiar to dark mode but on a module level
93
- .bg-primary:not(.prevent-invert),
94
- .bg-dark:not(.prevent-invert),
95
- .bg-danger:not(.prevent-invert),
96
- .bg-black:not(.prevent-invert),
97
- .invert-colours {
98
-
99
- @if $compatible != "true" {
100
-
101
- @include invert-colours();
86
+ @each $color, $value in $theme-colors {
87
+ --colour-#{$color}: #{$value};
102
88
  }
103
- color: #{$colour-inverted};
89
+ @include reset-colours();
90
+ --colour-body: var(--colour-primary-theme);
91
+ color: var(--colour-body);
104
92
  }
105
93
 
106
- // Only update the the colour of the underline on dark backgrounds except the primary as the secondary colour looks good on it
107
- .bg-dark:not(.prevent-invert),
108
- .bg-danger:not(.prevent-invert),
109
- .bg-black:not(.prevent-invert),
110
- .invert-colours {
94
+ [class*="bg-"][class*="gradient-"]:not(.bg-info):not(.bg-success):not(.bg-light):not(.prevent-invert) {
111
95
 
112
- --colour-underline: #{$colour-inverted};
113
- }
114
- }
115
-
116
-
117
-
118
- @include media-breakpoint-up(md) {
96
+ @include invert-colours();
119
97
 
120
- .invert-colours-md {
121
-
122
- @if $compatible != "true" {
123
-
124
- @include invert-colours();
125
- }
126
98
  color: #{$colour-inverted};
127
- --colour-underline: #{$colour-inverted};
128
99
  }
100
+ }
129
101
 
130
- [class*="bg-"].bg-md-transparent {
131
- background: transparent!important;
102
+
103
+ @media (forced-colors: active) {
104
+ :root {
105
+ --contrast-outline-width: 1px;
132
106
  }
133
107
  }
@@ -11,7 +11,7 @@ small {
11
11
  @include font-size($small-font-size);
12
12
  }
13
13
 
14
- @import "../../../node_modules/bootstrap/scss/_type.scss";
14
+ @import "../../bootstrap/scss/_type.scss";
15
15
 
16
16
  // #region headings
17
17
  %heading {
@@ -27,6 +27,10 @@ small {
27
27
  clear: both;
28
28
  display: block;
29
29
  padding-bottom: 2rem;
30
+
31
+ [class*="fa-"] {
32
+ margin-right: 0.5rem;
33
+ }
30
34
  }
31
35
 
32
36
  @include is('h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6,.display-1,.display-2, .display-3, .display-4'){
@@ -0,0 +1,3 @@
1
+ :is(.mh-sm,.mh-md,.mh-lg){
2
+ overflow: auto;
3
+ }
@@ -8,7 +8,7 @@ class iamCard extends HTMLElement {
8
8
  const assetLocation = document.body.hasAttribute('data-assets-location') ? document.body.getAttribute('data-assets-location') : '/assets';
9
9
  const loadCSS = `@import "${assetLocation}/css/components/card.css";`;
10
10
 
11
- if(this.querySelector('.icon'))
11
+ if(this.querySelector('.fa'))
12
12
  this.classList.add('card--has-icon');
13
13
 
14
14
  let classList = this.classList.toString();
@@ -22,14 +22,23 @@ class iamFilterlist extends HTMLElement {
22
22
  ${this.hasAttribute('css') ? `@import "${this.getAttribute('css')}";` : ``}
23
23
 
24
24
  :host {
25
- margin-bottom: 3rem;
25
+ margin-bottom: 1rem;
26
26
  display:block;
27
27
  }
28
+ :host(.mh-sm){
29
+ max-height: none!important;
30
+ }
31
+ :host(.mh-md){
32
+ max-height: none!important;
33
+ }
34
+ :host(.mh-lg){
35
+ max-height: none!important;
36
+ }
28
37
  </style>
29
38
  <div class="form-control__wrapper">
30
39
  <label for="search" class="visually-hidden">Search</label>
31
40
  <span class="suffix" role="presentation"><slot name="icon"></slot></span>
32
- <input name="search" id="search" type="text" class="form-control" autocomplete="off">
41
+ <input name="search" id="search" type="text" class="form-control" autocomplete="off" placeholder="Search" />
33
42
  </div>
34
43
  <div class="list__wrapper">
35
44
  <slot></slot>
@@ -40,15 +49,8 @@ class iamFilterlist extends HTMLElement {
40
49
 
41
50
  connectedCallback() {
42
51
 
43
- const maxHeights = {
44
- "small": "12.5rem",
45
- "medium": "25rem",
46
- "large": "37.5rem"
47
- }
48
-
49
- let maxHeightClass = (this.hasAttribute('data-max-height') && maxHeights[this.getAttribute('data-max-height')] ? 'list__wrapper--'+this.getAttribute('data-max-height') : '');
50
-
51
- this.shadowRoot.querySelector('.list__wrapper').classList.add(maxHeightClass);
52
+ let classList = this.classList.toString();
53
+ this.shadowRoot.querySelector('.list__wrapper').setAttribute('class',`list__wrapper ${classList}`);
52
54
 
53
55
  if(!this.querySelector('i.fa-search'))
54
56
  this.innerHTML += '<i class="fa fa-light fa-search" aria-hidden="true" slot="icon"></i>';
@@ -20,6 +20,16 @@ class iamTable extends HTMLElement {
20
20
  template.innerHTML = `
21
21
  <style>
22
22
  @import "${assetLocation}/css/core.min.css";
23
+
24
+ :host(.mh-sm){
25
+ max-height: none!important;
26
+ }
27
+ :host(.mh-md){
28
+ max-height: none!important;
29
+ }
30
+ :host(.mh-lg){
31
+ max-height: none!important;
32
+ }
23
33
  </style>
24
34
  ${isCTA ? '<div class="table--cta">' : ''}
25
35
  <div class="table__wrapper ${classList}">
@@ -48,7 +58,7 @@ class iamTable extends HTMLElement {
48
58
  connectedCallback() {
49
59
 
50
60
  this.table = this.querySelector('table');
51
- this.savedTableBody = this.querySelector('tbody').cloneNode(true);
61
+ this.savedTableBody = this.table.querySelector('tbody').cloneNode(true);
52
62
  this.pagination = this.shadowRoot.querySelector('.table__pagination');
53
63
 
54
64
  // Set events on the filter table
@@ -82,8 +92,14 @@ class iamTable extends HTMLElement {
82
92
  tableModule.makeTableFunctional(this.table, this.form, this.pagination, this);
83
93
  tableModule.filterTable(this.table, this.form,this);
84
94
  createPaginationButttons(this,this.pagination);
95
+ tableModule.populateDataQueries(this.table, this.form);
85
96
  }
86
97
 
98
+ this.shadowRoot.querySelector('.table__wrapper').addEventListener("scroll", (event) => {
99
+
100
+ if(this.table.querySelector('dialog[open]'))
101
+ this.table.querySelector('dialog[open]').close();
102
+ });
87
103
  }
88
104
 
89
105
 
@@ -15,12 +15,14 @@ class iamTabs extends HTMLElement {
15
15
  this.attachShadow({ mode: 'open'});
16
16
 
17
17
  const assetLocation = document.body.hasAttribute('data-assets-location') ? document.body.getAttribute('data-assets-location') : '/assets';
18
- const loadCSS = `@import "${assetLocation}/css/components/tabs.css";`;
19
18
  const template = document.createElement('template');
20
19
  template.innerHTML = `
21
20
  <style>
22
21
  @import "${assetLocation}/css/core.min.css";
23
- ${loadCSS}
22
+
23
+ :host(.admin-panel){
24
+ display: contents!important;
25
+ }
24
26
 
25
27
  ${this.hasAttribute('css') ? `@import "${this.getAttribute('css')}";` : ``}
26
28
  </style>
@@ -33,6 +35,9 @@ class iamTabs extends HTMLElement {
33
35
  }
34
36
 
35
37
  connectedCallback() {
38
+
39
+ let classList = this.classList.toString().replace('container','');
40
+ this.shadowRoot.querySelector('.tabs').setAttribute('class',`tabs ${classList}`);
36
41
 
37
42
  tabs(this);
38
43
  }
@@ -103,7 +103,7 @@ function createAppliedFilters(container,filters) {
103
103
 
104
104
  let input = event.target.closest('input[data-filter-text]');
105
105
 
106
- addFilterButton (filters, input)
106
+ addFilterButton (filters, input);
107
107
  };
108
108
 
109
109
  }, false);
@@ -125,13 +125,19 @@ function createAppliedFilters(container,filters) {
125
125
  }
126
126
 
127
127
  let inputs = container.querySelectorAll(selector);
128
+
128
129
  for(var i=0;i<inputs.length;i++){
129
130
  let input = inputs[i];
130
131
 
132
+
131
133
  if(input.getAttribute('type') != 'radio' && input.getAttribute('type') != 'checkbox')
132
- inputs[i].value = "";
134
+ input.value = "";
135
+ else {
136
+ input.checked = false;
133
137
 
134
- inputs[i].checked = false;
138
+ var event = new Event('force');
139
+ input.closest('form').dispatchEvent(event);
140
+ }
135
141
  }
136
142
  }
137
143
 
@@ -69,16 +69,18 @@ export const addGlobalEvents = (body) => {
69
69
  if (event && event.target instanceof HTMLElement && event.target.closest('[data-modal]')){
70
70
 
71
71
  const button = event.target.closest('[data-modal]');
72
- const modalID = button.getAttribute('data-modal');
72
+ const modalID = button.hasAttribute('data-modal') ? button.getAttribute('data-modal') : button.getAttribute('data-filter');
73
73
  const dialog = document.querySelector(`dialog#${modalID}`);
74
74
 
75
75
  // Create close button is needed
76
- if(dialog.parentNode.closest('form') && !dialog.querySelector(':scope > .dialog__close:first-child'))
77
- dialog.innerHTML = `<button class="dialog__close" formmethod="dialog">Close</button>${dialog.innerHTML}`;
78
- else if(!dialog.parentNode.closest('form') && !dialog.querySelector(':scope > form:first-child'))
79
- dialog.innerHTML = `<form><button class="dialog__close" formmethod="dialog">Close</button></form>${dialog.innerHTML}`;
80
-
81
-
76
+ dialog.innerHTML = `<button class="dialog__close">Close</button>${dialog.innerHTML}`;
77
+
78
+ // remove close button when dialog is closed
79
+ dialog.addEventListener("close", () => {
80
+ const closeButton = dialog.querySelector('.dialog__close');
81
+ dialog.removeChild(closeButton);
82
+ }, { once: true }); // only adds this once
83
+
82
84
  let videoButton = dialog.querySelector('.youtube-embed a');
83
85
 
84
86
  if (videoButton){
@@ -93,11 +95,27 @@ export const addGlobalEvents = (body) => {
93
95
  "id": modalID
94
96
  });
95
97
  };
98
+
96
99
  // Close modal
100
+ if (event && event.target instanceof HTMLElement && event.target.closest('button.dialog__close')){
101
+ const dialog = event.target.closest('dialog[open]');
102
+
103
+ event.preventDefault();
104
+ dialog.close()
105
+
106
+ window.dataLayer = window.dataLayer || [];
107
+ window.dataLayer.push({
108
+ "event": "closeModal",
109
+ "id": dialog.getAttribute('id')
110
+ });
111
+ }
112
+
97
113
  if (event && event.target instanceof HTMLElement && event.target.closest('dialog[open]')){
98
114
  const dialog = event.target.closest('dialog[open]');
99
115
  const dialogDimensions = dialog.getBoundingClientRect()
116
+
100
117
  if (event.clientX < dialogDimensions.left || event.clientX > dialogDimensions.right || event.clientY < dialogDimensions.top || event.clientY > dialogDimensions.bottom) {
118
+
101
119
  dialog.close()
102
120
 
103
121
  window.dataLayer = window.dataLayer || [];
@@ -111,18 +129,49 @@ export const addGlobalEvents = (body) => {
111
129
  // Popover
112
130
  if (event && event.target instanceof HTMLElement && event.target.closest('.dialog__wrapper > button')){
113
131
 
132
+ // Close existing open popover
133
+
114
134
  let btn = event.target.closest('.dialog__wrapper > button');
115
135
  let parent = event.target.closest('.dialog__wrapper > button').parentNode;
116
136
  let dataEvent = "openPopover"
117
137
  let popover = parent.querySelector(':scope > dialog');
118
138
 
139
+
140
+ if(document.querySelector('dialog[open]') && document.querySelector('dialog[open]') != popover)
141
+ document.querySelector('dialog[open]').close();
142
+
143
+
119
144
  if(popover.hasAttribute('open')){
120
145
 
121
146
  popover.close();
122
147
  dataEvent = "closePopover"
148
+
149
+ popover.removeAttribute('style');
150
+ btn.classList.remove('active');
123
151
  }
124
- else
152
+ else {
153
+
125
154
  popover.show();
155
+ btn.classList.add('active');
156
+
157
+ var position = btn.getBoundingClientRect();
158
+ let topOffset = position.top;
159
+ let leftOffset = position.left;
160
+
161
+ if(btn.closest('iam-table')){
162
+
163
+ let container = btn.closest('iam-table').parentNode.getBoundingClientRect();
164
+
165
+ topOffset -= container.top;
166
+ leftOffset -= container.left;
167
+
168
+ }
169
+
170
+ if(popover.classList.contains('dialog--fix')){
171
+ popover.setAttribute('style',`position:fixed;top: ${topOffset}px; left: ${leftOffset}px; margin: 3rem 0 0 0;`)
172
+ }
173
+ }
174
+
126
175
 
127
176
  window.dataLayer = window.dataLayer || [];
128
177
 
@@ -23,8 +23,8 @@ export const addDataAttributes = (table) => {
23
23
  let headingText = tempDiv.textContent || tempDiv.innerText || "";
24
24
  cell.setAttribute('data-label',headingText);
25
25
 
26
- if(heading.hasAttribute('class'))
27
- cell.setAttribute('class',heading.getAttribute('class'))
26
+ if(heading.hasAttribute('data-td-class'))
27
+ cell.setAttribute('class',heading.getAttribute('data-td-class'))
28
28
 
29
29
  if(heading.hasAttribute('data-format')){
30
30
  cell.setAttribute('data-format',heading.getAttribute('data-format'))
@@ -64,10 +64,21 @@ export const getLargestLastColWidth = (table) => {
64
64
 
65
65
  export const createMobileButton = (table) => {
66
66
 
67
+ if(table.closest('.table--fullwidth'))
68
+ return false;
69
+
67
70
  Array.from(table.querySelectorAll('tbody tr')).forEach((row, index) => {
68
71
  let firstCol = row.querySelector(':scope > :is(td,th):first-child');
69
72
  let colContent = firstCol.textContent;
70
- firstCol.innerHTML =`<span class="td__content">${colContent}</span><button type="button" class="d-none">${colContent}</button>`;
73
+
74
+ if(colContent != "")
75
+ firstCol.innerHTML =`<span class="td__content">${colContent}</span><button type="button" class="d-none">${colContent}</button>`;
76
+ else {
77
+
78
+ let secondCol = row.querySelector(':scope > :is(td,th):nth-child(2)');
79
+ let secondColContent = secondCol.textContent;
80
+ secondCol.innerHTML =`<span class="td__content">${secondColContent}</span><button type="button" class="d-none">${secondColContent}</button>`;
81
+ }
71
82
  });
72
83
  }
73
84
 
@@ -137,6 +148,7 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
137
148
  else {
138
149
  filterTable(table, form, wrapper);
139
150
  createPaginationButttons(wrapper,pagination);
151
+ populateDataQueries(table,form);
140
152
  }
141
153
  }
142
154
 
@@ -169,6 +181,11 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
169
181
  formSubmit();
170
182
  }
171
183
 
184
+ if (event && event.target instanceof HTMLElement && event.target.closest('[data-filter]') && event.target.closest('form .dialog__wrapper > dialog')){
185
+
186
+ formSubmit();
187
+ }
188
+
172
189
  if (event && event.target instanceof HTMLElement && event.target.closest('[data-filter]') && !event.target.closest('form dialog')){
173
190
 
174
191
  formSubmit();
@@ -220,6 +237,11 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
220
237
 
221
238
  formSubmit();
222
239
  });
240
+
241
+ form.addEventListener('force', (event) => {
242
+
243
+ formSubmit();
244
+ });
223
245
  }
224
246
 
225
247
  export const sortTable = (table, form, savedTableBody) => {
@@ -298,6 +320,15 @@ export const filterTable = (table, form, wrapper) => {
298
320
  let page = form.querySelector('[data-pagination]') ? parseInt(form.querySelector('[data-pagination]').value) : 1;
299
321
  let showRows = form.querySelector('[data-show]') ? parseInt(form.querySelector('[data-show]').value) : 15;
300
322
 
323
+ // Reset
324
+ Array.from(table.querySelectorAll('tbody tr')).forEach((row, index) => {
325
+ row.classList.remove('filtered');
326
+ row.classList.remove('filtered--matched');
327
+ row.classList.remove('filtered--show');
328
+
329
+ row.removeAttribute('data-filtered-by');
330
+ });
331
+
301
332
  // Filter
302
333
  let filterInputs = Array.from(form.querySelectorAll('[data-filter]'));
303
334
 
@@ -345,6 +376,7 @@ export const filterTable = (table, form, wrapper) => {
345
376
  Array.from(form.querySelectorAll('[data-filter-count]')).forEach((element, index) => {
346
377
  element.innerHTML = '';
347
378
  });
379
+
348
380
  if(filters.length) {
349
381
 
350
382
  Array.from(form.querySelectorAll('[data-filter-count]')).forEach((element, index) => {
@@ -353,25 +385,16 @@ export const filterTable = (table, form, wrapper) => {
353
385
  }
354
386
 
355
387
  // Stop function if no filters identified
356
- if(!searches.length && !filters.length)
388
+ if(!Object.keys(searches).length && !Object.keys(filters).length)
357
389
  return false;
358
390
 
359
391
  table.classList.add('table--filtered');
360
392
 
361
- // Reset
362
- Array.from(table.querySelectorAll('tbody tr')).forEach((row, index) => {
363
- row.classList.remove('filtered');
364
- row.classList.remove('filtered--matched');
365
- row.classList.remove('filtered--show');
366
-
367
- row.removeAttribute('data-filtered-by');
368
- });
369
393
 
370
394
  // Filter the table
371
395
 
372
396
  for (const [key, filterValue] of Object.entries(filters)) {
373
397
 
374
- console.log(filterValue)
375
398
  Array.from(table.querySelectorAll('tbody tr:not(.filtered)')).forEach((row, index) => {
376
399
 
377
400
  let isMatched = false;
@@ -493,7 +516,6 @@ export const filterTable = (table, form, wrapper) => {
493
516
  wrapper.setAttribute('data-show',showRows);
494
517
  }
495
518
 
496
- populateDataQueries(table,form);
497
519
  }
498
520
 
499
521
  export const populateDataQueries = (table,form) => {
@@ -506,7 +528,7 @@ export const populateDataQueries = (table,form) => {
506
528
  let numberOfMatchedRows: 0;
507
529
 
508
530
  if(query == 'total'){
509
- numberOfMatchedRows = table.classList.contains('table--filtered') ? table.querySelectorAll('tbody tr:not(.filtered)').length : table.querySelectorAll('tbody tr').length;
531
+ numberOfMatchedRows = table.classList.contains('table--filtered') ? table.querySelectorAll('tbody tr').length : table.querySelectorAll('tbody tr').length;
510
532
  }
511
533
  else if(!query.includes(' == ') && query.includes(' & ')){
512
534
 
@@ -516,8 +538,7 @@ export const populateDataQueries = (table,form) => {
516
538
  queries.forEach(element => {
517
539
  selector += `:not([data-filtered-by="${element}"])`;
518
540
  });
519
-
520
- console.log(selector)
541
+
521
542
  numberOfMatchedRows = Array.from(table.querySelectorAll(`tbody tr${selector}`)).length;
522
543
  }
523
544
  else if(!query.includes(' == ')){
@@ -547,7 +568,6 @@ export const populateDataQueries = (table,form) => {
547
568
  else {
548
569
 
549
570
  let queryParts = query.split(' == ');
550
- console.log(queryParts[0]);
551
571
  numberOfMatchedRows = Array.from(table.querySelectorAll(`tbody tr.filtered--matched td[data-label="${queryParts[0]}"], tbody tr[data-filtered-by="${queryParts[0]}"] td[data-label="${queryParts[0]}"]`)).filter(function(element){
552
572
  return element.textContent === queryParts[1];
553
573
  }).length;
@@ -46,15 +46,20 @@ export const setTabsEventHandlers = function(tabsElement: Element){
46
46
 
47
47
  let details = tabsElement.querySelectorAll(':scope > details');
48
48
  let summaries = tabsElement.querySelectorAll(':scope > details > summary');
49
- let buttons = tabsElement.querySelectorAll(':scope > .tabs__links > button, .tabs__links > a');
49
+ let buttons = tabsElement.querySelectorAll(':scope .tabs__links > .link');
50
50
 
51
51
  if(tabsElement.shadowRoot)
52
- buttons = tabsElement.shadowRoot.querySelectorAll('.tabs__links > button, .tabs__links > a');
52
+ buttons = tabsElement.shadowRoot.querySelectorAll('.tabs__links > .link');
53
+
54
+ console.log(buttons)
53
55
 
54
56
  // Set the on click for the tab buttons, these will open the details box it matches too
55
57
  buttons.forEach((button) => {
56
58
 
57
59
  button.addEventListener("click", (e) => {
60
+
61
+ console.log('hi')
62
+
58
63
  e.preventDefault();
59
64
  buttons.forEach((buttonLoopItem) => {
60
65
 
@@ -11,7 +11,7 @@ const basicTable = `<thead>
11
11
  <th>Heading 3</th>
12
12
  </tr>
13
13
  </thead>
14
- <tbody
14
+ <tbody>
15
15
  <tr>
16
16
  <td>Cell 1</td>
17
17
  <td>Low</td>
@@ -168,14 +168,14 @@ describe('populateDataQueries', () => {
168
168
  const table = document.createElement('table');
169
169
  table.innerHTML = basicTable;
170
170
  const form = document.createElement('form');
171
- form.innerHTML += `<div><span data-query="total"></span><span data-query="Heading 2 == Low"></span></div>`;
171
+ form.innerHTML += `<div><input name="heading" value="Low" data-filter="Heading 2" /><span data-query="total"></span><span data-query="Heading 2 == Low"></span></div>`;
172
172
 
173
173
  tableModule.addDataAttributes(table);
174
+ tableModule.filterTable(table, form, document.createElement('div'));
174
175
  tableModule.populateDataQueries(table, form);
175
176
 
176
177
  test('should populate elements with the data-query attribute with the result of the corresponding query', () => {
177
178
 
178
-
179
179
  expect(form.querySelector('[data-query="total"]').textContent).toEqual('4');
180
180
  expect(form.querySelector('[data-query="Heading 2 == Low"]').textContent).toEqual('2');
181
181
  });