@jspreadsheet/angular 12.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +78 -0
- package/dist/esm2022/jspreadsheet-angular.mjs +5 -0
- package/dist/esm2022/lib/jspreadsheet.component.mjs +233 -0
- package/dist/esm2022/public-api.mjs +5 -0
- package/dist/fesm2022/jspreadsheet-angular.mjs +244 -0
- package/dist/index.d.ts +5 -0
- package/dist/lib/jspreadsheet.component.d.ts +58 -0
- package/dist/public-api.d.ts +1 -0
- package/package.json +45 -0
package/README.md
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Jspreadsheet Angular
|
|
2
|
+
|
|
3
|
+
Official Angular wrapper for [Jspreadsheet](https://jspreadsheet.com), an extensive JavaScript library to create web-based applications with spreadsheet-like controls.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @jspreadsheet/angular
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Add the styles to your `angular.json`:
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
"styles": [
|
|
15
|
+
"node_modules/jsuites/dist/jsuites.css",
|
|
16
|
+
"node_modules/jspreadsheet/dist/jspreadsheet.css"
|
|
17
|
+
]
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Quick start
|
|
21
|
+
|
|
22
|
+
The wrapper is an uncontrolled component: the `[options]` inputs configure the
|
|
23
|
+
spreadsheet on creation, the worksheet `[data]` input is reactive (a new array
|
|
24
|
+
reference is applied with `setData`), and everything else at runtime goes
|
|
25
|
+
through the instance API.
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
import { Component, ViewChild } from '@angular/core';
|
|
29
|
+
import { Spreadsheet, Worksheet, jspreadsheet } from '@jspreadsheet/angular';
|
|
30
|
+
|
|
31
|
+
jspreadsheet.setLicense('your-license-key');
|
|
32
|
+
|
|
33
|
+
@Component({
|
|
34
|
+
selector: 'app-root',
|
|
35
|
+
standalone: true,
|
|
36
|
+
imports: [Spreadsheet, Worksheet],
|
|
37
|
+
template: `
|
|
38
|
+
<jss-spreadsheet #ss [options]="options">
|
|
39
|
+
<jss-worksheet [options]="{ minDimensions: [6, 6] }" [data]="data"></jss-worksheet>
|
|
40
|
+
</jss-spreadsheet>
|
|
41
|
+
`
|
|
42
|
+
})
|
|
43
|
+
export class AppComponent {
|
|
44
|
+
@ViewChild('ss') ss!: Spreadsheet;
|
|
45
|
+
|
|
46
|
+
data = [['Hello', 'World']];
|
|
47
|
+
|
|
48
|
+
options = {
|
|
49
|
+
tabs: true,
|
|
50
|
+
// Event handlers always call your latest method
|
|
51
|
+
onafterchanges: () => {
|
|
52
|
+
console.log('Changed');
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
someMethod() {
|
|
57
|
+
// Runtime updates go through the instance API
|
|
58
|
+
this.ss.worksheets?.[0].setValue('A1', 'New value');
|
|
59
|
+
// The spreadsheet instance
|
|
60
|
+
console.log(this.ss.spreadsheet);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## The three rules
|
|
66
|
+
|
|
67
|
+
1. **Uncontrolled component** — jspreadsheet owns the DOM and the state after creation.
|
|
68
|
+
2. **Options are applied on creation only** — except the worksheet `[data]` input, which is reactive on reference change.
|
|
69
|
+
3. **The instance API is the runtime interface** — get it from the component: `ss.worksheets` (worksheet instances) and `ss.spreadsheet` (spreadsheet instance).
|
|
70
|
+
|
|
71
|
+
## Documentation
|
|
72
|
+
|
|
73
|
+
- [Angular Spreadsheet](https://jspreadsheet.com/docs/angular)
|
|
74
|
+
- [Documentation](https://jspreadsheet.com/docs)
|
|
75
|
+
|
|
76
|
+
## License
|
|
77
|
+
|
|
78
|
+
This wrapper is distributed under the MIT license. Jspreadsheet Pro requires a [commercial license](https://jspreadsheet.com/pricing).
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNwcmVhZHNoZWV0LWFuZ3VsYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvanNwcmVhZHNoZWV0LWFuZ3VsYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { Component, Directive, Input, ViewChild, ContentChildren, Inject, Optional, forwardRef, PLATFORM_ID, isDevMode, } from '@angular/core';
|
|
2
|
+
import { isPlatformBrowser } from '@angular/common';
|
|
3
|
+
import jspreadsheet from 'jspreadsheet';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
// Replace every function option by a proxy that calls the latest version of
|
|
6
|
+
// the handler, so events never see stale values from the initialization.
|
|
7
|
+
// Handlers run inside the Angular zone, so change detection always follows,
|
|
8
|
+
// even when jspreadsheet fires the event from outside the zone
|
|
9
|
+
const bindHandlers = function (options, getLatest, zone) {
|
|
10
|
+
for (const key in options) {
|
|
11
|
+
if (typeof options[key] === 'function') {
|
|
12
|
+
const name = key;
|
|
13
|
+
options[name] = function () {
|
|
14
|
+
const latest = getLatest();
|
|
15
|
+
const handler = latest ? latest[name] : null;
|
|
16
|
+
if (typeof handler === 'function') {
|
|
17
|
+
const self = this;
|
|
18
|
+
const args = arguments;
|
|
19
|
+
return zone.run(function () {
|
|
20
|
+
return handler.apply(self, args);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
return undefined;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
// Shallow clone the rows so jspreadsheet does not mutate the consumer state
|
|
29
|
+
const cloneData = function (data) {
|
|
30
|
+
if (!Array.isArray(data)) {
|
|
31
|
+
return data;
|
|
32
|
+
}
|
|
33
|
+
return data.map(function (row) {
|
|
34
|
+
if (Array.isArray(row)) {
|
|
35
|
+
return [...row];
|
|
36
|
+
}
|
|
37
|
+
if (row && typeof row === 'object') {
|
|
38
|
+
return { ...row };
|
|
39
|
+
}
|
|
40
|
+
return row;
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
export class Worksheet {
|
|
44
|
+
constructor(parent) {
|
|
45
|
+
this.parent = parent;
|
|
46
|
+
/** Worksheet options, from the core library */
|
|
47
|
+
this.options = {};
|
|
48
|
+
}
|
|
49
|
+
ngOnChanges(changes) {
|
|
50
|
+
if (changes['data'] && !changes['data'].firstChange && this.parent) {
|
|
51
|
+
this.parent.applyWorksheetData(this);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: Worksheet, deps: [{ token: forwardRef(() => Spreadsheet), optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
55
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: Worksheet, isStandalone: true, selector: "jss-worksheet", inputs: { options: "options", data: "data" }, usesOnChanges: true, ngImport: i0 }); }
|
|
56
|
+
}
|
|
57
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: Worksheet, decorators: [{
|
|
58
|
+
type: Directive,
|
|
59
|
+
args: [{
|
|
60
|
+
selector: 'jss-worksheet',
|
|
61
|
+
standalone: true,
|
|
62
|
+
}]
|
|
63
|
+
}], ctorParameters: () => [{ type: Spreadsheet, decorators: [{
|
|
64
|
+
type: Optional
|
|
65
|
+
}, {
|
|
66
|
+
type: Inject,
|
|
67
|
+
args: [forwardRef(() => Spreadsheet)]
|
|
68
|
+
}] }], propDecorators: { options: [{
|
|
69
|
+
type: Input
|
|
70
|
+
}], data: [{
|
|
71
|
+
type: Input
|
|
72
|
+
}] } });
|
|
73
|
+
export class Spreadsheet {
|
|
74
|
+
constructor(platformId, zone) {
|
|
75
|
+
this.zone = zone;
|
|
76
|
+
/** Spreadsheet options, from the core library. Applied on creation only */
|
|
77
|
+
this.options = {};
|
|
78
|
+
/** Worksheet instances created by jspreadsheet */
|
|
79
|
+
this.worksheets = null;
|
|
80
|
+
this.appliedData = [];
|
|
81
|
+
this.numOfWorksheets = 0;
|
|
82
|
+
this.warnedNumOfWorksheets = false;
|
|
83
|
+
this.subscription = null;
|
|
84
|
+
this.isBrowser = isPlatformBrowser(platformId);
|
|
85
|
+
}
|
|
86
|
+
/** The spreadsheet instance */
|
|
87
|
+
get spreadsheet() {
|
|
88
|
+
return this.worksheets && this.worksheets[0] ? this.worksheets[0].parent : null;
|
|
89
|
+
}
|
|
90
|
+
/** The container element */
|
|
91
|
+
get element() {
|
|
92
|
+
return this.container.nativeElement;
|
|
93
|
+
}
|
|
94
|
+
ngAfterViewInit() {
|
|
95
|
+
if (!this.isBrowser) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const self = this;
|
|
99
|
+
// License and extensions
|
|
100
|
+
if (this.license) {
|
|
101
|
+
jspreadsheet.setLicense(this.license);
|
|
102
|
+
}
|
|
103
|
+
if (this.extensions) {
|
|
104
|
+
jspreadsheet.setExtensions(this.extensions);
|
|
105
|
+
}
|
|
106
|
+
// Spreadsheet options
|
|
107
|
+
const options = { ...(this.options || {}) };
|
|
108
|
+
bindHandlers(options, function () {
|
|
109
|
+
return self.options;
|
|
110
|
+
}, this.zone);
|
|
111
|
+
// Worksheets come from the <jss-worksheet> children, unless defined explicitly
|
|
112
|
+
const directives = this.worksheetDirectives.toArray();
|
|
113
|
+
if (!options['worksheets']) {
|
|
114
|
+
options['worksheets'] = directives.map(function (directive, index) {
|
|
115
|
+
const worksheet = { minDimensions: [10, 10], ...(directive.options || {}) };
|
|
116
|
+
if (typeof directive.data !== 'undefined') {
|
|
117
|
+
worksheet['data'] = directive.data;
|
|
118
|
+
}
|
|
119
|
+
bindHandlers(worksheet, function () {
|
|
120
|
+
const current = self.worksheetDirectives.toArray()[index];
|
|
121
|
+
return current ? current.options : null;
|
|
122
|
+
}, self.zone);
|
|
123
|
+
return worksheet;
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
// Track what was applied, to detect changes later
|
|
127
|
+
this.appliedData = directives.map(function (directive) {
|
|
128
|
+
return directive.data;
|
|
129
|
+
});
|
|
130
|
+
this.numOfWorksheets = directives.length;
|
|
131
|
+
// Create the spreadsheet
|
|
132
|
+
this.worksheets = jspreadsheet(this.container.nativeElement, options);
|
|
133
|
+
// Adding or removing worksheets after the creation is not supported
|
|
134
|
+
this.subscription = this.worksheetDirectives.changes.subscribe(function () {
|
|
135
|
+
if (isDevMode() && !self.warnedNumOfWorksheets && self.worksheetDirectives.length !== self.numOfWorksheets) {
|
|
136
|
+
self.warnedNumOfWorksheets = true;
|
|
137
|
+
console.warn('Jspreadsheet: the number of <jss-worksheet> children changed after initialization and was ignored. Use createWorksheet/deleteWorksheet on the instance instead.');
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
/** Apply a new data reference coming from a <jss-worksheet> input */
|
|
142
|
+
applyWorksheetData(directive) {
|
|
143
|
+
if (!this.worksheets) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const index = this.worksheetDirectives.toArray().indexOf(directive);
|
|
147
|
+
const instance = this.worksheets[index];
|
|
148
|
+
if (instance && typeof directive.data !== 'undefined' && this.appliedData[index] !== directive.data) {
|
|
149
|
+
this.appliedData[index] = directive.data;
|
|
150
|
+
instance.setData(cloneData(directive.data));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
ngOnDestroy() {
|
|
154
|
+
if (this.subscription) {
|
|
155
|
+
this.subscription.unsubscribe();
|
|
156
|
+
this.subscription = null;
|
|
157
|
+
}
|
|
158
|
+
if (this.isBrowser && this.worksheets) {
|
|
159
|
+
jspreadsheet.destroy(this.container.nativeElement);
|
|
160
|
+
this.worksheets = null;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: Spreadsheet, deps: [{ token: PLATFORM_ID }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
164
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: Spreadsheet, isStandalone: true, selector: "jss-spreadsheet", inputs: { options: "options", license: "license", extensions: "extensions" }, queries: [{ propertyName: "worksheetDirectives", predicate: Worksheet }], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, static: true }], ngImport: i0, template: '<div #container></div>', isInline: true }); }
|
|
165
|
+
}
|
|
166
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: Spreadsheet, decorators: [{
|
|
167
|
+
type: Component,
|
|
168
|
+
args: [{
|
|
169
|
+
selector: 'jss-spreadsheet',
|
|
170
|
+
standalone: true,
|
|
171
|
+
template: '<div #container></div>',
|
|
172
|
+
}]
|
|
173
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
174
|
+
type: Inject,
|
|
175
|
+
args: [PLATFORM_ID]
|
|
176
|
+
}] }, { type: i0.NgZone }], propDecorators: { container: [{
|
|
177
|
+
type: ViewChild,
|
|
178
|
+
args: ['container', { static: true }]
|
|
179
|
+
}], worksheetDirectives: [{
|
|
180
|
+
type: ContentChildren,
|
|
181
|
+
args: [Worksheet]
|
|
182
|
+
}], options: [{
|
|
183
|
+
type: Input
|
|
184
|
+
}], license: [{
|
|
185
|
+
type: Input
|
|
186
|
+
}], extensions: [{
|
|
187
|
+
type: Input
|
|
188
|
+
}] } });
|
|
189
|
+
export class Picker {
|
|
190
|
+
constructor(platformId, zone) {
|
|
191
|
+
this.zone = zone;
|
|
192
|
+
/** Picker options, from the core library. Applied on creation only */
|
|
193
|
+
this.options = {};
|
|
194
|
+
/** Picker instance */
|
|
195
|
+
this.current = null;
|
|
196
|
+
this.isBrowser = isPlatformBrowser(platformId);
|
|
197
|
+
}
|
|
198
|
+
ngAfterViewInit() {
|
|
199
|
+
if (!this.isBrowser) {
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
const self = this;
|
|
203
|
+
const options = { ...(this.options || {}) };
|
|
204
|
+
bindHandlers(options, function () {
|
|
205
|
+
return self.options;
|
|
206
|
+
}, this.zone);
|
|
207
|
+
this.current = jspreadsheet.picker(this.container.nativeElement, options);
|
|
208
|
+
}
|
|
209
|
+
ngOnDestroy() {
|
|
210
|
+
// The picker has no destroy method; just release the reference
|
|
211
|
+
this.current = null;
|
|
212
|
+
}
|
|
213
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: Picker, deps: [{ token: PLATFORM_ID }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
214
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: Picker, isStandalone: true, selector: "jss-picker", inputs: { options: "options" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, static: true }], ngImport: i0, template: '<div #container></div>', isInline: true }); }
|
|
215
|
+
}
|
|
216
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: Picker, decorators: [{
|
|
217
|
+
type: Component,
|
|
218
|
+
args: [{
|
|
219
|
+
selector: 'jss-picker',
|
|
220
|
+
standalone: true,
|
|
221
|
+
template: '<div #container></div>',
|
|
222
|
+
}]
|
|
223
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
224
|
+
type: Inject,
|
|
225
|
+
args: [PLATFORM_ID]
|
|
226
|
+
}] }, { type: i0.NgZone }], propDecorators: { container: [{
|
|
227
|
+
type: ViewChild,
|
|
228
|
+
args: ['container', { static: true }]
|
|
229
|
+
}], options: [{
|
|
230
|
+
type: Input
|
|
231
|
+
}] } });
|
|
232
|
+
export { jspreadsheet };
|
|
233
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNwcmVhZHNoZWV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvanNwcmVhZHNoZWV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULFNBQVMsRUFDVCxLQUFLLEVBRUwsU0FBUyxFQUNULGVBQWUsRUFNZixNQUFNLEVBQ04sUUFBUSxFQUNSLFVBQVUsRUFDVixXQUFXLEVBRVgsU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sWUFBWSxNQUFNLGNBQWMsQ0FBQzs7QUFHeEMsNEVBQTRFO0FBQzVFLHlFQUF5RTtBQUN6RSw0RUFBNEU7QUFDNUUsK0RBQStEO0FBQy9ELE1BQU0sWUFBWSxHQUFHLFVBQVMsT0FBNEIsRUFBRSxTQUF1RCxFQUFFLElBQVk7SUFDN0gsS0FBSyxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUN4QixJQUFJLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQztZQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUc7Z0JBQ1osTUFBTSxNQUFNLEdBQUcsU0FBUyxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQzdDLElBQUksT0FBTyxPQUFPLEtBQUssVUFBVSxFQUFFLENBQUM7b0JBQ2hDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztvQkFDbEIsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDO29CQUN2QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7d0JBQ1osT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDckMsQ0FBQyxDQUFDLENBQUM7Z0JBQ1AsQ0FBQztnQkFDRCxPQUFPLFNBQVMsQ0FBQztZQUNyQixDQUFDLENBQUM7UUFDTixDQUFDO0lBQ0wsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLDRFQUE0RTtBQUM1RSxNQUFNLFNBQVMsR0FBRyxVQUFTLElBQVM7SUFDaEMsSUFBSSxDQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVMsR0FBUTtRQUM3QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQixPQUFPLENBQUUsR0FBRyxHQUFHLENBQUUsQ0FBQztRQUN0QixDQUFDO1FBQ0QsSUFBSSxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDakMsT0FBTyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDdEIsQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUM7QUFNRixNQUFNLE9BQU8sU0FBUztJQU1sQixZQUF1RSxNQUEwQjtRQUExQixXQUFNLEdBQU4sTUFBTSxDQUFvQjtRQUxqRywrQ0FBK0M7UUFDdEMsWUFBTyxHQUEyQixFQUFFLENBQUM7SUFLOUMsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUM5QixJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xFLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsQ0FBQztJQUNMLENBQUM7K0dBYlEsU0FBUyxrQkFNYyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDO21HQU5wRCxTQUFTOzs0RkFBVCxTQUFTO2tCQUpyQixTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxlQUFlO29CQUN6QixVQUFVLEVBQUUsSUFBSTtpQkFDbkI7OzBCQU9nQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUM7eUNBSnBELE9BQU87c0JBQWYsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7O0FBaUJWLE1BQU0sT0FBTyxXQUFXO0lBb0JwQixZQUFpQyxVQUFrQixFQUFVLElBQVk7UUFBWixTQUFJLEdBQUosSUFBSSxDQUFRO1FBaEJ6RSwyRUFBMkU7UUFDbEUsWUFBTyxHQUE2QixFQUFFLENBQUM7UUFNaEQsa0RBQWtEO1FBQ2xELGVBQVUsR0FBNEMsSUFBSSxDQUFDO1FBRW5ELGdCQUFXLEdBQVUsRUFBRSxDQUFDO1FBQ3hCLG9CQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLDBCQUFxQixHQUFHLEtBQUssQ0FBQztRQUM5QixpQkFBWSxHQUF3QixJQUFJLENBQUM7UUFJN0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsK0JBQStCO0lBQy9CLElBQUksV0FBVztRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3BGLENBQUM7SUFFRCw0QkFBNEI7SUFDNUIsSUFBSSxPQUFPO1FBQ1AsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQztJQUN4QyxDQUFDO0lBRUQsZUFBZTtRQUNYLElBQUksQ0FBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsT0FBTztRQUNYLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbEIseUJBQXlCO1FBQ3pCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2YsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsT0FBaUIsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixZQUFZLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQ0Qsc0JBQXNCO1FBQ3RCLE1BQU0sT0FBTyxHQUF3QixFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDakUsWUFBWSxDQUFDLE9BQU8sRUFBRTtZQUNsQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDeEIsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNkLCtFQUErRTtRQUMvRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQzFCLE9BQU8sQ0FBQyxZQUFZLENBQUMsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLFVBQVMsU0FBUyxFQUFFLEtBQUs7Z0JBQzVELE1BQU0sU0FBUyxHQUF3QixFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNqRyxJQUFJLE9BQU8sU0FBUyxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUUsQ0FBQztvQkFDeEMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7Z0JBQ3ZDLENBQUM7Z0JBQ0QsWUFBWSxDQUFDLFNBQVMsRUFBRTtvQkFDcEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUMxRCxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUM1QyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNkLE9BQU8sU0FBUyxDQUFDO1lBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztRQUNELGtEQUFrRDtRQUNsRCxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBUyxTQUFTO1lBQ2hELE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxlQUFlLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUN6Qyx5QkFBeUI7UUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsT0FBbUMsQ0FBQyxDQUFDO1FBQ2xHLG9FQUFvRTtRQUNwRSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1lBQzNELElBQUksU0FBUyxFQUFFLElBQUksQ0FBRSxJQUFJLENBQUMscUJBQXFCLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQzFHLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7Z0JBQ2xDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUtBQWlLLENBQUMsQ0FBQztZQUNwTCxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLGtCQUFrQixDQUFDLFNBQW9CO1FBQ25DLElBQUksQ0FBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsT0FBTztRQUNYLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEMsSUFBSSxRQUFRLElBQUksT0FBTyxTQUFTLENBQUMsSUFBSSxLQUFLLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDekMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDaEQsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUM3QixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDbkQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDM0IsQ0FBQztJQUNMLENBQUM7K0dBeEdRLFdBQVcsa0JBb0JBLFdBQVc7bUdBcEJ0QixXQUFXLDZMQUVILFNBQVMsbUpBSmhCLHdCQUF3Qjs7NEZBRXpCLFdBQVc7a0JBTHZCLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRSx3QkFBd0I7aUJBQ3JDOzswQkFxQmdCLE1BQU07MkJBQUMsV0FBVzs4REFuQlcsU0FBUztzQkFBbEQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNaLG1CQUFtQjtzQkFBOUMsZUFBZTt1QkFBQyxTQUFTO2dCQUdqQixPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7O0FBdUdWLE1BQU0sT0FBTyxNQUFNO0lBV2YsWUFBaUMsVUFBa0IsRUFBVSxJQUFZO1FBQVosU0FBSSxHQUFKLElBQUksQ0FBUTtRQVJ6RSxzRUFBc0U7UUFDN0QsWUFBTyxHQUErQixFQUFnQyxDQUFDO1FBRWhGLHNCQUFzQjtRQUN0QixZQUFPLEdBQVEsSUFBSSxDQUFDO1FBS2hCLElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELGVBQWU7UUFDWCxJQUFJLENBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLE9BQU87UUFDWCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLE1BQU0sT0FBTyxHQUF3QixFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDakUsWUFBWSxDQUFDLE9BQU8sRUFBRTtZQUNsQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDeEIsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxPQUFxQyxDQUFDLENBQUM7SUFDNUcsQ0FBQztJQUVELFdBQVc7UUFDUCwrREFBK0Q7UUFDL0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDeEIsQ0FBQzsrR0E5QlEsTUFBTSxrQkFXSyxXQUFXO21HQVh0QixNQUFNLDROQUZMLHdCQUF3Qjs7NEZBRXpCLE1BQU07a0JBTGxCLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLFlBQVk7b0JBQ3RCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsd0JBQXdCO2lCQUNyQzs7MEJBWWdCLE1BQU07MkJBQUMsV0FBVzs4REFWVyxTQUFTO3NCQUFsRCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRy9CLE9BQU87c0JBQWYsS0FBSzs7QUE2QlYsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgRGlyZWN0aXZlLFxuICAgIElucHV0LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBRdWVyeUxpc3QsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgSW5qZWN0LFxuICAgIE9wdGlvbmFsLFxuICAgIGZvcndhcmRSZWYsXG4gICAgUExBVEZPUk1fSUQsXG4gICAgTmdab25lLFxuICAgIGlzRGV2TW9kZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQganNwcmVhZHNoZWV0IGZyb20gJ2pzcHJlYWRzaGVldCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuLy8gUmVwbGFjZSBldmVyeSBmdW5jdGlvbiBvcHRpb24gYnkgYSBwcm94eSB0aGF0IGNhbGxzIHRoZSBsYXRlc3QgdmVyc2lvbiBvZlxuLy8gdGhlIGhhbmRsZXIsIHNvIGV2ZW50cyBuZXZlciBzZWUgc3RhbGUgdmFsdWVzIGZyb20gdGhlIGluaXRpYWxpemF0aW9uLlxuLy8gSGFuZGxlcnMgcnVuIGluc2lkZSB0aGUgQW5ndWxhciB6b25lLCBzbyBjaGFuZ2UgZGV0ZWN0aW9uIGFsd2F5cyBmb2xsb3dzLFxuLy8gZXZlbiB3aGVuIGpzcHJlYWRzaGVldCBmaXJlcyB0aGUgZXZlbnQgZnJvbSBvdXRzaWRlIHRoZSB6b25lXG5jb25zdCBiaW5kSGFuZGxlcnMgPSBmdW5jdGlvbihvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBnZXRMYXRlc3Q6ICgpID0+IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsIHwgdW5kZWZpbmVkLCB6b25lOiBOZ1pvbmUpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvcHRpb25zKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9uc1trZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0ga2V5O1xuICAgICAgICAgICAgb3B0aW9uc1tuYW1lXSA9IGZ1bmN0aW9uKHRoaXM6IHVua25vd24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXRlc3QgPSBnZXRMYXRlc3QoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gbGF0ZXN0ID8gbGF0ZXN0W25hbWVdIDogbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB6b25lLnJ1bihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4vLyBTaGFsbG93IGNsb25lIHRoZSByb3dzIHNvIGpzcHJlYWRzaGVldCBkb2VzIG5vdCBtdXRhdGUgdGhlIGNvbnN1bWVyIHN0YXRlXG5jb25zdCBjbG9uZURhdGEgPSBmdW5jdGlvbihkYXRhOiBhbnkpOiBhbnkge1xuICAgIGlmICghIEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIHJldHVybiBkYXRhLm1hcChmdW5jdGlvbihyb3c6IGFueSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyb3cpKSB7XG4gICAgICAgICAgICByZXR1cm4gWyAuLi5yb3cgXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocm93ICYmIHR5cGVvZiByb3cgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4geyAuLi5yb3cgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm93O1xuICAgIH0pO1xufTtcblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdqc3Mtd29ya3NoZWV0JyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBXb3Jrc2hlZXQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAgIC8qKiBXb3Jrc2hlZXQgb3B0aW9ucywgZnJvbSB0aGUgY29yZSBsaWJyYXJ5ICovXG4gICAgQElucHV0KCkgb3B0aW9uczoganNwcmVhZHNoZWV0LldvcmtzaGVldCA9IHt9O1xuICAgIC8qKiBXb3Jrc2hlZXQgZGF0YS4gUmVhY3RpdmU6IGEgbmV3IHJlZmVyZW5jZSBpcyBhcHBsaWVkIHdpdGggc2V0RGF0YSAqL1xuICAgIEBJbnB1dCgpIGRhdGE/OiBhbnlbXTtcblxuICAgIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBJbmplY3QoZm9yd2FyZFJlZigoKSA9PiBTcHJlYWRzaGVldCkpIHByaXZhdGUgcGFyZW50OiBTcHJlYWRzaGVldCB8IG51bGwpIHtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzWydkYXRhJ10gJiYgISBjaGFuZ2VzWydkYXRhJ10uZmlyc3RDaGFuZ2UgJiYgdGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50LmFwcGx5V29ya3NoZWV0RGF0YSh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdqc3Mtc3ByZWFkc2hlZXQnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGU6ICc8ZGl2ICNjb250YWluZXI+PC9kaXY+Jyxcbn0pXG5leHBvcnQgY2xhc3MgU3ByZWFkc2hlZXQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pIGNvbnRhaW5lciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICAgIEBDb250ZW50Q2hpbGRyZW4oV29ya3NoZWV0KSB3b3Jrc2hlZXREaXJlY3RpdmVzITogUXVlcnlMaXN0PFdvcmtzaGVldD47XG5cbiAgICAvKiogU3ByZWFkc2hlZXQgb3B0aW9ucywgZnJvbSB0aGUgY29yZSBsaWJyYXJ5LiBBcHBsaWVkIG9uIGNyZWF0aW9uIG9ubHkgKi9cbiAgICBASW5wdXQoKSBvcHRpb25zOiBqc3ByZWFkc2hlZXQuU3ByZWFkc2hlZXQgPSB7fTtcbiAgICAvKiogTGljZW5zZSBrZXkgKi9cbiAgICBASW5wdXQoKSBsaWNlbnNlPzogc3RyaW5nIHwgb2JqZWN0O1xuICAgIC8qKiBFeHRlbnNpb25zLiBFeGFtcGxlOiB7IGZvcm11bGEsIHBhcnNlciwgcmVuZGVyIH0gKi9cbiAgICBASW5wdXQoKSBleHRlbnNpb25zPzogb2JqZWN0O1xuXG4gICAgLyoqIFdvcmtzaGVldCBpbnN0YW5jZXMgY3JlYXRlZCBieSBqc3ByZWFkc2hlZXQgKi9cbiAgICB3b3Jrc2hlZXRzOiBqc3ByZWFkc2hlZXQud29ya3NoZWV0SW5zdGFuY2VbXSB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSBhcHBsaWVkRGF0YTogYW55W10gPSBbXTtcbiAgICBwcml2YXRlIG51bU9mV29ya3NoZWV0cyA9IDA7XG4gICAgcHJpdmF0ZSB3YXJuZWROdW1PZldvcmtzaGVldHMgPSBmYWxzZTtcbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBpc0Jyb3dzZXI6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KFBMQVRGT1JNX0lEKSBwbGF0Zm9ybUlkOiBvYmplY3QsIHByaXZhdGUgem9uZTogTmdab25lKSB7XG4gICAgICAgIHRoaXMuaXNCcm93c2VyID0gaXNQbGF0Zm9ybUJyb3dzZXIocGxhdGZvcm1JZCk7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBzcHJlYWRzaGVldCBpbnN0YW5jZSAqL1xuICAgIGdldCBzcHJlYWRzaGVldCgpOiBqc3ByZWFkc2hlZXQuc3ByZWFkc2hlZXRJbnN0YW5jZSB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy53b3Jrc2hlZXRzICYmIHRoaXMud29ya3NoZWV0c1swXSA/IHRoaXMud29ya3NoZWV0c1swXS5wYXJlbnQgOiBudWxsO1xuICAgIH1cblxuICAgIC8qKiBUaGUgY29udGFpbmVyIGVsZW1lbnQgKi9cbiAgICBnZXQgZWxlbWVudCgpOiBIVE1MRGl2RWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCEgdGhpcy5pc0Jyb3dzZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAgICAgLy8gTGljZW5zZSBhbmQgZXh0ZW5zaW9uc1xuICAgICAgICBpZiAodGhpcy5saWNlbnNlKSB7XG4gICAgICAgICAgICBqc3ByZWFkc2hlZXQuc2V0TGljZW5zZSh0aGlzLmxpY2Vuc2UgYXMgc3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5leHRlbnNpb25zKSB7XG4gICAgICAgICAgICBqc3ByZWFkc2hlZXQuc2V0RXh0ZW5zaW9ucyh0aGlzLmV4dGVuc2lvbnMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNwcmVhZHNoZWV0IG9wdGlvbnNcbiAgICAgICAgY29uc3Qgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHsgLi4uKHRoaXMub3B0aW9ucyB8fCB7fSkgfTtcbiAgICAgICAgYmluZEhhbmRsZXJzKG9wdGlvbnMsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGYub3B0aW9ucztcbiAgICAgICAgfSwgdGhpcy56b25lKTtcbiAgICAgICAgLy8gV29ya3NoZWV0cyBjb21lIGZyb20gdGhlIDxqc3Mtd29ya3NoZWV0PiBjaGlsZHJlbiwgdW5sZXNzIGRlZmluZWQgZXhwbGljaXRseVxuICAgICAgICBjb25zdCBkaXJlY3RpdmVzID0gdGhpcy53b3Jrc2hlZXREaXJlY3RpdmVzLnRvQXJyYXkoKTtcbiAgICAgICAgaWYgKCEgb3B0aW9uc1snd29ya3NoZWV0cyddKSB7XG4gICAgICAgICAgICBvcHRpb25zWyd3b3Jrc2hlZXRzJ10gPSBkaXJlY3RpdmVzLm1hcChmdW5jdGlvbihkaXJlY3RpdmUsIGluZGV4KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd29ya3NoZWV0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0geyBtaW5EaW1lbnNpb25zOiBbMTAsIDEwXSwgLi4uKGRpcmVjdGl2ZS5vcHRpb25zIHx8IHt9KSB9O1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGlyZWN0aXZlLmRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldFsnZGF0YSddID0gZGlyZWN0aXZlLmRhdGE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJpbmRIYW5kbGVycyh3b3Jrc2hlZXQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gc2VsZi53b3Jrc2hlZXREaXJlY3RpdmVzLnRvQXJyYXkoKVtpbmRleF07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50ID8gY3VycmVudC5vcHRpb25zIDogbnVsbDtcbiAgICAgICAgICAgICAgICB9LCBzZWxmLnpvbmUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB3b3Jrc2hlZXQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUcmFjayB3aGF0IHdhcyBhcHBsaWVkLCB0byBkZXRlY3QgY2hhbmdlcyBsYXRlclxuICAgICAgICB0aGlzLmFwcGxpZWREYXRhID0gZGlyZWN0aXZlcy5tYXAoZnVuY3Rpb24oZGlyZWN0aXZlKSB7XG4gICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlLmRhdGE7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm51bU9mV29ya3NoZWV0cyA9IGRpcmVjdGl2ZXMubGVuZ3RoO1xuICAgICAgICAvLyBDcmVhdGUgdGhlIHNwcmVhZHNoZWV0XG4gICAgICAgIHRoaXMud29ya3NoZWV0cyA9IGpzcHJlYWRzaGVldCh0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LCBvcHRpb25zIGFzIGpzcHJlYWRzaGVldC5TcHJlYWRzaGVldCk7XG4gICAgICAgIC8vIEFkZGluZyBvciByZW1vdmluZyB3b3Jrc2hlZXRzIGFmdGVyIHRoZSBjcmVhdGlvbiBpcyBub3Qgc3VwcG9ydGVkXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gdGhpcy53b3Jrc2hlZXREaXJlY3RpdmVzLmNoYW5nZXMuc3Vic2NyaWJlKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKGlzRGV2TW9kZSgpICYmICEgc2VsZi53YXJuZWROdW1PZldvcmtzaGVldHMgJiYgc2VsZi53b3Jrc2hlZXREaXJlY3RpdmVzLmxlbmd0aCAhPT0gc2VsZi5udW1PZldvcmtzaGVldHMpIHtcbiAgICAgICAgICAgICAgICBzZWxmLndhcm5lZE51bU9mV29ya3NoZWV0cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdKc3ByZWFkc2hlZXQ6IHRoZSBudW1iZXIgb2YgPGpzcy13b3Jrc2hlZXQ+IGNoaWxkcmVuIGNoYW5nZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gYW5kIHdhcyBpZ25vcmVkLiBVc2UgY3JlYXRlV29ya3NoZWV0L2RlbGV0ZVdvcmtzaGVldCBvbiB0aGUgaW5zdGFuY2UgaW5zdGVhZC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEFwcGx5IGEgbmV3IGRhdGEgcmVmZXJlbmNlIGNvbWluZyBmcm9tIGEgPGpzcy13b3Jrc2hlZXQ+IGlucHV0ICovXG4gICAgYXBwbHlXb3Jrc2hlZXREYXRhKGRpcmVjdGl2ZTogV29ya3NoZWV0KTogdm9pZCB7XG4gICAgICAgIGlmICghIHRoaXMud29ya3NoZWV0cykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy53b3Jrc2hlZXREaXJlY3RpdmVzLnRvQXJyYXkoKS5pbmRleE9mKGRpcmVjdGl2ZSk7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy53b3Jrc2hlZXRzW2luZGV4XTtcbiAgICAgICAgaWYgKGluc3RhbmNlICYmIHR5cGVvZiBkaXJlY3RpdmUuZGF0YSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5hcHBsaWVkRGF0YVtpbmRleF0gIT09IGRpcmVjdGl2ZS5kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGxpZWREYXRhW2luZGV4XSA9IGRpcmVjdGl2ZS5kYXRhO1xuICAgICAgICAgICAgaW5zdGFuY2Uuc2V0RGF0YShjbG9uZURhdGEoZGlyZWN0aXZlLmRhdGEpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNCcm93c2VyICYmIHRoaXMud29ya3NoZWV0cykge1xuICAgICAgICAgICAganNwcmVhZHNoZWV0LmRlc3Ryb3kodGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLndvcmtzaGVldHMgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2pzcy1waWNrZXInLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGU6ICc8ZGl2ICNjb250YWluZXI+PC9kaXY+Jyxcbn0pXG5leHBvcnQgY2xhc3MgUGlja2VyIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBAVmlld0NoaWxkKCdjb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBjb250YWluZXIhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcblxuICAgIC8qKiBQaWNrZXIgb3B0aW9ucywgZnJvbSB0aGUgY29yZSBsaWJyYXJ5LiBBcHBsaWVkIG9uIGNyZWF0aW9uIG9ubHkgKi9cbiAgICBASW5wdXQoKSBvcHRpb25zOiBqc3ByZWFkc2hlZXQuUGlja2VyT3B0aW9ucyA9IHt9IGFzIGpzcHJlYWRzaGVldC5QaWNrZXJPcHRpb25zO1xuXG4gICAgLyoqIFBpY2tlciBpbnN0YW5jZSAqL1xuICAgIGN1cnJlbnQ6IGFueSA9IG51bGw7XG5cbiAgICBwcml2YXRlIGlzQnJvd3NlcjogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoUExBVEZPUk1fSUQpIHBsYXRmb3JtSWQ6IG9iamVjdCwgcHJpdmF0ZSB6b25lOiBOZ1pvbmUpIHtcbiAgICAgICAgdGhpcy5pc0Jyb3dzZXIgPSBpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICghIHRoaXMuaXNCcm93c2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAgIGNvbnN0IG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7IC4uLih0aGlzLm9wdGlvbnMgfHwge30pIH07XG4gICAgICAgIGJpbmRIYW5kbGVycyhvcHRpb25zLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLm9wdGlvbnM7XG4gICAgICAgIH0sIHRoaXMuem9uZSk7XG4gICAgICAgIHRoaXMuY3VycmVudCA9IGpzcHJlYWRzaGVldC5waWNrZXIodGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudCwgb3B0aW9ucyBhcyBqc3ByZWFkc2hlZXQuUGlja2VyT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIC8vIFRoZSBwaWNrZXIgaGFzIG5vIGRlc3Ryb3kgbWV0aG9kOyBqdXN0IHJlbGVhc2UgdGhlIHJlZmVyZW5jZVxuICAgICAgICB0aGlzLmN1cnJlbnQgPSBudWxsO1xuICAgIH1cbn1cblxuZXhwb3J0IHsganNwcmVhZHNoZWV0IH07XG4iXX0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Public API Surface of @jspreadsheet/angular
|
|
3
|
+
*/
|
|
4
|
+
export { Spreadsheet, Worksheet, Picker, jspreadsheet } from './lib/jspreadsheet.component';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLDhCQUE4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBAanNwcmVhZHNoZWV0L2FuZ3VsYXJcbiAqL1xuXG5leHBvcnQgeyBTcHJlYWRzaGVldCwgV29ya3NoZWV0LCBQaWNrZXIsIGpzcHJlYWRzaGVldCB9IGZyb20gJy4vbGliL2pzcHJlYWRzaGVldC5jb21wb25lbnQnO1xuIl19
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { forwardRef, Input, Optional, Inject, Directive, isDevMode, PLATFORM_ID, ContentChildren, ViewChild, Component } from '@angular/core';
|
|
3
|
+
import { isPlatformBrowser } from '@angular/common';
|
|
4
|
+
import jspreadsheet from 'jspreadsheet';
|
|
5
|
+
export { default as jspreadsheet } from 'jspreadsheet';
|
|
6
|
+
|
|
7
|
+
// Replace every function option by a proxy that calls the latest version of
|
|
8
|
+
// the handler, so events never see stale values from the initialization.
|
|
9
|
+
// Handlers run inside the Angular zone, so change detection always follows,
|
|
10
|
+
// even when jspreadsheet fires the event from outside the zone
|
|
11
|
+
const bindHandlers = function (options, getLatest, zone) {
|
|
12
|
+
for (const key in options) {
|
|
13
|
+
if (typeof options[key] === 'function') {
|
|
14
|
+
const name = key;
|
|
15
|
+
options[name] = function () {
|
|
16
|
+
const latest = getLatest();
|
|
17
|
+
const handler = latest ? latest[name] : null;
|
|
18
|
+
if (typeof handler === 'function') {
|
|
19
|
+
const self = this;
|
|
20
|
+
const args = arguments;
|
|
21
|
+
return zone.run(function () {
|
|
22
|
+
return handler.apply(self, args);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return undefined;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
// Shallow clone the rows so jspreadsheet does not mutate the consumer state
|
|
31
|
+
const cloneData = function (data) {
|
|
32
|
+
if (!Array.isArray(data)) {
|
|
33
|
+
return data;
|
|
34
|
+
}
|
|
35
|
+
return data.map(function (row) {
|
|
36
|
+
if (Array.isArray(row)) {
|
|
37
|
+
return [...row];
|
|
38
|
+
}
|
|
39
|
+
if (row && typeof row === 'object') {
|
|
40
|
+
return { ...row };
|
|
41
|
+
}
|
|
42
|
+
return row;
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
class Worksheet {
|
|
46
|
+
constructor(parent) {
|
|
47
|
+
this.parent = parent;
|
|
48
|
+
/** Worksheet options, from the core library */
|
|
49
|
+
this.options = {};
|
|
50
|
+
}
|
|
51
|
+
ngOnChanges(changes) {
|
|
52
|
+
if (changes['data'] && !changes['data'].firstChange && this.parent) {
|
|
53
|
+
this.parent.applyWorksheetData(this);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: Worksheet, deps: [{ token: forwardRef(() => Spreadsheet), optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
57
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: Worksheet, isStandalone: true, selector: "jss-worksheet", inputs: { options: "options", data: "data" }, usesOnChanges: true, ngImport: i0 }); }
|
|
58
|
+
}
|
|
59
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: Worksheet, decorators: [{
|
|
60
|
+
type: Directive,
|
|
61
|
+
args: [{
|
|
62
|
+
selector: 'jss-worksheet',
|
|
63
|
+
standalone: true,
|
|
64
|
+
}]
|
|
65
|
+
}], ctorParameters: () => [{ type: Spreadsheet, decorators: [{
|
|
66
|
+
type: Optional
|
|
67
|
+
}, {
|
|
68
|
+
type: Inject,
|
|
69
|
+
args: [forwardRef(() => Spreadsheet)]
|
|
70
|
+
}] }], propDecorators: { options: [{
|
|
71
|
+
type: Input
|
|
72
|
+
}], data: [{
|
|
73
|
+
type: Input
|
|
74
|
+
}] } });
|
|
75
|
+
class Spreadsheet {
|
|
76
|
+
constructor(platformId, zone) {
|
|
77
|
+
this.zone = zone;
|
|
78
|
+
/** Spreadsheet options, from the core library. Applied on creation only */
|
|
79
|
+
this.options = {};
|
|
80
|
+
/** Worksheet instances created by jspreadsheet */
|
|
81
|
+
this.worksheets = null;
|
|
82
|
+
this.appliedData = [];
|
|
83
|
+
this.numOfWorksheets = 0;
|
|
84
|
+
this.warnedNumOfWorksheets = false;
|
|
85
|
+
this.subscription = null;
|
|
86
|
+
this.isBrowser = isPlatformBrowser(platformId);
|
|
87
|
+
}
|
|
88
|
+
/** The spreadsheet instance */
|
|
89
|
+
get spreadsheet() {
|
|
90
|
+
return this.worksheets && this.worksheets[0] ? this.worksheets[0].parent : null;
|
|
91
|
+
}
|
|
92
|
+
/** The container element */
|
|
93
|
+
get element() {
|
|
94
|
+
return this.container.nativeElement;
|
|
95
|
+
}
|
|
96
|
+
ngAfterViewInit() {
|
|
97
|
+
if (!this.isBrowser) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const self = this;
|
|
101
|
+
// License and extensions
|
|
102
|
+
if (this.license) {
|
|
103
|
+
jspreadsheet.setLicense(this.license);
|
|
104
|
+
}
|
|
105
|
+
if (this.extensions) {
|
|
106
|
+
jspreadsheet.setExtensions(this.extensions);
|
|
107
|
+
}
|
|
108
|
+
// Spreadsheet options
|
|
109
|
+
const options = { ...(this.options || {}) };
|
|
110
|
+
bindHandlers(options, function () {
|
|
111
|
+
return self.options;
|
|
112
|
+
}, this.zone);
|
|
113
|
+
// Worksheets come from the <jss-worksheet> children, unless defined explicitly
|
|
114
|
+
const directives = this.worksheetDirectives.toArray();
|
|
115
|
+
if (!options['worksheets']) {
|
|
116
|
+
options['worksheets'] = directives.map(function (directive, index) {
|
|
117
|
+
const worksheet = { minDimensions: [10, 10], ...(directive.options || {}) };
|
|
118
|
+
if (typeof directive.data !== 'undefined') {
|
|
119
|
+
worksheet['data'] = directive.data;
|
|
120
|
+
}
|
|
121
|
+
bindHandlers(worksheet, function () {
|
|
122
|
+
const current = self.worksheetDirectives.toArray()[index];
|
|
123
|
+
return current ? current.options : null;
|
|
124
|
+
}, self.zone);
|
|
125
|
+
return worksheet;
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
// Track what was applied, to detect changes later
|
|
129
|
+
this.appliedData = directives.map(function (directive) {
|
|
130
|
+
return directive.data;
|
|
131
|
+
});
|
|
132
|
+
this.numOfWorksheets = directives.length;
|
|
133
|
+
// Create the spreadsheet
|
|
134
|
+
this.worksheets = jspreadsheet(this.container.nativeElement, options);
|
|
135
|
+
// Adding or removing worksheets after the creation is not supported
|
|
136
|
+
this.subscription = this.worksheetDirectives.changes.subscribe(function () {
|
|
137
|
+
if (isDevMode() && !self.warnedNumOfWorksheets && self.worksheetDirectives.length !== self.numOfWorksheets) {
|
|
138
|
+
self.warnedNumOfWorksheets = true;
|
|
139
|
+
console.warn('Jspreadsheet: the number of <jss-worksheet> children changed after initialization and was ignored. Use createWorksheet/deleteWorksheet on the instance instead.');
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
/** Apply a new data reference coming from a <jss-worksheet> input */
|
|
144
|
+
applyWorksheetData(directive) {
|
|
145
|
+
if (!this.worksheets) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const index = this.worksheetDirectives.toArray().indexOf(directive);
|
|
149
|
+
const instance = this.worksheets[index];
|
|
150
|
+
if (instance && typeof directive.data !== 'undefined' && this.appliedData[index] !== directive.data) {
|
|
151
|
+
this.appliedData[index] = directive.data;
|
|
152
|
+
instance.setData(cloneData(directive.data));
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
ngOnDestroy() {
|
|
156
|
+
if (this.subscription) {
|
|
157
|
+
this.subscription.unsubscribe();
|
|
158
|
+
this.subscription = null;
|
|
159
|
+
}
|
|
160
|
+
if (this.isBrowser && this.worksheets) {
|
|
161
|
+
jspreadsheet.destroy(this.container.nativeElement);
|
|
162
|
+
this.worksheets = null;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: Spreadsheet, deps: [{ token: PLATFORM_ID }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
166
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: Spreadsheet, isStandalone: true, selector: "jss-spreadsheet", inputs: { options: "options", license: "license", extensions: "extensions" }, queries: [{ propertyName: "worksheetDirectives", predicate: Worksheet }], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, static: true }], ngImport: i0, template: '<div #container></div>', isInline: true }); }
|
|
167
|
+
}
|
|
168
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: Spreadsheet, decorators: [{
|
|
169
|
+
type: Component,
|
|
170
|
+
args: [{
|
|
171
|
+
selector: 'jss-spreadsheet',
|
|
172
|
+
standalone: true,
|
|
173
|
+
template: '<div #container></div>',
|
|
174
|
+
}]
|
|
175
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
176
|
+
type: Inject,
|
|
177
|
+
args: [PLATFORM_ID]
|
|
178
|
+
}] }, { type: i0.NgZone }], propDecorators: { container: [{
|
|
179
|
+
type: ViewChild,
|
|
180
|
+
args: ['container', { static: true }]
|
|
181
|
+
}], worksheetDirectives: [{
|
|
182
|
+
type: ContentChildren,
|
|
183
|
+
args: [Worksheet]
|
|
184
|
+
}], options: [{
|
|
185
|
+
type: Input
|
|
186
|
+
}], license: [{
|
|
187
|
+
type: Input
|
|
188
|
+
}], extensions: [{
|
|
189
|
+
type: Input
|
|
190
|
+
}] } });
|
|
191
|
+
class Picker {
|
|
192
|
+
constructor(platformId, zone) {
|
|
193
|
+
this.zone = zone;
|
|
194
|
+
/** Picker options, from the core library. Applied on creation only */
|
|
195
|
+
this.options = {};
|
|
196
|
+
/** Picker instance */
|
|
197
|
+
this.current = null;
|
|
198
|
+
this.isBrowser = isPlatformBrowser(platformId);
|
|
199
|
+
}
|
|
200
|
+
ngAfterViewInit() {
|
|
201
|
+
if (!this.isBrowser) {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
const self = this;
|
|
205
|
+
const options = { ...(this.options || {}) };
|
|
206
|
+
bindHandlers(options, function () {
|
|
207
|
+
return self.options;
|
|
208
|
+
}, this.zone);
|
|
209
|
+
this.current = jspreadsheet.picker(this.container.nativeElement, options);
|
|
210
|
+
}
|
|
211
|
+
ngOnDestroy() {
|
|
212
|
+
// The picker has no destroy method; just release the reference
|
|
213
|
+
this.current = null;
|
|
214
|
+
}
|
|
215
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: Picker, deps: [{ token: PLATFORM_ID }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
216
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: Picker, isStandalone: true, selector: "jss-picker", inputs: { options: "options" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, static: true }], ngImport: i0, template: '<div #container></div>', isInline: true }); }
|
|
217
|
+
}
|
|
218
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: Picker, decorators: [{
|
|
219
|
+
type: Component,
|
|
220
|
+
args: [{
|
|
221
|
+
selector: 'jss-picker',
|
|
222
|
+
standalone: true,
|
|
223
|
+
template: '<div #container></div>',
|
|
224
|
+
}]
|
|
225
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
226
|
+
type: Inject,
|
|
227
|
+
args: [PLATFORM_ID]
|
|
228
|
+
}] }, { type: i0.NgZone }], propDecorators: { container: [{
|
|
229
|
+
type: ViewChild,
|
|
230
|
+
args: ['container', { static: true }]
|
|
231
|
+
}], options: [{
|
|
232
|
+
type: Input
|
|
233
|
+
}] } });
|
|
234
|
+
|
|
235
|
+
/*
|
|
236
|
+
* Public API Surface of @jspreadsheet/angular
|
|
237
|
+
*/
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Generated bundle index. Do not edit.
|
|
241
|
+
*/
|
|
242
|
+
|
|
243
|
+
export { Picker, Spreadsheet, Worksheet };
|
|
244
|
+
//# sourceMappingURL=jspreadsheet-angular.mjs.map
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { ElementRef, QueryList, AfterViewInit, OnChanges, OnDestroy, SimpleChanges, NgZone } from '@angular/core';
|
|
2
|
+
import jspreadsheet from 'jspreadsheet';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class Worksheet implements OnChanges {
|
|
5
|
+
private parent;
|
|
6
|
+
/** Worksheet options, from the core library */
|
|
7
|
+
options: jspreadsheet.Worksheet;
|
|
8
|
+
/** Worksheet data. Reactive: a new reference is applied with setData */
|
|
9
|
+
data?: any[];
|
|
10
|
+
constructor(parent: Spreadsheet | null);
|
|
11
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
12
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<Worksheet, [{ optional: true; }]>;
|
|
13
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<Worksheet, "jss-worksheet", never, { "options": { "alias": "options"; "required": false; }; "data": { "alias": "data"; "required": false; }; }, {}, never, never, true, never>;
|
|
14
|
+
}
|
|
15
|
+
export declare class Spreadsheet implements AfterViewInit, OnDestroy {
|
|
16
|
+
private zone;
|
|
17
|
+
container: ElementRef<HTMLDivElement>;
|
|
18
|
+
worksheetDirectives: QueryList<Worksheet>;
|
|
19
|
+
/** Spreadsheet options, from the core library. Applied on creation only */
|
|
20
|
+
options: jspreadsheet.Spreadsheet;
|
|
21
|
+
/** License key */
|
|
22
|
+
license?: string | object;
|
|
23
|
+
/** Extensions. Example: { formula, parser, render } */
|
|
24
|
+
extensions?: object;
|
|
25
|
+
/** Worksheet instances created by jspreadsheet */
|
|
26
|
+
worksheets: jspreadsheet.worksheetInstance[] | null;
|
|
27
|
+
private appliedData;
|
|
28
|
+
private numOfWorksheets;
|
|
29
|
+
private warnedNumOfWorksheets;
|
|
30
|
+
private subscription;
|
|
31
|
+
private isBrowser;
|
|
32
|
+
constructor(platformId: object, zone: NgZone);
|
|
33
|
+
/** The spreadsheet instance */
|
|
34
|
+
get spreadsheet(): jspreadsheet.spreadsheetInstance | null;
|
|
35
|
+
/** The container element */
|
|
36
|
+
get element(): HTMLDivElement;
|
|
37
|
+
ngAfterViewInit(): void;
|
|
38
|
+
/** Apply a new data reference coming from a <jss-worksheet> input */
|
|
39
|
+
applyWorksheetData(directive: Worksheet): void;
|
|
40
|
+
ngOnDestroy(): void;
|
|
41
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<Spreadsheet, never>;
|
|
42
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<Spreadsheet, "jss-spreadsheet", never, { "options": { "alias": "options"; "required": false; }; "license": { "alias": "license"; "required": false; }; "extensions": { "alias": "extensions"; "required": false; }; }, {}, ["worksheetDirectives"], never, true, never>;
|
|
43
|
+
}
|
|
44
|
+
export declare class Picker implements AfterViewInit, OnDestroy {
|
|
45
|
+
private zone;
|
|
46
|
+
container: ElementRef<HTMLDivElement>;
|
|
47
|
+
/** Picker options, from the core library. Applied on creation only */
|
|
48
|
+
options: jspreadsheet.PickerOptions;
|
|
49
|
+
/** Picker instance */
|
|
50
|
+
current: any;
|
|
51
|
+
private isBrowser;
|
|
52
|
+
constructor(platformId: object, zone: NgZone);
|
|
53
|
+
ngAfterViewInit(): void;
|
|
54
|
+
ngOnDestroy(): void;
|
|
55
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<Picker, never>;
|
|
56
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<Picker, "jss-picker", never, { "options": { "alias": "options"; "required": false; }; }, {}, never, never, true, never>;
|
|
57
|
+
}
|
|
58
|
+
export { jspreadsheet };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Spreadsheet, Worksheet, Picker, jspreadsheet } from './lib/jspreadsheet.component';
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jspreadsheet/angular",
|
|
3
|
+
"title": "Jspreadsheet Pro Angular Wrapper",
|
|
4
|
+
"description": "Jspreadsheet is a lightweight, vanilla javascript plugin to create amazing web-based interactive tables and spreadsheets compatible with other spreadsheet software.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Contact <contact@jspreadsheet.com>",
|
|
7
|
+
"url": "https://jspreadsheet.com"
|
|
8
|
+
},
|
|
9
|
+
"keywords": [
|
|
10
|
+
"spreadsheet",
|
|
11
|
+
"spreadsheets",
|
|
12
|
+
"tables",
|
|
13
|
+
"table",
|
|
14
|
+
"excel",
|
|
15
|
+
"grid",
|
|
16
|
+
"grid-editor",
|
|
17
|
+
"data-table",
|
|
18
|
+
"data-grid",
|
|
19
|
+
"data-spreadsheet",
|
|
20
|
+
"angular"
|
|
21
|
+
],
|
|
22
|
+
"version": "12.7.0",
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"jspreadsheet": "^12.7.0",
|
|
25
|
+
"tslib": "^2.6.0"
|
|
26
|
+
},
|
|
27
|
+
"peerDependencies": {
|
|
28
|
+
"@angular/common": ">=17.0.0",
|
|
29
|
+
"@angular/core": ">=17.0.0"
|
|
30
|
+
},
|
|
31
|
+
"sideEffects": false,
|
|
32
|
+
"module": "dist/fesm2022/jspreadsheet-angular.mjs",
|
|
33
|
+
"typings": "dist/index.d.ts",
|
|
34
|
+
"exports": {
|
|
35
|
+
"./package.json": {
|
|
36
|
+
"default": "./package.json"
|
|
37
|
+
},
|
|
38
|
+
".": {
|
|
39
|
+
"types": "./dist/index.d.ts",
|
|
40
|
+
"esm2022": "./dist/esm2022/jspreadsheet-angular.mjs",
|
|
41
|
+
"esm": "./dist/esm2022/jspreadsheet-angular.mjs",
|
|
42
|
+
"default": "./dist/fesm2022/jspreadsheet-angular.mjs"
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|