@memberjunction/ng-base-forms 6.1.0-edge.2 → 6.1.0-edge.4

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 (125) hide show
  1. package/LICENSE +180 -4
  2. package/README.md +4 -1
  3. package/dist/lib/base-form-component.d.ts +93 -3
  4. package/dist/lib/base-form-component.d.ts.map +1 -1
  5. package/dist/lib/base-form-component.js +240 -9
  6. package/dist/lib/base-form-component.js.map +1 -1
  7. package/dist/lib/chrome/base-form-policy.d.ts +26 -0
  8. package/dist/lib/chrome/base-form-policy.d.ts.map +1 -0
  9. package/dist/lib/chrome/base-form-policy.js +9 -0
  10. package/dist/lib/chrome/base-form-policy.js.map +1 -0
  11. package/dist/lib/chrome/clipped-title.d.ts +8 -0
  12. package/dist/lib/chrome/clipped-title.d.ts.map +1 -0
  13. package/dist/lib/chrome/clipped-title.js +18 -0
  14. package/dist/lib/chrome/clipped-title.js.map +1 -0
  15. package/dist/lib/chrome/form-chrome-coordinator.service.d.ts +35 -0
  16. package/dist/lib/chrome/form-chrome-coordinator.service.d.ts.map +1 -0
  17. package/dist/lib/chrome/form-chrome-coordinator.service.js +96 -0
  18. package/dist/lib/chrome/form-chrome-coordinator.service.js.map +1 -0
  19. package/dist/lib/chrome/form-chrome-rail-pref.d.ts +24 -0
  20. package/dist/lib/chrome/form-chrome-rail-pref.d.ts.map +1 -0
  21. package/dist/lib/chrome/form-chrome-rail-pref.js +52 -0
  22. package/dist/lib/chrome/form-chrome-rail-pref.js.map +1 -0
  23. package/dist/lib/chrome/form-chrome.d.ts +59 -0
  24. package/dist/lib/chrome/form-chrome.d.ts.map +1 -0
  25. package/dist/lib/chrome/form-chrome.js +37 -0
  26. package/dist/lib/chrome/form-chrome.js.map +1 -0
  27. package/dist/lib/chrome/load-form-chrome-rules.d.ts +8 -0
  28. package/dist/lib/chrome/load-form-chrome-rules.d.ts.map +1 -0
  29. package/dist/lib/chrome/load-form-chrome-rules.js +70 -0
  30. package/dist/lib/chrome/load-form-chrome-rules.js.map +1 -0
  31. package/dist/lib/chrome/resolve-form-chrome.d.ts +114 -0
  32. package/dist/lib/chrome/resolve-form-chrome.d.ts.map +1 -0
  33. package/dist/lib/chrome/resolve-form-chrome.js +713 -0
  34. package/dist/lib/chrome/resolve-form-chrome.js.map +1 -0
  35. package/dist/lib/container/record-form-container.component.d.ts +170 -6
  36. package/dist/lib/container/record-form-container.component.d.ts.map +1 -1
  37. package/dist/lib/container/record-form-container.component.js +1194 -62
  38. package/dist/lib/container/record-form-container.component.js.map +1 -1
  39. package/dist/lib/explorer-entity-data-grid.component.d.ts +54 -1
  40. package/dist/lib/explorer-entity-data-grid.component.d.ts.map +1 -1
  41. package/dist/lib/explorer-entity-data-grid.component.js +143 -7
  42. package/dist/lib/explorer-entity-data-grid.component.js.map +1 -1
  43. package/dist/lib/form-record-refresh.coordinator.d.ts +27 -0
  44. package/dist/lib/form-record-refresh.coordinator.d.ts.map +1 -0
  45. package/dist/lib/form-record-refresh.coordinator.js +33 -0
  46. package/dist/lib/form-record-refresh.coordinator.js.map +1 -0
  47. package/dist/lib/form-state.interface.d.ts +4 -0
  48. package/dist/lib/form-state.interface.d.ts.map +1 -1
  49. package/dist/lib/form-state.interface.js.map +1 -1
  50. package/dist/lib/form-state.service.d.ts +5 -0
  51. package/dist/lib/form-state.service.d.ts.map +1 -1
  52. package/dist/lib/form-state.service.js +23 -2
  53. package/dist/lib/form-state.service.js.map +1 -1
  54. package/dist/lib/host/entity-form-host.component.d.ts +5 -1
  55. package/dist/lib/host/entity-form-host.component.d.ts.map +1 -1
  56. package/dist/lib/host/entity-form-host.component.js +16 -2
  57. package/dist/lib/host/entity-form-host.component.js.map +1 -1
  58. package/dist/lib/isa-related-panel/isa-related-panel.component.d.ts +6 -2
  59. package/dist/lib/isa-related-panel/isa-related-panel.component.d.ts.map +1 -1
  60. package/dist/lib/isa-related-panel/isa-related-panel.component.js +15 -1
  61. package/dist/lib/isa-related-panel/isa-related-panel.component.js.map +1 -1
  62. package/dist/lib/panel/collapsible-panel.component.d.ts +24 -2
  63. package/dist/lib/panel/collapsible-panel.component.d.ts.map +1 -1
  64. package/dist/lib/panel/collapsible-panel.component.js +104 -10
  65. package/dist/lib/panel/collapsible-panel.component.js.map +1 -1
  66. package/dist/lib/panel-slot/base-form-panel.d.ts +85 -1
  67. package/dist/lib/panel-slot/base-form-panel.d.ts.map +1 -1
  68. package/dist/lib/panel-slot/base-form-panel.js +72 -3
  69. package/dist/lib/panel-slot/base-form-panel.js.map +1 -1
  70. package/dist/lib/panel-slot/collect-form-panel-registrations.d.ts +8 -0
  71. package/dist/lib/panel-slot/collect-form-panel-registrations.d.ts.map +1 -0
  72. package/dist/lib/panel-slot/collect-form-panel-registrations.js +19 -0
  73. package/dist/lib/panel-slot/collect-form-panel-registrations.js.map +1 -0
  74. package/dist/lib/panel-slot/form-contribution.d.ts +79 -0
  75. package/dist/lib/panel-slot/form-contribution.d.ts.map +1 -0
  76. package/dist/lib/panel-slot/form-contribution.js +253 -0
  77. package/dist/lib/panel-slot/form-contribution.js.map +1 -0
  78. package/dist/lib/panel-slot/form-contributions.component.d.ts +27 -0
  79. package/dist/lib/panel-slot/form-contributions.component.d.ts.map +1 -0
  80. package/dist/lib/panel-slot/form-contributions.component.js +83 -0
  81. package/dist/lib/panel-slot/form-contributions.component.js.map +1 -0
  82. package/dist/lib/panel-slot/form-panel-slot.component.d.ts +2 -0
  83. package/dist/lib/panel-slot/form-panel-slot.component.d.ts.map +1 -1
  84. package/dist/lib/panel-slot/form-panel-slot.component.js +35 -4
  85. package/dist/lib/panel-slot/form-panel-slot.component.js.map +1 -1
  86. package/dist/lib/panel-slot/related-entity-grid-panel.component.d.ts +22 -0
  87. package/dist/lib/panel-slot/related-entity-grid-panel.component.d.ts.map +1 -0
  88. package/dist/lib/panel-slot/related-entity-grid-panel.component.js +78 -0
  89. package/dist/lib/panel-slot/related-entity-grid-panel.component.js.map +1 -0
  90. package/dist/lib/related-grid-height.d.ts +20 -0
  91. package/dist/lib/related-grid-height.d.ts.map +1 -0
  92. package/dist/lib/related-grid-height.js +30 -0
  93. package/dist/lib/related-grid-height.js.map +1 -0
  94. package/dist/lib/section-manager/section-manager.component.d.ts +20 -1
  95. package/dist/lib/section-manager/section-manager.component.d.ts.map +1 -1
  96. package/dist/lib/section-manager/section-manager.component.js +204 -25
  97. package/dist/lib/section-manager/section-manager.component.js.map +1 -1
  98. package/dist/lib/toolbar/form-toolbar.component.d.ts +55 -4
  99. package/dist/lib/toolbar/form-toolbar.component.d.ts.map +1 -1
  100. package/dist/lib/toolbar/form-toolbar.component.js +734 -306
  101. package/dist/lib/toolbar/form-toolbar.component.js.map +1 -1
  102. package/dist/lib/types/form-events.d.ts +35 -0
  103. package/dist/lib/types/form-events.d.ts.map +1 -1
  104. package/dist/lib/types/form-events.js +45 -0
  105. package/dist/lib/types/form-events.js.map +1 -1
  106. package/dist/lib/types/form-toolbar-item.d.ts +145 -0
  107. package/dist/lib/types/form-toolbar-item.d.ts.map +1 -0
  108. package/dist/lib/types/form-toolbar-item.js +2 -0
  109. package/dist/lib/types/form-toolbar-item.js.map +1 -0
  110. package/dist/lib/types/form-types.d.ts +8 -0
  111. package/dist/lib/types/form-types.d.ts.map +1 -1
  112. package/dist/lib/types/form-types.js.map +1 -1
  113. package/dist/lib/types/toolbar-config.d.ts +7 -2
  114. package/dist/lib/types/toolbar-config.d.ts.map +1 -1
  115. package/dist/lib/types/toolbar-config.js +6 -0
  116. package/dist/lib/types/toolbar-config.js.map +1 -1
  117. package/dist/module.d.ts +17 -14
  118. package/dist/module.d.ts.map +1 -1
  119. package/dist/module.js +14 -0
  120. package/dist/module.js.map +1 -1
  121. package/dist/public-api.d.ts +13 -0
  122. package/dist/public-api.d.ts.map +1 -1
  123. package/dist/public-api.js +14 -0
  124. package/dist/public-api.js.map +1 -1
  125. package/package.json +19 -18
@@ -1,28 +1,32 @@
1
1
  import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ChangeDetectorRef, inject } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  const _forTrack0 = ($index, $item) => $item.SectionKey;
4
- function MjSectionManagerComponent_Conditional_0_For_10_Template(rf, ctx) { if (rf & 1) {
4
+ function MjSectionManagerComponent_Conditional_0_Conditional_9_For_3_Template(rf, ctx) { if (rf & 1) {
5
5
  const _r3 = i0.ɵɵgetCurrentView();
6
- i0.ɵɵelementStart(0, "div", 9)(1, "div", 13);
7
- i0.ɵɵelement(2, "i", 14);
8
- i0.ɵɵelementStart(3, "span", 15);
6
+ i0.ɵɵelementStart(0, "div", 13)(1, "div", 16);
7
+ i0.ɵɵelement(2, "i", 17);
8
+ i0.ɵɵelementStart(3, "span", 18);
9
9
  i0.ɵɵtext(4);
10
10
  i0.ɵɵelementEnd();
11
11
  i0.ɵɵelementStart(5, "span");
12
12
  i0.ɵɵtext(6);
13
13
  i0.ɵɵelementEnd()();
14
- i0.ɵɵelementStart(7, "div", 16)(8, "button", 17);
15
- i0.ɵɵlistener("click", function MjSectionManagerComponent_Conditional_0_For_10_Template_button_click_8_listener() { const ɵ$index_19_r4 = i0.ɵɵrestoreView(_r3).$index; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnMoveUp(ɵ$index_19_r4)); });
16
- i0.ɵɵelement(9, "i", 18);
14
+ i0.ɵɵelementStart(7, "div", 19)(8, "button", 20);
15
+ i0.ɵɵlistener("click", function MjSectionManagerComponent_Conditional_0_Conditional_9_For_3_Template_button_click_8_listener() { const ɵ$index_23_r4 = i0.ɵɵrestoreView(_r3).$index; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnMoveGroupUp(ctx_r1.FirstClassSections, ɵ$index_23_r4)); });
16
+ i0.ɵɵelement(9, "i", 21);
17
17
  i0.ɵɵelementEnd();
18
- i0.ɵɵelementStart(10, "button", 19);
19
- i0.ɵɵlistener("click", function MjSectionManagerComponent_Conditional_0_For_10_Template_button_click_10_listener() { const ɵ$index_19_r4 = i0.ɵɵrestoreView(_r3).$index; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnMoveDown(ɵ$index_19_r4)); });
20
- i0.ɵɵelement(11, "i", 20);
18
+ i0.ɵɵelementStart(10, "button", 22);
19
+ i0.ɵɵlistener("click", function MjSectionManagerComponent_Conditional_0_Conditional_9_For_3_Template_button_click_10_listener() { const ɵ$index_23_r4 = i0.ɵɵrestoreView(_r3).$index; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnMoveGroupDown(ctx_r1.FirstClassSections, ɵ$index_23_r4)); });
20
+ i0.ɵɵelement(11, "i", 23);
21
+ i0.ɵɵelementEnd();
22
+ i0.ɵɵelementStart(12, "button", 24);
23
+ i0.ɵɵlistener("click", function MjSectionManagerComponent_Conditional_0_Conditional_9_For_3_Template_button_click_12_listener() { const section_r5 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnMoveToMore(section_r5)); });
24
+ i0.ɵɵelement(13, "i", 25);
21
25
  i0.ɵɵelementEnd()()();
22
26
  } if (rf & 2) {
23
27
  const section_r5 = ctx.$implicit;
24
- const ɵ$index_19_r4 = ctx.$index;
25
- const ctx_r1 = i0.ɵɵnextContext(2);
28
+ const ɵ$index_23_r4 = ctx.$index;
29
+ const ctx_r1 = i0.ɵɵnextContext(3);
26
30
  i0.ɵɵadvance(2);
27
31
  i0.ɵɵclassMap(section_r5.Icon);
28
32
  i0.ɵɵadvance(2);
@@ -32,9 +36,119 @@ function MjSectionManagerComponent_Conditional_0_For_10_Template(rf, ctx) { if (
32
36
  i0.ɵɵadvance();
33
37
  i0.ɵɵtextInterpolate1(" ", ctx_r1.GetVariantLabel(section_r5.Variant), " ");
34
38
  i0.ɵɵadvance(2);
35
- i0.ɵɵproperty("disabled", ɵ$index_19_r4 === 0);
39
+ i0.ɵɵproperty("disabled", ɵ$index_23_r4 === 0);
40
+ i0.ɵɵadvance(2);
41
+ i0.ɵɵproperty("disabled", ɵ$index_23_r4 === ctx_r1.FirstClassSections.length - 1);
42
+ } }
43
+ function MjSectionManagerComponent_Conditional_0_Conditional_9_Conditional_4_Template(rf, ctx) { if (rf & 1) {
44
+ i0.ɵɵelementStart(0, "div", 14);
45
+ i0.ɵɵtext(1, "Nothing on the form yet.");
46
+ i0.ɵɵelementEnd();
47
+ } }
48
+ function MjSectionManagerComponent_Conditional_0_Conditional_9_For_8_Template(rf, ctx) { if (rf & 1) {
49
+ const _r6 = i0.ɵɵgetCurrentView();
50
+ i0.ɵɵelementStart(0, "div", 15)(1, "div", 16);
51
+ i0.ɵɵelement(2, "i", 17);
52
+ i0.ɵɵelementStart(3, "span", 18);
53
+ i0.ɵɵtext(4);
54
+ i0.ɵɵelementEnd();
55
+ i0.ɵɵelementStart(5, "span", 26);
56
+ i0.ɵɵtext(6, "More");
57
+ i0.ɵɵelementEnd()();
58
+ i0.ɵɵelementStart(7, "div", 19)(8, "button", 20);
59
+ i0.ɵɵlistener("click", function MjSectionManagerComponent_Conditional_0_Conditional_9_For_8_Template_button_click_8_listener() { const ɵ$index_57_r7 = i0.ɵɵrestoreView(_r6).$index; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnMoveGroupUp(ctx_r1.MoreSections, ɵ$index_57_r7)); });
60
+ i0.ɵɵelement(9, "i", 21);
61
+ i0.ɵɵelementEnd();
62
+ i0.ɵɵelementStart(10, "button", 22);
63
+ i0.ɵɵlistener("click", function MjSectionManagerComponent_Conditional_0_Conditional_9_For_8_Template_button_click_10_listener() { const ɵ$index_57_r7 = i0.ɵɵrestoreView(_r6).$index; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnMoveGroupDown(ctx_r1.MoreSections, ɵ$index_57_r7)); });
64
+ i0.ɵɵelement(11, "i", 23);
65
+ i0.ɵɵelementEnd();
66
+ i0.ɵɵelementStart(12, "button", 27);
67
+ i0.ɵɵlistener("click", function MjSectionManagerComponent_Conditional_0_Conditional_9_For_8_Template_button_click_12_listener() { const section_r8 = i0.ɵɵrestoreView(_r6).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnMoveToForm(section_r8)); });
68
+ i0.ɵɵelement(13, "i", 28);
69
+ i0.ɵɵelementEnd()()();
70
+ } if (rf & 2) {
71
+ const section_r8 = ctx.$implicit;
72
+ const ɵ$index_57_r7 = ctx.$index;
73
+ const ctx_r1 = i0.ɵɵnextContext(3);
74
+ i0.ɵɵadvance(2);
75
+ i0.ɵɵclassMap(section_r8.Icon);
76
+ i0.ɵɵadvance(2);
77
+ i0.ɵɵtextInterpolate(section_r8.SectionName);
78
+ i0.ɵɵadvance(4);
79
+ i0.ɵɵproperty("disabled", ɵ$index_57_r7 === 0);
80
+ i0.ɵɵadvance(2);
81
+ i0.ɵɵproperty("disabled", ɵ$index_57_r7 === ctx_r1.MoreSections.length - 1);
36
82
  i0.ɵɵadvance(2);
37
- i0.ɵɵproperty("disabled", ɵ$index_19_r4 === ctx_r1.OrderedSections.length - 1);
83
+ i0.ɵɵproperty("disabled", ctx_r1.IsLockedInMore(section_r8))("title", ctx_r1.IsLockedInMore(section_r8) ? "Always in More" : "Move to form");
84
+ } }
85
+ function MjSectionManagerComponent_Conditional_0_Conditional_9_Conditional_9_Template(rf, ctx) { if (rf & 1) {
86
+ i0.ɵɵelementStart(0, "div", 14);
87
+ i0.ɵɵtext(1, "Nothing in More.");
88
+ i0.ɵɵelementEnd();
89
+ } }
90
+ function MjSectionManagerComponent_Conditional_0_Conditional_9_Template(rf, ctx) { if (rf & 1) {
91
+ i0.ɵɵelementStart(0, "div", 12);
92
+ i0.ɵɵtext(1, "On the form");
93
+ i0.ɵɵelementEnd();
94
+ i0.ɵɵrepeaterCreate(2, MjSectionManagerComponent_Conditional_0_Conditional_9_For_3_Template, 14, 9, "div", 13, _forTrack0);
95
+ i0.ɵɵconditionalCreate(4, MjSectionManagerComponent_Conditional_0_Conditional_9_Conditional_4_Template, 2, 0, "div", 14);
96
+ i0.ɵɵelementStart(5, "div", 12);
97
+ i0.ɵɵtext(6, "More");
98
+ i0.ɵɵelementEnd();
99
+ i0.ɵɵrepeaterCreate(7, MjSectionManagerComponent_Conditional_0_Conditional_9_For_8_Template, 14, 7, "div", 15, _forTrack0);
100
+ i0.ɵɵconditionalCreate(9, MjSectionManagerComponent_Conditional_0_Conditional_9_Conditional_9_Template, 2, 0, "div", 14);
101
+ } if (rf & 2) {
102
+ const ctx_r1 = i0.ɵɵnextContext(2);
103
+ i0.ɵɵadvance(2);
104
+ i0.ɵɵrepeater(ctx_r1.FirstClassSections);
105
+ i0.ɵɵadvance(2);
106
+ i0.ɵɵconditional(ctx_r1.FirstClassSections.length === 0 ? 4 : -1);
107
+ i0.ɵɵadvance(3);
108
+ i0.ɵɵrepeater(ctx_r1.MoreSections);
109
+ i0.ɵɵadvance(2);
110
+ i0.ɵɵconditional(ctx_r1.MoreSections.length === 0 ? 9 : -1);
111
+ } }
112
+ function MjSectionManagerComponent_Conditional_0_Conditional_10_For_1_Template(rf, ctx) { if (rf & 1) {
113
+ const _r9 = i0.ɵɵgetCurrentView();
114
+ i0.ɵɵelementStart(0, "div", 13)(1, "div", 16);
115
+ i0.ɵɵelement(2, "i", 17);
116
+ i0.ɵɵelementStart(3, "span", 18);
117
+ i0.ɵɵtext(4);
118
+ i0.ɵɵelementEnd();
119
+ i0.ɵɵelementStart(5, "span");
120
+ i0.ɵɵtext(6);
121
+ i0.ɵɵelementEnd()();
122
+ i0.ɵɵelementStart(7, "div", 19)(8, "button", 20);
123
+ i0.ɵɵlistener("click", function MjSectionManagerComponent_Conditional_0_Conditional_10_For_1_Template_button_click_8_listener() { const ɵ$index_89_r10 = i0.ɵɵrestoreView(_r9).$index; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnMoveUp(ɵ$index_89_r10)); });
124
+ i0.ɵɵelement(9, "i", 21);
125
+ i0.ɵɵelementEnd();
126
+ i0.ɵɵelementStart(10, "button", 22);
127
+ i0.ɵɵlistener("click", function MjSectionManagerComponent_Conditional_0_Conditional_10_For_1_Template_button_click_10_listener() { const ɵ$index_89_r10 = i0.ɵɵrestoreView(_r9).$index; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OnMoveDown(ɵ$index_89_r10)); });
128
+ i0.ɵɵelement(11, "i", 23);
129
+ i0.ɵɵelementEnd()()();
130
+ } if (rf & 2) {
131
+ const section_r11 = ctx.$implicit;
132
+ const ɵ$index_89_r10 = ctx.$index;
133
+ const ctx_r1 = i0.ɵɵnextContext(3);
134
+ i0.ɵɵadvance(2);
135
+ i0.ɵɵclassMap(section_r11.Icon);
136
+ i0.ɵɵadvance(2);
137
+ i0.ɵɵtextInterpolate(section_r11.SectionName);
138
+ i0.ɵɵadvance();
139
+ i0.ɵɵclassMap(i0.ɵɵinterpolate1("mj-sm-row-badge mj-sm-row-badge--", section_r11.Variant));
140
+ i0.ɵɵadvance();
141
+ i0.ɵɵtextInterpolate1(" ", ctx_r1.GetVariantLabel(section_r11.Variant), " ");
142
+ i0.ɵɵadvance(2);
143
+ i0.ɵɵproperty("disabled", ɵ$index_89_r10 === 0);
144
+ i0.ɵɵadvance(2);
145
+ i0.ɵɵproperty("disabled", ɵ$index_89_r10 === ctx_r1.OrderedSections.length - 1);
146
+ } }
147
+ function MjSectionManagerComponent_Conditional_0_Conditional_10_Template(rf, ctx) { if (rf & 1) {
148
+ i0.ɵɵrepeaterCreate(0, MjSectionManagerComponent_Conditional_0_Conditional_10_For_1_Template, 12, 9, "div", 13, _forTrack0);
149
+ } if (rf & 2) {
150
+ const ctx_r1 = i0.ɵɵnextContext(2);
151
+ i0.ɵɵrepeater(ctx_r1.OrderedSections);
38
152
  } }
39
153
  function MjSectionManagerComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
40
154
  const _r1 = i0.ɵɵgetCurrentView();
@@ -51,17 +165,17 @@ function MjSectionManagerComponent_Conditional_0_Template(rf, ctx) { if (rf & 1)
51
165
  i0.ɵɵelement(7, "i", 7);
52
166
  i0.ɵɵelementEnd()();
53
167
  i0.ɵɵelementStart(8, "div", 8);
54
- i0.ɵɵrepeaterCreate(9, MjSectionManagerComponent_Conditional_0_For_10_Template, 12, 9, "div", 9, _forTrack0);
168
+ i0.ɵɵconditionalCreate(9, MjSectionManagerComponent_Conditional_0_Conditional_9_Template, 10, 2)(10, MjSectionManagerComponent_Conditional_0_Conditional_10_Template, 2, 0);
55
169
  i0.ɵɵelementEnd();
56
- i0.ɵɵelementStart(11, "div", 10)(12, "button", 11);
170
+ i0.ɵɵelementStart(11, "div", 9)(12, "button", 10);
57
171
  i0.ɵɵlistener("click", function MjSectionManagerComponent_Conditional_0_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnReset()); });
58
- i0.ɵɵelement(13, "i", 12);
59
- i0.ɵɵtext(14, " Reset to Default Order ");
172
+ i0.ɵɵelement(13, "i", 11);
173
+ i0.ɵɵtext(14, " Reset to defaults ");
60
174
  i0.ɵɵelementEnd()()()();
61
175
  } if (rf & 2) {
62
176
  const ctx_r1 = i0.ɵɵnextContext();
63
177
  i0.ɵɵadvance(9);
64
- i0.ɵɵrepeater(ctx_r1.OrderedSections);
178
+ i0.ɵɵconditional(ctx_r1.HasMoreGroup ? 9 : 10);
65
179
  } }
66
180
  /**
67
181
  * Slide-in drawer for managing section order.
@@ -87,21 +201,35 @@ export class MjSectionManagerComponent {
87
201
  Sections = [];
88
202
  /** Current section order (array of section keys) */
89
203
  SectionOrder = [];
204
+ /** Section keys currently in More. Empty keeps a single list. */
205
+ MoreSectionKeys = [];
206
+ /** Keys that cannot leave More (System Metadata). */
207
+ LockedMoreKeys = [];
90
208
  /** Whether the drawer is visible */
91
209
  Visible = false;
92
210
  /** Emits the new section order when the user reorders */
93
211
  SectionOrderChange = new EventEmitter();
212
+ /** Emits when the user moves a section in or out of More. */
213
+ MembershipChange = new EventEmitter();
94
214
  /** Emits when the drawer is closed */
95
215
  Closed = new EventEmitter();
96
216
  /** Emits when the user resets to default order */
97
217
  ResetRequested = new EventEmitter();
98
218
  /** Ordered list of sections for display */
99
219
  OrderedSections = [];
220
+ FirstClassSections = [];
221
+ MoreSections = [];
100
222
  ngOnChanges(changes) {
101
- if (changes['Sections'] || changes['SectionOrder']) {
223
+ if (changes['Sections'] || changes['SectionOrder'] || changes['MoreSectionKeys'] || changes['LockedMoreKeys']) {
102
224
  this.RebuildOrderedSections();
103
225
  }
104
226
  }
227
+ get HasMoreGroup() {
228
+ return this.MoreSections.length > 0 || this.MoreSectionKeys.length > 0;
229
+ }
230
+ IsLockedInMore(section) {
231
+ return this.LockedMoreKeys.includes(section.SectionKey);
232
+ }
105
233
  OnClose() {
106
234
  this.Closed.emit();
107
235
  }
@@ -127,6 +255,45 @@ export class MjSectionManagerComponent {
127
255
  this.SectionOrderChange.emit(newOrder);
128
256
  this.ApplyOrder(newOrder);
129
257
  }
258
+ OnMoveGroupUp(list, index) {
259
+ if (index <= 0)
260
+ return;
261
+ this.emitReorderedGroup(list, index, index - 1);
262
+ }
263
+ OnMoveGroupDown(list, index) {
264
+ if (index >= list.length - 1)
265
+ return;
266
+ this.emitReorderedGroup(list, index, index + 1);
267
+ }
268
+ OnMoveToMore(section) {
269
+ if (this.MoreSectionKeys.includes(section.SectionKey))
270
+ return;
271
+ const more = [...this.MoreSectionKeys, section.SectionKey];
272
+ const firstClass = this.FirstClassSections
273
+ .map((s) => s.SectionKey)
274
+ .filter((key) => key !== section.SectionKey);
275
+ this.MembershipChange.emit({ moreSectionKeys: more, firstClassSectionKeys: firstClass });
276
+ }
277
+ OnMoveToForm(section) {
278
+ if (this.IsLockedInMore(section))
279
+ return;
280
+ const more = this.MoreSectionKeys.filter((key) => key !== section.SectionKey);
281
+ const firstClass = [
282
+ ...this.FirstClassSections.map((s) => s.SectionKey),
283
+ section.SectionKey,
284
+ ];
285
+ this.MembershipChange.emit({ moreSectionKeys: more, firstClassSectionKeys: firstClass });
286
+ }
287
+ emitReorderedGroup(list, from, to) {
288
+ const keys = list.map((s) => s.SectionKey);
289
+ [keys[from], keys[to]] = [keys[to], keys[from]];
290
+ const other = list === this.FirstClassSections ? this.MoreSections : this.FirstClassSections;
291
+ const combined = list === this.FirstClassSections
292
+ ? [...keys, ...other.map((s) => s.SectionKey)]
293
+ : [...other.map((s) => s.SectionKey), ...keys];
294
+ this.SectionOrderChange.emit(combined);
295
+ this.ApplyOrder(combined);
296
+ }
130
297
  OnReset() {
131
298
  this.ResetRequested.emit();
132
299
  }
@@ -169,6 +336,9 @@ export class MjSectionManagerComponent {
169
336
  ordered.push(section);
170
337
  }
171
338
  this.OrderedSections = ordered;
339
+ const moreSet = new Set(this.MoreSectionKeys);
340
+ this.FirstClassSections = ordered.filter((s) => !moreSet.has(s.SectionKey));
341
+ this.MoreSections = ordered.filter((s) => moreSet.has(s.SectionKey));
172
342
  this.cdr.markForCheck();
173
343
  }
174
344
  ApplyOrder(newOrder) {
@@ -179,30 +349,39 @@ export class MjSectionManagerComponent {
179
349
  this.OrderedSections = newOrder
180
350
  .map(key => sectionMap.get(key))
181
351
  .filter((s) => s !== undefined);
352
+ const moreSet = new Set(this.MoreSectionKeys);
353
+ this.FirstClassSections = this.OrderedSections.filter((s) => !moreSet.has(s.SectionKey));
354
+ this.MoreSections = this.OrderedSections.filter((s) => moreSet.has(s.SectionKey));
182
355
  this.cdr.markForCheck();
183
356
  }
184
357
  static ɵfac = function MjSectionManagerComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MjSectionManagerComponent)(); };
185
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MjSectionManagerComponent, selectors: [["mj-section-manager"]], inputs: { Sections: "Sections", SectionOrder: "SectionOrder", Visible: "Visible" }, outputs: { SectionOrderChange: "SectionOrderChange", Closed: "Closed", ResetRequested: "ResetRequested" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [[1, "mj-sm-overlay"], [1, "mj-sm-overlay", 3, "click"], [1, "mj-sm-drawer", 3, "click"], [1, "mj-sm-header"], [1, "mj-sm-title"], [1, "fa-solid", "fa-bars-staggered"], ["title", "Close", 1, "mj-sm-close", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "mj-sm-list"], [1, "mj-sm-row"], [1, "mj-sm-footer"], [1, "mj-sm-reset", 3, "click"], [1, "fa-solid", "fa-arrow-rotate-left"], [1, "mj-sm-row-info"], [1, "mj-sm-row-icon"], [1, "mj-sm-row-name"], [1, "mj-sm-row-actions"], ["title", "Move up", 1, "mj-sm-arrow", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-up"], ["title", "Move down", 1, "mj-sm-arrow", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-down"]], template: function MjSectionManagerComponent_Template(rf, ctx) { if (rf & 1) {
186
- i0.ɵɵconditionalCreate(0, MjSectionManagerComponent_Conditional_0_Template, 15, 0, "div", 0);
358
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MjSectionManagerComponent, selectors: [["mj-section-manager"]], inputs: { Sections: "Sections", SectionOrder: "SectionOrder", MoreSectionKeys: "MoreSectionKeys", LockedMoreKeys: "LockedMoreKeys", Visible: "Visible" }, outputs: { SectionOrderChange: "SectionOrderChange", MembershipChange: "MembershipChange", Closed: "Closed", ResetRequested: "ResetRequested" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [[1, "mj-sm-overlay"], [1, "mj-sm-overlay", 3, "click"], [1, "mj-sm-drawer", 3, "click"], [1, "mj-sm-header"], [1, "mj-sm-title"], [1, "fa-solid", "fa-bars-staggered"], ["title", "Close", 1, "mj-sm-close", 3, "click"], [1, "fa-solid", "fa-xmark"], [1, "mj-sm-list"], [1, "mj-sm-footer"], [1, "mj-sm-reset", 3, "click"], [1, "fa-solid", "fa-arrow-rotate-left"], [1, "mj-sm-group-label"], [1, "mj-sm-row"], [1, "mj-sm-empty"], [1, "mj-sm-row", "is-more"], [1, "mj-sm-row-info"], [1, "mj-sm-row-icon"], [1, "mj-sm-row-name"], [1, "mj-sm-row-actions"], ["title", "Move up", 1, "mj-sm-arrow", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-up"], ["title", "Move down", 1, "mj-sm-arrow", 3, "click", "disabled"], [1, "fa-solid", "fa-chevron-down"], ["title", "Move to More", 1, "mj-sm-arrow", "mj-sm-move", 3, "click"], [1, "fa-solid", "fa-folder-plus"], [1, "mj-sm-row-badge", "mj-sm-row-badge--more"], [1, "mj-sm-arrow", "mj-sm-move", 3, "click", "disabled", "title"], [1, "fa-solid", "fa-arrow-up-from-bracket"]], template: function MjSectionManagerComponent_Template(rf, ctx) { if (rf & 1) {
359
+ i0.ɵɵconditionalCreate(0, MjSectionManagerComponent_Conditional_0_Template, 15, 1, "div", 0);
187
360
  } if (rf & 2) {
188
361
  i0.ɵɵconditional(ctx.Visible ? 0 : -1);
189
- } }, styles: ["\n\n\n\n[_nghost-%COMP%] {\n display: block;\n}\n\n\n\n\n\n.mj-sm-overlay[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n animation: _ngcontent-%COMP%_mj-sm-fade-in 150ms ease;\n}\n\n\n\n\n\n.mj-sm-drawer[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: 340px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n box-shadow: var(--mj-shadow-lg);\n display: flex;\n flex-direction: column;\n animation: _ngcontent-%COMP%_mj-sm-slide-in 200ms ease;\n}\n\n\n\n\n\n.mj-sm-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--mj-bg-surface-elevated);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.mj-sm-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 15px;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.mj-sm-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: var(--mj-text-sm);\n}\n\n.mj-sm-close[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 6px;\n font-size: var(--mj-text-base);\n border-radius: var(--mj-radius-sm);\n transition: all var(--mj-transition-base);\n line-height: 1;\n}\n\n.mj-sm-close[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: color-mix(in srgb, var(--mj-text-primary) 5%, transparent);\n}\n\n\n\n\n\n.mj-sm-list[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 8px 0;\n}\n\n.mj-sm-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 20px;\n border-bottom: 1px solid var(--mj-bg-surface-hover);\n transition: background var(--mj-transition-base);\n}\n\n.mj-sm-row[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.mj-sm-row-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n flex: 1;\n}\n\n.mj-sm-row-icon[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n width: 18px;\n text-align: center;\n flex-shrink: 0;\n}\n\n.mj-sm-row-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: var(--mj-font-medium);\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n\n\n.mj-sm-row-badge[_ngcontent-%COMP%] {\n font-size: 10px;\n font-weight: var(--mj-font-semibold);\n padding: 2px 6px;\n border-radius: var(--mj-radius-sm);\n flex-shrink: 0;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.mj-sm-row-badge--default[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n.mj-sm-row-badge--related-entity[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-info) 10%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n\n.mj-sm-row-badge--inherited[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-accent) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-accent);\n}\n\n\n\n.mj-sm-row-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 2px;\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n.mj-sm-arrow[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-size: 11px;\n transition: all var(--mj-transition-base);\n}\n\n.mj-sm-arrow[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.mj-sm-arrow[_ngcontent-%COMP%]:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n\n\n\n\n\n.mj-sm-footer[_ngcontent-%COMP%] {\n padding: 14px 20px;\n border-top: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.mj-sm-reset[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 14px;\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-medium);\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n transition: all var(--mj-transition-base);\n font-family: inherit;\n}\n\n.mj-sm-reset[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.mj-sm-reset[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-xs);\n}\n\n\n\n\n\n@keyframes _ngcontent-%COMP%_mj-sm-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes _ngcontent-%COMP%_mj-sm-slide-in {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n}"], changeDetection: 0 });
362
+ } }, styles: ["\n\n\n\n[_nghost-%COMP%] {\n display: block;\n}\n\n\n\n\n\n.mj-sm-overlay[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n animation: _ngcontent-%COMP%_mj-sm-fade-in 150ms ease;\n}\n\n\n\n\n\n.mj-sm-drawer[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: 340px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n box-shadow: var(--mj-shadow-lg);\n display: flex;\n flex-direction: column;\n animation: _ngcontent-%COMP%_mj-sm-slide-in 200ms ease;\n}\n\n\n\n\n\n.mj-sm-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--mj-bg-surface-elevated);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.mj-sm-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 15px;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.mj-sm-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: var(--mj-text-sm);\n}\n\n.mj-sm-close[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 6px;\n font-size: var(--mj-text-base);\n border-radius: var(--mj-radius-sm);\n transition: all var(--mj-transition-base);\n line-height: 1;\n}\n\n.mj-sm-close[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n background: color-mix(in srgb, var(--mj-text-primary) 5%, transparent);\n}\n\n\n\n\n\n.mj-sm-list[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 8px 0;\n}\n\n.mj-sm-group-label[_ngcontent-%COMP%] {\n padding: 12px 20px 6px;\n font-size: 10px;\n font-weight: var(--mj-font-semibold);\n letter-spacing: 0.4px;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n.mj-sm-empty[_ngcontent-%COMP%] {\n padding: 8px 20px 12px;\n font-size: var(--mj-text-xs);\n color: var(--mj-text-disabled);\n}\n\n.mj-sm-row.is-more[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-bg-surface-sunken) 55%, transparent);\n}\n\n.mj-sm-row-badge--more[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n.mj-sm-move[_ngcontent-%COMP%] {\n margin-left: 4px;\n}\n\n.mj-sm-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 20px;\n border-bottom: 1px solid var(--mj-bg-surface-hover);\n transition: background var(--mj-transition-base);\n}\n\n.mj-sm-row[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.mj-sm-row-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n flex: 1;\n}\n\n.mj-sm-row-icon[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n width: 18px;\n text-align: center;\n flex-shrink: 0;\n}\n\n.mj-sm-row-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: var(--mj-font-medium);\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n\n\n.mj-sm-row-badge[_ngcontent-%COMP%] {\n font-size: 10px;\n font-weight: var(--mj-font-semibold);\n padding: 2px 6px;\n border-radius: var(--mj-radius-sm);\n flex-shrink: 0;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.mj-sm-row-badge--default[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n.mj-sm-row-badge--related-entity[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-info) 10%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n\n.mj-sm-row-badge--inherited[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-accent) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-accent);\n}\n\n\n\n.mj-sm-row-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 2px;\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n.mj-sm-arrow[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-size: 11px;\n transition: all var(--mj-transition-base);\n}\n\n.mj-sm-arrow[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.mj-sm-arrow[_ngcontent-%COMP%]:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n\n\n\n\n\n.mj-sm-footer[_ngcontent-%COMP%] {\n padding: 14px 20px;\n border-top: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.mj-sm-reset[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 14px;\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-medium);\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n transition: all var(--mj-transition-base);\n font-family: inherit;\n}\n\n.mj-sm-reset[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.mj-sm-reset[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: var(--mj-text-xs);\n}\n\n\n\n\n\n@keyframes _ngcontent-%COMP%_mj-sm-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes _ngcontent-%COMP%_mj-sm-slide-in {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n}"], changeDetection: 0 });
190
363
  }
191
364
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MjSectionManagerComponent, [{
192
365
  type: Component,
193
- args: [{ standalone: false, selector: 'mj-section-manager', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Overlay backdrop -->\n@if (Visible) {\n <div class=\"mj-sm-overlay\" (click)=\"OnOverlayClick($event)\">\n <!-- Drawer panel -->\n <div class=\"mj-sm-drawer\" (click)=\"$event.stopPropagation()\">\n <!-- Header -->\n <div class=\"mj-sm-header\">\n <h3 class=\"mj-sm-title\">\n <i class=\"fa-solid fa-bars-staggered\"></i>\n Manage Sections\n </h3>\n <button class=\"mj-sm-close\" (click)=\"OnClose()\" title=\"Close\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <!-- Section list -->\n <div class=\"mj-sm-list\">\n @for (section of OrderedSections; track section.SectionKey; let i = $index) {\n <div class=\"mj-sm-row\">\n <div class=\"mj-sm-row-info\">\n <i [class]=\"section.Icon\" class=\"mj-sm-row-icon\"></i>\n <span class=\"mj-sm-row-name\">{{ section.SectionName }}</span>\n <span class=\"mj-sm-row-badge mj-sm-row-badge--{{ section.Variant }}\">\n {{ GetVariantLabel(section.Variant) }}\n </span>\n </div>\n <div class=\"mj-sm-row-actions\">\n <button class=\"mj-sm-arrow\"\n [disabled]=\"i === 0\"\n (click)=\"OnMoveUp(i)\"\n title=\"Move up\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button class=\"mj-sm-arrow\"\n [disabled]=\"i === OrderedSections.length - 1\"\n (click)=\"OnMoveDown(i)\"\n title=\"Move down\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n\n <!-- Footer -->\n <div class=\"mj-sm-footer\">\n <button class=\"mj-sm-reset\" (click)=\"OnReset()\">\n <i class=\"fa-solid fa-arrow-rotate-left\"></i>\n Reset to Default Order\n </button>\n </div>\n </div>\n </div>\n}\n", styles: ["/* ============================================\n SECTION MANAGER \u2014 uses global --mj-* design tokens\n ============================================ */\n:host {\n display: block;\n}\n\n/* ============================================\n OVERLAY\n ============================================ */\n.mj-sm-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n animation: mj-sm-fade-in 150ms ease;\n}\n\n/* ============================================\n DRAWER\n ============================================ */\n.mj-sm-drawer {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: 340px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n box-shadow: var(--mj-shadow-lg);\n display: flex;\n flex-direction: column;\n animation: mj-sm-slide-in 200ms ease;\n}\n\n/* ============================================\n HEADER\n ============================================ */\n.mj-sm-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--mj-bg-surface-elevated);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.mj-sm-title {\n margin: 0;\n font-size: 15px;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.mj-sm-title i {\n color: var(--mj-brand-primary);\n font-size: var(--mj-text-sm);\n}\n\n.mj-sm-close {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 6px;\n font-size: var(--mj-text-base);\n border-radius: var(--mj-radius-sm);\n transition: all var(--mj-transition-base);\n line-height: 1;\n}\n\n.mj-sm-close:hover {\n color: var(--mj-text-primary);\n background: color-mix(in srgb, var(--mj-text-primary) 5%, transparent);\n}\n\n/* ============================================\n SECTION LIST\n ============================================ */\n.mj-sm-list {\n flex: 1;\n overflow-y: auto;\n padding: 8px 0;\n}\n\n.mj-sm-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 20px;\n border-bottom: 1px solid var(--mj-bg-surface-hover);\n transition: background var(--mj-transition-base);\n}\n\n.mj-sm-row:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.mj-sm-row-info {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n flex: 1;\n}\n\n.mj-sm-row-icon {\n font-size: 13px;\n color: var(--mj-text-secondary);\n width: 18px;\n text-align: center;\n flex-shrink: 0;\n}\n\n.mj-sm-row-name {\n font-size: 13px;\n font-weight: var(--mj-font-medium);\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* Variant badges */\n.mj-sm-row-badge {\n font-size: 10px;\n font-weight: var(--mj-font-semibold);\n padding: 2px 6px;\n border-radius: var(--mj-radius-sm);\n flex-shrink: 0;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.mj-sm-row-badge--default {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n.mj-sm-row-badge--related-entity {\n background: color-mix(in srgb, var(--mj-status-info) 10%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n\n.mj-sm-row-badge--inherited {\n background: color-mix(in srgb, var(--mj-brand-accent) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-accent);\n}\n\n/* Arrow buttons */\n.mj-sm-row-actions {\n display: flex;\n gap: 2px;\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n.mj-sm-arrow {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-size: 11px;\n transition: all var(--mj-transition-base);\n}\n\n.mj-sm-arrow:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.mj-sm-arrow:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n\n/* ============================================\n FOOTER\n ============================================ */\n.mj-sm-footer {\n padding: 14px 20px;\n border-top: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.mj-sm-reset {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 14px;\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-medium);\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n transition: all var(--mj-transition-base);\n font-family: inherit;\n}\n\n.mj-sm-reset:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.mj-sm-reset i {\n font-size: var(--mj-text-xs);\n}\n\n/* ============================================\n ANIMATIONS\n ============================================ */\n@keyframes mj-sm-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes mj-sm-slide-in {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n}\n"] }]
366
+ args: [{ standalone: false, selector: 'mj-section-manager', changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Overlay backdrop -->\n@if (Visible) {\n <div class=\"mj-sm-overlay\" (click)=\"OnOverlayClick($event)\">\n <!-- Drawer panel -->\n <div class=\"mj-sm-drawer\" (click)=\"$event.stopPropagation()\">\n <!-- Header -->\n <div class=\"mj-sm-header\">\n <h3 class=\"mj-sm-title\">\n <i class=\"fa-solid fa-bars-staggered\"></i>\n Manage Sections\n </h3>\n <button class=\"mj-sm-close\" (click)=\"OnClose()\" title=\"Close\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <!-- Section list -->\n <div class=\"mj-sm-list\">\n @if (HasMoreGroup) {\n <div class=\"mj-sm-group-label\">On the form</div>\n @for (section of FirstClassSections; track section.SectionKey; let i = $index) {\n <div class=\"mj-sm-row\">\n <div class=\"mj-sm-row-info\">\n <i [class]=\"section.Icon\" class=\"mj-sm-row-icon\"></i>\n <span class=\"mj-sm-row-name\">{{ section.SectionName }}</span>\n <span class=\"mj-sm-row-badge mj-sm-row-badge--{{ section.Variant }}\">\n {{ GetVariantLabel(section.Variant) }}\n </span>\n </div>\n <div class=\"mj-sm-row-actions\">\n <button class=\"mj-sm-arrow\"\n [disabled]=\"i === 0\"\n (click)=\"OnMoveGroupUp(FirstClassSections, i)\"\n title=\"Move up\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button class=\"mj-sm-arrow\"\n [disabled]=\"i === FirstClassSections.length - 1\"\n (click)=\"OnMoveGroupDown(FirstClassSections, i)\"\n title=\"Move down\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n <button class=\"mj-sm-arrow mj-sm-move\"\n (click)=\"OnMoveToMore(section)\"\n title=\"Move to More\">\n <i class=\"fa-solid fa-folder-plus\"></i>\n </button>\n </div>\n </div>\n }\n @if (FirstClassSections.length === 0) {\n <div class=\"mj-sm-empty\">Nothing on the form yet.</div>\n }\n\n <div class=\"mj-sm-group-label\">More</div>\n @for (section of MoreSections; track section.SectionKey; let i = $index) {\n <div class=\"mj-sm-row is-more\">\n <div class=\"mj-sm-row-info\">\n <i [class]=\"section.Icon\" class=\"mj-sm-row-icon\"></i>\n <span class=\"mj-sm-row-name\">{{ section.SectionName }}</span>\n <span class=\"mj-sm-row-badge mj-sm-row-badge--more\">More</span>\n </div>\n <div class=\"mj-sm-row-actions\">\n <button class=\"mj-sm-arrow\"\n [disabled]=\"i === 0\"\n (click)=\"OnMoveGroupUp(MoreSections, i)\"\n title=\"Move up\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button class=\"mj-sm-arrow\"\n [disabled]=\"i === MoreSections.length - 1\"\n (click)=\"OnMoveGroupDown(MoreSections, i)\"\n title=\"Move down\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n <button class=\"mj-sm-arrow mj-sm-move\"\n [disabled]=\"IsLockedInMore(section)\"\n (click)=\"OnMoveToForm(section)\"\n [title]=\"IsLockedInMore(section) ? 'Always in More' : 'Move to form'\">\n <i class=\"fa-solid fa-arrow-up-from-bracket\"></i>\n </button>\n </div>\n </div>\n }\n @if (MoreSections.length === 0) {\n <div class=\"mj-sm-empty\">Nothing in More.</div>\n }\n } @else {\n @for (section of OrderedSections; track section.SectionKey; let i = $index) {\n <div class=\"mj-sm-row\">\n <div class=\"mj-sm-row-info\">\n <i [class]=\"section.Icon\" class=\"mj-sm-row-icon\"></i>\n <span class=\"mj-sm-row-name\">{{ section.SectionName }}</span>\n <span class=\"mj-sm-row-badge mj-sm-row-badge--{{ section.Variant }}\">\n {{ GetVariantLabel(section.Variant) }}\n </span>\n </div>\n <div class=\"mj-sm-row-actions\">\n <button class=\"mj-sm-arrow\"\n [disabled]=\"i === 0\"\n (click)=\"OnMoveUp(i)\"\n title=\"Move up\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button class=\"mj-sm-arrow\"\n [disabled]=\"i === OrderedSections.length - 1\"\n (click)=\"OnMoveDown(i)\"\n title=\"Move down\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n }\n }\n </div>\n\n <!-- Footer -->\n <div class=\"mj-sm-footer\">\n <button class=\"mj-sm-reset\" (click)=\"OnReset()\">\n <i class=\"fa-solid fa-arrow-rotate-left\"></i>\n Reset to defaults\n </button>\n </div>\n </div>\n </div>\n}\n", styles: ["/* ============================================\n SECTION MANAGER \u2014 uses global --mj-* design tokens\n ============================================ */\n:host {\n display: block;\n}\n\n/* ============================================\n OVERLAY\n ============================================ */\n.mj-sm-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 1000;\n animation: mj-sm-fade-in 150ms ease;\n}\n\n/* ============================================\n DRAWER\n ============================================ */\n.mj-sm-drawer {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n width: 340px;\n max-width: 90vw;\n background: var(--mj-bg-surface);\n box-shadow: var(--mj-shadow-lg);\n display: flex;\n flex-direction: column;\n animation: mj-sm-slide-in 200ms ease;\n}\n\n/* ============================================\n HEADER\n ============================================ */\n.mj-sm-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--mj-bg-surface-elevated);\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.mj-sm-title {\n margin: 0;\n font-size: 15px;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.mj-sm-title i {\n color: var(--mj-brand-primary);\n font-size: var(--mj-text-sm);\n}\n\n.mj-sm-close {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 6px;\n font-size: var(--mj-text-base);\n border-radius: var(--mj-radius-sm);\n transition: all var(--mj-transition-base);\n line-height: 1;\n}\n\n.mj-sm-close:hover {\n color: var(--mj-text-primary);\n background: color-mix(in srgb, var(--mj-text-primary) 5%, transparent);\n}\n\n/* ============================================\n SECTION LIST\n ============================================ */\n.mj-sm-list {\n flex: 1;\n overflow-y: auto;\n padding: 8px 0;\n}\n\n.mj-sm-group-label {\n padding: 12px 20px 6px;\n font-size: 10px;\n font-weight: var(--mj-font-semibold);\n letter-spacing: 0.4px;\n text-transform: uppercase;\n color: var(--mj-text-muted);\n}\n\n.mj-sm-empty {\n padding: 8px 20px 12px;\n font-size: var(--mj-text-xs);\n color: var(--mj-text-disabled);\n}\n\n.mj-sm-row.is-more {\n background: color-mix(in srgb, var(--mj-bg-surface-sunken) 55%, transparent);\n}\n\n.mj-sm-row-badge--more {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n}\n\n.mj-sm-move {\n margin-left: 4px;\n}\n\n.mj-sm-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 20px;\n border-bottom: 1px solid var(--mj-bg-surface-hover);\n transition: background var(--mj-transition-base);\n}\n\n.mj-sm-row:hover {\n background: var(--mj-bg-surface-card);\n}\n\n.mj-sm-row-info {\n display: flex;\n align-items: center;\n gap: 10px;\n min-width: 0;\n flex: 1;\n}\n\n.mj-sm-row-icon {\n font-size: 13px;\n color: var(--mj-text-secondary);\n width: 18px;\n text-align: center;\n flex-shrink: 0;\n}\n\n.mj-sm-row-name {\n font-size: 13px;\n font-weight: var(--mj-font-medium);\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* Variant badges */\n.mj-sm-row-badge {\n font-size: 10px;\n font-weight: var(--mj-font-semibold);\n padding: 2px 6px;\n border-radius: var(--mj-radius-sm);\n flex-shrink: 0;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.mj-sm-row-badge--default {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-secondary);\n}\n\n.mj-sm-row-badge--related-entity {\n background: color-mix(in srgb, var(--mj-status-info) 10%, var(--mj-bg-surface));\n color: var(--mj-status-info);\n}\n\n.mj-sm-row-badge--inherited {\n background: color-mix(in srgb, var(--mj-brand-accent) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-accent);\n}\n\n/* Arrow buttons */\n.mj-sm-row-actions {\n display: flex;\n gap: 2px;\n flex-shrink: 0;\n margin-left: 8px;\n}\n\n.mj-sm-arrow {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-size: 11px;\n transition: all var(--mj-transition-base);\n}\n\n.mj-sm-arrow:hover:not(:disabled) {\n background: var(--mj-brand-primary);\n border-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.mj-sm-arrow:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n}\n\n/* ============================================\n FOOTER\n ============================================ */\n.mj-sm-footer {\n padding: 14px 20px;\n border-top: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.mj-sm-reset {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 14px;\n font-size: var(--mj-text-xs);\n font-weight: var(--mj-font-medium);\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n cursor: pointer;\n transition: all var(--mj-transition-base);\n font-family: inherit;\n}\n\n.mj-sm-reset:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n\n.mj-sm-reset i {\n font-size: var(--mj-text-xs);\n}\n\n/* ============================================\n ANIMATIONS\n ============================================ */\n@keyframes mj-sm-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes mj-sm-slide-in {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n}\n"] }]
194
367
  }], null, { Sections: [{
195
368
  type: Input
196
369
  }], SectionOrder: [{
197
370
  type: Input
371
+ }], MoreSectionKeys: [{
372
+ type: Input
373
+ }], LockedMoreKeys: [{
374
+ type: Input
198
375
  }], Visible: [{
199
376
  type: Input
200
377
  }], SectionOrderChange: [{
201
378
  type: Output
379
+ }], MembershipChange: [{
380
+ type: Output
202
381
  }], Closed: [{
203
382
  type: Output
204
383
  }], ResetRequested: [{
205
384
  type: Output
206
385
  }] }); })();
207
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MjSectionManagerComponent, { className: "MjSectionManagerComponent", filePath: "src/lib/section-manager/section-manager.component.ts", lineNumber: 43 }); })();
386
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MjSectionManagerComponent, { className: "MjSectionManagerComponent", filePath: "src/lib/section-manager/section-manager.component.ts", lineNumber: 48 }); })();
208
387
  //# sourceMappingURL=section-manager.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"section-manager.component.js","sourceRoot":"","sources":["../../../src/lib/section-manager/section-manager.component.ts","../../../src/lib/section-manager/section-manager.component.html"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EACtC,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,EAEnD,MAAM,eAAe,CAAC;;;;;ICgBX,AADF,8BAAuB,cACO;IAC1B,wBAAqD;IACrD,gCAA6B;IAAA,YAAyB;IAAA,iBAAO;IAC7D,4BAAqE;IACnE,YACF;IACF,AADE,iBAAO,EACH;IAEJ,AADF,+BAA+B,iBAIL;IADhB,kOAAS,8BAAW,KAAC;IAE3B,wBAAsC;IACxC,iBAAS;IACT,mCAG0B;IADlB,mOAAS,gCAAa,KAAC;IAE7B,yBAAwC;IAG9C,AADE,AADE,iBAAS,EACL,EACF;;;;;IApBC,eAAsB;IAAtB,8BAAsB;IACI,eAAyB;IAAzB,4CAAyB;IAChD,cAA8D;IAA9D,cAAA,0EAA8D,CAAA;IAClE,cACF;IADE,2EACF;IAIQ,eAAoB;IAApB,8CAAoB;IAMpB,eAA6C;IAA7C,8EAA6C;;;;IAjCjE,8BAA4D;IAAjC,gMAAS,6BAAsB,KAAC;IAEzD,8BAA6D;IAAnC,6JAAS,wBAAwB,KAAC;IAGxD,AADF,8BAA0B,YACA;IACtB,uBAA0C;IAC1C,iCACF;IAAA,iBAAK;IACL,iCAA8D;IAAlC,6LAAS,gBAAS,KAAC;IAC7C,uBAAiC;IAErC,AADE,iBAAS,EACL;IAGN,8BAAwB;IACtB,4GAwBC;IACH,iBAAM;IAIJ,AADF,gCAA0B,kBACwB;IAApB,8LAAS,gBAAS,KAAC;IAC7C,yBAA6C;IAC7C,yCACF;IAGN,AADE,AADE,AADE,iBAAS,EACL,EACF,EACF;;;IAnCA,eAwBC;IAxBD,qCAwBC;;ADzBT;;;;;;;;;;;;;;;;;GAiBG;AAQH,MAAM,OAAO,yBAAyB;IAC5B,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAExC,yCAAyC;IAChC,QAAQ,GAAyB,EAAE,CAAC;IAE7C,oDAAoD;IAC3C,YAAY,GAAa,EAAE,CAAC;IAErC,oCAAoC;IAC3B,OAAO,GAAG,KAAK,CAAC;IAEzB,yDAAyD;IAC/C,kBAAkB,GAAG,IAAI,YAAY,EAAY,CAAC;IAE5D,sCAAsC;IAC5B,MAAM,GAAG,IAAI,YAAY,EAAQ,CAAC;IAE5C,kDAAkD;IACxC,cAAc,GAAG,IAAI,YAAY,EAAQ,CAAC;IAEpD,2CAA2C;IAC3C,eAAe,GAAyB,EAAE,CAAC;IAE3C,WAAW,CAAC,OAAsB;QAChC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;YACnD,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACrB,CAAC;IAED,cAAc,CAAC,KAAiB;QAC9B,4DAA4D;QAC5D,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa,EAAE,CAAC;YACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,IAAI,KAAK,IAAI,CAAC;YAAE,OAAO;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAC7D,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;QAChF,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,UAAU,CAAC,KAAa;QACtB,IAAI,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QAC7D,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAChF,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO;QACL,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAC7B,CAAC;IAED,cAAc,CAAC,OAAqB;QAClC,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,gBAAgB,CAAC,CAAC,OAAO,kBAAkB,CAAC;YACjD,KAAK,WAAW,CAAC,CAAC,OAAO,sBAAsB,CAAC;YAChD,OAAO,CAAC,CAAC,OAAO,yBAAyB,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,eAAe,CAAC,OAAqB;QACnC,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,gBAAgB,CAAC,CAAC,OAAO,SAAS,CAAC;YACxC,KAAK,WAAW,CAAC,CAAC,OAAO,WAAW,CAAC;YACrC,OAAO,CAAC,CAAC,OAAO,QAAQ,CAAC;QAC3B,CAAC;IACH,CAAC;IAEO,sBAAsB;QAC5B,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAA8B,CAAC;QACzD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;QAED,MAAM,OAAO,GAAyB,EAAE,CAAC;QAEzC,wCAAwC;QACxC,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACpC,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBACtB,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;QACH,CAAC;QAED,gEAAgE;QAChE,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QAED,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAEO,UAAU,CAAC,QAAkB;QACnC,MAAM,UAAU,GAAG,IAAI,GAAG,EAA8B,CAAC;QACzD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACrC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,QAAQ;aAC5B,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;aAC/B,MAAM,CAAC,CAAC,CAAC,EAA2B,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QAC3D,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;mHAvHU,yBAAyB;6DAAzB,yBAAyB;YCzCtC,4FAAe;;YAAf,sCAqDC;;;iFDZY,yBAAyB;cAPrC,SAAS;6BACI,KAAK,YACP,oBAAoB,mBACb,uBAAuB,CAAC,MAAM;;kBAQ9C,KAAK;;kBAGL,KAAK;;kBAGL,KAAK;;kBAGL,MAAM;;kBAGN,MAAM;;kBAGN,MAAM;;kFAnBI,yBAAyB","sourcesContent":["import {\n Component, Input, Output, EventEmitter,\n ChangeDetectionStrategy, ChangeDetectorRef, inject,\n OnChanges, SimpleChanges\n} from '@angular/core';\nimport { PanelVariant } from '../types/form-types';\n\n/**\n * Info about a section, passed from the container to the Section Manager drawer.\n */\nexport interface SectionManagerItem {\n SectionKey: string;\n SectionName: string;\n Variant: PanelVariant;\n Icon: string;\n}\n\n/**\n * Slide-in drawer for managing section order.\n *\n * Provides an accessible, keyboard-friendly alternative to drag-and-drop\n * for reordering form sections. Each section is displayed as a row with\n * up/down arrow buttons to change position.\n *\n * @example\n * ```html\n * <mj-section-manager\n * [Sections]=\"sectionList\"\n * [SectionOrder]=\"currentOrder\"\n * [Visible]=\"showDrawer\"\n * (SectionOrderChange)=\"onOrderChange($event)\"\n * (Closed)=\"showDrawer = false\">\n * </mj-section-manager>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-section-manager',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './section-manager.component.html',\n styleUrls: ['./section-manager.component.css']\n})\nexport class MjSectionManagerComponent implements OnChanges {\n private cdr = inject(ChangeDetectorRef);\n\n /** All available sections (unordered) */\n @Input() Sections: SectionManagerItem[] = [];\n\n /** Current section order (array of section keys) */\n @Input() SectionOrder: string[] = [];\n\n /** Whether the drawer is visible */\n @Input() Visible = false;\n\n /** Emits the new section order when the user reorders */\n @Output() SectionOrderChange = new EventEmitter<string[]>();\n\n /** Emits when the drawer is closed */\n @Output() Closed = new EventEmitter<void>();\n\n /** Emits when the user resets to default order */\n @Output() ResetRequested = new EventEmitter<void>();\n\n /** Ordered list of sections for display */\n OrderedSections: SectionManagerItem[] = [];\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['Sections'] || changes['SectionOrder']) {\n this.RebuildOrderedSections();\n }\n }\n\n OnClose(): void {\n this.Closed.emit();\n }\n\n OnOverlayClick(event: MouseEvent): void {\n // Only close if clicking the overlay itself, not the drawer\n if (event.target === event.currentTarget) {\n this.OnClose();\n }\n }\n\n OnMoveUp(index: number): void {\n if (index <= 0) return;\n const newOrder = this.OrderedSections.map(s => s.SectionKey);\n [newOrder[index - 1], newOrder[index]] = [newOrder[index], newOrder[index - 1]];\n this.SectionOrderChange.emit(newOrder);\n this.ApplyOrder(newOrder);\n }\n\n OnMoveDown(index: number): void {\n if (index >= this.OrderedSections.length - 1) return;\n const newOrder = this.OrderedSections.map(s => s.SectionKey);\n [newOrder[index], newOrder[index + 1]] = [newOrder[index + 1], newOrder[index]];\n this.SectionOrderChange.emit(newOrder);\n this.ApplyOrder(newOrder);\n }\n\n OnReset(): void {\n this.ResetRequested.emit();\n }\n\n GetVariantIcon(variant: PanelVariant): string {\n switch (variant) {\n case 'related-entity': return 'fa-solid fa-link';\n case 'inherited': return 'fa-solid fa-arrow-up';\n default: return 'fa-solid fa-table-cells';\n }\n }\n\n GetVariantLabel(variant: PanelVariant): string {\n switch (variant) {\n case 'related-entity': return 'Related';\n case 'inherited': return 'Inherited';\n default: return 'Fields';\n }\n }\n\n private RebuildOrderedSections(): void {\n if (!this.Sections || this.Sections.length === 0) {\n this.OrderedSections = [];\n return;\n }\n\n const sectionMap = new Map<string, SectionManagerItem>();\n for (const s of this.Sections) {\n sectionMap.set(s.SectionKey, s);\n }\n\n const ordered: SectionManagerItem[] = [];\n\n // Add sections in persisted order first\n if (this.SectionOrder && this.SectionOrder.length > 0) {\n for (const key of this.SectionOrder) {\n const section = sectionMap.get(key);\n if (section) {\n ordered.push(section);\n sectionMap.delete(key);\n }\n }\n }\n\n // Append any sections not in the persisted order (new sections)\n for (const section of sectionMap.values()) {\n ordered.push(section);\n }\n\n this.OrderedSections = ordered;\n this.cdr.markForCheck();\n }\n\n private ApplyOrder(newOrder: string[]): void {\n const sectionMap = new Map<string, SectionManagerItem>();\n for (const s of this.OrderedSections) {\n sectionMap.set(s.SectionKey, s);\n }\n this.OrderedSections = newOrder\n .map(key => sectionMap.get(key))\n .filter((s): s is SectionManagerItem => s !== undefined);\n this.cdr.markForCheck();\n }\n}\n","<!-- Overlay backdrop -->\n@if (Visible) {\n <div class=\"mj-sm-overlay\" (click)=\"OnOverlayClick($event)\">\n <!-- Drawer panel -->\n <div class=\"mj-sm-drawer\" (click)=\"$event.stopPropagation()\">\n <!-- Header -->\n <div class=\"mj-sm-header\">\n <h3 class=\"mj-sm-title\">\n <i class=\"fa-solid fa-bars-staggered\"></i>\n Manage Sections\n </h3>\n <button class=\"mj-sm-close\" (click)=\"OnClose()\" title=\"Close\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <!-- Section list -->\n <div class=\"mj-sm-list\">\n @for (section of OrderedSections; track section.SectionKey; let i = $index) {\n <div class=\"mj-sm-row\">\n <div class=\"mj-sm-row-info\">\n <i [class]=\"section.Icon\" class=\"mj-sm-row-icon\"></i>\n <span class=\"mj-sm-row-name\">{{ section.SectionName }}</span>\n <span class=\"mj-sm-row-badge mj-sm-row-badge--{{ section.Variant }}\">\n {{ GetVariantLabel(section.Variant) }}\n </span>\n </div>\n <div class=\"mj-sm-row-actions\">\n <button class=\"mj-sm-arrow\"\n [disabled]=\"i === 0\"\n (click)=\"OnMoveUp(i)\"\n title=\"Move up\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button class=\"mj-sm-arrow\"\n [disabled]=\"i === OrderedSections.length - 1\"\n (click)=\"OnMoveDown(i)\"\n title=\"Move down\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n\n <!-- Footer -->\n <div class=\"mj-sm-footer\">\n <button class=\"mj-sm-reset\" (click)=\"OnReset()\">\n <i class=\"fa-solid fa-arrow-rotate-left\"></i>\n Reset to Default Order\n </button>\n </div>\n </div>\n </div>\n}\n"]}
1
+ {"version":3,"file":"section-manager.component.js","sourceRoot":"","sources":["../../../src/lib/section-manager/section-manager.component.ts","../../../src/lib/section-manager/section-manager.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component, Input, Output, EventEmitter,\n ChangeDetectionStrategy, ChangeDetectorRef, inject,\n OnChanges, SimpleChanges\n} from '@angular/core';\nimport { PanelVariant } from '../types/form-types';\n\n/**\n * Info about a section, passed from the container to the Section Manager drawer.\n */\nexport interface SectionManagerItem {\n SectionKey: string;\n SectionName: string;\n Variant: PanelVariant;\n Icon: string;\n}\n\nexport interface ChromeMembershipChange {\n moreSectionKeys: string[];\n firstClassSectionKeys: string[];\n}\n\n/**\n * Slide-in drawer for managing section order.\n *\n * Provides an accessible, keyboard-friendly alternative to drag-and-drop\n * for reordering form sections. Each section is displayed as a row with\n * up/down arrow buttons to change position.\n *\n * @example\n * ```html\n * <mj-section-manager\n * [Sections]=\"sectionList\"\n * [SectionOrder]=\"currentOrder\"\n * [Visible]=\"showDrawer\"\n * (SectionOrderChange)=\"onOrderChange($event)\"\n * (Closed)=\"showDrawer = false\">\n * </mj-section-manager>\n * ```\n */\n@Component({\n standalone: false,\n selector: 'mj-section-manager',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './section-manager.component.html',\n styleUrls: ['./section-manager.component.css']\n})\nexport class MjSectionManagerComponent implements OnChanges {\n private cdr = inject(ChangeDetectorRef);\n\n /** All available sections (unordered) */\n @Input() Sections: SectionManagerItem[] = [];\n\n /** Current section order (array of section keys) */\n @Input() SectionOrder: string[] = [];\n\n /** Section keys currently in More. Empty keeps a single list. */\n @Input() MoreSectionKeys: string[] = [];\n\n /** Keys that cannot leave More (System Metadata). */\n @Input() LockedMoreKeys: string[] = [];\n\n /** Whether the drawer is visible */\n @Input() Visible = false;\n\n /** Emits the new section order when the user reorders */\n @Output() SectionOrderChange = new EventEmitter<string[]>();\n\n /** Emits when the user moves a section in or out of More. */\n @Output() MembershipChange = new EventEmitter<ChromeMembershipChange>();\n\n /** Emits when the drawer is closed */\n @Output() Closed = new EventEmitter<void>();\n\n /** Emits when the user resets to default order */\n @Output() ResetRequested = new EventEmitter<void>();\n\n /** Ordered list of sections for display */\n OrderedSections: SectionManagerItem[] = [];\n FirstClassSections: SectionManagerItem[] = [];\n MoreSections: SectionManagerItem[] = [];\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['Sections'] || changes['SectionOrder'] || changes['MoreSectionKeys'] || changes['LockedMoreKeys']) {\n this.RebuildOrderedSections();\n }\n }\n\n get HasMoreGroup(): boolean {\n return this.MoreSections.length > 0 || this.MoreSectionKeys.length > 0;\n }\n\n IsLockedInMore(section: SectionManagerItem): boolean {\n return this.LockedMoreKeys.includes(section.SectionKey);\n }\n\n OnClose(): void {\n this.Closed.emit();\n }\n\n OnOverlayClick(event: MouseEvent): void {\n // Only close if clicking the overlay itself, not the drawer\n if (event.target === event.currentTarget) {\n this.OnClose();\n }\n }\n\n OnMoveUp(index: number): void {\n if (index <= 0) return;\n const newOrder = this.OrderedSections.map(s => s.SectionKey);\n [newOrder[index - 1], newOrder[index]] = [newOrder[index], newOrder[index - 1]];\n this.SectionOrderChange.emit(newOrder);\n this.ApplyOrder(newOrder);\n }\n\n OnMoveDown(index: number): void {\n if (index >= this.OrderedSections.length - 1) return;\n const newOrder = this.OrderedSections.map(s => s.SectionKey);\n [newOrder[index], newOrder[index + 1]] = [newOrder[index + 1], newOrder[index]];\n this.SectionOrderChange.emit(newOrder);\n this.ApplyOrder(newOrder);\n }\n\n OnMoveGroupUp(list: SectionManagerItem[], index: number): void {\n if (index <= 0) return;\n this.emitReorderedGroup(list, index, index - 1);\n }\n\n OnMoveGroupDown(list: SectionManagerItem[], index: number): void {\n if (index >= list.length - 1) return;\n this.emitReorderedGroup(list, index, index + 1);\n }\n\n OnMoveToMore(section: SectionManagerItem): void {\n if (this.MoreSectionKeys.includes(section.SectionKey)) return;\n const more = [...this.MoreSectionKeys, section.SectionKey];\n const firstClass = this.FirstClassSections\n .map((s) => s.SectionKey)\n .filter((key) => key !== section.SectionKey);\n this.MembershipChange.emit({ moreSectionKeys: more, firstClassSectionKeys: firstClass });\n }\n\n OnMoveToForm(section: SectionManagerItem): void {\n if (this.IsLockedInMore(section)) return;\n const more = this.MoreSectionKeys.filter((key) => key !== section.SectionKey);\n const firstClass = [\n ...this.FirstClassSections.map((s) => s.SectionKey),\n section.SectionKey,\n ];\n this.MembershipChange.emit({ moreSectionKeys: more, firstClassSectionKeys: firstClass });\n }\n\n private emitReorderedGroup(list: SectionManagerItem[], from: number, to: number): void {\n const keys = list.map((s) => s.SectionKey);\n [keys[from], keys[to]] = [keys[to], keys[from]];\n const other = list === this.FirstClassSections ? this.MoreSections : this.FirstClassSections;\n const combined = list === this.FirstClassSections\n ? [...keys, ...other.map((s) => s.SectionKey)]\n : [...other.map((s) => s.SectionKey), ...keys];\n this.SectionOrderChange.emit(combined);\n this.ApplyOrder(combined);\n }\n\n OnReset(): void {\n this.ResetRequested.emit();\n }\n\n GetVariantIcon(variant: PanelVariant): string {\n switch (variant) {\n case 'related-entity': return 'fa-solid fa-link';\n case 'inherited': return 'fa-solid fa-arrow-up';\n default: return 'fa-solid fa-table-cells';\n }\n }\n\n GetVariantLabel(variant: PanelVariant): string {\n switch (variant) {\n case 'related-entity': return 'Related';\n case 'inherited': return 'Inherited';\n default: return 'Fields';\n }\n }\n\n private RebuildOrderedSections(): void {\n if (!this.Sections || this.Sections.length === 0) {\n this.OrderedSections = [];\n return;\n }\n\n const sectionMap = new Map<string, SectionManagerItem>();\n for (const s of this.Sections) {\n sectionMap.set(s.SectionKey, s);\n }\n\n const ordered: SectionManagerItem[] = [];\n\n // Add sections in persisted order first\n if (this.SectionOrder && this.SectionOrder.length > 0) {\n for (const key of this.SectionOrder) {\n const section = sectionMap.get(key);\n if (section) {\n ordered.push(section);\n sectionMap.delete(key);\n }\n }\n }\n\n // Append any sections not in the persisted order (new sections)\n for (const section of sectionMap.values()) {\n ordered.push(section);\n }\n\n this.OrderedSections = ordered;\n const moreSet = new Set(this.MoreSectionKeys);\n this.FirstClassSections = ordered.filter((s) => !moreSet.has(s.SectionKey));\n this.MoreSections = ordered.filter((s) => moreSet.has(s.SectionKey));\n this.cdr.markForCheck();\n }\n\n private ApplyOrder(newOrder: string[]): void {\n const sectionMap = new Map<string, SectionManagerItem>();\n for (const s of this.OrderedSections) {\n sectionMap.set(s.SectionKey, s);\n }\n this.OrderedSections = newOrder\n .map(key => sectionMap.get(key))\n .filter((s): s is SectionManagerItem => s !== undefined);\n const moreSet = new Set(this.MoreSectionKeys);\n this.FirstClassSections = this.OrderedSections.filter((s) => !moreSet.has(s.SectionKey));\n this.MoreSections = this.OrderedSections.filter((s) => moreSet.has(s.SectionKey));\n this.cdr.markForCheck();\n }\n}\n","<!-- Overlay backdrop -->\n@if (Visible) {\n <div class=\"mj-sm-overlay\" (click)=\"OnOverlayClick($event)\">\n <!-- Drawer panel -->\n <div class=\"mj-sm-drawer\" (click)=\"$event.stopPropagation()\">\n <!-- Header -->\n <div class=\"mj-sm-header\">\n <h3 class=\"mj-sm-title\">\n <i class=\"fa-solid fa-bars-staggered\"></i>\n Manage Sections\n </h3>\n <button class=\"mj-sm-close\" (click)=\"OnClose()\" title=\"Close\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n </div>\n\n <!-- Section list -->\n <div class=\"mj-sm-list\">\n @if (HasMoreGroup) {\n <div class=\"mj-sm-group-label\">On the form</div>\n @for (section of FirstClassSections; track section.SectionKey; let i = $index) {\n <div class=\"mj-sm-row\">\n <div class=\"mj-sm-row-info\">\n <i [class]=\"section.Icon\" class=\"mj-sm-row-icon\"></i>\n <span class=\"mj-sm-row-name\">{{ section.SectionName }}</span>\n <span class=\"mj-sm-row-badge mj-sm-row-badge--{{ section.Variant }}\">\n {{ GetVariantLabel(section.Variant) }}\n </span>\n </div>\n <div class=\"mj-sm-row-actions\">\n <button class=\"mj-sm-arrow\"\n [disabled]=\"i === 0\"\n (click)=\"OnMoveGroupUp(FirstClassSections, i)\"\n title=\"Move up\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button class=\"mj-sm-arrow\"\n [disabled]=\"i === FirstClassSections.length - 1\"\n (click)=\"OnMoveGroupDown(FirstClassSections, i)\"\n title=\"Move down\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n <button class=\"mj-sm-arrow mj-sm-move\"\n (click)=\"OnMoveToMore(section)\"\n title=\"Move to More\">\n <i class=\"fa-solid fa-folder-plus\"></i>\n </button>\n </div>\n </div>\n }\n @if (FirstClassSections.length === 0) {\n <div class=\"mj-sm-empty\">Nothing on the form yet.</div>\n }\n\n <div class=\"mj-sm-group-label\">More</div>\n @for (section of MoreSections; track section.SectionKey; let i = $index) {\n <div class=\"mj-sm-row is-more\">\n <div class=\"mj-sm-row-info\">\n <i [class]=\"section.Icon\" class=\"mj-sm-row-icon\"></i>\n <span class=\"mj-sm-row-name\">{{ section.SectionName }}</span>\n <span class=\"mj-sm-row-badge mj-sm-row-badge--more\">More</span>\n </div>\n <div class=\"mj-sm-row-actions\">\n <button class=\"mj-sm-arrow\"\n [disabled]=\"i === 0\"\n (click)=\"OnMoveGroupUp(MoreSections, i)\"\n title=\"Move up\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button class=\"mj-sm-arrow\"\n [disabled]=\"i === MoreSections.length - 1\"\n (click)=\"OnMoveGroupDown(MoreSections, i)\"\n title=\"Move down\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n <button class=\"mj-sm-arrow mj-sm-move\"\n [disabled]=\"IsLockedInMore(section)\"\n (click)=\"OnMoveToForm(section)\"\n [title]=\"IsLockedInMore(section) ? 'Always in More' : 'Move to form'\">\n <i class=\"fa-solid fa-arrow-up-from-bracket\"></i>\n </button>\n </div>\n </div>\n }\n @if (MoreSections.length === 0) {\n <div class=\"mj-sm-empty\">Nothing in More.</div>\n }\n } @else {\n @for (section of OrderedSections; track section.SectionKey; let i = $index) {\n <div class=\"mj-sm-row\">\n <div class=\"mj-sm-row-info\">\n <i [class]=\"section.Icon\" class=\"mj-sm-row-icon\"></i>\n <span class=\"mj-sm-row-name\">{{ section.SectionName }}</span>\n <span class=\"mj-sm-row-badge mj-sm-row-badge--{{ section.Variant }}\">\n {{ GetVariantLabel(section.Variant) }}\n </span>\n </div>\n <div class=\"mj-sm-row-actions\">\n <button class=\"mj-sm-arrow\"\n [disabled]=\"i === 0\"\n (click)=\"OnMoveUp(i)\"\n title=\"Move up\">\n <i class=\"fa-solid fa-chevron-up\"></i>\n </button>\n <button class=\"mj-sm-arrow\"\n [disabled]=\"i === OrderedSections.length - 1\"\n (click)=\"OnMoveDown(i)\"\n title=\"Move down\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\n </div>\n </div>\n }\n }\n </div>\n\n <!-- Footer -->\n <div class=\"mj-sm-footer\">\n <button class=\"mj-sm-reset\" (click)=\"OnReset()\">\n <i class=\"fa-solid fa-arrow-rotate-left\"></i>\n Reset to defaults\n </button>\n </div>\n </div>\n </div>\n}\n"]}