@iamproperty/components 5.7.1-beta3 → 5.7.1-beta4

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 (48) hide show
  1. package/assets/css/components/barchart.component.css +1 -0
  2. package/assets/css/components/barchart.component.css.map +1 -0
  3. package/assets/css/components/charts.config.css +1 -0
  4. package/assets/css/components/charts.config.css.map +1 -0
  5. package/assets/css/components/charts.module.css +1 -0
  6. package/assets/css/components/charts.module.css.map +1 -0
  7. package/assets/css/core.min.css +1 -1
  8. package/assets/css/core.min.css.map +1 -1
  9. package/assets/css/style.min.css +1 -1
  10. package/assets/css/style.min.css.map +1 -1
  11. package/assets/js/components/accordion/accordion.component.min.js +1 -1
  12. package/assets/js/components/actionbar/actionbar.component.min.js +1 -1
  13. package/assets/js/components/address-lookup/address-lookup.component.min.js +1 -1
  14. package/assets/js/components/applied-filters/applied-filters.component.min.js +1 -1
  15. package/assets/js/components/barchart/barchart.component.js +53 -0
  16. package/assets/js/components/barchart/barchart.component.min.js +21 -0
  17. package/assets/js/components/barchart/barchart.component.min.js.map +1 -0
  18. package/assets/js/components/card/card.component.min.js +1 -1
  19. package/assets/js/components/carousel/carousel.component.min.js +1 -1
  20. package/assets/js/components/collapsible-side/collapsible-side.component.min.js +1 -1
  21. package/assets/js/components/fileupload/fileupload.component.min.js +1 -1
  22. package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
  23. package/assets/js/components/header/header.component.min.js +1 -1
  24. package/assets/js/components/inline-edit/inline-edit.component.min.js +1 -1
  25. package/assets/js/components/marketing/marketing.component.min.js +1 -1
  26. package/assets/js/components/multiselect/multiselect.component.min.js +1 -1
  27. package/assets/js/components/nav/nav.component.min.js +1 -1
  28. package/assets/js/components/notification/notification.component.min.js +1 -1
  29. package/assets/js/components/pagination/pagination.component.min.js +1 -1
  30. package/assets/js/components/search/search.component.min.js +1 -1
  31. package/assets/js/components/slider/slider.component.min.js +1 -1
  32. package/assets/js/components/table/table.component.min.js +1 -1
  33. package/assets/js/components/tabs/tabs.component.min.js +1 -1
  34. package/assets/js/dynamic.min.js +1 -1
  35. package/assets/js/modules/chart.module.js +350 -0
  36. package/assets/js/scripts.bundle.js +1 -1
  37. package/assets/js/scripts.bundle.min.js +1 -1
  38. package/assets/sass/_corefiles.scss +2 -0
  39. package/assets/sass/components/barchart.component.scss +341 -0
  40. package/assets/sass/components/charts.config.scss +79 -0
  41. package/assets/sass/components/charts.module.scss +652 -0
  42. package/assets/ts/components/barchart/README.md +37 -0
  43. package/assets/ts/components/barchart/barchart.component.ts +79 -0
  44. package/assets/ts/modules/chart.module.ts +506 -0
  45. package/dist/components.es.js +11 -11
  46. package/dist/components.umd.js +11 -11
  47. package/package.json +1 -1
  48. package/src/components/BarChart/BarChart.vue +25 -0
@@ -0,0 +1,79 @@
1
+ // @ts-nocheck
2
+ import {addClasses,setupChart,setEventListener,setEventObservers,setLongestLabel,setLongestValue,createTooltips} from "../../modules/chart.module";
3
+
4
+
5
+ // TODO: tooltip
6
+ // TODO: responsive 'fit-content' classes done through JS
7
+
8
+ class iamBarChart extends HTMLElement {
9
+
10
+ constructor(){
11
+ super();
12
+ this.attachShadow({ mode: 'open'});
13
+
14
+ const assetLocation = document.body.hasAttribute('data-assets-location') ? document.body.getAttribute('data-assets-location') : '/assets';
15
+ const loadCSS = `@import "${assetLocation}/css/components/barchart.component.css";`;
16
+
17
+ const template = document.createElement('template');
18
+ template.innerHTML = `
19
+ <style>
20
+ ${loadCSS}
21
+ </style>
22
+ <slot name="before"></slot>
23
+ <div class="chart__outer" part="outer">
24
+ <div class="chart__key" part="chart-key"></div>
25
+ <div class="chart__wrapper" part="wrapper">
26
+ <div class="chart__yaxis" part="yaxis"></div>
27
+ <div class="chart" part="chart">
28
+ <div class="chart__guidelines" part="guidelines"></div>
29
+ </div>
30
+ </div>
31
+ <div class="chart__spacer"><span part="spacer"></span</div>
32
+ </div>
33
+ <slot name="after"></slot>`;
34
+
35
+ this.shadowRoot.appendChild(template.content.cloneNode(true));
36
+ }
37
+
38
+ connectedCallback() {
39
+
40
+ const chartComponent = this;
41
+
42
+ const chartID = `chart-${Date.now()+(Math.floor(Math.random() * 100) + 1)}`;
43
+
44
+ const orginalTable = this.querySelector('table');
45
+ const clonedTable = orginalTable.cloneNode(true);
46
+
47
+
48
+ const chart = this.shadowRoot.querySelector('.chart');
49
+ const chartOuter = this.shadowRoot.querySelector('.chart__outer');
50
+
51
+
52
+ chart.appendChild(clonedTable);
53
+
54
+ addClasses(chartComponent);
55
+
56
+
57
+ const barCount = chart.querySelectorAll('td:not(:first-child)').length;
58
+
59
+ if(barCount < 10){
60
+
61
+ chartComponent.classList.add('chart--fit-content');
62
+ }
63
+
64
+ setupChart(chartComponent,chartOuter,clonedTable);
65
+ setEventObservers(chartComponent,chartOuter);
66
+ setEventListener(chartOuter);
67
+ setLongestLabel(chartOuter);
68
+ setLongestValue(chartOuter);
69
+
70
+ createTooltips(chartOuter);
71
+ }
72
+
73
+ attributeChangedCallback(attrName, oldVal, newVal) {
74
+
75
+
76
+ }
77
+ }
78
+
79
+ export default iamBarChart;
@@ -0,0 +1,506 @@
1
+ import { numberOfDays } from './helpers'
2
+
3
+ // #region Functions that setup and trigger other functions
4
+
5
+ export const addClasses = (chartElement:any) => {
6
+
7
+ // add colour classes
8
+ for (let i = 1; i <= 10; i++) {
9
+ if(chartElement.hasAttribute(`data-colour-${i}`)){
10
+
11
+ let colour = chartElement.getAttribute(`data-colour-${i}`);
12
+
13
+ chartElement.style.setProperty(`--chart-colour-${i}`, `var(--chart-colour-${colour})`);
14
+ chartElement.style.setProperty(`--chart-colour-${i}-hover`, `var(--chart-colour-${colour}-hover)`);
15
+ }
16
+ }
17
+
18
+ return true;
19
+ };
20
+
21
+
22
+ export const setupChart = (chartElement:any,chartOuter:any,tableElement:any) => {
23
+
24
+ // #region Reset the chart
25
+ // empty divs to re-populate
26
+ const chartKey = chartOuter.querySelector('.chart__key');
27
+ chartKey.innerHTML = '';
28
+ const chartGuidelines = chartOuter.querySelector('.chart__guidelines');
29
+ chartGuidelines.innerHTML = ``;
30
+ const chartYaxis = chartOuter.querySelector('.chart__yaxis');
31
+ chartYaxis.innerHTML = ``;
32
+
33
+ // Remove old input fields
34
+ Array.from(chartOuter.querySelectorAll(':scope > input[type="checkbox"],:scope > input[type="radio"]')).map((element: any) => { element.remove(); })
35
+ // #endregion
36
+
37
+ let {xaxis} = getChartData(chartElement,chartOuter);
38
+
39
+ setCellData(chartElement,chartOuter,tableElement);
40
+
41
+ createChartKey(chartOuter,tableElement,chartKey);
42
+ createChartGuidelines(chartElement,chartOuter,chartGuidelines);
43
+ createChartYaxis(chartElement,chartOuter,chartYaxis);
44
+
45
+ if(xaxis){
46
+ createXaxis(chartElement,chartOuter,xaxis);
47
+ }
48
+
49
+
50
+
51
+ return true;
52
+ };
53
+ // #endregion
54
+
55
+ // #region Event handlers and observers
56
+ export const setEventListener = function(chartOuter:any) {
57
+
58
+ let chart = chartOuter.querySelector('.chart');
59
+ chart.addEventListener('mousemove', (event:any) => {
60
+
61
+ if (event && event.target instanceof HTMLElement && event.target.closest('td:not(:first-child')){
62
+
63
+ let column = event.target.closest('td:not(:first-child')
64
+
65
+ var rect = column.getBoundingClientRect();
66
+
67
+ let x = event.clientX - rect.left;
68
+ let y = event.clientY - rect.top;
69
+ chart.setAttribute('style', `--cursor-x: ${x}px; --cursor-y: ${y}px;`)
70
+ }
71
+ });
72
+
73
+ // Use the part for the chart items to pass through states to the pages CSS
74
+ let labels = chartOuter.querySelectorAll('label');
75
+
76
+ Array.from(labels).forEach((label:HTMLElement) => {
77
+
78
+ if(chartOuter.querySelector(`input#${label.getAttribute('for')}`).checked)
79
+ label.setAttribute('part','key-checked');
80
+ else
81
+ label.setAttribute('part','key-unchecked');
82
+ });
83
+
84
+ chartOuter.addEventListener('change', function(){
85
+
86
+ Array.from(labels).forEach((label:HTMLElement) => {
87
+
88
+ if(chartOuter.querySelector(`input#${label.getAttribute('for')}`).checked)
89
+ label.setAttribute('part','key-checked');
90
+ else
91
+ label.setAttribute('part','key-unchecked');
92
+ });
93
+ });
94
+ }
95
+
96
+ export const setEventObservers = function(chartElement:any,chartOuter:any) {
97
+
98
+ let table = chartElement.querySelector('table');
99
+ let shadowTable = chartOuter.querySelector('table');
100
+
101
+ const attributesUpdated = (mutationList:any, observer:any) => {
102
+
103
+ observer.disconnect();
104
+ observer2.disconnect();
105
+
106
+ for (const mutation of mutationList) {
107
+
108
+ if(mutation.attributeName == 'class' || (mutation.type === 'attributes' && mutation.attributeName === 'data-total') || mutation.type === 'attributes') {
109
+
110
+ shadowTable.innerHTML = table.innerHTML;
111
+ setupChart(chartElement,chartOuter,shadowTable);
112
+ }
113
+ }
114
+
115
+ observer.observe(table, { characterData: true, subtree: true });
116
+ observer2.observe(chartElement, { attributes: true });
117
+ };
118
+
119
+ const tableUpdated = (mutationList:any, observer:any) => {
120
+
121
+ observer.disconnect();
122
+ observer2.disconnect();
123
+
124
+ for (const mutation of mutationList) {
125
+
126
+ if(mutation.type == "characterData" || (mutation.type == "childList" && mutation.addedNodes.length)){
127
+
128
+ shadowTable.innerHTML = table.innerHTML;
129
+ setupChart(chartElement,chartOuter,shadowTable);
130
+ }
131
+ }
132
+
133
+ observer.observe(table, { characterData: true, subtree: true });
134
+ observer2.observe(chartElement, { attributes: true });
135
+ };
136
+
137
+
138
+ let observer = new MutationObserver(tableUpdated);
139
+ let observer2 = new MutationObserver(attributesUpdated);
140
+
141
+ observer.observe(table, { characterData: true, subtree: true });
142
+ observer2.observe(chartElement, { attributes: true });
143
+
144
+ return true;
145
+ };
146
+ // #endregion
147
+
148
+ // #region GET functions
149
+ export const getChartData = function(chartElement:any,chartOuter:any){
150
+
151
+
152
+ let table = chartOuter.querySelector('.chart__wrapper table');
153
+
154
+ let min:any = chartElement.hasAttribute('data-min') ? chartElement.getAttribute('data-min') : 0;
155
+ let max:any = chartElement.hasAttribute('data-max') ? chartElement.getAttribute('data-max') : getLargestValue(table);
156
+ let type:string = chartElement.hasAttribute('data-type') ? chartElement.getAttribute('data-type') : 'column';
157
+ let yaxis:any = chartElement.hasAttribute('data-yaxis') ? chartElement.getAttribute('data-yaxis').split(',') : [];
158
+ let guidelines:any = chartElement.hasAttribute('data-guidelines') ? chartElement.getAttribute('data-guidelines').split(',') : [];
159
+ let targets:any = chartElement.hasAttribute('data-targets') ? JSON.parse(chartElement.getAttribute('data-targets')) : null;
160
+ let events:any = chartElement.hasAttribute('data-events') ? JSON.parse(chartElement.getAttribute('data-events')) : null;
161
+ let xaxis:any = chartElement.hasAttribute('data-xaxis') ? chartElement.getAttribute('data-xaxis').split(',') : null;
162
+ let increment = chartElement.hasAttribute('data-increment') ? chartElement.getAttribute('data-increment'): null;
163
+
164
+ let start:any = chartElement.hasAttribute('data-start') ? chartElement.getAttribute('data-start') : 0;
165
+ let end:any = chartElement.hasAttribute('data-end') ? chartElement.getAttribute('data-end') : getLargestValue(table); // TODO - get largest value from the data-xaxis
166
+
167
+
168
+ let slope:any = chartElement.hasAttribute('data-slope') ? chartElement.getAttribute('data-slope') : null;
169
+ let yInt:any = chartElement.hasAttribute('data-yint') ? chartElement.getAttribute('data-yint') : null;
170
+
171
+ return {min,max,type,yaxis,targets,events,xaxis,increment,start,end,slope,yInt,guidelines};
172
+ }
173
+
174
+ function getLargestValue(table:any){
175
+
176
+ let values = Array.from(table.querySelectorAll('tbody td:not(:first-child)')).map((element: any) => {
177
+
178
+ let currentValue:string|number = String(element.textContent);
179
+ currentValue = currentValue.replace('£','');
180
+ currentValue = currentValue.replace('%','');
181
+ currentValue = currentValue.replace(',','');
182
+ currentValue = Number.parseFloat(currentValue);
183
+
184
+ return currentValue;
185
+ })
186
+
187
+ let largetValue:number = Math.max(...values);
188
+
189
+ // TO DO round to the nearest 10, 100, 1000 and so on
190
+ return Math.ceil(largetValue);
191
+ }
192
+
193
+ const getValues = function(value:number,min:any,max:any,start?:number){
194
+
195
+ let cleanValue:string|number = String(value);
196
+ cleanValue = cleanValue.replace('£','');
197
+ cleanValue = cleanValue.replace('%','');
198
+ cleanValue = cleanValue.replace(',','');
199
+ cleanValue = Number.parseFloat(cleanValue);
200
+
201
+ let percent = ((cleanValue - min)/(max - min)) * 100;
202
+ let axis = percent;
203
+ let bottom = 0;
204
+
205
+ if (start && start != 0){
206
+ bottom = ((start - min)/(max - min)) * 100;
207
+ }
208
+
209
+ // If the value is negative the position below the 0 line
210
+ if(min < 0){
211
+ bottom = Math.abs(((min)/(max - min))*100);
212
+
213
+ if(cleanValue < 0){
214
+ percent = bottom - percent;
215
+ bottom = bottom - percent;
216
+ axis = bottom;
217
+ }
218
+ else {
219
+ percent = percent - bottom;
220
+ axis = percent + bottom;
221
+ }
222
+ }
223
+
224
+ return { percent, axis, bottom};
225
+ }
226
+
227
+ // #endregion
228
+
229
+ // #region SET functions - set data attributes and classes
230
+ export const setCellData = function(chartElement:any,chartOuter:any,table:any){
231
+
232
+ let {min, max} = getChartData(chartElement,chartOuter);
233
+
234
+ let increment = chartElement.getAttribute('data-increment');
235
+ let startDay = min;
236
+
237
+ Array.from(table.querySelectorAll('tbody tr')).forEach((tr:any, index) => {
238
+
239
+ let group = tr.querySelector('td:first-child, th:first-child') ? tr.querySelector('td:first-child, th:first-child').textContent : '';
240
+
241
+ tr.setAttribute('part','group');
242
+
243
+ // Set the data numeric value if not set
244
+ Array.from(tr.querySelectorAll('td:not([data-numeric]):not(:first-child)')).forEach((td:any) => {
245
+
246
+ let value = parseFloat(td.textContent.replace('£','').replace('%','').replace(',',''));
247
+ let start = 0;
248
+ if(increment == "days"){
249
+ let dates = td.textContent.split(' - ');
250
+ if(dates[1]){
251
+
252
+ value = numberOfDays(dates[0],dates[1]);
253
+ start = numberOfDays(startDay,dates[0]) - 1;
254
+ }
255
+ }
256
+
257
+ td.setAttribute('data-numeric',value);
258
+ td.setAttribute('data-value',td.textContent);
259
+ td.setAttribute('data-start',start);
260
+ });
261
+
262
+ // Set the data label value if not set
263
+ Array.from(tr.querySelectorAll('td:not([data-label])')).forEach((td:any, index) => {
264
+
265
+ if(index == 0)
266
+ td.setAttribute('part', 'xaxis-label'); // PART
267
+ else
268
+ td.setAttribute('part', 'value');
269
+
270
+ if(tr.querySelectorAll('td').length > 2)
271
+ td.setAttribute('data-label',table.querySelectorAll('thead th')[index].textContent);
272
+ });
273
+
274
+ /*
275
+ if(tr.querySelector('[data-label="Total"]')){
276
+ tr.setAttribute('data-total',tr.querySelector('[data-label="Total"][data-numeric]').getAttribute('data-numeric'));
277
+ }
278
+
279
+ if(tr.querySelector('[data-label="Min"]')){
280
+ tr.setAttribute('data-min',tr.querySelector('[data-label="Min"][data-numeric]').getAttribute('data-numeric'));
281
+ }
282
+ if(tr.querySelector('[data-label="Max"]')){
283
+ tr.setAttribute('data-max',tr.querySelector('[data-label="Max"][data-numeric]').getAttribute('data-numeric'));
284
+ }
285
+
286
+ */
287
+
288
+ let rowMin = tr.hasAttribute('data-min') ? tr.getAttribute('data-min') : min;
289
+ let rowMax = tr.hasAttribute('data-max') ? tr.getAttribute('data-max') : max;
290
+
291
+ if(rowMin < 0){
292
+ let minBottom = Math.abs(((rowMin)/(rowMax - rowMin))*100);
293
+ chartElement.setAttribute('style',`--min-bottom: ${minBottom}%;`);
294
+ }
295
+
296
+ // Add a useful index css var for the use of animatons.
297
+ tr.style.setProperty('--row-index', index+1);
298
+
299
+
300
+ // Add css vars to cells
301
+ Array.from(tr.querySelectorAll('td[data-numeric]:not([data-label="Min"]):not([data-label="Max"]):not(:first-child)')).forEach((td:any) => {
302
+
303
+ let display = getComputedStyle(td).display;
304
+ if(display == 'none')
305
+ return;
306
+
307
+ const content = td.innerHTML;
308
+ const value = Number.parseFloat(td.getAttribute('data-numeric'));
309
+ const start = Number.parseFloat(td.getAttribute('data-start'));
310
+
311
+ if(!td.querySelector('span[data-group]'))
312
+ td.innerHTML = `<span data-group="${group}" ${td.hasAttribute('data-label') ? `data-label="${td.getAttribute('data-label')}"`: ''} part="popover">${content}</span>`;
313
+
314
+ if(!td.hasAttribute('style')){
315
+
316
+ let { percent, bottom, axis } = getValues(value,rowMin,rowMax,start);
317
+
318
+ td.setAttribute('data-percent',percent)
319
+ td.setAttribute("style",`--bottom:${bottom}%;--percent:${percent}%;--axis:${axis}%;`);
320
+ }
321
+ });
322
+ });
323
+ }
324
+
325
+ export const setLongestLabel = function(chartOuter:any){
326
+
327
+ let chartWrapper = chartOuter.querySelector('.chart__wrapper');
328
+ let chartSpacer = chartOuter.querySelector('.chart__spacer span');
329
+ let table = chartOuter.querySelector('.chart table');
330
+ // set the longest label attr so that the bar chart knows what margin to set on the left
331
+ let longestLabel = '';
332
+ Array.from(table.querySelectorAll('tbody tr td:first-child')).forEach((td: any) => {
333
+ if(typeof td.textContent != "undefined" && td.textContent.length > longestLabel.length){
334
+
335
+ longestLabel = td.textContent;
336
+ }
337
+ });
338
+ chartWrapper.setAttribute('data-longest-label',longestLabel);
339
+ chartSpacer.innerHTML = longestLabel;
340
+ };
341
+
342
+ export const setLongestValue = function(chartOuter:any){
343
+
344
+ let chartWrapper = chartOuter.querySelector('.chart__wrapper');
345
+ let table = chartOuter.querySelector('.chart table');
346
+
347
+ let longestValue = '';
348
+ Array.from(table.querySelectorAll('tbody tr td:not(:first-child) span')).forEach((td: any) => {
349
+ if(typeof td.textContent != "undefined" && td.textContent.length > longestValue.length)
350
+ longestValue = td.textContent;
351
+ });
352
+ chartWrapper.setAttribute('data-longest-value',longestValue);
353
+ };
354
+ // #endregion
355
+
356
+ // #region CREATE function
357
+
358
+ export const createChartKey = function(chartOuter:any,tableElement:any,chartKey:any){
359
+
360
+ const chartID = `chart-${Date.now()+(Math.floor(Math.random() * 100) + 1)}`;
361
+ //const chartOuter = chartElement.querySelector('.chart__outer');
362
+
363
+ let previousInput:any;
364
+
365
+
366
+ let headings = Array.from(tableElement.querySelectorAll('thead th'));
367
+
368
+ headings.forEach((arrayElement:any , index) => {
369
+
370
+ if(index != 0){
371
+
372
+ previousInput = createChartKeyItem(chartID,index,arrayElement.textContent,chartKey,chartOuter,previousInput);
373
+ }
374
+
375
+ if(index == 50){
376
+ headings.length = index + 1;
377
+ }
378
+
379
+ });
380
+
381
+ return true;
382
+ }
383
+
384
+ function createChartKeyItem(chartID:string,index:number,text:Array<string>,chartKey:any,chartOuter:any,previousInput:any){
385
+ let input = document.createElement('input');
386
+ input.setAttribute('name',`${chartID}-dataset-${index}`);
387
+ input.setAttribute('id',`${chartID}-dataset-${index}`);
388
+ input.checked = true;
389
+ input.setAttribute('type',`checkbox`);
390
+
391
+
392
+ if(index == 1)
393
+ chartOuter.prepend(input);
394
+ else
395
+ chartOuter.insertBefore(input,previousInput.nextSibling);
396
+
397
+ previousInput = input;
398
+
399
+ let label = document.createElement('label');
400
+ label.setAttribute('class',`key btn btn-action`);
401
+ label.setAttribute('for',`${chartID}-dataset-${index}`);
402
+ label.setAttribute('data-label',`${text}`);
403
+ label.setAttribute('part',`key`);
404
+ label.innerHTML = `${text}`;
405
+ chartKey.append(label);
406
+
407
+ return previousInput;
408
+ }
409
+
410
+ export const createChartGuidelines = function(chartElement:any,chartOuter:any,chartGuidelines:any){
411
+
412
+ let {min, max, yaxis, increment, guidelines} = getChartData(chartElement,chartOuter);
413
+
414
+ if(!guidelines.length)
415
+ guidelines = yaxis;
416
+
417
+
418
+ if(increment == "days"){
419
+
420
+ max = numberOfDays(min,max);
421
+ min = 0;
422
+ }
423
+
424
+ chartGuidelines.innerHTML = '';
425
+ for (var i = 0; i < guidelines.length; i++) {
426
+
427
+ let value = parseFloat(guidelines[i].replace('£','').replace('%','').replace(',',''));
428
+
429
+
430
+
431
+ let { axis } = getValues(value,min,max);
432
+ chartGuidelines.innerHTML += `<div class="guideline" style="--percent:${axis}%;">${yaxis.indexOf(guidelines[i]) != -1 ? `<span>${guidelines[i]}</span>` : ''}</div>`;
433
+ }
434
+ }
435
+
436
+ export const createChartYaxis = function(chartElement:any,chartOuter:any,chartYaxis:any){
437
+
438
+ let {min, max, yaxis, increment} = getChartData(chartElement,chartOuter);
439
+
440
+ let startDay = min;
441
+
442
+ if(increment == "days"){
443
+
444
+ max = numberOfDays(min,max);
445
+ min = 0;
446
+ }
447
+
448
+
449
+ chartYaxis.innerHTML = '';
450
+ for (var i = 0; i < yaxis.length; i++) {
451
+
452
+ let value = parseFloat(yaxis[i].replace('£','').replace('%',''));
453
+
454
+ if(increment == "days"){
455
+
456
+ value = numberOfDays(startDay,yaxis[i]);
457
+
458
+ }
459
+
460
+ let { axis } = getValues(value,min,max);
461
+ chartYaxis.innerHTML += `<div class="axis__point" style="--percent:${axis}%;"><span>${yaxis[i]}</span></div>`;
462
+ }
463
+ }
464
+
465
+ export const createXaxis = function(chartElement:any,chartOuter:any,xaxis:any){
466
+
467
+ const chart = chartOuter.querySelector('.chart');
468
+ let chartXaxis = chartOuter.querySelector('.chart__xaxis');
469
+
470
+ let {increment,start,end} = getChartData(chartElement,chartOuter);
471
+
472
+ if(!chartXaxis){
473
+ chartXaxis = document.createElement('div');
474
+ chartXaxis.setAttribute('class','chart__xaxis');
475
+ }
476
+ if(increment && start && end){
477
+ chartXaxis.innerHTML = '';
478
+ for (var i = 0; i < xaxis.length; i++) {
479
+
480
+ let value = parseFloat(xaxis[i].replace('£','').replace('%',''));
481
+ let position = ((value - start)/(end - start)) * 100;
482
+
483
+ chartXaxis.innerHTML += `<div class="axis__point" style="--percent:${position}%;"><span>${xaxis[i]}</span></div>`;
484
+ }
485
+ }
486
+ chart.prepend(chartXaxis);
487
+ }
488
+
489
+ export const createTooltips = function(chartOuter:any) {
490
+
491
+ const titles = chartOuter.querySelectorAll('thead th[title], tbody th[title]:first-child, tbody td[title]:first-child');
492
+
493
+ Array.from(titles).forEach((title:HTMLElement) => {
494
+
495
+ let tooltipId = `tooltip-${Date.now()}-${Math.floor(Math.random() * 100)}`;
496
+
497
+ title.innerHTML = `<button class="tooltip" popovertarget="${tooltipId}" part="tooltip" style="anchor-name: --${tooltipId};">${title.textContent}</button><span id="${tooltipId}" style="position-anchor: --${tooltipId};" popover part="tooltip__content" class="tooltip__content">${title.getAttribute('title')}</span>`;
498
+
499
+ //title.removeAttribute('title'); // TODO add a supports query for anchor positioning
500
+ });
501
+
502
+
503
+ }
504
+ // #endregion
505
+
506
+ export default setupChart;
@@ -67,7 +67,7 @@ const Ra = /* @__PURE__ */ m(U, [["render", G]]), J = (t) => t.charAt(0).toUpper
67
67
  },
68
68
  created() {
69
69
  this.$nextTick(function() {
70
- import("./table.component.min-a923dfdd.mjs").then((t) => {
70
+ import("./table.component.min-7e6d8daa.mjs").then((t) => {
71
71
  window.customElements.get("iam-table") || window.customElements.define("iam-table", t.default);
72
72
  }).catch((t) => {
73
73
  console.log(t.message);
@@ -453,7 +453,7 @@ const N = /* @__PURE__ */ m(ne, [["render", Se]]), xe = {
453
453
  },
454
454
  created() {
455
455
  this.$nextTick(function() {
456
- import("./fileupload.component.min-b6977b72.mjs").then((t) => {
456
+ import("./fileupload.component.min-c3c1e155.mjs").then((t) => {
457
457
  window.customElements.get("iam-fileupload") || window.customElements.define("iam-fileupload", t.default);
458
458
  }).catch((t) => {
459
459
  console.log(t.message);
@@ -483,7 +483,7 @@ const qe = {
483
483
  props: {},
484
484
  mounted() {
485
485
  this.$nextTick(function() {
486
- import("./accordion.component.min-5ab25428.mjs").then((t) => {
486
+ import("./accordion.component.min-eb962f3b.mjs").then((t) => {
487
487
  window.customElements.get("iam-accordion") || window.customElements.define("iam-accordion", t.default);
488
488
  }).catch((t) => {
489
489
  console.log(t.message);
@@ -592,7 +592,7 @@ const Va = /* @__PURE__ */ m(Ne, [["render", Fe]]), ze = {
592
592
  name: "Card",
593
593
  created() {
594
594
  this.$nextTick(function() {
595
- import("./card.component.min-d73c2fcc.mjs").then((t) => {
595
+ import("./card.component.min-71ce1025.mjs").then((t) => {
596
596
  window.customElements.get("iam-card") || window.customElements.define("iam-card", t.default);
597
597
  }).catch((t) => {
598
598
  console.log(t.message);
@@ -623,7 +623,7 @@ const Fa = /* @__PURE__ */ m(ze, [["render", Be]]), Oe = {
623
623
  },
624
624
  mounted() {
625
625
  this.$nextTick(function() {
626
- import("./carousel.component.min-b1dcbbb4.mjs").then((t) => {
626
+ import("./carousel.component.min-50867178.mjs").then((t) => {
627
627
  window.customElements.get("iam-carousel") || window.customElements.define("iam-carousel", t.default);
628
628
  }).catch((t) => {
629
629
  console.log(t.message);
@@ -652,7 +652,7 @@ const za = /* @__PURE__ */ m(Oe, [["render", We]]), Ke = {
652
652
  },
653
653
  mounted() {
654
654
  this.$nextTick(function() {
655
- import("./header.component.min-864c766b.mjs").then((t) => {
655
+ import("./header.component.min-62691ae5.mjs").then((t) => {
656
656
  window.customElements.get("iam-header") || window.customElements.define("iam-header", t.default);
657
657
  }).catch((t) => {
658
658
  console.log(t.message);
@@ -1048,7 +1048,7 @@ const Wa = /* @__PURE__ */ m(_t, [["render", Ht]]), Mt = {
1048
1048
  name: "Nav",
1049
1049
  mounted() {
1050
1050
  this.$nextTick(function() {
1051
- import("./nav.component.min-74f81593.mjs").then((t) => {
1051
+ import("./nav.component.min-5fc49410.mjs").then((t) => {
1052
1052
  window.customElements.get("iam-nav") || window.customElements.define("iam-nav", t.default);
1053
1053
  }).catch((t) => {
1054
1054
  console.log(t.message);
@@ -1168,7 +1168,7 @@ const Zt = {
1168
1168
  name: "Tabs",
1169
1169
  created() {
1170
1170
  this.$nextTick(function() {
1171
- import("./tabs.component.min-13151c0b.mjs").then((t) => {
1171
+ import("./tabs.component.min-a87a5a3a.mjs").then((t) => {
1172
1172
  window.customElements.get("iam-tabs") || window.customElements.define("iam-tabs", t.default);
1173
1173
  }).catch((t) => {
1174
1174
  console.log(t.message);
@@ -1315,7 +1315,7 @@ function ha(t, a, e, i, r, s) {
1315
1315
  }
1316
1316
  const es = /* @__PURE__ */ m(pa, [["render", ha]]);
1317
1317
  /*!
1318
- * iamKey v5.7.1-beta3
1318
+ * iamKey v5.7.1-beta4
1319
1319
  * Copyright 2022-2024 iamproperty
1320
1320
  */
1321
1321
  function fa(t, a) {
@@ -1485,7 +1485,7 @@ const as = /* @__PURE__ */ m(ka, [["render", Aa]]), La = {
1485
1485
  props: {},
1486
1486
  mounted() {
1487
1487
  this.$nextTick(function() {
1488
- import("./actionbar.component.min-1edbc134.mjs").then((t) => {
1488
+ import("./actionbar.component.min-5cf5753f.mjs").then((t) => {
1489
1489
  window.customElements.get("iam-actionbar") || window.customElements.define("iam-actionbar", t.default);
1490
1490
  }).catch((t) => {
1491
1491
  console.log(t.message);
@@ -1500,7 +1500,7 @@ function Sa(t, a, e, i, r, s) {
1500
1500
  }
1501
1501
  const ss = /* @__PURE__ */ m(La, [["render", Sa]]);
1502
1502
  /*!
1503
- * iamKey v5.7.1-beta3
1503
+ * iamKey v5.7.1-beta4
1504
1504
  * Copyright 2022-2024 iamproperty
1505
1505
  */
1506
1506
  class R extends HTMLElement {