kempo-ui 0.0.3 → 0.0.4

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 (137) hide show
  1. package/.github/workflows/publish-major.yml +39 -0
  2. package/.github/workflows/publish-minor.yml +39 -0
  3. package/.github/workflows/{publish-npm.yml → publish-patch.yml} +1 -1
  4. package/.vscode/settings.json +2 -0
  5. package/dist/kempo-hljs.css +1 -0
  6. package/dist/src/components/Accordion.js +36 -0
  7. package/dist/src/components/Card.js +37 -0
  8. package/dist/src/components/Collapsible.js +41 -0
  9. package/dist/src/components/ContentSlider.js +44 -0
  10. package/dist/src/components/Dialog.js +113 -0
  11. package/dist/src/components/Icon.js +2 -2
  12. package/dist/src/components/PersistantCollapsible.js +1 -0
  13. package/dist/src/components/PhotoViewer.js +135 -0
  14. package/dist/src/components/Resize.js +96 -0
  15. package/dist/src/components/ShowMore.js +42 -0
  16. package/dist/src/components/SideMenu.js +1 -1
  17. package/dist/src/components/Split.js +84 -0
  18. package/dist/src/components/Tabs.js +155 -0
  19. package/dist/src/components/Tags.js +69 -0
  20. package/dist/src/components/ThemeSwitcher.js +23 -0
  21. package/dist/src/components/Timestamp.js +1 -0
  22. package/dist/src/utils/debounce.js +1 -0
  23. package/dist/src/utils/drag.js +1 -0
  24. package/dist/src/utils/formatTimestamp.js +1 -0
  25. package/dist/src/utils/propConverters.js +1 -0
  26. package/dist/src/utils/watchWindowSize.js +1 -0
  27. package/docs/components/accordion.html +69 -25
  28. package/docs/components/card.html +6 -5
  29. package/docs/components/collapsible.html +198 -0
  30. package/docs/components/content-slider.html +56 -26
  31. package/docs/components/dialog.html +54 -48
  32. package/docs/components/focus-capture.html +2 -3
  33. package/docs/components/icon.html +5 -8
  34. package/docs/components/import.html +1 -6
  35. package/docs/components/persistant-collapsible.html +123 -0
  36. package/docs/components/photo-viewer.html +226 -0
  37. package/docs/components/resize.html +44 -18
  38. package/docs/components/show-more.html +12 -6
  39. package/docs/components/side-menu.html +3 -12
  40. package/docs/components/split.html +26 -5
  41. package/docs/components/tablePagination.html +4 -4
  42. package/docs/components/tableRecordFiltering.html +16 -3
  43. package/docs/components/tableRecordSelection.html +2 -2
  44. package/docs/components/tabs.html +24 -7
  45. package/docs/components/tags.html +24 -8
  46. package/docs/components/theme-switcher.html +3 -6
  47. package/docs/components/timestamp.html +20 -24
  48. package/docs/components/toast.html +23 -32
  49. package/docs/components/toggle.html +4 -3
  50. package/docs/kempo-hljs.css +1 -0
  51. package/docs/media/civic.jpg +0 -0
  52. package/docs/media/corvette.jpg +0 -0
  53. package/docs/media/evo.jpg +0 -0
  54. package/docs/media/gtr.jpg +0 -0
  55. package/docs/media/nsx.jpg +0 -0
  56. package/docs/nav.inc.html +11 -17
  57. package/docs/src/components/Accordion.js +36 -0
  58. package/docs/src/components/Card.js +37 -0
  59. package/docs/src/components/Collapsible.js +41 -0
  60. package/docs/src/components/ContentSlider.js +44 -0
  61. package/docs/src/components/Dialog.js +113 -0
  62. package/docs/src/components/Icon.js +2 -2
  63. package/docs/src/components/PersistantCollapsible.js +1 -0
  64. package/docs/src/components/PhotoViewer.js +135 -0
  65. package/docs/src/components/Resize.js +96 -0
  66. package/docs/src/components/ShowMore.js +42 -0
  67. package/docs/src/components/SideMenu.js +1 -1
  68. package/docs/src/components/Split.js +84 -0
  69. package/docs/src/components/Tabs.js +155 -0
  70. package/docs/src/components/Tags.js +69 -0
  71. package/docs/src/components/ThemeSwitcher.js +23 -0
  72. package/docs/src/components/Timestamp.js +1 -0
  73. package/docs/src/utils/debounce.js +1 -0
  74. package/docs/src/utils/drag.js +1 -0
  75. package/docs/src/utils/formatTimestamp.js +1 -0
  76. package/docs/src/utils/propConverters.js +1 -0
  77. package/docs/src/utils/watchWindowSize.js +1 -0
  78. package/docs/utils/debounce.html +78 -0
  79. package/docs/utils/drag.html +104 -0
  80. package/docs/utils/formatTimestamp.html +114 -0
  81. package/docs/utils/propConverters.html +132 -0
  82. package/docs/utils/watchWindowSize.html +166 -0
  83. package/icons/error.svg +1 -1
  84. package/icons/warning.svg +1 -1
  85. package/package.json +1 -1
  86. package/scripts/build.js +1 -1
  87. package/scripts/docs.js +4 -2
  88. package/src/components/Accordion.js +229 -0
  89. package/src/components/Collapsible.js +109 -0
  90. package/src/components/ContentSlider.js +205 -0
  91. package/src/components/Dialog.js +368 -0
  92. package/src/components/PersistantCollapsible.js +69 -0
  93. package/src/components/PhotoViewer.js +368 -0
  94. package/src/components/Resize.js +210 -0
  95. package/src/components/ShadowComponent.js +3 -1
  96. package/src/components/ShowMore.js +109 -0
  97. package/src/components/Sortable.js +193 -0
  98. package/src/components/Split.js +192 -0
  99. package/src/components/Table.js +1202 -0
  100. package/src/components/Tabs.js +428 -0
  101. package/src/components/Tags.js +253 -0
  102. package/src/components/Timestamp.js +31 -0
  103. package/src/components/Toast.js +454 -0
  104. package/src/components/Toggle.js +173 -0
  105. package/src/components/tableControls/DeleteRecord.js +29 -0
  106. package/src/components/tableControls/Edit.js +88 -0
  107. package/src/components/tableControls/ExportCSV.js +71 -0
  108. package/src/components/tableControls/ExportJson.js +55 -0
  109. package/src/components/tableControls/FieldSortHide.js +76 -0
  110. package/src/components/tableControls/Filters.js +114 -0
  111. package/src/components/tableControls/FirstPage.js +65 -0
  112. package/src/components/tableControls/HiddenCount.js +45 -0
  113. package/src/components/tableControls/Hide.js +34 -0
  114. package/src/components/tableControls/LastPage.js +65 -0
  115. package/src/components/tableControls/NextPage.js +65 -0
  116. package/src/components/tableControls/PageSelect.js +109 -0
  117. package/src/components/tableControls/PageSize.js +68 -0
  118. package/src/components/tableControls/PrevPage.js +65 -0
  119. package/src/components/tableControls/Search.js +58 -0
  120. package/src/components/tableControls/ShowAll.js +34 -0
  121. package/src/components/tableControls/TableControl.js +105 -0
  122. package/src/utils/debounce.js +9 -0
  123. package/src/utils/drag.js +80 -0
  124. package/src/utils/formatTimestamp.js +27 -0
  125. package/src/utils/toTitleCase.js +9 -0
  126. package/src/utils/watchWindowSize.js +16 -0
  127. package/dist/src/utils/cli.js +0 -1
  128. package/dist/src/utils/fs-utils.js +0 -1
  129. package/docs/components/component.html +0 -90
  130. package/docs/components/directory-viewer.html +0 -90
  131. package/docs/components/lazy-component.html +0 -84
  132. package/docs/components/reactive-component.html +0 -69
  133. package/docs/components/reactive-lazy-component.html +0 -69
  134. package/docs/components/search.html +0 -102
  135. package/docs/components/sortable.html +0 -96
  136. package/src/utils/cli.js +0 -43
  137. package/src/utils/fs-utils.js +0 -41
@@ -0,0 +1,88 @@
1
+ import TableControl from './TableControl.js';
2
+ import { html, css } from '../../lit-all.min.js';
3
+ import '../Icon.js';
4
+
5
+ export default class Edit extends TableControl {
6
+ /*
7
+ Properties
8
+ */
9
+ static properties = {
10
+ isEditing: { type: Boolean }
11
+ };
12
+
13
+ /*
14
+ Styles
15
+ */
16
+ static styles = [
17
+ TableControl.styles,
18
+ css`
19
+ :host {
20
+ display: inline-flex;
21
+ width: max-content;
22
+ align-items: baseline;
23
+ }
24
+ `
25
+ ];
26
+
27
+ /*
28
+ Constructor
29
+ */
30
+ constructor() {
31
+ super({ maxWidth: 80 });
32
+ }
33
+
34
+ /*
35
+ Lifecycle Callbacks
36
+ */
37
+ connectedCallback() {
38
+ super.connectedCallback();
39
+ this.onTableEvent('editingChange', this.handleEditingChange);
40
+ }
41
+
42
+ /*
43
+ Event Handlers
44
+ */
45
+ handleEditingChange = (e) => {
46
+ if(e.detail.record === this.record){
47
+ this.isEditing = e.detail.editing;
48
+ }
49
+ };
50
+
51
+ handleEdit = () => {
52
+ if(this.record){
53
+ this.table.editRecord(this.record);
54
+ }
55
+ };
56
+
57
+ handleSave = () => {
58
+ if(this.record){
59
+ this.table.saveEditedRecord(this.record);
60
+ }
61
+ };
62
+
63
+ handleCancel = () => {
64
+ if(this.record){
65
+ this.table.cancelEditedRecord(this.record);
66
+ }
67
+ };
68
+
69
+ /*
70
+ Rendering
71
+ */
72
+ render() {
73
+ return this.isEditing ? html`
74
+ <button class="no-btn icon-btn bg-success" @click="${this.handleSave}">
75
+ <k-icon name="check"></k-icon>
76
+ </button>
77
+ <button class="no-btn icon-btn bg-danger" @click="${this.handleCancel}">
78
+ <k-icon name="close"></k-icon>
79
+ </button>
80
+ ` : html`
81
+ <button class="no-btn icon-btn" @click="${this.handleEdit}">
82
+ <k-icon name="edit"></k-icon>
83
+ </button>
84
+ `;
85
+ }
86
+ }
87
+
88
+ customElements.define('k-tc-edit', Edit);
@@ -0,0 +1,71 @@
1
+ import TableControl from './TableControl.js';
2
+ import { html } from '../../lit-all.min.js';
3
+ import '../Icon.js';
4
+
5
+ export default class ExportCSV extends TableControl {
6
+ /*
7
+ Constructor
8
+ */
9
+ constructor() {
10
+ super();
11
+ this.maxWidth = 136;
12
+ }
13
+
14
+ /*
15
+ Public Methods
16
+ */
17
+ getCSV() {
18
+ const table = this.table;
19
+ if(!table) return '';
20
+
21
+ let csv = '';
22
+ const fields = [];
23
+
24
+ table.fields.forEach(({ name, calculator }) => {
25
+ if(!calculator) {
26
+ fields.push(name);
27
+ }
28
+ });
29
+
30
+ csv += fields.join(',') + '\n';
31
+
32
+ if(this.record) {
33
+ const row = fields.map(field => this.record[field] || '');
34
+ csv += row.join(',') + '\n';
35
+ } else {
36
+ table.records.forEach(record => {
37
+ const row = fields.map(field => record[field] || '');
38
+ csv += row.join(',') + '\n';
39
+ });
40
+ }
41
+
42
+ return csv;
43
+ }
44
+
45
+ export = () => {
46
+ const data = this.getCSV();
47
+ const blob = new Blob([data], { type: 'text/csv' });
48
+ const url = URL.createObjectURL(blob);
49
+ const a = document.createElement('a');
50
+ a.href = url;
51
+ a.download = 'data.csv';
52
+ a.click();
53
+ URL.revokeObjectURL(url);
54
+ };
55
+
56
+ /*
57
+ Rendering
58
+ */
59
+ render() {
60
+ return html`
61
+ <button class="no-btn ph" @click="${this.export}">
62
+ <slot>
63
+ <k-icon name="export-file"></k-icon>
64
+ Export CSV
65
+ </slot>
66
+ </button>
67
+ `;
68
+ }
69
+ }
70
+
71
+ customElements.define('k-tc-export-csv', ExportCSV);
@@ -0,0 +1,55 @@
1
+ import TableControl from './TableControl.js';
2
+ import { html } from '../../lit-all.min.js';
3
+ import '../Icon.js';
4
+
5
+ export default class ExportJson extends TableControl {
6
+ /*
7
+ Constructor
8
+ */
9
+ constructor() {
10
+ super();
11
+ this.maxWidth = 136;
12
+ }
13
+
14
+ /*
15
+ Public Methods
16
+ */
17
+ export = () => {
18
+ const record = this.record;
19
+ if(record) {
20
+ const data = JSON.stringify(record);
21
+ const blob = new Blob([data], { type: 'application/json' });
22
+ const url = URL.createObjectURL(blob);
23
+ const a = document.createElement('a');
24
+ a.href = url;
25
+ a.download = 'data.json';
26
+ a.click();
27
+ URL.revokeObjectURL(url);
28
+ } else {
29
+ const data = JSON.stringify(this.table.records);
30
+ const blob = new Blob([data], { type: 'application/json' });
31
+ const url = URL.createObjectURL(blob);
32
+ const a = document.createElement('a');
33
+ a.href = url;
34
+ a.download = 'data.json';
35
+ a.click();
36
+ URL.revokeObjectURL(url);
37
+ }
38
+ };
39
+
40
+ /*
41
+ Rendering
42
+ */
43
+ render() {
44
+ return html`
45
+ <button class="no-btn ph" @click="${this.export}">
46
+ <slot>
47
+ <k-icon name="export-file"></k-icon>
48
+ Export JSON
49
+ </slot>
50
+ </button>
51
+ `;
52
+ }
53
+ }
54
+
55
+ customElements.define('k-tc-export-json', ExportJson);
@@ -0,0 +1,76 @@
1
+ import TableControl from './TableControl.js';
2
+ import { html, render } from '../../lit-all.min.js';
3
+ import '../Icon.js';
4
+ import Dialog from '../Dialog.js';
5
+
6
+ export default class FieldSortHide extends TableControl {
7
+ /*
8
+ Constructor
9
+ */
10
+ constructor() {
11
+ super({ maxWidth: 40 });
12
+ }
13
+
14
+ /*
15
+ Event Handlers
16
+ */
17
+ handleClick = () => {
18
+ this.openDialog();
19
+ };
20
+
21
+ /*
22
+ Methods
23
+ */
24
+ openDialog = () => {
25
+ import('../Sortable.js');
26
+
27
+ const dialogContent = document.createElement('div');
28
+
29
+ render(html`
30
+ <h3 class="m0 ph" slot="title">Show / Hide Fields</h3>
31
+ <div class="m">
32
+ <k-sortable id="sorting" @sort="${(e) => {
33
+ const newOrder = Array.from(e.target.querySelectorAll('k-sortable-item'))
34
+ .map(item => item.getAttribute('data-field'));
35
+ this.table.reorderFields(newOrder);
36
+ }}">
37
+ ${this.table.fields.map(field => html`
38
+ <k-sortable-item data-field="${field.name}">
39
+ <label class="field pb0">
40
+ <input
41
+ class="field-visibility"
42
+ data-field="${field.name}"
43
+ type="checkbox"
44
+ .checked="${!field.hidden}"
45
+ @change="${(e) => {
46
+ this.table.setFieldHiddenState(field.name, !e.target.checked);
47
+ }}"
48
+ style="height: 1.25rem; width: 1.25rem"
49
+ />
50
+ ${field.label}
51
+ </label>
52
+ </k-sortable-item>
53
+ `)}
54
+ </k-sortable>
55
+ </div>
56
+ `, dialogContent);
57
+
58
+ Dialog.create(dialogContent, {
59
+ width: '400px',
60
+ cancelText: 'Close'
61
+ });
62
+ };
63
+
64
+ /*
65
+ Rendering
66
+ */
67
+ render() {
68
+ return html`
69
+ <button class="no-btn icon-btn" @click="${this.handleClick}">
70
+ <k-icon name="table-visibility"></k-icon>
71
+ </button>
72
+ `;
73
+ }
74
+ }
75
+
76
+ customElements.define('k-tc-field-sort-hide', FieldSortHide);
@@ -0,0 +1,114 @@
1
+ import TableControl from './TableControl.js';
2
+ import { html, render } from '../../lit-all.min.js';
3
+ import '../Icon.js';
4
+ import Dialog from '../Dialog.js';
5
+
6
+ export default class Filters extends TableControl {
7
+ /*
8
+ Constructor
9
+ */
10
+ constructor() {
11
+ super({ maxWidth: 40 });
12
+ }
13
+
14
+ /*
15
+ Event Handlers
16
+ */
17
+ handleFilter = () => {
18
+ this.openDialog();
19
+ };
20
+
21
+ /*
22
+ Methods
23
+ */
24
+ openDialog = () => {
25
+ const conditionOptions = {
26
+ 'equals': 'equals',
27
+ 'not-equals': 'does not equal',
28
+ 'contains': 'contains',
29
+ 'not-contains': 'does not contain',
30
+ 'greater-than': 'is greater than',
31
+ 'greater-than-or-equal': 'is greater than or equal to',
32
+ 'less-than': 'is less than',
33
+ 'less-than-or-equal': 'is less than or equal to'
34
+ };
35
+
36
+ const dialogContent = document.createElement('div');
37
+
38
+ render(html`
39
+ <h3 slot="title" class="m0 pyh px">Filters</h3>
40
+ <div class="p">
41
+ ${this.table.filters.length === 0 ? html`
42
+ <p>No Current Filters.</p>
43
+ ` : html`
44
+ <h5>Current Filters</h5>
45
+ <ul id="currentFilters">
46
+ ${this.table.filters.map(({field, condition, value}) => html`
47
+ <li
48
+ data-field="${field}"
49
+ data-condition="${condition}"
50
+ data-value="${value}"
51
+ >
52
+ ${field} ${conditionOptions[condition]} ${value}
53
+ <button class="remove-filter no-btn pq" @click="${(e) => {
54
+ this.table.removeFilter(field, condition, value);
55
+ dialog.close();
56
+ this.openDialog();
57
+ }}">
58
+ <k-icon name="close"></k-icon>
59
+ </button>
60
+ </li>
61
+ `)}
62
+ </ul>
63
+ `}
64
+ <hr />
65
+ <h5>Add A Filter</h5>
66
+ <form id="addFilter" @submit="${(e) => {
67
+ e.preventDefault();
68
+ const form = e.target;
69
+ this.table.addFilter(
70
+ form.filterField.value,
71
+ form.filterCondition.value,
72
+ form.filterValue.value
73
+ );
74
+ dialog.close();
75
+ this.openDialog();
76
+ }}">
77
+ <select id="filterField" class="mb">
78
+ ${this.table.fields.map(({name, label}) => html`
79
+ <option value="${name}">${label}</option>
80
+ `)}
81
+ </select>
82
+ <select id="filterCondition" class="mb">
83
+ ${Object.entries(conditionOptions).map(([key, value]) => html`
84
+ <option value="${key}" ?selected="${key === 'contains'}">${value}</option>
85
+ `)}
86
+ </select>
87
+ <input id="filterValue" type="text" class="mb" />
88
+ <button type="submit" class="btn primary mb mr">Add Filter</button>
89
+ ${this.table.filters.length === 0 ? '' : html`
90
+ <button type="button" class="btn danger mb mr" @click="${() => {
91
+ this.table.removeAllFilters();
92
+ dialog.close();
93
+ }}">Clear All Filters</button>
94
+ `}
95
+ </form>
96
+ </div>
97
+ `, dialogContent);
98
+
99
+ const dialog = Dialog.create(dialogContent, { width: '600px' });
100
+ };
101
+
102
+ /*
103
+ Rendering
104
+ */
105
+ render() {
106
+ return html`
107
+ <button class="no-btn icon-btn" @click="${this.handleFilter}">
108
+ <k-icon name="filter"></k-icon>
109
+ </button>
110
+ `;
111
+ }
112
+ }
113
+
114
+ customElements.define('k-tc-filters', Filters);
@@ -0,0 +1,65 @@
1
+ import TableControl from './TableControl.js';
2
+ import { html } from '../../lit-all.min.js';
3
+ import '../Icon.js';
4
+
5
+ export default class FirstPage extends TableControl {
6
+ constructor() {
7
+ super();
8
+ this.pageChangeHandler = () => this.requestUpdate();
9
+ }
10
+
11
+ /*
12
+ Lifecycle Callbacks
13
+ */
14
+
15
+ connectedCallback() {
16
+ super.connectedCallback();
17
+ if(this.table){
18
+ this.table.addEventListener('pageChange', this.pageChangeHandler);
19
+ }
20
+ }
21
+
22
+ disconnectedCallback() {
23
+ super.disconnectedCallback();
24
+ if(this.table){
25
+ this.table.removeEventListener('pageChange', this.pageChangeHandler);
26
+ }
27
+ }
28
+
29
+ /*
30
+ Event Handlers
31
+ */
32
+
33
+ handleClick = () => {
34
+ if(this.table){
35
+ this.table.firstPage();
36
+ }
37
+ };
38
+
39
+ /*
40
+ Utility Functions
41
+ */
42
+
43
+ get isDisabled() {
44
+ if(!this.table) return true;
45
+ return this.table.getCurrentPage() === 1;
46
+ }
47
+
48
+ /*
49
+ Rendering Logic
50
+ */
51
+
52
+ render() {
53
+ return html`
54
+ <button
55
+ class="no-btn icon-btn"
56
+ ?disabled="${this.isDisabled}"
57
+ @click="${this.handleClick}"
58
+ >
59
+ <k-icon name="first"></k-icon>
60
+ </button>
61
+ `;
62
+ }
63
+ }
64
+
65
+ customElements.define('k-tc-first-page', FirstPage);
@@ -0,0 +1,45 @@
1
+ import TableControl from './TableControl.js';
2
+ import { html } from '../../lit-all.min.js';
3
+
4
+ export default class HiddenCount extends TableControl {
5
+ /*
6
+ Properties
7
+ */
8
+ static properties = {
9
+ hiddenCount: { type: Number }
10
+ };
11
+
12
+ /*
13
+ Lifecycle Callbacks
14
+ */
15
+ connectedCallback() {
16
+ super.connectedCallback();
17
+ this.updateHiddenCount();
18
+ this.onTableEvent('recordHidden recordShown', this.handleHiddenChange);
19
+ }
20
+
21
+ /*
22
+ Event Handlers
23
+ */
24
+ handleHiddenChange = () => {
25
+ this.updateHiddenCount();
26
+ };
27
+
28
+ /*
29
+ Methods
30
+ */
31
+ updateHiddenCount = () => {
32
+ this.hiddenCount = this.table?.getHiddenRecords().length || 0;
33
+ };
34
+
35
+ /*
36
+ Rendering
37
+ */
38
+ render() {
39
+ return html`
40
+ <div class="pyq pxh"><span>${this.hiddenCount}</span>&nbsp;Hidden Records</div>
41
+ `;
42
+ }
43
+ }
44
+
45
+ customElements.define('k-tc-hidden-count', HiddenCount);
@@ -0,0 +1,34 @@
1
+ import TableControl from './TableControl.js';
2
+ import { html } from '../../lit-all.min.js';
3
+ import '../Icon.js';
4
+
5
+ export default class Hide extends TableControl {
6
+ /*
7
+ Constructor
8
+ */
9
+ constructor() {
10
+ super({ maxWidth: 40 });
11
+ }
12
+
13
+ /*
14
+ Event Handlers
15
+ */
16
+ handleHide = () => {
17
+ if(this.record){
18
+ this.table.hideRecord(this.record);
19
+ }
20
+ };
21
+
22
+ /*
23
+ Rendering
24
+ */
25
+ render() {
26
+ return html`
27
+ <button class="no-btn icon-btn" @click="${this.handleHide}">
28
+ <k-icon name="hide"></k-icon>
29
+ </button>
30
+ `;
31
+ }
32
+ }
33
+
34
+ customElements.define('k-tc-hide', Hide);
@@ -0,0 +1,65 @@
1
+ import TableControl from './TableControl.js';
2
+ import { html } from '../../lit-all.min.js';
3
+ import '../Icon.js';
4
+
5
+ export default class LastPage extends TableControl {
6
+ constructor() {
7
+ super();
8
+ this.pageChangeHandler = () => this.requestUpdate();
9
+ }
10
+
11
+ /*
12
+ Lifecycle Callbacks
13
+ */
14
+
15
+ connectedCallback() {
16
+ super.connectedCallback();
17
+ if(this.table){
18
+ this.table.addEventListener('pageChange', this.pageChangeHandler);
19
+ }
20
+ }
21
+
22
+ disconnectedCallback() {
23
+ super.disconnectedCallback();
24
+ if(this.table){
25
+ this.table.removeEventListener('pageChange', this.pageChangeHandler);
26
+ }
27
+ }
28
+
29
+ /*
30
+ Event Handlers
31
+ */
32
+
33
+ handleClick = () => {
34
+ if(this.table){
35
+ this.table.lastPage();
36
+ }
37
+ };
38
+
39
+ /*
40
+ Utility Functions
41
+ */
42
+
43
+ get isDisabled() {
44
+ if(!this.table) return true;
45
+ return this.table.getCurrentPage() === this.table.getTotalPages();
46
+ }
47
+
48
+ /*
49
+ Rendering Logic
50
+ */
51
+
52
+ render() {
53
+ return html`
54
+ <button
55
+ class="no-btn icon-btn"
56
+ ?disabled="${this.isDisabled}"
57
+ @click="${this.handleClick}"
58
+ >
59
+ <k-icon name="last"></k-icon>
60
+ </button>
61
+ `;
62
+ }
63
+ }
64
+
65
+ customElements.define('k-tc-last-page', LastPage);
@@ -0,0 +1,65 @@
1
+ import TableControl from './TableControl.js';
2
+ import { html } from '../../lit-all.min.js';
3
+ import '../Icon.js';
4
+
5
+ export default class NextPage extends TableControl {
6
+ constructor() {
7
+ super();
8
+ this.pageChangeHandler = () => this.requestUpdate();
9
+ }
10
+
11
+ /*
12
+ Lifecycle Callbacks
13
+ */
14
+
15
+ connectedCallback() {
16
+ super.connectedCallback();
17
+ if(this.table){
18
+ this.table.addEventListener('pageChange', this.pageChangeHandler);
19
+ }
20
+ }
21
+
22
+ disconnectedCallback() {
23
+ super.disconnectedCallback();
24
+ if(this.table){
25
+ this.table.removeEventListener('pageChange', this.pageChangeHandler);
26
+ }
27
+ }
28
+
29
+ /*
30
+ Event Handlers
31
+ */
32
+
33
+ handleClick = () => {
34
+ if(this.table){
35
+ this.table.nextPage();
36
+ }
37
+ };
38
+
39
+ /*
40
+ Utility Functions
41
+ */
42
+
43
+ get isDisabled() {
44
+ if(!this.table) return true;
45
+ return this.table.getCurrentPage() === this.table.getTotalPages();
46
+ }
47
+
48
+ /*
49
+ Rendering Logic
50
+ */
51
+
52
+ render() {
53
+ return html`
54
+ <button
55
+ class="no-btn icon-btn"
56
+ ?disabled="${this.isDisabled}"
57
+ @click="${this.handleClick}"
58
+ >
59
+ <k-icon name="chevron-right"></k-icon>
60
+ </button>
61
+ `;
62
+ }
63
+ }
64
+
65
+ customElements.define('k-tc-next-page', NextPage);