@iamproperty/components 3.7.6 → 3.7.8--beta

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 (58) hide show
  1. package/assets/css/components/card-global.css +1 -0
  2. package/assets/css/components/card-global.css.map +1 -0
  3. package/assets/css/components/card.css +1 -1
  4. package/assets/css/components/card.css.map +1 -1
  5. package/assets/css/components/forms.css +1 -1
  6. package/assets/css/components/forms.css.map +1 -1
  7. package/assets/css/components/table.css +1 -1
  8. package/assets/css/components/table.css.map +1 -1
  9. package/assets/css/core.min.css +1 -1
  10. package/assets/css/core.min.css.map +1 -1
  11. package/assets/css/style.min.css +1 -1
  12. package/assets/css/style.min.css.map +1 -1
  13. package/assets/js/bundle.js +2 -0
  14. package/assets/js/components/accordion/accordion.component.min.js +1 -1
  15. package/assets/js/components/applied-filters/applied-filters.component.min.js +1 -1
  16. package/assets/js/components/card/card.component.js +36 -12
  17. package/assets/js/components/card/card.component.min.js +5 -5
  18. package/assets/js/components/card/card.component.min.js.map +1 -1
  19. package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
  20. package/assets/js/components/header/header.component.min.js +1 -1
  21. package/assets/js/components/notification/notification.component.min.js +1 -1
  22. package/assets/js/components/pagination/pagination.component.min.js +1 -1
  23. package/assets/js/components/table/table.component.min.js +7 -7
  24. package/assets/js/components/table/table.component.min.js.map +1 -1
  25. package/assets/js/components/tabs/tabs.component.min.js +1 -1
  26. package/assets/js/dynamic.js +2 -0
  27. package/assets/js/dynamic.min.js +5 -5
  28. package/assets/js/dynamic.min.js.map +1 -1
  29. package/assets/js/flat-components.js +2 -0
  30. package/assets/js/modules/dialogs.js +2 -1
  31. package/assets/js/modules/inputs.js +62 -0
  32. package/assets/js/modules/table.js +13 -8
  33. package/assets/js/scripts.bundle.js +13 -13
  34. package/assets/js/scripts.bundle.js.map +1 -1
  35. package/assets/js/scripts.bundle.min.js +2 -2
  36. package/assets/js/scripts.bundle.min.js.map +1 -1
  37. package/assets/sass/_corefiles.scss +2 -0
  38. package/assets/sass/_forms.scss +3 -3
  39. package/assets/sass/components/card-global.scss +20 -0
  40. package/assets/sass/components/card.scss +26 -3
  41. package/assets/sass/components/forms.scss +497 -113
  42. package/assets/sass/components/table.scss +13 -3
  43. package/assets/sass/foundations/links.scss +6 -2
  44. package/assets/sass/foundations/reboot.scss +3 -3
  45. package/assets/ts/bundle.ts +2 -0
  46. package/assets/ts/components/card/README.md +1 -0
  47. package/assets/ts/components/card/card.component.ts +55 -13
  48. package/assets/ts/dynamic.ts +2 -0
  49. package/assets/ts/flat-components.ts +2 -0
  50. package/assets/ts/modules/dialogs.ts +2 -1
  51. package/assets/ts/modules/inputs.ts +88 -0
  52. package/assets/ts/modules/table.ts +15 -10
  53. package/dist/components.es.js +150 -134
  54. package/dist/components.umd.js +20 -20
  55. package/package.json +1 -1
  56. package/src/components/Card/README.md +1 -0
  57. package/src/components/Input/Input.vue +11 -7
  58. package/src/components/Input/README.md +1 -3
@@ -508,14 +508,17 @@ table {
508
508
  [data-content="medium"],
509
509
  [data-content="high"],
510
510
  [data-content="unknown"],
511
+ [data-content="due"],
511
512
  [data-content="overdue"],
512
513
  [data-content="incomplete"],
513
514
  [data-content="requires approval"],
515
+ [data-content="upcoming"],
514
516
  [data-content="approval required"],
515
517
  [data-content="warning"],
516
518
  [data-content="verified"],
517
519
  [data-content="not started"],
518
520
  [data-content="to do"],
521
+ [data-content="on track"],
519
522
  [data-content="completed"],
520
523
  [data-content="complete"],
521
524
  .alert-status:not([data-content="0"]):not([data-content=""]):not(:empty)
@@ -569,27 +572,34 @@ table {
569
572
  color: var(--colour-muted);
570
573
  }
571
574
 
572
- :is([data-content="overdue"],[data-content="incomplete"]):after {
575
+ :is([data-content="overdue"],[data-content="due"],[data-content="incomplete"]):after {
573
576
 
574
577
  content: "\f024";
575
578
  font-weight: light;
576
579
  color: var(--colour-danger);
577
580
  }
578
581
 
579
- :is([data-content="not started"],[data-content="to do"]):after {
582
+ :is([data-content="not started"],[data-content="to do"],[data-content="on track"]):after {
580
583
 
581
584
  content: "\f024";
582
585
  font-weight: light;
583
586
  color: var(--colour-muted);
584
587
  }
585
588
 
586
- :is([data-content="requires approval"],[data-content="approval required"],[data-content="warning"]):after {
589
+ :is([data-content="requires approval"],[data-content="approval required"],[data-content="upcoming"]):after {
587
590
 
588
591
  content: "\f024";
589
592
  font-weight: light;
590
593
  color: var(--colour-warning);
591
594
  }
592
595
 
596
+ :is([data-content="warning"]):after {
597
+
598
+ content: "\f071";
599
+ font-weight: light;
600
+ color: var(--colour-warning);
601
+ }
602
+
593
603
  :is([data-content="verified"],[data-content="completed"],[data-content="complete"]):after {
594
604
 
595
605
  content: "\f00c";
@@ -105,11 +105,15 @@ a:where(:not(.btn):not(:has(.card)):not(:has(iam-card))),
105
105
  background: none;
106
106
  padding:0;
107
107
  display: flex;
108
- margin: 0 0 rem(24) 0;
108
+
109
+ &:not([class*="col"]){
110
+ margin: 0 0 rem(24) 0;
111
+ }
112
+
109
113
  outline: none!important;
110
114
  text-decoration: none;
111
115
 
112
- &:not(.d-inline-block){
116
+ &:not(.d-inline-block):not([class*="col"]){
113
117
 
114
118
  width: 100%;
115
119
  }
@@ -55,18 +55,18 @@ body {
55
55
  }
56
56
 
57
57
  // #region scrollbars
58
- :is(div,form,fieldset)::-webkit-scrollbar {
58
+ :is(div,form,fieldset,textarea)::-webkit-scrollbar {
59
59
  width: 10px;
60
60
  height: 10px;
61
61
  }
62
62
 
63
- :is(div,form,fieldset)::-webkit-scrollbar-track {
63
+ :is(div,form,fieldset,textarea)::-webkit-scrollbar-track {
64
64
  background-color: #f1f1f1;
65
65
  border-top: 4px solid var(--colour-canvas-2);
66
66
  border-left: 4px solid var(--colour-canvas-2);
67
67
  }
68
68
 
69
- :is(div,form,fieldset)::-webkit-scrollbar-thumb {
69
+ :is(div,form,fieldset,textarea)::-webkit-scrollbar-thumb {
70
70
  background-color: #c1c1c1;
71
71
  width: 6px;
72
72
  border-top: 4px solid var(--colour-canvas-2);
@@ -3,6 +3,7 @@
3
3
  import * as helpers from '../js/modules/helpers'
4
4
  import extendDialogs from '../js/modules/dialogs'
5
5
  import createDataLayer from '../js/modules/data-layer'
6
+ import extendInputs from '../js/modules/inputs';
6
7
  import nav from '../js/modules/nav'
7
8
  //import accordion from './modules/accordion'
8
9
  import testimonial from '../js/modules/testimonial'
@@ -27,6 +28,7 @@ document.addEventListener("DOMContentLoaded", function() {
27
28
  helpers.addBodyClasses(document.body);
28
29
  helpers.addGlobalEvents(document.body);
29
30
  extendDialogs(document.body);
31
+ extendInputs(document.body);
30
32
  //helpers.checkElements(document.body);
31
33
 
32
34
  if (!window.customElements.get(`iam-header`))
@@ -21,3 +21,4 @@ The card component needs to be wrapped with a link or a button, this is required
21
21
  - Adding a class of **.colour-danger** will add a left hand border with the danger colour (See status card). This works with all of the theme
22
22
  - Adding a class of **.border-o** will remove the box-shadow of the card and make some minor sizing adjustments.
23
23
  - Adding a class like **.colour-warning** will update the colour of the left berder for the card. The theme colours will be avialable to use.
24
+ - Adding a class of **.card--flag** will add a card to the top right corner.
@@ -53,30 +53,53 @@ class iamCard extends HTMLElement {
53
53
 
54
54
  parentNode.setAttribute('tabindex','-1');
55
55
 
56
+
56
57
  if(parentNode.matches('label[for]')){
57
58
 
58
- let isChecked = document.getElementById(parentNode.getAttribute('for')).checked
59
+ let isChecked = document.getElementById(parentNode.getAttribute('for')).checked;
59
60
 
60
61
  if(isChecked)
61
- card.classList.add('active');
62
+ card.classList.add('checked');
63
+ else
64
+ card.classList.remove('checked');
62
65
  }
63
66
 
64
67
  card.addEventListener('click', (event) => {
65
68
 
66
69
  if(parentNode.matches('label[for]')){
67
70
 
68
- let isChecked = document.getElementById(parentNode.getAttribute('for')).checked
71
+ event.stopPropagation();
72
+ event.preventDefault();
73
+
74
+ const input = document.getElementById(parentNode.getAttribute('for'))
75
+
76
+ const inputName = input.getAttribute('name');
77
+ const inputID = input.getAttribute('id');
78
+
79
+ const inputs = Array.from(document.querySelectorAll(`[name="${inputName}"]:not([id="${inputID}"])`));
80
+
81
+ inputs.forEach((input, index) => {
69
82
 
70
- if(!isChecked)
71
- card.classList.add('active');
72
- else
73
- card.classList.remove('active');
74
- }
75
- else {
83
+ const otherCard = document.querySelector(`[for="${input.getAttribute('id')}"] iam-card`);
84
+
85
+ otherCard.dispatchEvent(new Event('inactive'));
86
+ });
87
+
76
88
  parentNode.click();
89
+ let isChecked = input.checked
90
+
91
+ if(isChecked)
92
+ card.classList.add('checked');
93
+ else
94
+ card.classList.remove('checked');
95
+
77
96
  }
78
97
  });
79
98
 
99
+ this.addEventListener('inactive', (event) => {
100
+ card.classList.remove('checked');
101
+ });
102
+
80
103
  card.addEventListener('keydown', (event) => {
81
104
 
82
105
  switch(event.keyCode)
@@ -85,12 +108,31 @@ class iamCard extends HTMLElement {
85
108
  case 13:
86
109
  if(parentNode.matches('label[for]')){
87
110
 
88
- let isChecked = document.getElementById(parentNode.getAttribute('for')).checked
111
+ event.stopPropagation();
112
+ event.preventDefault();
113
+
114
+ const input = document.getElementById(parentNode.getAttribute('for'))
115
+
116
+ const inputName = input.getAttribute('name');
117
+ const inputID = input.getAttribute('id');
118
+
119
+ const inputs = Array.from(document.querySelectorAll(`[name="${inputName}"]:not([id="${inputID}"])`));
120
+
121
+ inputs.forEach((input, index) => {
122
+
123
+ const otherCard = document.querySelector(`[for="${input.getAttribute('id')}"] iam-card`);
124
+
125
+ otherCard.dispatchEvent(new Event('inactive'));
126
+ });
127
+
128
+ parentNode.click();
129
+ let isChecked = input.checked
89
130
 
90
- if(!isChecked)
91
- card.classList.add('active');
131
+ if(isChecked)
132
+ card.classList.add('checked');
92
133
  else
93
- card.classList.remove('active');
134
+ card.classList.remove('checked');
135
+
94
136
  }
95
137
  else {
96
138
  parentNode.click();
@@ -3,6 +3,7 @@
3
3
  import * as helpers from '../js/modules/helpers'
4
4
  import extendDialogs from '../js/modules/dialogs'
5
5
  import createDataLayer from '../js/modules/data-layer'
6
+ import extendInputs from '../js/modules/inputs';
6
7
  import nav from '../js/modules/nav'
7
8
  import table from '../js/modules/table'
8
9
  //import accordion from './modules/accordion'
@@ -63,6 +64,7 @@ document.addEventListener("DOMContentLoaded", function() {
63
64
  helpers.addGlobalEvents(document.body);
64
65
  //helpers.checkElements(document.body);
65
66
  extendDialogs(document.body);
67
+ extendInputs(document.body);
66
68
 
67
69
 
68
70
  if (!window.customElements.get(`iam-notification`))
@@ -3,6 +3,7 @@
3
3
  import * as helpers from '../js/modules/helpers'
4
4
  import extendDialogs from '../js/modules/dialogs'
5
5
  import createDataLayer from '../js/modules/data-layer'
6
+ import extendInputs from '../js/modules/inputs';
6
7
  import nav from '../js/modules/nav'
7
8
  import * as tableModule from './modules/table'
8
9
  import accordion from './modules/accordion'
@@ -25,6 +26,7 @@ document.addEventListener("DOMContentLoaded", function() {
25
26
  helpers.addGlobalEvents(document.body);
26
27
  //helpers.checkElements(document.body);
27
28
  extendDialogs(document.body);
29
+ extendInputs(document.body);
28
30
 
29
31
  // ANav
30
32
  Array.from(document.querySelectorAll('.nav')).forEach((arrayElement) => {
@@ -86,7 +86,8 @@ const extendDialogs = (body) => {
86
86
 
87
87
  if (event.clientX < dialogDimensions.left || event.clientX > dialogDimensions.right || event.clientY < dialogDimensions.top || event.clientY > dialogDimensions.bottom) {
88
88
 
89
- dialog.close()
89
+ if(!event.target.closest('input[type="radio"]')) // Weird bug when interacting with radio input fields within dialogs cuases it to close
90
+ dialog.close()
90
91
 
91
92
  window.dataLayer = window.dataLayer || [];
92
93
  window.dataLayer.push({
@@ -0,0 +1,88 @@
1
+ // @ts-nocheck
2
+ const extendInputs = (body) => {
3
+
4
+ document.addEventListener("load", function() {
5
+
6
+ console.log(Array.from(document.querySelectorAll('input[maxlength]')))
7
+ // maxlength counter init
8
+ Array.from(document.querySelectorAll('input')).forEach((input,index) => {
9
+ let wrapper = input.parentElement;
10
+ setMaxlengthVars(input,wrapper);
11
+ });
12
+ });
13
+
14
+ body.addEventListener('input', (event) => {
15
+ if (event && event.target instanceof HTMLElement && event.target.closest('input,textarea,select')){
16
+
17
+ const input = event.target.closest('input,textarea,select');
18
+ const wrapper = input.parentElement;
19
+
20
+ // Output the color hex
21
+ if(input.hasAttribute('type') && input.getAttribute('type') == 'color')
22
+ input.nextElementSibling.value = input.value;
23
+
24
+ if(input.hasAttribute('maxlength') && input.nextElementSibling)
25
+ input.nextElementSibling.setAttribute("data-count", input.value.length);
26
+ }
27
+ });
28
+
29
+ body.addEventListener('change', (event) => {
30
+ if (event && event.target instanceof HTMLElement && event.target.closest('select')){
31
+
32
+ const select = event.target.closest('select');
33
+
34
+ console.log(select)
35
+
36
+ if(select.hasAttribute('data-change-type') && select.hasAttribute('data-input')){
37
+
38
+ const input = document.getElementById(select.getAttribute('data-input'));
39
+ const newType = select.value;
40
+ changeType(input,newType);
41
+ }
42
+ }
43
+ });
44
+
45
+ body.addEventListener('click', (event) => {
46
+
47
+ if (event && event.target instanceof HTMLElement && event.target.closest('[data-change-type][data-input]:not(select)')){
48
+
49
+ const button = event.target.closest('[data-change-type]');
50
+ const input = document.getElementById(button.getAttribute('data-input'));
51
+ const newType = button.getAttribute('data-change-type');
52
+ button.setAttribute('data-change-type',input.getAttribute('type'));
53
+
54
+ changeType(input,newType);
55
+
56
+ if(button.hasAttribute('data-alt-class')){
57
+ const newClass = button.getAttribute('data-alt-class');
58
+ button.setAttribute('data-alt-class',button.getAttribute('class'));
59
+ button.setAttribute('class',newClass);
60
+ }
61
+ }
62
+ });
63
+ }
64
+
65
+ export const setMaxlengthVars = (input) => {
66
+ let wrapper = input.parentElement;
67
+ let maxlength = input.getAttribute('maxlength')
68
+
69
+ wrapper.style.setProperty("--maxlength", maxlength);
70
+
71
+
72
+ let span = input.nextElementSibling;
73
+
74
+ if(!span || (span && span.classList.contains('invalid-feedback'))){
75
+
76
+ span = document.createElement('span');
77
+ wrapper.insertBefore(span, input.nextSibling);
78
+ }
79
+
80
+ span.setAttribute('data-count',input.value.length);
81
+ }
82
+
83
+ export const changeType = (input,type) => {
84
+
85
+ input.setAttribute('type',type);
86
+ }
87
+
88
+ export default extendInputs;
@@ -11,7 +11,7 @@ export const addDataAttributes = (table) => {
11
11
  colRows.forEach((row, index) => {
12
12
 
13
13
  const cells = Array.from(row.querySelectorAll('th, td'));
14
- const statuses = ['0','low','medium','high','unknown','n/a','pending','verified','overdue','incomplete','complete','completed','approval required','requires approval','to do','not started','warning','error'];
14
+ const statuses = ['0','low','medium','high','unknown','n/a','pending','verified','due','overdue','incomplete','complete','completed','approval required','upcoming','requires approval','to do','on track','not started','warning','error'];
15
15
 
16
16
  cells.forEach((cell, cellIndex) => {
17
17
 
@@ -191,12 +191,17 @@ export const addFilterEventListeners = (table, form, pagination, wrapper, savedT
191
191
  formSubmit();
192
192
  }
193
193
 
194
- if (event && event.target instanceof HTMLElement && event.target.closest('[data-filter]') && event.target.closest('form .dialog__wrapper > dialog')){
194
+ if (event && event.target instanceof HTMLElement && event.target.closest('[data-filter][data-no-ajax]')){ // Allow for input fields to filter the current results without a new ajax call
195
+
196
+ filterTable(table, form, wrapper);
197
+ createPaginationButttons(wrapper,pagination);
198
+ populateDataQueries(table,form);
199
+ }
200
+ else if (event && event.target instanceof HTMLElement && event.target.closest('[data-filter]') && event.target.closest('form .dialog__wrapper > dialog')){
195
201
 
196
202
  formSubmit();
197
203
  }
198
-
199
- if (event && event.target instanceof HTMLElement && event.target.closest('[data-filter]') && !event.target.closest('form dialog')){
204
+ else if (event && event.target instanceof HTMLElement && event.target.closest('[data-filter]') && !event.target.closest('form dialog')){
200
205
 
201
206
  formSubmit();
202
207
  }
@@ -371,6 +376,9 @@ export const sortTable = (table, form, savedTableBody) => {
371
376
 
372
377
  let rowIndex = tableRow.querySelector('td[data-label="'+sortBy+'"], th[data-label="'+sortBy+'"]').textContent.trim();
373
378
 
379
+ if(tableRow.querySelector('[data-label="'+sortBy+'"] .td__content'))
380
+ rowIndex = tableRow.querySelector('[data-label="'+sortBy+'"] .td__content').textContent.trim();
381
+
374
382
  // If a predefined order set replace the search term with an ordered numeric value so it can be sorted
375
383
  if(orderArray.length && orderArray.includes(rowIndex)){
376
384
  rowIndex = orderArray.indexOf(rowIndex);
@@ -781,12 +789,8 @@ export const makeTableFunctional = function(table, form, pagination, wrapper){
781
789
  // Work out the largest width of the CTA's in the last column
782
790
  if(wrapper && wrapper.classList.contains('table--cta')){
783
791
 
784
- if(!wrapper.hasAttribute('data-cta-width')){
785
-
786
- const largestWidth = getLargestLastColWidth(table);
787
- wrapper.style.setProperty("--cta-width", `${largestWidth}rem`);
788
- wrapper.setAttribute("data-cta-width", `${largestWidth}rem`);
789
- }
792
+ const largestWidth = getLargestLastColWidth(table);
793
+ wrapper.style.setProperty("--cta-width", `${largestWidth}rem`);
790
794
 
791
795
  function outputsize() {
792
796
 
@@ -919,6 +923,7 @@ export const loadAjaxTable = async function (table, form, pagination, wrapper){
919
923
  wrapper.setAttribute('data-page', parseInt(currentPage));
920
924
  wrapper.setAttribute('data-pages', Math.ceil(wrapper.getAttribute('data-total') / wrapper.getAttribute('data-show')));
921
925
 
926
+ filterTable(table, form, wrapper);
922
927
  makeTableFunctional(table, form, pagination, wrapper);
923
928
  createPaginationButttons(wrapper, pagination);
924
929