@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 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNwcmVhZHNoZWV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvanNwcmVhZHNoZWV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULFNBQVMsRUFDVCxLQUFLLEVBRUwsU0FBUyxFQUNULGVBQWUsRUFNZixNQUFNLEVBQ04sUUFBUSxFQUNSLFVBQVUsRUFDVixXQUFXLEVBRVgsU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sWUFBWSxNQUFNLGNBQWMsQ0FBQzs7QUFHeEMsNEVBQTRFO0FBQzVFLHlFQUF5RTtBQUN6RSw0RUFBNEU7QUFDNUUsK0RBQStEO0FBQy9ELE1BQU0sWUFBWSxHQUFHLFVBQVMsT0FBNEIsRUFBRSxTQUF1RCxFQUFFLElBQVk7SUFDN0gsS0FBSyxNQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUN4QixJQUFJLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQztZQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUc7Z0JBQ1osTUFBTSxNQUFNLEdBQUcsU0FBUyxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7Z0JBQzdDLElBQUksT0FBTyxPQUFPLEtBQUssVUFBVSxFQUFFLENBQUM7b0JBQ2hDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQztvQkFDbEIsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDO29CQUN2QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7d0JBQ1osT0FBTyxPQUFPLENBQUMsS0FB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LFlBQVk7b0JBQ3RCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsd0JBQXdCO2lCQUNyQzs7MEJBWWdCLE1BQU07MkJBQUMsV0FBVzs4REFWVyxTQUFTO3NCQUFsRCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRy9CLE9BQU87c0JBQWYsS0FBSzs7QUE2QlYsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgRGlyZWN0aXZlLFxuICAgIElucHV0LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBRdWVyeUxpc3QsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgSW5qZWN0LFxuICAgIE9wdGlvbmFsLFxuICAgIGZvcndhcmRSZWYsXG4gICAgUExBVEZPUk1fSUQsXG4gICAgTmdab25lLFxuICAgIGlzRGV2TW9kZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQganNwcmVhZHNoZWV0IGZyb20gJ2pzcHJlYWRzaGVldCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuLy8gUmVwbGFjZSBldmVyeSBmdW5jdGlvbiBvcHRpb24gYnkgYSBwcm94eSB0aGF0IGNhbGxzIHRoZSBsYXRlc3QgdmVyc2lvbiBvZlxuLy8gdGhlIGhhbmRsZXIsIHNvIGV2ZW50cyBuZXZlciBzZWUgc3RhbGUgdmFsdWVzIGZyb20gdGhlIGluaXRpYWxpemF0aW9uLlxuLy8gSGFuZGxlcnMgcnVuIGluc2lkZSB0aGUgQW5ndWxhciB6b25lLCBzbyBjaGFuZ2UgZGV0ZWN0aW9uIGFsd2F5cyBmb2xsb3dzLFxuLy8gZXZlbiB3aGVuIGpzcHJlYWRzaGVldCBmaXJlcyB0aGUgZXZlbnQgZnJvbSBvdXRzaWRlIHRoZSB6b25lXG5jb25zdCBiaW5kSGFuZGxlcnMgPSBmdW5jdGlvbihvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+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
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="@jspreadsheet/angular" />
5
+ export * from './public-api';
@@ -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
+ }