pict-section-recordset 1.0.15 → 1.0.16

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 (45) hide show
  1. package/example_applications/simple_entity/Simple-RecordSet-Application.js +113 -0
  2. package/package.json +3 -3
  3. package/source/providers/RecordSet-RecordProvider-Base.js +28 -0
  4. package/source/providers/RecordSet-RecordProvider-MeadowEndpoints.js +53 -3
  5. package/source/services/RecordsSet-MetaController.js +84 -1
  6. package/source/templates/Pict-Template-FilterView.js +172 -0
  7. package/source/views/RecordSet-Filter.js +46 -9
  8. package/source/views/dashboard/RecordSet-Dashboard-HeaderDashboard.js +17 -17
  9. package/source/views/dashboard/RecordSet-Dashboard-PaginationBottom.js +68 -0
  10. package/source/views/dashboard/RecordSet-Dashboard-PaginationTop.js +128 -0
  11. package/source/views/dashboard/RecordSet-Dashboard-RecordList.js +80 -0
  12. package/source/views/dashboard/RecordSet-Dashboard-RecordListEntry.js +121 -0
  13. package/source/views/dashboard/RecordSet-Dashboard-RecordListHeader.js +99 -0
  14. package/source/views/dashboard/RecordSet-Dashboard-Title.js +67 -0
  15. package/source/views/dashboard/RecordSet-Dashboard.js +354 -37
  16. package/source/views/list/RecordSet-List.js +11 -34
  17. package/types/providers/RecordSet-RecordProvider-Base.d.ts +19 -0
  18. package/types/providers/RecordSet-RecordProvider-Base.d.ts.map +1 -1
  19. package/types/providers/RecordSet-RecordProvider-MeadowEndpoints.d.ts +38 -5
  20. package/types/providers/RecordSet-RecordProvider-MeadowEndpoints.d.ts.map +1 -1
  21. package/types/services/RecordsSet-MetaController.d.ts +18 -1
  22. package/types/services/RecordsSet-MetaController.d.ts.map +1 -1
  23. package/types/templates/Pict-Template-FilterView.d.ts +18 -0
  24. package/types/templates/Pict-Template-FilterView.d.ts.map +1 -0
  25. package/types/views/RecordSet-Filter.d.ts +28 -2
  26. package/types/views/RecordSet-Filter.d.ts.map +1 -1
  27. package/types/views/dashboard/RecordSet-Dashboard-HeaderDashboard.d.ts +5 -5
  28. package/types/views/dashboard/RecordSet-Dashboard-HeaderDashboard.d.ts.map +1 -1
  29. package/types/views/dashboard/RecordSet-Dashboard-PaginationBottom.d.ts +11 -0
  30. package/types/views/dashboard/RecordSet-Dashboard-PaginationBottom.d.ts.map +1 -0
  31. package/types/views/dashboard/RecordSet-Dashboard-PaginationTop.d.ts +11 -0
  32. package/types/views/dashboard/RecordSet-Dashboard-PaginationTop.d.ts.map +1 -0
  33. package/types/views/dashboard/RecordSet-Dashboard-RecordList.d.ts +11 -0
  34. package/types/views/dashboard/RecordSet-Dashboard-RecordList.d.ts.map +1 -0
  35. package/types/views/dashboard/RecordSet-Dashboard-RecordListEntry.d.ts +11 -0
  36. package/types/views/dashboard/RecordSet-Dashboard-RecordListEntry.d.ts.map +1 -0
  37. package/types/views/dashboard/RecordSet-Dashboard-RecordListHeader.d.ts +11 -0
  38. package/types/views/dashboard/RecordSet-Dashboard-RecordListHeader.d.ts.map +1 -0
  39. package/types/views/dashboard/RecordSet-Dashboard-Title.d.ts +11 -0
  40. package/types/views/dashboard/RecordSet-Dashboard-Title.d.ts.map +1 -0
  41. package/types/views/dashboard/RecordSet-Dashboard.d.ts +18 -0
  42. package/types/views/dashboard/RecordSet-Dashboard.d.ts.map +1 -1
  43. package/types/views/list/RecordSet-List.d.ts +0 -1
  44. package/types/views/list/RecordSet-List.d.ts.map +1 -1
  45. package/source/views/dashboard/RecordSet-Dashboard-RecordSetDashboard.js +0 -64
@@ -1,53 +1,80 @@
1
1
  const libPictRecordSetRecordView = require('../RecordSet-RecordBaseView.js');
2
2
 
3
+ const viewHeaderDashboard = require('./RecordSet-Dashboard-HeaderDashboard.js');
4
+ const viewTitle = require('./RecordSet-Dashboard-Title.js');
5
+ const viewFilters = require('../RecordSet-Filter.js');
6
+ const viewPaginationTop = require('./RecordSet-Dashboard-PaginationTop.js');
7
+ const viewRecordList = require('./RecordSet-Dashboard-RecordList.js');
8
+ const viewRecordListHeader = require('./RecordSet-Dashboard-RecordListHeader.js');
9
+ const viewRecordListEntry = require('./RecordSet-Dashboard-RecordListEntry.js');
10
+ const viewPaginationBottom = require('./RecordSet-Dashboard-PaginationBottom.js');
11
+
3
12
  /** @type {Record<string, any>} */
4
- const _DEFAULT_CONFIGURATION__Dashboard =
5
- {
6
- ViewIdentifier: 'PRSP-Dashboard',
13
+ const _DEFAULT_CONFIGURATION__Dashboard = (
14
+ {
15
+ ViewIdentifier: 'PRSP-List',
7
16
 
8
- DefaultRenderable: 'PRSP_Renderable_Dashboard',
9
- DefaultDestinationAddress: '#PRSP_Dashboard_Container',
10
- DefaultTemplateRecordAddress: false,
17
+ DefaultRenderable: 'PRSP_Renderable_List',
18
+ DefaultDestinationAddress: '#PRSP_Container',
19
+ DefaultTemplateRecordAddress: false,
11
20
 
12
- // If this is set to true, when the App initializes this will.
13
- // While the App initializes, initialize will be called.
14
- AutoInitialize: false,
15
- AutoInitializeOrdinal: 0,
21
+ // If this is set to true, when the App initializes this will.
22
+ // While the App initializes, initialize will be called.
23
+ AutoInitialize: false,
24
+ AutoInitializeOrdinal: 0,
16
25
 
17
- // If this is set to true, when the App autorenders (on load) this will.
18
- // After the App initializes, render will be called.
19
- AutoRender: false,
20
- AutoRenderOrdinal: 0,
26
+ // If this is set to true, when the App autorenders (on load) this will.
27
+ // After the App initializes, render will be called.
28
+ AutoRender: false,
29
+ AutoRenderOrdinal: 0,
21
30
 
22
- AutoSolveWithApp: false,
23
- AutoSolveOrdinal: 0,
31
+ AutoSolveWithApp: false,
32
+ AutoSolveOrdinal: 0,
24
33
 
25
- CSS: false,
26
- CSSPriority: 500,
34
+ CSS: false,
35
+ CSSPriority: 500,
27
36
 
28
- Templates:
29
- [
30
- {
31
- Hash: 'PRSP-Dashboard-Template',
32
- Template: /*html*/`
37
+ Templates:
38
+ [
39
+ {
40
+ Hash: 'PRSP-Dashboard-Template',
41
+ Template: /*html*/`
33
42
  <!-- DefaultPackage pict view template: [PRSP-Dashboard-Template] -->
43
+ <section id="PRSP_List_Container">
44
+ {~V:PRSP-Dashboard-Title~}
45
+ {~V:PRSP-Dashboard-HeaderDashboard~}
46
+ {~FV:PRSP-Filters:Dashboard~}
47
+ {~V:PRSP-Dashboard-PaginationTop~}
48
+ {~V:PRSP-Dashboard-RecordList~}
49
+ {~V:PRSP-Dashboard-PaginationBottom~}
50
+ </section>
34
51
  <!-- DefaultPackage end view template: [PRSP-Dashboard-Template] -->
35
- `
36
- }
37
- ],
52
+ `
53
+ },
54
+ {
55
+ Hash: 'PRSP-Dashboard-Template-Record',
56
+ Template: /*html*/`
57
+ <!-- DefaultPackage end view template: [PRSP-Dashboard-Template] -->
58
+ `
59
+ },
60
+ {
61
+ Hash: 'PRSP-Dashboard-Filter-URL',
62
+ Template: /*html*/`#/PSRS/{~D:Record.Filter.RecordSet~}/DashboardFilteredTo/{~D:Record.Filter.FilterString~}`
63
+ }
64
+ ],
38
65
 
39
- Renderables:
40
- [
41
- {
42
- RenderableHash: 'PRSP_Renderable_Dashboard',
43
- TemplateHash: 'PRSP-Dashboard-Template',
44
- DestinationAddress: '#PRSP_Dashboard_Container',
45
- RenderMethod: 'replace'
46
- }
47
- ],
66
+ Renderables:
67
+ [
68
+ {
69
+ RenderableHash: 'PRSP_Renderable_List',
70
+ TemplateHash: 'PRSP-Dashboard-Template',
71
+ DestinationAddress: '#PRSP_Container',
72
+ RenderMethod: 'replace'
73
+ }
74
+ ],
48
75
 
49
- Manifests: {}
50
- };
76
+ Manifests: {}
77
+ });
51
78
 
52
79
  class viewRecordSetDashboard extends libPictRecordSetRecordView
53
80
  {
@@ -55,6 +82,296 @@ class viewRecordSetDashboard extends libPictRecordSetRecordView
55
82
  {
56
83
  let tmpOptions = Object.assign({}, _DEFAULT_CONFIGURATION__Dashboard, pOptions);
57
84
  super(pFable, tmpOptions, pServiceHash);
85
+
86
+ this.childViews = {
87
+ headerList: null,
88
+ title: null,
89
+ paginationTop: null,
90
+ recordList: null,
91
+ recordListHeader: null,
92
+ recordListEntry: null,
93
+ paginationBottom: null
94
+ };
95
+ }
96
+
97
+ handleRecordSetDashboardRoute(pRoutePayload)
98
+ {
99
+ if (typeof(pRoutePayload) != 'object')
100
+ {
101
+ throw new Error(`Pict RecordSet List view route handler called with invalid route payload.`);
102
+ }
103
+
104
+ //_Pict.PictSectionRecordSet.recordSetProviderConfigurations['Book'], 'RSP-Provider-Book'
105
+ // FIXME: Not in love with this but good enough to start.
106
+ // FIXME: Typescript mumbo jumbo
107
+ // if (!('PictSectionRecordSet' in this.pict))
108
+ // {
109
+ // return false;
110
+ // }
111
+ const tmpProviderConfiguration = this.pict.PictSectionRecordSet.recordSetProviderConfigurations[pRoutePayload.data.RecordSet];
112
+ const tmpProviderHash = `RSP-Provider-${pRoutePayload.data.RecordSet}`;
113
+
114
+ const tmpFilterString = pRoutePayload.data.FilterString || '';
115
+
116
+ const tmpOffset = pRoutePayload.data.Offset ? pRoutePayload.data.Offset : 0;
117
+ const tmpPageSize = pRoutePayload.data.PageSize ? pRoutePayload.data.PageSize : 100;
118
+
119
+ return this.renderList(tmpProviderConfiguration, tmpProviderHash, tmpFilterString, tmpOffset, tmpPageSize);
120
+ }
121
+
122
+ /**
123
+ * @param {import('pict-router')} pPictRouter
124
+ */
125
+ addRoutes(pPictRouter)
126
+ {
127
+ pPictRouter.router.on('/PSRS/:RecordSet/DashboardFilteredTo/:FilterString/:Offset/:PageSize', this.handleRecordSetDashboardRoute.bind(this));
128
+ pPictRouter.router.on('/PSRS/:RecordSet/DashboardFilteredTo/:FilterString', this.handleRecordSetDashboardRoute.bind(this));
129
+ pPictRouter.router.on('/PSRS/:RecordSet/Dashboard/:Offset/:PageSize', this.handleRecordSetDashboardRoute.bind(this));
130
+ pPictRouter.router.on('/PSRS/:RecordSet/Dashboard/:Offset', this.handleRecordSetDashboardRoute.bind(this));
131
+ pPictRouter.router.on('/PSRS/:RecordSet/Dashboard', this.handleRecordSetDashboardRoute.bind(this));
132
+ pPictRouter.router.resolve();
133
+ return true;
134
+ }
135
+
136
+ onBeforeRenderList(pRecordListData)
137
+ {
138
+ return pRecordListData;
139
+ }
140
+
141
+ dynamicallyGenerateColumns(pRecordListData)
142
+ {
143
+ pRecordListData.TableCells = [];
144
+ const tmpEntity = pRecordListData.RecordSetConfiguration.Entity;
145
+ this.excludedByDefaultCells = [
146
+ 'ID' + tmpEntity,
147
+ 'GUID' + tmpEntity,
148
+ 'CreateDate',
149
+ 'CreatingIDUser',
150
+ 'DeleteDate',
151
+ 'Deleted',
152
+ 'DeletingIDUser',
153
+ 'UpdateDate',
154
+ 'UpdatingIDUser',
155
+ ];
156
+
157
+ const tmpSchema = pRecordListData.RecordSchema;
158
+ const tmpProperties = tmpSchema?.properties;
159
+ // loop throught the schema and add the columns to the tableCells
160
+ for (const tmpColumn in tmpProperties)
161
+ {
162
+ if (tmpProperties.hasOwnProperty(tmpColumn))
163
+ {
164
+ // Check if the column is excluded by the default list of columns (or is not a GUID/ID)
165
+ if (this.excludedByDefaultCells.includes(tmpColumn) === false)
166
+ {
167
+ pRecordListData.TableCells.push({
168
+ 'Key': tmpColumn,
169
+ 'DisplayName': tmpProperties?.[tmpColumn].title || tmpColumn,
170
+ });
171
+ }
172
+ }
173
+ }
174
+ return pRecordListData;
175
+ }
176
+
177
+ async renderList(pRecordSetConfiguration, pProviderHash, pFilterString, pOffset, pPageSize)
178
+ {
179
+ // Get the records
180
+ if (!(pProviderHash in this.pict.providers))
181
+ {
182
+ this.pict.log.error(`RecordSetDashboard: No provider found for ${pProviderHash} in ${pRecordSetConfiguration.RecordSet}. List Render failed.`);
183
+ return false;
184
+ }
185
+
186
+ let tmpRecordListData =
187
+ {
188
+ "Title": pRecordSetConfiguration.RecordSet,
189
+
190
+ "RecordSet": pRecordSetConfiguration.RecordSet,
191
+ "RecordSetConfiguration": pRecordSetConfiguration,
192
+
193
+ "RenderDestination": this.options.DefaultDestinationAddress,
194
+
195
+ "FilterString": pFilterString ? encodeURIComponent(pFilterString) : undefined,
196
+
197
+ "Records": { "Records": [] },
198
+ "TotalRecordCount": { "Count": -1 },
199
+
200
+ "Offset": pOffset || 0,
201
+ "PageSize": pPageSize || 100,
202
+ };
203
+
204
+ // TODO: There are still problems with the way these have nested data. Discuss how we might move that around
205
+ // Fetch the records
206
+ tmpRecordListData.Records = await this.pict.providers[pProviderHash].getDecoratedRecords(tmpRecordListData);
207
+ // Get the total record count
208
+ tmpRecordListData.TotalRecordCount = await this.pict.providers[pProviderHash].getRecordSetCount(tmpRecordListData);
209
+ // Get the record schema
210
+ tmpRecordListData.RecordSchema = await this.pict.providers[pProviderHash].getRecordSchema();
211
+
212
+ // TODO: This should be coming from the schema but that can come after we discuss how we deal with default routing
213
+ tmpRecordListData.GUIDAddress = `GUID${this.pict.providers[pProviderHash].options.Entity}`;
214
+
215
+ // Get the "page end record number" for the current page (e.g. for messaging like Record 700 to 800 of 75,000)
216
+ tmpRecordListData.PageEnd = parseInt(tmpRecordListData.Offset) + tmpRecordListData.Records.Records.length;
217
+
218
+ // Compute the number of pages total
219
+ tmpRecordListData.PageCount = Math.ceil(tmpRecordListData.TotalRecordCount.Count / tmpRecordListData.PageSize);
220
+
221
+ // Generate each page's links.
222
+ // TODO: This is fast and cool; any reason not to?
223
+ // Get "bookmarks" as references to the array of page links.
224
+ tmpRecordListData.PageLinkBookmarks = (
225
+ {
226
+ Current: Math.floor(tmpRecordListData.Offset / tmpRecordListData.PageSize)
227
+ });
228
+ tmpRecordListData.PageLinks = [];
229
+ for (let i = 0; i < tmpRecordListData.PageCount; i++)
230
+ {
231
+ if (tmpRecordListData.FilterString)
232
+ {
233
+ tmpRecordListData.PageLinks.push(
234
+ {
235
+ Page: i + 1,
236
+ RelativeOffset: i - tmpRecordListData.PageLinkBookmarks.Current,
237
+ URL: `#/PSRS/${tmpRecordListData.RecordSet}/DashboardFilteredTo/${tmpRecordListData.FilterString}/${i * tmpRecordListData.PageSize}/${tmpRecordListData.PageSize}`
238
+ });
239
+ }
240
+ else
241
+ {
242
+ tmpRecordListData.PageLinks.push(
243
+ {
244
+ Page: i + 1,
245
+ RelativeOffset: i - tmpRecordListData.PageLinkBookmarks.Current,
246
+ URL: `#/PSRS/${tmpRecordListData.RecordSet}/Dashboard/${i * tmpRecordListData.PageSize}/${tmpRecordListData.PageSize}`
247
+ });
248
+ }
249
+ }
250
+
251
+ //FIXME: short-term workaround to not blow up the tempplate rendering with way too many links
252
+ const linkRangeStart = Math.max(0, tmpRecordListData.PageLinkBookmarks.Current - 10);
253
+ const linkRangeEnd = Math.min(tmpRecordListData.PageLinks.length, tmpRecordListData.PageLinkBookmarks.Current + 10);
254
+ tmpRecordListData.PageLinksLimited = tmpRecordListData.PageLinks.slice(linkRangeStart, linkRangeEnd);
255
+ if (linkRangeStart > 0)
256
+ {
257
+ if (tmpRecordListData.FilterString)
258
+ {
259
+ tmpRecordListData.PageLinksLimited.unshift(
260
+ {
261
+ Page: 1,
262
+ RelativeOffset: -tmpRecordListData.PageLinkBookmarks.Current,
263
+ URL: `#/PSRS/${tmpRecordListData.RecordSet}/DashboardFilteredTo/${tmpRecordListData.FilterString}/${tmpRecordListData.PageSize}/${tmpRecordListData.PageSize}`
264
+ });
265
+ }
266
+ else
267
+ {
268
+ tmpRecordListData.PageLinksLimited.unshift(
269
+ {
270
+ Page: 1,
271
+ RelativeOffset: -tmpRecordListData.PageLinkBookmarks.Current,
272
+ URL: `#/PSRS/${tmpRecordListData.RecordSet}/Dashboard/${0}/${tmpRecordListData.PageSize}`
273
+ });
274
+ }
275
+ }
276
+ if (linkRangeEnd < tmpRecordListData.PageLinks.length)
277
+ {
278
+ if (tmpRecordListData.FilterString)
279
+ {
280
+ tmpRecordListData.PageLinksLimited.push(
281
+ {
282
+ Page: tmpRecordListData.PageCount,
283
+ RelativeOffset: (tmpRecordListData.PageCount - 1) - tmpRecordListData.PageLinkBookmarks.Current,
284
+ URL: `#/PSRS/${tmpRecordListData.RecordSet}/DashboardFilteredTo/${tmpRecordListData.FilterString}/${(tmpRecordListData.PageCount - 1) * tmpRecordListData.PageSize}/${tmpRecordListData.PageSize}`
285
+ });
286
+ }
287
+ else
288
+ {
289
+ tmpRecordListData.PageLinksLimited.push(
290
+ {
291
+ Page: tmpRecordListData.PageCount,
292
+ RelativeOffset: (tmpRecordListData.PageCount - 1) - tmpRecordListData.PageLinkBookmarks.Current,
293
+ URL: `#/PSRS/${tmpRecordListData.RecordSet}/Dashboard/${(tmpRecordListData.PageCount - 1) * tmpRecordListData.PageSize}/${tmpRecordListData.PageSize}`
294
+ });
295
+ }
296
+ }
297
+
298
+ tmpRecordListData.PageLinkBookmarks.Previous = tmpRecordListData.PageLinkBookmarks.Current - 1;
299
+ tmpRecordListData.PageLinkBookmarks.Next = tmpRecordListData.PageLinkBookmarks.Current + 1;
300
+ tmpRecordListData.PageLinkBookmarks.ShowPreviousLink = true;
301
+ tmpRecordListData.PageLinkBookmarks.ShowNextLink = true;
302
+ if (tmpRecordListData.PageLinkBookmarks.Previous < 0)
303
+ {
304
+ tmpRecordListData.PageLinkBookmarks.PreviousLink = false;
305
+ tmpRecordListData.PageLinkBookmarks.ShowPreviousLink = false;
306
+ }
307
+ else
308
+ {
309
+ tmpRecordListData.PageLinkBookmarks.PreviousLink = tmpRecordListData.PageLinks[tmpRecordListData.PageLinkBookmarks.Previous];
310
+ }
311
+ if (tmpRecordListData.PageLinkBookmarks.Next >= tmpRecordListData.PageLinks.length)
312
+ {
313
+ tmpRecordListData.PageLinkBookmarks.NextLink = false;
314
+ tmpRecordListData.PageLinkBookmarks.ShowNextLink = false;
315
+ }
316
+ else
317
+ {
318
+ tmpRecordListData.PageLinkBookmarks.NextLink = tmpRecordListData.PageLinks[tmpRecordListData.PageLinkBookmarks.Next];
319
+ }
320
+
321
+ // Put code here to preprocess columns into other data parts.
322
+ if (tmpRecordListData.RecordSetConfiguration.hasOwnProperty('RecordSetListColumns'))
323
+ {
324
+ tmpRecordListData.TableCells = tmpRecordListData.RecordSetConfiguration.RecordSetListColumns;
325
+ }
326
+ else
327
+ {
328
+ this.dynamicallyGenerateColumns(tmpRecordListData);
329
+ }
330
+
331
+ tmpRecordListData = this.onBeforeRenderList(tmpRecordListData);
332
+
333
+ this.renderAsync('PRSP_Renderable_List', tmpRecordListData.RenderDestination, tmpRecordListData,
334
+ function (pError)
335
+ {
336
+ if (pError)
337
+ {
338
+ this.pict.log.error(`RecordSetDashboard: Error rendering list ${pError}`, tmpRecordListData);
339
+ return false;
340
+ }
341
+
342
+ if (this.pict.LogNoisiness > 0)
343
+ {
344
+ this.pict.log.info(`RecordSetDashboard: Rendered list ${tmpRecordListData.RecordSet} with ${tmpRecordListData.Records.Records.length} records.`, tmpRecordListData);
345
+ }
346
+ else
347
+ {
348
+ this.pict.log.info(`RecordSetDashboard: Rendered list ${tmpRecordListData.RecordSet} with ${tmpRecordListData.Records.Records.length} records.`);
349
+ }
350
+ return true;
351
+ }.bind(this));
352
+ }
353
+
354
+ onInitialize()
355
+ {
356
+ this.childViews.headerList = this.pict.addView('PRSP-Dashboard-HeaderDashboard', viewHeaderDashboard.default_configuration, viewHeaderDashboard);
357
+ this.childViews.title = this.pict.addView('PRSP-Dashboard-Title', viewTitle.default_configuration, viewTitle);
358
+ this.childViews.filters = this.pict.views['PRSP-Filters'] || this.pict.addView('PRSP-Filters', { }, viewFilters);
359
+ this.childViews.paginationTop = this.pict.addView('PRSP-Dashboard-PaginationTop', viewPaginationTop.default_configuration, viewPaginationTop);
360
+ this.childViews.recordList = this.pict.addView('PRSP-Dashboard-RecordList', viewRecordList.default_configuration, viewRecordList);
361
+ this.childViews.recordListHeader = this.pict.addView('PRSP-Dashboard-RecordListHeader', viewRecordListHeader.default_configuration, viewRecordListHeader);
362
+ this.childViews.recordListEntry = this.pict.addView('PRSP-Dashboard-RecordListEntry', viewRecordListEntry.default_configuration, viewRecordListEntry);
363
+ this.childViews.paginationBottom = this.pict.addView('PRSP-Dashboard-PaginationBottom', viewPaginationBottom.default_configuration, viewPaginationBottom);
364
+
365
+ // Initialize the subviews
366
+ this.childViews.headerList.initialize();
367
+ this.childViews.title.initialize();
368
+ this.childViews.paginationTop.initialize();
369
+ this.childViews.recordList.initialize();
370
+ this.childViews.recordListHeader.initialize();
371
+ this.childViews.recordListEntry.initialize();
372
+ this.childViews.paginationBottom.initialize();
373
+
374
+ return super.onInitialize();
58
375
  }
59
376
  }
60
377
 
@@ -43,7 +43,7 @@ const _DEFAULT_CONFIGURATION__List = (
43
43
  <section id="PRSP_List_Container">
44
44
  {~V:PRSP-List-Title~}
45
45
  {~V:PRSP-List-HeaderList~}
46
- {~V:PRSP-Filters~}
46
+ {~FV:PRSP-Filters:List~}
47
47
  {~V:PRSP-List-PaginationTop~}
48
48
  {~V:PRSP-List-RecordList~}
49
49
  {~V:PRSP-List-PaginationBottom~}
@@ -90,31 +90,6 @@ class viewRecordSetList extends libPictRecordSetRecordView
90
90
  };
91
91
  }
92
92
 
93
- handleSearch(pSearchString)
94
- {
95
- const pictRouter = this.pict.providers.PictRouter;
96
- const recordSet = pictRouter.router.current[0]?.data?.RecordSet;
97
- const offset = '0'; // since we are searching, we reset to page 1
98
- const pageSize = pictRouter.router.current[0]?.data?.PageSize || '100';
99
- if (!recordSet)
100
- {
101
- this.pict.log.error('PictRecordSetRouter.handleSearch: No record set found in the current route: ', { routes: pictRouter.router.current });
102
- return;
103
- }
104
- const tmpProviderConfiguration = this.pict.PictSectionRecordSet.recordSetProviderConfigurations[recordSet];
105
- if (pSearchString)
106
- {
107
- //FIXME: figure this out based on the record set; or defer to another provider?
108
- const searchFields = tmpProviderConfiguration?.SearchFields ?? [ 'Name' ];
109
- const filterExpr = searchFields.map((filterField) => `FBVOR~${filterField}~LK~${encodeURIComponent(`%${pSearchString}%`)}`).join('~');
110
- pictRouter.navigate(`/PSRS/${recordSet}/List/FilteredTo/${filterExpr}/${offset}/${pageSize}`);
111
- }
112
- else
113
- {
114
- pictRouter.navigate(`/PSRS/${recordSet}/List`);
115
- }
116
- }
117
-
118
93
  handleRecordSetListRoute(pRoutePayload)
119
94
  {
120
95
  if (typeof(pRoutePayload) != 'object')
@@ -142,10 +117,12 @@ class viewRecordSetList extends libPictRecordSetRecordView
142
117
 
143
118
  addRoutes(pPictRouter)
144
119
  {
145
- pPictRouter.addRoute('/PSRS/:RecordSet/List/FilteredTo/:FilterString/:Offset/:PageSize', this.handleRecordSetListRoute.bind(this));
146
- pPictRouter.addRoute('/PSRS/:RecordSet/List/:Offset/:PageSize', this.handleRecordSetListRoute.bind(this));
147
- pPictRouter.addRoute('/PSRS/:RecordSet/List/:Offset', this.handleRecordSetListRoute.bind(this));
148
- pPictRouter.addRoute('/PSRS/:RecordSet/List', this.handleRecordSetListRoute.bind(this));
120
+ pPictRouter.router.on('/PSRS/:RecordSet/ListFilteredTo/:FilterString/:Offset/:PageSize', this.handleRecordSetListRoute.bind(this));
121
+ pPictRouter.router.on('/PSRS/:RecordSet/ListFilteredTo/:FilterString', this.handleRecordSetListRoute.bind(this));
122
+ pPictRouter.router.on('/PSRS/:RecordSet/List/:Offset/:PageSize', this.handleRecordSetListRoute.bind(this));
123
+ pPictRouter.router.on('/PSRS/:RecordSet/List/:Offset', this.handleRecordSetListRoute.bind(this));
124
+ pPictRouter.router.on('/PSRS/:RecordSet/List', this.handleRecordSetListRoute.bind(this));
125
+ pPictRouter.router.resolve();
149
126
  return true;
150
127
  }
151
128
 
@@ -250,7 +227,7 @@ class viewRecordSetList extends libPictRecordSetRecordView
250
227
  {
251
228
  Page: i + 1,
252
229
  RelativeOffset: i - tmpRecordListData.PageLinkBookmarks.Current,
253
- URL: `#/PSRS/${tmpRecordListData.RecordSet}/List/FilteredTo/${tmpRecordListData.FilterString}/${i * tmpRecordListData.PageSize}/${tmpRecordListData.PageSize}`
230
+ URL: `#/PSRS/${tmpRecordListData.RecordSet}/ListFilteredTo/${tmpRecordListData.FilterString}/${i * tmpRecordListData.PageSize}/${tmpRecordListData.PageSize}`
254
231
  });
255
232
  }
256
233
  else
@@ -276,7 +253,7 @@ class viewRecordSetList extends libPictRecordSetRecordView
276
253
  {
277
254
  Page: 1,
278
255
  RelativeOffset: -tmpRecordListData.PageLinkBookmarks.Current,
279
- URL: `#/PSRS/${tmpRecordListData.RecordSet}/List/FilteredTo/${tmpRecordListData.FilterString}/${tmpRecordListData.PageSize}/${tmpRecordListData.PageSize}`
256
+ URL: `#/PSRS/${tmpRecordListData.RecordSet}/ListFilteredTo/${tmpRecordListData.FilterString}/${tmpRecordListData.PageSize}/${tmpRecordListData.PageSize}`
280
257
  });
281
258
  }
282
259
  else
@@ -297,7 +274,7 @@ class viewRecordSetList extends libPictRecordSetRecordView
297
274
  {
298
275
  Page: tmpRecordListData.PageCount,
299
276
  RelativeOffset: (tmpRecordListData.PageCount - 1) - tmpRecordListData.PageLinkBookmarks.Current,
300
- URL: `#/PSRS/${tmpRecordListData.RecordSet}/List/FilteredTo/${tmpRecordListData.FilterString}/${(tmpRecordListData.PageCount - 1) * tmpRecordListData.PageSize}/${tmpRecordListData.PageSize}`
277
+ URL: `#/PSRS/${tmpRecordListData.RecordSet}/ListFilteredTo/${tmpRecordListData.FilterString}/${(tmpRecordListData.PageCount - 1) * tmpRecordListData.PageSize}/${tmpRecordListData.PageSize}`
301
278
  });
302
279
  }
303
280
  else
@@ -371,7 +348,7 @@ class viewRecordSetList extends libPictRecordSetRecordView
371
348
  {
372
349
  this.childViews.headerList = this.pict.addView('PRSP-List-HeaderList', viewHeaderList.default_configuration, viewHeaderList);
373
350
  this.childViews.title = this.pict.addView('PRSP-List-Title', viewTitle.default_configuration, viewTitle);
374
- this.childViews.filters = this.pict.addView('PRSP-Filters', viewFilters.default_configuration, viewFilters);
351
+ this.childViews.filters = this.pict.views['PRSP-Filters'] || this.pict.addView('PRSP-Filters', { }, viewFilters);
375
352
  this.childViews.paginationTop = this.pict.addView('PRSP-List-PaginationTop', viewPaginationTop.default_configuration, viewPaginationTop);
376
353
  this.childViews.recordList = this.pict.addView('PRSP-List-RecordList', viewRecordList.default_configuration, viewRecordList);
377
354
  this.childViews.recordListHeader = this.pict.addView('PRSP-List-RecordListHeader', viewRecordListHeader.default_configuration, viewRecordListHeader);
@@ -64,6 +64,14 @@ declare class RecordSetProviderBase {
64
64
  * @return {Promise<RecordSetResult>} - The result of the read operation.
65
65
  */
66
66
  getRecords(pOptions: RecordSetFilter): Promise<RecordSetResult>;
67
+ /**
68
+ * Read records from the provider.
69
+ *
70
+ * @param {RecordSetFilter} pOptions - Options for the read operation.
71
+ *
72
+ * @return {Promise<RecordSetResult>} - The result of the read operation.
73
+ */
74
+ getDecoratedRecords(pOptions: RecordSetFilter): Promise<RecordSetResult>;
67
75
  /**
68
76
  * Read records from the provider.
69
77
  *
@@ -85,18 +93,21 @@ declare class RecordSetProviderBase {
85
93
  * Create a new record.
86
94
  *
87
95
  * @param {Record<string, any>} pRecord - The record to create.
96
+ * @return {Promise<Record<string, any>>} - The created record.
88
97
  */
89
98
  createRecord(pRecord: Record<string, any>): Promise<Record<string, any>>;
90
99
  /**
91
100
  * Update a record.
92
101
  *
93
102
  * @param {Record<string, any>} pRecord - The record to update.
103
+ * @return {Promise<Record<string, any>>} - The updated record.
94
104
  */
95
105
  updateRecord(pRecord: Record<string, any>): Promise<Record<string, any>>;
96
106
  /**
97
107
  * Delete a record.
98
108
  *
99
109
  * @param {Record<string, any>} pRecord - The record to delete.
110
+ * @return {Promise<void>}
100
111
  */
101
112
  deleteRecord(pRecord: Record<string, any>): Promise<void>;
102
113
  /**
@@ -116,6 +127,7 @@ declare class RecordSetProviderBase {
116
127
  * Clone a record.
117
128
  *
118
129
  * @param {Record<string, any>} pRecord - The record to clone.
130
+ * @return {Promise<Record<string, any>>} - The cloned record.
119
131
  */
120
132
  cloneRecord(pRecord: Record<string, any>): Promise<Record<string, any>>;
121
133
  /**
@@ -128,6 +140,13 @@ declare class RecordSetProviderBase {
128
140
  * @return {Record<string, any>} The schema of the record.
129
141
  */
130
142
  get recordSchema(): Record<string, any>;
143
+ /**
144
+ * Abstract decoration method for core records. Subclasses should implement this method to decorate records with additional information.
145
+ *
146
+ * @param {Array<Record<string, any>>} pRecords - The records to decorate.
147
+ * @return {Promise<void>}
148
+ */
149
+ decorateCoreRecords(pRecords: Array<Record<string, any>>): Promise<void>;
131
150
  }
132
151
  declare namespace RecordSetProviderBase {
133
152
  export { _DefaultProviderConfiguration as default_configuration, RecordSetSearchRangeFacet, RecordSetSearchFacetPayload, RecordSetResult, RecordSetFilter };
@@ -1 +1 @@
1
- {"version":3,"file":"RecordSet-RecordProvider-Base.d.ts","sourceRoot":"","sources":["../../source/providers/RecordSet-RecordProvider-Base.js"],"names":[],"mappings":";AAcA;;;;;;;GAOG;AAEH;;;;;;GAMG;AAEH;;;;GAIG;AAEH;;;;;;;GAOG;AAEH;;;GAGG;AACH;IAEC;;;;;OAKG;IACH,oCAHW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,iBACnB,MAAM,EAchB;IANA,kCAAkC;IAClC,SADW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAClB;IACZ,8BAA8B;IAC9B,WAAU;IACV,6BAA6B;IAC7B,MADW,OAAO,MAAM,CAAC,CAChB;IAGV;;;;OAIG;IACH,qBAFW,MAAM,GAAC,MAAM,eAMvB;IAED;;;;OAIG;IACH,uBAFW,MAAM,GAAC,MAAM,eAMvB;IAED;;;;;OAKG;IACH,qBAHW,eAAe,GACd,OAAO,CAAC,eAAe,CAAC,CAMnC;IAED;;;;;;;OAOG;IACH,iCALW,MAAM,YACN,MAAM,cACN,MAAM,GACL,OAAO,CAAC,eAAe,CAAC,CAMnC;IAED;;;;OAIG;IACH,4BAFW,eAAe;;OAMzB;IAED;;;;OAIG;IACH,sBAFW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,gCAM7B;IAED;;;;OAIG;IACH,sBAFW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,gCAM7B;IAED;;;;OAIG;IACH,sBAFW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,iBAK7B;IAED;;;;OAIG;IACH,sBAFW,MAAM,GAAC,MAAM,eAMvB;IAED;;;;;OAKG;IACH,sBAHW,eAAe,GACd,OAAO,CAAC,eAAe,CAAC,CAMnC;IAED;;;;OAIG;IACH,qBAFW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,gCAK7B;IAED;;;;OAIG;IACH,qBAFW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,uBAK7B;IAED;;OAEG;IACH,oBAFY,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAK9B;CACD;;;;AAlND;;;GAGG;AACH,6CAFU,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAO3B;;;;;WAIY,MAAM;;;;WACN,GAAG;;;;SACH,GAAG;;;;;SACH,GAAG;;;;;;oBAMH,OAAO;;;;YACP,KAAK,CAAC,MAAM,CAAC;;;;;YACb,KAAK,CAAC,yBAAyB,CAAC;;;;;;aAMhC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;;;;YAC1B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE;;;;;;aAK7E,MAAM;;;;mBACN,MAAM;;;;aACN,MAAM;;;;eACN,MAAM;;;;aACN,2BAA2B"}
1
+ {"version":3,"file":"RecordSet-RecordProvider-Base.d.ts","sourceRoot":"","sources":["../../source/providers/RecordSet-RecordProvider-Base.js"],"names":[],"mappings":";AAcA;;;;;;;GAOG;AAEH;;;;;;GAMG;AAEH;;;;GAIG;AAEH;;;;;;;GAOG;AAEH;;;GAGG;AACH;IAEC;;;;;OAKG;IACH,oCAHW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,iBACnB,MAAM,EAchB;IANA,kCAAkC;IAClC,SADW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAClB;IACZ,8BAA8B;IAC9B,WAAU;IACV,6BAA6B;IAC7B,MADW,OAAO,MAAM,CAAC,CAChB;IAGV;;;;OAIG;IACH,qBAFW,MAAM,GAAC,MAAM,eAMvB;IAED;;;;OAIG;IACH,uBAFW,MAAM,GAAC,MAAM,eAMvB;IAED;;;;;OAKG;IACH,qBAHW,eAAe,GACd,OAAO,CAAC,eAAe,CAAC,CAMnC;IAED;;;;;;OAMG;IACH,8BAJW,eAAe,GAEd,OAAO,CAAC,eAAe,CAAC,CAOnC;IAED;;;;;;;OAOG;IACH,iCALW,MAAM,YACN,MAAM,cACN,MAAM,GACL,OAAO,CAAC,eAAe,CAAC,CAMnC;IAED;;;;OAIG;IACH,4BAFW,eAAe;;OAMzB;IAED;;;;;OAKG;IACH,sBAHW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAMvC;IAED;;;;;OAKG;IACH,sBAHW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAMvC;IAED;;;;;OAKG;IACH,sBAHW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAClB,OAAO,CAAC,IAAI,CAAC,CAKxB;IAED;;;;OAIG;IACH,sBAFW,MAAM,GAAC,MAAM,eAMvB;IAED;;;;;OAKG;IACH,sBAHW,eAAe,GACd,OAAO,CAAC,eAAe,CAAC,CAMnC;IAED;;;;;OAKG;IACH,qBAHW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAKvC;IAED;;;;OAIG;IACH,qBAFW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,uBAK7B;IAED;;OAEG;IACH,oBAFY,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAK9B;IAED;;;;;OAKG;IACH,8BAHW,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GACzB,OAAO,CAAC,IAAI,CAAC,CAIxB;CACD;;;;AA9OD;;;GAGG;AACH,6CAFU,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAO3B;;;;;WAIY,MAAM;;;;WACN,GAAG;;;;SACH,GAAG;;;;;SACH,GAAG;;;;;;oBAMH,OAAO;;;;YACP,KAAK,CAAC,MAAM,CAAC;;;;;YACb,KAAK,CAAC,yBAAyB,CAAC;;;;;;aAMhC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;;;;YAC1B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE;;;;;;aAK7E,MAAM;;;;mBACN,MAAM;;;;aACN,MAAM;;;;eACN,MAAM;;;;aACN,2BAA2B"}
@@ -1,4 +1,4 @@
1
- export = RecordSetProvider;
1
+ export = MeadowEndpointsRecordSetProvider;
2
2
  /**
3
3
  * @typedef {import('./RecordSet-RecordProvider-Base.js').RecordSetFilter} RecordSetFilter
4
4
  * @typedef {import('./RecordSet-RecordProvider-Base.js').RecordSetResult} RecordSetResult
@@ -7,9 +7,42 @@ export = RecordSetProvider;
7
7
  * Class representing a data change detection provider for Pict dynamic forms.
8
8
  * @extends libRecordSetProviderBase
9
9
  */
10
- declare class RecordSetProvider extends libRecordSetProviderBase {
11
- /** @type {import('fable') & import('pict')} */
12
- pict: any & import("pict");
10
+ declare class MeadowEndpointsRecordSetProvider extends libRecordSetProviderBase {
11
+ /** @type {import('pict') & {
12
+ * log: any,
13
+ * services:
14
+ * {
15
+ * PictSectionRecordSet: InstanceType<import('../Pict-Section-RecordSet.js')>,
16
+ * [key: string]: any,
17
+ * },
18
+ * instantiateServiceProviderWithoutRegistration: (hash: String) => any,
19
+ * PictSectionRecordSet: InstanceType<import('../Pict-Section-RecordSet.js')>
20
+ * }} */
21
+ pict: import("pict") & {
22
+ log: any;
23
+ services: {
24
+ PictSectionRecordSet: InstanceType<{
25
+ new (pFable: any, pOptions: any, pServiceHash: any): import("../services/RecordsSet-MetaController.js");
26
+ default_configuration: Record<string, any>;
27
+ PictRecordSetApplication: typeof import("../application/Pict-Application-RecordSet.js");
28
+ RecordSetProviderBase: typeof libRecordSetProviderBase;
29
+ RecordSetProviderMeadowEndpoints: typeof MeadowEndpointsRecordSetProvider;
30
+ }>;
31
+ [key: string]: any;
32
+ };
33
+ instantiateServiceProviderWithoutRegistration: (hash: string) => any;
34
+ PictSectionRecordSet: InstanceType<{
35
+ new (pFable: any, pOptions: any, pServiceHash: any): import("../services/RecordsSet-MetaController.js");
36
+ default_configuration: Record<string, any>;
37
+ PictRecordSetApplication: typeof import("../application/Pict-Application-RecordSet.js");
38
+ RecordSetProviderBase: typeof libRecordSetProviderBase;
39
+ RecordSetProviderMeadowEndpoints: typeof MeadowEndpointsRecordSetProvider;
40
+ }>;
41
+ };
42
+ /** @type {string} */
43
+ Hash: string;
44
+ /** @type {string} */
45
+ UUID: string;
13
46
  /** @type {Record<string, any>} */
14
47
  _Schema: Record<string, any>;
15
48
  /** @return {import('pict/types/source/Pict-Meadow-EntityProvider.js')} */
@@ -74,7 +107,7 @@ declare class RecordSetProvider extends libRecordSetProviderBase {
74
107
  onInitializeAsync(fCallback: (error?: Error) => void): void;
75
108
  getRecordSchema(): Promise<Record<string, any>>;
76
109
  }
77
- declare namespace RecordSetProvider {
110
+ declare namespace MeadowEndpointsRecordSetProvider {
78
111
  export { RecordSetFilter, RecordSetResult };
79
112
  }
80
113
  import libRecordSetProviderBase = require("./RecordSet-RecordProvider-Base.js");
@@ -1 +1 @@
1
- {"version":3,"file":"RecordSet-RecordProvider-MeadowEndpoints.d.ts","sourceRoot":"","sources":["../../source/providers/RecordSet-RecordProvider-MeadowEndpoints.js"],"names":[],"mappings":";AAGA;;;GAGG;AAEH;;;GAGG;AACH;IAgBE,+CAA+C;IAC/C,MADW,GAAe,GAAG,OAAO,MAAM,CAAC,CAClC;IAET,kCAAkC;IAClC,SADW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CACZ;IAGnB,0EAA0E;IAC1E,sBADa,OAAO,iDAAiD,CAAC,CAWrE;IARA,wEAAwE;IAExE,iBAFW,OAAO,iDAAiD,CAAC,CAE4B;IAQjG;;;OAGG;IAEH;;;;OAIG;IACH,qBAFW,MAAM,GAAC,MAAM,gBA4BvB;IAED;;;;OAIG;IACH,uBAFW,MAAM,GAAC,MAAM,gBA2BvB;IA8CD;;;;OAIG;IACH,4BAFW,eAAe,gBAyBzB;IAED;;;;OAIG;IACH,sBAFW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,gBAsB7B;IAED;;;;OAIG;IACH,sBAFW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,gBAsB7B;IAED;;;;OAIG;IACH,sBAFW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,gBAsB7B;IAED;;;;OAIG;IACH,sBAFW,MAAM,GAAC,MAAM,gBAKvB;IAaD;;;;OAIG;IACH,qBAFW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,gBAK7B;IAcD;;OAEG;IACH,6BAFW,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,QA2BjC;IAED,gDAcC;CACD;;;;;uBArWY,OAAO,oCAAoC,EAAE,eAAe;uBAC5D,OAAO,oCAAoC,EAAE,eAAe"}
1
+ {"version":3,"file":"RecordSet-RecordProvider-MeadowEndpoints.d.ts","sourceRoot":"","sources":["../../source/providers/RecordSet-RecordProvider-MeadowEndpoints.js"],"names":[],"mappings":";AAGA;;;GAGG;AAEH;;;GAGG;AACH;IAgBE;;;;;;;;;aASS;IACT,MAVW,OAAO,MAAM,CAAC,GAAG;QACpB,GAAG,EAAE,GAAG,CAAC;QACT,QAAQ,EACf;YACI,oBAAoB,EAAE,YAAY,CAAC;;;;;;aAAsC,CAAC,CAAC;YAC/E,CAAK,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;SACnB,CAAC;QACE,6CAA6C,EAAE,CAAC,IAAI,QAAQ,KAAK,GAAG,CAAC;QACrE,oBAAoB,EAAE,YAAY,CAAC;;;;;;SAAsC,CAAC,CAAA;KAC7E,CACI;IACT,qBAAqB;IACrB,MADW,MAAM,CACR;IACT,qBAAqB;IACrB,MADW,MAAM,CACR;IAET,kCAAkC;IAClC,SADW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CACZ;IAGnB,0EAA0E;IAC1E,sBADa,OAAO,iDAAiD,CAAC,CAWrE;IARA,wEAAwE;IAExE,iBAFW,OAAO,iDAAiD,CAAC,CAE4B;IAQjG;;;OAGG;IAEH;;;;OAIG;IACH,qBAFW,MAAM,GAAC,MAAM,gBA4BvB;IAED;;;;OAIG;IACH,uBAFW,MAAM,GAAC,MAAM,gBA2BvB;IA8CD;;;;OAIG;IACH,4BAFW,eAAe,gBAyBzB;IAED;;;;OAIG;IACH,sBAFW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,gBAsB7B;IAED;;;;OAIG;IACH,sBAFW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,gBAsB7B;IAED;;;;OAIG;IACH,sBAFW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,gBAsB7B;IAED;;;;OAIG;IACH,sBAFW,MAAM,GAAC,MAAM,gBAKvB;IAaD;;;;OAIG;IACH,qBAFW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,gBAK7B;IAcD;;OAEG;IACH,6BAFW,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,QA2BjC;IAED,gDAcC;CAsCD;;;;;uBAvZY,OAAO,oCAAoC,EAAE,eAAe;uBAC5D,OAAO,oCAAoC,EAAE,eAAe"}