ag-studio-angular 0.0.1 → 1.0.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.
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWctc3R1ZGlvLWFuZ3VsYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9hZy1zdHVkaW8tYW5ndWxhci9zcmMvYWctc3R1ZGlvLWFuZ3VsYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,317 @@
1
+ /* eslint-disable no-duplicate-imports */
2
+ // False positive lint error, ElementRef and co can't be type imports
3
+ // eslint-disable-next-line @typescript-eslint/consistent-type-imports
4
+ import { Component, EventEmitter, Input, Output, ViewEncapsulation, booleanAttribute, } from '@angular/core';
5
+ import { _BOOLEAN_MIXED_STUDIO_PROPERTIES, _combineAttributesAndStudioProperties, _createStudio, _processPropertyChanges, } from 'ag-studio';
6
+ // @END_IMPORTS@
7
+ import { AngularFrameworkOverrides } from './angularFrameworkOverrides';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "./angularFrameworkOverrides";
10
+ export class AgStudio {
11
+ constructor(elementDef, _angularFrameworkOverrides) {
12
+ this._angularFrameworkOverrides = _angularFrameworkOverrides;
13
+ this._initialised = false;
14
+ this._destroyed = false;
15
+ // in order to ensure firing of apiReady is deterministic
16
+ this._holdEvents = true;
17
+ this._fullyReady = new Promise((resolve) => {
18
+ this._resolveFullyReady = resolve;
19
+ });
20
+ // @START@
21
+ /** Change this value to set the tabIndex order of Studio within your application.
22
+ * @default 0
23
+ * @initial
24
+ */
25
+ this.tabIndex = undefined;
26
+ /** Set to `true` to operate Studio in RTL (Right to Left) mode.
27
+ * @default false
28
+ * @initial
29
+ */
30
+ this.enableRtl = undefined;
31
+ /** DOM element to use as the popup parent for Studio popups (context menus, etc.).
32
+ */
33
+ this.popupParent = undefined;
34
+ /** Theme to apply to Studio.
35
+ *
36
+ * @default studioTheme
37
+ */
38
+ this.theme = undefined;
39
+ /** If your theme uses a font that is available on Google Fonts, pass true to load it from Google's CDN.
40
+ */
41
+ this.loadThemeGoogleFonts = undefined;
42
+ /** The CSS layer that this theme should be rendered onto. When specified,
43
+ * Studio CSS will be wrapped in a `@layer ${themeCssLayer} { ... }` block.
44
+ *
45
+ * NOTE: when specifying `themeCssLayer` we recommend setting
46
+ * `themeStyleContainer` to `document.body` to ensure that Studio CSS
47
+ * comes after your application CSS, allowing your application to set the
48
+ * order of layers.
49
+ *
50
+ * @see https://developer.mozilla.org/en-US/docs/Web/CSS/@layer
51
+ */
52
+ this.themeCssLayer = undefined;
53
+ /** The nonce attribute to set on style elements added to the document by
54
+ * themes. If "foo" is passed to this property, Studio can use the Content
55
+ * Security Policy `style-src 'nonce-foo'`, instead of the less secure
56
+ * `style-src 'unsafe-inline'`.
57
+ *
58
+ * Note: CSP nonces are global to a page, where a page has multiple Studio components,
59
+ * every one must have the same styleNonce set.
60
+ */
61
+ this.styleNonce = undefined;
62
+ /** An element to insert style elements into when injecting styles into the
63
+ * Studio. Styles are inserted at the start of the element.
64
+ *
65
+ * If undefined, styles will be added to the document head for Studio components
66
+ * rendered in the main document fragment, or to Studio wrapper element
67
+ * for other Studio components (e.g. those rendered in a shadow DOM or detached from the
68
+ * document).
69
+ *
70
+ * @initial
71
+ */
72
+ this.themeStyleContainer = undefined;
73
+ /** Allows overriding what `document` is used.
74
+ * Use this when you want Studio to use a different `document` than the one available on the global scope.
75
+ * This can happen if docking out components (something which Electron supports).
76
+ */
77
+ this.getDocument = undefined;
78
+ /** Disables touch support (but does not remove the browser's efforts to simulate mouse events on touch).
79
+ * @default false
80
+ * @initial
81
+ */
82
+ this.suppressTouch = undefined;
83
+ /** A map of key->value pairs for localising text within Studio.
84
+ * @initial
85
+ */
86
+ this.localeText = undefined;
87
+ /** A callback for localising text within Studio.
88
+ * @initial
89
+ */
90
+ this.getLocaleText = undefined;
91
+ /** Provide a custom `studioId` for this instance of Studio. Value will be set on the root DOM node using the attribute `studio-id` as well as being accessible via the `api.getStudioId()` method.
92
+ * @initial
93
+ */
94
+ this.studioId = undefined;
95
+ /** Provides a context object that is provided to different callbacks Studio uses. Used for passing additional information to the callbacks used by your application.
96
+ * @initial
97
+ */
98
+ this.context = undefined;
99
+ /** Initial state for Studio. Only read once on initialization. Can be used in conjunction with `api.getState()` to save and restore Studio state.
100
+ * @initial
101
+ */
102
+ this.initialState = undefined;
103
+ /** Defines the data sources used by Studio.
104
+ *
105
+ * If updated after initially being set, only changes to synchronous data will be processed.
106
+ * Any other changes will be ignored (e.g. adding/removing data sources, updating fields, etc.)
107
+ */
108
+ this.data = undefined;
109
+ /** Which mode Studio is in.
110
+ * @default 'view'
111
+ */
112
+ this.mode = undefined;
113
+ /** Default layout styling.
114
+ */
115
+ this.layout = undefined;
116
+ /** AI Assistant configuration.
117
+ * @initial
118
+ */
119
+ this.ai = undefined;
120
+ /** Overrides for the layout and widget configs.
121
+ */
122
+ this.overrides = undefined;
123
+ /** Configure which panels are displayed and on which side.
124
+ */
125
+ this.panels = undefined;
126
+ /** State has been updated.
127
+ */
128
+ this.stateUpdated = new EventEmitter();
129
+ /** The API has been initialised and is ready for most calls. The data engine has not been initialised yet, and the UI is not ready.
130
+ */
131
+ this.apiReady = new EventEmitter();
132
+ /** The data engine has been initialised, and the UI has been created, but may not be fully rendered yet.
133
+ */
134
+ this.studioReady = new EventEmitter();
135
+ /** An error has occurred within Studio.
136
+ */
137
+ this.errorRaised = new EventEmitter();
138
+ this._nativeElement = elementDef.nativeElement;
139
+ // NOSONAR
140
+ this._fullyReady.then(() => {
141
+ // Register the status flag reset before any events are fired
142
+ // so that we can swap to synchronous event firing as soon as the studio is ready
143
+ this._holdEvents = false;
144
+ });
145
+ }
146
+ ngAfterViewInit() {
147
+ // Run the setup outside of angular so all the event handlers that are created do not trigger change detection
148
+ this._angularFrameworkOverrides.runOutsideAngular(() => {
149
+ // Get all the inputs that are valid AgStudioProperties
150
+ const studioPropertiesKeys = Object.keys(this).filter((key) => !(key.startsWith('_') ||
151
+ key == 'studioProperties' ||
152
+ key == 'modules' ||
153
+ this[key] instanceof EventEmitter));
154
+ const coercedStudioProperties = {};
155
+ for (const key of studioPropertiesKeys) {
156
+ const valueToUse = getValueOrCoercedValue(key, this[key]);
157
+ coercedStudioProperties[key] = valueToUse;
158
+ }
159
+ const mergedStudioProperties = _combineAttributesAndStudioProperties(this.studioProperties, coercedStudioProperties, studioPropertiesKeys);
160
+ const studioParams = {
161
+ globalListener: this.globalListener.bind(this),
162
+ frameworkOverrides: this._angularFrameworkOverrides,
163
+ setThemeOnRootDiv: true,
164
+ modules: this.modules,
165
+ };
166
+ const api = _createStudio(this._nativeElement, mergedStudioProperties, studioParams);
167
+ if (api) {
168
+ this.api = api;
169
+ }
170
+ this._initialised = true;
171
+ // sometimes, especially in large client apps apiReady can fire before ngAfterViewInit
172
+ // this ties these together so that apiReady will always fire after agStudio's ngAfterViewInit
173
+ // the actual containing component's ngAfterViewInit will fire just after agStudio's
174
+ this._resolveFullyReady();
175
+ });
176
+ }
177
+ ngOnChanges(changes) {
178
+ if (this._initialised) {
179
+ // Run the changes outside of angular so any event handlers that are created do not trigger change detection
180
+ this._angularFrameworkOverrides.runOutsideAngular(() => {
181
+ const studioProperties = {};
182
+ for (const key of Object.keys(changes)) {
183
+ const value = changes[key];
184
+ studioProperties[key] = value.currentValue;
185
+ }
186
+ _processPropertyChanges(studioProperties, this.api);
187
+ });
188
+ }
189
+ }
190
+ ngOnDestroy() {
191
+ if (this._initialised) {
192
+ // need to do this before the destroy, so we know not to emit any events
193
+ // while tearing down the studio.
194
+ this._destroyed = true;
195
+ // could be null if studio failed to initialise
196
+ this.api?.destroy();
197
+ }
198
+ }
199
+ // we'll emit the emit if a user is listening for a given event either on the component via normal angular binding
200
+ // or via studioProperties
201
+ isEmitterUsed(eventType) {
202
+ const emitter = this[eventType];
203
+ // For RxJs compatibility we need to check for observed v7+ or observers v6
204
+ const emitterAny = emitter;
205
+ const hasEmitter = emitterAny?.observed ?? emitterAny?.observers?.length > 0;
206
+ // apiReady => onApiReady
207
+ const asEventName = `on${eventType.charAt(0).toUpperCase()}${eventType.substring(1)}`;
208
+ const hasStudioPropertyListener = !!this.studioProperties && !!this.studioProperties[asEventName];
209
+ return hasEmitter || hasStudioPropertyListener;
210
+ }
211
+ globalListener(eventType, event) {
212
+ // if we are tearing down, don't emit angular events, as this causes
213
+ // problems with the angular router
214
+ if (this._destroyed) {
215
+ return;
216
+ }
217
+ // generically look up the eventType
218
+ const emitter = this[eventType];
219
+ if (emitter && this.isEmitterUsed(eventType)) {
220
+ // Make sure we emit within the angular zone, so change detection works properly
221
+ const fireEmitter = () => this._angularFrameworkOverrides.runInsideAngular(() => emitter.emit(event));
222
+ if (this._holdEvents) {
223
+ // if the user is listening to events, wait for ngAfterViewInit to fire first, then emit the studio events
224
+ this._fullyReady.then(() => fireEmitter());
225
+ }
226
+ else {
227
+ fireEmitter();
228
+ }
229
+ }
230
+ }
231
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AgStudio, deps: [{ token: i0.ElementRef }, { token: i1.AngularFrameworkOverrides }], target: i0.ɵɵFactoryTarget.Component }); }
232
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.14", type: AgStudio, isStandalone: true, selector: "ag-studio", inputs: { studioProperties: "studioProperties", modules: "modules", tabIndex: "tabIndex", enableRtl: ["enableRtl", "enableRtl", booleanAttribute], popupParent: "popupParent", theme: "theme", loadThemeGoogleFonts: ["loadThemeGoogleFonts", "loadThemeGoogleFonts", booleanAttribute], themeCssLayer: "themeCssLayer", styleNonce: "styleNonce", themeStyleContainer: "themeStyleContainer", getDocument: "getDocument", suppressTouch: ["suppressTouch", "suppressTouch", booleanAttribute], localeText: "localeText", getLocaleText: "getLocaleText", studioId: "studioId", context: "context", initialState: "initialState", data: "data", mode: "mode", layout: "layout", ai: "ai", overrides: "overrides", panels: "panels" }, outputs: { stateUpdated: "stateUpdated", apiReady: "apiReady", studioReady: "studioReady", errorRaised: "errorRaised" }, providers: [AngularFrameworkOverrides], usesOnChanges: true, ngImport: i0, template: '', isInline: true, encapsulation: i0.ViewEncapsulation.None }); }
233
+ }
234
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AgStudio, decorators: [{
235
+ type: Component,
236
+ args: [{
237
+ selector: 'ag-studio',
238
+ standalone: true,
239
+ template: '',
240
+ providers: [AngularFrameworkOverrides],
241
+ // tell angular we don't want view encapsulation, we don't want a shadow root
242
+ encapsulation: ViewEncapsulation.None,
243
+ }]
244
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.AngularFrameworkOverrides }], propDecorators: { studioProperties: [{
245
+ type: Input
246
+ }], modules: [{
247
+ type: Input
248
+ }], tabIndex: [{
249
+ type: Input
250
+ }], enableRtl: [{
251
+ type: Input,
252
+ args: [{ transform: booleanAttribute }]
253
+ }], popupParent: [{
254
+ type: Input
255
+ }], theme: [{
256
+ type: Input
257
+ }], loadThemeGoogleFonts: [{
258
+ type: Input,
259
+ args: [{ transform: booleanAttribute }]
260
+ }], themeCssLayer: [{
261
+ type: Input
262
+ }], styleNonce: [{
263
+ type: Input
264
+ }], themeStyleContainer: [{
265
+ type: Input
266
+ }], getDocument: [{
267
+ type: Input
268
+ }], suppressTouch: [{
269
+ type: Input,
270
+ args: [{ transform: booleanAttribute }]
271
+ }], localeText: [{
272
+ type: Input
273
+ }], getLocaleText: [{
274
+ type: Input
275
+ }], studioId: [{
276
+ type: Input
277
+ }], context: [{
278
+ type: Input
279
+ }], initialState: [{
280
+ type: Input
281
+ }], data: [{
282
+ type: Input
283
+ }], mode: [{
284
+ type: Input
285
+ }], layout: [{
286
+ type: Input
287
+ }], ai: [{
288
+ type: Input
289
+ }], overrides: [{
290
+ type: Input
291
+ }], panels: [{
292
+ type: Input
293
+ }], stateUpdated: [{
294
+ type: Output
295
+ }], apiReady: [{
296
+ type: Output
297
+ }], studioReady: [{
298
+ type: Output
299
+ }], errorRaised: [{
300
+ type: Output
301
+ }] } });
302
+ const booleanMixedStudioProperties = new Set(_BOOLEAN_MIXED_STUDIO_PROPERTIES);
303
+ /**
304
+ * Used to support the user setting combined boolean and string / object properties
305
+ * as plain HTML attributes and us correctly mapping that to true.
306
+ * For example cellSection can be boolean or an object
307
+ */
308
+ function getValueOrCoercedValue(key, valueToUse) {
309
+ if (booleanMixedStudioProperties.has(key)) {
310
+ // Handle plain HTML boolean attributes and convert them to boolean values
311
+ // Also handle the false string case to match Angular boolean attributes
312
+ // eslint-disable-next-line sonarjs/no-nested-conditional
313
+ return valueToUse === '' ? true : valueToUse === 'false' ? false : valueToUse;
314
+ }
315
+ return valueToUse;
316
+ }
317
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWctc3R1ZGlvLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FnLXN0dWRpby1hbmd1bGFyL3NyYy9saWIvYWctc3R1ZGlvLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5Q0FBeUM7QUFDekMscUVBQXFFO0FBQ3JFLHNFQUFzRTtBQUN0RSxPQUFPLEVBRUgsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLGlCQUFpQixFQUNqQixnQkFBZ0IsR0FDbkIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUNILGdDQUFnQyxFQUNoQyxxQ0FBcUMsRUFDckMsYUFBYSxFQUNiLHVCQUF1QixHQUMxQixNQUFNLFdBQVcsQ0FBQztBQW9CbkIsZ0JBQWdCO0FBRWhCLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7QUFVeEUsTUFBTSxPQUFPLFFBQVE7SUFpQmpCLFlBQ0ksVUFBc0IsRUFDTCwwQkFBcUQ7UUFBckQsK0JBQTBCLEdBQTFCLDBCQUEwQixDQUEyQjtRQWZsRSxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBRTNCLHlEQUF5RDtRQUNqRCxnQkFBVyxHQUFHLElBQUksQ0FBQztRQUVWLGdCQUFXLEdBQWtCLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbEUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztRQXFJSCxVQUFVO1FBQ1Y7OztXQUdHO1FBQ2EsYUFBUSxHQUF1QixTQUFTLENBQUM7UUFDekQ7OztXQUdHO1FBQzRDLGNBQVMsR0FBd0IsU0FBUyxDQUFDO1FBQzFGO1dBQ0c7UUFDYSxnQkFBVyxHQUFtQyxTQUFTLENBQUM7UUFDeEU7OztXQUdHO1FBQ2EsVUFBSyxHQUE4QixTQUFTLENBQUM7UUFD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dEIsVUFBVTtzQkFBekIsS0FBSztnQkFJVSxhQUFhO3NCQUE1QixLQUFLO2dCQUlVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBSVUsT0FBTztzQkFBdEIsS0FBSztnQkFJVSxZQUFZO3NCQUEzQixLQUFLO2dCQU1VLElBQUk7c0JBQW5CLEtBQUs7Z0JBSVUsSUFBSTtzQkFBbkIsS0FBSztnQkFHVSxNQUFNO3NCQUFyQixLQUFLO2dCQUlVLEVBQUU7c0JBQWpCLEtBQUs7Z0JBR1UsU0FBUztzQkFBeEIsS0FBSztnQkFHVSxNQUFNO3NCQUFyQixLQUFLO2dCQUlXLFlBQVk7c0JBQTVCLE1BQU07Z0JBSVUsUUFBUTtzQkFBeEIsTUFBTTtnQkFHVSxXQUFXO3NCQUEzQixNQUFNO2dCQUdVLFdBQVc7c0JBQTNCLE1BQU07O0FBS1gsTUFBTSw0QkFBNEIsR0FBRyxJQUFJLEdBQUcsQ0FBUyxnQ0FBZ0MsQ0FBQyxDQUFDO0FBQ3ZGOzs7O0dBSUc7QUFDSCxTQUFTLHNCQUFzQixDQUFDLEdBQVcsRUFBRSxVQUFlO0lBQ3hELElBQUksNEJBQTRCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDeEMsMEVBQTBFO1FBQzFFLHdFQUF3RTtRQUN4RSx5REFBeUQ7UUFDekQsT0FBTyxVQUFVLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0lBQ2xGLENBQUM7SUFDRCxPQUFPLFVBQVUsQ0FBQztBQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tZHVwbGljYXRlLWltcG9ydHMgKi9cbi8vIEZhbHNlIHBvc2l0aXZlIGxpbnQgZXJyb3IsIEVsZW1lbnRSZWYgYW5kIGNvIGNhbid0IGJlIHR5cGUgaW1wb3J0c1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LXR5cGUtaW1wb3J0c1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIE91dHB1dCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgICBib29sZWFuQXR0cmlidXRlLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgQWdTdHVkaW9BcGksIEFnU3R1ZGlvTW9kdWxlLCBBZ1N0dWRpb1Byb3BlcnRpZXMsIF9TdHVkaW9QYXJhbXMgfSBmcm9tICdhZy1zdHVkaW8nO1xuaW1wb3J0IHtcbiAgICBfQk9PTEVBTl9NSVhFRF9TVFVESU9fUFJPUEVSVElFUyxcbiAgICBfY29tYmluZUF0dHJpYnV0ZXNBbmRTdHVkaW9Qcm9wZXJ0aWVzLFxuICAgIF9jcmVhdGVTdHVkaW8sXG4gICAgX3Byb2Nlc3NQcm9wZXJ0eUNoYW5nZXMsXG59IGZyb20gJ2FnLXN0dWRpbyc7XG4vLyBAU1RBUlRfSU1QT1JUU0BcbmltcG9ydCB0eXBlIHtcbiAgICBBZ0FpQXNzaXN0YW50LFxuICAgIEFnRGF0YUVuZ2luZSxcbiAgICBBZ0RhdGFTb3VyY2VzRGVmaW5pdGlvbixcbiAgICBBZ1BhZ2VMYXlvdXRTdGF0ZSxcbiAgICBBZ1BhbmVsQ29uZmlnLFxuICAgIEFnUmVwb3J0U3RhdGUsXG4gICAgQWdTdHVkaW9BcGlSZWFkeUV2ZW50LFxuICAgIEFnU3R1ZGlvRXJyb3JSYWlzZWRFdmVudCxcbiAgICBBZ1N0dWRpb0dldExvY2FsZVRleHRQYXJhbXMsXG4gICAgQWdTdHVkaW9Mb2NhbGVUZXh0LFxuICAgIEFnU3R1ZGlvTW9kZSxcbiAgICBBZ1N0dWRpb092ZXJyaWRlcyxcbiAgICBBZ1N0dWRpb1JlYWR5RXZlbnQsXG4gICAgQWdTdHVkaW9TdGF0ZVVwZGF0ZWRFdmVudCxcbiAgICBBZ1N0dWRpb1RoZW1lLFxufSBmcm9tICdhZy1zdHVkaW8nO1xuXG4vLyBARU5EX0lNUE9SVFNAXG5cbmltcG9ydCB7IEFuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXMgfSBmcm9tICcuL2FuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FnLXN0dWRpbycsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICB0ZW1wbGF0ZTogJycsXG4gICAgcHJvdmlkZXJzOiBbQW5ndWxhckZyYW1ld29ya092ZXJyaWRlc10sXG4gICAgLy8gdGVsbCBhbmd1bGFyIHdlIGRvbid0IHdhbnQgdmlldyBlbmNhcHN1bGF0aW9uLCB3ZSBkb24ndCB3YW50IGEgc2hhZG93IHJvb3RcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBBZ1N0dWRpbyBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgICAvLyBub3QgaW50ZW5kZWQgZm9yIHVzZXIgdG8gaW50ZXJhY3Qgd2l0aC4gc28gcHV0dGluZyBfIGluIHNvIGlmIHVzZXIgZ2V0cyByZWZlcmVuY2VcbiAgICAvLyB0byB0aGlzIG9iamVjdCwgdGhleSBraW5kJ2Ega25vdyBpdCdzIG5vdCBwYXJ0IG9mIHRoZSBhZ3JlZWQgaW50ZXJmYWNlXG4gICAgcHJpdmF0ZSByZWFkb25seSBfbmF0aXZlRWxlbWVudDogYW55O1xuICAgIHByaXZhdGUgX2luaXRpYWxpc2VkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfZGVzdHJveWVkID0gZmFsc2U7XG5cbiAgICAvLyBpbiBvcmRlciB0byBlbnN1cmUgZmlyaW5nIG9mIGFwaVJlYWR5IGlzIGRldGVybWluaXN0aWNcbiAgICBwcml2YXRlIF9ob2xkRXZlbnRzID0gdHJ1ZTtcbiAgICBwcml2YXRlIF9yZXNvbHZlRnVsbHlSZWFkeTogKCkgPT4gdm9pZDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9mdWxseVJlYWR5OiBQcm9taXNlPHZvaWQ+ID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZUZ1bGx5UmVhZHkgPSByZXNvbHZlO1xuICAgIH0pO1xuXG4gICAgLyoqIERhc2ggQXBpIGF2YWlsYWJsZSBhZnRlciBvbkFwaVJlYWR5IGV2ZW50IGhhcyBmaXJlZC4gKi9cbiAgICBwdWJsaWMgYXBpOiBBZ1N0dWRpb0FwaTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBlbGVtZW50RGVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9hbmd1bGFyRnJhbWV3b3JrT3ZlcnJpZGVzOiBBbmd1bGFyRnJhbWV3b3JrT3ZlcnJpZGVzXG4gICAgKSB7XG4gICAgICAgIHRoaXMuX25hdGl2ZUVsZW1lbnQgPSBlbGVtZW50RGVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIC8vIE5PU09OQVJcbiAgICAgICAgdGhpcy5fZnVsbHlSZWFkeS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBzdGF0dXMgZmxhZyByZXNldCBiZWZvcmUgYW55IGV2ZW50cyBhcmUgZmlyZWRcbiAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIHN3YXAgdG8gc3luY2hyb25vdXMgZXZlbnQgZmlyaW5nIGFzIHNvb24gYXMgdGhlIHN0dWRpbyBpcyByZWFkeVxuICAgICAgICAgICAgdGhpcy5faG9sZEV2ZW50cyA9IGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIC8vIFJ1biB0aGUgc2V0dXAgb3V0c2lkZSBvZiBhbmd1bGFyIHNvIGFsbCB0aGUgZXZlbnQgaGFuZGxlcnMgdGhhdCBhcmUgY3JlYXRlZCBkbyBub3QgdHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAgICAgIHRoaXMuX2FuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXMucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgLy8gR2V0IGFsbCB0aGUgaW5wdXRzIHRoYXQgYXJlIHZhbGlkIEFnU3R1ZGlvUHJvcGVydGllc1xuICAgICAgICAgICAgY29uc3Qgc3R1ZGlvUHJvcGVydGllc0tleXMgPSBPYmplY3Qua2V5cyh0aGlzKS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKGtleSkgPT5cbiAgICAgICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleS5zdGFydHNXaXRoKCdfJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9PSAnc3R1ZGlvUHJvcGVydGllcycgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9PSAnbW9kdWxlcycgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNba2V5IGFzIGtleW9mIEFnU3R1ZGlvXSBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlclxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBjb2VyY2VkU3R1ZGlvUHJvcGVydGllcyA9IHt9IGFzIEFnU3R1ZGlvUHJvcGVydGllcztcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHN0dWRpb1Byb3BlcnRpZXNLZXlzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWVUb1VzZSA9IGdldFZhbHVlT3JDb2VyY2VkVmFsdWUoa2V5LCB0aGlzW2tleSBhcyBrZXlvZiBBZ1N0dWRpb10pO1xuICAgICAgICAgICAgICAgIGNvZXJjZWRTdHVkaW9Qcm9wZXJ0aWVzW2tleSBhcyBrZXlvZiBBZ1N0dWRpb1Byb3BlcnRpZXNdID0gdmFsdWVUb1VzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbWVyZ2VkU3R1ZGlvUHJvcGVydGllcyA9IF9jb21iaW5lQXR0cmlidXRlc0FuZFN0dWRpb1Byb3BlcnRpZXMoXG4gICAgICAgICAgICAgICAgdGhpcy5zdHVkaW9Qcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgIGNvZXJjZWRTdHVkaW9Qcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgIHN0dWRpb1Byb3BlcnRpZXNLZXlzXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBzdHVkaW9QYXJhbXM6IF9TdHVkaW9QYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgZ2xvYmFsTGlzdGVuZXI6IHRoaXMuZ2xvYmFsTGlzdGVuZXIuYmluZCh0aGlzKSxcbiAgICAgICAgICAgICAgICBmcmFtZXdvcmtPdmVycmlkZXM6IHRoaXMuX2FuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXMsXG4gICAgICAgICAgICAgICAgc2V0VGhlbWVPblJvb3REaXY6IHRydWUsXG4gICAgICAgICAgICAgICAgbW9kdWxlczogdGhpcy5tb2R1bGVzLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgYXBpID0gX2NyZWF0ZVN0dWRpbyh0aGlzLl9uYXRpdmVFbGVtZW50LCBtZXJnZWRTdHVkaW9Qcm9wZXJ0aWVzLCBzdHVkaW9QYXJhbXMpO1xuICAgICAgICAgICAgaWYgKGFwaSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBpID0gYXBpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9pbml0aWFsaXNlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIHNvbWV0aW1lcywgZXNwZWNpYWxseSBpbiBsYXJnZSBjbGllbnQgYXBwcyBhcGlSZWFkeSBjYW4gZmlyZSBiZWZvcmUgbmdBZnRlclZpZXdJbml0XG4gICAgICAgICAgICAvLyB0aGlzIHRpZXMgdGhlc2UgdG9nZXRoZXIgc28gdGhhdCBhcGlSZWFkeSB3aWxsIGFsd2F5cyBmaXJlIGFmdGVyIGFnU3R1ZGlvJ3MgbmdBZnRlclZpZXdJbml0XG4gICAgICAgICAgICAvLyB0aGUgYWN0dWFsIGNvbnRhaW5pbmcgY29tcG9uZW50J3MgbmdBZnRlclZpZXdJbml0IHdpbGwgZmlyZSBqdXN0IGFmdGVyIGFnU3R1ZGlvJ3NcbiAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVGdWxseVJlYWR5KCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxpc2VkKSB7XG4gICAgICAgICAgICAvLyBSdW4gdGhlIGNoYW5nZXMgb3V0c2lkZSBvZiBhbmd1bGFyIHNvIGFueSBldmVudCBoYW5kbGVycyB0aGF0IGFyZSBjcmVhdGVkIGRvIG5vdCB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAgICAgICAgIHRoaXMuX2FuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXMucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0dWRpb1Byb3BlcnRpZXM6IEFnU3R1ZGlvUHJvcGVydGllcyA9IHt9O1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNoYW5nZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2hhbmdlc1trZXldO1xuICAgICAgICAgICAgICAgICAgICBzdHVkaW9Qcm9wZXJ0aWVzW2tleSBhcyBrZXlvZiBBZ1N0dWRpb1Byb3BlcnRpZXNdID0gdmFsdWUuY3VycmVudFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfcHJvY2Vzc1Byb3BlcnR5Q2hhbmdlcyhzdHVkaW9Qcm9wZXJ0aWVzLCB0aGlzLmFwaSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxpc2VkKSB7XG4gICAgICAgICAgICAvLyBuZWVkIHRvIGRvIHRoaXMgYmVmb3JlIHRoZSBkZXN0cm95LCBzbyB3ZSBrbm93IG5vdCB0byBlbWl0IGFueSBldmVudHNcbiAgICAgICAgICAgIC8vIHdoaWxlIHRlYXJpbmcgZG93biB0aGUgc3R1ZGlvLlxuICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIGNvdWxkIGJlIG51bGwgaWYgc3R1ZGlvIGZhaWxlZCB0byBpbml0aWFsaXNlXG4gICAgICAgICAgICB0aGlzLmFwaT8uZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gd2UnbGwgZW1pdCB0aGUgZW1pdCBpZiBhIHVzZXIgaXMgbGlzdGVuaW5nIGZvciBhIGdpdmVuIGV2ZW50IGVpdGhlciBvbiB0aGUgY29tcG9uZW50IHZpYSBub3JtYWwgYW5ndWxhciBiaW5kaW5nXG4gICAgLy8gb3IgdmlhIHN0dWRpb1Byb3BlcnRpZXNcbiAgICBwcm90ZWN0ZWQgaXNFbWl0dGVyVXNlZChldmVudFR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBlbWl0dGVyID0gPEV2ZW50RW1pdHRlcjxhbnk+Pig8YW55PnRoaXMpW2V2ZW50VHlwZV07XG4gICAgICAgIC8vIEZvciBSeEpzIGNvbXBhdGliaWxpdHkgd2UgbmVlZCB0byBjaGVjayBmb3Igb2JzZXJ2ZWQgdjcrIG9yIG9ic2VydmVycyB2NlxuICAgICAgICBjb25zdCBlbWl0dGVyQW55ID0gZW1pdHRlciBhcyBhbnk7XG4gICAgICAgIGNvbnN0IGhhc0VtaXR0ZXIgPSBlbWl0dGVyQW55Py5vYnNlcnZlZCA/PyBlbWl0dGVyQW55Py5vYnNlcnZlcnM/Lmxlbmd0aCA+IDA7XG5cbiAgICAgICAgLy8gYXBpUmVhZHkgPT4gb25BcGlSZWFkeVxuICAgICAgICBjb25zdCBhc0V2ZW50TmFtZSA9IGBvbiR7ZXZlbnRUeXBlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7ZXZlbnRUeXBlLnN1YnN0cmluZygxKX1gO1xuICAgICAgICBjb25zdCBoYXNTdHVkaW9Qcm9wZXJ0eUxpc3RlbmVyID0gISF0aGlzLnN0dWRpb1Byb3BlcnRpZXMgJiYgISEodGhpcy5zdHVkaW9Qcm9wZXJ0aWVzIGFzIGFueSlbYXNFdmVudE5hbWVdO1xuXG4gICAgICAgIHJldHVybiBoYXNFbWl0dGVyIHx8IGhhc1N0dWRpb1Byb3BlcnR5TGlzdGVuZXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnbG9iYWxMaXN0ZW5lcihldmVudFR5cGU6IHN0cmluZywgZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICAvLyBpZiB3ZSBhcmUgdGVhcmluZyBkb3duLCBkb24ndCBlbWl0IGFuZ3VsYXIgZXZlbnRzLCBhcyB0aGlzIGNhdXNlc1xuICAgICAgICAvLyBwcm9ibGVtcyB3aXRoIHRoZSBhbmd1bGFyIHJvdXRlclxuICAgICAgICBpZiAodGhpcy5fZGVzdHJveWVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBnZW5lcmljYWxseSBsb29rIHVwIHRoZSBldmVudFR5cGVcbiAgICAgICAgY29uc3QgZW1pdHRlciA9IDxFdmVudEVtaXR0ZXI8YW55Pj4oPGFueT50aGlzKVtldmVudFR5cGVdO1xuICAgICAgICBpZiAoZW1pdHRlciAmJiB0aGlzLmlzRW1pdHRlclVzZWQoZXZlbnRUeXBlKSkge1xuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGVtaXQgd2l0aGluIHRoZSBhbmd1bGFyIHpvbmUsIHNvIGNoYW5nZSBkZXRlY3Rpb24gd29ya3MgcHJvcGVybHlcbiAgICAgICAgICAgIGNvbnN0IGZpcmVFbWl0dGVyID0gKCkgPT4gdGhpcy5fYW5ndWxhckZyYW1ld29ya092ZXJyaWRlcy5ydW5JbnNpZGVBbmd1bGFyKCgpID0+IGVtaXR0ZXIuZW1pdChldmVudCkpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5faG9sZEV2ZW50cykge1xuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB1c2VyIGlzIGxpc3RlbmluZyB0byBldmVudHMsIHdhaXQgZm9yIG5nQWZ0ZXJWaWV3SW5pdCB0byBmaXJlIGZpcnN0LCB0aGVuIGVtaXQgdGhlIHN0dWRpbyBldmVudHNcbiAgICAgICAgICAgICAgICB0aGlzLl9mdWxseVJlYWR5LnRoZW4oKCkgPT4gZmlyZUVtaXR0ZXIoKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpcmVFbWl0dGVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogUHJvdmlkZWQgYW4gaW5pdGlhbCBzdHVkaW9Qcm9wZXJ0aWVzIGNvbmZpZ3VyYXRpb24gdG8gdGhlIGNvbXBvbmVudC4gSWYgYSBwcm9wZXJ0eSBpcyBzcGVjaWZpZWQgaW4gYm90aCBzdHVkaW9Qcm9wZXJ0aWVzIGFuZCB2aWEgY29tcG9uZW50IGJpbmRpbmcgdGhlIGNvbXBvbmVudCBiaW5kaW5nIHRha2VzIHByZWNlZGVuY2UuICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzdHVkaW9Qcm9wZXJ0aWVzOiBBZ1N0dWRpb1Byb3BlcnRpZXMgfCB1bmRlZmluZWQ7XG4gICAgLyoqXG4gICAgICogVXNlZCB0byByZWdpc3RlciBBRyBTdHVkaW8gTW9kdWxlcyBkaXJlY3RseSB3aXRoIHRoaXMgaW5zdGFuY2Ugb2YgU3R1ZGlvLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtb2R1bGVzOiBBZ1N0dWRpb01vZHVsZVtdIHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gQFNUQVJUQFxuICAgIC8qKiBDaGFuZ2UgdGhpcyB2YWx1ZSB0byBzZXQgdGhlIHRhYkluZGV4IG9yZGVyIG9mIFN0dWRpbyB3aXRoaW4geW91ciBhcHBsaWNhdGlvbi5cbiAgICAgKiBAZGVmYXVsdCAwXG4gICAgICogQGluaXRpYWxcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgdGFiSW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAvKiogU2V0IHRvIGB0cnVlYCB0byBvcGVyYXRlIFN0dWRpbyBpbiBSVEwgKFJpZ2h0IHRvIExlZnQpIG1vZGUuXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKiBAaW5pdGlhbFxuICAgICAqL1xuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBwdWJsaWMgZW5hYmxlUnRsOiBib29sZWFuIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIC8qKiBET00gZWxlbWVudCB0byB1c2UgYXMgdGhlIHBvcHVwIHBhcmVudCBmb3IgU3R1ZGlvIHBvcHVwcyAoY29udGV4dCBtZW51cywgZXRjLikuXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHBvcHVwUGFyZW50OiBIVE1MRWxlbWVudCB8IG51bGwgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgLyoqIFRoZW1lIHRvIGFwcGx5IHRvIFN0dWRpby5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IHN0dWRpb1RoZW1lXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHRoZW1lOiBBZ1N0dWRpb1RoZW1lIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIC8qKiBJZiB5b3VyIHRoZW1lIHVzZXMgYSBmb250IHRoYXQgaXMgYXZhaWxhYmxlIG9uIEdvb2dsZSBGb250cywgcGFzcyB0cnVlIHRvIGxvYWQgaXQgZnJvbSBHb29nbGUncyBDRE4uXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHB1YmxpYyBsb2FkVGhlbWVHb29nbGVGb250czogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAvKiogVGhlIENTUyBsYXllciB0aGF0IHRoaXMgdGhlbWUgc2hvdWxkIGJlIHJlbmRlcmVkIG9udG8uIFdoZW4gc3BlY2lmaWVkLFxuICAgICAqIFN0dWRpbyBDU1Mgd2lsbCBiZSB3cmFwcGVkIGluIGEgYEBsYXllciAke3RoZW1lQ3NzTGF5ZXJ9IHsgLi4uIH1gIGJsb2NrLlxuICAgICAqXG4gICAgICogTk9URTogd2hlbiBzcGVjaWZ5aW5nIGB0aGVtZUNzc0xheWVyYCB3ZSByZWNvbW1lbmQgc2V0dGluZ1xuICAgICAqIGB0aGVtZVN0eWxlQ29udGFpbmVyYCB0byBgZG9jdW1lbnQuYm9keWAgdG8gZW5zdXJlIHRoYXQgU3R1ZGlvIENTU1xuICAgICAqIGNvbWVzIGFmdGVyIHlvdXIgYXBwbGljYXRpb24gQ1NTLCBhbGxvd2luZyB5b3VyIGFwcGxpY2F0aW9uIHRvIHNldCB0aGVcbiAgICAgKiBvcmRlciBvZiBsYXllcnMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9AbGF5ZXJcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgdGhlbWVDc3NMYXllcjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIC8qKiBUaGUgbm9uY2UgYXR0cmlidXRlIHRvIHNldCBvbiBzdHlsZSBlbGVtZW50cyBhZGRlZCB0byB0aGUgZG9jdW1lbnQgYnlcbiAgICAgKiB0aGVtZXMuIElmIFwiZm9vXCIgaXMgcGFzc2VkIHRvIHRoaXMgcHJvcGVydHksIFN0dWRpbyBjYW4gdXNlIHRoZSBDb250ZW50XG4gICAgICogU2VjdXJpdHkgUG9saWN5IGBzdHlsZS1zcmMgJ25vbmNlLWZvbydgLCBpbnN0ZWFkIG9mIHRoZSBsZXNzIHNlY3VyZVxuICAgICAqIGBzdHlsZS1zcmMgJ3Vuc2FmZS1pbmxpbmUnYC5cbiAgICAgKlxuICAgICAqIE5vdGU6IENTUCBub25jZXMgYXJlIGdsb2JhbCB0byBhIHBhZ2UsIHdoZXJlIGEgcGFnZSBoYXMgbXVsdGlwbGUgU3R1ZGlvIGNvbXBvbmVudHMsXG4gICAgICogZXZlcnkgb25lIG11c3QgaGF2ZSB0aGUgc2FtZSBzdHlsZU5vbmNlIHNldC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgc3R5bGVOb25jZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIC8qKiBBbiBlbGVtZW50IHRvIGluc2VydCBzdHlsZSBlbGVtZW50cyBpbnRvIHdoZW4gaW5qZWN0aW5nIHN0eWxlcyBpbnRvIHRoZVxuICAgICAqIFN0dWRpby4gU3R5bGVzIGFyZSBpbnNlcnRlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBJZiB1bmRlZmluZWQsIHN0eWxlcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBkb2N1bWVudCBoZWFkIGZvciBTdHVkaW8gY29tcG9uZW50c1xuICAgICAqIHJlbmRlcmVkIGluIHRoZSBtYWluIGRvY3VtZW50IGZyYWdtZW50LCBvciB0byBTdHVkaW8gd3JhcHBlciBlbGVtZW50XG4gICAgICogZm9yIG90aGVyIFN0dWRpbyBjb21wb25lbnRzIChlLmcuIHRob3NlIHJlbmRlcmVkIGluIGEgc2hhZG93IERPTSBvciBkZXRhY2hlZCBmcm9tIHRoZVxuICAgICAqIGRvY3VtZW50KS5cbiAgICAgKlxuICAgICAqIEBpbml0aWFsXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHRoZW1lU3R5bGVDb250YWluZXI6IChIVE1MRWxlbWVudCB8ICgoKSA9PiBIVE1MRWxlbWVudCB8IHZvaWQpKSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAvKiogQWxsb3dzIG92ZXJyaWRpbmcgd2hhdCBgZG9jdW1lbnRgIGlzIHVzZWQuXG4gICAgICogVXNlIHRoaXMgd2hlbiB5b3Ugd2FudCBTdHVkaW8gdG8gdXNlIGEgZGlmZmVyZW50IGBkb2N1bWVudGAgdGhhbiB0aGUgb25lIGF2YWlsYWJsZSBvbiB0aGUgZ2xvYmFsIHNjb3BlLlxuICAgICAqIFRoaXMgY2FuIGhhcHBlbiBpZiBkb2NraW5nIG91dCBjb21wb25lbnRzIChzb21ldGhpbmcgd2hpY2ggRWxlY3Ryb24gc3VwcG9ydHMpLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBnZXREb2N1bWVudDogKCgpID0+IERvY3VtZW50KSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAvKiogRGlzYWJsZXMgdG91Y2ggc3VwcG9ydCAoYnV0IGRvZXMgbm90IHJlbW92ZSB0aGUgYnJvd3NlcidzIGVmZm9ydHMgdG8gc2ltdWxhdGUgbW91c2UgZXZlbnRzIG9uIHRvdWNoKS5cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqIEBpbml0aWFsXG4gICAgICovXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIHB1YmxpYyBzdXBwcmVzc1RvdWNoOiBib29sZWFuIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIC8qKiBBIG1hcCBvZiBrZXktPnZhbHVlIHBhaXJzIGZvciBsb2NhbGlzaW5nIHRleHQgd2l0aGluIFN0dWRpby5cbiAgICAgKiBAaW5pdGlhbFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBsb2NhbGVUZXh0OiBBZ1N0dWRpb0xvY2FsZVRleHQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgLyoqIEEgY2FsbGJhY2sgZm9yIGxvY2FsaXNpbmcgdGV4dCB3aXRoaW4gU3R1ZGlvLlxuICAgICAqIEBpbml0aWFsXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGdldExvY2FsZVRleHQ6ICgocGFyYW1zOiBBZ1N0dWRpb0dldExvY2FsZVRleHRQYXJhbXMpID0+IHN0cmluZykgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgLyoqIFByb3ZpZGUgYSBjdXN0b20gYHN0dWRpb0lkYCBmb3IgdGhpcyBpbnN0YW5jZSBvZiBTdHVkaW8uIFZhbHVlIHdpbGwgYmUgc2V0IG9uIHRoZSByb290IERPTSBub2RlIHVzaW5nIHRoZSBhdHRyaWJ1dGUgYHN0dWRpby1pZGAgYXMgd2VsbCBhcyBiZWluZyBhY2Nlc3NpYmxlIHZpYSB0aGUgYGFwaS5nZXRTdHVkaW9JZCgpYCBtZXRob2QuXG4gICAgICogQGluaXRpYWxcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgc3R1ZGlvSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAvKiogUHJvdmlkZXMgYSBjb250ZXh0IG9iamVjdCB0aGF0IGlzIHByb3ZpZGVkIHRvIGRpZmZlcmVudCBjYWxsYmFja3MgU3R1ZGlvIHVzZXMuIFVzZWQgZm9yIHBhc3NpbmcgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byB0aGUgY2FsbGJhY2tzIHVzZWQgYnkgeW91ciBhcHBsaWNhdGlvbi5cbiAgICAgKiBAaW5pdGlhbFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjb250ZXh0OiBhbnkgPSB1bmRlZmluZWQ7XG4gICAgLyoqIEluaXRpYWwgc3RhdGUgZm9yIFN0dWRpby4gT25seSByZWFkIG9uY2Ugb24gaW5pdGlhbGl6YXRpb24uIENhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYGFwaS5nZXRTdGF0ZSgpYCB0byBzYXZlIGFuZCByZXN0b3JlIFN0dWRpbyBzdGF0ZS5cbiAgICAgKiBAaW5pdGlhbFxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpbml0aWFsU3RhdGU6IEFnUmVwb3J0U3RhdGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgLyoqIERlZmluZXMgdGhlIGRhdGEgc291cmNlcyB1c2VkIGJ5IFN0dWRpby5cbiAgICAgKlxuICAgICAqIElmIHVwZGF0ZWQgYWZ0ZXIgaW5pdGlhbGx5IGJlaW5nIHNldCwgb25seSBjaGFuZ2VzIHRvIHN5bmNocm9ub3VzIGRhdGEgd2lsbCBiZSBwcm9jZXNzZWQuXG4gICAgICogQW55IG90aGVyIGNoYW5nZXMgd2lsbCBiZSBpZ25vcmVkIChlLmcuIGFkZGluZy9yZW1vdmluZyBkYXRhIHNvdXJjZXMsIHVwZGF0aW5nIGZpZWxkcywgZXRjLilcbiAgICAgKi9cbiAgICBASW5wdXQoKSBwdWJsaWMgZGF0YTogQWdEYXRhU291cmNlc0RlZmluaXRpb24gfCBBZ0RhdGFFbmdpbmUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgLyoqIFdoaWNoIG1vZGUgU3R1ZGlvIGlzIGluLlxuICAgICAqIEBkZWZhdWx0ICd2aWV3J1xuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBtb2RlOiBBZ1N0dWRpb01vZGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgLyoqIERlZmF1bHQgbGF5b3V0IHN0eWxpbmcuXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGxheW91dDogUGFydGlhbDxBZ1BhZ2VMYXlvdXRTdGF0ZT4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgLyoqIEFJIEFzc2lzdGFudCBjb25maWd1cmF0aW9uLlxuICAgICAqIEBpbml0aWFsXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIGFpOiBBZ0FpQXNzaXN0YW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIC8qKiBPdmVycmlkZXMgZm9yIHRoZSBsYXlvdXQgYW5kIHdpZGdldCBjb25maWdzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHB1YmxpYyBvdmVycmlkZXM6IEFnU3R1ZGlvT3ZlcnJpZGVzIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIC8qKiBDb25maWd1cmUgd2hpY2ggcGFuZWxzIGFyZSBkaXNwbGF5ZWQgYW5kIG9uIHdoaWNoIHNpZGUuXG4gICAgICovXG4gICAgQElucHV0KCkgcHVibGljIHBhbmVsczogQWdQYW5lbENvbmZpZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIC8qKiBTdGF0ZSBoYXMgYmVlbiB1cGRhdGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgc3RhdGVVcGRhdGVkOiBFdmVudEVtaXR0ZXI8QWdTdHVkaW9TdGF0ZVVwZGF0ZWRFdmVudD4gPVxuICAgICAgICBuZXcgRXZlbnRFbWl0dGVyPEFnU3R1ZGlvU3RhdGVVcGRhdGVkRXZlbnQ+KCk7XG4gICAgLyoqIFRoZSBBUEkgaGFzIGJlZW4gaW5pdGlhbGlzZWQgYW5kIGlzIHJlYWR5IGZvciBtb3N0IGNhbGxzLiBUaGUgZGF0YSBlbmdpbmUgaGFzIG5vdCBiZWVuIGluaXRpYWxpc2VkIHlldCwgYW5kIHRoZSBVSSBpcyBub3QgcmVhZHkuXG4gICAgICovXG4gICAgQE91dHB1dCgpIHB1YmxpYyBhcGlSZWFkeTogRXZlbnRFbWl0dGVyPEFnU3R1ZGlvQXBpUmVhZHlFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEFnU3R1ZGlvQXBpUmVhZHlFdmVudD4oKTtcbiAgICAvKiogVGhlIGRhdGEgZW5naW5lIGhhcyBiZWVuIGluaXRpYWxpc2VkLCBhbmQgdGhlIFVJIGhhcyBiZWVuIGNyZWF0ZWQsIGJ1dCBtYXkgbm90IGJlIGZ1bGx5IHJlbmRlcmVkIHlldC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcHVibGljIHN0dWRpb1JlYWR5OiBFdmVudEVtaXR0ZXI8QWdTdHVkaW9SZWFkeUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8QWdTdHVkaW9SZWFkeUV2ZW50PigpO1xuICAgIC8qKiBBbiBlcnJvciBoYXMgb2NjdXJyZWQgd2l0aGluIFN0dWRpby5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgcHVibGljIGVycm9yUmFpc2VkOiBFdmVudEVtaXR0ZXI8QWdTdHVkaW9FcnJvclJhaXNlZEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8QWdTdHVkaW9FcnJvclJhaXNlZEV2ZW50PigpO1xuXG4gICAgLy8gQEVOREBcbn1cblxuY29uc3QgYm9vbGVhbk1peGVkU3R1ZGlvUHJvcGVydGllcyA9IG5ldyBTZXQ8c3RyaW5nPihfQk9PTEVBTl9NSVhFRF9TVFVESU9fUFJPUEVSVElFUyk7XG4vKipcbiAqIFVzZWQgdG8gc3VwcG9ydCB0aGUgdXNlciBzZXR0aW5nIGNvbWJpbmVkIGJvb2xlYW4gYW5kIHN0cmluZyAvIG9iamVjdCBwcm9wZXJ0aWVzXG4gKiBhcyBwbGFpbiBIVE1MIGF0dHJpYnV0ZXMgYW5kIHVzIGNvcnJlY3RseSBtYXBwaW5nIHRoYXQgdG8gdHJ1ZS5cbiAqIEZvciBleGFtcGxlIGNlbGxTZWN0aW9uIGNhbiBiZSBib29sZWFuIG9yIGFuIG9iamVjdFxuICovXG5mdW5jdGlvbiBnZXRWYWx1ZU9yQ29lcmNlZFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZVRvVXNlOiBhbnkpOiBhbnkge1xuICAgIGlmIChib29sZWFuTWl4ZWRTdHVkaW9Qcm9wZXJ0aWVzLmhhcyhrZXkpKSB7XG4gICAgICAgIC8vIEhhbmRsZSBwbGFpbiBIVE1MIGJvb2xlYW4gYXR0cmlidXRlcyBhbmQgY29udmVydCB0aGVtIHRvIGJvb2xlYW4gdmFsdWVzXG4gICAgICAgIC8vIEFsc28gaGFuZGxlIHRoZSBmYWxzZSBzdHJpbmcgY2FzZSB0byBtYXRjaCBBbmd1bGFyIGJvb2xlYW4gYXR0cmlidXRlc1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc29uYXJqcy9uby1uZXN0ZWQtY29uZGl0aW9uYWxcbiAgICAgICAgcmV0dXJuIHZhbHVlVG9Vc2UgPT09ICcnID8gdHJ1ZSA6IHZhbHVlVG9Vc2UgPT09ICdmYWxzZScgPyBmYWxzZSA6IHZhbHVlVG9Vc2U7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZVRvVXNlO1xufVxuIl19
@@ -0,0 +1,16 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { AgStudio } from './ag-studio.component';
3
+ import * as i0 from "@angular/core";
4
+ export class AgStudioModule {
5
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AgStudioModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
6
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: AgStudioModule, imports: [AgStudio], exports: [AgStudio] }); }
7
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AgStudioModule }); }
8
+ }
9
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AgStudioModule, decorators: [{
10
+ type: NgModule,
11
+ args: [{
12
+ imports: [AgStudio],
13
+ exports: [AgStudio],
14
+ }]
15
+ }] });
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWctc3R1ZGlvLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FnLXN0dWRpby1hbmd1bGFyL3NyYy9saWIvYWctc3R1ZGlvLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7QUFNakQsTUFBTSxPQUFPLGNBQWM7K0dBQWQsY0FBYztnSEFBZCxjQUFjLFlBSGIsUUFBUSxhQUNSLFFBQVE7Z0hBRVQsY0FBYzs7NEZBQWQsY0FBYztrQkFKMUIsUUFBUTttQkFBQztvQkFDTixPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUM7b0JBQ25CLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQztpQkFDdEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBBZ1N0dWRpbyB9IGZyb20gJy4vYWctc3R1ZGlvLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gICAgaW1wb3J0czogW0FnU3R1ZGlvXSxcbiAgICBleHBvcnRzOiBbQWdTdHVkaW9dLFxufSlcbmV4cG9ydCBjbGFzcyBBZ1N0dWRpb01vZHVsZSB7fVxuIl19
@@ -0,0 +1,67 @@
1
+ import { Injectable, NgZone } from '@angular/core';
2
+ import { _VanillaFrameworkOverrides } from 'ag-studio';
3
+ import * as i0 from "@angular/core";
4
+ export class AngularFrameworkOverrides extends _VanillaFrameworkOverrides {
5
+ constructor(_ngZone) {
6
+ super('angular');
7
+ this._ngZone = _ngZone;
8
+ this.batchFrameworkComps = true;
9
+ // Flag used to control Zone behaviour when running tests as many test features rely on Zone.
10
+ this.isRunningWithinTestZone = false;
11
+ // Make all events run outside Angular as they often trigger the setup of event listeners
12
+ // By having the event listeners outside Angular we can avoid triggering change detection
13
+ // This also means that if a user calls an AG Studio API method from within their component
14
+ // the internal side effects will not trigger change detection. Without this the events would
15
+ // run inside Angular and trigger change detection as the source of the event was within the angular zone.
16
+ this.wrapIncoming = (callback, source) => this.runOutside(callback, source);
17
+ /**
18
+ * Make sure that any code that is executed outside of AG Studio is running within the Angular zone.
19
+ * This means users can update templates and use binding without having to do anything extra.
20
+ */
21
+ this.wrapOutgoing = (callback) => this.runInsideAngular(callback);
22
+ this.isRunningWithinTestZone =
23
+ globalThis?.AG_STUDIO_UNDER_TEST ?? !!globalThis?.Zone?.AsyncTestZoneSpec;
24
+ if (!this._ngZone) {
25
+ this.runOutside = (callback) => callback();
26
+ }
27
+ else if (this.isRunningWithinTestZone) {
28
+ this.runOutside = (callback, source) => {
29
+ if (source === 'resize-observer' || source === 'popupPositioning') {
30
+ // ensure resize observer callbacks are run outside of Angular even under test due to Jest not supporting ResizeObserver
31
+ // which means it just loops continuously with a setTimeout with no way to flush the queue or have fixture.whenStable() resolve.
32
+ return this._ngZone.runOutsideAngular(callback);
33
+ }
34
+ // When under test run inside Angular so that tests can use fixture.whenStable() to wait for async operations to complete.
35
+ return callback();
36
+ };
37
+ }
38
+ else {
39
+ this.runOutside = (callback) => this._ngZone.runOutsideAngular(callback);
40
+ }
41
+ }
42
+ /**
43
+ * The shouldWrapOutgoing property is used to determine if events should be run outside of Angular or not.
44
+ * If an event handler is registered outside of Angular then we should not wrap the event handler
45
+ * with runInsideAngular() as the user may not have wanted this.
46
+ * This is also used to not wrap internal event listeners that are registered with RowNodes and Columns.
47
+ */
48
+ get shouldWrapOutgoing() {
49
+ return this._ngZone && NgZone.isInAngularZone();
50
+ }
51
+ runInsideAngular(callback) {
52
+ if (!this._ngZone || NgZone.isInAngularZone()) {
53
+ return callback();
54
+ }
55
+ // Check for _ngZone existence as it is not present when Zoneless
56
+ return this._ngZone.run(callback);
57
+ }
58
+ runOutsideAngular(callback, source) {
59
+ return this.runOutside(callback, source);
60
+ }
61
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AngularFrameworkOverrides, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
62
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AngularFrameworkOverrides }); }
63
+ }
64
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AngularFrameworkOverrides, decorators: [{
65
+ type: Injectable
66
+ }], ctorParameters: () => [{ type: i0.NgZone }] });
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhckZyYW1ld29ya092ZXJyaWRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FnLXN0dWRpby1hbmd1bGFyL3NyYy9saWIvYW5ndWxhckZyYW1ld29ya092ZXJyaWRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxXQUFXLENBQUM7O0FBS3ZELE1BQU0sT0FBTyx5QkFBMEIsU0FBUSwwQkFBMEI7SUFRckUsWUFBNkIsT0FBZTtRQUN4QyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFEUSxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBUG5CLHdCQUFtQixHQUFZLElBQUksQ0FBQztRQUU3RCw2RkFBNkY7UUFDNUUsNEJBQXVCLEdBQVksS0FBSyxDQUFDO1FBMkIxRCx5RkFBeUY7UUFDekYseUZBQXlGO1FBQ3pGLDJGQUEyRjtRQUMzRiw2RkFBNkY7UUFDN0YsMEdBQTBHO1FBQ2pHLGlCQUFZLEdBQTJFLENBQzVGLFFBQVEsRUFDUixNQUFNLEVBQ1IsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBWXZDOzs7V0FHRztRQUNNLGlCQUFZLEdBQWdDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUE1Qy9GLElBQUksQ0FBQyx1QkFBdUI7WUFDdkIsVUFBa0IsRUFBRSxvQkFBb0IsSUFBSSxDQUFDLENBQUUsVUFBa0IsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLENBQUM7UUFFaEcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMvQyxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUNuQyxJQUFJLE1BQU0sS0FBSyxpQkFBaUIsSUFBSSxNQUFNLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztvQkFDaEUsd0hBQXdIO29CQUN4SCxnSUFBZ0k7b0JBQ2hJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDcEQsQ0FBQztnQkFDRCwwSEFBMEg7Z0JBQzFILE9BQU8sUUFBUSxFQUFFLENBQUM7WUFDdEIsQ0FBQyxDQUFDO1FBQ04sQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdFLENBQUM7SUFDTCxDQUFDO0lBWUQ7Ozs7O09BS0c7SUFDSCxJQUFXLGtCQUFrQjtRQUN6QixPQUFPLElBQUksQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFRRCxnQkFBZ0IsQ0FBSSxRQUFpQjtRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQztZQUM1QyxPQUFPLFFBQVEsRUFBRSxDQUFDO1FBQ3RCLENBQUM7UUFFRCxpRUFBaUU7UUFDakUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsaUJBQWlCLENBQUksUUFBaUIsRUFBRSxNQUF5QztRQUM3RSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLENBQUM7K0dBcEVRLHlCQUF5QjttSEFBekIseUJBQXlCOzs0RkFBekIseUJBQXlCO2tCQURyQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBfVmFuaWxsYUZyYW1ld29ya092ZXJyaWRlcyB9IGZyb20gJ2FnLXN0dWRpbyc7XG5cbmltcG9ydCB0eXBlIHsgRnJhbWV3b3JrT3ZlcnJpZGVzSW5jb21pbmdTb3VyY2UgfSBmcm9tICdhZy1ncmlkLWVudGVycHJpc2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQW5ndWxhckZyYW1ld29ya092ZXJyaWRlcyBleHRlbmRzIF9WYW5pbGxhRnJhbWV3b3JrT3ZlcnJpZGVzIHtcbiAgICBwdWJsaWMgb3ZlcnJpZGUgcmVhZG9ubHkgYmF0Y2hGcmFtZXdvcmtDb21wczogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvLyBGbGFnIHVzZWQgdG8gY29udHJvbCBab25lIGJlaGF2aW91ciB3aGVuIHJ1bm5pbmcgdGVzdHMgYXMgbWFueSB0ZXN0IGZlYXR1cmVzIHJlbHkgb24gWm9uZS5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGlzUnVubmluZ1dpdGhpblRlc3Rab25lOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHJ1bk91dHNpZGU6IDxUPihjYWxsYmFjazogKCkgPT4gVCwgc291cmNlPzogRnJhbWV3b3JrT3ZlcnJpZGVzSW5jb21pbmdTb3VyY2UpID0+IFQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IF9uZ1pvbmU6IE5nWm9uZSkge1xuICAgICAgICBzdXBlcignYW5ndWxhcicpO1xuXG4gICAgICAgIHRoaXMuaXNSdW5uaW5nV2l0aGluVGVzdFpvbmUgPVxuICAgICAgICAgICAgKGdsb2JhbFRoaXMgYXMgYW55KT8uQUdfU1RVRElPX1VOREVSX1RFU1QgPz8gISEoZ2xvYmFsVGhpcyBhcyBhbnkpPy5ab25lPy5Bc3luY1Rlc3Rab25lU3BlYztcblxuICAgICAgICBpZiAoIXRoaXMuX25nWm9uZSkge1xuICAgICAgICAgICAgdGhpcy5ydW5PdXRzaWRlID0gKGNhbGxiYWNrKSA9PiBjYWxsYmFjaygpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNSdW5uaW5nV2l0aGluVGVzdFpvbmUpIHtcbiAgICAgICAgICAgIHRoaXMucnVuT3V0c2lkZSA9IChjYWxsYmFjaywgc291cmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSA9PT0gJ3Jlc2l6ZS1vYnNlcnZlcicgfHwgc291cmNlID09PSAncG9wdXBQb3NpdGlvbmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlIHJlc2l6ZSBvYnNlcnZlciBjYWxsYmFja3MgYXJlIHJ1biBvdXRzaWRlIG9mIEFuZ3VsYXIgZXZlbiB1bmRlciB0ZXN0IGR1ZSB0byBKZXN0IG5vdCBzdXBwb3J0aW5nIFJlc2l6ZU9ic2VydmVyXG4gICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIG1lYW5zIGl0IGp1c3QgbG9vcHMgY29udGludW91c2x5IHdpdGggYSBzZXRUaW1lb3V0IHdpdGggbm8gd2F5IHRvIGZsdXNoIHRoZSBxdWV1ZSBvciBoYXZlIGZpeHR1cmUud2hlblN0YWJsZSgpIHJlc29sdmUuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoY2FsbGJhY2spO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBXaGVuIHVuZGVyIHRlc3QgcnVuIGluc2lkZSBBbmd1bGFyIHNvIHRoYXQgdGVzdHMgY2FuIHVzZSBmaXh0dXJlLndoZW5TdGFibGUoKSB0byB3YWl0IGZvciBhc3luYyBvcGVyYXRpb25zIHRvIGNvbXBsZXRlLlxuICAgICAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucnVuT3V0c2lkZSA9IChjYWxsYmFjaykgPT4gdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1ha2UgYWxsIGV2ZW50cyBydW4gb3V0c2lkZSBBbmd1bGFyIGFzIHRoZXkgb2Z0ZW4gdHJpZ2dlciB0aGUgc2V0dXAgb2YgZXZlbnQgbGlzdGVuZXJzXG4gICAgLy8gQnkgaGF2aW5nIHRoZSBldmVudCBsaXN0ZW5lcnMgb3V0c2lkZSBBbmd1bGFyIHdlIGNhbiBhdm9pZCB0cmlnZ2VyaW5nIGNoYW5nZSBkZXRlY3Rpb25cbiAgICAvLyBUaGlzIGFsc28gbWVhbnMgdGhhdCBpZiBhIHVzZXIgY2FsbHMgYW4gQUcgU3R1ZGlvIEFQSSBtZXRob2QgZnJvbSB3aXRoaW4gdGhlaXIgY29tcG9uZW50XG4gICAgLy8gdGhlIGludGVybmFsIHNpZGUgZWZmZWN0cyB3aWxsIG5vdCB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24uIFdpdGhvdXQgdGhpcyB0aGUgZXZlbnRzIHdvdWxkXG4gICAgLy8gcnVuIGluc2lkZSBBbmd1bGFyIGFuZCB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gYXMgdGhlIHNvdXJjZSBvZiB0aGUgZXZlbnQgd2FzIHdpdGhpbiB0aGUgYW5ndWxhciB6b25lLlxuICAgIG92ZXJyaWRlIHdyYXBJbmNvbWluZzogPFQ+KGNhbGxiYWNrOiAoKSA9PiBULCBzb3VyY2U/OiBGcmFtZXdvcmtPdmVycmlkZXNJbmNvbWluZ1NvdXJjZSkgPT4gVCA9IChcbiAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgIHNvdXJjZVxuICAgICkgPT4gdGhpcy5ydW5PdXRzaWRlKGNhbGxiYWNrLCBzb3VyY2UpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNob3VsZFdyYXBPdXRnb2luZyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBldmVudHMgc2hvdWxkIGJlIHJ1biBvdXRzaWRlIG9mIEFuZ3VsYXIgb3Igbm90LlxuICAgICAqIElmIGFuIGV2ZW50IGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCBvdXRzaWRlIG9mIEFuZ3VsYXIgdGhlbiB3ZSBzaG91bGQgbm90IHdyYXAgdGhlIGV2ZW50IGhhbmRsZXJcbiAgICAgKiB3aXRoIHJ1bkluc2lkZUFuZ3VsYXIoKSBhcyB0aGUgdXNlciBtYXkgbm90IGhhdmUgd2FudGVkIHRoaXMuXG4gICAgICogVGhpcyBpcyBhbHNvIHVzZWQgdG8gbm90IHdyYXAgaW50ZXJuYWwgZXZlbnQgbGlzdGVuZXJzIHRoYXQgYXJlIHJlZ2lzdGVyZWQgd2l0aCBSb3dOb2RlcyBhbmQgQ29sdW1ucy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3VsZFdyYXBPdXRnb2luZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25nWm9uZSAmJiBOZ1pvbmUuaXNJbkFuZ3VsYXJab25lKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZSBzdXJlIHRoYXQgYW55IGNvZGUgdGhhdCBpcyBleGVjdXRlZCBvdXRzaWRlIG9mIEFHIFN0dWRpbyBpcyBydW5uaW5nIHdpdGhpbiB0aGUgQW5ndWxhciB6b25lLlxuICAgICAqIFRoaXMgbWVhbnMgdXNlcnMgY2FuIHVwZGF0ZSB0ZW1wbGF0ZXMgYW5kIHVzZSBiaW5kaW5nIHdpdGhvdXQgaGF2aW5nIHRvIGRvIGFueXRoaW5nIGV4dHJhLlxuICAgICAqL1xuICAgIG92ZXJyaWRlIHdyYXBPdXRnb2luZzogPFQ+KGNhbGxiYWNrOiAoKSA9PiBUKSA9PiBUID0gKGNhbGxiYWNrKSA9PiB0aGlzLnJ1bkluc2lkZUFuZ3VsYXIoY2FsbGJhY2spO1xuXG4gICAgcnVuSW5zaWRlQW5ndWxhcjxUPihjYWxsYmFjazogKCkgPT4gVCk6IFQge1xuICAgICAgICBpZiAoIXRoaXMuX25nWm9uZSB8fCBOZ1pvbmUuaXNJbkFuZ3VsYXJab25lKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIF9uZ1pvbmUgZXhpc3RlbmNlIGFzIGl0IGlzIG5vdCBwcmVzZW50IHdoZW4gWm9uZWxlc3NcbiAgICAgICAgcmV0dXJuIHRoaXMuX25nWm9uZS5ydW4oY2FsbGJhY2spO1xuICAgIH1cblxuICAgIHJ1bk91dHNpZGVBbmd1bGFyPFQ+KGNhbGxiYWNrOiAoKSA9PiBULCBzb3VyY2U/OiBGcmFtZXdvcmtPdmVycmlkZXNJbmNvbWluZ1NvdXJjZSk6IFQge1xuICAgICAgICByZXR1cm4gdGhpcy5ydW5PdXRzaWRlKGNhbGxiYWNrLCBzb3VyY2UpO1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,4 @@
1
+ export * from './lib/ag-studio.component';
2
+ export * from './lib/ag-studio.module';
3
+ export * from './lib/angularFrameworkOverrides';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FnLXN0dWRpby1hbmd1bGFyL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLGlDQUFpQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9saWIvYWctc3R1ZGlvLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9hZy1zdHVkaW8ubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2FuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXMnO1xuIl19
@@ -0,0 +1,398 @@
1
+ import * as i0 from '@angular/core';
2
+ import { NgZone, Injectable, EventEmitter, booleanAttribute, Output, Input, ViewEncapsulation, Component, NgModule } from '@angular/core';
3
+ import { _VanillaFrameworkOverrides, _combineAttributesAndStudioProperties, _createStudio, _processPropertyChanges, _BOOLEAN_MIXED_STUDIO_PROPERTIES } from 'ag-studio';
4
+
5
+ class AngularFrameworkOverrides extends _VanillaFrameworkOverrides {
6
+ constructor(_ngZone) {
7
+ super('angular');
8
+ this._ngZone = _ngZone;
9
+ this.batchFrameworkComps = true;
10
+ // Flag used to control Zone behaviour when running tests as many test features rely on Zone.
11
+ this.isRunningWithinTestZone = false;
12
+ // Make all events run outside Angular as they often trigger the setup of event listeners
13
+ // By having the event listeners outside Angular we can avoid triggering change detection
14
+ // This also means that if a user calls an AG Studio API method from within their component
15
+ // the internal side effects will not trigger change detection. Without this the events would
16
+ // run inside Angular and trigger change detection as the source of the event was within the angular zone.
17
+ this.wrapIncoming = (callback, source) => this.runOutside(callback, source);
18
+ /**
19
+ * Make sure that any code that is executed outside of AG Studio is running within the Angular zone.
20
+ * This means users can update templates and use binding without having to do anything extra.
21
+ */
22
+ this.wrapOutgoing = (callback) => this.runInsideAngular(callback);
23
+ this.isRunningWithinTestZone =
24
+ globalThis?.AG_STUDIO_UNDER_TEST ?? !!globalThis?.Zone?.AsyncTestZoneSpec;
25
+ if (!this._ngZone) {
26
+ this.runOutside = (callback) => callback();
27
+ }
28
+ else if (this.isRunningWithinTestZone) {
29
+ this.runOutside = (callback, source) => {
30
+ if (source === 'resize-observer' || source === 'popupPositioning') {
31
+ // ensure resize observer callbacks are run outside of Angular even under test due to Jest not supporting ResizeObserver
32
+ // which means it just loops continuously with a setTimeout with no way to flush the queue or have fixture.whenStable() resolve.
33
+ return this._ngZone.runOutsideAngular(callback);
34
+ }
35
+ // When under test run inside Angular so that tests can use fixture.whenStable() to wait for async operations to complete.
36
+ return callback();
37
+ };
38
+ }
39
+ else {
40
+ this.runOutside = (callback) => this._ngZone.runOutsideAngular(callback);
41
+ }
42
+ }
43
+ /**
44
+ * The shouldWrapOutgoing property is used to determine if events should be run outside of Angular or not.
45
+ * If an event handler is registered outside of Angular then we should not wrap the event handler
46
+ * with runInsideAngular() as the user may not have wanted this.
47
+ * This is also used to not wrap internal event listeners that are registered with RowNodes and Columns.
48
+ */
49
+ get shouldWrapOutgoing() {
50
+ return this._ngZone && NgZone.isInAngularZone();
51
+ }
52
+ runInsideAngular(callback) {
53
+ if (!this._ngZone || NgZone.isInAngularZone()) {
54
+ return callback();
55
+ }
56
+ // Check for _ngZone existence as it is not present when Zoneless
57
+ return this._ngZone.run(callback);
58
+ }
59
+ runOutsideAngular(callback, source) {
60
+ return this.runOutside(callback, source);
61
+ }
62
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AngularFrameworkOverrides, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
63
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AngularFrameworkOverrides }); }
64
+ }
65
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AngularFrameworkOverrides, decorators: [{
66
+ type: Injectable
67
+ }], ctorParameters: () => [{ type: i0.NgZone }] });
68
+
69
+ /* eslint-disable no-duplicate-imports */
70
+ // False positive lint error, ElementRef and co can't be type imports
71
+ // eslint-disable-next-line @typescript-eslint/consistent-type-imports
72
+ class AgStudio {
73
+ constructor(elementDef, _angularFrameworkOverrides) {
74
+ this._angularFrameworkOverrides = _angularFrameworkOverrides;
75
+ this._initialised = false;
76
+ this._destroyed = false;
77
+ // in order to ensure firing of apiReady is deterministic
78
+ this._holdEvents = true;
79
+ this._fullyReady = new Promise((resolve) => {
80
+ this._resolveFullyReady = resolve;
81
+ });
82
+ // @START@
83
+ /** Change this value to set the tabIndex order of Studio within your application.
84
+ * @default 0
85
+ * @initial
86
+ */
87
+ this.tabIndex = undefined;
88
+ /** Set to `true` to operate Studio in RTL (Right to Left) mode.
89
+ * @default false
90
+ * @initial
91
+ */
92
+ this.enableRtl = undefined;
93
+ /** DOM element to use as the popup parent for Studio popups (context menus, etc.).
94
+ */
95
+ this.popupParent = undefined;
96
+ /** Theme to apply to Studio.
97
+ *
98
+ * @default studioTheme
99
+ */
100
+ this.theme = undefined;
101
+ /** If your theme uses a font that is available on Google Fonts, pass true to load it from Google's CDN.
102
+ */
103
+ this.loadThemeGoogleFonts = undefined;
104
+ /** The CSS layer that this theme should be rendered onto. When specified,
105
+ * Studio CSS will be wrapped in a `@layer ${themeCssLayer} { ... }` block.
106
+ *
107
+ * NOTE: when specifying `themeCssLayer` we recommend setting
108
+ * `themeStyleContainer` to `document.body` to ensure that Studio CSS
109
+ * comes after your application CSS, allowing your application to set the
110
+ * order of layers.
111
+ *
112
+ * @see https://developer.mozilla.org/en-US/docs/Web/CSS/@layer
113
+ */
114
+ this.themeCssLayer = undefined;
115
+ /** The nonce attribute to set on style elements added to the document by
116
+ * themes. If "foo" is passed to this property, Studio can use the Content
117
+ * Security Policy `style-src 'nonce-foo'`, instead of the less secure
118
+ * `style-src 'unsafe-inline'`.
119
+ *
120
+ * Note: CSP nonces are global to a page, where a page has multiple Studio components,
121
+ * every one must have the same styleNonce set.
122
+ */
123
+ this.styleNonce = undefined;
124
+ /** An element to insert style elements into when injecting styles into the
125
+ * Studio. Styles are inserted at the start of the element.
126
+ *
127
+ * If undefined, styles will be added to the document head for Studio components
128
+ * rendered in the main document fragment, or to Studio wrapper element
129
+ * for other Studio components (e.g. those rendered in a shadow DOM or detached from the
130
+ * document).
131
+ *
132
+ * @initial
133
+ */
134
+ this.themeStyleContainer = undefined;
135
+ /** Allows overriding what `document` is used.
136
+ * Use this when you want Studio to use a different `document` than the one available on the global scope.
137
+ * This can happen if docking out components (something which Electron supports).
138
+ */
139
+ this.getDocument = undefined;
140
+ /** Disables touch support (but does not remove the browser's efforts to simulate mouse events on touch).
141
+ * @default false
142
+ * @initial
143
+ */
144
+ this.suppressTouch = undefined;
145
+ /** A map of key->value pairs for localising text within Studio.
146
+ * @initial
147
+ */
148
+ this.localeText = undefined;
149
+ /** A callback for localising text within Studio.
150
+ * @initial
151
+ */
152
+ this.getLocaleText = undefined;
153
+ /** Provide a custom `studioId` for this instance of Studio. Value will be set on the root DOM node using the attribute `studio-id` as well as being accessible via the `api.getStudioId()` method.
154
+ * @initial
155
+ */
156
+ this.studioId = undefined;
157
+ /** Provides a context object that is provided to different callbacks Studio uses. Used for passing additional information to the callbacks used by your application.
158
+ * @initial
159
+ */
160
+ this.context = undefined;
161
+ /** Initial state for Studio. Only read once on initialization. Can be used in conjunction with `api.getState()` to save and restore Studio state.
162
+ * @initial
163
+ */
164
+ this.initialState = undefined;
165
+ /** Defines the data sources used by Studio.
166
+ *
167
+ * If updated after initially being set, only changes to synchronous data will be processed.
168
+ * Any other changes will be ignored (e.g. adding/removing data sources, updating fields, etc.)
169
+ */
170
+ this.data = undefined;
171
+ /** Which mode Studio is in.
172
+ * @default 'view'
173
+ */
174
+ this.mode = undefined;
175
+ /** Default layout styling.
176
+ */
177
+ this.layout = undefined;
178
+ /** AI Assistant configuration.
179
+ * @initial
180
+ */
181
+ this.ai = undefined;
182
+ /** Overrides for the layout and widget configs.
183
+ */
184
+ this.overrides = undefined;
185
+ /** Configure which panels are displayed and on which side.
186
+ */
187
+ this.panels = undefined;
188
+ /** State has been updated.
189
+ */
190
+ this.stateUpdated = new EventEmitter();
191
+ /** The API has been initialised and is ready for most calls. The data engine has not been initialised yet, and the UI is not ready.
192
+ */
193
+ this.apiReady = new EventEmitter();
194
+ /** The data engine has been initialised, and the UI has been created, but may not be fully rendered yet.
195
+ */
196
+ this.studioReady = new EventEmitter();
197
+ /** An error has occurred within Studio.
198
+ */
199
+ this.errorRaised = new EventEmitter();
200
+ this._nativeElement = elementDef.nativeElement;
201
+ // NOSONAR
202
+ this._fullyReady.then(() => {
203
+ // Register the status flag reset before any events are fired
204
+ // so that we can swap to synchronous event firing as soon as the studio is ready
205
+ this._holdEvents = false;
206
+ });
207
+ }
208
+ ngAfterViewInit() {
209
+ // Run the setup outside of angular so all the event handlers that are created do not trigger change detection
210
+ this._angularFrameworkOverrides.runOutsideAngular(() => {
211
+ // Get all the inputs that are valid AgStudioProperties
212
+ const studioPropertiesKeys = Object.keys(this).filter((key) => !(key.startsWith('_') ||
213
+ key == 'studioProperties' ||
214
+ key == 'modules' ||
215
+ this[key] instanceof EventEmitter));
216
+ const coercedStudioProperties = {};
217
+ for (const key of studioPropertiesKeys) {
218
+ const valueToUse = getValueOrCoercedValue(key, this[key]);
219
+ coercedStudioProperties[key] = valueToUse;
220
+ }
221
+ const mergedStudioProperties = _combineAttributesAndStudioProperties(this.studioProperties, coercedStudioProperties, studioPropertiesKeys);
222
+ const studioParams = {
223
+ globalListener: this.globalListener.bind(this),
224
+ frameworkOverrides: this._angularFrameworkOverrides,
225
+ setThemeOnRootDiv: true,
226
+ modules: this.modules,
227
+ };
228
+ const api = _createStudio(this._nativeElement, mergedStudioProperties, studioParams);
229
+ if (api) {
230
+ this.api = api;
231
+ }
232
+ this._initialised = true;
233
+ // sometimes, especially in large client apps apiReady can fire before ngAfterViewInit
234
+ // this ties these together so that apiReady will always fire after agStudio's ngAfterViewInit
235
+ // the actual containing component's ngAfterViewInit will fire just after agStudio's
236
+ this._resolveFullyReady();
237
+ });
238
+ }
239
+ ngOnChanges(changes) {
240
+ if (this._initialised) {
241
+ // Run the changes outside of angular so any event handlers that are created do not trigger change detection
242
+ this._angularFrameworkOverrides.runOutsideAngular(() => {
243
+ const studioProperties = {};
244
+ for (const key of Object.keys(changes)) {
245
+ const value = changes[key];
246
+ studioProperties[key] = value.currentValue;
247
+ }
248
+ _processPropertyChanges(studioProperties, this.api);
249
+ });
250
+ }
251
+ }
252
+ ngOnDestroy() {
253
+ if (this._initialised) {
254
+ // need to do this before the destroy, so we know not to emit any events
255
+ // while tearing down the studio.
256
+ this._destroyed = true;
257
+ // could be null if studio failed to initialise
258
+ this.api?.destroy();
259
+ }
260
+ }
261
+ // we'll emit the emit if a user is listening for a given event either on the component via normal angular binding
262
+ // or via studioProperties
263
+ isEmitterUsed(eventType) {
264
+ const emitter = this[eventType];
265
+ // For RxJs compatibility we need to check for observed v7+ or observers v6
266
+ const emitterAny = emitter;
267
+ const hasEmitter = emitterAny?.observed ?? emitterAny?.observers?.length > 0;
268
+ // apiReady => onApiReady
269
+ const asEventName = `on${eventType.charAt(0).toUpperCase()}${eventType.substring(1)}`;
270
+ const hasStudioPropertyListener = !!this.studioProperties && !!this.studioProperties[asEventName];
271
+ return hasEmitter || hasStudioPropertyListener;
272
+ }
273
+ globalListener(eventType, event) {
274
+ // if we are tearing down, don't emit angular events, as this causes
275
+ // problems with the angular router
276
+ if (this._destroyed) {
277
+ return;
278
+ }
279
+ // generically look up the eventType
280
+ const emitter = this[eventType];
281
+ if (emitter && this.isEmitterUsed(eventType)) {
282
+ // Make sure we emit within the angular zone, so change detection works properly
283
+ const fireEmitter = () => this._angularFrameworkOverrides.runInsideAngular(() => emitter.emit(event));
284
+ if (this._holdEvents) {
285
+ // if the user is listening to events, wait for ngAfterViewInit to fire first, then emit the studio events
286
+ this._fullyReady.then(() => fireEmitter());
287
+ }
288
+ else {
289
+ fireEmitter();
290
+ }
291
+ }
292
+ }
293
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AgStudio, deps: [{ token: i0.ElementRef }, { token: AngularFrameworkOverrides }], target: i0.ɵɵFactoryTarget.Component }); }
294
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "18.2.14", type: AgStudio, isStandalone: true, selector: "ag-studio", inputs: { studioProperties: "studioProperties", modules: "modules", tabIndex: "tabIndex", enableRtl: ["enableRtl", "enableRtl", booleanAttribute], popupParent: "popupParent", theme: "theme", loadThemeGoogleFonts: ["loadThemeGoogleFonts", "loadThemeGoogleFonts", booleanAttribute], themeCssLayer: "themeCssLayer", styleNonce: "styleNonce", themeStyleContainer: "themeStyleContainer", getDocument: "getDocument", suppressTouch: ["suppressTouch", "suppressTouch", booleanAttribute], localeText: "localeText", getLocaleText: "getLocaleText", studioId: "studioId", context: "context", initialState: "initialState", data: "data", mode: "mode", layout: "layout", ai: "ai", overrides: "overrides", panels: "panels" }, outputs: { stateUpdated: "stateUpdated", apiReady: "apiReady", studioReady: "studioReady", errorRaised: "errorRaised" }, providers: [AngularFrameworkOverrides], usesOnChanges: true, ngImport: i0, template: '', isInline: true, encapsulation: i0.ViewEncapsulation.None }); }
295
+ }
296
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AgStudio, decorators: [{
297
+ type: Component,
298
+ args: [{
299
+ selector: 'ag-studio',
300
+ standalone: true,
301
+ template: '',
302
+ providers: [AngularFrameworkOverrides],
303
+ // tell angular we don't want view encapsulation, we don't want a shadow root
304
+ encapsulation: ViewEncapsulation.None,
305
+ }]
306
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: AngularFrameworkOverrides }], propDecorators: { studioProperties: [{
307
+ type: Input
308
+ }], modules: [{
309
+ type: Input
310
+ }], tabIndex: [{
311
+ type: Input
312
+ }], enableRtl: [{
313
+ type: Input,
314
+ args: [{ transform: booleanAttribute }]
315
+ }], popupParent: [{
316
+ type: Input
317
+ }], theme: [{
318
+ type: Input
319
+ }], loadThemeGoogleFonts: [{
320
+ type: Input,
321
+ args: [{ transform: booleanAttribute }]
322
+ }], themeCssLayer: [{
323
+ type: Input
324
+ }], styleNonce: [{
325
+ type: Input
326
+ }], themeStyleContainer: [{
327
+ type: Input
328
+ }], getDocument: [{
329
+ type: Input
330
+ }], suppressTouch: [{
331
+ type: Input,
332
+ args: [{ transform: booleanAttribute }]
333
+ }], localeText: [{
334
+ type: Input
335
+ }], getLocaleText: [{
336
+ type: Input
337
+ }], studioId: [{
338
+ type: Input
339
+ }], context: [{
340
+ type: Input
341
+ }], initialState: [{
342
+ type: Input
343
+ }], data: [{
344
+ type: Input
345
+ }], mode: [{
346
+ type: Input
347
+ }], layout: [{
348
+ type: Input
349
+ }], ai: [{
350
+ type: Input
351
+ }], overrides: [{
352
+ type: Input
353
+ }], panels: [{
354
+ type: Input
355
+ }], stateUpdated: [{
356
+ type: Output
357
+ }], apiReady: [{
358
+ type: Output
359
+ }], studioReady: [{
360
+ type: Output
361
+ }], errorRaised: [{
362
+ type: Output
363
+ }] } });
364
+ const booleanMixedStudioProperties = new Set(_BOOLEAN_MIXED_STUDIO_PROPERTIES);
365
+ /**
366
+ * Used to support the user setting combined boolean and string / object properties
367
+ * as plain HTML attributes and us correctly mapping that to true.
368
+ * For example cellSection can be boolean or an object
369
+ */
370
+ function getValueOrCoercedValue(key, valueToUse) {
371
+ if (booleanMixedStudioProperties.has(key)) {
372
+ // Handle plain HTML boolean attributes and convert them to boolean values
373
+ // Also handle the false string case to match Angular boolean attributes
374
+ // eslint-disable-next-line sonarjs/no-nested-conditional
375
+ return valueToUse === '' ? true : valueToUse === 'false' ? false : valueToUse;
376
+ }
377
+ return valueToUse;
378
+ }
379
+
380
+ class AgStudioModule {
381
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AgStudioModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
382
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: AgStudioModule, imports: [AgStudio], exports: [AgStudio] }); }
383
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AgStudioModule }); }
384
+ }
385
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AgStudioModule, decorators: [{
386
+ type: NgModule,
387
+ args: [{
388
+ imports: [AgStudio],
389
+ exports: [AgStudio],
390
+ }]
391
+ }] });
392
+
393
+ /**
394
+ * Generated bundle index. Do not edit.
395
+ */
396
+
397
+ export { AgStudio, AgStudioModule, AngularFrameworkOverrides };
398
+ //# sourceMappingURL=ag-studio-angular.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ag-studio-angular.mjs","sources":["../../../projects/ag-studio-angular/src/lib/angularFrameworkOverrides.ts","../../../projects/ag-studio-angular/src/lib/ag-studio.component.ts","../../../projects/ag-studio-angular/src/lib/ag-studio.module.ts","../../../projects/ag-studio-angular/src/ag-studio-angular.ts"],"sourcesContent":["import { Injectable, NgZone } from '@angular/core';\nimport { _VanillaFrameworkOverrides } from 'ag-studio';\n\nimport type { FrameworkOverridesIncomingSource } from 'ag-grid-enterprise';\n\n@Injectable()\nexport class AngularFrameworkOverrides extends _VanillaFrameworkOverrides {\n public override readonly batchFrameworkComps: boolean = true;\n\n // Flag used to control Zone behaviour when running tests as many test features rely on Zone.\n private readonly isRunningWithinTestZone: boolean = false;\n\n private readonly runOutside: <T>(callback: () => T, source?: FrameworkOverridesIncomingSource) => T;\n\n constructor(private readonly _ngZone: NgZone) {\n super('angular');\n\n this.isRunningWithinTestZone =\n (globalThis as any)?.AG_STUDIO_UNDER_TEST ?? !!(globalThis as any)?.Zone?.AsyncTestZoneSpec;\n\n if (!this._ngZone) {\n this.runOutside = (callback) => callback();\n } else if (this.isRunningWithinTestZone) {\n this.runOutside = (callback, source) => {\n if (source === 'resize-observer' || source === 'popupPositioning') {\n // ensure resize observer callbacks are run outside of Angular even under test due to Jest not supporting ResizeObserver\n // which means it just loops continuously with a setTimeout with no way to flush the queue or have fixture.whenStable() resolve.\n return this._ngZone.runOutsideAngular(callback);\n }\n // When under test run inside Angular so that tests can use fixture.whenStable() to wait for async operations to complete.\n return callback();\n };\n } else {\n this.runOutside = (callback) => this._ngZone.runOutsideAngular(callback);\n }\n }\n\n // Make all events run outside Angular as they often trigger the setup of event listeners\n // By having the event listeners outside Angular we can avoid triggering change detection\n // This also means that if a user calls an AG Studio API method from within their component\n // the internal side effects will not trigger change detection. Without this the events would\n // run inside Angular and trigger change detection as the source of the event was within the angular zone.\n override wrapIncoming: <T>(callback: () => T, source?: FrameworkOverridesIncomingSource) => T = (\n callback,\n source\n ) => this.runOutside(callback, source);\n\n /**\n * The shouldWrapOutgoing property is used to determine if events should be run outside of Angular or not.\n * If an event handler is registered outside of Angular then we should not wrap the event handler\n * with runInsideAngular() as the user may not have wanted this.\n * This is also used to not wrap internal event listeners that are registered with RowNodes and Columns.\n */\n public get shouldWrapOutgoing() {\n return this._ngZone && NgZone.isInAngularZone();\n }\n\n /**\n * Make sure that any code that is executed outside of AG Studio is running within the Angular zone.\n * This means users can update templates and use binding without having to do anything extra.\n */\n override wrapOutgoing: <T>(callback: () => T) => T = (callback) => this.runInsideAngular(callback);\n\n runInsideAngular<T>(callback: () => T): T {\n if (!this._ngZone || NgZone.isInAngularZone()) {\n return callback();\n }\n\n // Check for _ngZone existence as it is not present when Zoneless\n return this._ngZone.run(callback);\n }\n\n runOutsideAngular<T>(callback: () => T, source?: FrameworkOverridesIncomingSource): T {\n return this.runOutside(callback, source);\n }\n}\n","/* eslint-disable no-duplicate-imports */\n// False positive lint error, ElementRef and co can't be type imports\n// eslint-disable-next-line @typescript-eslint/consistent-type-imports\nimport {\n AfterViewInit,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n ViewEncapsulation,\n booleanAttribute,\n} from '@angular/core';\nimport type { AgStudioApi, AgStudioModule, AgStudioProperties, _StudioParams } from 'ag-studio';\nimport {\n _BOOLEAN_MIXED_STUDIO_PROPERTIES,\n _combineAttributesAndStudioProperties,\n _createStudio,\n _processPropertyChanges,\n} from 'ag-studio';\n// @START_IMPORTS@\nimport type {\n AgAiAssistant,\n AgDataEngine,\n AgDataSourcesDefinition,\n AgPageLayoutState,\n AgPanelConfig,\n AgReportState,\n AgStudioApiReadyEvent,\n AgStudioErrorRaisedEvent,\n AgStudioGetLocaleTextParams,\n AgStudioLocaleText,\n AgStudioMode,\n AgStudioOverrides,\n AgStudioReadyEvent,\n AgStudioStateUpdatedEvent,\n AgStudioTheme,\n} from 'ag-studio';\n\n// @END_IMPORTS@\n\nimport { AngularFrameworkOverrides } from './angularFrameworkOverrides';\n\n@Component({\n selector: 'ag-studio',\n standalone: true,\n template: '',\n providers: [AngularFrameworkOverrides],\n // tell angular we don't want view encapsulation, we don't want a shadow root\n encapsulation: ViewEncapsulation.None,\n})\nexport class AgStudio implements AfterViewInit, OnChanges, OnDestroy {\n // not intended for user to interact with. so putting _ in so if user gets reference\n // to this object, they kind'a know it's not part of the agreed interface\n private readonly _nativeElement: any;\n private _initialised = false;\n private _destroyed = false;\n\n // in order to ensure firing of apiReady is deterministic\n private _holdEvents = true;\n private _resolveFullyReady: () => void;\n private readonly _fullyReady: Promise<void> = new Promise((resolve) => {\n this._resolveFullyReady = resolve;\n });\n\n /** Dash Api available after onApiReady event has fired. */\n public api: AgStudioApi;\n\n constructor(\n elementDef: ElementRef,\n private readonly _angularFrameworkOverrides: AngularFrameworkOverrides\n ) {\n this._nativeElement = elementDef.nativeElement;\n // NOSONAR\n this._fullyReady.then(() => {\n // Register the status flag reset before any events are fired\n // so that we can swap to synchronous event firing as soon as the studio is ready\n this._holdEvents = false;\n });\n }\n\n ngAfterViewInit(): void {\n // Run the setup outside of angular so all the event handlers that are created do not trigger change detection\n this._angularFrameworkOverrides.runOutsideAngular(() => {\n // Get all the inputs that are valid AgStudioProperties\n const studioPropertiesKeys = Object.keys(this).filter(\n (key) =>\n !(\n key.startsWith('_') ||\n key == 'studioProperties' ||\n key == 'modules' ||\n this[key as keyof AgStudio] instanceof EventEmitter\n )\n );\n\n const coercedStudioProperties = {} as AgStudioProperties;\n for (const key of studioPropertiesKeys) {\n const valueToUse = getValueOrCoercedValue(key, this[key as keyof AgStudio]);\n coercedStudioProperties[key as keyof AgStudioProperties] = valueToUse;\n }\n\n const mergedStudioProperties = _combineAttributesAndStudioProperties(\n this.studioProperties,\n coercedStudioProperties,\n studioPropertiesKeys\n );\n\n const studioParams: _StudioParams = {\n globalListener: this.globalListener.bind(this),\n frameworkOverrides: this._angularFrameworkOverrides,\n setThemeOnRootDiv: true,\n modules: this.modules,\n };\n\n const api = _createStudio(this._nativeElement, mergedStudioProperties, studioParams);\n if (api) {\n this.api = api;\n }\n\n this._initialised = true;\n\n // sometimes, especially in large client apps apiReady can fire before ngAfterViewInit\n // this ties these together so that apiReady will always fire after agStudio's ngAfterViewInit\n // the actual containing component's ngAfterViewInit will fire just after agStudio's\n this._resolveFullyReady();\n });\n }\n\n public ngOnChanges(changes: any): void {\n if (this._initialised) {\n // Run the changes outside of angular so any event handlers that are created do not trigger change detection\n this._angularFrameworkOverrides.runOutsideAngular(() => {\n const studioProperties: AgStudioProperties = {};\n for (const key of Object.keys(changes)) {\n const value = changes[key];\n studioProperties[key as keyof AgStudioProperties] = value.currentValue;\n }\n _processPropertyChanges(studioProperties, this.api);\n });\n }\n }\n\n public ngOnDestroy(): void {\n if (this._initialised) {\n // need to do this before the destroy, so we know not to emit any events\n // while tearing down the studio.\n this._destroyed = true;\n // could be null if studio failed to initialise\n this.api?.destroy();\n }\n }\n\n // we'll emit the emit if a user is listening for a given event either on the component via normal angular binding\n // or via studioProperties\n protected isEmitterUsed(eventType: string): boolean {\n const emitter = <EventEmitter<any>>(<any>this)[eventType];\n // For RxJs compatibility we need to check for observed v7+ or observers v6\n const emitterAny = emitter as any;\n const hasEmitter = emitterAny?.observed ?? emitterAny?.observers?.length > 0;\n\n // apiReady => onApiReady\n const asEventName = `on${eventType.charAt(0).toUpperCase()}${eventType.substring(1)}`;\n const hasStudioPropertyListener = !!this.studioProperties && !!(this.studioProperties as any)[asEventName];\n\n return hasEmitter || hasStudioPropertyListener;\n }\n\n private globalListener(eventType: string, event: any): void {\n // if we are tearing down, don't emit angular events, as this causes\n // problems with the angular router\n if (this._destroyed) {\n return;\n }\n\n // generically look up the eventType\n const emitter = <EventEmitter<any>>(<any>this)[eventType];\n if (emitter && this.isEmitterUsed(eventType)) {\n // Make sure we emit within the angular zone, so change detection works properly\n const fireEmitter = () => this._angularFrameworkOverrides.runInsideAngular(() => emitter.emit(event));\n\n if (this._holdEvents) {\n // if the user is listening to events, wait for ngAfterViewInit to fire first, then emit the studio events\n this._fullyReady.then(() => fireEmitter());\n } else {\n fireEmitter();\n }\n }\n }\n\n /** Provided an initial studioProperties configuration to the component. If a property is specified in both studioProperties and via component binding the component binding takes precedence. */\n @Input() public studioProperties: AgStudioProperties | undefined;\n /**\n * Used to register AG Studio Modules directly with this instance of Studio.\n */\n @Input() public modules: AgStudioModule[] | undefined;\n\n // @START@\n /** Change this value to set the tabIndex order of Studio within your application.\n * @default 0\n * @initial\n */\n @Input() public tabIndex: number | undefined = undefined;\n /** Set to `true` to operate Studio in RTL (Right to Left) mode.\n * @default false\n * @initial\n */\n @Input({ transform: booleanAttribute }) public enableRtl: boolean | undefined = undefined;\n /** DOM element to use as the popup parent for Studio popups (context menus, etc.).\n */\n @Input() public popupParent: HTMLElement | null | undefined = undefined;\n /** Theme to apply to Studio.\n *\n * @default studioTheme\n */\n @Input() public theme: AgStudioTheme | undefined = undefined;\n /** If your theme uses a font that is available on Google Fonts, pass true to load it from Google's CDN.\n */\n @Input({ transform: booleanAttribute }) public loadThemeGoogleFonts: boolean | undefined = undefined;\n /** The CSS layer that this theme should be rendered onto. When specified,\n * Studio CSS will be wrapped in a `@layer ${themeCssLayer} { ... }` block.\n *\n * NOTE: when specifying `themeCssLayer` we recommend setting\n * `themeStyleContainer` to `document.body` to ensure that Studio CSS\n * comes after your application CSS, allowing your application to set the\n * order of layers.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/@layer\n */\n @Input() public themeCssLayer: string | undefined = undefined;\n /** The nonce attribute to set on style elements added to the document by\n * themes. If \"foo\" is passed to this property, Studio can use the Content\n * Security Policy `style-src 'nonce-foo'`, instead of the less secure\n * `style-src 'unsafe-inline'`.\n *\n * Note: CSP nonces are global to a page, where a page has multiple Studio components,\n * every one must have the same styleNonce set.\n */\n @Input() public styleNonce: string | undefined = undefined;\n /** An element to insert style elements into when injecting styles into the\n * Studio. Styles are inserted at the start of the element.\n *\n * If undefined, styles will be added to the document head for Studio components\n * rendered in the main document fragment, or to Studio wrapper element\n * for other Studio components (e.g. those rendered in a shadow DOM or detached from the\n * document).\n *\n * @initial\n */\n @Input() public themeStyleContainer: (HTMLElement | (() => HTMLElement | void)) | undefined = undefined;\n /** Allows overriding what `document` is used.\n * Use this when you want Studio to use a different `document` than the one available on the global scope.\n * This can happen if docking out components (something which Electron supports).\n */\n @Input() public getDocument: (() => Document) | undefined = undefined;\n /** Disables touch support (but does not remove the browser's efforts to simulate mouse events on touch).\n * @default false\n * @initial\n */\n @Input({ transform: booleanAttribute }) public suppressTouch: boolean | undefined = undefined;\n /** A map of key->value pairs for localising text within Studio.\n * @initial\n */\n @Input() public localeText: AgStudioLocaleText | undefined = undefined;\n /** A callback for localising text within Studio.\n * @initial\n */\n @Input() public getLocaleText: ((params: AgStudioGetLocaleTextParams) => string) | undefined = undefined;\n /** Provide a custom `studioId` for this instance of Studio. Value will be set on the root DOM node using the attribute `studio-id` as well as being accessible via the `api.getStudioId()` method.\n * @initial\n */\n @Input() public studioId: string | undefined = undefined;\n /** Provides a context object that is provided to different callbacks Studio uses. Used for passing additional information to the callbacks used by your application.\n * @initial\n */\n @Input() public context: any = undefined;\n /** Initial state for Studio. Only read once on initialization. Can be used in conjunction with `api.getState()` to save and restore Studio state.\n * @initial\n */\n @Input() public initialState: AgReportState | undefined = undefined;\n /** Defines the data sources used by Studio.\n *\n * If updated after initially being set, only changes to synchronous data will be processed.\n * Any other changes will be ignored (e.g. adding/removing data sources, updating fields, etc.)\n */\n @Input() public data: AgDataSourcesDefinition | AgDataEngine | undefined = undefined;\n /** Which mode Studio is in.\n * @default 'view'\n */\n @Input() public mode: AgStudioMode | undefined = undefined;\n /** Default layout styling.\n */\n @Input() public layout: Partial<AgPageLayoutState> | undefined = undefined;\n /** AI Assistant configuration.\n * @initial\n */\n @Input() public ai: AgAiAssistant | undefined = undefined;\n /** Overrides for the layout and widget configs.\n */\n @Input() public overrides: AgStudioOverrides | undefined = undefined;\n /** Configure which panels are displayed and on which side.\n */\n @Input() public panels: AgPanelConfig | undefined = undefined;\n\n /** State has been updated.\n */\n @Output() public stateUpdated: EventEmitter<AgStudioStateUpdatedEvent> =\n new EventEmitter<AgStudioStateUpdatedEvent>();\n /** The API has been initialised and is ready for most calls. The data engine has not been initialised yet, and the UI is not ready.\n */\n @Output() public apiReady: EventEmitter<AgStudioApiReadyEvent> = new EventEmitter<AgStudioApiReadyEvent>();\n /** The data engine has been initialised, and the UI has been created, but may not be fully rendered yet.\n */\n @Output() public studioReady: EventEmitter<AgStudioReadyEvent> = new EventEmitter<AgStudioReadyEvent>();\n /** An error has occurred within Studio.\n */\n @Output() public errorRaised: EventEmitter<AgStudioErrorRaisedEvent> = new EventEmitter<AgStudioErrorRaisedEvent>();\n\n // @END@\n}\n\nconst booleanMixedStudioProperties = new Set<string>(_BOOLEAN_MIXED_STUDIO_PROPERTIES);\n/**\n * Used to support the user setting combined boolean and string / object properties\n * as plain HTML attributes and us correctly mapping that to true.\n * For example cellSection can be boolean or an object\n */\nfunction getValueOrCoercedValue(key: string, valueToUse: any): any {\n if (booleanMixedStudioProperties.has(key)) {\n // Handle plain HTML boolean attributes and convert them to boolean values\n // Also handle the false string case to match Angular boolean attributes\n // eslint-disable-next-line sonarjs/no-nested-conditional\n return valueToUse === '' ? true : valueToUse === 'false' ? false : valueToUse;\n }\n return valueToUse;\n}\n","import { NgModule } from '@angular/core';\n\nimport { AgStudio } from './ag-studio.component';\n\n@NgModule({\n imports: [AgStudio],\n exports: [AgStudio],\n})\nexport class AgStudioModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.AngularFrameworkOverrides"],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ /// <amd-module name="ag-studio-angular" />
5
+ export * from './public-api';
@@ -0,0 +1,150 @@
1
+ import { AfterViewInit, ElementRef, EventEmitter, OnChanges, OnDestroy } from '@angular/core';
2
+ import type { AgStudioApi, AgStudioModule, AgStudioProperties } from 'ag-studio';
3
+ import type { AgAiAssistant, AgDataEngine, AgDataSourcesDefinition, AgPageLayoutState, AgPanelConfig, AgReportState, AgStudioApiReadyEvent, AgStudioErrorRaisedEvent, AgStudioGetLocaleTextParams, AgStudioLocaleText, AgStudioMode, AgStudioOverrides, AgStudioReadyEvent, AgStudioStateUpdatedEvent, AgStudioTheme } from 'ag-studio';
4
+ import { AngularFrameworkOverrides } from './angularFrameworkOverrides';
5
+ import * as i0 from "@angular/core";
6
+ export declare class AgStudio implements AfterViewInit, OnChanges, OnDestroy {
7
+ private readonly _angularFrameworkOverrides;
8
+ private readonly _nativeElement;
9
+ private _initialised;
10
+ private _destroyed;
11
+ private _holdEvents;
12
+ private _resolveFullyReady;
13
+ private readonly _fullyReady;
14
+ /** Dash Api available after onApiReady event has fired. */
15
+ api: AgStudioApi;
16
+ constructor(elementDef: ElementRef, _angularFrameworkOverrides: AngularFrameworkOverrides);
17
+ ngAfterViewInit(): void;
18
+ ngOnChanges(changes: any): void;
19
+ ngOnDestroy(): void;
20
+ protected isEmitterUsed(eventType: string): boolean;
21
+ private globalListener;
22
+ /** Provided an initial studioProperties configuration to the component. If a property is specified in both studioProperties and via component binding the component binding takes precedence. */
23
+ studioProperties: AgStudioProperties | undefined;
24
+ /**
25
+ * Used to register AG Studio Modules directly with this instance of Studio.
26
+ */
27
+ modules: AgStudioModule[] | undefined;
28
+ /** Change this value to set the tabIndex order of Studio within your application.
29
+ * @default 0
30
+ * @initial
31
+ */
32
+ tabIndex: number | undefined;
33
+ /** Set to `true` to operate Studio in RTL (Right to Left) mode.
34
+ * @default false
35
+ * @initial
36
+ */
37
+ enableRtl: boolean | undefined;
38
+ /** DOM element to use as the popup parent for Studio popups (context menus, etc.).
39
+ */
40
+ popupParent: HTMLElement | null | undefined;
41
+ /** Theme to apply to Studio.
42
+ *
43
+ * @default studioTheme
44
+ */
45
+ theme: AgStudioTheme | undefined;
46
+ /** If your theme uses a font that is available on Google Fonts, pass true to load it from Google's CDN.
47
+ */
48
+ loadThemeGoogleFonts: boolean | undefined;
49
+ /** The CSS layer that this theme should be rendered onto. When specified,
50
+ * Studio CSS will be wrapped in a `@layer ${themeCssLayer} { ... }` block.
51
+ *
52
+ * NOTE: when specifying `themeCssLayer` we recommend setting
53
+ * `themeStyleContainer` to `document.body` to ensure that Studio CSS
54
+ * comes after your application CSS, allowing your application to set the
55
+ * order of layers.
56
+ *
57
+ * @see https://developer.mozilla.org/en-US/docs/Web/CSS/@layer
58
+ */
59
+ themeCssLayer: string | undefined;
60
+ /** The nonce attribute to set on style elements added to the document by
61
+ * themes. If "foo" is passed to this property, Studio can use the Content
62
+ * Security Policy `style-src 'nonce-foo'`, instead of the less secure
63
+ * `style-src 'unsafe-inline'`.
64
+ *
65
+ * Note: CSP nonces are global to a page, where a page has multiple Studio components,
66
+ * every one must have the same styleNonce set.
67
+ */
68
+ styleNonce: string | undefined;
69
+ /** An element to insert style elements into when injecting styles into the
70
+ * Studio. Styles are inserted at the start of the element.
71
+ *
72
+ * If undefined, styles will be added to the document head for Studio components
73
+ * rendered in the main document fragment, or to Studio wrapper element
74
+ * for other Studio components (e.g. those rendered in a shadow DOM or detached from the
75
+ * document).
76
+ *
77
+ * @initial
78
+ */
79
+ themeStyleContainer: (HTMLElement | (() => HTMLElement | void)) | undefined;
80
+ /** Allows overriding what `document` is used.
81
+ * Use this when you want Studio to use a different `document` than the one available on the global scope.
82
+ * This can happen if docking out components (something which Electron supports).
83
+ */
84
+ getDocument: (() => Document) | undefined;
85
+ /** Disables touch support (but does not remove the browser's efforts to simulate mouse events on touch).
86
+ * @default false
87
+ * @initial
88
+ */
89
+ suppressTouch: boolean | undefined;
90
+ /** A map of key->value pairs for localising text within Studio.
91
+ * @initial
92
+ */
93
+ localeText: AgStudioLocaleText | undefined;
94
+ /** A callback for localising text within Studio.
95
+ * @initial
96
+ */
97
+ getLocaleText: ((params: AgStudioGetLocaleTextParams) => string) | undefined;
98
+ /** Provide a custom `studioId` for this instance of Studio. Value will be set on the root DOM node using the attribute `studio-id` as well as being accessible via the `api.getStudioId()` method.
99
+ * @initial
100
+ */
101
+ studioId: string | undefined;
102
+ /** Provides a context object that is provided to different callbacks Studio uses. Used for passing additional information to the callbacks used by your application.
103
+ * @initial
104
+ */
105
+ context: any;
106
+ /** Initial state for Studio. Only read once on initialization. Can be used in conjunction with `api.getState()` to save and restore Studio state.
107
+ * @initial
108
+ */
109
+ initialState: AgReportState | undefined;
110
+ /** Defines the data sources used by Studio.
111
+ *
112
+ * If updated after initially being set, only changes to synchronous data will be processed.
113
+ * Any other changes will be ignored (e.g. adding/removing data sources, updating fields, etc.)
114
+ */
115
+ data: AgDataSourcesDefinition | AgDataEngine | undefined;
116
+ /** Which mode Studio is in.
117
+ * @default 'view'
118
+ */
119
+ mode: AgStudioMode | undefined;
120
+ /** Default layout styling.
121
+ */
122
+ layout: Partial<AgPageLayoutState> | undefined;
123
+ /** AI Assistant configuration.
124
+ * @initial
125
+ */
126
+ ai: AgAiAssistant | undefined;
127
+ /** Overrides for the layout and widget configs.
128
+ */
129
+ overrides: AgStudioOverrides | undefined;
130
+ /** Configure which panels are displayed and on which side.
131
+ */
132
+ panels: AgPanelConfig | undefined;
133
+ /** State has been updated.
134
+ */
135
+ stateUpdated: EventEmitter<AgStudioStateUpdatedEvent>;
136
+ /** The API has been initialised and is ready for most calls. The data engine has not been initialised yet, and the UI is not ready.
137
+ */
138
+ apiReady: EventEmitter<AgStudioApiReadyEvent>;
139
+ /** The data engine has been initialised, and the UI has been created, but may not be fully rendered yet.
140
+ */
141
+ studioReady: EventEmitter<AgStudioReadyEvent>;
142
+ /** An error has occurred within Studio.
143
+ */
144
+ errorRaised: EventEmitter<AgStudioErrorRaisedEvent>;
145
+ static ɵfac: i0.ɵɵFactoryDeclaration<AgStudio, never>;
146
+ static ɵcmp: i0.ɵɵComponentDeclaration<AgStudio, "ag-studio", never, { "studioProperties": { "alias": "studioProperties"; "required": false; }; "modules": { "alias": "modules"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "enableRtl": { "alias": "enableRtl"; "required": false; }; "popupParent": { "alias": "popupParent"; "required": false; }; "theme": { "alias": "theme"; "required": false; }; "loadThemeGoogleFonts": { "alias": "loadThemeGoogleFonts"; "required": false; }; "themeCssLayer": { "alias": "themeCssLayer"; "required": false; }; "styleNonce": { "alias": "styleNonce"; "required": false; }; "themeStyleContainer": { "alias": "themeStyleContainer"; "required": false; }; "getDocument": { "alias": "getDocument"; "required": false; }; "suppressTouch": { "alias": "suppressTouch"; "required": false; }; "localeText": { "alias": "localeText"; "required": false; }; "getLocaleText": { "alias": "getLocaleText"; "required": false; }; "studioId": { "alias": "studioId"; "required": false; }; "context": { "alias": "context"; "required": false; }; "initialState": { "alias": "initialState"; "required": false; }; "data": { "alias": "data"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "layout": { "alias": "layout"; "required": false; }; "ai": { "alias": "ai"; "required": false; }; "overrides": { "alias": "overrides"; "required": false; }; "panels": { "alias": "panels"; "required": false; }; }, { "stateUpdated": "stateUpdated"; "apiReady": "apiReady"; "studioReady": "studioReady"; "errorRaised": "errorRaised"; }, never, never, true, never>;
147
+ static ngAcceptInputType_enableRtl: unknown;
148
+ static ngAcceptInputType_loadThemeGoogleFonts: unknown;
149
+ static ngAcceptInputType_suppressTouch: unknown;
150
+ }
@@ -0,0 +1,7 @@
1
+ import * as i0 from "@angular/core";
2
+ import * as i1 from "./ag-studio.component";
3
+ export declare class AgStudioModule {
4
+ static ɵfac: i0.ɵɵFactoryDeclaration<AgStudioModule, never>;
5
+ static ɵmod: i0.ɵɵNgModuleDeclaration<AgStudioModule, never, [typeof i1.AgStudio], [typeof i1.AgStudio]>;
6
+ static ɵinj: i0.ɵɵInjectorDeclaration<AgStudioModule>;
7
+ }
@@ -0,0 +1,28 @@
1
+ import { NgZone } from '@angular/core';
2
+ import { _VanillaFrameworkOverrides } from 'ag-studio';
3
+ import type { FrameworkOverridesIncomingSource } from 'ag-grid-enterprise';
4
+ import * as i0 from "@angular/core";
5
+ export declare class AngularFrameworkOverrides extends _VanillaFrameworkOverrides {
6
+ private readonly _ngZone;
7
+ readonly batchFrameworkComps: boolean;
8
+ private readonly isRunningWithinTestZone;
9
+ private readonly runOutside;
10
+ constructor(_ngZone: NgZone);
11
+ wrapIncoming: <T>(callback: () => T, source?: FrameworkOverridesIncomingSource) => T;
12
+ /**
13
+ * The shouldWrapOutgoing property is used to determine if events should be run outside of Angular or not.
14
+ * If an event handler is registered outside of Angular then we should not wrap the event handler
15
+ * with runInsideAngular() as the user may not have wanted this.
16
+ * This is also used to not wrap internal event listeners that are registered with RowNodes and Columns.
17
+ */
18
+ get shouldWrapOutgoing(): boolean;
19
+ /**
20
+ * Make sure that any code that is executed outside of AG Studio is running within the Angular zone.
21
+ * This means users can update templates and use binding without having to do anything extra.
22
+ */
23
+ wrapOutgoing: <T>(callback: () => T) => T;
24
+ runInsideAngular<T>(callback: () => T): T;
25
+ runOutsideAngular<T>(callback: () => T, source?: FrameworkOverridesIncomingSource): T;
26
+ static ɵfac: i0.ɵɵFactoryDeclaration<AngularFrameworkOverrides, never>;
27
+ static ɵprov: i0.ɵɵInjectableDeclaration<AngularFrameworkOverrides>;
28
+ }
package/package.json CHANGED
@@ -1,20 +1,32 @@
1
1
  {
2
2
  "name": "ag-studio-angular",
3
- "version": "0.0.1",
4
- "main": "index.js",
5
- "scripts": {
6
- "test": "echo \"Error: no test specified\" && exit 1"
7
- },
8
- "keywords": [],
9
- "author": "Sean Landsman <sean@thelandsmans.com>",
3
+ "version": "1.0.0",
4
+ "description": "AG Studio Angular Component",
10
5
  "license": "Commercial",
11
- "browserslist": [
12
- "> 1%",
13
- "last 2 versions",
14
- "not ie >= 0",
15
- "not ie_mob >= 0",
16
- "not blackberry > 0"
17
- ],
18
- "homepage": "https://www.ag-grid.com/",
19
- "description": ""
20
- }
6
+ "peerDependencies": {
7
+ "@angular/common": ">= 18.0.0",
8
+ "@angular/core": ">= 18.0.0"
9
+ },
10
+ "dependencies": {
11
+ "ag-studio": "1.0.0",
12
+ "tslib": "^2.3.0"
13
+ },
14
+ "bugs": {
15
+ "url": "https://ag-grid.zendesk.com/"
16
+ },
17
+ "homepage": "https://www.ag-grid.com/studio/",
18
+ "module": "fesm2022/ag-studio-angular.mjs",
19
+ "typings": "index.d.ts",
20
+ "exports": {
21
+ "./package.json": {
22
+ "default": "./package.json"
23
+ },
24
+ ".": {
25
+ "types": "./index.d.ts",
26
+ "esm2022": "./esm2022/ag-studio-angular.mjs",
27
+ "esm": "./esm2022/ag-studio-angular.mjs",
28
+ "default": "./fesm2022/ag-studio-angular.mjs"
29
+ }
30
+ },
31
+ "sideEffects": false
32
+ }
@@ -0,0 +1,3 @@
1
+ export * from './lib/ag-studio.component';
2
+ export * from './lib/ag-studio.module';
3
+ export * from './lib/angularFrameworkOverrides';
package/index.js DELETED
@@ -1 +0,0 @@
1
- console.log("Hello World");