gridstack 10.3.1 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/README.md +37 -3
  2. package/dist/angular/README.md +47 -25
  3. package/dist/angular/{esm2020 → esm2022}/gridstack-angular.mjs +5 -5
  4. package/dist/angular/esm2022/index.mjs +8 -0
  5. package/dist/angular/esm2022/lib/base-widget.mjs +34 -0
  6. package/dist/angular/esm2022/lib/gridstack-item.component.mjs +72 -0
  7. package/dist/angular/esm2022/lib/gridstack.component.mjs +300 -0
  8. package/dist/angular/esm2022/lib/gridstack.module.mjs +39 -0
  9. package/dist/angular/{fesm2020 → fesm2022}/gridstack-angular.mjs +400 -369
  10. package/dist/angular/fesm2022/gridstack-angular.mjs.map +1 -0
  11. package/dist/angular/index.d.ts +4 -5
  12. package/dist/angular/lib/base-widget.d.ts +18 -16
  13. package/dist/angular/lib/gridstack-item.component.d.ts +37 -37
  14. package/dist/angular/lib/gridstack.component.d.ts +135 -129
  15. package/dist/angular/lib/gridstack.module.d.ts +10 -10
  16. package/dist/angular/src/base-widget.ts +10 -2
  17. package/dist/angular/src/gridstack-item.component.ts +11 -7
  18. package/dist/angular/src/gridstack.component.ts +67 -44
  19. package/dist/angular/src/gridstack.module.ts +2 -2
  20. package/dist/dd-base-impl.d.ts +2 -2
  21. package/dist/dd-base-impl.js +2 -2
  22. package/dist/dd-base-impl.js.map +1 -1
  23. package/dist/dd-draggable.d.ts +7 -16
  24. package/dist/dd-draggable.js +22 -34
  25. package/dist/dd-draggable.js.map +1 -1
  26. package/dist/dd-droppable.d.ts +2 -2
  27. package/dist/dd-droppable.js +2 -2
  28. package/dist/dd-droppable.js.map +1 -1
  29. package/dist/dd-element.d.ts +5 -5
  30. package/dist/dd-element.js +2 -2
  31. package/dist/dd-element.js.map +1 -1
  32. package/dist/dd-gridstack.d.ts +4 -4
  33. package/dist/dd-gridstack.js +8 -8
  34. package/dist/dd-gridstack.js.map +1 -1
  35. package/dist/dd-manager.d.ts +2 -2
  36. package/dist/dd-manager.js +2 -2
  37. package/dist/dd-manager.js.map +1 -1
  38. package/dist/dd-resizable-handle.d.ts +2 -2
  39. package/dist/dd-resizable-handle.js +3 -3
  40. package/dist/dd-resizable-handle.js.map +1 -1
  41. package/dist/dd-resizable.d.ts +2 -2
  42. package/dist/dd-resizable.js +4 -4
  43. package/dist/dd-resizable.js.map +1 -1
  44. package/dist/dd-touch.d.ts +2 -2
  45. package/dist/dd-touch.js +2 -2
  46. package/dist/dd-touch.js.map +1 -1
  47. package/dist/es5/dd-base-impl.d.ts +2 -2
  48. package/dist/es5/dd-base-impl.js +2 -2
  49. package/dist/es5/dd-base-impl.js.map +1 -1
  50. package/dist/es5/dd-draggable.d.ts +7 -16
  51. package/dist/es5/dd-draggable.js +19 -29
  52. package/dist/es5/dd-draggable.js.map +1 -1
  53. package/dist/es5/dd-droppable.d.ts +2 -2
  54. package/dist/es5/dd-droppable.js +2 -2
  55. package/dist/es5/dd-droppable.js.map +1 -1
  56. package/dist/es5/dd-element.d.ts +5 -5
  57. package/dist/es5/dd-element.js +2 -2
  58. package/dist/es5/dd-element.js.map +1 -1
  59. package/dist/es5/dd-gridstack.d.ts +4 -4
  60. package/dist/es5/dd-gridstack.js +9 -6
  61. package/dist/es5/dd-gridstack.js.map +1 -1
  62. package/dist/es5/dd-manager.d.ts +2 -2
  63. package/dist/es5/dd-manager.js +2 -2
  64. package/dist/es5/dd-manager.js.map +1 -1
  65. package/dist/es5/dd-resizable-handle.d.ts +2 -2
  66. package/dist/es5/dd-resizable-handle.js +2 -2
  67. package/dist/es5/dd-resizable-handle.js.map +1 -1
  68. package/dist/es5/dd-resizable.d.ts +2 -2
  69. package/dist/es5/dd-resizable.js +2 -2
  70. package/dist/es5/dd-resizable.js.map +1 -1
  71. package/dist/es5/dd-touch.d.ts +2 -2
  72. package/dist/es5/dd-touch.js +2 -2
  73. package/dist/es5/dd-touch.js.map +1 -1
  74. package/dist/es5/gridstack-all.js +1 -1
  75. package/dist/es5/gridstack-all.js.LICENSE.txt +2 -2
  76. package/dist/es5/gridstack-all.js.map +1 -1
  77. package/dist/es5/gridstack-engine.d.ts +2 -2
  78. package/dist/es5/gridstack-engine.js +5 -5
  79. package/dist/es5/gridstack-engine.js.map +1 -1
  80. package/dist/es5/gridstack-poly.js +2 -2
  81. package/dist/es5/gridstack.d.ts +22 -17
  82. package/dist/es5/gridstack.js +158 -141
  83. package/dist/es5/gridstack.js.map +1 -1
  84. package/dist/es5/types.d.ts +16 -8
  85. package/dist/es5/types.js +3 -10
  86. package/dist/es5/types.js.map +1 -1
  87. package/dist/es5/utils.d.ts +6 -2
  88. package/dist/es5/utils.js +36 -3
  89. package/dist/es5/utils.js.map +1 -1
  90. package/dist/gridstack-all.js +1 -1
  91. package/dist/gridstack-all.js.LICENSE.txt +2 -2
  92. package/dist/gridstack-all.js.map +1 -1
  93. package/dist/gridstack-engine.d.ts +2 -2
  94. package/dist/gridstack-engine.js +61 -61
  95. package/dist/gridstack-engine.js.map +1 -1
  96. package/dist/gridstack-extra.css +1 -1
  97. package/dist/gridstack.css +2 -2
  98. package/dist/gridstack.d.ts +22 -17
  99. package/dist/gridstack.js +244 -226
  100. package/dist/gridstack.js.map +1 -1
  101. package/dist/src/gridstack-extra.scss +1 -1
  102. package/dist/src/gridstack.scss +2 -2
  103. package/dist/types.d.ts +16 -8
  104. package/dist/types.js +2 -9
  105. package/dist/types.js.map +1 -1
  106. package/dist/utils.d.ts +6 -2
  107. package/dist/utils.js +50 -20
  108. package/dist/utils.js.map +1 -1
  109. package/doc/CHANGES.md +8 -0
  110. package/doc/README.md +18 -23
  111. package/package.json +1 -1
  112. package/dist/angular/esm2020/lib/base-widget.mjs +0 -30
  113. package/dist/angular/esm2020/lib/gridstack-item.component.mjs +0 -68
  114. package/dist/angular/esm2020/lib/gridstack.component.mjs +0 -280
  115. package/dist/angular/esm2020/lib/gridstack.module.mjs +0 -39
  116. package/dist/angular/esm2020/public-api.mjs +0 -8
  117. package/dist/angular/fesm2015/gridstack-angular.mjs +0 -420
  118. package/dist/angular/fesm2015/gridstack-angular.mjs.map +0 -1
  119. package/dist/angular/fesm2020/gridstack-angular.mjs.map +0 -1
  120. package/dist/angular/package.json +0 -31
  121. package/dist/angular/public-api.d.ts +0 -4
package/README.md CHANGED
@@ -15,7 +15,7 @@ If you find this lib useful, please donate [PayPal](https://www.paypal.me/alaind
15
15
  [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.me/alaind831)
16
16
  [![Donate](https://img.shields.io/badge/Donate-Venmo-g.svg)](https://www.venmo.com/adumesny)
17
17
 
18
- Join us on Slack: [https://gridstackjs.slack.com](https://join.slack.com/t/gridstackjs/shared_invite/zt-27q0rwf80-5vCt81Z_hfVgpRW7L17MnQ)
18
+ Join us on Slack: [https://gridstackjs.slack.com](https://join.slack.com/t/gridstackjs/shared_invite/zt-2qa21lnxz-vw29RdTFet3N6~ABqT9kwA)
19
19
 
20
20
  <!-- [![Slack Status](https://gridstackjs.com/badge.svg)](https://gridstackjs.slack.com) -->
21
21
  <!-- START doctoc generated TOC please keep comment here to allow auto update -->
@@ -47,8 +47,10 @@ Join us on Slack: [https://gridstackjs.slack.com](https://join.slack.com/t/grids
47
47
  - [Migrating to v8](#migrating-to-v8)
48
48
  - [Migrating to v9](#migrating-to-v9)
49
49
  - [Migrating to v10](#migrating-to-v10)
50
+ - [Migrating to v11](#migrating-to-v11)
50
51
  - [jQuery Application](#jquery-application)
51
52
  - [Changes](#changes)
53
+ - [Usage Trend](#usage-trend)
52
54
  - [The Team](#the-team)
53
55
 
54
56
  <!-- END doctoc generated TOC please keep comment here to allow auto update -->
@@ -149,13 +151,13 @@ GridStack no longer requires external dependencies as of v1 (lodash was removed
149
151
 
150
152
  search for ['gridstack' under NPM](https://www.npmjs.com/search?q=gridstack&ranking=popularity) for latest, more to come...
151
153
 
152
- - **Angular**: we now ship out of the box with Angular wrapper components - see <a href="https://github.com/gridstack/gridstack.js/tree/master/angular" target="_blank">Angular Component</a>.
154
+ - **Angular**: we ship out of the box an Angular wrapper - see <a href="https://github.com/gridstack/gridstack.js/tree/master/angular" target="_blank">Angular Component</a>.
153
155
  - **Angular9**: [lb-gridstack](https://github.com/pfms84/lb-gridstack) Note: very old v0.3 gridstack instance so recommend for **concept ONLY if you wish to use directive instead**. Code has **not been vented** at as I use components.
154
156
  - **AngularJS**: [gridstack-angular](https://github.com/kdietrich/gridstack-angular)
155
157
  - **Ember**: [ember-gridstack](https://github.com/yahoo/ember-gridstack)
156
158
  - **knockout**: see [demo](https://gridstackjs.com/demo/knockout.html) using component, but check [custom bindings ticket](https://github.com/gridstack/gridstack.js/issues/465) which is likely better approach.
157
159
  - **Rails**: [gridstack-js-rails](https://github.com/randoum/gridstack-js-rails)
158
- - **React**: see [demo](https://gridstackjs.com/demo/react.html) with [src](https://github.com/gridstack/gridstack.js/tree/master/demo/react.html), or [react-gridstack-example](https://github.com/Inder2108/react-gridstack-example/tree/master/src/App.js), or read on what [hooks to use](https://github.com/gridstack/gridstack.js/issues/735#issuecomment-329888796)
160
+ - **React**: work in progress to have wrapper code: see <a href="https://github.com/gridstack/gridstack.js/tree/master/react" target="_blank">React Component</a>. But also see [demo](https://gridstackjs.com/demo/react.html) with [src](https://github.com/gridstack/gridstack.js/tree/master/demo/react.html), or [react-gridstack-example](https://github.com/Inder2108/react-gridstack-example/tree/master/src/App.js), or read on what [hooks to use](https://github.com/gridstack/gridstack.js/issues/735#issuecomment-329888796)
159
161
  - **Vue**: see [demo](https://gridstackjs.com/demo/vue3js.html) with [v3 src](https://github.com/gridstack/gridstack.js/tree/master/demo/vue3js.html) or [v2 src](https://github.com/gridstack/gridstack.js/tree/master/demo/vue2js.html)
160
162
  - **Aurelia**: [aurelia-gridstack](https://github.com/aurelia-ui-toolkits/aurelia-gridstack), see [demo](https://aurelia-ui-toolkits.github.io/aurelia-gridstack/)
161
163
 
@@ -460,6 +462,35 @@ breaking change:
460
462
  * 1 column mode switch is no longer by default (`columnOpts` is not defined) as too many new users had issues. Instead set it explicitly (see above).
461
463
  * `oneColumnModeDomSort` has been removed. Planning to support per column layouts at some future times. TBD
462
464
 
465
+ ## Migrating to v11
466
+
467
+ * All instances of `el.innerHTML = 'some content'` have been removed for security reason as it opens up some potential for accidental XSS.
468
+
469
+ * Side panel drag&drop complete rewrite.
470
+
471
+ * new lazy loading option
472
+
473
+ **Breaking change:**
474
+
475
+ * if you code relies on `GridStackWidget.content` with real HTML (like a few demos) it is up to you to do this:
476
+ ```ts
477
+ // NOTE: REAL apps would sanitize-html or DOMPurify before blinding setting innerHTML. see #2736
478
+ GridStack.renderCB = function(el, w) {
479
+ el.innerHTML = w.content;
480
+ };
481
+ ```
482
+ * V11 add new `GridStack.renderCB` that is called for you to create the widget content (entire GridStackWidget is passed so you can use id or some other field as logic) while GS creates the 2 needed parent divs + classes, unlike `GridStack.addRemoveCB` which doesn't create anything for you. Both can be handy for Angular/React/Vue frameworks.
483
+ * `addWidget(w: GridStackWidget)` is now the only supported format, no more string content passing. You will need to create content yourself (`Util.createWidgetDivs()` can be used to create parent divs) then call `makeWidget(el)` instead.
484
+
485
+ **Potential breaking change:**
486
+
487
+ * BIG overall to how sidepanel helper drag&drop is done:
488
+ 1. `clone()` helper is now passed full HTML element dragged, not an event on `grid-stack-item-content` so can clone or set attr at the top.
489
+ 2. use any class/structure you want for side panel items (see two.html)
490
+ 3. `GridStack.setupDragIn()` now support associating a `GridStackWidget` for each sidepanel that will be used to define what to create on drop!
491
+ 4. if no `GridStackWidget` is defined, the helper will now be inserted as is, and NOT original sidepanel item.
492
+ 5. support DOM gs- attr as well as gridstacknode JSON (see two.html) alternatives.
493
+
463
494
  # jQuery Application
464
495
 
465
496
  This is **old and no longer apply to v6+**. You'll need to use v5.1.1 and before
@@ -503,6 +534,9 @@ As for events, you can still use `$(".grid-stack").on(...)` for the version that
503
534
 
504
535
  View our change log [here](https://github.com/gridstack/gridstack.js/tree/master/doc/CHANGES.md).
505
536
 
537
+ # Usage Trend
538
+
539
+ <img src="https://npm-compare.com/img/npm-trend/THREE_YEARS/gridstack.png" width="70%" alt="NPM Usage Trend of gridstack" />
506
540
 
507
541
  # The Team
508
542
 
@@ -1,24 +1,27 @@
1
1
  # Angular wrapper
2
2
 
3
- The Angular [wrapper component](projects/lib/src/lib/gridstack.component.ts) <gridstack> 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.
3
+ The Angular [wrapper component](projects/lib/src/lib/gridstack.component.ts) <gridstack> is a <b>better way to use Gridstack</b>, but alternative raw [ngFor](projects/demo/src/app/ngFor.ts) or [simple](projects/demo/src/app/simple.ts) demos are also given.
4
4
 
5
5
  # Dynamic grid items
6
+
6
7
  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...
7
8
 
8
9
  I.E. don't use Angular templating to create grid items as that is harder to sync when gridstack will also add/remove items.
9
10
 
10
- HTML
11
+ HTML
12
+
11
13
  ```html
12
- <gridstack [options]="gridOptions">
13
- </gridstack>
14
+ <gridstack [options]="gridOptions"></gridstack>
14
15
  ```
15
16
 
16
17
  CSS
18
+
17
19
  ```css
18
20
  @import "gridstack/dist/gridstack.min.css";
21
+ @import "gridstack/dist/gridstack-extra.min.css"; // if you use 2-11 column
19
22
 
20
23
  .grid-stack {
21
- background: #FAFAD2;
24
+ background: #fafad2;
22
25
  }
23
26
  .grid-stack-item-content {
24
27
  text-align: center;
@@ -27,6 +30,7 @@ CSS
27
30
  ```
28
31
 
29
32
  in your module Code
33
+
30
34
  ```ts
31
35
  import { GridstackModule } from 'gridstack/dist/angular';
32
36
 
@@ -39,6 +43,7 @@ export class AppModule { }
39
43
  ```
40
44
 
41
45
  Component Code
46
+
42
47
  ```ts
43
48
  import { GridStackOptions } from 'gridstack';
44
49
 
@@ -54,9 +59,11 @@ public gridOptions: GridStackOptions = {
54
59
  ```
55
60
 
56
61
  # More Complete example
62
+
57
63
  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).
58
64
 
59
- HTML
65
+ HTML
66
+
60
67
  ```html
61
68
  <gridstack [options]="gridOptions" (changeCB)="onChange($event)">
62
69
  <div empty-content>message when grid is empty</div>
@@ -64,6 +71,7 @@ HTML
64
71
  ```
65
72
 
66
73
  Code
74
+
67
75
  ```ts
68
76
  import { Component } from '@angular/core';
69
77
  import { GridStack, GridStackOptions } from 'gridstack';
@@ -101,8 +109,9 @@ public gridOptions: NgGridStackOptions = {
101
109
  minRow: 1, // make space for empty message
102
110
  children: [ // or call load()/addWidget() with same data
103
111
  {x:0, y:0, minW:2, selector:'app-a'},
104
- {x:1, y:0, selector:'app-b'},
105
- {x:0, y:1, content:'plain html content'},
112
+ {x:1, y:0, minW:2, selector:'app-a', input: { text: 'bar' }}, // custom input that works using BaseWidget.deserialize() Object.assign(this, w.input)
113
+ {x:2, y:0, selector:'app-b'},
114
+ {x:3, y:0, content:'plain html'},
106
115
  ]
107
116
  }
108
117
 
@@ -113,18 +122,19 @@ public onChange(data: nodesCB) {
113
122
  ```
114
123
 
115
124
  # ngFor with wrapper
125
+
116
126
  For simple case where you control the children creation (gridstack doesn't do create or re-parenting)
117
127
 
118
- HTML
128
+ HTML
129
+
119
130
  ```html
120
131
  <gridstack [options]="gridOptions" (changeCB)="onChange($event)">
121
- <gridstack-item *ngFor="let n of items; trackBy: identify" [options]="n">
122
- Item {{n.id}}
123
- </gridstack-item>
132
+ <gridstack-item *ngFor="let n of items; trackBy: identify" [options]="n"> Item {{n.id}} </gridstack-item>
124
133
  </gridstack>
125
134
  ```
126
135
 
127
136
  Code
137
+
128
138
  ```javascript
129
139
  import { GridStackOptions, GridStackWidget } from 'gridstack';
130
140
  import { nodesCB } from 'gridstack/dist/angular';
@@ -149,22 +159,34 @@ public identify(index: number, w: GridStackWidget) {
149
159
  ```
150
160
 
151
161
  ## Demo
162
+
152
163
  You can see a fuller example at [app.component.ts](projects/demo/src/app/app.component.ts)
153
164
 
154
- to build the demo, go to [angular/projects/demo](projects/demo/) and run `yarn` + `yarn start` and navigate to `http://localhost:4200/`
165
+ to build the demo, go to [angular/projects/demo](projects/demo/) and run `yarn` + `yarn upgrade` (ng18 seem to have introduced some conflicts) + `yarn start` and navigate to `http://localhost:4200/`
166
+
167
+ 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`)
168
+
169
+ ## Caveats
170
+
171
+ - This wrapper needs:
172
+ - gridstack v8 to run as it needs the latest changes (use older version that matches GS versions)
173
+ - Angular 14+ for dynamic `createComponent()` API
174
+
175
+ 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:
176
+ ```ts
177
+ protected resolver: ComponentFactoryResolver,
178
+ ...
179
+ const factory = this.resolver.resolveComponentFactory(GridItemComponent);
180
+ const gridItemRef = grid.container.createComponent(factory) as ComponentRef<GridItemComponent>;
181
+ // ...do the same for widget selector...
182
+ ```
155
183
 
156
- Code ship starting with v8.1.2+ in `dist/angular` for people to use directly and is an angular module! (source code under `dist/angular/src`)
157
- ## Caveats
184
+ ## ngFor Caveats
158
185
 
159
- - This wrapper needs:
160
- - gridstack v8 to run as it needs the latest changes (use older version that matches GS versions)
161
- - Angular 13+ for dynamic createComponent() API
186
+ - 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,
187
+ you must manually update the `GridstackItemComponent.option` directly - see [modifyNgFor()](./projects/demo/src/app/app.component.ts#L202) example.
188
+ - 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.
162
189
 
163
- ## *ngFor Caveats
164
- - 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,
165
- you must manually update the `GridstackItemComponent.option` directly - see [modifyNgFor()](src/app/app.component.ts#L174) example.
166
- - 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.
190
+ Would appreciate getting help doing the same for React and Vue (2 other popular frameworks)
167
191
 
168
- Would appreciate getting help doing the same for React and Vue (2 other popular frameworks)
169
-
170
- -Alain
192
+ -Alain
@@ -1,5 +1,5 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public-api';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0YWNrLWFuZ3VsYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hbmd1bGFyL3Byb2plY3RzL2xpYi9zcmMvZ3JpZHN0YWNrLWFuZ3VsYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0YWNrLWFuZ3VsYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hbmd1bGFyL3Byb2plY3RzL2xpYi9zcmMvZ3JpZHN0YWNrLWFuZ3VsYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
@@ -0,0 +1,8 @@
1
+ /*
2
+ * Public API Surface of gridstack-angular
3
+ */
4
+ export * from './lib/gridstack-item.component';
5
+ export * from './lib/gridstack.component';
6
+ export * from './lib/base-widget';
7
+ export * from './lib/gridstack.module';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hbmd1bGFyL3Byb2plY3RzL2xpYi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGdDQUFnQyxDQUFDO0FBQy9DLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLHdCQUF3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBncmlkc3RhY2stYW5ndWxhclxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL2dyaWRzdGFjay1pdGVtLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9ncmlkc3RhY2suY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2Jhc2Utd2lkZ2V0JztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2dyaWRzdGFjay5tb2R1bGUnO1xuIl19
@@ -0,0 +1,34 @@
1
+ /**
2
+ * gridstack-item.component.ts 11.0.0
3
+ * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license
4
+ */
5
+ /**
6
+ * Base interface that all widgets need to implement in order for GridstackItemComponent to correctly save/load/delete/..
7
+ */
8
+ import { Injectable } from '@angular/core';
9
+ import * as i0 from "@angular/core";
10
+ export class BaseWidget {
11
+ /**
12
+ * REDEFINE to return an object representing the data needed to re-create yourself, other than `selector` already handled.
13
+ * This should map directly to the @Input() fields of this objects on create, so a simple apply can be used on read
14
+ */
15
+ serialize() { return; }
16
+ /**
17
+ * REDEFINE this if your widget needs to read from saved data and transform it to create itself - you do this for
18
+ * things that are not mapped directly into @Input() fields for example.
19
+ */
20
+ deserialize(w) {
21
+ // save full description for meta data
22
+ this.widgetItem = w;
23
+ if (!w)
24
+ return;
25
+ if (w.input)
26
+ Object.assign(this, w.input);
27
+ }
28
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: BaseWidget, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
29
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: BaseWidget }); }
30
+ }
31
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: BaseWidget, decorators: [{
32
+ type: Injectable
33
+ }] });
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS13aWRnZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9hbmd1bGFyL3Byb2plY3RzL2xpYi9zcmMvbGliL2Jhc2Utd2lkZ2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVIOztHQUVHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFJMUMsTUFBTSxPQUFnQixVQUFVO0lBSy9COzs7T0FHRztJQUNJLFNBQVMsS0FBZ0MsT0FBTyxDQUFDLENBQUM7SUFFekQ7OztPQUdHO0lBQ0ksV0FBVyxDQUFDLENBQW9CO1FBQ3JDLHNDQUFzQztRQUN0QyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsQ0FBQztZQUFFLE9BQU87UUFFZixJQUFJLENBQUMsQ0FBQyxLQUFLO1lBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdDLENBQUM7OEdBckJvQixVQUFVO2tIQUFWLFVBQVU7OzJGQUFWLFVBQVU7a0JBRC9CLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogZ3JpZHN0YWNrLWl0ZW0uY29tcG9uZW50LnRzIDExLjAuMFxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjItMjAyNCBBbGFpbiBEdW1lc255IC0gc2VlIEdyaWRTdGFjayByb290IGxpY2Vuc2VcclxuICovXHJcblxyXG4vKipcclxuICogQmFzZSBpbnRlcmZhY2UgdGhhdCBhbGwgd2lkZ2V0cyBuZWVkIHRvIGltcGxlbWVudCBpbiBvcmRlciBmb3IgR3JpZHN0YWNrSXRlbUNvbXBvbmVudCB0byBjb3JyZWN0bHkgc2F2ZS9sb2FkL2RlbGV0ZS8uLlxyXG4gKi9cclxuXHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmdDb21wSW5wdXRzLCBOZ0dyaWRTdGFja1dpZGdldCB9IGZyb20gJy4vZ3JpZHN0YWNrLmNvbXBvbmVudCc7XHJcblxyXG4gQEluamVjdGFibGUoKVxyXG4gZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VXaWRnZXQge1xyXG5cclxuICAvKiogdmFyaWFibGUgdGhhdCBob2xkcyB0aGUgY29tcGxldGUgZGVmaW5pdGlvbiBvZiB0aGlzIHdpZGdldHMgKHdpdGggc2VsZWN0b3IseCx5LHcsaCkgKi9cclxuICBwdWJsaWMgd2lkZ2V0SXRlbT86IE5nR3JpZFN0YWNrV2lkZ2V0O1xyXG5cclxuICAvKipcclxuICAgKiBSRURFRklORSB0byByZXR1cm4gYW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZGF0YSBuZWVkZWQgdG8gcmUtY3JlYXRlIHlvdXJzZWxmLCBvdGhlciB0aGFuIGBzZWxlY3RvcmAgYWxyZWFkeSBoYW5kbGVkLlxyXG4gICAqIFRoaXMgc2hvdWxkIG1hcCBkaXJlY3RseSB0byB0aGUgQElucHV0KCkgZmllbGRzIG9mIHRoaXMgb2JqZWN0cyBvbiBjcmVhdGUsIHNvIGEgc2ltcGxlIGFwcGx5IGNhbiBiZSB1c2VkIG9uIHJlYWRcclxuICAgKi9cclxuICBwdWJsaWMgc2VyaWFsaXplKCk6IE5nQ29tcElucHV0cyB8IHVuZGVmaW5lZCAgeyByZXR1cm47IH1cclxuXHJcbiAgLyoqXHJcbiAgICogUkVERUZJTkUgdGhpcyBpZiB5b3VyIHdpZGdldCBuZWVkcyB0byByZWFkIGZyb20gc2F2ZWQgZGF0YSBhbmQgdHJhbnNmb3JtIGl0IHRvIGNyZWF0ZSBpdHNlbGYgLSB5b3UgZG8gdGhpcyBmb3JcclxuICAgKiB0aGluZ3MgdGhhdCBhcmUgbm90IG1hcHBlZCBkaXJlY3RseSBpbnRvIEBJbnB1dCgpIGZpZWxkcyBmb3IgZXhhbXBsZS5cclxuICAgKi9cclxuICBwdWJsaWMgZGVzZXJpYWxpemUodzogTmdHcmlkU3RhY2tXaWRnZXQpICB7XHJcbiAgICAvLyBzYXZlIGZ1bGwgZGVzY3JpcHRpb24gZm9yIG1ldGEgZGF0YVxyXG4gICAgdGhpcy53aWRnZXRJdGVtID0gdztcclxuICAgIGlmICghdykgcmV0dXJuO1xyXG5cclxuICAgIGlmICh3LmlucHV0KSAgT2JqZWN0LmFzc2lnbih0aGlzLCB3LmlucHV0KTtcclxuICB9XHJcbiB9XHJcbiJdfQ==
@@ -0,0 +1,72 @@
1
+ /**
2
+ * gridstack-item.component.ts 11.0.0
3
+ * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license
4
+ */
5
+ import { Component, Input, ViewChild, ViewContainerRef } from '@angular/core';
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * HTML Component Wrapper for gridstack items, in combination with GridstackComponent for parent grid
9
+ */
10
+ export class GridstackItemComponent {
11
+ /** list of options for creating/updating this item */
12
+ set options(val) {
13
+ const grid = this.el.gridstackNode?.grid;
14
+ if (grid) {
15
+ // already built, do an update...
16
+ grid.update(this.el, val);
17
+ }
18
+ else {
19
+ // store our custom element in options so we can update it and not re-create a generic div!
20
+ this._options = { ...val, el: this.el };
21
+ }
22
+ }
23
+ /** return the latest grid options (from GS once built, otherwise initial values) */
24
+ get options() {
25
+ return this.el.gridstackNode || this._options || { el: this.el };
26
+ }
27
+ /** return the native element that contains grid specific fields as well */
28
+ get el() { return this.elementRef.nativeElement; }
29
+ /** clears the initial options now that we've built */
30
+ clearOptions() {
31
+ delete this._options;
32
+ }
33
+ constructor(elementRef) {
34
+ this.elementRef = elementRef;
35
+ this.el._gridItemComp = this;
36
+ }
37
+ ngOnDestroy() {
38
+ this.clearOptions();
39
+ delete this.childWidget;
40
+ delete this.el._gridItemComp;
41
+ delete this.container;
42
+ delete this.ref;
43
+ }
44
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: GridstackItemComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
45
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.6", type: GridstackItemComponent, selector: "gridstack-item", inputs: { options: "options" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: `
46
+ <div class="grid-stack-item-content">
47
+ <!-- where dynamic items go based on component types, or sub-grids, etc...) -->
48
+ <ng-template #container></ng-template>
49
+ <!-- any static (defined in dom) content goes here -->
50
+ <ng-content></ng-content>
51
+ <!-- fallback HTML content from GridStackWidget content field if used instead -->
52
+ {{options.content}}
53
+ </div>`, isInline: true, styles: [":host{display:block}\n"] }); }
54
+ }
55
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: GridstackItemComponent, decorators: [{
56
+ type: Component,
57
+ args: [{ selector: 'gridstack-item', template: `
58
+ <div class="grid-stack-item-content">
59
+ <!-- where dynamic items go based on component types, or sub-grids, etc...) -->
60
+ <ng-template #container></ng-template>
61
+ <!-- any static (defined in dom) content goes here -->
62
+ <ng-content></ng-content>
63
+ <!-- fallback HTML content from GridStackWidget content field if used instead -->
64
+ {{options.content}}
65
+ </div>`, styles: [":host{display:block}\n"] }]
66
+ }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { container: [{
67
+ type: ViewChild,
68
+ args: ['container', { read: ViewContainerRef, static: true }]
69
+ }], options: [{
70
+ type: Input
71
+ }] } });
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0YWNrLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vYW5ndWxhci9wcm9qZWN0cy9saWIvc3JjL2xpYi9ncmlkc3RhY2staXRlbS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBYyxLQUFLLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUEyQixNQUFNLGVBQWUsQ0FBQzs7QUFTbkg7O0dBRUc7QUFpQkgsTUFBTSxPQUFPLHNCQUFzQjtJQVdqQyxzREFBc0Q7SUFDdEQsSUFBb0IsT0FBTyxDQUFDLEdBQWtCO1FBQzVDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQztRQUN6QyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1QsaUNBQWlDO1lBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM1QixDQUFDO2FBQU0sQ0FBQztZQUNOLDJGQUEyRjtZQUMzRixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUMsQ0FBQztRQUN4QyxDQUFDO0lBQ0gsQ0FBQztJQUNELG9GQUFvRjtJQUNwRixJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUMsQ0FBQztJQUNqRSxDQUFDO0lBSUQsMkVBQTJFO0lBQzNFLElBQVcsRUFBRSxLQUE4QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUVsRixzREFBc0Q7SUFDL0MsWUFBWTtRQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELFlBQStCLFVBQStDO1FBQS9DLGVBQVUsR0FBVixVQUFVLENBQXFDO1FBQzVFLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFBO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUM7UUFDN0IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDOzhHQS9DVSxzQkFBc0I7a0dBQXRCLHNCQUFzQix5S0FHRCxnQkFBZ0IsMkNBakJ0Qzs7Ozs7Ozs7V0FRRDs7MkZBTUUsc0JBQXNCO2tCQWhCbEMsU0FBUzsrQkFDRSxnQkFBZ0IsWUFDaEI7Ozs7Ozs7O1dBUUQ7K0VBUytELFNBQVM7c0JBQWhGLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBUzNDLE9BQU87c0JBQTFCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGdyaWRzdGFjay1pdGVtLmNvbXBvbmVudC50cyAxMS4wLjBcbiAqIENvcHlyaWdodCAoYykgMjAyMi0yMDI0IEFsYWluIER1bWVzbnkgLSBzZWUgR3JpZFN0YWNrIHJvb3QgbGljZW5zZVxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiwgT25EZXN0cm95LCBDb21wb25lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEdyaWRJdGVtSFRNTEVsZW1lbnQsIEdyaWRTdGFja05vZGUgfSBmcm9tICdncmlkc3RhY2snO1xuaW1wb3J0IHsgQmFzZVdpZGdldCB9IGZyb20gJy4vYmFzZS13aWRnZXQnO1xuXG4vKiogc3RvcmUgZWxlbWVudCB0byBOZyBDbGFzcyBwb2ludGVyIGJhY2sgKi9cbmV4cG9ydCBpbnRlcmZhY2UgR3JpZEl0ZW1Db21wSFRNTEVsZW1lbnQgZXh0ZW5kcyBHcmlkSXRlbUhUTUxFbGVtZW50IHtcbiAgX2dyaWRJdGVtQ29tcD86IEdyaWRzdGFja0l0ZW1Db21wb25lbnQ7XG59XG5cbi8qKlxuICogSFRNTCBDb21wb25lbnQgV3JhcHBlciBmb3IgZ3JpZHN0YWNrIGl0ZW1zLCBpbiBjb21iaW5hdGlvbiB3aXRoIEdyaWRzdGFja0NvbXBvbmVudCBmb3IgcGFyZW50IGdyaWRcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZ3JpZHN0YWNrLWl0ZW0nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJncmlkLXN0YWNrLWl0ZW0tY29udGVudFwiPlxuICAgICAgPCEtLSB3aGVyZSBkeW5hbWljIGl0ZW1zIGdvIGJhc2VkIG9uIGNvbXBvbmVudCB0eXBlcywgb3Igc3ViLWdyaWRzLCBldGMuLi4pIC0tPlxuICAgICAgPG5nLXRlbXBsYXRlICNjb250YWluZXI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwhLS0gYW55IHN0YXRpYyAoZGVmaW5lZCBpbiBkb20pIGNvbnRlbnQgZ29lcyBoZXJlIC0tPlxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgPCEtLSBmYWxsYmFjayBIVE1MIGNvbnRlbnQgZnJvbSBHcmlkU3RhY2tXaWRnZXQgY29udGVudCBmaWVsZCBpZiB1c2VkIGluc3RlYWQgLS0+XG4gICAgICB7e29wdGlvbnMuY29udGVudH19XG4gICAgPC9kaXY+YCxcbiAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHsgZGlzcGxheTogYmxvY2s7IH1cbiAgYF0sXG4gIC8vIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLCAvLyBJRkYgeW91IHdhbnQgdG8gb3B0aW1pemUgYW5kIGNvbnRyb2wgd2hlbiBDaGFuZ2VEZXRlY3Rpb24gbmVlZHMgdG8gaGFwcGVuLi4uXG59KVxuZXhwb3J0IGNsYXNzIEdyaWRzdGFja0l0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIC8qKiBjb250YWluZXIgdG8gYXBwZW5kIGl0ZW1zIGR5bmFtaWNhbGx5ICovXG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlfSkgcHVibGljIGNvbnRhaW5lcj86IFZpZXdDb250YWluZXJSZWY7XG5cbiAgLyoqIENvbXBvbmVudFJlZiBvZiBvdXJzZWxmIC0gdXNlZCBieSBkeW5hbWljIG9iamVjdCB0byBjb3JyZWN0bHkgZ2V0IHJlbW92ZWQgKi9cbiAgcHVibGljIHJlZjogQ29tcG9uZW50UmVmPEdyaWRzdGFja0l0ZW1Db21wb25lbnQ+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBjaGlsZCBjb21wb25lbnQgc28gd2UgY2FuIHNhdmUvcmVzdG9yZSBhZGRpdGlvbmFsIGRhdGEgdG8gYmUgc2F2ZWQgYWxvbmcgKi9cbiAgcHVibGljIGNoaWxkV2lkZ2V0OiBCYXNlV2lkZ2V0IHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBsaXN0IG9mIG9wdGlvbnMgZm9yIGNyZWF0aW5nL3VwZGF0aW5nIHRoaXMgaXRlbSAqL1xuICBASW5wdXQoKSBwdWJsaWMgc2V0IG9wdGlvbnModmFsOiBHcmlkU3RhY2tOb2RlKSB7XG4gICAgY29uc3QgZ3JpZCA9IHRoaXMuZWwuZ3JpZHN0YWNrTm9kZT8uZ3JpZDtcbiAgICBpZiAoZ3JpZCkge1xuICAgICAgLy8gYWxyZWFkeSBidWlsdCwgZG8gYW4gdXBkYXRlLi4uXG4gICAgICBncmlkLnVwZGF0ZSh0aGlzLmVsLCB2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzdG9yZSBvdXIgY3VzdG9tIGVsZW1lbnQgaW4gb3B0aW9ucyBzbyB3ZSBjYW4gdXBkYXRlIGl0IGFuZCBub3QgcmUtY3JlYXRlIGEgZ2VuZXJpYyBkaXYhXG4gICAgICB0aGlzLl9vcHRpb25zID0gey4uLnZhbCwgZWw6IHRoaXMuZWx9O1xuICAgIH1cbiAgfVxuICAvKiogcmV0dXJuIHRoZSBsYXRlc3QgZ3JpZCBvcHRpb25zIChmcm9tIEdTIG9uY2UgYnVpbHQsIG90aGVyd2lzZSBpbml0aWFsIHZhbHVlcykgKi9cbiAgcHVibGljIGdldCBvcHRpb25zKCk6IEdyaWRTdGFja05vZGUge1xuICAgIHJldHVybiB0aGlzLmVsLmdyaWRzdGFja05vZGUgfHwgdGhpcy5fb3B0aW9ucyB8fCB7ZWw6IHRoaXMuZWx9O1xuICB9XG5cbiAgcHJvdGVjdGVkIF9vcHRpb25zPzogR3JpZFN0YWNrTm9kZTtcblxuICAvKiogcmV0dXJuIHRoZSBuYXRpdmUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGdyaWQgc3BlY2lmaWMgZmllbGRzIGFzIHdlbGwgKi9cbiAgcHVibGljIGdldCBlbCgpOiBHcmlkSXRlbUNvbXBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDsgfVxuXG4gIC8qKiBjbGVhcnMgdGhlIGluaXRpYWwgb3B0aW9ucyBub3cgdGhhdCB3ZSd2ZSBidWlsdCAqL1xuICBwdWJsaWMgY2xlYXJPcHRpb25zKCkge1xuICAgIGRlbGV0ZSB0aGlzLl9vcHRpb25zO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHJlYWRvbmx5IGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8R3JpZEl0ZW1Db21wSFRNTEVsZW1lbnQ+KSB7XG4gICAgdGhpcy5lbC5fZ3JpZEl0ZW1Db21wID0gdGhpcztcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyT3B0aW9ucygpO1xuICAgIGRlbGV0ZSB0aGlzLmNoaWxkV2lkZ2V0XG4gICAgZGVsZXRlIHRoaXMuZWwuX2dyaWRJdGVtQ29tcDtcbiAgICBkZWxldGUgdGhpcy5jb250YWluZXI7XG4gICAgZGVsZXRlIHRoaXMucmVmO1xuICB9XG59XG4iXX0=