@memberjunction/ng-dashboards 5.39.0 → 5.40.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 (129) hide show
  1. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +128 -4
  2. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  3. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +548 -145
  4. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  5. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts +56 -0
  6. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts.map +1 -0
  7. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js +423 -0
  8. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js.map +1 -0
  9. package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts +70 -0
  10. package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts.map +1 -0
  11. package/dist/AI/components/autotagging/components/classify-item-grid.component.js +308 -0
  12. package/dist/AI/components/autotagging/components/classify-item-grid.component.js.map +1 -0
  13. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts +29 -0
  14. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts.map +1 -0
  15. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js +186 -0
  16. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js.map +1 -0
  17. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts +69 -0
  18. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts.map +1 -0
  19. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js +278 -0
  20. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js.map +1 -0
  21. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts +73 -0
  22. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts.map +1 -0
  23. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js +393 -0
  24. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js.map +1 -0
  25. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts +122 -0
  26. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts.map +1 -0
  27. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js +908 -0
  28. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js.map +1 -0
  29. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +100 -2
  30. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -1
  31. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +603 -213
  32. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -1
  33. package/dist/AI/components/autotagging/shared/classify.format.d.ts +15 -0
  34. package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -1
  35. package/dist/AI/components/autotagging/shared/classify.format.js +51 -0
  36. package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -1
  37. package/dist/AI/components/autotagging/shared/classify.types.d.ts +43 -0
  38. package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -1
  39. package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -1
  40. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +38 -1
  41. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -1
  42. package/dist/AI/components/autotagging/tabs/history-tab.component.js +185 -68
  43. package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -1
  44. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +10 -1
  45. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -1
  46. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +249 -188
  47. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -1
  48. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +12 -1
  49. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -1
  50. package/dist/AI/components/autotagging/tabs/sources-tab.component.js +377 -296
  51. package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -1
  52. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +8 -0
  53. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -1
  54. package/dist/AI/components/autotagging/tabs/tags-tab.component.js +112 -68
  55. package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -1
  56. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +9 -0
  57. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -1
  58. package/dist/AI/components/autotagging/tabs/types-tab.component.js +87 -36
  59. package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -1
  60. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +3 -0
  61. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  62. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +15 -3
  63. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  64. package/dist/AI/components/execution-monitoring.component.js +1 -1
  65. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  66. package/dist/AI/components/tags/tags-resource.component.d.ts +1 -0
  67. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  68. package/dist/AI/components/tags/tags-resource.component.js +28 -6
  69. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  70. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +3 -0
  71. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  72. package/dist/AI/components/vectors/vector-management-resource.component.js +330 -302
  73. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  74. package/dist/APIKeys/api-applications-panel.component.js +2 -2
  75. package/dist/APIKeys/api-key-create-dialog.component.js +2 -2
  76. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +31 -340
  77. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  78. package/dist/DataExplorer/data-explorer-dashboard.component.js +468 -1958
  79. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  80. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  81. package/dist/DataExplorer/data-explorer-resource.component.js +10 -0
  82. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  83. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
  84. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +12 -9
  85. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  86. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +27 -2
  87. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
  88. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +244 -120
  89. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  90. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts +65 -0
  91. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts.map +1 -0
  92. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js +176 -0
  93. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js.map +1 -0
  94. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts +81 -0
  95. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts.map +1 -0
  96. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js +308 -0
  97. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js.map +1 -0
  98. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts +85 -0
  99. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts.map +1 -0
  100. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js +362 -0
  101. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js.map +1 -0
  102. package/dist/KnowledgeHub/index.d.ts +3 -0
  103. package/dist/KnowledgeHub/index.d.ts.map +1 -1
  104. package/dist/KnowledgeHub/index.js +3 -0
  105. package/dist/KnowledgeHub/index.js.map +1 -1
  106. package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
  107. package/dist/QueryBrowser/query-browser-resource.component.js +1 -1
  108. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  109. package/dist/ai-dashboards.module.d.ts +48 -38
  110. package/dist/ai-dashboards.module.d.ts.map +1 -1
  111. package/dist/ai-dashboards.module.js +41 -1
  112. package/dist/ai-dashboards.module.js.map +1 -1
  113. package/dist/data-explorer-dashboards.module.d.ts +12 -14
  114. package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
  115. package/dist/data-explorer-dashboards.module.js +5 -14
  116. package/dist/data-explorer-dashboards.module.js.map +1 -1
  117. package/dist/public-api.d.ts +3 -0
  118. package/dist/public-api.d.ts.map +1 -1
  119. package/dist/public-api.js +3 -0
  120. package/dist/public-api.js.map +1 -1
  121. package/package.json +57 -55
  122. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts +0 -79
  123. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts.map +0 -1
  124. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +0 -195
  125. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js.map +0 -1
  126. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +0 -226
  127. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +0 -1
  128. package/dist/DataExplorer/components/view-selector/view-selector.component.js +0 -861
  129. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +0 -1
@@ -1,861 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, ViewEncapsulation } from '@angular/core';
2
- import { UserViewEngine } from '@memberjunction/core-entities';
3
- import { Subject } from 'rxjs';
4
- import { UUIDsEqual } from '@memberjunction/global';
5
- import { BaseAngularComponent } from '@memberjunction/ng-base-types';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@angular/forms";
8
- const _forTrack0 = ($index, $item) => $item.id;
9
- function ViewSelectorComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
10
- const _r1 = i0.ɵɵgetCurrentView();
11
- i0.ɵɵelementStart(0, "div", 16);
12
- i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_1_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.closeDropdown()); });
13
- i0.ɵɵelementEnd();
14
- } }
15
- function ViewSelectorComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
16
- i0.ɵɵelementStart(0, "span", 6);
17
- i0.ɵɵtext(1, "\u2022");
18
- i0.ɵɵelementEnd();
19
- } }
20
- function ViewSelectorComponent_Conditional_9_Conditional_5_Template(rf, ctx) { if (rf & 1) {
21
- i0.ɵɵelementStart(0, "span", 20);
22
- i0.ɵɵtext(1);
23
- i0.ɵɵelementEnd();
24
- } if (rf & 2) {
25
- const ctx_r1 = i0.ɵɵnextContext(2);
26
- i0.ɵɵadvance();
27
- i0.ɵɵtextInterpolate(ctx_r1.entity.DisplayNameOrName);
28
- } }
29
- function ViewSelectorComponent_Conditional_9_Conditional_18_Template(rf, ctx) { if (rf & 1) {
30
- i0.ɵɵelement(0, "i", 32);
31
- } }
32
- function ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_6_Template(rf, ctx) { if (rf & 1) {
33
- i0.ɵɵelementStart(0, "span", 44);
34
- i0.ɵɵtext(1, "Default");
35
- i0.ɵɵelementEnd();
36
- } }
37
- function ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_7_Template(rf, ctx) { if (rf & 1) {
38
- i0.ɵɵelementStart(0, "div", 45);
39
- i0.ɵɵtext(1);
40
- i0.ɵɵelementEnd();
41
- } if (rf & 2) {
42
- const view_r5 = i0.ɵɵnextContext().$implicit;
43
- i0.ɵɵadvance();
44
- i0.ɵɵtextInterpolate(view_r5.entity.Description);
45
- } }
46
- function ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_8_Conditional_1_Template(rf, ctx) { if (rf & 1) {
47
- i0.ɵɵelementStart(0, "span");
48
- i0.ɵɵelement(1, "i", 54);
49
- i0.ɵɵtext(2);
50
- i0.ɵɵelementEnd();
51
- } if (rf & 2) {
52
- const view_r5 = i0.ɵɵnextContext(2).$implicit;
53
- const ctx_r1 = i0.ɵɵnextContext(3);
54
- i0.ɵɵadvance(2);
55
- i0.ɵɵtextInterpolate2(" ", ctx_r1.getViewFilterCount(view_r5), " filter", ctx_r1.getViewFilterCount(view_r5) !== 1 ? "s" : "");
56
- } }
57
- function ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_8_Conditional_2_Template(rf, ctx) { if (rf & 1) {
58
- i0.ɵɵelementStart(0, "span");
59
- i0.ɵɵelement(1, "i", 55);
60
- i0.ɵɵtext(2);
61
- i0.ɵɵelementEnd();
62
- } if (rf & 2) {
63
- const view_r5 = i0.ɵɵnextContext(2).$implicit;
64
- const ctx_r1 = i0.ɵɵnextContext(3);
65
- i0.ɵɵadvance(2);
66
- i0.ɵɵtextInterpolate2(" ", ctx_r1.getViewColumnCount(view_r5), " col", ctx_r1.getViewColumnCount(view_r5) !== 1 ? "s" : "");
67
- } }
68
- function ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_8_Conditional_3_Template(rf, ctx) { if (rf & 1) {
69
- i0.ɵɵelementStart(0, "span");
70
- i0.ɵɵelement(1, "i", 56);
71
- i0.ɵɵtext(2);
72
- i0.ɵɵelementEnd();
73
- } if (rf & 2) {
74
- const view_r5 = i0.ɵɵnextContext(2).$implicit;
75
- const ctx_r1 = i0.ɵɵnextContext(3);
76
- i0.ɵɵadvance(2);
77
- i0.ɵɵtextInterpolate1(" ", ctx_r1.getViewSortInfo(view_r5));
78
- } }
79
- function ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_8_Template(rf, ctx) { if (rf & 1) {
80
- i0.ɵɵelementStart(0, "div", 46);
81
- i0.ɵɵconditionalCreate(1, ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_8_Conditional_1_Template, 3, 2, "span");
82
- i0.ɵɵconditionalCreate(2, ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_8_Conditional_2_Template, 3, 2, "span");
83
- i0.ɵɵconditionalCreate(3, ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_8_Conditional_3_Template, 3, 1, "span");
84
- i0.ɵɵelementEnd();
85
- } if (rf & 2) {
86
- const view_r5 = i0.ɵɵnextContext().$implicit;
87
- const ctx_r1 = i0.ɵɵnextContext(3);
88
- i0.ɵɵadvance();
89
- i0.ɵɵconditional(ctx_r1.getViewFilterCount(view_r5) > 0 ? 1 : -1);
90
- i0.ɵɵadvance();
91
- i0.ɵɵconditional(ctx_r1.getViewColumnCount(view_r5) > 0 ? 2 : -1);
92
- i0.ɵɵadvance();
93
- i0.ɵɵconditional(ctx_r1.getViewSortInfo(view_r5) ? 3 : -1);
94
- } }
95
- function ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_16_Template(rf, ctx) { if (rf & 1) {
96
- i0.ɵɵelement(0, "i", 32);
97
- } }
98
- function ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Template(rf, ctx) { if (rf & 1) {
99
- const _r4 = i0.ɵɵgetCurrentView();
100
- i0.ɵɵelementStart(0, "div", 27);
101
- i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Template_div_click_0_listener() { const view_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.selectView(view_r5)); });
102
- i0.ɵɵelementStart(1, "div", 28);
103
- i0.ɵɵelement(2, "i", 43);
104
- i0.ɵɵelementEnd();
105
- i0.ɵɵelementStart(3, "div", 30)(4, "div", 31);
106
- i0.ɵɵtext(5);
107
- i0.ɵɵconditionalCreate(6, ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_6_Template, 2, 0, "span", 44);
108
- i0.ɵɵelementEnd();
109
- i0.ɵɵconditionalCreate(7, ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_7_Template, 2, 1, "div", 45);
110
- i0.ɵɵconditionalCreate(8, ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_8_Template, 4, 3, "div", 46);
111
- i0.ɵɵelementEnd();
112
- i0.ɵɵelementStart(9, "div", 47)(10, "button", 48);
113
- i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Template_button_click_10_listener($event) { const view_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onDuplicateView(view_r5.id, $event)); });
114
- i0.ɵɵelement(11, "i", 49);
115
- i0.ɵɵelementEnd();
116
- i0.ɵɵelementStart(12, "button", 50);
117
- i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Template_button_click_12_listener($event) { const view_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onConfigureViewById(view_r5.id, $event)); });
118
- i0.ɵɵelement(13, "i", 51);
119
- i0.ɵɵelementEnd();
120
- i0.ɵɵelementStart(14, "button", 52);
121
- i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Template_button_click_14_listener($event) { const view_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onOpenViewInTab(view_r5.id, $event)); });
122
- i0.ɵɵelement(15, "i", 53);
123
- i0.ɵɵelementEnd()();
124
- i0.ɵɵconditionalCreate(16, ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Conditional_16_Template, 1, 0, "i", 32);
125
- i0.ɵɵelementEnd();
126
- } if (rf & 2) {
127
- const view_r5 = ctx.$implicit;
128
- const ctx_r1 = i0.ɵɵnextContext(3);
129
- i0.ɵɵclassProp("active", ctx_r1.selectedViewId === view_r5.id);
130
- i0.ɵɵadvance();
131
- i0.ɵɵclassProp("active", ctx_r1.selectedViewId === view_r5.id);
132
- i0.ɵɵadvance(4);
133
- i0.ɵɵtextInterpolate1(" ", view_r5.name, " ");
134
- i0.ɵɵadvance();
135
- i0.ɵɵconditional(view_r5.isDefault ? 6 : -1);
136
- i0.ɵɵadvance();
137
- i0.ɵɵconditional(view_r5.entity.Description ? 7 : -1);
138
- i0.ɵɵadvance();
139
- i0.ɵɵconditional(ctx_r1.getViewFilterCount(view_r5) > 0 || ctx_r1.getViewColumnCount(view_r5) > 0 || ctx_r1.getViewSortInfo(view_r5) ? 8 : -1);
140
- i0.ɵɵadvance(8);
141
- i0.ɵɵconditional(ctx_r1.selectedViewId === view_r5.id ? 16 : -1);
142
- } }
143
- function ViewSelectorComponent_Conditional_9_Conditional_19_Template(rf, ctx) { if (rf & 1) {
144
- i0.ɵɵelementStart(0, "div", 26)(1, "div", 39);
145
- i0.ɵɵelement(2, "i", 40);
146
- i0.ɵɵelementStart(3, "span");
147
- i0.ɵɵtext(4, "My Views");
148
- i0.ɵɵelementEnd();
149
- i0.ɵɵelementStart(5, "span", 41);
150
- i0.ɵɵtext(6);
151
- i0.ɵɵelementEnd()();
152
- i0.ɵɵrepeaterCreate(7, ViewSelectorComponent_Conditional_9_Conditional_19_For_8_Template, 17, 9, "div", 42, _forTrack0);
153
- i0.ɵɵelementEnd();
154
- } if (rf & 2) {
155
- const ctx_r1 = i0.ɵɵnextContext(2);
156
- i0.ɵɵadvance(6);
157
- i0.ɵɵtextInterpolate(ctx_r1.filteredMyViews.length);
158
- i0.ɵɵadvance();
159
- i0.ɵɵrepeater(ctx_r1.filteredMyViews);
160
- } }
161
- function ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_6_Template(rf, ctx) { if (rf & 1) {
162
- i0.ɵɵelementStart(0, "span", 60);
163
- i0.ɵɵtext(1, "View Only");
164
- i0.ɵɵelementEnd();
165
- } }
166
- function ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_7_Template(rf, ctx) { if (rf & 1) {
167
- i0.ɵɵelementStart(0, "span", 61);
168
- i0.ɵɵtext(1, "Can Edit");
169
- i0.ɵɵelementEnd();
170
- } }
171
- function ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_8_Template(rf, ctx) { if (rf & 1) {
172
- i0.ɵɵelementStart(0, "div", 45);
173
- i0.ɵɵtext(1);
174
- i0.ɵɵelementEnd();
175
- } if (rf & 2) {
176
- const view_r7 = i0.ɵɵnextContext().$implicit;
177
- i0.ɵɵadvance();
178
- i0.ɵɵtextInterpolate(view_r7.entity.Description);
179
- } }
180
- function ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_9_Conditional_1_Template(rf, ctx) { if (rf & 1) {
181
- i0.ɵɵelementStart(0, "span");
182
- i0.ɵɵelement(1, "i", 54);
183
- i0.ɵɵtext(2);
184
- i0.ɵɵelementEnd();
185
- } if (rf & 2) {
186
- const view_r7 = i0.ɵɵnextContext(2).$implicit;
187
- const ctx_r1 = i0.ɵɵnextContext(3);
188
- i0.ɵɵadvance(2);
189
- i0.ɵɵtextInterpolate2(" ", ctx_r1.getViewFilterCount(view_r7), " filter", ctx_r1.getViewFilterCount(view_r7) !== 1 ? "s" : "");
190
- } }
191
- function ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_9_Conditional_2_Template(rf, ctx) { if (rf & 1) {
192
- i0.ɵɵelementStart(0, "span");
193
- i0.ɵɵelement(1, "i", 55);
194
- i0.ɵɵtext(2);
195
- i0.ɵɵelementEnd();
196
- } if (rf & 2) {
197
- const view_r7 = i0.ɵɵnextContext(2).$implicit;
198
- const ctx_r1 = i0.ɵɵnextContext(3);
199
- i0.ɵɵadvance(2);
200
- i0.ɵɵtextInterpolate2(" ", ctx_r1.getViewColumnCount(view_r7), " col", ctx_r1.getViewColumnCount(view_r7) !== 1 ? "s" : "");
201
- } }
202
- function ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_9_Template(rf, ctx) { if (rf & 1) {
203
- i0.ɵɵelementStart(0, "div", 46);
204
- i0.ɵɵconditionalCreate(1, ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_9_Conditional_1_Template, 3, 2, "span");
205
- i0.ɵɵconditionalCreate(2, ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_9_Conditional_2_Template, 3, 2, "span");
206
- i0.ɵɵelementEnd();
207
- } if (rf & 2) {
208
- const view_r7 = i0.ɵɵnextContext().$implicit;
209
- const ctx_r1 = i0.ɵɵnextContext(3);
210
- i0.ɵɵadvance();
211
- i0.ɵɵconditional(ctx_r1.getViewFilterCount(view_r7) > 0 ? 1 : -1);
212
- i0.ɵɵadvance();
213
- i0.ɵɵconditional(ctx_r1.getViewColumnCount(view_r7) > 0 ? 2 : -1);
214
- } }
215
- function ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_13_Template(rf, ctx) { if (rf & 1) {
216
- const _r8 = i0.ɵɵgetCurrentView();
217
- i0.ɵɵelementStart(0, "button", 50);
218
- i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_13_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r8); const view_r7 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onConfigureViewById(view_r7.id, $event)); });
219
- i0.ɵɵelement(1, "i", 51);
220
- i0.ɵɵelementEnd();
221
- } }
222
- function ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_14_Template(rf, ctx) { if (rf & 1) {
223
- i0.ɵɵelement(0, "i", 32);
224
- } }
225
- function ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Template(rf, ctx) { if (rf & 1) {
226
- const _r6 = i0.ɵɵgetCurrentView();
227
- i0.ɵɵelementStart(0, "div", 27);
228
- i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Template_div_click_0_listener() { const view_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.selectView(view_r7)); });
229
- i0.ɵɵelementStart(1, "div", 58);
230
- i0.ɵɵelement(2, "i", 59);
231
- i0.ɵɵelementEnd();
232
- i0.ɵɵelementStart(3, "div", 30)(4, "div", 31);
233
- i0.ɵɵtext(5);
234
- i0.ɵɵconditionalCreate(6, ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_6_Template, 2, 0, "span", 60)(7, ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_7_Template, 2, 0, "span", 61);
235
- i0.ɵɵelementEnd();
236
- i0.ɵɵconditionalCreate(8, ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_8_Template, 2, 1, "div", 45);
237
- i0.ɵɵconditionalCreate(9, ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_9_Template, 3, 2, "div", 46);
238
- i0.ɵɵelementEnd();
239
- i0.ɵɵelementStart(10, "div", 47)(11, "button", 62);
240
- i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Template_button_click_11_listener($event) { const view_r7 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onDuplicateView(view_r7.id, $event)); });
241
- i0.ɵɵelement(12, "i", 49);
242
- i0.ɵɵelementEnd();
243
- i0.ɵɵconditionalCreate(13, ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_13_Template, 2, 0, "button", 63);
244
- i0.ɵɵelementEnd();
245
- i0.ɵɵconditionalCreate(14, ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Conditional_14_Template, 1, 0, "i", 32);
246
- i0.ɵɵelementEnd();
247
- } if (rf & 2) {
248
- const view_r7 = ctx.$implicit;
249
- const ctx_r1 = i0.ɵɵnextContext(3);
250
- i0.ɵɵclassProp("active", ctx_r1.selectedViewId === view_r7.id);
251
- i0.ɵɵadvance(5);
252
- i0.ɵɵtextInterpolate1(" ", view_r7.name, " ");
253
- i0.ɵɵadvance();
254
- i0.ɵɵconditional(!view_r7.userCanEdit ? 6 : 7);
255
- i0.ɵɵadvance(2);
256
- i0.ɵɵconditional(view_r7.entity.Description ? 8 : -1);
257
- i0.ɵɵadvance();
258
- i0.ɵɵconditional(ctx_r1.getViewFilterCount(view_r7) > 0 || ctx_r1.getViewColumnCount(view_r7) > 0 ? 9 : -1);
259
- i0.ɵɵadvance(4);
260
- i0.ɵɵconditional(view_r7.userCanEdit ? 13 : -1);
261
- i0.ɵɵadvance();
262
- i0.ɵɵconditional(ctx_r1.selectedViewId === view_r7.id ? 14 : -1);
263
- } }
264
- function ViewSelectorComponent_Conditional_9_Conditional_20_Template(rf, ctx) { if (rf & 1) {
265
- i0.ɵɵelementStart(0, "div", 26)(1, "div", 39);
266
- i0.ɵɵelement(2, "i", 57);
267
- i0.ɵɵelementStart(3, "span");
268
- i0.ɵɵtext(4, "Shared With Me");
269
- i0.ɵɵelementEnd();
270
- i0.ɵɵelementStart(5, "span", 41);
271
- i0.ɵɵtext(6);
272
- i0.ɵɵelementEnd()();
273
- i0.ɵɵrepeaterCreate(7, ViewSelectorComponent_Conditional_9_Conditional_20_For_8_Template, 15, 8, "div", 42, _forTrack0);
274
- i0.ɵɵelementEnd();
275
- } if (rf & 2) {
276
- const ctx_r1 = i0.ɵɵnextContext(2);
277
- i0.ɵɵadvance(6);
278
- i0.ɵɵtextInterpolate(ctx_r1.filteredSharedViews.length);
279
- i0.ɵɵadvance();
280
- i0.ɵɵrepeater(ctx_r1.filteredSharedViews);
281
- } }
282
- function ViewSelectorComponent_Conditional_9_Conditional_21_Template(rf, ctx) { if (rf & 1) {
283
- i0.ɵɵelementStart(0, "div", 33);
284
- i0.ɵɵelement(1, "i", 64);
285
- i0.ɵɵelementStart(2, "div", 65)(3, "strong");
286
- i0.ɵɵtext(4, "No saved views yet");
287
- i0.ɵɵelementEnd();
288
- i0.ɵɵelementStart(5, "span");
289
- i0.ɵɵtext(6, "Save your current configuration as a view");
290
- i0.ɵɵelementEnd()()();
291
- } }
292
- function ViewSelectorComponent_Conditional_9_Conditional_22_Template(rf, ctx) { if (rf & 1) {
293
- i0.ɵɵelementStart(0, "div", 33);
294
- i0.ɵɵelement(1, "i", 66);
295
- i0.ɵɵelementStart(2, "span");
296
- i0.ɵɵtext(3);
297
- i0.ɵɵelementEnd()();
298
- } if (rf & 2) {
299
- const ctx_r1 = i0.ɵɵnextContext(2);
300
- i0.ɵɵadvance(3);
301
- i0.ɵɵtextInterpolate1("No views match \"", ctx_r1.searchText, "\"");
302
- } }
303
- function ViewSelectorComponent_Conditional_9_Conditional_23_Template(rf, ctx) { if (rf & 1) {
304
- i0.ɵɵelementStart(0, "div", 34);
305
- i0.ɵɵelement(1, "i", 67);
306
- i0.ɵɵelementStart(2, "span");
307
- i0.ɵɵtext(3, "Loading views...");
308
- i0.ɵɵelementEnd()();
309
- } }
310
- function ViewSelectorComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
311
- const _r3 = i0.ɵɵgetCurrentView();
312
- i0.ɵɵelementStart(0, "div", 8)(1, "div", 17);
313
- i0.ɵɵelement(2, "i", 18);
314
- i0.ɵɵelementStart(3, "span", 19);
315
- i0.ɵɵtext(4, "Views");
316
- i0.ɵɵelementEnd();
317
- i0.ɵɵconditionalCreate(5, ViewSelectorComponent_Conditional_9_Conditional_5_Template, 2, 1, "span", 20);
318
- i0.ɵɵelementStart(6, "button", 21);
319
- i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.closeDropdown()); });
320
- i0.ɵɵelement(7, "i", 22);
321
- i0.ɵɵelementEnd()();
322
- i0.ɵɵelementStart(8, "div", 23)(9, "input", 24);
323
- i0.ɵɵtwoWayListener("ngModelChange", function ViewSelectorComponent_Conditional_9_Template_input_ngModelChange_9_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.searchText, $event) || (ctx_r1.searchText = $event); return i0.ɵɵresetView($event); });
324
- i0.ɵɵlistener("keydown.escape", function ViewSelectorComponent_Conditional_9_Template_input_keydown_escape_9_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.searchText = ""); });
325
- i0.ɵɵelementEnd()();
326
- i0.ɵɵelementStart(10, "div", 25)(11, "div", 26)(12, "div", 27);
327
- i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Template_div_click_12_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.selectDefault()); });
328
- i0.ɵɵelementStart(13, "div", 28);
329
- i0.ɵɵelement(14, "i", 29);
330
- i0.ɵɵelementEnd();
331
- i0.ɵɵelementStart(15, "div", 30)(16, "div", 31);
332
- i0.ɵɵtext(17, "(Default)");
333
- i0.ɵɵelementEnd()();
334
- i0.ɵɵconditionalCreate(18, ViewSelectorComponent_Conditional_9_Conditional_18_Template, 1, 0, "i", 32);
335
- i0.ɵɵelementEnd()();
336
- i0.ɵɵconditionalCreate(19, ViewSelectorComponent_Conditional_9_Conditional_19_Template, 9, 1, "div", 26);
337
- i0.ɵɵconditionalCreate(20, ViewSelectorComponent_Conditional_9_Conditional_20_Template, 9, 1, "div", 26);
338
- i0.ɵɵconditionalCreate(21, ViewSelectorComponent_Conditional_9_Conditional_21_Template, 7, 0, "div", 33);
339
- i0.ɵɵconditionalCreate(22, ViewSelectorComponent_Conditional_9_Conditional_22_Template, 4, 1, "div", 33);
340
- i0.ɵɵconditionalCreate(23, ViewSelectorComponent_Conditional_9_Conditional_23_Template, 4, 0, "div", 34);
341
- i0.ɵɵelementEnd();
342
- i0.ɵɵelementStart(24, "div", 35)(25, "button", 36);
343
- i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Template_button_click_25_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onQuickSave()); });
344
- i0.ɵɵelement(26, "i", 13);
345
- i0.ɵɵelementStart(27, "span");
346
- i0.ɵɵtext(28, "New View");
347
- i0.ɵɵelementEnd()();
348
- i0.ɵɵelementStart(29, "button", 37);
349
- i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_9_Template_button_click_29_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onResetToDefault()); });
350
- i0.ɵɵelement(30, "i", 38);
351
- i0.ɵɵelementStart(31, "span");
352
- i0.ɵɵtext(32, "Reset to Default");
353
- i0.ɵɵelementEnd()()()();
354
- } if (rf & 2) {
355
- const ctx_r1 = i0.ɵɵnextContext();
356
- i0.ɵɵadvance(5);
357
- i0.ɵɵconditional(ctx_r1.entity ? 5 : -1);
358
- i0.ɵɵadvance(4);
359
- i0.ɵɵtwoWayProperty("ngModel", ctx_r1.searchText);
360
- i0.ɵɵadvance(3);
361
- i0.ɵɵclassProp("active", !ctx_r1.selectedViewId);
362
- i0.ɵɵadvance();
363
- i0.ɵɵclassProp("active", !ctx_r1.selectedViewId);
364
- i0.ɵɵadvance(5);
365
- i0.ɵɵconditional(!ctx_r1.selectedViewId ? 18 : -1);
366
- i0.ɵɵadvance();
367
- i0.ɵɵconditional(ctx_r1.filteredMyViews.length > 0 ? 19 : -1);
368
- i0.ɵɵadvance();
369
- i0.ɵɵconditional(ctx_r1.filteredSharedViews.length > 0 ? 20 : -1);
370
- i0.ɵɵadvance();
371
- i0.ɵɵconditional(!ctx_r1.hasViews && !ctx_r1.isLoading ? 21 : -1);
372
- i0.ɵɵadvance();
373
- i0.ɵɵconditional(ctx_r1.hasViews && ctx_r1.filteredMyViews.length === 0 && ctx_r1.filteredSharedViews.length === 0 && ctx_r1.searchText ? 22 : -1);
374
- i0.ɵɵadvance();
375
- i0.ɵɵconditional(ctx_r1.isLoading ? 23 : -1);
376
- } }
377
- function ViewSelectorComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
378
- const _r9 = i0.ɵɵgetCurrentView();
379
- i0.ɵɵelementStart(0, "button", 68);
380
- i0.ɵɵlistener("click", function ViewSelectorComponent_Conditional_10_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onOpenInTab()); });
381
- i0.ɵɵelement(1, "i", 69);
382
- i0.ɵɵelementEnd();
383
- } }
384
- /**
385
- * ViewSelectorComponent - Dropdown for selecting saved views
386
- *
387
- * Features:
388
- * - Shows "(Default)" option when no view is selected
389
- * - Groups views into "My Views" and "Shared Views"
390
- * - "Save Current View" and "Manage Views" actions
391
- * - "Open in Tab" button for saved views
392
- */
393
- export class ViewSelectorComponent extends BaseAngularComponent {
394
- cdr;
395
- /**
396
- * The entity to load views for
397
- */
398
- entity = null;
399
- /**
400
- * Currently selected view ID (null = default view)
401
- */
402
- selectedViewId = null;
403
- /**
404
- * Whether the current view has unsaved modifications
405
- */
406
- viewModified = false;
407
- /**
408
- * Emitted when a view is selected
409
- */
410
- viewSelected = new EventEmitter();
411
- /**
412
- * Emitted when user requests to save the current view
413
- */
414
- saveViewRequested = new EventEmitter();
415
- /**
416
- * Emitted when user wants to open the view management panel
417
- */
418
- manageViewsRequested = new EventEmitter();
419
- /**
420
- * Emitted when user wants to open the current view in its own tab
421
- */
422
- openInTabRequested = new EventEmitter();
423
- /**
424
- * Emitted when user wants to configure the current view
425
- */
426
- configureViewRequested = new EventEmitter();
427
- /**
428
- * Emitted when user wants to create a new record
429
- */
430
- createNewRecordRequested = new EventEmitter();
431
- /**
432
- * Emitted when user wants to export data to Excel
433
- */
434
- exportRequested = new EventEmitter();
435
- /**
436
- * Emitted when user wants to duplicate a view (F-005)
437
- */
438
- duplicateViewRequested = new EventEmitter();
439
- /**
440
- * Emitted when user wants to use the quick save dialog (F-001)
441
- * Emits true when user explicitly requested "Save As New", false for general save
442
- */
443
- quickSaveRequested = new EventEmitter();
444
- /**
445
- * Emitted when user wants to revert to saved state (F-007)
446
- */
447
- revertRequested = new EventEmitter();
448
- // Internal state
449
- isLoading = false;
450
- isDropdownOpen = false;
451
- myViews = [];
452
- sharedViews = [];
453
- selectedView = null;
454
- searchText = '';
455
- destroy$ = new Subject();
456
- get metadata() { return this.ProviderToUse; }
457
- constructor(cdr) {
458
- super();
459
- this.cdr = cdr;
460
- }
461
- ngOnChanges(changes) {
462
- if (changes['entity']) {
463
- if (this.entity) {
464
- this.loadViews();
465
- }
466
- else {
467
- this.myViews = [];
468
- this.sharedViews = [];
469
- this.selectedView = null;
470
- }
471
- }
472
- if (changes['selectedViewId'] && this.selectedViewId) {
473
- // If we have a selected view ID and it's in our lists, update selectedView
474
- this.updateSelectedViewFromId();
475
- }
476
- }
477
- ngOnDestroy() {
478
- this.destroy$.next();
479
- this.destroy$.complete();
480
- }
481
- /**
482
- * Load views for the current entity
483
- */
484
- async loadViews() {
485
- if (!this.entity) {
486
- return;
487
- }
488
- this.isLoading = true;
489
- this.cdr.detectChanges();
490
- try {
491
- const userId = this.metadata.CurrentUser?.ID;
492
- // Use UserViewEngine cache instead of a direct RunView to avoid redundant DB calls.
493
- // The engine is initialized once and caches all views; GetAccessibleViewsForEntity()
494
- // already filters by owned + shared and checks UserCanView.
495
- await UserViewEngine.Instance.Config(false);
496
- const accessibleViews = UserViewEngine.Instance.GetAccessibleViewsForEntity(this.entity.ID);
497
- // Separate into owned and shared
498
- this.myViews = accessibleViews
499
- .filter(v => UUIDsEqual(v.UserID, userId))
500
- .map(v => this.mapViewToListItem(v, true));
501
- this.sharedViews = accessibleViews
502
- .filter(v => !UUIDsEqual(v.UserID, userId))
503
- .map(v => this.mapViewToListItem(v, false));
504
- // Update selected view reference
505
- this.updateSelectedViewFromId();
506
- }
507
- catch (error) {
508
- console.error('Failed to load views:', error);
509
- }
510
- finally {
511
- this.isLoading = false;
512
- this.cdr.detectChanges();
513
- }
514
- }
515
- /**
516
- * Map a view entity to a list item
517
- */
518
- mapViewToListItem(view, isOwned) {
519
- return {
520
- id: view.ID,
521
- name: view.Name,
522
- isOwned,
523
- isShared: view.IsShared,
524
- isDefault: view.IsDefault,
525
- userCanEdit: view.UserCanEdit,
526
- entity: view
527
- };
528
- }
529
- /**
530
- * Update the selectedView reference based on selectedViewId
531
- */
532
- updateSelectedViewFromId() {
533
- if (!this.selectedViewId) {
534
- this.selectedView = null;
535
- return;
536
- }
537
- // Search in both lists
538
- const myView = this.myViews.find(v => v.id === this.selectedViewId);
539
- if (myView) {
540
- this.selectedView = myView.entity;
541
- return;
542
- }
543
- const sharedView = this.sharedViews.find(v => v.id === this.selectedViewId);
544
- if (sharedView) {
545
- this.selectedView = sharedView.entity;
546
- return;
547
- }
548
- // View not in lists yet - it might need to be loaded
549
- this.selectedView = null;
550
- }
551
- /**
552
- * Get the display name for the current selection
553
- */
554
- get displayName() {
555
- if (this.selectedView) {
556
- return this.selectedView.Name;
557
- }
558
- return '(Default)';
559
- }
560
- /**
561
- * Toggle dropdown open/closed
562
- */
563
- toggleDropdown() {
564
- this.isDropdownOpen = !this.isDropdownOpen;
565
- this.cdr.detectChanges();
566
- }
567
- /**
568
- * Close the dropdown
569
- */
570
- closeDropdown() {
571
- this.isDropdownOpen = false;
572
- this.searchText = '';
573
- this.cdr.detectChanges();
574
- }
575
- /**
576
- * Select the default view (no saved view)
577
- */
578
- selectDefault() {
579
- this.selectedView = null;
580
- this.viewSelected.emit({ viewId: null, view: null });
581
- this.closeDropdown();
582
- }
583
- /**
584
- * Select a view from the list
585
- */
586
- selectView(item) {
587
- this.selectedView = item.entity;
588
- this.viewSelected.emit({ viewId: item.id, view: item.entity });
589
- this.closeDropdown();
590
- }
591
- /**
592
- * Request to save the current view
593
- */
594
- onSaveView() {
595
- this.saveViewRequested.emit({ saveAsNew: false });
596
- this.closeDropdown();
597
- }
598
- /**
599
- * Request to save as a new view - opens Quick Save dialog in "Save As New" mode
600
- */
601
- onSaveAsNewView() {
602
- this.quickSaveRequested.emit(true);
603
- this.closeDropdown();
604
- }
605
- /**
606
- * Request to manage views
607
- */
608
- onManageViews() {
609
- this.manageViewsRequested.emit();
610
- this.closeDropdown();
611
- }
612
- /**
613
- * Request to open the current view in a tab
614
- */
615
- onOpenInTab() {
616
- if (this.selectedViewId) {
617
- this.openInTabRequested.emit(this.selectedViewId);
618
- }
619
- }
620
- /**
621
- * Request to configure the current view
622
- */
623
- onConfigureView() {
624
- this.configureViewRequested.emit();
625
- }
626
- /**
627
- * Request to create a new record
628
- */
629
- onCreateNewRecord() {
630
- this.createNewRecordRequested.emit();
631
- }
632
- /**
633
- * Request to export data to Excel
634
- */
635
- onExport() {
636
- this.exportRequested.emit();
637
- }
638
- /**
639
- * Request to duplicate a view (F-005)
640
- */
641
- onDuplicateView(viewId, event) {
642
- event.stopPropagation(); // Don't select the view
643
- this.duplicateViewRequested.emit(viewId);
644
- this.closeDropdown();
645
- }
646
- /**
647
- * Request to open the quick save dialog (F-001)
648
- */
649
- onQuickSave() {
650
- this.quickSaveRequested.emit(false);
651
- this.closeDropdown();
652
- }
653
- /**
654
- * Request to revert view to saved state (F-007)
655
- */
656
- onRevert() {
657
- this.revertRequested.emit();
658
- }
659
- /**
660
- * Check if there are any views to show
661
- */
662
- get hasViews() {
663
- return this.myViews.length > 0 || this.sharedViews.length > 0;
664
- }
665
- /**
666
- * Check if the current user can edit the selected view
667
- */
668
- get canEditSelectedView() {
669
- return this.selectedView?.UserCanEdit ?? false;
670
- }
671
- /**
672
- * Handle click outside to close dropdown
673
- */
674
- onClickOutside(event) {
675
- this.closeDropdown();
676
- }
677
- // ========================================
678
- // RICH VIEW PANEL: Search & Metadata
679
- // ========================================
680
- /**
681
- * My views filtered by search text
682
- */
683
- get filteredMyViews() {
684
- if (!this.searchText.trim())
685
- return this.myViews;
686
- const term = this.searchText.toLowerCase();
687
- return this.myViews.filter(v => v.name.toLowerCase().includes(term) ||
688
- (v.entity.Description || '').toLowerCase().includes(term));
689
- }
690
- /**
691
- * Shared views filtered by search text
692
- */
693
- get filteredSharedViews() {
694
- if (!this.searchText.trim())
695
- return this.sharedViews;
696
- const term = this.searchText.toLowerCase();
697
- return this.sharedViews.filter(v => v.name.toLowerCase().includes(term) ||
698
- (v.entity.Description || '').toLowerCase().includes(term));
699
- }
700
- /**
701
- * Get the number of filters configured in a view by parsing its FilterState
702
- */
703
- getViewFilterCount(view) {
704
- try {
705
- const filterState = view.entity.FilterState;
706
- if (!filterState)
707
- return 0;
708
- const parsed = JSON.parse(filterState);
709
- if (parsed?.filters?.length)
710
- return parsed.filters.length;
711
- // CompositeFilterDescriptor format
712
- if (parsed?.logic && parsed?.filters)
713
- return parsed.filters.length;
714
- return 0;
715
- }
716
- catch {
717
- return 0;
718
- }
719
- }
720
- /**
721
- * Get the number of visible columns in a view by parsing GridState
722
- */
723
- getViewColumnCount(view) {
724
- try {
725
- const gridState = view.entity.GridState;
726
- if (!gridState)
727
- return 0;
728
- const parsed = JSON.parse(gridState);
729
- if (Array.isArray(parsed)) {
730
- return parsed.filter((c) => !c['hidden']).length;
731
- }
732
- return 0;
733
- }
734
- catch {
735
- return 0;
736
- }
737
- }
738
- /**
739
- * Get sort info string from a view's SortState
740
- */
741
- getViewSortInfo(view) {
742
- try {
743
- const sortState = view.entity.SortState;
744
- if (!sortState)
745
- return '';
746
- const parsed = JSON.parse(sortState);
747
- if (Array.isArray(parsed) && parsed.length > 0) {
748
- return `${parsed.length} sort${parsed.length > 1 ? 's' : ''}`;
749
- }
750
- return '';
751
- }
752
- catch {
753
- return '';
754
- }
755
- }
756
- /**
757
- * Select a specific view and open the config panel for it
758
- */
759
- onConfigureViewById(viewId, event) {
760
- event.stopPropagation();
761
- // First select the view, then open config
762
- const item = this.myViews.find(v => v.id === viewId) || this.sharedViews.find(v => v.id === viewId);
763
- if (item) {
764
- this.selectedView = item.entity;
765
- this.viewSelected.emit({ viewId: item.id, view: item.entity });
766
- }
767
- this.configureViewRequested.emit();
768
- this.closeDropdown();
769
- }
770
- /**
771
- * Open a specific view in a new tab
772
- */
773
- onOpenViewInTab(viewId, event) {
774
- event.stopPropagation();
775
- this.openInTabRequested.emit(viewId);
776
- this.closeDropdown();
777
- }
778
- /**
779
- * Reset to default view (select no view)
780
- */
781
- onResetToDefault() {
782
- this.selectDefault();
783
- }
784
- static ɵfac = function ViewSelectorComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ViewSelectorComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
785
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ViewSelectorComponent, selectors: [["mj-view-selector"]], inputs: { entity: "entity", selectedViewId: "selectedViewId", viewModified: "viewModified" }, outputs: { viewSelected: "viewSelected", saveViewRequested: "saveViewRequested", manageViewsRequested: "manageViewsRequested", openInTabRequested: "openInTabRequested", configureViewRequested: "configureViewRequested", createNewRecordRequested: "createNewRecordRequested", exportRequested: "exportRequested", duplicateViewRequested: "duplicateViewRequested", quickSaveRequested: "quickSaveRequested", revertRequested: "revertRequested" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 17, vars: 12, consts: [[1, "vs-container"], [1, "vs-backdrop"], [1, "vs-wrapper"], ["title", "Select a saved view", 1, "vs-button", 3, "click", "disabled"], [1, "fa-solid", "fa-layer-group", "vs-btn-icon"], [1, "vs-btn-name"], ["title", "View has unsaved changes", 1, "vs-modified-dot"], [1, "fa-solid", "fa-chevron-down", "vs-arrow"], [1, "vs-panel"], ["title", "Open this view in a new tab", 1, "vs-icon-btn"], ["title", "Configure view settings (columns, filters, sorting)", 1, "vs-icon-btn", 3, "click"], [1, "fa-solid", "fa-sliders-h"], ["title", "Create new record", 1, "vs-icon-btn", 3, "click"], [1, "fa-solid", "fa-plus"], ["title", "Export to Excel", 1, "vs-icon-btn", "vs-export-btn", 3, "click"], [1, "fa-solid", "fa-file-excel"], [1, "vs-backdrop", 3, "click"], [1, "vs-panel-header"], [1, "fa-solid", "fa-table-list", "vs-header-icon"], [1, "vs-panel-title"], [1, "vs-entity-badge"], ["title", "Close", 1, "vs-close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "vs-panel-search"], ["type", "text", "placeholder", "Search views...", 1, "vs-search-input", 3, "ngModelChange", "keydown.escape", "ngModel"], [1, "vs-panel-body"], [1, "vs-section"], [1, "vs-card", 3, "click"], [1, "vs-card-icon"], [1, "fa-solid", "fa-table"], [1, "vs-card-content"], [1, "vs-card-name"], [1, "fa-solid", "fa-check", "vs-card-check"], [1, "vs-empty-message"], [1, "vs-loading"], [1, "vs-panel-footer"], ["title", "Save current view configuration", 1, "vs-panel-btn", "primary", 3, "click"], ["title", "Reset to default view", 1, "vs-panel-btn", 3, "click"], [1, "fa-solid", "fa-arrow-rotate-left"], [1, "vs-section-header"], [1, "fa-solid", "fa-user"], [1, "vs-section-count"], [1, "vs-card", 3, "active"], [1, "fa-solid", "fa-table-list"], [1, "vs-default-badge"], [1, "vs-card-desc"], [1, "vs-card-meta"], [1, "vs-card-actions"], ["title", "Duplicate", 1, "vs-action-btn", 3, "click"], [1, "fa-regular", "fa-copy"], ["title", "Configure", 1, "vs-action-btn", 3, "click"], [1, "fa-solid", "fa-sliders"], ["title", "Open in Tab", 1, "vs-action-btn", 3, "click"], [1, "fa-solid", "fa-up-right-from-square"], [1, "fa-solid", "fa-filter"], [1, "fa-solid", "fa-table-columns"], [1, "fa-solid", "fa-arrow-down-short-wide"], [1, "fa-solid", "fa-share-nodes"], [1, "vs-card-icon", "shared"], [1, "fa-solid", "fa-users"], [1, "vs-shared-badge"], [1, "vs-shared-badge", "editable"], ["title", "Duplicate as My View", 1, "vs-action-btn", 3, "click"], ["title", "Configure", 1, "vs-action-btn"], [1, "fa-solid", "fa-bookmark"], [1, "vs-empty-text"], [1, "fa-solid", "fa-search"], [1, "fa-solid", "fa-spinner", "fa-spin"], ["title", "Open this view in a new tab", 1, "vs-icon-btn", 3, "click"], [1, "fa-solid", "fa-external-link-alt"]], template: function ViewSelectorComponent_Template(rf, ctx) { if (rf & 1) {
786
- i0.ɵɵelementStart(0, "div", 0);
787
- i0.ɵɵconditionalCreate(1, ViewSelectorComponent_Conditional_1_Template, 1, 0, "div", 1);
788
- i0.ɵɵelementStart(2, "div", 2)(3, "button", 3);
789
- i0.ɵɵlistener("click", function ViewSelectorComponent_Template_button_click_3_listener() { return ctx.toggleDropdown(); });
790
- i0.ɵɵelement(4, "i", 4);
791
- i0.ɵɵelementStart(5, "span", 5);
792
- i0.ɵɵtext(6);
793
- i0.ɵɵelementEnd();
794
- i0.ɵɵconditionalCreate(7, ViewSelectorComponent_Conditional_7_Template, 2, 0, "span", 6);
795
- i0.ɵɵelement(8, "i", 7);
796
- i0.ɵɵelementEnd();
797
- i0.ɵɵconditionalCreate(9, ViewSelectorComponent_Conditional_9_Template, 33, 12, "div", 8);
798
- i0.ɵɵelementEnd();
799
- i0.ɵɵconditionalCreate(10, ViewSelectorComponent_Conditional_10_Template, 2, 0, "button", 9);
800
- i0.ɵɵelementStart(11, "button", 10);
801
- i0.ɵɵlistener("click", function ViewSelectorComponent_Template_button_click_11_listener() { return ctx.onConfigureView(); });
802
- i0.ɵɵelement(12, "i", 11);
803
- i0.ɵɵelementEnd();
804
- i0.ɵɵelementStart(13, "button", 12);
805
- i0.ɵɵlistener("click", function ViewSelectorComponent_Template_button_click_13_listener() { return ctx.onCreateNewRecord(); });
806
- i0.ɵɵelement(14, "i", 13);
807
- i0.ɵɵelementEnd();
808
- i0.ɵɵelementStart(15, "button", 14);
809
- i0.ɵɵlistener("click", function ViewSelectorComponent_Template_button_click_15_listener() { return ctx.onExport(); });
810
- i0.ɵɵelement(16, "i", 15);
811
- i0.ɵɵelementEnd()();
812
- } if (rf & 2) {
813
- i0.ɵɵadvance();
814
- i0.ɵɵconditional(ctx.isDropdownOpen ? 1 : -1);
815
- i0.ɵɵadvance(2);
816
- i0.ɵɵclassProp("modified", ctx.viewModified)("open", ctx.isDropdownOpen);
817
- i0.ɵɵproperty("disabled", ctx.isLoading);
818
- i0.ɵɵadvance(3);
819
- i0.ɵɵtextInterpolate(ctx.displayName);
820
- i0.ɵɵadvance();
821
- i0.ɵɵconditional(ctx.viewModified ? 7 : -1);
822
- i0.ɵɵadvance();
823
- i0.ɵɵclassProp("rotated", ctx.isDropdownOpen);
824
- i0.ɵɵadvance();
825
- i0.ɵɵconditional(ctx.isDropdownOpen ? 9 : -1);
826
- i0.ɵɵadvance();
827
- i0.ɵɵconditional(ctx.selectedViewId ? 10 : -1);
828
- } }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel], styles: ["/* ========================================\n VIEW SELECTOR - All classes prefixed vs-\n to avoid conflicts (ViewEncapsulation.None)\n ======================================== */\n\n/* Container */\n.vs-container {\n display: flex;\n align-items: center;\n gap: 4px;\n position: relative;\n}\n\n/* Backdrop for closing panel */\n.vs-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n background: transparent;\n}\n\n.vs-wrapper {\n position: relative;\n}\n\n/* Main Button */\n.vs-button {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n transition: all 0.15s ease;\n min-width: 140px;\n max-width: 280px;\n}\n\n.vs-button:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.vs-button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.vs-button.open {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.vs-button.modified {\n border-color: var(--mj-status-warning);\n}\n\n.vs-btn-icon {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n\n.vs-btn-name {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-align: left;\n}\n\n.vs-modified-dot {\n color: var(--mj-status-warning);\n font-weight: bold;\n font-size: 18px;\n line-height: 1;\n}\n\n.vs-arrow {\n color: var(--mj-text-muted);\n font-size: 10px;\n transition: transform 0.2s ease;\n}\n\n.vs-arrow.rotated {\n transform: rotate(180deg);\n}\n\n/* ========================================\n RICH VIEW PANEL\n Styles ported directly from prototype\n ======================================== */\n\n/* Reset inherited styles inside panel */\n.vs-panel,\n.vs-panel * {\n box-sizing: border-box;\n line-height: 1.5;\n text-align: left;\n}\n\n.vs-panel {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n width: 400px;\n max-width: calc(100vw - 40px);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.16);\n z-index: 1000;\n overflow: hidden;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n/* Panel Header */\n.vs-panel-header {\n padding: 16px 20px;\n display: flex;\n align-items: center;\n gap: 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.vs-header-icon {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.vs-panel-title {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.vs-entity-badge {\n font-size: 11px;\n font-weight: 500;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.vs-close-btn {\n margin-left: auto;\n background: none;\n border: none;\n cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 16px;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.vs-close-btn:hover {\n color: var(--mj-text-primary);\n}\n\n/* Panel Search */\n.vs-panel-search {\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.vs-search-input {\n width: 100%;\n padding: 6px 12px 6px 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n font-size: 13px;\n background: var(--mj-bg-surface-card) url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512' fill='%23999'%3E%3Cpath d='M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208z'/%3E%3C/svg%3E\") no-repeat 10px center;\n background-size: 14px;\n box-sizing: border-box;\n font-family: inherit;\n}\n\n.vs-search-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n.vs-search-input::placeholder {\n color: var(--mj-text-muted);\n}\n\n/* Panel Body */\n.vs-panel-body {\n max-height: 400px;\n overflow-y: auto;\n}\n\n/* View Section */\n.vs-section {\n padding: 8px 0;\n}\n\n.vs-section-header {\n padding: 6px 20px;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.vs-section-header i {\n font-size: 10px;\n}\n\n.vs-section-count {\n background: var(--mj-border-default);\n padding: 0 6px;\n border-radius: 8px;\n font-size: 10px;\n}\n\n/* View Card */\n.vs-card {\n padding: 10px 20px;\n cursor: pointer;\n transition: background 0.1s;\n display: flex;\n align-items: flex-start;\n gap: 12px;\n}\n\n.vs-card:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.vs-card.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-brand-primary);\n padding-left: 17px;\n}\n\n/* View Card Icon */\n.vs-card-icon {\n width: 32px;\n height: 32px;\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 14px;\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n.vs-card-icon.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.vs-card-icon.shared {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-muted);\n}\n\n/* View Card Content */\n.vs-card-content {\n flex: 1;\n min-width: 0;\n padding-top: 4px;\n}\n\n.vs-card-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.vs-card.active .vs-card-name {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.vs-default-badge {\n font-size: 9px;\n font-weight: 600;\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n padding: 1px 5px;\n border-radius: 6px;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.vs-shared-badge {\n font-size: 9px;\n font-weight: 600;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n padding: 1px 5px;\n border-radius: 6px;\n}\n\n.vs-shared-badge.editable {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.vs-card-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.vs-card-meta {\n display: flex;\n gap: 10px;\n margin-top: 4px;\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.vs-card-meta span {\n display: flex;\n align-items: center;\n gap: 3px;\n}\n\n.vs-card-meta i {\n font-size: 10px;\n}\n\n/* View Card Check */\n.vs-card-check {\n color: var(--mj-brand-primary);\n font-size: 12px;\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n/* View Card Actions (hover reveal) */\n.vs-card-actions {\n display: flex;\n gap: 2px;\n opacity: 0;\n transition: opacity 0.15s;\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n.vs-card:hover .vs-card-actions {\n opacity: 1;\n}\n\n.vs-action-btn {\n width: 26px;\n height: 26px;\n border-radius: 4px;\n border: none;\n background: none;\n cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.vs-action-btn:hover {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n}\n\n/* Empty State */\n.vs-empty-message {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.vs-empty-message i {\n font-size: 16px;\n opacity: 0.5;\n}\n\n.vs-empty-text {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.vs-empty-text strong {\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n.vs-empty-text span {\n font-size: 12px;\n}\n\n/* Loading */\n.vs-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 20px;\n color: var(--mj-text-muted);\n font-size: 13px;\n text-align: center;\n}\n\n/* Panel Footer */\n.vs-panel-footer {\n padding: 12px 20px;\n border-top: 1px solid var(--mj-border-default);\n display: flex;\n gap: 8px;\n}\n\n.vs-panel-btn {\n flex: 1;\n padding: 8px 12px;\n border-radius: 4px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n transition: all 0.15s;\n font-family: inherit;\n text-align: center;\n}\n\n.vs-panel-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.vs-panel-btn.primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.vs-panel-btn.primary:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.vs-panel-btn i {\n font-size: 11px;\n}\n\n/* ========================================\n ICON BUTTONS (outside panel)\n ======================================== */\n\n.vs-icon-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n cursor: pointer;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n\n.vs-icon-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-brand-primary);\n}\n\n.vs-icon-btn i {\n font-size: 12px;\n}\n\n.vs-export-btn:hover {\n color: var(--mj-status-success);\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .vs-button {\n min-width: 100px;\n max-width: 180px;\n padding: 6px 10px;\n }\n\n .vs-panel {\n width: calc(100vw - 32px);\n max-width: 400px;\n }\n}\n"], encapsulation: 2 });
829
- }
830
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ViewSelectorComponent, [{
831
- type: Component,
832
- args: [{ standalone: false, selector: 'mj-view-selector', encapsulation: ViewEncapsulation.None, template: "<div class=\"vs-container\">\n <!-- Backdrop for closing panel -->\n @if (isDropdownOpen) {\n <div class=\"vs-backdrop\" (click)=\"closeDropdown()\"></div>\n }\n\n <!-- Main View Selector Button -->\n <div class=\"vs-wrapper\">\n <button\n class=\"vs-button\"\n [class.modified]=\"viewModified\"\n [class.open]=\"isDropdownOpen\"\n (click)=\"toggleDropdown()\"\n [disabled]=\"isLoading\"\n title=\"Select a saved view\">\n <i class=\"fa-solid fa-layer-group vs-btn-icon\"></i>\n <span class=\"vs-btn-name\">{{ displayName }}</span>\n @if (viewModified) {\n <span class=\"vs-modified-dot\" title=\"View has unsaved changes\">\u2022</span>\n }\n <i class=\"fa-solid fa-chevron-down vs-arrow\" [class.rotated]=\"isDropdownOpen\"></i>\n </button>\n\n <!-- Rich View Panel -->\n @if (isDropdownOpen) {\n <div class=\"vs-panel\">\n <!-- Panel Header -->\n <div class=\"vs-panel-header\">\n <i class=\"fa-solid fa-table-list vs-header-icon\"></i>\n <span class=\"vs-panel-title\">Views</span>\n @if (entity) {\n <span class=\"vs-entity-badge\">{{ entity.DisplayNameOrName }}</span>\n }\n <button class=\"vs-close-btn\" (click)=\"closeDropdown()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Search -->\n <div class=\"vs-panel-search\">\n <input\n type=\"text\"\n class=\"vs-search-input\"\n placeholder=\"Search views...\"\n [(ngModel)]=\"searchText\"\n (keydown.escape)=\"searchText = ''\"\n />\n </div>\n\n <!-- Panel Body -->\n <div class=\"vs-panel-body\">\n <!-- Default Option -->\n <div class=\"vs-section\">\n <div\n class=\"vs-card\"\n [class.active]=\"!selectedViewId\"\n (click)=\"selectDefault()\">\n <div class=\"vs-card-icon\" [class.active]=\"!selectedViewId\">\n <i class=\"fa-solid fa-table\"></i>\n </div>\n <div class=\"vs-card-content\">\n <div class=\"vs-card-name\">(Default)</div>\n </div>\n @if (!selectedViewId) {\n <i class=\"fa-solid fa-check vs-card-check\"></i>\n }\n </div>\n </div>\n\n <!-- My Views Section -->\n @if (filteredMyViews.length > 0) {\n <div class=\"vs-section\">\n <div class=\"vs-section-header\">\n <i class=\"fa-solid fa-user\"></i>\n <span>My Views</span>\n <span class=\"vs-section-count\">{{ filteredMyViews.length }}</span>\n </div>\n @for (view of filteredMyViews; track view.id) {\n <div\n class=\"vs-card\"\n [class.active]=\"selectedViewId === view.id\"\n (click)=\"selectView(view)\">\n <div class=\"vs-card-icon\" [class.active]=\"selectedViewId === view.id\">\n <i class=\"fa-solid fa-table-list\"></i>\n </div>\n <div class=\"vs-card-content\">\n <div class=\"vs-card-name\">\n {{ view.name }}\n @if (view.isDefault) {\n <span class=\"vs-default-badge\">Default</span>\n }\n </div>\n @if (view.entity.Description) {\n <div class=\"vs-card-desc\">{{ view.entity.Description }}</div>\n }\n @if (getViewFilterCount(view) > 0 || getViewColumnCount(view) > 0 || getViewSortInfo(view)) {\n <div class=\"vs-card-meta\">\n @if (getViewFilterCount(view) > 0) {\n <span><i class=\"fa-solid fa-filter\"></i> {{ getViewFilterCount(view) }} filter{{ getViewFilterCount(view) !== 1 ? 's' : '' }}</span>\n }\n @if (getViewColumnCount(view) > 0) {\n <span><i class=\"fa-solid fa-table-columns\"></i> {{ getViewColumnCount(view) }} col{{ getViewColumnCount(view) !== 1 ? 's' : '' }}</span>\n }\n @if (getViewSortInfo(view)) {\n <span><i class=\"fa-solid fa-arrow-down-short-wide\"></i> {{ getViewSortInfo(view) }}</span>\n }\n </div>\n }\n </div>\n <div class=\"vs-card-actions\">\n <button\n class=\"vs-action-btn\"\n (click)=\"onDuplicateView(view.id, $event)\"\n title=\"Duplicate\">\n <i class=\"fa-regular fa-copy\"></i>\n </button>\n <button\n class=\"vs-action-btn\"\n (click)=\"onConfigureViewById(view.id, $event)\"\n title=\"Configure\">\n <i class=\"fa-solid fa-sliders\"></i>\n </button>\n <button\n class=\"vs-action-btn\"\n (click)=\"onOpenViewInTab(view.id, $event)\"\n title=\"Open in Tab\">\n <i class=\"fa-solid fa-up-right-from-square\"></i>\n </button>\n </div>\n @if (selectedViewId === view.id) {\n <i class=\"fa-solid fa-check vs-card-check\"></i>\n }\n </div>\n }\n </div>\n }\n\n <!-- Shared Views Section -->\n @if (filteredSharedViews.length > 0) {\n <div class=\"vs-section\">\n <div class=\"vs-section-header\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n <span>Shared With Me</span>\n <span class=\"vs-section-count\">{{ filteredSharedViews.length }}</span>\n </div>\n @for (view of filteredSharedViews; track view.id) {\n <div\n class=\"vs-card\"\n [class.active]=\"selectedViewId === view.id\"\n (click)=\"selectView(view)\">\n <div class=\"vs-card-icon shared\">\n <i class=\"fa-solid fa-users\"></i>\n </div>\n <div class=\"vs-card-content\">\n <div class=\"vs-card-name\">\n {{ view.name }}\n @if (!view.userCanEdit) {\n <span class=\"vs-shared-badge\">View Only</span>\n } @else {\n <span class=\"vs-shared-badge editable\">Can Edit</span>\n }\n </div>\n @if (view.entity.Description) {\n <div class=\"vs-card-desc\">{{ view.entity.Description }}</div>\n }\n @if (getViewFilterCount(view) > 0 || getViewColumnCount(view) > 0) {\n <div class=\"vs-card-meta\">\n @if (getViewFilterCount(view) > 0) {\n <span><i class=\"fa-solid fa-filter\"></i> {{ getViewFilterCount(view) }} filter{{ getViewFilterCount(view) !== 1 ? 's' : '' }}</span>\n }\n @if (getViewColumnCount(view) > 0) {\n <span><i class=\"fa-solid fa-table-columns\"></i> {{ getViewColumnCount(view) }} col{{ getViewColumnCount(view) !== 1 ? 's' : '' }}</span>\n }\n </div>\n }\n </div>\n <div class=\"vs-card-actions\">\n <button\n class=\"vs-action-btn\"\n (click)=\"onDuplicateView(view.id, $event)\"\n title=\"Duplicate as My View\">\n <i class=\"fa-regular fa-copy\"></i>\n </button>\n @if (view.userCanEdit) {\n <button\n class=\"vs-action-btn\"\n (click)=\"onConfigureViewById(view.id, $event)\"\n title=\"Configure\">\n <i class=\"fa-solid fa-sliders\"></i>\n </button>\n }\n </div>\n @if (selectedViewId === view.id) {\n <i class=\"fa-solid fa-check vs-card-check\"></i>\n }\n </div>\n }\n </div>\n }\n\n <!-- No Views Message -->\n @if (!hasViews && !isLoading) {\n <div class=\"vs-empty-message\">\n <i class=\"fa-solid fa-bookmark\"></i>\n <div class=\"vs-empty-text\">\n <strong>No saved views yet</strong>\n <span>Save your current configuration as a view</span>\n </div>\n </div>\n }\n\n <!-- No Search Results -->\n @if (hasViews && filteredMyViews.length === 0 && filteredSharedViews.length === 0 && searchText) {\n <div class=\"vs-empty-message\">\n <i class=\"fa-solid fa-search\"></i>\n <span>No views match \"{{ searchText }}\"</span>\n </div>\n }\n\n <!-- Loading Indicator -->\n @if (isLoading) {\n <div class=\"vs-loading\">\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Loading views...</span>\n </div>\n }\n </div>\n\n <!-- Panel Footer -->\n <div class=\"vs-panel-footer\">\n <button\n class=\"vs-panel-btn primary\"\n (click)=\"onQuickSave()\"\n title=\"Save current view configuration\">\n <i class=\"fa-solid fa-plus\"></i>\n <span>New View</span>\n </button>\n <button\n class=\"vs-panel-btn\"\n (click)=\"onResetToDefault()\"\n title=\"Reset to default view\">\n <i class=\"fa-solid fa-arrow-rotate-left\"></i>\n <span>Reset to Default</span>\n </button>\n </div>\n </div>\n }\n </div>\n\n <!-- Open in Tab Button (only visible when a view is selected) -->\n @if (selectedViewId) {\n <button\n class=\"vs-icon-btn\"\n (click)=\"onOpenInTab()\"\n title=\"Open this view in a new tab\">\n <i class=\"fa-solid fa-external-link-alt\"></i>\n </button>\n }\n\n <!-- Configure View Button -->\n <button\n class=\"vs-icon-btn\"\n (click)=\"onConfigureView()\"\n title=\"Configure view settings (columns, filters, sorting)\">\n <i class=\"fa-solid fa-sliders-h\"></i>\n </button>\n\n <!-- Create New Record Button -->\n <button\n class=\"vs-icon-btn\"\n (click)=\"onCreateNewRecord()\"\n title=\"Create new record\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n\n <!-- Export Button -->\n <button\n class=\"vs-icon-btn vs-export-btn\"\n (click)=\"onExport()\"\n title=\"Export to Excel\">\n <i class=\"fa-solid fa-file-excel\"></i>\n </button>\n</div>\n", styles: ["/* ========================================\n VIEW SELECTOR - All classes prefixed vs-\n to avoid conflicts (ViewEncapsulation.None)\n ======================================== */\n\n/* Container */\n.vs-container {\n display: flex;\n align-items: center;\n gap: 4px;\n position: relative;\n}\n\n/* Backdrop for closing panel */\n.vs-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999;\n background: transparent;\n}\n\n.vs-wrapper {\n position: relative;\n}\n\n/* Main Button */\n.vs-button {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n transition: all 0.15s ease;\n min-width: 140px;\n max-width: 280px;\n}\n\n.vs-button:hover {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.vs-button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.vs-button.open {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.vs-button.modified {\n border-color: var(--mj-status-warning);\n}\n\n.vs-btn-icon {\n color: var(--mj-brand-primary);\n font-size: 12px;\n}\n\n.vs-btn-name {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n text-align: left;\n}\n\n.vs-modified-dot {\n color: var(--mj-status-warning);\n font-weight: bold;\n font-size: 18px;\n line-height: 1;\n}\n\n.vs-arrow {\n color: var(--mj-text-muted);\n font-size: 10px;\n transition: transform 0.2s ease;\n}\n\n.vs-arrow.rotated {\n transform: rotate(180deg);\n}\n\n/* ========================================\n RICH VIEW PANEL\n Styles ported directly from prototype\n ======================================== */\n\n/* Reset inherited styles inside panel */\n.vs-panel,\n.vs-panel * {\n box-sizing: border-box;\n line-height: 1.5;\n text-align: left;\n}\n\n.vs-panel {\n position: absolute;\n top: calc(100% + 4px);\n left: 0;\n width: 400px;\n max-width: calc(100vw - 40px);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.16);\n z-index: 1000;\n overflow: hidden;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n/* Panel Header */\n.vs-panel-header {\n padding: 16px 20px;\n display: flex;\n align-items: center;\n gap: 12px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.vs-header-icon {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.vs-panel-title {\n font-size: 15px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.vs-entity-badge {\n font-size: 11px;\n font-weight: 500;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.vs-close-btn {\n margin-left: auto;\n background: none;\n border: none;\n cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 16px;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.vs-close-btn:hover {\n color: var(--mj-text-primary);\n}\n\n/* Panel Search */\n.vs-panel-search {\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.vs-search-input {\n width: 100%;\n padding: 6px 12px 6px 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n font-size: 13px;\n background: var(--mj-bg-surface-card) url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512' fill='%23999'%3E%3Cpath d='M416 208c0 45.9-14.9 88.3-40 122.7L502.6 457.4c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0L330.7 376c-34.4 25.2-76.8 40-122.7 40C93.1 416 0 322.9 0 208S93.1 0 208 0S416 93.1 416 208z'/%3E%3C/svg%3E\") no-repeat 10px center;\n background-size: 14px;\n box-sizing: border-box;\n font-family: inherit;\n}\n\n.vs-search-input:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n.vs-search-input::placeholder {\n color: var(--mj-text-muted);\n}\n\n/* Panel Body */\n.vs-panel-body {\n max-height: 400px;\n overflow-y: auto;\n}\n\n/* View Section */\n.vs-section {\n padding: 8px 0;\n}\n\n.vs-section-header {\n padding: 6px 20px;\n font-size: 11px;\n font-weight: 700;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.vs-section-header i {\n font-size: 10px;\n}\n\n.vs-section-count {\n background: var(--mj-border-default);\n padding: 0 6px;\n border-radius: 8px;\n font-size: 10px;\n}\n\n/* View Card */\n.vs-card {\n padding: 10px 20px;\n cursor: pointer;\n transition: background 0.1s;\n display: flex;\n align-items: flex-start;\n gap: 12px;\n}\n\n.vs-card:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n}\n\n.vs-card.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n border-left: 3px solid var(--mj-brand-primary);\n padding-left: 17px;\n}\n\n/* View Card Icon */\n.vs-card-icon {\n width: 32px;\n height: 32px;\n border-radius: 6px;\n background: var(--mj-bg-surface-card);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-text-muted);\n font-size: 14px;\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n.vs-card-icon.active {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.vs-card-icon.shared {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-muted);\n}\n\n/* View Card Content */\n.vs-card-content {\n flex: 1;\n min-width: 0;\n padding-top: 4px;\n}\n\n.vs-card-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.vs-card.active .vs-card-name {\n color: var(--mj-brand-primary);\n font-weight: 600;\n}\n\n.vs-default-badge {\n font-size: 9px;\n font-weight: 600;\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n padding: 1px 5px;\n border-radius: 6px;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.vs-shared-badge {\n font-size: 9px;\n font-weight: 600;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n padding: 1px 5px;\n border-radius: 6px;\n}\n\n.vs-shared-badge.editable {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.vs-card-desc {\n font-size: 12px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.vs-card-meta {\n display: flex;\n gap: 10px;\n margin-top: 4px;\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.vs-card-meta span {\n display: flex;\n align-items: center;\n gap: 3px;\n}\n\n.vs-card-meta i {\n font-size: 10px;\n}\n\n/* View Card Check */\n.vs-card-check {\n color: var(--mj-brand-primary);\n font-size: 12px;\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n/* View Card Actions (hover reveal) */\n.vs-card-actions {\n display: flex;\n gap: 2px;\n opacity: 0;\n transition: opacity 0.15s;\n flex-shrink: 0;\n margin-top: 2px;\n}\n\n.vs-card:hover .vs-card-actions {\n opacity: 1;\n}\n\n.vs-action-btn {\n width: 26px;\n height: 26px;\n border-radius: 4px;\n border: none;\n background: none;\n cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.vs-action-btn:hover {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n}\n\n/* Empty State */\n.vs-empty-message {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px;\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.vs-empty-message i {\n font-size: 16px;\n opacity: 0.5;\n}\n\n.vs-empty-text {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.vs-empty-text strong {\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n.vs-empty-text span {\n font-size: 12px;\n}\n\n/* Loading */\n.vs-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 20px;\n color: var(--mj-text-muted);\n font-size: 13px;\n text-align: center;\n}\n\n/* Panel Footer */\n.vs-panel-footer {\n padding: 12px 20px;\n border-top: 1px solid var(--mj-border-default);\n display: flex;\n gap: 8px;\n}\n\n.vs-panel-btn {\n flex: 1;\n padding: 8px 12px;\n border-radius: 4px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n transition: all 0.15s;\n font-family: inherit;\n text-align: center;\n}\n\n.vs-panel-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n}\n\n.vs-panel-btn.primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n}\n\n.vs-panel-btn.primary:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.vs-panel-btn i {\n font-size: 11px;\n}\n\n/* ========================================\n ICON BUTTONS (outside panel)\n ======================================== */\n\n.vs-icon-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n cursor: pointer;\n color: var(--mj-text-secondary);\n transition: all 0.15s ease;\n}\n\n.vs-icon-btn:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-brand-primary);\n}\n\n.vs-icon-btn i {\n font-size: 12px;\n}\n\n.vs-export-btn:hover {\n color: var(--mj-status-success);\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .vs-button {\n min-width: 100px;\n max-width: 180px;\n padding: 6px 10px;\n }\n\n .vs-panel {\n width: calc(100vw - 32px);\n max-width: 400px;\n }\n}\n"] }]
833
- }], () => [{ type: i0.ChangeDetectorRef }], { entity: [{
834
- type: Input
835
- }], selectedViewId: [{
836
- type: Input
837
- }], viewModified: [{
838
- type: Input
839
- }], viewSelected: [{
840
- type: Output
841
- }], saveViewRequested: [{
842
- type: Output
843
- }], manageViewsRequested: [{
844
- type: Output
845
- }], openInTabRequested: [{
846
- type: Output
847
- }], configureViewRequested: [{
848
- type: Output
849
- }], createNewRecordRequested: [{
850
- type: Output
851
- }], exportRequested: [{
852
- type: Output
853
- }], duplicateViewRequested: [{
854
- type: Output
855
- }], quickSaveRequested: [{
856
- type: Output
857
- }], revertRequested: [{
858
- type: Output
859
- }] }); })();
860
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ViewSelectorComponent, { className: "ViewSelectorComponent", filePath: "src/DataExplorer/components/view-selector/view-selector.component.ts", lineNumber: 54 }); })();
861
- //# sourceMappingURL=view-selector.component.js.map