@firestitch/report 18.9.0 → 18.10.1

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 (186) hide show
  1. package/app/reports/anchor-at-point.d.ts +14 -0
  2. package/app/reports/canvas-landing-page.d.ts +2 -0
  3. package/app/reports/components/component-chart/component-chart.component.d.ts +18 -2
  4. package/app/reports/components/component-kpi/component-kpi.component.d.ts +4 -1
  5. package/app/reports/components/report-canvas/report-canvas.component.d.ts +3 -0
  6. package/app/reports/components/report-component/report-component.component.d.ts +35 -1
  7. package/app/reports/components/report-view-picker/report-view-picker.component.d.ts +21 -0
  8. package/app/reports/data/report.data.d.ts +20 -7
  9. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +18 -3
  10. package/app/reports/dialogs/report-settings/report-settings.component.d.ts +45 -8
  11. package/app/reports/dialogs/report-view/report-view-dialog.component.d.ts +13 -0
  12. package/app/reports/drill-crumbs.d.ts +12 -0
  13. package/app/reports/export/report-export-collector.service.d.ts +13 -4
  14. package/app/reports/export/report-filter-lines.d.ts +18 -0
  15. package/app/reports/filter-settings-rules.d.ts +37 -0
  16. package/app/reports/format.d.ts +0 -1
  17. package/app/reports/interfaces/canvas-landing-input.interface.d.ts +8 -0
  18. package/app/reports/interfaces/component-data-applied.interface.d.ts +13 -0
  19. package/app/reports/interfaces/component-data-drill.interface.d.ts +22 -0
  20. package/app/reports/interfaces/filter-bar-placement.type.d.ts +1 -0
  21. package/app/reports/interfaces/filter-component-toggle-state.interface.d.ts +4 -0
  22. package/app/reports/interfaces/filter-settings-option.interface.d.ts +4 -0
  23. package/app/reports/interfaces/filter-type-select-state.interface.d.ts +5 -0
  24. package/app/reports/interfaces/report-chart-hit.interface.d.ts +5 -0
  25. package/app/reports/interfaces/report-chat-viewer-cross-filter-field.interface.d.ts +4 -0
  26. package/app/reports/interfaces/report-chat-viewer-cross-filter.interface.d.ts +7 -0
  27. package/app/reports/interfaces/report-chat-viewer-detail.interface.d.ts +4 -0
  28. package/app/reports/interfaces/report-chat-viewer-drill-step.interface.d.ts +5 -0
  29. package/app/reports/interfaces/report-chat-viewer-drill.interface.d.ts +5 -0
  30. package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +3 -0
  31. package/app/reports/interfaces/report-chat-viewer-selection.interface.d.ts +5 -0
  32. package/app/reports/interfaces/report-chat-viewer-state.interface.d.ts +12 -0
  33. package/app/reports/interfaces/report-drill-crumb.interface.d.ts +6 -0
  34. package/app/reports/interfaces/report-drill-refusal.type.d.ts +1 -0
  35. package/app/reports/interfaces/report-drill-step.interface.d.ts +5 -0
  36. package/app/reports/interfaces/report-export-line-kind.type.d.ts +1 -0
  37. package/app/reports/interfaces/report-export-line.interface.d.ts +8 -0
  38. package/app/reports/interfaces/report-export-lines-input.interface.d.ts +9 -0
  39. package/app/reports/interfaces/report-export-snapshot.interface.d.ts +15 -0
  40. package/app/reports/interfaces/report-filter-group-changes.interface.d.ts +7 -0
  41. package/app/reports/interfaces/report-filter-line-context.interface.d.ts +8 -0
  42. package/app/reports/interfaces/report-filter-line-form.type.d.ts +1 -0
  43. package/app/reports/interfaces/report-filter-match.type.d.ts +1 -0
  44. package/app/reports/interfaces/report-filter-option-pair.interface.d.ts +4 -0
  45. package/app/reports/interfaces/report-filter-options-ask.interface.d.ts +6 -0
  46. package/app/reports/interfaces/report-filter-options-list.interface.d.ts +7 -0
  47. package/app/reports/interfaces/report-filter-options-request.interface.d.ts +6 -0
  48. package/app/reports/interfaces/report-filter-options-stream.interface.d.ts +11 -0
  49. package/app/reports/interfaces/report-filter-options.interface.d.ts +7 -0
  50. package/app/reports/interfaces/report-filter-skip.type.d.ts +1 -0
  51. package/app/reports/interfaces/report-mark-action.type.d.ts +1 -0
  52. package/app/reports/interfaces/report-mark-click.interface.d.ts +13 -0
  53. package/app/reports/interfaces/report-mark-context.interface.d.ts +6 -0
  54. package/app/reports/interfaces/report-mark-decision.interface.d.ts +6 -0
  55. package/app/reports/interfaces/report-mark-event.interface.d.ts +11 -0
  56. package/app/reports/interfaces/report-mark-point.interface.d.ts +8 -0
  57. package/app/reports/interfaces/report-temporary-state.interface.d.ts +4 -0
  58. package/app/reports/interfaces/report-tile-state.interface.d.ts +8 -0
  59. package/app/reports/interfaces/report-view-config.interface.d.ts +11 -0
  60. package/app/reports/interfaces/report-view-create.interface.d.ts +7 -0
  61. package/app/reports/interfaces/report-view-deleted.interface.d.ts +4 -0
  62. package/app/reports/interfaces/report-view-dialog-data.interface.d.ts +7 -0
  63. package/app/reports/interfaces/report-view-dropped.interface.d.ts +5 -0
  64. package/app/reports/interfaces/report-view-menu-item.interface.d.ts +10 -0
  65. package/app/reports/interfaces/report-view-summary.interface.d.ts +11 -0
  66. package/app/reports/interfaces/report-view.interface.d.ts +7 -0
  67. package/app/reports/interfaces/report-viewer-feature.type.d.ts +1 -0
  68. package/app/reports/interfaces/report-views.interface.d.ts +7 -0
  69. package/app/reports/interfaces/report.interface.d.ts +27 -16
  70. package/app/reports/interfaces/tile-load-result.interface.d.ts +4 -0
  71. package/app/reports/mark-click.d.ts +20 -0
  72. package/app/reports/option-builder.d.ts +12 -1
  73. package/app/reports/report-chat-viewer-state.d.ts +8 -0
  74. package/app/reports/report-date-presets.d.ts +2 -0
  75. package/app/reports/report-filter-items.d.ts +20 -21
  76. package/app/reports/report-tile.d.ts +2 -0
  77. package/app/reports/report-view-config.d.ts +34 -0
  78. package/app/reports/report-view-menu.d.ts +15 -0
  79. package/app/reports/report-viewer-features.d.ts +5 -0
  80. package/app/reports/services/report-filter-options.service.d.ts +26 -0
  81. package/app/reports/services/report-filter-state.service.d.ts +65 -11
  82. package/app/reports/services/report-view.service.d.ts +39 -0
  83. package/app/reports/tile-data-state.d.ts +7 -0
  84. package/app/reports/tile-loads.d.ts +4 -0
  85. package/app/reports/views/report/fs-ai-report.component.d.ts +10 -8
  86. package/app/reports/views/report/report.component.d.ts +6 -0
  87. package/esm2022/app/reports/anchor-at-point.mjs +49 -0
  88. package/esm2022/app/reports/canvas-landing-page.mjs +26 -0
  89. package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +97 -5
  90. package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +11 -4
  91. package/esm2022/app/reports/components/component-list/component-list.component.mjs +11 -5
  92. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +56 -40
  93. package/esm2022/app/reports/components/report-component/report-component.component.mjs +261 -65
  94. package/esm2022/app/reports/components/report-view-picker/report-view-picker.component.mjs +115 -0
  95. package/esm2022/app/reports/data/report.data.mjs +94 -14
  96. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +106 -51
  97. package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +248 -104
  98. package/esm2022/app/reports/dialogs/report-view/report-view-dialog.component.mjs +52 -0
  99. package/esm2022/app/reports/drill-crumbs.mjs +73 -0
  100. package/esm2022/app/reports/export/report-export-collector.service.mjs +187 -117
  101. package/esm2022/app/reports/export/report-filter-lines.mjs +235 -0
  102. package/esm2022/app/reports/export/report-pdf.service.mjs +12 -7
  103. package/esm2022/app/reports/export/report-pptx.service.mjs +18 -14
  104. package/esm2022/app/reports/filter-settings-rules.mjs +290 -0
  105. package/esm2022/app/reports/format.mjs +2 -22
  106. package/esm2022/app/reports/interfaces/canvas-landing-input.interface.mjs +2 -0
  107. package/esm2022/app/reports/interfaces/component-data-applied.interface.mjs +2 -0
  108. package/esm2022/app/reports/interfaces/component-data-drill.interface.mjs +2 -0
  109. package/esm2022/app/reports/interfaces/filter-bar-placement.type.mjs +2 -0
  110. package/esm2022/app/reports/interfaces/filter-component-toggle-state.interface.mjs +2 -0
  111. package/esm2022/app/reports/interfaces/filter-settings-option.interface.mjs +2 -0
  112. package/esm2022/app/reports/interfaces/filter-type-select-state.interface.mjs +2 -0
  113. package/esm2022/app/reports/interfaces/report-chart-hit.interface.mjs +2 -0
  114. package/esm2022/app/reports/interfaces/report-chat-viewer-cross-filter-field.interface.mjs +2 -0
  115. package/esm2022/app/reports/interfaces/report-chat-viewer-cross-filter.interface.mjs +2 -0
  116. package/esm2022/app/reports/interfaces/report-chat-viewer-detail.interface.mjs +2 -0
  117. package/esm2022/app/reports/interfaces/report-chat-viewer-drill-step.interface.mjs +2 -0
  118. package/esm2022/app/reports/interfaces/report-chat-viewer-drill.interface.mjs +2 -0
  119. package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +1 -1
  120. package/esm2022/app/reports/interfaces/report-chat-viewer-selection.interface.mjs +2 -0
  121. package/esm2022/app/reports/interfaces/report-chat-viewer-state.interface.mjs +1 -1
  122. package/esm2022/app/reports/interfaces/report-drill-crumb.interface.mjs +2 -0
  123. package/esm2022/app/reports/interfaces/report-drill-refusal.type.mjs +2 -0
  124. package/esm2022/app/reports/interfaces/report-drill-step.interface.mjs +2 -0
  125. package/esm2022/app/reports/interfaces/report-export-line-kind.type.mjs +2 -0
  126. package/esm2022/app/reports/interfaces/report-export-line.interface.mjs +2 -0
  127. package/esm2022/app/reports/interfaces/report-export-lines-input.interface.mjs +2 -0
  128. package/esm2022/app/reports/interfaces/report-export-snapshot.interface.mjs +2 -0
  129. package/esm2022/app/reports/interfaces/report-filter-group-changes.interface.mjs +2 -0
  130. package/esm2022/app/reports/interfaces/report-filter-line-context.interface.mjs +2 -0
  131. package/esm2022/app/reports/interfaces/report-filter-line-form.type.mjs +2 -0
  132. package/esm2022/app/reports/interfaces/report-filter-match.type.mjs +2 -0
  133. package/esm2022/app/reports/interfaces/report-filter-option-pair.interface.mjs +2 -0
  134. package/esm2022/app/reports/interfaces/report-filter-options-ask.interface.mjs +2 -0
  135. package/esm2022/app/reports/interfaces/report-filter-options-list.interface.mjs +2 -0
  136. package/esm2022/app/reports/interfaces/report-filter-options-request.interface.mjs +2 -0
  137. package/esm2022/app/reports/interfaces/report-filter-options-stream.interface.mjs +2 -0
  138. package/esm2022/app/reports/interfaces/report-filter-options.interface.mjs +2 -0
  139. package/esm2022/app/reports/interfaces/report-filter-skip.type.mjs +2 -0
  140. package/esm2022/app/reports/interfaces/report-mark-action.type.mjs +2 -0
  141. package/esm2022/app/reports/interfaces/report-mark-click.interface.mjs +2 -0
  142. package/esm2022/app/reports/interfaces/report-mark-context.interface.mjs +2 -0
  143. package/esm2022/app/reports/interfaces/report-mark-decision.interface.mjs +2 -0
  144. package/esm2022/app/reports/interfaces/report-mark-event.interface.mjs +2 -0
  145. package/esm2022/app/reports/interfaces/report-mark-point.interface.mjs +2 -0
  146. package/esm2022/app/reports/interfaces/report-temporary-state.interface.mjs +2 -0
  147. package/esm2022/app/reports/interfaces/report-tile-state.interface.mjs +2 -0
  148. package/esm2022/app/reports/interfaces/report-view-config.interface.mjs +2 -0
  149. package/esm2022/app/reports/interfaces/report-view-create.interface.mjs +2 -0
  150. package/esm2022/app/reports/interfaces/report-view-deleted.interface.mjs +2 -0
  151. package/esm2022/app/reports/interfaces/report-view-dialog-data.interface.mjs +2 -0
  152. package/esm2022/app/reports/interfaces/report-view-dropped.interface.mjs +2 -0
  153. package/esm2022/app/reports/interfaces/report-view-menu-item.interface.mjs +2 -0
  154. package/esm2022/app/reports/interfaces/report-view-summary.interface.mjs +2 -0
  155. package/esm2022/app/reports/interfaces/report-view.interface.mjs +2 -0
  156. package/esm2022/app/reports/interfaces/report-viewer-feature.type.mjs +2 -0
  157. package/esm2022/app/reports/interfaces/report-views.interface.mjs +2 -0
  158. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  159. package/esm2022/app/reports/interfaces/tile-load-result.interface.mjs +2 -0
  160. package/esm2022/app/reports/mark-click.mjs +193 -0
  161. package/esm2022/app/reports/option-builder.mjs +159 -15
  162. package/esm2022/app/reports/report-chat-viewer-state.mjs +34 -0
  163. package/esm2022/app/reports/report-date-presets.mjs +18 -0
  164. package/esm2022/app/reports/report-filter-items.mjs +263 -72
  165. package/esm2022/app/reports/report-tile.mjs +12 -0
  166. package/esm2022/app/reports/report-view-config.mjs +587 -0
  167. package/esm2022/app/reports/report-view-menu.mjs +119 -0
  168. package/esm2022/app/reports/report-viewer-features.mjs +42 -0
  169. package/esm2022/app/reports/services/report-filter-options.service.mjs +238 -0
  170. package/esm2022/app/reports/services/report-filter-state.service.mjs +668 -210
  171. package/esm2022/app/reports/services/report-view.service.mjs +218 -0
  172. package/esm2022/app/reports/tile-data-state.mjs +127 -0
  173. package/esm2022/app/reports/tile-loads.mjs +38 -0
  174. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +194 -127
  175. package/esm2022/app/reports/views/report/report.component.mjs +112 -29
  176. package/esm2022/public_api.mjs +23 -1
  177. package/fesm2022/{firestitch-report-echarts-DBMOHmBF.mjs → firestitch-report-echarts-DHEH_K_q.mjs} +2 -2
  178. package/fesm2022/{firestitch-report-echarts-DBMOHmBF.mjs.map → firestitch-report-echarts-DHEH_K_q.mjs.map} +1 -1
  179. package/fesm2022/{firestitch-report-firestitch-report-CqbXT1gh.mjs → firestitch-report-firestitch-report-ZcHTnNKq.mjs} +8222 -4447
  180. package/fesm2022/firestitch-report-firestitch-report-ZcHTnNKq.mjs.map +1 -0
  181. package/fesm2022/firestitch-report.mjs +1 -1
  182. package/package.json +1 -1
  183. package/public_api.d.ts +22 -0
  184. package/app/reports/report-url-state.d.ts +0 -19
  185. package/esm2022/app/reports/report-url-state.mjs +0 -189
  186. package/fesm2022/firestitch-report-firestitch-report-CqbXT1gh.mjs.map +0 -1
@@ -0,0 +1,218 @@
1
+ import { HttpContext } from '@angular/common/http';
2
+ import { DestroyRef, Injectable, computed, inject, signal } from '@angular/core';
3
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
+ import { DisplayApiError } from '@firestitch/api';
5
+ import { FsMessage } from '@firestitch/message';
6
+ import { EMPTY, of } from 'rxjs';
7
+ import { catchError, map, tap } from 'rxjs/operators';
8
+ import { ReportData } from '../data/report.data';
9
+ import { viewDroppedCount, viewDroppedMessage, withStoredKeys } from '../report-view-config';
10
+ import { ReportFilterStateService } from './report-filter-state.service';
11
+ import * as i0 from "@angular/core";
12
+ // The open report's saved views, per open report beside the state service:
13
+ // the list the viewer may see, the view that is open, the order a report
14
+ // opens in and the calls that change a view. The viewer state stays
15
+ // ReportFilterStateService's: this service puts a view on screen through
16
+ // apply() and reads the screen through snapshot(), base and viewChanged.
17
+ // Nothing here runs for a report whose server does not list 'views'
18
+ // (serves()). A view is opened from the Views menu only: a report keeps no
19
+ // state in the browser URL, so there is no link to a view.
20
+ //
21
+ // The order a report opens in (open(), on its first load only):
22
+ // 1. The viewer's default view.
23
+ // 2. Else the report's authored defaults.
24
+ // A ?page= the report opened with beats the default view's page.
25
+ export class ReportViewService {
26
+ // The views the viewer may see, names and flags only: its own first, then
27
+ // the ones others share. Empty until the list is read.
28
+ views = computed(() => this._views());
29
+ // The viewer may share its views with everyone.
30
+ canShare = computed(() => this._canShare());
31
+ // The open view, with its config as it was read or saved; null while the
32
+ // screen is on the report's defaults.
33
+ openView = computed(() => this._openView());
34
+ // Whether the screen differs from the open view; false with none open.
35
+ viewChanged = computed(() => !!this._openView() && this._filterState.viewChanged());
36
+ _reportData = inject(ReportData);
37
+ _filterState = inject(ReportFilterStateService);
38
+ _message = inject(FsMessage);
39
+ _destroyRef = inject(DestroyRef);
40
+ _views = signal([]);
41
+ _canShare = signal(false);
42
+ _openView = signal(null);
43
+ // The report the views belong to.
44
+ _reportId = null;
45
+ // Whether the open report's server keeps saved views.
46
+ serves(report) {
47
+ return !!report?.viewerFeatures?.includes('views');
48
+ }
49
+ // A report's first load, in the open order above: the state service is
50
+ // set up for `report` (init) once the list is read, and the screen opened
51
+ // on the viewer's default view, else on the report's defaults. `pageId` is
52
+ // the ?page= the report opened with, which beats the view's page. Ends once
53
+ // the screen is set.
54
+ open(report, pageId) {
55
+ this._start(report);
56
+ return this._readViews(report)
57
+ .pipe(tap((list) => {
58
+ this._filterState.init(report);
59
+ if (list?.myDefault) {
60
+ this._openOn(list.myDefault, () => this._filterState.apply(list.myDefault.config, pageId));
61
+ }
62
+ }), map(() => undefined));
63
+ }
64
+ // A later load of the open report (a chat edit, a settings save): the
65
+ // screen and the open view stay, and the list is read again behind them so
66
+ // it names what the server holds now.
67
+ refresh(report) {
68
+ this._start(report);
69
+ this._readViews(report)
70
+ .pipe(takeUntilDestroyed(this._destroyRef))
71
+ .subscribe();
72
+ }
73
+ // Opens a view picked from the list; its config is read now.
74
+ pick(reportViewId) {
75
+ return this._reportData.view(this._reportId, reportViewId)
76
+ .pipe(tap((view) => this._openOn(view, () => this._filterState.apply(view.config))));
77
+ }
78
+ // Closes the open view and puts the screen on the report's defaults.
79
+ openDefaults() {
80
+ this._openView.set(null);
81
+ this._filterState.apply(null);
82
+ }
83
+ // Saves the screen as a new view, which becomes the open view. The screen
84
+ // is already the view, so nothing is applied again.
85
+ saveAsNew(view) {
86
+ return this._reportData.createView(this._reportId, { ...view, config: this._filterState.snapshot() })
87
+ .pipe(tap((saved) => {
88
+ this._openView.set(saved);
89
+ this._putRow(saved);
90
+ this._filterState.setBaseToScreen();
91
+ this._message.success('View saved');
92
+ }));
93
+ }
94
+ // Saves the screen over the open view, keeping the keys this viewer does
95
+ // not know (withStoredKeys).
96
+ saveChanges() {
97
+ const open = this._openView();
98
+ if (!open) {
99
+ return EMPTY;
100
+ }
101
+ return this._reportData.updateView(this._reportId, open.id, { config: withStoredKeys(open.config, this._filterState.snapshot()) })
102
+ .pipe(tap((saved) => {
103
+ this._openView.set(saved);
104
+ this._putRow(saved);
105
+ this._filterState.setBaseToScreen();
106
+ this._message.success('View saved');
107
+ }));
108
+ }
109
+ rename(name) {
110
+ return this._changeOpen((reportViewId) => this._reportData.updateView(this._reportId, reportViewId, { name }));
111
+ }
112
+ // Shares the open view with everyone who may open the report, or stops.
113
+ share(shared) {
114
+ return this._changeOpen((reportViewId) => this._reportData.shareView(this._reportId, reportViewId, shared));
115
+ }
116
+ // Makes the open view the viewer's default, or stops opening it by default.
117
+ setDefault(personalDefault) {
118
+ return this._changeOpen((reportViewId) => this._reportData.setViewDefault(this._reportId, reportViewId, personalDefault));
119
+ }
120
+ // Deletes the open view. The screen stays; the report's defaults become
121
+ // what it is compared with.
122
+ deleteOpen() {
123
+ const open = this._openView();
124
+ if (!open) {
125
+ return EMPTY;
126
+ }
127
+ return this._reportData.deleteView(this._reportId, open.id)
128
+ .pipe(tap(() => {
129
+ this._openView.set(null);
130
+ this._views.update((views) => views.filter((view) => view.id !== open.id));
131
+ this._filterState.clearBase();
132
+ this._message.success('View deleted');
133
+ }));
134
+ }
135
+ // Starts over for another report: no list and no open view.
136
+ _start(report) {
137
+ if (report.id === this._reportId) {
138
+ return;
139
+ }
140
+ this._reportId = report.id;
141
+ this._views.set([]);
142
+ this._canShare.set(false);
143
+ this._openView.set(null);
144
+ }
145
+ // Makes `view` the open view, puts it on screen (`applyView`), and says
146
+ // how many of its settings no longer apply (and to save it, when the
147
+ // viewer may).
148
+ _openOn(view, applyView) {
149
+ this._openView.set(view);
150
+ applyView();
151
+ const note = viewDroppedMessage(viewDroppedCount(view, this._filterState.base()), view.canChange);
152
+ if (note) {
153
+ this._message.warning(note);
154
+ }
155
+ }
156
+ // Runs a change on the open view and takes its answer as the open view
157
+ // and its row in the list.
158
+ _changeOpen(change) {
159
+ const open = this._openView();
160
+ if (!open) {
161
+ return EMPTY;
162
+ }
163
+ return change(open.id)
164
+ .pipe(tap((view) => {
165
+ this._openView.set(view);
166
+ this._putRow(view);
167
+ }));
168
+ }
169
+ // A view's row in the list, replaced or added. A new default clears the
170
+ // flag on the viewer's other views, as the server does. A new row keeps
171
+ // the list's order: the viewer's own views first, then the ones others
172
+ // share.
173
+ _putRow(view) {
174
+ const summary = viewSummary(view);
175
+ this._views.update((views) => {
176
+ const rows = views.map((row) => (view.personalDefault && row.personalDefault ? { ...row, personalDefault: false } : row));
177
+ const index = rows.findIndex((row) => row.id === view.id);
178
+ if (index >= 0) {
179
+ return rows.map((row, at) => (at === index ? summary : row));
180
+ }
181
+ const othersAt = view.mine ? rows.findIndex((row) => !row.mine) : -1;
182
+ return othersAt < 0
183
+ ? [...rows, summary]
184
+ : [...rows.slice(0, othersAt), summary, ...rows.slice(othersAt)];
185
+ });
186
+ }
187
+ // The list, read for `report`; null when it cannot be read. Its answer is
188
+ // kept only while the report is still the open one.
189
+ _readViews(report) {
190
+ return this._reportData.views(report.id, { context: new HttpContext().set(DisplayApiError, false) })
191
+ .pipe(catchError(() => of(null)), tap((list) => {
192
+ if (list && report.id === this._reportId) {
193
+ this._views.set(list.views ?? []);
194
+ this._canShare.set(!!list.canShare);
195
+ }
196
+ }));
197
+ }
198
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportViewService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
199
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportViewService });
200
+ }
201
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportViewService, decorators: [{
202
+ type: Injectable
203
+ }] });
204
+ // A view's row as the list holds it: names and flags, no config.
205
+ function viewSummary(view) {
206
+ return {
207
+ id: view.id,
208
+ name: view.name,
209
+ shared: view.shared,
210
+ mine: view.mine,
211
+ personalDefault: view.personalDefault,
212
+ ownerName: view.ownerName,
213
+ canChange: view.canChange,
214
+ canDelete: view.canDelete,
215
+ modifyDate: view.modifyDate,
216
+ };
217
+ }
218
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXZpZXcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9zZXJ2aWNlcy9yZXBvcnQtdmlldy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWhELE9BQU8sRUFBRSxLQUFLLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQU9qRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0YsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0JBQStCLENBQUM7O0FBR3pFLDJFQUEyRTtBQUMzRSx5RUFBeUU7QUFDekUsb0VBQW9FO0FBQ3BFLHlFQUF5RTtBQUN6RSx5RUFBeUU7QUFDekUsb0VBQW9FO0FBQ3BFLDJFQUEyRTtBQUMzRSwyREFBMkQ7QUFDM0QsRUFBRTtBQUNGLGdFQUFnRTtBQUNoRSxnQ0FBZ0M7QUFDaEMsMENBQTBDO0FBQzFDLGlFQUFpRTtBQUVqRSxNQUFNLE9BQU8saUJBQWlCO0lBRTVCLDBFQUEwRTtJQUMxRSx1REFBdUQ7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IjpbImltcG9ydCB7IEh0dHBDb250ZXh0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgRGVzdHJveVJlZiwgSW5qZWN0YWJsZSwgY29tcHV0ZWQsIGluamVjdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbmltcG9ydCB7IERpc3BsYXlBcGlFcnJvciB9IGZyb20gJ0BmaXJlc3RpdGNoL2FwaSc7XG5pbXBvcnQgeyBGc01lc3NhZ2UgfSBmcm9tICdAZmlyZXN0aXRjaC9tZXNzYWdlJztcblxuaW1wb3J0IHsgRU1QVFksIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHsgUmVwb3J0Vmlld0NyZWF0ZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LXZpZXctY3JlYXRlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRWaWV3RGVsZXRlZCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LXZpZXctZGVsZXRlZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0Vmlld1N1bW1hcnkgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC12aWV3LXN1bW1hcnkuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFZpZXcgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC12aWV3LmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRWaWV3cyB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LXZpZXdzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgdmlld0Ryb3BwZWRDb3VudCwgdmlld0Ryb3BwZWRNZXNzYWdlLCB3aXRoU3RvcmVkS2V5cyB9IGZyb20gJy4uL3JlcG9ydC12aWV3LWNvbmZpZyc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZSc7XG5cblxuLy8gVGhlIG9wZW4gcmVwb3J0J3Mgc2F2ZWQgdmlld3MsIHBlciBvcGVuIHJlcG9ydCBiZXNpZGUgdGhlIHN0YXRlIHNlcnZpY2U6XG4vLyB0aGUgbGlzdCB0aGUgdmlld2VyIG1heSBzZWUsIHRoZSB2aWV3IHRoYXQgaXMgb3BlbiwgdGhlIG9yZGVyIGEgcmVwb3J0XG4vLyBvcGVucyBpbiBhbmQgdGhlIGNhbGxzIHRoYXQgY2hhbmdlIGEgdmlldy4gVGhlIHZpZXdlciBzdGF0ZSBzdGF5c1xuLy8gUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlJ3M6IHRoaXMgc2VydmljZSBwdXRzIGEgdmlldyBvbiBzY3JlZW4gdGhyb3VnaFxuLy8gYXBwbHkoKSBhbmQgcmVhZHMgdGhlIHNjcmVlbiB0aHJvdWdoIHNuYXBzaG90KCksIGJhc2UgYW5kIHZpZXdDaGFuZ2VkLlxuLy8gTm90aGluZyBoZXJlIHJ1bnMgZm9yIGEgcmVwb3J0IHdob3NlIHNlcnZlciBkb2VzIG5vdCBsaXN0ICd2aWV3cydcbi8vIChzZXJ2ZXMoKSkuIEEgdmlldyBpcyBvcGVuZWQgZnJvbSB0aGUgVmlld3MgbWVudSBvbmx5OiBhIHJlcG9ydCBrZWVwcyBub1xuLy8gc3RhdGUgaW4gdGhlIGJyb3dzZXIgVVJMLCBzbyB0aGVyZSBpcyBubyBsaW5rIHRvIGEgdmlldy5cbi8vXG4vLyBUaGUgb3JkZXIgYSByZXBvcnQgb3BlbnMgaW4gKG9wZW4oKSwgb24gaXRzIGZpcnN0IGxvYWQgb25seSk6XG4vLyAxLiBUaGUgdmlld2VyJ3MgZGVmYXVsdCB2aWV3LlxuLy8gMi4gRWxzZSB0aGUgcmVwb3J0J3MgYXV0aG9yZWQgZGVmYXVsdHMuXG4vLyBBID9wYWdlPSB0aGUgcmVwb3J0IG9wZW5lZCB3aXRoIGJlYXRzIHRoZSBkZWZhdWx0IHZpZXcncyBwYWdlLlxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcG9ydFZpZXdTZXJ2aWNlIHtcblxuICAvLyBUaGUgdmlld3MgdGhlIHZpZXdlciBtYXkgc2VlLCBuYW1lcyBhbmQgZmxhZ3Mgb25seTogaXRzIG93biBmaXJzdCwgdGhlblxuICAvLyB0aGUgb25lcyBvdGhlcnMgc2hhcmUuIEVtcHR5IHVudGlsIHRoZSBsaXN0IGlzIHJlYWQuXG4gIHB1YmxpYyByZWFkb25seSB2aWV3cyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX3ZpZXdzKCkpO1xuXG4gIC8vIFRoZSB2aWV3ZXIgbWF5IHNoYXJlIGl0cyB2aWV3cyB3aXRoIGV2ZXJ5b25lLlxuICBwdWJsaWMgcmVhZG9ubHkgY2FuU2hhcmUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9jYW5TaGFyZSgpKTtcblxuICAvLyBUaGUgb3BlbiB2aWV3LCB3aXRoIGl0cyBjb25maWcgYXMgaXQgd2FzIHJlYWQgb3Igc2F2ZWQ7IG51bGwgd2hpbGUgdGhlXG4gIC8vIHNjcmVlbiBpcyBvbiB0aGUgcmVwb3J0J3MgZGVmYXVsdHMuXG4gIHB1YmxpYyByZWFkb25seSBvcGVuVmlldyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX29wZW5WaWV3KCkpO1xuXG4gIC8vIFdoZXRoZXIgdGhlIHNjcmVlbiBkaWZmZXJzIGZyb20gdGhlIG9wZW4gdmlldzsgZmFsc2Ugd2l0aCBub25lIG9wZW4uXG4gIHB1YmxpYyByZWFkb25seSB2aWV3Q2hhbmdlZCA9IGNvbXB1dGVkKCgpID0+ICEhdGhpcy5fb3BlblZpZXcoKSAmJiB0aGlzLl9maWx0ZXJTdGF0ZS52aWV3Q2hhbmdlZCgpKTtcblxuICBwcml2YXRlIF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xuICBwcml2YXRlIF9maWx0ZXJTdGF0ZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpO1xuICBwcml2YXRlIF9tZXNzYWdlID0gaW5qZWN0KEZzTWVzc2FnZSk7XG4gIHByaXZhdGUgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgcHJpdmF0ZSBfdmlld3MgPSBzaWduYWw8UmVwb3J0Vmlld1N1bW1hcnlbXT4oW10pO1xuICBwcml2YXRlIF9jYW5TaGFyZSA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgX29wZW5WaWV3ID0gc2lnbmFsPFJlcG9ydFZpZXcgfCBudWxsPihudWxsKTtcblxuICAvLyBUaGUgcmVwb3J0IHRoZSB2aWV3cyBiZWxvbmcgdG8uXG4gIHByaXZhdGUgX3JlcG9ydElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAvLyBXaGV0aGVyIHRoZSBvcGVuIHJlcG9ydCdzIHNlcnZlciBrZWVwcyBzYXZlZCB2aWV3cy5cbiAgcHVibGljIHNlcnZlcyhyZXBvcnQ6IFJlcG9ydCB8IG51bGwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFyZXBvcnQ/LnZpZXdlckZlYXR1cmVzPy5pbmNsdWRlcygndmlld3MnKTtcbiAgfVxuXG4gIC8vIEEgcmVwb3J0J3MgZmlyc3QgbG9hZCwgaW4gdGhlIG9wZW4gb3JkZXIgYWJvdmU6IHRoZSBzdGF0ZSBzZXJ2aWNlIGlzXG4gIC8vIHNldCB1cCBmb3IgYHJlcG9ydGAgKGluaXQpIG9uY2UgdGhlIGxpc3QgaXMgcmVhZCwgYW5kIHRoZSBzY3JlZW4gb3BlbmVkXG4gIC8vIG9uIHRoZSB2aWV3ZXIncyBkZWZhdWx0IHZpZXcsIGVsc2Ugb24gdGhlIHJlcG9ydCdzIGRlZmF1bHRzLiBgcGFnZUlkYCBpc1xuICAvLyB0aGUgP3BhZ2U9IHRoZSByZXBvcnQgb3BlbmVkIHdpdGgsIHdoaWNoIGJlYXRzIHRoZSB2aWV3J3MgcGFnZS4gRW5kcyBvbmNlXG4gIC8vIHRoZSBzY3JlZW4gaXMgc2V0LlxuICBwdWJsaWMgb3BlbihyZXBvcnQ6IFJlcG9ydCwgcGFnZUlkOiBudW1iZXIgfCBudWxsKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgdGhpcy5fc3RhcnQocmVwb3J0KTtcblxuICAgIHJldHVybiB0aGlzLl9yZWFkVmlld3MocmVwb3J0KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgobGlzdCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2ZpbHRlclN0YXRlLmluaXQocmVwb3J0KTtcbiAgICAgICAgICBpZiAobGlzdD8ubXlEZWZhdWx0KSB7XG4gICAgICAgICAgICB0aGlzLl9vcGVuT24obGlzdC5teURlZmF1bHQsICgpID0+IHRoaXMuX2ZpbHRlclN0YXRlLmFwcGx5KGxpc3QubXlEZWZhdWx0LmNvbmZpZywgcGFnZUlkKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgbWFwKCgpID0+IHVuZGVmaW5lZCksXG4gICAgICApO1xuICB9XG5cbiAgLy8gQSBsYXRlciBsb2FkIG9mIHRoZSBvcGVuIHJlcG9ydCAoYSBjaGF0IGVkaXQsIGEgc2V0dGluZ3Mgc2F2ZSk6IHRoZVxuICAvLyBzY3JlZW4gYW5kIHRoZSBvcGVuIHZpZXcgc3RheSwgYW5kIHRoZSBsaXN0IGlzIHJlYWQgYWdhaW4gYmVoaW5kIHRoZW0gc29cbiAgLy8gaXQgbmFtZXMgd2hhdCB0aGUgc2VydmVyIGhvbGRzIG5vdy5cbiAgcHVibGljIHJlZnJlc2gocmVwb3J0OiBSZXBvcnQpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGFydChyZXBvcnQpO1xuICAgIHRoaXMuX3JlYWRWaWV3cyhyZXBvcnQpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvLyBPcGVucyBhIHZpZXcgcGlja2VkIGZyb20gdGhlIGxpc3Q7IGl0cyBjb25maWcgaXMgcmVhZCBub3cuXG4gIHB1YmxpYyBwaWNrKHJlcG9ydFZpZXdJZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3PiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGEudmlldyh0aGlzLl9yZXBvcnRJZCwgcmVwb3J0Vmlld0lkKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgodmlldykgPT4gdGhpcy5fb3Blbk9uKHZpZXcsICgpID0+IHRoaXMuX2ZpbHRlclN0YXRlLmFwcGx5KHZpZXcuY29uZmlnKSkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIENsb3NlcyB0aGUgb3BlbiB2aWV3IGFuZCBwdXRzIHRoZSBzY3JlZW4gb24gdGhlIHJlcG9ydCdzIGRlZmF1bHRzLlxuICBwdWJsaWMgb3BlbkRlZmF1bHRzKCk6IHZvaWQge1xuICAgIHRoaXMuX29wZW5WaWV3LnNldChudWxsKTtcbiAgICB0aGlzLl9maWx0ZXJTdGF0ZS5hcHBseShudWxsKTtcbiAgfVxuXG4gIC8vIFNhdmVzIHRoZSBzY3JlZW4gYXMgYSBuZXcgdmlldywgd2hpY2ggYmVjb21lcyB0aGUgb3BlbiB2aWV3LiBUaGUgc2NyZWVuXG4gIC8vIGlzIGFscmVhZHkgdGhlIHZpZXcsIHNvIG5vdGhpbmcgaXMgYXBwbGllZCBhZ2Fpbi5cbiAgcHVibGljIHNhdmVBc05ldyh2aWV3OiBPbWl0PFJlcG9ydFZpZXdDcmVhdGUsICdjb25maWcnPik6IE9ic2VydmFibGU8UmVwb3J0Vmlldz4ge1xuICAgIHJldHVybiB0aGlzLl9yZXBvcnREYXRhLmNyZWF0ZVZpZXcodGhpcy5fcmVwb3J0SWQsIHsgLi4udmlldywgY29uZmlnOiB0aGlzLl9maWx0ZXJTdGF0ZS5zbmFwc2hvdCgpIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChzYXZlZCkgPT4ge1xuICAgICAgICAgIHRoaXMuX29wZW5WaWV3LnNldChzYXZlZCk7XG4gICAgICAgICAgdGhpcy5fcHV0Um93KHNhdmVkKTtcbiAgICAgICAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRCYXNlVG9TY3JlZW4oKTtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ1ZpZXcgc2F2ZWQnKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gU2F2ZXMgdGhlIHNjcmVlbiBvdmVyIHRoZSBvcGVuIHZpZXcsIGtlZXBpbmcgdGhlIGtleXMgdGhpcyB2aWV3ZXIgZG9lc1xuICAvLyBub3Qga25vdyAod2l0aFN0b3JlZEtleXMpLlxuICBwdWJsaWMgc2F2ZUNoYW5nZXMoKTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3PiB7XG4gICAgY29uc3Qgb3BlbiA9IHRoaXMuX29wZW5WaWV3KCk7XG4gICAgaWYgKCFvcGVuKSB7XG4gICAgICByZXR1cm4gRU1QVFk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGEudXBkYXRlVmlldyh0aGlzLl9yZXBvcnRJZCwgb3Blbi5pZCwgeyBjb25maWc6IHdpdGhTdG9yZWRLZXlzKG9wZW4uY29uZmlnLCB0aGlzLl9maWx0ZXJTdGF0ZS5zbmFwc2hvdCgpKSB9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoc2F2ZWQpID0+IHtcbiAgICAgICAgICB0aGlzLl9vcGVuVmlldy5zZXQoc2F2ZWQpO1xuICAgICAgICAgIHRoaXMuX3B1dFJvdyhzYXZlZCk7XG4gICAgICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0QmFzZVRvU2NyZWVuKCk7XG4gICAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdWaWV3IHNhdmVkJyk7XG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZW5hbWUobmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYW5nZU9wZW4oKHJlcG9ydFZpZXdJZCkgPT4gdGhpcy5fcmVwb3J0RGF0YS51cGRhdGVWaWV3KHRoaXMuX3JlcG9ydElkLCByZXBvcnRWaWV3SWQsIHsgbmFtZSB9KSk7XG4gIH1cblxuICAvLyBTaGFyZXMgdGhlIG9wZW4gdmlldyB3aXRoIGV2ZXJ5b25lIHdobyBtYXkgb3BlbiB0aGUgcmVwb3J0LCBvciBzdG9wcy5cbiAgcHVibGljIHNoYXJlKHNoYXJlZDogYm9vbGVhbik6IE9ic2VydmFibGU8UmVwb3J0Vmlldz4ge1xuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VPcGVuKChyZXBvcnRWaWV3SWQpID0+IHRoaXMuX3JlcG9ydERhdGEuc2hhcmVWaWV3KHRoaXMuX3JlcG9ydElkLCByZXBvcnRWaWV3SWQsIHNoYXJlZCkpO1xuICB9XG5cbiAgLy8gTWFrZXMgdGhlIG9wZW4gdmlldyB0aGUgdmlld2VyJ3MgZGVmYXVsdCwgb3Igc3RvcHMgb3BlbmluZyBpdCBieSBkZWZhdWx0LlxuICBwdWJsaWMgc2V0RGVmYXVsdChwZXJzb25hbERlZmF1bHQ6IGJvb2xlYW4pOiBPYnNlcnZhYmxlPFJlcG9ydFZpZXc+IHtcbiAgICByZXR1cm4gdGhpcy5fY2hhbmdlT3BlbigocmVwb3J0Vmlld0lkKSA9PiB0aGlzLl9yZXBvcnREYXRhLnNldFZpZXdEZWZhdWx0KHRoaXMuX3JlcG9ydElkLCByZXBvcnRWaWV3SWQsIHBlcnNvbmFsRGVmYXVsdCkpO1xuICB9XG5cbiAgLy8gRGVsZXRlcyB0aGUgb3BlbiB2aWV3LiBUaGUgc2NyZWVuIHN0YXlzOyB0aGUgcmVwb3J0J3MgZGVmYXVsdHMgYmVjb21lXG4gIC8vIHdoYXQgaXQgaXMgY29tcGFyZWQgd2l0aC5cbiAgcHVibGljIGRlbGV0ZU9wZW4oKTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3RGVsZXRlZD4ge1xuICAgIGNvbnN0IG9wZW4gPSB0aGlzLl9vcGVuVmlldygpO1xuICAgIGlmICghb3Blbikge1xuICAgICAgcmV0dXJuIEVNUFRZO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9yZXBvcnREYXRhLmRlbGV0ZVZpZXcodGhpcy5fcmVwb3J0SWQsIG9wZW4uaWQpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9vcGVuVmlldy5zZXQobnVsbCk7XG4gICAgICAgICAgdGhpcy5fdmlld3MudXBkYXRlKCh2aWV3cykgPT4gdmlld3MuZmlsdGVyKCh2aWV3KSA9PiB2aWV3LmlkICE9PSBvcGVuLmlkKSk7XG4gICAgICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuY2xlYXJCYXNlKCk7XG4gICAgICAgICAgdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdWaWV3IGRlbGV0ZWQnKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gU3RhcnRzIG92ZXIgZm9yIGFub3RoZXIgcmVwb3J0OiBubyBsaXN0IGFuZCBubyBvcGVuIHZpZXcuXG4gIHByaXZhdGUgX3N0YXJ0KHJlcG9ydDogUmVwb3J0KTogdm9pZCB7XG4gICAgaWYgKHJlcG9ydC5pZCA9PT0gdGhpcy5fcmVwb3J0SWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9yZXBvcnRJZCA9IHJlcG9ydC5pZDtcbiAgICB0aGlzLl92aWV3cy5zZXQoW10pO1xuICAgIHRoaXMuX2NhblNoYXJlLnNldChmYWxzZSk7XG4gICAgdGhpcy5fb3BlblZpZXcuc2V0KG51bGwpO1xuICB9XG5cbiAgLy8gTWFrZXMgYHZpZXdgIHRoZSBvcGVuIHZpZXcsIHB1dHMgaXQgb24gc2NyZWVuIChgYXBwbHlWaWV3YCksIGFuZCBzYXlzXG4gIC8vIGhvdyBtYW55IG9mIGl0cyBzZXR0aW5ncyBubyBsb25nZXIgYXBwbHkgKGFuZCB0byBzYXZlIGl0LCB3aGVuIHRoZVxuICAvLyB2aWV3ZXIgbWF5KS5cbiAgcHJpdmF0ZSBfb3Blbk9uKHZpZXc6IFJlcG9ydFZpZXcsIGFwcGx5VmlldzogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX29wZW5WaWV3LnNldCh2aWV3KTtcbiAgICBhcHBseVZpZXcoKTtcblxuICAgIGNvbnN0IG5vdGUgPSB2aWV3RHJvcHBlZE1lc3NhZ2Uodmlld0Ryb3BwZWRDb3VudCh2aWV3LCB0aGlzLl9maWx0ZXJTdGF0ZS5iYXNlKCkpLCB2aWV3LmNhbkNoYW5nZSk7XG4gICAgaWYgKG5vdGUpIHtcbiAgICAgIHRoaXMuX21lc3NhZ2Uud2FybmluZyhub3RlKTtcbiAgICB9XG4gIH1cblxuICAvLyBSdW5zIGEgY2hhbmdlIG9uIHRoZSBvcGVuIHZpZXcgYW5kIHRha2VzIGl0cyBhbnN3ZXIgYXMgdGhlIG9wZW4gdmlld1xuICAvLyBhbmQgaXRzIHJvdyBpbiB0aGUgbGlzdC5cbiAgcHJpdmF0ZSBfY2hhbmdlT3BlbihjaGFuZ2U6IChyZXBvcnRWaWV3SWQ6IG51bWJlcikgPT4gT2JzZXJ2YWJsZTxSZXBvcnRWaWV3Pik6IE9ic2VydmFibGU8UmVwb3J0Vmlldz4ge1xuICAgIGNvbnN0IG9wZW4gPSB0aGlzLl9vcGVuVmlldygpO1xuICAgIGlmICghb3Blbikge1xuICAgICAgcmV0dXJuIEVNUFRZO1xuICAgIH1cblxuICAgIHJldHVybiBjaGFuZ2Uob3Blbi5pZClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKHZpZXcpID0+IHtcbiAgICAgICAgICB0aGlzLl9vcGVuVmlldy5zZXQodmlldyk7XG4gICAgICAgICAgdGhpcy5fcHV0Um93KHZpZXcpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBBIHZpZXcncyByb3cgaW4gdGhlIGxpc3QsIHJlcGxhY2VkIG9yIGFkZGVkLiBBIG5ldyBkZWZhdWx0IGNsZWFycyB0aGVcbiAgLy8gZmxhZyBvbiB0aGUgdmlld2VyJ3Mgb3RoZXIgdmlld3MsIGFzIHRoZSBzZXJ2ZXIgZG9lcy4gQSBuZXcgcm93IGtlZXBzXG4gIC8vIHRoZSBsaXN0J3Mgb3JkZXI6IHRoZSB2aWV3ZXIncyBvd24gdmlld3MgZmlyc3QsIHRoZW4gdGhlIG9uZXMgb3RoZXJzXG4gIC8vIHNoYXJlLlxuICBwcml2YXRlIF9wdXRSb3codmlldzogUmVwb3J0Vmlldyk6IHZvaWQge1xuICAgIGNvbnN0IHN1bW1hcnkgPSB2aWV3U3VtbWFyeSh2aWV3KTtcblxuICAgIHRoaXMuX3ZpZXdzLnVwZGF0ZSgodmlld3MpID0+IHtcbiAgICAgIGNvbnN0IHJvd3MgPSB2aWV3cy5tYXAoKHJvdykgPT4gKHZpZXcucGVyc29uYWxEZWZhdWx0ICYmIHJvdy5wZXJzb25hbERlZmF1bHQgPyB7IC4uLnJvdywgcGVyc29uYWxEZWZhdWx0OiBmYWxzZSB9IDogcm93KSk7XG4gICAgICBjb25zdCBpbmRleCA9IHJvd3MuZmluZEluZGV4KChyb3cpID0+IHJvdy5pZCA9PT0gdmlldy5pZCk7XG5cbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIHJldHVybiByb3dzLm1hcCgocm93LCBhdCkgPT4gKGF0ID09PSBpbmRleCA/IHN1bW1hcnkgOiByb3cpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb3RoZXJzQXQgPSB2aWV3Lm1pbmUgPyByb3dzLmZpbmRJbmRleCgocm93KSA9PiAhcm93Lm1pbmUpIDogLTE7XG5cbiAgICAgIHJldHVybiBvdGhlcnNBdCA8IDBcbiAgICAgICAgPyBbLi4ucm93cywgc3VtbWFyeV1cbiAgICAgICAgOiBbLi4ucm93cy5zbGljZSgwLCBvdGhlcnNBdCksIHN1bW1hcnksIC4uLnJvd3Muc2xpY2Uob3RoZXJzQXQpXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSBsaXN0LCByZWFkIGZvciBgcmVwb3J0YDsgbnVsbCB3aGVuIGl0IGNhbm5vdCBiZSByZWFkLiBJdHMgYW5zd2VyIGlzXG4gIC8vIGtlcHQgb25seSB3aGlsZSB0aGUgcmVwb3J0IGlzIHN0aWxsIHRoZSBvcGVuIG9uZS5cbiAgcHJpdmF0ZSBfcmVhZFZpZXdzKHJlcG9ydDogUmVwb3J0KTogT2JzZXJ2YWJsZTxSZXBvcnRWaWV3cyB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS52aWV3cyhyZXBvcnQuaWQsIHsgY29udGV4dDogbmV3IEh0dHBDb250ZXh0KCkuc2V0KERpc3BsYXlBcGlFcnJvciwgZmFsc2UpIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSksXG4gICAgICAgIHRhcCgobGlzdCkgPT4ge1xuICAgICAgICAgIGlmIChsaXN0ICYmIHJlcG9ydC5pZCA9PT0gdGhpcy5fcmVwb3J0SWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdzLnNldChsaXN0LnZpZXdzID8/IFtdKTtcbiAgICAgICAgICAgIHRoaXMuX2NhblNoYXJlLnNldCghIWxpc3QuY2FuU2hhcmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbn1cblxuXG4vLyBBIHZpZXcncyByb3cgYXMgdGhlIGxpc3QgaG9sZHMgaXQ6IG5hbWVzIGFuZCBmbGFncywgbm8gY29uZmlnLlxuZnVuY3Rpb24gdmlld1N1bW1hcnkodmlldzogUmVwb3J0Vmlldyk6IFJlcG9ydFZpZXdTdW1tYXJ5IHtcbiAgcmV0dXJuIHtcbiAgICBpZDogdmlldy5pZCxcbiAgICBuYW1lOiB2aWV3Lm5hbWUsXG4gICAgc2hhcmVkOiB2aWV3LnNoYXJlZCxcbiAgICBtaW5lOiB2aWV3Lm1pbmUsXG4gICAgcGVyc29uYWxEZWZhdWx0OiB2aWV3LnBlcnNvbmFsRGVmYXVsdCxcbiAgICBvd25lck5hbWU6IHZpZXcub3duZXJOYW1lLFxuICAgIGNhbkNoYW5nZTogdmlldy5jYW5DaGFuZ2UsXG4gICAgY2FuRGVsZXRlOiB2aWV3LmNhbkRlbGV0ZSxcbiAgICBtb2RpZnlEYXRlOiB2aWV3Lm1vZGlmeURhdGUsXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,127 @@
1
+ import { isMatchAnyGroup } from './report-filter-items';
2
+ import { isTile } from './report-tile';
3
+ import { isChartGranularity } from './report-view-config';
4
+ // Whether a component is a chart on a time x-axis: the only component the
5
+ // report's group-by grain applies to. A deliberate mirror of the server's
6
+ // ReportQueryRunner::_isTimeSeriesChart, which is canonical and drops the
7
+ // grain for every other component; kept so a product pinned to an older
8
+ // framework does not re-bucket a non-time chart.
9
+ export function isTimeSeriesChart(component) {
10
+ return component.type === 'chart' && component.config?.xAxis?.kind === 'time';
11
+ }
12
+ // The interaction state one tile's data request carries, read off a view
13
+ // document of the screen (the state service's snapshot()): the group-by grain
14
+ // for a time-series chart, a list's sort, search and hidden columns, a
15
+ // chart's drill path, and, while the groups match 'any', the groups that
16
+ // combine (matchAnyGroupIds). The tile on screen, its CSV, the PDF and
17
+ // PowerPoint collector and the zip all build their state here, so a file
18
+ // always holds what the screen shows. A list's paging is the caller's. Never
19
+ // sets unchangedIfUnreached: that belongs to an on-screen refetch alone.
20
+ //
21
+ // A drill path and the grain may both be sent: the server lets the drilled
22
+ // level win, and a server that does not drill keeps the grain.
23
+ export function tileDataState(report, component, snapshot) {
24
+ const state = {};
25
+ if (!isTile(component)) {
26
+ return state;
27
+ }
28
+ const tile = snapshot.tiles?.[component.id];
29
+ if (isTimeSeriesChart(component) && isChartGranularity(snapshot.groupBy)) {
30
+ state.frequency = snapshot.groupBy;
31
+ }
32
+ if (component.type === 'list') {
33
+ if (tile?.sort?.column) {
34
+ state.sort = { ...tile.sort };
35
+ }
36
+ if (tile?.search) {
37
+ state.search = tile.search;
38
+ }
39
+ if (tile?.hidden?.length) {
40
+ state.hiddenColumns = [...tile.hidden];
41
+ }
42
+ }
43
+ if (component.type === 'chart' && tile?.drill?.length) {
44
+ state.drill = tile.drill.map((step) => ({ ...step }));
45
+ }
46
+ const matchAnyGroupIds = tileMatchAnyGroupIds(report, component, snapshot);
47
+ if (matchAnyGroupIds.length) {
48
+ state.matchAnyGroupIds = matchAnyGroupIds;
49
+ }
50
+ return state;
51
+ }
52
+ // Each tile's state for the zip export (tileDataState), by component id: the
53
+ // tiles of every page, or of `pageId` alone. The zip holds no header or
54
+ // footer tile. A tile with nothing to send is left out, so an untouched report
55
+ // sends no states at all.
56
+ export function zipExportStates(report, snapshot, pageId = null) {
57
+ const states = {};
58
+ (report.pages ?? [])
59
+ .filter((page) => !pageId || page.id === pageId)
60
+ .flatMap((page) => page.components ?? [])
61
+ .forEach((component) => {
62
+ const state = tileDataState(report, component, snapshot);
63
+ if (Object.keys(state).length) {
64
+ states[component.id] = state;
65
+ }
66
+ });
67
+ return states;
68
+ }
69
+ // The groups a tile's 'any' combines, in id order: while the snapshot's
70
+ // match is 'any', every eligible group that holds a value. A group the tile
71
+ // has no member of is listed too, so the server can tell a tile that cannot
72
+ // test every group (it then applies none of them and says so). A page group
73
+ // counts only for the tiles of its own page: it is in the report bar of no
74
+ // other page. A header or footer tile is a tile of the page on screen.
75
+ function tileMatchAnyGroupIds(report, component, snapshot) {
76
+ if (!report) {
77
+ return [];
78
+ }
79
+ return matchAnyGroupIdsOnPage(report, tilePageId(report, component, snapshot), snapshot);
80
+ }
81
+ // The groups a layer's inline values combine (the page values request's
82
+ // matchAnyGroupIds), by the tile rule (tileDataState): while the snapshot's
83
+ // match is 'any', every eligible group that holds a value, in id order. A
84
+ // value has no member of some of them, and the server then applies none of
85
+ // them to it, as it does for such a tile. `layerId` is the page the values
86
+ // sit on; the header and footer's values (any other id) are values of the
87
+ // page on screen, as a header or footer tile is.
88
+ export function valuesMatchAnyGroupIds(report, layerId, snapshot) {
89
+ if (!report) {
90
+ return [];
91
+ }
92
+ const page = (report.pages ?? []).find((candidate) => candidate.id === layerId);
93
+ return matchAnyGroupIdsOnPage(report, page?.id ?? snapshot.pageId ?? null, snapshot);
94
+ }
95
+ // While the snapshot's match is 'any': the eligible groups of the report bar
96
+ // on `pageId` that hold a value, in id order.
97
+ function matchAnyGroupIdsOnPage(report, pageId, snapshot) {
98
+ if (snapshot.match !== 'any') {
99
+ return [];
100
+ }
101
+ return (report.filterGroups ?? [])
102
+ .filter((group) => isMatchAnyGroup(group, pageId) && holdsValue(snapshot.groups?.[group.id]))
103
+ .map((group) => group.id)
104
+ .sort((a, b) => a - b);
105
+ }
106
+ // The page a tile is drawn on: its own page, or, for a header or footer
107
+ // tile, the page on screen. Null when neither is known. An inline value's
108
+ // page is the page whose values hold it, the same way.
109
+ export function tilePageId(report, component, snapshot) {
110
+ const page = (report.pages ?? [])
111
+ .find((candidate) => [...(candidate.components ?? []), ...(candidate.values ?? [])]
112
+ .some((item) => item.id === component.id));
113
+ return page?.id ?? snapshot.pageId ?? null;
114
+ }
115
+ // Whether a group's stored value holds something a request sends: picks to
116
+ // keep or leave out, text, or a number range end (0 is an end).
117
+ function holdsValue(value) {
118
+ if (!value) {
119
+ return false;
120
+ }
121
+ return !!value.values?.length
122
+ || !!value.excludeValues?.length
123
+ || (typeof value.value === 'string' && !!value.value.trim())
124
+ || Number.isFinite(value.min)
125
+ || Number.isFinite(value.max);
126
+ }
127
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlsZS1kYXRhLXN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3RpbGUtZGF0YS1zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUcxRCwwRUFBMEU7QUFDMUUsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSx3RUFBd0U7QUFDeEUsaURBQWlEO0FBQ2pELE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxTQUEwQjtJQUMxRCxPQUFPLFNBQVMsQ0FBQyxJQUFJLEtBQUssT0FBTyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksS0FBSyxNQUFNLENBQUM7QUFDaEYsQ0FBQztBQUdELHlFQUF5RTtBQUN6RSw4RUFBOEU7QUFDOUUsdUVBQXVFO0FBQ3ZFLHlFQUF5RTtBQUN6RSx1RUFBdUU7QUFDdkUseUVBQXlFO0FBQ3pFLDZFQUE2RTtBQUM3RSx5RUFBeUU7QUFDekUsRUFBRTtBQUNGLDJFQUEyRTtBQUMzRSwrREFBK0Q7QUFDL0QsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsTUFBcUIsRUFDckIsU0FBMEIsRUFDMUIsUUFBMEI7SUFFMUIsTUFBTSxLQUFLLEdBQXVCLEVBQUUsQ0FBQztJQUVyQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDdkIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUU1QyxJQUFJLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxJQUFJLGtCQUFrQixDQUFDLFFBQVEs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Jy4vaW50ZXJmYWNlcy9yZXBvcnQtdmlldy1jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIENvbXBvbmVudERhdGFTdGF0ZSxcbiAgRmlsdGVyR3JvdXBEZWZhdWx0LFxuICBSZXBvcnQsXG4gIFJlcG9ydENvbXBvbmVudCxcbn0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgaXNNYXRjaEFueUdyb3VwIH0gZnJvbSAnLi9yZXBvcnQtZmlsdGVyLWl0ZW1zJztcbmltcG9ydCB7IGlzVGlsZSB9IGZyb20gJy4vcmVwb3J0LXRpbGUnO1xuaW1wb3J0IHsgaXNDaGFydEdyYW51bGFyaXR5IH0gZnJvbSAnLi9yZXBvcnQtdmlldy1jb25maWcnO1xuXG5cbi8vIFdoZXRoZXIgYSBjb21wb25lbnQgaXMgYSBjaGFydCBvbiBhIHRpbWUgeC1heGlzOiB0aGUgb25seSBjb21wb25lbnQgdGhlXG4vLyByZXBvcnQncyBncm91cC1ieSBncmFpbiBhcHBsaWVzIHRvLiBBIGRlbGliZXJhdGUgbWlycm9yIG9mIHRoZSBzZXJ2ZXInc1xuLy8gUmVwb3J0UXVlcnlSdW5uZXI6Ol9pc1RpbWVTZXJpZXNDaGFydCwgd2hpY2ggaXMgY2Fub25pY2FsIGFuZCBkcm9wcyB0aGVcbi8vIGdyYWluIGZvciBldmVyeSBvdGhlciBjb21wb25lbnQ7IGtlcHQgc28gYSBwcm9kdWN0IHBpbm5lZCB0byBhbiBvbGRlclxuLy8gZnJhbWV3b3JrIGRvZXMgbm90IHJlLWJ1Y2tldCBhIG5vbi10aW1lIGNoYXJ0LlxuZXhwb3J0IGZ1bmN0aW9uIGlzVGltZVNlcmllc0NoYXJ0KGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50KTogYm9vbGVhbiB7XG4gIHJldHVybiBjb21wb25lbnQudHlwZSA9PT0gJ2NoYXJ0JyAmJiBjb21wb25lbnQuY29uZmlnPy54QXhpcz8ua2luZCA9PT0gJ3RpbWUnO1xufVxuXG5cbi8vIFRoZSBpbnRlcmFjdGlvbiBzdGF0ZSBvbmUgdGlsZSdzIGRhdGEgcmVxdWVzdCBjYXJyaWVzLCByZWFkIG9mZiBhIHZpZXdcbi8vIGRvY3VtZW50IG9mIHRoZSBzY3JlZW4gKHRoZSBzdGF0ZSBzZXJ2aWNlJ3Mgc25hcHNob3QoKSk6IHRoZSBncm91cC1ieSBncmFpblxuLy8gZm9yIGEgdGltZS1zZXJpZXMgY2hhcnQsIGEgbGlzdCdzIHNvcnQsIHNlYXJjaCBhbmQgaGlkZGVuIGNvbHVtbnMsIGFcbi8vIGNoYXJ0J3MgZHJpbGwgcGF0aCwgYW5kLCB3aGlsZSB0aGUgZ3JvdXBzIG1hdGNoICdhbnknLCB0aGUgZ3JvdXBzIHRoYXRcbi8vIGNvbWJpbmUgKG1hdGNoQW55R3JvdXBJZHMpLiBUaGUgdGlsZSBvbiBzY3JlZW4sIGl0cyBDU1YsIHRoZSBQREYgYW5kXG4vLyBQb3dlclBvaW50IGNvbGxlY3RvciBhbmQgdGhlIHppcCBhbGwgYnVpbGQgdGhlaXIgc3RhdGUgaGVyZSwgc28gYSBmaWxlXG4vLyBhbHdheXMgaG9sZHMgd2hhdCB0aGUgc2NyZWVuIHNob3dzLiBBIGxpc3QncyBwYWdpbmcgaXMgdGhlIGNhbGxlcidzLiBOZXZlclxuLy8gc2V0cyB1bmNoYW5nZWRJZlVucmVhY2hlZDogdGhhdCBiZWxvbmdzIHRvIGFuIG9uLXNjcmVlbiByZWZldGNoIGFsb25lLlxuLy9cbi8vIEEgZHJpbGwgcGF0aCBhbmQgdGhlIGdyYWluIG1heSBib3RoIGJlIHNlbnQ6IHRoZSBzZXJ2ZXIgbGV0cyB0aGUgZHJpbGxlZFxuLy8gbGV2ZWwgd2luLCBhbmQgYSBzZXJ2ZXIgdGhhdCBkb2VzIG5vdCBkcmlsbCBrZWVwcyB0aGUgZ3JhaW4uXG5leHBvcnQgZnVuY3Rpb24gdGlsZURhdGFTdGF0ZShcbiAgcmVwb3J0OiBSZXBvcnQgfCBudWxsLFxuICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCxcbiAgc25hcHNob3Q6IFJlcG9ydFZpZXdDb25maWcsXG4pOiBDb21wb25lbnREYXRhU3RhdGUge1xuICBjb25zdCBzdGF0ZTogQ29tcG9uZW50RGF0YVN0YXRlID0ge307XG5cbiAgaWYgKCFpc1RpbGUoY29tcG9uZW50KSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IHRpbGUgPSBzbmFwc2hvdC50aWxlcz8uW2NvbXBvbmVudC5pZF07XG5cbiAgaWYgKGlzVGltZVNlcmllc0NoYXJ0KGNvbXBvbmVudCkgJiYgaXNDaGFydEdyYW51bGFyaXR5KHNuYXBzaG90Lmdyb3VwQnkpKSB7XG4gICAgc3RhdGUuZnJlcXVlbmN5ID0gc25hcHNob3QuZ3JvdXBCeTtcbiAgfVxuXG4gIGlmIChjb21wb25lbnQudHlwZSA9PT0gJ2xpc3QnKSB7XG4gICAgaWYgKHRpbGU/LnNvcnQ/LmNvbHVtbikge1xuICAgICAgc3RhdGUuc29ydCA9IHsgLi4udGlsZS5zb3J0IH07XG4gICAgfVxuICAgIGlmICh0aWxlPy5zZWFyY2gpIHtcbiAgICAgIHN0YXRlLnNlYXJjaCA9IHRpbGUuc2VhcmNoO1xuICAgIH1cbiAgICBpZiAodGlsZT8uaGlkZGVuPy5sZW5ndGgpIHtcbiAgICAgIHN0YXRlLmhpZGRlbkNvbHVtbnMgPSBbLi4udGlsZS5oaWRkZW5dO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjb21wb25lbnQudHlwZSA9PT0gJ2NoYXJ0JyAmJiB0aWxlPy5kcmlsbD8ubGVuZ3RoKSB7XG4gICAgc3RhdGUuZHJpbGwgPSB0aWxlLmRyaWxsLm1hcCgoc3RlcCkgPT4gKHsgLi4uc3RlcCB9KSk7XG4gIH1cblxuICBjb25zdCBtYXRjaEFueUdyb3VwSWRzID0gdGlsZU1hdGNoQW55R3JvdXBJZHMocmVwb3J0LCBjb21wb25lbnQsIHNuYXBzaG90KTtcbiAgaWYgKG1hdGNoQW55R3JvdXBJZHMubGVuZ3RoKSB7XG4gICAgc3RhdGUubWF0Y2hBbnlHcm91cElkcyA9IG1hdGNoQW55R3JvdXBJZHM7XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cblxuLy8gRWFjaCB0aWxlJ3Mgc3RhdGUgZm9yIHRoZSB6aXAgZXhwb3J0ICh0aWxlRGF0YVN0YXRlKSwgYnkgY29tcG9uZW50IGlkOiB0aGVcbi8vIHRpbGVzIG9mIGV2ZXJ5IHBhZ2UsIG9yIG9mIGBwYWdlSWRgIGFsb25lLiBUaGUgemlwIGhvbGRzIG5vIGhlYWRlciBvclxuLy8gZm9vdGVyIHRpbGUuIEEgdGlsZSB3aXRoIG5vdGhpbmcgdG8gc2VuZCBpcyBsZWZ0IG91dCwgc28gYW4gdW50b3VjaGVkIHJlcG9ydFxuLy8gc2VuZHMgbm8gc3RhdGVzIGF0IGFsbC5cbmV4cG9ydCBmdW5jdGlvbiB6aXBFeHBvcnRTdGF0ZXMoXG4gIHJlcG9ydDogUmVwb3J0LFxuICBzbmFwc2hvdDogUmVwb3J0Vmlld0NvbmZpZyxcbiAgcGFnZUlkOiBudW1iZXIgfCBudWxsID0gbnVsbCxcbik6IFJlY29yZDxudW1iZXIsIENvbXBvbmVudERhdGFTdGF0ZT4ge1xuICBjb25zdCBzdGF0ZXM6IFJlY29yZDxudW1iZXIsIENvbXBvbmVudERhdGFTdGF0ZT4gPSB7fTtcblxuICAocmVwb3J0LnBhZ2VzID8/IFtdKVxuICAgIC5maWx0ZXIoKHBhZ2UpID0+ICFwYWdlSWQgfHwgcGFnZS5pZCA9PT0gcGFnZUlkKVxuICAgIC5mbGF0TWFwKChwYWdlKSA9PiBwYWdlLmNvbXBvbmVudHMgPz8gW10pXG4gICAgLmZvckVhY2goKGNvbXBvbmVudCkgPT4ge1xuICAgICAgY29uc3Qgc3RhdGUgPSB0aWxlRGF0YVN0YXRlKHJlcG9ydCwgY29tcG9uZW50LCBzbmFwc2hvdCk7XG5cbiAgICAgIGlmIChPYmplY3Qua2V5cyhzdGF0ZSkubGVuZ3RoKSB7XG4gICAgICAgIHN0YXRlc1tjb21wb25lbnQuaWRdID0gc3RhdGU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgcmV0dXJuIHN0YXRlcztcbn1cblxuXG4vLyBUaGUgZ3JvdXBzIGEgdGlsZSdzICdhbnknIGNvbWJpbmVzLCBpbiBpZCBvcmRlcjogd2hpbGUgdGhlIHNuYXBzaG90J3Ncbi8vIG1hdGNoIGlzICdhbnknLCBldmVyeSBlbGlnaWJsZSBncm91cCB0aGF0IGhvbGRzIGEgdmFsdWUuIEEgZ3JvdXAgdGhlIHRpbGVcbi8vIGhhcyBubyBtZW1iZXIgb2YgaXMgbGlzdGVkIHRvbywgc28gdGhlIHNlcnZlciBjYW4gdGVsbCBhIHRpbGUgdGhhdCBjYW5ub3Rcbi8vIHRlc3QgZXZlcnkgZ3JvdXAgKGl0IHRoZW4gYXBwbGllcyBub25lIG9mIHRoZW0gYW5kIHNheXMgc28pLiBBIHBhZ2UgZ3JvdXBcbi8vIGNvdW50cyBvbmx5IGZvciB0aGUgdGlsZXMgb2YgaXRzIG93biBwYWdlOiBpdCBpcyBpbiB0aGUgcmVwb3J0IGJhciBvZiBub1xuLy8gb3RoZXIgcGFnZS4gQSBoZWFkZXIgb3IgZm9vdGVyIHRpbGUgaXMgYSB0aWxlIG9mIHRoZSBwYWdlIG9uIHNjcmVlbi5cbmZ1bmN0aW9uIHRpbGVNYXRjaEFueUdyb3VwSWRzKHJlcG9ydDogUmVwb3J0IHwgbnVsbCwgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIHNuYXBzaG90OiBSZXBvcnRWaWV3Q29uZmlnKTogbnVtYmVyW10ge1xuICBpZiAoIXJlcG9ydCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBtYXRjaEFueUdyb3VwSWRzT25QYWdlKHJlcG9ydCwgdGlsZVBhZ2VJZChyZXBvcnQsIGNvbXBvbmVudCwgc25hcHNob3QpLCBzbmFwc2hvdCk7XG59XG5cblxuLy8gVGhlIGdyb3VwcyBhIGxheWVyJ3MgaW5saW5lIHZhbHVlcyBjb21iaW5lICh0aGUgcGFnZSB2YWx1ZXMgcmVxdWVzdCdzXG4vLyBtYXRjaEFueUdyb3VwSWRzKSwgYnkgdGhlIHRpbGUgcnVsZSAodGlsZURhdGFTdGF0ZSk6IHdoaWxlIHRoZSBzbmFwc2hvdCdzXG4vLyBtYXRjaCBpcyAnYW55JywgZXZlcnkgZWxpZ2libGUgZ3JvdXAgdGhhdCBob2xkcyBhIHZhbHVlLCBpbiBpZCBvcmRlci4gQVxuLy8gdmFsdWUgaGFzIG5vIG1lbWJlciBvZiBzb21lIG9mIHRoZW0sIGFuZCB0aGUgc2VydmVyIHRoZW4gYXBwbGllcyBub25lIG9mXG4vLyB0aGVtIHRvIGl0LCBhcyBpdCBkb2VzIGZvciBzdWNoIGEgdGlsZS4gYGxheWVySWRgIGlzIHRoZSBwYWdlIHRoZSB2YWx1ZXNcbi8vIHNpdCBvbjsgdGhlIGhlYWRlciBhbmQgZm9vdGVyJ3MgdmFsdWVzIChhbnkgb3RoZXIgaWQpIGFyZSB2YWx1ZXMgb2YgdGhlXG4vLyBwYWdlIG9uIHNjcmVlbiwgYXMgYSBoZWFkZXIgb3IgZm9vdGVyIHRpbGUgaXMuXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVzTWF0Y2hBbnlHcm91cElkcyhcbiAgcmVwb3J0OiBSZXBvcnQgfCBudWxsLFxuICBsYXllcklkOiBudW1iZXIgfCBudWxsLFxuICBzbmFwc2hvdDogUmVwb3J0Vmlld0NvbmZpZyxcbik6IG51bWJlcltdIHtcbiAgaWYgKCFyZXBvcnQpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBwYWdlID0gKHJlcG9ydC5wYWdlcyA/PyBbXSkuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT09IGxheWVySWQpO1xuXG4gIHJldHVybiBtYXRjaEFueUdyb3VwSWRzT25QYWdlKHJlcG9ydCwgcGFnZT8uaWQgPz8gc25hcHNob3QucGFnZUlkID8/IG51bGwsIHNuYXBzaG90KTtcbn1cblxuXG4vLyBXaGlsZSB0aGUgc25hcHNob3QncyBtYXRjaCBpcyAnYW55JzogdGhlIGVsaWdpYmxlIGdyb3VwcyBvZiB0aGUgcmVwb3J0IGJhclxuLy8gb24gYHBhZ2VJZGAgdGhhdCBob2xkIGEgdmFsdWUsIGluIGlkIG9yZGVyLlxuZnVuY3Rpb24gbWF0Y2hBbnlHcm91cElkc09uUGFnZShyZXBvcnQ6IFJlcG9ydCwgcGFnZUlkOiBudW1iZXIgfCBudWxsLCBzbmFwc2hvdDogUmVwb3J0Vmlld0NvbmZpZyk6IG51bWJlcltdIHtcbiAgaWYgKHNuYXBzaG90Lm1hdGNoICE9PSAnYW55Jykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiAocmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXSlcbiAgICAuZmlsdGVyKChncm91cCkgPT4gaXNNYXRjaEFueUdyb3VwKGdyb3VwLCBwYWdlSWQpICYmIGhvbGRzVmFsdWUoc25hcHNob3QuZ3JvdXBzPy5bZ3JvdXAuaWRdKSlcbiAgICAubWFwKChncm91cCkgPT4gZ3JvdXAuaWQpXG4gICAgLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbn1cblxuXG4vLyBUaGUgcGFnZSBhIHRpbGUgaXMgZHJhd24gb246IGl0cyBvd24gcGFnZSwgb3IsIGZvciBhIGhlYWRlciBvciBmb290ZXJcbi8vIHRpbGUsIHRoZSBwYWdlIG9uIHNjcmVlbi4gTnVsbCB3aGVuIG5laXRoZXIgaXMga25vd24uIEFuIGlubGluZSB2YWx1ZSdzXG4vLyBwYWdlIGlzIHRoZSBwYWdlIHdob3NlIHZhbHVlcyBob2xkIGl0LCB0aGUgc2FtZSB3YXkuXG5leHBvcnQgZnVuY3Rpb24gdGlsZVBhZ2VJZChyZXBvcnQ6IFJlcG9ydCwgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIHNuYXBzaG90OiBSZXBvcnRWaWV3Q29uZmlnKTogbnVtYmVyIHwgbnVsbCB7XG4gIGNvbnN0IHBhZ2UgPSAocmVwb3J0LnBhZ2VzID8/IFtdKVxuICAgIC5maW5kKChjYW5kaWRhdGUpID0+IFsuLi4oY2FuZGlkYXRlLmNvbXBvbmVudHMgPz8gW10pLCAuLi4oY2FuZGlkYXRlLnZhbHVlcyA/PyBbXSldXG4gICAgICAuc29tZSgoaXRlbSkgPT4gaXRlbS5pZCA9PT0gY29tcG9uZW50LmlkKSk7XG5cbiAgcmV0dXJuIHBhZ2U/LmlkID8/IHNuYXBzaG90LnBhZ2VJZCA/PyBudWxsO1xufVxuXG5cbi8vIFdoZXRoZXIgYSBncm91cCdzIHN0b3JlZCB2YWx1ZSBob2xkcyBzb21ldGhpbmcgYSByZXF1ZXN0IHNlbmRzOiBwaWNrcyB0b1xuLy8ga2VlcCBvciBsZWF2ZSBvdXQsIHRleHQsIG9yIGEgbnVtYmVyIHJhbmdlIGVuZCAoMCBpcyBhbiBlbmQpLlxuZnVuY3Rpb24gaG9sZHNWYWx1ZSh2YWx1ZTogRmlsdGVyR3JvdXBEZWZhdWx0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuICEhdmFsdWUudmFsdWVzPy5sZW5ndGhcbiAgICB8fCAhIXZhbHVlLmV4Y2x1ZGVWYWx1ZXM/Lmxlbmd0aFxuICAgIHx8ICh0eXBlb2YgdmFsdWUudmFsdWUgPT09ICdzdHJpbmcnICYmICEhdmFsdWUudmFsdWUudHJpbSgpKVxuICAgIHx8IE51bWJlci5pc0Zpbml0ZSh2YWx1ZS5taW4pXG4gICAgfHwgTnVtYmVyLmlzRmluaXRlKHZhbHVlLm1heCk7XG59XG4iXX0=
@@ -0,0 +1,38 @@
1
+ import { catchError, filter, map, merge, of, switchMap, timer } from 'rxjs';
2
+ // A sweep of changes (a few filters set in a row, every value of an applied
3
+ // view) settles for this long before a tile refetches, so the sweep costs one
4
+ // request, not one per change.
5
+ export const TILE_REFRESH_DEBOUNCE_MS = 300;
6
+ // A tile's data as one stream: the first load at once, then one load per
7
+ // settled burst of refresh triggers.
8
+ //
9
+ // - Each trigger starts over (switchMap): it cancels the wait for the one
10
+ // before it and the request in flight, then waits for the sweep to settle.
11
+ // So an answer to an older request never lands, not even while the next
12
+ // load still waits, and the bar stays on until the settled load answers.
13
+ // - Each load notes the state version it was sent under (stateVersion), and
14
+ // its answer is dropped when the version has moved since. apply() and
15
+ // resetToBase() move the version and announce a full change together, so
16
+ // the load for the new state is already on its way.
17
+ // - A failed load ends only itself: its message comes through as the answer,
18
+ // and the next trigger loads again.
19
+ export function tileLoads(refresh$, load, version) {
20
+ return merge(of(0), refresh$.pipe(map(() => TILE_REFRESH_DEBOUNCE_MS)))
21
+ .pipe(switchMap((wait) => (wait ? timer(wait) : of(0))
22
+ .pipe(switchMap(() => oneLoad(load, version)))));
23
+ }
24
+ // One request: its answer, or its failure as a message, dropped when the
25
+ // state version moved while it was out.
26
+ function oneLoad(load, version) {
27
+ const sentAt = version();
28
+ return load()
29
+ .pipe(map((data) => ({ data, error: null })), catchError((error) => of({ data: null, error: loadErrorMessage(error) })), filter(() => version() === sentAt));
30
+ }
31
+ // What a failed request says: the server's message, else the error's own,
32
+ // else a plain fallback.
33
+ function loadErrorMessage(error) {
34
+ const failure = error;
35
+ const message = failure?.error?.message ?? failure?.message;
36
+ return typeof message === 'string' && message ? message : 'Failed to load data';
37
+ }
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlsZS1sb2Fkcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy90aWxlLWxvYWRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxVQUFVLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFLeEYsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrQkFBK0I7QUFDL0IsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsR0FBRyxDQUFDO0FBRTVDLHlFQUF5RTtBQUN6RSxxQ0FBcUM7QUFDckMsRUFBRTtBQUNGLDBFQUEwRTtBQUMxRSw2RUFBNkU7QUFDN0UsMEVBQTBFO0FBQzFFLDJFQUEyRTtBQUMzRSw0RUFBNEU7QUFDNUUsd0VBQXdFO0FBQ3hFLDJFQUEyRTtBQUMzRSxzREFBc0Q7QUFDdEQsNkVBQTZFO0FBQzdFLHNDQUFzQztBQUN0QyxNQUFNLFVBQVUsU0FBUyxDQUN2QixRQUE2QixFQUM3QixJQUF5QixFQUN6QixPQUFxQjtJQUVyQixPQUFPLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDO1NBQ3BFLElBQUksQ0FDSCxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM3QyxJQUFJLENBQ0gsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FDeEMsQ0FBQyxDQUNMLENBQUM7QUFDTixDQUFDO0FBRUQseUVBQXlFO0FBQ3pFLHdDQUF3QztBQUN4QyxTQUFTLE9BQU8sQ0FBSSxJQUF5QixFQUFFLE9BQXFCO0lBQ2xFLE1BQU0sTUFBTSxHQUFHLE9BQU8sRUFBRSxDQUFDO0lBRXpCLE9BQU8sSUFBSSxFQUFFO1NBQ1YsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBcUIsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFDekQsVUFBVSxDQUFDLENBQUMsS0FBYyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQW9CLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ3JHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FDbkMsQ0FBQztBQUNOLENBQUM7QUFFRCwwRUFBMEU7QUFDMUUseUJBQXlCO0FBQ3pCLFNBQVMsZ0JBQWdCLENBQUMsS0FBYztJQUN0QyxNQUFNLE9BQU8sR0FBRyxLQUFvRSxDQUFDO0lBQ3JGLE1BQU0sT0FBTyxHQUFHLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLE9BQU8sRUFBRSxPQUFPLENBQUM7SUFFNUQsT0FBTyxPQUFPLE9BQU8sS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDO0FBQ2xGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBjYXRjaEVycm9yLCBmaWx0ZXIsIG1hcCwgbWVyZ2UsIG9mLCBzd2l0Y2hNYXAsIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFRpbGVMb2FkUmVzdWx0IH0gZnJvbSAnLi9pbnRlcmZhY2VzL3RpbGUtbG9hZC1yZXN1bHQuaW50ZXJmYWNlJztcblxuXG4vLyBBIHN3ZWVwIG9mIGNoYW5nZXMgKGEgZmV3IGZpbHRlcnMgc2V0IGluIGEgcm93LCBldmVyeSB2YWx1ZSBvZiBhbiBhcHBsaWVkXG4vLyB2aWV3KSBzZXR0bGVzIGZvciB0aGlzIGxvbmcgYmVmb3JlIGEgdGlsZSByZWZldGNoZXMsIHNvIHRoZSBzd2VlcCBjb3N0cyBvbmVcbi8vIHJlcXVlc3QsIG5vdCBvbmUgcGVyIGNoYW5nZS5cbmV4cG9ydCBjb25zdCBUSUxFX1JFRlJFU0hfREVCT1VOQ0VfTVMgPSAzMDA7XG5cbi8vIEEgdGlsZSdzIGRhdGEgYXMgb25lIHN0cmVhbTogdGhlIGZpcnN0IGxvYWQgYXQgb25jZSwgdGhlbiBvbmUgbG9hZCBwZXJcbi8vIHNldHRsZWQgYnVyc3Qgb2YgcmVmcmVzaCB0cmlnZ2Vycy5cbi8vXG4vLyAtIEVhY2ggdHJpZ2dlciBzdGFydHMgb3ZlciAoc3dpdGNoTWFwKTogaXQgY2FuY2VscyB0aGUgd2FpdCBmb3IgdGhlIG9uZVxuLy8gICBiZWZvcmUgaXQgYW5kIHRoZSByZXF1ZXN0IGluIGZsaWdodCwgdGhlbiB3YWl0cyBmb3IgdGhlIHN3ZWVwIHRvIHNldHRsZS5cbi8vICAgU28gYW4gYW5zd2VyIHRvIGFuIG9sZGVyIHJlcXVlc3QgbmV2ZXIgbGFuZHMsIG5vdCBldmVuIHdoaWxlIHRoZSBuZXh0XG4vLyAgIGxvYWQgc3RpbGwgd2FpdHMsIGFuZCB0aGUgYmFyIHN0YXlzIG9uIHVudGlsIHRoZSBzZXR0bGVkIGxvYWQgYW5zd2Vycy5cbi8vIC0gRWFjaCBsb2FkIG5vdGVzIHRoZSBzdGF0ZSB2ZXJzaW9uIGl0IHdhcyBzZW50IHVuZGVyIChzdGF0ZVZlcnNpb24pLCBhbmRcbi8vICAgaXRzIGFuc3dlciBpcyBkcm9wcGVkIHdoZW4gdGhlIHZlcnNpb24gaGFzIG1vdmVkIHNpbmNlLiBhcHBseSgpIGFuZFxuLy8gICByZXNldFRvQmFzZSgpIG1vdmUgdGhlIHZlcnNpb24gYW5kIGFubm91bmNlIGEgZnVsbCBjaGFuZ2UgdG9nZXRoZXIsIHNvXG4vLyAgIHRoZSBsb2FkIGZvciB0aGUgbmV3IHN0YXRlIGlzIGFscmVhZHkgb24gaXRzIHdheS5cbi8vIC0gQSBmYWlsZWQgbG9hZCBlbmRzIG9ubHkgaXRzZWxmOiBpdHMgbWVzc2FnZSBjb21lcyB0aHJvdWdoIGFzIHRoZSBhbnN3ZXIsXG4vLyAgIGFuZCB0aGUgbmV4dCB0cmlnZ2VyIGxvYWRzIGFnYWluLlxuZXhwb3J0IGZ1bmN0aW9uIHRpbGVMb2FkczxUPihcbiAgcmVmcmVzaCQ6IE9ic2VydmFibGU8dW5rbm93bj4sXG4gIGxvYWQ6ICgpID0+IE9ic2VydmFibGU8VD4sXG4gIHZlcnNpb246ICgpID0+IG51bWJlcixcbik6IE9ic2VydmFibGU8VGlsZUxvYWRSZXN1bHQ8VD4+IHtcbiAgcmV0dXJuIG1lcmdlKG9mKDApLCByZWZyZXNoJC5waXBlKG1hcCgoKSA9PiBUSUxFX1JFRlJFU0hfREVCT1VOQ0VfTVMpKSlcbiAgICAucGlwZShcbiAgICAgIHN3aXRjaE1hcCgod2FpdCkgPT4gKHdhaXQgPyB0aW1lcih3YWl0KSA6IG9mKDApKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gb25lTG9hZChsb2FkLCB2ZXJzaW9uKSksXG4gICAgICAgICkpLFxuICAgICk7XG59XG5cbi8vIE9uZSByZXF1ZXN0OiBpdHMgYW5zd2VyLCBvciBpdHMgZmFpbHVyZSBhcyBhIG1lc3NhZ2UsIGRyb3BwZWQgd2hlbiB0aGVcbi8vIHN0YXRlIHZlcnNpb24gbW92ZWQgd2hpbGUgaXQgd2FzIG91dC5cbmZ1bmN0aW9uIG9uZUxvYWQ8VD4obG9hZDogKCkgPT4gT2JzZXJ2YWJsZTxUPiwgdmVyc2lvbjogKCkgPT4gbnVtYmVyKTogT2JzZXJ2YWJsZTxUaWxlTG9hZFJlc3VsdDxUPj4ge1xuICBjb25zdCBzZW50QXQgPSB2ZXJzaW9uKCk7XG5cbiAgcmV0dXJuIGxvYWQoKVxuICAgIC5waXBlKFxuICAgICAgbWFwKChkYXRhKTogVGlsZUxvYWRSZXN1bHQ8VD4gPT4gKHsgZGF0YSwgZXJyb3I6IG51bGwgfSkpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IHVua25vd24pID0+IG9mPFRpbGVMb2FkUmVzdWx0PFQ+Pih7IGRhdGE6IG51bGwsIGVycm9yOiBsb2FkRXJyb3JNZXNzYWdlKGVycm9yKSB9KSksXG4gICAgICBmaWx0ZXIoKCkgPT4gdmVyc2lvbigpID09PSBzZW50QXQpLFxuICAgICk7XG59XG5cbi8vIFdoYXQgYSBmYWlsZWQgcmVxdWVzdCBzYXlzOiB0aGUgc2VydmVyJ3MgbWVzc2FnZSwgZWxzZSB0aGUgZXJyb3IncyBvd24sXG4vLyBlbHNlIGEgcGxhaW4gZmFsbGJhY2suXG5mdW5jdGlvbiBsb2FkRXJyb3JNZXNzYWdlKGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgY29uc3QgZmFpbHVyZSA9IGVycm9yIGFzIHsgZXJyb3I/OiB7IG1lc3NhZ2U/OiB1bmtub3duIH07IG1lc3NhZ2U/OiB1bmtub3duIH0gfCBudWxsO1xuICBjb25zdCBtZXNzYWdlID0gZmFpbHVyZT8uZXJyb3I/Lm1lc3NhZ2UgPz8gZmFpbHVyZT8ubWVzc2FnZTtcblxuICByZXR1cm4gdHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnICYmIG1lc3NhZ2UgPyBtZXNzYWdlIDogJ0ZhaWxlZCB0byBsb2FkIGRhdGEnO1xufVxuIl19