@3t-transform/threeteeui 0.0.16 → 0.0.18

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 (125) hide show
  1. package/dist/cjs/{index-864b7110.js → index-bf777121.js} +3 -0
  2. package/dist/cjs/loader.cjs.js +2 -2
  3. package/dist/cjs/tttx-button.cjs.entry.js +25 -19
  4. package/dist/cjs/tttx-checkbox.cjs.entry.js +18 -18
  5. package/dist/cjs/tttx-form.cjs.entry.js +365 -365
  6. package/dist/cjs/tttx-icon.cjs.entry.js +14 -1856
  7. package/dist/cjs/tttx-input-calendar.cjs.entry.js +125 -0
  8. package/dist/cjs/tttx-keyvalue-block.cjs.entry.js +33 -0
  9. package/dist/cjs/tttx-list.cjs.entry.js +188 -188
  10. package/dist/cjs/tttx-loading-spinner.cjs.entry.js +16 -16
  11. package/dist/cjs/tttx-popover-content.cjs.entry.js +13 -13
  12. package/dist/cjs/tttx-standalone-input.cjs.entry.js +127 -127
  13. package/dist/cjs/tttx-table.cjs.entry.js +50 -50
  14. package/dist/cjs/tttx.cjs.js +2 -2
  15. package/dist/collection/collection-manifest.json +2 -0
  16. package/dist/collection/components/atoms/tttx-button/tttx-button.css +94 -18
  17. package/dist/collection/components/atoms/tttx-button/tttx-button.js +110 -93
  18. package/dist/collection/components/atoms/tttx-button/tttx-button.stories.js +74 -27
  19. package/dist/collection/components/atoms/tttx-icon/tttx-icon.css +8 -5
  20. package/dist/collection/components/atoms/tttx-icon/tttx-icon.js +62 -116
  21. package/dist/collection/components/atoms/tttx-icon/tttx-icon.stories.js +22 -47
  22. package/dist/collection/components/atoms/tttx-keyvalue-block/tttx-keyvalue-block.css +26 -0
  23. package/dist/collection/components/atoms/tttx-keyvalue-block/tttx-keyvalue-block.js +56 -0
  24. package/dist/collection/components/atoms/tttx-keyvalue-block/tttx-keyvalue-block.stories.js +12 -0
  25. package/dist/collection/components/atoms/tttx-loading-spinner/tttx-loading-spinner.js +67 -66
  26. package/dist/collection/components/atoms/tttx-loading-spinner/tttx-loading-spinner.stories.js +17 -17
  27. package/dist/collection/components/atoms/tttx-popover-content/tttx-popover-content.js +97 -96
  28. package/dist/collection/components/atoms/tttx-popover-content/tttx-popover-content.stories.js +23 -23
  29. package/dist/collection/components/atoms/ttx-checkbox/tttx-checkbox.js +102 -101
  30. package/dist/collection/components/atoms/ttx-checkbox/tttx-checkbox.stories.js +9 -9
  31. package/dist/collection/components/molecules/tttx-form/tttx-form.css +95 -11
  32. package/dist/collection/components/molecules/tttx-form/tttx-form.js +452 -451
  33. package/dist/collection/components/molecules/tttx-form/tttx-form.stories.js +109 -109
  34. package/dist/collection/components/molecules/tttx-input-calendar/tttx-input-calendar.css +93 -0
  35. package/dist/collection/components/molecules/tttx-input-calendar/tttx-input-calendar.js +174 -0
  36. package/dist/collection/components/molecules/tttx-input-calendar/tttx-input-calendar.stories.js +27 -0
  37. package/dist/collection/components/molecules/tttx-list/tttx-list.js +312 -311
  38. package/dist/collection/components/molecules/tttx-list/tttx-list.stories.js +14 -14
  39. package/dist/collection/components/molecules/tttx-standalone-input/tttx-standalone-input.js +570 -569
  40. package/dist/collection/components/molecules/tttx-standalone-input/tttx-standalone-input.stories.js +134 -134
  41. package/dist/collection/components/molecules/tttx-table/tttx-table.js +174 -177
  42. package/dist/collection/components/molecules/tttx-table/tttx-table.stories.js +65 -65
  43. package/dist/collection/components/palette.stories.js +7 -7
  44. package/dist/collection/docs/gettingstarted-developer.stories.js +5 -5
  45. package/dist/collection/icons.js +2838 -2838
  46. package/dist/collection/index.js +1 -1
  47. package/dist/components/index.d.ts +2 -0
  48. package/dist/components/index.js +2 -0
  49. package/dist/components/tttx-button.js +1 -40
  50. package/dist/components/tttx-button2.js +56 -0
  51. package/dist/components/tttx-checkbox.js +36 -36
  52. package/dist/components/tttx-form.js +382 -382
  53. package/dist/components/tttx-icon2.js +32 -1874
  54. package/dist/components/tttx-input-calendar.d.ts +11 -0
  55. package/dist/components/tttx-input-calendar.js +157 -0
  56. package/dist/components/tttx-keyvalue-block.d.ts +11 -0
  57. package/dist/components/tttx-keyvalue-block.js +49 -0
  58. package/dist/components/tttx-list.js +214 -214
  59. package/dist/components/tttx-loading-spinner2.js +33 -33
  60. package/dist/components/tttx-popover-content2.js +32 -32
  61. package/dist/components/tttx-standalone-input.js +168 -169
  62. package/dist/components/tttx-table.js +79 -79
  63. package/dist/esm/{index-232e347b.js → index-a05bd606.js} +3 -0
  64. package/dist/esm/loader.js +3 -3
  65. package/dist/esm/polyfills/core-js.js +0 -0
  66. package/dist/esm/polyfills/dom.js +0 -0
  67. package/dist/esm/polyfills/es5-html-element.js +0 -0
  68. package/dist/esm/polyfills/index.js +0 -0
  69. package/dist/esm/polyfills/system.js +0 -0
  70. package/dist/esm/tttx-button.entry.js +25 -19
  71. package/dist/esm/tttx-checkbox.entry.js +18 -18
  72. package/dist/esm/tttx-form.entry.js +365 -365
  73. package/dist/esm/tttx-icon.entry.js +14 -1856
  74. package/dist/esm/tttx-input-calendar.entry.js +121 -0
  75. package/dist/esm/tttx-keyvalue-block.entry.js +29 -0
  76. package/dist/esm/tttx-list.entry.js +188 -188
  77. package/dist/esm/tttx-loading-spinner.entry.js +16 -16
  78. package/dist/esm/tttx-popover-content.entry.js +13 -13
  79. package/dist/esm/tttx-standalone-input.entry.js +127 -127
  80. package/dist/esm/tttx-table.entry.js +50 -50
  81. package/dist/esm/tttx.js +3 -3
  82. package/dist/tttx/{p-3973b7dd.entry.js → p-037d286f.entry.js} +1 -1
  83. package/dist/tttx/{p-184c4fae.js → p-07b134af.js} +1 -1
  84. package/dist/tttx/{p-125f06b3.entry.js → p-1b63f16a.entry.js} +1 -1
  85. package/dist/tttx/p-45afb84c.entry.js +1 -0
  86. package/dist/tttx/p-68ff0f39.entry.js +1 -0
  87. package/dist/tttx/{p-6828fe6f.entry.js → p-93763d3c.entry.js} +1 -1
  88. package/dist/tttx/p-a5808741.entry.js +1 -0
  89. package/dist/tttx/{p-fe4c70b2.entry.js → p-a92ca87e.entry.js} +1 -1
  90. package/dist/tttx/{p-5ce1ba22.entry.js → p-a96ca037.entry.js} +1 -1
  91. package/dist/tttx/p-dc087fd8.entry.js +1 -0
  92. package/dist/tttx/p-e3cc75bb.entry.js +1 -0
  93. package/dist/tttx/{p-01e1894e.entry.js → p-f579ed1e.entry.js} +1 -1
  94. package/dist/tttx/tttx.esm.js +1 -1
  95. package/dist/types/components/atoms/tttx-button/tttx-button.d.ts +10 -9
  96. package/dist/types/components/atoms/tttx-button/tttx-button.stories.d.ts +10 -20
  97. package/dist/types/components/atoms/tttx-icon/tttx-icon.d.ts +5 -14
  98. package/dist/types/components/atoms/tttx-icon/tttx-icon.stories.d.ts +20 -21
  99. package/dist/types/components/atoms/tttx-keyvalue-block/tttx-keyvalue-block.d.ts +4 -0
  100. package/dist/types/components/atoms/tttx-keyvalue-block/tttx-keyvalue-block.stories.d.ts +6 -0
  101. package/dist/types/components/atoms/tttx-loading-spinner/tttx-loading-spinner.d.ts +6 -6
  102. package/dist/types/components/atoms/tttx-loading-spinner/tttx-loading-spinner.stories.d.ts +17 -17
  103. package/dist/types/components/atoms/tttx-popover-content/tttx-popover-content.d.ts +7 -7
  104. package/dist/types/components/atoms/tttx-popover-content/tttx-popover-content.stories.d.ts +18 -18
  105. package/dist/types/components/atoms/ttx-checkbox/tttx-checkbox.d.ts +9 -9
  106. package/dist/types/components/atoms/ttx-checkbox/tttx-checkbox.stories.d.ts +6 -6
  107. package/dist/types/components/molecules/tttx-form/tttx-form.d.ts +134 -134
  108. package/dist/types/components/molecules/tttx-form/tttx-form.stories.d.ts +12 -12
  109. package/dist/types/components/molecules/tttx-input-calendar/tttx-input-calendar.d.ts +19 -0
  110. package/dist/types/components/molecules/tttx-input-calendar/tttx-input-calendar.stories.d.ts +26 -0
  111. package/dist/types/components/molecules/tttx-list/tttx-list.d.ts +51 -51
  112. package/dist/types/components/molecules/tttx-list/tttx-list.stories.d.ts +13 -13
  113. package/dist/types/components/molecules/tttx-standalone-input/tttx-standalone-input.d.ts +38 -38
  114. package/dist/types/components/molecules/tttx-standalone-input/tttx-standalone-input.stories.d.ts +106 -106
  115. package/dist/types/components/molecules/tttx-table/tttx-table.d.ts +15 -15
  116. package/dist/types/components/molecules/tttx-table/tttx-table.stories.d.ts +21 -21
  117. package/dist/types/components/palette.stories.d.ts +6 -6
  118. package/dist/types/components.d.ts +46 -15
  119. package/dist/types/docs/gettingstarted-developer.stories.d.ts +5 -5
  120. package/dist/types/icons.d.ts +2 -2
  121. package/dist/types/index.d.ts +1 -1
  122. package/package.json +4 -4
  123. package/dist/tttx/p-10316ff1.entry.js +0 -1
  124. package/dist/tttx/p-b1c22f5f.entry.js +0 -1
  125. package/dist/tttx/p-c7f9be65.entry.js +0 -1
@@ -0,0 +1,121 @@
1
+ import { r as registerInstance, h, H as Host, g as getElement } from './index-a05bd606.js';
2
+
3
+ const tttxInputCalendarCss = ".material-symbols-rounded{font-variation-settings:\"FILL\" 1, \"wght\" 400, \"GRAD\" 0, \"opsz\" 24}:host{display:block;--border-radius:4px;position:relative}.calcontainer{-webkit-perspective:500px;perspective:500px}.lefty{float:left}.righty{float:right}.calendar{display:none;position:absolute;box-sizing:border-box;width:312px;height:332px;background-color:white;padding:16px;box-shadow:0px 1px 5px rgba(17, 17, 17, 0.3);border-radius:var(--border-radius)}.calendar-header{display:flex;justify-content:space-between;margin-bottom:8px}.date-display{margin-top:8px}.calendar-header select{border:none;padding:5px}.calendar-table{width:100%;border-collapse:collapse}.calendar-table th{text-align:center;padding:4px;text-transform:uppercase;font-size:14px;color:#757575;border-bottom:1px solid #d5d5d5;margin-bottom:8px}.calendar .calendar-table td{padding:0;margin:0;width:14.2%;text-align:center;height:36px;line-height:36px}.calendar .calendar-table td span:hover{background-color:#f0f0f0}.calendar .calendar-table td span{display:block;text-align:center;padding:4px;cursor:pointer;border-radius:var(--border-radius)}.calendar-visible{display:block}.calendar-table thead tr{border-bottom:1px solid #d5d5d5}";
4
+
5
+ const TttxInputCalendar = class {
6
+ constructor(hostRef) {
7
+ registerInstance(this, hostRef);
8
+ // an array of month numbers mapped to their names
9
+ this.monthNames = Array.from({ length: 12 }, (_, i) => i + 1).map((month) => {
10
+ const date = new Date(0);
11
+ date.setUTCMonth(month - 1);
12
+ return date.toLocaleString('default', { month: 'long' });
13
+ });
14
+ this.onClickOutside = (event) => {
15
+ if (!this.el.contains(event.target) && this.showCalendar) {
16
+ this.showCalendar = false;
17
+ }
18
+ };
19
+ this.onFocusIn = (event) => {
20
+ if (!this.el.contains(event.target) && this.showCalendar) {
21
+ this.showCalendar = false;
22
+ }
23
+ };
24
+ this.previousHandler = () => {
25
+ if (this.selectedMonth === 1) {
26
+ this.selectedMonth = 12;
27
+ this.selectedYear--;
28
+ }
29
+ else {
30
+ this.selectedMonth--;
31
+ }
32
+ };
33
+ this.nextHandler = () => {
34
+ if (this.selectedMonth === 12) {
35
+ this.selectedMonth = 1;
36
+ this.selectedYear++;
37
+ }
38
+ else {
39
+ this.selectedMonth++;
40
+ }
41
+ };
42
+ this.months = false;
43
+ this.years = false;
44
+ this.showCalendar = false;
45
+ this.selectedYear = new Date().getFullYear();
46
+ this.selectedMonth = new Date().getMonth() + 1;
47
+ }
48
+ componentDidLoad() {
49
+ const slot = this.el.shadowRoot.querySelector('slot');
50
+ if (slot) {
51
+ const assignedElements = slot.assignedElements();
52
+ if (assignedElements[0]) {
53
+ assignedElements[0].addEventListener('click', (event) => {
54
+ event.preventDefault();
55
+ this.showCalendar = !this.showCalendar;
56
+ });
57
+ }
58
+ }
59
+ document.addEventListener('click', this.onClickOutside);
60
+ }
61
+ disconnectedCallback() {
62
+ document.removeEventListener('click', this.onClickOutside);
63
+ }
64
+ getDaysAndDates(year, month) {
65
+ const firstDayOfMonth = new Date(year, month - 1, 1);
66
+ const lastDayOfMonth = new Date(year, month, 0);
67
+ const daysAndDates = [];
68
+ for (let day = firstDayOfMonth; day <= lastDayOfMonth; day.setDate(day.getDate() + 1)) {
69
+ const weekDay = day.getDay();
70
+ const date = day.getDate();
71
+ const dayAndDate = {
72
+ day: weekDay,
73
+ date: date
74
+ };
75
+ daysAndDates.push(dayAndDate);
76
+ }
77
+ return daysAndDates;
78
+ }
79
+ clickDateHandler(event) {
80
+ const { year, month, day } = event;
81
+ const selectedDate = new Date(year, month - 1, day + 1);
82
+ this.inputElement.valueAsDate = selectedDate;
83
+ this.showCalendar = false;
84
+ }
85
+ render() {
86
+ const daysOfWeek = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
87
+ const daysAndDates = this.getDaysAndDates(this.selectedYear, this.selectedMonth);
88
+ const currentYear = new Date().getFullYear();
89
+ const years = Array.from({ length: 11 }, (_, i) => currentYear - 5 + i);
90
+ const calendarGrid = [];
91
+ let currentWeek = [];
92
+ // Fill empty days before the first day of the month
93
+ for (let i = 0; i < daysAndDates[0].day; i++) {
94
+ currentWeek.push(h("td", null));
95
+ }
96
+ // Fill the calendar with days and dates
97
+ daysAndDates.forEach(({ day, date }) => {
98
+ currentWeek.push(h("td", null, h("span", { onClick: () => this.clickDateHandler({ year: this.selectedYear, month: this.selectedMonth, day: date }) }, date)));
99
+ if (day === 6) {
100
+ calendarGrid.push(h("tr", null, currentWeek));
101
+ currentWeek = [];
102
+ }
103
+ });
104
+ // Fill the remaining empty days in the last week
105
+ if (currentWeek.length > 0) {
106
+ while (currentWeek.length < 7) {
107
+ currentWeek.push(h("td", null));
108
+ }
109
+ calendarGrid.push(h("tr", null, currentWeek));
110
+ }
111
+ return (h(Host, null, h("div", { class: "calcontainer" }, h("slot", null), h("div", { class: `calendar ${this.showCalendar ? 'calendar-visible' : ''}` }, h("div", { class: "calendar-header" }, h("tttx-button", { onClick: this.previousHandler, design: "borderless", icon: "chevron_left", notext: true }), this.months && h("select", { id: "month-select", onInput: (event) => {
112
+ this.selectedMonth = parseInt(event.target.value);
113
+ } }, Array.from({ length: 12 }, (_, i) => i + 1).map((month) => (h("option", { value: month, selected: month === this.selectedMonth }, this.monthNames[month - 1])))), this.years && h("select", { id: "year-select", onInput: (event) => {
114
+ this.selectedYear = parseInt(event.target.value);
115
+ } }, years.map((year) => (h("option", { value: year, selected: year === this.selectedYear }, year)))), h("div", { class: "date-display" }, this.monthNames[this.selectedMonth - 1], " ", this.selectedYear), h("tttx-button", { onClick: this.nextHandler, design: "borderless", icon: "chevron_right", notext: true })), h("table", { class: "calendar-table" }, h("thead", null, h("tr", null, daysOfWeek.map((day) => (h("th", null, day))))), h("tbody", null, calendarGrid))))));
116
+ }
117
+ get el() { return getElement(this); }
118
+ };
119
+ TttxInputCalendar.style = tttxInputCalendarCss;
120
+
121
+ export { TttxInputCalendar as tttx_input_calendar };
@@ -0,0 +1,29 @@
1
+ import { r as registerInstance, h, H as Host } from './index-a05bd606.js';
2
+
3
+ const tttxKeyvalueBlockCss = ":host{display:block}dl{margin:0;padding:0;font-family:\"Roboto\", sans-serif;cursor:default}dt{font-weight:400;line-height:21px;font-size:16px;color:#757575}dd{margin:0;font-weight:400;font-size:16px;color:#212121;line-height:21px;margin-bottom:18px}";
4
+
5
+ const TttxKeyvalueBlock = class {
6
+ constructor(hostRef) {
7
+ registerInstance(this, hostRef);
8
+ this.keyvalues = undefined;
9
+ }
10
+ render() {
11
+ let values;
12
+ if (typeof this.keyvalues === 'string') {
13
+ values = JSON.parse(this.keyvalues);
14
+ }
15
+ else {
16
+ values = this.keyvalues;
17
+ }
18
+ const keys = Object.keys(values);
19
+ const elements = [];
20
+ for (let i = 0; i < keys.length; i++) {
21
+ elements.push(h("dt", null, keys[i]));
22
+ elements.push(h("dd", null, values[keys[i]]));
23
+ }
24
+ return (h(Host, null, h("dl", null, elements)));
25
+ }
26
+ };
27
+ TttxKeyvalueBlock.style = tttxKeyvalueBlockCss;
28
+
29
+ export { TttxKeyvalueBlock as tttx_keyvalue_block };
@@ -1,194 +1,194 @@
1
- import { r as registerInstance, c as createEvent, h, H as Host, g as getElement } from './index-232e347b.js';
1
+ import { r as registerInstance, c as createEvent, h, H as Host, g as getElement } from './index-a05bd606.js';
2
2
 
3
3
  const tttxListCss = ".material-symbols-rounded{font-variation-settings:\"FILL\" 1, \"wght\" 400, \"GRAD\" 0, \"opsz\" 24}.material-symbols-rounded{font-family:\"Material Symbols Rounded\", sans-serif;font-weight:400;font-style:normal;font-size:24px;line-height:1;letter-spacing:normal;text-transform:none;display:inline-block;white-space:nowrap;word-wrap:normal;direction:ltr;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;color:#9e9e9e}:host{display:flex;flex-direction:column}.tttx-list__row{min-height:52px;line-height:36px;padding:8px;display:flex;flex-direction:row;align-items:center;cursor:pointer;border-bottom:1px solid #d5d5d5}.tttx-list__row .generic-template__content{width:100%;display:flex;align-items:center;gap:8px}.tttx-list__row:first-of-type{border-top:1px solid #d5d5d5}.tttx-list__row:focus,.tttx-list__row:active{background-color:#e6e6e6}.tttx-list__row.selected{background-color:#e7f1f9}.load-indicator{display:flex;justify-content:center}";
4
4
 
5
- const TttxList = class {
6
- constructor(hostRef) {
7
- registerInstance(this, hostRef);
8
- this.listPaginate = createEvent(this, "listPaginate", 7);
9
- this.listSelectedEvent = createEvent(this, "listSelectedEvent", 7);
10
- this.listItemClick = createEvent(this, "listItemClick", 7);
11
- this.rowCount = 0;
12
- this.name = undefined;
13
- this.selectable = undefined;
14
- this.items = [];
15
- this.selectedIds = [];
16
- this.loading = true;
17
- this.lastPage = false;
18
- }
19
- listLoadHandler(event) {
20
- if (event.detail.name !== this.name)
21
- return;
22
- this.items = [...this.items, ...event.detail.items];
23
- this.loading = false;
24
- this.lastPage = event.detail.lastPage;
25
- this.renderRows(event.detail.items);
26
- if (this.scrollableParent.clientHeight === this.scrollableParent.scrollHeight)
27
- this.listPaginateHandler();
28
- }
29
- listPaginateHandler() {
30
- // We don't want to emit an event to load the next page if this is the last page, or if we're already loading
31
- if (this.lastPage || this.loading)
32
- return;
33
- this.loading = true;
34
- this.listPaginate.emit({ name: this.name });
35
- }
36
- listClearDataCacheHandler(event) {
37
- if (event.detail.name !== this.name)
38
- return;
39
- this.items = [];
40
- this.selectedIds = [];
41
- this.listItemContainer()
42
- .querySelectorAll(".tttx-list__row")
43
- .forEach((node) => {
44
- node.remove();
45
- });
46
- this.rowCount = 0;
47
- this.lastPage = false;
48
- this.loading = false;
49
- }
50
- listActionSelectedEventHandler(event) {
51
- if (event.detail.name !== this.name || !this.selectable || this.selectedIds.length === 0)
52
- return;
53
- const selectedRows = this.selectedIds.map(id => {
54
- return this.items[id];
55
- });
56
- if (event.detail.removeRows)
57
- this.removeSelectedRows();
58
- this.listSelectedEvent.emit({
59
- name: this.name,
60
- eventName: event.detail.eventName,
61
- selectedRows,
62
- });
63
- }
64
- removeSelectedRows() {
65
- const orderedSelectedIds = [...this.selectedIds].sort((a, b) => {
66
- return b - a;
67
- });
68
- orderedSelectedIds.forEach(itemIndex => {
69
- this.items.splice(itemIndex, 1);
70
- this.listItemContainer().removeChild(this.listItemContainer().querySelector(`[data-row-id="${itemIndex}"]`));
71
- // If this removes the scrollbar and we're not on the last page, load in a new page
72
- if (this.scrollableParent.clientHeight === this.scrollableParent.scrollHeight)
73
- this.listPaginateHandler();
74
- });
75
- // Empty selected ids with mutation rather than assignment to avoid unecessary component rerender
76
- this.selectedIds.splice(0, this.selectedIds.length);
77
- }
78
- listItemClickHandler(itemData) {
79
- if (this.selectedIds.length !== 0)
80
- return;
81
- this.listItemClick.emit({ itemData, name: this.name });
82
- }
83
- componentWillLoad() {
84
- this.template = this.host.querySelector("template");
85
- this.scrollableParent = this.getScrollableParent(this.host);
86
- const scrollableContext = this.scrollableParent === document.scrollingElement ? document : this.scrollableParent;
87
- scrollableContext.addEventListener("scroll", this.scrollHandler.bind(this));
88
- window.addEventListener("resize", this.scrollHandler.bind(this));
89
- }
90
- componentDidLoad() {
91
- // Emit event to load first page
92
- this.listPaginate.emit({ name: this.name });
93
- }
94
- listItemContainer() {
95
- return this.host.shadowRoot.querySelector(".list-item-container");
96
- }
97
- async scrollHandler() {
98
- const { clientHeight, scrollTop, scrollHeight } = this.scrollableParent;
99
- if (Math.abs(scrollHeight - clientHeight - scrollTop) < 26)
100
- this.listPaginateHandler();
101
- }
102
- isScrollable(node) {
103
- const hasScrollbar = ["scroll", "auto"].includes(node.style.overflowY);
104
- return hasScrollbar;
105
- }
106
- getScrollableParent(node) {
107
- if (!node || node === document.body) {
108
- return document.scrollingElement;
109
- }
110
- else {
111
- return this.isScrollable(node) ? node : this.getScrollableParent(node.parentElement);
112
- }
113
- }
114
- appendRowCheckbox(rowContainer) {
115
- if (!this.selectable)
116
- return;
117
- const rowId = this.rowCount;
118
- const checkbox = document.createElement("input");
119
- checkbox.setAttribute("type", "checkbox");
120
- checkbox.addEventListener("click", e => {
121
- e.stopPropagation();
122
- if (e.target.checked) {
123
- this.selectedIds = [...this.selectedIds, rowId];
124
- rowContainer.classList.add("selected");
125
- }
126
- else {
127
- this.selectedIds = this.selectedIds.filter(id => {
128
- return id !== rowId;
129
- });
130
- rowContainer.classList.remove("selected");
131
- }
132
- });
133
- rowContainer.setAttribute("data-row-id", `${rowId}`);
134
- this.rowCount++;
135
- rowContainer.appendChild(checkbox);
136
- }
137
- appendSeededTemplate(rowData, rowContainer) {
138
- this.template.childNodes.forEach(child => {
139
- const clone = child.cloneNode(false);
140
- if (clone.getAttribute("data-fields")) {
141
- const fields = clone.getAttribute("data-fields").replace(/\s/g, "").split(",");
142
- const filteredRowData = Object.fromEntries(fields.map((field) => {
143
- return [field, rowData[field]];
144
- }));
145
- clone.setAttribute("row-data", JSON.stringify(filteredRowData));
146
- }
147
- else {
148
- clone.setAttribute("row-data", JSON.stringify(rowData));
149
- }
150
- rowContainer.appendChild(clone);
151
- });
152
- }
153
- appendGenericTemplate(rowData, rowContainer) {
154
- const row = document.createElement("div");
155
- row.classList.add("generic-template__content");
156
- row.textContent = rowData.text;
157
- rowContainer.appendChild(row);
158
- if (!rowData.icon)
159
- return;
160
- const icon = document.createElement("span");
161
- icon.classList.add("material-symbols-rounded");
162
- icon.textContent = rowData.icon;
163
- if (rowData.iconColor)
164
- icon.style["color"] = rowData.iconColor;
165
- row.prepend(icon);
166
- }
167
- row(rowData) {
168
- const rowContainer = document.createElement("div");
169
- rowContainer.classList.add("tttx-list__row");
170
- rowContainer.addEventListener("click", () => {
171
- this.listItemClickHandler(rowData);
172
- });
173
- this.appendRowCheckbox(rowContainer);
174
- this.template ? this.appendSeededTemplate(rowData, rowContainer) : this.appendGenericTemplate(rowData, rowContainer);
175
- return rowContainer;
176
- }
177
- renderRows(batchData) {
178
- batchData.forEach(rowData => {
179
- this.listItemContainer().appendChild(this.row(rowData));
180
- });
181
- }
182
- loadIndicator() {
183
- if (!this.loading)
184
- return;
185
- return h("div", { class: "load-indicator" }, h("tttx-loading-spinner", { size: 'large' }));
186
- }
187
- render() {
188
- return (h(Host, null, h("div", { class: "list-item-container", tabindex: "0" }, !this.loading && this.items.length === 0 ? "No data to display" : undefined), this.loadIndicator()));
189
- }
190
- get host() { return getElement(this); }
191
- };
5
+ const TttxList = class {
6
+ constructor(hostRef) {
7
+ registerInstance(this, hostRef);
8
+ this.listPaginate = createEvent(this, "listPaginate", 7);
9
+ this.listSelectedEvent = createEvent(this, "listSelectedEvent", 7);
10
+ this.listItemClick = createEvent(this, "listItemClick", 7);
11
+ this.rowCount = 0;
12
+ this.name = undefined;
13
+ this.selectable = undefined;
14
+ this.items = [];
15
+ this.selectedIds = [];
16
+ this.loading = true;
17
+ this.lastPage = false;
18
+ }
19
+ listLoadHandler(event) {
20
+ if (event.detail.name !== this.name)
21
+ return;
22
+ this.items = [...this.items, ...event.detail.items];
23
+ this.loading = false;
24
+ this.lastPage = event.detail.lastPage;
25
+ this.renderRows(event.detail.items);
26
+ if (this.scrollableParent.clientHeight === this.scrollableParent.scrollHeight)
27
+ this.listPaginateHandler();
28
+ }
29
+ listPaginateHandler() {
30
+ // We don't want to emit an event to load the next page if this is the last page, or if we're already loading
31
+ if (this.lastPage || this.loading)
32
+ return;
33
+ this.loading = true;
34
+ this.listPaginate.emit({ name: this.name });
35
+ }
36
+ listClearDataCacheHandler(event) {
37
+ if (event.detail.name !== this.name)
38
+ return;
39
+ this.items = [];
40
+ this.selectedIds = [];
41
+ this.listItemContainer()
42
+ .querySelectorAll('.tttx-list__row')
43
+ .forEach((node) => {
44
+ node.remove();
45
+ });
46
+ this.rowCount = 0;
47
+ this.lastPage = false;
48
+ this.loading = false;
49
+ }
50
+ listActionSelectedEventHandler(event) {
51
+ if (event.detail.name !== this.name || !this.selectable || this.selectedIds.length === 0)
52
+ return;
53
+ const selectedRows = this.selectedIds.map(id => {
54
+ return this.items[id];
55
+ });
56
+ if (event.detail.removeRows)
57
+ this.removeSelectedRows();
58
+ this.listSelectedEvent.emit({
59
+ name: this.name,
60
+ eventName: event.detail.eventName,
61
+ selectedRows,
62
+ });
63
+ }
64
+ removeSelectedRows() {
65
+ const orderedSelectedIds = [...this.selectedIds].sort((a, b) => {
66
+ return b - a;
67
+ });
68
+ orderedSelectedIds.forEach(itemIndex => {
69
+ this.items.splice(itemIndex, 1);
70
+ this.listItemContainer().removeChild(this.listItemContainer().querySelector(`[data-row-id="${itemIndex}"]`));
71
+ // If this removes the scrollbar and we're not on the last page, load in a new page
72
+ if (this.scrollableParent.clientHeight === this.scrollableParent.scrollHeight)
73
+ this.listPaginateHandler();
74
+ });
75
+ // Empty selected ids with mutation rather than assignment to avoid unecessary component rerender
76
+ this.selectedIds.splice(0, this.selectedIds.length);
77
+ }
78
+ listItemClickHandler(itemData) {
79
+ if (this.selectedIds.length !== 0)
80
+ return;
81
+ this.listItemClick.emit({ itemData, name: this.name });
82
+ }
83
+ componentWillLoad() {
84
+ this.template = this.host.querySelector('template');
85
+ this.scrollableParent = this.getScrollableParent(this.host);
86
+ const scrollableContext = this.scrollableParent === document.scrollingElement ? document : this.scrollableParent;
87
+ scrollableContext.addEventListener('scroll', this.scrollHandler.bind(this));
88
+ window.addEventListener('resize', this.scrollHandler.bind(this));
89
+ }
90
+ componentDidLoad() {
91
+ // Emit event to load first page
92
+ this.listPaginate.emit({ name: this.name });
93
+ }
94
+ listItemContainer() {
95
+ return this.host.shadowRoot.querySelector('.list-item-container');
96
+ }
97
+ async scrollHandler() {
98
+ const { clientHeight, scrollTop, scrollHeight } = this.scrollableParent;
99
+ if (Math.abs(scrollHeight - clientHeight - scrollTop) < 26)
100
+ this.listPaginateHandler();
101
+ }
102
+ isScrollable(node) {
103
+ const hasScrollbar = ['scroll', 'auto'].includes(node.style.overflowY);
104
+ return hasScrollbar;
105
+ }
106
+ getScrollableParent(node) {
107
+ if (!node || node === document.body) {
108
+ return document.scrollingElement;
109
+ }
110
+ else {
111
+ return this.isScrollable(node) ? node : this.getScrollableParent(node.parentElement);
112
+ }
113
+ }
114
+ appendRowCheckbox(rowContainer) {
115
+ if (!this.selectable)
116
+ return;
117
+ const rowId = this.rowCount;
118
+ const checkbox = document.createElement('input');
119
+ checkbox.setAttribute('type', 'checkbox');
120
+ checkbox.addEventListener('click', e => {
121
+ e.stopPropagation();
122
+ if (e.target.checked) {
123
+ this.selectedIds = [...this.selectedIds, rowId];
124
+ rowContainer.classList.add('selected');
125
+ }
126
+ else {
127
+ this.selectedIds = this.selectedIds.filter(id => {
128
+ return id !== rowId;
129
+ });
130
+ rowContainer.classList.remove('selected');
131
+ }
132
+ });
133
+ rowContainer.setAttribute('data-row-id', `${rowId}`);
134
+ this.rowCount++;
135
+ rowContainer.appendChild(checkbox);
136
+ }
137
+ appendSeededTemplate(rowData, rowContainer) {
138
+ this.template.childNodes.forEach(child => {
139
+ const clone = child.cloneNode(false);
140
+ if (clone.getAttribute('data-fields')) {
141
+ const fields = clone.getAttribute('data-fields').replace(/\s/g, '').split(',');
142
+ const filteredRowData = Object.fromEntries(fields.map((field) => {
143
+ return [field, rowData[field]];
144
+ }));
145
+ clone.setAttribute('row-data', JSON.stringify(filteredRowData));
146
+ }
147
+ else {
148
+ clone.setAttribute('row-data', JSON.stringify(rowData));
149
+ }
150
+ rowContainer.appendChild(clone);
151
+ });
152
+ }
153
+ appendGenericTemplate(rowData, rowContainer) {
154
+ const row = document.createElement('div');
155
+ row.classList.add('generic-template__content');
156
+ row.textContent = rowData.text;
157
+ rowContainer.appendChild(row);
158
+ if (!rowData.icon)
159
+ return;
160
+ const icon = document.createElement('span');
161
+ icon.classList.add('material-symbols-rounded');
162
+ icon.textContent = rowData.icon;
163
+ if (rowData.iconColor)
164
+ icon.style['color'] = rowData.iconColor;
165
+ row.prepend(icon);
166
+ }
167
+ row(rowData) {
168
+ const rowContainer = document.createElement('div');
169
+ rowContainer.classList.add('tttx-list__row');
170
+ rowContainer.addEventListener('click', () => {
171
+ this.listItemClickHandler(rowData);
172
+ });
173
+ this.appendRowCheckbox(rowContainer);
174
+ this.template ? this.appendSeededTemplate(rowData, rowContainer) : this.appendGenericTemplate(rowData, rowContainer);
175
+ return rowContainer;
176
+ }
177
+ renderRows(batchData) {
178
+ batchData.forEach(rowData => {
179
+ this.listItemContainer().appendChild(this.row(rowData));
180
+ });
181
+ }
182
+ loadIndicator() {
183
+ if (!this.loading)
184
+ return;
185
+ return h("div", { class: "load-indicator" }, h("tttx-loading-spinner", { size: 'large' }));
186
+ }
187
+ render() {
188
+ return (h(Host, null, h("div", { class: "list-item-container", tabindex: "0" }, !this.loading && this.items.length === 0 ? 'No data to display' : undefined), this.loadIndicator()));
189
+ }
190
+ get host() { return getElement(this); }
191
+ };
192
192
  TttxList.style = tttxListCss;
193
193
 
194
194
  export { TttxList as tttx_list };
@@ -1,22 +1,22 @@
1
- import { r as registerInstance, h } from './index-232e347b.js';
1
+ import { r as registerInstance, h } from './index-a05bd606.js';
2
2
 
3
3
  const tttxLoadingSpinnerCss = ".material-symbols-rounded{font-variation-settings:\"FILL\" 1, \"wght\" 400, \"GRAD\" 0, \"opsz\" 24}.spinner-container{position:absolute}.loading-box{display:flex;align-items:center;justify-content:center}.loading-text{font-size:16px;font-weight:400;padding-top:10px;text-align:center}.spinner{border:solid #1479c6;border-bottom-color:#d5d5d5;border-radius:50%;position:relative;box-sizing:border-box;animation:rotation 1s linear infinite}.spinner.small{height:20px;width:20px;border-width:4px}.spinner.large{height:60px;width:60px;border-width:8px}@keyframes rotation{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}";
4
4
 
5
- const TttxLoadingSpinner = class {
6
- constructor(hostRef) {
7
- registerInstance(this, hostRef);
8
- this.loadingMessage = undefined;
9
- this.size = 'large';
10
- }
11
- renderLoadingMessage() {
12
- if (!this.loadingMessage)
13
- return '';
14
- return h("div", { class: "loading-text" }, "Loading, please wait...");
15
- }
16
- render() {
17
- return (h("div", { class: "spinner-container" }, h("div", { class: "loading-box" }, h("span", { class: `spinner ${this.size}` })), this.renderLoadingMessage()));
18
- }
19
- };
5
+ const TttxLoadingSpinner = class {
6
+ constructor(hostRef) {
7
+ registerInstance(this, hostRef);
8
+ this.loadingMessage = undefined;
9
+ this.size = 'large';
10
+ }
11
+ renderLoadingMessage() {
12
+ if (!this.loadingMessage)
13
+ return '';
14
+ return h("div", { class: "loading-text" }, "Loading, please wait...");
15
+ }
16
+ render() {
17
+ return (h("div", { class: "spinner-container" }, h("div", { class: "loading-box" }, h("span", { class: `spinner ${this.size}` })), this.renderLoadingMessage()));
18
+ }
19
+ };
20
20
  TttxLoadingSpinner.style = tttxLoadingSpinnerCss;
21
21
 
22
22
  export { TttxLoadingSpinner as tttx_loading_spinner };
@@ -1,19 +1,19 @@
1
- import { r as registerInstance, h, H as Host } from './index-232e347b.js';
1
+ import { r as registerInstance, h, H as Host } from './index-a05bd606.js';
2
2
 
3
3
  const tttxPopoverContentCss = ".material-symbols-rounded{font-variation-settings:\"FILL\" 1, \"wght\" 400, \"GRAD\" 0, \"opsz\" 24}:host{display:block;max-width:400px}h4{margin:0;font-size:15px;font-weight:700;color:black;margin-bottom:4px}p{margin:0;font-size:14px;font-weight:normal;color:black;margin-bottom:4px}.linky{color:#1479c6;text-decoration:none;cursor:pointer}";
4
4
 
5
- const TttxPopoverContent = class {
6
- constructor(hostRef) {
7
- registerInstance(this, hostRef);
8
- this.header = undefined;
9
- this.body = undefined;
10
- this.linkcontext = undefined;
11
- this.linktext = undefined;
12
- }
13
- render() {
14
- return (h(Host, null, this.header && h("h4", null, this.header), this.body && h("p", null, this.body), this.linkcontext && (h("span", { class: "linky", onClick: evt => console.log(this.linkcontext, evt) }, this.linktext || 'More Information'))));
15
- }
16
- };
5
+ const TttxPopoverContent = class {
6
+ constructor(hostRef) {
7
+ registerInstance(this, hostRef);
8
+ this.header = undefined;
9
+ this.body = undefined;
10
+ this.linkcontext = undefined;
11
+ this.linktext = undefined;
12
+ }
13
+ render() {
14
+ return (h(Host, null, this.header && h("h4", null, this.header), this.body && h("p", null, this.body), this.linkcontext && (h("span", { class: "linky", onClick: evt => console.log(this.linkcontext, evt) }, this.linktext || 'More Information'))));
15
+ }
16
+ };
17
17
  TttxPopoverContent.style = tttxPopoverContentCss;
18
18
 
19
19
  export { TttxPopoverContent as tttx_popover_content };