@handsontable/angular-wrapper 0.0.0-next-7e304b5-20250401
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/LICENSE.txt +25 -0
- package/README.md +5 -0
- package/esm2022/handsontable-angular-wrapper.mjs +5 -0
- package/esm2022/lib/editor/base-editor-adapter.mjs +180 -0
- package/esm2022/lib/editor/custom-editor-placeholder.component.mjs +86 -0
- package/esm2022/lib/editor/hot-cell-editor.component.mjs +94 -0
- package/esm2022/lib/hot-table.component.mjs +139 -0
- package/esm2022/lib/hot-table.module.mjs +25 -0
- package/esm2022/lib/models/column-settings.mjs +2 -0
- package/esm2022/lib/models/grid-settings.mjs +2 -0
- package/esm2022/lib/renderer/hot-cell-renderer.component.mjs +55 -0
- package/esm2022/lib/renderer/hot-dynamic-renderer-component.service.mjs +151 -0
- package/esm2022/lib/services/hot-config.service.mjs +97 -0
- package/esm2022/lib/services/hot-settings-resolver.service.mjs +74 -0
- package/esm2022/public-api.mjs +11 -0
- package/fesm2022/handsontable-angular-wrapper.mjs +886 -0
- package/fesm2022/handsontable-angular-wrapper.mjs.map +1 -0
- package/handsontable-non-commercial-license.pdf +0 -0
- package/index.d.ts +5 -0
- package/lib/editor/base-editor-adapter.d.ts +86 -0
- package/lib/editor/custom-editor-placeholder.component.d.ts +31 -0
- package/lib/editor/hot-cell-editor.component.d.ts +75 -0
- package/lib/hot-table.component.d.ts +58 -0
- package/lib/hot-table.module.d.ts +12 -0
- package/lib/models/column-settings.d.ts +19 -0
- package/lib/models/grid-settings.d.ts +8 -0
- package/lib/renderer/hot-cell-renderer.component.d.ts +33 -0
- package/lib/renderer/hot-dynamic-renderer-component.service.d.ts +75 -0
- package/lib/services/hot-config.service.d.ts +97 -0
- package/lib/services/hot-settings-resolver.service.d.ts +35 -0
- package/package.json +1 -0
- package/public-api.d.ts +9 -0
package/LICENSE.txt
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
Copyright (c) HANDSONCODE sp. z o. o.
|
|
2
|
+
|
|
3
|
+
HANDSONTABLE is a software distributed by HANDSONCODE sp. z o. o., a Polish corporation based in
|
|
4
|
+
Gdynia, Poland, at Aleja Zwyciestwa 96-98, registered by the District Court in Gdansk under number
|
|
5
|
+
538651, EU tax ID number: PL5862294002, share capital: PLN 62,800.00.
|
|
6
|
+
|
|
7
|
+
This software is protected by applicable copyright laws, including international treaties, and dual-
|
|
8
|
+
licensed - depending on whether your use for commercial purposes, meaning intended for or
|
|
9
|
+
resulting in commercial advantage or monetary compensation, or not.
|
|
10
|
+
|
|
11
|
+
If your use is strictly personal or solely for evaluation purposes, meaning for the purposes of testing
|
|
12
|
+
the suitability, performance, and usefulness of this software outside the production environment,
|
|
13
|
+
you agree to be bound by the terms included in the "handsontable-non-commercial-license.pdf" file.
|
|
14
|
+
|
|
15
|
+
Your use of this software for commercial purposes is subject to the terms included in an applicable
|
|
16
|
+
license agreement.
|
|
17
|
+
|
|
18
|
+
In any case, you must not make any such use of this software as to develop software which may be
|
|
19
|
+
considered competitive with this software.
|
|
20
|
+
|
|
21
|
+
UNLESS EXPRESSLY AGREED OTHERWISE, HANDSONCODE PROVIDES THIS SOFTWARE ON AN "AS IS"
|
|
22
|
+
BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, AND IN NO EVENT AND UNDER NO
|
|
23
|
+
LEGAL THEORY, SHALL HANDSONCODE BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY DIRECT,
|
|
24
|
+
INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER ARISING FROM
|
|
25
|
+
USE OR INABILITY TO USE THIS SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZHNvbnRhYmxlLWFuZ3VsYXItd3JhcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2hvdC10YWJsZS9zcmMvaGFuZHNvbnRhYmxlLWFuZ3VsYXItd3JhcHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import Handsontable from 'handsontable';
|
|
2
|
+
import { createComponent, } from '@angular/core';
|
|
3
|
+
import { CustomEditorPlaceholderComponent } from './custom-editor-placeholder.component';
|
|
4
|
+
import { take } from 'rxjs';
|
|
5
|
+
/**
|
|
6
|
+
* Adapter for BaseEditor from Handsontable.
|
|
7
|
+
*/
|
|
8
|
+
export class BaseEditorAdapter extends Handsontable.editors.BaseEditor {
|
|
9
|
+
/** Reference to the custom editor component. */
|
|
10
|
+
_componentRef;
|
|
11
|
+
/** Reference to the editor placeholder component. */
|
|
12
|
+
_editorPlaceHolderRef;
|
|
13
|
+
/** Flag indicating whether the placeholder is ready. */
|
|
14
|
+
_isPlaceholderReady = false;
|
|
15
|
+
/** Subscription for the finish edit event. */
|
|
16
|
+
_finishEditSubscription;
|
|
17
|
+
/** Subscription for the cancel edit event. */
|
|
18
|
+
_cancelEditSubscription;
|
|
19
|
+
/**
|
|
20
|
+
* Creates an instance of BaseEditorAdapter.
|
|
21
|
+
* @param instance The Handsontable instance.
|
|
22
|
+
*/
|
|
23
|
+
constructor(instance) {
|
|
24
|
+
super(instance);
|
|
25
|
+
this.hot.addHook('afterRowResize', this.onAfterRowResize.bind(this));
|
|
26
|
+
this.hot.addHook('afterColumnResize', this.onAfterColumnResize.bind(this));
|
|
27
|
+
this.hot.addHook('afterDestroy', this.onAfterDestroy.bind(this));
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Prepares the editor for editing. Parameters are passed from Handsontable.
|
|
31
|
+
* @param row The row index.
|
|
32
|
+
* @param column The column index.
|
|
33
|
+
* @param prop The property name.
|
|
34
|
+
* @param TD The table cell element.
|
|
35
|
+
* @param originalValue The original value of the cell.
|
|
36
|
+
* @param cellProperties The cell properties.
|
|
37
|
+
*/
|
|
38
|
+
prepare(row, column, prop, TD, originalValue, cellProperties) {
|
|
39
|
+
if (!this.isOpened()) {
|
|
40
|
+
super.prepare(row, column, prop, TD, originalValue, cellProperties);
|
|
41
|
+
const columnMeta = this.hot.getColumnMeta(column);
|
|
42
|
+
if (!this._isPlaceholderReady) {
|
|
43
|
+
this.createEditorPlaceholder(columnMeta._environmentInjector);
|
|
44
|
+
this._isPlaceholderReady = true;
|
|
45
|
+
}
|
|
46
|
+
this._componentRef = columnMeta._editorComponentReference;
|
|
47
|
+
if (this._finishEditSubscription) {
|
|
48
|
+
this._finishEditSubscription.unsubscribe();
|
|
49
|
+
this._finishEditSubscription = undefined;
|
|
50
|
+
}
|
|
51
|
+
if (this._cancelEditSubscription) {
|
|
52
|
+
this._cancelEditSubscription.unsubscribe();
|
|
53
|
+
this._cancelEditSubscription = undefined;
|
|
54
|
+
}
|
|
55
|
+
this._finishEditSubscription = this._componentRef.instance.finishEdit
|
|
56
|
+
.pipe(take(1))
|
|
57
|
+
.subscribe(() => {
|
|
58
|
+
this.finishEditing();
|
|
59
|
+
});
|
|
60
|
+
this._cancelEditSubscription = this._componentRef.instance.cancelEdit
|
|
61
|
+
.pipe(take(1))
|
|
62
|
+
.subscribe(() => {
|
|
63
|
+
this.cancelChanges();
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Closes the editor. This event is triggered by Handsontable.
|
|
69
|
+
*/
|
|
70
|
+
close() {
|
|
71
|
+
if (this.isOpened()) {
|
|
72
|
+
this.resetEditorState();
|
|
73
|
+
this._editorPlaceHolderRef.changeDetectorRef.detectChanges();
|
|
74
|
+
this._editorPlaceHolderRef.instance.detachEditor();
|
|
75
|
+
this._componentRef.instance.onClose();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Focuses the editor. This event is triggered by Handsontable.
|
|
80
|
+
*/
|
|
81
|
+
focus() {
|
|
82
|
+
this._componentRef.instance.onFocus();
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Gets the value from the editor.
|
|
86
|
+
* @returns The value from the editor.
|
|
87
|
+
*/
|
|
88
|
+
getValue() {
|
|
89
|
+
return this._componentRef.instance?.getValue();
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Opens the editor. This event is triggered by Handsontable.
|
|
93
|
+
* When opening, we set the shortcut context to 'editor'.
|
|
94
|
+
* This allows the built-in keyboard shortcuts to operate within the editor.
|
|
95
|
+
* @param event The event that triggered the opening of the editor.
|
|
96
|
+
* @remarks When entering edit mode using double-click, keyboard shortcuts do not work.
|
|
97
|
+
*/
|
|
98
|
+
open(event) {
|
|
99
|
+
this.hot.getShortcutManager().setActiveContextName('editor');
|
|
100
|
+
this.applyPropsToEditor();
|
|
101
|
+
this._componentRef.instance.onOpen(event);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Sets the value for the custom editor.
|
|
105
|
+
* @param newValue The value to set.
|
|
106
|
+
*/
|
|
107
|
+
setValue(newValue) {
|
|
108
|
+
this._componentRef.instance?.setValue(newValue);
|
|
109
|
+
this._componentRef.changeDetectorRef.detectChanges();
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Applies properties to the custom editor and editor placeholder.
|
|
113
|
+
*/
|
|
114
|
+
applyPropsToEditor() {
|
|
115
|
+
const rect = this.getEditedCellRect();
|
|
116
|
+
if (!this.isInFullEditMode()) {
|
|
117
|
+
this._componentRef.instance.setValue(null);
|
|
118
|
+
}
|
|
119
|
+
this._componentRef.setInput('originalValue', this.originalValue);
|
|
120
|
+
this._componentRef.setInput('row', this.row);
|
|
121
|
+
this._componentRef.setInput('column', this.col);
|
|
122
|
+
this._componentRef.setInput('prop', this.prop);
|
|
123
|
+
this._componentRef.setInput('cellProperties', this.cellProperties);
|
|
124
|
+
this._editorPlaceHolderRef.setInput('top', rect.top);
|
|
125
|
+
this._editorPlaceHolderRef.setInput('left', rect.start);
|
|
126
|
+
this._editorPlaceHolderRef.setInput('height', rect.height);
|
|
127
|
+
this._editorPlaceHolderRef.setInput('width', rect.width);
|
|
128
|
+
this._editorPlaceHolderRef.setInput('isVisible', true);
|
|
129
|
+
this._editorPlaceHolderRef.setInput('componentRef', this._componentRef);
|
|
130
|
+
this._editorPlaceHolderRef.changeDetectorRef.detectChanges();
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Creates the editor placeholder and append it to hot rootElement.
|
|
134
|
+
* @param injector The environment injector.
|
|
135
|
+
*/
|
|
136
|
+
createEditorPlaceholder(injector) {
|
|
137
|
+
this._editorPlaceHolderRef = createComponent(CustomEditorPlaceholderComponent, {
|
|
138
|
+
environmentInjector: injector,
|
|
139
|
+
});
|
|
140
|
+
this.hot.rootElement.appendChild(this._editorPlaceHolderRef.location.nativeElement);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Handles the after column resize event.
|
|
144
|
+
* Helps adjust the editor size to the column size and update its position.
|
|
145
|
+
*/
|
|
146
|
+
onAfterColumnResize() {
|
|
147
|
+
if (this.isOpened()) {
|
|
148
|
+
this.applyPropsToEditor();
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Handles the after row resize event.
|
|
153
|
+
* Helps adjust the editor size to the column size and update its position.
|
|
154
|
+
*/
|
|
155
|
+
onAfterRowResize() {
|
|
156
|
+
if (this.isOpened()) {
|
|
157
|
+
this.applyPropsToEditor();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Handles the after destroy event.
|
|
162
|
+
*/
|
|
163
|
+
onAfterDestroy() {
|
|
164
|
+
this._editorPlaceHolderRef?.destroy();
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Resets the editor placeholder state.
|
|
168
|
+
* We need to reset the editor placeholder state because we use it
|
|
169
|
+
* to store multiple references to the custom editor.
|
|
170
|
+
*/
|
|
171
|
+
resetEditorState() {
|
|
172
|
+
this._editorPlaceHolderRef.setInput('top', undefined);
|
|
173
|
+
this._editorPlaceHolderRef.setInput('left', undefined);
|
|
174
|
+
this._editorPlaceHolderRef.setInput('height', undefined);
|
|
175
|
+
this._editorPlaceHolderRef.setInput('width', undefined);
|
|
176
|
+
this._editorPlaceHolderRef.setInput('isVisible', false);
|
|
177
|
+
this._editorPlaceHolderRef.setInput('componentRef', undefined);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1lZGl0b3ItYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2hvdC10YWJsZS9zcmMvbGliL2VkaXRvci9iYXNlLWVkaXRvci1hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sWUFBWSxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBRUwsZUFBZSxHQUVoQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUd6RixPQUFPLEVBQWdCLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxQzs7R0FFRztBQUNILE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxZQUFZLENBQUMsT0FBTyxDQUFDLFVBQVU7SUFDcEUsZ0RBQWdEO0lBQ3hDLGFBQWEsQ0FBNkM7SUFFbEUscURBQXFEO0lBQzdDLHFCQUFxQixDQUFpRDtJQUU5RSx3REFBd0Q7SUFDaEQsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0lBRXBDLDhDQUE4QztJQUN0Qyx1QkFBdUIsQ0FBZ0I7SUFFL0MsOENBQThDO0lBQ3RDLHVCQUF1QixDQUFnQjtJQUUvQzs7O09BR0c7SUFDSCxZQUFZLFFBQTJCO1FBQ3JDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVoQixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJ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LFFBQVEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEhhbmRzb250YWJsZSBmcm9tICdoYW5kc29udGFibGUnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50UmVmLFxuICBjcmVhdGVDb21wb25lbnQsXG4gIEVudmlyb25tZW50SW5qZWN0b3IsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ3VzdG9tRWRpdG9yUGxhY2Vob2xkZXJDb21wb25lbnQgfSBmcm9tICcuL2N1c3RvbS1lZGl0b3ItcGxhY2Vob2xkZXIuY29tcG9uZW50JztcbmltcG9ydCB7IENvbHVtblNldHRpbmdzSW50ZXJuYWwgfSBmcm9tICcuLi9tb2RlbHMvY29sdW1uLXNldHRpbmdzJztcbmltcG9ydCB7IEhvdENlbGxFZGl0b3JDb21wb25lbnQgfSBmcm9tICcuL2hvdC1jZWxsLWVkaXRvci5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCB0YWtlIH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICogQWRhcHRlciBmb3IgQmFzZUVkaXRvciBmcm9tIEhhbmRzb250YWJsZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VFZGl0b3JBZGFwdGVyIGV4dGVuZHMgSGFuZHNvbnRhYmxlLmVkaXRvcnMuQmFzZUVkaXRvciB7XG4gIC8qKiBSZWZlcmVuY2UgdG8gdGhlIGN1c3RvbSBlZGl0b3IgY29tcG9uZW50LiAqL1xuICBwcml2YXRlIF9jb21wb25lbnRSZWY/OiBDb21wb25lbnRSZWY8SG90Q2VsbEVkaXRvckNvbXBvbmVudDxhbnk+PjtcblxuICAvKiogUmVmZXJlbmNlIHRvIHRoZSBlZGl0b3IgcGxhY2Vob2xkZXIgY29tcG9uZW50LiAqL1xuICBwcml2YXRlIF9lZGl0b3JQbGFjZUhvbGRlclJlZjogQ29tcG9uZW50UmVmPEN1c3RvbUVkaXRvclBsYWNlaG9sZGVyQ29tcG9uZW50PjtcblxuICAvKiogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBsYWNlaG9sZGVyIGlzIHJlYWR5LiAqL1xuICBwcml2YXRlIF9pc1BsYWNlaG9sZGVyUmVhZHkgPSBmYWxzZTtcblxuICAvKiogU3Vic2NyaXB0aW9uIGZvciB0aGUgZmluaXNoIGVkaXQgZXZlbnQuICovXG4gIHByaXZhdGUgX2ZpbmlzaEVkaXRTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgLyoqIFN1YnNjcmlwdGlvbiBmb3IgdGhlIGNhbmNlbCBlZGl0IGV2ZW50LiAqL1xuICBwcml2YXRlIF9jYW5jZWxFZGl0U3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEJhc2VFZGl0b3JBZGFwdGVyLlxuICAgKiBAcGFyYW0gaW5zdGFuY2UgVGhlIEhhbmRzb250YWJsZSBpbnN0YW5jZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGluc3RhbmNlOiBIYW5kc29udGFibGUuQ29yZSkge1xuICAgIHN1cGVyKGluc3RhbmNlKTtcblxuICAgIHRoaXMuaG90LmFkZEhvb2soJ2FmdGVyUm93UmVzaXplJywgdGhpcy5vbkFmdGVyUm93UmVzaXplLmJpbmQodGhpcykpO1xuICAgIHRoaXMuaG90LmFkZEhvb2soJ2FmdGVyQ29sdW1uUmVzaXplJywgdGhpcy5vbkFmdGVyQ29sdW1uUmVzaXplLmJpbmQodGhpcykpO1xuICAgIHRoaXMuaG90LmFkZEhvb2soJ2FmdGVyRGVzdHJveScsIHRoaXMub25BZnRlckRlc3Ryb3kuYmluZCh0aGlzKSk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgdGhlIGVkaXRvciBmb3IgZWRpdGluZy4gUGFyYW1ldGVycyBhcmUgcGFzc2VkIGZyb20gSGFuZHNvbnRhYmxlLlxuICAgKiBAcGFyYW0gcm93IFRoZSByb3cgaW5kZXguXG4gICAqIEBwYXJhbSBjb2x1bW4gVGhlIGNvbHVtbiBpbmRleC5cbiAgICogQHBhcmFtIHByb3AgVGhlIHByb3BlcnR5IG5hbWUuXG4gICAqIEBwYXJhbSBURCBUaGUgdGFibGUgY2VsbCBlbGVtZW50LlxuICAgKiBAcGFyYW0gb3JpZ2luYWxWYWx1ZSBUaGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGNlbGwuXG4gICAqIEBwYXJhbSBjZWxsUHJvcGVydGllcyBUaGUgY2VsbCBwcm9wZXJ0aWVzLlxuICAgKi9cbiAgb3ZlcnJpZGUgcHJlcGFyZShcbiAgICByb3c6IG51bWJlcixcbiAgICBjb2x1bW46IG51bWJlcixcbiAgICBwcm9wOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgVEQ6IEhUTUxUYWJsZUNlbGxFbGVtZW50LFxuICAgIG9yaWdpbmFsVmFsdWU6IGFueSxcbiAgICBjZWxsUHJvcGVydGllczogSGFuZHNvbnRhYmxlLkNlbGxQcm9wZXJ0aWVzXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc09wZW5lZCgpKSB7XG4gICAgICBzdXBlci5wcmVwYXJlKHJvdywgY29sdW1uLCBwcm9wLCBURCwgb3JpZ2luYWxWYWx1ZSwgY2VsbFByb3BlcnRpZXMpO1xuICAgICAgY29uc3QgY29sdW1uTWV0YTogQ29sdW1uU2V0dGluZ3NJbnRlcm5hbCA9IHRoaXMuaG90LmdldENvbHVtbk1ldGEoXG4gICAgICAgIGNvbHVtblxuICAgICAgKSBhcyBDb2x1bW5TZXR0aW5nc0ludGVybmFsO1xuXG4gICAgICBpZiAoIXRoaXMuX2lzUGxhY2Vob2xkZXJSZWFkeSkge1xuICAgICAgICB0aGlzLmNyZWF0ZUVkaXRvclBsYWNlaG9sZGVyKGNvbHVtbk1ldGEuX2Vudmlyb25tZW50SW5qZWN0b3IpO1xuICAgICAgICB0aGlzLl9pc1BsYWNlaG9sZGVyUmVhZHkgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jb21wb25lbnRSZWYgPSBjb2x1bW5NZXRhLl9lZGl0b3JDb21wb25lbnRSZWZlcmVuY2U7XG5cbiAgICAgIGlmICh0aGlzLl9maW5pc2hFZGl0U3Vic2NyaXB0aW9uKSB7XG4gICAgICAgIHRoaXMuX2ZpbmlzaEVkaXRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5fZmluaXNoRWRpdFN1YnNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2NhbmNlbEVkaXRTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgdGhpcy5fY2FuY2VsRWRpdFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLl9jYW5jZWxFZGl0U3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9maW5pc2hFZGl0U3Vic2NyaXB0aW9uID0gdGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlLmZpbmlzaEVkaXRcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5maW5pc2hFZGl0aW5nKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9jYW5jZWxFZGl0U3Vic2NyaXB0aW9uID0gdGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlLmNhbmNlbEVkaXRcbiAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jYW5jZWxDaGFuZ2VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIGVkaXRvci4gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgYnkgSGFuZHNvbnRhYmxlLlxuICAgKi9cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNPcGVuZWQoKSkge1xuICAgICAgdGhpcy5yZXNldEVkaXRvclN0YXRlKCk7XG4gICAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5pbnN0YW5jZS5kZXRhY2hFZGl0b3IoKTtcbiAgICAgIHRoaXMuX2NvbXBvbmVudFJlZi5pbnN0YW5jZS5vbkNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvY3VzZXMgdGhlIGVkaXRvci4gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgYnkgSGFuZHNvbnRhYmxlLlxuICAgKi9cbiAgZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlLm9uRm9jdXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB2YWx1ZSBmcm9tIHRoZSBlZGl0b3IuXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSBmcm9tIHRoZSBlZGl0b3IuXG4gICAqL1xuICBnZXRWYWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9jb21wb25lbnRSZWYuaW5zdGFuY2U/LmdldFZhbHVlKCk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgdGhlIGVkaXRvci4gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgYnkgSGFuZHNvbnRhYmxlLlxuICAgKiBXaGVuIG9wZW5pbmcsIHdlIHNldCB0aGUgc2hvcnRjdXQgY29udGV4dCB0byAnZWRpdG9yJy5cbiAgICogVGhpcyBhbGxvd3MgdGhlIGJ1aWx0LWluIGtleWJvYXJkIHNob3J0Y3V0cyB0byBvcGVyYXRlIHdpdGhpbiB0aGUgZWRpdG9yLlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBvcGVuaW5nIG9mIHRoZSBlZGl0b3IuXG4gICAqIEByZW1hcmtzIFdoZW4gZW50ZXJpbmcgZWRpdCBtb2RlIHVzaW5nIGRvdWJsZS1jbGljaywga2V5Ym9hcmQgc2hvcnRjdXRzIGRvIG5vdCB3b3JrLlxuICAgKi9cbiAgb3BlbihldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5ob3QuZ2V0U2hvcnRjdXRNYW5hZ2VyKCkuc2V0QWN0aXZlQ29udGV4dE5hbWUoJ2VkaXRvcicpO1xuICAgIHRoaXMuYXBwbHlQcm9wc1RvRWRpdG9yKCk7XG4gICAgdGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlLm9uT3BlbihldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBjdXN0b20gZWRpdG9yLlxuICAgKiBAcGFyYW0gbmV3VmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICovXG4gIHNldFZhbHVlKG5ld1ZhbHVlPzogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlPy5zZXRWYWx1ZShuZXdWYWx1ZSk7XG4gICAgdGhpcy5fY29tcG9uZW50UmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHByb3BlcnRpZXMgdG8gdGhlIGN1c3RvbSBlZGl0b3IgYW5kIGVkaXRvciBwbGFjZWhvbGRlci5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlQcm9wc1RvRWRpdG9yKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmdldEVkaXRlZENlbGxSZWN0KCk7XG5cbiAgICBpZiAoIXRoaXMuaXNJbkZ1bGxFZGl0TW9kZSgpKSB7XG4gICAgICB0aGlzLl9jb21wb25lbnRSZWYuaW5zdGFuY2Uuc2V0VmFsdWUobnVsbCk7XG4gICAgfVxuXG4gICAgdGhpcy5fY29tcG9uZW50UmVmLnNldElucHV0KCdvcmlnaW5hbFZhbHVlJywgdGhpcy5vcmlnaW5hbFZhbHVlKTtcbiAgICB0aGlzLl9jb21wb25lbnRSZWYuc2V0SW5wdXQoJ3JvdycsIHRoaXMucm93KTtcbiAgICB0aGlzLl9jb21wb25lbnRSZWYuc2V0SW5wdXQoJ2NvbHVtbicsIHRoaXMuY29sKTtcbiAgICB0aGlzLl9jb21wb25lbnRSZWYuc2V0SW5wdXQoJ3Byb3AnLCB0aGlzLnByb3ApO1xuICAgIHRoaXMuX2NvbXBvbmVudFJlZi5zZXRJbnB1dCgnY2VsbFByb3BlcnRpZXMnLCB0aGlzLmNlbGxQcm9wZXJ0aWVzKTtcblxuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLnNldElucHV0KCd0b3AnLCByZWN0LnRvcCk7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYuc2V0SW5wdXQoJ2xlZnQnLCByZWN0LnN0YXJ0KTtcbiAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5zZXRJbnB1dCgnaGVpZ2h0JywgcmVjdC5oZWlnaHQpO1xuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLnNldElucHV0KCd3aWR0aCcsIHJlY3Qud2lkdGgpO1xuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLnNldElucHV0KCdpc1Zpc2libGUnLCB0cnVlKTtcbiAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5zZXRJbnB1dCgnY29tcG9uZW50UmVmJywgdGhpcy5fY29tcG9uZW50UmVmKTtcbiAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZWRpdG9yIHBsYWNlaG9sZGVyIGFuZCBhcHBlbmQgaXQgdG8gaG90IHJvb3RFbGVtZW50LlxuICAgKiBAcGFyYW0gaW5qZWN0b3IgVGhlIGVudmlyb25tZW50IGluamVjdG9yLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVFZGl0b3JQbGFjZWhvbGRlcihpbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3Rvcik6IHZvaWQge1xuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmID0gY3JlYXRlQ29tcG9uZW50KFxuICAgICAgQ3VzdG9tRWRpdG9yUGxhY2Vob2xkZXJDb21wb25lbnQsXG4gICAgICB7XG4gICAgICAgIGVudmlyb25tZW50SW5qZWN0b3I6IGluamVjdG9yIGFzIEVudmlyb25tZW50SW5qZWN0b3IsXG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuaG90LnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKFxuICAgICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgYWZ0ZXIgY29sdW1uIHJlc2l6ZSBldmVudC5cbiAgICogSGVscHMgYWRqdXN0IHRoZSBlZGl0b3Igc2l6ZSB0byB0aGUgY29sdW1uIHNpemUgYW5kIHVwZGF0ZSBpdHMgcG9zaXRpb24uXG4gICAqL1xuICBwcml2YXRlIG9uQWZ0ZXJDb2x1bW5SZXNpemUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNPcGVuZWQoKSkge1xuICAgICAgdGhpcy5hcHBseVByb3BzVG9FZGl0b3IoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgYWZ0ZXIgcm93IHJlc2l6ZSBldmVudC5cbiAgICogSGVscHMgYWRqdXN0IHRoZSBlZGl0b3Igc2l6ZSB0byB0aGUgY29sdW1uIHNpemUgYW5kIHVwZGF0ZSBpdHMgcG9zaXRpb24uXG4gICAqL1xuICBwcml2YXRlIG9uQWZ0ZXJSb3dSZXNpemUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNPcGVuZWQoKSkge1xuICAgICAgdGhpcy5hcHBseVByb3BzVG9FZGl0b3IoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgYWZ0ZXIgZGVzdHJveSBldmVudC5cbiAgICovXG4gIHByaXZhdGUgb25BZnRlckRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWY/LmRlc3Ryb3koKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGVkaXRvciBwbGFjZWhvbGRlciBzdGF0ZS5cbiAgICogV2UgbmVlZCB0byByZXNldCB0aGUgZWRpdG9yIHBsYWNlaG9sZGVyIHN0YXRlIGJlY2F1c2Ugd2UgdXNlIGl0XG4gICAqIHRvIHN0b3JlIG11bHRpcGxlIHJlZmVyZW5jZXMgdG8gdGhlIGN1c3RvbSBlZGl0b3IuXG4gICAqL1xuICBwcml2YXRlIHJlc2V0RWRpdG9yU3RhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYuc2V0SW5wdXQoJ3RvcCcsIHVuZGVmaW5lZCk7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYuc2V0SW5wdXQoJ2xlZnQnLCB1bmRlZmluZWQpO1xuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLnNldElucHV0KCdoZWlnaHQnLCB1bmRlZmluZWQpO1xuICAgIHRoaXMuX2VkaXRvclBsYWNlSG9sZGVyUmVmLnNldElucHV0KCd3aWR0aCcsIHVuZGVmaW5lZCk7XG4gICAgdGhpcy5fZWRpdG9yUGxhY2VIb2xkZXJSZWYuc2V0SW5wdXQoJ2lzVmlzaWJsZScsIGZhbHNlKTtcbiAgICB0aGlzLl9lZGl0b3JQbGFjZUhvbGRlclJlZi5zZXRJbnB1dCgnY29tcG9uZW50UmVmJywgdW5kZWZpbmVkKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, Input, ViewChild, ViewContainerRef, } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Component representing a placeholder for a custom editor in Handsontable.
|
|
5
|
+
* It is used only within the wrapper.
|
|
6
|
+
*/
|
|
7
|
+
export class CustomEditorPlaceholderComponent {
|
|
8
|
+
/** The top position of the editor. */
|
|
9
|
+
top;
|
|
10
|
+
/** The left position of the editor. */
|
|
11
|
+
left;
|
|
12
|
+
/** The height of the editor. */
|
|
13
|
+
height;
|
|
14
|
+
/** The width of the editor. */
|
|
15
|
+
width;
|
|
16
|
+
set isVisible(value) {
|
|
17
|
+
this._isVisible = value;
|
|
18
|
+
}
|
|
19
|
+
/** The reference to the component instance of the editor. */
|
|
20
|
+
set componentRef(hotEditorComponentRef) {
|
|
21
|
+
if (hotEditorComponentRef) {
|
|
22
|
+
this.container.insert(hotEditorComponentRef.hostView);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** The container for the editor's input placeholder. */
|
|
26
|
+
container;
|
|
27
|
+
/** The display style of the editor. */
|
|
28
|
+
get display() {
|
|
29
|
+
return this._isVisible ? 'block' : 'none';
|
|
30
|
+
}
|
|
31
|
+
_isVisible = false;
|
|
32
|
+
/**
|
|
33
|
+
* Detaches the container from the Handsontable.
|
|
34
|
+
*/
|
|
35
|
+
detachEditor() {
|
|
36
|
+
this.container.detach();
|
|
37
|
+
}
|
|
38
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CustomEditorPlaceholderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
39
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CustomEditorPlaceholderComponent, selector: "ng-component", inputs: { top: "top", left: "left", height: "height", width: "width", isVisible: "isVisible", componentRef: "componentRef" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["inputPlaceholder"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: ` <div
|
|
40
|
+
class="handsontableInputHolder ht_clone_master"
|
|
41
|
+
[style.display]="display"
|
|
42
|
+
[style.width.px]="width"
|
|
43
|
+
[style.height.px]="height"
|
|
44
|
+
[style.maxWidth.px]="width"
|
|
45
|
+
[style.maxHeight.px]="height"
|
|
46
|
+
[style.top.px]="top"
|
|
47
|
+
[style.left.px]="left"
|
|
48
|
+
>
|
|
49
|
+
<ng-template #inputPlaceholder></ng-template>
|
|
50
|
+
</div>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
51
|
+
}
|
|
52
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CustomEditorPlaceholderComponent, decorators: [{
|
|
53
|
+
type: Component,
|
|
54
|
+
args: [{
|
|
55
|
+
template: ` <div
|
|
56
|
+
class="handsontableInputHolder ht_clone_master"
|
|
57
|
+
[style.display]="display"
|
|
58
|
+
[style.width.px]="width"
|
|
59
|
+
[style.height.px]="height"
|
|
60
|
+
[style.maxWidth.px]="width"
|
|
61
|
+
[style.maxHeight.px]="height"
|
|
62
|
+
[style.top.px]="top"
|
|
63
|
+
[style.left.px]="left"
|
|
64
|
+
>
|
|
65
|
+
<ng-template #inputPlaceholder></ng-template>
|
|
66
|
+
</div>`,
|
|
67
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
68
|
+
standalone: false,
|
|
69
|
+
}]
|
|
70
|
+
}], propDecorators: { top: [{
|
|
71
|
+
type: Input
|
|
72
|
+
}], left: [{
|
|
73
|
+
type: Input
|
|
74
|
+
}], height: [{
|
|
75
|
+
type: Input
|
|
76
|
+
}], width: [{
|
|
77
|
+
type: Input
|
|
78
|
+
}], isVisible: [{
|
|
79
|
+
type: Input
|
|
80
|
+
}], componentRef: [{
|
|
81
|
+
type: Input
|
|
82
|
+
}], container: [{
|
|
83
|
+
type: ViewChild,
|
|
84
|
+
args: ['inputPlaceholder', { read: ViewContainerRef, static: true }]
|
|
85
|
+
}] } });
|
|
86
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VzdG9tLWVkaXRvci1wbGFjZWhvbGRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ob3QtdGFibGUvc3JjL2xpYi9lZGl0b3IvY3VzdG9tLWVkaXRvci1wbGFjZWhvbGRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsS0FBSyxFQUNMLFNBQVMsRUFDVCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7O0FBR3ZCOzs7R0FHRztBQWlCSCxNQUFNLE9BQU8sZ0NBQWdDO0lBQzNDLHNDQUFzQztJQUM3QixHQUFHLENBQVM7SUFFckIsdUNBQXVDO0lBQzlCLElBQUksQ0FBUztJQUV0QixnQ0FBZ0M7SUFDdkIsTUFBTSxDQUFTO0lBRXhCLCtCQUErQjtJQUN0QixLQUFLLENBQVM7SUFFdkIsSUFDSSxTQUFTLENBQUMsS0FBYztRQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBRUQsNkRBQTZEO0lBQzdELElBQWEsWUFBWSxDQUN2QixxQkFBZ0U7UUFFaEUsSUFBSSxxQkFBcUIsRUFBRTtZQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUN2RDtJQUNILENBQUM7SUFFRCx3REFBd0Q7SUFDaUIsU0FBUyxDQUFtQjtJQUVyRyx1Q0FBdUM7SUFDdkMsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM1QyxDQUFDO0lBRU8sVUFBVSxHQUFHLEtBQUssQ0FBQztJQUUzQjs7T0FFRztJQUNILFlBQVk7UUFDVixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzFCLENBQUM7d0dBMUNVLGdDQUFnQzs0RkFBaEMsZ0NBQWdDLDRRQTRCSixnQkFBZ0IsMkNBM0M3Qzs7Ozs7Ozs7Ozs7U0FXSDs7NEZBSUksZ0NBQWdDO2tCQWhCNUMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUU7Ozs7Ozs7Ozs7O1NBV0g7b0JBQ1AsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLFVBQVUsRUFBRSxLQUFLO2lCQUNsQjs4QkFHVSxHQUFHO3NCQUFYLEtBQUs7Z0JBR0csSUFBSTtzQkFBWixLQUFLO2dCQUdHLE1BQU07c0JBQWQsS0FBSztnQkFHRyxLQUFLO3NCQUFiLEtBQUs7Z0JBR0YsU0FBUztzQkFEWixLQUFLO2dCQU1PLFlBQVk7c0JBQXhCLEtBQUs7Z0JBU21FLFNBQVM7c0JBQWpGLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIENvbXBvbmVudFJlZixcbiAgSW5wdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIb3RDZWxsRWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi9ob3QtY2VsbC1lZGl0b3IuY29tcG9uZW50JztcblxuLyoqXG4gKiBDb21wb25lbnQgcmVwcmVzZW50aW5nIGEgcGxhY2Vob2xkZXIgZm9yIGEgY3VzdG9tIGVkaXRvciBpbiBIYW5kc29udGFibGUuXG4gKiBJdCBpcyB1c2VkIG9ubHkgd2l0aGluIHRoZSB3cmFwcGVyLlxuICovXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGU6IGAgPGRpdlxuICAgIGNsYXNzPVwiaGFuZHNvbnRhYmxlSW5wdXRIb2xkZXIgaHRfY2xvbmVfbWFzdGVyXCJcbiAgICBbc3R5bGUuZGlzcGxheV09XCJkaXNwbGF5XCJcbiAgICBbc3R5bGUud2lkdGgucHhdPVwid2lkdGhcIlxuICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiaGVpZ2h0XCJcbiAgICBbc3R5bGUubWF4V2lkdGgucHhdPVwid2lkdGhcIlxuICAgIFtzdHlsZS5tYXhIZWlnaHQucHhdPVwiaGVpZ2h0XCJcbiAgICBbc3R5bGUudG9wLnB4XT1cInRvcFwiXG4gICAgW3N0eWxlLmxlZnQucHhdPVwibGVmdFwiXG4gID5cbiAgICA8bmctdGVtcGxhdGUgI2lucHV0UGxhY2Vob2xkZXI+PC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+YCxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxufSlcbmV4cG9ydCBjbGFzcyBDdXN0b21FZGl0b3JQbGFjZWhvbGRlckNvbXBvbmVudCB7XG4gIC8qKiBUaGUgdG9wIHBvc2l0aW9uIG9mIHRoZSBlZGl0b3IuICovXG4gIEBJbnB1dCgpIHRvcDogbnVtYmVyO1xuXG4gIC8qKiBUaGUgbGVmdCBwb3NpdGlvbiBvZiB0aGUgZWRpdG9yLiAqL1xuICBASW5wdXQoKSBsZWZ0OiBudW1iZXI7XG5cbiAgLyoqIFRoZSBoZWlnaHQgb2YgdGhlIGVkaXRvci4gKi9cbiAgQElucHV0KCkgaGVpZ2h0OiBudW1iZXI7XG5cbiAgLyoqIFRoZSB3aWR0aCBvZiB0aGUgZWRpdG9yLiAqL1xuICBASW5wdXQoKSB3aWR0aDogbnVtYmVyO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBpc1Zpc2libGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc1Zpc2libGUgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBjb21wb25lbnQgaW5zdGFuY2Ugb2YgdGhlIGVkaXRvci4gKi9cbiAgQElucHV0KCkgc2V0IGNvbXBvbmVudFJlZihcbiAgICBob3RFZGl0b3JDb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxIb3RDZWxsRWRpdG9yQ29tcG9uZW50PGFueT4+XG4gICkge1xuICAgIGlmIChob3RFZGl0b3JDb21wb25lbnRSZWYpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLmluc2VydChob3RFZGl0b3JDb21wb25lbnRSZWYuaG9zdFZpZXcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgY29udGFpbmVyIGZvciB0aGUgZWRpdG9yJ3MgaW5wdXQgcGxhY2Vob2xkZXIuICovXG4gIEBWaWV3Q2hpbGQoJ2lucHV0UGxhY2Vob2xkZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KSBjb250YWluZXI6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgLyoqIFRoZSBkaXNwbGF5IHN0eWxlIG9mIHRoZSBlZGl0b3IuICovXG4gIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2lzVmlzaWJsZSA/ICdibG9jaycgOiAnbm9uZSc7XG4gIH1cblxuICBwcml2YXRlIF9pc1Zpc2libGUgPSBmYWxzZTtcblxuICAvKipcbiAgICogRGV0YWNoZXMgdGhlIGNvbnRhaW5lciBmcm9tIHRoZSBIYW5kc29udGFibGUuXG4gICAqL1xuICBkZXRhY2hFZGl0b3IoKTogdm9pZCB7XG4gICAgdGhpcy5jb250YWluZXIuZGV0YWNoKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { Directive, EventEmitter, HostBinding, Input, Output } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Abstract class representing a Handsontable editor in angular.
|
|
5
|
+
*/
|
|
6
|
+
export class HotCellEditorComponent {
|
|
7
|
+
/** The tabindex attribute for the editor. */
|
|
8
|
+
tabindex = -1;
|
|
9
|
+
/** The data-hot-input attribute for the editor. */
|
|
10
|
+
dataHotInput = '';
|
|
11
|
+
/** The handsontableInput class for the editor. */
|
|
12
|
+
handsontableInputClass = true;
|
|
13
|
+
/** The height of the editor as a percentage of the parent container. */
|
|
14
|
+
heightFitParentContainer = 100;
|
|
15
|
+
/** The width of the editor as a percentage of the parent container. */
|
|
16
|
+
widthFitParentContainer = 100;
|
|
17
|
+
/** The row index of the cell being edited. */
|
|
18
|
+
row;
|
|
19
|
+
/** The column index of the cell being edited. */
|
|
20
|
+
column;
|
|
21
|
+
/** The property name of the cell being edited. */
|
|
22
|
+
prop;
|
|
23
|
+
/** The original value of the cell being edited. */
|
|
24
|
+
originalValue;
|
|
25
|
+
/** The cell properties of the cell being edited. */
|
|
26
|
+
cellProperties;
|
|
27
|
+
/** Event emitted when the edit is finished.
|
|
28
|
+
* The data will be saved to the model.
|
|
29
|
+
*/
|
|
30
|
+
finishEdit = new EventEmitter();
|
|
31
|
+
/** Event emitted when the edit is canceled.
|
|
32
|
+
* The entered data will be reverted to the original value.
|
|
33
|
+
*/
|
|
34
|
+
cancelEdit = new EventEmitter();
|
|
35
|
+
/** The current value of the editor. */
|
|
36
|
+
_value;
|
|
37
|
+
/** Event triggered by Handsontable on closing the editor.
|
|
38
|
+
* The user can define their own actions for
|
|
39
|
+
* the custom editor to be called after the base logic. */
|
|
40
|
+
onClose() { }
|
|
41
|
+
/** Event triggered by Handsontable on open the editor.
|
|
42
|
+
* The user can define their own actions for
|
|
43
|
+
* the custom editor to be called after the base logic. */
|
|
44
|
+
onOpen(event) { }
|
|
45
|
+
/**
|
|
46
|
+
* Gets the current value of the editor.
|
|
47
|
+
* @returns The current value of the editor.
|
|
48
|
+
*/
|
|
49
|
+
getValue() {
|
|
50
|
+
return this._value;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Sets the current value of the editor.
|
|
54
|
+
* @param value The value to set.
|
|
55
|
+
*/
|
|
56
|
+
setValue(value) {
|
|
57
|
+
this._value = value;
|
|
58
|
+
}
|
|
59
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HotCellEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
60
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: HotCellEditorComponent, inputs: { row: "row", column: "column", prop: "prop", originalValue: "originalValue", cellProperties: "cellProperties" }, outputs: { finishEdit: "finishEdit", cancelEdit: "cancelEdit" }, host: { properties: { "attr.tabindex": "this.tabindex", "attr.data-hot-input": "this.dataHotInput", "class.handsontableInput": "this.handsontableInputClass", "style.height.%": "this.heightFitParentContainer", "style.width.%": "this.widthFitParentContainer" } }, ngImport: i0 });
|
|
61
|
+
}
|
|
62
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HotCellEditorComponent, decorators: [{
|
|
63
|
+
type: Directive
|
|
64
|
+
}], propDecorators: { tabindex: [{
|
|
65
|
+
type: HostBinding,
|
|
66
|
+
args: ['attr.tabindex']
|
|
67
|
+
}], dataHotInput: [{
|
|
68
|
+
type: HostBinding,
|
|
69
|
+
args: ['attr.data-hot-input']
|
|
70
|
+
}], handsontableInputClass: [{
|
|
71
|
+
type: HostBinding,
|
|
72
|
+
args: ['class.handsontableInput']
|
|
73
|
+
}], heightFitParentContainer: [{
|
|
74
|
+
type: HostBinding,
|
|
75
|
+
args: ['style.height.%']
|
|
76
|
+
}], widthFitParentContainer: [{
|
|
77
|
+
type: HostBinding,
|
|
78
|
+
args: ['style.width.%']
|
|
79
|
+
}], row: [{
|
|
80
|
+
type: Input
|
|
81
|
+
}], column: [{
|
|
82
|
+
type: Input
|
|
83
|
+
}], prop: [{
|
|
84
|
+
type: Input
|
|
85
|
+
}], originalValue: [{
|
|
86
|
+
type: Input
|
|
87
|
+
}], cellProperties: [{
|
|
88
|
+
type: Input
|
|
89
|
+
}], finishEdit: [{
|
|
90
|
+
type: Output
|
|
91
|
+
}], cancelEdit: [{
|
|
92
|
+
type: Output
|
|
93
|
+
}] } });
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG90LWNlbGwtZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2hvdC10YWJsZS9zcmMvbGliL2VkaXRvci9ob3QtY2VsbC1lZGl0b3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUdwRjs7R0FFRztBQUVILE1BQU0sT0FBZ0Isc0JBQXNCO0lBQzFDLDZDQUE2QztJQUNMLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUV0RCxtREFBbUQ7SUFDTCxZQUFZLEdBQUcsRUFBRSxDQUFDO0lBRWhFLGtEQUFrRDtJQUNBLHNCQUFzQixHQUFHLElBQUksQ0FBQztJQUVoRix3RUFBd0U7SUFDL0Isd0JBQXdCLEdBQUcsR0FBRyxDQUFDO0lBRXhFLHVFQUF1RTtJQUMvQix1QkFBdUIsR0FBRyxHQUFHLENBQUM7SUFFdEUsOENBQThDO0lBQ3JDLEdBQUcsQ0FBUztJQUVyQixpREFBaUQ7SUFDeEMsTUFBTSxDQUFTO0lBRXhCLGtEQUFrRDtJQUN6QyxJQUFJLENBQWtCO0lBRS9CLG1EQUFtRDtJQUMxQyxhQUFhLENBQUk7SUFFMUIsb0RBQW9EO0lBQzNDLGNBQWMsQ0FBaUI7SUFFeEM7O09BRUc7SUFDTyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQUVoRDs7T0FFRztJQUNPLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO0lBRWhELHVDQUF1QztJQUMvQixNQUFNLENBQUk7SUFFbEI7OzhEQUUwRDtJQUMxRCxPQUFPLEtBQVUsQ0FBQztJQUVsQjs7OERBRTBEO0lBQzFELE1BQU0sQ0FBQyxLQUFhLElBQVMsQ0FBQztJQW9COUI7OztPQUdHO0lBQ0gsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUSxDQUFDLEtBQVE7UUFDZixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO3dHQXRGbUIsc0JBQXNCOzRGQUF0QixzQkFBc0I7OzRGQUF0QixzQkFBc0I7a0JBRDNDLFNBQVM7OEJBR2dDLFFBQVE7c0JBQS9DLFdBQVc7dUJBQUMsZUFBZTtnQkFHa0IsWUFBWTtzQkFBekQsV0FBVzt1QkFBQyxxQkFBcUI7Z0JBR2dCLHNCQUFzQjtzQkFBdkUsV0FBVzt1QkFBQyx5QkFBeUI7Z0JBR0csd0JBQXdCO3NCQUFoRSxXQUFXO3VCQUFDLGdCQUFnQjtnQkFHVyx1QkFBdUI7c0JBQTlELFdBQVc7dUJBQUMsZUFBZTtnQkFHbkIsR0FBRztzQkFBWCxLQUFLO2dCQUdHLE1BQU07c0JBQWQsS0FBSztnQkFHRyxJQUFJO3NCQUFaLEtBQUs7Z0JBR0csYUFBYTtzQkFBckIsS0FBSztnQkFHRyxjQUFjO3NCQUF0QixLQUFLO2dCQUtJLFVBQVU7c0JBQW5CLE1BQU07Z0JBS0csVUFBVTtzQkFBbkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRXZlbnRFbWl0dGVyLCBIb3N0QmluZGluZywgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2VsbFByb3BlcnRpZXMgfSBmcm9tICdoYW5kc29udGFibGUvc2V0dGluZ3MnO1xuXG4vKipcbiAqIEFic3RyYWN0IGNsYXNzIHJlcHJlc2VudGluZyBhIEhhbmRzb250YWJsZSBlZGl0b3IgaW4gYW5ndWxhci5cbiAqL1xuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSG90Q2VsbEVkaXRvckNvbXBvbmVudDxUIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj4ge1xuICAvKiogVGhlIHRhYmluZGV4IGF0dHJpYnV0ZSBmb3IgdGhlIGVkaXRvci4gKi9cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnRhYmluZGV4JykgcHJvdGVjdGVkIHRhYmluZGV4ID0gLTE7XG5cbiAgLyoqIFRoZSBkYXRhLWhvdC1pbnB1dCBhdHRyaWJ1dGUgZm9yIHRoZSBlZGl0b3IuICovXG4gIEBIb3N0QmluZGluZygnYXR0ci5kYXRhLWhvdC1pbnB1dCcpIHByb3RlY3RlZCBkYXRhSG90SW5wdXQgPSAnJztcblxuICAvKiogVGhlIGhhbmRzb250YWJsZUlucHV0IGNsYXNzIGZvciB0aGUgZWRpdG9yLiAqL1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmhhbmRzb250YWJsZUlucHV0JykgcHJvdGVjdGVkIGhhbmRzb250YWJsZUlucHV0Q2xhc3MgPSB0cnVlO1xuXG4gIC8qKiBUaGUgaGVpZ2h0IG9mIHRoZSBlZGl0b3IgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBwYXJlbnQgY29udGFpbmVyLiAqL1xuICBASG9zdEJpbmRpbmcoJ3N0eWxlLmhlaWdodC4lJykgcHJvdGVjdGVkIGhlaWdodEZpdFBhcmVudENvbnRhaW5lciA9IDEwMDtcblxuICAvKiogVGhlIHdpZHRoIG9mIHRoZSBlZGl0b3IgYXMgYSBwZXJjZW50YWdlIG9mIHRoZSBwYXJlbnQgY29udGFpbmVyLiAqL1xuICBASG9zdEJpbmRpbmcoJ3N0eWxlLndpZHRoLiUnKSBwcm90ZWN0ZWQgd2lkdGhGaXRQYXJlbnRDb250YWluZXIgPSAxMDA7XG5cbiAgLyoqIFRoZSByb3cgaW5kZXggb2YgdGhlIGNlbGwgYmVpbmcgZWRpdGVkLiAqL1xuICBASW5wdXQoKSByb3c6IG51bWJlcjtcblxuICAvKiogVGhlIGNvbHVtbiBpbmRleCBvZiB0aGUgY2VsbCBiZWluZyBlZGl0ZWQuICovXG4gIEBJbnB1dCgpIGNvbHVtbjogbnVtYmVyO1xuXG4gIC8qKiBUaGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgY2VsbCBiZWluZyBlZGl0ZWQuICovXG4gIEBJbnB1dCgpIHByb3A6IHN0cmluZyB8IG51bWJlcjtcblxuICAvKiogVGhlIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSBjZWxsIGJlaW5nIGVkaXRlZC4gKi9cbiAgQElucHV0KCkgb3JpZ2luYWxWYWx1ZTogVDtcblxuICAvKiogVGhlIGNlbGwgcHJvcGVydGllcyBvZiB0aGUgY2VsbCBiZWluZyBlZGl0ZWQuICovXG4gIEBJbnB1dCgpIGNlbGxQcm9wZXJ0aWVzOiBDZWxsUHJvcGVydGllcztcblxuICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBlZGl0IGlzIGZpbmlzaGVkLlxuICAgKiBUaGUgZGF0YSB3aWxsIGJlIHNhdmVkIHRvIHRoZSBtb2RlbC5cbiAgICovXG4gIEBPdXRwdXQoKSBmaW5pc2hFZGl0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIGVkaXQgaXMgY2FuY2VsZWQuXG4gICAqIFRoZSBlbnRlcmVkIGRhdGEgd2lsbCBiZSByZXZlcnRlZCB0byB0aGUgb3JpZ2luYWwgdmFsdWUuXG4gICAqL1xuICBAT3V0cHV0KCkgY2FuY2VsRWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKiogVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGVkaXRvci4gKi9cbiAgcHJpdmF0ZSBfdmFsdWU6IFQ7XG5cbiAgLyoqIEV2ZW50IHRyaWdnZXJlZCBieSBIYW5kc29udGFibGUgb24gY2xvc2luZyB0aGUgZWRpdG9yLlxuICAgKiBUaGUgdXNlciBjYW4gZGVmaW5lIHRoZWlyIG93biBhY3Rpb25zIGZvclxuICAgKiB0aGUgY3VzdG9tIGVkaXRvciB0byBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGJhc2UgbG9naWMuICovXG4gIG9uQ2xvc2UoKTogdm9pZCB7fVxuXG4gIC8qKiBFdmVudCB0cmlnZ2VyZWQgYnkgSGFuZHNvbnRhYmxlIG9uIG9wZW4gdGhlIGVkaXRvci5cbiAgICogVGhlIHVzZXIgY2FuIGRlZmluZSB0aGVpciBvd24gYWN0aW9ucyBmb3JcbiAgICogdGhlIGN1c3RvbSBlZGl0b3IgdG8gYmUgY2FsbGVkIGFmdGVyIHRoZSBiYXNlIGxvZ2ljLiAqL1xuICBvbk9wZW4oZXZlbnQ/OiBFdmVudCk6IHZvaWQge31cblxuICAvKiogRXZlbnQgdHJpZ2dlcmVkIGJ5IEhhbmRzb250YWJsZSBvbiBmb2N1cyB0aGUgZWRpdG9yLlxuICAgKiBUaGUgdXNlciBoYXZlIHRvIGRlZmluZSBmb2N1cyBsb2dpYy5cbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb21wb25lbnQoe1xuICAgKiAgdGVtcGxhdGU6IGA8aW5wdXQgI2lucHV0RWxlbWVudD5gXG4gICAqIH0pXG4gICAqIGNsYXNzIEN1c3RvbUVkaXRvciBleHRlbmRzIEhvdEVkaXRvcjxzdHJpbmc+IHtcbiAgICogICBAVmlld0NoaWxkKCdpbnB1dEVsZW1lbnQnKSBpbnB1dEVsZW1lbnQhOiBFbGVtZW50UmVmO1xuICAgKlxuICAgKiAgIG9uRm9jdXMoKTogdm9pZCB7XG4gICAqICAgICB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYWJzdHJhY3Qgb25Gb2N1cygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBlZGl0b3IuXG4gICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBlZGl0b3IuXG4gICAqL1xuICBnZXRWYWx1ZSgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZWRpdG9yLlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICovXG4gIHNldFZhbHVlKHZhbHVlOiBUKTogdm9pZCB7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { Component, Input, ViewChild, ViewEncapsulation, } from '@angular/core';
|
|
2
|
+
import Handsontable from 'handsontable/base';
|
|
3
|
+
import { HotSettingsResolver } from './services/hot-settings-resolver.service';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "./services/hot-settings-resolver.service";
|
|
6
|
+
import * as i2 from "./services/hot-config.service";
|
|
7
|
+
export const HOT_DESTROYED_WARNING = 'The Handsontable instance bound to this component was destroyed and cannot be' +
|
|
8
|
+
' used properly.';
|
|
9
|
+
export class HotTableComponent {
|
|
10
|
+
_hotSettingsResolver;
|
|
11
|
+
_hotConfig;
|
|
12
|
+
ngZone;
|
|
13
|
+
// component inputs
|
|
14
|
+
/** The settings for the Handsontable instance. */
|
|
15
|
+
settings;
|
|
16
|
+
/** The container element for the Handsontable instance. */
|
|
17
|
+
container;
|
|
18
|
+
/** The Handsontable instance. */
|
|
19
|
+
__hotInstance = null;
|
|
20
|
+
configSubscription;
|
|
21
|
+
constructor(_hotSettingsResolver, _hotConfig, ngZone) {
|
|
22
|
+
this._hotSettingsResolver = _hotSettingsResolver;
|
|
23
|
+
this._hotConfig = _hotConfig;
|
|
24
|
+
this.ngZone = ngZone;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Gets the Handsontable instance.
|
|
28
|
+
* @returns The Handsontable instance or `null` if it's not yet been created or has been destroyed.
|
|
29
|
+
*/
|
|
30
|
+
get hotInstance() {
|
|
31
|
+
if (!this.__hotInstance ||
|
|
32
|
+
(this.__hotInstance && !this.__hotInstance.isDestroyed)) {
|
|
33
|
+
// Will return the Handsontable instance or `null` if it's not yet been created.
|
|
34
|
+
return this.__hotInstance;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
console.warn(HOT_DESTROYED_WARNING);
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Sets the Handsontable instance.
|
|
43
|
+
* @param hotInstance The Handsontable instance to set.
|
|
44
|
+
*/
|
|
45
|
+
set hotInstance(hotInstance) {
|
|
46
|
+
this.__hotInstance = hotInstance;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Initializes the Handsontable instance after the view has been initialized.
|
|
50
|
+
* The initial settings of the table are also prepared here
|
|
51
|
+
*/
|
|
52
|
+
ngAfterViewInit() {
|
|
53
|
+
let options = this._hotSettingsResolver.applyCustomSettings(this.settings);
|
|
54
|
+
const negotiatedSettings = this.getNegotiatedSettings(options);
|
|
55
|
+
options = { ...options, ...negotiatedSettings };
|
|
56
|
+
this.ngZone.runOutsideAngular(() => {
|
|
57
|
+
this.hotInstance = new Handsontable.Core(this.container.nativeElement, options);
|
|
58
|
+
// @ts-ignore
|
|
59
|
+
this.hotInstance.init();
|
|
60
|
+
});
|
|
61
|
+
this.configSubscription = this._hotConfig.config$.subscribe((config) => {
|
|
62
|
+
if (this.hotInstance) {
|
|
63
|
+
const negotiatedSettings = this.getNegotiatedSettings(this.settings);
|
|
64
|
+
this.updateHotTable(negotiatedSettings);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
ngOnChanges(changes) {
|
|
69
|
+
if (this.hotInstance === null) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (changes.settings && !changes.settings.firstChange) {
|
|
73
|
+
const newOptions = this._hotSettingsResolver.applyCustomSettings(changes.settings.currentValue);
|
|
74
|
+
this.updateHotTable(newOptions);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Destroys the Handsontable instance and clears the columns from custom editors.
|
|
79
|
+
*/
|
|
80
|
+
ngOnDestroy() {
|
|
81
|
+
this.ngZone.runOutsideAngular(() => {
|
|
82
|
+
if (this.hotInstance) {
|
|
83
|
+
this.hotInstance.getSettings().columns
|
|
84
|
+
?.filter((column) => column._editorComponentReference)
|
|
85
|
+
.forEach((column) => {
|
|
86
|
+
column._editorComponentReference?.destroy();
|
|
87
|
+
});
|
|
88
|
+
this.hotInstance.destroy();
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
this.configSubscription.unsubscribe();
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Updates the Handsontable instance with new settings.
|
|
95
|
+
* @param newSettings The new settings to apply to the Handsontable instance.
|
|
96
|
+
*/
|
|
97
|
+
updateHotTable(newSettings) {
|
|
98
|
+
if (!this.hotInstance) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
this.ngZone.runOutsideAngular(() => {
|
|
102
|
+
this.hotInstance?.updateSettings(newSettings, false);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Merges the provided Handsontable grid settings with the global configuration.
|
|
107
|
+
*
|
|
108
|
+
* This method retrieves the global configuration from the HotConfigService and negotiates the final
|
|
109
|
+
* Handsontable settings by giving precedence to the provided settings.
|
|
110
|
+
* Additionally, the `layoutDirection` is only merged if the Handsontable instance has not yet been initialized.
|
|
111
|
+
*
|
|
112
|
+
* @param settings - The grid settings provided by the user or component.
|
|
113
|
+
* @returns The final negotiated grid settings after merging with global defaults.
|
|
114
|
+
*/
|
|
115
|
+
getNegotiatedSettings(settings) {
|
|
116
|
+
const hotConfig = this._hotConfig.getConfig();
|
|
117
|
+
const negotiatedSettings = {};
|
|
118
|
+
negotiatedSettings.licenseKey = settings.licenseKey ?? hotConfig.license;
|
|
119
|
+
negotiatedSettings.themeName = settings.themeName ?? hotConfig.themeName;
|
|
120
|
+
negotiatedSettings.language = settings.language ?? hotConfig.language;
|
|
121
|
+
// settings that can be set only before the Handsontable instance is initialized
|
|
122
|
+
if (!this.__hotInstance) {
|
|
123
|
+
negotiatedSettings.layoutDirection = settings.layoutDirection ?? hotConfig.layoutDirection;
|
|
124
|
+
}
|
|
125
|
+
return negotiatedSettings;
|
|
126
|
+
}
|
|
127
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HotTableComponent, deps: [{ token: i1.HotSettingsResolver }, { token: i2.HotConfigService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
|
128
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: HotTableComponent, selector: "hot-table", inputs: { settings: "settings" }, providers: [HotSettingsResolver], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], usesOnChanges: true, ngImport: i0, template: '<div #container></div>', isInline: true, styles: [":host{display:block}\n"], encapsulation: i0.ViewEncapsulation.None });
|
|
129
|
+
}
|
|
130
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HotTableComponent, decorators: [{
|
|
131
|
+
type: Component,
|
|
132
|
+
args: [{ selector: 'hot-table', template: '<div #container></div>', encapsulation: ViewEncapsulation.None, providers: [HotSettingsResolver], styles: [":host{display:block}\n"] }]
|
|
133
|
+
}], ctorParameters: function () { return [{ type: i1.HotSettingsResolver }, { type: i2.HotConfigService }, { type: i0.NgZone }]; }, propDecorators: { settings: [{
|
|
134
|
+
type: Input
|
|
135
|
+
}], container: [{
|
|
136
|
+
type: ViewChild,
|
|
137
|
+
args: ['container', { static: false }]
|
|
138
|
+
}] } });
|
|
139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG90LXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2hvdC10YWJsZS9zcmMvbGliL2hvdC10YWJsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxLQUFLLEVBS0wsU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLFlBQVksTUFBTSxtQkFBbUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7OztBQU0vRSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FDaEMsK0VBQStFO0lBQy9FLGlCQUFpQixDQUFDO0FBZXBCLE1BQU0sT0FBTyxpQkFBaUI7SUFjbEI7SUFDQTtJQUNEO0lBZlQsbUJBQW1CO0lBQ25CLGtEQUFrRDtJQUN6QyxRQUFRLENBQWU7SUFFaEMsMkRBQTJEO0lBRXBELFNBQVMsQ0FBNkI7SUFFN0MsaUNBQWlDO0lBQ3pCLGFBQWEsR0FBd0IsSUFBSSxDQUFDO0lBQzFDLGtCQUFrQixDQUFlO0lBRXpDLFlBQ1Usb0JBQXlDLEVBQ3pDLFVBQTRCLEVBQzdCLE1BQWM7UUFGYix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXFCO1FBQ3pDLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBQzdCLFdBQU0sR0FBTixNQUFNLENBQVE7SUFDcEIsQ0FBQztJQUVKOzs7T0FHRztJQUNILElBQVcsV0FBVztRQUNwQixJQUNFLENBQUMsSUFBSSxDQUFDLGFBQWE7WUFDbkIsQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsRUFDdkQ7WUFDQSxnRkFBZ0Y7WUFDaEYsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO1NBQzNCO2FBQU07WUFDTCxPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENB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SUFDSyxxQkFBcUIsQ0FBQyxRQUFtQztRQUMvRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzlDLE1BQU0sa0JBQWtCLEdBQThCLEVBQUUsQ0FBQTtRQUV4RCxrQkFBa0IsQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLFVBQVUsSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDO1FBQ3pFLGtCQUFrQixDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUM7UUFDekUsa0JBQWtCLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDLFFBQVEsQ0FBQztRQUV0RSxnRkFBZ0Y7UUFDaEYsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdkIsa0JBQWtCLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQyxlQUFlLElBQUksU0FBUyxDQUFDLGVBQWUsQ0FBQztTQUM1RjtRQUVELE9BQU8sa0JBQWtCLENBQUM7SUFDNUIsQ0FBQzt3R0FoSlUsaUJBQWlCOzRGQUFqQixpQkFBaUIsc0VBVGpCLENBQUMsbUJBQW1CLENBQUMsdUpBRnRCLHdCQUF3Qjs7NEZBV3ZCLGlCQUFpQjtrQkFiN0IsU0FBUzsrQkFDRSxXQUFXLFlBQ1gsd0JBQXdCLGlCQUNuQixpQkFBaUIsQ0FBQyxJQUFJLGFBQzFCLENBQUMsbUJBQW1CLENBQUM7OEpBWXZCLFFBQVE7c0JBQWhCLEtBQUs7Z0JBSUMsU0FBUztzQkFEZixTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCBIYW5kc29udGFibGUgZnJvbSAnaGFuZHNvbnRhYmxlL2Jhc2UnO1xuaW1wb3J0IHsgSG90U2V0dGluZ3NSZXNvbHZlciB9IGZyb20gJy4vc2VydmljZXMvaG90LXNldHRpbmdzLXJlc29sdmVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgSG90Q29uZmlnU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvaG90LWNvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IEdyaWRTZXR0aW5ncyB9IGZyb20gJy4vbW9kZWxzL2dyaWQtc2V0dGluZ3MnO1xuaW1wb3J0IHsgQ29sdW1uU2V0dGluZ3NJbnRlcm5hbCB9IGZyb20gJy4vbW9kZWxzL2NvbHVtbi1zZXR0aW5ncyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuZXhwb3J0IGNvbnN0IEhPVF9ERVNUUk9ZRURfV0FSTklORyA9XG4gICdUaGUgSGFuZHNvbnRhYmxlIGluc3RhbmNlIGJvdW5kIHRvIHRoaXMgY29tcG9uZW50IHdhcyBkZXN0cm95ZWQgYW5kIGNhbm5vdCBiZScgK1xuICAnIHVzZWQgcHJvcGVybHkuJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnaG90LXRhYmxlJyxcbiAgdGVtcGxhdGU6ICc8ZGl2ICNjb250YWluZXI+PC9kaXY+JyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgcHJvdmlkZXJzOiBbSG90U2V0dGluZ3NSZXNvbHZlcl0sXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgSG90VGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIC8vIGNvbXBvbmVudCBpbnB1dHNcbiAgLyoqIFRoZSBzZXR0aW5ncyBmb3IgdGhlIEhhbmRzb250YWJsZSBpbnN0YW5jZS4gKi9cbiAgQElucHV0KCkgc2V0dGluZ3M6IEdyaWRTZXR0aW5ncztcblxuICAvKiogVGhlIGNvbnRhaW5lciBlbGVtZW50IGZvciB0aGUgSGFuZHNvbnRhYmxlIGluc3RhbmNlLiAqL1xuICBAVmlld0NoaWxkKCdjb250YWluZXInLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgcHVibGljIGNvbnRhaW5lcjogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgLyoqIFRoZSBIYW5kc29udGFibGUgaW5zdGFuY2UuICovXG4gIHByaXZhdGUgX19ob3RJbnN0YW5jZTogSGFuZHNvbnRhYmxlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29uZmlnU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfaG90U2V0dGluZ3NSZXNvbHZlcjogSG90U2V0dGluZ3NSZXNvbHZlcixcbiAgICBwcml2YXRlIF9ob3RDb25maWc6IEhvdENvbmZpZ1NlcnZpY2UsXG4gICAgcHVibGljIG5nWm9uZTogTmdab25lXG4gICkge31cblxuICAvKipcbiAgICogR2V0cyB0aGUgSGFuZHNvbnRhYmxlIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyBUaGUgSGFuZHNvbnRhYmxlIGluc3RhbmNlIG9yIGBudWxsYCBpZiBpdCdzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkIG9yIGhhcyBiZWVuIGRlc3Ryb3llZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgaG90SW5zdGFuY2UoKTogSGFuZHNvbnRhYmxlIHwgbnVsbCB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuX19ob3RJbnN0YW5jZSB8fFxuICAgICAgKHRoaXMuX19ob3RJbnN0YW5jZSAmJiAhdGhpcy5fX2hvdEluc3RhbmNlLmlzRGVzdHJveWVkKVxuICAgICkge1xuICAgICAgLy8gV2lsbCByZXR1cm4gdGhlIEhhbmRzb250YWJsZSBpbnN0YW5jZSBvciBgbnVsbGAgaWYgaXQncyBub3QgeWV0IGJlZW4gY3JlYXRlZC5cbiAgICAgIHJldHVybiB0aGlzLl9faG90SW5zdGFuY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihIT1RfREVTVFJPWUVEX1dBUk5JTkcpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIEhhbmRzb250YWJsZSBpbnN0YW5jZS5cbiAgICogQHBhcmFtIGhvdEluc3RhbmNlIFRoZSBIYW5kc29udGFibGUgaW5zdGFuY2UgdG8gc2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBzZXQgaG90SW5zdGFuY2UoaG90SW5zdGFuY2UpIHtcbiAgICB0aGlzLl9faG90SW5zdGFuY2UgPSBob3RJbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgSGFuZHNvbnRhYmxlIGluc3RhbmNlIGFmdGVyIHRoZSB2aWV3IGhhcyBiZWVuIGluaXRpYWxpemVkLlxuICAgKiBUaGUgaW5pdGlhbCBzZXR0aW5ncyBvZiB0aGUgdGFibGUgYXJlIGFsc28gcHJlcGFyZWQgaGVyZVxuICAgKi9cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGxldCBvcHRpb25zOiBIYW5kc29udGFibGUuR3JpZFNldHRpbmdzID1cbiAgICAgIHRoaXMuX2hvdFNldHRpbmdzUmVzb2x2ZXIuYXBwbHlDdXN0b21TZXR0aW5ncyh0aGlzLnNldHRpbmdzKTtcblxuICAgIGNvbnN0IG5lZ290aWF0ZWRTZXR0aW5ncyA9IHRoaXMuZ2V0TmVnb3RpYXRlZFNldHRpbmdzKG9wdGlvbnMpO1xuICAgIG9wdGlvbnMgPSB7Li4ub3B0aW9ucywgLi4ubmVnb3RpYXRlZFNldHRpbmdzfTtcblxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuaG90SW5zdGFuY2UgPSBuZXcgSGFuZHNvbnRhYmxlLkNvcmUoXG4gICAgICAgIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIG9wdGlvbnNcbiAgICAgICk7XG5cbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMuaG90SW5zdGFuY2UuaW5pdCgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5jb25maWdTdWJzY3JpcHRpb24gPSB0aGlzLl9ob3RDb25maWcuY29uZmlnJC5zdWJzY3JpYmUoKGNvbmZpZykgPT4ge1xuICAgICAgaWYgKHRoaXMuaG90SW5zdGFuY2UpIHtcbiAgICAgICAgY29uc3QgbmVnb3RpYXRlZFNldHRpbmdzID0gdGhpcy5nZXROZWdvdGlhdGVkU2V0dGluZ3ModGhpcy5zZXR0aW5ncyk7XG4gICAgICAgIHRoaXMudXBkYXRlSG90VGFibGUobmVnb3RpYXRlZFNldHRpbmdzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ob3RJbnN0YW5jZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLnNldHRpbmdzICYmICFjaGFuZ2VzLnNldHRpbmdzLmZpcnN0Q2hhbmdlKSB7XG4gICAgICBjb25zdCBuZXdPcHRpb25zOiBIYW5kc29udGFibGUuR3JpZFNldHRpbmdzID1cbiAgICAgICAgdGhpcy5faG90U2V0dGluZ3NSZXNvbHZlci5hcHBseUN1c3RvbVNldHRpbmdzKFxuICAgICAgICAgIGNoYW5nZXMuc2V0dGluZ3MuY3VycmVudFZhbHVlXG4gICAgICAgICk7XG5cbiAgICAgIHRoaXMudXBkYXRlSG90VGFibGUobmV3T3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSBIYW5kc29udGFibGUgaW5zdGFuY2UgYW5kIGNsZWFycyB0aGUgY29sdW1ucyBmcm9tIGN1c3RvbSBlZGl0b3JzLlxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaG90SW5zdGFuY2UpIHtcbiAgICAgICAgKHRoaXMuaG90SW5zdGFuY2UuZ2V0U2V0dGluZ3MoKS5jb2x1bW5zIGFzIENvbHVtblNldHRpbmdzSW50ZXJuYWxbXSlcbiAgICAgICAgICA/LmZpbHRlcigoY29sdW1uKSA9PiBjb2x1bW4uX2VkaXRvckNvbXBvbmVudFJlZmVyZW5jZSlcbiAgICAgICAgICAuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICBjb2x1bW4uX2VkaXRvckNvbXBvbmVudFJlZmVyZW5jZT8uZGVzdHJveSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB0aGlzLmhvdEluc3RhbmNlLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuY29uZmlnU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgSGFuZHNvbnRhYmxlIGluc3RhbmNlIHdpdGggbmV3IHNldHRpbmdzLlxuICAgKiBAcGFyYW0gbmV3U2V0dGluZ3MgVGhlIG5ldyBzZXR0aW5ncyB0byBhcHBseSB0byB0aGUgSGFuZHNvbnRhYmxlIGluc3RhbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVIb3RUYWJsZShuZXdTZXR0aW5nczogSGFuZHNvbnRhYmxlLkdyaWRTZXR0aW5ncyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5ob3RJbnN0YW5jZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuaG90SW5zdGFuY2U/LnVwZGF0ZVNldHRpbmdzKG5ld1NldHRpbmdzLCBmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWVyZ2VzIHRoZSBwcm92aWRlZCBIYW5kc29udGFibGUgZ3JpZCBzZXR0aW5ncyB3aXRoIHRoZSBnbG9iYWwgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgcmV0cmlldmVzIHRoZSBnbG9iYWwgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBIb3RDb25maWdTZXJ2aWNlIGFuZCBuZWdvdGlhdGVzIHRoZSBmaW5hbFxuICAgKiBIYW5kc29udGFibGUgc2V0dGluZ3MgYnkgZ2l2aW5nIHByZWNlZGVuY2UgdG8gdGhlIHByb3ZpZGVkIHNldHRpbmdzLlxuICAgKiBBZGRpdGlvbmFsbHksIHRoZSBgbGF5b3V0RGlyZWN0aW9uYCBpcyBvbmx5IG1lcmdlZCBpZiB0aGUgSGFuZHNvbnRhYmxlIGluc3RhbmNlIGhhcyBub3QgeWV0IGJlZW4gaW5pdGlhbGl6ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBzZXR0aW5ncyAtIFRoZSBncmlkIHNldHRpbmdzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIG9yIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIGZpbmFsIG5lZ290aWF0ZWQgZ3JpZCBzZXR0aW5ncyBhZnRlciBtZXJnaW5nIHdpdGggZ2xvYmFsIGRlZmF1bHRzLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXROZWdvdGlhdGVkU2V0dGluZ3Moc2V0dGluZ3M6IEhhbmRzb250YWJsZS5HcmlkU2V0dGluZ3MpOiBIYW5kc29udGFibGUuR3JpZFNldHRpbmdzIHtcbiAgICBjb25zdCBob3RDb25maWcgPSB0aGlzLl9ob3RDb25maWcuZ2V0Q29uZmlnKCk7XG4gICAgY29uc3QgbmVnb3RpYXRlZFNldHRpbmdzOiBIYW5kc29udGFibGUuR3JpZFNldHRpbmdzID0ge31cblxuICAgIG5lZ290aWF0ZWRTZXR0aW5ncy5saWNlbnNlS2V5ID0gc2V0dGluZ3MubGljZW5zZUtleSA/PyBob3RDb25maWcubGljZW5zZTtcbiAgICBuZWdvdGlhdGVkU2V0dGluZ3MudGhlbWVOYW1lID0gc2V0dGluZ3MudGhlbWVOYW1lID8/IGhvdENvbmZpZy50aGVtZU5hbWU7XG4gICAgbmVnb3RpYXRlZFNldHRpbmdzLmxhbmd1YWdlID0gc2V0dGluZ3MubGFuZ3VhZ2UgPz8gaG90Q29uZmlnLmxhbmd1YWdlO1xuXG4gICAgLy8gc2V0dGluZ3MgdGhhdCBjYW4gYmUgc2V0IG9ubHkgYmVmb3JlIHRoZSBIYW5kc29udGFibGUgaW5zdGFuY2UgaXMgaW5pdGlhbGl6ZWRcbiAgICBpZiAoIXRoaXMuX19ob3RJbnN0YW5jZSkge1xuICAgICAgbmVnb3RpYXRlZFNldHRpbmdzLmxheW91dERpcmVjdGlvbiA9IHNldHRpbmdzLmxheW91dERpcmVjdGlvbiA/PyBob3RDb25maWcubGF5b3V0RGlyZWN0aW9uO1xuICAgIH1cblxuICAgIHJldHVybiBuZWdvdGlhdGVkU2V0dGluZ3M7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { HotTableComponent } from './hot-table.component';
|
|
3
|
+
import { CustomEditorPlaceholderComponent } from './editor/custom-editor-placeholder.component';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class HotTableModule {
|
|
6
|
+
static version = '0.0.0-next-7e304b5-20250401';
|
|
7
|
+
constructor() { }
|
|
8
|
+
static forRoot() {
|
|
9
|
+
return {
|
|
10
|
+
ngModule: HotTableModule,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HotTableModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
14
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: HotTableModule, declarations: [HotTableComponent, CustomEditorPlaceholderComponent], exports: [HotTableComponent] });
|
|
15
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HotTableModule });
|
|
16
|
+
}
|
|
17
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HotTableModule, decorators: [{
|
|
18
|
+
type: NgModule,
|
|
19
|
+
args: [{
|
|
20
|
+
declarations: [HotTableComponent, CustomEditorPlaceholderComponent],
|
|
21
|
+
imports: [],
|
|
22
|
+
exports: [HotTableComponent],
|
|
23
|
+
}]
|
|
24
|
+
}], ctorParameters: function () { return []; } });
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG90LXRhYmxlLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2hvdC10YWJsZS9zcmMvbGliL2hvdC10YWJsZS5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBdUIsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sOENBQThDLENBQUM7O0FBT2hHLE1BQU0sT0FBTyxjQUFjO0lBQ3pCLE1BQU0sQ0FBQyxPQUFPLEdBQUcsNkJBQTZCLENBQUM7SUFFL0MsZ0JBQWUsQ0FBQztJQUVULE1BQU0sQ0FBQyxPQUFPO1FBQ25CLE9BQU87WUFDTCxRQUFRLEVBQUUsY0FBYztTQUN6QixDQUFDO0lBQ0osQ0FBQzt3R0FUVSxjQUFjO3lHQUFkLGNBQWMsaUJBSlYsaUJBQWlCLEVBQUUsZ0NBQWdDLGFBRXhELGlCQUFpQjt5R0FFaEIsY0FBYzs7NEZBQWQsY0FBYztrQkFMMUIsUUFBUTttQkFBQztvQkFDUixZQUFZLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxnQ0FBZ0MsQ0FBQztvQkFDbkUsT0FBTyxFQUFFLEVBQUU7b0JBQ1gsT0FBTyxFQUFFLENBQUMsaUJBQWlCLENBQUM7aUJBQzdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUsIE1vZHVsZVdpdGhQcm92aWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEhvdFRhYmxlQ29tcG9uZW50IH0gZnJvbSAnLi9ob3QtdGFibGUuY29tcG9uZW50JztcbmltcG9ydCB7IEN1c3RvbUVkaXRvclBsYWNlaG9sZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9lZGl0b3IvY3VzdG9tLWVkaXRvci1wbGFjZWhvbGRlci5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtIb3RUYWJsZUNvbXBvbmVudCwgQ3VzdG9tRWRpdG9yUGxhY2Vob2xkZXJDb21wb25lbnRdLFxuICBpbXBvcnRzOiBbXSxcbiAgZXhwb3J0czogW0hvdFRhYmxlQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgSG90VGFibGVNb2R1bGUge1xuICBzdGF0aWMgdmVyc2lvbiA9ICcwLjAuMC1uZXh0LTdlMzA0YjUtMjAyNTA0MDEnO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBwdWJsaWMgc3RhdGljIGZvclJvb3QoKTogTW9kdWxlV2l0aFByb3ZpZGVyczxIb3RUYWJsZU1vZHVsZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBuZ01vZHVsZTogSG90VGFibGVNb2R1bGUsXG4gICAgfTtcbiAgfVxufVxuIl19
|