@aquera/nile-elements 0.1.57 → 0.1.58-beta-1.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.
- package/README.md +5 -3
- package/demo/index.html +10 -26
- package/demo/index.js +83 -0
- package/dist/index.cjs.js +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.js +276 -281
- package/dist/internal/resizable-table-helper.cjs.js +2 -0
- package/dist/internal/resizable-table-helper.cjs.js.map +1 -0
- package/dist/internal/resizable-table-helper.esm.js +1 -0
- package/dist/internal/resizable-table-styles.cjs.js +2 -0
- package/dist/internal/resizable-table-styles.cjs.js.map +1 -0
- package/dist/internal/resizable-table-styles.esm.js +120 -0
- package/dist/nile-table-body/index.cjs.js +1 -1
- package/dist/nile-table-body/index.esm.js +1 -1
- package/dist/nile-table-body/nile-table-body.cjs.js +1 -1
- package/dist/nile-table-body/nile-table-body.cjs.js.map +1 -1
- package/dist/nile-table-body/nile-table-body.css.cjs.js +1 -1
- package/dist/nile-table-body/nile-table-body.css.cjs.js.map +1 -1
- package/dist/nile-table-body/nile-table-body.css.esm.js +5 -2
- package/dist/nile-table-body/nile-table-body.esm.js +3 -2
- package/dist/nile-table-cell-item/index.cjs.js +1 -1
- package/dist/nile-table-cell-item/index.esm.js +1 -1
- package/dist/nile-table-cell-item/nile-table-cell-item.cjs.js +1 -1
- package/dist/nile-table-cell-item/nile-table-cell-item.cjs.js.map +1 -1
- package/dist/nile-table-cell-item/nile-table-cell-item.css.cjs.js +1 -1
- package/dist/nile-table-cell-item/nile-table-cell-item.css.cjs.js.map +1 -1
- package/dist/nile-table-cell-item/nile-table-cell-item.css.esm.js +21 -3
- package/dist/nile-table-cell-item/nile-table-cell-item.esm.js +8 -3
- package/dist/nile-table-header-item/index.cjs.js +1 -1
- package/dist/nile-table-header-item/index.esm.js +1 -1
- package/dist/nile-table-header-item/nile-table-header-item.cjs.js +1 -1
- package/dist/nile-table-header-item/nile-table-header-item.cjs.js.map +1 -1
- package/dist/nile-table-header-item/nile-table-header-item.css.cjs.js +1 -1
- package/dist/nile-table-header-item/nile-table-header-item.css.cjs.js.map +1 -1
- package/dist/nile-table-header-item/nile-table-header-item.css.esm.js +8 -2
- package/dist/nile-table-header-item/nile-table-header-item.esm.js +64 -32
- package/dist/src/index.d.ts +0 -1
- package/dist/src/index.js +0 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/internal/resizable-table-helper.d.ts +59 -0
- package/dist/src/internal/resizable-table-helper.js +111 -0
- package/dist/src/internal/resizable-table-helper.js.map +1 -0
- package/dist/src/internal/resizable-table-styles.d.ts +16 -0
- package/dist/src/internal/resizable-table-styles.js +137 -0
- package/dist/src/internal/resizable-table-styles.js.map +1 -0
- package/dist/src/nile-table-body/nile-table-body.css.js +4 -0
- package/dist/src/nile-table-body/nile-table-body.css.js.map +1 -1
- package/dist/src/nile-table-body/nile-table-body.d.ts +2 -0
- package/dist/src/nile-table-body/nile-table-body.js +11 -0
- package/dist/src/nile-table-body/nile-table-body.js.map +1 -1
- package/dist/src/nile-table-cell-item/nile-table-cell-item.css.js +20 -1
- package/dist/src/nile-table-cell-item/nile-table-cell-item.css.js.map +1 -1
- package/dist/src/nile-table-cell-item/nile-table-cell-item.d.ts +3 -0
- package/dist/src/nile-table-cell-item/nile-table-cell-item.js +27 -8
- package/dist/src/nile-table-cell-item/nile-table-cell-item.js.map +1 -1
- package/dist/src/nile-table-header-item/nile-table-header-item.css.js +7 -0
- package/dist/src/nile-table-header-item/nile-table-header-item.css.js.map +1 -1
- package/dist/src/nile-table-header-item/nile-table-header-item.d.ts +3 -0
- package/dist/src/nile-table-header-item/nile-table-header-item.js +86 -35
- package/dist/src/nile-table-header-item/nile-table-header-item.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/src/index.ts +1 -2
- package/src/internal/resizable-table-helper.ts +151 -0
- package/src/internal/resizable-table-styles.ts +144 -0
- package/src/nile-table-body/nile-table-body.css.ts +4 -0
- package/src/nile-table-body/nile-table-body.ts +10 -0
- package/src/nile-table-cell-item/nile-table-cell-item.css.ts +20 -1
- package/src/nile-table-cell-item/nile-table-cell-item.ts +22 -5
- package/src/nile-table-header-item/nile-table-header-item.css.ts +7 -0
- package/src/nile-table-header-item/nile-table-header-item.ts +94 -45
- package/vscode-html-custom-data.json +59 -138
- package/dist/nile-slider/index.cjs.js +0 -2
- package/dist/nile-slider/index.cjs.js.map +0 -1
- package/dist/nile-slider/index.esm.js +0 -1
- package/dist/nile-slider/nile-slider.cjs.js +0 -2
- package/dist/nile-slider/nile-slider.cjs.js.map +0 -1
- package/dist/nile-slider/nile-slider.css.cjs.js +0 -2
- package/dist/nile-slider/nile-slider.css.cjs.js.map +0 -1
- package/dist/nile-slider/nile-slider.css.esm.js +0 -106
- package/dist/nile-slider/nile-slider.esm.js +0 -27
- package/dist/nile-slider/nile-slider.template.cjs.js +0 -2
- package/dist/nile-slider/nile-slider.template.cjs.js.map +0 -1
- package/dist/nile-slider/nile-slider.template.esm.js +0 -59
- package/dist/nile-slider/types/nile-slider.enums.cjs.js +0 -2
- package/dist/nile-slider/types/nile-slider.enums.cjs.js.map +0 -1
- package/dist/nile-slider/types/nile-slider.enums.esm.js +0 -1
- package/dist/nile-slider/types/nile-slider.types.cjs.js +0 -2
- package/dist/nile-slider/types/nile-slider.types.cjs.js.map +0 -1
- package/dist/nile-slider/types/nile-slider.types.esm.js +0 -1
- package/dist/nile-slider/utils/nile-slider.utils.cjs.js +0 -2
- package/dist/nile-slider/utils/nile-slider.utils.cjs.js.map +0 -1
- package/dist/nile-slider/utils/nile-slider.utils.esm.js +0 -1
- package/dist/src/nile-slider/index.d.ts +0 -1
- package/dist/src/nile-slider/index.js +0 -2
- package/dist/src/nile-slider/index.js.map +0 -1
- package/dist/src/nile-slider/nile-slider.css.d.ts +0 -6
- package/dist/src/nile-slider/nile-slider.css.js +0 -118
- package/dist/src/nile-slider/nile-slider.css.js.map +0 -1
- package/dist/src/nile-slider/nile-slider.d.ts +0 -48
- package/dist/src/nile-slider/nile-slider.js +0 -217
- package/dist/src/nile-slider/nile-slider.js.map +0 -1
- package/dist/src/nile-slider/nile-slider.template.d.ts +0 -5
- package/dist/src/nile-slider/nile-slider.template.js +0 -73
- package/dist/src/nile-slider/nile-slider.template.js.map +0 -1
- package/dist/src/nile-slider/types/nile-slider.enums.d.ts +0 -10
- package/dist/src/nile-slider/types/nile-slider.enums.js +0 -2
- package/dist/src/nile-slider/types/nile-slider.enums.js.map +0 -1
- package/dist/src/nile-slider/types/nile-slider.types.d.ts +0 -1
- package/dist/src/nile-slider/types/nile-slider.types.js +0 -2
- package/dist/src/nile-slider/types/nile-slider.types.js.map +0 -1
- package/dist/src/nile-slider/utils/nile-slider.utils.d.ts +0 -11
- package/dist/src/nile-slider/utils/nile-slider.utils.js +0 -99
- package/dist/src/nile-slider/utils/nile-slider.utils.js.map +0 -1
- package/src/nile-slider/index.ts +0 -1
- package/src/nile-slider/nile-slider.css.ts +0 -119
- package/src/nile-slider/nile-slider.template.ts +0 -77
- package/src/nile-slider/nile-slider.ts +0 -215
- package/src/nile-slider/types/nile-slider.enums.ts +0 -10
- package/src/nile-slider/types/nile-slider.types.ts +0 -13
- package/src/nile-slider/utils/nile-slider.utils.ts +0 -136
package/package.json
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
"description": "Webcomponent nile-elements following open-wc recommendations",
|
4
4
|
"license": "MIT",
|
5
5
|
"author": "nile-elements",
|
6
|
-
"version": "0.1.
|
6
|
+
"version": "0.1.58-beta-1.0",
|
7
7
|
"main": "dist/src/index.js",
|
8
8
|
"type": "module",
|
9
9
|
"module": "dist/src/index.js",
|
@@ -86,8 +86,7 @@
|
|
86
86
|
"./nile-inline-edit": "./dist/src/nile-inline-edit/index.js",
|
87
87
|
"./nile-tour": "./dist/src/nile-tour/index.js",
|
88
88
|
"./nile-table": "./dist/src/nile-table/index.js",
|
89
|
-
"./nile-pagination": "./dist/src/nile-pagination/index.js"
|
90
|
-
"./nile-slider": "./dist/src/nile-slider/index.js"
|
89
|
+
"./nile-pagination": "./dist/src/nile-pagination/index.js"
|
91
90
|
},
|
92
91
|
"scripts": {
|
93
92
|
"analyze": "cem analyze --litelement",
|
@@ -191,4 +190,5 @@
|
|
191
190
|
"prettier --write"
|
192
191
|
]
|
193
192
|
}
|
194
|
-
}
|
193
|
+
}
|
194
|
+
|
package/src/index.ts
CHANGED
@@ -77,5 +77,4 @@ export { NileToolbar } from './nile-toolbar';
|
|
77
77
|
export { NileInlineEdit } from './nile-inline-edit';
|
78
78
|
export { NileTable } from './nile-table';
|
79
79
|
export { NileFilterChip } from './nile-filter-chip';
|
80
|
-
export {NilePagination } from './nile-pagination';
|
81
|
-
export { NileSlider } from './nile-slider';
|
80
|
+
export {NilePagination } from './nile-pagination';
|
@@ -0,0 +1,151 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright Aquera Inc 2025
|
3
|
+
*
|
4
|
+
* This source code is licensed under the BSD-3-Clause license found in the
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
6
|
+
*/
|
7
|
+
|
8
|
+
/**
|
9
|
+
* Resizable Helper Utility
|
10
|
+
* Provides common functionality for resizable table columns
|
11
|
+
*/
|
12
|
+
|
13
|
+
export interface ResizeOptions {
|
14
|
+
minWidth?: number;
|
15
|
+
startX: number;
|
16
|
+
startWidth: number;
|
17
|
+
element: HTMLElement;
|
18
|
+
}
|
19
|
+
|
20
|
+
export interface ColumnResizeData {
|
21
|
+
columnIndex: number;
|
22
|
+
newWidth: number;
|
23
|
+
}
|
24
|
+
|
25
|
+
/**
|
26
|
+
* Handles the start of a resize operation
|
27
|
+
* @param e Mouse event
|
28
|
+
* @param options Resize configuration options
|
29
|
+
* @returns Cleanup function to remove event listeners
|
30
|
+
*/
|
31
|
+
export function handleResizeStart(e: MouseEvent, options: ResizeOptions): () => void {
|
32
|
+
e.preventDefault();
|
33
|
+
e.stopPropagation();
|
34
|
+
|
35
|
+
const { minWidth = 50, startX, startWidth, element } = options;
|
36
|
+
const resizer = e.target as HTMLElement;
|
37
|
+
|
38
|
+
resizer.classList.add('resizing');
|
39
|
+
|
40
|
+
const onMouseMove = (e: MouseEvent) => {
|
41
|
+
e.preventDefault();
|
42
|
+
e.stopPropagation();
|
43
|
+
|
44
|
+
const delta = e.pageX - startX;
|
45
|
+
const newWidth = Math.max(minWidth, startWidth + delta);
|
46
|
+
|
47
|
+
element.style.width = newWidth + 'px';
|
48
|
+
|
49
|
+
synchronizeColumnWidth(element, newWidth);
|
50
|
+
};
|
51
|
+
|
52
|
+
const onMouseUp = () => {
|
53
|
+
resizer.classList.remove('resizing');
|
54
|
+
document.removeEventListener('mousemove', onMouseMove);
|
55
|
+
document.removeEventListener('mouseup', onMouseUp);
|
56
|
+
};
|
57
|
+
|
58
|
+
document.addEventListener('mousemove', onMouseMove);
|
59
|
+
document.addEventListener('mouseup', onMouseUp);
|
60
|
+
|
61
|
+
return () => {
|
62
|
+
document.removeEventListener('mousemove', onMouseMove);
|
63
|
+
document.removeEventListener('mouseup', onMouseUp);
|
64
|
+
};
|
65
|
+
}
|
66
|
+
|
67
|
+
/**
|
68
|
+
* Gets the column index of an element within its table row
|
69
|
+
* @param element The table cell or header element
|
70
|
+
* @param selector The CSS selector for the column elements
|
71
|
+
* @returns Column index (0-based)
|
72
|
+
*/
|
73
|
+
export function getColumnIndex(element: HTMLElement, selector: string): number {
|
74
|
+
const tableRow = element.closest('nile-table-row');
|
75
|
+
if (tableRow) {
|
76
|
+
const columns = tableRow.querySelectorAll(selector);
|
77
|
+
return Array.from(columns).indexOf(element);
|
78
|
+
}
|
79
|
+
return 0;
|
80
|
+
}
|
81
|
+
|
82
|
+
/**
|
83
|
+
* Synchronizes the width of all cells in the same column
|
84
|
+
* @param sourceElement The element that was resized
|
85
|
+
* @param newWidth The new width to apply
|
86
|
+
*/
|
87
|
+
export function synchronizeColumnWidth(sourceElement: HTMLElement, newWidth: number): void {
|
88
|
+
const tableBody = sourceElement.closest('nile-table-body');
|
89
|
+
if (!tableBody) return;
|
90
|
+
|
91
|
+
const isHeader = sourceElement.tagName.toLowerCase() === 'nile-table-header-item';
|
92
|
+
const selector = isHeader ? 'nile-table-header-item' : 'nile-table-cell-item';
|
93
|
+
const targetSelector = isHeader ? 'nile-table-cell-item' : 'nile-table-cell-item';
|
94
|
+
|
95
|
+
const columnIndex = getColumnIndex(sourceElement, selector);
|
96
|
+
const rows = tableBody.querySelectorAll('nile-table-row');
|
97
|
+
|
98
|
+
rows.forEach(row => {
|
99
|
+
const cells = row.querySelectorAll(targetSelector);
|
100
|
+
if (cells[columnIndex]) {
|
101
|
+
cells[columnIndex].style.width = newWidth + 'px';
|
102
|
+
}
|
103
|
+
});
|
104
|
+
}
|
105
|
+
|
106
|
+
/**
|
107
|
+
* Checks if an element has the resizable attribute
|
108
|
+
* @param element The element to check
|
109
|
+
* @returns True if the element is resizable
|
110
|
+
*/
|
111
|
+
export function isResizable(element: HTMLElement): boolean {
|
112
|
+
return element.hasAttribute('resizable');
|
113
|
+
}
|
114
|
+
|
115
|
+
/**
|
116
|
+
* Creates a resize handler function for use in component event listeners
|
117
|
+
* @param element The element to make resizable
|
118
|
+
* @param minWidth Minimum width constraint
|
119
|
+
* @returns Event handler function
|
120
|
+
*/
|
121
|
+
export function createResizeHandler(element: HTMLElement, minWidth: number = 50): (e: MouseEvent) => void {
|
122
|
+
return (e: MouseEvent) => {
|
123
|
+
const options: ResizeOptions = {
|
124
|
+
minWidth,
|
125
|
+
startX: e.pageX,
|
126
|
+
startWidth: element.offsetWidth,
|
127
|
+
element
|
128
|
+
};
|
129
|
+
|
130
|
+
handleResizeStart(e, options);
|
131
|
+
};
|
132
|
+
}
|
133
|
+
|
134
|
+
/**
|
135
|
+
* Detects if any columns in a table are resizable
|
136
|
+
* @param tableBody The table body element
|
137
|
+
* @returns True if any columns have resizable attribute
|
138
|
+
*/
|
139
|
+
export function hasResizableColumns(tableBody: HTMLElement): boolean {
|
140
|
+
const headerItems = tableBody.querySelectorAll('nile-table-header-item');
|
141
|
+
const cellItems = tableBody.querySelectorAll('nile-table-cell-item');
|
142
|
+
|
143
|
+
const hasResizableHeaders = Array.from(headerItems).some(item =>
|
144
|
+
isResizable(item)
|
145
|
+
);
|
146
|
+
const hasResizableCells = Array.from(cellItems).some(item =>
|
147
|
+
isResizable(item)
|
148
|
+
);
|
149
|
+
|
150
|
+
return hasResizableHeaders || hasResizableCells;
|
151
|
+
}
|
@@ -0,0 +1,144 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright Aquera Inc 2023
|
3
|
+
*
|
4
|
+
* This source code is licensed under the BSD-3-Clause license found in the
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
6
|
+
*/
|
7
|
+
|
8
|
+
import { css } from 'lit';
|
9
|
+
|
10
|
+
/**
|
11
|
+
* Resizable Styles Utility
|
12
|
+
* Centralized styles for resizable table functionality
|
13
|
+
*/
|
14
|
+
|
15
|
+
export const resizableHostStyles = css`
|
16
|
+
:host([resizable]) {
|
17
|
+
position: relative;
|
18
|
+
overflow: hidden;
|
19
|
+
table-layout: fixed;
|
20
|
+
}
|
21
|
+
`;
|
22
|
+
|
23
|
+
export const resizableHeaderStyles = css`
|
24
|
+
:host([resizable]) {
|
25
|
+
position: relative;
|
26
|
+
}
|
27
|
+
|
28
|
+
:host([resizable]) .header__item__wrapper {
|
29
|
+
border-right: 1px solid var(--nile-colors-neutral-400);
|
30
|
+
position: relative;
|
31
|
+
}
|
32
|
+
`;
|
33
|
+
|
34
|
+
export const resizerStyles = css`
|
35
|
+
.resizer {
|
36
|
+
position: absolute;
|
37
|
+
right: 0;
|
38
|
+
top: -1000px;
|
39
|
+
bottom: -1000px;
|
40
|
+
width: 8px;
|
41
|
+
cursor: col-resize;
|
42
|
+
user-select: none;
|
43
|
+
background-color: var(--nile-colors-neutral-100);
|
44
|
+
transition: background-color 0.2s;
|
45
|
+
z-index: 10;
|
46
|
+
opacity: 0;
|
47
|
+
transition: opacity 0.2s ease;
|
48
|
+
pointer-events: none;
|
49
|
+
}
|
50
|
+
|
51
|
+
:host([resizable]):hover .resizer {
|
52
|
+
opacity: 1;
|
53
|
+
pointer-events: auto;
|
54
|
+
}
|
55
|
+
|
56
|
+
.resizer::before {
|
57
|
+
content: '';
|
58
|
+
position: absolute;
|
59
|
+
right: 3px;
|
60
|
+
top: 0;
|
61
|
+
width: 2px;
|
62
|
+
height: 100%;
|
63
|
+
background-color: var(--nile-colors-neutral-500);
|
64
|
+
opacity: 0.8;
|
65
|
+
}
|
66
|
+
|
67
|
+
.resizer:hover {
|
68
|
+
background-color: var(--nile-colors-neutral-400);
|
69
|
+
}
|
70
|
+
|
71
|
+
.resizer:hover::before {
|
72
|
+
background-color: var(--nile-colors-neutral-700);
|
73
|
+
opacity: 1;
|
74
|
+
}
|
75
|
+
|
76
|
+
.resizer.resizing {
|
77
|
+
background-color: var(--nile-colors-neutral-400);
|
78
|
+
opacity: 1;
|
79
|
+
pointer-events: auto;
|
80
|
+
}
|
81
|
+
|
82
|
+
.resizer.resizing::before {
|
83
|
+
background-color: var(--nile-colors-neutral-700);
|
84
|
+
opacity: 1;
|
85
|
+
width: 3px;
|
86
|
+
}
|
87
|
+
`;
|
88
|
+
|
89
|
+
export const headerResizerStyles = css`
|
90
|
+
.resizer {
|
91
|
+
position: absolute;
|
92
|
+
right: -2px;
|
93
|
+
top: -1000px;
|
94
|
+
bottom: -1000px;
|
95
|
+
width: 8px;
|
96
|
+
cursor: ew-resize;
|
97
|
+
user-select: none;
|
98
|
+
transition: background-color 0.2s;
|
99
|
+
z-index: 10;
|
100
|
+
opacity: 0;
|
101
|
+
transition: opacity 0.2s ease;
|
102
|
+
}
|
103
|
+
|
104
|
+
:host([resizable]):hover .resizer {
|
105
|
+
opacity: 1;
|
106
|
+
}
|
107
|
+
|
108
|
+
.resizer::before {
|
109
|
+
content: '';
|
110
|
+
position: absolute;
|
111
|
+
height: 100%;
|
112
|
+
opacity: 0.8;
|
113
|
+
}
|
114
|
+
|
115
|
+
.resizer.resizing {
|
116
|
+
border-right: 4px double var(--nile-colors-neutral-400);
|
117
|
+
background-color: transparent;
|
118
|
+
opacity: 1;
|
119
|
+
}
|
120
|
+
`;
|
121
|
+
|
122
|
+
export const resizableSlotStyles = css`
|
123
|
+
:host([resizable]) ::slotted(*) {
|
124
|
+
overflow: hidden;
|
125
|
+
text-overflow: ellipsis;
|
126
|
+
white-space: nowrap;
|
127
|
+
display: block;
|
128
|
+
}
|
129
|
+
|
130
|
+
:host([resizable]) ::slotted(span),
|
131
|
+
:host([resizable]) ::slotted(div),
|
132
|
+
:host([resizable]) ::slotted(p) {
|
133
|
+
overflow: hidden;
|
134
|
+
text-overflow: ellipsis;
|
135
|
+
white-space: nowrap;
|
136
|
+
display: block;
|
137
|
+
}
|
138
|
+
`;
|
139
|
+
|
140
|
+
export const tableLayoutStyles = css`
|
141
|
+
.nile__table__body[resizable] {
|
142
|
+
table-layout: fixed;
|
143
|
+
}
|
144
|
+
`;
|
@@ -6,6 +6,7 @@
|
|
6
6
|
*/
|
7
7
|
|
8
8
|
import { css } from 'lit';
|
9
|
+
import { tableLayoutStyles } from '../internal/resizable-table-styles';
|
9
10
|
|
10
11
|
/**
|
11
12
|
* TableBody CSS
|
@@ -48,6 +49,9 @@ export const styles = css`
|
|
48
49
|
slot::slotted(nile-table-row:last-child) {
|
49
50
|
border-bottom: 0px;
|
50
51
|
}
|
52
|
+
|
53
|
+
/* Import resizable styles */
|
54
|
+
${tableLayoutStyles}
|
51
55
|
`;
|
52
56
|
|
53
57
|
export default [styles];
|
@@ -24,6 +24,7 @@ import {
|
|
24
24
|
import { styles } from './nile-table-body.css';
|
25
25
|
import NileElement from '../internal/nile-element';
|
26
26
|
import { getInnerHTML } from '../slot';
|
27
|
+
import { hasResizableColumns } from '../internal/resizable-table-helper';
|
27
28
|
|
28
29
|
/**
|
29
30
|
* nile-table-body component.
|
@@ -46,6 +47,7 @@ export class NileTableBody extends NileElement {
|
|
46
47
|
@state() private header_rows_data: any[] = [];
|
47
48
|
@state() private sort__index: number;
|
48
49
|
@state() private search__index: number;
|
50
|
+
@state() private hasResizableColumns = false;
|
49
51
|
|
50
52
|
public static get styles(): CSSResultArray {
|
51
53
|
return [styles];
|
@@ -67,6 +69,10 @@ export class NileTableBody extends NileElement {
|
|
67
69
|
return this.header_rows_data.indexOf(index__value);
|
68
70
|
}
|
69
71
|
|
72
|
+
private checkForResizableColumns() {
|
73
|
+
this.hasResizableColumns = hasResizableColumns(this);
|
74
|
+
}
|
75
|
+
|
70
76
|
handleSlotchange(e: any) {
|
71
77
|
let row_data: any = [];
|
72
78
|
this._childNodes.forEach((child: any) => {
|
@@ -88,6 +94,9 @@ export class NileTableBody extends NileElement {
|
|
88
94
|
row_data = [];
|
89
95
|
}
|
90
96
|
});
|
97
|
+
|
98
|
+
// Check for resizable columns after slot change
|
99
|
+
this.checkForResizableColumns();
|
91
100
|
}
|
92
101
|
|
93
102
|
private handleSort(e: any) {
|
@@ -115,6 +124,7 @@ export class NileTableBody extends NileElement {
|
|
115
124
|
@slotchange=${this.handleSlotchange}
|
116
125
|
@nile-click-sort=${this.handleSort}
|
117
126
|
class="nile__table__body"
|
127
|
+
?resizable=${this.hasResizableColumns}
|
118
128
|
@nile-search=${this.handleSearch}
|
119
129
|
></slot>
|
120
130
|
</div>
|
@@ -6,6 +6,7 @@
|
|
6
6
|
*/
|
7
7
|
|
8
8
|
import { css } from 'lit';
|
9
|
+
import { resizableHostStyles, resizerStyles, resizableSlotStyles } from '../internal/resizable-table-styles';
|
9
10
|
|
10
11
|
/**
|
11
12
|
* TableCellItem CSS
|
@@ -19,11 +20,20 @@ export const styles = css`
|
|
19
20
|
box-sizing: border-box;
|
20
21
|
display: table-cell;
|
21
22
|
vertical-align: middle;
|
22
|
-
max-width: var(--max--cell-width);
|
23
23
|
padding: 16px 24px;
|
24
|
+
max-width: var(--max--cell-width);
|
24
25
|
min-height: var(--min--height);
|
25
26
|
}
|
26
27
|
|
28
|
+
.cell__wrapper {
|
29
|
+
height: 100%;
|
30
|
+
position: relative;
|
31
|
+
display: flex;
|
32
|
+
align-items: center;
|
33
|
+
overflow: hidden;
|
34
|
+
width: 100%;
|
35
|
+
}
|
36
|
+
|
27
37
|
.column {
|
28
38
|
min-width:var(--min-cell-width);
|
29
39
|
width:var(--cell-width);
|
@@ -36,7 +46,16 @@ export const styles = css`
|
|
36
46
|
/* line-height: var(--nile-type-scale-6); */
|
37
47
|
line-height: normal;
|
38
48
|
letter-spacing: 0.2px;
|
49
|
+
overflow: hidden;
|
50
|
+
text-overflow: ellipsis;
|
51
|
+
white-space: nowrap;
|
52
|
+
display: block;
|
39
53
|
}
|
54
|
+
|
55
|
+
/* Import resizable styles */
|
56
|
+
${resizableHostStyles}
|
57
|
+
${resizerStyles}
|
58
|
+
${resizableSlotStyles}
|
40
59
|
`;
|
41
60
|
|
42
61
|
export default [styles];
|
@@ -15,6 +15,7 @@ import { customElement, property } from 'lit/decorators.js';
|
|
15
15
|
import { styles } from './nile-table-cell-item.css';
|
16
16
|
import NileElement from '../internal/nile-element';
|
17
17
|
import { HasSlotController } from '../internal/slot';
|
18
|
+
import { createResizeHandler } from '../internal/resizable-table-helper';
|
18
19
|
|
19
20
|
/**
|
20
21
|
* Nile table Cell Item component.
|
@@ -33,20 +34,36 @@ export class NileTableCellItem extends NileElement {
|
|
33
34
|
return [styles];
|
34
35
|
}
|
35
36
|
|
37
|
+
/** Enables the resize functionality. */
|
38
|
+
@property({ type: Boolean, reflect: true }) resizable = false;
|
39
|
+
|
36
40
|
/* #endregion */
|
37
41
|
|
38
42
|
/* #region Methods */
|
39
43
|
|
44
|
+
private handleResizeStart = createResizeHandler(this, 50);
|
45
|
+
|
40
46
|
/**
|
41
47
|
* Render method
|
42
48
|
* @slot This is a slot test
|
43
49
|
*/
|
44
50
|
public render(): TemplateResult {
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
51
|
+
if (this.resizable) {
|
52
|
+
return html`
|
53
|
+
<div class="cell__wrapper" part="nile__table-cell">
|
54
|
+
${this.hasSlotController.test('[default]')
|
55
|
+
? html` <div class="column" part="nile__table-cell"><slot></slot></div>`
|
56
|
+
: ''}
|
57
|
+
<div class="resizer" @mousedown=${this.handleResizeStart}></div>
|
58
|
+
</div>
|
59
|
+
`;
|
60
|
+
} else {
|
61
|
+
return html`
|
62
|
+
${this.hasSlotController.test('[default]')
|
63
|
+
? html` <slot class="column" part="nile__table-cell"> </slot>`
|
64
|
+
: ''}
|
65
|
+
`;
|
66
|
+
}
|
50
67
|
}
|
51
68
|
|
52
69
|
/* #endregion */
|
@@ -6,6 +6,7 @@
|
|
6
6
|
*/
|
7
7
|
|
8
8
|
import { css } from 'lit';
|
9
|
+
import { resizableHeaderStyles, headerResizerStyles } from '../internal/resizable-table-styles';
|
9
10
|
|
10
11
|
/**
|
11
12
|
* TableHeaderItem CSS
|
@@ -44,6 +45,8 @@ export const styles = css`
|
|
44
45
|
font-style: normal;
|
45
46
|
/* line-height: var(--nile-type-scale-5); */
|
46
47
|
line-height: normal;
|
48
|
+
text-overflow: ellipsis;
|
49
|
+
white-space: nowrap;
|
47
50
|
}
|
48
51
|
|
49
52
|
nile-icon {
|
@@ -67,6 +70,10 @@ export const styles = css`
|
|
67
70
|
.headers:hover .hover__arrow {
|
68
71
|
opacity: 0.3;
|
69
72
|
}
|
73
|
+
|
74
|
+
/* Import resizable styles */
|
75
|
+
${resizableHeaderStyles}
|
76
|
+
${headerResizerStyles}
|
70
77
|
`;
|
71
78
|
|
72
79
|
export default [styles];
|
@@ -15,6 +15,7 @@ import { customElement, state, property } from 'lit/decorators.js';
|
|
15
15
|
import { styles } from './nile-table-header-item.css';
|
16
16
|
import NileElement from '../internal/nile-element';
|
17
17
|
import { HasSlotController } from '../internal/slot';
|
18
|
+
import { createResizeHandler } from '../internal/resizable-table-helper';
|
18
19
|
|
19
20
|
/**
|
20
21
|
* Nile icon component.
|
@@ -43,6 +44,9 @@ export class NileTableHeaderItem extends NileElement {
|
|
43
44
|
@property({ type: String, reflect: true, attribute: 'icon-name' }) iconName =
|
44
45
|
'';
|
45
46
|
|
47
|
+
/** Enables the resize functionality. */
|
48
|
+
@property({ type: Boolean, reflect: true }) resizable = false;
|
49
|
+
|
46
50
|
@state() sorting_ct = 0;
|
47
51
|
|
48
52
|
/* #endregion */
|
@@ -66,53 +70,98 @@ export class NileTableHeaderItem extends NileElement {
|
|
66
70
|
this.emit('nile-search', { value: e.detail.value });
|
67
71
|
}
|
68
72
|
|
73
|
+
private handleResizeStart = createResizeHandler(this, 50);
|
74
|
+
|
69
75
|
public render(): TemplateResult {
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
76
|
+
if (this.resizable) {
|
77
|
+
return html`
|
78
|
+
<div class="header__item__wrapper" part="nile__table-header-cell">
|
79
|
+
<div class="headers">
|
80
|
+
<slot> </slot>
|
81
|
+
${this.havesort && this.sorting_ct % 3 === 0
|
82
|
+
? html`<nile-icon
|
83
|
+
name="sortdown"
|
84
|
+
size="16"
|
85
|
+
@click=${this.handleSort}
|
86
|
+
class="hover__arrow"
|
87
|
+
></nile-icon>`
|
88
|
+
: null}
|
89
|
+
${this.havesort && this.sorting_ct % 3 === 1
|
90
|
+
? html`<nile-icon
|
91
|
+
name="sortdown"
|
92
|
+
size="16"
|
93
|
+
@click=${this.handleSort}
|
94
|
+
></nile-icon>`
|
95
|
+
: null}
|
96
|
+
${this.havesort && this.sorting_ct % 3 === 2
|
97
|
+
? html`<nile-icon
|
98
|
+
name="sortup"
|
99
|
+
size="16"
|
100
|
+
@click=${this.handleSort}
|
101
|
+
></nile-icon>`
|
102
|
+
: null}
|
103
|
+
${this.iconName
|
104
|
+
? html` <nile-icon name="${this.iconName}" size="16"></nile-icon>`
|
105
|
+
: html``}
|
106
|
+
${this.havefilter
|
107
|
+
? html` <nile-popover title="Filter" placement="bottom">
|
108
|
+
<nile-icon name="filter" size="16" slot="anchor"></nile-icon>
|
109
|
+
<nile-input
|
110
|
+
placeholder="Search"
|
111
|
+
@nile-input=${this.handleSearch}
|
112
|
+
part="filter__search"
|
113
|
+
></nile-input>
|
114
|
+
<slot name="filter__content" part="filter__content"></slot>
|
115
|
+
</nile-popover>`
|
116
|
+
: html``}
|
117
|
+
</div>
|
118
|
+
<div class="resizer" @mousedown=${this.handleResizeStart}></div>
|
119
|
+
</div>`;
|
120
|
+
} else {
|
121
|
+
return html`
|
122
|
+
<div class="header__item__wrapper" part="nile__table-header-cell">
|
123
|
+
<div class="headers">
|
124
|
+
<slot> </slot>
|
125
|
+
${this.havesort && this.sorting_ct % 3 === 0
|
126
|
+
? html`<nile-icon
|
127
|
+
name="sortdown"
|
128
|
+
size="16"
|
129
|
+
@click=${this.handleSort}
|
130
|
+
class="hover__arrow"
|
131
|
+
></nile-icon>`
|
132
|
+
: null}
|
133
|
+
${this.havesort && this.sorting_ct % 3 === 1
|
134
|
+
? html`<nile-icon
|
135
|
+
name="sortdown"
|
136
|
+
size="16"
|
137
|
+
@click=${this.handleSort}
|
138
|
+
></nile-icon>`
|
139
|
+
: null}
|
140
|
+
${this.havesort && this.sorting_ct % 3 === 2
|
141
|
+
? html`<nile-icon
|
142
|
+
name="sortup"
|
143
|
+
size="16"
|
144
|
+
@click=${this.handleSort}
|
145
|
+
></nile-icon>`
|
146
|
+
: null}
|
147
|
+
${this.iconName
|
148
|
+
? html` <nile-icon name="${this.iconName}" size="16"></nile-icon>`
|
149
|
+
: html``}
|
150
|
+
${this.havefilter
|
151
|
+
? html` <nile-popover title="Filter" placement="bottom">
|
152
|
+
<nile-icon name="filter" size="16" slot="anchor"></nile-icon>
|
153
|
+
<nile-input
|
154
|
+
placeholder="Search"
|
155
|
+
@nile-input=${this.handleSearch}
|
156
|
+
part="filter__search"
|
157
|
+
></nile-input>
|
158
|
+
<slot name="filter__content" part="filter__content"></slot>
|
159
|
+
</nile-popover>`
|
160
|
+
: html``}
|
161
|
+
</div>
|
162
|
+
</div>`;
|
163
|
+
}
|
114
164
|
}
|
115
|
-
/* #endregion */
|
116
165
|
}
|
117
166
|
|
118
167
|
export default NileTableHeaderItem;
|