diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/README.md b/web/skins/classic/assets/gridstack-12.3.3/dist/angular/README.md deleted file mode 100644 index 79abfc0ff..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/README.md +++ /dev/null @@ -1,211 +0,0 @@ -# Angular wrapper - -The Angular [wrapper component](projects/lib/src/lib/gridstack.component.ts) is a better way to use Gridstack, but alternative raw [ngFor](projects/demo/src/app/ngFor.ts) or [simple](projects/demo/src/app/simple.ts) demos are also given. - -Running version can be seen here https://stackblitz.com/edit/gridstack-angular - -# Dynamic grid items - -this is the recommended way if you are going to have multiple grids (alow drag&drop between) or drag from toolbar to create items, or drag to remove items, etc... - -I.E. don't use Angular templating to create grid items as that is harder to sync when gridstack will also add/remove items. - -MyComponent HTML - -```html - -``` - -MyComponent CSS - -```css -@import "gridstack/dist/gridstack.min.css"; - -.grid-stack { - background: #fafad2; -} -.grid-stack-item-content { - text-align: center; - background-color: #18bc9c; -} -``` - - -Standalone MyComponent Code - -```ts -import { GridStackOptions } from 'gridstack'; -import { GridstackComponent, GridstackItemComponent } from 'gridstack/dist/angular'; - -@Component({ - imports: [ // SKIP if doing module import instead (next) - GridstackComponent, - GridstackItemComponent - ] - ... - }) -export class MyComponent { - // sample grid options + items to load... - public gridOptions: GridStackOptions = { - margin: 5, - children: [ // or call load(children) or addWidget(children[0]) with same data - {x:0, y:0, minW:2, content:'Item 1'}, - {x:1, y:0, content:'Item 2'}, - {x:0, y:1, content:'Item 3'}, - ] - } - -} -``` - -IF doing module import instead of standalone, you will also need this: - -```ts -import { GridstackModule } from 'gridstack/dist/angular'; - -@NgModule({ - imports: [GridstackModule, ...] - ... - bootstrap: [AppComponent] -}) -export class AppModule { } -``` - -# More Complete example - -In this example (build on previous one) will use your actual custom angular components inside each grid item (instead of dummy html content) and have per component saved settings as well (using BaseWidget). - -HTML - -```html - -
message when grid is empty
-
-``` - -Code - -```ts -import { Component } from '@angular/core'; -import { GridStack, GridStackOptions } from 'gridstack'; -import { GridstackComponent, gsCreateNgComponents, NgGridStackWidget, nodesCB, BaseWidget } from 'gridstack/dist/angular'; - -// some custom components -@Component({ - selector: 'app-a', - template: 'Comp A {{text}}', -}) -export class AComponent extends BaseWidget implements OnDestroy { - @Input() text: string = 'foo'; // test custom input data - public override serialize(): NgCompInputs | undefined { return this.text ? {text: this.text} : undefined; } - ngOnDestroy() { - console.log('Comp A destroyed'); // test to make sure cleanup happens - } -} - -@Component({ - selector: 'app-b', - template: 'Comp B', -}) -export class BComponent extends BaseWidget { -} - -// ...in your module (classic), OR your ng19 app.config provideEnvironmentInitializer call this: -constructor() { - // register all our dynamic components types created by the grid - GridstackComponent.addComponentToSelectorType([AComponent, BComponent]) ; -} - -// now our content will use Components instead of dummy html content -public gridOptions: NgGridStackOptions = { - margin: 5, - minRow: 1, // make space for empty message - children: [ // or call load()/addWidget() with same data - {x:0, y:0, minW:2, selector:'app-a'}, - {x:1, y:0, minW:2, selector:'app-a', input: { text: 'bar' }}, // custom input that works using BaseWidget.deserialize() Object.assign(this, w.input) - {x:2, y:0, selector:'app-b'}, - {x:3, y:0, content:'plain html'}, - ] -} - -// called whenever items change size/position/etc.. see other events -public onChange(data: nodesCB) { - console.log('change ', data.nodes.length > 1 ? data.nodes : data.nodes[0]); -} -``` - -# ngFor with wrapper - -For simple case where you control the children creation (gridstack doesn't do create or re-parenting) - -HTML - -```html - - - @for (n of items; track n.id) { - Item {{n.id}} - } - - Item {{n.id}} - -``` - -Code - -```javascript -import { GridStackOptions, GridStackWidget } from 'gridstack'; -import { nodesCB } from 'gridstack/dist/angular'; - -/** sample grid options and items to load... */ -public gridOptions: GridStackOptions = { margin: 5 } -public items: GridStackWidget[] = [ - {x:0, y:0, minW:2, id:'1'}, // must have unique id used for trackBy - {x:1, y:0, id:'2'}, - {x:0, y:1, id:'3'}, -]; - -// called whenever items change size/position/etc.. -public onChange(data: nodesCB) { - console.log('change ', data.nodes.length > 1 ? data.nodes : data.nodes[0]); -} - -// ngFor unique node id to have correct match between our items used and GS -public identify(index: number, w: GridStackWidget) { - return w.id; // or use index if no id is set and you only modify at the end... -} -``` - -## Demo - -You can see a fuller example at [app.component.ts](projects/demo/src/app/app.component.ts) - -to build the demo, go to [angular/projects/demo](projects/demo/) and run `yarn` + `yarn start` and navigate to `http://localhost:4200/` - -Code started shipping with v8.1.2+ in `dist/angular` for people to use directly and is an angular module! (source code under `dist/angular/src`) - -## Caveats - -- This wrapper needs: - - gridstack v8+ to run as it needs the latest changes (use older version that matches GS versions) - - Angular 14+ for dynamic `createComponent()` API and Standalone Components (verified against 19+) - -NOTE: if you are on Angular 13 or below: copy the wrapper code over (or patch it - see main page example) and change `createComponent()` calls to use old API instead: -NOTE2: now that we're using standalone, you will also need to remove `standalone: true` and `imports` on each component so you will to copy those locally (or use <11.1.2 version) -```ts -protected resolver: ComponentFactoryResolver, -... -const factory = this.resolver.resolveComponentFactory(GridItemComponent); -const gridItemRef = grid.container.createComponent(factory) as ComponentRef; -// ...do the same for widget selector... -``` - -## ngFor Caveats - -- This wrapper handles well ngFor loops, but if you're using a trackBy function (as I would recommend) and no element id change after an update, - you must manually update the `GridstackItemComponent.option` directly - see [modifyNgFor()](./projects/demo/src/app/app.component.ts#L202) example. -- The original client list of items is not updated to match **content** changes made by gridstack (TBD later), but adding new item or removing (as shown in demo) will update those new items. Client could use change/added/removed events to sync that list if they wish to do so. - -Would appreciate getting help doing the same for React and Vue (2 other popular frameworks) - --Alain diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/esm2020/gridstack-angular.mjs b/web/skins/classic/assets/gridstack-12.3.3/dist/angular/esm2020/gridstack-angular.mjs deleted file mode 100644 index d468a8234..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/esm2020/gridstack-angular.mjs +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Generated bundle index. Do not edit. - */ -export * from './index'; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0YWNrLWFuZ3VsYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hbmd1bGFyL3Byb2plY3RzL2xpYi9zcmMvZ3JpZHN0YWNrLWFuZ3VsYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0= \ No newline at end of file diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/esm2020/index.mjs b/web/skins/classic/assets/gridstack-12.3.3/dist/angular/esm2020/index.mjs deleted file mode 100644 index 6760a86f3..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/esm2020/index.mjs +++ /dev/null @@ -1,9 +0,0 @@ -/* - * Public API Surface of gridstack-angular - */ -export * from './lib/types'; -export * from './lib/base-widget'; -export * from './lib/gridstack-item.component'; -export * from './lib/gridstack.component'; -export * from './lib/gridstack.module'; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hbmd1bGFyL3Byb2plY3RzL2xpYi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLHdCQUF3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBncmlkc3RhY2stYW5ndWxhclxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2Jhc2Utd2lkZ2V0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2dyaWRzdGFjay1pdGVtLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9ncmlkc3RhY2suY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2dyaWRzdGFjay5tb2R1bGUnO1xuIl19 \ No newline at end of file diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/esm2020/lib/base-widget.mjs b/web/skins/classic/assets/gridstack-12.3.3/dist/angular/esm2020/lib/base-widget.mjs deleted file mode 100644 index ebc09ba53..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/esm2020/lib/base-widget.mjs +++ /dev/null @@ -1,90 +0,0 @@ -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -/** - * Abstract base class that all custom widgets should extend. - * - * This class provides the interface needed for GridstackItemComponent to: - * - Serialize/deserialize widget data - * - Save/restore widget state - * - Integrate with Angular lifecycle - * - * Extend this class when creating custom widgets for dynamic grids. - * - * @example - * ```typescript - * @Component({ - * selector: 'my-custom-widget', - * template: '
{{data}}
' - * }) - * export class MyCustomWidget extends BaseWidget { - * @Input() data: string = ''; - * - * serialize() { - * return { data: this.data }; - * } - * } - * ``` - */ -import { Injectable } from '@angular/core'; -import * as i0 from "@angular/core"; -/** - * Base widget class for GridStack Angular integration. - */ -export class BaseWidget { - /** - * Override this method to return serializable data for this widget. - * - * Return an object with properties that map to your component's @Input() fields. - * The selector is handled automatically, so only include component-specific data. - * - * @returns Object containing serializable component data - * - * @example - * ```typescript - * serialize() { - * return { - * title: this.title, - * value: this.value, - * settings: this.settings - * }; - * } - * ``` - */ - serialize() { return; } - /** - * Override this method to handle widget restoration from saved data. - * - * Use this for complex initialization that goes beyond simple @Input() mapping. - * The default implementation automatically assigns input data to component properties. - * - * @param w The saved widget data including input properties - * - * @example - * ```typescript - * deserialize(w: NgGridStackWidget) { - * super.deserialize(w); // Call parent for basic setup - * - * // Custom initialization logic - * if (w.input?.complexData) { - * this.processComplexData(w.input.complexData); - * } - * } - * ``` - */ - deserialize(w) { - // save full description for meta data - this.widgetItem = w; - if (!w) - return; - if (w.input) - Object.assign(this, w.input); - } -} -BaseWidget.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseWidget, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); -BaseWidget.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseWidget }); -i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseWidget, decorators: [{ - type: Injectable - }] }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS13aWRnZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9hbmd1bGFyL3Byb2plY3RzL2xpYi9zcmMvbGliL2Jhc2Utd2lkZ2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUczQzs7R0FFRztBQUVILE1BQU0sT0FBZ0IsVUFBVTtJQVE5Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Ba0JHO0lBQ0ksU0FBUyxLQUFnQyxPQUFPLENBQUMsQ0FBQztJQUV6RDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQW1CRztJQUNJLFdBQVcsQ0FBQyxDQUFvQjtRQUNyQyxzQ0FBc0M7UUFDdEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLENBQUM7WUFBRSxPQUFPO1FBRWYsSUFBSSxDQUFDLENBQUMsS0FBSztZQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM3QyxDQUFDOzt1R0F2RG1CLFVBQVU7MkdBQVYsVUFBVTsyRkFBVixVQUFVO2tCQUQvQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIGdyaWRzdGFjay1pdGVtLmNvbXBvbmVudC50cyAxMi4zLjNcclxuICogQ29weXJpZ2h0IChjKSAyMDIyLTIwMjQgQWxhaW4gRHVtZXNueSAtIHNlZSBHcmlkU3RhY2sgcm9vdCBsaWNlbnNlXHJcbiAqL1xyXG5cclxuLyoqXHJcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgdGhhdCBhbGwgY3VzdG9tIHdpZGdldHMgc2hvdWxkIGV4dGVuZC5cclxuICogXHJcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIGludGVyZmFjZSBuZWVkZWQgZm9yIEdyaWRzdGFja0l0ZW1Db21wb25lbnQgdG86XHJcbiAqIC0gU2VyaWFsaXplL2Rlc2VyaWFsaXplIHdpZGdldCBkYXRhXHJcbiAqIC0gU2F2ZS9yZXN0b3JlIHdpZGdldCBzdGF0ZVxyXG4gKiAtIEludGVncmF0ZSB3aXRoIEFuZ3VsYXIgbGlmZWN5Y2xlXHJcbiAqIFxyXG4gKiBFeHRlbmQgdGhpcyBjbGFzcyB3aGVuIGNyZWF0aW5nIGN1c3RvbSB3aWRnZXRzIGZvciBkeW5hbWljIGdyaWRzLlxyXG4gKiBcclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBAQ29tcG9uZW50KHtcclxuICogICBzZWxlY3RvcjogJ215LWN1c3RvbS13aWRnZXQnLFxyXG4gKiAgIHRlbXBsYXRlOiAnPGRpdj57e2RhdGF9fTwvZGl2PidcclxuICogfSlcclxuICogZXhwb3J0IGNsYXNzIE15Q3VzdG9tV2lkZ2V0IGV4dGVuZHMgQmFzZVdpZGdldCB7XHJcbiAqICAgQElucHV0KCkgZGF0YTogc3RyaW5nID0gJyc7XHJcbiAqICAgXHJcbiAqICAgc2VyaWFsaXplKCkge1xyXG4gKiAgICAgcmV0dXJuIHsgZGF0YTogdGhpcy5kYXRhIH07XHJcbiAqICAgfVxyXG4gKiB9XHJcbiAqIGBgYFxyXG4gKi9cclxuXHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmdDb21wSW5wdXRzLCBOZ0dyaWRTdGFja1dpZGdldCB9IGZyb20gJy4vdHlwZXMnO1xyXG5cclxuLyoqXHJcbiAqIEJhc2Ugd2lkZ2V0IGNsYXNzIGZvciBHcmlkU3RhY2sgQW5ndWxhciBpbnRlZ3JhdGlvbi5cclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VXaWRnZXQge1xyXG5cclxuICAvKipcclxuICAgKiBDb21wbGV0ZSB3aWRnZXQgZGVmaW5pdGlvbiBpbmNsdWRpbmcgcG9zaXRpb24sIHNpemUsIGFuZCBBbmd1bGFyLXNwZWNpZmljIGRhdGEuXHJcbiAgICogUG9wdWxhdGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgd2lkZ2V0IGlzIGxvYWRlZCBvciBzYXZlZC5cclxuICAgKi9cclxuICBwdWJsaWMgd2lkZ2V0SXRlbT86IE5nR3JpZFN0YWNrV2lkZ2V0O1xyXG5cclxuICAvKipcclxuICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXR1cm4gc2VyaWFsaXphYmxlIGRhdGEgZm9yIHRoaXMgd2lkZ2V0LlxyXG4gICAqIFxyXG4gICAqIFJldHVybiBhbiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHRoYXQgbWFwIHRvIHlvdXIgY29tcG9uZW50J3MgQElucHV0KCkgZmllbGRzLlxyXG4gICAqIFRoZSBzZWxlY3RvciBpcyBoYW5kbGVkIGF1dG9tYXRpY2FsbHksIHNvIG9ubHkgaW5jbHVkZSBjb21wb25lbnQtc3BlY2lmaWMgZGF0YS5cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyBzZXJpYWxpemFibGUgY29tcG9uZW50IGRhdGFcclxuICAgKiBcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIGBgYHR5cGVzY3JpcHRcclxuICAgKiBzZXJpYWxpemUoKSB7XHJcbiAgICogICByZXR1cm4ge1xyXG4gICAqICAgICB0aXRsZTogdGhpcy50aXRsZSxcclxuICAgKiAgICAgdmFsdWU6IHRoaXMudmFsdWUsXHJcbiAgICogICAgIHNldHRpbmdzOiB0aGlzLnNldHRpbmdzXHJcbiAgICogICB9O1xyXG4gICAqIH1cclxuICAgKiBgYGBcclxuICAgKi9cclxuICBwdWJsaWMgc2VyaWFsaXplKCk6IE5nQ29tcElucHV0cyB8IHVuZGVmaW5lZCAgeyByZXR1cm47IH1cclxuXHJcbiAgLyoqXHJcbiAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaGFuZGxlIHdpZGdldCByZXN0b3JhdGlvbiBmcm9tIHNhdmVkIGRhdGEuXHJcbiAgICogXHJcbiAgICogVXNlIHRoaXMgZm9yIGNvbXBsZXggaW5pdGlhbGl6YXRpb24gdGhhdCBnb2VzIGJleW9uZCBzaW1wbGUgQElucHV0KCkgbWFwcGluZy5cclxuICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhdXRvbWF0aWNhbGx5IGFzc2lnbnMgaW5wdXQgZGF0YSB0byBjb21wb25lbnQgcHJvcGVydGllcy5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gdyBUaGUgc2F2ZWQgd2lkZ2V0IGRhdGEgaW5jbHVkaW5nIGlucHV0IHByb3BlcnRpZXNcclxuICAgKiBcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIGBgYHR5cGVzY3JpcHRcclxuICAgKiBkZXNlcmlhbGl6ZSh3OiBOZ0dyaWRTdGFja1dpZGdldCkge1xyXG4gICAqICAgc3VwZXIuZGVzZXJpYWxpemUodyk7IC8vIENhbGwgcGFyZW50IGZvciBiYXNpYyBzZXR1cFxyXG4gICAqICAgXHJcbiAgICogICAvLyBDdXN0b20gaW5pdGlhbGl6YXRpb24gbG9naWNcclxuICAgKiAgIGlmICh3LmlucHV0Py5jb21wbGV4RGF0YSkge1xyXG4gICAqICAgICB0aGlzLnByb2Nlc3NDb21wbGV4RGF0YSh3LmlucHV0LmNvbXBsZXhEYXRhKTtcclxuICAgKiAgIH1cclxuICAgKiB9XHJcbiAgICogYGBgXHJcbiAgICovXHJcbiAgcHVibGljIGRlc2VyaWFsaXplKHc6IE5nR3JpZFN0YWNrV2lkZ2V0KSAge1xyXG4gICAgLy8gc2F2ZSBmdWxsIGRlc2NyaXB0aW9uIGZvciBtZXRhIGRhdGFcclxuICAgIHRoaXMud2lkZ2V0SXRlbSA9IHc7XHJcbiAgICBpZiAoIXcpIHJldHVybjtcclxuXHJcbiAgICBpZiAody5pbnB1dCkgIE9iamVjdC5hc3NpZ24odGhpcywgdy5pbnB1dCk7XHJcbiAgfVxyXG4gfVxyXG4iXX0= \ No newline at end of file diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/esm2020/lib/gridstack-item.component.mjs b/web/skins/classic/assets/gridstack-12.3.3/dist/angular/esm2020/lib/gridstack-item.component.mjs deleted file mode 100644 index da5e052c9..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/esm2020/lib/gridstack-item.component.mjs +++ /dev/null @@ -1,101 +0,0 @@ -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -import { Component, Input, ViewChild, ViewContainerRef } from '@angular/core'; -import * as i0 from "@angular/core"; -/** - * Angular component wrapper for individual GridStack items. - * - * This component represents a single grid item and handles: - * - Dynamic content creation and management - * - Integration with parent GridStack component - * - Component lifecycle and cleanup - * - Widget options and configuration - * - * Use in combination with GridstackComponent for the parent grid. - * - * @example - * ```html - * - * - * - * - * - * ``` - */ -export class GridstackItemComponent { - constructor(elementRef) { - this.elementRef = elementRef; - this.el._gridItemComp = this; - } - /** - * Grid item configuration options. - * Defines position, size, and behavior of this grid item. - * - * @example - * ```typescript - * itemOptions: GridStackNode = { - * x: 0, y: 0, w: 2, h: 1, - * noResize: true, - * content: 'Item content' - * }; - * ``` - */ - set options(val) { - const grid = this.el.gridstackNode?.grid; - if (grid) { - // already built, do an update... - grid.update(this.el, val); - } - else { - // store our custom element in options so we can update it and not re-create a generic div! - this._options = { ...val, el: this.el }; - } - } - /** return the latest grid options (from GS once built, otherwise initial values) */ - get options() { - return this.el.gridstackNode || this._options || { el: this.el }; - } - /** return the native element that contains grid specific fields as well */ - get el() { return this.elementRef.nativeElement; } - /** clears the initial options now that we've built */ - clearOptions() { - delete this._options; - } - ngOnDestroy() { - this.clearOptions(); - delete this.childWidget; - delete this.el._gridItemComp; - delete this.container; - delete this.ref; - } -} -GridstackItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackItemComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); -GridstackItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: GridstackItemComponent, isStandalone: true, selector: "gridstack-item", inputs: { options: "options" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: ` -
- - - - - - {{options.content}} -
`, isInline: true, styles: [":host{display:block}\n"] }); -i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackItemComponent, decorators: [{ - type: Component, - args: [{ selector: 'gridstack-item', template: ` -
- - - - - - {{options.content}} -
`, standalone: true, styles: [":host{display:block}\n"] }] - }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { container: [{ - type: ViewChild, - args: ['container', { read: ViewContainerRef, static: true }] - }], options: [{ - type: Input - }] } }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0YWNrLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vYW5ndWxhci9wcm9qZWN0cy9saWIvc3JjL2xpYi9ncmlkc3RhY2staXRlbS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBYyxLQUFLLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUEyQixNQUFNLGVBQWUsQ0FBQzs7QUFhbkg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFrQkgsTUFBTSxPQUFPLHNCQUFzQjtJQTBEakMsWUFBK0IsVUFBK0M7UUFBL0MsZUFBVSxHQUFWLFVBQVUsQ0FBcUM7UUFDNUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUF4Q0Q7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0gsSUFBb0IsT0FBTyxDQUFDLEdBQWtCO1FBQzVDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQztRQUN6QyxJQUFJLElBQUksRUFBRTtZQUNSLGlDQUFpQztZQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDM0I7YUFBTTtZQUNMLDJGQUEyRjtZQUMzRixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUMsQ0FBQztTQUN2QztJQUNILENBQUM7SUFDRCxvRkFBb0Y7SUFDcEYsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFDLENBQUM7SUFDakUsQ0FBQztJQUlELDJFQUEyRTtJQUMzRSxJQUFXLEVBQUUsS0FBOEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFbEYsc0RBQXNEO0lBQy9DLFlBQVk7UUFDakIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFNTSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUE7UUFDdkIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztRQUM3QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7O21IQXBFVSxzQkFBc0I7dUdBQXRCLHNCQUFzQiw2TEFNRCxnQkFBZ0IsMkNBckJ0Qzs7Ozs7Ozs7V0FRRDsyRkFPRSxzQkFBc0I7a0JBakJsQyxTQUFTOytCQUNFLGdCQUFnQixZQUNoQjs7Ozs7Ozs7V0FRRCxjQUlHLElBQUk7aUdBU3dELFNBQVM7c0JBQWhGLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBMkIzQyxPQUFPO3NCQUExQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBncmlkc3RhY2staXRlbS5jb21wb25lbnQudHMgMTIuMy4zXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjItMjAyNCBBbGFpbiBEdW1lc255IC0gc2VlIEdyaWRTdGFjayByb290IGxpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYsIE9uRGVzdHJveSwgQ29tcG9uZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBHcmlkSXRlbUhUTUxFbGVtZW50LCBHcmlkU3RhY2tOb2RlIH0gZnJvbSAnZ3JpZHN0YWNrJztcbmltcG9ydCB7IEJhc2VXaWRnZXQgfSBmcm9tICcuL2Jhc2Utd2lkZ2V0JztcblxuLyoqXG4gKiBFeHRlbmRlZCBIVE1MRWxlbWVudCBpbnRlcmZhY2UgZm9yIGdyaWQgaXRlbXMuXG4gKiBTdG9yZXMgYSBiYWNrLXJlZmVyZW5jZSB0byB0aGUgQW5ndWxhciBjb21wb25lbnQgZm9yIGludGVncmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdyaWRJdGVtQ29tcEhUTUxFbGVtZW50IGV4dGVuZHMgR3JpZEl0ZW1IVE1MRWxlbWVudCB7XG4gIC8qKiBCYWNrLXJlZmVyZW5jZSB0byB0aGUgQW5ndWxhciBHcmlkU3RhY2tJdGVtIGNvbXBvbmVudCAqL1xuICBfZ3JpZEl0ZW1Db21wPzogR3JpZHN0YWNrSXRlbUNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBBbmd1bGFyIGNvbXBvbmVudCB3cmFwcGVyIGZvciBpbmRpdmlkdWFsIEdyaWRTdGFjayBpdGVtcy5cbiAqIFxuICogVGhpcyBjb21wb25lbnQgcmVwcmVzZW50cyBhIHNpbmdsZSBncmlkIGl0ZW0gYW5kIGhhbmRsZXM6XG4gKiAtIER5bmFtaWMgY29udGVudCBjcmVhdGlvbiBhbmQgbWFuYWdlbWVudFxuICogLSBJbnRlZ3JhdGlvbiB3aXRoIHBhcmVudCBHcmlkU3RhY2sgY29tcG9uZW50XG4gKiAtIENvbXBvbmVudCBsaWZlY3ljbGUgYW5kIGNsZWFudXBcbiAqIC0gV2lkZ2V0IG9wdGlvbnMgYW5kIGNvbmZpZ3VyYXRpb25cbiAqIFxuICogVXNlIGluIGNvbWJpbmF0aW9uIHdpdGggR3JpZHN0YWNrQ29tcG9uZW50IGZvciB0aGUgcGFyZW50IGdyaWQuXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8Z3JpZHN0YWNrPlxuICogICA8Z3JpZHN0YWNrLWl0ZW0gW29wdGlvbnNdPVwie3g6IDAsIHk6IDAsIHc6IDIsIGg6IDF9XCI+XG4gKiAgICAgPG15LXdpZGdldC1jb21wb25lbnQ+PC9teS13aWRnZXQtY29tcG9uZW50PlxuICogICA8L2dyaWRzdGFjay1pdGVtPlxuICogPC9ncmlkc3RhY2s+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZ3JpZHN0YWNrLWl0ZW0nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJncmlkLXN0YWNrLWl0ZW0tY29udGVudFwiPlxuICAgICAgPCEtLSB3aGVyZSBkeW5hbWljIGl0ZW1zIGdvIGJhc2VkIG9uIGNvbXBvbmVudCBzZWxlY3RvciAocmVjb21tZW5kZWQgd2F5KSwgb3Igc3ViLWdyaWRzLCBldGMuLi4pIC0tPlxuICAgICAgPG5nLXRlbXBsYXRlICNjb250YWluZXI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwhLS0gYW55IHN0YXRpYyAoZGVmaW5lZCBpbiBET00gLSBub3QgcmVjb21tZW5kZWQpIGNvbnRlbnQgZ29lcyBoZXJlIC0tPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgPCEtLSBmYWxsYmFjayBIVE1MIGNvbnRlbnQgZnJvbSBHcmlkU3RhY2tXaWRnZXQuY29udGVudCBpZiB1c2VkIGluc3RlYWQgKG5vdCByZWNvbW1lbmRlZCkgLS0+XG4gICAgICB7e29wdGlvbnMuY29udGVudH19XG4gICAgPC9kaXY+YCxcbiAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHsgZGlzcGxheTogYmxvY2s7IH1cbiAgYF0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIC8vIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLCAvLyBJRkYgeW91IHdhbnQgdG8gb3B0aW1pemUgYW5kIGNvbnRyb2wgd2hlbiBDaGFuZ2VEZXRlY3Rpb24gbmVlZHMgdG8gaGFwcGVuLi4uXG59KVxuZXhwb3J0IGNsYXNzIEdyaWRzdGFja0l0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIC8qKlxuICAgKiBDb250YWluZXIgZm9yIGR5bmFtaWMgY29tcG9uZW50IGNyZWF0aW9uIHdpdGhpbiB0aGlzIGdyaWQgaXRlbS5cbiAgICogVXNlZCB0byBhcHBlbmQgY2hpbGQgY29tcG9uZW50cyBwcm9ncmFtbWF0aWNhbGx5LlxuICAgKi9cbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWV9KSBwdWJsaWMgY29udGFpbmVyPzogVmlld0NvbnRhaW5lclJlZjtcblxuICAvKipcbiAgICogQ29tcG9uZW50IHJlZmVyZW5jZSBmb3IgZHluYW1pYyBjb21wb25lbnQgcmVtb3ZhbC5cbiAgICogVXNlZCBpbnRlcm5hbGx5IHdoZW4gdGhpcyBjb21wb25lbnQgaXMgY3JlYXRlZCBkeW5hbWljYWxseS5cbiAgICovXG4gIHB1YmxpYyByZWY6IENvbXBvbmVudFJlZjxHcmlkc3RhY2tJdGVtQ29tcG9uZW50PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIGNoaWxkIHdpZGdldCBjb21wb25lbnQgZm9yIHNlcmlhbGl6YXRpb24uXG4gICAqIFVzZWQgdG8gc2F2ZS9yZXN0b3JlIGFkZGl0aW9uYWwgZGF0YSBhbG9uZyB3aXRoIGdyaWQgcG9zaXRpb24uXG4gICAqL1xuICBwdWJsaWMgY2hpbGRXaWRnZXQ6IEJhc2VXaWRnZXQgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEdyaWQgaXRlbSBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gICAqIERlZmluZXMgcG9zaXRpb24sIHNpemUsIGFuZCBiZWhhdmlvciBvZiB0aGlzIGdyaWQgaXRlbS5cbiAgICogXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaXRlbU9wdGlvbnM6IEdyaWRTdGFja05vZGUgPSB7XG4gICAqICAgeDogMCwgeTogMCwgdzogMiwgaDogMSxcbiAgICogICBub1Jlc2l6ZTogdHJ1ZSxcbiAgICogICBjb250ZW50OiAnSXRlbSBjb250ZW50J1xuICAgKiB9O1xuICAgKiBgYGBcbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgb3B0aW9ucyh2YWw6IEdyaWRTdGFja05vZGUpIHtcbiAgICBjb25zdCBncmlkID0gdGhpcy5lbC5ncmlkc3RhY2tOb2RlPy5ncmlkO1xuICAgIGlmIChncmlkKSB7XG4gICAgICAvLyBhbHJlYWR5IGJ1aWx0LCBkbyBhbiB1cGRhdGUuLi5cbiAgICAgIGdyaWQudXBkYXRlKHRoaXMuZWwsIHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHN0b3JlIG91ciBjdXN0b20gZWxlbWVudCBpbiBvcHRpb25zIHNvIHdlIGNhbiB1cGRhdGUgaXQgYW5kIG5vdCByZS1jcmVhdGUgYSBnZW5lcmljIGRpdiFcbiAgICAgIHRoaXMuX29wdGlvbnMgPSB7Li4udmFsLCBlbDogdGhpcy5lbH07XG4gICAgfVxuICB9XG4gIC8qKiByZXR1cm4gdGhlIGxhdGVzdCBncmlkIG9wdGlvbnMgKGZyb20gR1Mgb25jZSBidWlsdCwgb3RoZXJ3aXNlIGluaXRpYWwgdmFsdWVzKSAqL1xuICBwdWJsaWMgZ2V0IG9wdGlvbnMoKTogR3JpZFN0YWNrTm9kZSB7XG4gICAgcmV0dXJuIHRoaXMuZWwuZ3JpZHN0YWNrTm9kZSB8fCB0aGlzLl9vcHRpb25zIHx8IHtlbDogdGhpcy5lbH07XG4gIH1cblxuICBwcm90ZWN0ZWQgX29wdGlvbnM/OiBHcmlkU3RhY2tOb2RlO1xuXG4gIC8qKiByZXR1cm4gdGhlIG5hdGl2ZSBlbGVtZW50IHRoYXQgY29udGFpbnMgZ3JpZCBzcGVjaWZpYyBmaWVsZHMgYXMgd2VsbCAqL1xuICBwdWJsaWMgZ2V0IGVsKCk6IEdyaWRJdGVtQ29tcEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50OyB9XG5cbiAgLyoqIGNsZWFycyB0aGUgaW5pdGlhbCBvcHRpb25zIG5vdyB0aGF0IHdlJ3ZlIGJ1aWx0ICovXG4gIHB1YmxpYyBjbGVhck9wdGlvbnMoKSB7XG4gICAgZGVsZXRlIHRoaXMuX29wdGlvbnM7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgZWxlbWVudFJlZjogRWxlbWVudFJlZjxHcmlkSXRlbUNvbXBIVE1MRWxlbWVudD4pIHtcbiAgICB0aGlzLmVsLl9ncmlkSXRlbUNvbXAgPSB0aGlzO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJPcHRpb25zKCk7XG4gICAgZGVsZXRlIHRoaXMuY2hpbGRXaWRnZXRcbiAgICBkZWxldGUgdGhpcy5lbC5fZ3JpZEl0ZW1Db21wO1xuICAgIGRlbGV0ZSB0aGlzLmNvbnRhaW5lcjtcbiAgICBkZWxldGUgdGhpcy5yZWY7XG4gIH1cbn1cbiJdfQ== \ No newline at end of file diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/esm2020/lib/gridstack.component.mjs b/web/skins/classic/assets/gridstack-12.3.3/dist/angular/esm2020/lib/gridstack.component.mjs deleted file mode 100644 index 05f0d6ec1..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/esm2020/lib/gridstack.component.mjs +++ /dev/null @@ -1,414 +0,0 @@ -/** - * gridstack.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -import { Component, ContentChildren, EventEmitter, Input, Output, ViewChild, ViewContainerRef, reflectComponentType } from '@angular/core'; -import { NgIf } from '@angular/common'; -import { GridStack } from 'gridstack'; -import { GridstackItemComponent } from './gridstack-item.component'; -import * as i0 from "@angular/core"; -/** - * Angular component wrapper for GridStack. - * - * This component provides Angular integration for GridStack grids, handling: - * - Grid initialization and lifecycle - * - Dynamic component creation and management - * - Event binding and emission - * - Integration with Angular change detection - * - * Use in combination with GridstackItemComponent for individual grid items. - * - * @example - * ```html - * - *
Drag widgets here
- *
- * ``` - */ -export class GridstackComponent { - constructor(elementRef) { - this.elementRef = elementRef; - /** - * GridStack event emitters for Angular integration. - * - * These provide Angular-style event handling for GridStack events. - * Alternatively, use `this.grid.on('event1 event2', callback)` for multiple events. - * - * Note: 'CB' suffix prevents conflicts with native DOM events. - * - * @example - * ```html - * - * - * ``` - */ - /** Emitted when widgets are added to the grid */ - this.addedCB = new EventEmitter(); - /** Emitted when grid layout changes */ - this.changeCB = new EventEmitter(); - /** Emitted when grid is disabled */ - this.disableCB = new EventEmitter(); - /** Emitted during widget drag operations */ - this.dragCB = new EventEmitter(); - /** Emitted when widget drag starts */ - this.dragStartCB = new EventEmitter(); - /** Emitted when widget drag stops */ - this.dragStopCB = new EventEmitter(); - /** Emitted when widget is dropped */ - this.droppedCB = new EventEmitter(); - /** Emitted when grid is enabled */ - this.enableCB = new EventEmitter(); - /** Emitted when widgets are removed from the grid */ - this.removedCB = new EventEmitter(); - /** Emitted during widget resize operations */ - this.resizeCB = new EventEmitter(); - /** Emitted when widget resize starts */ - this.resizeStartCB = new EventEmitter(); - /** Emitted when widget resize stops */ - this.resizeStopCB = new EventEmitter(); - // set globally our method to create the right widget type - if (!GridStack.addRemoveCB) { - GridStack.addRemoveCB = gsCreateNgComponents; - } - if (!GridStack.saveCB) { - GridStack.saveCB = gsSaveAdditionalNgInfo; - } - if (!GridStack.updateCB) { - GridStack.updateCB = gsUpdateNgComponents; - } - this.el._gridComp = this; - } - /** - * Grid configuration options. - * Can be set before grid initialization or updated after grid is created. - * - * @example - * ```typescript - * gridOptions: GridStackOptions = { - * column: 12, - * cellHeight: 'auto', - * animate: true - * }; - * ``` - */ - set options(o) { - if (this._grid) { - this._grid.updateOptions(o); - } - else { - this._options = o; - } - } - /** Get the current running grid options */ - get options() { return this._grid?.opts || this._options || {}; } - /** - * Get the native DOM element that contains grid-specific fields. - * This element has GridStack properties attached to it. - */ - get el() { return this.elementRef.nativeElement; } - /** - * Get the underlying GridStack instance. - * Use this to access GridStack API methods directly. - * - * @example - * ```typescript - * this.gridComponent.grid.addWidget({x: 0, y: 0, w: 2, h: 1}); - * ``` - */ - get grid() { return this._grid; } - /** - * Register a list of Angular components for dynamic creation. - * - * @param typeList Array of component types to register - * - * @example - * ```typescript - * GridstackComponent.addComponentToSelectorType([ - * MyWidgetComponent, - * AnotherWidgetComponent - * ]); - * ``` - */ - static addComponentToSelectorType(typeList) { - typeList.forEach(type => GridstackComponent.selectorToType[GridstackComponent.getSelector(type)] = type); - } - /** - * Extract the selector string from an Angular component type. - * - * @param type The component type to get selector from - * @returns The component's selector string - */ - static getSelector(type) { - return reflectComponentType(type).selector; - } - ngOnInit() { - // init ourself before any template children are created since we track them below anyway - no need to double create+update widgets - this.loaded = !!this.options?.children?.length; - this._grid = GridStack.init(this._options, this.el); - delete this._options; // GS has it now - this.checkEmpty(); - } - /** wait until after all DOM is ready to init gridstack children (after angular ngFor and sub-components run first) */ - ngAfterContentInit() { - // track whenever the children list changes and update the layout... - this._sub = this.gridstackItems?.changes.subscribe(() => this.updateAll()); - // ...and do this once at least unless we loaded children already - if (!this.loaded) - this.updateAll(); - this.hookEvents(this.grid); - } - ngOnDestroy() { - this.unhookEvents(this._grid); - this._sub?.unsubscribe(); - this._grid?.destroy(); - delete this._grid; - delete this.el._gridComp; - delete this.container; - delete this.ref; - } - /** - * called when the TEMPLATE (not recommended) list of items changes - get a list of nodes and - * update the layout accordingly (which will take care of adding/removing items changed by Angular) - */ - updateAll() { - if (!this.grid) - return; - const layout = []; - this.gridstackItems?.forEach(item => { - layout.push(item.options); - item.clearOptions(); - }); - this.grid.load(layout); // efficient that does diffs only - } - /** check if the grid is empty, if so show alternative content */ - checkEmpty() { - if (!this.grid) - return; - this.isEmpty = !this.grid.engine.nodes.length; - } - /** get all known events as easy to use Outputs for convenience */ - hookEvents(grid) { - if (!grid) - return; - // nested grids don't have events in v12.1+ so skip - if (grid.parentGridNode) - return; - grid - .on('added', (event, nodes) => { - const gridComp = nodes[0].grid?.el._gridComp || this; - gridComp.checkEmpty(); - this.addedCB.emit({ event, nodes }); - }) - .on('change', (event, nodes) => this.changeCB.emit({ event, nodes })) - .on('disable', (event) => this.disableCB.emit({ event })) - .on('drag', (event, el) => this.dragCB.emit({ event, el })) - .on('dragstart', (event, el) => this.dragStartCB.emit({ event, el })) - .on('dragstop', (event, el) => this.dragStopCB.emit({ event, el })) - .on('dropped', (event, previousNode, newNode) => this.droppedCB.emit({ event, previousNode, newNode })) - .on('enable', (event) => this.enableCB.emit({ event })) - .on('removed', (event, nodes) => { - const gridComp = nodes[0].grid?.el._gridComp || this; - gridComp.checkEmpty(); - this.removedCB.emit({ event, nodes }); - }) - .on('resize', (event, el) => this.resizeCB.emit({ event, el })) - .on('resizestart', (event, el) => this.resizeStartCB.emit({ event, el })) - .on('resizestop', (event, el) => this.resizeStopCB.emit({ event, el })); - } - unhookEvents(grid) { - if (!grid) - return; - // nested grids don't have events in v12.1+ so skip - if (grid.parentGridNode) - return; - grid.off('added change disable drag dragstart dragstop dropped enable removed resize resizestart resizestop'); - } -} -/** - * Mapping of component selectors to their types for dynamic creation. - * - * This enables dynamic component instantiation from string selectors. - * Angular doesn't provide public access to this mapping, so we maintain our own. - * - * @example - * ```typescript - * GridstackComponent.addComponentToSelectorType([MyWidgetComponent]); - * ``` - */ -GridstackComponent.selectorToType = {}; -GridstackComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); -GridstackComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: GridstackComponent, isStandalone: true, selector: "gridstack", inputs: { options: "options", isEmpty: "isEmpty" }, outputs: { addedCB: "addedCB", changeCB: "changeCB", disableCB: "disableCB", dragCB: "dragCB", dragStartCB: "dragStartCB", dragStopCB: "dragStopCB", droppedCB: "droppedCB", enableCB: "enableCB", removedCB: "removedCB", resizeCB: "resizeCB", resizeStartCB: "resizeStartCB", resizeStopCB: "resizeStopCB" }, queries: [{ propertyName: "gridstackItems", predicate: GridstackItemComponent }], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: ` - - - - - - - `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); -i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackComponent, decorators: [{ - type: Component, - args: [{ selector: 'gridstack', template: ` - - - - - - - `, standalone: true, imports: [NgIf], styles: [":host{display:block}\n"] }] - }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { gridstackItems: [{ - type: ContentChildren, - args: [GridstackItemComponent] - }], container: [{ - type: ViewChild, - args: ['container', { read: ViewContainerRef, static: true }] - }], options: [{ - type: Input - }], isEmpty: [{ - type: Input - }], addedCB: [{ - type: Output - }], changeCB: [{ - type: Output - }], disableCB: [{ - type: Output - }], dragCB: [{ - type: Output - }], dragStartCB: [{ - type: Output - }], dragStopCB: [{ - type: Output - }], droppedCB: [{ - type: Output - }], enableCB: [{ - type: Output - }], removedCB: [{ - type: Output - }], resizeCB: [{ - type: Output - }], resizeStartCB: [{ - type: Output - }], resizeStopCB: [{ - type: Output - }] } }); -/** - * can be used when a new item needs to be created, which we do as a Angular component, or deleted (skip) - **/ -export function gsCreateNgComponents(host, n, add, isGrid) { - if (add) { - // - // create the component dynamically - see https://angular.io/docs/ts/latest/cookbook/dynamic-component-loader.html - // - if (!host) - return; - if (isGrid) { - // TODO: figure out how to create ng component inside regular Div. need to access app injectors... - // if (!container) { - // const hostElement: Element = host; - // const environmentInjector: EnvironmentInjector; - // grid = createComponent(GridstackComponent, {environmentInjector, hostElement})?.instance; - // } - const gridItemComp = host.parentElement?._gridItemComp; - if (!gridItemComp) - return; - // check if gridItem has a child component with 'container' exposed to create under.. - const container = gridItemComp.childWidget?.container || gridItemComp.container; - const gridRef = container?.createComponent(GridstackComponent); - const grid = gridRef?.instance; - if (!grid) - return; - grid.ref = gridRef; - grid.options = n; - return grid.el; - } - else { - const gridComp = host._gridComp; - const gridItemRef = gridComp?.container?.createComponent(GridstackItemComponent); - const gridItem = gridItemRef?.instance; - if (!gridItem) - return; - gridItem.ref = gridItemRef; - // define what type of component to create as child, OR you can do it GridstackItemComponent template, but this is more generic - const selector = n.selector; - const type = selector ? GridstackComponent.selectorToType[selector] : undefined; - if (type) { - // shared code to create our selector component - const createComp = () => { - const childWidget = gridItem.container?.createComponent(type)?.instance; - // if proper BaseWidget subclass, save it and load additional data - if (childWidget && typeof childWidget.serialize === 'function' && typeof childWidget.deserialize === 'function') { - gridItem.childWidget = childWidget; - childWidget.deserialize(n); - } - }; - const lazyLoad = n.lazyLoad || n.grid?.opts?.lazyLoad && n.lazyLoad !== false; - if (lazyLoad) { - if (!n.visibleObservable) { - n.visibleObservable = new IntersectionObserver(([entry]) => { - if (entry.isIntersecting) { - n.visibleObservable?.disconnect(); - delete n.visibleObservable; - createComp(); - } - }); - window.setTimeout(() => n.visibleObservable?.observe(gridItem.el)); // wait until callee sets position attributes - } - } - else - createComp(); - } - return gridItem.el; - } - } - else { - // - // REMOVE - have to call ComponentRef:destroy() for dynamic objects to correctly remove themselves - // Note: this will destroy all children dynamic components as well: gridItem -> childWidget - // - if (isGrid) { - const grid = n.el?._gridComp; - if (grid?.ref) - grid.ref.destroy(); - else - grid?.ngOnDestroy(); - } - else { - const gridItem = n.el?._gridItemComp; - if (gridItem?.ref) - gridItem.ref.destroy(); - else - gridItem?.ngOnDestroy(); - } - } - return; -} -/** - * called for each item in the grid - check if additional information needs to be saved. - * Note: since this is options minus gridstack protected members using Utils.removeInternalForSave(), - * this typically doesn't need to do anything. However your custom Component @Input() are now supported - * using BaseWidget.serialize() - */ -export function gsSaveAdditionalNgInfo(n, w) { - const gridItem = n.el?._gridItemComp; - if (gridItem) { - const input = gridItem.childWidget?.serialize(); - if (input) { - w.input = input; - } - return; - } - // else check if Grid - const grid = n.el?._gridComp; - if (grid) { - //.... save any custom data - } -} -/** - * track when widgeta re updated (rather than created) to make sure we de-serialize them as well - */ -export function gsUpdateNgComponents(n) { - const w = n; - const gridItem = n.el?._gridItemComp; - if (gridItem?.childWidget && w.input) - gridItem.childWidget.deserialize(w); -} -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0YWNrLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2FuZ3VsYXIvcHJvamVjdHMvbGliL3NyYy9saWIvZ3JpZHN0YWNrLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQ2UsU0FBUyxFQUFFLGVBQWUsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUMxRCxNQUFNLEVBQW1CLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxvQkFBb0IsRUFDaEcsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXZDLE9BQU8sRUFBd0MsU0FBUyxFQUFvRCxNQUFNLFdBQVcsQ0FBQztBQUk5SCxPQUFPLEVBQTJCLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBa0M3Rjs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFrQkgsTUFBTSxPQUFPLGtCQUFrQjtJQXVLN0IsWUFBK0IsVUFBMkM7UUFBM0MsZUFBVSxHQUFWLFVBQVUsQ0FBaUM7UUFySDFFOzs7Ozs7Ozs7Ozs7O1dBYUc7UUFFSCxpREFBaUQ7UUFDaEMsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFFdkQsdUNBQXVDO1FBQ3RCLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRXhELG9DQUFvQztRQUNuQixjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUV6RCw0Q0FBNEM7UUFDM0IsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFhLENBQUM7UUFFeEQsc0NBQXNDO1FBQ3JCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQUU3RCxxQ0FBcUM7UUFDcEIsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFhLENBQUM7UUFFNUQscUNBQXFDO1FBQ3BCLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO1FBRTNELG1DQUFt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SSxFQUFFO1FBQ1IsMkJBQTJCO0tBQzVCO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLENBQWtCO0lBQ3JELE1BQU0sQ0FBQyxHQUFzQixDQUFDLENBQUM7SUFDL0IsTUFBTSxRQUFRLEdBQUksQ0FBQyxDQUFDLEVBQThCLEVBQUUsYUFBYSxDQUFDO0lBQ2xFLElBQUksUUFBUSxFQUFFLFdBQVcsSUFBSSxDQUFDLENBQUMsS0FBSztRQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGdyaWRzdGFjay5jb21wb25lbnQudHMgMTIuMy4zXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjItMjAyNCBBbGFpbiBEdW1lc255IC0gc2VlIEdyaWRTdGFjayByb290IGxpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsIENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LFxuICAgIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgVHlwZSwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCByZWZsZWN0Q29tcG9uZW50VHlwZSwgQ29tcG9uZW50UmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEdyaWRIVE1MRWxlbWVudCwgR3JpZEl0ZW1IVE1MRWxlbWVudCwgR3JpZFN0YWNrLCBHcmlkU3RhY2tOb2RlLCBHcmlkU3RhY2tPcHRpb25zLCBHcmlkU3RhY2tXaWRnZXQgfSBmcm9tICdncmlkc3RhY2snO1xuXG5pbXBvcnQgeyBOZ0dyaWRTdGFja05vZGUsIE5nR3JpZFN0YWNrV2lkZ2V0IH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBCYXNlV2lkZ2V0IH0gZnJvbSAnLi9iYXNlLXdpZGdldCc7XG5pbXBvcnQgeyBHcmlkSXRlbUNvbXBIVE1MRWxlbWVudCwgR3JpZHN0YWNrSXRlbUNvbXBvbmVudCB9IGZyb20gJy4vZ3JpZHN0YWNrLWl0ZW0uY29tcG9uZW50JztcblxuLyoqXG4gKiBFdmVudCBoYW5kbGVyIGNhbGxiYWNrIHNpZ25hdHVyZXMgZm9yIGRpZmZlcmVudCBHcmlkU3RhY2sgZXZlbnRzLlxuICogVGhlc2UgdHlwZXMgZGVmaW5lIHRoZSBzdHJ1Y3R1cmUgb2YgZGF0YSBwYXNzZWQgdG8gQW5ndWxhciBldmVudCBlbWl0dGVycy5cbiAqL1xuXG4vKiogQ2FsbGJhY2sgZm9yIGdlbmVyYWwgZXZlbnRzIChlbmFibGUsIGRpc2FibGUsIGV0Yy4pICovXG5leHBvcnQgdHlwZSBldmVudENCID0ge2V2ZW50OiBFdmVudH07XG5cbi8qKiBDYWxsYmFjayBmb3IgZWxlbWVudC1zcGVjaWZpYyBldmVudHMgKHJlc2l6ZSwgZHJhZywgZXRjLikgKi9cbmV4cG9ydCB0eXBlIGVsZW1lbnRDQiA9IHtldmVudDogRXZlbnQsIGVsOiBHcmlkSXRlbUhUTUxFbGVtZW50fTtcblxuLyoqIENhbGxiYWNrIGZvciBldmVudHMgYWZmZWN0aW5nIG11bHRpcGxlIG5vZGVzIChjaGFuZ2UsIGV0Yy4pICovXG5leHBvcnQgdHlwZSBub2Rlc0NCID0ge2V2ZW50OiBFdmVudCwgbm9kZXM6IEdyaWRTdGFja05vZGVbXX07XG5cbi8qKiBDYWxsYmFjayBmb3IgZHJvcCBldmVudHMgd2l0aCBiZWZvcmUvYWZ0ZXIgbm9kZSBzdGF0ZSAqL1xuZXhwb3J0IHR5cGUgZHJvcHBlZENCID0ge2V2ZW50OiBFdmVudCwgcHJldmlvdXNOb2RlOiBHcmlkU3RhY2tOb2RlLCBuZXdOb2RlOiBHcmlkU3RhY2tOb2RlfTtcblxuLyoqXG4gKiBFeHRlbmRlZCBIVE1MRWxlbWVudCBpbnRlcmZhY2UgZm9yIHRoZSBncmlkIGNvbnRhaW5lci5cbiAqIFN0b3JlcyBhIGJhY2stcmVmZXJlbmNlIHRvIHRoZSBBbmd1bGFyIGNvbXBvbmVudCBmb3IgaW50ZWdyYXRpb24gcHVycG9zZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR3JpZENvbXBIVE1MRWxlbWVudCBleHRlbmRzIEdyaWRIVE1MRWxlbWVudCB7XG4gIC8qKiBCYWNrLXJlZmVyZW5jZSB0byB0aGUgQW5ndWxhciBHcmlkU3RhY2sgY29tcG9uZW50ICovXG4gIF9ncmlkQ29tcD86IEdyaWRzdGFja0NvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBNYXBwaW5nIG9mIHNlbGVjdG9yIHN0cmluZ3MgdG8gQW5ndWxhciBjb21wb25lbnQgdHlwZXMuXG4gKiBVc2VkIGZvciBkeW5hbWljIGNvbXBvbmVudCBjcmVhdGlvbiBiYXNlZCBvbiB3aWRnZXQgc2VsZWN0b3JzLlxuICovXG5leHBvcnQgdHlwZSBTZWxlY3RvclRvVHlwZSA9IHtba2V5OiBzdHJpbmddOiBUeXBlPE9iamVjdD59O1xuXG4vKipcbiAqIEFuZ3VsYXIgY29tcG9uZW50IHdyYXBwZXIgZm9yIEdyaWRTdGFjay5cbiAqIFxuICogVGhpcyBjb21wb25lbnQgcHJvdmlkZXMgQW5ndWxhciBpbnRlZ3JhdGlvbiBmb3IgR3JpZFN0YWNrIGdyaWRzLCBoYW5kbGluZzpcbiAqIC0gR3JpZCBpbml0aWFsaXphdGlvbiBhbmQgbGlmZWN5Y2xlXG4gKiAtIER5bmFtaWMgY29tcG9uZW50IGNyZWF0aW9uIGFuZCBtYW5hZ2VtZW50XG4gKiAtIEV2ZW50IGJpbmRpbmcgYW5kIGVtaXNzaW9uXG4gKiAtIEludGVncmF0aW9uIHdpdGggQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uXG4gKiBcbiAqIFVzZSBpbiBjb21iaW5hdGlvbiB3aXRoIEdyaWRzdGFja0l0ZW1Db21wb25lbnQgZm9yIGluZGl2aWR1YWwgZ3JpZCBpdGVtcy5cbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxncmlkc3RhY2sgW29wdGlvbnNdPVwiZ3JpZE9wdGlvbnNcIiAoY2hhbmdlKT1cIm9uR3JpZENoYW5nZSgkZXZlbnQpXCI+XG4gKiAgIDxkaXYgZW1wdHktY29udGVudD5EcmFnIHdpZGdldHMgaGVyZTwvZGl2PlxuICogPC9ncmlkc3RhY2s+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZ3JpZHN0YWNrJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8IS0tIGNvbnRlbnQgdG8gc2hvdyB3aGVuIHdoZW4gZ3JpZCBpcyBlbXB0eSwgbGlrZSBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGFkZCB3aWRnZXRzIC0tPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltlbXB0eS1jb250ZW50XVwiICpuZ0lmPVwiaXNFbXB0eVwiPjwvbmctY29udGVudD5cbiAgICA8IS0tIHdoZXJlIGR5bmFtaWMgaXRlbXMgZ28gLS0+XG4gICAgPG5nLXRlbXBsYXRlICNjb250YWluZXI+PC9uZy10ZW1wbGF0ZT5cbiAgICA8IS0tIHdoZXJlIHRlbXBsYXRlIGl0ZW1zIGdvIC0tPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHsgZGlzcGxheTogYmxvY2s7IH1cbiAgYF0sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtOZ0lmXVxuICAvLyBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwgLy8gSUZGIHlvdSB3YW50IHRvIG9wdGltaXplIGFuZCBjb250cm9sIHdoZW4gQ2hhbmdlRGV0ZWN0aW9uIG5lZWRzIHRvIGhhcHBlbi4uLlxufSlcbmV4cG9ydCBjbGFzcyBHcmlkc3RhY2tDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgdGVtcGxhdGUtYmFzZWQgZ3JpZCBpdGVtcyAobm90IHJlY29tbWVuZGVkIGFwcHJvYWNoKS5cbiAgICogVXNlZCB0byBzeW5jIGJldHdlZW4gRE9NIGFuZCBHcmlkU3RhY2sgaW50ZXJuYWxzIHdoZW4gaXRlbXMgYXJlIGRlZmluZWQgaW4gdGVtcGxhdGVzLlxuICAgKiBQcmVmZXIgZHluYW1pYyBjb21wb25lbnQgY3JlYXRpb24gaW5zdGVhZC5cbiAgICovXG4gIEBDb250ZW50Q2hpbGRyZW4oR3JpZHN0YWNrSXRlbUNvbXBvbmVudCkgcHVibGljIGdyaWRzdGFja0l0ZW1zPzogUXVlcnlMaXN0PEdyaWRzdGFja0l0ZW1Db21wb25lbnQ+O1xuICAvKipcbiAgICogQ29udGFpbmVyIGZvciBkeW5hbWljIGNvbXBvbmVudCBjcmVhdGlvbiAocmVjb21tZW5kZWQgYXBwcm9hY2gpLlxuICAgKiBVc2VkIHRvIGFwcGVuZCBncmlkIGl0ZW1zIHByb2dyYW1tYXRpY2FsbHkgYXQgcnVudGltZS5cbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlfSkgcHVibGljIGNvbnRhaW5lcj86IFZpZXdDb250YWluZXJSZWY7XG5cbiAgLyoqXG4gICAqIEdyaWQgY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICAgKiBDYW4gYmUgc2V0IGJlZm9yZSBncmlkIGluaXRpYWxpemF0aW9uIG9yIHVwZGF0ZWQgYWZ0ZXIgZ3JpZCBpcyBjcmVhdGVkLlxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBncmlkT3B0aW9uczogR3JpZFN0YWNrT3B0aW9ucyA9IHtcbiAgICogICBjb2x1bW46IDEyLFxuICAgKiAgIGNlbGxIZWlnaHQ6ICdhdXRvJyxcbiAgICogICBhbmltYXRlOiB0cnVlXG4gICAqIH07XG4gICAqIGBgYFxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIHNldCBvcHRpb25zKG86IEdyaWRTdGFja09wdGlvbnMpIHtcbiAgICBpZiAodGhpcy5fZ3JpZCkge1xuICAgICAgdGhpcy5fZ3JpZC51cGRhdGVPcHRpb25zKG8pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vcHRpb25zID0gbztcbiAgICB9XG4gIH1cbiAgLyoqIEdldCB0aGUgY3VycmVudCBydW5uaW5nIGdyaWQgb3B0aW9ucyAqL1xuICBwdWJsaWMgZ2V0IG9wdGlvbnMoKTogR3JpZFN0YWNrT3B0aW9ucyB7IHJldHVybiB0aGlzLl9ncmlkPy5vcHRzIHx8IHRoaXMuX29wdGlvbnMgfHwge307IH1cblxuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciBlbXB0eSBjb250ZW50IHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAqIFNldCB0byB0cnVlIHRvIHNob3cgbmctY29udGVudCB3aXRoICdlbXB0eS1jb250ZW50JyBzZWxlY3RvciB3aGVuIGdyaWQgaGFzIG5vIGl0ZW1zLlxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICogYGBgaHRtbFxuICAgKiA8Z3JpZHN0YWNrIFtpc0VtcHR5XT1cImdyaWRJdGVtcy5sZW5ndGggPT09IDBcIj5cbiAgICogICA8ZGl2IGVtcHR5LWNvbnRlbnQ+RHJhZyB3aWRnZXRzIGhlcmUgdG8gZ2V0IHN0YXJ0ZWQ8L2Rpdj5cbiAgICogPC9ncmlkc3RhY2s+XG4gICAqIGBgYFxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGlzRW1wdHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBHcmlkU3RhY2sgZXZlbnQgZW1pdHRlcnMgZm9yIEFuZ3VsYXIgaW50ZWdyYXRpb24uXG4gICAqIFxuICAgKiBUaGVzZSBwcm92aWRlIEFuZ3VsYXItc3R5bGUgZXZlbnQgaGFuZGxpbmcgZm9yIEdyaWRTdGFjayBldmVudHMuXG4gICAqIEFsdGVybmF0aXZlbHksIHVzZSBgdGhpcy5ncmlkLm9uKCdldmVudDEgZXZlbnQyJywgY2FsbGJhY2spYCBmb3IgbXVsdGlwbGUgZXZlbnRzLlxuICAgKiBcbiAgICogTm90ZTogJ0NCJyBzdWZmaXggcHJldmVudHMgY29uZmxpY3RzIHdpdGggbmF0aXZlIERPTSBldmVudHMuXG4gICAqIFxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBodG1sXG4gICAqIDxncmlkc3RhY2sgKGNoYW5nZUNCKT1cIm9uR3JpZENoYW5nZSgkZXZlbnQpXCIgKGRyb3BwZWRDQik9XCJvbkl0ZW1Ecm9wcGVkKCRldmVudClcIj5cbiAgICogPC9ncmlkc3RhY2s+XG4gICAqIGBgYFxuICAgKi9cbiAgXG4gIC8qKiBFbWl0dGVkIHdoZW4gd2lkZ2V0cyBhcmUgYWRkZWQgdG8gdGhlIGdyaWQgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyBhZGRlZENCID0gbmV3IEV2ZW50RW1pdHRlcjxub2Rlc0NCPigpO1xuICBcbiAgLyoqIEVtaXR0ZWQgd2hlbiBncmlkIGxheW91dCBjaGFuZ2VzICovXG4gIEBPdXRwdXQoKSBwdWJsaWMgY2hhbmdlQ0IgPSBuZXcgRXZlbnRFbWl0dGVyPG5vZGVzQ0I+KCk7XG4gIFxuICAvKiogRW1pdHRlZCB3aGVuIGdyaWQgaXMgZGlzYWJsZWQgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyBkaXNhYmxlQ0IgPSBuZXcgRXZlbnRFbWl0dGVyPGV2ZW50Q0I+KCk7XG4gIFxuICAvKiogRW1pdHRlZCBkdXJpbmcgd2lkZ2V0IGRyYWcgb3BlcmF0aW9ucyAqL1xuICBAT3V0cHV0KCkgcHVibGljIGRyYWdDQiA9IG5ldyBFdmVudEVtaXR0ZXI8ZWxlbWVudENCPigpO1xuICBcbiAgLyoqIEVtaXR0ZWQgd2hlbiB3aWRnZXQgZHJhZyBzdGFydHMgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyBkcmFnU3RhcnRDQiA9IG5ldyBFdmVudEVtaXR0ZXI8ZWxlbWVudENCPigpO1xuICBcbiAgLyoqIEVtaXR0ZWQgd2hlbiB3aWRnZXQgZHJhZyBzdG9wcyAqL1xuICBAT3V0cHV0KCkgcHVibGljIGRyYWdTdG9wQ0IgPSBuZXcgRXZlbnRFbWl0dGVyPGVsZW1lbnRDQj4oKTtcbiAgXG4gIC8qKiBFbWl0dGVkIHdoZW4gd2lkZ2V0IGlzIGRyb3BwZWQgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyBkcm9wcGVkQ0IgPSBuZXcgRXZlbnRFbWl0dGVyPGRyb3BwZWRDQj4oKTtcbiAgXG4gIC8qKiBFbWl0dGVkIHdoZW4gZ3JpZCBpcyBlbmFibGVkICovXG4gIEBPdXRwdXQoKSBwdWJsaWMgZW5hYmxlQ0IgPSBuZXcgRXZlbnRFbWl0dGVyPGV2ZW50Q0I+KCk7XG4gIFxuICAvKiogRW1pdHRlZCB3aGVuIHdpZGdldHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgZ3JpZCAqL1xuICBAT3V0cHV0KCkgcHVibGljIHJlbW92ZWRDQiA9IG5ldyBFdmVudEVtaXR0ZXI8bm9kZXNDQj4oKTtcbiAgXG4gIC8qKiBFbWl0dGVkIGR1cmluZyB3aWRnZXQgcmVzaXplIG9wZXJhdGlvbnMgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyByZXNpemVDQiA9IG5ldyBFdmVudEVtaXR0ZXI8ZWxlbWVudENCPigpO1xuICBcbiAgLyoqIEVtaXR0ZWQgd2hlbiB3aWRnZXQgcmVzaXplIHN0YXJ0cyAqL1xuICBAT3V0cHV0KCkgcHVibGljIHJlc2l6ZVN0YXJ0Q0IgPSBuZXcgRXZlbnRFbWl0dGVyPGVsZW1lbnRDQj4oKTtcbiAgXG4gIC8qKiBFbWl0dGVkIHdoZW4gd2lkZ2V0IHJlc2l6ZSBzdG9wcyAqL1xuICBAT3V0cHV0KCkgcHVibGljIHJlc2l6ZVN0b3BDQiA9IG5ldyBFdmVudEVtaXR0ZXI8ZWxlbWVudENCPigpO1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG5hdGl2ZSBET00gZWxlbWVudCB0aGF0IGNvbnRhaW5zIGdyaWQtc3BlY2lmaWMgZmllbGRzLlxuICAgKiBUaGlzIGVsZW1lbnQgaGFzIEdyaWRTdGFjayBwcm9wZXJ0aWVzIGF0dGFjaGVkIHRvIGl0LlxuICAgKi9cbiAgcHVibGljIGdldCBlbCgpOiBHcmlkQ29tcEhUTUxFbGVtZW50IHsgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50OyB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdW5kZXJseWluZyBHcmlkU3RhY2sgaW5zdGFuY2UuXG4gICAqIFVzZSB0aGlzIHRvIGFjY2VzcyBHcmlkU3RhY2sgQVBJIG1ldGhvZHMgZGlyZWN0bHkuXG4gICAqIFxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHRoaXMuZ3JpZENvbXBvbmVudC5ncmlkLmFkZFdpZGdldCh7eDogMCwgeTogMCwgdzogMiwgaDogMX0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBnZXQgZ3JpZCgpOiBHcmlkU3RhY2sgfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fZ3JpZDsgfVxuXG4gIC8qKlxuICAgKiBDb21wb25lbnQgcmVmZXJlbmNlIGZvciBkeW5hbWljIGNvbXBvbmVudCByZW1vdmFsLlxuICAgKiBVc2VkIGludGVybmFsbHkgd2hlbiB0aGlzIGNvbXBvbmVudCBpcyBjcmVhdGVkIGR5bmFtaWNhbGx5LlxuICAgKi9cbiAgcHVibGljIHJlZjogQ29tcG9uZW50UmVmPEdyaWRzdGFja0NvbXBvbmVudD4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgb2YgY29tcG9uZW50IHNlbGVjdG9ycyB0byB0aGVpciB0eXBlcyBmb3IgZHluYW1pYyBjcmVhdGlvbi5cbiAgICogXG4gICAqIFRoaXMgZW5hYmxlcyBkeW5hbWljIGNvbXBvbmVudCBpbnN0YW50aWF0aW9uIGZyb20gc3RyaW5nIHNlbGVjdG9ycy5cbiAgICogQW5ndWxhciBkb2Vzbid0IHByb3ZpZGUgcHVibGljIGFjY2VzcyB0byB0aGlzIG1hcHBpbmcsIHNvIHdlIG1haW50YWluIG91ciBvd24uXG4gICAqIFxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIEdyaWRzdGFja0NvbXBvbmVudC5hZGRDb21wb25lbnRUb1NlbGVjdG9yVHlwZShbTXlXaWRnZXRDb21wb25lbnRdKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNlbGVjdG9yVG9UeXBlOiBTZWxlY3RvclRvVHlwZSA9IHt9O1xuICAvKipcbiAgICogUmVnaXN0ZXIgYSBsaXN0IG9mIEFuZ3VsYXIgY29tcG9uZW50cyBmb3IgZHluYW1pYyBjcmVhdGlvbi5cbiAgICogXG4gICAqIEBwYXJhbSB0eXBlTGlzdCBBcnJheSBvZiBjb21wb25lbnQgdHlwZXMgdG8gcmVnaXN0ZXJcbiAgICogXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogR3JpZHN0YWNrQ29tcG9uZW50LmFkZENvbXBvbmVudFRvU2VsZWN0b3JUeXBlKFtcbiAgICogICBNeVdpZGdldENvbXBvbmVudCxcbiAgICogICBBbm90aGVyV2lkZ2V0Q29tcG9uZW50XG4gICAqIF0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYWRkQ29tcG9uZW50VG9TZWxlY3RvclR5cGUodHlwZUxpc3Q6IEFycmF5PFR5cGU8T2JqZWN0Pj4pIHtcbiAgICB0eXBlTGlzdC5mb3JFYWNoKHR5cGUgPT4gR3JpZHN0YWNrQ29tcG9uZW50LnNlbGVjdG9yVG9UeXBlWyBHcmlkc3RhY2tDb21wb25lbnQuZ2V0U2VsZWN0b3IodHlwZSkgXSA9IHR5cGUpO1xuICB9XG4gIC8qKlxuICAgKiBFeHRyYWN0IHRoZSBzZWxlY3RvciBzdHJpbmcgZnJvbSBhbiBBbmd1bGFyIGNvbXBvbmVudCB0eXBlLlxuICAgKiBcbiAgICogQHBhcmFtIHR5cGUgVGhlIGNvbXBvbmVudCB0eXBlIHRvIGdldCBzZWxlY3RvciBmcm9tXG4gICAqIEByZXR1cm5zIFRoZSBjb21wb25lbnQncyBzZWxlY3RvciBzdHJpbmdcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0U2VsZWN0b3IodHlwZTogVHlwZTxPYmplY3Q+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVmbGVjdENvbXBvbmVudFR5cGUodHlwZSkhLnNlbGVjdG9yO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9vcHRpb25zPzogR3JpZFN0YWNrT3B0aW9ucztcbiAgcHJvdGVjdGVkIF9ncmlkPzogR3JpZFN0YWNrO1xuICBwcm90ZWN0ZWQgX3N1YjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgbG9hZGVkPzogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgZWxlbWVudFJlZjogRWxlbWVudFJlZjxHcmlkQ29tcEhUTUxFbGVtZW50Pikge1xuICAgIC8vIHNldCBnbG9iYWxseSBvdXIgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgcmlnaHQgd2lkZ2V0IHR5cGVcbiAgICBpZiAoIUdyaWRTdGFjay5hZGRSZW1vdmVDQikge1xuICAgICAgR3JpZFN0YWNrLmFkZFJlbW92ZUNCID0gZ3NDcmVhdGVOZ0NvbXBvbmVudHM7XG4gICAgfVxuICAgIGlmICghR3JpZFN0YWNrLnNhdmVDQikge1xuICAgICAgR3JpZFN0YWNrLnNhdmVDQiA9IGdzU2F2ZUFkZGl0aW9uYWxOZ0luZm87XG4gICAgfVxuICAgIGlmICghR3JpZFN0YWNrLnVwZGF0ZUNCKSB7XG4gICAgICBHcmlkU3RhY2sudXBkYXRlQ0IgPSBnc1VwZGF0ZU5nQ29tcG9uZW50cztcbiAgICB9XG4gICAgdGhpcy5lbC5fZ3JpZENvbXAgPSB0aGlzO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIGluaXQgb3Vyc2VsZiBiZWZvcmUgYW55IHRlbXBsYXRlIGNoaWxkcmVuIGFyZSBjcmVhdGVkIHNpbmNlIHdlIHRyYWNrIHRoZW0gYmVsb3cgYW55d2F5IC0gbm8gbmVlZCB0byBkb3VibGUgY3JlYXRlK3VwZGF0ZSB3aWRnZXRzXG4gICAgdGhpcy5sb2FkZWQgPSAhIXRoaXMub3B0aW9ucz8uY2hpbGRyZW4/Lmxlbmd0aDtcbiAgICB0aGlzLl9ncmlkID0gR3JpZFN0YWNrLmluaXQodGhpcy5fb3B0aW9ucywgdGhpcy5lbCk7XG4gICAgZGVsZXRlIHRoaXMuX29wdGlvbnM7IC8vIEdTIGhhcyBpdCBub3dcblxuICAgIHRoaXMuY2hlY2tFbXB0eSgpO1xuICB9XG5cbiAgLyoqIHdhaXQgdW50aWwgYWZ0ZXIgYWxsIERPTSBpcyByZWFkeSB0byBpbml0IGdyaWRzdGFjayBjaGlsZHJlbiAoYWZ0ZXIgYW5ndWxhciBuZ0ZvciBhbmQgc3ViLWNvbXBvbmVudHMgcnVuIGZpcnN0KSAqL1xuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIC8vIHRyYWNrIHdoZW5ldmVyIHRoZSBjaGlsZHJlbiBsaXN0IGNoYW5nZXMgYW5kIHVwZGF0ZSB0aGUgbGF5b3V0Li4uXG4gICAgdGhpcy5fc3ViID0gdGhpcy5ncmlkc3RhY2tJdGVtcz8uY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVBbGwoKSk7XG4gICAgLy8gLi4uYW5kIGRvIHRoaXMgb25jZSBhdCBsZWFzdCB1bmxlc3Mgd2UgbG9hZGVkIGNoaWxkcmVuIGFscmVhZHlcbiAgICBpZiAoIXRoaXMubG9hZGVkKSB0aGlzLnVwZGF0ZUFsbCgpO1xuICAgIHRoaXMuaG9va0V2ZW50cyh0aGlzLmdyaWQpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5ob29rRXZlbnRzKHRoaXMuX2dyaWQpO1xuICAgIHRoaXMuX3N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9ncmlkPy5kZXN0cm95KCk7XG4gICAgZGVsZXRlIHRoaXMuX2dyaWQ7XG4gICAgZGVsZXRlIHRoaXMuZWwuX2dyaWRDb21wO1xuICAgIGRlbGV0ZSB0aGlzLmNvbnRhaW5lcjtcbiAgICBkZWxldGUgdGhpcy5yZWY7XG4gIH1cblxuICAvKipcbiAgICogY2FsbGVkIHdoZW4gdGhlIFRFTVBMQVRFIChub3QgcmVjb21tZW5kZWQpIGxpc3Qgb2YgaXRlbXMgY2hhbmdlcyAtIGdldCBhIGxpc3Qgb2Ygbm9kZXMgYW5kXG4gICAqIHVwZGF0ZSB0aGUgbGF5b3V0IGFjY29yZGluZ2x5ICh3aGljaCB3aWxsIHRha2UgY2FyZSBvZiBhZGRpbmcvcmVtb3ZpbmcgaXRlbXMgY2hhbmdlZCBieSBBbmd1bGFyKVxuICAgKi9cbiAgcHVibGljIHVwZGF0ZUFsbCgpIHtcbiAgICBpZiAoIXRoaXMuZ3JpZCkgcmV0dXJuO1xuICAgIGNvbnN0IGxheW91dDogR3JpZFN0YWNrV2lkZ2V0W10gPSBbXTtcbiAgICB0aGlzLmdyaWRzdGFja0l0ZW1zPy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgbGF5b3V0LnB1c2goaXRlbS5vcHRpb25zKTtcbiAgICAgIGl0ZW0uY2xlYXJPcHRpb25zKCk7XG4gICAgfSk7XG4gICAgdGhpcy5ncmlkLmxvYWQobGF5b3V0KTsgLy8gZWZmaWNpZW50IHRoYXQgZG9lcyBkaWZmcyBvbmx5XG4gIH1cblxuICAvKiogY2hlY2sgaWYgdGhlIGdyaWQgaXMgZW1wdHksIGlmIHNvIHNob3cgYWx0ZXJuYXRpdmUgY29udGVudCAqL1xuICBwdWJsaWMgY2hlY2tFbXB0eSgpIHtcbiAgICBpZiAoIXRoaXMuZ3JpZCkgcmV0dXJuO1xuICAgIHRoaXMuaXNFbXB0eSA9ICF0aGlzLmdyaWQuZW5naW5lLm5vZGVzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKiBnZXQgYWxsIGtub3duIGV2ZW50cyBhcyBlYXN5IHRvIHVzZSBPdXRwdXRzIGZvciBjb252ZW5pZW5jZSAqL1xuICBwcm90ZWN0ZWQgaG9va0V2ZW50cyhncmlkPzogR3JpZFN0YWNrKSB7XG4gICAgaWYgKCFncmlkKSByZXR1cm47XG4gICAgLy8gbmVzdGVkIGdyaWRzIGRvbid0IGhhdmUgZXZlbnRzIGluIHYxMi4xKyBzbyBza2lwXG4gICAgaWYgKGdyaWQucGFyZW50R3JpZE5vZGUpIHJldHVybjtcbiAgICBncmlkXG4gICAgICAub24oJ2FkZGVkJywgKGV2ZW50OiBFdmVudCwgbm9kZXM6IEdyaWRTdGFja05vZGVbXSkgPT4ge1xuICAgICAgICBjb25zdCBncmlkQ29tcCA9IChub2Rlc1swXS5ncmlkPy5lbCBhcyBHcmlkQ29tcEhUTUxFbGVtZW50KS5fZ3JpZENvbXAgfHwgdGhpcztcbiAgICAgICAgZ3JpZENvbXAuY2hlY2tFbXB0eSgpO1xuICAgICAgICB0aGlzLmFkZGVkQ0IuZW1pdCh7ZXZlbnQsIG5vZGVzfSk7XG4gICAgICB9KVxuICAgICAgLm9uKCdjaGFuZ2UnLCAoZXZlbnQ6IEV2ZW50LCBub2RlczogR3JpZFN0YWNrTm9kZVtdKSA9PiB0aGlzLmNoYW5nZUNCLmVtaXQoe2V2ZW50LCBub2Rlc30pKVxuICAgICAgLm9uKCdkaXNhYmxlJywgKGV2ZW50OiBFdmVudCkgPT4gdGhpcy5kaXNhYmxlQ0IuZW1pdCh7ZXZlbnR9KSlcbiAgICAgIC5vbignZHJhZycsIChldmVudDogRXZlbnQsIGVsOiBHcmlkSXRlbUhUTUxFbGVtZW50KSA9PiB0aGlzLmRyYWdDQi5lbWl0KHtldmVudCwgZWx9KSlcbiAgICAgIC5vbignZHJhZ3N0YXJ0JywgKGV2ZW50OiBFdmVudCwgZWw6IEdyaWRJdGVtSFRNTEVsZW1lbnQpID0+IHRoaXMuZHJhZ1N0YXJ0Q0IuZW1pdCh7ZXZlbnQsIGVsfSkpXG4gICAgICAub24oJ2RyYWdzdG9wJywgKGV2ZW50OiBFdmVudCwgZWw6IEdyaWRJdGVtSFRNTEVsZW1lbnQpID0+IHRoaXMuZHJhZ1N0b3BDQi5lbWl0KHtldmVudCwgZWx9KSlcbiAgICAgIC5vbignZHJvcHBlZCcsIChldmVudDogRXZlbnQsIHByZXZpb3VzTm9kZTogR3JpZFN0YWNrTm9kZSwgbmV3Tm9kZTogR3JpZFN0YWNrTm9kZSkgPT4gdGhpcy5kcm9wcGVkQ0IuZW1pdCh7ZXZlbnQsIHByZXZpb3VzTm9kZSwgbmV3Tm9kZX0pKVxuICAgICAgLm9uKCdlbmFibGUnLCAoZXZlbnQ6IEV2ZW50KSA9PiB0aGlzLmVuYWJsZUNCLmVtaXQoe2V2ZW50fSkpXG4gICAgICAub24oJ3JlbW92ZWQnLCAoZXZlbnQ6IEV2ZW50LCBub2RlczogR3JpZFN0YWNrTm9kZVtdKSA9PiB7XG4gICAgICAgIGNvbnN0IGdyaWRDb21wID0gKG5vZGVzWzBdLmdyaWQ/LmVsIGFzIEdyaWRDb21wSFRNTEVsZW1lbnQpLl9ncmlkQ29tcCB8fCB0aGlzO1xuICAgICAgICBncmlkQ29tcC5jaGVja0VtcHR5KCk7XG4gICAgICAgIHRoaXMucmVtb3ZlZENCLmVtaXQoe2V2ZW50LCBub2Rlc30pO1xuICAgICAgfSlcbiAgICAgIC5vbigncmVzaXplJywgKGV2ZW50OiBFdmVudCwgZWw6IEdyaWRJdGVtSFRNTEVsZW1lbnQpID0+IHRoaXMucmVzaXplQ0IuZW1pdCh7ZXZlbnQsIGVsfSkpXG4gICAgICAub24oJ3Jlc2l6ZXN0YXJ0JywgKGV2ZW50OiBFdmVudCwgZWw6IEdyaWRJdGVtSFRNTEVsZW1lbnQpID0+IHRoaXMucmVzaXplU3RhcnRDQi5lbWl0KHtldmVudCwgZWx9KSlcbiAgICAgIC5vbigncmVzaXplc3RvcCcsIChldmVudDogRXZlbnQsIGVsOiBHcmlkSXRlbUhUTUxFbGVtZW50KSA9PiB0aGlzLnJlc2l6ZVN0b3BDQi5lbWl0KHtldmVudCwgZWx9KSlcbiAgfVxuXG4gIHByb3RlY3RlZCB1bmhvb2tFdmVudHMoZ3JpZD86IEdyaWRTdGFjaykge1xuICAgIGlmICghZ3JpZCkgcmV0dXJuO1xuICAgIC8vIG5lc3RlZCBncmlkcyBkb24ndCBoYXZlIGV2ZW50cyBpbiB2MTIuMSsgc28gc2tpcFxuICAgIGlmIChncmlkLnBhcmVudEdyaWROb2RlKSByZXR1cm47XG4gICAgZ3JpZC5vZmYoJ2FkZGVkIGNoYW5nZSBkaXNhYmxlIGRyYWcgZHJhZ3N0YXJ0IGRyYWdzdG9wIGRyb3BwZWQgZW5hYmxlIHJlbW92ZWQgcmVzaXplIHJlc2l6ZXN0YXJ0IHJlc2l6ZXN0b3AnKTtcbiAgfVxufVxuXG4vKipcbiAqIGNhbiBiZSB1c2VkIHdoZW4gYSBuZXcgaXRlbSBuZWVkcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3ZSBkbyBhcyBhIEFuZ3VsYXIgY29tcG9uZW50LCBvciBkZWxldGVkIChza2lwKVxuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdzQ3JlYXRlTmdDb21wb25lbnRzKGhvc3Q6IEdyaWRDb21wSFRNTEVsZW1lbnQgfCBIVE1MRWxlbWVudCwgbjogTmdHcmlkU3RhY2tOb2RlLCBhZGQ6IGJvb2xlYW4sIGlzR3JpZDogYm9vbGVhbik6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkIHtcbiAgaWYgKGFkZCkge1xuICAgIC8vXG4gICAgLy8gY3JlYXRlIHRoZSBjb21wb25lbnQgZHluYW1pY2FsbHkgLSBzZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2RvY3MvdHMvbGF0ZXN0L2Nvb2tib29rL2R5bmFtaWMtY29tcG9uZW50LWxvYWRlci5odG1sXG4gICAgLy9cbiAgICBpZiAoIWhvc3QpIHJldHVybjtcbiAgICBpZiAoaXNHcmlkKSB7XG4gICAgICAvLyBUT0RPOiBmaWd1cmUgb3V0IGhvdyB0byBjcmVhdGUgbmcgY29tcG9uZW50IGluc2lkZSByZWd1bGFyIERpdi4gbmVlZCB0byBhY2Nlc3MgYXBwIGluamVjdG9ycy4uLlxuICAgICAgLy8gaWYgKCFjb250YWluZXIpIHtcbiAgICAgIC8vICAgY29uc3QgaG9zdEVsZW1lbnQ6IEVsZW1lbnQgPSBob3N0O1xuICAgICAgLy8gICBjb25zdCBlbnZpcm9ubWVudEluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yO1xuICAgICAgLy8gICBncmlkID0gY3JlYXRlQ29tcG9uZW50KEdyaWRzdGFja0NvbXBvbmVudCwge2Vudmlyb25tZW50SW5qZWN0b3IsIGhvc3RFbGVtZW50fSk/Lmluc3RhbmNlO1xuICAgICAgLy8gfVxuXG4gICAgICBjb25zdCBncmlkSXRlbUNvbXAgPSAoaG9zdC5wYXJlbnRFbGVtZW50IGFzIEdyaWRJdGVtQ29tcEhUTUxFbGVtZW50KT8uX2dyaWRJdGVtQ29tcDtcbiAgICAgIGlmICghZ3JpZEl0ZW1Db21wKSByZXR1cm47XG4gICAgICAvLyBjaGVjayBpZiBncmlkSXRlbSBoYXMgYSBjaGlsZCBjb21wb25lbnQgd2l0aCAnY29udGFpbmVyJyBleHBvc2VkIHRvIGNyZWF0ZSB1bmRlci4uXG4gICAgICBjb25zdCBjb250YWluZXIgPSAoZ3JpZEl0ZW1Db21wLmNoaWxkV2lkZ2V0IGFzIGFueSk/LmNvbnRhaW5lciB8fCBncmlkSXRlbUNvbXAuY29udGFpbmVyO1xuICAgICAgY29uc3QgZ3JpZFJlZiA9IGNvbnRhaW5lcj8uY3JlYXRlQ29tcG9uZW50KEdyaWRzdGFja0NvbXBvbmVudCk7XG4gICAgICBjb25zdCBncmlkID0gZ3JpZFJlZj8uaW5zdGFuY2U7XG4gICAgICBpZiAoIWdyaWQpIHJldHVybjtcbiAgICAgIGdyaWQucmVmID0gZ3JpZFJlZjtcbiAgICAgIGdyaWQub3B0aW9ucyA9IG47XG4gICAgICByZXR1cm4gZ3JpZC5lbDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZ3JpZENvbXAgPSAoaG9zdCBhcyBHcmlkQ29tcEhUTUxFbGVtZW50KS5fZ3JpZENvbXA7XG4gICAgICBjb25zdCBncmlkSXRlbVJlZiA9IGdyaWRDb21wPy5jb250YWluZXI/LmNyZWF0ZUNvbXBvbmVudChHcmlkc3RhY2tJdGVtQ29tcG9uZW50KTtcbiAgICAgIGNvbnN0IGdyaWRJdGVtID0gZ3JpZEl0ZW1SZWY/Lmluc3RhbmNlO1xuICAgICAgaWYgKCFncmlkSXRlbSkgcmV0dXJuO1xuICAgICAgZ3JpZEl0ZW0ucmVmID0gZ3JpZEl0ZW1SZWZcblxuICAgICAgLy8gZGVmaW5lIHdoYXQgdHlwZSBvZiBjb21wb25lbnQgdG8gY3JlYXRlIGFzIGNoaWxkLCBPUiB5b3UgY2FuIGRvIGl0IEdyaWRzdGFja0l0ZW1Db21wb25lbnQgdGVtcGxhdGUsIGJ1dCB0aGlzIGlzIG1vcmUgZ2VuZXJpY1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBuLnNlbGVjdG9yO1xuICAgICAgY29uc3QgdHlwZSA9IHNlbGVjdG9yID8gR3JpZHN0YWNrQ29tcG9uZW50LnNlbGVjdG9yVG9UeXBlW3NlbGVjdG9yXSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgIC8vIHNoYXJlZCBjb2RlIHRvIGNyZWF0ZSBvdXIgc2VsZWN0b3IgY29tcG9uZW50XG4gICAgICAgIGNvbnN0IGNyZWF0ZUNvbXAgPSAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY2hpbGRXaWRnZXQgPSBncmlkSXRlbS5jb250YWluZXI/LmNyZWF0ZUNvbXBvbmVudCh0eXBlKT8uaW5zdGFuY2UgYXMgQmFzZVdpZGdldDtcbiAgICAgICAgICAvLyBpZiBwcm9wZXIgQmFzZVdpZGdldCBzdWJjbGFzcywgc2F2ZSBpdCBhbmQgbG9hZCBhZGRpdGlvbmFsIGRhdGFcbiAgICAgICAgICBpZiAoY2hpbGRXaWRnZXQgJiYgdHlwZW9mIGNoaWxkV2lkZ2V0LnNlcmlhbGl6ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgY2hpbGRXaWRnZXQuZGVzZXJpYWxpemUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGdyaWRJdGVtLmNoaWxkV2lkZ2V0ID0gY2hpbGRXaWRnZXQ7XG4gICAgICAgICAgICBjaGlsZFdpZGdldC5kZXNlcmlhbGl6ZShuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYXp5TG9hZCA9IG4ubGF6eUxvYWQgfHwgbi5ncmlkPy5vcHRzPy5sYXp5TG9hZCAmJiBuLmxhenlMb2FkICE9PSBmYWxzZTtcbiAgICAgICAgaWYgKGxhenlMb2FkKSB7XG4gICAgICAgICAgaWYgKCFuLnZpc2libGVPYnNlcnZhYmxlKSB7XG4gICAgICAgICAgICBuLnZpc2libGVPYnNlcnZhYmxlID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChbZW50cnldKSA9PiB7IGlmIChlbnRyeS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICAgICAgICBuLnZpc2libGVPYnNlcnZhYmxlPy5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICAgIGRlbGV0ZSBuLnZpc2libGVPYnNlcnZhYmxlO1xuICAgICAgICAgICAgICBjcmVhdGVDb21wKCk7XG4gICAgICAgICAgICB9fSk7XG4gICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiBuLnZpc2libGVPYnNlcnZhYmxlPy5vYnNlcnZlKGdyaWRJdGVtLmVsKSk7IC8vIHdhaXQgdW50aWwgY2FsbGVlIHNldHMgcG9zaXRpb24gYXR0cmlidXRlc1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGNyZWF0ZUNvbXAoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGdyaWRJdGVtLmVsO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvL1xuICAgIC8vIFJFTU9WRSAtIGhhdmUgdG8gY2FsbCBDb21wb25lbnRSZWY6ZGVzdHJveSgpIGZvciBkeW5hbWljIG9iamVjdHMgdG8gY29ycmVjdGx5IHJlbW92ZSB0aGVtc2VsdmVzXG4gICAgLy8gTm90ZTogdGhpcyB3aWxsIGRlc3Ryb3kgYWxsIGNoaWxkcmVuIGR5bmFtaWMgY29tcG9uZW50cyBhcyB3ZWxsOiBncmlkSXRlbSAtPiBjaGlsZFdpZGdldFxuICAgIC8vXG4gICAgaWYgKGlzR3JpZCkge1xuICAgICAgY29uc3QgZ3JpZCA9IChuLmVsIGFzIEdyaWRDb21wSFRNTEVsZW1lbnQpPy5fZ3JpZENvbXA7XG4gICAgICBpZiAoZ3JpZD8ucmVmKSBncmlkLnJlZi5kZXN0cm95KCk7XG4gICAgICBlbHNlIGdyaWQ/Lm5nT25EZXN0cm95KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGdyaWRJdGVtID0gKG4uZWwgYXMgR3JpZEl0ZW1Db21wSFRNTEVsZW1lbnQpPy5fZ3JpZEl0ZW1Db21wO1xuICAgICAgaWYgKGdyaWRJdGVtPy5yZWYpIGdyaWRJdGVtLnJlZi5kZXN0cm95KCk7XG4gICAgICBlbHNlIGdyaWRJdGVtPy5uZ09uRGVzdHJveSgpO1xuICAgIH1cbiAgfVxuICByZXR1cm47XG59XG5cbi8qKlxuICogY2FsbGVkIGZvciBlYWNoIGl0ZW0gaW4gdGhlIGdyaWQgLSBjaGVjayBpZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG5lZWRzIHRvIGJlIHNhdmVkLlxuICogTm90ZTogc2luY2UgdGhpcyBpcyBvcHRpb25zIG1pbnVzIGdyaWRzdGFjayBwcm90ZWN0ZWQgbWVtYmVycyB1c2luZyBVdGlscy5yZW1vdmVJbnRlcm5hbEZvclNhdmUoKSxcbiAqIHRoaXMgdHlwaWNhbGx5IGRvZXNuJ3QgbmVlZCB0byBkbyBhbnl0aGluZy4gSG93ZXZlciB5b3VyIGN1c3RvbSBDb21wb25lbnQgQElucHV0KCkgYXJlIG5vdyBzdXBwb3J0ZWRcbiAqIHVzaW5nIEJhc2VXaWRnZXQuc2VyaWFsaXplKClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdzU2F2ZUFkZGl0aW9uYWxOZ0luZm8objogTmdHcmlkU3RhY2tOb2RlLCB3OiBOZ0dyaWRTdGFja1dpZGdldCkge1xuICBjb25zdCBncmlkSXRlbSA9IChuLmVsIGFzIEdyaWRJdGVtQ29tcEhUTUxFbGVtZW50KT8uX2dyaWRJdGVtQ29tcDtcbiAgaWYgKGdyaWRJdGVtKSB7XG4gICAgY29uc3QgaW5wdXQgPSBncmlkSXRlbS5jaGlsZFdpZGdldD8uc2VyaWFsaXplKCk7XG4gICAgaWYgKGlucHV0KSB7XG4gICAgICB3LmlucHV0ID0gaW5wdXQ7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICAvLyBlbHNlIGNoZWNrIGlmIEdyaWRcbiAgY29uc3QgZ3JpZCA9IChuLmVsIGFzIEdyaWRDb21wSFRNTEVsZW1lbnQpPy5fZ3JpZENvbXA7XG4gIGlmIChncmlkKSB7XG4gICAgLy8uLi4uIHNhdmUgYW55IGN1c3RvbSBkYXRhXG4gIH1cbn1cblxuLyoqXG4gKiB0cmFjayB3aGVuIHdpZGdldGEgcmUgdXBkYXRlZCAocmF0aGVyIHRoYW4gY3JlYXRlZCkgdG8gbWFrZSBzdXJlIHdlIGRlLXNlcmlhbGl6ZSB0aGVtIGFzIHdlbGxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdzVXBkYXRlTmdDb21wb25lbnRzKG46IE5nR3JpZFN0YWNrTm9kZSkge1xuICBjb25zdCB3OiBOZ0dyaWRTdGFja1dpZGdldCA9IG47XG4gIGNvbnN0IGdyaWRJdGVtID0gKG4uZWwgYXMgR3JpZEl0ZW1Db21wSFRNTEVsZW1lbnQpPy5fZ3JpZEl0ZW1Db21wO1xuICBpZiAoZ3JpZEl0ZW0/LmNoaWxkV2lkZ2V0ICYmIHcuaW5wdXQpIGdyaWRJdGVtLmNoaWxkV2lkZ2V0LmRlc2VyaWFsaXplKHcpO1xufSJdfQ== \ No newline at end of file diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/esm2020/lib/gridstack.module.mjs b/web/skins/classic/assets/gridstack-12.3.3/dist/angular/esm2020/lib/gridstack.module.mjs deleted file mode 100644 index 0068bbd1d..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/esm2020/lib/gridstack.module.mjs +++ /dev/null @@ -1,53 +0,0 @@ -/** - * gridstack.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -import { NgModule } from "@angular/core"; -import { GridstackItemComponent } from "./gridstack-item.component"; -import { GridstackComponent } from "./gridstack.component"; -import * as i0 from "@angular/core"; -/** - * @deprecated Use GridstackComponent and GridstackItemComponent as standalone components instead. - * - * This NgModule is provided for backward compatibility but is no longer the recommended approach. - * Import components directly in your standalone components or use the new Angular module structure. - * - * @example - * ```typescript - * // Preferred approach - standalone components - * @Component({ - * selector: 'my-app', - * imports: [GridstackComponent, GridstackItemComponent], - * template: '' - * }) - * export class AppComponent {} - * - * // Legacy approach (deprecated) - * @NgModule({ - * imports: [GridstackModule] - * }) - * export class AppModule {} - * ``` - */ -export class GridstackModule { -} -GridstackModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); -GridstackModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, imports: [GridstackItemComponent, - GridstackComponent], exports: [GridstackItemComponent, - GridstackComponent] }); -GridstackModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, imports: [GridstackItemComponent, - GridstackComponent] }); -i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, decorators: [{ - type: NgModule, - args: [{ - imports: [ - GridstackItemComponent, - GridstackComponent, - ], - exports: [ - GridstackItemComponent, - GridstackComponent, - ], - }] - }] }); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0YWNrLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2FuZ3VsYXIvcHJvamVjdHMvbGliL3NyYy9saWIvZ3JpZHN0YWNrLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQUUzRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQVdILE1BQU0sT0FBTyxlQUFlOzs0R0FBZixlQUFlOzZHQUFmLGVBQWUsWUFSeEIsc0JBQXNCO1FBQ3RCLGtCQUFrQixhQUdsQixzQkFBc0I7UUFDdEIsa0JBQWtCOzZHQUdULGVBQWUsWUFSeEIsc0JBQXNCO1FBQ3RCLGtCQUFrQjsyRkFPVCxlQUFlO2tCQVYzQixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRTt3QkFDUCxzQkFBc0I7d0JBQ3RCLGtCQUFrQjtxQkFDbkI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLHNCQUFzQjt3QkFDdEIsa0JBQWtCO3FCQUNuQjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBncmlkc3RhY2suY29tcG9uZW50LnRzIDEyLjMuM1xyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjItMjAyNCBBbGFpbiBEdW1lc255IC0gc2VlIEdyaWRTdGFjayByb290IGxpY2Vuc2VcclxuICovXHJcblxyXG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG5pbXBvcnQgeyBHcmlkc3RhY2tJdGVtQ29tcG9uZW50IH0gZnJvbSBcIi4vZ3JpZHN0YWNrLWl0ZW0uY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IEdyaWRzdGFja0NvbXBvbmVudCB9IGZyb20gXCIuL2dyaWRzdGFjay5jb21wb25lbnRcIjtcclxuXHJcbi8qKlxyXG4gKiBAZGVwcmVjYXRlZCBVc2UgR3JpZHN0YWNrQ29tcG9uZW50IGFuZCBHcmlkc3RhY2tJdGVtQ29tcG9uZW50IGFzIHN0YW5kYWxvbmUgY29tcG9uZW50cyBpbnN0ZWFkLlxyXG4gKiBcclxuICogVGhpcyBOZ01vZHVsZSBpcyBwcm92aWRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBidXQgaXMgbm8gbG9uZ2VyIHRoZSByZWNvbW1lbmRlZCBhcHByb2FjaC5cclxuICogSW1wb3J0IGNvbXBvbmVudHMgZGlyZWN0bHkgaW4geW91ciBzdGFuZGFsb25lIGNvbXBvbmVudHMgb3IgdXNlIHRoZSBuZXcgQW5ndWxhciBtb2R1bGUgc3RydWN0dXJlLlxyXG4gKiBcclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiAvLyBQcmVmZXJyZWQgYXBwcm9hY2ggLSBzdGFuZGFsb25lIGNvbXBvbmVudHNcclxuICogQENvbXBvbmVudCh7XHJcbiAqICAgc2VsZWN0b3I6ICdteS1hcHAnLFxyXG4gKiAgIGltcG9ydHM6IFtHcmlkc3RhY2tDb21wb25lbnQsIEdyaWRzdGFja0l0ZW1Db21wb25lbnRdLFxyXG4gKiAgIHRlbXBsYXRlOiAnPGdyaWRzdGFjaz48L2dyaWRzdGFjaz4nXHJcbiAqIH0pXHJcbiAqIGV4cG9ydCBjbGFzcyBBcHBDb21wb25lbnQge31cclxuICogXHJcbiAqIC8vIExlZ2FjeSBhcHByb2FjaCAoZGVwcmVjYXRlZClcclxuICogQE5nTW9kdWxlKHtcclxuICogICBpbXBvcnRzOiBbR3JpZHN0YWNrTW9kdWxlXVxyXG4gKiB9KVxyXG4gKiBleHBvcnQgY2xhc3MgQXBwTW9kdWxlIHt9XHJcbiAqIGBgYFxyXG4gKi9cclxuQE5nTW9kdWxlKHtcclxuICBpbXBvcnRzOiBbXHJcbiAgICBHcmlkc3RhY2tJdGVtQ29tcG9uZW50LFxyXG4gICAgR3JpZHN0YWNrQ29tcG9uZW50LFxyXG4gIF0sXHJcbiAgZXhwb3J0czogW1xyXG4gICAgR3JpZHN0YWNrSXRlbUNvbXBvbmVudCxcclxuICAgIEdyaWRzdGFja0NvbXBvbmVudCxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgR3JpZHN0YWNrTW9kdWxlIHt9XHJcbiJdfQ== \ No newline at end of file diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/esm2020/lib/types.mjs b/web/skins/classic/assets/gridstack-12.3.3/dist/angular/esm2020/lib/types.mjs deleted file mode 100644 index 0d0bf9f07..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/esm2020/lib/types.mjs +++ /dev/null @@ -1,6 +0,0 @@ -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2025 Alain Dumesny - see GridStack root license - */ -export {}; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9hbmd1bGFyL3Byb2plY3RzL2xpYi9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBncmlkc3RhY2staXRlbS5jb21wb25lbnQudHMgMTIuMy4zXHJcbiAqIENvcHlyaWdodCAoYykgMjAyNSBBbGFpbiBEdW1lc255IC0gc2VlIEdyaWRTdGFjayByb290IGxpY2Vuc2VcclxuICovXHJcblxyXG5pbXBvcnQgeyBHcmlkU3RhY2tOb2RlLCBHcmlkU3RhY2tPcHRpb25zLCBHcmlkU3RhY2tXaWRnZXQgfSBmcm9tIFwiZ3JpZHN0YWNrXCI7XHJcblxyXG4vKipcclxuICogRXh0ZW5kZWQgR3JpZFN0YWNrV2lkZ2V0IGludGVyZmFjZSBmb3IgQW5ndWxhciBpbnRlZ3JhdGlvbi5cclxuICogQWRkcyBBbmd1bGFyLXNwZWNpZmljIHByb3BlcnRpZXMgZm9yIGR5bmFtaWMgY29tcG9uZW50IGNyZWF0aW9uLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBOZ0dyaWRTdGFja1dpZGdldCBleHRlbmRzIEdyaWRTdGFja1dpZGdldCB7XHJcbiAgLyoqIEFuZ3VsYXIgY29tcG9uZW50IHNlbGVjdG9yIGZvciBkeW5hbWljIGNyZWF0aW9uIChlLmcuLCAnbXktd2lkZ2V0JykgKi9cclxuICBzZWxlY3Rvcj86IHN0cmluZztcclxuICAvKiogU2VyaWFsaXplZCBkYXRhIGZvciBjb21wb25lbnQgQElucHV0KCkgcHJvcGVydGllcyAqL1xyXG4gIGlucHV0PzogTmdDb21wSW5wdXRzO1xyXG4gIC8qKiBDb25maWd1cmF0aW9uIGZvciBuZXN0ZWQgc3ViLWdyaWRzICovXHJcbiAgc3ViR3JpZE9wdHM/OiBOZ0dyaWRTdGFja09wdGlvbnM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFeHRlbmRlZCBHcmlkU3RhY2tOb2RlIGludGVyZmFjZSBmb3IgQW5ndWxhciBpbnRlZ3JhdGlvbi5cclxuICogQWRkcyBjb21wb25lbnQgc2VsZWN0b3IgZm9yIGR5bmFtaWMgY29udGVudCBjcmVhdGlvbi5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgTmdHcmlkU3RhY2tOb2RlIGV4dGVuZHMgR3JpZFN0YWNrTm9kZSB7XHJcbiAgLyoqIEFuZ3VsYXIgY29tcG9uZW50IHNlbGVjdG9yIGZvciB0aGlzIG5vZGUncyBjb250ZW50ICovXHJcbiAgc2VsZWN0b3I/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFeHRlbmRlZCBHcmlkU3RhY2tPcHRpb25zIGludGVyZmFjZSBmb3IgQW5ndWxhciBpbnRlZ3JhdGlvbi5cclxuICogU3VwcG9ydHMgQW5ndWxhci1zcGVjaWZpYyB3aWRnZXQgZGVmaW5pdGlvbnMgYW5kIG5lc3RlZCBncmlkcy5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgTmdHcmlkU3RhY2tPcHRpb25zIGV4dGVuZHMgR3JpZFN0YWNrT3B0aW9ucyB7XHJcbiAgLyoqIEFycmF5IG9mIEFuZ3VsYXIgd2lkZ2V0IGRlZmluaXRpb25zIGZvciBpbml0aWFsIGdyaWQgc2V0dXAgKi9cclxuICBjaGlsZHJlbj86IE5nR3JpZFN0YWNrV2lkZ2V0W107XHJcbiAgLyoqIENvbmZpZ3VyYXRpb24gZm9yIG5lc3RlZCBzdWItZ3JpZHMgKEFuZ3VsYXItYXdhcmUpICovXHJcbiAgc3ViR3JpZE9wdHM/OiBOZ0dyaWRTdGFja09wdGlvbnM7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUeXBlIGZvciBjb21wb25lbnQgaW5wdXQgZGF0YSBzZXJpYWxpemF0aW9uLlxyXG4gKiBNYXBzIEBJbnB1dCgpIHByb3BlcnR5IG5hbWVzIHRvIHRoZWlyIHZhbHVlcyBmb3Igd2lkZ2V0IHBlcnNpc3RlbmNlLlxyXG4gKiBcclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBjb25zdCBpbnB1dHM6IE5nQ29tcElucHV0cyA9IHtcclxuICogICB0aXRsZTogJ015IFdpZGdldCcsXHJcbiAqICAgdmFsdWU6IDQyLFxyXG4gKiAgIGNvbmZpZzogeyBlbmFibGVkOiB0cnVlIH1cclxuICogfTtcclxuICogYGBgXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBOZ0NvbXBJbnB1dHMgPSB7W2tleTogc3RyaW5nXTogYW55fTtcclxuIl19 \ No newline at end of file diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/fesm2015/gridstack-angular.mjs b/web/skins/classic/assets/gridstack-12.3.3/dist/angular/fesm2015/gridstack-angular.mjs deleted file mode 100644 index 809d509b8..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/fesm2015/gridstack-angular.mjs +++ /dev/null @@ -1,647 +0,0 @@ -import * as i0 from '@angular/core'; -import { Injectable, ViewContainerRef, Component, ViewChild, Input, EventEmitter, reflectComponentType, ContentChildren, Output, NgModule } from '@angular/core'; -import { NgIf } from '@angular/common'; -import { GridStack } from 'gridstack'; - -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -/** - * Base widget class for GridStack Angular integration. - */ -class BaseWidget { - /** - * Override this method to return serializable data for this widget. - * - * Return an object with properties that map to your component's @Input() fields. - * The selector is handled automatically, so only include component-specific data. - * - * @returns Object containing serializable component data - * - * @example - * ```typescript - * serialize() { - * return { - * title: this.title, - * value: this.value, - * settings: this.settings - * }; - * } - * ``` - */ - serialize() { return; } - /** - * Override this method to handle widget restoration from saved data. - * - * Use this for complex initialization that goes beyond simple @Input() mapping. - * The default implementation automatically assigns input data to component properties. - * - * @param w The saved widget data including input properties - * - * @example - * ```typescript - * deserialize(w: NgGridStackWidget) { - * super.deserialize(w); // Call parent for basic setup - * - * // Custom initialization logic - * if (w.input?.complexData) { - * this.processComplexData(w.input.complexData); - * } - * } - * ``` - */ - deserialize(w) { - // save full description for meta data - this.widgetItem = w; - if (!w) - return; - if (w.input) - Object.assign(this, w.input); - } -} -BaseWidget.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseWidget, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); -BaseWidget.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseWidget }); -i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseWidget, decorators: [{ - type: Injectable - }] }); - -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -/** - * Angular component wrapper for individual GridStack items. - * - * This component represents a single grid item and handles: - * - Dynamic content creation and management - * - Integration with parent GridStack component - * - Component lifecycle and cleanup - * - Widget options and configuration - * - * Use in combination with GridstackComponent for the parent grid. - * - * @example - * ```html - * - * - * - * - * - * ``` - */ -class GridstackItemComponent { - constructor(elementRef) { - this.elementRef = elementRef; - this.el._gridItemComp = this; - } - /** - * Grid item configuration options. - * Defines position, size, and behavior of this grid item. - * - * @example - * ```typescript - * itemOptions: GridStackNode = { - * x: 0, y: 0, w: 2, h: 1, - * noResize: true, - * content: 'Item content' - * }; - * ``` - */ - set options(val) { - var _a; - const grid = (_a = this.el.gridstackNode) === null || _a === void 0 ? void 0 : _a.grid; - if (grid) { - // already built, do an update... - grid.update(this.el, val); - } - else { - // store our custom element in options so we can update it and not re-create a generic div! - this._options = Object.assign(Object.assign({}, val), { el: this.el }); - } - } - /** return the latest grid options (from GS once built, otherwise initial values) */ - get options() { - return this.el.gridstackNode || this._options || { el: this.el }; - } - /** return the native element that contains grid specific fields as well */ - get el() { return this.elementRef.nativeElement; } - /** clears the initial options now that we've built */ - clearOptions() { - delete this._options; - } - ngOnDestroy() { - this.clearOptions(); - delete this.childWidget; - delete this.el._gridItemComp; - delete this.container; - delete this.ref; - } -} -GridstackItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackItemComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); -GridstackItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: GridstackItemComponent, isStandalone: true, selector: "gridstack-item", inputs: { options: "options" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: ` -
- - - - - - {{options.content}} -
`, isInline: true, styles: [":host{display:block}\n"] }); -i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackItemComponent, decorators: [{ - type: Component, - args: [{ selector: 'gridstack-item', template: ` -
- - - - - - {{options.content}} -
`, standalone: true, styles: [":host{display:block}\n"] }] - }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { container: [{ - type: ViewChild, - args: ['container', { read: ViewContainerRef, static: true }] - }], options: [{ - type: Input - }] } }); - -/** - * gridstack.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -/** - * Angular component wrapper for GridStack. - * - * This component provides Angular integration for GridStack grids, handling: - * - Grid initialization and lifecycle - * - Dynamic component creation and management - * - Event binding and emission - * - Integration with Angular change detection - * - * Use in combination with GridstackItemComponent for individual grid items. - * - * @example - * ```html - * - *
Drag widgets here
- *
- * ``` - */ -class GridstackComponent { - constructor(elementRef) { - this.elementRef = elementRef; - /** - * GridStack event emitters for Angular integration. - * - * These provide Angular-style event handling for GridStack events. - * Alternatively, use `this.grid.on('event1 event2', callback)` for multiple events. - * - * Note: 'CB' suffix prevents conflicts with native DOM events. - * - * @example - * ```html - * - * - * ``` - */ - /** Emitted when widgets are added to the grid */ - this.addedCB = new EventEmitter(); - /** Emitted when grid layout changes */ - this.changeCB = new EventEmitter(); - /** Emitted when grid is disabled */ - this.disableCB = new EventEmitter(); - /** Emitted during widget drag operations */ - this.dragCB = new EventEmitter(); - /** Emitted when widget drag starts */ - this.dragStartCB = new EventEmitter(); - /** Emitted when widget drag stops */ - this.dragStopCB = new EventEmitter(); - /** Emitted when widget is dropped */ - this.droppedCB = new EventEmitter(); - /** Emitted when grid is enabled */ - this.enableCB = new EventEmitter(); - /** Emitted when widgets are removed from the grid */ - this.removedCB = new EventEmitter(); - /** Emitted during widget resize operations */ - this.resizeCB = new EventEmitter(); - /** Emitted when widget resize starts */ - this.resizeStartCB = new EventEmitter(); - /** Emitted when widget resize stops */ - this.resizeStopCB = new EventEmitter(); - // set globally our method to create the right widget type - if (!GridStack.addRemoveCB) { - GridStack.addRemoveCB = gsCreateNgComponents; - } - if (!GridStack.saveCB) { - GridStack.saveCB = gsSaveAdditionalNgInfo; - } - if (!GridStack.updateCB) { - GridStack.updateCB = gsUpdateNgComponents; - } - this.el._gridComp = this; - } - /** - * Grid configuration options. - * Can be set before grid initialization or updated after grid is created. - * - * @example - * ```typescript - * gridOptions: GridStackOptions = { - * column: 12, - * cellHeight: 'auto', - * animate: true - * }; - * ``` - */ - set options(o) { - if (this._grid) { - this._grid.updateOptions(o); - } - else { - this._options = o; - } - } - /** Get the current running grid options */ - get options() { var _a; return ((_a = this._grid) === null || _a === void 0 ? void 0 : _a.opts) || this._options || {}; } - /** - * Get the native DOM element that contains grid-specific fields. - * This element has GridStack properties attached to it. - */ - get el() { return this.elementRef.nativeElement; } - /** - * Get the underlying GridStack instance. - * Use this to access GridStack API methods directly. - * - * @example - * ```typescript - * this.gridComponent.grid.addWidget({x: 0, y: 0, w: 2, h: 1}); - * ``` - */ - get grid() { return this._grid; } - /** - * Register a list of Angular components for dynamic creation. - * - * @param typeList Array of component types to register - * - * @example - * ```typescript - * GridstackComponent.addComponentToSelectorType([ - * MyWidgetComponent, - * AnotherWidgetComponent - * ]); - * ``` - */ - static addComponentToSelectorType(typeList) { - typeList.forEach(type => GridstackComponent.selectorToType[GridstackComponent.getSelector(type)] = type); - } - /** - * Extract the selector string from an Angular component type. - * - * @param type The component type to get selector from - * @returns The component's selector string - */ - static getSelector(type) { - return reflectComponentType(type).selector; - } - ngOnInit() { - var _a, _b; - // init ourself before any template children are created since we track them below anyway - no need to double create+update widgets - this.loaded = !!((_b = (_a = this.options) === null || _a === void 0 ? void 0 : _a.children) === null || _b === void 0 ? void 0 : _b.length); - this._grid = GridStack.init(this._options, this.el); - delete this._options; // GS has it now - this.checkEmpty(); - } - /** wait until after all DOM is ready to init gridstack children (after angular ngFor and sub-components run first) */ - ngAfterContentInit() { - var _a; - // track whenever the children list changes and update the layout... - this._sub = (_a = this.gridstackItems) === null || _a === void 0 ? void 0 : _a.changes.subscribe(() => this.updateAll()); - // ...and do this once at least unless we loaded children already - if (!this.loaded) - this.updateAll(); - this.hookEvents(this.grid); - } - ngOnDestroy() { - var _a, _b; - this.unhookEvents(this._grid); - (_a = this._sub) === null || _a === void 0 ? void 0 : _a.unsubscribe(); - (_b = this._grid) === null || _b === void 0 ? void 0 : _b.destroy(); - delete this._grid; - delete this.el._gridComp; - delete this.container; - delete this.ref; - } - /** - * called when the TEMPLATE (not recommended) list of items changes - get a list of nodes and - * update the layout accordingly (which will take care of adding/removing items changed by Angular) - */ - updateAll() { - var _a; - if (!this.grid) - return; - const layout = []; - (_a = this.gridstackItems) === null || _a === void 0 ? void 0 : _a.forEach(item => { - layout.push(item.options); - item.clearOptions(); - }); - this.grid.load(layout); // efficient that does diffs only - } - /** check if the grid is empty, if so show alternative content */ - checkEmpty() { - if (!this.grid) - return; - this.isEmpty = !this.grid.engine.nodes.length; - } - /** get all known events as easy to use Outputs for convenience */ - hookEvents(grid) { - if (!grid) - return; - // nested grids don't have events in v12.1+ so skip - if (grid.parentGridNode) - return; - grid - .on('added', (event, nodes) => { - var _a; - const gridComp = ((_a = nodes[0].grid) === null || _a === void 0 ? void 0 : _a.el._gridComp) || this; - gridComp.checkEmpty(); - this.addedCB.emit({ event, nodes }); - }) - .on('change', (event, nodes) => this.changeCB.emit({ event, nodes })) - .on('disable', (event) => this.disableCB.emit({ event })) - .on('drag', (event, el) => this.dragCB.emit({ event, el })) - .on('dragstart', (event, el) => this.dragStartCB.emit({ event, el })) - .on('dragstop', (event, el) => this.dragStopCB.emit({ event, el })) - .on('dropped', (event, previousNode, newNode) => this.droppedCB.emit({ event, previousNode, newNode })) - .on('enable', (event) => this.enableCB.emit({ event })) - .on('removed', (event, nodes) => { - var _a; - const gridComp = ((_a = nodes[0].grid) === null || _a === void 0 ? void 0 : _a.el._gridComp) || this; - gridComp.checkEmpty(); - this.removedCB.emit({ event, nodes }); - }) - .on('resize', (event, el) => this.resizeCB.emit({ event, el })) - .on('resizestart', (event, el) => this.resizeStartCB.emit({ event, el })) - .on('resizestop', (event, el) => this.resizeStopCB.emit({ event, el })); - } - unhookEvents(grid) { - if (!grid) - return; - // nested grids don't have events in v12.1+ so skip - if (grid.parentGridNode) - return; - grid.off('added change disable drag dragstart dragstop dropped enable removed resize resizestart resizestop'); - } -} -/** - * Mapping of component selectors to their types for dynamic creation. - * - * This enables dynamic component instantiation from string selectors. - * Angular doesn't provide public access to this mapping, so we maintain our own. - * - * @example - * ```typescript - * GridstackComponent.addComponentToSelectorType([MyWidgetComponent]); - * ``` - */ -GridstackComponent.selectorToType = {}; -GridstackComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); -GridstackComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: GridstackComponent, isStandalone: true, selector: "gridstack", inputs: { options: "options", isEmpty: "isEmpty" }, outputs: { addedCB: "addedCB", changeCB: "changeCB", disableCB: "disableCB", dragCB: "dragCB", dragStartCB: "dragStartCB", dragStopCB: "dragStopCB", droppedCB: "droppedCB", enableCB: "enableCB", removedCB: "removedCB", resizeCB: "resizeCB", resizeStartCB: "resizeStartCB", resizeStopCB: "resizeStopCB" }, queries: [{ propertyName: "gridstackItems", predicate: GridstackItemComponent }], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: ` - - - - - - - `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); -i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackComponent, decorators: [{ - type: Component, - args: [{ selector: 'gridstack', template: ` - - - - - - - `, standalone: true, imports: [NgIf], styles: [":host{display:block}\n"] }] - }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { gridstackItems: [{ - type: ContentChildren, - args: [GridstackItemComponent] - }], container: [{ - type: ViewChild, - args: ['container', { read: ViewContainerRef, static: true }] - }], options: [{ - type: Input - }], isEmpty: [{ - type: Input - }], addedCB: [{ - type: Output - }], changeCB: [{ - type: Output - }], disableCB: [{ - type: Output - }], dragCB: [{ - type: Output - }], dragStartCB: [{ - type: Output - }], dragStopCB: [{ - type: Output - }], droppedCB: [{ - type: Output - }], enableCB: [{ - type: Output - }], removedCB: [{ - type: Output - }], resizeCB: [{ - type: Output - }], resizeStartCB: [{ - type: Output - }], resizeStopCB: [{ - type: Output - }] } }); -/** - * can be used when a new item needs to be created, which we do as a Angular component, or deleted (skip) - **/ -function gsCreateNgComponents(host, n, add, isGrid) { - var _a, _b, _c, _d, _e, _f, _g; - if (add) { - // - // create the component dynamically - see https://angular.io/docs/ts/latest/cookbook/dynamic-component-loader.html - // - if (!host) - return; - if (isGrid) { - // TODO: figure out how to create ng component inside regular Div. need to access app injectors... - // if (!container) { - // const hostElement: Element = host; - // const environmentInjector: EnvironmentInjector; - // grid = createComponent(GridstackComponent, {environmentInjector, hostElement})?.instance; - // } - const gridItemComp = (_a = host.parentElement) === null || _a === void 0 ? void 0 : _a._gridItemComp; - if (!gridItemComp) - return; - // check if gridItem has a child component with 'container' exposed to create under.. - const container = ((_b = gridItemComp.childWidget) === null || _b === void 0 ? void 0 : _b.container) || gridItemComp.container; - const gridRef = container === null || container === void 0 ? void 0 : container.createComponent(GridstackComponent); - const grid = gridRef === null || gridRef === void 0 ? void 0 : gridRef.instance; - if (!grid) - return; - grid.ref = gridRef; - grid.options = n; - return grid.el; - } - else { - const gridComp = host._gridComp; - const gridItemRef = (_c = gridComp === null || gridComp === void 0 ? void 0 : gridComp.container) === null || _c === void 0 ? void 0 : _c.createComponent(GridstackItemComponent); - const gridItem = gridItemRef === null || gridItemRef === void 0 ? void 0 : gridItemRef.instance; - if (!gridItem) - return; - gridItem.ref = gridItemRef; - // define what type of component to create as child, OR you can do it GridstackItemComponent template, but this is more generic - const selector = n.selector; - const type = selector ? GridstackComponent.selectorToType[selector] : undefined; - if (type) { - // shared code to create our selector component - const createComp = () => { - var _a, _b; - const childWidget = (_b = (_a = gridItem.container) === null || _a === void 0 ? void 0 : _a.createComponent(type)) === null || _b === void 0 ? void 0 : _b.instance; - // if proper BaseWidget subclass, save it and load additional data - if (childWidget && typeof childWidget.serialize === 'function' && typeof childWidget.deserialize === 'function') { - gridItem.childWidget = childWidget; - childWidget.deserialize(n); - } - }; - const lazyLoad = n.lazyLoad || ((_e = (_d = n.grid) === null || _d === void 0 ? void 0 : _d.opts) === null || _e === void 0 ? void 0 : _e.lazyLoad) && n.lazyLoad !== false; - if (lazyLoad) { - if (!n.visibleObservable) { - n.visibleObservable = new IntersectionObserver(([entry]) => { - var _a; - if (entry.isIntersecting) { - (_a = n.visibleObservable) === null || _a === void 0 ? void 0 : _a.disconnect(); - delete n.visibleObservable; - createComp(); - } - }); - window.setTimeout(() => { var _a; return (_a = n.visibleObservable) === null || _a === void 0 ? void 0 : _a.observe(gridItem.el); }); // wait until callee sets position attributes - } - } - else - createComp(); - } - return gridItem.el; - } - } - else { - // - // REMOVE - have to call ComponentRef:destroy() for dynamic objects to correctly remove themselves - // Note: this will destroy all children dynamic components as well: gridItem -> childWidget - // - if (isGrid) { - const grid = (_f = n.el) === null || _f === void 0 ? void 0 : _f._gridComp; - if (grid === null || grid === void 0 ? void 0 : grid.ref) - grid.ref.destroy(); - else - grid === null || grid === void 0 ? void 0 : grid.ngOnDestroy(); - } - else { - const gridItem = (_g = n.el) === null || _g === void 0 ? void 0 : _g._gridItemComp; - if (gridItem === null || gridItem === void 0 ? void 0 : gridItem.ref) - gridItem.ref.destroy(); - else - gridItem === null || gridItem === void 0 ? void 0 : gridItem.ngOnDestroy(); - } - } - return; -} -/** - * called for each item in the grid - check if additional information needs to be saved. - * Note: since this is options minus gridstack protected members using Utils.removeInternalForSave(), - * this typically doesn't need to do anything. However your custom Component @Input() are now supported - * using BaseWidget.serialize() - */ -function gsSaveAdditionalNgInfo(n, w) { - var _a, _b, _c; - const gridItem = (_a = n.el) === null || _a === void 0 ? void 0 : _a._gridItemComp; - if (gridItem) { - const input = (_b = gridItem.childWidget) === null || _b === void 0 ? void 0 : _b.serialize(); - if (input) { - w.input = input; - } - return; - } - // else check if Grid - const grid = (_c = n.el) === null || _c === void 0 ? void 0 : _c._gridComp; - if (grid) { - //.... save any custom data - } -} -/** - * track when widgeta re updated (rather than created) to make sure we de-serialize them as well - */ -function gsUpdateNgComponents(n) { - var _a; - const w = n; - const gridItem = (_a = n.el) === null || _a === void 0 ? void 0 : _a._gridItemComp; - if ((gridItem === null || gridItem === void 0 ? void 0 : gridItem.childWidget) && w.input) - gridItem.childWidget.deserialize(w); -} - -/** - * gridstack.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -/** - * @deprecated Use GridstackComponent and GridstackItemComponent as standalone components instead. - * - * This NgModule is provided for backward compatibility but is no longer the recommended approach. - * Import components directly in your standalone components or use the new Angular module structure. - * - * @example - * ```typescript - * // Preferred approach - standalone components - * @Component({ - * selector: 'my-app', - * imports: [GridstackComponent, GridstackItemComponent], - * template: '' - * }) - * export class AppComponent {} - * - * // Legacy approach (deprecated) - * @NgModule({ - * imports: [GridstackModule] - * }) - * export class AppModule {} - * ``` - */ -class GridstackModule { -} -GridstackModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); -GridstackModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, imports: [GridstackItemComponent, - GridstackComponent], exports: [GridstackItemComponent, - GridstackComponent] }); -GridstackModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, imports: [GridstackItemComponent, - GridstackComponent] }); -i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, decorators: [{ - type: NgModule, - args: [{ - imports: [ - GridstackItemComponent, - GridstackComponent, - ], - exports: [ - GridstackItemComponent, - GridstackComponent, - ], - }] - }] }); - -/* - * Public API Surface of gridstack-angular - */ - -/** - * Generated bundle index. Do not edit. - */ - -export { BaseWidget, GridstackComponent, GridstackItemComponent, GridstackModule, gsCreateNgComponents, gsSaveAdditionalNgInfo, gsUpdateNgComponents }; -//# sourceMappingURL=gridstack-angular.mjs.map diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/fesm2015/gridstack-angular.mjs.map b/web/skins/classic/assets/gridstack-12.3.3/dist/angular/fesm2015/gridstack-angular.mjs.map deleted file mode 100644 index 308a7890f..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/fesm2015/gridstack-angular.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"gridstack-angular.mjs","sources":["../../../angular/projects/lib/src/lib/base-widget.ts","../../../angular/projects/lib/src/lib/gridstack-item.component.ts","../../../angular/projects/lib/src/lib/gridstack.component.ts","../../../angular/projects/lib/src/lib/gridstack.module.ts","../../../angular/projects/lib/src/index.ts","../../../angular/projects/lib/src/gridstack-angular.ts"],"sourcesContent":["/**\r\n * gridstack-item.component.ts 12.3.3\r\n * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license\r\n */\r\n\r\n/**\r\n * Abstract base class that all custom widgets should extend.\r\n * \r\n * This class provides the interface needed for GridstackItemComponent to:\r\n * - Serialize/deserialize widget data\r\n * - Save/restore widget state\r\n * - Integrate with Angular lifecycle\r\n * \r\n * Extend this class when creating custom widgets for dynamic grids.\r\n * \r\n * @example\r\n * ```typescript\r\n * @Component({\r\n * selector: 'my-custom-widget',\r\n * template: '
{{data}}
'\r\n * })\r\n * export class MyCustomWidget extends BaseWidget {\r\n * @Input() data: string = '';\r\n * \r\n * serialize() {\r\n * return { data: this.data };\r\n * }\r\n * }\r\n * ```\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { NgCompInputs, NgGridStackWidget } from './types';\r\n\r\n/**\r\n * Base widget class for GridStack Angular integration.\r\n */\r\n@Injectable()\r\nexport abstract class BaseWidget {\r\n\r\n /**\r\n * Complete widget definition including position, size, and Angular-specific data.\r\n * Populated automatically when the widget is loaded or saved.\r\n */\r\n public widgetItem?: NgGridStackWidget;\r\n\r\n /**\r\n * Override this method to return serializable data for this widget.\r\n * \r\n * Return an object with properties that map to your component's @Input() fields.\r\n * The selector is handled automatically, so only include component-specific data.\r\n * \r\n * @returns Object containing serializable component data\r\n * \r\n * @example\r\n * ```typescript\r\n * serialize() {\r\n * return {\r\n * title: this.title,\r\n * value: this.value,\r\n * settings: this.settings\r\n * };\r\n * }\r\n * ```\r\n */\r\n public serialize(): NgCompInputs | undefined { return; }\r\n\r\n /**\r\n * Override this method to handle widget restoration from saved data.\r\n * \r\n * Use this for complex initialization that goes beyond simple @Input() mapping.\r\n * The default implementation automatically assigns input data to component properties.\r\n * \r\n * @param w The saved widget data including input properties\r\n * \r\n * @example\r\n * ```typescript\r\n * deserialize(w: NgGridStackWidget) {\r\n * super.deserialize(w); // Call parent for basic setup\r\n * \r\n * // Custom initialization logic\r\n * if (w.input?.complexData) {\r\n * this.processComplexData(w.input.complexData);\r\n * }\r\n * }\r\n * ```\r\n */\r\n public deserialize(w: NgGridStackWidget) {\r\n // save full description for meta data\r\n this.widgetItem = w;\r\n if (!w) return;\r\n\r\n if (w.input) Object.assign(this, w.input);\r\n }\r\n }\r\n","/**\n * gridstack-item.component.ts 12.3.3\n * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license\n */\n\nimport { Component, ElementRef, Input, ViewChild, ViewContainerRef, OnDestroy, ComponentRef } from '@angular/core';\nimport { GridItemHTMLElement, GridStackNode } from 'gridstack';\nimport { BaseWidget } from './base-widget';\n\n/**\n * Extended HTMLElement interface for grid items.\n * Stores a back-reference to the Angular component for integration.\n */\nexport interface GridItemCompHTMLElement extends GridItemHTMLElement {\n /** Back-reference to the Angular GridStackItem component */\n _gridItemComp?: GridstackItemComponent;\n}\n\n/**\n * Angular component wrapper for individual GridStack items.\n * \n * This component represents a single grid item and handles:\n * - Dynamic content creation and management\n * - Integration with parent GridStack component\n * - Component lifecycle and cleanup\n * - Widget options and configuration\n * \n * Use in combination with GridstackComponent for the parent grid.\n * \n * @example\n * ```html\n * \n * \n * \n * \n * \n * ```\n */\n@Component({\n selector: 'gridstack-item',\n template: `\n
\n \n \n \n \n \n {{options.content}}\n
`,\n styles: [`\n :host { display: block; }\n `],\n standalone: true,\n // changeDetection: ChangeDetectionStrategy.OnPush, // IFF you want to optimize and control when ChangeDetection needs to happen...\n})\nexport class GridstackItemComponent implements OnDestroy {\n\n /**\n * Container for dynamic component creation within this grid item.\n * Used to append child components programmatically.\n */\n @ViewChild('container', { read: ViewContainerRef, static: true}) public container?: ViewContainerRef;\n\n /**\n * Component reference for dynamic component removal.\n * Used internally when this component is created dynamically.\n */\n public ref: ComponentRef | undefined;\n\n /**\n * Reference to child widget component for serialization.\n * Used to save/restore additional data along with grid position.\n */\n public childWidget: BaseWidget | undefined;\n\n /**\n * Grid item configuration options.\n * Defines position, size, and behavior of this grid item.\n * \n * @example\n * ```typescript\n * itemOptions: GridStackNode = {\n * x: 0, y: 0, w: 2, h: 1,\n * noResize: true,\n * content: 'Item content'\n * };\n * ```\n */\n @Input() public set options(val: GridStackNode) {\n const grid = this.el.gridstackNode?.grid;\n if (grid) {\n // already built, do an update...\n grid.update(this.el, val);\n } else {\n // store our custom element in options so we can update it and not re-create a generic div!\n this._options = {...val, el: this.el};\n }\n }\n /** return the latest grid options (from GS once built, otherwise initial values) */\n public get options(): GridStackNode {\n return this.el.gridstackNode || this._options || {el: this.el};\n }\n\n protected _options?: GridStackNode;\n\n /** return the native element that contains grid specific fields as well */\n public get el(): GridItemCompHTMLElement { return this.elementRef.nativeElement; }\n\n /** clears the initial options now that we've built */\n public clearOptions() {\n delete this._options;\n }\n\n constructor(protected readonly elementRef: ElementRef) {\n this.el._gridItemComp = this;\n }\n\n public ngOnDestroy(): void {\n this.clearOptions();\n delete this.childWidget\n delete this.el._gridItemComp;\n delete this.container;\n delete this.ref;\n }\n}\n","/**\n * gridstack.component.ts 12.3.3\n * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license\n */\n\nimport {\n AfterContentInit, Component, ContentChildren, ElementRef, EventEmitter, Input,\n OnDestroy, OnInit, Output, QueryList, Type, ViewChild, ViewContainerRef, reflectComponentType, ComponentRef\n} from '@angular/core';\nimport { NgIf } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { GridHTMLElement, GridItemHTMLElement, GridStack, GridStackNode, GridStackOptions, GridStackWidget } from 'gridstack';\n\nimport { NgGridStackNode, NgGridStackWidget } from './types';\nimport { BaseWidget } from './base-widget';\nimport { GridItemCompHTMLElement, GridstackItemComponent } from './gridstack-item.component';\n\n/**\n * Event handler callback signatures for different GridStack events.\n * These types define the structure of data passed to Angular event emitters.\n */\n\n/** Callback for general events (enable, disable, etc.) */\nexport type eventCB = {event: Event};\n\n/** Callback for element-specific events (resize, drag, etc.) */\nexport type elementCB = {event: Event, el: GridItemHTMLElement};\n\n/** Callback for events affecting multiple nodes (change, etc.) */\nexport type nodesCB = {event: Event, nodes: GridStackNode[]};\n\n/** Callback for drop events with before/after node state */\nexport type droppedCB = {event: Event, previousNode: GridStackNode, newNode: GridStackNode};\n\n/**\n * Extended HTMLElement interface for the grid container.\n * Stores a back-reference to the Angular component for integration purposes.\n */\nexport interface GridCompHTMLElement extends GridHTMLElement {\n /** Back-reference to the Angular GridStack component */\n _gridComp?: GridstackComponent;\n}\n\n/**\n * Mapping of selector strings to Angular component types.\n * Used for dynamic component creation based on widget selectors.\n */\nexport type SelectorToType = {[key: string]: Type};\n\n/**\n * Angular component wrapper for GridStack.\n * \n * This component provides Angular integration for GridStack grids, handling:\n * - Grid initialization and lifecycle\n * - Dynamic component creation and management\n * - Event binding and emission\n * - Integration with Angular change detection\n * \n * Use in combination with GridstackItemComponent for individual grid items.\n * \n * @example\n * ```html\n * \n *
Drag widgets here
\n *
\n * ```\n */\n@Component({\n selector: 'gridstack',\n template: `\n \n \n \n \n \n \n `,\n styles: [`\n :host { display: block; }\n `],\n standalone: true,\n imports: [NgIf]\n // changeDetection: ChangeDetectionStrategy.OnPush, // IFF you want to optimize and control when ChangeDetection needs to happen...\n})\nexport class GridstackComponent implements OnInit, AfterContentInit, OnDestroy {\n\n /**\n * List of template-based grid items (not recommended approach).\n * Used to sync between DOM and GridStack internals when items are defined in templates.\n * Prefer dynamic component creation instead.\n */\n @ContentChildren(GridstackItemComponent) public gridstackItems?: QueryList;\n /**\n * Container for dynamic component creation (recommended approach).\n * Used to append grid items programmatically at runtime.\n */\n @ViewChild('container', { read: ViewContainerRef, static: true}) public container?: ViewContainerRef;\n\n /**\n * Grid configuration options.\n * Can be set before grid initialization or updated after grid is created.\n * \n * @example\n * ```typescript\n * gridOptions: GridStackOptions = {\n * column: 12,\n * cellHeight: 'auto',\n * animate: true\n * };\n * ```\n */\n @Input() public set options(o: GridStackOptions) {\n if (this._grid) {\n this._grid.updateOptions(o);\n } else {\n this._options = o;\n }\n }\n /** Get the current running grid options */\n public get options(): GridStackOptions { return this._grid?.opts || this._options || {}; }\n\n /**\n * Controls whether empty content should be displayed.\n * Set to true to show ng-content with 'empty-content' selector when grid has no items.\n * \n * @example\n * ```html\n * \n *
Drag widgets here to get started
\n *
\n * ```\n */\n @Input() public isEmpty?: boolean;\n\n /**\n * GridStack event emitters for Angular integration.\n * \n * These provide Angular-style event handling for GridStack events.\n * Alternatively, use `this.grid.on('event1 event2', callback)` for multiple events.\n * \n * Note: 'CB' suffix prevents conflicts with native DOM events.\n * \n * @example\n * ```html\n * \n * \n * ```\n */\n \n /** Emitted when widgets are added to the grid */\n @Output() public addedCB = new EventEmitter();\n \n /** Emitted when grid layout changes */\n @Output() public changeCB = new EventEmitter();\n \n /** Emitted when grid is disabled */\n @Output() public disableCB = new EventEmitter();\n \n /** Emitted during widget drag operations */\n @Output() public dragCB = new EventEmitter();\n \n /** Emitted when widget drag starts */\n @Output() public dragStartCB = new EventEmitter();\n \n /** Emitted when widget drag stops */\n @Output() public dragStopCB = new EventEmitter();\n \n /** Emitted when widget is dropped */\n @Output() public droppedCB = new EventEmitter();\n \n /** Emitted when grid is enabled */\n @Output() public enableCB = new EventEmitter();\n \n /** Emitted when widgets are removed from the grid */\n @Output() public removedCB = new EventEmitter();\n \n /** Emitted during widget resize operations */\n @Output() public resizeCB = new EventEmitter();\n \n /** Emitted when widget resize starts */\n @Output() public resizeStartCB = new EventEmitter();\n \n /** Emitted when widget resize stops */\n @Output() public resizeStopCB = new EventEmitter();\n\n /**\n * Get the native DOM element that contains grid-specific fields.\n * This element has GridStack properties attached to it.\n */\n public get el(): GridCompHTMLElement { return this.elementRef.nativeElement; }\n\n /**\n * Get the underlying GridStack instance.\n * Use this to access GridStack API methods directly.\n * \n * @example\n * ```typescript\n * this.gridComponent.grid.addWidget({x: 0, y: 0, w: 2, h: 1});\n * ```\n */\n public get grid(): GridStack | undefined { return this._grid; }\n\n /**\n * Component reference for dynamic component removal.\n * Used internally when this component is created dynamically.\n */\n public ref: ComponentRef | undefined;\n\n /**\n * Mapping of component selectors to their types for dynamic creation.\n * \n * This enables dynamic component instantiation from string selectors.\n * Angular doesn't provide public access to this mapping, so we maintain our own.\n * \n * @example\n * ```typescript\n * GridstackComponent.addComponentToSelectorType([MyWidgetComponent]);\n * ```\n */\n public static selectorToType: SelectorToType = {};\n /**\n * Register a list of Angular components for dynamic creation.\n * \n * @param typeList Array of component types to register\n * \n * @example\n * ```typescript\n * GridstackComponent.addComponentToSelectorType([\n * MyWidgetComponent,\n * AnotherWidgetComponent\n * ]);\n * ```\n */\n public static addComponentToSelectorType(typeList: Array>) {\n typeList.forEach(type => GridstackComponent.selectorToType[ GridstackComponent.getSelector(type) ] = type);\n }\n /**\n * Extract the selector string from an Angular component type.\n * \n * @param type The component type to get selector from\n * @returns The component's selector string\n */\n public static getSelector(type: Type): string {\n return reflectComponentType(type)!.selector;\n }\n\n protected _options?: GridStackOptions;\n protected _grid?: GridStack;\n protected _sub: Subscription | undefined;\n protected loaded?: boolean;\n\n constructor(protected readonly elementRef: ElementRef) {\n // set globally our method to create the right widget type\n if (!GridStack.addRemoveCB) {\n GridStack.addRemoveCB = gsCreateNgComponents;\n }\n if (!GridStack.saveCB) {\n GridStack.saveCB = gsSaveAdditionalNgInfo;\n }\n if (!GridStack.updateCB) {\n GridStack.updateCB = gsUpdateNgComponents;\n }\n this.el._gridComp = this;\n }\n\n public ngOnInit(): void {\n // init ourself before any template children are created since we track them below anyway - no need to double create+update widgets\n this.loaded = !!this.options?.children?.length;\n this._grid = GridStack.init(this._options, this.el);\n delete this._options; // GS has it now\n\n this.checkEmpty();\n }\n\n /** wait until after all DOM is ready to init gridstack children (after angular ngFor and sub-components run first) */\n public ngAfterContentInit(): void {\n // track whenever the children list changes and update the layout...\n this._sub = this.gridstackItems?.changes.subscribe(() => this.updateAll());\n // ...and do this once at least unless we loaded children already\n if (!this.loaded) this.updateAll();\n this.hookEvents(this.grid);\n }\n\n public ngOnDestroy(): void {\n this.unhookEvents(this._grid);\n this._sub?.unsubscribe();\n this._grid?.destroy();\n delete this._grid;\n delete this.el._gridComp;\n delete this.container;\n delete this.ref;\n }\n\n /**\n * called when the TEMPLATE (not recommended) list of items changes - get a list of nodes and\n * update the layout accordingly (which will take care of adding/removing items changed by Angular)\n */\n public updateAll() {\n if (!this.grid) return;\n const layout: GridStackWidget[] = [];\n this.gridstackItems?.forEach(item => {\n layout.push(item.options);\n item.clearOptions();\n });\n this.grid.load(layout); // efficient that does diffs only\n }\n\n /** check if the grid is empty, if so show alternative content */\n public checkEmpty() {\n if (!this.grid) return;\n this.isEmpty = !this.grid.engine.nodes.length;\n }\n\n /** get all known events as easy to use Outputs for convenience */\n protected hookEvents(grid?: GridStack) {\n if (!grid) return;\n // nested grids don't have events in v12.1+ so skip\n if (grid.parentGridNode) return;\n grid\n .on('added', (event: Event, nodes: GridStackNode[]) => {\n const gridComp = (nodes[0].grid?.el as GridCompHTMLElement)._gridComp || this;\n gridComp.checkEmpty();\n this.addedCB.emit({event, nodes});\n })\n .on('change', (event: Event, nodes: GridStackNode[]) => this.changeCB.emit({event, nodes}))\n .on('disable', (event: Event) => this.disableCB.emit({event}))\n .on('drag', (event: Event, el: GridItemHTMLElement) => this.dragCB.emit({event, el}))\n .on('dragstart', (event: Event, el: GridItemHTMLElement) => this.dragStartCB.emit({event, el}))\n .on('dragstop', (event: Event, el: GridItemHTMLElement) => this.dragStopCB.emit({event, el}))\n .on('dropped', (event: Event, previousNode: GridStackNode, newNode: GridStackNode) => this.droppedCB.emit({event, previousNode, newNode}))\n .on('enable', (event: Event) => this.enableCB.emit({event}))\n .on('removed', (event: Event, nodes: GridStackNode[]) => {\n const gridComp = (nodes[0].grid?.el as GridCompHTMLElement)._gridComp || this;\n gridComp.checkEmpty();\n this.removedCB.emit({event, nodes});\n })\n .on('resize', (event: Event, el: GridItemHTMLElement) => this.resizeCB.emit({event, el}))\n .on('resizestart', (event: Event, el: GridItemHTMLElement) => this.resizeStartCB.emit({event, el}))\n .on('resizestop', (event: Event, el: GridItemHTMLElement) => this.resizeStopCB.emit({event, el}))\n }\n\n protected unhookEvents(grid?: GridStack) {\n if (!grid) return;\n // nested grids don't have events in v12.1+ so skip\n if (grid.parentGridNode) return;\n grid.off('added change disable drag dragstart dragstop dropped enable removed resize resizestart resizestop');\n }\n}\n\n/**\n * can be used when a new item needs to be created, which we do as a Angular component, or deleted (skip)\n **/\nexport function gsCreateNgComponents(host: GridCompHTMLElement | HTMLElement, n: NgGridStackNode, add: boolean, isGrid: boolean): HTMLElement | undefined {\n if (add) {\n //\n // create the component dynamically - see https://angular.io/docs/ts/latest/cookbook/dynamic-component-loader.html\n //\n if (!host) return;\n if (isGrid) {\n // TODO: figure out how to create ng component inside regular Div. need to access app injectors...\n // if (!container) {\n // const hostElement: Element = host;\n // const environmentInjector: EnvironmentInjector;\n // grid = createComponent(GridstackComponent, {environmentInjector, hostElement})?.instance;\n // }\n\n const gridItemComp = (host.parentElement as GridItemCompHTMLElement)?._gridItemComp;\n if (!gridItemComp) return;\n // check if gridItem has a child component with 'container' exposed to create under..\n const container = (gridItemComp.childWidget as any)?.container || gridItemComp.container;\n const gridRef = container?.createComponent(GridstackComponent);\n const grid = gridRef?.instance;\n if (!grid) return;\n grid.ref = gridRef;\n grid.options = n;\n return grid.el;\n } else {\n const gridComp = (host as GridCompHTMLElement)._gridComp;\n const gridItemRef = gridComp?.container?.createComponent(GridstackItemComponent);\n const gridItem = gridItemRef?.instance;\n if (!gridItem) return;\n gridItem.ref = gridItemRef\n\n // define what type of component to create as child, OR you can do it GridstackItemComponent template, but this is more generic\n const selector = n.selector;\n const type = selector ? GridstackComponent.selectorToType[selector] : undefined;\n if (type) {\n // shared code to create our selector component\n const createComp = () => {\n const childWidget = gridItem.container?.createComponent(type)?.instance as BaseWidget;\n // if proper BaseWidget subclass, save it and load additional data\n if (childWidget && typeof childWidget.serialize === 'function' && typeof childWidget.deserialize === 'function') {\n gridItem.childWidget = childWidget;\n childWidget.deserialize(n);\n }\n }\n\n const lazyLoad = n.lazyLoad || n.grid?.opts?.lazyLoad && n.lazyLoad !== false;\n if (lazyLoad) {\n if (!n.visibleObservable) {\n n.visibleObservable = new IntersectionObserver(([entry]) => { if (entry.isIntersecting) {\n n.visibleObservable?.disconnect();\n delete n.visibleObservable;\n createComp();\n }});\n window.setTimeout(() => n.visibleObservable?.observe(gridItem.el)); // wait until callee sets position attributes\n }\n } else createComp();\n }\n\n return gridItem.el;\n }\n } else {\n //\n // REMOVE - have to call ComponentRef:destroy() for dynamic objects to correctly remove themselves\n // Note: this will destroy all children dynamic components as well: gridItem -> childWidget\n //\n if (isGrid) {\n const grid = (n.el as GridCompHTMLElement)?._gridComp;\n if (grid?.ref) grid.ref.destroy();\n else grid?.ngOnDestroy();\n } else {\n const gridItem = (n.el as GridItemCompHTMLElement)?._gridItemComp;\n if (gridItem?.ref) gridItem.ref.destroy();\n else gridItem?.ngOnDestroy();\n }\n }\n return;\n}\n\n/**\n * called for each item in the grid - check if additional information needs to be saved.\n * Note: since this is options minus gridstack protected members using Utils.removeInternalForSave(),\n * this typically doesn't need to do anything. However your custom Component @Input() are now supported\n * using BaseWidget.serialize()\n */\nexport function gsSaveAdditionalNgInfo(n: NgGridStackNode, w: NgGridStackWidget) {\n const gridItem = (n.el as GridItemCompHTMLElement)?._gridItemComp;\n if (gridItem) {\n const input = gridItem.childWidget?.serialize();\n if (input) {\n w.input = input;\n }\n return;\n }\n // else check if Grid\n const grid = (n.el as GridCompHTMLElement)?._gridComp;\n if (grid) {\n //.... save any custom data\n }\n}\n\n/**\n * track when widgeta re updated (rather than created) to make sure we de-serialize them as well\n */\nexport function gsUpdateNgComponents(n: NgGridStackNode) {\n const w: NgGridStackWidget = n;\n const gridItem = (n.el as GridItemCompHTMLElement)?._gridItemComp;\n if (gridItem?.childWidget && w.input) gridItem.childWidget.deserialize(w);\n}","/**\r\n * gridstack.component.ts 12.3.3\r\n * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license\r\n */\r\n\r\nimport { NgModule } from \"@angular/core\";\r\n\r\nimport { GridstackItemComponent } from \"./gridstack-item.component\";\r\nimport { GridstackComponent } from \"./gridstack.component\";\r\n\r\n/**\r\n * @deprecated Use GridstackComponent and GridstackItemComponent as standalone components instead.\r\n * \r\n * This NgModule is provided for backward compatibility but is no longer the recommended approach.\r\n * Import components directly in your standalone components or use the new Angular module structure.\r\n * \r\n * @example\r\n * ```typescript\r\n * // Preferred approach - standalone components\r\n * @Component({\r\n * selector: 'my-app',\r\n * imports: [GridstackComponent, GridstackItemComponent],\r\n * template: ''\r\n * })\r\n * export class AppComponent {}\r\n * \r\n * // Legacy approach (deprecated)\r\n * @NgModule({\r\n * imports: [GridstackModule]\r\n * })\r\n * export class AppModule {}\r\n * ```\r\n */\r\n@NgModule({\r\n imports: [\r\n GridstackItemComponent,\r\n GridstackComponent,\r\n ],\r\n exports: [\r\n GridstackItemComponent,\r\n GridstackComponent,\r\n ],\r\n})\r\nexport class GridstackModule {}\r\n","/*\n * Public API Surface of gridstack-angular\n */\n\nexport * from './lib/types';\nexport * from './lib/base-widget';\nexport * from './lib/gridstack-item.component';\nexport * from './lib/gridstack.component';\nexport * from './lib/gridstack.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/fesm2020/gridstack-angular.mjs b/web/skins/classic/assets/gridstack-12.3.3/dist/angular/fesm2020/gridstack-angular.mjs deleted file mode 100644 index fc13dc804..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/fesm2020/gridstack-angular.mjs +++ /dev/null @@ -1,640 +0,0 @@ -import * as i0 from '@angular/core'; -import { Injectable, ViewContainerRef, Component, ViewChild, Input, EventEmitter, reflectComponentType, ContentChildren, Output, NgModule } from '@angular/core'; -import { NgIf } from '@angular/common'; -import { GridStack } from 'gridstack'; - -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2025 Alain Dumesny - see GridStack root license - */ - -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -/** - * Base widget class for GridStack Angular integration. - */ -class BaseWidget { - /** - * Override this method to return serializable data for this widget. - * - * Return an object with properties that map to your component's @Input() fields. - * The selector is handled automatically, so only include component-specific data. - * - * @returns Object containing serializable component data - * - * @example - * ```typescript - * serialize() { - * return { - * title: this.title, - * value: this.value, - * settings: this.settings - * }; - * } - * ``` - */ - serialize() { return; } - /** - * Override this method to handle widget restoration from saved data. - * - * Use this for complex initialization that goes beyond simple @Input() mapping. - * The default implementation automatically assigns input data to component properties. - * - * @param w The saved widget data including input properties - * - * @example - * ```typescript - * deserialize(w: NgGridStackWidget) { - * super.deserialize(w); // Call parent for basic setup - * - * // Custom initialization logic - * if (w.input?.complexData) { - * this.processComplexData(w.input.complexData); - * } - * } - * ``` - */ - deserialize(w) { - // save full description for meta data - this.widgetItem = w; - if (!w) - return; - if (w.input) - Object.assign(this, w.input); - } -} -BaseWidget.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseWidget, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); -BaseWidget.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseWidget }); -i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: BaseWidget, decorators: [{ - type: Injectable - }] }); - -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -/** - * Angular component wrapper for individual GridStack items. - * - * This component represents a single grid item and handles: - * - Dynamic content creation and management - * - Integration with parent GridStack component - * - Component lifecycle and cleanup - * - Widget options and configuration - * - * Use in combination with GridstackComponent for the parent grid. - * - * @example - * ```html - * - * - * - * - * - * ``` - */ -class GridstackItemComponent { - constructor(elementRef) { - this.elementRef = elementRef; - this.el._gridItemComp = this; - } - /** - * Grid item configuration options. - * Defines position, size, and behavior of this grid item. - * - * @example - * ```typescript - * itemOptions: GridStackNode = { - * x: 0, y: 0, w: 2, h: 1, - * noResize: true, - * content: 'Item content' - * }; - * ``` - */ - set options(val) { - const grid = this.el.gridstackNode?.grid; - if (grid) { - // already built, do an update... - grid.update(this.el, val); - } - else { - // store our custom element in options so we can update it and not re-create a generic div! - this._options = { ...val, el: this.el }; - } - } - /** return the latest grid options (from GS once built, otherwise initial values) */ - get options() { - return this.el.gridstackNode || this._options || { el: this.el }; - } - /** return the native element that contains grid specific fields as well */ - get el() { return this.elementRef.nativeElement; } - /** clears the initial options now that we've built */ - clearOptions() { - delete this._options; - } - ngOnDestroy() { - this.clearOptions(); - delete this.childWidget; - delete this.el._gridItemComp; - delete this.container; - delete this.ref; - } -} -GridstackItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackItemComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); -GridstackItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: GridstackItemComponent, isStandalone: true, selector: "gridstack-item", inputs: { options: "options" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: ` -
- - - - - - {{options.content}} -
`, isInline: true, styles: [":host{display:block}\n"] }); -i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackItemComponent, decorators: [{ - type: Component, - args: [{ selector: 'gridstack-item', template: ` -
- - - - - - {{options.content}} -
`, standalone: true, styles: [":host{display:block}\n"] }] - }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { container: [{ - type: ViewChild, - args: ['container', { read: ViewContainerRef, static: true }] - }], options: [{ - type: Input - }] } }); - -/** - * gridstack.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -/** - * Angular component wrapper for GridStack. - * - * This component provides Angular integration for GridStack grids, handling: - * - Grid initialization and lifecycle - * - Dynamic component creation and management - * - Event binding and emission - * - Integration with Angular change detection - * - * Use in combination with GridstackItemComponent for individual grid items. - * - * @example - * ```html - * - *
Drag widgets here
- *
- * ``` - */ -class GridstackComponent { - constructor(elementRef) { - this.elementRef = elementRef; - /** - * GridStack event emitters for Angular integration. - * - * These provide Angular-style event handling for GridStack events. - * Alternatively, use `this.grid.on('event1 event2', callback)` for multiple events. - * - * Note: 'CB' suffix prevents conflicts with native DOM events. - * - * @example - * ```html - * - * - * ``` - */ - /** Emitted when widgets are added to the grid */ - this.addedCB = new EventEmitter(); - /** Emitted when grid layout changes */ - this.changeCB = new EventEmitter(); - /** Emitted when grid is disabled */ - this.disableCB = new EventEmitter(); - /** Emitted during widget drag operations */ - this.dragCB = new EventEmitter(); - /** Emitted when widget drag starts */ - this.dragStartCB = new EventEmitter(); - /** Emitted when widget drag stops */ - this.dragStopCB = new EventEmitter(); - /** Emitted when widget is dropped */ - this.droppedCB = new EventEmitter(); - /** Emitted when grid is enabled */ - this.enableCB = new EventEmitter(); - /** Emitted when widgets are removed from the grid */ - this.removedCB = new EventEmitter(); - /** Emitted during widget resize operations */ - this.resizeCB = new EventEmitter(); - /** Emitted when widget resize starts */ - this.resizeStartCB = new EventEmitter(); - /** Emitted when widget resize stops */ - this.resizeStopCB = new EventEmitter(); - // set globally our method to create the right widget type - if (!GridStack.addRemoveCB) { - GridStack.addRemoveCB = gsCreateNgComponents; - } - if (!GridStack.saveCB) { - GridStack.saveCB = gsSaveAdditionalNgInfo; - } - if (!GridStack.updateCB) { - GridStack.updateCB = gsUpdateNgComponents; - } - this.el._gridComp = this; - } - /** - * Grid configuration options. - * Can be set before grid initialization or updated after grid is created. - * - * @example - * ```typescript - * gridOptions: GridStackOptions = { - * column: 12, - * cellHeight: 'auto', - * animate: true - * }; - * ``` - */ - set options(o) { - if (this._grid) { - this._grid.updateOptions(o); - } - else { - this._options = o; - } - } - /** Get the current running grid options */ - get options() { return this._grid?.opts || this._options || {}; } - /** - * Get the native DOM element that contains grid-specific fields. - * This element has GridStack properties attached to it. - */ - get el() { return this.elementRef.nativeElement; } - /** - * Get the underlying GridStack instance. - * Use this to access GridStack API methods directly. - * - * @example - * ```typescript - * this.gridComponent.grid.addWidget({x: 0, y: 0, w: 2, h: 1}); - * ``` - */ - get grid() { return this._grid; } - /** - * Register a list of Angular components for dynamic creation. - * - * @param typeList Array of component types to register - * - * @example - * ```typescript - * GridstackComponent.addComponentToSelectorType([ - * MyWidgetComponent, - * AnotherWidgetComponent - * ]); - * ``` - */ - static addComponentToSelectorType(typeList) { - typeList.forEach(type => GridstackComponent.selectorToType[GridstackComponent.getSelector(type)] = type); - } - /** - * Extract the selector string from an Angular component type. - * - * @param type The component type to get selector from - * @returns The component's selector string - */ - static getSelector(type) { - return reflectComponentType(type).selector; - } - ngOnInit() { - // init ourself before any template children are created since we track them below anyway - no need to double create+update widgets - this.loaded = !!this.options?.children?.length; - this._grid = GridStack.init(this._options, this.el); - delete this._options; // GS has it now - this.checkEmpty(); - } - /** wait until after all DOM is ready to init gridstack children (after angular ngFor and sub-components run first) */ - ngAfterContentInit() { - // track whenever the children list changes and update the layout... - this._sub = this.gridstackItems?.changes.subscribe(() => this.updateAll()); - // ...and do this once at least unless we loaded children already - if (!this.loaded) - this.updateAll(); - this.hookEvents(this.grid); - } - ngOnDestroy() { - this.unhookEvents(this._grid); - this._sub?.unsubscribe(); - this._grid?.destroy(); - delete this._grid; - delete this.el._gridComp; - delete this.container; - delete this.ref; - } - /** - * called when the TEMPLATE (not recommended) list of items changes - get a list of nodes and - * update the layout accordingly (which will take care of adding/removing items changed by Angular) - */ - updateAll() { - if (!this.grid) - return; - const layout = []; - this.gridstackItems?.forEach(item => { - layout.push(item.options); - item.clearOptions(); - }); - this.grid.load(layout); // efficient that does diffs only - } - /** check if the grid is empty, if so show alternative content */ - checkEmpty() { - if (!this.grid) - return; - this.isEmpty = !this.grid.engine.nodes.length; - } - /** get all known events as easy to use Outputs for convenience */ - hookEvents(grid) { - if (!grid) - return; - // nested grids don't have events in v12.1+ so skip - if (grid.parentGridNode) - return; - grid - .on('added', (event, nodes) => { - const gridComp = nodes[0].grid?.el._gridComp || this; - gridComp.checkEmpty(); - this.addedCB.emit({ event, nodes }); - }) - .on('change', (event, nodes) => this.changeCB.emit({ event, nodes })) - .on('disable', (event) => this.disableCB.emit({ event })) - .on('drag', (event, el) => this.dragCB.emit({ event, el })) - .on('dragstart', (event, el) => this.dragStartCB.emit({ event, el })) - .on('dragstop', (event, el) => this.dragStopCB.emit({ event, el })) - .on('dropped', (event, previousNode, newNode) => this.droppedCB.emit({ event, previousNode, newNode })) - .on('enable', (event) => this.enableCB.emit({ event })) - .on('removed', (event, nodes) => { - const gridComp = nodes[0].grid?.el._gridComp || this; - gridComp.checkEmpty(); - this.removedCB.emit({ event, nodes }); - }) - .on('resize', (event, el) => this.resizeCB.emit({ event, el })) - .on('resizestart', (event, el) => this.resizeStartCB.emit({ event, el })) - .on('resizestop', (event, el) => this.resizeStopCB.emit({ event, el })); - } - unhookEvents(grid) { - if (!grid) - return; - // nested grids don't have events in v12.1+ so skip - if (grid.parentGridNode) - return; - grid.off('added change disable drag dragstart dragstop dropped enable removed resize resizestart resizestop'); - } -} -/** - * Mapping of component selectors to their types for dynamic creation. - * - * This enables dynamic component instantiation from string selectors. - * Angular doesn't provide public access to this mapping, so we maintain our own. - * - * @example - * ```typescript - * GridstackComponent.addComponentToSelectorType([MyWidgetComponent]); - * ``` - */ -GridstackComponent.selectorToType = {}; -GridstackComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); -GridstackComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: GridstackComponent, isStandalone: true, selector: "gridstack", inputs: { options: "options", isEmpty: "isEmpty" }, outputs: { addedCB: "addedCB", changeCB: "changeCB", disableCB: "disableCB", dragCB: "dragCB", dragStartCB: "dragStartCB", dragStopCB: "dragStopCB", droppedCB: "droppedCB", enableCB: "enableCB", removedCB: "removedCB", resizeCB: "resizeCB", resizeStartCB: "resizeStartCB", resizeStopCB: "resizeStopCB" }, queries: [{ propertyName: "gridstackItems", predicate: GridstackItemComponent }], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: ` - - - - - - - `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); -i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackComponent, decorators: [{ - type: Component, - args: [{ selector: 'gridstack', template: ` - - - - - - - `, standalone: true, imports: [NgIf], styles: [":host{display:block}\n"] }] - }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { gridstackItems: [{ - type: ContentChildren, - args: [GridstackItemComponent] - }], container: [{ - type: ViewChild, - args: ['container', { read: ViewContainerRef, static: true }] - }], options: [{ - type: Input - }], isEmpty: [{ - type: Input - }], addedCB: [{ - type: Output - }], changeCB: [{ - type: Output - }], disableCB: [{ - type: Output - }], dragCB: [{ - type: Output - }], dragStartCB: [{ - type: Output - }], dragStopCB: [{ - type: Output - }], droppedCB: [{ - type: Output - }], enableCB: [{ - type: Output - }], removedCB: [{ - type: Output - }], resizeCB: [{ - type: Output - }], resizeStartCB: [{ - type: Output - }], resizeStopCB: [{ - type: Output - }] } }); -/** - * can be used when a new item needs to be created, which we do as a Angular component, or deleted (skip) - **/ -function gsCreateNgComponents(host, n, add, isGrid) { - if (add) { - // - // create the component dynamically - see https://angular.io/docs/ts/latest/cookbook/dynamic-component-loader.html - // - if (!host) - return; - if (isGrid) { - // TODO: figure out how to create ng component inside regular Div. need to access app injectors... - // if (!container) { - // const hostElement: Element = host; - // const environmentInjector: EnvironmentInjector; - // grid = createComponent(GridstackComponent, {environmentInjector, hostElement})?.instance; - // } - const gridItemComp = host.parentElement?._gridItemComp; - if (!gridItemComp) - return; - // check if gridItem has a child component with 'container' exposed to create under.. - const container = gridItemComp.childWidget?.container || gridItemComp.container; - const gridRef = container?.createComponent(GridstackComponent); - const grid = gridRef?.instance; - if (!grid) - return; - grid.ref = gridRef; - grid.options = n; - return grid.el; - } - else { - const gridComp = host._gridComp; - const gridItemRef = gridComp?.container?.createComponent(GridstackItemComponent); - const gridItem = gridItemRef?.instance; - if (!gridItem) - return; - gridItem.ref = gridItemRef; - // define what type of component to create as child, OR you can do it GridstackItemComponent template, but this is more generic - const selector = n.selector; - const type = selector ? GridstackComponent.selectorToType[selector] : undefined; - if (type) { - // shared code to create our selector component - const createComp = () => { - const childWidget = gridItem.container?.createComponent(type)?.instance; - // if proper BaseWidget subclass, save it and load additional data - if (childWidget && typeof childWidget.serialize === 'function' && typeof childWidget.deserialize === 'function') { - gridItem.childWidget = childWidget; - childWidget.deserialize(n); - } - }; - const lazyLoad = n.lazyLoad || n.grid?.opts?.lazyLoad && n.lazyLoad !== false; - if (lazyLoad) { - if (!n.visibleObservable) { - n.visibleObservable = new IntersectionObserver(([entry]) => { - if (entry.isIntersecting) { - n.visibleObservable?.disconnect(); - delete n.visibleObservable; - createComp(); - } - }); - window.setTimeout(() => n.visibleObservable?.observe(gridItem.el)); // wait until callee sets position attributes - } - } - else - createComp(); - } - return gridItem.el; - } - } - else { - // - // REMOVE - have to call ComponentRef:destroy() for dynamic objects to correctly remove themselves - // Note: this will destroy all children dynamic components as well: gridItem -> childWidget - // - if (isGrid) { - const grid = n.el?._gridComp; - if (grid?.ref) - grid.ref.destroy(); - else - grid?.ngOnDestroy(); - } - else { - const gridItem = n.el?._gridItemComp; - if (gridItem?.ref) - gridItem.ref.destroy(); - else - gridItem?.ngOnDestroy(); - } - } - return; -} -/** - * called for each item in the grid - check if additional information needs to be saved. - * Note: since this is options minus gridstack protected members using Utils.removeInternalForSave(), - * this typically doesn't need to do anything. However your custom Component @Input() are now supported - * using BaseWidget.serialize() - */ -function gsSaveAdditionalNgInfo(n, w) { - const gridItem = n.el?._gridItemComp; - if (gridItem) { - const input = gridItem.childWidget?.serialize(); - if (input) { - w.input = input; - } - return; - } - // else check if Grid - const grid = n.el?._gridComp; - if (grid) { - //.... save any custom data - } -} -/** - * track when widgeta re updated (rather than created) to make sure we de-serialize them as well - */ -function gsUpdateNgComponents(n) { - const w = n; - const gridItem = n.el?._gridItemComp; - if (gridItem?.childWidget && w.input) - gridItem.childWidget.deserialize(w); -} - -/** - * gridstack.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -/** - * @deprecated Use GridstackComponent and GridstackItemComponent as standalone components instead. - * - * This NgModule is provided for backward compatibility but is no longer the recommended approach. - * Import components directly in your standalone components or use the new Angular module structure. - * - * @example - * ```typescript - * // Preferred approach - standalone components - * @Component({ - * selector: 'my-app', - * imports: [GridstackComponent, GridstackItemComponent], - * template: '' - * }) - * export class AppComponent {} - * - * // Legacy approach (deprecated) - * @NgModule({ - * imports: [GridstackModule] - * }) - * export class AppModule {} - * ``` - */ -class GridstackModule { -} -GridstackModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); -GridstackModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, imports: [GridstackItemComponent, - GridstackComponent], exports: [GridstackItemComponent, - GridstackComponent] }); -GridstackModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, imports: [GridstackItemComponent, - GridstackComponent] }); -i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: GridstackModule, decorators: [{ - type: NgModule, - args: [{ - imports: [ - GridstackItemComponent, - GridstackComponent, - ], - exports: [ - GridstackItemComponent, - GridstackComponent, - ], - }] - }] }); - -/* - * Public API Surface of gridstack-angular - */ - -/** - * Generated bundle index. Do not edit. - */ - -export { BaseWidget, GridstackComponent, GridstackItemComponent, GridstackModule, gsCreateNgComponents, gsSaveAdditionalNgInfo, gsUpdateNgComponents }; -//# sourceMappingURL=gridstack-angular.mjs.map diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/fesm2020/gridstack-angular.mjs.map b/web/skins/classic/assets/gridstack-12.3.3/dist/angular/fesm2020/gridstack-angular.mjs.map deleted file mode 100644 index f854cb17d..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/fesm2020/gridstack-angular.mjs.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"gridstack-angular.mjs","sources":["../../../angular/projects/lib/src/lib/types.ts","../../../angular/projects/lib/src/lib/base-widget.ts","../../../angular/projects/lib/src/lib/gridstack-item.component.ts","../../../angular/projects/lib/src/lib/gridstack.component.ts","../../../angular/projects/lib/src/lib/gridstack.module.ts","../../../angular/projects/lib/src/index.ts","../../../angular/projects/lib/src/gridstack-angular.ts"],"sourcesContent":["/**\r\n * gridstack-item.component.ts 12.3.3\r\n * Copyright (c) 2025 Alain Dumesny - see GridStack root license\r\n */\r\n\r\nimport { GridStackNode, GridStackOptions, GridStackWidget } from \"gridstack\";\r\n\r\n/**\r\n * Extended GridStackWidget interface for Angular integration.\r\n * Adds Angular-specific properties for dynamic component creation.\r\n */\r\nexport interface NgGridStackWidget extends GridStackWidget {\r\n /** Angular component selector for dynamic creation (e.g., 'my-widget') */\r\n selector?: string;\r\n /** Serialized data for component @Input() properties */\r\n input?: NgCompInputs;\r\n /** Configuration for nested sub-grids */\r\n subGridOpts?: NgGridStackOptions;\r\n}\r\n\r\n/**\r\n * Extended GridStackNode interface for Angular integration.\r\n * Adds component selector for dynamic content creation.\r\n */\r\nexport interface NgGridStackNode extends GridStackNode {\r\n /** Angular component selector for this node's content */\r\n selector?: string;\r\n}\r\n\r\n/**\r\n * Extended GridStackOptions interface for Angular integration.\r\n * Supports Angular-specific widget definitions and nested grids.\r\n */\r\nexport interface NgGridStackOptions extends GridStackOptions {\r\n /** Array of Angular widget definitions for initial grid setup */\r\n children?: NgGridStackWidget[];\r\n /** Configuration for nested sub-grids (Angular-aware) */\r\n subGridOpts?: NgGridStackOptions;\r\n}\r\n\r\n/**\r\n * Type for component input data serialization.\r\n * Maps @Input() property names to their values for widget persistence.\r\n * \r\n * @example\r\n * ```typescript\r\n * const inputs: NgCompInputs = {\r\n * title: 'My Widget',\r\n * value: 42,\r\n * config: { enabled: true }\r\n * };\r\n * ```\r\n */\r\nexport type NgCompInputs = {[key: string]: any};\r\n","/**\r\n * gridstack-item.component.ts 12.3.3\r\n * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license\r\n */\r\n\r\n/**\r\n * Abstract base class that all custom widgets should extend.\r\n * \r\n * This class provides the interface needed for GridstackItemComponent to:\r\n * - Serialize/deserialize widget data\r\n * - Save/restore widget state\r\n * - Integrate with Angular lifecycle\r\n * \r\n * Extend this class when creating custom widgets for dynamic grids.\r\n * \r\n * @example\r\n * ```typescript\r\n * @Component({\r\n * selector: 'my-custom-widget',\r\n * template: '
{{data}}
'\r\n * })\r\n * export class MyCustomWidget extends BaseWidget {\r\n * @Input() data: string = '';\r\n * \r\n * serialize() {\r\n * return { data: this.data };\r\n * }\r\n * }\r\n * ```\r\n */\r\n\r\nimport { Injectable } from '@angular/core';\r\nimport { NgCompInputs, NgGridStackWidget } from './types';\r\n\r\n/**\r\n * Base widget class for GridStack Angular integration.\r\n */\r\n@Injectable()\r\nexport abstract class BaseWidget {\r\n\r\n /**\r\n * Complete widget definition including position, size, and Angular-specific data.\r\n * Populated automatically when the widget is loaded or saved.\r\n */\r\n public widgetItem?: NgGridStackWidget;\r\n\r\n /**\r\n * Override this method to return serializable data for this widget.\r\n * \r\n * Return an object with properties that map to your component's @Input() fields.\r\n * The selector is handled automatically, so only include component-specific data.\r\n * \r\n * @returns Object containing serializable component data\r\n * \r\n * @example\r\n * ```typescript\r\n * serialize() {\r\n * return {\r\n * title: this.title,\r\n * value: this.value,\r\n * settings: this.settings\r\n * };\r\n * }\r\n * ```\r\n */\r\n public serialize(): NgCompInputs | undefined { return; }\r\n\r\n /**\r\n * Override this method to handle widget restoration from saved data.\r\n * \r\n * Use this for complex initialization that goes beyond simple @Input() mapping.\r\n * The default implementation automatically assigns input data to component properties.\r\n * \r\n * @param w The saved widget data including input properties\r\n * \r\n * @example\r\n * ```typescript\r\n * deserialize(w: NgGridStackWidget) {\r\n * super.deserialize(w); // Call parent for basic setup\r\n * \r\n * // Custom initialization logic\r\n * if (w.input?.complexData) {\r\n * this.processComplexData(w.input.complexData);\r\n * }\r\n * }\r\n * ```\r\n */\r\n public deserialize(w: NgGridStackWidget) {\r\n // save full description for meta data\r\n this.widgetItem = w;\r\n if (!w) return;\r\n\r\n if (w.input) Object.assign(this, w.input);\r\n }\r\n }\r\n","/**\n * gridstack-item.component.ts 12.3.3\n * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license\n */\n\nimport { Component, ElementRef, Input, ViewChild, ViewContainerRef, OnDestroy, ComponentRef } from '@angular/core';\nimport { GridItemHTMLElement, GridStackNode } from 'gridstack';\nimport { BaseWidget } from './base-widget';\n\n/**\n * Extended HTMLElement interface for grid items.\n * Stores a back-reference to the Angular component for integration.\n */\nexport interface GridItemCompHTMLElement extends GridItemHTMLElement {\n /** Back-reference to the Angular GridStackItem component */\n _gridItemComp?: GridstackItemComponent;\n}\n\n/**\n * Angular component wrapper for individual GridStack items.\n * \n * This component represents a single grid item and handles:\n * - Dynamic content creation and management\n * - Integration with parent GridStack component\n * - Component lifecycle and cleanup\n * - Widget options and configuration\n * \n * Use in combination with GridstackComponent for the parent grid.\n * \n * @example\n * ```html\n * \n * \n * \n * \n * \n * ```\n */\n@Component({\n selector: 'gridstack-item',\n template: `\n
\n \n \n \n \n \n {{options.content}}\n
`,\n styles: [`\n :host { display: block; }\n `],\n standalone: true,\n // changeDetection: ChangeDetectionStrategy.OnPush, // IFF you want to optimize and control when ChangeDetection needs to happen...\n})\nexport class GridstackItemComponent implements OnDestroy {\n\n /**\n * Container for dynamic component creation within this grid item.\n * Used to append child components programmatically.\n */\n @ViewChild('container', { read: ViewContainerRef, static: true}) public container?: ViewContainerRef;\n\n /**\n * Component reference for dynamic component removal.\n * Used internally when this component is created dynamically.\n */\n public ref: ComponentRef | undefined;\n\n /**\n * Reference to child widget component for serialization.\n * Used to save/restore additional data along with grid position.\n */\n public childWidget: BaseWidget | undefined;\n\n /**\n * Grid item configuration options.\n * Defines position, size, and behavior of this grid item.\n * \n * @example\n * ```typescript\n * itemOptions: GridStackNode = {\n * x: 0, y: 0, w: 2, h: 1,\n * noResize: true,\n * content: 'Item content'\n * };\n * ```\n */\n @Input() public set options(val: GridStackNode) {\n const grid = this.el.gridstackNode?.grid;\n if (grid) {\n // already built, do an update...\n grid.update(this.el, val);\n } else {\n // store our custom element in options so we can update it and not re-create a generic div!\n this._options = {...val, el: this.el};\n }\n }\n /** return the latest grid options (from GS once built, otherwise initial values) */\n public get options(): GridStackNode {\n return this.el.gridstackNode || this._options || {el: this.el};\n }\n\n protected _options?: GridStackNode;\n\n /** return the native element that contains grid specific fields as well */\n public get el(): GridItemCompHTMLElement { return this.elementRef.nativeElement; }\n\n /** clears the initial options now that we've built */\n public clearOptions() {\n delete this._options;\n }\n\n constructor(protected readonly elementRef: ElementRef) {\n this.el._gridItemComp = this;\n }\n\n public ngOnDestroy(): void {\n this.clearOptions();\n delete this.childWidget\n delete this.el._gridItemComp;\n delete this.container;\n delete this.ref;\n }\n}\n","/**\n * gridstack.component.ts 12.3.3\n * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license\n */\n\nimport {\n AfterContentInit, Component, ContentChildren, ElementRef, EventEmitter, Input,\n OnDestroy, OnInit, Output, QueryList, Type, ViewChild, ViewContainerRef, reflectComponentType, ComponentRef\n} from '@angular/core';\nimport { NgIf } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { GridHTMLElement, GridItemHTMLElement, GridStack, GridStackNode, GridStackOptions, GridStackWidget } from 'gridstack';\n\nimport { NgGridStackNode, NgGridStackWidget } from './types';\nimport { BaseWidget } from './base-widget';\nimport { GridItemCompHTMLElement, GridstackItemComponent } from './gridstack-item.component';\n\n/**\n * Event handler callback signatures for different GridStack events.\n * These types define the structure of data passed to Angular event emitters.\n */\n\n/** Callback for general events (enable, disable, etc.) */\nexport type eventCB = {event: Event};\n\n/** Callback for element-specific events (resize, drag, etc.) */\nexport type elementCB = {event: Event, el: GridItemHTMLElement};\n\n/** Callback for events affecting multiple nodes (change, etc.) */\nexport type nodesCB = {event: Event, nodes: GridStackNode[]};\n\n/** Callback for drop events with before/after node state */\nexport type droppedCB = {event: Event, previousNode: GridStackNode, newNode: GridStackNode};\n\n/**\n * Extended HTMLElement interface for the grid container.\n * Stores a back-reference to the Angular component for integration purposes.\n */\nexport interface GridCompHTMLElement extends GridHTMLElement {\n /** Back-reference to the Angular GridStack component */\n _gridComp?: GridstackComponent;\n}\n\n/**\n * Mapping of selector strings to Angular component types.\n * Used for dynamic component creation based on widget selectors.\n */\nexport type SelectorToType = {[key: string]: Type};\n\n/**\n * Angular component wrapper for GridStack.\n * \n * This component provides Angular integration for GridStack grids, handling:\n * - Grid initialization and lifecycle\n * - Dynamic component creation and management\n * - Event binding and emission\n * - Integration with Angular change detection\n * \n * Use in combination with GridstackItemComponent for individual grid items.\n * \n * @example\n * ```html\n * \n *
Drag widgets here
\n *
\n * ```\n */\n@Component({\n selector: 'gridstack',\n template: `\n \n \n \n \n \n \n `,\n styles: [`\n :host { display: block; }\n `],\n standalone: true,\n imports: [NgIf]\n // changeDetection: ChangeDetectionStrategy.OnPush, // IFF you want to optimize and control when ChangeDetection needs to happen...\n})\nexport class GridstackComponent implements OnInit, AfterContentInit, OnDestroy {\n\n /**\n * List of template-based grid items (not recommended approach).\n * Used to sync between DOM and GridStack internals when items are defined in templates.\n * Prefer dynamic component creation instead.\n */\n @ContentChildren(GridstackItemComponent) public gridstackItems?: QueryList;\n /**\n * Container for dynamic component creation (recommended approach).\n * Used to append grid items programmatically at runtime.\n */\n @ViewChild('container', { read: ViewContainerRef, static: true}) public container?: ViewContainerRef;\n\n /**\n * Grid configuration options.\n * Can be set before grid initialization or updated after grid is created.\n * \n * @example\n * ```typescript\n * gridOptions: GridStackOptions = {\n * column: 12,\n * cellHeight: 'auto',\n * animate: true\n * };\n * ```\n */\n @Input() public set options(o: GridStackOptions) {\n if (this._grid) {\n this._grid.updateOptions(o);\n } else {\n this._options = o;\n }\n }\n /** Get the current running grid options */\n public get options(): GridStackOptions { return this._grid?.opts || this._options || {}; }\n\n /**\n * Controls whether empty content should be displayed.\n * Set to true to show ng-content with 'empty-content' selector when grid has no items.\n * \n * @example\n * ```html\n * \n *
Drag widgets here to get started
\n *
\n * ```\n */\n @Input() public isEmpty?: boolean;\n\n /**\n * GridStack event emitters for Angular integration.\n * \n * These provide Angular-style event handling for GridStack events.\n * Alternatively, use `this.grid.on('event1 event2', callback)` for multiple events.\n * \n * Note: 'CB' suffix prevents conflicts with native DOM events.\n * \n * @example\n * ```html\n * \n * \n * ```\n */\n \n /** Emitted when widgets are added to the grid */\n @Output() public addedCB = new EventEmitter();\n \n /** Emitted when grid layout changes */\n @Output() public changeCB = new EventEmitter();\n \n /** Emitted when grid is disabled */\n @Output() public disableCB = new EventEmitter();\n \n /** Emitted during widget drag operations */\n @Output() public dragCB = new EventEmitter();\n \n /** Emitted when widget drag starts */\n @Output() public dragStartCB = new EventEmitter();\n \n /** Emitted when widget drag stops */\n @Output() public dragStopCB = new EventEmitter();\n \n /** Emitted when widget is dropped */\n @Output() public droppedCB = new EventEmitter();\n \n /** Emitted when grid is enabled */\n @Output() public enableCB = new EventEmitter();\n \n /** Emitted when widgets are removed from the grid */\n @Output() public removedCB = new EventEmitter();\n \n /** Emitted during widget resize operations */\n @Output() public resizeCB = new EventEmitter();\n \n /** Emitted when widget resize starts */\n @Output() public resizeStartCB = new EventEmitter();\n \n /** Emitted when widget resize stops */\n @Output() public resizeStopCB = new EventEmitter();\n\n /**\n * Get the native DOM element that contains grid-specific fields.\n * This element has GridStack properties attached to it.\n */\n public get el(): GridCompHTMLElement { return this.elementRef.nativeElement; }\n\n /**\n * Get the underlying GridStack instance.\n * Use this to access GridStack API methods directly.\n * \n * @example\n * ```typescript\n * this.gridComponent.grid.addWidget({x: 0, y: 0, w: 2, h: 1});\n * ```\n */\n public get grid(): GridStack | undefined { return this._grid; }\n\n /**\n * Component reference for dynamic component removal.\n * Used internally when this component is created dynamically.\n */\n public ref: ComponentRef | undefined;\n\n /**\n * Mapping of component selectors to their types for dynamic creation.\n * \n * This enables dynamic component instantiation from string selectors.\n * Angular doesn't provide public access to this mapping, so we maintain our own.\n * \n * @example\n * ```typescript\n * GridstackComponent.addComponentToSelectorType([MyWidgetComponent]);\n * ```\n */\n public static selectorToType: SelectorToType = {};\n /**\n * Register a list of Angular components for dynamic creation.\n * \n * @param typeList Array of component types to register\n * \n * @example\n * ```typescript\n * GridstackComponent.addComponentToSelectorType([\n * MyWidgetComponent,\n * AnotherWidgetComponent\n * ]);\n * ```\n */\n public static addComponentToSelectorType(typeList: Array>) {\n typeList.forEach(type => GridstackComponent.selectorToType[ GridstackComponent.getSelector(type) ] = type);\n }\n /**\n * Extract the selector string from an Angular component type.\n * \n * @param type The component type to get selector from\n * @returns The component's selector string\n */\n public static getSelector(type: Type): string {\n return reflectComponentType(type)!.selector;\n }\n\n protected _options?: GridStackOptions;\n protected _grid?: GridStack;\n protected _sub: Subscription | undefined;\n protected loaded?: boolean;\n\n constructor(protected readonly elementRef: ElementRef) {\n // set globally our method to create the right widget type\n if (!GridStack.addRemoveCB) {\n GridStack.addRemoveCB = gsCreateNgComponents;\n }\n if (!GridStack.saveCB) {\n GridStack.saveCB = gsSaveAdditionalNgInfo;\n }\n if (!GridStack.updateCB) {\n GridStack.updateCB = gsUpdateNgComponents;\n }\n this.el._gridComp = this;\n }\n\n public ngOnInit(): void {\n // init ourself before any template children are created since we track them below anyway - no need to double create+update widgets\n this.loaded = !!this.options?.children?.length;\n this._grid = GridStack.init(this._options, this.el);\n delete this._options; // GS has it now\n\n this.checkEmpty();\n }\n\n /** wait until after all DOM is ready to init gridstack children (after angular ngFor and sub-components run first) */\n public ngAfterContentInit(): void {\n // track whenever the children list changes and update the layout...\n this._sub = this.gridstackItems?.changes.subscribe(() => this.updateAll());\n // ...and do this once at least unless we loaded children already\n if (!this.loaded) this.updateAll();\n this.hookEvents(this.grid);\n }\n\n public ngOnDestroy(): void {\n this.unhookEvents(this._grid);\n this._sub?.unsubscribe();\n this._grid?.destroy();\n delete this._grid;\n delete this.el._gridComp;\n delete this.container;\n delete this.ref;\n }\n\n /**\n * called when the TEMPLATE (not recommended) list of items changes - get a list of nodes and\n * update the layout accordingly (which will take care of adding/removing items changed by Angular)\n */\n public updateAll() {\n if (!this.grid) return;\n const layout: GridStackWidget[] = [];\n this.gridstackItems?.forEach(item => {\n layout.push(item.options);\n item.clearOptions();\n });\n this.grid.load(layout); // efficient that does diffs only\n }\n\n /** check if the grid is empty, if so show alternative content */\n public checkEmpty() {\n if (!this.grid) return;\n this.isEmpty = !this.grid.engine.nodes.length;\n }\n\n /** get all known events as easy to use Outputs for convenience */\n protected hookEvents(grid?: GridStack) {\n if (!grid) return;\n // nested grids don't have events in v12.1+ so skip\n if (grid.parentGridNode) return;\n grid\n .on('added', (event: Event, nodes: GridStackNode[]) => {\n const gridComp = (nodes[0].grid?.el as GridCompHTMLElement)._gridComp || this;\n gridComp.checkEmpty();\n this.addedCB.emit({event, nodes});\n })\n .on('change', (event: Event, nodes: GridStackNode[]) => this.changeCB.emit({event, nodes}))\n .on('disable', (event: Event) => this.disableCB.emit({event}))\n .on('drag', (event: Event, el: GridItemHTMLElement) => this.dragCB.emit({event, el}))\n .on('dragstart', (event: Event, el: GridItemHTMLElement) => this.dragStartCB.emit({event, el}))\n .on('dragstop', (event: Event, el: GridItemHTMLElement) => this.dragStopCB.emit({event, el}))\n .on('dropped', (event: Event, previousNode: GridStackNode, newNode: GridStackNode) => this.droppedCB.emit({event, previousNode, newNode}))\n .on('enable', (event: Event) => this.enableCB.emit({event}))\n .on('removed', (event: Event, nodes: GridStackNode[]) => {\n const gridComp = (nodes[0].grid?.el as GridCompHTMLElement)._gridComp || this;\n gridComp.checkEmpty();\n this.removedCB.emit({event, nodes});\n })\n .on('resize', (event: Event, el: GridItemHTMLElement) => this.resizeCB.emit({event, el}))\n .on('resizestart', (event: Event, el: GridItemHTMLElement) => this.resizeStartCB.emit({event, el}))\n .on('resizestop', (event: Event, el: GridItemHTMLElement) => this.resizeStopCB.emit({event, el}))\n }\n\n protected unhookEvents(grid?: GridStack) {\n if (!grid) return;\n // nested grids don't have events in v12.1+ so skip\n if (grid.parentGridNode) return;\n grid.off('added change disable drag dragstart dragstop dropped enable removed resize resizestart resizestop');\n }\n}\n\n/**\n * can be used when a new item needs to be created, which we do as a Angular component, or deleted (skip)\n **/\nexport function gsCreateNgComponents(host: GridCompHTMLElement | HTMLElement, n: NgGridStackNode, add: boolean, isGrid: boolean): HTMLElement | undefined {\n if (add) {\n //\n // create the component dynamically - see https://angular.io/docs/ts/latest/cookbook/dynamic-component-loader.html\n //\n if (!host) return;\n if (isGrid) {\n // TODO: figure out how to create ng component inside regular Div. need to access app injectors...\n // if (!container) {\n // const hostElement: Element = host;\n // const environmentInjector: EnvironmentInjector;\n // grid = createComponent(GridstackComponent, {environmentInjector, hostElement})?.instance;\n // }\n\n const gridItemComp = (host.parentElement as GridItemCompHTMLElement)?._gridItemComp;\n if (!gridItemComp) return;\n // check if gridItem has a child component with 'container' exposed to create under..\n const container = (gridItemComp.childWidget as any)?.container || gridItemComp.container;\n const gridRef = container?.createComponent(GridstackComponent);\n const grid = gridRef?.instance;\n if (!grid) return;\n grid.ref = gridRef;\n grid.options = n;\n return grid.el;\n } else {\n const gridComp = (host as GridCompHTMLElement)._gridComp;\n const gridItemRef = gridComp?.container?.createComponent(GridstackItemComponent);\n const gridItem = gridItemRef?.instance;\n if (!gridItem) return;\n gridItem.ref = gridItemRef\n\n // define what type of component to create as child, OR you can do it GridstackItemComponent template, but this is more generic\n const selector = n.selector;\n const type = selector ? GridstackComponent.selectorToType[selector] : undefined;\n if (type) {\n // shared code to create our selector component\n const createComp = () => {\n const childWidget = gridItem.container?.createComponent(type)?.instance as BaseWidget;\n // if proper BaseWidget subclass, save it and load additional data\n if (childWidget && typeof childWidget.serialize === 'function' && typeof childWidget.deserialize === 'function') {\n gridItem.childWidget = childWidget;\n childWidget.deserialize(n);\n }\n }\n\n const lazyLoad = n.lazyLoad || n.grid?.opts?.lazyLoad && n.lazyLoad !== false;\n if (lazyLoad) {\n if (!n.visibleObservable) {\n n.visibleObservable = new IntersectionObserver(([entry]) => { if (entry.isIntersecting) {\n n.visibleObservable?.disconnect();\n delete n.visibleObservable;\n createComp();\n }});\n window.setTimeout(() => n.visibleObservable?.observe(gridItem.el)); // wait until callee sets position attributes\n }\n } else createComp();\n }\n\n return gridItem.el;\n }\n } else {\n //\n // REMOVE - have to call ComponentRef:destroy() for dynamic objects to correctly remove themselves\n // Note: this will destroy all children dynamic components as well: gridItem -> childWidget\n //\n if (isGrid) {\n const grid = (n.el as GridCompHTMLElement)?._gridComp;\n if (grid?.ref) grid.ref.destroy();\n else grid?.ngOnDestroy();\n } else {\n const gridItem = (n.el as GridItemCompHTMLElement)?._gridItemComp;\n if (gridItem?.ref) gridItem.ref.destroy();\n else gridItem?.ngOnDestroy();\n }\n }\n return;\n}\n\n/**\n * called for each item in the grid - check if additional information needs to be saved.\n * Note: since this is options minus gridstack protected members using Utils.removeInternalForSave(),\n * this typically doesn't need to do anything. However your custom Component @Input() are now supported\n * using BaseWidget.serialize()\n */\nexport function gsSaveAdditionalNgInfo(n: NgGridStackNode, w: NgGridStackWidget) {\n const gridItem = (n.el as GridItemCompHTMLElement)?._gridItemComp;\n if (gridItem) {\n const input = gridItem.childWidget?.serialize();\n if (input) {\n w.input = input;\n }\n return;\n }\n // else check if Grid\n const grid = (n.el as GridCompHTMLElement)?._gridComp;\n if (grid) {\n //.... save any custom data\n }\n}\n\n/**\n * track when widgeta re updated (rather than created) to make sure we de-serialize them as well\n */\nexport function gsUpdateNgComponents(n: NgGridStackNode) {\n const w: NgGridStackWidget = n;\n const gridItem = (n.el as GridItemCompHTMLElement)?._gridItemComp;\n if (gridItem?.childWidget && w.input) gridItem.childWidget.deserialize(w);\n}","/**\r\n * gridstack.component.ts 12.3.3\r\n * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license\r\n */\r\n\r\nimport { NgModule } from \"@angular/core\";\r\n\r\nimport { GridstackItemComponent } from \"./gridstack-item.component\";\r\nimport { GridstackComponent } from \"./gridstack.component\";\r\n\r\n/**\r\n * @deprecated Use GridstackComponent and GridstackItemComponent as standalone components instead.\r\n * \r\n * This NgModule is provided for backward compatibility but is no longer the recommended approach.\r\n * Import components directly in your standalone components or use the new Angular module structure.\r\n * \r\n * @example\r\n * ```typescript\r\n * // Preferred approach - standalone components\r\n * @Component({\r\n * selector: 'my-app',\r\n * imports: [GridstackComponent, GridstackItemComponent],\r\n * template: ''\r\n * })\r\n * export class AppComponent {}\r\n * \r\n * // Legacy approach (deprecated)\r\n * @NgModule({\r\n * imports: [GridstackModule]\r\n * })\r\n * export class AppModule {}\r\n * ```\r\n */\r\n@NgModule({\r\n imports: [\r\n GridstackItemComponent,\r\n GridstackComponent,\r\n ],\r\n exports: [\r\n GridstackItemComponent,\r\n GridstackComponent,\r\n ],\r\n})\r\nexport class GridstackModule {}\r\n","/*\n * Public API Surface of gridstack-angular\n */\n\nexport * from './lib/types';\nexport * from './lib/base-widget';\nexport * from './lib/gridstack-item.component';\nexport * from './lib/gridstack.component';\nexport * from './lib/gridstack.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/index.d.ts b/web/skins/classic/assets/gridstack-12.3.3/dist/angular/index.d.ts deleted file mode 100644 index 0af54a2fb..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/index.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './lib/types'; -export * from './lib/base-widget'; -export * from './lib/gridstack-item.component'; -export * from './lib/gridstack.component'; -export * from './lib/gridstack.module'; diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/lib/base-widget.d.ts b/web/skins/classic/assets/gridstack-12.3.3/dist/angular/lib/base-widget.d.ts deleted file mode 100644 index dbed2eaf2..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/lib/base-widget.d.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { NgCompInputs, NgGridStackWidget } from './types'; -import * as i0 from "@angular/core"; -/** - * Base widget class for GridStack Angular integration. - */ -export declare abstract class BaseWidget { - /** - * Complete widget definition including position, size, and Angular-specific data. - * Populated automatically when the widget is loaded or saved. - */ - widgetItem?: NgGridStackWidget; - /** - * Override this method to return serializable data for this widget. - * - * Return an object with properties that map to your component's @Input() fields. - * The selector is handled automatically, so only include component-specific data. - * - * @returns Object containing serializable component data - * - * @example - * ```typescript - * serialize() { - * return { - * title: this.title, - * value: this.value, - * settings: this.settings - * }; - * } - * ``` - */ - serialize(): NgCompInputs | undefined; - /** - * Override this method to handle widget restoration from saved data. - * - * Use this for complex initialization that goes beyond simple @Input() mapping. - * The default implementation automatically assigns input data to component properties. - * - * @param w The saved widget data including input properties - * - * @example - * ```typescript - * deserialize(w: NgGridStackWidget) { - * super.deserialize(w); // Call parent for basic setup - * - * // Custom initialization logic - * if (w.input?.complexData) { - * this.processComplexData(w.input.complexData); - * } - * } - * ``` - */ - deserialize(w: NgGridStackWidget): void; - static ɵfac: i0.ɵɵFactoryDeclaration; - static ɵprov: i0.ɵɵInjectableDeclaration; -} diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/lib/gridstack-item.component.d.ts b/web/skins/classic/assets/gridstack-12.3.3/dist/angular/lib/gridstack-item.component.d.ts deleted file mode 100644 index 2997be124..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/lib/gridstack-item.component.d.ts +++ /dev/null @@ -1,79 +0,0 @@ -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -import { ElementRef, ViewContainerRef, OnDestroy, ComponentRef } from '@angular/core'; -import { GridItemHTMLElement, GridStackNode } from 'gridstack'; -import { BaseWidget } from './base-widget'; -import * as i0 from "@angular/core"; -/** - * Extended HTMLElement interface for grid items. - * Stores a back-reference to the Angular component for integration. - */ -export interface GridItemCompHTMLElement extends GridItemHTMLElement { - /** Back-reference to the Angular GridStackItem component */ - _gridItemComp?: GridstackItemComponent; -} -/** - * Angular component wrapper for individual GridStack items. - * - * This component represents a single grid item and handles: - * - Dynamic content creation and management - * - Integration with parent GridStack component - * - Component lifecycle and cleanup - * - Widget options and configuration - * - * Use in combination with GridstackComponent for the parent grid. - * - * @example - * ```html - * - * - * - * - * - * ``` - */ -export declare class GridstackItemComponent implements OnDestroy { - protected readonly elementRef: ElementRef; - /** - * Container for dynamic component creation within this grid item. - * Used to append child components programmatically. - */ - container?: ViewContainerRef; - /** - * Component reference for dynamic component removal. - * Used internally when this component is created dynamically. - */ - ref: ComponentRef | undefined; - /** - * Reference to child widget component for serialization. - * Used to save/restore additional data along with grid position. - */ - childWidget: BaseWidget | undefined; - /** - * Grid item configuration options. - * Defines position, size, and behavior of this grid item. - * - * @example - * ```typescript - * itemOptions: GridStackNode = { - * x: 0, y: 0, w: 2, h: 1, - * noResize: true, - * content: 'Item content' - * }; - * ``` - */ - set options(val: GridStackNode); - /** return the latest grid options (from GS once built, otherwise initial values) */ - get options(): GridStackNode; - protected _options?: GridStackNode; - /** return the native element that contains grid specific fields as well */ - get el(): GridItemCompHTMLElement; - /** clears the initial options now that we've built */ - clearOptions(): void; - constructor(elementRef: ElementRef); - ngOnDestroy(): void; - static ɵfac: i0.ɵɵFactoryDeclaration; - static ɵcmp: i0.ɵɵComponentDeclaration; -} diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/lib/gridstack.component.d.ts b/web/skins/classic/assets/gridstack-12.3.3/dist/angular/lib/gridstack.component.d.ts deleted file mode 100644 index 9e33f7fa8..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/lib/gridstack.component.d.ts +++ /dev/null @@ -1,236 +0,0 @@ -/** - * gridstack.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ -import { AfterContentInit, ElementRef, EventEmitter, OnDestroy, OnInit, QueryList, Type, ViewContainerRef, ComponentRef } from '@angular/core'; -import { Subscription } from 'rxjs'; -import { GridHTMLElement, GridItemHTMLElement, GridStack, GridStackNode, GridStackOptions } from 'gridstack'; -import { NgGridStackNode, NgGridStackWidget } from './types'; -import { GridstackItemComponent } from './gridstack-item.component'; -import * as i0 from "@angular/core"; -/** - * Event handler callback signatures for different GridStack events. - * These types define the structure of data passed to Angular event emitters. - */ -/** Callback for general events (enable, disable, etc.) */ -export declare type eventCB = { - event: Event; -}; -/** Callback for element-specific events (resize, drag, etc.) */ -export declare type elementCB = { - event: Event; - el: GridItemHTMLElement; -}; -/** Callback for events affecting multiple nodes (change, etc.) */ -export declare type nodesCB = { - event: Event; - nodes: GridStackNode[]; -}; -/** Callback for drop events with before/after node state */ -export declare type droppedCB = { - event: Event; - previousNode: GridStackNode; - newNode: GridStackNode; -}; -/** - * Extended HTMLElement interface for the grid container. - * Stores a back-reference to the Angular component for integration purposes. - */ -export interface GridCompHTMLElement extends GridHTMLElement { - /** Back-reference to the Angular GridStack component */ - _gridComp?: GridstackComponent; -} -/** - * Mapping of selector strings to Angular component types. - * Used for dynamic component creation based on widget selectors. - */ -export declare type SelectorToType = { - [key: string]: Type; -}; -/** - * Angular component wrapper for GridStack. - * - * This component provides Angular integration for GridStack grids, handling: - * - Grid initialization and lifecycle - * - Dynamic component creation and management - * - Event binding and emission - * - Integration with Angular change detection - * - * Use in combination with GridstackItemComponent for individual grid items. - * - * @example - * ```html - * - *
Drag widgets here
- *
- * ``` - */ -export declare class GridstackComponent implements OnInit, AfterContentInit, OnDestroy { - protected readonly elementRef: ElementRef; - /** - * List of template-based grid items (not recommended approach). - * Used to sync between DOM and GridStack internals when items are defined in templates. - * Prefer dynamic component creation instead. - */ - gridstackItems?: QueryList; - /** - * Container for dynamic component creation (recommended approach). - * Used to append grid items programmatically at runtime. - */ - container?: ViewContainerRef; - /** - * Grid configuration options. - * Can be set before grid initialization or updated after grid is created. - * - * @example - * ```typescript - * gridOptions: GridStackOptions = { - * column: 12, - * cellHeight: 'auto', - * animate: true - * }; - * ``` - */ - set options(o: GridStackOptions); - /** Get the current running grid options */ - get options(): GridStackOptions; - /** - * Controls whether empty content should be displayed. - * Set to true to show ng-content with 'empty-content' selector when grid has no items. - * - * @example - * ```html - * - *
Drag widgets here to get started
- *
- * ``` - */ - isEmpty?: boolean; - /** - * GridStack event emitters for Angular integration. - * - * These provide Angular-style event handling for GridStack events. - * Alternatively, use `this.grid.on('event1 event2', callback)` for multiple events. - * - * Note: 'CB' suffix prevents conflicts with native DOM events. - * - * @example - * ```html - * - * - * ``` - */ - /** Emitted when widgets are added to the grid */ - addedCB: EventEmitter; - /** Emitted when grid layout changes */ - changeCB: EventEmitter; - /** Emitted when grid is disabled */ - disableCB: EventEmitter; - /** Emitted during widget drag operations */ - dragCB: EventEmitter; - /** Emitted when widget drag starts */ - dragStartCB: EventEmitter; - /** Emitted when widget drag stops */ - dragStopCB: EventEmitter; - /** Emitted when widget is dropped */ - droppedCB: EventEmitter; - /** Emitted when grid is enabled */ - enableCB: EventEmitter; - /** Emitted when widgets are removed from the grid */ - removedCB: EventEmitter; - /** Emitted during widget resize operations */ - resizeCB: EventEmitter; - /** Emitted when widget resize starts */ - resizeStartCB: EventEmitter; - /** Emitted when widget resize stops */ - resizeStopCB: EventEmitter; - /** - * Get the native DOM element that contains grid-specific fields. - * This element has GridStack properties attached to it. - */ - get el(): GridCompHTMLElement; - /** - * Get the underlying GridStack instance. - * Use this to access GridStack API methods directly. - * - * @example - * ```typescript - * this.gridComponent.grid.addWidget({x: 0, y: 0, w: 2, h: 1}); - * ``` - */ - get grid(): GridStack | undefined; - /** - * Component reference for dynamic component removal. - * Used internally when this component is created dynamically. - */ - ref: ComponentRef | undefined; - /** - * Mapping of component selectors to their types for dynamic creation. - * - * This enables dynamic component instantiation from string selectors. - * Angular doesn't provide public access to this mapping, so we maintain our own. - * - * @example - * ```typescript - * GridstackComponent.addComponentToSelectorType([MyWidgetComponent]); - * ``` - */ - static selectorToType: SelectorToType; - /** - * Register a list of Angular components for dynamic creation. - * - * @param typeList Array of component types to register - * - * @example - * ```typescript - * GridstackComponent.addComponentToSelectorType([ - * MyWidgetComponent, - * AnotherWidgetComponent - * ]); - * ``` - */ - static addComponentToSelectorType(typeList: Array>): void; - /** - * Extract the selector string from an Angular component type. - * - * @param type The component type to get selector from - * @returns The component's selector string - */ - static getSelector(type: Type): string; - protected _options?: GridStackOptions; - protected _grid?: GridStack; - protected _sub: Subscription | undefined; - protected loaded?: boolean; - constructor(elementRef: ElementRef); - ngOnInit(): void; - /** wait until after all DOM is ready to init gridstack children (after angular ngFor and sub-components run first) */ - ngAfterContentInit(): void; - ngOnDestroy(): void; - /** - * called when the TEMPLATE (not recommended) list of items changes - get a list of nodes and - * update the layout accordingly (which will take care of adding/removing items changed by Angular) - */ - updateAll(): void; - /** check if the grid is empty, if so show alternative content */ - checkEmpty(): void; - /** get all known events as easy to use Outputs for convenience */ - protected hookEvents(grid?: GridStack): void; - protected unhookEvents(grid?: GridStack): void; - static ɵfac: i0.ɵɵFactoryDeclaration; - static ɵcmp: i0.ɵɵComponentDeclaration; -} -/** - * can be used when a new item needs to be created, which we do as a Angular component, or deleted (skip) - **/ -export declare function gsCreateNgComponents(host: GridCompHTMLElement | HTMLElement, n: NgGridStackNode, add: boolean, isGrid: boolean): HTMLElement | undefined; -/** - * called for each item in the grid - check if additional information needs to be saved. - * Note: since this is options minus gridstack protected members using Utils.removeInternalForSave(), - * this typically doesn't need to do anything. However your custom Component @Input() are now supported - * using BaseWidget.serialize() - */ -export declare function gsSaveAdditionalNgInfo(n: NgGridStackNode, w: NgGridStackWidget): void; -/** - * track when widgeta re updated (rather than created) to make sure we de-serialize them as well - */ -export declare function gsUpdateNgComponents(n: NgGridStackNode): void; diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/lib/gridstack.module.d.ts b/web/skins/classic/assets/gridstack-12.3.3/dist/angular/lib/gridstack.module.d.ts deleted file mode 100644 index 0bb7599a3..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/lib/gridstack.module.d.ts +++ /dev/null @@ -1,31 +0,0 @@ -import * as i0 from "@angular/core"; -import * as i1 from "./gridstack-item.component"; -import * as i2 from "./gridstack.component"; -/** - * @deprecated Use GridstackComponent and GridstackItemComponent as standalone components instead. - * - * This NgModule is provided for backward compatibility but is no longer the recommended approach. - * Import components directly in your standalone components or use the new Angular module structure. - * - * @example - * ```typescript - * // Preferred approach - standalone components - * @Component({ - * selector: 'my-app', - * imports: [GridstackComponent, GridstackItemComponent], - * template: '' - * }) - * export class AppComponent {} - * - * // Legacy approach (deprecated) - * @NgModule({ - * imports: [GridstackModule] - * }) - * export class AppModule {} - * ``` - */ -export declare class GridstackModule { - static ɵfac: i0.ɵɵFactoryDeclaration; - static ɵmod: i0.ɵɵNgModuleDeclaration; - static ɵinj: i0.ɵɵInjectorDeclaration; -} diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/lib/types.d.ts b/web/skins/classic/assets/gridstack-12.3.3/dist/angular/lib/types.d.ts deleted file mode 100644 index 677d41c3c..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/lib/types.d.ts +++ /dev/null @@ -1,51 +0,0 @@ -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2025 Alain Dumesny - see GridStack root license - */ -import { GridStackNode, GridStackOptions, GridStackWidget } from "gridstack"; -/** - * Extended GridStackWidget interface for Angular integration. - * Adds Angular-specific properties for dynamic component creation. - */ -export interface NgGridStackWidget extends GridStackWidget { - /** Angular component selector for dynamic creation (e.g., 'my-widget') */ - selector?: string; - /** Serialized data for component @Input() properties */ - input?: NgCompInputs; - /** Configuration for nested sub-grids */ - subGridOpts?: NgGridStackOptions; -} -/** - * Extended GridStackNode interface for Angular integration. - * Adds component selector for dynamic content creation. - */ -export interface NgGridStackNode extends GridStackNode { - /** Angular component selector for this node's content */ - selector?: string; -} -/** - * Extended GridStackOptions interface for Angular integration. - * Supports Angular-specific widget definitions and nested grids. - */ -export interface NgGridStackOptions extends GridStackOptions { - /** Array of Angular widget definitions for initial grid setup */ - children?: NgGridStackWidget[]; - /** Configuration for nested sub-grids (Angular-aware) */ - subGridOpts?: NgGridStackOptions; -} -/** - * Type for component input data serialization. - * Maps @Input() property names to their values for widget persistence. - * - * @example - * ```typescript - * const inputs: NgCompInputs = { - * title: 'My Widget', - * value: 42, - * config: { enabled: true } - * }; - * ``` - */ -export declare type NgCompInputs = { - [key: string]: any; -}; diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/src/base-widget.ts b/web/skins/classic/assets/gridstack-12.3.3/dist/angular/src/base-widget.ts deleted file mode 100644 index 31123039f..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/src/base-widget.ts +++ /dev/null @@ -1,95 +0,0 @@ -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ - -/** - * Abstract base class that all custom widgets should extend. - * - * This class provides the interface needed for GridstackItemComponent to: - * - Serialize/deserialize widget data - * - Save/restore widget state - * - Integrate with Angular lifecycle - * - * Extend this class when creating custom widgets for dynamic grids. - * - * @example - * ```typescript - * @Component({ - * selector: 'my-custom-widget', - * template: '
{{data}}
' - * }) - * export class MyCustomWidget extends BaseWidget { - * @Input() data: string = ''; - * - * serialize() { - * return { data: this.data }; - * } - * } - * ``` - */ - -import { Injectable } from '@angular/core'; -import { NgCompInputs, NgGridStackWidget } from './types'; - -/** - * Base widget class for GridStack Angular integration. - */ -@Injectable() -export abstract class BaseWidget { - - /** - * Complete widget definition including position, size, and Angular-specific data. - * Populated automatically when the widget is loaded or saved. - */ - public widgetItem?: NgGridStackWidget; - - /** - * Override this method to return serializable data for this widget. - * - * Return an object with properties that map to your component's @Input() fields. - * The selector is handled automatically, so only include component-specific data. - * - * @returns Object containing serializable component data - * - * @example - * ```typescript - * serialize() { - * return { - * title: this.title, - * value: this.value, - * settings: this.settings - * }; - * } - * ``` - */ - public serialize(): NgCompInputs | undefined { return; } - - /** - * Override this method to handle widget restoration from saved data. - * - * Use this for complex initialization that goes beyond simple @Input() mapping. - * The default implementation automatically assigns input data to component properties. - * - * @param w The saved widget data including input properties - * - * @example - * ```typescript - * deserialize(w: NgGridStackWidget) { - * super.deserialize(w); // Call parent for basic setup - * - * // Custom initialization logic - * if (w.input?.complexData) { - * this.processComplexData(w.input.complexData); - * } - * } - * ``` - */ - public deserialize(w: NgGridStackWidget) { - // save full description for meta data - this.widgetItem = w; - if (!w) return; - - if (w.input) Object.assign(this, w.input); - } - } diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/src/gridstack-item.component.ts b/web/skins/classic/assets/gridstack-12.3.3/dist/angular/src/gridstack-item.component.ts deleted file mode 100644 index 18653a917..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/src/gridstack-item.component.ts +++ /dev/null @@ -1,125 +0,0 @@ -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ - -import { Component, ElementRef, Input, ViewChild, ViewContainerRef, OnDestroy, ComponentRef } from '@angular/core'; -import { GridItemHTMLElement, GridStackNode } from 'gridstack'; -import { BaseWidget } from './base-widget'; - -/** - * Extended HTMLElement interface for grid items. - * Stores a back-reference to the Angular component for integration. - */ -export interface GridItemCompHTMLElement extends GridItemHTMLElement { - /** Back-reference to the Angular GridStackItem component */ - _gridItemComp?: GridstackItemComponent; -} - -/** - * Angular component wrapper for individual GridStack items. - * - * This component represents a single grid item and handles: - * - Dynamic content creation and management - * - Integration with parent GridStack component - * - Component lifecycle and cleanup - * - Widget options and configuration - * - * Use in combination with GridstackComponent for the parent grid. - * - * @example - * ```html - * - * - * - * - * - * ``` - */ -@Component({ - selector: 'gridstack-item', - template: ` -
- - - - - - {{options.content}} -
`, - styles: [` - :host { display: block; } - `], - standalone: true, - // changeDetection: ChangeDetectionStrategy.OnPush, // IFF you want to optimize and control when ChangeDetection needs to happen... -}) -export class GridstackItemComponent implements OnDestroy { - - /** - * Container for dynamic component creation within this grid item. - * Used to append child components programmatically. - */ - @ViewChild('container', { read: ViewContainerRef, static: true}) public container?: ViewContainerRef; - - /** - * Component reference for dynamic component removal. - * Used internally when this component is created dynamically. - */ - public ref: ComponentRef | undefined; - - /** - * Reference to child widget component for serialization. - * Used to save/restore additional data along with grid position. - */ - public childWidget: BaseWidget | undefined; - - /** - * Grid item configuration options. - * Defines position, size, and behavior of this grid item. - * - * @example - * ```typescript - * itemOptions: GridStackNode = { - * x: 0, y: 0, w: 2, h: 1, - * noResize: true, - * content: 'Item content' - * }; - * ``` - */ - @Input() public set options(val: GridStackNode) { - const grid = this.el.gridstackNode?.grid; - if (grid) { - // already built, do an update... - grid.update(this.el, val); - } else { - // store our custom element in options so we can update it and not re-create a generic div! - this._options = {...val, el: this.el}; - } - } - /** return the latest grid options (from GS once built, otherwise initial values) */ - public get options(): GridStackNode { - return this.el.gridstackNode || this._options || {el: this.el}; - } - - protected _options?: GridStackNode; - - /** return the native element that contains grid specific fields as well */ - public get el(): GridItemCompHTMLElement { return this.elementRef.nativeElement; } - - /** clears the initial options now that we've built */ - public clearOptions() { - delete this._options; - } - - constructor(protected readonly elementRef: ElementRef) { - this.el._gridItemComp = this; - } - - public ngOnDestroy(): void { - this.clearOptions(); - delete this.childWidget - delete this.el._gridItemComp; - delete this.container; - delete this.ref; - } -} diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/src/gridstack.component.ts b/web/skins/classic/assets/gridstack-12.3.3/dist/angular/src/gridstack.component.ts deleted file mode 100644 index f129aab40..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/src/gridstack.component.ts +++ /dev/null @@ -1,460 +0,0 @@ -/** - * gridstack.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ - -import { - AfterContentInit, Component, ContentChildren, ElementRef, EventEmitter, Input, - OnDestroy, OnInit, Output, QueryList, Type, ViewChild, ViewContainerRef, reflectComponentType, ComponentRef -} from '@angular/core'; -import { NgIf } from '@angular/common'; -import { Subscription } from 'rxjs'; -import { GridHTMLElement, GridItemHTMLElement, GridStack, GridStackNode, GridStackOptions, GridStackWidget } from 'gridstack'; - -import { NgGridStackNode, NgGridStackWidget } from './types'; -import { BaseWidget } from './base-widget'; -import { GridItemCompHTMLElement, GridstackItemComponent } from './gridstack-item.component'; - -/** - * Event handler callback signatures for different GridStack events. - * These types define the structure of data passed to Angular event emitters. - */ - -/** Callback for general events (enable, disable, etc.) */ -export type eventCB = {event: Event}; - -/** Callback for element-specific events (resize, drag, etc.) */ -export type elementCB = {event: Event, el: GridItemHTMLElement}; - -/** Callback for events affecting multiple nodes (change, etc.) */ -export type nodesCB = {event: Event, nodes: GridStackNode[]}; - -/** Callback for drop events with before/after node state */ -export type droppedCB = {event: Event, previousNode: GridStackNode, newNode: GridStackNode}; - -/** - * Extended HTMLElement interface for the grid container. - * Stores a back-reference to the Angular component for integration purposes. - */ -export interface GridCompHTMLElement extends GridHTMLElement { - /** Back-reference to the Angular GridStack component */ - _gridComp?: GridstackComponent; -} - -/** - * Mapping of selector strings to Angular component types. - * Used for dynamic component creation based on widget selectors. - */ -export type SelectorToType = {[key: string]: Type}; - -/** - * Angular component wrapper for GridStack. - * - * This component provides Angular integration for GridStack grids, handling: - * - Grid initialization and lifecycle - * - Dynamic component creation and management - * - Event binding and emission - * - Integration with Angular change detection - * - * Use in combination with GridstackItemComponent for individual grid items. - * - * @example - * ```html - * - *
Drag widgets here
- *
- * ``` - */ -@Component({ - selector: 'gridstack', - template: ` - - - - - - - `, - styles: [` - :host { display: block; } - `], - standalone: true, - imports: [NgIf] - // changeDetection: ChangeDetectionStrategy.OnPush, // IFF you want to optimize and control when ChangeDetection needs to happen... -}) -export class GridstackComponent implements OnInit, AfterContentInit, OnDestroy { - - /** - * List of template-based grid items (not recommended approach). - * Used to sync between DOM and GridStack internals when items are defined in templates. - * Prefer dynamic component creation instead. - */ - @ContentChildren(GridstackItemComponent) public gridstackItems?: QueryList; - /** - * Container for dynamic component creation (recommended approach). - * Used to append grid items programmatically at runtime. - */ - @ViewChild('container', { read: ViewContainerRef, static: true}) public container?: ViewContainerRef; - - /** - * Grid configuration options. - * Can be set before grid initialization or updated after grid is created. - * - * @example - * ```typescript - * gridOptions: GridStackOptions = { - * column: 12, - * cellHeight: 'auto', - * animate: true - * }; - * ``` - */ - @Input() public set options(o: GridStackOptions) { - if (this._grid) { - this._grid.updateOptions(o); - } else { - this._options = o; - } - } - /** Get the current running grid options */ - public get options(): GridStackOptions { return this._grid?.opts || this._options || {}; } - - /** - * Controls whether empty content should be displayed. - * Set to true to show ng-content with 'empty-content' selector when grid has no items. - * - * @example - * ```html - * - *
Drag widgets here to get started
- *
- * ``` - */ - @Input() public isEmpty?: boolean; - - /** - * GridStack event emitters for Angular integration. - * - * These provide Angular-style event handling for GridStack events. - * Alternatively, use `this.grid.on('event1 event2', callback)` for multiple events. - * - * Note: 'CB' suffix prevents conflicts with native DOM events. - * - * @example - * ```html - * - * - * ``` - */ - - /** Emitted when widgets are added to the grid */ - @Output() public addedCB = new EventEmitter(); - - /** Emitted when grid layout changes */ - @Output() public changeCB = new EventEmitter(); - - /** Emitted when grid is disabled */ - @Output() public disableCB = new EventEmitter(); - - /** Emitted during widget drag operations */ - @Output() public dragCB = new EventEmitter(); - - /** Emitted when widget drag starts */ - @Output() public dragStartCB = new EventEmitter(); - - /** Emitted when widget drag stops */ - @Output() public dragStopCB = new EventEmitter(); - - /** Emitted when widget is dropped */ - @Output() public droppedCB = new EventEmitter(); - - /** Emitted when grid is enabled */ - @Output() public enableCB = new EventEmitter(); - - /** Emitted when widgets are removed from the grid */ - @Output() public removedCB = new EventEmitter(); - - /** Emitted during widget resize operations */ - @Output() public resizeCB = new EventEmitter(); - - /** Emitted when widget resize starts */ - @Output() public resizeStartCB = new EventEmitter(); - - /** Emitted when widget resize stops */ - @Output() public resizeStopCB = new EventEmitter(); - - /** - * Get the native DOM element that contains grid-specific fields. - * This element has GridStack properties attached to it. - */ - public get el(): GridCompHTMLElement { return this.elementRef.nativeElement; } - - /** - * Get the underlying GridStack instance. - * Use this to access GridStack API methods directly. - * - * @example - * ```typescript - * this.gridComponent.grid.addWidget({x: 0, y: 0, w: 2, h: 1}); - * ``` - */ - public get grid(): GridStack | undefined { return this._grid; } - - /** - * Component reference for dynamic component removal. - * Used internally when this component is created dynamically. - */ - public ref: ComponentRef | undefined; - - /** - * Mapping of component selectors to their types for dynamic creation. - * - * This enables dynamic component instantiation from string selectors. - * Angular doesn't provide public access to this mapping, so we maintain our own. - * - * @example - * ```typescript - * GridstackComponent.addComponentToSelectorType([MyWidgetComponent]); - * ``` - */ - public static selectorToType: SelectorToType = {}; - /** - * Register a list of Angular components for dynamic creation. - * - * @param typeList Array of component types to register - * - * @example - * ```typescript - * GridstackComponent.addComponentToSelectorType([ - * MyWidgetComponent, - * AnotherWidgetComponent - * ]); - * ``` - */ - public static addComponentToSelectorType(typeList: Array>) { - typeList.forEach(type => GridstackComponent.selectorToType[ GridstackComponent.getSelector(type) ] = type); - } - /** - * Extract the selector string from an Angular component type. - * - * @param type The component type to get selector from - * @returns The component's selector string - */ - public static getSelector(type: Type): string { - return reflectComponentType(type)!.selector; - } - - protected _options?: GridStackOptions; - protected _grid?: GridStack; - protected _sub: Subscription | undefined; - protected loaded?: boolean; - - constructor(protected readonly elementRef: ElementRef) { - // set globally our method to create the right widget type - if (!GridStack.addRemoveCB) { - GridStack.addRemoveCB = gsCreateNgComponents; - } - if (!GridStack.saveCB) { - GridStack.saveCB = gsSaveAdditionalNgInfo; - } - if (!GridStack.updateCB) { - GridStack.updateCB = gsUpdateNgComponents; - } - this.el._gridComp = this; - } - - public ngOnInit(): void { - // init ourself before any template children are created since we track them below anyway - no need to double create+update widgets - this.loaded = !!this.options?.children?.length; - this._grid = GridStack.init(this._options, this.el); - delete this._options; // GS has it now - - this.checkEmpty(); - } - - /** wait until after all DOM is ready to init gridstack children (after angular ngFor and sub-components run first) */ - public ngAfterContentInit(): void { - // track whenever the children list changes and update the layout... - this._sub = this.gridstackItems?.changes.subscribe(() => this.updateAll()); - // ...and do this once at least unless we loaded children already - if (!this.loaded) this.updateAll(); - this.hookEvents(this.grid); - } - - public ngOnDestroy(): void { - this.unhookEvents(this._grid); - this._sub?.unsubscribe(); - this._grid?.destroy(); - delete this._grid; - delete this.el._gridComp; - delete this.container; - delete this.ref; - } - - /** - * called when the TEMPLATE (not recommended) list of items changes - get a list of nodes and - * update the layout accordingly (which will take care of adding/removing items changed by Angular) - */ - public updateAll() { - if (!this.grid) return; - const layout: GridStackWidget[] = []; - this.gridstackItems?.forEach(item => { - layout.push(item.options); - item.clearOptions(); - }); - this.grid.load(layout); // efficient that does diffs only - } - - /** check if the grid is empty, if so show alternative content */ - public checkEmpty() { - if (!this.grid) return; - this.isEmpty = !this.grid.engine.nodes.length; - } - - /** get all known events as easy to use Outputs for convenience */ - protected hookEvents(grid?: GridStack) { - if (!grid) return; - // nested grids don't have events in v12.1+ so skip - if (grid.parentGridNode) return; - grid - .on('added', (event: Event, nodes: GridStackNode[]) => { - const gridComp = (nodes[0].grid?.el as GridCompHTMLElement)._gridComp || this; - gridComp.checkEmpty(); - this.addedCB.emit({event, nodes}); - }) - .on('change', (event: Event, nodes: GridStackNode[]) => this.changeCB.emit({event, nodes})) - .on('disable', (event: Event) => this.disableCB.emit({event})) - .on('drag', (event: Event, el: GridItemHTMLElement) => this.dragCB.emit({event, el})) - .on('dragstart', (event: Event, el: GridItemHTMLElement) => this.dragStartCB.emit({event, el})) - .on('dragstop', (event: Event, el: GridItemHTMLElement) => this.dragStopCB.emit({event, el})) - .on('dropped', (event: Event, previousNode: GridStackNode, newNode: GridStackNode) => this.droppedCB.emit({event, previousNode, newNode})) - .on('enable', (event: Event) => this.enableCB.emit({event})) - .on('removed', (event: Event, nodes: GridStackNode[]) => { - const gridComp = (nodes[0].grid?.el as GridCompHTMLElement)._gridComp || this; - gridComp.checkEmpty(); - this.removedCB.emit({event, nodes}); - }) - .on('resize', (event: Event, el: GridItemHTMLElement) => this.resizeCB.emit({event, el})) - .on('resizestart', (event: Event, el: GridItemHTMLElement) => this.resizeStartCB.emit({event, el})) - .on('resizestop', (event: Event, el: GridItemHTMLElement) => this.resizeStopCB.emit({event, el})) - } - - protected unhookEvents(grid?: GridStack) { - if (!grid) return; - // nested grids don't have events in v12.1+ so skip - if (grid.parentGridNode) return; - grid.off('added change disable drag dragstart dragstop dropped enable removed resize resizestart resizestop'); - } -} - -/** - * can be used when a new item needs to be created, which we do as a Angular component, or deleted (skip) - **/ -export function gsCreateNgComponents(host: GridCompHTMLElement | HTMLElement, n: NgGridStackNode, add: boolean, isGrid: boolean): HTMLElement | undefined { - if (add) { - // - // create the component dynamically - see https://angular.io/docs/ts/latest/cookbook/dynamic-component-loader.html - // - if (!host) return; - if (isGrid) { - // TODO: figure out how to create ng component inside regular Div. need to access app injectors... - // if (!container) { - // const hostElement: Element = host; - // const environmentInjector: EnvironmentInjector; - // grid = createComponent(GridstackComponent, {environmentInjector, hostElement})?.instance; - // } - - const gridItemComp = (host.parentElement as GridItemCompHTMLElement)?._gridItemComp; - if (!gridItemComp) return; - // check if gridItem has a child component with 'container' exposed to create under.. - const container = (gridItemComp.childWidget as any)?.container || gridItemComp.container; - const gridRef = container?.createComponent(GridstackComponent); - const grid = gridRef?.instance; - if (!grid) return; - grid.ref = gridRef; - grid.options = n; - return grid.el; - } else { - const gridComp = (host as GridCompHTMLElement)._gridComp; - const gridItemRef = gridComp?.container?.createComponent(GridstackItemComponent); - const gridItem = gridItemRef?.instance; - if (!gridItem) return; - gridItem.ref = gridItemRef - - // define what type of component to create as child, OR you can do it GridstackItemComponent template, but this is more generic - const selector = n.selector; - const type = selector ? GridstackComponent.selectorToType[selector] : undefined; - if (type) { - // shared code to create our selector component - const createComp = () => { - const childWidget = gridItem.container?.createComponent(type)?.instance as BaseWidget; - // if proper BaseWidget subclass, save it and load additional data - if (childWidget && typeof childWidget.serialize === 'function' && typeof childWidget.deserialize === 'function') { - gridItem.childWidget = childWidget; - childWidget.deserialize(n); - } - } - - const lazyLoad = n.lazyLoad || n.grid?.opts?.lazyLoad && n.lazyLoad !== false; - if (lazyLoad) { - if (!n.visibleObservable) { - n.visibleObservable = new IntersectionObserver(([entry]) => { if (entry.isIntersecting) { - n.visibleObservable?.disconnect(); - delete n.visibleObservable; - createComp(); - }}); - window.setTimeout(() => n.visibleObservable?.observe(gridItem.el)); // wait until callee sets position attributes - } - } else createComp(); - } - - return gridItem.el; - } - } else { - // - // REMOVE - have to call ComponentRef:destroy() for dynamic objects to correctly remove themselves - // Note: this will destroy all children dynamic components as well: gridItem -> childWidget - // - if (isGrid) { - const grid = (n.el as GridCompHTMLElement)?._gridComp; - if (grid?.ref) grid.ref.destroy(); - else grid?.ngOnDestroy(); - } else { - const gridItem = (n.el as GridItemCompHTMLElement)?._gridItemComp; - if (gridItem?.ref) gridItem.ref.destroy(); - else gridItem?.ngOnDestroy(); - } - } - return; -} - -/** - * called for each item in the grid - check if additional information needs to be saved. - * Note: since this is options minus gridstack protected members using Utils.removeInternalForSave(), - * this typically doesn't need to do anything. However your custom Component @Input() are now supported - * using BaseWidget.serialize() - */ -export function gsSaveAdditionalNgInfo(n: NgGridStackNode, w: NgGridStackWidget) { - const gridItem = (n.el as GridItemCompHTMLElement)?._gridItemComp; - if (gridItem) { - const input = gridItem.childWidget?.serialize(); - if (input) { - w.input = input; - } - return; - } - // else check if Grid - const grid = (n.el as GridCompHTMLElement)?._gridComp; - if (grid) { - //.... save any custom data - } -} - -/** - * track when widgeta re updated (rather than created) to make sure we de-serialize them as well - */ -export function gsUpdateNgComponents(n: NgGridStackNode) { - const w: NgGridStackWidget = n; - const gridItem = (n.el as GridItemCompHTMLElement)?._gridItemComp; - if (gridItem?.childWidget && w.input) gridItem.childWidget.deserialize(w); -} \ No newline at end of file diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/src/gridstack.module.ts b/web/skins/classic/assets/gridstack-12.3.3/dist/angular/src/gridstack.module.ts deleted file mode 100644 index 015ef0fe1..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/src/gridstack.module.ts +++ /dev/null @@ -1,44 +0,0 @@ -/** - * gridstack.component.ts 12.3.3 - * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license - */ - -import { NgModule } from "@angular/core"; - -import { GridstackItemComponent } from "./gridstack-item.component"; -import { GridstackComponent } from "./gridstack.component"; - -/** - * @deprecated Use GridstackComponent and GridstackItemComponent as standalone components instead. - * - * This NgModule is provided for backward compatibility but is no longer the recommended approach. - * Import components directly in your standalone components or use the new Angular module structure. - * - * @example - * ```typescript - * // Preferred approach - standalone components - * @Component({ - * selector: 'my-app', - * imports: [GridstackComponent, GridstackItemComponent], - * template: '' - * }) - * export class AppComponent {} - * - * // Legacy approach (deprecated) - * @NgModule({ - * imports: [GridstackModule] - * }) - * export class AppModule {} - * ``` - */ -@NgModule({ - imports: [ - GridstackItemComponent, - GridstackComponent, - ], - exports: [ - GridstackItemComponent, - GridstackComponent, - ], -}) -export class GridstackModule {} diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/src/types.ts b/web/skins/classic/assets/gridstack-12.3.3/dist/angular/src/types.ts deleted file mode 100644 index 71967ceea..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/angular/src/types.ts +++ /dev/null @@ -1,54 +0,0 @@ -/** - * gridstack-item.component.ts 12.3.3 - * Copyright (c) 2025 Alain Dumesny - see GridStack root license - */ - -import { GridStackNode, GridStackOptions, GridStackWidget } from "gridstack"; - -/** - * Extended GridStackWidget interface for Angular integration. - * Adds Angular-specific properties for dynamic component creation. - */ -export interface NgGridStackWidget extends GridStackWidget { - /** Angular component selector for dynamic creation (e.g., 'my-widget') */ - selector?: string; - /** Serialized data for component @Input() properties */ - input?: NgCompInputs; - /** Configuration for nested sub-grids */ - subGridOpts?: NgGridStackOptions; -} - -/** - * Extended GridStackNode interface for Angular integration. - * Adds component selector for dynamic content creation. - */ -export interface NgGridStackNode extends GridStackNode { - /** Angular component selector for this node's content */ - selector?: string; -} - -/** - * Extended GridStackOptions interface for Angular integration. - * Supports Angular-specific widget definitions and nested grids. - */ -export interface NgGridStackOptions extends GridStackOptions { - /** Array of Angular widget definitions for initial grid setup */ - children?: NgGridStackWidget[]; - /** Configuration for nested sub-grids (Angular-aware) */ - subGridOpts?: NgGridStackOptions; -} - -/** - * Type for component input data serialization. - * Maps @Input() property names to their values for widget persistence. - * - * @example - * ```typescript - * const inputs: NgCompInputs = { - * title: 'My Widget', - * value: 42, - * config: { enabled: true } - * }; - * ``` - */ -export type NgCompInputs = {[key: string]: any}; diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/gridstack-engine-spec.d.ts b/web/skins/classic/assets/gridstack-12.3.3/dist/spec/gridstack-engine-spec.d.ts deleted file mode 100644 index cb0ff5c3b..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/gridstack-engine-spec.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/gridstack-engine-spec.js b/web/skins/classic/assets/gridstack-12.3.3/dist/spec/gridstack-engine-spec.js deleted file mode 100644 index 87e3a153b..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/gridstack-engine-spec.js +++ /dev/null @@ -1,358 +0,0 @@ -import { GridStackEngine } from '../src/gridstack-engine'; -describe('gridstack engine:', () => { - 'use strict'; - let e; - let ePriv; // cast engine for private vars access - let findNode = function (id) { - return e.nodes.find(n => n.id === id); - }; - it('should exist setup function.', () => { - expect(GridStackEngine).not.toBeNull(); - expect(typeof GridStackEngine).toBe('function'); - }); - describe('test constructor >', () => { - it('should be setup properly', () => { - ePriv = e = new GridStackEngine(); - expect(e.column).toEqual(12); - expect(e.float).toEqual(false); - expect(e.maxRow).toEqual(undefined); - expect(e.nodes).toEqual([]); - expect(e.batchMode).toEqual(undefined); - expect(ePriv.onChange).toEqual(undefined); - }); - it('should set params correctly.', () => { - let fkt = () => { }; - let arr = [1, 2, 3]; - ePriv = e = new GridStackEngine({ column: 1, onChange: fkt, float: true, maxRow: 2, nodes: arr }); - expect(e.column).toEqual(1); - expect(e.float).toBe(true); - expect(e.maxRow).toEqual(2); - expect(e.nodes).toEqual(arr); - expect(e.batchMode).toEqual(undefined); - expect(ePriv.onChange).toEqual(fkt); - }); - }); - describe('batch update', () => { - it('should set float and batchMode when calling batchUpdate.', () => { - ePriv = e = new GridStackEngine({ float: true }); - e.batchUpdate(); - expect(e.float).toBe(true); - expect(e.batchMode).toBe(true); - }); - }); - describe('test prepareNode >', () => { - beforeAll(() => { - ePriv = e = new GridStackEngine(); - }); - it('should prepare a node', () => { - expect(e.prepareNode({}, false)).toEqual(expect.objectContaining({ x: 0, y: 0, h: 1 })); - expect(e.prepareNode({ x: 10 }, false)).toEqual(expect.objectContaining({ x: 10, y: 0, h: 1 })); - expect(e.prepareNode({ x: -10 }, false)).toEqual(expect.objectContaining({ x: 0, y: 0, h: 1 })); - expect(e.prepareNode({ y: 10 }, false)).toEqual(expect.objectContaining({ x: 0, y: 10, h: 1 })); - expect(e.prepareNode({ y: -10 }, false)).toEqual(expect.objectContaining({ x: 0, y: 0, h: 1 })); - expect(e.prepareNode({ w: 3 }, false)).toEqual(expect.objectContaining({ x: 0, y: 0, w: 3, h: 1 })); - expect(e.prepareNode({ w: 100 }, false)).toEqual(expect.objectContaining({ x: 0, y: 0, w: 12, h: 1 })); - expect(e.prepareNode({ w: 0 }, false)).toEqual(expect.objectContaining({ x: 0, y: 0, h: 1 })); - expect(e.prepareNode({ w: -190 }, false)).toEqual(expect.objectContaining({ x: 0, y: 0, h: 1 })); - expect(e.prepareNode({ h: 3 }, false)).toEqual(expect.objectContaining({ x: 0, y: 0, h: 3 })); - expect(e.prepareNode({ h: 0 }, false)).toEqual(expect.objectContaining({ x: 0, y: 0, h: 1 })); - expect(e.prepareNode({ h: -10 }, false)).toEqual(expect.objectContaining({ x: 0, y: 0, h: 1 })); - expect(e.prepareNode({ x: 4, w: 10 }, false)).toEqual(expect.objectContaining({ x: 2, y: 0, w: 10, h: 1 })); - expect(e.prepareNode({ x: 4, w: 10 }, true)).toEqual(expect.objectContaining({ x: 4, y: 0, w: 8, h: 1 })); - }); - }); - describe('sorting of nodes >', () => { - beforeAll(() => { - ePriv = e = new GridStackEngine(); - e.nodes = [{ x: 7, y: 0 }, { x: 4, y: 4 }, { x: 9, y: 0 }, { x: 0, y: 1 }]; - }); - it('should sort ascending with 12 columns.', () => { - e.sortNodes(1); - expect(e.nodes).toEqual([{ x: 7, y: 0 }, { x: 9, y: 0 }, { x: 0, y: 1 }, { x: 4, y: 4 }]); - }); - it('should sort descending with 12 columns.', () => { - e.sortNodes(-1); - expect(e.nodes).toEqual([{ x: 4, y: 4 }, { x: 0, y: 1 }, { x: 9, y: 0 }, { x: 7, y: 0 }]); - }); - it('should sort ascending without columns.', () => { - ePriv.column = undefined; - e.sortNodes(1); - expect(e.nodes).toEqual([{ x: 7, y: 0 }, { x: 9, y: 0 }, { x: 0, y: 1 }, { x: 4, y: 4 }]); - }); - it('should sort descending without columns.', () => { - ePriv.column = undefined; - e.sortNodes(-1); - expect(e.nodes).toEqual([{ x: 4, y: 4 }, { x: 0, y: 1 }, { x: 9, y: 0 }, { x: 7, y: 0 }]); - }); - }); - describe('test isAreaEmpty >', () => { - beforeAll(() => { - ePriv = e = new GridStackEngine({ float: true }); - e.nodes = [ - e.prepareNode({ x: 3, y: 2, w: 3, h: 2 }) - ]; - }); - it('should be true', () => { - expect(e.isAreaEmpty(0, 0, 3, 2)).toEqual(true); - expect(e.isAreaEmpty(3, 4, 3, 2)).toEqual(true); - }); - it('should be false', () => { - expect(e.isAreaEmpty(1, 1, 3, 2)).toEqual(false); - expect(e.isAreaEmpty(2, 3, 3, 2)).toEqual(false); - }); - }); - describe('test cleanNodes/getDirtyNodes >', () => { - beforeAll(() => { - ePriv = e = new GridStackEngine({ float: true }); - e.nodes = [ - e.prepareNode({ x: 0, y: 0, id: '1', _dirty: true }), - e.prepareNode({ x: 3, y: 2, w: 3, h: 2, id: '2', _dirty: true }), - e.prepareNode({ x: 3, y: 7, w: 3, h: 2, id: '3' }) - ]; - }); - beforeEach(() => { - delete ePriv.batchMode; - }); - it('should return all dirty nodes', () => { - let nodes = e.getDirtyNodes(); - expect(nodes.length).toEqual(2); - expect(nodes[0].id).toEqual('1'); - expect(nodes[1].id).toEqual('2'); - }); - it('should\'n clean nodes if batchMode true', () => { - e.batchMode = true; - e.cleanNodes(); - expect(e.getDirtyNodes().length).toBeGreaterThan(0); - }); - it('should clean all dirty nodes', () => { - e.cleanNodes(); - expect(e.getDirtyNodes().length).toEqual(0); - }); - }); - describe('test batchUpdate/commit >', () => { - beforeAll(() => { - ePriv = e = new GridStackEngine(); - }); - it('should work on not float grids', () => { - expect(e.float).toEqual(false); - e.batchUpdate(); - e.batchUpdate(); // double for code coverage - expect(e.batchMode).toBe(true); - expect(e.float).toEqual(true); - e.batchUpdate(false); - e.batchUpdate(false); - expect(e.batchMode).not.toBe(true); - expect(e.float).not.toBe(true); - }); - it('should work on float grids', () => { - e.float = true; - e.batchUpdate(); - expect(e.batchMode).toBe(true); - expect(e.float).toEqual(true); - e.batchUpdate(false); - expect(e.batchMode).not.toBe(true); - expect(e.float).toEqual(true); - }); - }); - describe('test batchUpdate/commit >', () => { - beforeAll(() => { - ePriv = e = new GridStackEngine({ float: true }); - }); - it('should work on float grids', () => { - expect(e.float).toEqual(true); - e.batchUpdate(); - expect(e.batchMode).toBe(true); - expect(e.float).toEqual(true); - e.batchUpdate(false); - expect(e.batchMode).not.toBe(true); - expect(e.float).toEqual(true); - }); - }); - describe('test _notify >', () => { - let spy; - beforeEach(() => { - spy = { - callback: () => { } - }; - vi.spyOn(spy, 'callback'); - ePriv = e = new GridStackEngine({ float: true, onChange: spy.callback }); - e.nodes = [ - e.prepareNode({ x: 0, y: 0, id: '1', _dirty: true }), - e.prepareNode({ x: 3, y: 2, w: 3, h: 2, id: '2', _dirty: true }), - e.prepareNode({ x: 3, y: 7, w: 3, h: 2, id: '3' }) - ]; - }); - it('should\'n be called if batchMode true', () => { - e.batchMode = true; - ePriv._notify(); - expect(spy.callback).not.toHaveBeenCalled(); - }); - it('should by called with dirty nodes', () => { - ePriv._notify(); - expect(spy.callback).toHaveBeenCalledWith([e.nodes[0], e.nodes[1]]); - }); - it('should by called with extra passed node to be removed', () => { - let n1 = { id: -1 }; - ePriv._notify([n1]); - expect(spy.callback).toHaveBeenCalledWith([n1, e.nodes[0], e.nodes[1]]); - }); - }); - describe('test _packNodes >', () => { - describe('using float:false mode >', () => { - beforeEach(() => { - ePriv = e = new GridStackEngine({ float: false }); - }); - it('shouldn\'t pack one node with y coord eq 0', () => { - e.nodes = [ - e.prepareNode({ x: 0, y: 0, w: 1, h: 1, id: '1' }), - ]; - ePriv._packNodes(); - expect(findNode('1')).toEqual(expect.objectContaining({ x: 0, y: 0, h: 1 })); - expect(findNode('1')._dirty).toBeFalsy(); - }); - it('should pack one node correctly', () => { - e.nodes = [ - e.prepareNode({ x: 0, y: 1, w: 1, h: 1, id: '1' }), - ]; - ePriv._packNodes(); - expect(findNode('1')).toEqual(expect.objectContaining({ x: 0, y: 0, _dirty: true })); - }); - it('should pack nodes correctly', () => { - e.nodes = [ - e.prepareNode({ x: 0, y: 1, w: 1, h: 1, id: '1' }), - e.prepareNode({ x: 0, y: 5, w: 1, h: 1, id: '2' }), - ]; - ePriv._packNodes(); - expect(findNode('1')).toEqual(expect.objectContaining({ x: 0, y: 0, _dirty: true })); - expect(findNode('2')).toEqual(expect.objectContaining({ x: 0, y: 1, _dirty: true })); - }); - it('should pack reverse nodes correctly', () => { - e.nodes = [ - e.prepareNode({ x: 0, y: 5, w: 1, h: 1, id: '1' }), - e.prepareNode({ x: 0, y: 1, w: 1, h: 1, id: '2' }), - ]; - ePriv._packNodes(); - expect(findNode('2')).toEqual(expect.objectContaining({ x: 0, y: 0, _dirty: true })); - expect(findNode('1')).toEqual(expect.objectContaining({ x: 0, y: 1, _dirty: true })); - }); - it('should respect locked nodes', () => { - e.nodes = [ - e.prepareNode({ x: 0, y: 1, w: 1, h: 1, id: '1', locked: true }), - e.prepareNode({ x: 0, y: 5, w: 1, h: 1, id: '2' }), - ]; - ePriv._packNodes(); - expect(findNode('1')).toEqual(expect.objectContaining({ x: 0, y: 1, h: 1 })); - expect(findNode('1')._dirty).toBeFalsy(); - expect(findNode('2')).toEqual(expect.objectContaining({ x: 0, y: 2, _dirty: true })); - }); - }); - }); - describe('test changedPos >', () => { - beforeAll(() => { - ePriv = e = new GridStackEngine(); - }); - it('should return true for changed x', () => { - let widget = { x: 1, y: 2, w: 3, h: 4 }; - expect(e.changedPosConstrain(widget, { x: 2, y: 2 })).toEqual(true); - }); - it('should return true for changed y', () => { - let widget = { x: 1, y: 2, w: 3, h: 4 }; - expect(e.changedPosConstrain(widget, { x: 1, y: 1 })).toEqual(true); - }); - it('should return true for changed width', () => { - let widget = { x: 1, y: 2, w: 3, h: 4 }; - expect(e.changedPosConstrain(widget, { x: 2, y: 2, w: 4, h: 4 })).toEqual(true); - }); - it('should return true for changed height', () => { - let widget = { x: 1, y: 2, w: 3, h: 4 }; - expect(e.changedPosConstrain(widget, { x: 1, y: 2, w: 3, h: 3 })).toEqual(true); - }); - it('should return false for unchanged position', () => { - let widget = { x: 1, y: 2, w: 3, h: 4 }; - expect(e.changedPosConstrain(widget, { x: 1, y: 2, w: 3, h: 4 })).toEqual(false); - }); - }); - describe('test locked widget >', () => { - beforeAll(() => { - ePriv = e = new GridStackEngine(); - }); - it('should add widgets around locked one', () => { - let nodes = [ - { x: 0, y: 1, w: 12, h: 1, locked: true, noMove: true, noResize: true, id: '0' }, - { x: 1, y: 0, w: 2, h: 3, id: '1' } - ]; - // add locked item - e.addNode(nodes[0]); - expect(findNode('0')).toEqual(expect.objectContaining({ x: 0, y: 1, w: 12, h: 1, locked: true })); - // add item that moves past locked one - e.addNode(nodes[1]); - expect(findNode('0')).toEqual(expect.objectContaining({ x: 0, y: 1, w: 12, h: 1, locked: true })); - expect(findNode('1')).toEqual(expect.objectContaining({ x: 1, y: 2, h: 3 })); - // locked item can still be moved directly (what user does) - let node0 = findNode('0'); - expect(e.moveNode(node0, { y: 6 })).toEqual(true); - expect(findNode('0')).toEqual(expect.objectContaining({ x: 0, y: 6, h: 1, locked: true })); - // but moves regular one past it - let node1 = findNode('1'); - expect(e.moveNode(node1, { x: 6, y: 6 })).toEqual(true); - expect(node1).toEqual(expect.objectContaining({ x: 6, y: 7, w: 2, h: 3 })); - // but moves regular one before (gravity ON) - e.float = false; - expect(e.moveNode(node1, { x: 7, y: 3 })).toEqual(true); - expect(node1).toEqual(expect.objectContaining({ x: 7, y: 0, w: 2, h: 3 })); - // but moves regular one before (gravity OFF) - e.float = true; - expect(e.moveNode(node1, { x: 7, y: 3 })).toEqual(true); - expect(node1).toEqual(expect.objectContaining({ x: 7, y: 3, w: 2, h: 3 })); - }); - }); - describe('test columnChanged >', () => { - beforeAll(() => { - }); - it('12 to 1 and back', () => { - ePriv = e = new GridStackEngine({ column: 12 }); - // Add two side-by-side components 6+6 = 12 columns - const left = e.addNode({ x: 0, y: 0, w: 6, h: 1, id: 'left' }); - const right = e.addNode({ x: 6, y: 0, w: 6, h: 1, id: 'right' }); - expect(left).toEqual(expect.objectContaining({ x: 0, y: 0, w: 6, h: 1 })); - expect(right).toEqual(expect.objectContaining({ x: 6, y: 0, w: 6, h: 1 })); - // Resize to 1 column - e.column = 1; - e.columnChanged(12, 1); - expect(left).toEqual(expect.objectContaining({ x: 0, y: 0, w: 1, h: 1 })); - expect(right).toEqual(expect.objectContaining({ x: 0, y: 1, w: 1, h: 1 })); - // Resize back to 12 column - e.column = 12; - e.columnChanged(1, 12); - expect(left).toEqual(expect.objectContaining({ x: 0, y: 0, w: 6, h: 1 })); - expect(right).toEqual(expect.objectContaining({ x: 6, y: 0, w: 6, h: 1 })); - }); - it('24 column to 1 and back', () => { - ePriv = e = new GridStackEngine({ column: 24 }); - // Add two side-by-side components 12+12 = 24 columns - const left = e.addNode({ x: 0, y: 0, w: 12, h: 1, id: 'left' }); - const right = e.addNode({ x: 12, y: 0, w: 12, h: 1, id: 'right' }); - expect(left).toEqual(expect.objectContaining({ x: 0, y: 0, w: 12, h: 1 })); - expect(right).toEqual(expect.objectContaining({ x: 12, y: 0, w: 12, h: 1 })); - // Resize to 1 column - e.column = 1; - e.columnChanged(24, 1); - expect(left).toEqual(expect.objectContaining({ x: 0, y: 0, w: 1, h: 1 })); - expect(right).toEqual(expect.objectContaining({ x: 0, y: 1, w: 1, h: 1 })); - // Resize back to 24 column - e.column = 24; - e.columnChanged(1, 24); - expect(left).toEqual(expect.objectContaining({ x: 0, y: 0, w: 12, h: 1 })); - expect(right).toEqual(expect.objectContaining({ x: 12, y: 0, w: 12, h: 1 })); - }); - }); - describe('test compact >', () => { - beforeAll(() => { - ePriv = e = new GridStackEngine(); - }); - it('do nothing', () => { - e.compact(); - }); - }); -}); -//# sourceMappingURL=gridstack-engine-spec.js.map \ No newline at end of file diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/gridstack-engine-spec.js.map b/web/skins/classic/assets/gridstack-12.3.3/dist/spec/gridstack-engine-spec.js.map deleted file mode 100644 index 7dea7c95d..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/gridstack-engine-spec.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"gridstack-engine-spec.js","sourceRoot":"","sources":["../../spec/gridstack-engine-spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAK,yBAAyB,CAAC;AAGzD,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAClC,YAAY,CAAC;IACZ,IAAI,CAAkB,CAAC;IACvB,IAAI,KAAU,CAAC,CAAC,sCAAsC;IACtD,IAAI,QAAQ,GAAG,UAAS,EAAU;QAChC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC;IAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACvC,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAElC,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,KAAK,GAAG,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC;YAClC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC7B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC/B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,SAAU,CAAC,CAAC;YACrC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC5B,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,SAAU,CAAC,CAAC;YACxC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,IAAI,GAAG,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;YACpB,IAAI,GAAG,GAAQ,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;YACvB,KAAK,GAAG,CAAC,GAAG,IAAI,eAAe,CAAC,EAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAC,GAAG,EAAE,KAAK,EAAC,IAAI,EAAE,MAAM,EAAC,CAAC,EAAE,KAAK,EAAC,GAAG,EAAC,CAAC,CAAC;YAC5F,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC7B,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACvC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAE5B,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,KAAK,GAAG,CAAC,GAAG,IAAI,eAAe,CAAC,EAAC,KAAK,EAAE,IAAI,EAAC,CAAC,CAAC;YAC/C,CAAC,CAAC,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAElC,SAAS,CAAC,GAAG,EAAE;YACb,KAAK,GAAG,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;YAC/B,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YACtF,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,EAAE,EAAC,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YAC5F,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,EAAC,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YAC5F,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,EAAE,EAAC,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YAC5F,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,EAAC,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YAC5F,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YAChG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,GAAG,EAAC,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YACnG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YAC1F,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,GAAG,EAAC,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YAC7F,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YAC1F,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YAC1F,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,EAAC,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YAC5F,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAC,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YACxG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAC,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;QACxG,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,SAAS,CAAC,GAAG,EAAE;YACb,KAAK,GAAG,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC;YAClC,CAAC,CAAC,KAAK,GAAG,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,EAAE,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,EAAE,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,EAAE,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC;QACrE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACf,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,EAAE,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,EAAE,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,EAAE,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;QACpF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAChB,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,EAAE,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,EAAE,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,EAAE,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;QACpF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;YACzB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACf,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,EAAE,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,EAAE,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,EAAE,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;QACpF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;YACzB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAChB,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,EAAE,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,EAAE,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,EAAE,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;QACpF,CAAC,CAAC,CAAC;IAEL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAElC,SAAS,CAAC,GAAG,EAAE;YACb,KAAK,GAAG,CAAC,GAAG,IAAI,eAAe,CAAC,EAAC,KAAK,EAAC,IAAI,EAAC,CAAC,CAAC;YAC9C,CAAC,CAAC,KAAK,GAAG;gBACR,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC;aACxC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;YACxB,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;YACzB,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACjD,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAE/C,SAAS,CAAC,GAAG,EAAE;YACb,KAAK,GAAG,CAAC,GAAG,IAAI,eAAe,CAAC,EAAC,KAAK,EAAC,IAAI,EAAC,CAAC,CAAC;YAC9C,CAAC,CAAC,KAAK,GAAG;gBACR,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAC,CAAC;gBAClD,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAC,CAAC;gBAC9D,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAC,CAAC;aACjD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,UAAU,CAAC,GAAG,EAAE;YACd,OAAO,KAAK,CAAC,SAAS,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,IAAI,KAAK,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;YACnB,CAAC,CAAC,UAAU,EAAE,CAAC;YACf,MAAM,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,CAAC,CAAC,UAAU,EAAE,CAAC;YACf,MAAM,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,SAAS,CAAC,GAAG,EAAE;YACb,KAAK,GAAG,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC,CAAC,WAAW,EAAE,CAAC;YAChB,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,2BAA2B;YAC5C,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACrB,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC;YACf,CAAC,CAAC,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACrB,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QAEzC,SAAS,CAAC,GAAG,EAAE;YACb,KAAK,GAAG,CAAC,GAAG,IAAI,eAAe,CAAC,EAAC,KAAK,EAAC,IAAI,EAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC,CAAC,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACrB,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,IAAI,GAAG,CAAC;QAER,UAAU,CAAC,GAAG,EAAE;YACd,GAAG,GAAG;gBACJ,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;aACnB,CAAC;YACF,EAAE,CAAC,KAAK,CAAC,GAAG,EAAC,UAAU,CAAC,CAAC;YACzB,KAAK,GAAG,CAAC,GAAG,IAAI,eAAe,CAAC,EAAC,KAAK,EAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAC,CAAC,CAAC;YACtE,CAAC,CAAC,KAAK,GAAG;gBACR,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAC,CAAC;gBAClD,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAC,CAAC;gBAC9D,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAC,CAAC;aACjD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;YACnB,KAAK,CAAC,OAAO,EAAE,CAAC;YAChB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,KAAK,CAAC,OAAO,EAAE,CAAC;YAChB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,IAAI,EAAE,GAAG,EAAC,EAAE,EAAE,CAAC,CAAC,EAAC,CAAC;YAClB,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;YACxC,UAAU,CAAC,GAAG,EAAE;gBACd,KAAK,GAAG,CAAC,GAAG,IAAI,eAAe,CAAC,EAAC,KAAK,EAAC,KAAK,EAAC,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;gBACpD,CAAC,CAAC,KAAK,GAAG;oBACR,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAC,CAAC;iBAC/C,CAAC;gBACF,KAAK,CAAC,UAAU,EAAE,CAAC;gBACnB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;gBAC3E,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAE,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;YAC5C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;gBACxC,CAAC,CAAC,KAAK,GAAG;oBACR,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAC,CAAC;iBAC/C,CAAC;gBACF,KAAK,CAAC,UAAU,EAAE,CAAC;gBACnB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC;YACrF,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;gBACrC,CAAC,CAAC,KAAK,GAAG;oBACR,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAC,CAAC;oBAC9C,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAC,CAAC;iBAC/C,CAAC;gBACF,KAAK,CAAC,UAAU,EAAE,CAAC;gBACnB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC;gBACnF,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC;YACrF,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;gBAC7C,CAAC,CAAC,KAAK,GAAG;oBACR,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAC,CAAC;oBAC9C,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAC,CAAC;iBAC/C,CAAC;gBACF,KAAK,CAAC,UAAU,EAAE,CAAC;gBACnB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC;gBACnF,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC;YACrF,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;gBACrC,CAAC,CAAC,KAAK,GAAG;oBACR,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAC,CAAC;oBAC5D,CAAC,CAAC,WAAW,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAC,CAAC;iBAC/C,CAAC;gBACF,KAAK,CAAC,UAAU,EAAE,CAAC;gBACnB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;gBAC3E,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAE,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;gBAC1C,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC;YACrF,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,SAAS,CAAC,GAAG,EAAE;YACb,KAAK,GAAG,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,IAAI,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,EAAE,EAAC,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,IAAI,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,EAAE,EAAC,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,IAAI,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,EAAE,EAAC,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,IAAI,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,EAAE,EAAC,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,IAAI,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,EAAE,EAAC,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,SAAS,CAAC,GAAG,EAAE;YACb,KAAK,GAAG,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,IAAI,KAAK,GAAoB;gBAC3B,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAC;gBAC9E,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAC;aAClC,CAAC;YACF,kBAAkB;YAClB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YACnB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC;YAChG,sCAAsC;YACtC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YACnB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC;YAChG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YAC3E,2DAA2D;YAC3D,IAAI,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC1B,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAM,EAAE,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAChD,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC;YACzF,gCAAgC;YAChC,IAAI,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC1B,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAM,EAAE,EAAC,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YACzE,4CAA4C;YAC5C,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC;YAChB,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAM,EAAE,EAAC,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YACzE,6CAA6C;YAC7C,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC;YACf,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAM,EAAE,EAAC,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACrD,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,SAAS,CAAC,GAAG,EAAE;QACf,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;YAC1B,KAAK,GAAG,CAAC,GAAG,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YAChD,mDAAmD;YACnD,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/D,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YACjE,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YACxE,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YACzE,qBAAqB;YACrB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YACb,CAAC,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YACxE,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YACzE,2BAA2B;YAC3B,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC;YACd,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YACxE,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,KAAK,GAAG,CAAC,GAAG,IAAI,eAAe,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YAChD,qDAAqD;YACrD,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAChE,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YACnE,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YACzE,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YAC3E,qBAAqB;YACrB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YACb,CAAC,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YACxE,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YACzE,2BAA2B;YAC3B,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC;YACd,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;YACzE,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;QAC7E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,SAAS,CAAC,GAAG,EAAE;YACb,KAAK,GAAG,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC;QACpC,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE;YACpB,CAAC,CAAC,OAAO,EAAE,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AAEL,CAAC,CAAC,CAAC","sourcesContent":["import { GridStackEngine } from'../src/gridstack-engine';\nimport { GridStackNode } from'../src/types';\n\ndescribe('gridstack engine:', () => {\n 'use strict';\n let e: GridStackEngine;\n let ePriv: any; // cast engine for private vars access\n let findNode = function(id: string) {\n return e.nodes.find(n => n.id === id);\n };\n\n it('should exist setup function.', () => {\n expect(GridStackEngine).not.toBeNull();\n expect(typeof GridStackEngine).toBe('function');\n });\n\n describe('test constructor >', () => {\n \n it('should be setup properly', () => {\n ePriv = e = new GridStackEngine();\n expect(e.column).toEqual(12);\n expect(e.float).toEqual(false);\n expect(e.maxRow).toEqual(undefined!);\n expect(e.nodes).toEqual([]);\n expect(e.batchMode).toEqual(undefined!);\n expect(ePriv.onChange).toEqual(undefined);\n });\n\n it('should set params correctly.', () => {\n let fkt = () => { };\n let arr: any = [1,2,3];\n ePriv = e = new GridStackEngine({column: 1, onChange:fkt, float:true, maxRow:2, nodes:arr});\n expect(e.column).toEqual(1);\n expect(e.float).toBe(true);\n expect(e.maxRow).toEqual(2);\n expect(e.nodes).toEqual(arr);\n expect(e.batchMode).toEqual(undefined);\n expect(ePriv.onChange).toEqual(fkt);\n });\n });\n\n describe('batch update', () => {\n\n it('should set float and batchMode when calling batchUpdate.', () => {\n ePriv = e = new GridStackEngine({float: true});\n e.batchUpdate();\n expect(e.float).toBe(true);\n expect(e.batchMode).toBe(true);\n });\n }); \n\n describe('test prepareNode >', () => {\n\n beforeAll(() => {\n ePriv = e = new GridStackEngine();\n });\n it('should prepare a node', () => {\n expect(e.prepareNode({}, false)).toEqual(expect.objectContaining({x: 0, y: 0, h: 1}));\n expect(e.prepareNode({x: 10}, false)).toEqual(expect.objectContaining({x: 10, y: 0, h: 1}));\n expect(e.prepareNode({x: -10}, false)).toEqual(expect.objectContaining({x: 0, y: 0, h: 1}));\n expect(e.prepareNode({y: 10}, false)).toEqual(expect.objectContaining({x: 0, y: 10, h: 1}));\n expect(e.prepareNode({y: -10}, false)).toEqual(expect.objectContaining({x: 0, y: 0, h: 1}));\n expect(e.prepareNode({w: 3}, false)).toEqual(expect.objectContaining({x: 0, y: 0, w: 3, h: 1}));\n expect(e.prepareNode({w: 100}, false)).toEqual(expect.objectContaining({x: 0, y: 0, w: 12, h: 1}));\n expect(e.prepareNode({w: 0}, false)).toEqual(expect.objectContaining({x: 0, y: 0, h: 1}));\n expect(e.prepareNode({w: -190}, false)).toEqual(expect.objectContaining({x: 0, y: 0, h: 1}));\n expect(e.prepareNode({h: 3}, false)).toEqual(expect.objectContaining({x: 0, y: 0, h: 3}));\n expect(e.prepareNode({h: 0}, false)).toEqual(expect.objectContaining({x: 0, y: 0, h: 1}));\n expect(e.prepareNode({h: -10}, false)).toEqual(expect.objectContaining({x: 0, y: 0, h: 1}));\n expect(e.prepareNode({x: 4, w: 10}, false)).toEqual(expect.objectContaining({x: 2, y: 0, w: 10, h: 1}));\n expect(e.prepareNode({x: 4, w: 10}, true)).toEqual(expect.objectContaining({x: 4, y: 0, w: 8, h: 1}));\n });\n });\n\n describe('sorting of nodes >', () => {\n beforeAll(() => {\n ePriv = e = new GridStackEngine();\n e.nodes = [{x: 7, y: 0}, {x: 4, y: 4}, {x: 9, y: 0}, {x: 0, y: 1}];\n });\n\n it('should sort ascending with 12 columns.', () => {\n e.sortNodes(1);\n expect(e.nodes).toEqual([{x: 7, y: 0}, {x: 9, y: 0}, {x: 0, y: 1}, {x: 4, y: 4}]);\n });\n \n it('should sort descending with 12 columns.', () => {\n e.sortNodes(-1);\n expect(e.nodes).toEqual([{x: 4, y: 4}, {x: 0, y: 1}, {x: 9, y: 0}, {x: 7, y: 0}]);\n });\n \n it('should sort ascending without columns.', () => {\n ePriv.column = undefined;\n e.sortNodes(1);\n expect(e.nodes).toEqual([{x: 7, y: 0}, {x: 9, y: 0}, {x: 0, y: 1}, {x: 4, y: 4}]);\n });\n \n it('should sort descending without columns.', () => {\n ePriv.column = undefined;\n e.sortNodes(-1);\n expect(e.nodes).toEqual([{x: 4, y: 4}, {x: 0, y: 1}, {x: 9, y: 0}, {x: 7, y: 0}]);\n });\n \n });\n \n describe('test isAreaEmpty >', () => {\n\n beforeAll(() => {\n ePriv = e = new GridStackEngine({float:true});\n e.nodes = [\n e.prepareNode({x: 3, y: 2, w: 3, h: 2})\n ];\n });\n\n it('should be true', () => {\n expect(e.isAreaEmpty(0, 0, 3, 2)).toEqual(true);\n expect(e.isAreaEmpty(3, 4, 3, 2)).toEqual(true);\n });\n\n it('should be false', () => {\n expect(e.isAreaEmpty(1, 1, 3, 2)).toEqual(false);\n expect(e.isAreaEmpty(2, 3, 3, 2)).toEqual(false);\n });\n });\n\n describe('test cleanNodes/getDirtyNodes >', () => {\n\n beforeAll(() => {\n ePriv = e = new GridStackEngine({float:true});\n e.nodes = [\n e.prepareNode({x: 0, y: 0, id: '1', _dirty: true}),\n e.prepareNode({x: 3, y: 2, w: 3, h: 2, id: '2', _dirty: true}),\n e.prepareNode({x: 3, y: 7, w: 3, h: 2, id: '3'})\n ];\n });\n\n beforeEach(() => {\n delete ePriv.batchMode;\n });\n\n it('should return all dirty nodes', () => {\n let nodes = e.getDirtyNodes();\n expect(nodes.length).toEqual(2);\n expect(nodes[0].id).toEqual('1');\n expect(nodes[1].id).toEqual('2');\n });\n\n it('should\\'n clean nodes if batchMode true', () => {\n e.batchMode = true;\n e.cleanNodes();\n expect(e.getDirtyNodes().length).toBeGreaterThan(0);\n });\n\n it('should clean all dirty nodes', () => {\n e.cleanNodes();\n expect(e.getDirtyNodes().length).toEqual(0);\n });\n });\n\n describe('test batchUpdate/commit >', () => {\n beforeAll(() => {\n ePriv = e = new GridStackEngine();\n });\n\n it('should work on not float grids', () => {\n expect(e.float).toEqual(false);\n e.batchUpdate();\n e.batchUpdate(); // double for code coverage\n expect(e.batchMode).toBe(true);\n expect(e.float).toEqual(true);\n e.batchUpdate(false);\n e.batchUpdate(false);\n expect(e.batchMode).not.toBe(true);\n expect(e.float).not.toBe(true);\n });\n\n it('should work on float grids', () => {\n e.float = true;\n e.batchUpdate();\n expect(e.batchMode).toBe(true);\n expect(e.float).toEqual(true);\n e.batchUpdate(false);\n expect(e.batchMode).not.toBe(true);\n expect(e.float).toEqual(true);\n });\n });\n\n describe('test batchUpdate/commit >', () => {\n\n beforeAll(() => {\n ePriv = e = new GridStackEngine({float:true});\n });\n\n it('should work on float grids', () => {\n expect(e.float).toEqual(true);\n e.batchUpdate();\n expect(e.batchMode).toBe(true);\n expect(e.float).toEqual(true);\n e.batchUpdate(false);\n expect(e.batchMode).not.toBe(true);\n expect(e.float).toEqual(true);\n });\n });\n\n describe('test _notify >', () => {\n let spy;\n\n beforeEach(() => {\n spy = {\n callback: () => {}\n };\n vi.spyOn(spy,'callback');\n ePriv = e = new GridStackEngine({float:true, onChange: spy.callback});\n e.nodes = [\n e.prepareNode({x: 0, y: 0, id: '1', _dirty: true}),\n e.prepareNode({x: 3, y: 2, w: 3, h: 2, id: '2', _dirty: true}),\n e.prepareNode({x: 3, y: 7, w: 3, h: 2, id: '3'})\n ];\n });\n\n it('should\\'n be called if batchMode true', () => {\n e.batchMode = true;\n ePriv._notify();\n expect(spy.callback).not.toHaveBeenCalled();\n });\n\n it('should by called with dirty nodes', () => {\n ePriv._notify();\n expect(spy.callback).toHaveBeenCalledWith([e.nodes[0], e.nodes[1]]);\n });\n\n it('should by called with extra passed node to be removed', () => {\n let n1 = {id: -1};\n ePriv._notify([n1]);\n expect(spy.callback).toHaveBeenCalledWith([n1, e.nodes[0], e.nodes[1]]);\n });\n });\n\n describe('test _packNodes >', () => {\n describe('using float:false mode >', () => {\n beforeEach(() => {\n ePriv = e = new GridStackEngine({float:false});\n });\n\n it('shouldn\\'t pack one node with y coord eq 0', () => {\n e.nodes = [\n e.prepareNode({x: 0, y: 0, w:1, h:1, id: '1'}),\n ];\n ePriv._packNodes();\n expect(findNode('1')).toEqual(expect.objectContaining({x: 0, y: 0, h: 1}));\n expect(findNode('1')!._dirty).toBeFalsy();\n });\n\n it('should pack one node correctly', () => {\n e.nodes = [\n e.prepareNode({x: 0, y: 1, w:1, h:1, id: '1'}),\n ];\n ePriv._packNodes();\n expect(findNode('1')).toEqual(expect.objectContaining({x: 0, y: 0, _dirty: true}));\n });\n\n it('should pack nodes correctly', () => {\n e.nodes = [\n e.prepareNode({x: 0, y: 1, w:1, h:1, id: '1'}),\n e.prepareNode({x: 0, y: 5, w:1, h:1, id: '2'}),\n ];\n ePriv._packNodes();\n expect(findNode('1')).toEqual(expect.objectContaining({x: 0, y: 0, _dirty: true}));\n expect(findNode('2')).toEqual(expect.objectContaining({x: 0, y: 1, _dirty: true}));\n });\n \n it('should pack reverse nodes correctly', () => {\n e.nodes = [\n e.prepareNode({x: 0, y: 5, w:1, h:1, id: '1'}),\n e.prepareNode({x: 0, y: 1, w:1, h:1, id: '2'}),\n ];\n ePriv._packNodes();\n expect(findNode('2')).toEqual(expect.objectContaining({x: 0, y: 0, _dirty: true}));\n expect(findNode('1')).toEqual(expect.objectContaining({x: 0, y: 1, _dirty: true}));\n });\n \n it('should respect locked nodes', () => {\n e.nodes = [\n e.prepareNode({x: 0, y: 1, w:1, h:1, id: '1', locked: true}),\n e.prepareNode({x: 0, y: 5, w:1, h:1, id: '2'}),\n ];\n ePriv._packNodes();\n expect(findNode('1')).toEqual(expect.objectContaining({x: 0, y: 1, h: 1}));\n expect(findNode('1')!._dirty).toBeFalsy();\n expect(findNode('2')).toEqual(expect.objectContaining({x: 0, y: 2, _dirty: true}));\n });\n });\n });\n\n describe('test changedPos >', () => {\n beforeAll(() => {\n ePriv = e = new GridStackEngine();\n });\n it('should return true for changed x', () => {\n let widget = { x: 1, y: 2, w: 3, h: 4 };\n expect(e.changedPosConstrain(widget, {x:2, y:2})).toEqual(true);\n });\n it('should return true for changed y', () => {\n let widget = { x: 1, y: 2, w: 3, h: 4 };\n expect(e.changedPosConstrain(widget, {x:1, y:1})).toEqual(true);\n });\n it('should return true for changed width', () => {\n let widget = { x: 1, y: 2, w: 3, h: 4 };\n expect(e.changedPosConstrain(widget, {x:2, y:2, w:4, h:4})).toEqual(true);\n });\n it('should return true for changed height', () => {\n let widget = { x: 1, y: 2, w: 3, h: 4 };\n expect(e.changedPosConstrain(widget, {x:1, y:2, w:3, h:3})).toEqual(true);\n });\n it('should return false for unchanged position', () => {\n let widget = { x: 1, y: 2, w: 3, h: 4 };\n expect(e.changedPosConstrain(widget, {x:1, y:2, w:3, h:4})).toEqual(false);\n });\n });\n\n describe('test locked widget >', () => {\n beforeAll(() => {\n ePriv = e = new GridStackEngine();\n });\n it('should add widgets around locked one', () => {\n let nodes: GridStackNode[] = [\n {x: 0, y: 1, w: 12, h: 1, locked: true, noMove: true, noResize: true, id: '0'},\n {x: 1, y: 0, w: 2, h: 3, id: '1'}\n ];\n // add locked item\n e.addNode(nodes[0])\n expect(findNode('0')).toEqual(expect.objectContaining({x: 0, y: 1, w: 12, h: 1, locked: true}));\n // add item that moves past locked one\n e.addNode(nodes[1])\n expect(findNode('0')).toEqual(expect.objectContaining({x: 0, y: 1, w: 12, h: 1, locked: true}));\n expect(findNode('1')).toEqual(expect.objectContaining({x: 1, y: 2, h: 3}));\n // locked item can still be moved directly (what user does)\n let node0 = findNode('0');\n expect(e.moveNode(node0!, {y:6})).toEqual(true);\n expect(findNode('0')).toEqual(expect.objectContaining({x: 0, y: 6, h: 1, locked: true}));\n // but moves regular one past it\n let node1 = findNode('1');\n expect(e.moveNode(node1!, {x:6, y:6})).toEqual(true);\n expect(node1).toEqual(expect.objectContaining({x: 6, y: 7, w: 2, h: 3}));\n // but moves regular one before (gravity ON)\n e.float = false;\n expect(e.moveNode(node1!, {x:7, y:3})).toEqual(true);\n expect(node1).toEqual(expect.objectContaining({x: 7, y: 0, w: 2, h: 3}));\n // but moves regular one before (gravity OFF)\n e.float = true;\n expect(e.moveNode(node1!, {x:7, y:3})).toEqual(true);\n expect(node1).toEqual(expect.objectContaining({x: 7, y: 3, w: 2, h: 3}));\n });\n });\n \n describe('test columnChanged >', () => {\n beforeAll(() => {\n });\n it('12 to 1 and back', () => {\n ePriv = e = new GridStackEngine({ column: 12 });\n // Add two side-by-side components 6+6 = 12 columns\n const left = e.addNode({ x: 0, y: 0, w: 6, h: 1, id: 'left' });\n const right = e.addNode({ x: 6, y: 0, w: 6, h: 1, id: 'right' });\n expect(left).toEqual(expect.objectContaining({x: 0, y: 0, w: 6, h: 1}));\n expect(right).toEqual(expect.objectContaining({x: 6, y: 0, w: 6, h: 1}));\n // Resize to 1 column\n e.column = 1;\n e.columnChanged(12, 1);\n expect(left).toEqual(expect.objectContaining({x: 0, y: 0, w: 1, h: 1}));\n expect(right).toEqual(expect.objectContaining({x: 0, y: 1, w: 1, h: 1}));\n // Resize back to 12 column\n e.column = 12;\n e.columnChanged(1, 12);\n expect(left).toEqual(expect.objectContaining({x: 0, y: 0, w: 6, h: 1}));\n expect(right).toEqual(expect.objectContaining({x: 6, y: 0, w: 6, h: 1}));\n });\n it('24 column to 1 and back', () => {\n ePriv = e = new GridStackEngine({ column: 24 });\n // Add two side-by-side components 12+12 = 24 columns\n const left = e.addNode({ x: 0, y: 0, w: 12, h: 1, id: 'left' });\n const right = e.addNode({ x: 12, y: 0, w: 12, h: 1, id: 'right' });\n expect(left).toEqual(expect.objectContaining({x: 0, y: 0, w: 12, h: 1}));\n expect(right).toEqual(expect.objectContaining({x: 12, y: 0, w: 12, h: 1}));\n // Resize to 1 column\n e.column = 1;\n e.columnChanged(24, 1);\n expect(left).toEqual(expect.objectContaining({x: 0, y: 0, w: 1, h: 1}));\n expect(right).toEqual(expect.objectContaining({x: 0, y: 1, w: 1, h: 1}));\n // Resize back to 24 column\n e.column = 24;\n e.columnChanged(1, 24);\n expect(left).toEqual(expect.objectContaining({x: 0, y: 0, w: 12, h: 1}));\n expect(right).toEqual(expect.objectContaining({x: 12, y: 0, w: 12, h: 1}));\n });\n });\n\n describe('test compact >', () => {\n beforeAll(() => {\n ePriv = e = new GridStackEngine();\n });\n it('do nothing', () => {\n e.compact();\n });\n });\n\n});\n"]} \ No newline at end of file diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/gridstack-spec.d.ts b/web/skins/classic/assets/gridstack-12.3.3/dist/spec/gridstack-spec.d.ts deleted file mode 100644 index cb0ff5c3b..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/gridstack-spec.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/gridstack-spec.js b/web/skins/classic/assets/gridstack-12.3.3/dist/spec/gridstack-spec.js deleted file mode 100644 index 7d6120770..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/gridstack-spec.js +++ /dev/null @@ -1,1780 +0,0 @@ -import { GridStack } from '../src/gridstack'; -import { Utils } from '../src/utils'; -describe('gridstack >', () => { - 'use strict'; - let grid; - let grids; - let find = function (id) { - return grid.engine.nodes.find(n => n.id === id); - }; - let findEl = function (id) { - return find(id).el; - }; - // grid has 4x2 and 4x4 top-left aligned - used on most test cases - let gridHTML = '
' + - '
' + - '
item 1 text
' + - '
' + - '
' + - '
item 2 text
' + - '
' + - '
'; - let gridstackHTML = '
' + gridHTML + '
'; - let gridstackSmallHTML = '
' + gridHTML + '
'; - // empty grid - let gridstackEmptyHTML = '
' + - '
' + - '
' + - '
'; - // nested empty grids - let gridstackNestedHTML = '
' + - '
' + - '
' + - '
item 1
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
'; - // generic widget with no param - let widgetHTML = '
hello
'; - describe('grid.init() / initAll() >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('use selector >', () => { - grid = GridStack.init(undefined, '.grid-stack'); - expect(grid).not.toBe(null); - }); - it('use selector no dot >', () => { - grid = GridStack.init(null, 'grid-stack'); - expect(grid).not.toBe(null); - }); - it('use wrong selector >', () => { - grid = GridStack.init(null, 'BAD_SELECTOR_TEST'); - expect(grid).toEqual(null); - }); - it('initAll use selector >', () => { - grids = GridStack.initAll(undefined, '.grid-stack'); - expect(grids.length).toBe(1); - }); - it('initAll use selector no dot >', () => { - grids = GridStack.initAll(undefined, 'grid-stack'); - expect(grids.length).toBe(1); - }); - }); - describe('grid.setAnimation >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should add class grid-stack-animate to the container. >', () => { - grid = GridStack.init({ animate: true }); - expect(grid.el.classList.contains('grid-stack-animate')).toBe(true); - grid.el.classList.remove('grid-stack-animate'); - expect(grid.el.classList.contains('grid-stack-animate')).toBe(false); - grid.setAnimation(true); - expect(grid.el.classList.contains('grid-stack-animate')).toBe(true); - }); - it('should remove class grid-stack-animate from the container. >', () => { - grid = GridStack.init({ animate: true }); - grid.setAnimation(false); - expect(grid.el.classList.contains('grid-stack-animate')).toBe(false); - }); - }); - describe('grid._setStaticClass >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should add class grid-stack-static to the container. >', () => { - grid = GridStack.init({ staticGrid: true }); - expect(grid.el.classList.contains('grid-stack-static')).toBe(true); - grid.setStatic(false); - expect(grid.el.classList.contains('grid-stack-static')).toBe(false); - grid.setStatic(true); - expect(grid.el.classList.contains('grid-stack-static')).toBe(true); - }); - it('should remove class grid-stack-static from the container. >', () => { - grid = GridStack.init({ staticGrid: false }); - expect(grid.el.classList.contains('grid-stack-static')).toBe(false); - grid.setStatic(true); - expect(grid.el.classList.contains('grid-stack-static')).toBe(true); - }); - }); - // Note: Pixel-accurate coordinate tests moved to E2E tests - // where real browser layout engines can provide accurate getBoundingClientRect() - // describe('grid.getCellFromPixel >', () => {}); - // Note: Exact pixel calculation tests moved to E2E tests - // where real browser layout engines can provide accurate offsetWidth - // describe('grid.cellWidth >', () => {}); - describe('grid.cellHeight >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should set and get cellHeight correctly >', () => { - let cellHeight = 80; - let margin = 5; - let options = { - cellHeight, - margin, - column: 12 - }; - grid = GridStack.init(options); - let rows = parseInt(grid.el.getAttribute('gs-current-row')); - expect(grid.getRow()).toBe(rows); - expect(grid.getCellHeight()).toBe(cellHeight); - // Note: Exact pixel height calculation tests moved to E2E tests - // where real browser layout engines can provide accurate getComputedStyle() values - grid.cellHeight(grid.getCellHeight()); // should be no-op - expect(grid.getCellHeight()).toBe(cellHeight); - cellHeight = 120; // should change - grid.cellHeight(cellHeight); - expect(grid.getCellHeight()).toBe(cellHeight); - cellHeight = 20; // should change - grid.cellHeight(cellHeight); - expect(grid.getCellHeight()).toBe(cellHeight); - }); - it('should be square >', () => { - grid = GridStack.init({ cellHeight: 'auto' }); - expect(grid.cellWidth()).toBe(grid.getCellHeight()); - }); - }); - describe('grid.column >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should have no changes >', () => { - grid = GridStack.init(); - expect(grid.getColumn()).toBe(12); - grid.column(12); - expect(grid.getColumn()).toBe(12); - }); - it('should set construct CSS class >', () => { - grid = GridStack.init({ column: 1 }); - expect(grid.el.classList.contains('gs-1')).toBe(true); - grid.column(2); - expect(grid.el.classList.contains('gs-1')).toBe(false); - expect(grid.el.classList.contains('gs-2')).toBe(true); - }); - it('should set CSS class >', () => { - grid = GridStack.init(); - expect(grid.el.classList.contains('grid-stack')).toBe(true); - grid.column(1); - expect(grid.el.classList.contains('gs-1')).toBe(true); - }); - it('should SMALL change column number, no relayout >', () => { - let options = { - column: 12 - }; - grid = GridStack.init(options); - let items = Utils.getElements('.grid-stack-item'); - grid.column(9); - expect(grid.getColumn()).toBe(9); - items.forEach(el => expect(el.getAttribute('gs-y')).toBe(null)); - grid.column(12); - expect(grid.getColumn()).toBe(12); - items.forEach(el => expect(el.getAttribute('gs-y')).toBe(null)); - }); - it('no sizing, no moving >', () => { - grid = GridStack.init({ column: 12 }); - let items = Utils.getElements('.grid-stack-item'); - grid.column(8, 'none'); - expect(grid.getColumn()).toBe(8); - items.forEach(el => { - expect(parseInt(el.getAttribute('gs-w'))).toBe(4); - expect(el.getAttribute('gs-y')).toBe(null); - }); - }); - it('no sizing, but moving down >', () => { - grid = GridStack.init({ column: 12 }); - let items = Utils.getElements('.grid-stack-item'); - grid.column(7, 'move'); - expect(grid.getColumn()).toBe(7); - items.forEach(el => expect(parseInt(el.getAttribute('gs-w'))).toBe(4)); - expect(items[0].getAttribute('gs-y')).toBe(null); - expect(parseInt(items[1].getAttribute('gs-y'))).toBe(2); - }); - it('should change column number and re-layout items >', () => { - let options = { - column: 12, - float: true - }; - grid = GridStack.init(options); - let el1 = document.getElementById('item1'); - let el2 = document.getElementById('item2'); - // items start at 4x2 and 4x4 - expect(el1.getAttribute('gs-x')).toBe(null); - expect(el1.getAttribute('gs-y')).toBe(null); - expect(parseInt(el1.getAttribute('gs-w'))).toBe(4); - expect(parseInt(el1.getAttribute('gs-h'))).toBe(2); - expect(parseInt(el2.getAttribute('gs-x'))).toBe(4); - expect(el2.getAttribute('gs-y')).toBe(null); - expect(parseInt(el2.getAttribute('gs-w'))).toBe(4); - expect(parseInt(el2.getAttribute('gs-h'))).toBe(4); - // 1 column will have item1, item2 - grid.column(1); - expect(grid.getColumn()).toBe(1); - expect(el1.getAttribute('gs-x')).toBe(null); - expect(el1.getAttribute('gs-y')).toBe(null); - expect(el1.getAttribute('gs-w')).toBe(null); - expect(parseInt(el1.getAttribute('gs-h'))).toBe(2); - expect(el2.getAttribute('gs-x')).toBe(null); - expect(parseInt(el2.getAttribute('gs-y'))).toBe(2); - expect(el2.getAttribute('gs-w')).toBe(null); - expect(parseInt(el2.getAttribute('gs-h'))).toBe(4); - // add default 1x1 item to the end (1 column) - let el3 = grid.addWidget({ content: 'new' }); - expect(el3).not.toBe(null); - expect(el3.getAttribute('gs-x')).toBe(null); - expect(parseInt(el3.getAttribute('gs-y'))).toBe(6); - expect(el3.getAttribute('gs-w')).toBe(null); - expect(el3.getAttribute('gs-h')).toBe(null); - // back to 12 column and initial layout (other than new item3) - grid.column(12); - expect(grid.getColumn()).toBe(12); - expect(el1.getAttribute('gs-x')).toBe(null); - expect(el1.getAttribute('gs-y')).toBe(null); - expect(parseInt(el1.getAttribute('gs-w'))).toBe(4); - expect(parseInt(el1.getAttribute('gs-h'))).toBe(2); - expect(parseInt(el2.getAttribute('gs-x'))).toBe(4); - expect(el2.getAttribute('gs-y')).toBe(null); - expect(parseInt(el2.getAttribute('gs-w'))).toBe(4); - expect(parseInt(el2.getAttribute('gs-h'))).toBe(4); - // TODO: we don't remembers autoPlacement (cleared multiple places) - // expect(parseInt(el3.getAttribute('gs-x'))).toBe(8); - // expect(el3.getAttribute('gs-y')).toBe(null); - expect(el3.getAttribute('gs-x')).toBe(null); - expect(parseInt(el3.getAttribute('gs-y'))).toBe(6); - expect(el3.getAttribute('gs-w')).toBe(null); - expect(el3.getAttribute('gs-h')).toBe(null); - // back to 1 column - grid.column(1); - expect(grid.getColumn()).toBe(1); - expect(el1.getAttribute('gs-x')).toBe(null); - expect(el1.getAttribute('gs-y')).toBe(null); - expect(el1.getAttribute('gs-w')).toBe(null); - expect(parseInt(el1.getAttribute('gs-h'))).toBe(2); - expect(el2.getAttribute('gs-x')).toBe(null); - expect(parseInt(el2.getAttribute('gs-y'))).toBe(2); - expect(el2.getAttribute('gs-w')).toBe(null); - expect(parseInt(el2.getAttribute('gs-h'))).toBe(4); - expect(el3.getAttribute('gs-x')).toBe(null); - expect(parseInt(el3.getAttribute('gs-y'))).toBe(6); - expect(el3.getAttribute('gs-w')).toBe(null); - expect(el3.getAttribute('gs-h')).toBe(null); - // move item2 to beginning to [3][1][2] vertically - grid.update(el3, { x: 0, y: 0 }); - expect(el3.getAttribute('gs-x')).toBe(null); - expect(el3.getAttribute('gs-y')).toBe(null); - expect(el3.getAttribute('gs-w')).toBe(null); - expect(el3.getAttribute('gs-h')).toBe(null); - expect(el1.getAttribute('gs-x')).toBe(null); - expect(parseInt(el1.getAttribute('gs-y'))).toBe(1); - expect(el1.getAttribute('gs-w')).toBe(null); - expect(parseInt(el1.getAttribute('gs-h'))).toBe(2); - expect(el2.getAttribute('gs-x')).toBe(null); - expect(parseInt(el2.getAttribute('gs-y'))).toBe(3); - expect(el2.getAttribute('gs-w')).toBe(null); - expect(parseInt(el2.getAttribute('gs-h'))).toBe(4); - // back to 12 column, el3 to be beginning still, but [1][2] to be in 1 columns still but wide 4x2 and 4x still - grid.column(12); - expect(grid.getColumn()).toBe(12); - expect(el3.getAttribute('gs-x')).toBe(null); // 8 TEST WHY - expect(el3.getAttribute('gs-y')).toBe(null); - expect(el3.getAttribute('gs-w')).toBe(null); - expect(el3.getAttribute('gs-h')).toBe(null); - expect(el1.getAttribute('gs-x')).toBe(null); - expect(parseInt(el1.getAttribute('gs-y'))).toBe(1); - expect(parseInt(el1.getAttribute('gs-w'))).toBe(4); - expect(parseInt(el1.getAttribute('gs-h'))).toBe(2); - expect(parseInt(el2.getAttribute('gs-x'))).toBe(4); - expect(parseInt(el2.getAttribute('gs-y'))).toBe(1); - expect(parseInt(el2.getAttribute('gs-w'))).toBe(4); - expect(parseInt(el2.getAttribute('gs-h'))).toBe(4); - // 2 column will have item1, item2, item3 in 1 column still but half the width - grid.column(1); // test convert from small, should use 12 layout still - grid.column(2); - expect(grid.getColumn()).toBe(2); - expect(el3.getAttribute('gs-x')).toBe(null); // 1 TEST WHY - expect(el3.getAttribute('gs-y')).toBe(null); - expect(el3.getAttribute('gs-w')).toBe(null); // 1 as we scaled from 12 columns - expect(el3.getAttribute('gs-h')).toBe(null); - expect(el1.getAttribute('gs-x')).toBe(null); - expect(parseInt(el1.getAttribute('gs-y'))).toBe(1); - expect(el1.getAttribute('gs-w')).toBe(null); - expect(parseInt(el1.getAttribute('gs-h'))).toBe(2); - expect(parseInt(el2.getAttribute('gs-x'))).toBe(1); - expect(parseInt(el2.getAttribute('gs-y'))).toBe(1); - expect(el2.getAttribute('gs-w')).toBe(null); - expect(parseInt(el2.getAttribute('gs-h'))).toBe(4); - }); - }); - describe('grid.column larger layout >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackEmptyHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('24 layout in 12 column to 1 back 12 then 24 >', () => { - const children = [{ x: 0, y: 0, w: 12, h: 1, id: 'left' }, { x: 12, y: 0, w: 12, h: 1, id: 'right' }]; - children.forEach(c => c.content = c.id); - grid = GridStack.init({ children }); - const left = find('left'); - const right = find('right'); - // side-by-side components 12+12 = 24 columns but only have 12! - expect(left).toEqual(expect.objectContaining({ x: 0, y: 0, w: 12 })); - expect(right).toEqual(expect.objectContaining({ x: 0, y: 1, w: 12 })); - // Resize to 1 column - grid.column(1); - expect(left).toEqual(expect.objectContaining({ x: 0, y: 0, w: 1 })); - expect(right).toEqual(expect.objectContaining({ x: 0, y: 1, w: 1 })); - // Resize back to 12 column - grid.column(12); - expect(left).toEqual(expect.objectContaining({ x: 0, y: 0, w: 12 })); - expect(right).toEqual(expect.objectContaining({ x: 0, y: 1, w: 12 })); - // Resize to 24 column - grid.column(24); - expect(left).toEqual(expect.objectContaining({ x: 0, y: 0, w: 12 })); - expect(right).toEqual(expect.objectContaining({ x: 12, y: 0, w: 12 })); - }); - it('24 column to 12, 1 back 12,24 >', () => { - const children = [{ x: 0, y: 0, w: 12, h: 1, id: 'left' }, { x: 12, y: 0, w: 12, h: 1, id: 'right' }]; - children.forEach(c => c.content = c.id); - grid = GridStack.init({ column: 24, children }); - const left = find('left'); - const right = find('right'); - // side-by-side components 12+12 = 24 columns - expect(left).toEqual(expect.objectContaining({ x: 0, y: 0, w: 12 })); - expect(right).toEqual(expect.objectContaining({ x: 12, y: 0, w: 12 })); - // Resize to 12 column - grid.column(12); - expect(left).toEqual(expect.objectContaining({ x: 0, y: 0, w: 6 })); - expect(right).toEqual(expect.objectContaining({ x: 6, y: 0, w: 6 })); - // Resize to 1 column - grid.column(1); - expect(left).toEqual(expect.objectContaining({ x: 0, y: 0, w: 1 })); - expect(right).toEqual(expect.objectContaining({ x: 0, y: 1, w: 1 })); - // back to 12 column - grid.column(12); - expect(left).toEqual(expect.objectContaining({ x: 0, y: 0, w: 6 })); - expect(right).toEqual(expect.objectContaining({ x: 6, y: 0, w: 6 })); - // back to 24 column - grid.column(24); - expect(left).toEqual(expect.objectContaining({ x: 0, y: 0, w: 12 })); - expect(right).toEqual(expect.objectContaining({ x: 12, y: 0, w: 12 })); - }); - }); - // describe('oneColumnModeDomSort >', () => { - // beforeEach(() => { - // document.body.insertAdjacentHTML('afterbegin', gridstackEmptyHTML); - // }); - // afterEach(() => { - // document.body.removeChild(document.getElementById('gs-cont')); - // }); - // it('should support default going to 1 column >', () => { - // let options = { - // column: 12, - // float: true - // }; - // grid = GridStack.init(options); - // grid.batchUpdate(); - // grid.batchUpdate(); - // let el1 = grid.addWidget({w:1, h:1}); - // let el2 = grid.addWidget({x:2, y:0, w:2, h:1}); - // let el3 = grid.addWidget({x:1, y:0, w:1, h:2}); - // grid.batchUpdate(false); - // grid.batchUpdate(false); - // // items are item1[1x1], item3[1x1], item2[2x1] - // expect(el1.getAttribute('gs-x')).toBe(null); - // expect(el1.getAttribute('gs-y')).toBe(null); - // expect(el1.getAttribute('gs-w')).toBe(null); - // expect(el1.getAttribute('gs-h')).toBe(null); - // expect(parseInt(el3.getAttribute('gs-x'))).toBe(1); - // expect(el3.getAttribute('gs-y')).toBe(null); - // expect(el3.getAttribute('gs-w')).toBe(null); - // expect(parseInt(el3.getAttribute('gs-h'))).toBe(2); - // expect(parseInt(el2.getAttribute('gs-x'))).toBe(2); - // expect(el2.getAttribute('gs-y')).toBe(null); - // expect(parseInt(el2.getAttribute('gs-w'))).toBe(2); - // expect(el2.getAttribute('gs-h')).toBe(null); - // // items are item1[1x1], item3[1x2], item2[1x1] in 1 column - // grid.column(1); - // expect(el1.getAttribute('gs-x')).toBe(null); - // expect(el1.getAttribute('gs-y')).toBe(null); - // expect(el1.getAttribute('gs-w')).toBe(null); - // expect(el1.getAttribute('gs-h')).toBe(null); - // expect(el3.getAttribute('gs-x')).toBe(null); - // expect(parseInt(el3.getAttribute('gs-y'))).toBe(1); - // expect(el3.getAttribute('gs-w')).toBe(null); - // expect(parseInt(el3.getAttribute('gs-h'))).toBe(2); - // expect(el2.getAttribute('gs-x')).toBe(null); - // expect(parseInt(el2.getAttribute('gs-y'))).toBe(3); - // expect(el2.getAttribute('gs-w')).toBe(null); - // expect(el2.getAttribute('gs-h')).toBe(null); - // }); - // it('should support oneColumnModeDomSort ON going to 1 column >', () => { - // let options = { - // column: 12, - // oneColumnModeDomSort: true, - // float: true - // }; - // grid = GridStack.init(options); - // let el1 = grid.addWidget({w:1, h:1}); - // let el2 = grid.addWidget({x:2, y:0, w:2, h:1}); - // let el3 = grid.addWidget({x:1, y:0, w:1, h:2}); - // // items are item1[1x1], item3[1x1], item2[2x1] - // expect(el1.getAttribute('gs-x')).toBe(null); - // expect(el1.getAttribute('gs-y')).toBe(null); - // expect(el1.getAttribute('gs-w')).toBe(null); - // expect(el1.getAttribute('gs-h')).toBe(null); - // expect(parseInt(el3.getAttribute('gs-x'))).toBe(1); - // expect(el3.getAttribute('gs-y')).toBe(null); - // expect(el3.getAttribute('gs-w')).toBe(null); - // expect(parseInt(el3.getAttribute('gs-h'))).toBe(2); - // expect(parseInt(el2.getAttribute('gs-x'))).toBe(2); - // expect(el2.getAttribute('gs-y')).toBe(null); - // expect(parseInt(el2.getAttribute('gs-w'))).toBe(2); - // expect(el2.getAttribute('gs-h')).toBe(null); - // // items are item1[1x1], item2[1x1], item3[1x2] in 1 column dom ordered - // grid.column(1); - // expect(el1.getAttribute('gs-x')).toBe(null); - // expect(el1.getAttribute('gs-y')).toBe(null); - // expect(el1.getAttribute('gs-w')).toBe(null); - // expect(el1.getAttribute('gs-h')).toBe(null); - // expect(el2.getAttribute('gs-x')).toBe(null); - // expect(parseInt(el2.getAttribute('gs-y'))).toBe(1); - // expect(el2.getAttribute('gs-w')).toBe(null); - // expect(el2.getAttribute('gs-h')).toBe(null); - // expect(el3.getAttribute('gs-x')).toBe(null); - // expect(parseInt(el3.getAttribute('gs-y'))).toBe(2); - // expect(el3.getAttribute('gs-w')).toBe(null); - // expect(parseInt(el3.getAttribute('gs-h'))).toBe(2); - // }); - // }); - // describe('disableOneColumnMode >', () => { - // beforeEach(() => { - // document.body.insertAdjacentHTML('afterbegin', gridstackSmallHTML); // smaller default to 1 column - // }); - // afterEach(() => { - // document.body.removeChild(document.getElementById('gs-cont')); - // }); - // it('should go to 1 column >', () => { - // grid = GridStack.init(); - // expect(grid.getColumn()).toBe(1); - // }); - // it('should go to 1 column with large minW >', () => { - // grid = GridStack.init({oneColumnSize: 1000}); - // expect(grid.getColumn()).toBe(1); - // }); - // it('should stay at 12 with minW >', () => { - // grid = GridStack.init({oneColumnSize: 300}); - // expect(grid.getColumn()).toBe(12); - // }); - // it('should stay at 12 column >', () => { - // grid = GridStack.init({disableOneColumnMode: true}); - // expect(grid.getColumn()).toBe(12); - // }); - // }); - describe('grid.minRow >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should default to row 0 when empty >', () => { - let options = {}; - grid = GridStack.init(options); - expect(grid.getRow()).toBe(4); - expect(grid.opts.minRow).toBe(0); - expect(grid.opts.maxRow).toBe(0); - grid.removeAll(); - expect(grid.getRow()).toBe(0); - }); - it('should default to row 2 when empty >', () => { - let options = { minRow: 2 }; - grid = GridStack.init(options); - expect(grid.getRow()).toBe(4); - expect(grid.opts.minRow).toBe(2); - expect(grid.opts.maxRow).toBe(0); - grid.removeAll(); - expect(grid.engine.getRow()).toBe(0); - expect(grid.getRow()).toBe(2); - }); - it('should set min = max = 3 rows >', () => { - let options = { row: 3 }; - grid = GridStack.init(options); - expect(grid.getRow()).toBe(3); // shrink elements to fit maxRow! - expect(grid.opts.minRow).toBe(3); - expect(grid.opts.maxRow).toBe(3); - grid.removeAll(); - expect(grid.engine.getRow()).toBe(0); - expect(grid.getRow()).toBe(3); - }); - it('willItFit() >', () => { - // default 4x2 and 4x4 so anything pushing more than 1 will fail - grid = GridStack.init({ maxRow: 5 }); - expect(grid.willItFit({ x: 0, y: 0, w: 1, h: 1 })).toBe(true); - expect(grid.willItFit({ x: 0, y: 0, w: 1, h: 3 })).toBe(true); - expect(grid.willItFit({ x: 0, y: 0, w: 1, h: 4 })).toBe(false); - expect(grid.willItFit({ x: 0, y: 0, w: 12, h: 1 })).toBe(true); - expect(grid.willItFit({ x: 0, y: 0, w: 12, h: 2 })).toBe(false); - }); - it('willItFit() not modifying node #1687 >', () => { - // default 4x2 and 4x4 so anything pushing more than 1 will fail - grid = GridStack.init({ maxRow: 5 }); - let node = { x: 0, y: 0, w: 1, h: 1, _id: 1, _temporaryRemoved: true }; - expect(grid.willItFit(node)).toBe(true); - expect(node._temporaryRemoved).toBe(true); - expect(node._id).toBe(1); - }); - }); - describe('grid attributes >', () => { - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should have row attr >', () => { - let HTML = '
' + - '
' + // old attr current-height - '
'; - document.body.insertAdjacentHTML('afterbegin', HTML); - grid = GridStack.init(); - expect(grid.getRow()).toBe(4); - expect(grid.opts.minRow).toBe(4); - expect(grid.opts.maxRow).toBe(4); - grid.addWidget({ h: 6 }); - expect(grid.engine.getRow()).toBe(4); - expect(grid.getRow()).toBe(4); - }); - }); - describe('grid.min/max width/height >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should set gs-min-w to 2. >', () => { - grid = GridStack.init(); - let items = Utils.getElements('.grid-stack-item'); - items.forEach(el => grid.update(el, { minW: 2, maxW: 3, minH: 4, maxH: 5 })); - items.forEach(el => { - expect(el.gridstackNode.minW).toBe(2); - expect(el.gridstackNode.maxW).toBe(3); - expect(el.gridstackNode.minH).toBe(4); - expect(el.gridstackNode.maxH).toBe(5); - expect(el.getAttribute('gs-min-w')).toBe(null); - expect(el.getAttribute('gs-max-w')).toBe(null); - expect(el.getAttribute('gs-min-h')).toBe(null); - expect(el.getAttribute('gs-max-h')).toBe(null); - }); - // remove all constrain - grid.update('grid-stack-item', { minW: 0, maxW: null, minH: undefined, maxH: 0 }); - items.forEach(el => { - expect(el.gridstackNode.minW).toBe(undefined); - expect(el.gridstackNode.maxW).toBe(undefined); - expect(el.gridstackNode.minH).toBe(undefined); - expect(el.gridstackNode.maxH).toBe(undefined); - expect(el.getAttribute('gs-min-w')).toBe(null); - expect(el.getAttribute('gs-max-w')).toBe(null); - expect(el.getAttribute('gs-min-h')).toBe(null); - expect(el.getAttribute('gs-max-h')).toBe(null); - }); - }); - }); - describe('grid.isAreaEmpty >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should set return false. >', () => { - let options = { - cellHeight: 80, - margin: 5 - }; - grid = GridStack.init(options); - let shouldBeFalse = grid.isAreaEmpty(1, 1, 1, 1); - expect(shouldBeFalse).toBe(false); - }); - it('should set return true. >', () => { - let options = { - cellHeight: 80, - margin: 5 - }; - grid = GridStack.init(options); - let shouldBeTrue = grid.isAreaEmpty(5, 5, 1, 1); - expect(shouldBeTrue).toBe(true); - }); - }); - describe('grid.removeAll >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should remove all children by default >', () => { - grid = GridStack.init(); - grid.removeAll(); - expect(grid.engine.nodes).toEqual([]); - expect(document.getElementById('item1')).toBe(null); - }); - it('should remove all children >', () => { - grid = GridStack.init(); - grid.removeAll(true); - expect(grid.engine.nodes).toEqual([]); - expect(document.getElementById('item1')).toBe(null); - }); - it('should remove gridstack part, leave DOM behind >', () => { - grid = GridStack.init(); - grid.removeAll(false); - expect(grid.engine.nodes).toEqual([]); - expect(document.getElementById('item1')).not.toBe(null); - }); - }); - describe('grid.removeWidget >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should remove first item (default), then second (false) >', () => { - grid = GridStack.init(); - expect(grid.engine.nodes.length).toEqual(2); - let el1 = document.getElementById('item1'); - expect(el1).not.toBe(null); - grid.removeWidget(el1); - expect(grid.engine.nodes.length).toEqual(1); - expect(document.getElementById('item1')).toBe(null); - expect(document.getElementById('item2')).not.toBe(null); - let el2 = document.getElementById('item2'); - grid.removeWidget(el2, false); - expect(grid.engine.nodes.length).toEqual(0); - expect(document.getElementById('item2')).not.toBe(null); - }); - }); - describe('grid method _packNodes with float >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should allow same x, y coordinates for widgets. >', () => { - let options = { - cellHeight: 80, - margin: 5, - float: true - }; - grid = GridStack.init(options); - let items = Utils.getElements('.grid-stack-item'); - items.forEach(oldEl => { - let el = grid.makeWidget(oldEl); - expect(oldEl.getAttribute('gs-x')).toBe(el.getAttribute('gs-x')); - expect(oldEl.getAttribute('gs-y')).toBe(el.getAttribute('gs-y')); - }); - }); - it('should not allow same x, y coordinates for widgets. >', () => { - let options = { - cellHeight: 80, - margin: 5 - }; - grid = GridStack.init(options); - let items = Utils.getElements('.grid-stack-item'); - items.forEach(oldEl => { - let el = oldEl.cloneNode(true); - el = grid.makeWidget(el); - expect(el.gridstackNode?.x).not.toBe(oldEl.gridstackNode?.x); - }); - }); - }); - describe('grid method addWidget with all parameters >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should keep all widget options the same (autoPosition off >', () => { - grid = GridStack.init({ float: true }); - ; - let w = grid.addWidget({ x: 6, y: 7, w: 2, h: 3, autoPosition: false, - minW: 1, maxW: 4, minH: 2, maxH: 5, id: 'coolWidget' }); - expect(parseInt(w.getAttribute('gs-x'))).toBe(6); - expect(parseInt(w.getAttribute('gs-y'))).toBe(7); - expect(parseInt(w.getAttribute('gs-w'))).toBe(2); - expect(parseInt(w.getAttribute('gs-h'))).toBe(3); - expect(w.getAttribute('gs-auto-position')).toBe(null); - expect(w.getAttribute('gs-id')).toBe('coolWidget'); - // should move widget to top with float=false - expect(grid.getFloat()).toBe(true); - grid.float(false); - expect(grid.getFloat()).toBe(false); - expect(parseInt(w.getAttribute('gs-x'))).toBe(6); - expect(parseInt(w.getAttribute('gs-y'))).toBe(4); // <--- from 7 to 4 below second original widget - expect(parseInt(w.getAttribute('gs-w'))).toBe(2); - expect(parseInt(w.getAttribute('gs-h'))).toBe(3); - expect(w.getAttribute('gs-auto-position')).toBe(null); - expect(w.getAttribute('gs-id')).toBe('coolWidget'); - // should not move again (no-op) - grid.float(true); - expect(grid.getFloat()).toBe(true); - expect(parseInt(w.getAttribute('gs-x'))).toBe(6); - expect(parseInt(w.getAttribute('gs-y'))).toBe(4); - expect(parseInt(w.getAttribute('gs-w'))).toBe(2); - expect(parseInt(w.getAttribute('gs-h'))).toBe(3); - expect(w.getAttribute('gs-auto-position')).toBe(null); - expect(w.getAttribute('gs-id')).toBe('coolWidget'); - }); - }); - describe('grid method addWidget with autoPosition true >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should change x, y coordinates for widgets. >', () => { - grid = GridStack.init({ float: true }); - let w = grid.addWidget({ x: 9, y: 7, w: 2, h: 3, autoPosition: true }); - expect(parseInt(w.getAttribute('gs-x'), 10)).not.toBe(9); - expect(parseInt(w.getAttribute('gs-y'), 10)).not.toBe(7); - }); - }); - describe('grid method addWidget with widget options >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should autoPosition (missing X,Y) >', () => { - grid = GridStack.init(); - let w = grid.addWidget({ h: 2, id: 'optionWidget' }); - expect(parseInt(w.getAttribute('gs-x'))).toBe(8); - expect(w.getAttribute('gs-y')).toBe(null); - expect(w.getAttribute('gs-w')).toBe(null); - expect(parseInt(w.getAttribute('gs-h'))).toBe(2); - // expect(w.getAttribute('gs-auto-position')).toBe('true'); - expect(w.getAttribute('gs-id')).toBe('optionWidget'); - }); - it('should autoPosition (missing X) >', () => { - grid = GridStack.init(); - let w = grid.addWidget({ y: 9, h: 2, id: 'optionWidget' }); - expect(parseInt(w.getAttribute('gs-x'))).toBe(8); - expect(w.getAttribute('gs-y')).toBe(null); - expect(w.getAttribute('gs-w')).toBe(null); - expect(parseInt(w.getAttribute('gs-h'))).toBe(2); - // expect(w.getAttribute('gs-auto-position')).toBe('true'); - expect(w.getAttribute('gs-id')).toBe('optionWidget'); - }); - it('should autoPosition (missing Y) >', () => { - grid = GridStack.init(); - let w = grid.addWidget({ x: 9, h: 2, id: 'optionWidget' }); - expect(parseInt(w.getAttribute('gs-x'))).toBe(8); - expect(w.getAttribute('gs-y')).toBe(null); - expect(w.getAttribute('gs-w')).toBe(null); - expect(parseInt(w.getAttribute('gs-h'))).toBe(2); - // expect(w.getAttribute('gs-auto-position')).toBe('true'); - expect(w.getAttribute('gs-id')).toBe('optionWidget'); - }); - it('should autoPosition (correct X, missing Y) >', () => { - grid = GridStack.init(); - let w = grid.addWidget({ x: 8, h: 2, id: 'optionWidget' }); - expect(parseInt(w.getAttribute('gs-x'))).toBe(8); - expect(w.getAttribute('gs-y')).toBe(null); - expect(w.getAttribute('gs-w')).toBe(null); - expect(parseInt(w.getAttribute('gs-h'))).toBe(2); - // expect(w.getAttribute('gs-auto-position')).toBe('true'); - expect(w.getAttribute('gs-id')).toBe('optionWidget'); - }); - it('should autoPosition (empty options) >', () => { - grid = GridStack.init(); - let w = grid.addWidget({}); - expect(parseInt(w.getAttribute('gs-x'))).toBe(8); - expect(w.getAttribute('gs-y')).toBe(null); - expect(w.getAttribute('gs-w')).toBe(null); - expect(w.getAttribute('gs-h')).toBe(null); - // expect(w.getAttribute('gs-auto-position')).toBe('true'); - }); - }); - describe('addWidget() >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('bad string options should use default >', () => { - grid = GridStack.init(); - let w = grid.addWidget({ x: 'foo', y: null, w: 'bar', h: '' }); - expect(parseInt(w.getAttribute('gs-x'))).toBe(8); - expect(w.getAttribute('gs-y')).toBe(null); - expect(w.getAttribute('gs-w')).toBe(null); - expect(w.getAttribute('gs-h')).toBe(null); - }); - it('makeWidget attr should be retained >', () => { - grid = GridStack.init({ float: true }); - const d = document.createElement('div'); - d.innerHTML = '
foo content
'; - grid.el.appendChild(d.firstChild); - let w = grid.makeWidget('foo'); - expect(parseInt(w.getAttribute('gs-x'))).toBe(8); - expect(w.getAttribute('gs-y')).toBe(null); - expect(parseInt(w.getAttribute('gs-w'))).toBe(3); - expect(w.gridstackNode.maxW).toBe(4); - expect(w.getAttribute('gs-h')).toBe(null); - expect(w.getAttribute('gs-id')).toBe('gsfoo'); - }); - it('makeWidget width option override >', () => { - grid = GridStack.init({ float: true }); - const d = document.createElement('div'); - d.innerHTML = '
foo content
'; - grid.el.appendChild(d.firstChild); - let w = grid.makeWidget('foo', { x: null, y: null, w: 2 }); - expect(parseInt(w.getAttribute('gs-x'))).toBe(8); - expect(w.getAttribute('gs-y')).toBe(null); - expect(parseInt(w.getAttribute('gs-w'))).toBe(2); - expect(w.getAttribute('gs-h')).toBe(null); - }); - }); - describe('makeWidget() >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackEmptyHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('passing element >', () => { - grid = GridStack.init(); - let doc = document.implementation.createHTMLDocument(); - doc.body.innerHTML = '
'; - let el = doc.body.children[0]; - grid.el.appendChild(el); - let w = grid.makeWidget(el); - expect(w.getAttribute('gs-x')).toBe(null); - }); - it('passing element float=true >', () => { - grid = GridStack.init({ float: true }); - let doc = document.implementation.createHTMLDocument(); - doc.body.innerHTML = '
'; - let el = doc.body.children[0]; - grid.el.appendChild(el); - let w = grid.makeWidget(el); - expect(w.getAttribute('gs-x')).toBe(null); - }); - it('passing class >', () => { - grid = GridStack.init(); - let doc = document.implementation.createHTMLDocument(); - doc.body.innerHTML = '
'; - let el = doc.body.children[0]; - grid.el.appendChild(el); - let w = grid.makeWidget('.item'); - expect(w.getAttribute('gs-x')).toBe(null); - }); - it('passing class no dot >', () => { - grid = GridStack.init(); - let doc = document.implementation.createHTMLDocument(); - doc.body.innerHTML = '
'; - let el = doc.body.children[0]; - grid.el.appendChild(el); - let w = grid.makeWidget('item'); - expect(w.getAttribute('gs-x')).toBe(null); - }); - it('passing id >', () => { - grid = GridStack.init(); - let doc = document.implementation.createHTMLDocument(); - doc.body.innerHTML = '
'; - let el = doc.body.children[0]; - grid.el.appendChild(el); - let w = grid.makeWidget('#item'); - expect(w.getAttribute('gs-x')).toBe(null); - }); - it('passing id no # >', () => { - grid = GridStack.init(); - let doc = document.implementation.createHTMLDocument(); - doc.body.innerHTML = '
'; - let el = doc.body.children[0]; - grid.el.appendChild(el); - let w = grid.makeWidget('item'); - expect(w.getAttribute('gs-x')).toBe(null); - }); - it('passing id as number >', () => { - grid = GridStack.init(); - let doc = document.implementation.createHTMLDocument(); - doc.body.innerHTML = '
'; - let el = doc.body.children[0]; - grid.el.appendChild(el); - let w = grid.makeWidget('1'); - expect(w.getAttribute('gs-x')).toBe(null); - }); - }); - describe('method getFloat() >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should match true/false only >', () => { - grid = GridStack.init({ float: true }); - expect(grid.getFloat()).toBe(true); - grid.float(0); - expect(grid.getFloat()).toBe(false); - grid.float(null); - expect(grid.getFloat()).toBe(false); - grid.float(undefined); - expect(grid.getFloat()).toBe(false); - grid.float(false); - expect(grid.getFloat()).toBe(false); - }); - }); - describe('grid.destroy >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.getElementById('gs-cont').remove(); - }); - it('should cleanup gridstack >', () => { - let options = { - cellHeight: 80, - margin: 5 - }; - grid = GridStack.init(options); - let gridEl = grid.el; - grid.destroy(); - expect(gridEl.parentElement).toBe(null); - expect(grid.el).toBe(undefined); - expect(grid.engine).toBe(undefined); - }); - it('should cleanup gridstack but leave elements >', () => { - let options = { - cellHeight: 80, - margin: 5 - }; - grid = GridStack.init(options); - let gridEl = grid.el; - grid.destroy(false); - expect(gridEl.parentElement).not.toBe(null); - expect(Utils.getElements('.grid-stack-item').length).toBe(2); - expect(grid.el).toBe(undefined); - expect(grid.engine).toBe(undefined); - grid.destroy(); // sanity check for call twice! - }); - }); - describe('grid.resize >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should resize widget >', () => { - let options = { - cellHeight: 80, - margin: 5 - }; - grid = GridStack.init(options); - let items = Utils.getElements('.grid-stack-item'); - grid.update(items[0], { w: 5, h: 5 }); - expect(parseInt(items[0].getAttribute('gs-w'))).toBe(5); - expect(parseInt(items[0].getAttribute('gs-h'))).toBe(5); - }); - }); - describe('grid.move >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should move widget >', () => { - let options = { - cellHeight: 80, - margin: 5, - float: true - }; - grid = GridStack.init(options); - let items = Utils.getElements('.grid-stack-item'); - grid.update(items[0], { x: 5, y: 5 }); - expect(parseInt(items[0].getAttribute('gs-x'))).toBe(5); - expect(parseInt(items[0].getAttribute('gs-y'))).toBe(5); - }); - }); - describe('grid.update >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should move and resize widget >', () => { - grid = GridStack.init({ float: true }); - let el = Utils.getElements('.grid-stack-item')[1]; - expect(parseInt(el.getAttribute('gs-w'))).toBe(4); - grid.update(el, { x: 5, y: 4, h: 2 }); - expect(parseInt(el.getAttribute('gs-x'))).toBe(5); - expect(parseInt(el.getAttribute('gs-y'))).toBe(4); - expect(parseInt(el.getAttribute('gs-w'))).toBe(4); - expect(parseInt(el.getAttribute('gs-h'))).toBe(2); - }); - it('should change noMove >', () => { - grid = GridStack.init({ float: true }); - let items = Utils.getElements('.grid-stack-item'); - let el = items[1]; - let dd = GridStack.getDD(); - grid.update(el, { noMove: true, noResize: false }); - expect(el.getAttribute('gs-no-move')).toBe('true'); - expect(el.getAttribute('gs-no-resize')).toBe(null); // false is no-op - expect(dd.isResizable(el)).toBe(true); - expect(dd.isDraggable(el)).toBe(false); - expect(dd.isResizable(items[0])).toBe(true); - expect(dd.isDraggable(items[0])).toBe(true); - expect(parseInt(el.getAttribute('gs-x'))).toBe(4); - expect(el.getAttribute('gs-y')).toBe(null); - expect(parseInt(el.getAttribute('gs-w'))).toBe(4); - expect(parseInt(el.getAttribute('gs-h'))).toBe(4); - }); - it('should change content and id, and move >', () => { - grid = GridStack.init({ float: true }); - let el = findEl('gsItem2'); - let sub = el.querySelector('.grid-stack-item-content'); - grid.update(el, { id: 'newID', y: 1, content: 'new content' }); - expect(el.gridstackNode.id).toBe('newID'); - expect(el.getAttribute('gs-id')).toBe('newID'); - expect(sub.innerHTML).toBe('new content'); - expect(parseInt(el.getAttribute('gs-x'))).toBe(4); - expect(parseInt(el.getAttribute('gs-y'))).toBe(1); - expect(parseInt(el.getAttribute('gs-w'))).toBe(4); - expect(parseInt(el.getAttribute('gs-h'))).toBe(4); - }); - it('should change max and constrain a wanted resize >', () => { - grid = GridStack.init({ float: true }); - let el = findEl('gsItem2'); - expect(el.getAttribute('gs-max-w')).toBe(null); - grid.update(el, { maxW: 2, w: 5 }); - expect(parseInt(el.getAttribute('gs-x'))).toBe(4); - expect(el.getAttribute('gs-y')).toBe(null); - expect(parseInt(el.getAttribute('gs-w'))).toBe(2); - expect(parseInt(el.getAttribute('gs-h'))).toBe(4); - expect(el.gridstackNode.maxW).toBe(2); - }); - it('should change max and constrain existing >', () => { - grid = GridStack.init({ float: true }); - let el = findEl('gsItem2'); - expect(el.getAttribute('gs-max-w')).toBe(null); - grid.update(el, { maxW: 2 }); - expect(parseInt(el.getAttribute('gs-x'))).toBe(4); - expect(el.getAttribute('gs-y')).toBe(null); - expect(parseInt(el.getAttribute('gs-w'))).toBe(2); - expect(parseInt(el.getAttribute('gs-h'))).toBe(4); - expect(el.gridstackNode.maxW).toBe(2); - }); - it('should change all max and move, no inf loop! >', () => { - grid = GridStack.init({ float: true }); - let items = Utils.getElements('.grid-stack-item'); - items.forEach(item => { - expect(item.getAttribute('gs-max-w')).toBe(null); - expect(item.getAttribute('gs-max-h')).toBe(null); - }); - grid.update('.grid-stack-item', { maxW: 2, maxH: 2 }); - expect(items[0].getAttribute('gs-x')).toBe(null); - expect(parseInt(items[1].getAttribute('gs-x'))).toBe(4); - items.forEach((item) => { - expect(item.getAttribute('gs-y')).toBe(null); - expect(parseInt(item.getAttribute('gs-h'))).toBe(2); - expect(parseInt(item.getAttribute('gs-w'))).toBe(2); - expect(item.gridstackNode.maxW).toBe(2); - expect(item.gridstackNode.maxH).toBe(2); - }); - }); - }); - describe('grid.margin >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should return margin >', () => { - let options = { - cellHeight: 80, - margin: 12 - }; - grid = GridStack.init(options); - expect(grid.getMargin()).toBe(12); - }); - it('should return update margin >', () => { - let options = { - cellHeight: 80, - margin: 5 - }; - grid = GridStack.init(options); - grid.margin('11rem'); - expect(grid.getMargin()).toBe(11); - }); - it('should change unit >', () => { - let options = { - cellHeight: 80, - margin: 10, - }; - grid = GridStack.init(options); - expect(grid.getMargin()).toBe(10); - grid.margin('10rem'); - expect(grid.getMargin()).toBe(10); - }); - it('should not update css vars, with same value >', () => { - let options = { - cellHeight: 80, - margin: 5 - }; - let grid = GridStack.init(options); - expect(grid.getMargin()).toBe(5); - vi.spyOn(grid, '_initMargin'); - grid.margin('5px'); - expect(grid._initMargin).not.toHaveBeenCalled(); - expect(grid.getMargin()).toBe(5); - }); - it('should set top/bot/left value directly >', () => { - let options = { - cellHeight: 80, - marginTop: 5, - marginBottom: 0, - marginLeft: 1, - }; - let grid = GridStack.init(options); - expect(grid.getMargin()).toBe(undefined); - expect(grid.opts.marginTop).toBe(5); - expect(grid.opts.marginBottom).toBe(0); - expect(grid.opts.marginLeft).toBe(1); - expect(grid.opts.marginRight).toBe(10); // default value - }); - it('should set all 4 sides, and overall margin >', () => { - let options = { - cellHeight: 80, - marginTop: 5, - marginBottom: 5, - marginLeft: 5, - marginRight: 5, - }; - let grid = GridStack.init(options); - expect(grid.getMargin()).toBe(5); - expect(grid.opts.marginTop).toBe(5); - expect(grid.opts.marginBottom).toBe(5); - expect(grid.opts.marginLeft).toBe(5); - expect(grid.opts.marginRight).toBe(5); - }); - it('init 2 values >', () => { - let options = { - cellHeight: 80, - margin: '5px 10' - }; - let grid = GridStack.init(options); - expect(grid.getMargin()).toBe(undefined); - expect(grid.opts.marginTop).toBe(5); - expect(grid.opts.marginBottom).toBe(5); - expect(grid.opts.marginLeft).toBe(10); - expect(grid.opts.marginRight).toBe(10); - }); - it('init 4 values >', () => { - let options = { - cellHeight: 80, - margin: '1 2 0em 3' - }; - let grid = GridStack.init(options); - expect(grid.getMargin()).toBe(undefined); - expect(grid.opts.marginTop).toBe(1); - expect(grid.opts.marginRight).toBe(2); - expect(grid.opts.marginBottom).toBe(0); - expect(grid.opts.marginLeft).toBe(3); - }); - it('set 2 values, should update css vars >', () => { - let options = { - cellHeight: 80, - margin: 5 - }; - let grid = GridStack.init(options); - expect(grid.getMargin()).toBe(5); - grid.margin('1px 0'); - expect(grid.getMargin()).toBe(undefined); - expect(grid.opts.marginTop).toBe(1); - expect(grid.opts.marginBottom).toBe(1); - expect(grid.opts.marginLeft).toBe(0); - expect(grid.opts.marginRight).toBe(0); - }); - }); - describe('grid.opts.rtl >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should add grid-stack-rtl class >', () => { - let options = { - cellHeight: 80, - margin: 5, - rtl: true - }; - grid = GridStack.init(options); - expect(grid.el.classList.contains('grid-stack-rtl')).toBe(true); - }); - it('should not add grid-stack-rtl class >', () => { - let options = { - cellHeight: 80, - margin: 5 - }; - grid = GridStack.init(options); - expect(grid.el.classList.contains('grid-stack-rtl')).toBe(false); - }); - }); - describe('grid.enableMove', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should enable move for future also', () => { - let options = { - cellHeight: 80, - margin: 5, - disableDrag: true - }; - grid = GridStack.init(options); - let items = Utils.getElements('.grid-stack-item'); - items.forEach(el => expect(el.classList.contains('ui-draggable-disabled')).toBe(true)); - expect(grid.opts.disableDrag).toBe(true); - grid.enableMove(true); - items.forEach(el => expect(el.classList.contains('ui-draggable-disabled')).toBe(false)); - expect(grid.opts.disableDrag).not.toBe(true); - }); - it('should disable move for existing only >', () => { - let options = { - cellHeight: 80, - margin: 5 - }; - grid = GridStack.init(options); - let items = Utils.getElements('.grid-stack-item'); - items.forEach(el => expect(el.classList.contains('ui-draggable-disabled')).toBe(false)); - expect(grid.opts.disableDrag).toBeFalsy(); - grid.enableMove(false); - items.forEach(el => expect(el.classList.contains('ui-draggable-disabled')).toBe(true)); - expect(grid.opts.disableDrag).toBe(true); - }); - }); - describe('grid.enableResize >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should enable resize >', () => { - let options = { - cellHeight: 80, - margin: 5, - disableResize: true - }; - grid = GridStack.init(options); - expect(grid.opts.disableResize).toBe(true); - let items = Utils.getElements('.grid-stack-item'); - let dd = GridStack.getDD(); - expect(dd).not.toBe(null); // sanity test to verify type - items.forEach(el => { - expect(dd.isResizable(el)).toBe(false); - expect(dd.isDraggable(el)).toBe(true); - }); - grid.enableResize(true); - expect(grid.opts.disableResize).not.toBe(true); - items.forEach(el => { - expect(dd.isResizable(el)).toBe(true); - expect(dd.isDraggable(el)).toBe(true); - }); - }); - it('should disable resize >', () => { - let options = { - cellHeight: 80, - margin: 5 - }; - grid = GridStack.init(options); - expect(grid.opts.disableResize).toBeFalsy(); - let items = Utils.getElements('.grid-stack-item'); - let dd = GridStack.getDD(); - items.forEach(el => expect(dd.isResizable(el)).toBe(true)); - grid.enableResize(false); - expect(grid.opts.disableResize).toBe(true); - items.forEach(el => { - expect(dd.isResizable(el)).toBe(false); - expect(dd.isDraggable(el)).toBe(true); - }); - }); - }); - describe('grid.enable >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should enable movable and resizable >', () => { - let options = { - cellHeight: 80, - margin: 5 - }; - grid = GridStack.init(options); - let items = Utils.getElements('.grid-stack-item'); - let dd = GridStack.getDD(); - grid.enableResize(false); - grid.enableMove(false); - items.forEach(el => { - expect(el.classList.contains('ui-draggable-disabled')).toBe(true); - expect(dd.isResizable(el)).toBe(false); - expect(dd.isDraggable(el)).toBe(false); - }); - grid.enable(); - items.forEach(el => { - expect(el.classList.contains('ui-draggable-disabled')).toBe(false); - expect(dd.isResizable(el)).toBe(true); - expect(dd.isDraggable(el)).toBe(true); - }); - }); - }); - describe('grid.enable >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should lock widgets >', () => { - let options = { - cellHeight: 80, - margin: 5 - }; - grid = GridStack.init(options); - grid.update('.grid-stack-item', { locked: true }); - Utils.getElements('.grid-stack-item').forEach(item => { - expect(item.getAttribute('gs-locked')).toBe('true'); - }); - }); - it('should unlock widgets >', () => { - let options = { - cellHeight: 80, - margin: 5 - }; - grid = GridStack.init(options); - grid.update('.grid-stack-item', { locked: false }); - Utils.getElements('.grid-stack-item').forEach(item => { - expect(item.getAttribute('gs-locked')).toBe(null); - }); - }); - }); - describe('custom grid placement #1054 >', () => { - let HTML = '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
' + - '
'; - let pos = [{ x: 0, y: 0, w: 12, h: 9 }, { x: 0, y: 9, w: 12, h: 5 }, { x: 0, y: 14, w: 7, h: 6 }, { x: 7, y: 14, w: 5, h: 6 }]; - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', HTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should have correct position >', () => { - let items = Utils.getElements('.grid-stack-item'); - items.forEach((el, i) => { - expect(parseInt(el.getAttribute('gs-x'))).toBe(pos[i].x); - expect(parseInt(el.getAttribute('gs-y'))).toBe(pos[i].y); - expect(parseInt(el.getAttribute('gs-w'))).toBe(pos[i].w); - expect(parseInt(el.getAttribute('gs-h'))).toBe(pos[i].h); - }); - }); - }); - describe('grid.compact >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should move all 3 items to top-left with no space >', () => { - grid = GridStack.init({ float: true }); - let el3 = grid.addWidget({ x: 3, y: 5 }); - expect(parseInt(el3.getAttribute('gs-x'))).toBe(3); - expect(parseInt(el3.getAttribute('gs-y'))).toBe(5); - grid.compact(); - expect(parseInt(el3.getAttribute('gs-x'))).toBe(8); - expect(el3.getAttribute('gs-y')).toBe(null); - }); - it('not move locked item >', () => { - grid = GridStack.init({ float: true }); - let el3 = grid.addWidget({ x: 3, y: 5, locked: true, noMove: true }); - expect(parseInt(el3.getAttribute('gs-x'))).toBe(3); - expect(parseInt(el3.getAttribute('gs-y'))).toBe(5); - grid.compact(); - expect(parseInt(el3.getAttribute('gs-x'))).toBe(3); - expect(parseInt(el3.getAttribute('gs-y'))).toBe(5); - }); - }); - describe('gridOption locked #1181 >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackEmptyHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('not move locked item, size down added one >', () => { - grid = GridStack.init(); - let el1 = grid.addWidget({ x: 0, y: 1, w: 12, locked: true }); - expect(el1.getAttribute('gs-x')).toBe(null); - expect(parseInt(el1.getAttribute('gs-y'))).toBe(1); - let el2 = grid.addWidget({ x: 2, y: 0, h: 3 }); - expect(el1.getAttribute('gs-x')).toBe(null); - expect(parseInt(el1.getAttribute('gs-y'))).toBe(1); - expect(parseInt(el2.getAttribute('gs-x'))).toBe(2); - expect(parseInt(el2.getAttribute('gs-y'))).toBe(2); - expect(parseInt(el2.getAttribute('gs-h'))).toBe(3); - }); - }); - describe('nested grids >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackNestedHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('should both init, second with nested class >', () => { - grids = GridStack.initAll(); - expect(grids.length).toBe(2); - expect(grids[0].el.classList.contains('grid-stack-nested')).toBe(false); - expect(grids[1].el.classList.contains('grid-stack-nested')).toBe(true); - }); - }); - describe('two grids >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridHTML); - document.body.insertAdjacentHTML('afterbegin', gridHTML); - }); - afterEach(() => { - let els = document.body.querySelectorAll('.grid-stack'); - expect(els.length).toBe(2); - els.forEach(g => g.remove()); - }); - it('should not remove incorrect child >', () => { - grids = GridStack.initAll(); - expect(grids.length).toBe(2); - expect(grids[0].engine.nodes.length).toBe(2); - expect(grids[1].engine.nodes.length).toBe(2); - // should do nothing - grids[0].removeWidget(grids[1].engine.nodes[0].el); - expect(grids[0].engine.nodes.length).toBe(2); - expect(grids[0].el.children.length).toBe(2); - expect(grids[1].engine.nodes.length).toBe(2); - expect(grids[1].el.children.length).toBe(2); - // should empty with no errors - grids[1].removeAll(); - expect(grids[0].engine.nodes.length).toBe(2); - expect(grids[0].el.children.length).toBe(2); - expect(grids[1].engine.nodes.length).toBe(0); - expect(grids[1].el.children.length).toBe(0); - }); - it('should remove 1 child >', () => { - grids = GridStack.initAll(); - grids[1].removeWidget(grids[1].engine.nodes[0].el); - expect(grids[0].engine.nodes.length).toBe(2); - expect(grids[0].el.children.length).toBe(2); - expect(grids[1].engine.nodes.length).toBe(1); - expect(grids[1].el.children.length).toBe(1); - }); - }); - describe('grid.on events >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('add 3 single events >', () => { - grid = GridStack.init(); - let fcn = (event) => { }; - grid.on('added', fcn).on('enable', fcn).on('dragstart', fcn); - expect(grid._gsEventHandler.enable).not.toBe(undefined); - grid.off('added').off('enable').off('dragstart'); - expect(grid._gsEventHandler.enable).toBe(undefined); - }); - it('add 3 events >', () => { - let grid = GridStack.init(); // prevent TS check for string combine... - let fcn = (event) => { }; - grid.on('added enable dragstart', fcn); - expect(grid._gsEventHandler.enable).not.toBe(undefined); - grid.off('added enable dragstart'); - expect(grid._gsEventHandler.enable).toBe(undefined); - }); - }); - describe('save & load >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('save layout >', () => { - grid = GridStack.init({ maxRow: 10 }); - let layout = grid.save(false); - expect(layout).toEqual([{ x: 0, y: 0, w: 4, h: 2, id: 'gsItem1' }, { x: 4, y: 0, w: 4, h: 4, id: 'gsItem2' }]); - layout = grid.save(); - expect(layout).toEqual([{ x: 0, y: 0, w: 4, h: 2, id: 'gsItem1', content: 'item 1 text' }, { x: 4, y: 0, w: 4, h: 4, id: 'gsItem2', content: 'item 2 text' }]); - layout = grid.save(true); - expect(layout).toEqual([{ x: 0, y: 0, w: 4, h: 2, id: 'gsItem1', content: 'item 1 text' }, { x: 4, y: 0, w: 4, h: 4, id: 'gsItem2', content: 'item 2 text' }]); - }); - it('save layout full >', () => { - grid = GridStack.init({ maxRow: 10, _foo: 'bar' }); // using bogus 'internal' field (stripped) - let layout = grid.save(false, true); - expect(layout).toEqual({ maxRow: 10, children: [{ x: 0, y: 0, w: 4, h: 2, id: 'gsItem1' }, { x: 4, y: 0, w: 4, h: 4, id: 'gsItem2' }] }); - layout = grid.save(true, true); - expect(layout).toEqual({ maxRow: 10, children: [{ x: 0, y: 0, w: 4, h: 2, id: 'gsItem1', content: 'item 1 text' }, { x: 4, y: 0, w: 4, h: 4, id: 'gsItem2', content: 'item 2 text' }] }); - }); - it('load move 1 item, delete others >', () => { - grid = GridStack.init(); - grid.load([{ x: 2, h: 1, id: 'gsItem2' }]); - let layout = grid.save(false); - expect(layout).toEqual([{ x: 0, y: 0, id: 'gsItem2' }]); - }); - it('load add new, delete others >', () => { - grid = GridStack.init(); - grid.load([{ w: 2, y: 0, h: 1, id: 'gsItem3' }], true); - let layout = grid.save(false); - expect(layout).toEqual([{ x: 0, y: 0, w: 2, id: 'gsItem3' }]); - }); - it('load 1 item only, no remove >', () => { - grid = GridStack.init(); - grid.load([{ h: 3, id: 'gsItem1' }], false); - let layout = grid.save(false); - expect(layout).toEqual([{ x: 0, y: 0, h: 3, id: 'gsItem1' }, { x: 4, y: 0, w: 4, h: 4, id: 'gsItem2' }]); - }); - it('load 1 item only with callback >', () => { - grid = GridStack.init(); - grid.load([{ h: 3, id: 'gsItem1' }], () => null); - let layout = grid.save(false); - expect(layout).toEqual([{ x: 0, y: 0, h: 3, id: 'gsItem1' }]); - }); - }); - describe('load >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('after init #1693 >', () => { - grid = GridStack.init(); - grid.load([{ id: 'gsItem1', x: 0, y: 0, w: 5, h: 1 }, { id: 'gsItem2', x: 6, y: 0, w: 2, h: 2 }]); - let el1 = document.getElementById('item1'); - expect(el1.getAttribute('gs-x')).toBe(null); - expect(el1.getAttribute('gs-y')).toBe(null); - expect(parseInt(el1.getAttribute('gs-w'))).toBe(5); - expect(el1.getAttribute('gs-h')).toBe(null); - let el2 = document.getElementById('item2'); - expect(parseInt(el2.getAttribute('gs-x'))).toBe(6); - expect(el2.getAttribute('gs-y')).toBe(null); - expect(parseInt(el2.getAttribute('gs-w'))).toBe(2); - expect(parseInt(el2.getAttribute('gs-h'))).toBe(2); - }); - it('after init replace nodes >', () => { - grid = GridStack.init(); - expect(document.getElementById('item1')).not.toBe(null); - expect(document.getElementById('item2')).not.toBe(null); - // this will replace with 2 new nodes - grid.load([{ id: 'new1', x: 0, y: 0, w: 5, h: 1 }, { id: 'new2', x: 6, y: 0, w: 2, h: 2 }]); - expect(grid.engine.nodes.length).toBe(2); - expect(document.getElementById('item1')).toBe(null); - let el1 = grid.engine.nodes.find(n => n.id === 'new1').el; - expect(el1.getAttribute('gs-x')).toBe(null); - expect(el1.getAttribute('gs-y')).toBe(null); - expect(parseInt(el1.getAttribute('gs-w'))).toBe(5); - expect(el1.getAttribute('gs-h')).toBe(null); - expect(document.getElementById('item2')).toBe(null); - let el2 = grid.engine.nodes.find(n => n.id === 'new2').el; - expect(parseInt(el2.getAttribute('gs-x'))).toBe(6); - expect(el2.getAttribute('gs-y')).toBe(null); - expect(parseInt(el2.getAttribute('gs-w'))).toBe(2); - expect(parseInt(el2.getAttribute('gs-h'))).toBe(2); - }); - }); - describe('load empty >', () => { - let items; - let grid; - const test = () => { - items.forEach(item => { - const n = grid.engine.nodes.find(n => n.id === item.id); - if (item.y) - expect(parseInt(n.el.getAttribute('gs-y'))).toBe(item.y); - else - expect(n.el.getAttribute('gs-y')).toBe(null); - }); - }; - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackEmptyHTML); - items = [ - { id: '0', x: 0, y: 0 }, - { id: '1', x: 0, y: 1 }, - { id: '2', x: 0, y: 2 }, - { id: '3', x: 0, y: 3 }, - ]; - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('update collision >', () => { - grid = GridStack.init({ children: items }); - const n = grid.engine.nodes[0]; - test(); - grid.update(n.el, { h: 5 }); - items[1].y = 5; - items[2].y = 6; - items[3].y = 7; - test(); - grid.update(n.el, { h: 1 }); - items[1].y = 1; - items[2].y = 2; - items[3].y = 3; - test(); - }); - it('load collision 2208 >', () => { - grid = GridStack.init({ children: items }); - test(); - items[0].h = 5; - grid.load(items); - items[1].y = 5; - items[2].y = 6; - items[3].y = 7; - test(); - items[0].h = 1; - grid.load(items); - items[1].y = 1; - items[2].y = 2; - items[3].y = 3; - test(); - }); - it('load full collision 2208 >', () => { - grid = GridStack.init({ children: items }); - test(); - items[0].h = 5; - grid.load(grid.engine.nodes.map((n, index) => { - if (index === 0) - return { ...n, h: 5 }; - return n; - })); - items[1].y = 5; - items[2].y = 6; - items[3].y = 7; - test(); - items[0].h = 1; - grid.load(grid.engine.nodes.map((n, index) => { - if (index === 0) - return { ...n, h: 1 }; - return n; - })); - items[1].y = 1; - items[2].y = 2; - items[3].y = 3; - test(); - }); - }); - // ..and finally track log warnings at the end, instead of displaying them.... - describe('obsolete warnings >', () => { - console.warn = vi.fn(); // track warnings instead of displaying them - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('willItFit() legacy >', () => { - grid = GridStack.init({ maxRow: 5 }); - expect(grid.willItFit(0, 0, 1, 3, false)).toBe(true); - expect(grid.willItFit(0, 0, 1, 4, false)).toBe(false); - }); - it('warning if OLD commit() is called >', () => { - grid = GridStack.init(); - grid.batchUpdate(true); - expect(grid.engine.batchMode).toBe(true); - grid.commit(); // old API - expect(grid.engine.batchMode).toBe(false); - // expect(console.warn).toHaveBeenCalledWith('gridstack.js: Function `setGridWidth` is deprecated in v0.5.3 and has been replaced with `column`. It will be **completely** removed in v1.0'); - }); - /* saving as example - it('warning if OLD setGridWidth is called >', () => { - let grid: any = GridStack.init(); - grid.setGridWidth(11); // old 0.5.2 API - expect(grid.getColumn()).toBe(11); - expect(console.warn).toHaveBeenCalledWith('gridstack.js: Function `setGridWidth` is deprecated in v0.5.3 and has been replaced with `column`. It will be **completely** removed in v1.0'); - }); - */ - }); - // Note: Stylesheet tests moved to E2E tests - // where real browser CSS engines can provide accurate getComputedStyle() values - // describe('stylesheet', () => {}); - describe('updateOptions()', () => { - let grid; - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackHTML); - grid = GridStack.init({ cellHeight: 30 }); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('update all values supported', () => { - grid.updateOptions({ - cellHeight: '40px', - margin: 8, - column: 11, - float: true, - row: 10, - }); - expect(grid.getCellHeight(true)).toBe(40); - expect(grid.getMargin()).toBe(8); - expect(grid.opts.marginTop).toBe(8); - expect(grid.getColumn()).toBe(11); - expect(grid.getFloat()).toBe(true); - expect(grid.opts.row).toBe(10); - expect(grid.opts.minRow).toBe(10); - expect(grid.opts.maxRow).toBe(10); - }); - }); -}); -//# sourceMappingURL=gridstack-spec.js.map \ No newline at end of file diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/gridstack-spec.js.map b/web/skins/classic/assets/gridstack-12.3.3/dist/spec/gridstack-spec.js.map deleted file mode 100644 index f1c986870..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/gridstack-spec.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"gridstack-spec.js","sourceRoot":"","sources":["../../spec/gridstack-spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { GridItemHTMLElement, GridStack, GridStackNode, GridStackWidget } from '../src/gridstack';\nimport { Utils } from '../src/utils';\n\ndescribe('gridstack >', () => {\n 'use strict';\n\n let grid: GridStack;\n let grids: GridStack[];\n let find = function(id: string): GridStackNode {\n return grid.engine.nodes.find(n => n.id === id)!;\n };\n let findEl = function(id: string): GridItemHTMLElement {\n return find(id).el!;\n };\n\n // grid has 4x2 and 4x4 top-left aligned - used on most test cases\n let gridHTML =\n '
' +\n '
' +\n '
item 1 text
' +\n '
' +\n '
' +\n '
item 2 text
' +\n '
' +\n '
';\n let gridstackHTML =\n '
' + gridHTML + '
';\n let gridstackSmallHTML =\n '
' + gridHTML + '
';\n // empty grid\n let gridstackEmptyHTML =\n '
' +\n '
' +\n '
' +\n '
';\n // nested empty grids\n let gridstackNestedHTML =\n '
' +\n '
' +\n '
' +\n '
item 1
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
';\n // generic widget with no param\n let widgetHTML = '
hello
';\n\n describe('grid.init() / initAll() >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('use selector >', () => {\n grid = GridStack.init(undefined, '.grid-stack');\n expect(grid).not.toBe(null);\n });\n it('use selector no dot >', () => {\n grid = GridStack.init(null, 'grid-stack');\n expect(grid).not.toBe(null);\n });\n it('use wrong selector >', () => {\n grid = GridStack.init(null, 'BAD_SELECTOR_TEST');\n expect(grid).toEqual(null);\n });\n it('initAll use selector >', () => {\n grids = GridStack.initAll(undefined, '.grid-stack');\n expect(grids.length).toBe(1);\n });\n it('initAll use selector no dot >', () => {\n grids = GridStack.initAll(undefined, 'grid-stack');\n expect(grids.length).toBe(1);\n });\n });\n\n describe('grid.setAnimation >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should add class grid-stack-animate to the container. >', () => {\n grid = GridStack.init({animate: true});\n expect(grid.el.classList.contains('grid-stack-animate')).toBe(true);\n grid.el.classList.remove('grid-stack-animate');\n expect(grid.el.classList.contains('grid-stack-animate')).toBe(false);\n grid.setAnimation(true);\n expect(grid.el.classList.contains('grid-stack-animate')).toBe(true);\n });\n it('should remove class grid-stack-animate from the container. >', () => {\n grid = GridStack.init({animate: true});\n grid.setAnimation(false);\n expect(grid.el.classList.contains('grid-stack-animate')).toBe(false);\n });\n });\n\n describe('grid._setStaticClass >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should add class grid-stack-static to the container. >', () => {\n grid = GridStack.init({staticGrid: true});\n expect(grid.el.classList.contains('grid-stack-static')).toBe(true);\n grid.setStatic(false);\n expect(grid.el.classList.contains('grid-stack-static')).toBe(false);\n grid.setStatic(true);\n expect(grid.el.classList.contains('grid-stack-static')).toBe(true);\n });\n it('should remove class grid-stack-static from the container. >', () => {\n grid = GridStack.init({staticGrid: false});\n expect(grid.el.classList.contains('grid-stack-static')).toBe(false);\n grid.setStatic(true);\n expect(grid.el.classList.contains('grid-stack-static')).toBe(true);\n });\n });\n\n // Note: Pixel-accurate coordinate tests moved to E2E tests\n // where real browser layout engines can provide accurate getBoundingClientRect()\n // describe('grid.getCellFromPixel >', () => {});\n\n // Note: Exact pixel calculation tests moved to E2E tests\n // where real browser layout engines can provide accurate offsetWidth\n // describe('grid.cellWidth >', () => {});\n\n describe('grid.cellHeight >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should set and get cellHeight correctly >', () => {\n let cellHeight = 80;\n let margin = 5;\n let options = {\n cellHeight,\n margin,\n column: 12\n };\n grid = GridStack.init(options);\n \n let rows = parseInt(grid.el.getAttribute('gs-current-row'));\n \n expect(grid.getRow()).toBe(rows);\n expect(grid.getCellHeight()).toBe(cellHeight);\n \n // Note: Exact pixel height calculation tests moved to E2E tests\n // where real browser layout engines can provide accurate getComputedStyle() values\n\n grid.cellHeight( grid.getCellHeight() ); // should be no-op\n expect(grid.getCellHeight()).toBe(cellHeight);\n\n cellHeight = 120; // should change\n grid.cellHeight( cellHeight );\n expect(grid.getCellHeight()).toBe(cellHeight);\n\n cellHeight = 20; // should change\n grid.cellHeight( cellHeight );\n expect(grid.getCellHeight()).toBe(cellHeight);\n });\n\n it('should be square >', () => {\n grid = GridStack.init({cellHeight: 'auto'});\n expect(grid.cellWidth()).toBe( grid.getCellHeight());\n });\n\n });\n\n describe('grid.column >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should have no changes >', () => {\n grid = GridStack.init();\n expect(grid.getColumn()).toBe(12);\n grid.column(12);\n expect(grid.getColumn()).toBe(12);\n }); \n it('should set construct CSS class >', () => {\n grid = GridStack.init({column: 1});\n expect(grid.el.classList.contains('gs-1')).toBe(true);\n grid.column(2);\n expect(grid.el.classList.contains('gs-1')).toBe(false);\n expect(grid.el.classList.contains('gs-2')).toBe(true);\n }); \n it('should set CSS class >', () => {\n grid = GridStack.init();\n expect(grid.el.classList.contains('grid-stack')).toBe(true);\n grid.column(1);\n expect(grid.el.classList.contains('gs-1')).toBe(true);\n }); \n it('should SMALL change column number, no relayout >', () => {\n let options = {\n column: 12\n };\n grid = GridStack.init(options);\n let items = Utils.getElements('.grid-stack-item');\n grid.column(9);\n expect(grid.getColumn()).toBe(9);\n items.forEach(el => expect(el.getAttribute('gs-y')).toBe(null));\n grid.column(12);\n expect(grid.getColumn()).toBe(12);\n items.forEach(el => expect(el.getAttribute('gs-y')).toBe(null));\n });\n it('no sizing, no moving >', () => {\n grid = GridStack.init({column: 12});\n let items = Utils.getElements('.grid-stack-item');\n grid.column(8, 'none');\n expect(grid.getColumn()).toBe(8);\n items.forEach(el => {\n expect(parseInt(el.getAttribute('gs-w'))).toBe(4);\n expect(el.getAttribute('gs-y')).toBe(null);\n });\n });\n it('no sizing, but moving down >', () => {\n grid = GridStack.init({column: 12});\n let items = Utils.getElements('.grid-stack-item');\n grid.column(7, 'move');\n expect(grid.getColumn()).toBe(7);\n items.forEach(el => expect(parseInt(el.getAttribute('gs-w'))).toBe(4));\n expect(items[0].getAttribute('gs-y')).toBe(null);\n expect(parseInt(items[1].getAttribute('gs-y'))).toBe(2);\n });\n it('should change column number and re-layout items >', () => {\n let options = {\n column: 12,\n float: true\n };\n grid = GridStack.init(options);\n let el1 = document.getElementById('item1')\n let el2 = document.getElementById('item2')\n\n // items start at 4x2 and 4x4\n expect(el1.getAttribute('gs-x')).toBe(null);\n expect(el1.getAttribute('gs-y')).toBe(null);\n expect(parseInt(el1.getAttribute('gs-w'))).toBe(4);\n expect(parseInt(el1.getAttribute('gs-h'))).toBe(2);\n\n expect(parseInt(el2.getAttribute('gs-x'))).toBe(4);\n expect(el2.getAttribute('gs-y')).toBe(null);\n expect(parseInt(el2.getAttribute('gs-w'))).toBe(4);\n expect(parseInt(el2.getAttribute('gs-h'))).toBe(4);\n\n // 1 column will have item1, item2\n grid.column(1);\n expect(grid.getColumn()).toBe(1);\n expect(el1.getAttribute('gs-x')).toBe(null);\n expect(el1.getAttribute('gs-y')).toBe(null);\n expect(el1.getAttribute('gs-w')).toBe(null);\n expect(parseInt(el1.getAttribute('gs-h'))).toBe(2);\n\n expect(el2.getAttribute('gs-x')).toBe(null);\n expect(parseInt(el2.getAttribute('gs-y'))).toBe(2);\n expect(el2.getAttribute('gs-w')).toBe(null);\n expect(parseInt(el2.getAttribute('gs-h'))).toBe(4);\n\n // add default 1x1 item to the end (1 column)\n let el3 = grid.addWidget({content:'new'});\n expect(el3).not.toBe(null);\n expect(el3.getAttribute('gs-x')).toBe(null);\n expect(parseInt(el3.getAttribute('gs-y'))).toBe(6);\n expect(el3.getAttribute('gs-w')).toBe(null);\n expect(el3.getAttribute('gs-h')).toBe(null);\n\n // back to 12 column and initial layout (other than new item3)\n grid.column(12);\n expect(grid.getColumn()).toBe(12);\n expect(el1.getAttribute('gs-x')).toBe(null);\n expect(el1.getAttribute('gs-y')).toBe(null);\n expect(parseInt(el1.getAttribute('gs-w'))).toBe(4);\n expect(parseInt(el1.getAttribute('gs-h'))).toBe(2);\n\n expect(parseInt(el2.getAttribute('gs-x'))).toBe(4);\n expect(el2.getAttribute('gs-y')).toBe(null);\n expect(parseInt(el2.getAttribute('gs-w'))).toBe(4);\n expect(parseInt(el2.getAttribute('gs-h'))).toBe(4);\n\n // TODO: we don't remembers autoPlacement (cleared multiple places)\n // expect(parseInt(el3.getAttribute('gs-x'))).toBe(8);\n // expect(el3.getAttribute('gs-y')).toBe(null);\n expect(el3.getAttribute('gs-x')).toBe(null);\n expect(parseInt(el3.getAttribute('gs-y'))).toBe(6);\n expect(el3.getAttribute('gs-w')).toBe(null);\n expect(el3.getAttribute('gs-h')).toBe(null);\n\n // back to 1 column\n grid.column(1);\n expect(grid.getColumn()).toBe(1);\n expect(el1.getAttribute('gs-x')).toBe(null);\n expect(el1.getAttribute('gs-y')).toBe(null);\n expect(el1.getAttribute('gs-w')).toBe(null);\n expect(parseInt(el1.getAttribute('gs-h'))).toBe(2);\n\n expect(el2.getAttribute('gs-x')).toBe(null);\n expect(parseInt(el2.getAttribute('gs-y'))).toBe(2);\n expect(el2.getAttribute('gs-w')).toBe(null);\n expect(parseInt(el2.getAttribute('gs-h'))).toBe(4);\n\n expect(el3.getAttribute('gs-x')).toBe(null);\n expect(parseInt(el3.getAttribute('gs-y'))).toBe(6);\n expect(el3.getAttribute('gs-w')).toBe(null);\n expect(el3.getAttribute('gs-h')).toBe(null);\n\n // move item2 to beginning to [3][1][2] vertically\n grid.update(el3, {x:0, y:0});\n expect(el3.getAttribute('gs-x')).toBe(null);\n expect(el3.getAttribute('gs-y')).toBe(null);\n expect(el3.getAttribute('gs-w')).toBe(null);\n expect(el3.getAttribute('gs-h')).toBe(null);\n\n expect(el1.getAttribute('gs-x')).toBe(null);\n expect(parseInt(el1.getAttribute('gs-y'))).toBe(1);\n expect(el1.getAttribute('gs-w')).toBe(null);\n expect(parseInt(el1.getAttribute('gs-h'))).toBe(2);\n\n expect(el2.getAttribute('gs-x')).toBe(null);\n expect(parseInt(el2.getAttribute('gs-y'))).toBe(3);\n expect(el2.getAttribute('gs-w')).toBe(null);\n expect(parseInt(el2.getAttribute('gs-h'))).toBe(4);\n\n // back to 12 column, el3 to be beginning still, but [1][2] to be in 1 columns still but wide 4x2 and 4x still\n grid.column(12);\n expect(grid.getColumn()).toBe(12);\n expect(el3.getAttribute('gs-x')).toBe(null); // 8 TEST WHY\n expect(el3.getAttribute('gs-y')).toBe(null);\n expect(el3.getAttribute('gs-w')).toBe(null);\n expect(el3.getAttribute('gs-h')).toBe(null);\n\n expect(el1.getAttribute('gs-x')).toBe(null);\n expect(parseInt(el1.getAttribute('gs-y'))).toBe(1);\n expect(parseInt(el1.getAttribute('gs-w'))).toBe(4);\n expect(parseInt(el1.getAttribute('gs-h'))).toBe(2);\n\n expect(parseInt(el2.getAttribute('gs-x'))).toBe(4);\n expect(parseInt(el2.getAttribute('gs-y'))).toBe(1);\n expect(parseInt(el2.getAttribute('gs-w'))).toBe(4);\n expect(parseInt(el2.getAttribute('gs-h'))).toBe(4);\n\n // 2 column will have item1, item2, item3 in 1 column still but half the width\n grid.column(1); // test convert from small, should use 12 layout still\n grid.column(2);\n expect(grid.getColumn()).toBe(2);\n\n expect(el3.getAttribute('gs-x')).toBe(null); // 1 TEST WHY\n expect(el3.getAttribute('gs-y')).toBe(null);\n expect(el3.getAttribute('gs-w')).toBe(null); // 1 as we scaled from 12 columns\n expect(el3.getAttribute('gs-h')).toBe(null);\n\n expect(el1.getAttribute('gs-x')).toBe(null);\n expect(parseInt(el1.getAttribute('gs-y'))).toBe(1);\n expect(el1.getAttribute('gs-w')).toBe(null);\n expect(parseInt(el1.getAttribute('gs-h'))).toBe(2);\n\n expect(parseInt(el2.getAttribute('gs-x'))).toBe(1);\n expect(parseInt(el2.getAttribute('gs-y'))).toBe(1);\n expect(el2.getAttribute('gs-w')).toBe(null);\n expect(parseInt(el2.getAttribute('gs-h'))).toBe(4);\n });\n });\n\n describe('grid.column larger layout >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackEmptyHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n\n it('24 layout in 12 column to 1 back 12 then 24 >', () => {\n const children: GridStackWidget[] = [{ x: 0, y: 0, w: 12, h: 1, id: 'left' }, { x: 12, y: 0, w: 12, h: 1, id: 'right' }];\n children.forEach(c => c.content = c.id);\n\n grid = GridStack.init({children});\n const left = find('left');\n const right = find('right');\n\n // side-by-side components 12+12 = 24 columns but only have 12!\n expect(left).toEqual(expect.objectContaining({x: 0, y: 0, w: 12}));\n expect(right).toEqual(expect.objectContaining({x: 0, y: 1, w: 12}));\n // Resize to 1 column\n grid.column(1);\n expect(left).toEqual(expect.objectContaining({x: 0, y: 0, w: 1}));\n expect(right).toEqual(expect.objectContaining({x: 0, y: 1, w: 1}));\n // Resize back to 12 column\n grid.column(12);\n expect(left).toEqual(expect.objectContaining({x: 0, y: 0, w: 12}));\n expect(right).toEqual(expect.objectContaining({x: 0, y: 1, w: 12}));\n // Resize to 24 column\n grid.column(24);\n expect(left).toEqual(expect.objectContaining({x: 0, y: 0, w: 12}));\n expect(right).toEqual(expect.objectContaining({x: 12, y: 0, w: 12}));\n });\n it('24 column to 12, 1 back 12,24 >', () => {\n const children: GridStackWidget[] = [{ x: 0, y: 0, w: 12, h: 1, id: 'left' }, { x: 12, y: 0, w: 12, h: 1, id: 'right' }];\n children.forEach(c => c.content = c.id);\n\n grid = GridStack.init({column:24, children});\n const left = find('left');\n const right = find('right');\n\n // side-by-side components 12+12 = 24 columns\n expect(left).toEqual(expect.objectContaining({x: 0, y: 0, w: 12}));\n expect(right).toEqual(expect.objectContaining({x: 12, y: 0, w: 12}));\n // Resize to 12 column\n grid.column(12);\n expect(left).toEqual(expect.objectContaining({x: 0, y: 0, w: 6}));\n expect(right).toEqual(expect.objectContaining({x: 6, y: 0, w: 6}));\n // Resize to 1 column\n grid.column(1);\n expect(left).toEqual(expect.objectContaining({x: 0, y: 0, w: 1}));\n expect(right).toEqual(expect.objectContaining({x: 0, y: 1, w: 1}));\n // back to 12 column\n grid.column(12);\n expect(left).toEqual(expect.objectContaining({x: 0, y: 0, w: 6}));\n expect(right).toEqual(expect.objectContaining({x: 6, y: 0, w: 6}));\n // back to 24 column\n grid.column(24);\n expect(left).toEqual(expect.objectContaining({x: 0, y: 0, w: 12}));\n expect(right).toEqual(expect.objectContaining({x: 12, y: 0, w: 12}));\n });\n\n });\n\n // describe('oneColumnModeDomSort >', () => {\n // beforeEach(() => {\n // document.body.insertAdjacentHTML('afterbegin', gridstackEmptyHTML);\n // });\n // afterEach(() => {\n // document.body.removeChild(document.getElementById('gs-cont'));\n // });\n // it('should support default going to 1 column >', () => {\n // let options = {\n // column: 12,\n // float: true\n // };\n // grid = GridStack.init(options);\n // grid.batchUpdate();\n // grid.batchUpdate();\n // let el1 = grid.addWidget({w:1, h:1});\n // let el2 = grid.addWidget({x:2, y:0, w:2, h:1});\n // let el3 = grid.addWidget({x:1, y:0, w:1, h:2});\n // grid.batchUpdate(false);\n // grid.batchUpdate(false);\n \n // // items are item1[1x1], item3[1x1], item2[2x1]\n // expect(el1.getAttribute('gs-x')).toBe(null);\n // expect(el1.getAttribute('gs-y')).toBe(null);\n // expect(el1.getAttribute('gs-w')).toBe(null);\n // expect(el1.getAttribute('gs-h')).toBe(null);\n\n // expect(parseInt(el3.getAttribute('gs-x'))).toBe(1);\n // expect(el3.getAttribute('gs-y')).toBe(null);\n // expect(el3.getAttribute('gs-w')).toBe(null);\n // expect(parseInt(el3.getAttribute('gs-h'))).toBe(2);\n\n // expect(parseInt(el2.getAttribute('gs-x'))).toBe(2);\n // expect(el2.getAttribute('gs-y')).toBe(null);\n // expect(parseInt(el2.getAttribute('gs-w'))).toBe(2);\n // expect(el2.getAttribute('gs-h')).toBe(null);\n\n // // items are item1[1x1], item3[1x2], item2[1x1] in 1 column\n // grid.column(1);\n // expect(el1.getAttribute('gs-x')).toBe(null);\n // expect(el1.getAttribute('gs-y')).toBe(null);\n // expect(el1.getAttribute('gs-w')).toBe(null);\n // expect(el1.getAttribute('gs-h')).toBe(null);\n\n // expect(el3.getAttribute('gs-x')).toBe(null);\n // expect(parseInt(el3.getAttribute('gs-y'))).toBe(1);\n // expect(el3.getAttribute('gs-w')).toBe(null);\n // expect(parseInt(el3.getAttribute('gs-h'))).toBe(2);\n\n // expect(el2.getAttribute('gs-x')).toBe(null);\n // expect(parseInt(el2.getAttribute('gs-y'))).toBe(3);\n // expect(el2.getAttribute('gs-w')).toBe(null);\n // expect(el2.getAttribute('gs-h')).toBe(null);\n // });\n // it('should support oneColumnModeDomSort ON going to 1 column >', () => {\n // let options = {\n // column: 12,\n // oneColumnModeDomSort: true,\n // float: true\n // };\n // grid = GridStack.init(options);\n // let el1 = grid.addWidget({w:1, h:1});\n // let el2 = grid.addWidget({x:2, y:0, w:2, h:1});\n // let el3 = grid.addWidget({x:1, y:0, w:1, h:2});\n\n // // items are item1[1x1], item3[1x1], item2[2x1]\n // expect(el1.getAttribute('gs-x')).toBe(null);\n // expect(el1.getAttribute('gs-y')).toBe(null);\n // expect(el1.getAttribute('gs-w')).toBe(null);\n // expect(el1.getAttribute('gs-h')).toBe(null);\n\n // expect(parseInt(el3.getAttribute('gs-x'))).toBe(1);\n // expect(el3.getAttribute('gs-y')).toBe(null);\n // expect(el3.getAttribute('gs-w')).toBe(null);\n // expect(parseInt(el3.getAttribute('gs-h'))).toBe(2);\n\n // expect(parseInt(el2.getAttribute('gs-x'))).toBe(2);\n // expect(el2.getAttribute('gs-y')).toBe(null);\n // expect(parseInt(el2.getAttribute('gs-w'))).toBe(2);\n // expect(el2.getAttribute('gs-h')).toBe(null);\n\n // // items are item1[1x1], item2[1x1], item3[1x2] in 1 column dom ordered\n // grid.column(1);\n // expect(el1.getAttribute('gs-x')).toBe(null);\n // expect(el1.getAttribute('gs-y')).toBe(null);\n // expect(el1.getAttribute('gs-w')).toBe(null);\n // expect(el1.getAttribute('gs-h')).toBe(null);\n\n // expect(el2.getAttribute('gs-x')).toBe(null);\n // expect(parseInt(el2.getAttribute('gs-y'))).toBe(1);\n // expect(el2.getAttribute('gs-w')).toBe(null);\n // expect(el2.getAttribute('gs-h')).toBe(null);\n\n // expect(el3.getAttribute('gs-x')).toBe(null);\n // expect(parseInt(el3.getAttribute('gs-y'))).toBe(2);\n // expect(el3.getAttribute('gs-w')).toBe(null);\n // expect(parseInt(el3.getAttribute('gs-h'))).toBe(2);\n // });\n // });\n\n // describe('disableOneColumnMode >', () => {\n // beforeEach(() => {\n // document.body.insertAdjacentHTML('afterbegin', gridstackSmallHTML); // smaller default to 1 column\n // });\n // afterEach(() => {\n // document.body.removeChild(document.getElementById('gs-cont'));\n // });\n // it('should go to 1 column >', () => {\n // grid = GridStack.init();\n // expect(grid.getColumn()).toBe(1);\n // });\n // it('should go to 1 column with large minW >', () => {\n // grid = GridStack.init({oneColumnSize: 1000});\n // expect(grid.getColumn()).toBe(1);\n // });\n // it('should stay at 12 with minW >', () => {\n // grid = GridStack.init({oneColumnSize: 300});\n // expect(grid.getColumn()).toBe(12);\n // });\n // it('should stay at 12 column >', () => {\n // grid = GridStack.init({disableOneColumnMode: true});\n // expect(grid.getColumn()).toBe(12);\n // });\n // });\n\n describe('grid.minRow >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should default to row 0 when empty >', () => {\n let options = {};\n grid = GridStack.init(options);\n expect(grid.getRow()).toBe(4);\n expect(grid.opts.minRow).toBe(0);\n expect(grid.opts.maxRow).toBe(0);\n grid.removeAll();\n expect(grid.getRow()).toBe(0);\n });\n it('should default to row 2 when empty >', () => {\n let options = {minRow: 2};\n grid = GridStack.init(options);\n expect(grid.getRow()).toBe(4);\n expect(grid.opts.minRow).toBe(2);\n expect(grid.opts.maxRow).toBe(0);\n grid.removeAll();\n expect(grid.engine.getRow()).toBe(0);\n expect(grid.getRow()).toBe(2);\n });\n it('should set min = max = 3 rows >', () => {\n let options = {row: 3};\n grid = GridStack.init(options);\n expect(grid.getRow()).toBe(3); // shrink elements to fit maxRow!\n expect(grid.opts.minRow).toBe(3);\n expect(grid.opts.maxRow).toBe(3);\n grid.removeAll();\n expect(grid.engine.getRow()).toBe(0);\n expect(grid.getRow()).toBe(3);\n });\n it('willItFit() >', () => {\n // default 4x2 and 4x4 so anything pushing more than 1 will fail\n grid = GridStack.init({maxRow: 5});\n expect(grid.willItFit({x:0, y:0, w:1, h:1})).toBe(true);\n expect(grid.willItFit({x:0, y:0, w:1, h:3})).toBe(true);\n expect(grid.willItFit({x:0, y:0, w:1, h:4})).toBe(false);\n expect(grid.willItFit({x:0, y:0, w:12, h:1})).toBe(true);\n expect(grid.willItFit({x:0, y:0, w:12, h:2})).toBe(false);\n });\n it('willItFit() not modifying node #1687 >', () => {\n // default 4x2 and 4x4 so anything pushing more than 1 will fail\n grid = GridStack.init({maxRow: 5});\n let node: GridStackNode = {x:0, y:0, w:1, h:1, _id: 1, _temporaryRemoved: true};\n expect(grid.willItFit(node)).toBe(true);\n expect(node._temporaryRemoved).toBe(true);\n expect(node._id).toBe(1);\n });\n\n });\n\n describe('grid attributes >', () => {\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should have row attr >', () => {\n let HTML = \n '
' +\n '
' + // old attr current-height\n '
';\n document.body.insertAdjacentHTML('afterbegin', HTML);\n grid = GridStack.init();\n expect(grid.getRow()).toBe(4);\n expect(grid.opts.minRow).toBe(4);\n expect(grid.opts.maxRow).toBe(4);\n grid.addWidget({h: 6});\n expect(grid.engine.getRow()).toBe(4);\n expect(grid.getRow()).toBe(4);\n });\n });\n\n describe('grid.min/max width/height >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should set gs-min-w to 2. >', () => {\n grid = GridStack.init();\n let items: GridItemHTMLElement[] = Utils.getElements('.grid-stack-item');\n items.forEach(el => grid.update(el, {minW: 2, maxW: 3, minH: 4, maxH: 5}));\n items.forEach(el => {\n expect(el.gridstackNode!.minW).toBe(2);\n expect(el.gridstackNode!.maxW).toBe(3);\n expect(el.gridstackNode!.minH).toBe(4);\n expect(el.gridstackNode!.maxH).toBe(5);\n expect(el.getAttribute('gs-min-w')).toBe(null);\n expect(el.getAttribute('gs-max-w')).toBe(null);\n expect(el.getAttribute('gs-min-h')).toBe(null);\n expect(el.getAttribute('gs-max-h')).toBe(null);\n });\n // remove all constrain\n grid.update('grid-stack-item', {minW: 0, maxW: null, minH: undefined, maxH: 0});\n items.forEach(el => {\n expect(el.gridstackNode!.minW).toBe(undefined);\n expect(el.gridstackNode!.maxW).toBe(undefined);\n expect(el.gridstackNode!.minH).toBe(undefined);\n expect(el.gridstackNode!.maxH).toBe(undefined);\n expect(el.getAttribute('gs-min-w')).toBe(null);\n expect(el.getAttribute('gs-max-w')).toBe(null);\n expect(el.getAttribute('gs-min-h')).toBe(null);\n expect(el.getAttribute('gs-max-h')).toBe(null);\n });\n });\n });\n\n describe('grid.isAreaEmpty >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should set return false. >', () => {\n let options = {\n cellHeight: 80,\n margin: 5\n };\n grid = GridStack.init(options);\n let shouldBeFalse = grid.isAreaEmpty(1, 1, 1, 1);\n expect(shouldBeFalse).toBe(false);\n });\n it('should set return true. >', () => {\n let options = {\n cellHeight: 80,\n margin: 5\n };\n grid = GridStack.init(options);\n let shouldBeTrue = grid.isAreaEmpty(5, 5, 1, 1);\n expect(shouldBeTrue).toBe(true);\n });\n });\n\n describe('grid.removeAll >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should remove all children by default >', () => {\n grid = GridStack.init();\n grid.removeAll();\n expect(grid.engine.nodes).toEqual([]);\n expect(document.getElementById('item1')).toBe(null);\n });\n it('should remove all children >', () => {\n grid = GridStack.init();\n grid.removeAll(true);\n expect(grid.engine.nodes).toEqual([]);\n expect(document.getElementById('item1')).toBe(null);\n });\n it('should remove gridstack part, leave DOM behind >', () => {\n grid = GridStack.init();\n grid.removeAll(false);\n expect(grid.engine.nodes).toEqual([]);\n expect(document.getElementById('item1')).not.toBe(null);\n });\n });\n\n describe('grid.removeWidget >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should remove first item (default), then second (false) >', () => {\n grid = GridStack.init();\n expect(grid.engine.nodes.length).toEqual(2);\n\n let el1 = document.getElementById('item1');\n expect(el1).not.toBe(null);\n grid.removeWidget(el1);\n expect(grid.engine.nodes.length).toEqual(1);\n expect(document.getElementById('item1')).toBe(null);\n expect(document.getElementById('item2')).not.toBe(null);\n\n let el2 = document.getElementById('item2');\n grid.removeWidget(el2, false);\n expect(grid.engine.nodes.length).toEqual(0);\n expect(document.getElementById('item2')).not.toBe(null);\n });\n });\n\n describe('grid method _packNodes with float >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should allow same x, y coordinates for widgets. >', () => {\n let options = {\n cellHeight: 80,\n margin: 5,\n float: true\n };\n grid = GridStack.init(options);\n let items = Utils.getElements('.grid-stack-item');\n items.forEach(oldEl => {\n let el = grid.makeWidget(oldEl);\n expect(oldEl.getAttribute('gs-x')).toBe(el.getAttribute('gs-x'));\n expect(oldEl.getAttribute('gs-y')).toBe(el.getAttribute('gs-y'));\n })\n });\n it('should not allow same x, y coordinates for widgets. >', () => {\n let options = {\n cellHeight: 80,\n margin: 5\n };\n grid = GridStack.init(options);\n let items = Utils.getElements('.grid-stack-item') as GridItemHTMLElement[];\n items.forEach(oldEl => {\n let el = oldEl.cloneNode(true) as GridItemHTMLElement;\n el = grid.makeWidget(el);\n expect(el.gridstackNode?.x).not.toBe(oldEl.gridstackNode?.x);\n });\n });\n });\n\n describe('grid method addWidget with all parameters >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should keep all widget options the same (autoPosition off >', () => {\n grid = GridStack.init({float: true});;\n let w = grid.addWidget({x: 6, y:7, w:2, h:3, autoPosition:false,\n minW:1, maxW:4, minH:2, maxH:5, id:'coolWidget'});\n \n expect(parseInt(w.getAttribute('gs-x'))).toBe(6);\n expect(parseInt(w.getAttribute('gs-y'))).toBe(7);\n expect(parseInt(w.getAttribute('gs-w'))).toBe(2);\n expect(parseInt(w.getAttribute('gs-h'))).toBe(3);\n expect(w.getAttribute('gs-auto-position')).toBe(null);\n expect(w.getAttribute('gs-id')).toBe('coolWidget');\n\n // should move widget to top with float=false\n expect(grid.getFloat()).toBe(true);\n grid.float(false);\n expect(grid.getFloat()).toBe(false);\n expect(parseInt(w.getAttribute('gs-x'))).toBe(6);\n expect(parseInt(w.getAttribute('gs-y'))).toBe(4); // <--- from 7 to 4 below second original widget\n expect(parseInt(w.getAttribute('gs-w'))).toBe(2);\n expect(parseInt(w.getAttribute('gs-h'))).toBe(3);\n expect(w.getAttribute('gs-auto-position')).toBe(null);\n expect(w.getAttribute('gs-id')).toBe('coolWidget');\n\n // should not move again (no-op)\n grid.float(true);\n expect(grid.getFloat()).toBe(true);\n expect(parseInt(w.getAttribute('gs-x'))).toBe(6);\n expect(parseInt(w.getAttribute('gs-y'))).toBe(4);\n expect(parseInt(w.getAttribute('gs-w'))).toBe(2);\n expect(parseInt(w.getAttribute('gs-h'))).toBe(3);\n expect(w.getAttribute('gs-auto-position')).toBe(null);\n expect(w.getAttribute('gs-id')).toBe('coolWidget');\n });\n });\n\n describe('grid method addWidget with autoPosition true >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should change x, y coordinates for widgets. >', () => {\n grid = GridStack.init({float: true});\n let w = grid.addWidget({x:9, y:7, w:2, h:3, autoPosition:true});\n \n expect(parseInt(w.getAttribute('gs-x'), 10)).not.toBe(9);\n expect(parseInt(w.getAttribute('gs-y'), 10)).not.toBe(7);\n });\n });\n\n describe('grid method addWidget with widget options >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should autoPosition (missing X,Y) >', () => {\n grid = GridStack.init();\n let w = grid.addWidget({h: 2, id: 'optionWidget'});\n \n expect(parseInt(w.getAttribute('gs-x'))).toBe(8);\n expect(w.getAttribute('gs-y')).toBe(null);\n expect(w.getAttribute('gs-w')).toBe(null);\n expect(parseInt(w.getAttribute('gs-h'))).toBe(2);\n // expect(w.getAttribute('gs-auto-position')).toBe('true');\n expect(w.getAttribute('gs-id')).toBe('optionWidget');\n });\n it('should autoPosition (missing X) >', () => {\n grid = GridStack.init();\n let w = grid.addWidget({y: 9, h: 2, id: 'optionWidget'});\n \n expect(parseInt(w.getAttribute('gs-x'))).toBe(8);\n expect(w.getAttribute('gs-y')).toBe(null);\n expect(w.getAttribute('gs-w')).toBe(null);\n expect(parseInt(w.getAttribute('gs-h'))).toBe(2);\n // expect(w.getAttribute('gs-auto-position')).toBe('true');\n expect(w.getAttribute('gs-id')).toBe('optionWidget');\n });\n it('should autoPosition (missing Y) >', () => {\n grid = GridStack.init();\n let w = grid.addWidget({x: 9, h: 2, id: 'optionWidget'});\n \n expect(parseInt(w.getAttribute('gs-x'))).toBe(8);\n expect(w.getAttribute('gs-y')).toBe(null);\n expect(w.getAttribute('gs-w')).toBe(null);\n expect(parseInt(w.getAttribute('gs-h'))).toBe(2);\n // expect(w.getAttribute('gs-auto-position')).toBe('true');\n expect(w.getAttribute('gs-id')).toBe('optionWidget');\n });\n it('should autoPosition (correct X, missing Y) >', () => {\n grid = GridStack.init();\n let w = grid.addWidget({x: 8, h: 2, id: 'optionWidget'});\n \n expect(parseInt(w.getAttribute('gs-x'))).toBe(8);\n expect(w.getAttribute('gs-y')).toBe(null);\n expect(w.getAttribute('gs-w')).toBe(null);\n expect(parseInt(w.getAttribute('gs-h'))).toBe(2);\n // expect(w.getAttribute('gs-auto-position')).toBe('true');\n expect(w.getAttribute('gs-id')).toBe('optionWidget');\n });\n it('should autoPosition (empty options) >', () => {\n grid = GridStack.init();\n let w = grid.addWidget({ });\n \n expect(parseInt(w.getAttribute('gs-x'))).toBe(8);\n expect(w.getAttribute('gs-y')).toBe(null);\n expect(w.getAttribute('gs-w')).toBe(null);\n expect(w.getAttribute('gs-h')).toBe(null);\n // expect(w.getAttribute('gs-auto-position')).toBe('true');\n });\n\n });\n\n describe('addWidget() >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('bad string options should use default >', () => {\n grid = GridStack.init();\n let w = grid.addWidget({x: 'foo', y: null, w: 'bar', h: ''} as any);\n \n expect(parseInt(w.getAttribute('gs-x'))).toBe(8);\n expect(w.getAttribute('gs-y')).toBe(null);\n expect(w.getAttribute('gs-w')).toBe(null);\n expect(w.getAttribute('gs-h')).toBe(null);\n });\n it('makeWidget attr should be retained >', () => { // #1276\n grid = GridStack.init({float: true});\n const d = document.createElement('div');\n d.innerHTML = '
foo content
';\n grid.el.appendChild(d.firstChild);\n let w = grid.makeWidget('foo');\n expect(parseInt(w.getAttribute('gs-x'))).toBe(8);\n expect(w.getAttribute('gs-y')).toBe(null);\n expect(parseInt(w.getAttribute('gs-w'))).toBe(3);\n expect(w.gridstackNode.maxW).toBe(4);\n expect(w.getAttribute('gs-h')).toBe(null);\n expect(w.getAttribute('gs-id')).toBe('gsfoo');\n });\n it('makeWidget width option override >', () => {\n grid = GridStack.init({float: true});\n const d = document.createElement('div');\n d.innerHTML = '
foo content
';\n grid.el.appendChild(d.firstChild);\n let w = grid.makeWidget('foo', {x:null, y:null, w:2});\n \n expect(parseInt(w.getAttribute('gs-x'))).toBe(8);\n expect(w.getAttribute('gs-y')).toBe(null);\n expect(parseInt(w.getAttribute('gs-w'))).toBe(2);\n expect(w.getAttribute('gs-h')).toBe(null);\n });\n });\n\n describe('makeWidget() >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackEmptyHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('passing element >', () => {\n grid = GridStack.init();\n let doc = document.implementation.createHTMLDocument();\n doc.body.innerHTML = '
';\n let el = doc.body.children[0] as HTMLElement;\n grid.el.appendChild(el);\n let w = grid.makeWidget(el);\n expect(w.getAttribute('gs-x')).toBe(null);\n });\n it('passing element float=true >', () => {\n grid = GridStack.init({float: true});\n let doc = document.implementation.createHTMLDocument();\n doc.body.innerHTML = '
';\n let el = doc.body.children[0] as HTMLElement;\n grid.el.appendChild(el);\n let w = grid.makeWidget(el);\n expect(w.getAttribute('gs-x')).toBe(null);\n });\n it('passing class >', () => {\n grid = GridStack.init();\n let doc = document.implementation.createHTMLDocument();\n doc.body.innerHTML = '
';\n let el = doc.body.children[0] as HTMLElement;\n grid.el.appendChild(el);\n let w = grid.makeWidget('.item');\n expect(w.getAttribute('gs-x')).toBe(null);\n });\n it('passing class no dot >', () => {\n grid = GridStack.init();\n let doc = document.implementation.createHTMLDocument();\n doc.body.innerHTML = '
';\n let el = doc.body.children[0] as HTMLElement;\n grid.el.appendChild(el);\n let w = grid.makeWidget('item');\n expect(w.getAttribute('gs-x')).toBe(null);\n });\n it('passing id >', () => {\n grid = GridStack.init();\n let doc = document.implementation.createHTMLDocument();\n doc.body.innerHTML = '
';\n let el = doc.body.children[0] as HTMLElement;\n grid.el.appendChild(el);\n let w = grid.makeWidget('#item');\n expect(w.getAttribute('gs-x')).toBe(null);\n });\n it('passing id no # >', () => {\n grid = GridStack.init();\n let doc = document.implementation.createHTMLDocument();\n doc.body.innerHTML = '
';\n let el = doc.body.children[0] as HTMLElement;\n grid.el.appendChild(el);\n let w = grid.makeWidget('item');\n expect(w.getAttribute('gs-x')).toBe(null);\n });\n it('passing id as number >', () => {\n grid = GridStack.init();\n let doc = document.implementation.createHTMLDocument();\n doc.body.innerHTML = '
';\n let el = doc.body.children[0] as HTMLElement;\n grid.el.appendChild(el);\n let w = grid.makeWidget('1');\n expect(w.getAttribute('gs-x')).toBe(null);\n });\n });\n\n describe('method getFloat() >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should match true/false only >', () => {\n grid = GridStack.init({float: true});\n expect(grid.getFloat()).toBe(true);\n (grid as any).float(0);\n expect(grid.getFloat()).toBe(false);\n grid.float(null);\n expect(grid.getFloat()).toBe(false);\n grid.float(undefined);\n expect(grid.getFloat()).toBe(false);\n grid.float(false);\n expect(grid.getFloat()).toBe(false);\n });\n });\n\n describe('grid.destroy >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.getElementById('gs-cont').remove();\n });\n it('should cleanup gridstack >', () => {\n let options = {\n cellHeight: 80,\n margin: 5\n };\n grid = GridStack.init(options);\n let gridEl = grid.el;\n grid.destroy();\n expect(gridEl.parentElement).toBe(null);\n expect(grid.el).toBe(undefined);\n expect(grid.engine).toBe(undefined);\n });\n it('should cleanup gridstack but leave elements >', () => {\n let options = {\n cellHeight: 80,\n margin: 5\n };\n grid = GridStack.init(options);\n let gridEl = grid.el;\n grid.destroy(false);\n expect(gridEl.parentElement).not.toBe(null);\n expect(Utils.getElements('.grid-stack-item').length).toBe(2);\n expect(grid.el).toBe(undefined);\n expect(grid.engine).toBe(undefined);\n grid.destroy(); // sanity check for call twice!\n });\n });\n\n describe('grid.resize >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should resize widget >', () => {\n let options = {\n cellHeight: 80,\n margin: 5\n };\n grid = GridStack.init(options);\n let items = Utils.getElements('.grid-stack-item');\n grid.update(items[0], {w:5, h:5});\n expect(parseInt(items[0].getAttribute('gs-w'))).toBe(5);\n expect(parseInt(items[0].getAttribute('gs-h'))).toBe(5);\n });\n });\n\n describe('grid.move >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should move widget >', () => {\n let options = {\n cellHeight: 80,\n margin: 5,\n float: true\n };\n grid = GridStack.init(options);\n let items = Utils.getElements('.grid-stack-item');\n grid.update(items[0], {x:5, y:5});\n expect(parseInt(items[0].getAttribute('gs-x'))).toBe(5);\n expect(parseInt(items[0].getAttribute('gs-y'))).toBe(5);\n });\n });\n\n describe('grid.update >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should move and resize widget >', () => {\n grid = GridStack.init({float: true});\n let el = Utils.getElements('.grid-stack-item')[1];\n expect(parseInt(el.getAttribute('gs-w'))).toBe(4);\n \n grid.update(el, {x: 5, y: 4, h: 2});\n expect(parseInt(el.getAttribute('gs-x'))).toBe(5);\n expect(parseInt(el.getAttribute('gs-y'))).toBe(4);\n expect(parseInt(el.getAttribute('gs-w'))).toBe(4);\n expect(parseInt(el.getAttribute('gs-h'))).toBe(2);\n });\n it('should change noMove >', () => {\n grid = GridStack.init({float: true});\n let items = Utils.getElements('.grid-stack-item');\n let el = items[1];\n let dd = GridStack.getDD();\n \n grid.update(el, {noMove: true, noResize: false});\n expect(el.getAttribute('gs-no-move')).toBe('true');\n expect(el.getAttribute('gs-no-resize')).toBe(null); // false is no-op\n expect(dd.isResizable(el)).toBe(true);\n expect(dd.isDraggable(el)).toBe(false);\n expect(dd.isResizable(items[0])).toBe(true);\n expect(dd.isDraggable(items[0])).toBe(true);\n\n expect(parseInt(el.getAttribute('gs-x'))).toBe(4);\n expect(el.getAttribute('gs-y')).toBe(null);\n expect(parseInt(el.getAttribute('gs-w'))).toBe(4);\n expect(parseInt(el.getAttribute('gs-h'))).toBe(4);\n });\n it('should change content and id, and move >', () => {\n grid = GridStack.init({float: true});\n let el = findEl('gsItem2');\n let sub = el.querySelector('.grid-stack-item-content');\n\n grid.update(el, {id: 'newID', y: 1, content: 'new content'});\n expect(el.gridstackNode.id).toBe('newID');\n expect(el.getAttribute('gs-id')).toBe('newID');\n expect(sub.innerHTML).toBe('new content');\n expect(parseInt(el.getAttribute('gs-x'))).toBe(4);\n expect(parseInt(el.getAttribute('gs-y'))).toBe(1);\n expect(parseInt(el.getAttribute('gs-w'))).toBe(4);\n expect(parseInt(el.getAttribute('gs-h'))).toBe(4);\n });\n it('should change max and constrain a wanted resize >', () => {\n grid = GridStack.init({float: true});\n let el = findEl('gsItem2');\n expect(el.getAttribute('gs-max-w')).toBe(null);\n\n grid.update(el, {maxW: 2, w: 5});\n expect(parseInt(el.getAttribute('gs-x'))).toBe(4);\n expect(el.getAttribute('gs-y')).toBe(null);\n expect(parseInt(el.getAttribute('gs-w'))).toBe(2);\n expect(parseInt(el.getAttribute('gs-h'))).toBe(4);\n expect(el.gridstackNode.maxW).toBe(2);\n });\n it('should change max and constrain existing >', () => {\n grid = GridStack.init({float: true});\n let el = findEl('gsItem2');\n expect(el.getAttribute('gs-max-w')).toBe(null);\n\n grid.update(el, {maxW: 2});\n expect(parseInt(el.getAttribute('gs-x'))).toBe(4);\n expect(el.getAttribute('gs-y')).toBe(null);\n expect(parseInt(el.getAttribute('gs-w'))).toBe(2);\n expect(parseInt(el.getAttribute('gs-h'))).toBe(4);\n expect(el.gridstackNode.maxW).toBe(2);\n });\n it('should change all max and move, no inf loop! >', () => {\n grid = GridStack.init({float: true});\n let items = Utils.getElements('.grid-stack-item');\n\n items.forEach(item => {\n expect(item.getAttribute('gs-max-w')).toBe(null);\n expect(item.getAttribute('gs-max-h')).toBe(null);\n });\n\n grid.update('.grid-stack-item', {maxW: 2, maxH: 2});\n expect(items[0].getAttribute('gs-x')).toBe(null);\n expect(parseInt(items[1].getAttribute('gs-x'))).toBe(4);\n items.forEach((item: GridItemHTMLElement) => {\n expect(item.getAttribute('gs-y')).toBe(null);\n expect(parseInt(item.getAttribute('gs-h'))).toBe(2);\n expect(parseInt(item.getAttribute('gs-w'))).toBe(2);\n expect(item.gridstackNode.maxW).toBe(2);\n expect(item.gridstackNode.maxH).toBe(2);\n });\n });\n });\n\n describe('grid.margin >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should return margin >', () => {\n let options = {\n cellHeight: 80,\n margin: 12\n };\n grid = GridStack.init(options);\n expect(grid.getMargin()).toBe(12);\n });\n it('should return update margin >', () => {\n let options = {\n cellHeight: 80,\n margin: 5\n };\n grid = GridStack.init(options);\n grid.margin('11rem');\n expect(grid.getMargin()).toBe(11);\n });\n it('should change unit >', () => {\n let options = {\n cellHeight: 80,\n margin: 10,\n };\n grid = GridStack.init(options);\n expect(grid.getMargin()).toBe(10);\n grid.margin('10rem');\n expect(grid.getMargin()).toBe(10);\n });\n it('should not update css vars, with same value >', () => {\n let options = {\n cellHeight: 80,\n margin: 5\n };\n let grid: any = GridStack.init(options);\n expect(grid.getMargin()).toBe(5);\n vi.spyOn(grid, '_initMargin');\n grid.margin('5px');\n expect(grid._initMargin).not.toHaveBeenCalled();\n expect(grid.getMargin()).toBe(5);\n });\n it('should set top/bot/left value directly >', () => {\n let options = {\n cellHeight: 80,\n marginTop: 5,\n marginBottom: 0,\n marginLeft: 1,\n };\n let grid: any = GridStack.init(options);\n expect(grid.getMargin()).toBe(undefined);\n expect(grid.opts.marginTop).toBe(5);\n expect(grid.opts.marginBottom).toBe(0);\n expect(grid.opts.marginLeft).toBe(1);\n expect(grid.opts.marginRight).toBe(10); // default value\n });\n it('should set all 4 sides, and overall margin >', () => {\n let options = {\n cellHeight: 80,\n marginTop: 5,\n marginBottom: 5,\n marginLeft: 5,\n marginRight: 5,\n };\n let grid: any = GridStack.init(options);\n expect(grid.getMargin()).toBe(5);\n expect(grid.opts.marginTop).toBe(5);\n expect(grid.opts.marginBottom).toBe(5);\n expect(grid.opts.marginLeft).toBe(5);\n expect(grid.opts.marginRight).toBe(5);\n });\n it('init 2 values >', () => {\n let options = {\n cellHeight: 80,\n margin: '5px 10'\n };\n let grid: any = GridStack.init(options);\n expect(grid.getMargin()).toBe(undefined);\n expect(grid.opts.marginTop).toBe(5);\n expect(grid.opts.marginBottom).toBe(5);\n expect(grid.opts.marginLeft).toBe(10);\n expect(grid.opts.marginRight).toBe(10);\n });\n it('init 4 values >', () => {\n let options = {\n cellHeight: 80,\n margin: '1 2 0em 3'\n };\n let grid = GridStack.init(options);\n expect(grid.getMargin()).toBe(undefined);\n expect(grid.opts.marginTop).toBe(1);\n expect(grid.opts.marginRight).toBe(2);\n expect(grid.opts.marginBottom).toBe(0);\n expect(grid.opts.marginLeft).toBe(3);\n });\n it('set 2 values, should update css vars >', () => {\n let options = {\n cellHeight: 80,\n margin: 5\n };\n let grid = GridStack.init(options); \n expect(grid.getMargin()).toBe(5);\n grid.margin('1px 0');\n expect(grid.getMargin()).toBe(undefined);\n expect(grid.opts.marginTop).toBe(1);\n expect(grid.opts.marginBottom).toBe(1);\n expect(grid.opts.marginLeft).toBe(0);\n expect(grid.opts.marginRight).toBe(0);\n });\n });\n\n describe('grid.opts.rtl >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should add grid-stack-rtl class >', () => {\n let options = {\n cellHeight: 80,\n margin: 5,\n rtl: true\n };\n grid = GridStack.init(options);\n expect(grid.el.classList.contains('grid-stack-rtl')).toBe(true);\n });\n it('should not add grid-stack-rtl class >', () => {\n let options = {\n cellHeight: 80,\n margin: 5\n };\n grid = GridStack.init(options);\n expect(grid.el.classList.contains('grid-stack-rtl')).toBe(false);\n });\n }); \n\n describe('grid.enableMove', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should enable move for future also', () => {\n let options = {\n cellHeight: 80,\n margin: 5,\n disableDrag: true\n };\n grid = GridStack.init(options);\n let items = Utils.getElements('.grid-stack-item');\n items.forEach(el => expect(el.classList.contains('ui-draggable-disabled')).toBe(true));\n expect(grid.opts.disableDrag).toBe(true);\n\n grid.enableMove(true);\n items.forEach(el => expect(el.classList.contains('ui-draggable-disabled')).toBe(false));\n expect(grid.opts.disableDrag).not.toBe(true);\n });\n it('should disable move for existing only >', () => {\n let options = {\n cellHeight: 80,\n margin: 5\n };\n grid = GridStack.init(options);\n let items = Utils.getElements('.grid-stack-item');\n items.forEach(el => expect(el.classList.contains('ui-draggable-disabled')).toBe(false));\n expect(grid.opts.disableDrag).toBeFalsy();\n\n grid.enableMove(false);\n items.forEach(el => expect(el.classList.contains('ui-draggable-disabled')).toBe(true));\n expect(grid.opts.disableDrag).toBe(true);\n });\n });\n\n describe('grid.enableResize >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should enable resize >', () => {\n let options = {\n cellHeight: 80,\n margin: 5,\n disableResize: true\n };\n grid = GridStack.init(options);\n expect(grid.opts.disableResize).toBe(true);\n let items = Utils.getElements('.grid-stack-item');\n let dd = GridStack.getDD();\n expect(dd).not.toBe(null); // sanity test to verify type\n items.forEach(el => {\n expect(dd.isResizable(el)).toBe(false);\n expect(dd.isDraggable(el)).toBe(true);\n });\n grid.enableResize(true);\n expect(grid.opts.disableResize).not.toBe(true);\n items.forEach(el => {\n expect(dd.isResizable(el)).toBe(true);\n expect(dd.isDraggable(el)).toBe(true);\n });\n });\n it('should disable resize >', () => {\n let options = {\n cellHeight: 80,\n margin: 5\n };\n grid = GridStack.init(options);\n expect(grid.opts.disableResize).toBeFalsy();\n let items = Utils.getElements('.grid-stack-item');\n let dd = GridStack.getDD();\n items.forEach(el => expect(dd.isResizable(el)).toBe(true));\n grid.enableResize(false);\n expect(grid.opts.disableResize).toBe(true);\n items.forEach(el => {\n expect(dd.isResizable(el)).toBe(false);\n expect(dd.isDraggable(el)).toBe(true);\n });\n });\n });\n\n describe('grid.enable >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should enable movable and resizable >', () => {\n let options = {\n cellHeight: 80,\n margin: 5\n };\n grid = GridStack.init(options);\n let items = Utils.getElements('.grid-stack-item');\n let dd = GridStack.getDD();\n grid.enableResize(false);\n grid.enableMove(false);\n items.forEach(el => {\n expect(el.classList.contains('ui-draggable-disabled')).toBe(true);\n expect(dd.isResizable(el)).toBe(false);\n expect(dd.isDraggable(el)).toBe(false);\n });\n grid.enable();\n items.forEach(el => {\n expect(el.classList.contains('ui-draggable-disabled')).toBe(false);\n expect(dd.isResizable(el)).toBe(true);\n expect(dd.isDraggable(el)).toBe(true);\n });\n });\n });\n\n describe('grid.enable >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should lock widgets >', () => {\n let options = {\n cellHeight: 80,\n margin: 5\n };\n grid = GridStack.init(options);\n grid.update('.grid-stack-item', {locked: true});\n Utils.getElements('.grid-stack-item').forEach(item => {\n expect(item.getAttribute('gs-locked')).toBe('true');\n })\n });\n it('should unlock widgets >', () => {\n let options = {\n cellHeight: 80,\n margin: 5\n };\n grid = GridStack.init(options);\n grid.update('.grid-stack-item', {locked: false});\n Utils.getElements('.grid-stack-item').forEach(item => {\n expect(item.getAttribute('gs-locked')).toBe(null);\n })\n });\n });\n\n describe('custom grid placement #1054 >', () => {\n let HTML = \n '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
';\n let pos = [{x:0, y:0, w:12, h:9}, {x:0, y:9, w:12, h:5}, {x:0, y:14, w:7, h:6}, {x:7, y:14, w:5, h:6}];\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', HTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should have correct position >', () => {\n let items = Utils.getElements('.grid-stack-item');\n items.forEach((el, i) => {\n expect(parseInt(el.getAttribute('gs-x'))).toBe(pos[i].x);\n expect(parseInt(el.getAttribute('gs-y'))).toBe(pos[i].y);\n expect(parseInt(el.getAttribute('gs-w'))).toBe(pos[i].w);\n expect(parseInt(el.getAttribute('gs-h'))).toBe(pos[i].h);\n });\n });\n });\n\n describe('grid.compact >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should move all 3 items to top-left with no space >', () => {\n grid = GridStack.init({float: true});\n\n let el3 = grid.addWidget({x: 3, y: 5});\n expect(parseInt(el3.getAttribute('gs-x'))).toBe(3);\n expect(parseInt(el3.getAttribute('gs-y'))).toBe(5);\n\n grid.compact();\n expect(parseInt(el3.getAttribute('gs-x'))).toBe(8);\n expect(el3.getAttribute('gs-y')).toBe(null);\n });\n it('not move locked item >', () => {\n grid = GridStack.init({float: true});\n\n let el3 = grid.addWidget({x: 3, y: 5, locked: true, noMove: true});\n expect(parseInt(el3.getAttribute('gs-x'))).toBe(3);\n expect(parseInt(el3.getAttribute('gs-y'))).toBe(5);\n\n grid.compact();\n expect(parseInt(el3.getAttribute('gs-x'))).toBe(3);\n expect(parseInt(el3.getAttribute('gs-y'))).toBe(5);\n });\n });\n\n describe('gridOption locked #1181 >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackEmptyHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('not move locked item, size down added one >', () => {\n grid = GridStack.init();\n let el1 = grid.addWidget({x: 0, y: 1, w: 12, locked: true});\n expect(el1.getAttribute('gs-x')).toBe(null);\n expect(parseInt(el1.getAttribute('gs-y'))).toBe(1);\n\n let el2 = grid.addWidget({x: 2, y: 0, h: 3});\n expect(el1.getAttribute('gs-x')).toBe(null);\n expect(parseInt(el1.getAttribute('gs-y'))).toBe(1);\n expect(parseInt(el2.getAttribute('gs-x'))).toBe(2);\n expect(parseInt(el2.getAttribute('gs-y'))).toBe(2);\n expect(parseInt(el2.getAttribute('gs-h'))).toBe(3);\n });\n\n });\n\n describe('nested grids >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackNestedHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('should both init, second with nested class >', () => {\n grids = GridStack.initAll();\n expect(grids.length).toBe(2);\n expect(grids[0].el.classList.contains('grid-stack-nested')).toBe(false);\n expect(grids[1].el.classList.contains('grid-stack-nested')).toBe(true);\n });\n });\n\n describe('two grids >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridHTML);\n document.body.insertAdjacentHTML('afterbegin', gridHTML);\n });\n afterEach(() => {\n let els = document.body.querySelectorAll('.grid-stack');\n expect(els.length).toBe(2);\n els.forEach(g => g.remove());\n });\n it('should not remove incorrect child >', () => {\n grids = GridStack.initAll();\n expect(grids.length).toBe(2);\n expect(grids[0].engine.nodes.length).toBe(2);\n expect(grids[1].engine.nodes.length).toBe(2);\n // should do nothing\n grids[0].removeWidget( grids[1].engine.nodes[0].el );\n expect(grids[0].engine.nodes.length).toBe(2);\n expect(grids[0].el.children.length).toBe(2);\n expect(grids[1].engine.nodes.length).toBe(2);\n expect(grids[1].el.children.length).toBe(2);\n // should empty with no errors\n grids[1].removeAll();\n expect(grids[0].engine.nodes.length).toBe(2);\n expect(grids[0].el.children.length).toBe(2);\n expect(grids[1].engine.nodes.length).toBe(0);\n expect(grids[1].el.children.length).toBe(0);\n });\n it('should remove 1 child >', () => {\n grids = GridStack.initAll();\n grids[1].removeWidget( grids[1].engine.nodes[0].el );\n expect(grids[0].engine.nodes.length).toBe(2);\n expect(grids[0].el.children.length).toBe(2);\n expect(grids[1].engine.nodes.length).toBe(1);\n expect(grids[1].el.children.length).toBe(1);\n });\n });\n\n describe('grid.on events >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('add 3 single events >', () => {\n grid = GridStack.init();\n let fcn = (event: Event) => {};\n grid.on('added', fcn).on('enable', fcn).on('dragstart', fcn);\n expect((grid as any)._gsEventHandler.enable).not.toBe(undefined);\n grid.off('added').off('enable').off('dragstart');\n expect((grid as any)._gsEventHandler.enable).toBe(undefined);\n });\n it('add 3 events >', () => {\n let grid: any = GridStack.init(); // prevent TS check for string combine...\n let fcn = (event: CustomEvent) => {};\n grid.on('added enable dragstart', fcn);\n expect((grid as any)._gsEventHandler.enable).not.toBe(undefined);\n grid.off('added enable dragstart');\n expect((grid as any)._gsEventHandler.enable).toBe(undefined);\n });\n\n });\n\n describe('save & load >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('save layout >', () => {\n grid = GridStack.init({maxRow: 10});\n let layout = grid.save(false);\n expect(layout).toEqual([{x:0, y:0, w:4, h:2, id:'gsItem1'}, {x:4, y:0, w:4, h:4, id:'gsItem2'}]);\n layout = grid.save();\n expect(layout).toEqual([{x:0, y:0, w:4, h:2, id:'gsItem1', content:'item 1 text'}, {x:4, y:0, w:4, h:4, id:'gsItem2', content:'item 2 text'}]);\n layout = grid.save(true);\n expect(layout).toEqual([{x:0, y:0, w:4, h:2, id:'gsItem1', content:'item 1 text'}, {x:4, y:0, w:4, h:4, id:'gsItem2', content:'item 2 text'}]);\n });\n it('save layout full >', () => {\n grid = GridStack.init({maxRow: 10, _foo: 'bar'} as any); // using bogus 'internal' field (stripped)\n let layout = grid.save(false, true);\n expect(layout).toEqual({maxRow: 10, children: [{x:0, y:0, w:4, h:2, id:'gsItem1'}, {x:4, y:0, w:4, h:4, id:'gsItem2'}]});\n layout = grid.save(true, true);\n expect(layout).toEqual({maxRow: 10, children: [{x:0, y:0, w:4, h:2, id:'gsItem1', content:'item 1 text'}, {x:4, y:0, w:4, h:4, id:'gsItem2', content:'item 2 text'}]});\n });\n it('load move 1 item, delete others >', () => {\n grid = GridStack.init();\n grid.load([{x:2, h:1, id:'gsItem2'}]);\n let layout = grid.save(false);\n expect(layout).toEqual([{x:0, y:0, id:'gsItem2'}]);\n });\n it('load add new, delete others >', () => {\n grid = GridStack.init();\n grid.load([{w:2, y:0, h:1, id:'gsItem3'}], true);\n let layout = grid.save(false);\n expect(layout).toEqual([{x:0, y:0, w:2, id:'gsItem3'}]);\n });\n it('load 1 item only, no remove >', () => {\n grid = GridStack.init();\n grid.load([{h:3, id:'gsItem1'}], false);\n let layout = grid.save(false);\n expect(layout).toEqual([{x:0, y:0, h:3, id:'gsItem1'}, {x:4, y:0, w:4, h:4, id:'gsItem2'}]);\n });\n it('load 1 item only with callback >', () => {\n grid = GridStack.init();\n grid.load([{h:3, id:'gsItem1'}], () => null);\n let layout = grid.save(false);\n expect(layout).toEqual([{x:0, y:0, h:3, id:'gsItem1'}]);\n });\n });\n\n describe('load >', () => {\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('after init #1693 >', () => {\n grid = GridStack.init();\n grid.load([{id:'gsItem1',x:0,y:0,w:5,h:1},{id:'gsItem2',x:6,y:0,w:2,h:2}]);\n\n let el1 = document.getElementById('item1')\n expect(el1.getAttribute('gs-x')).toBe(null);\n expect(el1.getAttribute('gs-y')).toBe(null);\n expect(parseInt(el1.getAttribute('gs-w'))).toBe(5);\n expect(el1.getAttribute('gs-h')).toBe(null);\n\n let el2 = document.getElementById('item2')\n expect(parseInt(el2.getAttribute('gs-x'))).toBe(6);\n expect(el2.getAttribute('gs-y')).toBe(null);\n expect(parseInt(el2.getAttribute('gs-w'))).toBe(2);\n expect(parseInt(el2.getAttribute('gs-h'))).toBe(2);\n });\n it('after init replace nodes >', () => {\n grid = GridStack.init();\n expect(document.getElementById('item1')).not.toBe(null);\n expect(document.getElementById('item2')).not.toBe(null);\n\n // this will replace with 2 new nodes\n grid.load([{id:'new1',x:0,y:0,w:5,h:1},{id:'new2',x:6,y:0,w:2,h:2}]);\n expect(grid.engine.nodes.length).toBe(2);\n\n expect(document.getElementById('item1')).toBe(null);\n let el1 = grid.engine.nodes.find(n => n.id === 'new1').el;\n expect(el1.getAttribute('gs-x')).toBe(null);\n expect(el1.getAttribute('gs-y')).toBe(null);\n expect(parseInt(el1.getAttribute('gs-w'))).toBe(5);\n expect(el1.getAttribute('gs-h')).toBe(null);\n\n expect(document.getElementById('item2')).toBe(null);\n let el2 = grid.engine.nodes.find(n => n.id === 'new2').el;\n expect(parseInt(el2.getAttribute('gs-x'))).toBe(6);\n expect(el2.getAttribute('gs-y')).toBe(null);\n expect(parseInt(el2.getAttribute('gs-w'))).toBe(2);\n expect(parseInt(el2.getAttribute('gs-h'))).toBe(2);\n });\n });\n\n describe('load empty >', () => {\n let items: GridStackWidget[];\n let grid: GridStack;\n const test = () => {\n items.forEach(item => {\n const n = grid.engine.nodes.find(n => n.id === item.id);\n if (item.y) expect(parseInt(n.el.getAttribute('gs-y'))).toBe(item.y!);\n else expect(n.el.getAttribute('gs-y')).toBe(null);\n });\n }\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackEmptyHTML);\n items = [\n {id: '0', x: 0, y: 0},\n {id: '1', x: 0, y: 1},\n {id: '2', x: 0, y: 2},\n {id: '3', x: 0, y: 3},\n ];\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('update collision >', () => {\n grid = GridStack.init({children: items});\n const n = grid.engine.nodes[0];\n test();\n\n grid.update(n.el!, {h:5});\n items[1].y = 5; items[2].y = 6; items[3].y = 7;\n test();\n\n grid.update(n.el!, {h:1});\n items[1].y = 1; items[2].y = 2; items[3].y = 3;\n test();\n });\n it('load collision 2208 >', () => {\n grid = GridStack.init({children: items});\n test();\n\n items[0].h = 5;\n grid.load(items);\n items[1].y = 5; items[2].y = 6; items[3].y = 7;\n test();\n\n items[0].h = 1;\n grid.load(items);\n items[1].y = 1; items[2].y = 2; items[3].y = 3;\n test();\n });\n it('load full collision 2208 >', () => {\n grid = GridStack.init({children: items});\n test();\n\n items[0].h = 5;\n grid.load(grid.engine.nodes.map((n, index) => {\n if (index === 0) return {...n, h: 5}\n return n;\n }));\n items[1].y = 5; items[2].y = 6; items[3].y = 7;\n test();\n\n items[0].h = 1;\n grid.load(grid.engine.nodes.map((n, index) => {\n if (index === 0) return {...n, h: 1}\n return n;\n }));\n items[1].y = 1; items[2].y = 2; items[3].y = 3;\n test();\n });\n });\n\n // ..and finally track log warnings at the end, instead of displaying them....\n describe('obsolete warnings >', () => {\n console.warn = vi.fn(); // track warnings instead of displaying them\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('willItFit() legacy >', () => {\n grid = GridStack.init({maxRow: 5});\n expect((grid as any).willItFit(0, 0, 1, 3, false)).toBe(true);\n expect((grid as any).willItFit(0, 0, 1, 4, false)).toBe(false);\n });\n it('warning if OLD commit() is called >', () => {\n grid = GridStack.init();\n grid.batchUpdate(true);\n expect(grid.engine.batchMode).toBe(true);\n grid.commit(); // old API\n expect(grid.engine.batchMode).toBe(false);\n // expect(console.warn).toHaveBeenCalledWith('gridstack.js: Function `setGridWidth` is deprecated in v0.5.3 and has been replaced with `column`. It will be **completely** removed in v1.0');\n });\n\n /* saving as example\n it('warning if OLD setGridWidth is called >', () => {\n let grid: any = GridStack.init();\n grid.setGridWidth(11); // old 0.5.2 API\n expect(grid.getColumn()).toBe(11);\n expect(console.warn).toHaveBeenCalledWith('gridstack.js: Function `setGridWidth` is deprecated in v0.5.3 and has been replaced with `column`. It will be **completely** removed in v1.0');\n });\n */\n });\n\n // Note: Stylesheet tests moved to E2E tests\n // where real browser CSS engines can provide accurate getComputedStyle() values\n // describe('stylesheet', () => {});\n\n \n describe('updateOptions()', () => {\n let grid: GridStack;\n beforeEach(() => {\n document.body.insertAdjacentHTML('afterbegin', gridstackHTML);\n grid = GridStack.init({ cellHeight: 30 });\n });\n afterEach(() => {\n document.body.removeChild(document.getElementById('gs-cont'));\n });\n it('update all values supported', () => {\n grid.updateOptions({\n cellHeight: '40px',\n margin: 8,\n column: 11,\n float: true, \n row: 10,\n });\n expect(grid.getCellHeight(true)).toBe(40);\n expect(grid.getMargin()).toBe(8);\n expect(grid.opts.marginTop).toBe(8);\n expect(grid.getColumn()).toBe(11);\n expect(grid.getFloat()).toBe(true);\n expect(grid.opts.row).toBe(10);\n expect(grid.opts.minRow).toBe(10);\n expect(grid.opts.maxRow).toBe(10);\n });\n });\n\n});\n"]} \ No newline at end of file diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/integration/gridstack-integration.spec.d.ts b/web/skins/classic/assets/gridstack-12.3.3/dist/spec/integration/gridstack-integration.spec.d.ts deleted file mode 100644 index cb0ff5c3b..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/integration/gridstack-integration.spec.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/integration/gridstack-integration.spec.js b/web/skins/classic/assets/gridstack-12.3.3/dist/spec/integration/gridstack-integration.spec.js deleted file mode 100644 index 8ee244306..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/integration/gridstack-integration.spec.js +++ /dev/null @@ -1,171 +0,0 @@ -import { GridStack } from '../../src/gridstack'; -// Integration tests for GridStack HTML scenarios -// These test actual GridStack behavior with DOM manipulation -describe('GridStack Integration Tests', () => { - beforeEach(() => { - // // Clean up DOM before each test - // document.body.innerHTML = ''; - // // Add basic CSS for GridStack to function properly - // const style = document.createElement('style'); - // style.textContent = ` - // .grid-stack { position: relative; } - // .grid-stack-item { position: absolute; } - // .grid-stack-item-content { width: 100%; height: 100%; } - // `; - // document.head.appendChild(style); - }); - afterEach(() => { - // // Clean up any GridStack instances - // GridStack.removeAll; - // // Clean up added styles - // const styles = document.head.querySelectorAll('style'); - // styles.forEach(style => style.remove()); - }); - describe('Auto-positioning with no x,y coordinates', () => { - it('should position items in order 5,1,2,4,3 based on their constraints', () => { - // Create the HTML structure from the test file - document.body.innerHTML = ` -
-
-
item 1
-
-
-
item 2
-
-
-
item 3 too big to fit, so next row
-
-
-
item 4
-
-
-
item 5 first
-
-
- `; - // Initialize GridStack with same options as test - const options = { - cellHeight: 80, - margin: 5, - float: true - }; - const grid = GridStack.init(options); - // Get all nodes and their positions - const nodes = grid.engine.nodes; - expect(nodes).toHaveLength(5); - // Item 5 should be positioned (has explicit x=1, y=1 in HTML) - const item5 = nodes.find(n => n.id === '5'); - expect(item5).toBeDefined(); - expect(item5.w).toBe(1); - expect(item5.h).toBe(1); - // Item 1 should be positioned next (2x2) - const item1 = nodes.find(n => n.id === '1'); - expect(item1).toBeDefined(); - expect(item1.w).toBe(2); - expect(item1.h).toBe(2); - // Item 2 should be positioned (3x2) - const item2 = nodes.find(n => n.id === '2'); - expect(item2).toBeDefined(); - expect(item2.w).toBe(3); - expect(item2.h).toBe(2); - // Item 4 should be positioned (3x1) - const item4 = nodes.find(n => n.id === '4'); - expect(item4).toBeDefined(); - expect(item4.w).toBe(3); - expect(item4.h).toBe(1); - // Item 3 should be on next row (too big to fit - 9x1) - const item3 = nodes.find(n => n.id === '3'); - expect(item3).toBeDefined(); - expect(item3.w).toBe(9); - expect(item3.h).toBe(1); - // Verify all items are positioned (have valid coordinates) - nodes.forEach(node => { - expect(node.x).toBeGreaterThanOrEqual(0); - expect(node.y).toBeGreaterThanOrEqual(0); - expect(node.w).toBeGreaterThan(0); - expect(node.h).toBeGreaterThan(0); - }); - }); - }); - describe('Grid initialization and basic functionality', () => { - it('should initialize GridStack with items and maintain data integrity', () => { - document.body.innerHTML = ` -
-
-
Item 1
-
-
-
Item 2
-
-
- `; - const grid = GridStack.init(); - expect(grid).toBeDefined(); - expect(grid.engine.nodes).toHaveLength(2); - const item1 = grid.engine.nodes.find(n => n.id === 'item1'); - const item2 = grid.engine.nodes.find(n => n.id === 'item2'); - expect(item1).toEqual(expect.objectContaining({ - x: 0, y: 0, w: 4, h: 2, id: 'item1' - })); - expect(item2).toEqual(expect.objectContaining({ - x: 4, y: 0, w: 4, h: 4, id: 'item2' - })); - }); - it('should handle empty grid initialization', () => { - document.body.innerHTML = '
'; - const grid = GridStack.init(); - expect(grid).toBeDefined(); - expect(grid.engine.nodes).toHaveLength(0); - }); - it('should add widgets programmatically', () => { - document.body.innerHTML = '
'; - const grid = GridStack.init(); - const addedEl = grid.addWidget({ - x: 0, y: 0, w: 2, h: 2, id: 'new-widget' - }); - expect(addedEl).toBeDefined(); - expect(grid.engine.nodes).toHaveLength(1); - // Check that the widget was added with valid properties - const node = grid.engine.nodes[0]; - expect(node.x).toBe(0); - expect(node.y).toBe(0); - // Note: w and h might default to 1x1 if not explicitly set in the HTML attributes - }); - }); - describe('Layout and positioning validation', () => { - it('should respect minRow constraints', () => { - document.body.innerHTML = '
'; - const grid = GridStack.init({ minRow: 3 }); - // Even with no items, grid should maintain minimum rows - expect(grid.getRow()).toBeGreaterThanOrEqual(3); - }); - it('should handle widget collision detection', () => { - document.body.innerHTML = ` -
-
-
Item 1
-
-
- `; - const grid = GridStack.init(); - // Try to add overlapping widget - const widgetEl = grid.addWidget({ - x: 1, y: 1, w: 2, h: 2, id: 'overlap' - }); - expect(widgetEl).toBeDefined(); - expect(grid.engine.nodes).toHaveLength(2); - // Verify that items don't actually overlap (GridStack should handle collision) - // Just verify we have 2 nodes without overlap testing since the API changed - const nodes = grid.engine.nodes; - expect(nodes).toHaveLength(2); - // All nodes should have valid positions - nodes.forEach(node => { - expect(node.x).toBeGreaterThanOrEqual(0); - expect(node.y).toBeGreaterThanOrEqual(0); - expect(node.w).toBeGreaterThan(0); - expect(node.h).toBeGreaterThan(0); - }); - }); - }); -}); -//# sourceMappingURL=gridstack-integration.spec.js.map \ No newline at end of file diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/integration/gridstack-integration.spec.js.map b/web/skins/classic/assets/gridstack-12.3.3/dist/spec/integration/gridstack-integration.spec.js.map deleted file mode 100644 index 3296776b2..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/integration/gridstack-integration.spec.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"gridstack-integration.spec.js","sourceRoot":"","sources":["../../../spec/integration/gridstack-integration.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { GridStack } from '../../src/gridstack';\n\n// Integration tests for GridStack HTML scenarios\n// These test actual GridStack behavior with DOM manipulation\n\ndescribe('GridStack Integration Tests', () => {\n beforeEach(() => {\n // // Clean up DOM before each test\n // document.body.innerHTML = '';\n // // Add basic CSS for GridStack to function properly\n // const style = document.createElement('style');\n // style.textContent = `\n // .grid-stack { position: relative; }\n // .grid-stack-item { position: absolute; }\n // .grid-stack-item-content { width: 100%; height: 100%; }\n // `;\n // document.head.appendChild(style);\n });\n\n afterEach(() => {\n // // Clean up any GridStack instances\n // GridStack.removeAll;\n // // Clean up added styles\n // const styles = document.head.querySelectorAll('style');\n // styles.forEach(style => style.remove());\n });\n\n describe('Auto-positioning with no x,y coordinates', () => {\n it('should position items in order 5,1,2,4,3 based on their constraints', () => {\n // Create the HTML structure from the test file\n document.body.innerHTML = `\n
\n
\n
item 1
\n
\n
\n
item 2
\n
\n
\n
item 3 too big to fit, so next row
\n
\n
\n
item 4
\n
\n
\n
item 5 first
\n
\n
\n `;\n\n // Initialize GridStack with same options as test\n const options = {\n cellHeight: 80,\n margin: 5,\n float: true\n };\n const grid = GridStack.init(options);\n\n // Get all nodes and their positions\n const nodes = grid.engine.nodes;\n expect(nodes).toHaveLength(5);\n\n // Item 5 should be positioned (has explicit x=1, y=1 in HTML)\n const item5 = nodes.find(n => n.id === '5');\n expect(item5).toBeDefined();\n expect(item5!.w).toBe(1);\n expect(item5!.h).toBe(1);\n\n // Item 1 should be positioned next (2x2)\n const item1 = nodes.find(n => n.id === '1');\n expect(item1).toBeDefined();\n expect(item1!.w).toBe(2);\n expect(item1!.h).toBe(2);\n\n // Item 2 should be positioned (3x2) \n const item2 = nodes.find(n => n.id === '2');\n expect(item2).toBeDefined();\n expect(item2!.w).toBe(3);\n expect(item2!.h).toBe(2);\n\n // Item 4 should be positioned (3x1)\n const item4 = nodes.find(n => n.id === '4');\n expect(item4).toBeDefined();\n expect(item4!.w).toBe(3);\n expect(item4!.h).toBe(1);\n\n // Item 3 should be on next row (too big to fit - 9x1)\n const item3 = nodes.find(n => n.id === '3');\n expect(item3).toBeDefined();\n expect(item3!.w).toBe(9);\n expect(item3!.h).toBe(1);\n \n // Verify all items are positioned (have valid coordinates)\n nodes.forEach(node => {\n expect(node.x).toBeGreaterThanOrEqual(0);\n expect(node.y).toBeGreaterThanOrEqual(0);\n expect(node.w).toBeGreaterThan(0);\n expect(node.h).toBeGreaterThan(0);\n });\n });\n });\n\n describe('Grid initialization and basic functionality', () => {\n it('should initialize GridStack with items and maintain data integrity', () => {\n document.body.innerHTML = `\n
\n
\n
Item 1
\n
\n
\n
Item 2
\n
\n
\n `;\n\n const grid = GridStack.init();\n \n expect(grid).toBeDefined();\n expect(grid.engine.nodes).toHaveLength(2);\n \n const item1 = grid.engine.nodes.find(n => n.id === 'item1');\n const item2 = grid.engine.nodes.find(n => n.id === 'item2');\n \n expect(item1).toEqual(expect.objectContaining({\n x: 0, y: 0, w: 4, h: 2, id: 'item1'\n }));\n \n expect(item2).toEqual(expect.objectContaining({\n x: 4, y: 0, w: 4, h: 4, id: 'item2'\n }));\n });\n\n it('should handle empty grid initialization', () => {\n document.body.innerHTML = '
';\n \n const grid = GridStack.init();\n \n expect(grid).toBeDefined();\n expect(grid.engine.nodes).toHaveLength(0);\n });\n\n it('should add widgets programmatically', () => {\n document.body.innerHTML = '
';\n \n const grid = GridStack.init();\n \n const addedEl = grid.addWidget({\n x: 0, y: 0, w: 2, h: 2, id: 'new-widget'\n });\n \n expect(addedEl).toBeDefined();\n expect(grid.engine.nodes).toHaveLength(1);\n \n // Check that the widget was added with valid properties\n const node = grid.engine.nodes[0];\n expect(node.x).toBe(0);\n expect(node.y).toBe(0);\n // Note: w and h might default to 1x1 if not explicitly set in the HTML attributes\n });\n });\n\n describe('Layout and positioning validation', () => {\n it('should respect minRow constraints', () => {\n document.body.innerHTML = '
';\n \n const grid = GridStack.init({ minRow: 3 });\n \n // Even with no items, grid should maintain minimum rows\n expect(grid.getRow()).toBeGreaterThanOrEqual(3);\n });\n\n it('should handle widget collision detection', () => {\n document.body.innerHTML = `\n
\n
\n
Item 1
\n
\n
\n `;\n\n const grid = GridStack.init();\n \n // Try to add overlapping widget\n const widgetEl = grid.addWidget({\n x: 1, y: 1, w: 2, h: 2, id: 'overlap'\n });\n \n expect(widgetEl).toBeDefined();\n expect(grid.engine.nodes).toHaveLength(2);\n \n // Verify that items don't actually overlap (GridStack should handle collision)\n // Just verify we have 2 nodes without overlap testing since the API changed\n const nodes = grid.engine.nodes;\n expect(nodes).toHaveLength(2);\n \n // All nodes should have valid positions\n nodes.forEach(node => {\n expect(node.x).toBeGreaterThanOrEqual(0);\n expect(node.y).toBeGreaterThanOrEqual(0);\n expect(node.w).toBeGreaterThan(0);\n expect(node.h).toBeGreaterThan(0);\n });\n });\n });\n});\n"]} \ No newline at end of file diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/regression-spec.d.ts b/web/skins/classic/assets/gridstack-12.3.3/dist/spec/regression-spec.d.ts deleted file mode 100644 index cb0ff5c3b..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/regression-spec.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/regression-spec.js b/web/skins/classic/assets/gridstack-12.3.3/dist/spec/regression-spec.js deleted file mode 100644 index 0c68981f8..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/regression-spec.js +++ /dev/null @@ -1,100 +0,0 @@ -import { GridStack } from '../src/gridstack'; -describe('regression >', () => { - 'use strict'; - let grid; - let findEl = function (id) { - return grid.engine.nodes.find(n => n.id === id).el; - }; - let findSubEl = function (id, index = 0) { - return grid.engine.nodes[index].subGrid?.engine.nodes.find(n => n.id === id).el; - }; - // empty grid - let gridstackEmptyHTML = '
' + - '
' + - '
'; - describe('2492 load() twice >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackEmptyHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('', () => { - let items = [ - { x: 0, y: 0, w: 2, content: '0 wide' }, - { x: 1, y: 0, content: '1 over' }, - { x: 2, y: 1, content: '2 float' }, - ]; - let count = 0; - items.forEach(n => n.id = String(count++)); - grid = GridStack.init({ cellHeight: 70, margin: 5 }).load(items); - let el0 = findEl('0'); - let el1 = findEl('1'); - let el2 = findEl('2'); - expect(el0.getAttribute('gs-x')).toBe(null); - expect(el0.getAttribute('gs-y')).toBe(null); - expect(el0.children[0].innerHTML).toBe(items[0].content); - expect(parseInt(el1.getAttribute('gs-x'))).toBe(1); - expect(parseInt(el1.getAttribute('gs-y'))).toBe(1); - expect(parseInt(el2.getAttribute('gs-x'))).toBe(2); - expect(el2.getAttribute('gs-y')).toBe(null); - // loading with changed content should be same positions - items.forEach(n => n.content += '*'); - grid.load(items); - expect(el0.getAttribute('gs-x')).toBe(null); - expect(el0.getAttribute('gs-y')).toBe(null); - expect(el0.children[0].innerHTML).toBe(items[0].content); - expect(parseInt(el1.getAttribute('gs-x'))).toBe(1); - expect(parseInt(el1.getAttribute('gs-y'))).toBe(1); - expect(parseInt(el2.getAttribute('gs-x'))).toBe(2); - expect(el2.getAttribute('gs-y')).toBe(null); - }); - }); - describe('2865 nested grid resize >', () => { - beforeEach(() => { - document.body.insertAdjacentHTML('afterbegin', gridstackEmptyHTML); - }); - afterEach(() => { - document.body.removeChild(document.getElementById('gs-cont')); - }); - it('', () => { - let children = [{}, {}, {}]; - let items = [ - { x: 0, y: 0, w: 3, h: 5, sizeToContent: true, subGridOpts: { children, column: 'auto' } } - ]; - let count = 0; - [...items, ...children].forEach(n => n.id = String(count++)); - grid = GridStack.init({ cellHeight: 70, margin: 5, children: items }); - let nested = findEl('0'); - let el1 = findSubEl('1'); - let el2 = findSubEl('2'); - let el3 = findSubEl('3'); - expect(nested.getAttribute('gs-x')).toBe(null); - expect(nested.getAttribute('gs-y')).toBe(null); - expect(parseInt(nested.getAttribute('gs-w'))).toBe(3); - // TODO: sizeToContent doesn't seem to be called in headless mode ??? works in browser. - // expect(nested.getAttribute('gs-h')).toBe(null); // sizeToContent 5 -> 1 which is null - expect(el1.getAttribute('gs-x')).toBe(null); - expect(el1.getAttribute('gs-y')).toBe(null); - expect(parseInt(el2.getAttribute('gs-x'))).toBe(1); - expect(el2.getAttribute('gs-y')).toBe(null); - expect(parseInt(el3.getAttribute('gs-x'))).toBe(2); - expect(el3.getAttribute('gs-y')).toBe(null); - // now resize the nested grid to 2 -> should reflow el3 - grid.update(nested, { w: 2 }); - expect(nested.getAttribute('gs-x')).toBe(null); - expect(nested.getAttribute('gs-y')).toBe(null); - expect(parseInt(nested.getAttribute('gs-w'))).toBe(2); - // TODO: sizeToContent doesn't seem to be called in headless mode ??? works in browser. - // expect(parseInt(nested.getAttribute('gs-h'))).toBe(2); - expect(el1.getAttribute('gs-x')).toBe(null); - expect(el1.getAttribute('gs-y')).toBe(null); - expect(parseInt(el2.getAttribute('gs-x'))).toBe(1); - expect(el2.getAttribute('gs-y')).toBe(null); - // 3rd item pushed to next row - expect(el3.getAttribute('gs-x')).toBe(null); - expect(parseInt(el3.getAttribute('gs-y'))).toBe(1); - }); - }); -}); -//# sourceMappingURL=regression-spec.js.map \ No newline at end of file diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/regression-spec.js.map b/web/skins/classic/assets/gridstack-12.3.3/dist/spec/regression-spec.js.map deleted file mode 100644 index 7527ea670..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/regression-spec.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"regression-spec.js","sourceRoot":"","sources":["../../spec/regression-spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { GridItemHTMLElement, GridStack, GridStackWidget } from '../src/gridstack';\r\n\r\ndescribe('regression >', () => {\r\n 'use strict';\r\n\r\n let grid: GridStack;\r\n let findEl = function(id: string): GridItemHTMLElement {\r\n return grid.engine.nodes.find(n => n.id === id)!.el!;\r\n };\r\n let findSubEl = function(id: string, index = 0): GridItemHTMLElement {\r\n return grid.engine.nodes[index].subGrid?.engine.nodes.find(n => n.id === id)!.el!;\r\n };\r\n\r\n\r\n // empty grid\r\n let gridstackEmptyHTML =\r\n '
' +\r\n '
' +\r\n '
';\r\n\r\n describe('2492 load() twice >', () => {\r\n beforeEach(() => {\r\n document.body.insertAdjacentHTML('afterbegin', gridstackEmptyHTML);\r\n });\r\n afterEach(() => {\r\n document.body.removeChild(document.getElementById('gs-cont'));\r\n });\r\n it('', () => {\r\n let items: GridStackWidget[] = [\r\n {x: 0, y: 0, w:2, content: '0 wide'},\r\n {x: 1, y: 0, content: '1 over'},\r\n {x: 2, y: 1, content: '2 float'},\r\n ];\r\n let count = 0;\r\n items.forEach(n => n.id = String(count++));\r\n grid = GridStack.init({cellHeight: 70, margin: 5}).load(items);\r\n\r\n let el0 = findEl('0');\r\n let el1 = findEl('1');\r\n let el2 = findEl('2');\r\n\r\n expect(el0.getAttribute('gs-x')).toBe(null);\r\n expect(el0.getAttribute('gs-y')).toBe(null);\r\n expect(el0.children[0].innerHTML).toBe(items[0].content!);\r\n expect(parseInt(el1.getAttribute('gs-x'))).toBe(1);\r\n expect(parseInt(el1.getAttribute('gs-y'))).toBe(1);\r\n expect(parseInt(el2.getAttribute('gs-x'))).toBe(2);\r\n expect(el2.getAttribute('gs-y')).toBe(null);\r\n\r\n // loading with changed content should be same positions\r\n items.forEach(n => n.content += '*')\r\n grid.load(items);\r\n expect(el0.getAttribute('gs-x')).toBe(null);\r\n expect(el0.getAttribute('gs-y')).toBe(null);\r\n expect(el0.children[0].innerHTML).toBe(items[0].content!);\r\n expect(parseInt(el1.getAttribute('gs-x'))).toBe(1);\r\n expect(parseInt(el1.getAttribute('gs-y'))).toBe(1);\r\n expect(parseInt(el2.getAttribute('gs-x'))).toBe(2);\r\n expect(el2.getAttribute('gs-y')).toBe(null);\r\n });\r\n });\r\n\r\n describe('2865 nested grid resize >', () => {\r\n beforeEach(() => {\r\n document.body.insertAdjacentHTML('afterbegin', gridstackEmptyHTML);\r\n });\r\n afterEach(() => {\r\n document.body.removeChild(document.getElementById('gs-cont'));\r\n });\r\n it('', () => {\r\n let children: GridStackWidget[] = [{},{},{}];\r\n let items: GridStackWidget[] = [\r\n {x: 0, y: 0, w:3, h:5, sizeToContent: true, subGridOpts: {children, column: 'auto'}}\r\n ];\r\n let count = 0;\r\n [...items, ...children].forEach(n => n.id = String(count++));\r\n grid = GridStack.init({cellHeight: 70, margin: 5, children: items});\r\n\r\n let nested = findEl('0');\r\n let el1 = findSubEl('1');\r\n let el2 = findSubEl('2');\r\n let el3 = findSubEl('3');\r\n expect(nested.getAttribute('gs-x')).toBe(null);\r\n expect(nested.getAttribute('gs-y')).toBe(null);\r\n expect(parseInt(nested.getAttribute('gs-w'))).toBe(3);\r\n // TODO: sizeToContent doesn't seem to be called in headless mode ??? works in browser.\r\n // expect(nested.getAttribute('gs-h')).toBe(null); // sizeToContent 5 -> 1 which is null\r\n expect(el1.getAttribute('gs-x')).toBe(null);\r\n expect(el1.getAttribute('gs-y')).toBe(null);\r\n expect(parseInt(el2.getAttribute('gs-x'))).toBe(1);\r\n expect(el2.getAttribute('gs-y')).toBe(null);\r\n expect(parseInt(el3.getAttribute('gs-x'))).toBe(2);\r\n expect(el3.getAttribute('gs-y')).toBe(null);\r\n\r\n // now resize the nested grid to 2 -> should reflow el3\r\n grid.update(nested, {w:2});\r\n expect(nested.getAttribute('gs-x')).toBe(null);\r\n expect(nested.getAttribute('gs-y')).toBe(null);\r\n expect(parseInt(nested.getAttribute('gs-w'))).toBe(2);\r\n // TODO: sizeToContent doesn't seem to be called in headless mode ??? works in browser.\r\n // expect(parseInt(nested.getAttribute('gs-h'))).toBe(2);\r\n expect(el1.getAttribute('gs-x')).toBe(null);\r\n expect(el1.getAttribute('gs-y')).toBe(null);\r\n expect(parseInt(el2.getAttribute('gs-x'))).toBe(1);\r\n expect(el2.getAttribute('gs-y')).toBe(null);\r\n // 3rd item pushed to next row\r\n expect(el3.getAttribute('gs-x')).toBe(null);\r\n expect(parseInt(el3.getAttribute('gs-y'))).toBe(1);\r\n });\r\n });\r\n});\r\n"]} \ No newline at end of file diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/utils-spec.d.ts b/web/skins/classic/assets/gridstack-12.3.3/dist/spec/utils-spec.d.ts deleted file mode 100644 index cb0ff5c3b..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/utils-spec.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/utils-spec.js b/web/skins/classic/assets/gridstack-12.3.3/dist/spec/utils-spec.js deleted file mode 100644 index bd68dadef..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/utils-spec.js +++ /dev/null @@ -1,243 +0,0 @@ -import { Utils } from '../src/utils'; -describe('gridstack utils', () => { - describe('setup of utils', () => { - it('should set gridstack Utils.', () => { - let utils = Utils; - expect(utils).not.toBeNull(); - expect(typeof utils).toBe('function'); - }); - }); - describe('test toBool', () => { - it('should return booleans.', () => { - expect(Utils.toBool(true)).toEqual(true); - expect(Utils.toBool(false)).toEqual(false); - }); - it('should work with integer.', () => { - expect(Utils.toBool(1)).toEqual(true); - expect(Utils.toBool(0)).toEqual(false); - }); - it('should work with Strings.', () => { - expect(Utils.toBool('')).toEqual(false); - expect(Utils.toBool('0')).toEqual(false); - expect(Utils.toBool('no')).toEqual(false); - expect(Utils.toBool('false')).toEqual(false); - expect(Utils.toBool('yes')).toEqual(true); - expect(Utils.toBool('yadda')).toEqual(true); - }); - }); - describe('test isIntercepted', () => { - let src = { x: 3, y: 2, w: 3, h: 2 }; - it('should intercept.', () => { - expect(Utils.isIntercepted(src, { x: 0, y: 0, w: 4, h: 3 })).toEqual(true); - expect(Utils.isIntercepted(src, { x: 0, y: 0, w: 40, h: 30 })).toEqual(true); - expect(Utils.isIntercepted(src, { x: 3, y: 2, w: 3, h: 2 })).toEqual(true); - expect(Utils.isIntercepted(src, { x: 5, y: 3, w: 3, h: 2 })).toEqual(true); - }); - it('shouldn\'t intercept.', () => { - expect(Utils.isIntercepted(src, { x: 0, y: 0, w: 3, h: 2 })).toEqual(false); - expect(Utils.isIntercepted(src, { x: 0, y: 0, w: 13, h: 2 })).toEqual(false); - expect(Utils.isIntercepted(src, { x: 1, y: 4, w: 13, h: 2 })).toEqual(false); - expect(Utils.isIntercepted(src, { x: 0, y: 3, w: 3, h: 2 })).toEqual(false); - expect(Utils.isIntercepted(src, { x: 6, y: 3, w: 3, h: 2 })).toEqual(false); - }); - }); - describe('test parseHeight', () => { - it('should parse height value', () => { - expect(Utils.parseHeight(12)).toEqual(expect.objectContaining({ h: 12, unit: 'px' })); - expect(Utils.parseHeight('12px')).toEqual(expect.objectContaining({ h: 12, unit: 'px' })); - expect(Utils.parseHeight('12.3px')).toEqual(expect.objectContaining({ h: 12.3, unit: 'px' })); - expect(Utils.parseHeight('12.3em')).toEqual(expect.objectContaining({ h: 12.3, unit: 'em' })); - expect(Utils.parseHeight('12.3rem')).toEqual(expect.objectContaining({ h: 12.3, unit: 'rem' })); - expect(Utils.parseHeight('12.3vh')).toEqual(expect.objectContaining({ h: 12.3, unit: 'vh' })); - expect(Utils.parseHeight('12.3vw')).toEqual(expect.objectContaining({ h: 12.3, unit: 'vw' })); - expect(Utils.parseHeight('12.3%')).toEqual(expect.objectContaining({ h: 12.3, unit: '%' })); - expect(Utils.parseHeight('12.5cm')).toEqual(expect.objectContaining({ h: 12.5, unit: 'cm' })); - expect(Utils.parseHeight('12.5mm')).toEqual(expect.objectContaining({ h: 12.5, unit: 'mm' })); - expect(Utils.parseHeight('12.5')).toEqual(expect.objectContaining({ h: 12.5, unit: 'px' })); - expect(() => { Utils.parseHeight('12.5 df'); }).toThrow('Invalid height val = 12.5 df'); - }); - it('should parse negative height value', () => { - expect(Utils.parseHeight(-12)).toEqual(expect.objectContaining({ h: -12, unit: 'px' })); - expect(Utils.parseHeight('-12px')).toEqual(expect.objectContaining({ h: -12, unit: 'px' })); - expect(Utils.parseHeight('-12.3px')).toEqual(expect.objectContaining({ h: -12.3, unit: 'px' })); - expect(Utils.parseHeight('-12.3em')).toEqual(expect.objectContaining({ h: -12.3, unit: 'em' })); - expect(Utils.parseHeight('-12.3rem')).toEqual(expect.objectContaining({ h: -12.3, unit: 'rem' })); - expect(Utils.parseHeight('-12.3vh')).toEqual(expect.objectContaining({ h: -12.3, unit: 'vh' })); - expect(Utils.parseHeight('-12.3vw')).toEqual(expect.objectContaining({ h: -12.3, unit: 'vw' })); - expect(Utils.parseHeight('-12.3%')).toEqual(expect.objectContaining({ h: -12.3, unit: '%' })); - expect(Utils.parseHeight('-12.3cm')).toEqual(expect.objectContaining({ h: -12.3, unit: 'cm' })); - expect(Utils.parseHeight('-12.3mm')).toEqual(expect.objectContaining({ h: -12.3, unit: 'mm' })); - expect(Utils.parseHeight('-12.5')).toEqual(expect.objectContaining({ h: -12.5, unit: 'px' })); - expect(() => { Utils.parseHeight('-12.5 df'); }).toThrow('Invalid height val = -12.5 df'); - }); - }); - describe('test defaults', () => { - it('should assign missing field or undefined', () => { - let src = {}; - expect(src).toEqual({}); - expect(Utils.defaults(src, { x: 1, y: 2 })).toEqual({ x: 1, y: 2 }); - expect(Utils.defaults(src, { x: 10 })).toEqual({ x: 1, y: 2 }); - src.w = undefined; - expect(src).toEqual({ x: 1, y: 2, w: undefined }); - expect(Utils.defaults(src, { x: 10, w: 3 })).toEqual({ x: 1, y: 2, w: 3 }); - expect(Utils.defaults(src, { h: undefined })).toEqual({ x: 1, y: 2, w: 3, h: undefined }); - src = { x: 1, y: 2, sub: { foo: 1, two: 2 } }; - expect(src).toEqual({ x: 1, y: 2, sub: { foo: 1, two: 2 } }); - expect(Utils.defaults(src, { x: 10, w: 3 })).toEqual({ x: 1, y: 2, w: 3, sub: { foo: 1, two: 2 } }); - expect(Utils.defaults(src, { sub: { three: 3 } })).toEqual({ x: 1, y: 2, w: 3, sub: { foo: 1, two: 2, three: 3 } }); - }); - }); - describe('removePositioningStyles', () => { - it('should remove styles', () => { - let doc = document.implementation.createHTMLDocument(); - doc.body.innerHTML = '
'; - let el = doc.body.children[0]; - expect(el.style.position).toEqual('absolute'); - // expect(el.style.left).toEqual('1'); // not working! - Utils.removePositioningStyles(el); - expect(el.style.position).toEqual(''); - // bogus test - expect(Utils.getScrollElement(el)).not.toBe(null); - // bogus test - Utils.updateScrollPosition(el, { top: 20 }, 10); - }); - }); - describe('clone', () => { - const a = { first: 1, second: 'text' }; - const b = { first: 1, second: { third: 3 } }; - const c = { first: 1, second: [1, 2, 3], third: { fourth: { fifth: 5 } } }; - it('Should have the same values', () => { - const z = Utils.clone(a); - expect(z).toEqual({ first: 1, second: 'text' }); - }); - it('Should have 2 in first key, and original unchanged', () => { - const z = Utils.clone(a); - z.first = 2; - expect(a).toEqual({ first: 1, second: 'text' }); - expect(z).toEqual({ first: 2, second: 'text' }); - }); - it('Should have new string in second key, and original unchanged', () => { - const z = Utils.clone(a); - z.second = 2; - expect(a).toEqual({ first: 1, second: 'text' }); - expect(z).toEqual({ first: 1, second: 2 }); - }); - it('new string in both cases - use cloneDeep instead', () => { - const z = Utils.clone(b); - z.second.third = 'share'; - expect(b).toEqual({ first: 1, second: { third: 'share' } }); - expect(z).toEqual({ first: 1, second: { third: 'share' } }); - }); - it('Array Should match', () => { - const z = Utils.clone(c); - expect(c).toEqual({ first: 1, second: [1, 2, 3], third: { fourth: { fifth: 5 } } }); - expect(z).toEqual({ first: 1, second: [1, 2, 3], third: { fourth: { fifth: 5 } } }); - }); - it('Array[0] changed in both cases - use cloneDeep instead', () => { - const z = Utils.clone(c); - z.second[0] = 0; - expect(c).toEqual({ first: 1, second: [0, 2, 3], third: { fourth: { fifth: 5 } } }); - expect(z).toEqual({ first: 1, second: [0, 2, 3], third: { fourth: { fifth: 5 } } }); - }); - it('fifth changed in both cases - use cloneDeep instead', () => { - const z = Utils.clone(c); - z.third.fourth.fifth = 'share'; - expect(c).toEqual({ first: 1, second: [0, 2, 3], third: { fourth: { fifth: 'share' } } }); - expect(z).toEqual({ first: 1, second: [0, 2, 3], third: { fourth: { fifth: 'share' } } }); - }); - }); - describe('cloneDeep', () => { - // reset our test cases - const a = { first: 1, second: 'text' }; - const b = { first: 1, second: { third: 3 } }; - const c = { first: 1, second: [1, 2, 3], third: { fourth: { fifth: 5 } } }; - const d = { first: [1, [2, 3], ['four', 'five', 'six']] }; - const e = { first: 1, __skip: { second: 2 } }; - const f = { first: 1, _dontskip: { second: 2 } }; - it('Should have the same values', () => { - const z = Utils.cloneDeep(a); - expect(z).toEqual({ first: 1, second: 'text' }); - }); - it('Should have 2 in first key, and original unchanged', () => { - const z = Utils.cloneDeep(a); - z.first = 2; - expect(a).toEqual({ first: 1, second: 'text' }); - expect(z).toEqual({ first: 2, second: 'text' }); - }); - it('Should have new string in second key, and original unchanged', () => { - const z = Utils.cloneDeep(a); - z.second = 2; - expect(a).toEqual({ first: 1, second: 'text' }); - expect(z).toEqual({ first: 1, second: 2 }); - }); - it('Should have new string nested object, and original unchanged', () => { - const z = Utils.cloneDeep(b); - z.second.third = 'diff'; - expect(b).toEqual({ first: 1, second: { third: 3 } }); - expect(z).toEqual({ first: 1, second: { third: 'diff' } }); - }); - it('Array Should match', () => { - const z = Utils.cloneDeep(c); - expect(c).toEqual({ first: 1, second: [1, 2, 3], third: { fourth: { fifth: 5 } } }); - expect(z).toEqual({ first: 1, second: [1, 2, 3], third: { fourth: { fifth: 5 } } }); - }); - it('Array[0] changed in z only', () => { - const z = Utils.cloneDeep(c); - z.second[0] = 0; - expect(c).toEqual({ first: 1, second: [1, 2, 3], third: { fourth: { fifth: 5 } } }); - expect(z).toEqual({ first: 1, second: [0, 2, 3], third: { fourth: { fifth: 5 } } }); - }); - it('nested firth element changed only in z', () => { - const z = Utils.cloneDeep(c); - z.third.fourth.fifth = 'diff'; - expect(c).toEqual({ first: 1, second: [1, 2, 3], third: { fourth: { fifth: 5 } } }); - expect(z).toEqual({ first: 1, second: [1, 2, 3], third: { fourth: { fifth: 'diff' } } }); - }); - it('nested array only has one item changed', () => { - const z = Utils.cloneDeep(d); - z.first[1] = 'two'; - z.first[2][2] = 6; - expect(d).toEqual({ first: [1, [2, 3], ['four', 'five', 'six']] }); - expect(z).toEqual({ first: [1, 'two', ['four', 'five', 6]] }); - }); - it('skip __ items so it mods both instance', () => { - const z = Utils.cloneDeep(e); - z.__skip.second = 'two'; - expect(e).toEqual({ first: 1, __skip: { second: 'two' } }); // TODO support clone deep of function workaround - expect(z).toEqual({ first: 1, __skip: { second: 'two' } }); - }); - it('correctly copy _ item', () => { - const z = Utils.cloneDeep(f); - z._dontskip.second = 'two'; - expect(f).toEqual({ first: 1, _dontskip: { second: 2 } }); - expect(z).toEqual({ first: 1, _dontskip: { second: 'two' } }); - }); - }); - describe('removeInternalAndSame', () => { - it('should remove internal and same', () => { - const a = { first: 1, second: 'text', _skip: { second: 2 }, arr: [1, 'second', 3] }; - const b = { first: 1, second: 'text' }; - Utils.removeInternalAndSame(a, b); - expect(a).toEqual({ arr: [1, 'second', 3] }); - }); - it('should not remove items in an array', () => { - const a = { arr: [1, 2, 3] }; - const b = { arr: [1, 3] }; - Utils.removeInternalAndSame(a, b); - expect(a).toEqual({ arr: [1, 2, 3] }); - }); - it('should remove nested object, and make empty', () => { - const a = { obj1: { first: 1, nested: { second: 2 } }, obj2: { first: 1, second: 2 } }; - const b = { obj1: { first: 1, nested: { second: 2 } }, obj2: { first: 1, second: 2 } }; - Utils.removeInternalAndSame(a, b); - expect(a).toEqual({}); - }); - it('should remove nested object, and make empty - part 2', () => { - const a = { obj1: { first: 1, nested: { second: 2 } }, obj2: { first: 1, second: 2 } }; - const b = { obj1: { first: 1 }, obj2: { first: 1, second: 2 } }; - Utils.removeInternalAndSame(a, b); - expect(a).toEqual({ obj1: { nested: { second: 2 } } }); - }); - }); -}); -//# sourceMappingURL=utils-spec.js.map \ No newline at end of file diff --git a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/utils-spec.js.map b/web/skins/classic/assets/gridstack-12.3.3/dist/spec/utils-spec.js.map deleted file mode 100644 index 84cb4f371..000000000 --- a/web/skins/classic/assets/gridstack-12.3.3/dist/spec/utils-spec.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"utils-spec.js","sourceRoot":"","sources":["../../spec/utils-spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { Utils } from '../src/utils';\n\ndescribe('gridstack utils', () => {\n describe('setup of utils', () => {\n it('should set gridstack Utils.', () => {\n let utils = Utils;\n expect(utils).not.toBeNull();\n expect(typeof utils).toBe('function');\n });\n });\n\n describe('test toBool', () => {\n it('should return booleans.', () => {\n expect(Utils.toBool(true)).toEqual(true);\n expect(Utils.toBool(false)).toEqual(false);\n });\n it('should work with integer.', () => {\n expect(Utils.toBool(1)).toEqual(true);\n expect(Utils.toBool(0)).toEqual(false);\n });\n it('should work with Strings.', () => {\n expect(Utils.toBool('')).toEqual(false);\n expect(Utils.toBool('0')).toEqual(false);\n expect(Utils.toBool('no')).toEqual(false);\n expect(Utils.toBool('false')).toEqual(false);\n expect(Utils.toBool('yes')).toEqual(true);\n expect(Utils.toBool('yadda')).toEqual(true);\n });\n });\n\n describe('test isIntercepted', () => {\n let src = {x: 3, y: 2, w: 3, h: 2};\n\n it('should intercept.', () => {\n expect(Utils.isIntercepted(src, {x: 0, y: 0, w: 4, h: 3})).toEqual(true);\n expect(Utils.isIntercepted(src, {x: 0, y: 0, w: 40, h: 30})).toEqual(true);\n expect(Utils.isIntercepted(src, {x: 3, y: 2, w: 3, h: 2})).toEqual(true);\n expect(Utils.isIntercepted(src, {x: 5, y: 3, w: 3, h: 2})).toEqual(true);\n });\n it('shouldn\\'t intercept.', () => {\n expect(Utils.isIntercepted(src, {x: 0, y: 0, w: 3, h: 2})).toEqual(false);\n expect(Utils.isIntercepted(src, {x: 0, y: 0, w: 13, h: 2})).toEqual(false);\n expect(Utils.isIntercepted(src, {x: 1, y: 4, w: 13, h: 2})).toEqual(false);\n expect(Utils.isIntercepted(src, {x: 0, y: 3, w: 3, h: 2})).toEqual(false);\n expect(Utils.isIntercepted(src, {x: 6, y: 3, w: 3, h: 2})).toEqual(false);\n });\n });\n\n describe('test parseHeight', () => {\n\n it('should parse height value', () => {\n expect(Utils.parseHeight(12)).toEqual(expect.objectContaining({h: 12, unit: 'px'}));\n expect(Utils.parseHeight('12px')).toEqual(expect.objectContaining({h: 12, unit: 'px'}));\n expect(Utils.parseHeight('12.3px')).toEqual(expect.objectContaining({h: 12.3, unit: 'px'}));\n expect(Utils.parseHeight('12.3em')).toEqual(expect.objectContaining({h: 12.3, unit: 'em'}));\n expect(Utils.parseHeight('12.3rem')).toEqual(expect.objectContaining({h: 12.3, unit: 'rem'}));\n expect(Utils.parseHeight('12.3vh')).toEqual(expect.objectContaining({h: 12.3, unit: 'vh'}));\n expect(Utils.parseHeight('12.3vw')).toEqual(expect.objectContaining({h: 12.3, unit: 'vw'}));\n expect(Utils.parseHeight('12.3%')).toEqual(expect.objectContaining({h: 12.3, unit: '%'}));\n expect(Utils.parseHeight('12.5cm')).toEqual(expect.objectContaining({h: 12.5, unit: 'cm'}));\n expect(Utils.parseHeight('12.5mm')).toEqual(expect.objectContaining({h: 12.5, unit: 'mm'}));\n expect(Utils.parseHeight('12.5')).toEqual(expect.objectContaining({h: 12.5, unit: 'px'}));\n expect(() => { Utils.parseHeight('12.5 df'); }).toThrow('Invalid height val = 12.5 df');\n });\n\n it('should parse negative height value', () => {\n expect(Utils.parseHeight(-12)).toEqual(expect.objectContaining({h: -12, unit: 'px'}));\n expect(Utils.parseHeight('-12px')).toEqual(expect.objectContaining({h: -12, unit: 'px'}));\n expect(Utils.parseHeight('-12.3px')).toEqual(expect.objectContaining({h: -12.3, unit: 'px'}));\n expect(Utils.parseHeight('-12.3em')).toEqual(expect.objectContaining({h: -12.3, unit: 'em'}));\n expect(Utils.parseHeight('-12.3rem')).toEqual(expect.objectContaining({h: -12.3, unit: 'rem'}));\n expect(Utils.parseHeight('-12.3vh')).toEqual(expect.objectContaining({h: -12.3, unit: 'vh'}));\n expect(Utils.parseHeight('-12.3vw')).toEqual(expect.objectContaining({h: -12.3, unit: 'vw'}));\n expect(Utils.parseHeight('-12.3%')).toEqual(expect.objectContaining({h: -12.3, unit: '%'}));\n expect(Utils.parseHeight('-12.3cm')).toEqual(expect.objectContaining({h: -12.3, unit: 'cm'}));\n expect(Utils.parseHeight('-12.3mm')).toEqual(expect.objectContaining({h: -12.3, unit: 'mm'}));\n expect(Utils.parseHeight('-12.5')).toEqual(expect.objectContaining({h: -12.5, unit: 'px'}));\n expect(() => { Utils.parseHeight('-12.5 df'); }).toThrow('Invalid height val = -12.5 df');\n });\n });\n\n describe('test defaults', () => {\n it('should assign missing field or undefined', () => {\n let src: any = {};\n expect(src).toEqual({});\n expect(Utils.defaults(src, {x: 1, y: 2})).toEqual({x: 1, y: 2});\n expect(Utils.defaults(src, {x: 10})).toEqual({x: 1, y: 2});\n src.w = undefined;\n expect(src).toEqual({x: 1, y: 2, w: undefined});\n expect(Utils.defaults(src, {x: 10, w: 3})).toEqual({x: 1, y: 2, w: 3});\n expect(Utils.defaults(src, {h: undefined})).toEqual({x: 1, y: 2, w: 3, h: undefined});\n src = {x: 1, y: 2, sub: {foo: 1, two: 2}};\n expect(src).toEqual({x: 1, y: 2, sub: {foo: 1, two: 2}});\n expect(Utils.defaults(src, {x: 10, w: 3})).toEqual({x: 1, y: 2, w: 3, sub: {foo: 1, two: 2}});\n expect(Utils.defaults(src, {sub: {three: 3}})).toEqual({x: 1, y: 2, w: 3, sub: {foo: 1, two: 2, three: 3}});\n });\n });\n\n describe('removePositioningStyles', () => {\n it('should remove styles', () => {\n let doc = document.implementation.createHTMLDocument();\n doc.body.innerHTML = '
';\n let el = doc.body.children[0] as HTMLElement;\n expect(el.style.position).toEqual('absolute');\n // expect(el.style.left).toEqual('1'); // not working!\n\n Utils.removePositioningStyles(el);\n expect(el.style.position).toEqual('');\n\n // bogus test\n expect(Utils.getScrollElement(el)).not.toBe(null);\n // bogus test\n Utils.updateScrollPosition(el, {top: 20}, 10);\n });\n });\n\n describe('clone', () => {\n const a: any = {first: 1, second: 'text'};\n const b: any = {first: 1, second: {third: 3}};\n const c: any = {first: 1, second: [1, 2, 3], third: { fourth: {fifth: 5}}};\n it('Should have the same values', () => {\n const z = Utils.clone(a);\n expect(z).toEqual({first: 1, second: 'text'});\n });\n it('Should have 2 in first key, and original unchanged', () => {\n const z = Utils.clone(a);\n z.first = 2;\n expect(a).toEqual({first: 1, second: 'text'});\n expect(z).toEqual({first: 2, second: 'text'});\n });\n it('Should have new string in second key, and original unchanged', () => {\n const z = Utils.clone(a);\n z.second = 2;\n expect(a).toEqual({first: 1, second: 'text'});\n expect(z).toEqual({first: 1, second: 2});\n });\n it('new string in both cases - use cloneDeep instead', () => {\n const z = Utils.clone(b);\n z.second.third = 'share';\n expect(b).toEqual({first: 1, second: {third: 'share'}});\n expect(z).toEqual({first: 1, second: {third: 'share'}});\n });\n it('Array Should match', () => {\n const z = Utils.clone(c);\n expect(c).toEqual({first: 1, second: [1, 2, 3], third: { fourth: {fifth: 5}}});\n expect(z).toEqual({first: 1, second: [1, 2, 3], third: { fourth: {fifth: 5}}});\n });\n it('Array[0] changed in both cases - use cloneDeep instead', () => {\n const z = Utils.clone(c);\n z.second[0] = 0;\n expect(c).toEqual({first: 1, second: [0, 2, 3], third: { fourth: {fifth: 5}}});\n expect(z).toEqual({first: 1, second: [0, 2, 3], third: { fourth: {fifth: 5}}});\n });\n it('fifth changed in both cases - use cloneDeep instead', () => {\n const z = Utils.clone(c);\n z.third.fourth.fifth = 'share';\n expect(c).toEqual({first: 1, second: [0, 2, 3], third: { fourth: {fifth: 'share'}}});\n expect(z).toEqual({first: 1, second: [0, 2, 3], third: { fourth: {fifth: 'share'}}});\n });\n });\n describe('cloneDeep', () => {\n // reset our test cases\n const a: any = {first: 1, second: 'text'};\n const b: any = {first: 1, second: {third: 3}};\n const c: any = {first: 1, second: [1, 2, 3], third: { fourth: {fifth: 5}}};\n const d: any = {first: [1, [2, 3], ['four', 'five', 'six']]};\n const e: any = {first: 1, __skip: {second: 2}};\n const f: any = {first: 1, _dontskip: {second: 2}};\n \n it('Should have the same values', () => {\n const z = Utils.cloneDeep(a);\n expect(z).toEqual({first: 1, second: 'text'});\n });\n it('Should have 2 in first key, and original unchanged', () => {\n const z = Utils.cloneDeep(a);\n z.first = 2;\n expect(a).toEqual({first: 1, second: 'text'});\n expect(z).toEqual({first: 2, second: 'text'});\n });\n it('Should have new string in second key, and original unchanged', () => {\n const z = Utils.cloneDeep(a);\n z.second = 2;\n expect(a).toEqual({first: 1, second: 'text'});\n expect(z).toEqual({first: 1, second: 2});\n });\n it('Should have new string nested object, and original unchanged', () => {\n const z = Utils.cloneDeep(b);\n z.second.third = 'diff';\n expect(b).toEqual({first: 1, second: {third: 3}});\n expect(z).toEqual({first: 1, second: {third: 'diff'}});\n });\n it('Array Should match', () => {\n const z = Utils.cloneDeep(c);\n expect(c).toEqual({first: 1, second: [1, 2, 3], third: { fourth: {fifth: 5}}});\n expect(z).toEqual({first: 1, second: [1, 2, 3], third: { fourth: {fifth: 5}}});\n });\n it('Array[0] changed in z only', () => {\n const z = Utils.cloneDeep(c);\n z.second[0] = 0;\n expect(c).toEqual({first: 1, second: [1, 2, 3], third: { fourth: {fifth: 5}}});\n expect(z).toEqual({first: 1, second: [0, 2, 3], third: { fourth: {fifth: 5}}});\n });\n it('nested firth element changed only in z', () => {\n const z = Utils.cloneDeep(c);\n z.third.fourth.fifth = 'diff';\n expect(c).toEqual({first: 1, second: [1, 2, 3], third: { fourth: {fifth: 5}}});\n expect(z).toEqual({first: 1, second: [1, 2, 3], third: { fourth: {fifth: 'diff'}}});\n });\n it('nested array only has one item changed', () => {\n const z = Utils.cloneDeep(d);\n z.first[1] = 'two';\n z.first[2][2] = 6;\n expect(d).toEqual({first: [1, [2, 3], ['four', 'five', 'six']]});\n expect(z).toEqual({first: [1, 'two', ['four', 'five', 6]]});\n });\n it('skip __ items so it mods both instance', () => {\n const z = Utils.cloneDeep(e);\n z.__skip.second = 'two';\n expect(e).toEqual({first: 1, __skip: {second: 'two'}}); // TODO support clone deep of function workaround\n expect(z).toEqual({first: 1, __skip: {second: 'two'}});\n });\n it('correctly copy _ item', () => {\n const z = Utils.cloneDeep(f);\n z._dontskip.second = 'two';\n expect(f).toEqual({first: 1, _dontskip: {second: 2}});\n expect(z).toEqual({first: 1, _dontskip: {second: 'two'}});\n });\n });\n describe('removeInternalAndSame', () => {\n it('should remove internal and same', () => {\n const a = {first: 1, second: 'text', _skip: {second: 2}, arr: [1, 'second', 3]};\n const b = {first: 1, second: 'text'};\n Utils.removeInternalAndSame(a, b);\n expect(a).toEqual({arr: [1, 'second', 3]});\n });\n it('should not remove items in an array', () => {\n const a = {arr: [1, 2, 3]};\n const b = {arr: [1, 3]};\n Utils.removeInternalAndSame(a, b);\n expect(a).toEqual({arr: [1, 2, 3]});\n });\n it('should remove nested object, and make empty', () => {\n const a = {obj1: {first: 1, nested: {second: 2}}, obj2: {first: 1, second: 2}};\n const b = {obj1: {first: 1, nested: {second: 2}}, obj2: {first: 1, second: 2}};\n Utils.removeInternalAndSame(a, b);\n expect(a).toEqual({});\n });\n it('should remove nested object, and make empty - part 2', () => {\n const a = {obj1: {first: 1, nested: {second: 2}}, obj2: {first: 1, second: 2}};\n const b = {obj1: {first: 1}, obj2: {first: 1, second: 2}};\n Utils.removeInternalAndSame(a, b);\n expect(a).toEqual({obj1: {nested: {second: 2}}});\n });\n });\n});\n"]} \ No newline at end of file