@memberjunction/ng-base-forms 2.116.0 → 2.117.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 (33) hide show
  1. package/dist/lib/base-field-component.d.ts +20 -1
  2. package/dist/lib/base-field-component.d.ts.map +1 -1
  3. package/dist/lib/base-field-component.js +82 -32
  4. package/dist/lib/base-field-component.js.map +1 -1
  5. package/dist/lib/base-form-component.d.ts +119 -7
  6. package/dist/lib/base-form-component.d.ts.map +1 -1
  7. package/dist/lib/base-form-component.js +210 -15
  8. package/dist/lib/base-form-component.js.map +1 -1
  9. package/dist/lib/base-form-context.d.ts +23 -0
  10. package/dist/lib/base-form-context.d.ts.map +1 -0
  11. package/dist/lib/base-form-context.js +10 -0
  12. package/dist/lib/base-form-context.js.map +1 -0
  13. package/dist/lib/base-form-section-info.d.ts +28 -0
  14. package/dist/lib/base-form-section-info.d.ts.map +1 -0
  15. package/dist/lib/base-form-section-info.js +34 -0
  16. package/dist/lib/base-form-section-info.js.map +1 -0
  17. package/dist/lib/collapsible-panel.component.d.ts +50 -0
  18. package/dist/lib/collapsible-panel.component.d.ts.map +1 -0
  19. package/dist/lib/collapsible-panel.component.js +281 -0
  20. package/dist/lib/collapsible-panel.component.js.map +1 -0
  21. package/dist/lib/form-section-controls.component.d.ts +24 -0
  22. package/dist/lib/form-section-controls.component.d.ts.map +1 -0
  23. package/dist/lib/form-section-controls.component.js +150 -0
  24. package/dist/lib/form-section-controls.component.js.map +1 -0
  25. package/dist/module.d.ts +18 -16
  26. package/dist/module.d.ts.map +1 -1
  27. package/dist/module.js +14 -4
  28. package/dist/module.js.map +1 -1
  29. package/dist/public-api.d.ts +5 -0
  30. package/dist/public-api.d.ts.map +1 -1
  31. package/dist/public-api.js +4 -0
  32. package/dist/public-api.js.map +1 -1
  33. package/package.json +10 -10
@@ -0,0 +1,281 @@
1
+ import { Component, Input, ContentChildren, HostBinding, Output, EventEmitter } from '@angular/core';
2
+ import { MJFormField } from './base-field-component';
3
+ import * as i0 from "@angular/core";
4
+ const _c0 = ["*"];
5
+ function CollapsiblePanelComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
6
+ i0.ɵɵelementStart(0, "span", 11);
7
+ i0.ɵɵtext(1);
8
+ i0.ɵɵelementEnd();
9
+ } if (rf & 2) {
10
+ const ctx_r0 = i0.ɵɵnextContext();
11
+ i0.ɵɵclassProp("zero-rows", ctx_r0.badgeCount === 0);
12
+ i0.ɵɵadvance();
13
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.badgeCount, " ");
14
+ } }
15
+ /**
16
+ * Reusable collapsible panel component for form sections
17
+ * Handles:
18
+ * - Expand/collapse state
19
+ * - Search filtering with case-insensitive matching
20
+ * - Yellow highlighting of matched section names
21
+ * - Visibility management based on section name or field name matches
22
+ * - Passes sectionFilter down to child mj-form-field components for their own label highlighting
23
+ * - Panel width modes: normal (default), full-width (spans entire row)
24
+ */
25
+ export class CollapsiblePanelComponent {
26
+ cdr;
27
+ sectionKey = '';
28
+ sectionName = '';
29
+ icon = 'fa fa-folder';
30
+ form; // Reference to the form component for method calls
31
+ formContext; // Contains all form-level state
32
+ variant = 'default';
33
+ badgeCount;
34
+ entityName = ''; // For localStorage key generation
35
+ widthModeChange = new EventEmitter();
36
+ fieldComponents;
37
+ get isHidden() {
38
+ return !this.isVisible;
39
+ }
40
+ get isFullWidth() {
41
+ return this.widthMode === 'full-width';
42
+ }
43
+ get expanded() {
44
+ return this.form ? this.form.IsSectionExpanded(this.sectionKey) : true;
45
+ }
46
+ displayName = '';
47
+ fieldNames = '';
48
+ isVisible = true;
49
+ widthMode = 'normal';
50
+ constructor(cdr) {
51
+ this.cdr = cdr;
52
+ }
53
+ ngAfterContentInit() {
54
+ // Extract field names from projected field components
55
+ this.updateFieldNames();
56
+ this.fieldComponents.changes.subscribe(() => {
57
+ this.updateFieldNames();
58
+ });
59
+ // Load saved width mode from localStorage
60
+ this.loadWidthMode();
61
+ }
62
+ ngOnChanges(changes) {
63
+ if (changes['sectionName']) {
64
+ this.displayName = this.sectionName;
65
+ }
66
+ if (changes['sectionName'] || changes['formContext']) {
67
+ this.updateVisibilityAndHighlighting();
68
+ }
69
+ // Update context on all child field components when it changes
70
+ if (changes['formContext'] && this.fieldComponents) {
71
+ this.fieldComponents.forEach(field => {
72
+ field.formContext = this.formContext;
73
+ });
74
+ }
75
+ }
76
+ toggle() {
77
+ if (this.form) {
78
+ this.form.SetSectionExpanded(this.sectionKey, !this.expanded);
79
+ this.cdr.markForCheck();
80
+ }
81
+ }
82
+ toggleFullWidth(event) {
83
+ event.stopPropagation();
84
+ const newMode = this.widthMode === 'full-width' ? 'normal' : 'full-width';
85
+ // Auto-expand panel when switching to full-width mode
86
+ if (newMode === 'full-width' && !this.expanded && this.form) {
87
+ this.form.SetSectionExpanded(this.sectionKey, true);
88
+ }
89
+ this.setWidthMode(newMode);
90
+ }
91
+ setWidthMode(mode) {
92
+ this.widthMode = mode;
93
+ this.saveWidthMode();
94
+ this.widthModeChange.emit(mode);
95
+ this.cdr.markForCheck();
96
+ }
97
+ getStorageKey() {
98
+ // Generate unique key based on entity name and section key
99
+ const entity = this.entityName || 'unknown';
100
+ return `mj_panel_width_${entity}_${this.sectionKey}`;
101
+ }
102
+ saveWidthMode() {
103
+ try {
104
+ const key = this.getStorageKey();
105
+ localStorage.setItem(key, this.widthMode);
106
+ }
107
+ catch (e) {
108
+ console.warn('Failed to save panel width mode to localStorage:', e);
109
+ }
110
+ }
111
+ loadWidthMode() {
112
+ try {
113
+ const key = this.getStorageKey();
114
+ const saved = localStorage.getItem(key);
115
+ if (saved && (saved === 'normal' || saved === 'full-width')) {
116
+ this.widthMode = saved;
117
+ this.cdr.markForCheck();
118
+ }
119
+ }
120
+ catch (e) {
121
+ console.warn('Failed to load panel width mode from localStorage:', e);
122
+ }
123
+ }
124
+ updateFieldNames() {
125
+ if (this.fieldComponents) {
126
+ // Extract field display names from all mj-form-field components
127
+ const names = [];
128
+ this.fieldComponents.forEach(field => {
129
+ if (field.DisplayName) {
130
+ names.push(field.DisplayName.toLowerCase());
131
+ }
132
+ });
133
+ this.fieldNames = names.join(' ');
134
+ this.updateVisibilityAndHighlighting();
135
+ }
136
+ }
137
+ updateVisibilityAndHighlighting() {
138
+ const searchTerm = (this.formContext?.sectionFilter || '').toLowerCase().trim();
139
+ if (!searchTerm) {
140
+ // No filter - show everything, clear highlights
141
+ this.isVisible = true;
142
+ this.displayName = this.sectionName;
143
+ this.cdr.markForCheck();
144
+ return;
145
+ }
146
+ // Check if this section matches the filter (section name or any field name)
147
+ const sectionMatches = this.sectionName.toLowerCase().includes(searchTerm);
148
+ const fieldsMatch = this.fieldNames.includes(searchTerm);
149
+ this.isVisible = sectionMatches || fieldsMatch;
150
+ if (this.isVisible && sectionMatches) {
151
+ // Highlight section name if it matches
152
+ const escapedTerm = this.escapeRegex(searchTerm);
153
+ const regex = new RegExp(escapedTerm, 'gi');
154
+ this.displayName = this.sectionName.replace(regex, '<mark class="search-highlight">$&</mark>');
155
+ }
156
+ else {
157
+ this.displayName = this.sectionName;
158
+ }
159
+ this.cdr.markForCheck();
160
+ }
161
+ escapeRegex(term) {
162
+ return term.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
163
+ }
164
+ static ɵfac = function CollapsiblePanelComponent_Factory(t) { return new (t || CollapsiblePanelComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
165
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CollapsiblePanelComponent, selectors: [["mj-collapsible-panel"]], contentQueries: function CollapsiblePanelComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
166
+ i0.ɵɵcontentQuery(dirIndex, MJFormField, 5);
167
+ } if (rf & 2) {
168
+ let _t;
169
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.fieldComponents = _t);
170
+ } }, hostVars: 4, hostBindings: function CollapsiblePanelComponent_HostBindings(rf, ctx) { if (rf & 2) {
171
+ i0.ɵɵclassProp("search-hidden", ctx.isHidden)("panel-full-width", ctx.isFullWidth);
172
+ } }, inputs: { sectionKey: "sectionKey", sectionName: "sectionName", icon: "icon", form: "form", formContext: "formContext", variant: "variant", badgeCount: "badgeCount", entityName: "entityName" }, outputs: { widthModeChange: "widthModeChange" }, features: [i0.ɵɵNgOnChangesFeature], ngContentSelectors: _c0, decls: 15, vars: 14, consts: [[1, "form-card", "collapsible-card"], ["role", "button", "tabindex", "0", 1, "collapsible-header"], [1, "collapsible-title", 3, "click"], [1, "section-name", 3, "innerHTML"], [1, "row-count-badge", 3, "zero-rows"], [1, "panel-width-controls"], ["title", "Stretch panel to full width", "aria-label", "Stretch panel to full width", "type", "button", 1, "width-control-btn", 3, "click"], [1, "fa-solid", "fa-left-right"], [1, "collapse-icon", 3, "click"], [1, "collapsible-body"], [1, "form-body"], [1, "row-count-badge"]], template: function CollapsiblePanelComponent_Template(rf, ctx) { if (rf & 1) {
173
+ i0.ɵɵprojectionDef();
174
+ i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2);
175
+ i0.ɵɵlistener("click", function CollapsiblePanelComponent_Template_div_click_2_listener() { return ctx.toggle(); });
176
+ i0.ɵɵelement(3, "i");
177
+ i0.ɵɵelementStart(4, "h3");
178
+ i0.ɵɵelement(5, "span", 3);
179
+ i0.ɵɵtemplate(6, CollapsiblePanelComponent_Conditional_6_Template, 2, 3, "span", 4);
180
+ i0.ɵɵelementEnd()();
181
+ i0.ɵɵelementStart(7, "div", 5)(8, "button", 6);
182
+ i0.ɵɵlistener("click", function CollapsiblePanelComponent_Template_button_click_8_listener($event) { return ctx.toggleFullWidth($event); });
183
+ i0.ɵɵelement(9, "i", 7);
184
+ i0.ɵɵelementEnd()();
185
+ i0.ɵɵelementStart(10, "div", 8);
186
+ i0.ɵɵlistener("click", function CollapsiblePanelComponent_Template_div_click_10_listener() { return ctx.toggle(); });
187
+ i0.ɵɵelement(11, "i");
188
+ i0.ɵɵelementEnd()();
189
+ i0.ɵɵelementStart(12, "div", 9)(13, "div", 10);
190
+ i0.ɵɵprojection(14);
191
+ i0.ɵɵelementEnd()()();
192
+ } if (rf & 2) {
193
+ i0.ɵɵclassProp("related-entity", ctx.variant === "related-entity");
194
+ i0.ɵɵattribute("data-section-name", ctx.sectionName)("data-field-names", ctx.fieldNames);
195
+ i0.ɵɵadvance(3);
196
+ i0.ɵɵclassMap(ctx.icon);
197
+ i0.ɵɵadvance(2);
198
+ i0.ɵɵproperty("innerHTML", ctx.displayName, i0.ɵɵsanitizeHtml);
199
+ i0.ɵɵadvance();
200
+ i0.ɵɵconditional(ctx.badgeCount !== undefined ? 6 : -1);
201
+ i0.ɵɵadvance(2);
202
+ i0.ɵɵclassProp("active", ctx.widthMode === "full-width");
203
+ i0.ɵɵadvance(3);
204
+ i0.ɵɵclassMap(ctx.expanded ? "fa fa-chevron-up" : "fa fa-chevron-down");
205
+ i0.ɵɵadvance();
206
+ i0.ɵɵclassProp("collapsed", !ctx.expanded);
207
+ } }, styles: ["[_nghost-%COMP%] {\n display: block;\n }\n\n .search-hidden[_nghost-%COMP%] {\n display: none;\n }\n\n .panel-full-width[_nghost-%COMP%] {\n grid-column: 1 / -1 !important;\n }\n\n .form-card[_ngcontent-%COMP%] {\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n overflow: hidden;\n transition: all 0.3s ease;\n }\n\n .panel-full-width[_nghost-%COMP%] .form-card[_ngcontent-%COMP%] {\n box-shadow: 0 4px 8px rgba(102, 126, 234, 0.15);\n border: 2px solid #667eea;\n }\n\n .collapsible-card[_ngcontent-%COMP%] {\n overflow: hidden;\n }\n\n .collapsible-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 20px 24px;\n background: linear-gradient(135deg, #f9fafb 0%, #ffffff 100%);\n border-bottom: 2px solid #e5e7eb;\n user-select: none;\n transition: all 0.3s ease;\n }\n\n .collapsible-header[_ngcontent-%COMP%]:hover {\n background: linear-gradient(135deg, #f3f4f6 0%, #f9fafb 100%);\n border-bottom-color: #667eea;\n }\n\n .collapsible-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n cursor: pointer;\n }\n\n .collapsible-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 20px;\n color: #667eea;\n }\n\n .collapsible-title[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #1f2937;\n }\n\n .panel-width-controls[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n align-items: center;\n }\n\n .width-control-btn[_ngcontent-%COMP%] {\n padding: 6px 10px;\n font-size: 13px;\n border: 1px solid #d1d5db;\n background: white;\n color: #6b7280;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.2s;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n .width-control-btn[_ngcontent-%COMP%]:hover {\n background: #f3f4f6;\n color: #374151;\n border-color: #9ca3af;\n }\n\n .width-control-btn.active[_ngcontent-%COMP%] {\n background: #667eea;\n color: white;\n border-color: #667eea;\n }\n\n .width-control-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .collapsible-header[_ngcontent-%COMP%] .collapse-icon[_ngcontent-%COMP%] {\n color: #6b7280;\n transition: transform 0.3s ease;\n cursor: pointer;\n padding: 4px;\n }\n\n .collapsible-body[_ngcontent-%COMP%] {\n max-height: 2000px;\n overflow: hidden;\n transition: max-height 0.4s ease, padding 0.4s ease, opacity 0.3s ease;\n opacity: 1;\n }\n\n .collapsible-body.collapsed[_ngcontent-%COMP%] {\n max-height: 0;\n padding: 0;\n opacity: 0;\n }\n\n .form-body[_ngcontent-%COMP%] {\n padding: 24px;\n overflow: auto;\n max-height: 600px;\n }\n\n \n\n .form-card.related-entity[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #f0f9ff 0%, #ffffff 100%);\n border-left: 3px solid #3b82f6;\n }\n\n .form-card.related-entity[_ngcontent-%COMP%] .collapsible-header[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #e0f2fe 0%, #f0f9ff 100%);\n }\n\n .form-card.related-entity[_ngcontent-%COMP%] .collapsible-header[_ngcontent-%COMP%]:hover {\n background: linear-gradient(135deg, #bfdbfe 0%, #e0f2fe 100%);\n border-bottom-color: #3b82f6;\n }\n\n .form-card.related-entity[_ngcontent-%COMP%] .collapsible-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #3b82f6;\n }\n\n \n\n .collapsible-title[_ngcontent-%COMP%] .row-count-badge[_ngcontent-%COMP%] {\n background: #10b981;\n color: white;\n padding: 3px 8px 2px 9px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n margin-left: 8px;\n vertical-align: middle;\n position: relative;\n top: -2px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n line-height: 1;\n }\n\n \n\n .collapsible-title[_ngcontent-%COMP%] .row-count-badge.zero-rows[_ngcontent-%COMP%] {\n background: #9ca3af;\n }\n\n \n\n .collapsible-title[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] .search-highlight {\n background-color: #fef08a;\n color: #854d0e;\n padding: 0;\n border-radius: 2px;\n font-weight: 700;\n box-shadow: 0 0 0 2px #fef08a;\n }"] });
208
+ }
209
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CollapsiblePanelComponent, [{
210
+ type: Component,
211
+ args: [{ selector: 'mj-collapsible-panel', template: `
212
+ <div
213
+ class="form-card collapsible-card"
214
+ [class.related-entity]="variant === 'related-entity'"
215
+ [attr.data-section-name]="sectionName"
216
+ [attr.data-field-names]="fieldNames">
217
+ <div class="collapsible-header" role="button" tabindex="0">
218
+ <div class="collapsible-title" (click)="toggle()">
219
+ <i [class]="icon"></i>
220
+ <h3>
221
+ <span class="section-name" [innerHTML]="displayName"></span>
222
+ @if (badgeCount !== undefined) {
223
+ <span class="row-count-badge"
224
+ [class.zero-rows]="badgeCount === 0">
225
+ {{badgeCount}}
226
+ </span>
227
+ }
228
+ </h3>
229
+ </div>
230
+ <div class="panel-width-controls">
231
+ <button
232
+ class="width-control-btn"
233
+ [class.active]="widthMode === 'full-width'"
234
+ (click)="toggleFullWidth($event)"
235
+ title="Stretch panel to full width"
236
+ aria-label="Stretch panel to full width"
237
+ type="button">
238
+ <i class="fa-solid fa-left-right"></i>
239
+ </button>
240
+ </div>
241
+ <div class="collapse-icon" (click)="toggle()">
242
+ <i [class]="expanded ? 'fa fa-chevron-up' : 'fa fa-chevron-down'"></i>
243
+ </div>
244
+ </div>
245
+ <div class="collapsible-body" [class.collapsed]="!expanded">
246
+ <div class="form-body">
247
+ <ng-content></ng-content>
248
+ </div>
249
+ </div>
250
+ </div>
251
+ `, styles: ["\n :host {\n display: block;\n }\n\n :host(.search-hidden) {\n display: none;\n }\n\n :host(.panel-full-width) {\n grid-column: 1 / -1 !important;\n }\n\n .form-card {\n background: white;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n overflow: hidden;\n transition: all 0.3s ease;\n }\n\n :host(.panel-full-width) .form-card {\n box-shadow: 0 4px 8px rgba(102, 126, 234, 0.15);\n border: 2px solid #667eea;\n }\n\n .collapsible-card {\n overflow: hidden;\n }\n\n .collapsible-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 12px;\n padding: 20px 24px;\n background: linear-gradient(135deg, #f9fafb 0%, #ffffff 100%);\n border-bottom: 2px solid #e5e7eb;\n user-select: none;\n transition: all 0.3s ease;\n }\n\n .collapsible-header:hover {\n background: linear-gradient(135deg, #f3f4f6 0%, #f9fafb 100%);\n border-bottom-color: #667eea;\n }\n\n .collapsible-title {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n cursor: pointer;\n }\n\n .collapsible-title i {\n font-size: 20px;\n color: #667eea;\n }\n\n .collapsible-title h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #1f2937;\n }\n\n .panel-width-controls {\n display: flex;\n gap: 6px;\n align-items: center;\n }\n\n .width-control-btn {\n padding: 6px 10px;\n font-size: 13px;\n border: 1px solid #d1d5db;\n background: white;\n color: #6b7280;\n border-radius: 4px;\n cursor: pointer;\n transition: all 0.2s;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n\n .width-control-btn:hover {\n background: #f3f4f6;\n color: #374151;\n border-color: #9ca3af;\n }\n\n .width-control-btn.active {\n background: #667eea;\n color: white;\n border-color: #667eea;\n }\n\n .width-control-btn i {\n font-size: 12px;\n }\n\n .collapsible-header .collapse-icon {\n color: #6b7280;\n transition: transform 0.3s ease;\n cursor: pointer;\n padding: 4px;\n }\n\n .collapsible-body {\n max-height: 2000px;\n overflow: hidden;\n transition: max-height 0.4s ease, padding 0.4s ease, opacity 0.3s ease;\n opacity: 1;\n }\n\n .collapsible-body.collapsed {\n max-height: 0;\n padding: 0;\n opacity: 0;\n }\n\n .form-body {\n padding: 24px;\n overflow: auto;\n max-height: 600px;\n }\n\n /* Related Entity Sections - Visual Distinction */\n .form-card.related-entity {\n background: linear-gradient(135deg, #f0f9ff 0%, #ffffff 100%);\n border-left: 3px solid #3b82f6;\n }\n\n .form-card.related-entity .collapsible-header {\n background: linear-gradient(135deg, #e0f2fe 0%, #f0f9ff 100%);\n }\n\n .form-card.related-entity .collapsible-header:hover {\n background: linear-gradient(135deg, #bfdbfe 0%, #e0f2fe 100%);\n border-bottom-color: #3b82f6;\n }\n\n .form-card.related-entity .collapsible-title i {\n color: #3b82f6;\n }\n\n /* Row count badge for related entity sections */\n .collapsible-title .row-count-badge {\n background: #10b981;\n color: white;\n padding: 3px 8px 2px 9px;\n border-radius: 12px;\n font-size: 12px;\n font-weight: 600;\n margin-left: 8px;\n vertical-align: middle;\n position: relative;\n top: -2px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n line-height: 1;\n }\n\n /* Gray badge for zero rows (loaded but empty) */\n .collapsible-title .row-count-badge.zero-rows {\n background: #9ca3af;\n }\n\n /* Search highlighting */\n .collapsible-title h3 ::ng-deep .search-highlight {\n background-color: #fef08a;\n color: #854d0e;\n padding: 0;\n border-radius: 2px;\n font-weight: 700;\n box-shadow: 0 0 0 2px #fef08a;\n }\n "] }]
252
+ }], () => [{ type: i0.ChangeDetectorRef }], { sectionKey: [{
253
+ type: Input
254
+ }], sectionName: [{
255
+ type: Input
256
+ }], icon: [{
257
+ type: Input
258
+ }], form: [{
259
+ type: Input
260
+ }], formContext: [{
261
+ type: Input
262
+ }], variant: [{
263
+ type: Input
264
+ }], badgeCount: [{
265
+ type: Input
266
+ }], entityName: [{
267
+ type: Input
268
+ }], widthModeChange: [{
269
+ type: Output
270
+ }], fieldComponents: [{
271
+ type: ContentChildren,
272
+ args: [MJFormField, { descendants: true }]
273
+ }], isHidden: [{
274
+ type: HostBinding,
275
+ args: ['class.search-hidden']
276
+ }], isFullWidth: [{
277
+ type: HostBinding,
278
+ args: ['class.panel-full-width']
279
+ }] }); })();
280
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CollapsiblePanelComponent, { className: "CollapsiblePanelComponent", filePath: "src/lib/collapsible-panel.component.ts", lineNumber: 243 }); })();
281
+ //# sourceMappingURL=collapsible-panel.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collapsible-panel.component.js","sourceRoot":"","sources":["../../src/lib/collapsible-panel.component.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Reusable component for form section controls (Expand All, Collapse All, Filter, Counter)
5
+ * Designed to be projected into form toolbars via ng-content with [toolbar-additional-controls] selector
6
+ */
7
+ export declare class FormSectionControlsComponent {
8
+ visibleCount: number;
9
+ totalCount: number;
10
+ searchFilter: string;
11
+ expandedCount: number;
12
+ showEmptyFields: boolean;
13
+ expandAll: EventEmitter<void>;
14
+ collapseAll: EventEmitter<void>;
15
+ filterChange: EventEmitter<string>;
16
+ showEmptyFieldsChange: EventEmitter<boolean>;
17
+ searchTerm: string;
18
+ get allExpanded(): boolean;
19
+ get allCollapsed(): boolean;
20
+ clearFilter(): void;
21
+ static ɵfac: i0.ɵɵFactoryDeclaration<FormSectionControlsComponent, never>;
22
+ static ɵcmp: i0.ɵɵComponentDeclaration<FormSectionControlsComponent, "mj-form-section-controls[toolbar-additional-controls]", never, { "visibleCount": { "alias": "visibleCount"; "required": false; }; "totalCount": { "alias": "totalCount"; "required": false; }; "searchFilter": { "alias": "searchFilter"; "required": false; }; "expandedCount": { "alias": "expandedCount"; "required": false; }; "showEmptyFields": { "alias": "showEmptyFields"; "required": false; }; }, { "expandAll": "expandAll"; "collapseAll": "collapseAll"; "filterChange": "filterChange"; "showEmptyFieldsChange": "showEmptyFieldsChange"; }, never, never, false, never>;
23
+ }
24
+ //# sourceMappingURL=form-section-controls.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-section-controls.component.d.ts","sourceRoot":"","sources":["../../src/lib/form-section-controls.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAA0C,MAAM,eAAe,CAAC;;AAEhG;;;GAGG;AACH,qBAwJa,4BAA4B;IAC5B,YAAY,EAAE,MAAM,CAAK;IACzB,UAAU,EAAE,MAAM,CAAK;IACvB,YAAY,EAAE,MAAM,CAAM;IAC1B,aAAa,EAAE,MAAM,CAAK;IAC1B,eAAe,EAAE,OAAO,CAAS;IAChC,SAAS,qBAA4B;IACrC,WAAW,qBAA4B;IACvC,YAAY,uBAA8B;IAC1C,qBAAqB,wBAA+B;IAE9D,UAAU,SAAM;IAEhB,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,WAAW,IAAI,IAAI;yCArBV,4BAA4B;2CAA5B,4BAA4B;CAyBxC"}
@@ -0,0 +1,150 @@
1
+ import { Component, EventEmitter, Input, Output, ChangeDetectionStrategy } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/forms";
4
+ import * as i2 from "@progress/kendo-angular-buttons";
5
+ const _c0 = ["toolbar-additional-controls", ""];
6
+ function FormSectionControlsComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
7
+ const _r2 = i0.ɵɵgetCurrentView();
8
+ i0.ɵɵelementStart(0, "button", 11);
9
+ i0.ɵɵlistener("click", function FormSectionControlsComponent_Conditional_11_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.clearFilter()); });
10
+ i0.ɵɵelement(1, "span", 12);
11
+ i0.ɵɵelementEnd();
12
+ } }
13
+ function FormSectionControlsComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
14
+ i0.ɵɵelementStart(0, "span", 10);
15
+ i0.ɵɵtext(1);
16
+ i0.ɵɵelementEnd();
17
+ } if (rf & 2) {
18
+ const ctx_r2 = i0.ɵɵnextContext();
19
+ i0.ɵɵadvance();
20
+ i0.ɵɵtextInterpolate2("", ctx_r2.visibleCount, "/", ctx_r2.totalCount, "");
21
+ } }
22
+ /**
23
+ * Reusable component for form section controls (Expand All, Collapse All, Filter, Counter)
24
+ * Designed to be projected into form toolbars via ng-content with [toolbar-additional-controls] selector
25
+ */
26
+ export class FormSectionControlsComponent {
27
+ visibleCount = 0;
28
+ totalCount = 0;
29
+ searchFilter = '';
30
+ expandedCount = 0;
31
+ showEmptyFields = false;
32
+ expandAll = new EventEmitter();
33
+ collapseAll = new EventEmitter();
34
+ filterChange = new EventEmitter();
35
+ showEmptyFieldsChange = new EventEmitter();
36
+ searchTerm = '';
37
+ get allExpanded() {
38
+ return this.totalCount > 0 && this.expandedCount === this.totalCount;
39
+ }
40
+ get allCollapsed() {
41
+ return this.totalCount > 0 && this.expandedCount === 0;
42
+ }
43
+ clearFilter() {
44
+ this.searchTerm = '';
45
+ this.filterChange.emit('');
46
+ }
47
+ static ɵfac = function FormSectionControlsComponent_Factory(t) { return new (t || FormSectionControlsComponent)(); };
48
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FormSectionControlsComponent, selectors: [["mj-form-section-controls", "toolbar-additional-controls", ""]], inputs: { visibleCount: "visibleCount", totalCount: "totalCount", searchFilter: "searchFilter", expandedCount: "expandedCount", showEmptyFields: "showEmptyFields" }, outputs: { expandAll: "expandAll", collapseAll: "collapseAll", filterChange: "filterChange", showEmptyFieldsChange: "showEmptyFieldsChange" }, attrs: _c0, decls: 13, vars: 6, consts: [["searchInput", ""], ["kendoButton", "", "title", "Expand all sections", 3, "click", "disabled"], [1, "fa-solid", "fa-angle-double-down"], ["kendoButton", "", "title", "Collapse all sections", 3, "click", "disabled"], [1, "fa-solid", "fa-angle-double-up"], [1, "show-empty-fields-toggle"], ["type", "checkbox", 3, "ngModelChange", "ngModel"], [2, "position", "relative"], ["type", "text", "placeholder", "Filter sections...", 1, "section-search", 3, "ngModelChange", "ngModel"], ["kendoButton", "", "title", "Clear filter", 1, "clear-search-btn"], [1, "section-count"], ["kendoButton", "", "title", "Clear filter", 1, "clear-search-btn", 3, "click"], [1, "fa-solid", "fa-xmark"]], template: function FormSectionControlsComponent_Template(rf, ctx) { if (rf & 1) {
49
+ const _r1 = i0.ɵɵgetCurrentView();
50
+ i0.ɵɵelementStart(0, "button", 1);
51
+ i0.ɵɵlistener("click", function FormSectionControlsComponent_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.expandAll.emit()); });
52
+ i0.ɵɵelement(1, "span", 2);
53
+ i0.ɵɵelementEnd();
54
+ i0.ɵɵelementStart(2, "button", 3);
55
+ i0.ɵɵlistener("click", function FormSectionControlsComponent_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.collapseAll.emit()); });
56
+ i0.ɵɵelement(3, "span", 4);
57
+ i0.ɵɵelementEnd();
58
+ i0.ɵɵelementStart(4, "label", 5)(5, "input", 6);
59
+ i0.ɵɵtwoWayListener("ngModelChange", function FormSectionControlsComponent_Template_input_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.showEmptyFields, $event) || (ctx.showEmptyFields = $event); return i0.ɵɵresetView($event); });
60
+ i0.ɵɵlistener("ngModelChange", function FormSectionControlsComponent_Template_input_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.showEmptyFieldsChange.emit($event)); });
61
+ i0.ɵɵelementEnd();
62
+ i0.ɵɵelementStart(6, "span");
63
+ i0.ɵɵtext(7, "Show Empty Fields");
64
+ i0.ɵɵelementEnd()();
65
+ i0.ɵɵelementStart(8, "div", 7)(9, "input", 8, 0);
66
+ i0.ɵɵtwoWayListener("ngModelChange", function FormSectionControlsComponent_Template_input_ngModelChange_9_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.searchTerm, $event) || (ctx.searchTerm = $event); return i0.ɵɵresetView($event); });
67
+ i0.ɵɵlistener("ngModelChange", function FormSectionControlsComponent_Template_input_ngModelChange_9_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.filterChange.emit($event)); });
68
+ i0.ɵɵelementEnd();
69
+ i0.ɵɵtemplate(11, FormSectionControlsComponent_Conditional_11_Template, 2, 0, "button", 9);
70
+ i0.ɵɵelementEnd();
71
+ i0.ɵɵtemplate(12, FormSectionControlsComponent_Conditional_12_Template, 2, 2, "span", 10);
72
+ } if (rf & 2) {
73
+ i0.ɵɵproperty("disabled", ctx.allExpanded);
74
+ i0.ɵɵadvance(2);
75
+ i0.ɵɵproperty("disabled", ctx.allCollapsed);
76
+ i0.ɵɵadvance(3);
77
+ i0.ɵɵtwoWayProperty("ngModel", ctx.showEmptyFields);
78
+ i0.ɵɵadvance(4);
79
+ i0.ɵɵtwoWayProperty("ngModel", ctx.searchTerm);
80
+ i0.ɵɵadvance(2);
81
+ i0.ɵɵconditional(ctx.searchTerm ? 11 : -1);
82
+ i0.ɵɵadvance();
83
+ i0.ɵɵconditional(ctx.searchFilter && ctx.searchFilter.trim() ? 12 : -1);
84
+ } }, dependencies: [i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.ButtonComponent], styles: ["\n\n\n button[_ngcontent-%COMP%] {\n padding: 8px 14px;\n font-size: 13px;\n border: 1px solid #d1d5db;\n background: white;\n color: #374151;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n margin-right: 0;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-weight: 500;\n }\n\n button[_ngcontent-%COMP%]:hover {\n background: #667eea;\n color: white;\n border-color: #667eea;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(102, 126, 234, 0.2);\n }\n\n button[_ngcontent-%COMP%]:active {\n transform: translateY(0);\n }\n\n button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 0;\n font-size: 14px;\n }\n\n .section-search[_ngcontent-%COMP%] {\n padding: 8px 14px;\n font-size: 13px;\n border: 1px solid #d1d5db;\n border-radius: 6px;\n width: 240px;\n transition: all 0.2s;\n background: white;\n }\n\n .section-search[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #667eea;\n box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);\n }\n\n .section-search[_ngcontent-%COMP%]::placeholder {\n color: #9ca3af;\n font-style: italic;\n }\n\n .section-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #6b7280;\n font-weight: 500;\n padding: 6px 12px;\n background: #f3f4f6;\n border-radius: 6px;\n }\n\n .clear-search-btn[_ngcontent-%COMP%] {\n position: absolute;\n right: 6px;\n top: 50%;\n transform: translateY(-50%);\n padding: 4px 8px;\n min-width: unset;\n }\n\n .show-empty-fields-toggle[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 8px 14px;\n background: white;\n border: 1px solid #d1d5db;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n font-size: 13px;\n font-weight: 500;\n color: #374151;\n user-select: none;\n }\n\n .show-empty-fields-toggle[_ngcontent-%COMP%]:hover {\n background: #f3f4f6;\n border-color: #9ca3af;\n }\n\n .show-empty-fields-toggle[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n cursor: pointer;\n width: 16px;\n height: 16px;\n }\n\n .show-empty-fields-toggle[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n white-space: nowrap;\n }"], changeDetection: 0 });
85
+ }
86
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FormSectionControlsComponent, [{
87
+ type: Component,
88
+ args: [{ selector: 'mj-form-section-controls[toolbar-additional-controls]', changeDetection: ChangeDetectionStrategy.OnPush, template: `
89
+ <button kendoButton
90
+ (click)="expandAll.emit()"
91
+ [disabled]="allExpanded"
92
+ title="Expand all sections">
93
+ <span class="fa-solid fa-angle-double-down"></span>
94
+ </button>
95
+ <button kendoButton
96
+ (click)="collapseAll.emit()"
97
+ [disabled]="allCollapsed"
98
+ title="Collapse all sections">
99
+ <span class="fa-solid fa-angle-double-up"></span>
100
+ </button>
101
+ <label class="show-empty-fields-toggle">
102
+ <input
103
+ type="checkbox"
104
+ [(ngModel)]="showEmptyFields"
105
+ (ngModelChange)="showEmptyFieldsChange.emit($event)">
106
+ <span>Show Empty Fields</span>
107
+ </label>
108
+ <div style="position: relative;">
109
+ <input
110
+ type="text"
111
+ class="section-search"
112
+ placeholder="Filter sections..."
113
+ [(ngModel)]="searchTerm"
114
+ (ngModelChange)="filterChange.emit($event)"
115
+ #searchInput>
116
+ @if (searchTerm) {
117
+ <button
118
+ kendoButton
119
+ class="clear-search-btn"
120
+ (click)="clearFilter()"
121
+ title="Clear filter">
122
+ <span class="fa-solid fa-xmark"></span>
123
+ </button>
124
+ }
125
+ </div>
126
+ @if (searchFilter && searchFilter.trim()) {
127
+ <span class="section-count">{{visibleCount}}/{{totalCount}}</span>
128
+ }
129
+ `, styles: ["\n /* Note: positioning (display, gap, align-items, margin-left) is handled by parent toolbar CSS */\n\n button {\n padding: 8px 14px;\n font-size: 13px;\n border: 1px solid #d1d5db;\n background: white;\n color: #374151;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n margin-right: 0;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-weight: 500;\n }\n\n button:hover {\n background: #667eea;\n color: white;\n border-color: #667eea;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(102, 126, 234, 0.2);\n }\n\n button:active {\n transform: translateY(0);\n }\n\n button i {\n margin-right: 0;\n font-size: 14px;\n }\n\n .section-search {\n padding: 8px 14px;\n font-size: 13px;\n border: 1px solid #d1d5db;\n border-radius: 6px;\n width: 240px;\n transition: all 0.2s;\n background: white;\n }\n\n .section-search:focus {\n outline: none;\n border-color: #667eea;\n box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);\n }\n\n .section-search::placeholder {\n color: #9ca3af;\n font-style: italic;\n }\n\n .section-count {\n font-size: 13px;\n color: #6b7280;\n font-weight: 500;\n padding: 6px 12px;\n background: #f3f4f6;\n border-radius: 6px;\n }\n\n .clear-search-btn {\n position: absolute;\n right: 6px;\n top: 50%;\n transform: translateY(-50%);\n padding: 4px 8px;\n min-width: unset;\n }\n\n .show-empty-fields-toggle {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 8px 14px;\n background: white;\n border: 1px solid #d1d5db;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n font-size: 13px;\n font-weight: 500;\n color: #374151;\n user-select: none;\n }\n\n .show-empty-fields-toggle:hover {\n background: #f3f4f6;\n border-color: #9ca3af;\n }\n\n .show-empty-fields-toggle input[type=\"checkbox\"] {\n cursor: pointer;\n width: 16px;\n height: 16px;\n }\n\n .show-empty-fields-toggle span {\n white-space: nowrap;\n }\n "] }]
130
+ }], null, { visibleCount: [{
131
+ type: Input
132
+ }], totalCount: [{
133
+ type: Input
134
+ }], searchFilter: [{
135
+ type: Input
136
+ }], expandedCount: [{
137
+ type: Input
138
+ }], showEmptyFields: [{
139
+ type: Input
140
+ }], expandAll: [{
141
+ type: Output
142
+ }], collapseAll: [{
143
+ type: Output
144
+ }], filterChange: [{
145
+ type: Output
146
+ }], showEmptyFieldsChange: [{
147
+ type: Output
148
+ }] }); })();
149
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FormSectionControlsComponent, { className: "FormSectionControlsComponent", filePath: "src/lib/form-section-controls.component.ts", lineNumber: 159 }); })();
150
+ //# sourceMappingURL=form-section-controls.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-section-controls.component.js","sourceRoot":"","sources":["../../src/lib/form-section-controls.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;;;;;;;IAsChF,kCAIyB;IADrB,iMAAS,oBAAa,KAAC;IAEvB,2BAAuC;IAC3C,iBAAS;;;IAIb,gCAA4B;IAAA,YAA+B;IAAA,iBAAO;;;IAAtC,cAA+B;IAA/B,0EAA+B;;AA9CvE;;;GAGG;AAyJH,MAAM,OAAO,4BAA4B;IAC5B,YAAY,GAAW,CAAC,CAAC;IACzB,UAAU,GAAW,CAAC,CAAC;IACvB,YAAY,GAAW,EAAE,CAAC;IAC1B,aAAa,GAAW,CAAC,CAAC;IAC1B,eAAe,GAAY,KAAK,CAAC;IAChC,SAAS,GAAG,IAAI,YAAY,EAAQ,CAAC;IACrC,WAAW,GAAG,IAAI,YAAY,EAAQ,CAAC;IACvC,YAAY,GAAG,IAAI,YAAY,EAAU,CAAC;IAC1C,qBAAqB,GAAG,IAAI,YAAY,EAAW,CAAC;IAE9D,UAAU,GAAG,EAAE,CAAC;IAEhB,IAAI,WAAW;QACX,OAAO,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,UAAU,CAAC;IACzE,CAAC;IAED,IAAI,YAAY;QACZ,OAAO,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,KAAK,CAAC,CAAC;IAC3D,CAAC;IAED,WAAW;QACP,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;sFAxBQ,4BAA4B;6DAA5B,4BAA4B;;YApJjC,iCAGoC;YAF5B,+IAAS,oBAAgB,KAAC;YAG9B,0BAAmD;YACvD,iBAAS;YACT,iCAGsC;YAF9B,+IAAS,sBAAkB,KAAC;YAGhC,0BAAiD;YACrD,iBAAS;YAEL,AADJ,gCAAwC,eAIqB;YADrD,2QAA6B;YAC7B,oKAAiB,sCAAkC,KAAC;YAHxD,iBAGyD;YACzD,4BAAM;YAAA,iCAAiB;YAC3B,AAD2B,iBAAO,EAC1B;YAEJ,AADJ,8BAAiC,kBAOZ;YAFb,iQAAwB;YACxB,oKAAiB,6BAAyB,KAAC;YAL/C,iBAMiB;YACjB,0FAAkB;YAStB,iBAAM;YACN,yFAA2C;;YAnCnC,0CAAwB;YAMxB,eAAyB;YAAzB,2CAAyB;YAOzB,eAA6B;YAA7B,mDAA6B;YAS7B,eAAwB;YAAxB,8CAAwB;YAG5B,eAQC;YARD,0CAQC;YAEL,cAEC;YAFD,uEAEC;;;iFA6GI,4BAA4B;cAxJxC,SAAS;2BACI,uDAAuD,mBAChD,uBAAuB,CAAC,MAAM,YACrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAyCT;gBA6GQ,YAAY;kBAApB,KAAK;YACG,UAAU;kBAAlB,KAAK;YACG,YAAY;kBAApB,KAAK;YACG,aAAa;kBAArB,KAAK;YACG,eAAe;kBAAvB,KAAK;YACI,SAAS;kBAAlB,MAAM;YACG,WAAW;kBAApB,MAAM;YACG,YAAY;kBAArB,MAAM;YACG,qBAAqB;kBAA9B,MAAM;;kFATE,4BAA4B"}
package/dist/module.d.ts CHANGED
@@ -2,24 +2,26 @@ import * as i0 from "@angular/core";
2
2
  import * as i1 from "./lib/section-loader-component";
3
3
  import * as i2 from "./lib/base-field-component";
4
4
  import * as i3 from "./lib/link-field.component";
5
- import * as i4 from "@angular/common";
6
- import * as i5 from "@angular/forms";
7
- import * as i6 from "@memberjunction/ng-tabstrip";
8
- import * as i7 from "@memberjunction/ng-record-changes";
9
- import * as i8 from "@progress/kendo-angular-buttons";
10
- import * as i9 from "@progress/kendo-angular-inputs";
11
- import * as i10 from "@progress/kendo-angular-dateinputs";
12
- import * as i11 from "@progress/kendo-angular-dropdowns";
13
- import * as i12 from "@memberjunction/ng-link-directives";
14
- import * as i13 from "@progress/kendo-angular-dialog";
15
- import * as i14 from "@progress/kendo-angular-indicators";
16
- import * as i15 from "@memberjunction/ng-container-directives";
17
- import * as i16 from "@memberjunction/ng-shared";
18
- import * as i17 from "@memberjunction/ng-code-editor";
19
- import * as i18 from "ngx-markdown";
5
+ import * as i4 from "./lib/form-section-controls.component";
6
+ import * as i5 from "./lib/collapsible-panel.component";
7
+ import * as i6 from "@angular/common";
8
+ import * as i7 from "@angular/forms";
9
+ import * as i8 from "@memberjunction/ng-tabstrip";
10
+ import * as i9 from "@memberjunction/ng-record-changes";
11
+ import * as i10 from "@progress/kendo-angular-buttons";
12
+ import * as i11 from "@progress/kendo-angular-inputs";
13
+ import * as i12 from "@progress/kendo-angular-dateinputs";
14
+ import * as i13 from "@progress/kendo-angular-dropdowns";
15
+ import * as i14 from "@memberjunction/ng-link-directives";
16
+ import * as i15 from "@progress/kendo-angular-dialog";
17
+ import * as i16 from "@progress/kendo-angular-indicators";
18
+ import * as i17 from "@memberjunction/ng-container-directives";
19
+ import * as i18 from "@memberjunction/ng-shared";
20
+ import * as i19 from "@memberjunction/ng-code-editor";
21
+ import * as i20 from "ngx-markdown";
20
22
  export declare class BaseFormsModule {
21
23
  static ɵfac: i0.ɵɵFactoryDeclaration<BaseFormsModule, never>;
22
- static ɵmod: i0.ɵɵNgModuleDeclaration<BaseFormsModule, [typeof i1.SectionLoaderComponent, typeof i2.MJFormField, typeof i3.MJLinkField], [typeof i4.CommonModule, typeof i5.FormsModule, typeof i6.MJTabStripModule, typeof i7.RecordChangesModule, typeof i8.ButtonsModule, typeof i9.InputsModule, typeof i10.DateInputsModule, typeof i11.DropDownsModule, typeof i12.LinkDirectivesModule, typeof i13.DialogsModule, typeof i14.IndicatorsModule, typeof i15.ContainerDirectivesModule, typeof i16.MemberJunctionSharedModule, typeof i17.CodeEditorModule, typeof i18.MarkdownModule], [typeof i1.SectionLoaderComponent, typeof i2.MJFormField, typeof i3.MJLinkField]>;
24
+ static ɵmod: i0.ɵɵNgModuleDeclaration<BaseFormsModule, [typeof i1.SectionLoaderComponent, typeof i2.MJFormField, typeof i3.MJLinkField, typeof i4.FormSectionControlsComponent, typeof i5.CollapsiblePanelComponent], [typeof i6.CommonModule, typeof i7.FormsModule, typeof i8.MJTabStripModule, typeof i9.RecordChangesModule, typeof i10.ButtonsModule, typeof i11.InputsModule, typeof i12.DateInputsModule, typeof i13.DropDownsModule, typeof i14.LinkDirectivesModule, typeof i15.DialogsModule, typeof i16.IndicatorsModule, typeof i17.ContainerDirectivesModule, typeof i18.MemberJunctionSharedModule, typeof i19.CodeEditorModule, typeof i20.MarkdownModule], [typeof i1.SectionLoaderComponent, typeof i2.MJFormField, typeof i3.MJLinkField, typeof i4.FormSectionControlsComponent, typeof i5.CollapsiblePanelComponent]>;
23
25
  static ɵinj: i0.ɵɵInjectorDeclaration<BaseFormsModule>;
24
26
  }
25
27
  //# sourceMappingURL=module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AA0BA,qBA6Ba,eAAe;yCAAf,eAAe;0CAAf,eAAe;0CAAf,eAAe;CAAI"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AA4BA,qBAiCa,eAAe;yCAAf,eAAe;0CAAf,eAAe;0CAAf,eAAe;CAAI"}
package/dist/module.js CHANGED
@@ -19,6 +19,8 @@ import { CodeEditorModule } from '@memberjunction/ng-code-editor';
19
19
  // Markdown
20
20
  import { MarkdownModule } from 'ngx-markdown';
21
21
  import { MJLinkField } from './lib/link-field.component';
22
+ import { FormSectionControlsComponent } from './lib/form-section-controls.component';
23
+ import { CollapsiblePanelComponent } from './lib/collapsible-panel.component';
22
24
  import * as i0 from "@angular/core";
23
25
  import * as i1 from "ngx-markdown";
24
26
  export class BaseFormsModule {
@@ -46,7 +48,9 @@ export class BaseFormsModule {
46
48
  declarations: [
47
49
  SectionLoaderComponent,
48
50
  MJFormField,
49
- MJLinkField
51
+ MJLinkField,
52
+ FormSectionControlsComponent,
53
+ CollapsiblePanelComponent
50
54
  ],
51
55
  imports: [
52
56
  CommonModule,
@@ -68,13 +72,17 @@ export class BaseFormsModule {
68
72
  exports: [
69
73
  SectionLoaderComponent,
70
74
  MJFormField,
71
- MJLinkField
75
+ MJLinkField,
76
+ FormSectionControlsComponent,
77
+ CollapsiblePanelComponent
72
78
  ]
73
79
  }]
74
80
  }], null, null); })();
75
81
  (function () { (typeof ngJitMode === "undefined" || ngJitMode) && i0.ɵɵsetNgModuleScope(BaseFormsModule, { declarations: [SectionLoaderComponent,
76
82
  MJFormField,
77
- MJLinkField], imports: [CommonModule,
83
+ MJLinkField,
84
+ FormSectionControlsComponent,
85
+ CollapsiblePanelComponent], imports: [CommonModule,
78
86
  FormsModule,
79
87
  MJTabStripModule,
80
88
  RecordChangesModule,
@@ -89,5 +97,7 @@ export class BaseFormsModule {
89
97
  MemberJunctionSharedModule,
90
98
  CodeEditorModule, i1.MarkdownModule], exports: [SectionLoaderComponent,
91
99
  MJFormField,
92
- MJLinkField] }); })();
100
+ MJLinkField,
101
+ FormSectionControlsComponent,
102
+ CollapsiblePanelComponent] }); })();
93
103
  //# sourceMappingURL=module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,2BAA2B;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAE1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE,WAAW;AACX,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;;;AA+BzD,MAAM,OAAO,eAAe;yEAAf,eAAe;4DAAf,eAAe;gEAtBxB,YAAY;YACZ,WAAW;YACX,gBAAgB;YAChB,mBAAmB;YACnB,aAAa;YACb,YAAY;YACZ,gBAAgB;YAChB,eAAe;YACf,oBAAoB;YACpB,aAAa;YACb,gBAAgB;YAChB,yBAAyB;YACzB,0BAA0B;YAC1B,gBAAgB;YAChB,cAAc,CAAC,OAAO,EAAE;;iFAQf,eAAe;cA7B3B,QAAQ;eAAC;gBACR,YAAY,EAAE;oBACZ,sBAAsB;oBACtB,WAAW;oBACX,WAAW;iBACZ;gBACD,OAAO,EAAE;oBACP,YAAY;oBACZ,WAAW;oBACX,gBAAgB;oBAChB,mBAAmB;oBACnB,aAAa;oBACb,YAAY;oBACZ,gBAAgB;oBAChB,eAAe;oBACf,oBAAoB;oBACpB,aAAa;oBACb,gBAAgB;oBAChB,yBAAyB;oBACzB,0BAA0B;oBAC1B,gBAAgB;oBAChB,cAAc,CAAC,OAAO,EAAE;iBACzB;gBACD,OAAO,EAAE;oBACP,sBAAsB;oBACtB,WAAW;oBACX,WAAW;iBACZ;aACF;;wFACY,eAAe,mBA3BxB,sBAAsB;QACtB,WAAW;QACX,WAAW,aAGX,YAAY;QACZ,WAAW;QACX,gBAAgB;QAChB,mBAAmB;QACnB,aAAa;QACb,YAAY;QACZ,gBAAgB;QAChB,eAAe;QACf,oBAAoB;QACpB,aAAa;QACb,gBAAgB;QAChB,yBAAyB;QACzB,0BAA0B;QAC1B,gBAAgB,gCAIhB,sBAAsB;QACtB,WAAW;QACX,WAAW"}
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,2BAA2B;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAEtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAE1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE,WAAW;AACX,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;;;AAmC9E,MAAM,OAAO,eAAe;yEAAf,eAAe;4DAAf,eAAe;gEAxBxB,YAAY;YACZ,WAAW;YACX,gBAAgB;YAChB,mBAAmB;YACnB,aAAa;YACb,YAAY;YACZ,gBAAgB;YAChB,eAAe;YACf,oBAAoB;YACpB,aAAa;YACb,gBAAgB;YAChB,yBAAyB;YACzB,0BAA0B;YAC1B,gBAAgB;YAChB,cAAc,CAAC,OAAO,EAAE;;iFAUf,eAAe;cAjC3B,QAAQ;eAAC;gBACR,YAAY,EAAE;oBACZ,sBAAsB;oBACtB,WAAW;oBACX,WAAW;oBACX,4BAA4B;oBAC5B,yBAAyB;iBAC1B;gBACD,OAAO,EAAE;oBACP,YAAY;oBACZ,WAAW;oBACX,gBAAgB;oBAChB,mBAAmB;oBACnB,aAAa;oBACb,YAAY;oBACZ,gBAAgB;oBAChB,eAAe;oBACf,oBAAoB;oBACpB,aAAa;oBACb,gBAAgB;oBAChB,yBAAyB;oBACzB,0BAA0B;oBAC1B,gBAAgB;oBAChB,cAAc,CAAC,OAAO,EAAE;iBACzB;gBACD,OAAO,EAAE;oBACP,sBAAsB;oBACtB,WAAW;oBACX,WAAW;oBACX,4BAA4B;oBAC5B,yBAAyB;iBAC1B;aACF;;wFACY,eAAe,mBA/BxB,sBAAsB;QACtB,WAAW;QACX,WAAW;QACX,4BAA4B;QAC5B,yBAAyB,aAGzB,YAAY;QACZ,WAAW;QACX,gBAAgB;QAChB,mBAAmB;QACnB,aAAa;QACb,YAAY;QACZ,gBAAgB;QAChB,eAAe;QACf,oBAAoB;QACpB,aAAa;QACb,gBAAgB;QAChB,yBAAyB;QACzB,0BAA0B;QAC1B,gBAAgB,gCAIhB,sBAAsB;QACtB,WAAW;QACX,WAAW;QACX,4BAA4B;QAC5B,yBAAyB"}