@exmg/exm-grid 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +501 -0
  2. package/assets/arrow-upward.svg +7 -0
  3. package/index.d.ts +14 -0
  4. package/index.js +15 -0
  5. package/package.json +58 -0
  6. package/src/search/exm-toolbar-search.d.ts +25 -0
  7. package/src/search/exm-toolbar-search.js +197 -0
  8. package/src/styles/exm-grid-base-toolbar-styles-css.d.ts +2 -0
  9. package/src/styles/exm-grid-base-toolbar-styles-css.js +4 -0
  10. package/src/styles/exm-grid-base-toolbar-styles.scss +89 -0
  11. package/src/styles/exm-grid-common-styles-css.d.ts +2 -0
  12. package/src/styles/exm-grid-common-styles-css.js +4 -0
  13. package/src/styles/exm-grid-common-styles.scss +1 -0
  14. package/src/styles/exm-grid-pagination-styles-css.d.ts +2 -0
  15. package/src/styles/exm-grid-pagination-styles-css.js +4 -0
  16. package/src/styles/exm-grid-pagination-styles.scss +69 -0
  17. package/src/styles/exm-grid-setting-selection-list-styles-css.d.ts +2 -0
  18. package/src/styles/exm-grid-setting-selection-list-styles-css.js +4 -0
  19. package/src/styles/exm-grid-setting-selection-list-styles.scss +8 -0
  20. package/src/styles/exm-grid-styles-css.d.ts +2 -0
  21. package/src/styles/exm-grid-styles-css.js +4 -0
  22. package/src/styles/exm-grid-styles.scss +387 -0
  23. package/src/table/exm-grid-base-toolbar.d.ts +23 -0
  24. package/src/table/exm-grid-base-toolbar.js +91 -0
  25. package/src/table/exm-grid-pagination.d.ts +37 -0
  26. package/src/table/exm-grid-pagination.js +190 -0
  27. package/src/table/exm-grid-setting-selection-list.d.ts +24 -0
  28. package/src/table/exm-grid-setting-selection-list.js +124 -0
  29. package/src/table/exm-grid-smart-toolbar.d.ts +31 -0
  30. package/src/table/exm-grid-smart-toolbar.js +138 -0
  31. package/src/table/exm-grid-toolbar-filters.d.ts +36 -0
  32. package/src/table/exm-grid-toolbar-filters.js +77 -0
  33. package/src/table/exm-grid-toolbar.d.ts +42 -0
  34. package/src/table/exm-grid-toolbar.js +283 -0
  35. package/src/table/exm-grid.d.ts +130 -0
  36. package/src/table/exm-grid.js +333 -0
  37. package/src/table/featrues/exm-column-sortable.d.ts +12 -0
  38. package/src/table/featrues/exm-column-sortable.js +50 -0
  39. package/src/table/featrues/exm-row-expandable.d.ts +9 -0
  40. package/src/table/featrues/exm-row-expandable.js +42 -0
  41. package/src/table/featrues/exm-row-selectable.d.ts +20 -0
  42. package/src/table/featrues/exm-row-selectable.js +204 -0
  43. package/src/table/featrues/exm-row-sortable.d.ts +9 -0
  44. package/src/table/featrues/exm-row-sortable.js +50 -0
  45. package/src/table/types/exm-grid-smart-toolbar-types.d.ts +17 -0
  46. package/src/table/types/exm-grid-smart-toolbar-types.js +6 -0
  47. package/src/table/types/exm-grid-toolbar-types.d.ts +55 -0
  48. package/src/table/types/exm-grid-toolbar-types.js +16 -0
  49. package/src/table/types/exm-grid-types.d.ts +15 -0
  50. package/src/table/types/exm-grid-types.js +2 -0
  51. package/src/table/utils/exm-query-selectors.d.ts +12 -0
  52. package/src/table/utils/exm-query-selectors.js +37 -0
@@ -0,0 +1,387 @@
1
+ @use '@material/typography/mixins' as typography;
2
+
3
+ @mixin sortable-col-padding() {
4
+ padding-right: calc(var(--exm-table-th-sort-icon-height) + var(--exm-table-th-sort-margin-left));
5
+ &.grid-col-number {
6
+ padding-right: calc(
7
+ var(--exm-table-th-sort-icon-height) + var(--exm-table-th-sort-margin-left) +
8
+ var(--exm-table-col-number-padding-right)
9
+ );
10
+ }
11
+ }
12
+
13
+ @mixin table-layout-fixed() {
14
+ &[data-table-layout='fixed'] {
15
+ table-layout: fixed;
16
+ td:not(.grid-checkbox-cell):not(.menu-cell) {
17
+ overflow: hidden;
18
+ white-space: nowrap;
19
+ text-overflow: ellipsis;
20
+ }
21
+ th,
22
+ td {
23
+ &.grid-checkbox-cell {
24
+ width: var(--exm-table-checkbox-cell-width);
25
+ }
26
+ &.no-ellipsis {
27
+ text-overflow: initial;
28
+ }
29
+ }
30
+ }
31
+ }
32
+
33
+ :host {
34
+ @include typography.base;
35
+ display: block;
36
+
37
+ --exm-arrow-upward-url: url('/node_modules/@exmg/exm-grid/assets/arrow-upward.svg');
38
+ --exm-table-card-width: var(--exm-theme-table-card-width, 100%);
39
+ --exm-table-card-margin-bottom: var(--exm-theme-table-card-margin-bottom, 5px);
40
+
41
+ --exm-table-color: var(--exm-theme-table-on-surface, var(--md-sys-color-on-surface-container));
42
+ --exm-table-card-background-color: var(--exm-theme-table-surface, var(--md-sys-color-surface-container));
43
+ --exm-table-row-divider-color: var(--exm-theme-table-row-divider-color, var(--md-sys-color-surface-variant));
44
+
45
+ --exm-table-row-selected-color: var(--exm-theme-table-row-selected-color, var(--md-sys-color-on-secondary-container));
46
+ --exm-table-row-selected-background-color: var(
47
+ --exm-theme-table-row-selected-background-color,
48
+ var(--md-sys-color-secondary-container)
49
+ );
50
+ --exm-table-row-hover-color: var(--exm-theme-table-row-hover-color, var(--md-sys-color-on-surface));
51
+ --exm-table-row-hover-background-color: var(
52
+ --exm-theme-table-row-hover-background-color,
53
+ var(--md-sys-color-surface-container-highest)
54
+ );
55
+ --exm-table-row-dragged-background-color: var(
56
+ --exm-theme-table-row-dragged-background-color,
57
+ var(--md-sys-color-surface-container-low)
58
+ );
59
+ --exm-table-rows-expanded-divider-border: var(--exm-theme-table-rows-expanded-divider-border, none);
60
+ --exm-table-rows-expanded-border: var(--exm-theme-table-rows-expanded-border, none);
61
+ --exm-table-rows-expanded-background-color: var(
62
+ --exm-theme-table-rows-expanded-background-color,
63
+ var(--md-sys-color-surface-container-low)
64
+ );
65
+ --exm-table-rows-expanded-color: var(--exm-theme-table-rows-expanded-color, var(--md-sys-color-on-surface));
66
+ --exm-table-th-color: var(--exm-theme-table-th-on-surface, var(--md-sys-color-on-surface-container));
67
+ --exm-table-th-background-color: var(--exm-theme-table-th-surface, var(--md-sys-color-surface-container));
68
+ --exm-table-th-sortable-hover-color: var(--exm-theme-table-th-sortable-hover-color, var(--md-sys-color-on-surface));
69
+ --exm-table-columns-background-color: var(--exm-theme-table-columns-background-color, var(--md-sys-color-surface));
70
+
71
+ --exm-table-th-height: var(--exm-theme-table-th-height, 48px);
72
+ --exm-table-th-sort-margin-left: var(--exm-theme-table-th-sort-margin-left, 0px);
73
+ --exm-table-td-height: var(--exm-theme-table-td-height, 48px);
74
+ --exm-table-th-sort-icon-height: var(--exm-theme-table-th-sort-icon-height, 1em);
75
+ --exm-table-th-sort-icon-width: var(--exm-theme-table-th-sort-icon-width, 1em);
76
+
77
+ --exm-table-col-number-padding-right: var(--exm-theme-table-col-number-padding-right, 10px);
78
+ --exm-table-checkbox-cell-width: var(--exm-theme-table-checkbox-cell-width, 24px);
79
+
80
+ --exm-paper-combobox-selected-item-color: var(var(--md-sys-color-primary), #000000);
81
+ --exm-paper-combobox-color: var(--md-sys-color-on-surface);
82
+
83
+ /* Adjust toolbar to grid */
84
+ --exm-table-toolbar-setting-position: var(--exm-theme-table-toolbar-setting-position, absolute);
85
+ /* End Adjust toolbar to grid */
86
+ }
87
+
88
+ ::slotted([slot='pagination']) {
89
+ display: flex;
90
+ align-items: center;
91
+ justify-content: flex-end;
92
+ // overflow-x: auto;
93
+ border-top: 1px solid var(--exm-table-row-divider-color);
94
+ }
95
+
96
+ ::slotted([slot='toolbar']) {
97
+ display: block;
98
+ }
99
+
100
+ .table-card-container {
101
+ @include typography.base;
102
+ border: none;
103
+ width: var(--exm-table-card-width);
104
+ margin: 0;
105
+ padding: 0;
106
+ box-shadow: var(--exm-theme-table-box-shadow, none);
107
+ }
108
+ :host([with-toolbar]) {
109
+ .table-card {
110
+ border-top: 1px solid var(--exm-table-row-divider-color);
111
+ }
112
+ }
113
+ .table-card {
114
+ @include typography.base;
115
+ border: none;
116
+ border-bottom-left-radius: 4px;
117
+ border-bottom-right-radius: 4px;
118
+ width: var(--exm-table-card-width);
119
+ background-color: var(--exm-table-card-background-color);
120
+ margin-bottom: var(--exm-table-card-margin-bottom);
121
+ border-top-left-radius: var(--exm-theme-table-radius, var(--exm-surface-border-radius, 16px));
122
+ border-top-right-radius: var(--exm-theme-table-radius, var(--exm-surface-border-radius, 16px));
123
+ border-bottom-left-radius: var(--exm-theme-table-radius, var(--exm-surface-border-radius, 16px));
124
+ border-bottom-right-radius: var(--exm-theme-table-radius, var(--exm-surface-border-radius, 16px));
125
+ }
126
+
127
+ /*.table-container {
128
+ overflow-x: auto;
129
+ }*/
130
+
131
+ table {
132
+ @include table-layout-fixed();
133
+ width: 100%;
134
+ color: var(--exm-table-color);
135
+ border-spacing: 0;
136
+ border: none;
137
+
138
+ thead {
139
+ tr,
140
+ th {
141
+ @include typography.typography('caption');
142
+ }
143
+ }
144
+
145
+ tbody,
146
+ tfoot {
147
+ tr,
148
+ td {
149
+ @include typography.typography('body2');
150
+ }
151
+ }
152
+ }
153
+
154
+ td {
155
+ height: var(--exm-table-td-height);
156
+ }
157
+
158
+ .grid-toolbar th {
159
+ padding: 0;
160
+ text-align: left;
161
+ > * {
162
+ overflow-x: auto;
163
+ }
164
+ }
165
+
166
+ .grid-columns {
167
+ th {
168
+ height: var(--exm-table-th-height);
169
+ font-weight: 500;
170
+ font-style: normal;
171
+ font-stretch: normal;
172
+ text-transform: uppercase;
173
+ line-height: 1.33;
174
+ letter-spacing: 2px;
175
+ color: var(--exm-table-th-color);
176
+ background-color: var(--exm-table-th-background-color);
177
+ vertical-align: middle;
178
+ text-align: left;
179
+
180
+ user-select: none;
181
+ white-space: nowrap;
182
+
183
+ > span {
184
+ vertical-align: middle;
185
+ max-width: 100%;
186
+ display: inline-block;
187
+ overflow: hidden;
188
+ white-space: nowrap;
189
+ text-overflow: ellipsis;
190
+ }
191
+ svg {
192
+ fill: var(--exm-table-th-color);
193
+ }
194
+ }
195
+ }
196
+
197
+ .grid-columns th,
198
+ tbody td {
199
+ padding-left: 16px;
200
+ }
201
+
202
+ .grid-columns th:last-child,
203
+ tbody td:last-child {
204
+ padding-right: 10px;
205
+ }
206
+
207
+ th,
208
+ td {
209
+ border-top: 1px solid var(--exm-table-row-divider-color);
210
+ }
211
+
212
+ tbody {
213
+ td {
214
+ height: var(--exm-table-td-height);
215
+ @include typography.typography('body2');
216
+ font-weight: normal;
217
+ font-style: normal;
218
+ font-stretch: normal;
219
+ line-height: 1.43px;
220
+ letter-spacing: 0.3px;
221
+ color: var(--exm-table-color);
222
+ svg {
223
+ fill: var(--exm-table-color);
224
+ }
225
+ }
226
+ }
227
+
228
+ /**** COLUMN SORT *********/
229
+ th[data-sort] {
230
+ cursor: pointer;
231
+
232
+ &:hover {
233
+ color: var(--exm-table-th-sortable-hover-color);
234
+ }
235
+
236
+ &::after {
237
+ display: inline-block;
238
+ content: '';
239
+ -webkit-mask-image: var(--exm-arrow-upward-url);
240
+ mask-image: var(--exm-arrow-upward-url);
241
+ background-color: currentColor;
242
+ background-size: contain;
243
+ height: var(--exm-table-th-sort-icon-height);
244
+ width: var(--exm-table-th-sort-icon-width);
245
+ margin-left: var(--exm-table-th-sort-margin-left);
246
+ vertical-align: middle;
247
+ opacity: 0;
248
+ }
249
+ }
250
+
251
+ th[data-sort-direction]::after {
252
+ opacity: 1;
253
+ transition: transform 0.1s linear;
254
+ }
255
+
256
+ th[data-sort-direction='ASC']::after {
257
+ transform: rotate(0deg);
258
+ }
259
+
260
+ th[data-sort-direction='DESC']::after {
261
+ transform: rotate(180deg);
262
+ }
263
+ /**** COLUMN SORT END *********/
264
+
265
+ /**** SELECTABLE ROW *********/
266
+ tbody > tr:not(.grid-row-detail):hover {
267
+ color: var(--exm-table-row-hover-color);
268
+ background-color: var(--exm-table-row-hover-background-color);
269
+ td {
270
+ color: var(--exm-table-row-hover-color);
271
+ }
272
+ svg {
273
+ fill: var(--exm-table-row-hover-color);
274
+ }
275
+ }
276
+
277
+ tr[data-selected] {
278
+ color: var(--exm-table-row-selected-color);
279
+ background-color: var(--exm-table-row-selected-background-color);
280
+ td {
281
+ color: var(--exm-table-row-selected-color);
282
+ }
283
+ svg {
284
+ fill: var(--exm-table-row-selected-color);
285
+ }
286
+ }
287
+ /**** END SELECTABLE ROW *********/
288
+
289
+ /**** EXPANDABLE ROW *********/
290
+ tbody {
291
+ tr[data-has-expanded-detail],
292
+ tr[data-has-expanded-detail]:hover,
293
+ tr[data-is-row-expanded] {
294
+ background-color: var(--exm-table-rows-expanded-background-color);
295
+ border: var(--exm-table-rows-expanded-border);
296
+
297
+ td {
298
+ color: var(--exm-table-rows-expanded-color);
299
+ svg {
300
+ fill: var(--exm-table-rows-expanded-color);
301
+ }
302
+ }
303
+ }
304
+
305
+ tr[data-is-row-expanded] td {
306
+ border-bottom: none;
307
+ }
308
+
309
+ tr[data-has-expanded-detail] td,
310
+ tr[data-has-expanded-detail]:hover td {
311
+ border-bottom: var(--exm-table-rows-expanded-divider-border);
312
+ }
313
+ }
314
+
315
+ tr.grid-row-detail {
316
+ display: none;
317
+
318
+ &[data-is-row-expanded] {
319
+ display: table-row;
320
+ }
321
+
322
+ td {
323
+ padding: 20px;
324
+ }
325
+ }
326
+
327
+ tr .grid-icon-rotate[data-is-expanded] > * {
328
+ transition: transform 0.1s linear;
329
+ transform: rotate(180deg);
330
+ }
331
+
332
+ tr .grid-icon-rotate[data-is-expandable]:not([data-is-expanded]) > * {
333
+ transition: transform 0.1s linear;
334
+ transform: rotate(0deg);
335
+ }
336
+ /**** END EXPANDABLE ROW *********/
337
+
338
+ /**** START SORTABLE ROW *********/
339
+ .grid-row-drag-handler {
340
+ cursor: move;
341
+ vertical-align: middle;
342
+ > * {
343
+ vertical-align: middle;
344
+ }
345
+ }
346
+ tr {
347
+ &.dragged {
348
+ background-color: var(--exm-table-row-dragged-background-color);
349
+ opacity: 0.25;
350
+ box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.5) inset;
351
+ }
352
+
353
+ &.cloned {
354
+ background-color: var(--exm-table-row-dragged-background-color);
355
+ width: 100%;
356
+ box-sizing: border-box;
357
+ box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.5);
358
+ opacity: 0.9;
359
+ }
360
+ }
361
+ /**** END EXPANDABLE ROW *********/
362
+
363
+ /***** GRID UTILS ***/
364
+ tr td.grid-cell-visible-on-hover {
365
+ text-align: center;
366
+ }
367
+
368
+ tr td.grid-cell-visible-on-hover > * {
369
+ visibility: hidden;
370
+ }
371
+
372
+ tr:hover td.grid-cell-visible-on-hover > *,
373
+ tr[data-has-expanded-detail] td.grid-cell-visible-on-hover > * {
374
+ visibility: visible;
375
+ }
376
+
377
+ tr td.grid-col-number,
378
+ tr th.grid-col-number {
379
+ padding-right: var(--exm-table-col-number-padding-right);
380
+ text-align: right;
381
+ }
382
+
383
+ tr th.grid-col-number {
384
+ > span {
385
+ width: 100%;
386
+ }
387
+ }
@@ -0,0 +1,23 @@
1
+ import { ExmgElement } from '@exmg/lit-base/index.js';
2
+ /**
3
+ * ### Styling
4
+ * The following custom properties are available for styling:
5
+ *
6
+ */
7
+ export declare class ExmgGridBaseToolbar extends ExmgElement {
8
+ static styles: import("lit").CSSResult[];
9
+ private actionsCount;
10
+ private settingsCount;
11
+ private active;
12
+ disableSeperator: boolean;
13
+ private observer?;
14
+ private getChildElementCount;
15
+ connectedCallback(): void;
16
+ disconnectedCallback(): void;
17
+ render(): import("lit-html").TemplateResult<1>;
18
+ }
19
+ declare global {
20
+ interface HTMLElementTagNameMap {
21
+ 'exm-grid-base-toolbar': ExmgGridBaseToolbar;
22
+ }
23
+ }
@@ -0,0 +1,91 @@
1
+ import { __decorate } from "tslib";
2
+ import { html } from 'lit';
3
+ import { customElement, property, state } from 'lit/decorators.js';
4
+ import { ExmgElement } from '@exmg/lit-base/index.js';
5
+ import { style } from '../styles/exm-grid-base-toolbar-styles-css.js';
6
+ /**
7
+ * ### Styling
8
+ * The following custom properties are available for styling:
9
+ *
10
+ */
11
+ let ExmgGridBaseToolbar = class ExmgGridBaseToolbar extends ExmgElement {
12
+ constructor() {
13
+ super(...arguments);
14
+ this.actionsCount = 0;
15
+ this.settingsCount = 0;
16
+ this.active = false;
17
+ this.disableSeperator = false;
18
+ }
19
+ getChildElementCount(selector) {
20
+ const element = this.querySelector(selector);
21
+ return element ? element.childElementCount : 0;
22
+ }
23
+ connectedCallback() {
24
+ super.connectedCallback();
25
+ this.observer = new MutationObserver((mutationsList) => {
26
+ setTimeout(() => {
27
+ for (const mutation of mutationsList) {
28
+ if (mutation.type === 'childList') {
29
+ this.actionsCount = this.getChildElementCount('div[slot=actions]');
30
+ this.settingsCount = this.getChildElementCount('div[slot=settings]');
31
+ this.active = this.actionsCount > 0;
32
+ }
33
+ }
34
+ }, 60);
35
+ });
36
+ this.actionsCount = this.getChildElementCount('div[slot=actions]');
37
+ this.settingsCount = this.getChildElementCount('div[slot=settings]');
38
+ this.active = this.actionsCount > 0;
39
+ this.observer.observe(this, { attributes: false, childList: true, subtree: true });
40
+ }
41
+ disconnectedCallback() {
42
+ this.observer.disconnect();
43
+ super.disconnectedCallback();
44
+ }
45
+ render() {
46
+ return html `
47
+ <div class="wrapper ${this.active ? 'active' : ''}">
48
+ ${this.actionsCount > 0
49
+ ? html `
50
+ <div class="actions">
51
+ <slot name="actions"></slot>
52
+ </div>
53
+ `
54
+ : ''}
55
+ <div class="seperator ${this.actionsCount > 0 && !this.disableSeperator ? 'with-action-separator' : ''}">
56
+ &nbsp;
57
+ </div>
58
+ <div class="description">
59
+ <slot name="description"></slot>
60
+ </div>
61
+ <div class="filters">
62
+ <slot name="filters"></slot>
63
+ </div>
64
+ <div class="settings ${this.settingsCount > 0 ? 'has-settings' : ''}">
65
+ <slot name="settings"></slot>
66
+ </div>
67
+ <div class="extra">
68
+ <slot name="extra"></slot>
69
+ </div>
70
+ </div>
71
+ `;
72
+ }
73
+ };
74
+ ExmgGridBaseToolbar.styles = [style];
75
+ __decorate([
76
+ state()
77
+ ], ExmgGridBaseToolbar.prototype, "actionsCount", void 0);
78
+ __decorate([
79
+ state()
80
+ ], ExmgGridBaseToolbar.prototype, "settingsCount", void 0);
81
+ __decorate([
82
+ state()
83
+ ], ExmgGridBaseToolbar.prototype, "active", void 0);
84
+ __decorate([
85
+ property({ type: Boolean })
86
+ ], ExmgGridBaseToolbar.prototype, "disableSeperator", void 0);
87
+ ExmgGridBaseToolbar = __decorate([
88
+ customElement('exm-grid-base-toolbar')
89
+ ], ExmgGridBaseToolbar);
90
+ export { ExmgGridBaseToolbar };
91
+ //# sourceMappingURL=exm-grid-base-toolbar.js.map
@@ -0,0 +1,37 @@
1
+ import { ExmgElement } from '@exmg/lit-base/index.js';
2
+ import '@material/web/iconbutton/icon-button.js';
3
+ import '@material/web/icon/icon.js';
4
+ import './exm-grid-toolbar-filters.js';
5
+ /**
6
+ * ### Styling
7
+ * The following custom properties are available for styling:
8
+ *
9
+ * Custom property | Description | Default
10
+ * ----------------|-------------|----------
11
+ * `--exm-theme-table-pagination-bg-color` | pagination background color | `var(--mdc-theme-surface, #ffffff);`
12
+ * `--exm-theme-table-pagination-color` | pagination foreground (mostly text) color | `var(--mdc-theme-on-surface, #02182b);`
13
+ */
14
+ export declare class ExmgGridPagination extends ExmgElement {
15
+ static styles: import("lit").CSSResult[];
16
+ pageSizeLabel: string;
17
+ pageSizeOptions: number[];
18
+ pageSize: number;
19
+ pageIndex: number;
20
+ itemCount: number;
21
+ private renderPageSizeLabel;
22
+ private renderPageSizeOptions;
23
+ private renderPageRangeLabel;
24
+ private renderPageRangeActions;
25
+ private renderPrevPage;
26
+ private renderNextPage;
27
+ private fireEventPageChanged;
28
+ private handleOnClickPrev;
29
+ private handleOnClickNext;
30
+ private handleOnPageSizeChanged;
31
+ protected render(): import("lit-html").TemplateResult<1>;
32
+ }
33
+ declare global {
34
+ interface HTMLElementTagNameMap {
35
+ 'exm-grid-pagination': ExmgGridPagination;
36
+ }
37
+ }