@aquera/nile-elements 0.1.57 → 0.1.58
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 +3 -0
- package/demo/index.html +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.js +240 -90
- 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 +4 -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 +20 -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 +7 -2
- package/dist/nile-table-header-item/nile-table-header-item.esm.js +9 -8
- 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 +3 -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 +10 -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 +19 -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 +6 -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 +22 -15
- package/dist/src/nile-table-header-item/nile-table-header-item.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -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 +3 -0
- package/src/nile-table-body/nile-table-body.ts +9 -0
- package/src/nile-table-cell-item/nile-table-cell-item.css.ts +19 -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 +6 -0
- package/src/nile-table-header-item/nile-table-header-item.ts +11 -5
- package/vscode-html-custom-data.json +15 -4
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",
|
7
7
|
"main": "dist/src/index.js",
|
8
8
|
"type": "module",
|
9
9
|
"module": "dist/src/index.js",
|
@@ -191,4 +191,4 @@
|
|
191
191
|
"prettier --write"
|
192
192
|
]
|
193
193
|
}
|
194
|
-
}
|
194
|
+
}
|
@@ -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,8 @@ export const styles = css`
|
|
48
49
|
slot::slotted(nile-table-row:last-child) {
|
49
50
|
border-bottom: 0px;
|
50
51
|
}
|
52
|
+
|
53
|
+
${tableLayoutStyles}
|
51
54
|
`;
|
52
55
|
|
53
56
|
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,8 @@ export class NileTableBody extends NileElement {
|
|
88
94
|
row_data = [];
|
89
95
|
}
|
90
96
|
});
|
97
|
+
|
98
|
+
this.checkForResizableColumns();
|
91
99
|
}
|
92
100
|
|
93
101
|
private handleSort(e: any) {
|
@@ -115,6 +123,7 @@ export class NileTableBody extends NileElement {
|
|
115
123
|
@slotchange=${this.handleSlotchange}
|
116
124
|
@nile-click-sort=${this.handleSort}
|
117
125
|
class="nile__table__body"
|
126
|
+
?resizable=${this.hasResizableColumns}
|
118
127
|
@nile-search=${this.handleSearch}
|
119
128
|
></slot>
|
120
129
|
</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,15 @@ 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
|
+
${resizableHostStyles}
|
56
|
+
${resizerStyles}
|
57
|
+
${resizableSlotStyles}
|
40
58
|
`;
|
41
59
|
|
42
60
|
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,9 @@ export const styles = css`
|
|
67
70
|
.headers:hover .hover__arrow {
|
68
71
|
opacity: 0.3;
|
69
72
|
}
|
73
|
+
|
74
|
+
${resizableHeaderStyles}
|
75
|
+
${headerResizerStyles}
|
70
76
|
`;
|
71
77
|
|
72
78
|
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,9 +70,10 @@ 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
|
-
return html`
|
71
|
-
? html`
|
76
|
+
return html`
|
72
77
|
<div class="header__item__wrapper" part="nile__table-header-cell">
|
73
78
|
<div class="headers">
|
74
79
|
<slot> </slot>
|
@@ -109,10 +114,11 @@ export class NileTableHeaderItem extends NileElement {
|
|
109
114
|
</nile-popover>`
|
110
115
|
: html``}
|
111
116
|
</div>
|
112
|
-
|
113
|
-
|
117
|
+
${this.resizable
|
118
|
+
? html`<div class="resizer" @mousedown=${this.handleResizeStart}></div>`
|
119
|
+
: null}
|
120
|
+
</div>`;
|
114
121
|
}
|
115
|
-
/* #endregion */
|
116
122
|
}
|
117
123
|
|
118
124
|
export default NileTableHeaderItem;
|
@@ -3492,7 +3492,7 @@
|
|
3492
3492
|
},
|
3493
3493
|
{
|
3494
3494
|
"name": "nile-table-body",
|
3495
|
-
"description": "nile-table-body component.\n\nAttributes:\n\n * `type` {`\"primary\" | \"secondary\"`} - \n\nProperties:\n\n * `defaultSlot` {`HTMLSlotElement`} - The styles for TableBody\n\n * `_childNodes` {`HTMLElement[]`} - \n\n * `type` {`\"primary\" | \"secondary\"`} - \n\n * `rows_data` {`any[]`} - \n\n * `header_rows_data` {`any[]`} - \n\n * `sort__index` {`number`} - \n\n * `search__index` {`number`} - \n\n * `BUBBLES` {`boolean`} - \n\n * `COMPOSED` {`boolean`} - \n\n * `CANCELABLE` {`boolean`} - ",
|
3495
|
+
"description": "nile-table-body component.\n\nAttributes:\n\n * `type` {`\"primary\" | \"secondary\"`} - \n\nProperties:\n\n * `defaultSlot` {`HTMLSlotElement`} - The styles for TableBody\n\n * `_childNodes` {`HTMLElement[]`} - \n\n * `type` {`\"primary\" | \"secondary\"`} - \n\n * `rows_data` {`any[]`} - \n\n * `header_rows_data` {`any[]`} - \n\n * `sort__index` {`number`} - \n\n * `search__index` {`number`} - \n\n * `hasResizableColumns` {`boolean`} - \n\n * `BUBBLES` {`boolean`} - \n\n * `COMPOSED` {`boolean`} - \n\n * `CANCELABLE` {`boolean`} - ",
|
3496
3496
|
"attributes": [
|
3497
3497
|
{
|
3498
3498
|
"name": "type",
|
@@ -3510,12 +3510,18 @@
|
|
3510
3510
|
},
|
3511
3511
|
{
|
3512
3512
|
"name": "nile-table-cell-item",
|
3513
|
-
"description": "Nile table Cell Item component.\n\nProperties:\n\n * `hasSlotController` - \n\n * `BUBBLES` {`boolean`} - \n\n * `COMPOSED` {`boolean`} - \n\n * `CANCELABLE` {`boolean`} - ",
|
3514
|
-
"attributes": [
|
3513
|
+
"description": "Nile table Cell Item component.\n\nAttributes:\n\n * `resizable` {`boolean`} - Enables the resize functionality.\n\nProperties:\n\n * `hasSlotController` - \n\n * `resizable` {`boolean`} - Enables the resize functionality.\n\n * `handleResizeStart` - \n\n * `BUBBLES` {`boolean`} - \n\n * `COMPOSED` {`boolean`} - \n\n * `CANCELABLE` {`boolean`} - ",
|
3514
|
+
"attributes": [
|
3515
|
+
{
|
3516
|
+
"name": "resizable",
|
3517
|
+
"description": "`resizable` {`boolean`} - Enables the resize functionality.\n\nProperty: resizable\n\nDefault: false",
|
3518
|
+
"valueSet": "v"
|
3519
|
+
}
|
3520
|
+
]
|
3515
3521
|
},
|
3516
3522
|
{
|
3517
3523
|
"name": "nile-table-header-item",
|
3518
|
-
"description": "Nile icon component.\n\nAttributes:\n\n * `havesort` {`boolean`} - Enables the sort functionality.\n\n * `havefilter` {`boolean`} - Enables the sort functionality.\n\n * `icon-name` {`string`} - Places the icon .\n\nProperties:\n\n * `hasSlotController` - \n\n * `havesort` {`boolean`} - Enables the sort functionality.\n\n * `havefilter` {`boolean`} - Enables the sort functionality.\n\n * `iconName` {`string`} - Places the icon .\n\n * `sorting_ct` {`number`} - \n\n * `BUBBLES` {`boolean`} - \n\n * `COMPOSED` {`boolean`} - \n\n * `CANCELABLE` {`boolean`} - ",
|
3524
|
+
"description": "Nile icon component.\n\nAttributes:\n\n * `havesort` {`boolean`} - Enables the sort functionality.\n\n * `havefilter` {`boolean`} - Enables the sort functionality.\n\n * `icon-name` {`string`} - Places the icon .\n\n * `resizable` {`boolean`} - Enables the resize functionality.\n\nProperties:\n\n * `hasSlotController` - \n\n * `havesort` {`boolean`} - Enables the sort functionality.\n\n * `havefilter` {`boolean`} - Enables the sort functionality.\n\n * `iconName` {`string`} - Places the icon .\n\n * `resizable` {`boolean`} - Enables the resize functionality.\n\n * `sorting_ct` {`number`} - \n\n * `handleResizeStart` - \n\n * `BUBBLES` {`boolean`} - \n\n * `COMPOSED` {`boolean`} - \n\n * `CANCELABLE` {`boolean`} - ",
|
3519
3525
|
"attributes": [
|
3520
3526
|
{
|
3521
3527
|
"name": "havesort",
|
@@ -3530,6 +3536,11 @@
|
|
3530
3536
|
{
|
3531
3537
|
"name": "icon-name",
|
3532
3538
|
"description": "`icon-name` {`string`} - Places the icon .\n\nProperty: iconName\n\nDefault: "
|
3539
|
+
},
|
3540
|
+
{
|
3541
|
+
"name": "resizable",
|
3542
|
+
"description": "`resizable` {`boolean`} - Enables the resize functionality.\n\nProperty: resizable\n\nDefault: false",
|
3543
|
+
"valueSet": "v"
|
3533
3544
|
}
|
3534
3545
|
]
|
3535
3546
|
},
|