@memberjunction/ng-data-context 2.43.0 → 2.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,14 +1,20 @@
1
- # Data Context Component
1
+ # @memberjunction/ng-data-context
2
2
 
3
- This Angular component package provides a way to display and interact with MemberJunction Data Contexts, which are collections of data items from different sources that can be used together.
3
+ Angular component package for displaying and editing MemberJunction Data Contexts - collections of data items from different sources that can be used together for analysis, reporting, or other data operations.
4
+
5
+ ## Overview
6
+
7
+ This package provides Angular components to display Data Contexts and their associated items in a clean, user-friendly interface. Data Contexts in MemberJunction are powerful constructs that allow users to group related data from various sources (SQL queries, views, entities, etc.) into a single logical unit.
4
8
 
5
9
  ## Features
6
10
 
7
- - **Display Data Context Details**: View information about a data context including ID, name, and description
8
- - **View Data Context Items**: See all items within a data context in a grid format
9
- - **Dialog Wrapper**: Includes a dialog component for easy integration into existing UIs
10
- - **Metadata Provider Integration**: Works with MemberJunction metadata providers
11
- - **Loading State Management**: Provides visual feedback during data loading
11
+ - **Display Data Context Details**: View comprehensive information about a data context including ID, name, and description
12
+ - **View Data Context Items**: Display all items within a data context in a sortable, scrollable grid format
13
+ - **Dialog Wrapper**: Ready-to-use dialog component for popup displays
14
+ - **Metadata Provider Integration**: Seamlessly integrates with MemberJunction's metadata system
15
+ - **Loading State Management**: Built-in loading indicators for better user experience
16
+ - **Virtual Scrolling**: Efficiently handle large datasets with Kendo Grid's virtual scrolling
17
+ - **Responsive Design**: Components adapt to different screen sizes
12
18
 
13
19
  ## Installation
14
20
 
@@ -50,41 +56,65 @@ export class YourModule { }
50
56
  <mj-data-context-dialog
51
57
  *ngIf="showDataContextDialog"
52
58
  [dataContextId]="selectedDataContextId"
59
+ [Provider]="metadataProvider"
53
60
  (dialogClosed)="showDataContextDialog = false">
54
61
  </mj-data-context-dialog>
55
62
  ```
56
63
 
57
- ### TypeScript Component Example
64
+ ### Complete TypeScript Example
58
65
 
59
66
  ```typescript
60
67
  import { Component } from '@angular/core';
61
- import { IMetadataProvider } from '@memberjunction/core';
68
+ import { IMetadataProvider, Metadata } from '@memberjunction/core';
62
69
 
63
70
  @Component({
64
71
  selector: 'app-data-context-viewer',
65
72
  template: `
66
- <button (click)="showDialog()">View Data Context</button>
67
-
68
- <mj-data-context-dialog
69
- *ngIf="isDialogVisible"
70
- [dataContextId]="currentDataContextId"
71
- [Provider]="metadataProvider"
72
- (dialogClosed)="isDialogVisible = false">
73
- </mj-data-context-dialog>
74
- `
73
+ <div class="data-context-container">
74
+ <h2>Data Context Viewer</h2>
75
+
76
+ <!-- Inline component usage -->
77
+ <mj-data-context
78
+ [dataContextId]="selectedDataContextId"
79
+ [Provider]="metadataProvider">
80
+ </mj-data-context>
81
+
82
+ <!-- Dialog trigger button -->
83
+ <button (click)="showDialog()">View in Dialog</button>
84
+
85
+ <!-- Dialog component -->
86
+ <mj-data-context-dialog
87
+ *ngIf="isDialogVisible"
88
+ [dataContextId]="selectedDataContextId"
89
+ [Provider]="metadataProvider"
90
+ (dialogClosed)="onDialogClose()">
91
+ </mj-data-context-dialog>
92
+ </div>
93
+ `,
94
+ styles: [`
95
+ .data-context-container {
96
+ padding: 20px;
97
+ }
98
+ `]
75
99
  })
76
100
  export class DataContextViewerComponent {
77
101
  isDialogVisible = false;
78
- currentDataContextId = '12345';
102
+ selectedDataContextId = '12345-67890-abcdef';
79
103
  metadataProvider: IMetadataProvider;
80
104
 
81
- constructor(metadataService: YourMetadataService) {
82
- this.metadataProvider = metadataService.getProvider();
105
+ constructor() {
106
+ // Use the global metadata provider or inject your own
107
+ this.metadataProvider = Metadata.Provider;
83
108
  }
84
109
 
85
- showDialog() {
110
+ showDialog(): void {
86
111
  this.isDialogVisible = true;
87
112
  }
113
+
114
+ onDialogClose(): void {
115
+ this.isDialogVisible = false;
116
+ // Additional cleanup or refresh logic here
117
+ }
88
118
  }
89
119
  ```
90
120
 
@@ -92,48 +122,144 @@ export class DataContextViewerComponent {
92
122
 
93
123
  ### DataContextComponent
94
124
 
95
- This is the main component for displaying a data context and its items.
125
+ The main component for displaying a data context and its items.
126
+
127
+ **Selector**: `mj-data-context`
96
128
 
97
129
  #### Inputs
98
130
 
99
- - `dataContextId`: string - The ID of the data context to display (required)
100
- - `Provider`: IMetadataProvider - Custom metadata provider (optional, will use global provider if not specified)
131
+ | Input | Type | Required | Default | Description |
132
+ |-------|------|----------|---------|-------------|
133
+ | `dataContextId` | `string` | Yes | - | The ID of the data context to display |
134
+ | `Provider` | `IMetadataProvider \| null` | No | `Metadata.Provider` | Custom metadata provider. If not provided, uses the global MemberJunction metadata provider |
135
+
136
+ #### Properties
137
+
138
+ | Property | Type | Description |
139
+ |----------|------|-------------|
140
+ | `dataContextRecord` | `DataContextEntity \| undefined` | The loaded data context entity |
141
+ | `dataContextItems` | `any[]` | Array of data context items |
142
+ | `showLoader` | `boolean` | Loading state indicator |
101
143
 
102
144
  ### DataContextDialogComponent
103
145
 
104
- This component wraps the DataContextComponent in a Kendo dialog window.
146
+ Dialog wrapper component that displays the DataContextComponent in a Kendo dialog.
147
+
148
+ **Selector**: `mj-data-context-dialog`
105
149
 
106
150
  #### Inputs
107
151
 
108
- - `dataContextId`: string - The ID of the data context to display (required)
109
- - `Provider`: IMetadataProvider - Custom metadata provider (optional)
152
+ | Input | Type | Required | Default | Description |
153
+ |-------|------|----------|---------|-------------|
154
+ | `dataContextId` | `string` | Yes | - | The ID of the data context to display |
155
+ | `Provider` | `IMetadataProvider \| null` | No | `null` | Custom metadata provider |
110
156
 
111
157
  #### Outputs
112
158
 
113
- - `dialogClosed`: EventEmitter<void> - Emitted when the dialog is closed
159
+ | Output | Type | Description |
160
+ |--------|------|-------------|
161
+ | `dialogClosed` | `EventEmitter<void>` | Emitted when the dialog is closed |
162
+
163
+ ### DataContextModule
164
+
165
+ The NgModule that exports both components.
166
+
167
+ **Exports**:
168
+ - `DataContextComponent`
169
+ - `DataContextDialogComponent`
114
170
 
115
171
  ## Data Context Structure
116
172
 
117
- A data context in MemberJunction typically consists of:
173
+ A data context in MemberJunction consists of:
174
+
175
+ 1. **Context Record** (`DataContextEntity`)
176
+ - `ID`: Unique identifier
177
+ - `Name`: Display name
178
+ - `Description`: Detailed description
179
+ - Additional metadata fields
180
+
181
+ 2. **Context Items** (`Data Context Items` entity)
182
+ - `Type`: The type of data item (SQL, View, Query, Entity, Record)
183
+ - `SQL`: Direct SQL query (if applicable)
184
+ - `ViewID`: Reference to a view
185
+ - `QueryID`: Reference to a saved query
186
+ - `EntityID`: Reference to an entity
187
+ - `RecordID`: Specific record reference
118
188
 
119
- 1. **Context Record** - Contains metadata about the context (name, description, etc.)
120
- 2. **Context Items** - The actual data items that make up the context, which can be:
121
- - SQL queries
122
- - Views
123
- - Entity records
124
- - Query results
125
- - Other data items
189
+ ## Grid Features
126
190
 
127
- The component displays both the context metadata and a grid of the items contained within it.
191
+ The component uses Kendo Grid with the following features enabled:
192
+ - **Virtual Scrolling**: Efficiently handles large datasets
193
+ - **Sorting**: Click column headers to sort
194
+ - **Resizable Columns**: Drag column borders to resize
195
+ - **Keyboard Navigation**: Navigate cells with keyboard
196
+ - **Page Size**: Default 100 items per virtual page
128
197
 
129
198
  ## Styling
130
199
 
131
- The component uses Kendo UI components for consistent styling and includes basic CSS that can be overridden in your application.
200
+ The components use Kendo UI for Angular styling. You can override styles by targeting the component selectors:
201
+
202
+ ```css
203
+ /* Custom styling example */
204
+ mj-data-context {
205
+ /* Your custom styles */
206
+ }
207
+
208
+ .kendo-grid-container {
209
+ height: 500px; /* Adjust grid height */
210
+ }
211
+ ```
132
212
 
133
213
  ## Dependencies
134
214
 
135
- - `@memberjunction/core`: For metadata and entity access
136
- - `@memberjunction/core-entities`: For DataContextEntity type
137
- - `@memberjunction/global`: For global utilities
138
- - `@progress/kendo-angular-grid`: For displaying data context items
139
- - `@progress/kendo-angular-indicators`: For loading indicators
215
+ ### Runtime Dependencies
216
+ - `@memberjunction/core` (v2.43.0): Core MemberJunction functionality
217
+ - `@memberjunction/core-entities` (v2.43.0): Entity type definitions
218
+ - `@memberjunction/global` (v2.43.0): Global utilities
219
+ - `tslib` (^2.3.0): TypeScript runtime helpers
220
+
221
+ ### Peer Dependencies
222
+ - `@angular/common` (18.0.2)
223
+ - `@angular/core` (18.0.2)
224
+ - `@progress/kendo-angular-grid` (16.2.0)
225
+ - `@progress/kendo-angular-indicators` (16.2.0)
226
+ - `@progress/kendo-angular-dialog` (imported via module)
227
+ - `@progress/kendo-angular-buttons` (imported via module)
228
+
229
+ ## Integration with MemberJunction
230
+
231
+ This package integrates seamlessly with other MemberJunction packages:
232
+
233
+ - Uses the MemberJunction metadata system for entity loading
234
+ - Leverages `RunView` for efficient data retrieval
235
+ - Compatible with MemberJunction's security and permission system
236
+ - Works with custom metadata providers for multi-tenant scenarios
237
+
238
+ ## Build and Development
239
+
240
+ To build this package individually:
241
+
242
+ ```bash
243
+ cd packages/Angular/Generic/data-context
244
+ npm run build
245
+ ```
246
+
247
+ The package uses Angular CLI's `ngc` compiler for building the library.
248
+
249
+ ## Error Handling
250
+
251
+ The component includes built-in error handling:
252
+ - Logs errors using MemberJunction's `LogError` function
253
+ - Hides the loader on error
254
+ - Gracefully handles missing or invalid data context IDs
255
+
256
+ ## Best Practices
257
+
258
+ 1. **Provider Usage**: Only provide a custom `Provider` if you need to override the global metadata provider
259
+ 2. **Dialog Management**: Always handle the `dialogClosed` event to properly manage dialog state
260
+ 3. **Performance**: The virtual scrolling is optimized for datasets up to several thousand items
261
+ 4. **Error Handling**: Monitor console logs for any data loading errors
262
+
263
+ ## License
264
+
265
+ ISC
@@ -2,13 +2,16 @@ import * as i0 from "@angular/core";
2
2
  import * as i1 from "./ng-data-context.component";
3
3
  import * as i2 from "./ng-data-context-dialog.component";
4
4
  import * as i3 from "@angular/common";
5
- import * as i4 from "@progress/kendo-angular-grid";
6
- import * as i5 from "@progress/kendo-angular-dialog";
7
- import * as i6 from "@progress/kendo-angular-buttons";
8
- import * as i7 from "@progress/kendo-angular-indicators";
5
+ import * as i4 from "@angular/forms";
6
+ import * as i5 from "@progress/kendo-angular-grid";
7
+ import * as i6 from "@progress/kendo-angular-dialog";
8
+ import * as i7 from "@progress/kendo-angular-buttons";
9
+ import * as i8 from "@progress/kendo-angular-indicators";
10
+ import * as i9 from "@progress/kendo-angular-inputs";
11
+ import * as i10 from "@memberjunction/ng-container-directives";
9
12
  export declare class DataContextModule {
10
13
  static ɵfac: i0.ɵɵFactoryDeclaration<DataContextModule, never>;
11
- static ɵmod: i0.ɵɵNgModuleDeclaration<DataContextModule, [typeof i1.DataContextComponent, typeof i2.DataContextDialogComponent], [typeof i3.CommonModule, typeof i4.GridModule, typeof i5.DialogsModule, typeof i6.ButtonsModule, typeof i7.IndicatorsModule], [typeof i1.DataContextComponent, typeof i2.DataContextDialogComponent]>;
14
+ static ɵmod: i0.ɵɵNgModuleDeclaration<DataContextModule, [typeof i1.DataContextComponent, typeof i2.DataContextDialogComponent], [typeof i3.CommonModule, typeof i4.FormsModule, typeof i5.GridModule, typeof i6.DialogsModule, typeof i7.ButtonsModule, typeof i8.IndicatorsModule, typeof i9.InputsModule, typeof i10.ContainerDirectivesModule], [typeof i1.DataContextComponent, typeof i2.DataContextDialogComponent]>;
12
15
  static ɵinj: i0.ɵɵInjectorDeclaration<DataContextModule>;
13
16
  }
14
17
  //# sourceMappingURL=module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/lib/module.ts"],"names":[],"mappings":";;;;;;;;AAYA,qBAiBa,iBAAiB;yCAAjB,iBAAiB;0CAAjB,iBAAiB;0CAAjB,iBAAiB;CAAI"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/lib/module.ts"],"names":[],"mappings":";;;;;;;;;;;AAeA,qBAoBa,iBAAiB;yCAAjB,iBAAiB;0CAAjB,iBAAiB;0CAAjB,iBAAiB;CAAI"}
@@ -1,22 +1,28 @@
1
1
  import { NgModule } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
3
4
  // Kendo UI Angular imports
4
5
  import { GridModule } from '@progress/kendo-angular-grid';
5
6
  import { DialogsModule } from "@progress/kendo-angular-dialog";
6
7
  import { ButtonsModule } from '@progress/kendo-angular-buttons';
7
8
  import { IndicatorsModule } from '@progress/kendo-angular-indicators';
9
+ import { InputsModule } from '@progress/kendo-angular-inputs';
8
10
  import { DataContextComponent } from './ng-data-context.component';
9
11
  import { DataContextDialogComponent } from './ng-data-context-dialog.component';
12
+ import { ContainerDirectivesModule } from '@memberjunction/ng-container-directives';
10
13
  import * as i0 from "@angular/core";
11
14
  export class DataContextModule {
12
15
  }
13
16
  DataContextModule.ɵfac = function DataContextModule_Factory(t) { return new (t || DataContextModule)(); };
14
17
  DataContextModule.ɵmod = /*@__PURE__*/ i0.ɵɵdefineNgModule({ type: DataContextModule });
15
18
  DataContextModule.ɵinj = /*@__PURE__*/ i0.ɵɵdefineInjector({ imports: [CommonModule,
19
+ FormsModule,
16
20
  GridModule,
17
21
  DialogsModule,
18
22
  ButtonsModule,
19
- IndicatorsModule] });
23
+ IndicatorsModule,
24
+ InputsModule,
25
+ ContainerDirectivesModule] });
20
26
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DataContextModule, [{
21
27
  type: NgModule,
22
28
  args: [{
@@ -26,10 +32,13 @@ DataContextModule.ɵinj = /*@__PURE__*/ i0.ɵɵdefineInjector({ imports: [Common
26
32
  ],
27
33
  imports: [
28
34
  CommonModule,
35
+ FormsModule,
29
36
  GridModule,
30
37
  DialogsModule,
31
38
  ButtonsModule,
32
- IndicatorsModule
39
+ IndicatorsModule,
40
+ InputsModule,
41
+ ContainerDirectivesModule
33
42
  ],
34
43
  exports: [
35
44
  DataContextComponent,
@@ -39,9 +48,12 @@ DataContextModule.ɵinj = /*@__PURE__*/ i0.ɵɵdefineInjector({ imports: [Common
39
48
  }], null, null); })();
40
49
  (function () { (typeof ngJitMode === "undefined" || ngJitMode) && i0.ɵɵsetNgModuleScope(DataContextModule, { declarations: [DataContextComponent,
41
50
  DataContextDialogComponent], imports: [CommonModule,
51
+ FormsModule,
42
52
  GridModule,
43
53
  DialogsModule,
44
54
  ButtonsModule,
45
- IndicatorsModule], exports: [DataContextComponent,
55
+ IndicatorsModule,
56
+ InputsModule,
57
+ ContainerDirectivesModule], exports: [DataContextComponent,
46
58
  DataContextDialogComponent] }); })();
47
59
  //# sourceMappingURL=module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/lib/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,2BAA2B;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;;AAmBhF,MAAM,OAAO,iBAAiB;;kFAAjB,iBAAiB;mEAAjB,iBAAiB;uEAX1B,YAAY;QACZ,UAAU;QACV,aAAa;QACb,aAAa;QACb,gBAAgB;iFAOP,iBAAiB;cAjB7B,QAAQ;eAAC;gBACR,YAAY,EAAE;oBACZ,oBAAoB;oBACpB,0BAA0B;iBAC3B;gBACD,OAAO,EAAE;oBACP,YAAY;oBACZ,UAAU;oBACV,aAAa;oBACb,aAAa;oBACb,gBAAgB;iBACjB;gBACD,OAAO,EAAE;oBACP,oBAAoB;oBACpB,0BAA0B;iBAC3B;aACF;;wFACY,iBAAiB,mBAf1B,oBAAoB;QACpB,0BAA0B,aAG1B,YAAY;QACZ,UAAU;QACV,aAAa;QACb,aAAa;QACb,gBAAgB,aAGhB,oBAAoB;QACpB,0BAA0B"}
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/lib/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,2BAA2B;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAE9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;;AAsBpF,MAAM,OAAO,iBAAiB;;kFAAjB,iBAAiB;mEAAjB,iBAAiB;uEAd1B,YAAY;QACZ,WAAW;QACX,UAAU;QACV,aAAa;QACb,aAAa;QACb,gBAAgB;QAChB,YAAY;QACZ,yBAAyB;iFAOhB,iBAAiB;cApB7B,QAAQ;eAAC;gBACR,YAAY,EAAE;oBACZ,oBAAoB;oBACpB,0BAA0B;iBAC3B;gBACD,OAAO,EAAE;oBACP,YAAY;oBACZ,WAAW;oBACX,UAAU;oBACV,aAAa;oBACb,aAAa;oBACb,gBAAgB;oBAChB,YAAY;oBACZ,yBAAyB;iBAC1B;gBACD,OAAO,EAAE;oBACP,oBAAoB;oBACpB,0BAA0B;iBAC3B;aACF;;wFACY,iBAAiB,mBAlB1B,oBAAoB;QACpB,0BAA0B,aAG1B,YAAY;QACZ,WAAW;QACX,UAAU;QACV,aAAa;QACb,aAAa;QACb,gBAAgB;QAChB,YAAY;QACZ,yBAAyB,aAGzB,oBAAoB;QACpB,0BAA0B"}
@@ -2,14 +2,19 @@ import { EventEmitter } from '@angular/core';
2
2
  import { IMetadataProvider } from '@memberjunction/core';
3
3
  import * as i0 from "@angular/core";
4
4
  /**
5
- * Simple dialog wrapper component for the data context component
5
+ * Enhanced dialog wrapper component for the data context viewer
6
6
  */
7
7
  export declare class DataContextDialogComponent {
8
8
  dialogClosed: EventEmitter<any>;
9
9
  dataContextId: string;
10
+ dataContextName?: string;
10
11
  Provider: IMetadataProvider | null;
11
- closePropertiesDialog(): void;
12
+ isMaximized: boolean;
13
+ get dialogWidth(): number;
14
+ get dialogHeight(): number;
15
+ closeDialog(): void;
16
+ toggleMaximize(): void;
12
17
  static ɵfac: i0.ɵɵFactoryDeclaration<DataContextDialogComponent, never>;
13
- static ɵcmp: i0.ɵɵComponentDeclaration<DataContextDialogComponent, "mj-data-context-dialog", never, { "dataContextId": { "alias": "dataContextId"; "required": false; }; "Provider": { "alias": "Provider"; "required": false; }; }, { "dialogClosed": "dialogClosed"; }, never, never, false, never>;
18
+ static ɵcmp: i0.ɵɵComponentDeclaration<DataContextDialogComponent, "mj-data-context-dialog", never, { "dataContextId": { "alias": "dataContextId"; "required": false; }; "dataContextName": { "alias": "dataContextName"; "required": false; }; "Provider": { "alias": "Provider"; "required": false; }; }, { "dialogClosed": "dialogClosed"; }, never, never, false, never>;
14
19
  }
15
20
  //# sourceMappingURL=ng-data-context-dialog.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ng-data-context-dialog.component.d.ts","sourceRoot":"","sources":["../../src/lib/ng-data-context-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAiB,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;;AAEzD;;GAEG;AACH,qBAKa,0BAA0B;IAC3B,YAAY,oBAAsB;IACnC,aAAa,EAAG,MAAM,CAAC;IACvB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IAEnD,qBAAqB;yCALV,0BAA0B;2CAA1B,0BAA0B;CAQtC"}
1
+ {"version":3,"file":"ng-data-context-dialog.component.d.ts","sourceRoot":"","sources":["../../src/lib/ng-data-context-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAiB,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;;AAEzD;;GAEG;AACH,qBAKa,0BAA0B;IAC3B,YAAY,oBAAsB;IACnC,aAAa,EAAG,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IAE5C,WAAW,EAAE,OAAO,CAAS;IAEpC,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED,WAAW,IAAI,IAAI;IAInB,cAAc,IAAI,IAAI;yCApBX,0BAA0B;2CAA1B,0BAA0B;CAuBtC"}
@@ -3,38 +3,71 @@ import * as i0 from "@angular/core";
3
3
  import * as i1 from "@progress/kendo-angular-dialog";
4
4
  import * as i2 from "./ng-data-context.component";
5
5
  /**
6
- * Simple dialog wrapper component for the data context component
6
+ * Enhanced dialog wrapper component for the data context viewer
7
7
  */
8
8
  export class DataContextDialogComponent {
9
9
  constructor() {
10
10
  this.dialogClosed = new EventEmitter();
11
11
  this.Provider = null;
12
+ this.isMaximized = false;
12
13
  }
13
- closePropertiesDialog() {
14
+ get dialogWidth() {
15
+ return this.isMaximized ? window.innerWidth * 0.95 : 900;
16
+ }
17
+ get dialogHeight() {
18
+ return this.isMaximized ? window.innerHeight * 0.95 : 700;
19
+ }
20
+ closeDialog() {
14
21
  this.dialogClosed.emit();
15
22
  }
23
+ toggleMaximize() {
24
+ this.isMaximized = !this.isMaximized;
25
+ }
16
26
  }
17
27
  DataContextDialogComponent.ɵfac = function DataContextDialogComponent_Factory(t) { return new (t || DataContextDialogComponent)(); };
18
- DataContextDialogComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DataContextDialogComponent, selectors: [["mj-data-context-dialog"]], inputs: { dataContextId: "dataContextId", Provider: "Provider" }, outputs: { dialogClosed: "dialogClosed" }, decls: 4, vars: 7, consts: [[1, "k-overlay"], ["title", "Data Context", 1, "kendo-window-custom", 3, "close", "width", "height", "minHeight", "minWidth", "resizable"], [3, "dataContextId", "Provider"]], template: function DataContextDialogComponent_Template(rf, ctx) { if (rf & 1) {
19
- i0.ɵɵelementStart(0, "div");
20
- i0.ɵɵelement(1, "div", 0);
21
- i0.ɵɵelementStart(2, "kendo-window", 1);
22
- i0.ɵɵlistener("close", function DataContextDialogComponent_Template_kendo_window_close_2_listener() { return ctx.closePropertiesDialog(); });
23
- i0.ɵɵelement(3, "mj-data-context", 2);
28
+ DataContextDialogComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DataContextDialogComponent, selectors: [["mj-data-context-dialog"]], inputs: { dataContextId: "dataContextId", dataContextName: "dataContextName", Provider: "Provider" }, outputs: { dialogClosed: "dialogClosed" }, decls: 15, vars: 16, consts: [[1, "data-context-dialog-wrapper"], [1, "k-overlay"], [1, "data-context-window", 3, "close", "width", "height", "minHeight", "minWidth", "resizable", "draggable"], [1, "window-title"], [1, "fa-solid", "fa-layer-group", "title-icon"], [1, "window-actions"], [1, "window-action-btn", 3, "click", "title"], [1, "fa-solid"], ["title", "Close", 1, "window-action-btn", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "dialog-content"], [3, "dataContextId", "Provider"]], template: function DataContextDialogComponent_Template(rf, ctx) { if (rf & 1) {
29
+ i0.ɵɵelementStart(0, "div", 0);
30
+ i0.ɵɵelement(1, "div", 1);
31
+ i0.ɵɵelementStart(2, "kendo-window", 2);
32
+ i0.ɵɵlistener("close", function DataContextDialogComponent_Template_kendo_window_close_2_listener() { return ctx.closeDialog(); });
33
+ i0.ɵɵelementStart(3, "kendo-window-titlebar")(4, "div", 3);
34
+ i0.ɵɵelement(5, "i", 4);
35
+ i0.ɵɵelementStart(6, "span");
36
+ i0.ɵɵtext(7);
24
37
  i0.ɵɵelementEnd()();
38
+ i0.ɵɵelementStart(8, "div", 5)(9, "button", 6);
39
+ i0.ɵɵlistener("click", function DataContextDialogComponent_Template_button_click_9_listener() { return ctx.toggleMaximize(); });
40
+ i0.ɵɵelement(10, "i", 7);
41
+ i0.ɵɵelementEnd();
42
+ i0.ɵɵelementStart(11, "button", 8);
43
+ i0.ɵɵlistener("click", function DataContextDialogComponent_Template_button_click_11_listener() { return ctx.closeDialog(); });
44
+ i0.ɵɵelement(12, "i", 9);
45
+ i0.ɵɵelementEnd()()();
46
+ i0.ɵɵelementStart(13, "div", 10);
47
+ i0.ɵɵelement(14, "mj-data-context", 11);
48
+ i0.ɵɵelementEnd()()();
25
49
  } if (rf & 2) {
26
50
  i0.ɵɵadvance(2);
27
- i0.ɵɵproperty("width", 700)("height", 525)("minHeight", 300)("minWidth", 400)("resizable", true);
51
+ i0.ɵɵclassProp("maximized", ctx.isMaximized);
52
+ i0.ɵɵproperty("width", ctx.dialogWidth)("height", ctx.dialogHeight)("minHeight", 400)("minWidth", 600)("resizable", !ctx.isMaximized)("draggable", !ctx.isMaximized);
53
+ i0.ɵɵadvance(5);
54
+ i0.ɵɵtextInterpolate1("Data Context", ctx.dataContextName ? ": " + ctx.dataContextName : "", "");
55
+ i0.ɵɵadvance(2);
56
+ i0.ɵɵpropertyInterpolate("title", ctx.isMaximized ? "Restore" : "Maximize");
28
57
  i0.ɵɵadvance();
58
+ i0.ɵɵclassProp("fa-maximize", !ctx.isMaximized)("fa-compress", ctx.isMaximized);
59
+ i0.ɵɵadvance(4);
29
60
  i0.ɵɵproperty("dataContextId", ctx.dataContextId)("Provider", ctx.Provider);
30
- } }, dependencies: [i1.WindowComponent, i2.DataContextComponent] });
61
+ } }, dependencies: [i1.WindowComponent, i1.WindowTitleBarComponent, i2.DataContextComponent], styles: [".data-context-dialog-wrapper[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.data-context-window[_ngcontent-%COMP%] {\n border-radius: 8px;\n overflow: hidden;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15);\n}\n\n\n\n[_nghost-%COMP%] .k-window {\n margin: 0 auto;\n top: 10% !important;\n position: fixed !important;\n}\n\n\n.data-context-window.maximized[_ngcontent-%COMP%] {\n position: fixed !important;\n top: 2.5% !important;\n left: 2.5% !important;\n}\n\n\n\n.window-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 16px;\n font-weight: 500;\n color: #333333;\n}\n\n.title-icon[_ngcontent-%COMP%] {\n color: #2196f3;\n font-size: 18px;\n}\n\n.window-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n margin-left: auto;\n}\n\n.window-action-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n padding: 8px 10px;\n cursor: pointer;\n color: #656565;\n transition: all 0.2s;\n border-radius: 4px;\n font-size: 14px;\n}\n\n.window-action-btn[_ngcontent-%COMP%]:hover {\n background-color: #e3f2fd;\n color: #2196f3;\n}\n\n.window-action-btn[_ngcontent-%COMP%]:last-child:hover {\n background-color: #ffebee;\n color: #f44336;\n}\n\n\n\n.dialog-content[_ngcontent-%COMP%] {\n height: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n}\n\n\n\n[_nghost-%COMP%] .k-window-titlebar {\n background-color: #ffffff;\n border-bottom: 1px solid #e2e8f0;\n padding: 12px 16px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n[_nghost-%COMP%] .k-window-title {\n display: contents;\n}\n\n[_nghost-%COMP%] .k-window-actions {\n display: none; \n\n}\n\n[_nghost-%COMP%] .k-window-content {\n padding: 0;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n[_nghost-%COMP%] .k-window {\n border: none;\n}\n\n\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from {\n opacity: 0;\n transform: scale(0.95);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n.data-context-window[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease-out;\n}"] });
31
62
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DataContextDialogComponent, [{
32
63
  type: Component,
33
- args: [{ selector: 'mj-data-context-dialog', template: "<div>\n <div class=\"k-overlay\"></div>\n <kendo-window \n class=\"kendo-window-custom\"\n [width]=\"700\"\n [height]=\"525\"\n [minHeight]=\"300\"\n [minWidth]=\"400\"\n [resizable]=\"true\"\n title=\"Data Context\"\n (close)=\"closePropertiesDialog()\"\n >\n <mj-data-context \n [dataContextId]=\"dataContextId\" \n [Provider]=\"Provider\"\n ></mj-data-context>\n </kendo-window>\n</div>" }]
64
+ args: [{ selector: 'mj-data-context-dialog', template: "<div class=\"data-context-dialog-wrapper\">\n <div class=\"k-overlay\"></div>\n <kendo-window \n class=\"data-context-window\"\n [class.maximized]=\"isMaximized\"\n [width]=\"dialogWidth\"\n [height]=\"dialogHeight\"\n [minHeight]=\"400\"\n [minWidth]=\"600\"\n [resizable]=\"!isMaximized\"\n [draggable]=\"!isMaximized\"\n (close)=\"closeDialog()\">\n \n <kendo-window-titlebar>\n <div class=\"window-title\">\n <i class=\"fa-solid fa-layer-group title-icon\"></i>\n <span>Data Context{{ dataContextName ? ': ' + dataContextName : '' }}</span>\n </div>\n <div class=\"window-actions\">\n <button \n (click)=\"toggleMaximize()\"\n title=\"{{ isMaximized ? 'Restore' : 'Maximize' }}\"\n class=\"window-action-btn\">\n <i class=\"fa-solid\" [class.fa-maximize]=\"!isMaximized\" [class.fa-compress]=\"isMaximized\"></i>\n </button>\n <button \n (click)=\"closeDialog()\"\n title=\"Close\"\n class=\"window-action-btn\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n </kendo-window-titlebar>\n \n <div class=\"dialog-content\">\n <mj-data-context \n [dataContextId]=\"dataContextId\" \n [Provider]=\"Provider\">\n </mj-data-context>\n </div>\n </kendo-window>\n</div>", styles: [".data-context-dialog-wrapper {\n position: relative;\n}\n\n.data-context-window {\n border-radius: 8px;\n overflow: hidden;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15);\n}\n\n/* Position the window properly */\n:host ::ng-deep .k-window {\n margin: 0 auto;\n top: 10% !important;\n position: fixed !important;\n}\n\n\n.data-context-window.maximized {\n position: fixed !important;\n top: 2.5% !important;\n left: 2.5% !important;\n}\n\n/* Custom Title Bar */\n.window-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 16px;\n font-weight: 500;\n color: #333333;\n}\n\n.title-icon {\n color: #2196f3;\n font-size: 18px;\n}\n\n.window-actions {\n display: flex;\n gap: 4px;\n margin-left: auto;\n}\n\n.window-action-btn {\n background: none;\n border: none;\n padding: 8px 10px;\n cursor: pointer;\n color: #656565;\n transition: all 0.2s;\n border-radius: 4px;\n font-size: 14px;\n}\n\n.window-action-btn:hover {\n background-color: #e3f2fd;\n color: #2196f3;\n}\n\n.window-action-btn:last-child:hover {\n background-color: #ffebee;\n color: #f44336;\n}\n\n/* Dialog Content */\n.dialog-content {\n height: 100%;\n overflow: auto;\n display: flex;\n flex-direction: column;\n}\n\n/* Override Kendo Window Styles */\n:host ::ng-deep .k-window-titlebar {\n background-color: #ffffff;\n border-bottom: 1px solid #e2e8f0;\n padding: 12px 16px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n:host ::ng-deep .k-window-title {\n display: contents;\n}\n\n:host ::ng-deep .k-window-actions {\n display: none; /* Hide default Kendo window actions since we have custom ones */\n}\n\n:host ::ng-deep .k-window-content {\n padding: 0;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n:host ::ng-deep .k-window {\n border: none;\n}\n\n/* Animations */\n@keyframes fadeIn {\n from {\n opacity: 0;\n transform: scale(0.95);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n.data-context-window {\n animation: fadeIn 0.2s ease-out;\n}"] }]
34
65
  }], null, { dialogClosed: [{
35
66
  type: Output
36
67
  }], dataContextId: [{
37
68
  type: Input
69
+ }], dataContextName: [{
70
+ type: Input
38
71
  }], Provider: [{
39
72
  type: Input
40
73
  }] }); })();
@@ -1 +1 @@
1
- {"version":3,"file":"ng-data-context-dialog.component.js","sourceRoot":"","sources":["../../src/lib/ng-data-context-dialog.component.ts","../../src/lib/ng-data-context-dialog.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;;;;AAGvE;;GAEG;AAMH,MAAM,OAAO,0BAA0B;IALvC;QAMY,iBAAY,GAAG,IAAI,YAAY,EAAE,CAAC;QAEnC,aAAQ,GAA6B,IAAI,CAAC;KAKpD;IAHC,qBAAqB;QACnB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;;oGAPU,0BAA0B;6EAA1B,0BAA0B;QCXvC,2BAAK;QACD,yBAA6B;QAC7B,uCASC;QADG,6GAAS,2BAAuB,IAAC;QAEjC,qCAGmB;QAE3B,AADI,iBAAe,EACb;;QAbE,eAAa;QAIb,AADA,AADA,AADA,AADA,2BAAa,eACC,kBACG,iBACD,mBACE;QAKV,cAA+B;QAC/B,AADA,iDAA+B,0BACV;;iFDHxB,0BAA0B;cALtC,SAAS;2BACE,wBAAwB;gBAKxB,YAAY;kBAArB,MAAM;YACE,aAAa;kBAArB,KAAK;YACG,QAAQ;kBAAhB,KAAK;;kFAHK,0BAA0B"}
1
+ {"version":3,"file":"ng-data-context-dialog.component.js","sourceRoot":"","sources":["../../src/lib/ng-data-context-dialog.component.ts","../../src/lib/ng-data-context-dialog.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;;;;AAGvE;;GAEG;AAMH,MAAM,OAAO,0BAA0B;IALvC;QAMY,iBAAY,GAAG,IAAI,YAAY,EAAE,CAAC;QAGnC,aAAQ,GAA6B,IAAI,CAAC;QAE5C,gBAAW,GAAY,KAAK,CAAC;KAiBrC;IAfC,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3D,CAAC;IAED,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5D,CAAC;IAED,WAAW;QACT,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;IACvC,CAAC;;oGAtBU,0BAA0B;6EAA1B,0BAA0B;QCXvC,8BAAyC;QACrC,yBAA6B;QAC7B,uCAS4B;QAAxB,6GAAS,iBAAa,IAAC;QAGnB,AADJ,6CAAuB,aACO;QACtB,uBAAkD;QAClD,4BAAM;QAAA,YAA+D;QACzE,AADyE,iBAAO,EAC1E;QAEF,AADJ,8BAA4B,gBAIM;QAF1B,uGAAS,oBAAgB,IAAC;QAG1B,wBAA6F;QACjG,iBAAS;QACT,kCAG8B;QAF1B,wGAAS,iBAAa,IAAC;QAGvB,wBAAiC;QAG7C,AADI,AADI,iBAAS,EACP,EACc;QAExB,gCAA4B;QACxB,uCAGkB;QAG9B,AADI,AADI,iBAAM,EACK,EACb;;QArCE,eAA+B;QAA/B,4CAA+B;QAM/B,AADA,AADA,AADA,AADA,AADA,uCAAqB,4BACE,kBACN,iBACD,+BACU,+BACA;QAMZ,eAA+D;QAA/D,gGAA+D;QAKjE,eAAkD;QAAlD,2EAAkD;QAE9B,cAAkC;QAAC,AAAnC,+CAAkC,gCAAkC;QAa5F,eAA+B;QAC/B,AADA,iDAA+B,0BACV;;iFD1BxB,0BAA0B;cALtC,SAAS;2BACE,wBAAwB;gBAKxB,YAAY;kBAArB,MAAM;YACE,aAAa;kBAArB,KAAK;YACG,eAAe;kBAAvB,KAAK;YACG,QAAQ;kBAAhB,KAAK;;kFAJK,0BAA0B"}
@@ -1,16 +1,41 @@
1
1
  import { OnInit } from '@angular/core';
2
2
  import { IMetadataProvider } from '@memberjunction/core';
3
- import { DataContextEntity } from '@memberjunction/core-entities';
3
+ import { DataContextEntity, DataContextItemEntity } from '@memberjunction/core-entities';
4
4
  import * as i0 from "@angular/core";
5
5
  export declare class DataContextComponent implements OnInit {
6
6
  dataContextId: string;
7
7
  Provider: IMetadataProvider | null;
8
8
  dataContextRecord?: DataContextEntity;
9
- dataContextItems: any;
9
+ dataContextItems: DataContextItemEntity[];
10
10
  showLoader: boolean;
11
+ errorMessage: string;
12
+ searchTerm: string;
13
+ showSQLPreview: boolean;
14
+ previewSQL: string;
15
+ copiedField: string;
16
+ expandedItems: {
17
+ [key: string]: boolean;
18
+ };
11
19
  get ProviderToUse(): IMetadataProvider;
20
+ get filteredItems(): DataContextItemEntity[];
21
+ get itemCount(): number;
12
22
  ngOnInit(): void;
13
23
  LoadDataContext(dataContextId: string): Promise<void>;
24
+ getTypeIcon(type: string): string;
25
+ getTypeColor(type: string): string;
26
+ getEntityName(entityId: string | null): string | undefined;
27
+ getViewName(viewId: string): Promise<string | undefined>;
28
+ getQueryName(queryId: string): Promise<string | undefined>;
29
+ onSearchChange(): void;
30
+ toggleItemExpansion(itemId: string): void;
31
+ copyToClipboard(text: string, fieldName: string): Promise<void>;
32
+ previewSQLCode(sql: string): void;
33
+ closeSQLPreview(): void;
34
+ navigateToEntity(entityId: string): void;
35
+ navigateToView(viewId: string): void;
36
+ navigateToQuery(queryId: string): void;
37
+ refresh(): Promise<void>;
38
+ exportToCSV(): void;
14
39
  static ɵfac: i0.ɵɵFactoryDeclaration<DataContextComponent, never>;
15
40
  static ɵcmp: i0.ɵɵComponentDeclaration<DataContextComponent, "mj-data-context", never, { "dataContextId": { "alias": "dataContextId"; "required": false; }; "Provider": { "alias": "Provider"; "required": false; }; }, {}, never, never, false, never>;
16
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ng-data-context.component.d.ts","sourceRoot":"","sources":["../../src/lib/ng-data-context.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,MAAM,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAiD,MAAM,sBAAsB,CAAC;AACxG,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;;AAElE,qBAKa,oBAAqB,YAAW,MAAM;IACxC,aAAa,EAAG,MAAM,CAAC;IACvB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IAE5C,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,gBAAgB,EAAE,GAAG,CAAM;IAC3B,UAAU,EAAE,OAAO,CAAS;IAEnC,IAAW,aAAa,IAAI,iBAAiB,CAE5C;IAED,QAAQ,IAAI,IAAI;IAOV,eAAe,CAAC,aAAa,EAAE,MAAM;yCAnBhC,oBAAoB;2CAApB,oBAAoB;CA0ChC"}
1
+ {"version":3,"file":"ng-data-context.component.d.ts","sourceRoot":"","sources":["../../src/lib/ng-data-context.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,MAAM,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAiD,MAAM,sBAAsB,CAAC;AACxG,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;;AAEzF,qBAKa,oBAAqB,YAAW,MAAM;IACxC,aAAa,EAAG,MAAM,CAAC;IACvB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IAE5C,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,gBAAgB,EAAE,qBAAqB,EAAE,CAAM;IAC/C,UAAU,EAAE,OAAO,CAAS;IAC5B,YAAY,EAAE,MAAM,CAAM;IAC1B,UAAU,EAAE,MAAM,CAAM;IAGxB,cAAc,EAAE,OAAO,CAAS;IAChC,UAAU,EAAE,MAAM,CAAM;IACxB,WAAW,EAAE,MAAM,CAAM;IACzB,aAAa,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAM;IAEtD,IAAW,aAAa,IAAI,iBAAiB,CAE5C;IAED,IAAW,aAAa,IAAI,qBAAqB,EAAE,CAYlD;IAED,IAAW,SAAS,IAAI,MAAM,CAE7B;IAED,QAAQ,IAAI,IAAI;IAOV,eAAe,CAAC,aAAa,EAAE,MAAM;IAgCpC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAYjC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAYlC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS;IAMpD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAWxD,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAWhE,cAAc,IAAI,IAAI;IAKtB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAInC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYrE,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKjC,eAAe,IAAI,IAAI;IAKvB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAKxC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAKpC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKhC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B,WAAW,IAAI,IAAI;yCApLf,oBAAoB;2CAApB,oBAAoB;CA0MhC"}