@universal-material/web 3.6.9 → 3.6.11
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/css/universal-material.css +3 -3
- package/css/universal-material.min.css +3 -3
- package/custom-elements.json +8312 -7869
- package/dialog/dialog.d.ts +2 -0
- package/dialog/dialog.d.ts.map +1 -1
- package/dialog/dialog.js +21 -7
- package/dialog/dialog.js.map +1 -1
- package/grid/custom-swap.d.ts +15 -0
- package/grid/custom-swap.d.ts.map +1 -0
- package/grid/custom-swap.js +62 -0
- package/grid/custom-swap.js.map +1 -0
- package/grid/grid-column.d.ts +11 -0
- package/grid/grid-column.d.ts.map +1 -0
- package/grid/grid-column.js +22 -0
- package/grid/grid-column.js.map +1 -0
- package/grid/grid.d.ts +23 -0
- package/grid/grid.d.ts.map +1 -0
- package/grid/grid.js +231 -0
- package/grid/grid.js.map +1 -0
- package/grid/grid.styles.d.ts +2 -0
- package/grid/grid.styles.d.ts.map +1 -0
- package/grid/grid.styles.js +134 -0
- package/grid/grid.styles.js.map +1 -0
- package/index.d.ts +1 -0
- package/index.d.ts.map +1 -1
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/overflow-menu/overflow-menu.d.ts.map +1 -1
- package/overflow-menu/overflow-menu.js +0 -1
- package/overflow-menu/overflow-menu.js.map +1 -1
- package/package.json +7 -1
- package/scss/utilities/_scheme.scss +2 -2
- package/vscode.html-custom-data.json +358 -320
package/dialog/dialog.d.ts
CHANGED
|
@@ -21,6 +21,8 @@ export declare class UmDialog extends LitElement {
|
|
|
21
21
|
* _Note:_ Readonly
|
|
22
22
|
*/
|
|
23
23
|
hasIcon: boolean;
|
|
24
|
+
get scrollContainer(): HTMLElement;
|
|
25
|
+
set scrollContainer(scrollContainer: HTMLElement);
|
|
24
26
|
dialog: HTMLDialogElement;
|
|
25
27
|
scrim: HTMLElement;
|
|
26
28
|
content: HTMLElement;
|
package/dialog/dialog.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dialog.d.ts","sourceRoot":"","sources":["../../src/dialog/dialog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAQ,kBAAkB,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAI3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,OAAO,2BAA2B,CAAC;AAKnC,qBACa,QAAS,SAAQ,UAAU;;IACtC,OAAgB,MAAM,4BAAwB;IAK9C,IACI,IAAI,IAAI,OAAO,CAElB;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,EAWrB;IAED,IAAI,WAAW,WAEd;IAED;;;;OAIG;IACoE,WAAW,UAAS;IAE3F;;;;OAIG;IACgE,OAAO,UAAS;
|
|
1
|
+
{"version":3,"file":"dialog.d.ts","sourceRoot":"","sources":["../../src/dialog/dialog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAQ,kBAAkB,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAI3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAEnE,OAAO,2BAA2B,CAAC;AAKnC,qBACa,QAAS,SAAQ,UAAU;;IACtC,OAAgB,MAAM,4BAAwB;IAK9C,IACI,IAAI,IAAI,OAAO,CAElB;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,EAWrB;IAED,IAAI,WAAW,WAEd;IAED;;;;OAIG;IACoE,WAAW,UAAS;IAE3F;;;;OAIG;IACgE,OAAO,UAAS;IAInF,IACI,eAAe,IAAI,WAAW,CAEjC;IAED,IAAI,eAAe,CAAC,eAAe,EAAE,WAAW,EAM/C;IAEgB,MAAM,EAAG,iBAAiB,CAAC;IAC3B,KAAK,EAAG,WAAW,CAAC;IAClB,OAAO,EAAG,WAAW,CAAC;IACpB,SAAS,EAAG,WAAW,CAAC;IAG7C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAiB;IAGnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiB;IAE/C,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB;IAIrD,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,oBAAoB;IAI5C,MAAM,IAAI,kBAAkB;IA+B5B,YAAY,CAAC,iBAAiB,EAAE,cAAc;IAM9C,iBAAiB;IAUjB,oBAAoB;IAoEvB,IAAI;IAWJ,KAAK,CAAC,WAAW,GAAE,MAAyB;CA6CnD;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,QAAQ,CAAC;KACtB;CACF"}
|
package/dialog/dialog.js
CHANGED
|
@@ -24,6 +24,7 @@ let UmDialog = class UmDialog extends LitElement {
|
|
|
24
24
|
* _Note:_ Readonly
|
|
25
25
|
*/
|
|
26
26
|
this.hasIcon = false;
|
|
27
|
+
this.#scrollContainer = null;
|
|
27
28
|
this.#handleCancel = (e) => {
|
|
28
29
|
e.preventDefault();
|
|
29
30
|
const cancelPrevented = !this.dispatchEvent(new Event('cancel', { cancelable: true }));
|
|
@@ -52,6 +53,16 @@ let UmDialog = class UmDialog extends LitElement {
|
|
|
52
53
|
get returnValue() {
|
|
53
54
|
return this.dialog.returnValue;
|
|
54
55
|
}
|
|
56
|
+
#scrollContainer;
|
|
57
|
+
get scrollContainer() {
|
|
58
|
+
return this.#scrollContainer ?? this.content;
|
|
59
|
+
}
|
|
60
|
+
set scrollContainer(scrollContainer) {
|
|
61
|
+
this.#scrollContainer?.removeEventListener('scroll', this.#handleScroll);
|
|
62
|
+
this.#scrollContainer = scrollContainer;
|
|
63
|
+
scrollContainer.addEventListener('scroll', this.#handleScroll.bind(this));
|
|
64
|
+
this.#setScrollDividers();
|
|
65
|
+
}
|
|
55
66
|
static message(message) {
|
|
56
67
|
return MessageDialogBuilder.create(message);
|
|
57
68
|
}
|
|
@@ -129,19 +140,19 @@ let UmDialog = class UmDialog extends LitElement {
|
|
|
129
140
|
this.#setBottomScrollDivider();
|
|
130
141
|
}
|
|
131
142
|
#setBottomScrollDivider() {
|
|
132
|
-
const scrollBottom = this.
|
|
133
|
-
if (scrollBottom >= this.
|
|
134
|
-
this.content
|
|
143
|
+
const scrollBottom = this.scrollContainer.scrollTop + this.scrollContainer.offsetHeight;
|
|
144
|
+
if (scrollBottom >= this.scrollContainer.scrollHeight) {
|
|
145
|
+
this.content?.classList.remove(bottomDividerClass);
|
|
135
146
|
return;
|
|
136
147
|
}
|
|
137
|
-
this.content
|
|
148
|
+
this.content?.classList.add(bottomDividerClass);
|
|
138
149
|
}
|
|
139
150
|
#setTopScrollDivider() {
|
|
140
|
-
if (this.
|
|
141
|
-
this.content
|
|
151
|
+
if (this.scrollContainer.scrollTop) {
|
|
152
|
+
this.content?.classList.add(topDividerClass);
|
|
142
153
|
return;
|
|
143
154
|
}
|
|
144
|
-
this.content
|
|
155
|
+
this.content?.classList.remove(topDividerClass);
|
|
145
156
|
}
|
|
146
157
|
async show() {
|
|
147
158
|
this.#open = true;
|
|
@@ -191,6 +202,9 @@ __decorate([
|
|
|
191
202
|
__decorate([
|
|
192
203
|
property({ type: Boolean, attribute: 'has-icon', reflect: true })
|
|
193
204
|
], UmDialog.prototype, "hasIcon", void 0);
|
|
205
|
+
__decorate([
|
|
206
|
+
property()
|
|
207
|
+
], UmDialog.prototype, "scrollContainer", null);
|
|
194
208
|
__decorate([
|
|
195
209
|
query('dialog')
|
|
196
210
|
], UmDialog.prototype, "dialog", void 0);
|
package/dialog/dialog.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dialog.js","sourceRoot":"","sources":["../../src/dialog/dialog.ts"],"names":[],"mappings":"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","sourcesContent":["import { PropertyValues } from '@lit/reactive-element';\n\nimport { html, HTMLTemplateResult, LitElement } from 'lit';\nimport { customElement, property, query, queryAssignedElements } from 'lit/decorators.js';\n\nimport { styles as baseStyles } from '../shared/base.styles.js';\nimport { ConfirmDialogBuilder } from './confirm-dialog-builder.js';\nimport { styles } from './dialog.styles.js';\nimport { MessageDialogBuilder } from './message-dialog-builder.js';\n\nimport '../elevation/elevation.js';\n\nconst topDividerClass = 'top-divider';\nconst bottomDividerClass = 'bottom-divider';\n\n@customElement('u-dialog')\nexport class UmDialog extends LitElement {\n static override styles = [baseStyles, styles];\n\n #open = false;\n #contentResizeObserver!: ResizeObserver | null;\n\n @property({ type: Boolean })\n get open(): boolean {\n return this.#open;\n }\n\n set open(open: boolean) {\n if (this.#open === open) {\n return;\n }\n\n if (!open) {\n this.close();\n return;\n }\n\n this.show();\n }\n\n get returnValue() {\n return this.dialog.returnValue;\n }\n\n /**\n * Whether dialog has headline or not\n *\n * _Note:_ Readonly\n */\n @property({ type: Boolean, attribute: 'has-headline', reflect: true }) hasHeadline = false;\n\n /**\n * Whether dialog has icon\n *\n * _Note:_ Readonly\n */\n @property({ type: Boolean, attribute: 'has-icon', reflect: true }) hasIcon = false;\n\n @query('dialog') dialog!: HTMLDialogElement;\n @query('.scrim') scrim!: HTMLElement;\n @query('.content') content!: HTMLElement;\n @query('.container') container!: HTMLElement;\n\n @queryAssignedElements({ slot: 'headline', flatten: true })\n private readonly assignedHeadlines!: HTMLElement[];\n\n @queryAssignedElements({ slot: 'icon', flatten: true })\n private readonly assignedIcons!: HTMLElement[];\n\n static message(message: string): MessageDialogBuilder {\n return MessageDialogBuilder.create(message);\n }\n\n static confirm(message: string): ConfirmDialogBuilder {\n return ConfirmDialogBuilder.create(message);\n }\n\n override render(): HTMLTemplateResult {\n return html`\n <dialog>\n <div class=\"scrim\" @click=${this.#handleScrimClick}></div>\n <div class=\"container\" part=\"container\">\n <u-elevation></u-elevation>\n <div class=\"icon\" part=\"icon\">\n <slot\n name=\"icon\"\n @slotchange=${this.#handleIconSlotChange}>\n </slot>\n </div>\n <div class=\"headline\" part=\"headline\">\n <slot\n name=\"headline\"\n @slotchange=${this.#handleHeadlineSlotChange}>\n </slot>\n </div>\n <div\n class=\"content\"\n part=\"content\"\n @scroll=${this.#handleScroll}>\n <slot></slot>\n </div>\n <div class=\"actions\" part=\"actions\">\n <slot name=\"actions\"></slot>\n </div>\n </div>\n </dialog>`;\n }\n\n override firstUpdated(changedProperties: PropertyValues) {\n super.firstUpdated(changedProperties);\n\n this.dialog.addEventListener('cancel', this.#handleCancel);\n }\n\n override connectedCallback() {\n super.connectedCallback();\n this.addEventListener('submit', this.#handleSubmit);\n\n setTimeout(() => {\n this.#contentResizeObserver = new ResizeObserver(() => this.#setScrollDividers());\n this.#contentResizeObserver.observe(this.content);\n });\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('submit', this.#handleSubmit);\n\n this.#contentResizeObserver!.disconnect();\n this.#contentResizeObserver = null;\n }\n\n #handleSubmit(event: SubmitEvent) {\n const form = event.target as HTMLFormElement;\n const { submitter } = event;\n\n if (form.method !== 'dialog' || !submitter) {\n return;\n }\n\n this.close(submitter.getAttribute('value') ?? this.returnValue);\n }\n\n readonly #handleCancel = (e: Event) => {\n e.preventDefault();\n\n const cancelPrevented = !this.dispatchEvent(new Event('cancel', { cancelable: true }));\n\n if (cancelPrevented) {\n return;\n }\n\n this.close();\n };\n\n #handleIconSlotChange() {\n this.hasIcon = this.assignedIcons.length > 0;\n }\n\n #handleHeadlineSlotChange() {\n this.hasHeadline = this.assignedHeadlines.length > 0;\n }\n\n #handleScroll() {\n this.#setScrollDividers();\n }\n\n #setScrollDividers() {\n this.#setTopScrollDivider();\n this.#setBottomScrollDivider();\n }\n\n #setBottomScrollDivider() {\n const scrollBottom = this.content.scrollTop + this.content.offsetHeight;\n\n if (scrollBottom >= this.content.scrollHeight) {\n this.content.classList.remove(bottomDividerClass);\n return;\n }\n\n this.content.classList.add(bottomDividerClass);\n }\n\n #setTopScrollDivider() {\n if (this.content.scrollTop) {\n this.content.classList.add(topDividerClass);\n return;\n }\n\n this.content.classList.remove(topDividerClass);\n }\n\n async show() {\n this.#open = true;\n this.setAttribute('open', '');\n\n await this.updateComplete;\n this.dialog.showModal();\n const autoFocusElement = this.querySelector<HTMLElement>('[autofocus]');\n autoFocusElement?.focus();\n this.content.scrollTop = 0;\n }\n\n async close(returnValue: string = this.returnValue) {\n this.#open = false;\n this.removeAttribute('open');\n\n await this.updateComplete;\n\n if (!this.dialog.open || this.open) {\n return;\n }\n\n const preventClose = !this.dispatchEvent(new Event('close', { cancelable: true }));\n\n if (preventClose) {\n this.#open = true;\n return;\n }\n\n this.open = false;\n\n const closed = new Promise<void>(resolve =>\n this.container.addEventListener(\n 'animationend',\n () => {\n resolve();\n this.classList.remove('closing');\n this.dialog.close(returnValue);\n this.dispatchEvent(new Event('closed'));\n },\n { capture: true, once: true },\n )\n );\n\n this.classList.add('closing');\n await closed;\n }\n\n #handleScrimClick() {\n const cancelPrevented = !this.dispatchEvent(new Event('cancel', { cancelable: true }));\n\n if (cancelPrevented) {\n return;\n }\n\n this.close();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-dialog': UmDialog;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dialog.js","sourceRoot":"","sources":["../../src/dialog/dialog.ts"],"names":[],"mappings":"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","sourcesContent":["import { PropertyValues } from '@lit/reactive-element';\n\nimport { html, HTMLTemplateResult, LitElement } from 'lit';\nimport { customElement, property, query, queryAssignedElements } from 'lit/decorators.js';\n\nimport { styles as baseStyles } from '../shared/base.styles.js';\nimport { ConfirmDialogBuilder } from './confirm-dialog-builder.js';\nimport { styles } from './dialog.styles.js';\nimport { MessageDialogBuilder } from './message-dialog-builder.js';\n\nimport '../elevation/elevation.js';\n\nconst topDividerClass = 'top-divider';\nconst bottomDividerClass = 'bottom-divider';\n\n@customElement('u-dialog')\nexport class UmDialog extends LitElement {\n static override styles = [baseStyles, styles];\n\n #open = false;\n #contentResizeObserver!: ResizeObserver | null;\n\n @property({ type: Boolean })\n get open(): boolean {\n return this.#open;\n }\n\n set open(open: boolean) {\n if (this.#open === open) {\n return;\n }\n\n if (!open) {\n this.close();\n return;\n }\n\n this.show();\n }\n\n get returnValue() {\n return this.dialog.returnValue;\n }\n\n /**\n * Whether dialog has headline or not\n *\n * _Note:_ Readonly\n */\n @property({ type: Boolean, attribute: 'has-headline', reflect: true }) hasHeadline = false;\n\n /**\n * Whether dialog has icon\n *\n * _Note:_ Readonly\n */\n @property({ type: Boolean, attribute: 'has-icon', reflect: true }) hasIcon = false;\n\n #scrollContainer: HTMLElement | null = null;\n\n @property()\n get scrollContainer(): HTMLElement {\n return this.#scrollContainer ?? this.content;\n }\n\n set scrollContainer(scrollContainer: HTMLElement) {\n this.#scrollContainer?.removeEventListener('scroll', this.#handleScroll);\n\n this.#scrollContainer = scrollContainer;\n scrollContainer.addEventListener('scroll', this.#handleScroll.bind(this));\n this.#setScrollDividers();\n }\n\n @query('dialog') dialog!: HTMLDialogElement;\n @query('.scrim') scrim!: HTMLElement;\n @query('.content') content!: HTMLElement;\n @query('.container') container!: HTMLElement;\n\n @queryAssignedElements({ slot: 'headline', flatten: true })\n private readonly assignedHeadlines!: HTMLElement[];\n\n @queryAssignedElements({ slot: 'icon', flatten: true })\n private readonly assignedIcons!: HTMLElement[];\n\n static message(message: string): MessageDialogBuilder {\n return MessageDialogBuilder.create(message);\n }\n\n static confirm(message: string): ConfirmDialogBuilder {\n return ConfirmDialogBuilder.create(message);\n }\n\n override render(): HTMLTemplateResult {\n return html`\n <dialog>\n <div class=\"scrim\" @click=${this.#handleScrimClick}></div>\n <div class=\"container\" part=\"container\">\n <u-elevation></u-elevation>\n <div class=\"icon\" part=\"icon\">\n <slot\n name=\"icon\"\n @slotchange=${this.#handleIconSlotChange}>\n </slot>\n </div>\n <div class=\"headline\" part=\"headline\">\n <slot\n name=\"headline\"\n @slotchange=${this.#handleHeadlineSlotChange}>\n </slot>\n </div>\n <div\n class=\"content\"\n part=\"content\"\n @scroll=${this.#handleScroll}>\n <slot></slot>\n </div>\n <div class=\"actions\" part=\"actions\">\n <slot name=\"actions\"></slot>\n </div>\n </div>\n </dialog>`;\n }\n\n override firstUpdated(changedProperties: PropertyValues) {\n super.firstUpdated(changedProperties);\n\n this.dialog.addEventListener('cancel', this.#handleCancel);\n }\n\n override connectedCallback() {\n super.connectedCallback();\n this.addEventListener('submit', this.#handleSubmit);\n\n setTimeout(() => {\n this.#contentResizeObserver = new ResizeObserver(() => this.#setScrollDividers());\n this.#contentResizeObserver.observe(this.content);\n });\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('submit', this.#handleSubmit);\n\n this.#contentResizeObserver!.disconnect();\n this.#contentResizeObserver = null;\n }\n\n #handleSubmit(event: SubmitEvent) {\n const form = event.target as HTMLFormElement;\n const { submitter } = event;\n\n if (form.method !== 'dialog' || !submitter) {\n return;\n }\n\n this.close(submitter.getAttribute('value') ?? this.returnValue);\n }\n\n readonly #handleCancel = (e: Event) => {\n e.preventDefault();\n\n const cancelPrevented = !this.dispatchEvent(new Event('cancel', { cancelable: true }));\n\n if (cancelPrevented) {\n return;\n }\n\n this.close();\n };\n\n #handleIconSlotChange() {\n this.hasIcon = this.assignedIcons.length > 0;\n }\n\n #handleHeadlineSlotChange() {\n this.hasHeadline = this.assignedHeadlines.length > 0;\n }\n\n #handleScroll() {\n this.#setScrollDividers();\n }\n\n #setScrollDividers() {\n this.#setTopScrollDivider();\n this.#setBottomScrollDivider();\n }\n\n #setBottomScrollDivider() {\n const scrollBottom = this.scrollContainer.scrollTop + this.scrollContainer.offsetHeight;\n\n if (scrollBottom >= this.scrollContainer.scrollHeight) {\n this.content?.classList.remove(bottomDividerClass);\n return;\n }\n\n this.content?.classList.add(bottomDividerClass);\n }\n\n #setTopScrollDivider() {\n if (this.scrollContainer.scrollTop) {\n this.content?.classList.add(topDividerClass);\n return;\n }\n\n this.content?.classList.remove(topDividerClass);\n }\n\n async show() {\n this.#open = true;\n this.setAttribute('open', '');\n\n await this.updateComplete;\n this.dialog.showModal();\n const autoFocusElement = this.querySelector<HTMLElement>('[autofocus]');\n autoFocusElement?.focus();\n this.content.scrollTop = 0;\n }\n\n async close(returnValue: string = this.returnValue) {\n this.#open = false;\n this.removeAttribute('open');\n\n await this.updateComplete;\n\n if (!this.dialog.open || this.open) {\n return;\n }\n\n const preventClose = !this.dispatchEvent(new Event('close', { cancelable: true }));\n\n if (preventClose) {\n this.#open = true;\n return;\n }\n\n this.open = false;\n\n const closed = new Promise<void>(resolve =>\n this.container.addEventListener(\n 'animationend',\n () => {\n resolve();\n this.classList.remove('closing');\n this.dialog.close(returnValue);\n this.dispatchEvent(new Event('closed'));\n },\n { capture: true, once: true },\n )\n );\n\n this.classList.add('closing');\n await closed;\n }\n\n #handleScrimClick() {\n const cancelPrevented = !this.dispatchEvent(new Event('cancel', { cancelable: true }));\n\n if (cancelPrevented) {\n return;\n }\n\n this.close();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-dialog': UmDialog;\n }\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
interface SwapOptions {
|
|
2
|
+
swapTargetClass: string;
|
|
3
|
+
onSwap: (evt: any) => void;
|
|
4
|
+
}
|
|
5
|
+
export declare class CustomSwap {
|
|
6
|
+
#private;
|
|
7
|
+
static pluginName: string;
|
|
8
|
+
options: SwapOptions;
|
|
9
|
+
dragOver(evt: any): void;
|
|
10
|
+
dragOverValid(evt: any): void;
|
|
11
|
+
drop(_evt: any): void;
|
|
12
|
+
nulling(): void;
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=custom-swap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-swap.d.ts","sourceRoot":"","sources":["../../src/grid/custom-swap.ts"],"names":[],"mappings":"AAAA,UAAU,WAAW;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;CAC5B;AAuBD,qBAAa,UAAU;;IACrB,MAAM,CAAC,UAAU,SAAgB;IAKjC,OAAO,EAAG,WAAW,CAAC;IAItB,QAAQ,CAAC,GAAG,EAAE,GAAG;IAcjB,aAAa,CAAC,GAAG,EAAE,GAAG;IActB,IAAI,CAAC,IAAI,EAAE,GAAG;IAad,OAAO;CAIR"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// function swapNodes(n1, n2) {
|
|
2
|
+
// const p1 = n1.parentNode;
|
|
3
|
+
// const p2 = n2.parentNode;
|
|
4
|
+
// let i1; let
|
|
5
|
+
// i2;
|
|
6
|
+
//
|
|
7
|
+
// if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) {
|
|
8
|
+
// return;
|
|
9
|
+
// }
|
|
10
|
+
//
|
|
11
|
+
// i1 = Sortable.utils.index(n1);
|
|
12
|
+
// i2 = Sortable.utils.index(n2);
|
|
13
|
+
//
|
|
14
|
+
// if (p1.isEqualNode(p2) && i1 < i2) {
|
|
15
|
+
// i2++;
|
|
16
|
+
// }
|
|
17
|
+
//
|
|
18
|
+
// p1.insertBefore(n2, p1.children[i1]);
|
|
19
|
+
// p2.insertBefore(n1, p2.children[i2]);
|
|
20
|
+
// }
|
|
21
|
+
export class CustomSwap {
|
|
22
|
+
static { this.pluginName = 'customSwap'; } // nome do plugin
|
|
23
|
+
#lastValidTarget = null;
|
|
24
|
+
dragOver(evt) {
|
|
25
|
+
if (this.#lastValidTarget === evt.target) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
this.#lastValidTarget?.classList.remove(this.options.swapTargetClass);
|
|
29
|
+
this.#lastValidTarget = null;
|
|
30
|
+
if (evt.target === evt.ghostEl || evt.target === evt.activeSortable.el) {
|
|
31
|
+
evt.cancel();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
dragOverValid(evt) {
|
|
35
|
+
if (evt.onMove(evt.target) !== false) {
|
|
36
|
+
this.#lastValidTarget = evt.target;
|
|
37
|
+
this.#lastValidTarget.classList.add(this.options.swapTargetClass);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
this.#lastValidTarget?.classList.remove(this.options.swapTargetClass);
|
|
41
|
+
this.#lastValidTarget = null;
|
|
42
|
+
}
|
|
43
|
+
evt.cancel();
|
|
44
|
+
}
|
|
45
|
+
// Hook chamado quando o item é solto
|
|
46
|
+
drop(_evt) {
|
|
47
|
+
if (!this.#lastValidTarget) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
// if (this.options.onSwap) {
|
|
51
|
+
// this.options.onSwap({
|
|
52
|
+
// oldIndex: Sortable.utils.index(evt.dragEl),
|
|
53
|
+
// newIndex: Sortable.utils.index(this.#lastValidTarget),
|
|
54
|
+
// });
|
|
55
|
+
// }
|
|
56
|
+
}
|
|
57
|
+
nulling() {
|
|
58
|
+
this.#lastValidTarget?.classList.remove(this.options.swapTargetClass);
|
|
59
|
+
this.#lastValidTarget = null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=custom-swap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-swap.js","sourceRoot":"","sources":["../../src/grid/custom-swap.ts"],"names":[],"mappings":"AAKA,+BAA+B;AAC/B,8BAA8B;AAC9B,8BAA8B;AAC9B,gBAAgB;AAChB,UAAU;AACV,EAAE;AACF,kEAAkE;AAClE,cAAc;AACd,MAAM;AACN,EAAE;AACF,mCAAmC;AACnC,mCAAmC;AACnC,EAAE;AACF,yCAAyC;AACzC,YAAY;AACZ,MAAM;AACN,EAAE;AACF,0CAA0C;AAC1C,0CAA0C;AAC1C,IAAI;AAEJ,MAAM,OAAO,UAAU;aACd,eAAU,GAAG,YAAY,CAAC,GAAC,iBAAiB;IAOnD,gBAAgB,GAAuB,IAAI,CAAC;IAE5C,QAAQ,CAAC,GAAQ;QAEf,IAAI,IAAI,CAAC,gBAAgB,KAAK,GAAG,CAAC,MAAM,EAAE,CAAC;YACzC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACtE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAE7B,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC;YACvE,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAED,aAAa,CAAC,GAAQ;QAEpB,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC;YACrC,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,MAAM,CAAC;YACnC,IAAI,CAAC,gBAAiB,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACrE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YACtE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC/B,CAAC;QAED,GAAG,CAAC,MAAM,EAAE,CAAC;IACf,CAAC;IAED,qCAAqC;IACrC,IAAI,CAAC,IAAS;QACZ,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,6BAA6B;QAC7B,0BAA0B;QAC1B,kDAAkD;QAClD,6DAA6D;QAC7D,QAAQ;QACR,IAAI;IACN,CAAC;IAED,OAAO;QACL,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACtE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAC/B,CAAC","sourcesContent":["interface SwapOptions {\n swapTargetClass: string;\n onSwap: (evt: any) => void;\n}\n\n// function swapNodes(n1, n2) {\n// const p1 = n1.parentNode;\n// const p2 = n2.parentNode;\n// let i1; let\n// i2;\n//\n// if (!p1 || !p2 || p1.isEqualNode(n2) || p2.isEqualNode(n1)) {\n// return;\n// }\n//\n// i1 = Sortable.utils.index(n1);\n// i2 = Sortable.utils.index(n2);\n//\n// if (p1.isEqualNode(p2) && i1 < i2) {\n// i2++;\n// }\n//\n// p1.insertBefore(n2, p1.children[i1]);\n// p2.insertBefore(n1, p2.children[i2]);\n// }\n\nexport class CustomSwap {\n static pluginName = 'customSwap'; // nome do plugin\n // defaults: SwapOptions = {\n // swapTargetClass: 'swap-target',\n // };\n\n options!: SwapOptions;\n\n #lastValidTarget: HTMLElement | null = null;\n\n dragOver(evt: any) {\n\n if (this.#lastValidTarget === evt.target) {\n return;\n }\n\n this.#lastValidTarget?.classList.remove(this.options.swapTargetClass);\n this.#lastValidTarget = null;\n\n if (evt.target === evt.ghostEl || evt.target === evt.activeSortable.el) {\n evt.cancel();\n }\n }\n\n dragOverValid(evt: any) {\n\n if (evt.onMove(evt.target) !== false) {\n this.#lastValidTarget = evt.target;\n this.#lastValidTarget!.classList.add(this.options.swapTargetClass);\n } else {\n this.#lastValidTarget?.classList.remove(this.options.swapTargetClass);\n this.#lastValidTarget = null;\n }\n\n evt.cancel();\n }\n\n // Hook chamado quando o item é solto\n drop(_evt: any) {\n if (!this.#lastValidTarget) {\n return;\n }\n\n // if (this.options.onSwap) {\n // this.options.onSwap({\n // oldIndex: Sortable.utils.index(evt.dragEl),\n // newIndex: Sortable.utils.index(this.#lastValidTarget),\n // });\n // }\n }\n\n nulling() {\n this.#lastValidTarget?.classList.remove(this.options.swapTargetClass);\n this.#lastValidTarget = null;\n }\n}\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
export declare class UmDataGridColumn extends LitElement {
|
|
3
|
+
path: string;
|
|
4
|
+
groupIndex: number | null;
|
|
5
|
+
}
|
|
6
|
+
declare global {
|
|
7
|
+
interface HTMLElementTagNameMap {
|
|
8
|
+
'u-grid-column': UmDataGridColumn;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=grid-column.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid-column.d.ts","sourceRoot":"","sources":["../../src/grid/grid-column.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAGjC,qBACa,gBAAiB,SAAQ,UAAU;IAClC,IAAI,SAAM;IACgC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;CAGxF;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,eAAe,EAAE,gBAAgB,CAAC;KACnC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { LitElement } from 'lit';
|
|
3
|
+
import { customElement, property } from 'lit/decorators.js';
|
|
4
|
+
let UmDataGridColumn = class UmDataGridColumn extends LitElement {
|
|
5
|
+
constructor() {
|
|
6
|
+
super(...arguments);
|
|
7
|
+
this.path = '';
|
|
8
|
+
this.groupIndex = null;
|
|
9
|
+
// _index: number | null;
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
__decorate([
|
|
13
|
+
property()
|
|
14
|
+
], UmDataGridColumn.prototype, "path", void 0);
|
|
15
|
+
__decorate([
|
|
16
|
+
property({ type: Number, attribute: 'group-index' })
|
|
17
|
+
], UmDataGridColumn.prototype, "groupIndex", void 0);
|
|
18
|
+
UmDataGridColumn = __decorate([
|
|
19
|
+
customElement('u-grid-column')
|
|
20
|
+
], UmDataGridColumn);
|
|
21
|
+
export { UmDataGridColumn };
|
|
22
|
+
//# sourceMappingURL=grid-column.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid-column.js","sourceRoot":"","sources":["../../src/grid/grid-column.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGrD,IAAM,gBAAgB,GAAtB,MAAM,gBAAiB,SAAQ,UAAU;IAAzC;;QACO,SAAI,GAAG,EAAE,CAAC;QACgC,eAAU,GAAkB,IAAI,CAAC;QAEvF,yBAAyB;IAC3B,CAAC;CAAA,CAAA;AAJa;IAAX,QAAQ,EAAE;8CAAW;AACgC;IAArD,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;oDAAkC;AAF5E,gBAAgB;IAD5B,aAAa,CAAC,eAAe,CAAC;GAClB,gBAAgB,CAK5B","sourcesContent":["import { LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\n@customElement('u-grid-column')\nexport class UmDataGridColumn extends LitElement {\n @property() path = '';\n @property({ type: Number, attribute: 'group-index' }) groupIndex: number | null = null;\n\n // _index: number | null;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-grid-column': UmDataGridColumn;\n }\n}\n"]}
|
package/grid/grid.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { PropertyValues } from '@lit/reactive-element';
|
|
2
|
+
import { LitElement } from 'lit';
|
|
3
|
+
import { UmDataGridColumn } from './grid-column';
|
|
4
|
+
import './grid-column';
|
|
5
|
+
export declare class UmDataTable extends LitElement {
|
|
6
|
+
#private;
|
|
7
|
+
static styles: import("lit").CSSResult[];
|
|
8
|
+
get items(): any[];
|
|
9
|
+
set items(items: any[]);
|
|
10
|
+
protected _columns: UmDataGridColumn[];
|
|
11
|
+
protected _groupColumns: UmDataGridColumn[];
|
|
12
|
+
protected _regularColumns: UmDataGridColumn[];
|
|
13
|
+
private readonly headerColumnsRow;
|
|
14
|
+
private readonly headerGroupRow;
|
|
15
|
+
protected firstUpdated(_changedProperties: PropertyValues): void;
|
|
16
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
17
|
+
}
|
|
18
|
+
declare global {
|
|
19
|
+
interface HTMLElementTagNameMap {
|
|
20
|
+
'u-grid': UmDataTable;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=grid.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../src/grid/grid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAA4B,UAAU,EAAW,MAAM,KAAK,CAAC;AASpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGjD,OAAO,eAAe,CAAC;AAIvB,qBACa,WAAY,SAAQ,UAAU;;IACzC,OAAgB,MAAM,4BAAwB;IAK9C,IACI,KAAK,IAAI,GAAG,EAAE,CAEjB;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,EAGrB;IAID,SAAS,CAAC,QAAQ,EAAE,gBAAgB,EAAE,CAAM;IACnC,SAAS,CAAC,aAAa,EAAE,gBAAgB,EAAE,CAAM;IACjD,SAAS,CAAC,eAAe,EAAE,gBAAgB,EAAE,CAAM;IACxB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAe;IAClD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAe;cAE7D,YAAY,CAAC,kBAAkB,EAAE,cAAc;IA6CzD,MAAM;CAsKhB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,QAAQ,EAAE,WAAW,CAAC;KACvB;CACF"}
|
package/grid/grid.js
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { html, LitElement, nothing } from 'lit';
|
|
3
|
+
import { styleMap } from 'lit-html/directives/style-map.js';
|
|
4
|
+
import { customElement, property, query, state } from 'lit/decorators.js';
|
|
5
|
+
import { map } from 'lit/directives/map.js';
|
|
6
|
+
import Sortable from 'sortablejs';
|
|
7
|
+
import { styles as baseStyles } from '../shared/base.styles';
|
|
8
|
+
import { CustomSwap } from './custom-swap.js';
|
|
9
|
+
import { styles } from './grid.styles.js';
|
|
10
|
+
import './grid-column';
|
|
11
|
+
Sortable.mount(CustomSwap);
|
|
12
|
+
let UmDataTable = class UmDataTable extends LitElement {
|
|
13
|
+
constructor() {
|
|
14
|
+
super(...arguments);
|
|
15
|
+
this.#currentGroupingValuesMap = [];
|
|
16
|
+
this.#items = [];
|
|
17
|
+
this.#sortedItems = [];
|
|
18
|
+
this._columns = [];
|
|
19
|
+
this._groupColumns = [];
|
|
20
|
+
this._regularColumns = [];
|
|
21
|
+
// #setRegularColumnsOrder() {
|
|
22
|
+
// for (const i = 0; i < this._regularColumns.length; i++) {
|
|
23
|
+
// const column = this._regularColumns[i];
|
|
24
|
+
// column._index = i;
|
|
25
|
+
// }
|
|
26
|
+
// }
|
|
27
|
+
}
|
|
28
|
+
static { this.styles = [baseStyles, styles]; }
|
|
29
|
+
#currentGroupingValuesMap;
|
|
30
|
+
#items;
|
|
31
|
+
get items() {
|
|
32
|
+
return this.#items;
|
|
33
|
+
}
|
|
34
|
+
set items(items) {
|
|
35
|
+
this.#items = items;
|
|
36
|
+
this.#updateSorting();
|
|
37
|
+
}
|
|
38
|
+
#sortedItems;
|
|
39
|
+
firstUpdated(_changedProperties) {
|
|
40
|
+
super.firstUpdated(_changedProperties);
|
|
41
|
+
console.log(this.headerGroupRow);
|
|
42
|
+
new Sortable(this.headerGroupRow, {
|
|
43
|
+
group: 'columns',
|
|
44
|
+
// customSwap: true,
|
|
45
|
+
// revertOnSpill: true,
|
|
46
|
+
// swap: true,
|
|
47
|
+
// swapClass: 'column-drop-highlight',
|
|
48
|
+
draggable: 'u-chip',
|
|
49
|
+
forceFallback: true,
|
|
50
|
+
fallbackTolerance: 5,
|
|
51
|
+
});
|
|
52
|
+
new Sortable(this.headerColumnsRow, {
|
|
53
|
+
group: 'columns',
|
|
54
|
+
// customSwap: true,
|
|
55
|
+
// revertOnSpill: true,
|
|
56
|
+
// swap: true,
|
|
57
|
+
// swapClass: 'column-drop-highlight',
|
|
58
|
+
draggable: '.content-cell',
|
|
59
|
+
forceFallback: true,
|
|
60
|
+
fallbackTolerance: 5,
|
|
61
|
+
// onSwap: (evt: any) => {
|
|
62
|
+
//
|
|
63
|
+
// if (evt.oldIndex === evt.newIndex) {
|
|
64
|
+
// return;
|
|
65
|
+
// }
|
|
66
|
+
//
|
|
67
|
+
// let oldIndex = evt.oldIndex;
|
|
68
|
+
// let newIndex = evt.newIndex;
|
|
69
|
+
//
|
|
70
|
+
// if (this._groupColumns.length) {
|
|
71
|
+
// oldIndex--;
|
|
72
|
+
// newIndex--;
|
|
73
|
+
// }
|
|
74
|
+
//
|
|
75
|
+
// const column = this._regularColumns.splice(oldIndex, 1)[0];
|
|
76
|
+
// this._regularColumns.splice(newIndex, 0, column);
|
|
77
|
+
// this.requestUpdate();
|
|
78
|
+
// },
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
render() {
|
|
82
|
+
return html `
|
|
83
|
+
<div class="container">
|
|
84
|
+
<table class="u-table">
|
|
85
|
+
<thead>
|
|
86
|
+
${this.#renderHeader()}
|
|
87
|
+
<tr id="header-columns-row">
|
|
88
|
+
${this._groupColumns.length > 0
|
|
89
|
+
? html `<th class="group-column-header" colspan="${this._groupColumns.length}"></th>`
|
|
90
|
+
: nothing}
|
|
91
|
+
${map(this._regularColumns, column => html `<th class="content-cell">${column.textContent}</th>`)}
|
|
92
|
+
</tr>
|
|
93
|
+
</thead>
|
|
94
|
+
<tbody>${this.#renderBody()}</tbody>
|
|
95
|
+
</table>
|
|
96
|
+
</div>
|
|
97
|
+
<slot hidden @slotchange=${this.#handleSlotChange}></slot>
|
|
98
|
+
`;
|
|
99
|
+
}
|
|
100
|
+
#renderBody() {
|
|
101
|
+
const columnCount = this._columns.length;
|
|
102
|
+
if (!this.items?.length) {
|
|
103
|
+
return html `
|
|
104
|
+
<tr>
|
|
105
|
+
<td part="cell no-data" colspan="${columnCount}">No data</td>
|
|
106
|
+
</tr>
|
|
107
|
+
`;
|
|
108
|
+
}
|
|
109
|
+
// const columnsSortedByGroupIndex = this._columns.sort((a, b) => (a.groupIndex ?? 999999) - (b.groupIndex ?? 999999));
|
|
110
|
+
// const grouping = Object.entries(Object.groupBy(this._columns, ({ groupIndex }) => groupIndex)) as unknown as [string, UmDataGridColumn[]];
|
|
111
|
+
const groupingCount = this._groupColumns.length;
|
|
112
|
+
return html `
|
|
113
|
+
${map(this.#sortedItems, item => this.#renderItem(item, groupingCount))}
|
|
114
|
+
`;
|
|
115
|
+
}
|
|
116
|
+
#renderItem(item, groupingCount) {
|
|
117
|
+
return html `
|
|
118
|
+
${this.#renderGroupRows(item)}
|
|
119
|
+
<tr>
|
|
120
|
+
${this.#renderGroupingSpanColumn(groupingCount)}
|
|
121
|
+
${map(this._regularColumns, column => html `
|
|
122
|
+
<td>${this.#getValueByPath(item, column.path)}</td>`)}
|
|
123
|
+
</tr>
|
|
124
|
+
`;
|
|
125
|
+
}
|
|
126
|
+
#renderGroupingSpanColumn(groupingCount) {
|
|
127
|
+
return groupingCount
|
|
128
|
+
? html `<td colspan="${groupingCount}"></td>`
|
|
129
|
+
: nothing;
|
|
130
|
+
}
|
|
131
|
+
#renderGroupRows(item) {
|
|
132
|
+
return html `
|
|
133
|
+
${map(this._groupColumns, (column, index) => {
|
|
134
|
+
const value = this.#getValueByPath(item, column.path);
|
|
135
|
+
if (this.#currentGroupingValuesMap[index] === value) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
this.#currentGroupingValuesMap.splice(index, Infinity);
|
|
139
|
+
this.#currentGroupingValuesMap[index] = value;
|
|
140
|
+
const emptyColumns = new Array(index);
|
|
141
|
+
return html `
|
|
142
|
+
<tr>
|
|
143
|
+
${map(emptyColumns, () => html `<td></td>`)}
|
|
144
|
+
<td class="group-column-toggle">
|
|
145
|
+
<svg xmlns="http://www.w3.org/2000/svg" height="1em" viewBox="0 -960 960 960" width="1em" fill="currentColor">
|
|
146
|
+
<path d="M480-344 240-584l56-56 184 184 184-184 56 56-240 240Z"/>
|
|
147
|
+
</svg>
|
|
148
|
+
</td>
|
|
149
|
+
<td class="grouping-row" colspan="${this._regularColumns.length + (this._groupColumns.length + index + 1)}">
|
|
150
|
+
${column.textContent}: ${value}
|
|
151
|
+
</td>
|
|
152
|
+
</tr>
|
|
153
|
+
`;
|
|
154
|
+
})}
|
|
155
|
+
`;
|
|
156
|
+
}
|
|
157
|
+
#getValueByPath(item, path) {
|
|
158
|
+
return path.split('.').reduce((acc, key) => acc?.[key], item) ?? '';
|
|
159
|
+
}
|
|
160
|
+
#handleSlotChange(e) {
|
|
161
|
+
const slot = e.target;
|
|
162
|
+
const assigned = slot.assignedElements({ flatten: true });
|
|
163
|
+
this._columns = assigned.filter(el => el.tagName === 'U-GRID-COLUMN');
|
|
164
|
+
this._groupColumns = this._columns
|
|
165
|
+
.filter(c => !!c.groupIndex || c.groupIndex === 0)
|
|
166
|
+
.sort((a, b) => a.groupIndex - b.groupIndex);
|
|
167
|
+
this._regularColumns = this._columns.filter(c => !this._groupColumns.includes(c));
|
|
168
|
+
this.#updateSorting();
|
|
169
|
+
}
|
|
170
|
+
#updateSorting() {
|
|
171
|
+
if (!this.items?.length) {
|
|
172
|
+
this.#sortedItems = [];
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
if (!this._groupColumns.length) {
|
|
176
|
+
this.#sortedItems = this.items;
|
|
177
|
+
}
|
|
178
|
+
this.#sortedItems = this.items.sort((a, b) => {
|
|
179
|
+
for (const groupColumn of this._groupColumns) {
|
|
180
|
+
const aValue = this.#getValueByPath(a, groupColumn.path) ?? '';
|
|
181
|
+
const bValue = this.#getValueByPath(b, groupColumn.path) ?? '';
|
|
182
|
+
const textComparison = aValue.toString().localeCompare(bValue.toString());
|
|
183
|
+
if (textComparison !== 0) {
|
|
184
|
+
return textComparison;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return 0;
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
#renderHeader() {
|
|
191
|
+
// if (!this._groupColumns.length) {
|
|
192
|
+
// return nothing;
|
|
193
|
+
// }
|
|
194
|
+
const headerStyles = {
|
|
195
|
+
display: this._groupColumns.length
|
|
196
|
+
? ''
|
|
197
|
+
: 'none',
|
|
198
|
+
};
|
|
199
|
+
return html `
|
|
200
|
+
<tr style="${styleMap(headerStyles)}">
|
|
201
|
+
<th colspan="${this._columns.length}">
|
|
202
|
+
<div class="header">
|
|
203
|
+
<u-chip-set id="header-group-row">
|
|
204
|
+
${map(this._groupColumns, column => html `<u-chip>${column.textContent}</u-chip>`)}
|
|
205
|
+
</u-chip-set>
|
|
206
|
+
</div>
|
|
207
|
+
</th>
|
|
208
|
+
</tr>
|
|
209
|
+
`;
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
__decorate([
|
|
213
|
+
property({ type: Array })
|
|
214
|
+
], UmDataTable.prototype, "items", null);
|
|
215
|
+
__decorate([
|
|
216
|
+
state()
|
|
217
|
+
], UmDataTable.prototype, "_groupColumns", void 0);
|
|
218
|
+
__decorate([
|
|
219
|
+
state()
|
|
220
|
+
], UmDataTable.prototype, "_regularColumns", void 0);
|
|
221
|
+
__decorate([
|
|
222
|
+
query('#header-columns-row', true)
|
|
223
|
+
], UmDataTable.prototype, "headerColumnsRow", void 0);
|
|
224
|
+
__decorate([
|
|
225
|
+
query('#header-group-row', true)
|
|
226
|
+
], UmDataTable.prototype, "headerGroupRow", void 0);
|
|
227
|
+
UmDataTable = __decorate([
|
|
228
|
+
customElement('u-grid')
|
|
229
|
+
], UmDataTable);
|
|
230
|
+
export { UmDataTable };
|
|
231
|
+
//# sourceMappingURL=grid.js.map
|
package/grid/grid.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid.js","sourceRoot":"","sources":["../../src/grid/grid.ts"],"names":[],"mappings":"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","sourcesContent":["import { PropertyValues } from '@lit/reactive-element';\n\nimport { html, HTMLTemplateResult, LitElement, nothing } from 'lit';\nimport { styleMap } from 'lit-html/directives/style-map.js';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { map } from 'lit/directives/map.js';\n\nimport Sortable from 'sortablejs';\n\nimport { styles as baseStyles } from '../shared/base.styles';\nimport { CustomSwap } from './custom-swap.js';\nimport { UmDataGridColumn } from './grid-column';\nimport { styles } from './grid.styles.js';\n\nimport './grid-column';\n\nSortable.mount(CustomSwap);\n\n@customElement('u-grid')\nexport class UmDataTable extends LitElement {\n static override styles = [baseStyles, styles];\n\n readonly #currentGroupingValuesMap: any[] = [];\n #items: any[] = [];\n\n @property({ type: Array })\n get items(): any[] {\n return this.#items;\n }\n\n set items(items: any[]) {\n this.#items = items;\n this.#updateSorting();\n }\n\n #sortedItems: any[] = [];\n\n protected _columns: UmDataGridColumn[] = [];\n @state() protected _groupColumns: UmDataGridColumn[] = [];\n @state() protected _regularColumns: UmDataGridColumn[] = [];\n @query('#header-columns-row', true) private readonly headerColumnsRow!: HTMLElement;\n @query('#header-group-row', true) private readonly headerGroupRow!: HTMLElement;\n\n protected override firstUpdated(_changedProperties: PropertyValues) {\n super.firstUpdated(_changedProperties);\n\n console.log(this.headerGroupRow);\n new Sortable(this.headerGroupRow, {\n group: 'columns',\n // customSwap: true,\n // revertOnSpill: true,\n // swap: true,\n // swapClass: 'column-drop-highlight',\n draggable: 'u-chip',\n forceFallback: true,\n fallbackTolerance: 5,\n });\n\n new Sortable(this.headerColumnsRow, {\n group: 'columns',\n // customSwap: true,\n // revertOnSpill: true,\n // swap: true,\n // swapClass: 'column-drop-highlight',\n draggable: '.content-cell',\n forceFallback: true,\n fallbackTolerance: 5,\n // onSwap: (evt: any) => {\n //\n // if (evt.oldIndex === evt.newIndex) {\n // return;\n // }\n //\n // let oldIndex = evt.oldIndex;\n // let newIndex = evt.newIndex;\n //\n // if (this._groupColumns.length) {\n // oldIndex--;\n // newIndex--;\n // }\n //\n // const column = this._regularColumns.splice(oldIndex, 1)[0];\n // this._regularColumns.splice(newIndex, 0, column);\n // this.requestUpdate();\n // },\n });\n }\n\n override render() {\n\n return html`\n <div class=\"container\">\n <table class=\"u-table\">\n <thead>\n ${this.#renderHeader()}\n <tr id=\"header-columns-row\">\n ${this._groupColumns.length > 0\n ? html`<th class=\"group-column-header\" colspan=\"${this._groupColumns.length}\"></th>`\n : nothing}\n ${map(this._regularColumns, column =>\n html`<th class=\"content-cell\">${column.textContent}</th>`)}\n </tr>\n </thead>\n <tbody>${this.#renderBody()}</tbody>\n </table>\n </div>\n <slot hidden @slotchange=${this.#handleSlotChange}></slot>\n `;\n }\n\n #renderBody() {\n\n const columnCount = this._columns.length;\n\n if (!this.items?.length) {\n return html`\n <tr>\n <td part=\"cell no-data\" colspan=\"${columnCount}\">No data</td>\n </tr>\n `;\n }\n\n // const columnsSortedByGroupIndex = this._columns.sort((a, b) => (a.groupIndex ?? 999999) - (b.groupIndex ?? 999999));\n // const grouping = Object.entries(Object.groupBy(this._columns, ({ groupIndex }) => groupIndex)) as unknown as [string, UmDataGridColumn[]];\n\n const groupingCount = this._groupColumns.length;\n\n return html`\n ${map(this.#sortedItems, item => this.#renderItem(item, groupingCount))}\n `;\n }\n\n #renderItem(item: any, groupingCount: number) {\n return html`\n ${this.#renderGroupRows(item)}\n <tr>\n ${this.#renderGroupingSpanColumn(groupingCount)}\n ${map(this._regularColumns, column =>\n html`\n <td>${this.#getValueByPath(item, column.path)}</td>`)}\n </tr>\n `;\n }\n\n #renderGroupingSpanColumn(groupingCount: number) {\n return groupingCount\n ? html`<td colspan=\"${groupingCount}\"></td>`\n : nothing;\n }\n\n #renderGroupRows(item: any): HTMLTemplateResult {\n\n return html`\n ${map(this._groupColumns, (column, index) => {\n const value = this.#getValueByPath(item, column.path);\n\n if (this.#currentGroupingValuesMap[index] === value) {\n return;\n }\n\n this.#currentGroupingValuesMap.splice(index, Infinity);\n this.#currentGroupingValuesMap[index] = value;\n const emptyColumns = new Array(index);\n\n return html`\n <tr>\n ${map(emptyColumns, () => html`<td></td>`)}\n <td class=\"group-column-toggle\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1em\" viewBox=\"0 -960 960 960\" width=\"1em\" fill=\"currentColor\">\n <path d=\"M480-344 240-584l56-56 184 184 184-184 56 56-240 240Z\"/>\n </svg>\n </td>\n <td class=\"grouping-row\" colspan=\"${this._regularColumns.length + (this._groupColumns.length + index + 1)}\">\n ${column.textContent}: ${value}\n </td>\n </tr>\n `;\n })}\n `;\n }\n\n #getValueByPath(item: any, path: string) {\n return path.split('.').reduce((acc, key) => acc?.[key], item) ?? '';\n }\n\n #handleSlotChange(e: Event) {\n const slot = e.target as HTMLSlotElement;\n const assigned = slot.assignedElements({ flatten: true }) as any[];\n this._columns = assigned.filter(el => el.tagName === 'U-GRID-COLUMN');\n this._groupColumns = this._columns\n .filter(c => !!c.groupIndex || c.groupIndex === 0)\n .sort((a, b) => a.groupIndex! - b.groupIndex!);\n this._regularColumns = this._columns.filter(c => !this._groupColumns.includes(c));\n this.#updateSorting();\n }\n\n #updateSorting(): void {\n if (!this.items?.length) {\n this.#sortedItems = [];\n return;\n }\n\n if (!this._groupColumns.length) {\n this.#sortedItems = this.items;\n }\n\n this.#sortedItems = this.items.sort((a, b) => {\n\n for (const groupColumn of this._groupColumns) {\n const aValue = this.#getValueByPath(a, groupColumn.path) ?? '';\n const bValue = this.#getValueByPath(b, groupColumn.path) ?? '';\n\n const textComparison = aValue.toString().localeCompare(bValue.toString());\n\n if (textComparison !== 0) {\n return textComparison;\n }\n }\n\n return 0;\n });\n }\n\n #renderHeader() {\n // if (!this._groupColumns.length) {\n // return nothing;\n // }\n\n const headerStyles = {\n display: this._groupColumns.length\n ? ''\n : 'none',\n };\n\n return html`\n <tr style=\"${styleMap(headerStyles)}\">\n <th colspan=\"${this._columns.length}\">\n <div class=\"header\">\n <u-chip-set id=\"header-group-row\">\n ${map(this._groupColumns, column =>\n html`<u-chip>${column.textContent}</u-chip>`)}\n </u-chip-set>\n </div>\n </th>\n </tr>\n `;\n }\n\n // #setRegularColumnsOrder() {\n // for (const i = 0; i < this._regularColumns.length; i++) {\n // const column = this._regularColumns[i];\n // column._index = i;\n // }\n // }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-grid': UmDataTable;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grid.styles.d.ts","sourceRoot":"","sources":["../../src/grid/grid.styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM,yBAmIlB,CAAC"}
|