@memberjunction/ng-explorer-settings 3.3.0 → 3.4.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 (26) hide show
  1. package/dist/lib/account-info/account-info.component.d.ts +23 -0
  2. package/dist/lib/account-info/account-info.component.d.ts.map +1 -0
  3. package/dist/lib/account-info/account-info.component.js +155 -0
  4. package/dist/lib/account-info/account-info.component.js.map +1 -0
  5. package/dist/lib/appearance-settings/appearance-settings.component.d.ts +15 -0
  6. package/dist/lib/appearance-settings/appearance-settings.component.d.ts.map +1 -0
  7. package/dist/lib/appearance-settings/appearance-settings.component.js +79 -0
  8. package/dist/lib/appearance-settings/appearance-settings.component.js.map +1 -0
  9. package/dist/lib/application-settings/application-settings.component.d.ts +113 -0
  10. package/dist/lib/application-settings/application-settings.component.d.ts.map +1 -0
  11. package/dist/lib/application-settings/application-settings.component.js +520 -0
  12. package/dist/lib/application-settings/application-settings.component.js.map +1 -0
  13. package/dist/lib/general-settings/general-settings.component.d.ts +14 -0
  14. package/dist/lib/general-settings/general-settings.component.d.ts.map +1 -0
  15. package/dist/lib/general-settings/general-settings.component.js +50 -0
  16. package/dist/lib/general-settings/general-settings.component.js.map +1 -0
  17. package/dist/lib/module.d.ts +31 -28
  18. package/dist/lib/module.d.ts.map +1 -1
  19. package/dist/lib/module.js +64 -33
  20. package/dist/lib/module.js.map +1 -1
  21. package/dist/lib/settings/settings.component.d.ts +5 -14
  22. package/dist/lib/settings/settings.component.d.ts.map +1 -1
  23. package/dist/lib/settings/settings.component.js +141 -417
  24. package/dist/lib/settings/settings.component.js.map +1 -1
  25. package/dist/lib/sql-logging/sql-logging.component.d.ts +1 -1
  26. package/package.json +19 -20
@@ -0,0 +1,23 @@
1
+ import { OnInit, ChangeDetectorRef } from '@angular/core';
2
+ import { UserEntity } from '@memberjunction/core-entities';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Displays read-only account information for the current user.
6
+ * Shows name, email, role, creation date, and last login.
7
+ */
8
+ export declare class AccountInfoComponent implements OnInit {
9
+ private cdr;
10
+ IsLoading: boolean;
11
+ CurrentUser: UserEntity | null;
12
+ ErrorMessage: string;
13
+ constructor(cdr: ChangeDetectorRef);
14
+ ngOnInit(): Promise<void>;
15
+ private LoadAccountInfo;
16
+ /**
17
+ * Formats a date for display
18
+ */
19
+ FormatDate(date: Date | null | undefined): string;
20
+ static ɵfac: i0.ɵɵFactoryDeclaration<AccountInfoComponent, never>;
21
+ static ɵcmp: i0.ɵɵComponentDeclaration<AccountInfoComponent, "mj-account-info", never, {}, {}, never, never, false, never>;
22
+ }
23
+ //# sourceMappingURL=account-info.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-info.component.d.ts","sourceRoot":"","sources":["../../../src/lib/account-info/account-info.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAErE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;;AAE3D;;;GAGG;AACH,qBAKa,oBAAqB,YAAW,MAAM;IAKrC,OAAO,CAAC,GAAG;IAJvB,SAAS,UAAQ;IACjB,WAAW,EAAE,UAAU,GAAG,IAAI,CAAQ;IACtC,YAAY,SAAM;gBAEE,GAAG,EAAE,iBAAiB;IAEpC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAIjB,eAAe;IA0B7B;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM;yCAxCtC,oBAAoB;2CAApB,oBAAoB;CAiDhC"}
@@ -0,0 +1,155 @@
1
+ import { Component } from '@angular/core';
2
+ import { Metadata } from '@memberjunction/core';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@memberjunction/ng-shared-generic";
5
+ function AccountInfoComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
6
+ i0.ɵɵelementStart(0, "div", 0);
7
+ i0.ɵɵelement(1, "mj-loading", 3);
8
+ i0.ɵɵelementEnd();
9
+ } }
10
+ function AccountInfoComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
11
+ i0.ɵɵelementStart(0, "div", 1);
12
+ i0.ɵɵelement(1, "i", 4);
13
+ i0.ɵɵelementStart(2, "span");
14
+ i0.ɵɵtext(3);
15
+ i0.ɵɵelementEnd()();
16
+ } if (rf & 2) {
17
+ const ctx_r0 = i0.ɵɵnextContext();
18
+ i0.ɵɵadvance(3);
19
+ i0.ɵɵtextInterpolate(ctx_r0.ErrorMessage);
20
+ } }
21
+ function AccountInfoComponent_Conditional_2_Conditional_30_Template(rf, ctx) { if (rf & 1) {
22
+ i0.ɵɵelementStart(0, "div", 5)(1, "div", 6);
23
+ i0.ɵɵelement(2, "i", 13);
24
+ i0.ɵɵelementStart(3, "span");
25
+ i0.ɵɵtext(4, "Status");
26
+ i0.ɵɵelementEnd()();
27
+ i0.ɵɵelementStart(5, "div", 8)(6, "span", 14);
28
+ i0.ɵɵtext(7);
29
+ i0.ɵɵelementEnd()()();
30
+ } if (rf & 2) {
31
+ const ctx_r0 = i0.ɵɵnextContext(2);
32
+ i0.ɵɵadvance(6);
33
+ i0.ɵɵclassProp("active", ctx_r0.CurrentUser.IsActive)("inactive", !ctx_r0.CurrentUser.IsActive);
34
+ i0.ɵɵadvance();
35
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.CurrentUser.IsActive ? "Active" : "Inactive", " ");
36
+ } }
37
+ function AccountInfoComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
38
+ i0.ɵɵelementStart(0, "div", 2)(1, "div", 5)(2, "div", 6);
39
+ i0.ɵɵelement(3, "i", 7);
40
+ i0.ɵɵelementStart(4, "span");
41
+ i0.ɵɵtext(5, "Full Name");
42
+ i0.ɵɵelementEnd()();
43
+ i0.ɵɵelementStart(6, "div", 8);
44
+ i0.ɵɵtext(7);
45
+ i0.ɵɵelementEnd()();
46
+ i0.ɵɵelementStart(8, "div", 5)(9, "div", 6);
47
+ i0.ɵɵelement(10, "i", 9);
48
+ i0.ɵɵelementStart(11, "span");
49
+ i0.ɵɵtext(12, "Email");
50
+ i0.ɵɵelementEnd()();
51
+ i0.ɵɵelementStart(13, "div", 8);
52
+ i0.ɵɵtext(14);
53
+ i0.ɵɵelementEnd()();
54
+ i0.ɵɵelementStart(15, "div", 5)(16, "div", 6);
55
+ i0.ɵɵelement(17, "i", 10);
56
+ i0.ɵɵelementStart(18, "span");
57
+ i0.ɵɵtext(19, "Account Type");
58
+ i0.ɵɵelementEnd()();
59
+ i0.ɵɵelementStart(20, "div", 8)(21, "span", 11);
60
+ i0.ɵɵtext(22);
61
+ i0.ɵɵelementEnd()()();
62
+ i0.ɵɵelementStart(23, "div", 5)(24, "div", 6);
63
+ i0.ɵɵelement(25, "i", 12);
64
+ i0.ɵɵelementStart(26, "span");
65
+ i0.ɵɵtext(27, "Account Created");
66
+ i0.ɵɵelementEnd()();
67
+ i0.ɵɵelementStart(28, "div", 8);
68
+ i0.ɵɵtext(29);
69
+ i0.ɵɵelementEnd()();
70
+ i0.ɵɵtemplate(30, AccountInfoComponent_Conditional_2_Conditional_30_Template, 8, 5, "div", 5);
71
+ i0.ɵɵelementEnd();
72
+ } if (rf & 2) {
73
+ const ctx_r0 = i0.ɵɵnextContext();
74
+ i0.ɵɵadvance(7);
75
+ i0.ɵɵtextInterpolate(ctx_r0.CurrentUser.Name || "Not set");
76
+ i0.ɵɵadvance(7);
77
+ i0.ɵɵtextInterpolate(ctx_r0.CurrentUser.Email || "Not set");
78
+ i0.ɵɵadvance(7);
79
+ i0.ɵɵclassMap("type-" + (ctx_r0.CurrentUser.Type || "user").toLowerCase());
80
+ i0.ɵɵadvance();
81
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.CurrentUser.Type || "User", " ");
82
+ i0.ɵɵadvance(7);
83
+ i0.ɵɵtextInterpolate(ctx_r0.FormatDate(ctx_r0.CurrentUser.__mj_CreatedAt));
84
+ i0.ɵɵadvance();
85
+ i0.ɵɵconditional(ctx_r0.CurrentUser.IsActive !== undefined ? 30 : -1);
86
+ } }
87
+ /**
88
+ * Displays read-only account information for the current user.
89
+ * Shows name, email, role, creation date, and last login.
90
+ */
91
+ export class AccountInfoComponent {
92
+ cdr;
93
+ IsLoading = true;
94
+ CurrentUser = null;
95
+ ErrorMessage = '';
96
+ constructor(cdr) {
97
+ this.cdr = cdr;
98
+ }
99
+ async ngOnInit() {
100
+ await this.LoadAccountInfo();
101
+ }
102
+ async LoadAccountInfo() {
103
+ this.IsLoading = true;
104
+ this.ErrorMessage = '';
105
+ try {
106
+ const md = new Metadata();
107
+ const userInfo = md.CurrentUser;
108
+ // Load full user entity for additional details
109
+ const user = await md.GetEntityObject('Users');
110
+ const loaded = await user.Load(userInfo.ID);
111
+ if (loaded) {
112
+ this.CurrentUser = user;
113
+ }
114
+ else {
115
+ this.ErrorMessage = 'Unable to load account information.';
116
+ }
117
+ }
118
+ catch (error) {
119
+ this.ErrorMessage = 'Failed to load account information.';
120
+ console.error('Error loading account info:', error);
121
+ }
122
+ finally {
123
+ this.IsLoading = false;
124
+ this.cdr.detectChanges();
125
+ }
126
+ }
127
+ /**
128
+ * Formats a date for display
129
+ */
130
+ FormatDate(date) {
131
+ if (!date)
132
+ return 'N/A';
133
+ return new Date(date).toLocaleDateString('en-US', {
134
+ year: 'numeric',
135
+ month: 'long',
136
+ day: 'numeric'
137
+ });
138
+ }
139
+ static ɵfac = function AccountInfoComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AccountInfoComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
140
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AccountInfoComponent, selectors: [["mj-account-info"]], decls: 3, vars: 3, consts: [[1, "loading-container"], [1, "error-message"], [1, "account-info"], ["text", "Loading account info..."], [1, "fa-solid", "fa-exclamation-circle"], [1, "info-row"], [1, "info-label"], [1, "fa-solid", "fa-user"], [1, "info-value"], [1, "fa-solid", "fa-envelope"], [1, "fa-solid", "fa-shield-halved"], [1, "type-badge"], [1, "fa-solid", "fa-calendar-plus"], [1, "fa-solid", "fa-circle-check"], [1, "status-badge"]], template: function AccountInfoComponent_Template(rf, ctx) { if (rf & 1) {
141
+ i0.ɵɵtemplate(0, AccountInfoComponent_Conditional_0_Template, 2, 0, "div", 0)(1, AccountInfoComponent_Conditional_1_Template, 4, 1, "div", 1)(2, AccountInfoComponent_Conditional_2_Template, 31, 7, "div", 2);
142
+ } if (rf & 2) {
143
+ i0.ɵɵconditional(ctx.IsLoading ? 0 : -1);
144
+ i0.ɵɵadvance();
145
+ i0.ɵɵconditional(ctx.ErrorMessage && !ctx.IsLoading ? 1 : -1);
146
+ i0.ɵɵadvance();
147
+ i0.ɵɵconditional(ctx.CurrentUser && !ctx.IsLoading ? 2 : -1);
148
+ } }, dependencies: [i1.LoadingComponent], styles: [".loading-container[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n padding: 2rem;\n}\n\n.error-message[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 1rem;\n background-color: var(--mj-error-bg, #fef2f2);\n color: var(--mj-error-text, #dc2626);\n border-radius: 8px;\n font-size: 0.875rem;\n}\n\n.error-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1rem;\n}\n\n.account-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\n.info-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.75rem 0;\n border-bottom: 1px solid var(--mj-border-color, #e5e7eb);\n}\n\n.info-row[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.info-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n color: var(--mj-text-secondary, #6b7280);\n font-size: 0.875rem;\n}\n\n.info-label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 1rem;\n text-align: center;\n color: var(--mj-text-tertiary, #9ca3af);\n}\n\n.info-value[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary, #1f2937);\n text-align: right;\n}\n\n.type-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 0.25rem 0.75rem;\n border-radius: 9999px;\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.025em;\n}\n\n.type-owner[_ngcontent-%COMP%] {\n background-color: var(--mj-warning-bg, #fef3c7);\n color: var(--mj-warning-text, #d97706);\n}\n\n.type-admin[_ngcontent-%COMP%] {\n background-color: var(--mj-info-bg, #dbeafe);\n color: var(--mj-info-text, #2563eb);\n}\n\n.type-user[_ngcontent-%COMP%] {\n background-color: var(--mj-neutral-bg, #f3f4f6);\n color: var(--mj-neutral-text, #4b5563);\n}\n\n.status-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 0.25rem 0.75rem;\n border-radius: 9999px;\n font-size: 0.75rem;\n font-weight: 600;\n}\n\n.status-badge.active[_ngcontent-%COMP%] {\n background-color: var(--mj-success-bg, #dcfce7);\n color: var(--mj-success-text, #16a34a);\n}\n\n.status-badge.inactive[_ngcontent-%COMP%] {\n background-color: var(--mj-error-bg, #fef2f2);\n color: var(--mj-error-text, #dc2626);\n}\n\n@media (max-width: 480px) {\n .info-row[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: flex-start;\n gap: 0.5rem;\n }\n\n .info-value[_ngcontent-%COMP%] {\n text-align: left;\n padding-left: 1.75rem;\n }\n}"] });
149
+ }
150
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AccountInfoComponent, [{
151
+ type: Component,
152
+ args: [{ selector: 'mj-account-info', template: "@if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading account info...\"></mj-loading>\n </div>\n}\n\n@if (ErrorMessage && !IsLoading) {\n <div class=\"error-message\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <span>{{ ErrorMessage }}</span>\n </div>\n}\n\n@if (CurrentUser && !IsLoading) {\n <div class=\"account-info\">\n <div class=\"info-row\">\n <div class=\"info-label\">\n <i class=\"fa-solid fa-user\"></i>\n <span>Full Name</span>\n </div>\n <div class=\"info-value\">{{ CurrentUser.Name || 'Not set' }}</div>\n </div>\n\n <div class=\"info-row\">\n <div class=\"info-label\">\n <i class=\"fa-solid fa-envelope\"></i>\n <span>Email</span>\n </div>\n <div class=\"info-value\">{{ CurrentUser.Email || 'Not set' }}</div>\n </div>\n\n <div class=\"info-row\">\n <div class=\"info-label\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n <span>Account Type</span>\n </div>\n <div class=\"info-value\">\n <span class=\"type-badge\" [class]=\"'type-' + (CurrentUser.Type || 'user').toLowerCase()\">\n {{ CurrentUser.Type || 'User' }}\n </span>\n </div>\n </div>\n\n <div class=\"info-row\">\n <div class=\"info-label\">\n <i class=\"fa-solid fa-calendar-plus\"></i>\n <span>Account Created</span>\n </div>\n <div class=\"info-value\">{{ FormatDate(CurrentUser.__mj_CreatedAt) }}</div>\n </div>\n\n @if (CurrentUser.IsActive !== undefined) {\n <div class=\"info-row\">\n <div class=\"info-label\">\n <i class=\"fa-solid fa-circle-check\"></i>\n <span>Status</span>\n </div>\n <div class=\"info-value\">\n <span class=\"status-badge\" [class.active]=\"CurrentUser.IsActive\" [class.inactive]=\"!CurrentUser.IsActive\">\n {{ CurrentUser.IsActive ? 'Active' : 'Inactive' }}\n </span>\n </div>\n </div>\n }\n </div>\n}\n", styles: [".loading-container {\n display: flex;\n justify-content: center;\n padding: 2rem;\n}\n\n.error-message {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 1rem;\n background-color: var(--mj-error-bg, #fef2f2);\n color: var(--mj-error-text, #dc2626);\n border-radius: 8px;\n font-size: 0.875rem;\n}\n\n.error-message i {\n font-size: 1rem;\n}\n\n.account-info {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n}\n\n.info-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 0.75rem 0;\n border-bottom: 1px solid var(--mj-border-color, #e5e7eb);\n}\n\n.info-row:last-child {\n border-bottom: none;\n}\n\n.info-label {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n color: var(--mj-text-secondary, #6b7280);\n font-size: 0.875rem;\n}\n\n.info-label i {\n width: 1rem;\n text-align: center;\n color: var(--mj-text-tertiary, #9ca3af);\n}\n\n.info-value {\n font-weight: 500;\n color: var(--mj-text-primary, #1f2937);\n text-align: right;\n}\n\n.type-badge {\n display: inline-block;\n padding: 0.25rem 0.75rem;\n border-radius: 9999px;\n font-size: 0.75rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.025em;\n}\n\n.type-owner {\n background-color: var(--mj-warning-bg, #fef3c7);\n color: var(--mj-warning-text, #d97706);\n}\n\n.type-admin {\n background-color: var(--mj-info-bg, #dbeafe);\n color: var(--mj-info-text, #2563eb);\n}\n\n.type-user {\n background-color: var(--mj-neutral-bg, #f3f4f6);\n color: var(--mj-neutral-text, #4b5563);\n}\n\n.status-badge {\n display: inline-block;\n padding: 0.25rem 0.75rem;\n border-radius: 9999px;\n font-size: 0.75rem;\n font-weight: 600;\n}\n\n.status-badge.active {\n background-color: var(--mj-success-bg, #dcfce7);\n color: var(--mj-success-text, #16a34a);\n}\n\n.status-badge.inactive {\n background-color: var(--mj-error-bg, #fef2f2);\n color: var(--mj-error-text, #dc2626);\n}\n\n@media (max-width: 480px) {\n .info-row {\n flex-direction: column;\n align-items: flex-start;\n gap: 0.5rem;\n }\n\n .info-value {\n text-align: left;\n padding-left: 1.75rem;\n }\n}\n"] }]
153
+ }], () => [{ type: i0.ChangeDetectorRef }], null); })();
154
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AccountInfoComponent, { className: "AccountInfoComponent", filePath: "src/lib/account-info/account-info.component.ts", lineNumber: 14 }); })();
155
+ //# sourceMappingURL=account-info.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-info.component.js","sourceRoot":"","sources":["../../../src/lib/account-info/account-info.component.ts","../../../src/lib/account-info/account-info.component.html"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import * as i0 from "@angular/core";
2
+ /**
3
+ * Placeholder component for future appearance settings.
4
+ * Will include: theme selection, display density, font size.
5
+ */
6
+ export declare class AppearanceSettingsComponent {
7
+ PlannedFeatures: {
8
+ icon: string;
9
+ title: string;
10
+ description: string;
11
+ }[];
12
+ static ɵfac: i0.ɵɵFactoryDeclaration<AppearanceSettingsComponent, never>;
13
+ static ɵcmp: i0.ɵɵComponentDeclaration<AppearanceSettingsComponent, "mj-appearance-settings", never, {}, {}, never, never, false, never>;
14
+ }
15
+ //# sourceMappingURL=appearance-settings.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appearance-settings.component.d.ts","sourceRoot":"","sources":["../../../src/lib/appearance-settings/appearance-settings.component.ts"],"names":[],"mappings":";AAEA;;;GAGG;AACH,qBAKa,2BAA2B;IAEtC,eAAe;;;;QAgBb;yCAlBS,2BAA2B;2CAA3B,2BAA2B;CAmBvC"}
@@ -0,0 +1,79 @@
1
+ import { Component } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ const _forTrack0 = ($index, $item) => $item.title;
4
+ function AppearanceSettingsComponent_For_18_Template(rf, ctx) { if (rf & 1) {
5
+ i0.ɵɵelementStart(0, "div", 10)(1, "div", 11);
6
+ i0.ɵɵelement(2, "i");
7
+ i0.ɵɵelementEnd();
8
+ i0.ɵɵelementStart(3, "div", 12)(4, "span", 13);
9
+ i0.ɵɵtext(5);
10
+ i0.ɵɵelementEnd();
11
+ i0.ɵɵelementStart(6, "span", 14);
12
+ i0.ɵɵtext(7);
13
+ i0.ɵɵelementEnd()()();
14
+ } if (rf & 2) {
15
+ const feature_r1 = ctx.$implicit;
16
+ i0.ɵɵadvance(2);
17
+ i0.ɵɵclassMap(feature_r1.icon);
18
+ i0.ɵɵadvance(3);
19
+ i0.ɵɵtextInterpolate(feature_r1.title);
20
+ i0.ɵɵadvance(2);
21
+ i0.ɵɵtextInterpolate(feature_r1.description);
22
+ } }
23
+ /**
24
+ * Placeholder component for future appearance settings.
25
+ * Will include: theme selection, display density, font size.
26
+ */
27
+ export class AppearanceSettingsComponent {
28
+ // Future planned features
29
+ PlannedFeatures = [
30
+ {
31
+ icon: 'fa-solid fa-moon',
32
+ title: 'Theme',
33
+ description: 'Switch between light, dark, or system theme'
34
+ },
35
+ {
36
+ icon: 'fa-solid fa-text-height',
37
+ title: 'Font Size',
38
+ description: 'Adjust text size for better readability'
39
+ },
40
+ {
41
+ icon: 'fa-solid fa-expand',
42
+ title: 'Display Density',
43
+ description: 'Choose between comfortable and compact layouts'
44
+ }
45
+ ];
46
+ static ɵfac = function AppearanceSettingsComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AppearanceSettingsComponent)(); };
47
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AppearanceSettingsComponent, selectors: [["mj-appearance-settings"]], decls: 19, vars: 0, consts: [[1, "appearance-settings"], [1, "section-title"], [1, "section-description"], [1, "coming-soon-banner"], [1, "banner-icon"], [1, "fa-solid", "fa-palette"], [1, "banner-content"], [1, "planned-features"], [1, "features-title"], [1, "features-grid"], [1, "feature-card"], [1, "feature-icon"], [1, "feature-info"], [1, "feature-title"], [1, "feature-desc"]], template: function AppearanceSettingsComponent_Template(rf, ctx) { if (rf & 1) {
48
+ i0.ɵɵelementStart(0, "div", 0)(1, "h2", 1);
49
+ i0.ɵɵtext(2, "Appearance");
50
+ i0.ɵɵelementEnd();
51
+ i0.ɵɵelementStart(3, "p", 2);
52
+ i0.ɵɵtext(4, "Customize how MemberJunction looks and feels");
53
+ i0.ɵɵelementEnd();
54
+ i0.ɵɵelementStart(5, "div", 3)(6, "div", 4);
55
+ i0.ɵɵelement(7, "i", 5);
56
+ i0.ɵɵelementEnd();
57
+ i0.ɵɵelementStart(8, "div", 6)(9, "h3");
58
+ i0.ɵɵtext(10, "Coming Soon");
59
+ i0.ɵɵelementEnd();
60
+ i0.ɵɵelementStart(11, "p");
61
+ i0.ɵɵtext(12, "We're working on bringing you more customization options.");
62
+ i0.ɵɵelementEnd()()();
63
+ i0.ɵɵelementStart(13, "div", 7)(14, "h4", 8);
64
+ i0.ɵɵtext(15, "Planned Features");
65
+ i0.ɵɵelementEnd();
66
+ i0.ɵɵelementStart(16, "div", 9);
67
+ i0.ɵɵrepeaterCreate(17, AppearanceSettingsComponent_For_18_Template, 8, 4, "div", 10, _forTrack0);
68
+ i0.ɵɵelementEnd()()();
69
+ } if (rf & 2) {
70
+ i0.ɵɵadvance(17);
71
+ i0.ɵɵrepeater(ctx.PlannedFeatures);
72
+ } }, styles: [".appearance-settings[_ngcontent-%COMP%] {\n padding: 0;\n}\n\n.section-title[_ngcontent-%COMP%] {\n font-size: 1.5rem;\n font-weight: 600;\n margin: 0 0 0.5rem 0;\n color: var(--mj-text-primary, #1a1a1a);\n}\n\n.section-description[_ngcontent-%COMP%] {\n font-size: 0.875rem;\n color: var(--mj-text-secondary, #666);\n margin: 0 0 1.5rem 0;\n}\n\n.coming-soon-banner[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 1.5rem;\n padding: 2rem;\n background: linear-gradient(135deg, var(--mj-primary-light, #dbeafe) 0%, var(--mj-info-bg, #e0f2fe) 100%);\n border-radius: 16px;\n margin-bottom: 2rem;\n}\n\n.banner-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 4rem;\n height: 4rem;\n background: white;\n border-radius: 12px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);\n flex-shrink: 0;\n}\n\n.banner-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 2rem;\n color: var(--mj-primary-color, #3b82f6);\n}\n\n.banner-content[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n font-weight: 600;\n color: var(--mj-text-primary, #1f2937);\n margin: 0 0 0.5rem 0;\n}\n\n.banner-content[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n font-size: 0.875rem;\n color: var(--mj-text-secondary, #4b5563);\n margin: 0;\n}\n\n.planned-features[_ngcontent-%COMP%] {\n margin-top: 1rem;\n}\n\n.features-title[_ngcontent-%COMP%] {\n font-size: 0.875rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-text-secondary, #6b7280);\n margin: 0 0 1rem 0;\n}\n\n.features-grid[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.feature-card[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1rem 1.25rem;\n background: var(--mj-surface-color, #fff);\n border: 1px solid var(--mj-border-color, #e5e7eb);\n border-radius: 12px;\n opacity: 0.7;\n}\n\n.feature-icon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.5rem;\n height: 2.5rem;\n background: var(--mj-surface-secondary, #f3f4f6);\n border-radius: 8px;\n flex-shrink: 0;\n}\n\n.feature-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1rem;\n color: var(--mj-text-secondary, #6b7280);\n}\n\n.feature-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n}\n\n.feature-title[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary, #1f2937);\n}\n\n.feature-desc[_ngcontent-%COMP%] {\n font-size: 0.875rem;\n color: var(--mj-text-secondary, #6b7280);\n}\n\n@media (max-width: 480px) {\n .coming-soon-banner[_ngcontent-%COMP%] {\n flex-direction: column;\n text-align: center;\n }\n}"] });
73
+ }
74
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AppearanceSettingsComponent, [{
75
+ type: Component,
76
+ args: [{ selector: 'mj-appearance-settings', template: "<div class=\"appearance-settings\">\n <h2 class=\"section-title\">Appearance</h2>\n <p class=\"section-description\">Customize how MemberJunction looks and feels</p>\n\n <div class=\"coming-soon-banner\">\n <div class=\"banner-icon\">\n <i class=\"fa-solid fa-palette\"></i>\n </div>\n <div class=\"banner-content\">\n <h3>Coming Soon</h3>\n <p>We're working on bringing you more customization options.</p>\n </div>\n </div>\n\n <div class=\"planned-features\">\n <h4 class=\"features-title\">Planned Features</h4>\n <div class=\"features-grid\">\n @for (feature of PlannedFeatures; track feature.title) {\n <div class=\"feature-card\">\n <div class=\"feature-icon\">\n <i [class]=\"feature.icon\"></i>\n </div>\n <div class=\"feature-info\">\n <span class=\"feature-title\">{{ feature.title }}</span>\n <span class=\"feature-desc\">{{ feature.description }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n</div>\n", styles: [".appearance-settings {\n padding: 0;\n}\n\n.section-title {\n font-size: 1.5rem;\n font-weight: 600;\n margin: 0 0 0.5rem 0;\n color: var(--mj-text-primary, #1a1a1a);\n}\n\n.section-description {\n font-size: 0.875rem;\n color: var(--mj-text-secondary, #666);\n margin: 0 0 1.5rem 0;\n}\n\n.coming-soon-banner {\n display: flex;\n align-items: center;\n gap: 1.5rem;\n padding: 2rem;\n background: linear-gradient(135deg, var(--mj-primary-light, #dbeafe) 0%, var(--mj-info-bg, #e0f2fe) 100%);\n border-radius: 16px;\n margin-bottom: 2rem;\n}\n\n.banner-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 4rem;\n height: 4rem;\n background: white;\n border-radius: 12px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);\n flex-shrink: 0;\n}\n\n.banner-icon i {\n font-size: 2rem;\n color: var(--mj-primary-color, #3b82f6);\n}\n\n.banner-content h3 {\n font-size: 1.25rem;\n font-weight: 600;\n color: var(--mj-text-primary, #1f2937);\n margin: 0 0 0.5rem 0;\n}\n\n.banner-content p {\n font-size: 0.875rem;\n color: var(--mj-text-secondary, #4b5563);\n margin: 0;\n}\n\n.planned-features {\n margin-top: 1rem;\n}\n\n.features-title {\n font-size: 0.875rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-text-secondary, #6b7280);\n margin: 0 0 1rem 0;\n}\n\n.features-grid {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.feature-card {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1rem 1.25rem;\n background: var(--mj-surface-color, #fff);\n border: 1px solid var(--mj-border-color, #e5e7eb);\n border-radius: 12px;\n opacity: 0.7;\n}\n\n.feature-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.5rem;\n height: 2.5rem;\n background: var(--mj-surface-secondary, #f3f4f6);\n border-radius: 8px;\n flex-shrink: 0;\n}\n\n.feature-icon i {\n font-size: 1rem;\n color: var(--mj-text-secondary, #6b7280);\n}\n\n.feature-info {\n display: flex;\n flex-direction: column;\n}\n\n.feature-title {\n font-weight: 500;\n color: var(--mj-text-primary, #1f2937);\n}\n\n.feature-desc {\n font-size: 0.875rem;\n color: var(--mj-text-secondary, #6b7280);\n}\n\n@media (max-width: 480px) {\n .coming-soon-banner {\n flex-direction: column;\n text-align: center;\n }\n}\n"] }]
77
+ }], null, null); })();
78
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AppearanceSettingsComponent, { className: "AppearanceSettingsComponent", filePath: "src/lib/appearance-settings/appearance-settings.component.ts", lineNumber: 12 }); })();
79
+ //# sourceMappingURL=appearance-settings.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appearance-settings.component.js","sourceRoot":"","sources":["../../../src/lib/appearance-settings/appearance-settings.component.ts","../../../src/lib/appearance-settings/appearance-settings.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;;;;ICmBhC,AADF,+BAA0B,cACE;IACxB,oBAA8B;IAChC,iBAAM;IAEJ,AADF,+BAA0B,eACI;IAAA,YAAmB;IAAA,iBAAO;IACtD,gCAA2B;IAAA,YAAyB;IAExD,AADE,AADsD,iBAAO,EACvD,EACF;;;IANC,eAAsB;IAAtB,8BAAsB;IAGG,eAAmB;IAAnB,sCAAmB;IACpB,eAAyB;IAAzB,4CAAyB;;ADtBhE;;;GAGG;AAMH,MAAM,OAAO,2BAA2B;IACtC,0BAA0B;IAC1B,eAAe,GAAG;QAChB;YACE,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,OAAO;YACd,WAAW,EAAE,6CAA6C;SAC3D;QACD;YACE,IAAI,EAAE,yBAAyB;YAC/B,KAAK,EAAE,WAAW;YAClB,WAAW,EAAE,yCAAyC;SACvD;QACD;YACE,IAAI,EAAE,oBAAoB;YAC1B,KAAK,EAAE,iBAAiB;YACxB,WAAW,EAAE,gDAAgD;SAC9D;KACF,CAAC;qHAlBS,2BAA2B;6DAA3B,2BAA2B;YCVtC,AADF,8BAAiC,YACL;YAAA,0BAAU;YAAA,iBAAK;YACzC,4BAA+B;YAAA,4DAA4C;YAAA,iBAAI;YAG7E,AADF,8BAAgC,aACL;YACvB,uBAAmC;YACrC,iBAAM;YAEJ,AADF,8BAA4B,SACtB;YAAA,4BAAW;YAAA,iBAAK;YACpB,0BAAG;YAAA,0EAAyD;YAEhE,AADE,AAD8D,iBAAI,EAC5D,EACF;YAGJ,AADF,+BAA8B,aACD;YAAA,iCAAgB;YAAA,iBAAK;YAChD,+BAA2B;YACzB,iGAUC;YAGP,AADE,AADE,iBAAM,EACF,EACF;;YAbA,gBAUC;YAVD,kCAUC;;;iFDhBM,2BAA2B;cALvC,SAAS;2BACE,wBAAwB;;kFAIvB,2BAA2B"}
@@ -0,0 +1,113 @@
1
+ import { OnInit, ChangeDetectorRef } from '@angular/core';
2
+ import { ApplicationManager, BaseApplication } from '@memberjunction/ng-base-application';
3
+ import { SharedService } from '@memberjunction/ng-shared';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Represents an app item in the configuration UI
7
+ */
8
+ interface AppConfigItem {
9
+ App: BaseApplication;
10
+ UserAppId: string | null;
11
+ Sequence: number;
12
+ IsActive: boolean;
13
+ IsDirty: boolean;
14
+ }
15
+ /**
16
+ * Inline component for configuring user's application visibility and order.
17
+ * Allows users to:
18
+ * - Select which applications to show in the app switcher
19
+ * - Reorder applications via drag-and-drop
20
+ */
21
+ export declare class ApplicationSettingsComponent implements OnInit {
22
+ private appManager;
23
+ private sharedService;
24
+ private cdr;
25
+ AllApps: AppConfigItem[];
26
+ ActiveApps: AppConfigItem[];
27
+ AvailableApps: AppConfigItem[];
28
+ IsLoading: boolean;
29
+ IsSaving: boolean;
30
+ ErrorMessage: string;
31
+ SuccessMessage: string;
32
+ private draggedItem;
33
+ private draggedIndex;
34
+ private dropTargetIndex;
35
+ constructor(appManager: ApplicationManager, sharedService: SharedService, cdr: ChangeDetectorRef);
36
+ ngOnInit(): Promise<void>;
37
+ /**
38
+ * Loads the user's current app configuration
39
+ */
40
+ LoadConfiguration(): Promise<void>;
41
+ /**
42
+ * Builds app config items by matching system apps with user's UserApplication records
43
+ */
44
+ private BuildAppConfigItems;
45
+ /**
46
+ * Separates apps into active and available lists based on IsActive state
47
+ */
48
+ private RefreshAppLists;
49
+ /**
50
+ * Native drag start handler
51
+ */
52
+ OnDragStart(event: DragEvent, item: AppConfigItem, index: number): void;
53
+ /**
54
+ * Native drag over handler - allows drop
55
+ */
56
+ OnDragOver(event: DragEvent): void;
57
+ /**
58
+ * Native drag enter handler - tracks drop target
59
+ */
60
+ OnDragEnter(event: DragEvent, index: number): void;
61
+ /**
62
+ * Native drag end handler - cleanup
63
+ */
64
+ OnDragEnd(): void;
65
+ /**
66
+ * Native drop handler - reorder items
67
+ */
68
+ OnDrop(event: DragEvent): void;
69
+ /**
70
+ * Adds an app to the user's active list
71
+ */
72
+ AddApp(item: AppConfigItem): void;
73
+ /**
74
+ * Removes an app from the user's active list
75
+ */
76
+ RemoveApp(item: AppConfigItem): void;
77
+ /**
78
+ * Moves an app up in the order
79
+ */
80
+ MoveUp(item: AppConfigItem): void;
81
+ /**
82
+ * Moves an app down in the order
83
+ */
84
+ MoveDown(item: AppConfigItem): void;
85
+ /**
86
+ * Checks if there are any unsaved changes
87
+ */
88
+ HasChanges(): boolean;
89
+ /**
90
+ * Saves the user's app configuration
91
+ */
92
+ Save(): Promise<void>;
93
+ /**
94
+ * Updates an existing UserApplication record
95
+ */
96
+ private UpdateUserApplication;
97
+ /**
98
+ * Creates a new UserApplication record
99
+ */
100
+ private CreateUserApplication;
101
+ /**
102
+ * Resets all changes and reloads the configuration
103
+ */
104
+ Reset(): Promise<void>;
105
+ /**
106
+ * Check if drop target is active
107
+ */
108
+ IsDropTarget(index: number): boolean;
109
+ static ɵfac: i0.ɵɵFactoryDeclaration<ApplicationSettingsComponent, never>;
110
+ static ɵcmp: i0.ɵɵComponentDeclaration<ApplicationSettingsComponent, "mj-application-settings", never, {}, {}, never, never, false, never>;
111
+ }
112
+ export {};
113
+ //# sourceMappingURL=application-settings.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application-settings.component.d.ts","sourceRoot":"","sources":["../../../src/lib/application-settings/application-settings.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGrE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;;AAE1D;;GAEG;AACH,UAAU,aAAa;IACrB,GAAG,EAAE,eAAe,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAKa,4BAA6B,YAAW,MAAM;IAqBvD,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,GAAG;IArBb,OAAO,EAAE,aAAa,EAAE,CAAM;IAG9B,UAAU,EAAE,aAAa,EAAE,CAAM;IAGjC,aAAa,EAAE,aAAa,EAAE,CAAM;IAEpC,SAAS,UAAS;IAClB,QAAQ,UAAS;IACjB,YAAY,SAAM;IAClB,cAAc,SAAM;IAGpB,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,eAAe,CAAM;gBAGnB,UAAU,EAAE,kBAAkB,EAC9B,aAAa,EAAE,aAAa,EAC5B,GAAG,EAAE,iBAAiB;IAG1B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAoCxC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAUvE;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAOlC;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKlD;;OAEG;IACH,SAAS,IAAI,IAAI;IAMjB;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAyB9B;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAOjC;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAepC;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAkBjC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAkBnC;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA4C3B;;OAEG;YACW,qBAAqB;IAgBnC;;OAEG;YACW,qBAAqB;IAmBnC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;yCA3VzB,4BAA4B;2CAA5B,4BAA4B;CA8VxC"}