@firestitch/report 18.10.2 → 18.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/app/reports/components/report-canvas/report-canvas.component.d.ts +0 -1
  2. package/app/reports/data/report.data.d.ts +8 -12
  3. package/app/reports/export/report-export-collector.service.d.ts +0 -1
  4. package/app/reports/export/report-filter-lines.d.ts +0 -2
  5. package/app/reports/interfaces/report-chat-viewer-state.interface.d.ts +0 -2
  6. package/app/reports/interfaces/report-export-snapshot.interface.d.ts +2 -3
  7. package/app/reports/interfaces/report-saved-filter-changes.interface.d.ts +4 -0
  8. package/app/reports/interfaces/report-saved-filter.interface.d.ts +6 -0
  9. package/app/reports/interfaces/{report-view-config.interface.d.ts → report-state-snapshot.interface.d.ts} +1 -2
  10. package/app/reports/interfaces/report-viewer-feature.type.d.ts +1 -1
  11. package/app/reports/report-chat-viewer-state.d.ts +3 -3
  12. package/app/reports/report-saved-filters.d.ts +3 -0
  13. package/app/reports/report-state.d.ts +15 -0
  14. package/app/reports/services/report-filter-state.service.d.ts +9 -25
  15. package/app/reports/tile-data-state.d.ts +5 -5
  16. package/app/reports/views/report/fs-ai-report.component.d.ts +10 -5
  17. package/esm2022/app/reports/canvas-landing-page.mjs +3 -3
  18. package/esm2022/app/reports/components/component-list/component-list.component.mjs +3 -3
  19. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +8 -12
  20. package/esm2022/app/reports/components/report-component/report-component.component.mjs +16 -21
  21. package/esm2022/app/reports/data/report.data.mjs +24 -41
  22. package/esm2022/app/reports/export/report-export-collector.service.mjs +11 -18
  23. package/esm2022/app/reports/export/report-filter-lines.mjs +5 -15
  24. package/esm2022/app/reports/filter-settings-rules.mjs +2 -2
  25. package/esm2022/app/reports/interfaces/canvas-landing-input.interface.mjs +1 -1
  26. package/esm2022/app/reports/interfaces/report-chat-viewer-state.interface.mjs +1 -1
  27. package/esm2022/app/reports/interfaces/report-export-snapshot.interface.mjs +1 -1
  28. package/esm2022/app/reports/interfaces/report-saved-filter-changes.interface.mjs +2 -0
  29. package/esm2022/app/reports/interfaces/report-saved-filter.interface.mjs +2 -0
  30. package/esm2022/app/reports/interfaces/report-state-snapshot.interface.mjs +2 -0
  31. package/esm2022/app/reports/interfaces/report-temporary-state.interface.mjs +1 -1
  32. package/esm2022/app/reports/interfaces/report-tile-state.interface.mjs +1 -1
  33. package/esm2022/app/reports/interfaces/report-viewer-feature.type.mjs +1 -1
  34. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  35. package/esm2022/app/reports/mark-click.mjs +2 -2
  36. package/esm2022/app/reports/report-chat-viewer-state.mjs +3 -3
  37. package/esm2022/app/reports/report-date-presets.mjs +2 -2
  38. package/esm2022/app/reports/report-saved-filters.mjs +92 -0
  39. package/esm2022/app/reports/report-state.mjs +169 -0
  40. package/esm2022/app/reports/report-viewer-features.mjs +2 -4
  41. package/esm2022/app/reports/services/report-filter-state.service.mjs +83 -310
  42. package/esm2022/app/reports/tile-data-state.mjs +4 -4
  43. package/esm2022/app/reports/tile-loads.mjs +5 -6
  44. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +165 -94
  45. package/esm2022/app/reports/views/report/report.component.mjs +14 -16
  46. package/esm2022/public_api.mjs +4 -8
  47. package/fesm2022/{firestitch-report-echarts-CyHkFToO.mjs → firestitch-report-echarts-DKXlgu1D.mjs} +2 -2
  48. package/fesm2022/{firestitch-report-echarts-CyHkFToO.mjs.map → firestitch-report-echarts-DKXlgu1D.mjs.map} +1 -1
  49. package/fesm2022/{firestitch-report-firestitch-report-DftB7M1o.mjs → firestitch-report-firestitch-report-Bnv62suw.mjs} +445 -1434
  50. package/fesm2022/firestitch-report-firestitch-report-Bnv62suw.mjs.map +1 -0
  51. package/fesm2022/firestitch-report.mjs +1 -1
  52. package/package.json +1 -1
  53. package/public_api.d.ts +3 -7
  54. package/app/reports/components/report-view-picker/report-view-picker.component.d.ts +0 -21
  55. package/app/reports/dialogs/report-view/report-view-dialog.component.d.ts +0 -13
  56. package/app/reports/interfaces/report-view-create.interface.d.ts +0 -7
  57. package/app/reports/interfaces/report-view-deleted.interface.d.ts +0 -4
  58. package/app/reports/interfaces/report-view-dialog-data.interface.d.ts +0 -7
  59. package/app/reports/interfaces/report-view-dropped.interface.d.ts +0 -5
  60. package/app/reports/interfaces/report-view-menu-item.interface.d.ts +0 -10
  61. package/app/reports/interfaces/report-view-summary.interface.d.ts +0 -11
  62. package/app/reports/interfaces/report-view.interface.d.ts +0 -7
  63. package/app/reports/interfaces/report-views.interface.d.ts +0 -7
  64. package/app/reports/report-view-config.d.ts +0 -34
  65. package/app/reports/report-view-menu.d.ts +0 -15
  66. package/app/reports/services/report-view.service.d.ts +0 -39
  67. package/esm2022/app/reports/components/report-view-picker/report-view-picker.component.mjs +0 -115
  68. package/esm2022/app/reports/dialogs/report-view/report-view-dialog.component.mjs +0 -52
  69. package/esm2022/app/reports/interfaces/report-view-config.interface.mjs +0 -2
  70. package/esm2022/app/reports/interfaces/report-view-create.interface.mjs +0 -2
  71. package/esm2022/app/reports/interfaces/report-view-deleted.interface.mjs +0 -2
  72. package/esm2022/app/reports/interfaces/report-view-dialog-data.interface.mjs +0 -2
  73. package/esm2022/app/reports/interfaces/report-view-dropped.interface.mjs +0 -2
  74. package/esm2022/app/reports/interfaces/report-view-menu-item.interface.mjs +0 -2
  75. package/esm2022/app/reports/interfaces/report-view-summary.interface.mjs +0 -2
  76. package/esm2022/app/reports/interfaces/report-view.interface.mjs +0 -2
  77. package/esm2022/app/reports/interfaces/report-views.interface.mjs +0 -2
  78. package/esm2022/app/reports/report-view-config.mjs +0 -587
  79. package/esm2022/app/reports/report-view-menu.mjs +0 -119
  80. package/esm2022/app/reports/services/report-view.service.mjs +0 -218
  81. package/fesm2022/firestitch-report-firestitch-report-DftB7M1o.mjs.map +0 -1
@@ -1,119 +0,0 @@
1
- export const VIEWS_LABEL = 'Views';
2
- export const EDITED_TOOLTIP = 'The screen differs from this view';
3
- export const SAVE_AS_TITLE = 'Save as new view';
4
- export const RENAME_TITLE = 'Rename view';
5
- export const CROSS_FILTER_NOTE = 'Cross-filters are temporary and are not saved.';
6
- export const VIEW_NAME_BLANK = 'Enter a name';
7
- // The server's limit on a view's name.
8
- export const VIEW_NAME_MAX_LENGTH = 100;
9
- // The menu for the open view (null when none is open), the views the viewer
10
- // may see, whether the screen differs from the open view, and whether the
11
- // viewer may share its views.
12
- export function viewMenuItems(open, views, edited, canShare) {
13
- const rows = [
14
- ...views.filter((view) => view.mine),
15
- ...views.filter((view) => !view.mine),
16
- ].map((view) => viewRow(view, open, edited));
17
- const actions = openViewActions(open, edited, canShare);
18
- const resets = [
19
- ...(open && edited ? [action('resetToView', `Reset to "${open.name}"`)] : []),
20
- action('resetToDefaults', 'Reset to report defaults'),
21
- ];
22
- return [
23
- ...rows,
24
- ...withDivider(actions, rows.length > 0),
25
- ...withDivider(resets, true),
26
- ];
27
- }
28
- // The picker's label: 'Views', or the open view's name, marked while the
29
- // screen differs from it.
30
- export function pickerLabel(open, edited) {
31
- if (!open) {
32
- return VIEWS_LABEL;
33
- }
34
- return edited ? `${open.name} (edited)` : open.name;
35
- }
36
- // The picker's tooltip: only while the screen differs from the open view.
37
- export function pickerTooltip(open, edited) {
38
- return open && edited ? EDITED_TOOLTIP : null;
39
- }
40
- // The question before a view is deleted. A shared view says that everyone
41
- // loses it.
42
- export function deletePromptText(view) {
43
- const question = `Delete the view "${view.name}"?`;
44
- return view.shared ? `${question} Everyone it is shared with loses it.` : question;
45
- }
46
- // The line the save dialog shows under the name, or null: a cross-filter is
47
- // on, and it does not go into the view.
48
- export function saveDialogNote(hasCrossFilter) {
49
- return hasCrossFilter ? CROSS_FILTER_NOTE : null;
50
- }
51
- // A name made of spaces only is no name; the server trims it.
52
- export function viewNameError(name) {
53
- return (name ?? '').trim() ? null : VIEW_NAME_BLANK;
54
- }
55
- function viewRow(view, open, edited) {
56
- const isOpen = view.id === open?.id;
57
- return {
58
- kind: 'view',
59
- label: view.name,
60
- disabled: isOpen && !edited,
61
- tooltip: viewTooltip(view),
62
- divider: false,
63
- viewId: view.id,
64
- open: isOpen,
65
- icon: viewIcon(view),
66
- };
67
- }
68
- // Who shared a view of someone else's; whether one of the viewer's own opens
69
- // by default or is shared.
70
- function viewTooltip(view) {
71
- if (!view.mine) {
72
- return view.ownerName ? `Shared by ${view.ownerName}` : 'Shared with everyone';
73
- }
74
- if (view.personalDefault && view.shared) {
75
- return 'Opens by default, shared with everyone';
76
- }
77
- if (view.personalDefault) {
78
- return 'Opens by default';
79
- }
80
- return view.shared ? 'Shared with everyone' : null;
81
- }
82
- // The open row keeps this icon too; its check is drawn beside it.
83
- function viewIcon(view) {
84
- if (!view.mine) {
85
- return 'people';
86
- }
87
- return view.personalDefault ? 'star' : null;
88
- }
89
- // The rows that act on the open view; with none open, only Save as new view.
90
- function openViewActions(open, edited, canShare) {
91
- const items = [];
92
- if (open?.canChange && edited) {
93
- items.push(action('saveChanges', 'Save changes'));
94
- }
95
- items.push(action('saveAsNew', 'Save as new view...'));
96
- if (open?.canChange) {
97
- items.push(action('rename', 'Rename...'));
98
- }
99
- if (open?.mine) {
100
- items.push(open.personalDefault
101
- ? action('clearDefault', 'Stop opening it by default')
102
- : action('setDefault', 'Make it my default'));
103
- }
104
- if (open?.mine && canShare) {
105
- items.push(open.shared ? action('unshare', 'Stop sharing') : action('share', 'Share with everyone'));
106
- }
107
- if (open?.canDelete) {
108
- items.push(action('delete', 'Delete...'));
109
- }
110
- return items;
111
- }
112
- function action(kind, label) {
113
- return { kind, label, disabled: false, tooltip: null, divider: false, viewId: null, open: false, icon: null };
114
- }
115
- // The same rows, the first with a line above it when `divider` is set.
116
- function withDivider(items, divider) {
117
- return items.map((item, index) => (index === 0 && divider ? { ...item, divider: true } : item));
118
- }
119
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXZpZXctbWVudS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9yZXBvcnQtdmlldy1tZW51LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW9CQSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDO0FBQ25DLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxtQ0FBbUMsQ0FBQztBQUNsRSxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQUM7QUFDaEQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQztBQUMxQyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxnREFBZ0QsQ0FBQztBQUNsRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsY0FBYyxDQUFDO0FBRTlDLHVDQUF1QztBQUN2QyxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUM7QUFHeEMsNEVBQTRFO0FBQzVFLDBFQUEwRTtBQUMxRSw4QkFBOEI7QUFDOUIsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsSUFBOEIsRUFDOUIsS0FBbUMsRUFDbkMsTUFBZSxFQUNmLFFBQWlCO0lBRWpCLE1BQU0sSUFBSSxHQUFHO1FBQ1gsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3BDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0tBQ3RDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sTUFBTSxHQUF5QjtRQUNuQyxHQUFHLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLGFBQWEsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzdFLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSwwQkFBMEIsQ0FBQztLQUN0RCxDQUFDO0lBRUYsT0FBTztRQUNMLEdBQUcsSUFBSTtRQUNQLEdBQUcsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUN4QyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO0tBQzdCLENBQUM7QUFDSixDQUFDO0FBRUQseUVBQXlFO0FBQ3pFLDBCQUEwQjtBQUMxQixNQUFNLFVBQVUsV0FBVyxDQUFDLElBQTRDLEVBQUUsTUFBZTtJQUN2RixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQ3RELENBQUM7QUFFRCwwRUFBMEU7QUFDMUUsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUE0QyxFQUFFLE1BQWU7SUFDekYsT0FBTyxJQUFJLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNoRCxDQUFDO0FBRUQsMEVBQTBFO0FBQzFFLFlBQVk7QUFDWixNQUFNLFVBQVUsZ0JBQWdCLENBQUMsSUFBZ0Q7SUFDL0UsTUFBTSxRQUFRLEdBQUcsb0JBQW9CLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQztJQUVuRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSx1Q0FBdUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0FBQ3JGLENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsd0NBQXdDO0FBQ3hDLE1BQU0sVUFBVSxjQUFjLENBQUMsY0FBdUI7SUFDcEQsT0FBTyxjQUFjLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDbkQsQ0FBQztBQUVELDhEQUE4RDtBQUM5RCxNQUFNLFVBQVUsYUFBYSxDQUFDLElBQStCO0lBQzNELE9BQU8sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDO0FBQ3RELENBQUM7QUFHRCxTQUFTLE9BQU8sQ0FBQyxJQUF1QixFQUFFLElBQThCLEVBQUUsTUFBZTtJQUN2RixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRSxFQUFFLENBQUM7SUFFcEMsT0FBTztRQUNMLElBQUksRUFBRSxNQUFNO1FBQ1osS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ2hCLFFBQVEsRUFBRSxNQUFNLElBQUksQ0FBQyxNQUFNO1FBQzNCLE9BQU8sRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQzFCLE9BQU8sRUFBRSxLQUFLO1FBQ2QsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFO1FBQ2YsSUFBSSxFQUFFLE1BQU07UUFDWixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQztLQUNyQixDQUFDO0FBQ0osQ0FBQztBQUVELDZFQUE2RTtBQUM3RSwyQkFBMkI7QUFDM0IsU0FBUyxXQUFXLENBQUMsSUFBdUI7SUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDO0lBQ2pGLENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3hDLE9BQU8sd0NBQXdDLENBQUM7SUFDbEQsQ0FBQztJQUVELElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3pCLE9BQU8sa0JBQWtCLENBQUM7SUFDNUIsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNyRCxDQUFDO0FBRUQsa0VBQWtFO0FBQ2xFLFNBQVMsUUFBUSxDQUFDLElBQXVCO0lBQ3ZDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDZixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUM5QyxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLFNBQVMsZUFBZSxDQUFDLElBQThCLEVBQUUsTUFBZSxFQUFFLFFBQWlCO0lBQ3pGLE1BQU0sS0FBSyxHQUF5QixFQUFFLENBQUM7SUFFdkMsSUFBSSxJQUFJLEVBQUUsU0FBUyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQzlCLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUscUJBQXFCLENBQUMsQ0FBQyxDQUFDO0lBRXZELElBQUksSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQ3BCLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxJQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUNmLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWU7WUFDN0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsNEJBQTRCLENBQUM7WUFDdEQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxJQUFJLElBQUksRUFBRSxJQUFJLElBQUksUUFBUSxFQUFFLENBQUM7UUFDM0IsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLHFCQUFxQixDQUFDLENBQUMsQ0FBQztJQUN2RyxDQUFDO0lBRUQsSUFBSSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFDcEIsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsTUFBTSxDQUFDLElBQWdDLEVBQUUsS0FBYTtJQUM3RCxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ2hILENBQUM7QUFFRCx1RUFBdUU7QUFDdkUsU0FBUyxXQUFXLENBQUMsS0FBMkIsRUFBRSxPQUFnQjtJQUNoRSxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNsRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gV2hhdCB0aGUgVmlld3MgcGlja2VyIHNob3dzOiBpdHMgbGFiZWwsIGl0cyBtZW51IGFuZCB0aGUgd29yZHMgb2YgaXRzXG4vLyBwcm9tcHRzLiBQdXJlLCBzbyB0aGUgbm9kZSBoYXJuZXNzIHJ1bnMgZXZlcnkgY2FzZTsgdGhlIHBpY2tlclxuLy8gKFJlcG9ydFZpZXdQaWNrZXJDb21wb25lbnQpIG9ubHkgZHJhd3MgdGhlIHJvd3MgYW5kIHJ1bnMgdGhlIG9uZSBjbGlja2VkLlxuLy9cbi8vIFRoZSBtZW51LCB0b3AgdG8gYm90dG9tOlxuLy8gLSBUaGUgdmlld2VyJ3Mgb3duIHZpZXdzLCB0aGVuIHRoZSB2aWV3cyBvdGhlcnMgc2hhcmUgKGEgcGVvcGxlIGljb24gYW5kXG4vLyAgICdTaGFyZWQgYnkgPG5hbWU+JykuIFRoZSBvcGVuIHZpZXcgaGFzIGEgY2hlY2sgYmVzaWRlIGl0cyBvd24gaWNvbiBhbmRcbi8vICAgY2Fubm90IGJlIHBpY2tlZCBhZ2FpbiB3aGlsZSB0aGUgc2NyZWVuIHN0aWxsIHNob3dzIGl0OyB0aGUgdmlld2VyJ3Ncbi8vICAgZGVmYXVsdCBoYXMgYSBzdGFyLlxuLy8gLSBUaGUgYWN0aW9ucyBvbiB0aGUgb3BlbiB2aWV3LiBTYXZlIGNoYW5nZXMgb25seSB3aGlsZSB0aGUgc2NyZWVuXG4vLyAgIGRpZmZlcnMgZnJvbSBhIHZpZXcgdGhlIHZpZXdlciBtYXkgY2hhbmdlOyBSZW5hbWUgb25seSBvbiBhIHZpZXcgdGhlXG4vLyAgIHZpZXdlciBtYXkgY2hhbmdlOyB0aGUgZGVmYXVsdCBhbmQgc2hhcmluZyByb3dzIG9ubHkgb24gdGhlIHZpZXdlcidzXG4vLyAgIG93biB2aWV3LCBhbmQgc2hhcmluZyBvbmx5IHdoZW4gdGhlIHZpZXdlciBtYXkgc2hhcmU7IERlbGV0ZSBvbmx5IG9uIGFcbi8vICAgdmlldyB0aGUgdmlld2VyIG1heSBkZWxldGUuIFNhdmUgYXMgbmV3IHZpZXcgaXMgYWx3YXlzIHRoZXJlLlxuLy8gLSBSZXNldCB0byB0aGUgb3BlbiB2aWV3IHdoaWxlIHRoZSBzY3JlZW4gZGlmZmVycyBmcm9tIGl0LCBhbmQgUmVzZXQgdG9cbi8vICAgcmVwb3J0IGRlZmF1bHRzLlxuaW1wb3J0IHsgUmVwb3J0Vmlld01lbnVJdGVtIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC12aWV3LW1lbnUtaXRlbS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0Vmlld1N1bW1hcnkgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LXZpZXctc3VtbWFyeS5pbnRlcmZhY2UnO1xuXG5cbmV4cG9ydCBjb25zdCBWSUVXU19MQUJFTCA9ICdWaWV3cyc7XG5leHBvcnQgY29uc3QgRURJVEVEX1RPT0xUSVAgPSAnVGhlIHNjcmVlbiBkaWZmZXJzIGZyb20gdGhpcyB2aWV3JztcbmV4cG9ydCBjb25zdCBTQVZFX0FTX1RJVExFID0gJ1NhdmUgYXMgbmV3IHZpZXcnO1xuZXhwb3J0IGNvbnN0IFJFTkFNRV9USVRMRSA9ICdSZW5hbWUgdmlldyc7XG5leHBvcnQgY29uc3QgQ1JPU1NfRklMVEVSX05PVEUgPSAnQ3Jvc3MtZmlsdGVycyBhcmUgdGVtcG9yYXJ5IGFuZCBhcmUgbm90IHNhdmVkLic7XG5leHBvcnQgY29uc3QgVklFV19OQU1FX0JMQU5LID0gJ0VudGVyIGEgbmFtZSc7XG5cbi8vIFRoZSBzZXJ2ZXIncyBsaW1pdCBvbiBhIHZpZXcncyBuYW1lLlxuZXhwb3J0IGNvbnN0IFZJRVdfTkFNRV9NQVhfTEVOR1RIID0gMTAwO1xuXG5cbi8vIFRoZSBtZW51IGZvciB0aGUgb3BlbiB2aWV3IChudWxsIHdoZW4gbm9uZSBpcyBvcGVuKSwgdGhlIHZpZXdzIHRoZSB2aWV3ZXJcbi8vIG1heSBzZWUsIHdoZXRoZXIgdGhlIHNjcmVlbiBkaWZmZXJzIGZyb20gdGhlIG9wZW4gdmlldywgYW5kIHdoZXRoZXIgdGhlXG4vLyB2aWV3ZXIgbWF5IHNoYXJlIGl0cyB2aWV3cy5cbmV4cG9ydCBmdW5jdGlvbiB2aWV3TWVudUl0ZW1zKFxuICBvcGVuOiBSZXBvcnRWaWV3U3VtbWFyeSB8IG51bGwsXG4gIHZpZXdzOiByZWFkb25seSBSZXBvcnRWaWV3U3VtbWFyeVtdLFxuICBlZGl0ZWQ6IGJvb2xlYW4sXG4gIGNhblNoYXJlOiBib29sZWFuLFxuKTogUmVwb3J0Vmlld01lbnVJdGVtW10ge1xuICBjb25zdCByb3dzID0gW1xuICAgIC4uLnZpZXdzLmZpbHRlcigodmlldykgPT4gdmlldy5taW5lKSxcbiAgICAuLi52aWV3cy5maWx0ZXIoKHZpZXcpID0+ICF2aWV3Lm1pbmUpLFxuICBdLm1hcCgodmlldykgPT4gdmlld1Jvdyh2aWV3LCBvcGVuLCBlZGl0ZWQpKTtcbiAgY29uc3QgYWN0aW9ucyA9IG9wZW5WaWV3QWN0aW9ucyhvcGVuLCBlZGl0ZWQsIGNhblNoYXJlKTtcbiAgY29uc3QgcmVzZXRzOiBSZXBvcnRWaWV3TWVudUl0ZW1bXSA9IFtcbiAgICAuLi4ob3BlbiAmJiBlZGl0ZWQgPyBbYWN0aW9uKCdyZXNldFRvVmlldycsIGBSZXNldCB0byBcIiR7b3Blbi5uYW1lfVwiYCldIDogW10pLFxuICAgIGFjdGlvbigncmVzZXRUb0RlZmF1bHRzJywgJ1Jlc2V0IHRvIHJlcG9ydCBkZWZhdWx0cycpLFxuICBdO1xuXG4gIHJldHVybiBbXG4gICAgLi4ucm93cyxcbiAgICAuLi53aXRoRGl2aWRlcihhY3Rpb25zLCByb3dzLmxlbmd0aCA+IDApLFxuICAgIC4uLndpdGhEaXZpZGVyKHJlc2V0cywgdHJ1ZSksXG4gIF07XG59XG5cbi8vIFRoZSBwaWNrZXIncyBsYWJlbDogJ1ZpZXdzJywgb3IgdGhlIG9wZW4gdmlldydzIG5hbWUsIG1hcmtlZCB3aGlsZSB0aGVcbi8vIHNjcmVlbiBkaWZmZXJzIGZyb20gaXQuXG5leHBvcnQgZnVuY3Rpb24gcGlja2VyTGFiZWwob3BlbjogUGljazxSZXBvcnRWaWV3U3VtbWFyeSwgJ25hbWUnPiB8IG51bGwsIGVkaXRlZDogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmICghb3Blbikge1xuICAgIHJldHVybiBWSUVXU19MQUJFTDtcbiAgfVxuXG4gIHJldHVybiBlZGl0ZWQgPyBgJHtvcGVuLm5hbWV9IChlZGl0ZWQpYCA6IG9wZW4ubmFtZTtcbn1cblxuLy8gVGhlIHBpY2tlcidzIHRvb2x0aXA6IG9ubHkgd2hpbGUgdGhlIHNjcmVlbiBkaWZmZXJzIGZyb20gdGhlIG9wZW4gdmlldy5cbmV4cG9ydCBmdW5jdGlvbiBwaWNrZXJUb29sdGlwKG9wZW46IFBpY2s8UmVwb3J0Vmlld1N1bW1hcnksICduYW1lJz4gfCBudWxsLCBlZGl0ZWQ6IGJvb2xlYW4pOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIG9wZW4gJiYgZWRpdGVkID8gRURJVEVEX1RPT0xUSVAgOiBudWxsO1xufVxuXG4vLyBUaGUgcXVlc3Rpb24gYmVmb3JlIGEgdmlldyBpcyBkZWxldGVkLiBBIHNoYXJlZCB2aWV3IHNheXMgdGhhdCBldmVyeW9uZVxuLy8gbG9zZXMgaXQuXG5leHBvcnQgZnVuY3Rpb24gZGVsZXRlUHJvbXB0VGV4dCh2aWV3OiBQaWNrPFJlcG9ydFZpZXdTdW1tYXJ5LCAnbmFtZScgfCAnc2hhcmVkJz4pOiBzdHJpbmcge1xuICBjb25zdCBxdWVzdGlvbiA9IGBEZWxldGUgdGhlIHZpZXcgXCIke3ZpZXcubmFtZX1cIj9gO1xuXG4gIHJldHVybiB2aWV3LnNoYXJlZCA/IGAke3F1ZXN0aW9ufSBFdmVyeW9uZSBpdCBpcyBzaGFyZWQgd2l0aCBsb3NlcyBpdC5gIDogcXVlc3Rpb247XG59XG5cbi8vIFRoZSBsaW5lIHRoZSBzYXZlIGRpYWxvZyBzaG93cyB1bmRlciB0aGUgbmFtZSwgb3IgbnVsbDogYSBjcm9zcy1maWx0ZXIgaXNcbi8vIG9uLCBhbmQgaXQgZG9lcyBub3QgZ28gaW50byB0aGUgdmlldy5cbmV4cG9ydCBmdW5jdGlvbiBzYXZlRGlhbG9nTm90ZShoYXNDcm9zc0ZpbHRlcjogYm9vbGVhbik6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gaGFzQ3Jvc3NGaWx0ZXIgPyBDUk9TU19GSUxURVJfTk9URSA6IG51bGw7XG59XG5cbi8vIEEgbmFtZSBtYWRlIG9mIHNwYWNlcyBvbmx5IGlzIG5vIG5hbWU7IHRoZSBzZXJ2ZXIgdHJpbXMgaXQuXG5leHBvcnQgZnVuY3Rpb24gdmlld05hbWVFcnJvcihuYW1lOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCB7XG4gIHJldHVybiAobmFtZSA/PyAnJykudHJpbSgpID8gbnVsbCA6IFZJRVdfTkFNRV9CTEFOSztcbn1cblxuXG5mdW5jdGlvbiB2aWV3Um93KHZpZXc6IFJlcG9ydFZpZXdTdW1tYXJ5LCBvcGVuOiBSZXBvcnRWaWV3U3VtbWFyeSB8IG51bGwsIGVkaXRlZDogYm9vbGVhbik6IFJlcG9ydFZpZXdNZW51SXRlbSB7XG4gIGNvbnN0IGlzT3BlbiA9IHZpZXcuaWQgPT09IG9wZW4/LmlkO1xuXG4gIHJldHVybiB7XG4gICAga2luZDogJ3ZpZXcnLFxuICAgIGxhYmVsOiB2aWV3Lm5hbWUsXG4gICAgZGlzYWJsZWQ6IGlzT3BlbiAmJiAhZWRpdGVkLFxuICAgIHRvb2x0aXA6IHZpZXdUb29sdGlwKHZpZXcpLFxuICAgIGRpdmlkZXI6IGZhbHNlLFxuICAgIHZpZXdJZDogdmlldy5pZCxcbiAgICBvcGVuOiBpc09wZW4sXG4gICAgaWNvbjogdmlld0ljb24odmlldyksXG4gIH07XG59XG5cbi8vIFdobyBzaGFyZWQgYSB2aWV3IG9mIHNvbWVvbmUgZWxzZSdzOyB3aGV0aGVyIG9uZSBvZiB0aGUgdmlld2VyJ3Mgb3duIG9wZW5zXG4vLyBieSBkZWZhdWx0IG9yIGlzIHNoYXJlZC5cbmZ1bmN0aW9uIHZpZXdUb29sdGlwKHZpZXc6IFJlcG9ydFZpZXdTdW1tYXJ5KTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICghdmlldy5taW5lKSB7XG4gICAgcmV0dXJuIHZpZXcub3duZXJOYW1lID8gYFNoYXJlZCBieSAke3ZpZXcub3duZXJOYW1lfWAgOiAnU2hhcmVkIHdpdGggZXZlcnlvbmUnO1xuICB9XG5cbiAgaWYgKHZpZXcucGVyc29uYWxEZWZhdWx0ICYmIHZpZXcuc2hhcmVkKSB7XG4gICAgcmV0dXJuICdPcGVucyBieSBkZWZhdWx0LCBzaGFyZWQgd2l0aCBldmVyeW9uZSc7XG4gIH1cblxuICBpZiAodmlldy5wZXJzb25hbERlZmF1bHQpIHtcbiAgICByZXR1cm4gJ09wZW5zIGJ5IGRlZmF1bHQnO1xuICB9XG5cbiAgcmV0dXJuIHZpZXcuc2hhcmVkID8gJ1NoYXJlZCB3aXRoIGV2ZXJ5b25lJyA6IG51bGw7XG59XG5cbi8vIFRoZSBvcGVuIHJvdyBrZWVwcyB0aGlzIGljb24gdG9vOyBpdHMgY2hlY2sgaXMgZHJhd24gYmVzaWRlIGl0LlxuZnVuY3Rpb24gdmlld0ljb24odmlldzogUmVwb3J0Vmlld1N1bW1hcnkpOiBSZXBvcnRWaWV3TWVudUl0ZW1bJ2ljb24nXSB7XG4gIGlmICghdmlldy5taW5lKSB7XG4gICAgcmV0dXJuICdwZW9wbGUnO1xuICB9XG5cbiAgcmV0dXJuIHZpZXcucGVyc29uYWxEZWZhdWx0ID8gJ3N0YXInIDogbnVsbDtcbn1cblxuLy8gVGhlIHJvd3MgdGhhdCBhY3Qgb24gdGhlIG9wZW4gdmlldzsgd2l0aCBub25lIG9wZW4sIG9ubHkgU2F2ZSBhcyBuZXcgdmlldy5cbmZ1bmN0aW9uIG9wZW5WaWV3QWN0aW9ucyhvcGVuOiBSZXBvcnRWaWV3U3VtbWFyeSB8IG51bGwsIGVkaXRlZDogYm9vbGVhbiwgY2FuU2hhcmU6IGJvb2xlYW4pOiBSZXBvcnRWaWV3TWVudUl0ZW1bXSB7XG4gIGNvbnN0IGl0ZW1zOiBSZXBvcnRWaWV3TWVudUl0ZW1bXSA9IFtdO1xuXG4gIGlmIChvcGVuPy5jYW5DaGFuZ2UgJiYgZWRpdGVkKSB7XG4gICAgaXRlbXMucHVzaChhY3Rpb24oJ3NhdmVDaGFuZ2VzJywgJ1NhdmUgY2hhbmdlcycpKTtcbiAgfVxuXG4gIGl0ZW1zLnB1c2goYWN0aW9uKCdzYXZlQXNOZXcnLCAnU2F2ZSBhcyBuZXcgdmlldy4uLicpKTtcblxuICBpZiAob3Blbj8uY2FuQ2hhbmdlKSB7XG4gICAgaXRlbXMucHVzaChhY3Rpb24oJ3JlbmFtZScsICdSZW5hbWUuLi4nKSk7XG4gIH1cblxuICBpZiAob3Blbj8ubWluZSkge1xuICAgIGl0ZW1zLnB1c2gob3Blbi5wZXJzb25hbERlZmF1bHRcbiAgICAgID8gYWN0aW9uKCdjbGVhckRlZmF1bHQnLCAnU3RvcCBvcGVuaW5nIGl0IGJ5IGRlZmF1bHQnKVxuICAgICAgOiBhY3Rpb24oJ3NldERlZmF1bHQnLCAnTWFrZSBpdCBteSBkZWZhdWx0JykpO1xuICB9XG5cbiAgaWYgKG9wZW4/Lm1pbmUgJiYgY2FuU2hhcmUpIHtcbiAgICBpdGVtcy5wdXNoKG9wZW4uc2hhcmVkID8gYWN0aW9uKCd1bnNoYXJlJywgJ1N0b3Agc2hhcmluZycpIDogYWN0aW9uKCdzaGFyZScsICdTaGFyZSB3aXRoIGV2ZXJ5b25lJykpO1xuICB9XG5cbiAgaWYgKG9wZW4/LmNhbkRlbGV0ZSkge1xuICAgIGl0ZW1zLnB1c2goYWN0aW9uKCdkZWxldGUnLCAnRGVsZXRlLi4uJykpO1xuICB9XG5cbiAgcmV0dXJuIGl0ZW1zO1xufVxuXG5mdW5jdGlvbiBhY3Rpb24oa2luZDogUmVwb3J0Vmlld01lbnVJdGVtWydraW5kJ10sIGxhYmVsOiBzdHJpbmcpOiBSZXBvcnRWaWV3TWVudUl0ZW0ge1xuICByZXR1cm4geyBraW5kLCBsYWJlbCwgZGlzYWJsZWQ6IGZhbHNlLCB0b29sdGlwOiBudWxsLCBkaXZpZGVyOiBmYWxzZSwgdmlld0lkOiBudWxsLCBvcGVuOiBmYWxzZSwgaWNvbjogbnVsbCB9O1xufVxuXG4vLyBUaGUgc2FtZSByb3dzLCB0aGUgZmlyc3Qgd2l0aCBhIGxpbmUgYWJvdmUgaXQgd2hlbiBgZGl2aWRlcmAgaXMgc2V0LlxuZnVuY3Rpb24gd2l0aERpdmlkZXIoaXRlbXM6IFJlcG9ydFZpZXdNZW51SXRlbVtdLCBkaXZpZGVyOiBib29sZWFuKTogUmVwb3J0Vmlld01lbnVJdGVtW10ge1xuICByZXR1cm4gaXRlbXMubWFwKChpdGVtLCBpbmRleCkgPT4gKGluZGV4ID09PSAwICYmIGRpdmlkZXIgPyB7IC4uLml0ZW0sIGRpdmlkZXI6IHRydWUgfSA6IGl0ZW0pKTtcbn1cbiJdfQ==
@@ -1,218 +0,0 @@
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=