@memberjunction/ng-list-management 6.1.0-edge.5 → 6.1.0-edge.7
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.
- package/dist/lib/components/list-management-dialog/list-management-dialog.component.js +2 -2
- package/dist/lib/components/list-management-dialog/list-management-dialog.component.js.map +1 -1
- package/dist/lib/components/list-share-dialog/list-share-dialog.component.js +1 -1
- package/dist/lib/components/tag-chips/tag-chips.component.js +1 -1
- package/package.json +16 -16
|
@@ -295,7 +295,7 @@ function ListManagementDialogComponent_Conditional_0_Template(rf, ctx) { if (rf
|
|
|
295
295
|
i0.ɵɵelementStart(0, "div", 1);
|
|
296
296
|
i0.ɵɵlistener("click", function ListManagementDialogComponent_Conditional_0_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCancel()); });
|
|
297
297
|
i0.ɵɵelementStart(1, "div", 2);
|
|
298
|
-
i0.ɵɵlistener("click", function ListManagementDialogComponent_Conditional_0_Template_div_click_1_listener($event) {
|
|
298
|
+
i0.ɵɵlistener("click", function ListManagementDialogComponent_Conditional_0_Template_div_click_1_listener($event) { return $event.stopPropagation(); });
|
|
299
299
|
i0.ɵɵelementStart(2, "div", 3)(3, "div", 4)(4, "div", 5);
|
|
300
300
|
i0.ɵɵelement(5, "span", 6);
|
|
301
301
|
i0.ɵɵelementEnd();
|
|
@@ -937,7 +937,7 @@ export class ListManagementDialogComponent extends BaseAngularComponent {
|
|
|
937
937
|
i0.ɵɵconditionalCreate(0, ListManagementDialogComponent_Conditional_0_Template, 50, 18, "div", 0);
|
|
938
938
|
} if (rf & 2) {
|
|
939
939
|
i0.ɵɵconditional(ctx.visible ? 0 : -1);
|
|
940
|
-
} }, dependencies: [i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i2.DefaultValueAccessor, i2.SelectControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.MJEmptyStateComponent, i4.LoadingComponent], styles: ["\n\n\n\n\n\n\n.dialog-overlay[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease-out;\n backdrop-filter: blur(2px);\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n\n\n.dialog-container[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n box-shadow: 0 25px 50px -12px var(--mj-shadow-lg);\n width: 90vw;\n max-width: 600px;\n max-height: 85vh;\n display: flex;\n flex-direction: column;\n animation: _ngcontent-%COMP%_slideUp 0.3s ease-out;\n overflow: hidden;\n}\n\n@keyframes _ngcontent-%COMP%_slideUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n\n\n.dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.header-content[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.header-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n background: rgba(255, 255, 255, 0.2);\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 22px;\n}\n\n.header-text[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.dialog-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n letter-spacing: -0.01em;\n}\n\n.dialog-subtitle[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n opacity: 0.85;\n}\n\n.close-button[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border: none;\n background: rgba(255, 255, 255, 0.15);\n border-radius: 8px;\n color: var(--mj-text-inverse);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n transition: background 0.2s;\n}\n\n.close-button[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.25);\n}\n\n\n\n.search-section[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 16px 20px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.search-bar[_ngcontent-%COMP%] {\n flex: 1;\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.search-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 14px;\n color: var(--mj-text-muted);\n font-size: 14px;\n pointer-events: none;\n}\n\n.search-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px 40px 12px 42px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 14px;\n background: var(--mj-bg-surface-card);\n transition: all 0.2s;\n}\n\n.search-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-muted);\n}\n\n.clear-search[_ngcontent-%COMP%] {\n position: absolute;\n right: 12px;\n border: none;\n background: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.clear-search[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n}\n\n.create-button[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 18px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 10px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n white-space: nowrap;\n}\n\n.create-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n.create-button[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n\n\n.filter-tabs[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.tabs-left[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n}\n\n.tab-button[_ngcontent-%COMP%] {\n padding: 8px 16px;\n border: none;\n background: none;\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n border-radius: 6px;\n transition: all 0.2s;\n}\n\n.tab-button[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.tab-button.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.sort-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n}\n\n.sort-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n\n\n.create-form[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-bottom: 1px solid color-mix(in srgb, var(--mj-status-warning) 30%, transparent);\n animation: _ngcontent-%COMP%_slideDown 0.2s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from {\n opacity: 0;\n max-height: 0;\n }\n to {\n opacity: 1;\n max-height: 300px;\n }\n}\n\n.create-form-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 20px;\n font-weight: 600;\n color: var(--mj-status-warning);\n font-size: 14px;\n border-bottom: 1px solid color-mix(in srgb, var(--mj-status-warning) 30%, transparent);\n}\n\n.create-form-body[_ngcontent-%COMP%] {\n padding: 16px 20px;\n}\n\n.form-group[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n}\n\n.form-group[_ngcontent-%COMP%]:last-of-type {\n margin-bottom: 16px;\n}\n\n.form-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 14px;\n background: var(--mj-bg-surface-card);\n transition: all 0.2s;\n box-sizing: border-box;\n}\n\n.form-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.form-textarea[_ngcontent-%COMP%] {\n resize: vertical;\n min-height: 60px;\n}\n\n.create-form-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 10px;\n justify-content: flex-end;\n}\n\n\n\n.list-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n min-height: 200px;\n max-height: 400px;\n}\n\n\n\n.loading-state[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n}\n\n\n\n.list-items[_ngcontent-%COMP%] {\n padding: 8px 12px;\n}\n\n.list-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n margin-bottom: 8px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n transition: all 0.2s;\n}\n\n.list-item[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.list-item[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n box-shadow: 0 2px 8px var(--mj-shadow-sm);\n}\n\n.list-item.selected-add[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-color: var(--mj-status-success);\n}\n\n.list-item.selected-remove[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-color: var(--mj-status-error);\n}\n\n.list-item.is-member[_ngcontent-%COMP%] {\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n\n\n.list-item-select[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n}\n\n.select-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n transition: all 0.2s;\n}\n\n.select-btn.add-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-status-success);\n color: var(--mj-status-success);\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n}\n\n.select-btn.add-btn.selected[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n border-color: var(--mj-status-success);\n color: var(--mj-text-inverse);\n}\n\n.select-btn.remove-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n}\n\n.select-btn.remove-btn.selected[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n border-color: var(--mj-status-error);\n color: var(--mj-text-inverse);\n}\n\n\n\n.list-item-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.list-item-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 4px;\n}\n\n.list-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.list-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.badge[_ngcontent-%COMP%] {\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.02em;\n}\n\n.badge-new[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.list-item-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.list-description[_ngcontent-%COMP%] {\n max-width: 180px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.meta-separator[_ngcontent-%COMP%] {\n color: var(--mj-border-strong);\n}\n\n\n\n.membership-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 500;\n white-space: nowrap;\n}\n\n.membership-indicator.full-member[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.membership-indicator.partial-member[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.membership-indicator.not-member[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.membership-text[_ngcontent-%COMP%] {\n font-variant-numeric: tabular-nums;\n}\n\n\n\n.dialog-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--mj-bg-surface-sunken);\n border-top: 1px solid var(--mj-border-default);\n}\n\n.footer-summary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.summary-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n font-weight: 500;\n}\n\n.summary-item.add[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.summary-item.remove[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.summary-empty[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.footer-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 10px;\n}\n\n\n\n.btn[_ngcontent-%COMP%] {\n padding: 10px 20px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 8px;\n transition: all 0.2s;\n border: none;\n}\n\n.btn-primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.btn-primary[_ngcontent-%COMP%]:hover:not(:disabled) {\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n transform: translateY(-1px);\n}\n\n.btn-primary[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n transform: none;\n}\n\n.btn-secondary[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n}\n\n.btn-secondary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n}\n\n.btn-secondary[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n\n\n\n\n\n@media (max-width: 640px) {\n .dialog-overlay[_ngcontent-%COMP%] {\n align-items: flex-end;\n }\n\n .dialog-container[_ngcontent-%COMP%] {\n width: 100%;\n max-width: 100%;\n max-height: 90vh;\n border-radius: 24px 24px 0 0;\n animation: slideUpMobile 0.3s ease-out;\n }\n\n @keyframes slideUpMobile {\n from {\n transform: translateY(100%);\n }\n to {\n transform: translateY(0);\n }\n }\n\n .dialog-header[_ngcontent-%COMP%] {\n padding: 16px 20px;\n border-radius: 24px 24px 0 0;\n }\n\n .header-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n font-size: 18px;\n }\n\n .dialog-title[_ngcontent-%COMP%] {\n font-size: 16px;\n }\n\n .dialog-subtitle[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .search-section[_ngcontent-%COMP%] {\n padding: 12px 16px;\n flex-wrap: wrap;\n }\n\n .search-bar[_ngcontent-%COMP%] {\n width: 100%;\n order: 1;\n }\n\n .create-button[_ngcontent-%COMP%] {\n order: 2;\n width: 100%;\n justify-content: center;\n margin-top: 8px;\n }\n\n .button-text[_ngcontent-%COMP%] {\n display: inline;\n }\n\n .filter-tabs[_ngcontent-%COMP%] {\n padding: 10px 16px;\n flex-wrap: wrap;\n gap: 8px;\n }\n\n .tabs-left[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: space-between;\n }\n\n .tab-button[_ngcontent-%COMP%] {\n flex: 1;\n text-align: center;\n padding: 10px 8px;\n }\n\n .tabs-right[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .sort-select[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .list-content[_ngcontent-%COMP%] {\n max-height: 50vh;\n }\n\n .list-items[_ngcontent-%COMP%] {\n padding: 8px;\n }\n\n .list-item[_ngcontent-%COMP%] {\n padding: 12px;\n gap: 10px;\n }\n\n .list-item-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n }\n\n .list-description[_ngcontent-%COMP%] {\n display: none;\n }\n\n .membership-indicator[_ngcontent-%COMP%] {\n padding: 4px 8px;\n font-size: 11px;\n }\n\n .dialog-footer[_ngcontent-%COMP%] {\n padding: 12px 16px;\n flex-direction: column;\n gap: 12px;\n }\n\n .footer-summary[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: center;\n }\n\n .footer-actions[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .footer-actions[_ngcontent-%COMP%] .btn[_ngcontent-%COMP%] {\n flex: 1;\n justify-content: center;\n }\n\n .create-form-body[_ngcontent-%COMP%] {\n padding: 12px 16px;\n }\n\n .create-form-actions[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .create-form-actions[_ngcontent-%COMP%] .btn[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: center;\n }\n}\n\n\n\n@media (min-width: 641px) and (max-width: 1024px) {\n .dialog-container[_ngcontent-%COMP%] {\n max-width: 550px;\n }\n\n .list-description[_ngcontent-%COMP%] {\n max-width: 140px;\n }\n}\n\n\n\n@media (min-width: 1025px) {\n .list-content[_ngcontent-%COMP%] {\n max-height: 450px;\n }\n\n .list-item[_ngcontent-%COMP%]:hover {\n transform: translateX(4px);\n }\n}\n\n\n\n.search-input[_ngcontent-%COMP%]:focus-visible, \n.tab-button[_ngcontent-%COMP%]:focus-visible, \n.select-btn[_ngcontent-%COMP%]:focus-visible, \n.btn[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n}\n\n\n\n@media (prefers-reduced-motion: reduce) {\n .dialog-overlay[_ngcontent-%COMP%], \n .dialog-container[_ngcontent-%COMP%], \n .create-form[_ngcontent-%COMP%], \n .list-item[_ngcontent-%COMP%], \n .btn[_ngcontent-%COMP%] {\n animation: none;\n transition: none;\n }\n}"] });
|
|
940
|
+
} }, dependencies: [i2.NgSelectOption, i2.ɵNgSelectMultipleOption, i2.DefaultValueAccessor, i2.SelectControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.MJEmptyStateComponent, i4.LoadingComponent], styles: ["\n\n\n\n\n.dialog-overlay[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: var(--mj-bg-overlay);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease-out;\n backdrop-filter: blur(2px);\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n\n.dialog-container[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n border-radius: 16px;\n box-shadow: 0 25px 50px -12px var(--mj-shadow-lg);\n width: 90vw;\n max-width: 600px;\n max-height: 85vh;\n display: flex;\n flex-direction: column;\n animation: _ngcontent-%COMP%_slideUp 0.3s ease-out;\n overflow: hidden;\n}\n\n@keyframes _ngcontent-%COMP%_slideUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n\n.dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.header-content[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.header-icon[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n background: rgba(255, 255, 255, 0.2);\n border-radius: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 22px;\n}\n\n.header-text[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.dialog-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n letter-spacing: -0.01em;\n}\n\n.dialog-subtitle[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 13px;\n opacity: 0.85;\n}\n\n.close-button[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border: none;\n background: rgba(255, 255, 255, 0.15);\n border-radius: 8px;\n color: var(--mj-text-inverse);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n transition: background 0.2s;\n}\n\n.close-button[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.25);\n}\n\n\n.search-section[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 16px 20px;\n background: var(--mj-bg-surface-sunken);\n border-bottom: 1px solid var(--mj-border-default);\n}\n\n.search-bar[_ngcontent-%COMP%] {\n flex: 1;\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.search-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 14px;\n color: var(--mj-text-muted);\n font-size: 14px;\n pointer-events: none;\n}\n\n.search-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px 40px 12px 42px;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n font-size: 14px;\n background: var(--mj-bg-surface-card);\n transition: all 0.2s;\n}\n\n.search-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-muted);\n}\n\n.clear-search[_ngcontent-%COMP%] {\n position: absolute;\n right: 12px;\n border: none;\n background: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.clear-search[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n}\n\n.create-button[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 18px;\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: none;\n border-radius: 10px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n white-space: nowrap;\n}\n\n.create-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n}\n\n.create-button[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n\n.filter-tabs[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.tabs-left[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n}\n\n.tab-button[_ngcontent-%COMP%] {\n padding: 8px 16px;\n border: none;\n background: none;\n color: var(--mj-text-secondary);\n font-size: 13px;\n font-weight: 500;\n cursor: pointer;\n border-radius: 6px;\n transition: all 0.2s;\n}\n\n.tab-button[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.tab-button.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.sort-select[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n background: var(--mj-bg-surface-card);\n cursor: pointer;\n}\n\n.sort-select[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n}\n\n\n.create-form[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-bottom: 1px solid color-mix(in srgb, var(--mj-status-warning) 30%, transparent);\n animation: _ngcontent-%COMP%_slideDown 0.2s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from {\n opacity: 0;\n max-height: 0;\n }\n to {\n opacity: 1;\n max-height: 300px;\n }\n}\n\n.create-form-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 20px;\n font-weight: 600;\n color: var(--mj-status-warning);\n font-size: 14px;\n border-bottom: 1px solid color-mix(in srgb, var(--mj-status-warning) 30%, transparent);\n}\n\n.create-form-body[_ngcontent-%COMP%] {\n padding: 16px 20px;\n}\n\n.form-group[_ngcontent-%COMP%] {\n margin-bottom: 12px;\n}\n\n.form-group[_ngcontent-%COMP%]:last-of-type {\n margin-bottom: 16px;\n}\n\n.form-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px 14px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n font-size: 14px;\n background: var(--mj-bg-surface-card);\n transition: all 0.2s;\n box-sizing: border-box;\n}\n\n.form-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n}\n\n.form-textarea[_ngcontent-%COMP%] {\n resize: vertical;\n min-height: 60px;\n}\n\n.create-form-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 10px;\n justify-content: flex-end;\n}\n\n\n.list-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n min-height: 200px;\n max-height: 400px;\n}\n\n\n.loading-state[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n}\n\n\n.list-items[_ngcontent-%COMP%] {\n padding: 8px 12px;\n}\n\n.list-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px 16px;\n margin-bottom: 8px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n transition: all 0.2s;\n}\n\n.list-item[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n}\n\n.list-item[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-border-strong);\n box-shadow: 0 2px 8px var(--mj-shadow-sm);\n}\n\n.list-item.selected-add[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n border-color: var(--mj-status-success);\n}\n\n.list-item.selected-remove[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border-color: var(--mj-status-error);\n}\n\n.list-item.is-member[_ngcontent-%COMP%] {\n border-left: 3px solid var(--mj-brand-primary);\n}\n\n\n.list-item-select[_ngcontent-%COMP%] {\n display: flex;\n gap: 6px;\n}\n\n.select-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n transition: all 0.2s;\n}\n\n.select-btn.add-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-status-success);\n color: var(--mj-status-success);\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n}\n\n.select-btn.add-btn.selected[_ngcontent-%COMP%] {\n background: var(--mj-status-success);\n border-color: var(--mj-status-success);\n color: var(--mj-text-inverse);\n}\n\n.select-btn.remove-btn[_ngcontent-%COMP%]:hover {\n border-color: var(--mj-status-error);\n color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n}\n\n.select-btn.remove-btn.selected[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n border-color: var(--mj-status-error);\n color: var(--mj-text-inverse);\n}\n\n\n.list-item-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.list-item-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 4px;\n}\n\n.list-icon[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 14px;\n}\n\n.list-name[_ngcontent-%COMP%] {\n font-weight: 600;\n font-size: 14px;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.badge[_ngcontent-%COMP%] {\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.02em;\n}\n\n.badge-new[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n.list-item-meta[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.list-description[_ngcontent-%COMP%] {\n max-width: 180px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.meta-separator[_ngcontent-%COMP%] {\n color: var(--mj-border-strong);\n}\n\n\n.membership-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border-radius: 20px;\n font-size: 12px;\n font-weight: 500;\n white-space: nowrap;\n}\n\n.membership-indicator.full-member[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 15%, var(--mj-bg-surface));\n color: var(--mj-status-success);\n}\n\n.membership-indicator.partial-member[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n color: var(--mj-status-warning);\n}\n\n.membership-indicator.not-member[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.membership-text[_ngcontent-%COMP%] {\n font-variant-numeric: tabular-nums;\n}\n\n\n.dialog-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: var(--mj-bg-surface-sunken);\n border-top: 1px solid var(--mj-border-default);\n}\n\n.footer-summary[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.summary-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n font-weight: 500;\n}\n\n.summary-item.add[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.summary-item.remove[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.summary-empty[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 13px;\n}\n\n.footer-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 10px;\n}\n\n\n.btn[_ngcontent-%COMP%] {\n padding: 10px 20px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 8px;\n transition: all 0.2s;\n border: none;\n}\n\n.btn-primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.btn-primary[_ngcontent-%COMP%]:hover:not(:disabled) {\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n transform: translateY(-1px);\n}\n\n.btn-primary[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n transform: none;\n}\n\n.btn-secondary[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-default);\n}\n\n.btn-secondary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-border-strong);\n}\n\n.btn-secondary[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n\n\n\n\n@media (max-width: 640px) {\n .dialog-overlay[_ngcontent-%COMP%] {\n align-items: flex-end;\n }\n\n .dialog-container[_ngcontent-%COMP%] {\n width: 100%;\n max-width: 100%;\n max-height: 90vh;\n border-radius: 24px 24px 0 0;\n animation: slideUpMobile 0.3s ease-out;\n }\n\n @keyframes slideUpMobile {\n from {\n transform: translateY(100%);\n }\n to {\n transform: translateY(0);\n }\n }\n\n .dialog-header[_ngcontent-%COMP%] {\n padding: 16px 20px;\n border-radius: 24px 24px 0 0;\n }\n\n .header-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n font-size: 18px;\n }\n\n .dialog-title[_ngcontent-%COMP%] {\n font-size: 16px;\n }\n\n .dialog-subtitle[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .search-section[_ngcontent-%COMP%] {\n padding: 12px 16px;\n flex-wrap: wrap;\n }\n\n .search-bar[_ngcontent-%COMP%] {\n width: 100%;\n order: 1;\n }\n\n .create-button[_ngcontent-%COMP%] {\n order: 2;\n width: 100%;\n justify-content: center;\n margin-top: 8px;\n }\n\n .button-text[_ngcontent-%COMP%] {\n display: inline;\n }\n\n .filter-tabs[_ngcontent-%COMP%] {\n padding: 10px 16px;\n flex-wrap: wrap;\n gap: 8px;\n }\n\n .tabs-left[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: space-between;\n }\n\n .tab-button[_ngcontent-%COMP%] {\n flex: 1;\n text-align: center;\n padding: 10px 8px;\n }\n\n .tabs-right[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .sort-select[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .list-content[_ngcontent-%COMP%] {\n max-height: 50vh;\n }\n\n .list-items[_ngcontent-%COMP%] {\n padding: 8px;\n }\n\n .list-item[_ngcontent-%COMP%] {\n padding: 12px;\n gap: 10px;\n }\n\n .list-item-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n }\n\n .list-description[_ngcontent-%COMP%] {\n display: none;\n }\n\n .membership-indicator[_ngcontent-%COMP%] {\n padding: 4px 8px;\n font-size: 11px;\n }\n\n .dialog-footer[_ngcontent-%COMP%] {\n padding: 12px 16px;\n flex-direction: column;\n gap: 12px;\n }\n\n .footer-summary[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: center;\n }\n\n .footer-actions[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .footer-actions[_ngcontent-%COMP%] .btn[_ngcontent-%COMP%] {\n flex: 1;\n justify-content: center;\n }\n\n .create-form-body[_ngcontent-%COMP%] {\n padding: 12px 16px;\n }\n\n .create-form-actions[_ngcontent-%COMP%] {\n flex-direction: column;\n }\n\n .create-form-actions[_ngcontent-%COMP%] .btn[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: center;\n }\n}\n\n\n@media (min-width: 641px) and (max-width: 1024px) {\n .dialog-container[_ngcontent-%COMP%] {\n max-width: 550px;\n }\n\n .list-description[_ngcontent-%COMP%] {\n max-width: 140px;\n }\n}\n\n\n@media (min-width: 1025px) {\n .list-content[_ngcontent-%COMP%] {\n max-height: 450px;\n }\n\n .list-item[_ngcontent-%COMP%]:hover {\n transform: translateX(4px);\n }\n}\n\n\n.search-input[_ngcontent-%COMP%]:focus-visible, \n.tab-button[_ngcontent-%COMP%]:focus-visible, \n.select-btn[_ngcontent-%COMP%]:focus-visible, \n.btn[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mj-brand-primary);\n outline-offset: 2px;\n}\n\n\n@media (prefers-reduced-motion: reduce) {\n .dialog-overlay[_ngcontent-%COMP%], \n .dialog-container[_ngcontent-%COMP%], \n .create-form[_ngcontent-%COMP%], \n .list-item[_ngcontent-%COMP%], \n .btn[_ngcontent-%COMP%] {\n animation: none;\n transition: none;\n }\n}"] });
|
|
941
941
|
}
|
|
942
942
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ListManagementDialogComponent, [{
|
|
943
943
|
type: Component,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-management-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/components/list-management-dialog/list-management-dialog.component.ts","../../../../src/lib/components/list-management-dialog/list-management-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n ChangeDetectorRef\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { Metadata } from '@memberjunction/core';\nimport { MJListEntity, MJListCategoryEntity } from '@memberjunction/core-entities';\nimport { ListManagementService } from '../../services/list-management.service';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport {\n ListManagementDialogConfig,\n ListManagementResult,\n ListItemViewModel,\n ListFilterTab,\n ListSortOption,\n CreateListConfig,\n ListOperationDetail\n} from '../../models/list-management.models';\n\n/**\n * A gorgeous, responsive dialog for managing list membership.\n * Supports adding/removing records from multiple lists with membership indicators.\n *\n * Features:\n * - Search and filter lists\n * - Visual membership indicators (full/partial/none)\n * - Inline list creation\n * - Mobile-responsive bottom sheet on small screens\n * - Batch operations with progress feedback\n */\n@Component({\n standalone: false,\n selector: 'mj-list-management-dialog',\n templateUrl: './list-management-dialog.component.html',\n styleUrls: ['./list-management-dialog.component.css']\n})\nexport class ListManagementDialogComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n /**\n * Configuration for the dialog.\n *\n * Initialization is deliberately order-independent with {@link visible}:\n * Angular assigns inputs in template attribute order, so a host binding\n * `[visible]` before `[config]` would otherwise open the dialog while\n * `config` is still undefined — `loadData()` would bail silently and the\n * dialog would render permanently empty.\n */\n @Input()\n get config(): ListManagementDialogConfig {\n return this._config;\n }\n set config(value: ListManagementDialogConfig) {\n this._config = value;\n this.tryInitialize();\n }\n private _config!: ListManagementDialogConfig;\n\n /**\n * Controls dialog visibility\n */\n @Input()\n get visible(): boolean {\n return this._visible;\n }\n set visible(value: boolean) {\n if (value && !this._visible) {\n this._pendingInit = true;\n }\n this._visible = value;\n this.tryInitialize();\n }\n private _visible = false;\n\n /** Set on each closed→open transition; cleared once init actually runs (requires config). */\n private _pendingInit = false;\n\n /** Runs initialization once per open, as soon as BOTH visible and config are available. */\n private tryInitialize(): void {\n if (this._pendingInit && this._visible && this._config) {\n this._pendingInit = false;\n void this.initializeDialog();\n }\n }\n\n /**\n * Emitted when dialog is closed with results\n */\n @Output() complete = new EventEmitter<ListManagementResult>();\n\n /**\n * Emitted when dialog is cancelled\n */\n @Output() cancel = new EventEmitter<void>();\n\n // State\n loading = false;\n saving = false;\n searchText = '';\n activeTab: ListFilterTab = 'all';\n sortOption: ListSortOption = 'name';\n showCreateForm = false;\n\n // Data\n allLists: ListItemViewModel[] = [];\n filteredLists: ListItemViewModel[] = [];\n categories: MJListCategoryEntity[] = [];\n\n // Create form state\n newListName = '';\n newListDescription = '';\n newListCategoryId: string | null = null;\n\n // Track changes\n private originalMembership = new Map<string, boolean>();\n public addedToLists: Set<string> = new Set();\n public removedFromLists: Set<string> = new Set();\n public newlyCreatedLists: MJListEntity[] = [];\n\n // Cleanup\n private destroy$ = new Subject<void>();\n private searchSubject = new Subject<string>();\n\n constructor(\n private listService: ListManagementService,\n private cdr: ChangeDetectorRef\n ) {\n super();}\n\n ngOnInit(): void {\n this.setupSearchDebounce();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Get dialog title based on config\n */\n get dialogTitle(): string {\n if (this.config?.dialogTitle) {\n return this.config.dialogTitle;\n }\n\n const recordCount = this.config?.recordIds?.length || 0;\n const recordText = recordCount === 1 ? '1 record' : `${recordCount} records`;\n\n switch (this.config?.mode) {\n case 'add':\n return `Add ${recordText} to Lists`;\n case 'remove':\n return `Remove ${recordText} from Lists`;\n default:\n return `Manage List Membership`;\n }\n }\n\n /**\n * Get subtitle showing context\n */\n get dialogSubtitle(): string {\n const recordCount = this.config?.recordIds?.length || 0;\n const entityName = this.config?.entityName || 'records';\n\n if (recordCount === 1 && this.config?.recordDisplayNames?.[0]) {\n return `\"${this.config.recordDisplayNames[0]}\" from ${entityName}`;\n }\n\n return `${recordCount} ${entityName} record${recordCount !== 1 ? 's' : ''}`;\n }\n\n /**\n * Check if there are pending changes\n */\n get hasChanges(): boolean {\n return this.addedToLists.size > 0 || this.removedFromLists.size > 0;\n }\n\n /**\n * Get count of lists to add to\n */\n get addCount(): number {\n return this.addedToLists.size;\n }\n\n /**\n * Get count of lists to remove from\n */\n get removeCount(): number {\n return this.removedFromLists.size;\n }\n\n /**\n * Setup search with debounce\n */\n private setupSearchDebounce(): void {\n this.searchSubject.pipe(\n debounceTime(300),\n takeUntil(this.destroy$)\n ).subscribe((searchText: string) => {\n this.searchText = searchText;\n this.applyFilters();\n });\n }\n\n /**\n * Initialize dialog when opened\n */\n private async initializeDialog(): Promise<void> {\n // Per ListManagementService's multi-provider contract: thread this\n // component's Provider input into the (root-injected) service. Null is\n // fine — the service falls back to the global provider.\n this.listService.Provider = this.Provider;\n this.resetState();\n await this.loadData();\n }\n\n /**\n * Reset all state\n */\n private resetState(): void {\n this.searchText = '';\n this.activeTab = 'all';\n this.sortOption = 'name';\n this.showCreateForm = false;\n this.newListName = '';\n this.newListDescription = '';\n this.newListCategoryId = null;\n this.addedToLists.clear();\n this.removedFromLists.clear();\n this.newlyCreatedLists = [];\n this.originalMembership.clear();\n }\n\n /**\n * Load lists and membership data\n */\n private async loadData(): Promise<void> {\n if (!this.config) return;\n\n this.loading = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n\n // Load lists and membership in parallel\n const [lists, membership, categories] = await Promise.all([\n this.listService.getListsForEntity(\n this.config.entityId,\n md.CurrentUser.ID,\n true // Force refresh\n ),\n this.listService.getRecordMembership(\n this.config.entityId,\n this.config.recordIds\n ),\n this.listService.getListCategories()\n ]);\n\n this.categories = categories;\n\n // Build view models\n this.allLists = await this.listService.buildListViewModels(\n lists,\n this.config.recordIds,\n membership\n );\n\n // Store original membership state\n for (const vm of this.allLists) {\n this.originalMembership.set(vm.list.ID, vm.isFullMember || vm.isPartialMember);\n }\n\n // Pre-select lists if configured\n if (this.config.preSelectedListIds) {\n for (const listId of this.config.preSelectedListIds) {\n const vm = this.allLists.find(l => UUIDsEqual(l.list.ID, listId));\n if (vm) {\n vm.isSelectedForAdd = true;\n this.addedToLists.add(listId);\n }\n }\n }\n\n this.applyFilters();\n } catch (error) {\n console.error('Error loading list data:', error);\n } finally {\n this.loading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle search input\n */\n onSearchInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.searchSubject.next(value);\n }\n\n /**\n * Clear search\n */\n clearSearch(): void {\n this.searchText = '';\n this.searchSubject.next('');\n }\n\n /**\n * Change active tab\n */\n setActiveTab(tab: ListFilterTab): void {\n this.activeTab = tab;\n this.applyFilters();\n }\n\n /**\n * Change sort option\n */\n setSortOption(option: ListSortOption): void {\n this.sortOption = option;\n this.applyFilters();\n }\n\n /**\n * Apply all filters and sorting\n */\n private applyFilters(): void {\n let result = [...this.allLists];\n\n // Apply search filter\n if (this.searchText.trim()) {\n const search = this.searchText.toLowerCase();\n result = result.filter(vm =>\n vm.list.Name.toLowerCase().includes(search) ||\n (vm.list.Description?.toLowerCase().includes(search))\n );\n }\n\n // Apply tab filter\n switch (this.activeTab) {\n case 'my-lists':\n // Already filtered by user in loadData\n break;\n case 'recent':\n // Sort by last updated and take top 10\n result = result\n .sort((a, b) => b.lastUpdated.getTime() - a.lastUpdated.getTime())\n .slice(0, 10);\n break;\n // 'all' and 'shared' - no additional filtering for now\n }\n\n // Apply sorting\n switch (this.sortOption) {\n case 'name':\n result.sort((a, b) => a.list.Name.localeCompare(b.list.Name));\n break;\n case 'recent':\n result.sort((a, b) => b.lastUpdated.getTime() - a.lastUpdated.getTime());\n break;\n case 'item-count':\n result.sort((a, b) => b.itemCount - a.itemCount);\n break;\n }\n\n this.filteredLists = result;\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle list selection for adding\n */\n toggleListForAdd(vm: ListItemViewModel): void {\n if (this.config?.mode === 'remove') return;\n\n const listId = vm.list.ID;\n\n if (vm.isSelectedForAdd || this.addedToLists.has(listId)) {\n // Deselect\n vm.isSelectedForAdd = false;\n this.addedToLists.delete(listId);\n } else {\n // Select for add\n vm.isSelectedForAdd = true;\n vm.isSelectedForRemove = false;\n this.addedToLists.add(listId);\n this.removedFromLists.delete(listId);\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle list selection for removal\n */\n toggleListForRemove(vm: ListItemViewModel): void {\n if (this.config?.mode === 'add') return;\n if (!this.config?.allowRemove && this.config?.mode !== 'manage') return;\n\n const listId = vm.list.ID;\n\n if (vm.isSelectedForRemove || this.removedFromLists.has(listId)) {\n // Deselect\n vm.isSelectedForRemove = false;\n this.removedFromLists.delete(listId);\n } else {\n // Select for remove\n vm.isSelectedForRemove = true;\n vm.isSelectedForAdd = false;\n this.removedFromLists.add(listId);\n this.addedToLists.delete(listId);\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Get membership indicator class\n */\n getMembershipClass(vm: ListItemViewModel): string {\n if (vm.isFullMember) return 'full-member';\n if (vm.isPartialMember) return 'partial-member';\n return 'not-member';\n }\n\n /**\n * Get membership indicator text\n */\n getMembershipText(vm: ListItemViewModel): string {\n if (vm.isFullMember) {\n return `${vm.membershipCount}/${vm.totalSelectedRecords}`;\n }\n if (vm.isPartialMember) {\n return `${vm.membershipCount}/${vm.totalSelectedRecords}`;\n }\n return `0/${vm.totalSelectedRecords}`;\n }\n\n /**\n * Get membership icon\n */\n getMembershipIcon(vm: ListItemViewModel): string {\n if (vm.isFullMember) return 'fa-solid fa-check-circle';\n if (vm.isPartialMember) return 'fa-solid fa-circle-half-stroke';\n return 'fa-regular fa-circle';\n }\n\n /**\n * Show create list form\n */\n showCreateListForm(): void {\n this.showCreateForm = true;\n this.newListName = '';\n this.newListDescription = '';\n this.newListCategoryId = null;\n }\n\n /**\n * Cancel create list form\n */\n cancelCreateList(): void {\n this.showCreateForm = false;\n this.newListName = '';\n this.newListDescription = '';\n this.newListCategoryId = null;\n }\n\n /**\n * Create a new list\n */\n async createList(): Promise<void> {\n if (!this.newListName.trim() || !this.config) return;\n\n this.saving = true;\n\n try {\n const createConfig: CreateListConfig = {\n name: this.newListName.trim(),\n description: this.newListDescription.trim() || undefined,\n categoryId: this.newListCategoryId || undefined,\n entityId: this.config.entityId\n };\n\n const newList = await this.listService.createList(createConfig);\n\n if (newList) {\n this.newlyCreatedLists.push(newList);\n\n // Add to view models and select for add\n const vm: ListItemViewModel = {\n list: newList,\n itemCount: 0,\n membershipCount: 0,\n totalSelectedRecords: this.config.recordIds.length,\n isFullMember: false,\n isPartialMember: false,\n isNotMember: true,\n lastUpdated: new Date(),\n isSelectedForAdd: true,\n isSelectedForRemove: false\n };\n\n this.allLists.unshift(vm);\n this.addedToLists.add(newList.ID);\n\n this.showCreateForm = false;\n this.newListName = '';\n this.newListDescription = '';\n this.newListCategoryId = null;\n\n this.applyFilters();\n }\n } catch (error) {\n console.error('Error creating list:', error);\n } finally {\n this.saving = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Apply changes and close dialog\n */\n async applyChanges(): Promise<void> {\n if (!this.config) return;\n\n this.saving = true;\n\n const result: ListManagementResult = {\n action: 'apply',\n added: [],\n removed: [],\n newListsCreated: this.newlyCreatedLists,\n summary: { added: 0, removed: 0, skipped: 0, failed: 0 }\n };\n\n try {\n // Process additions\n if (this.addedToLists.size > 0) {\n const addResult = await this.listService.addRecordsToLists(\n [...this.addedToLists],\n this.config.recordIds,\n true // Skip duplicates\n );\n result.summary!.added += addResult.success;\n result.summary!.skipped += addResult.skipped;\n result.summary!.failed += addResult.failed;\n\n for (const listId of this.addedToLists) {\n const vm = this.allLists.find(l => UUIDsEqual(l.list.ID, listId));\n if (vm) {\n result.added.push({\n listId,\n listName: vm.list.Name,\n recordIds: this.config.recordIds\n });\n }\n }\n }\n\n // Process removals\n if (this.removedFromLists.size > 0) {\n const removeResult = await this.listService.removeRecordsFromLists(\n [...this.removedFromLists],\n this.config.recordIds\n );\n result.summary!.removed += removeResult.success;\n result.summary!.failed += removeResult.failed;\n\n for (const listId of this.removedFromLists) {\n const vm = this.allLists.find(l => UUIDsEqual(l.list.ID, listId));\n if (vm) {\n result.removed.push({\n listId,\n listName: vm.list.Name,\n recordIds: this.config.recordIds\n });\n }\n }\n }\n\n this.complete.emit(result);\n } catch (error) {\n console.error('Error applying changes:', error);\n } finally {\n this.saving = false;\n this._visible = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Cancel and close dialog\n */\n onCancel(): void {\n const result: ListManagementResult = {\n action: 'cancel',\n added: [],\n removed: [],\n newListsCreated: []\n };\n\n this._visible = false;\n this.cancel.emit();\n }\n\n /**\n * Format date for display\n */\n formatDate(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (minutes < 1) return 'just now';\n if (minutes < 60) return `${minutes}m ago`;\n if (hours < 24) return `${hours}h ago`;\n if (days < 7) return `${days}d ago`;\n\n return date.toLocaleDateString();\n }\n\n /**\n * Check if we should show the add button for a list\n */\n showAddButton(vm: ListItemViewModel): boolean {\n if (this.config?.mode === 'remove') return false;\n return !vm.isFullMember || !this.originalMembership.get(vm.list.ID);\n }\n\n /**\n * Check if we should show the remove button for a list\n */\n showRemoveButton(vm: ListItemViewModel): boolean {\n if (this.config?.mode === 'add') return false;\n if (!this.config?.allowRemove && this.config?.mode !== 'manage') return false;\n return vm.isFullMember || vm.isPartialMember || this.originalMembership.get(vm.list.ID) === true;\n }\n}\n","@if (visible) {\n <div class=\"dialog-overlay\" (click)=\"onCancel()\">\n <div class=\"dialog-container\" (click)=\"$event.stopPropagation()\">\n <!-- Header -->\n <div class=\"dialog-header\">\n <div class=\"header-content\">\n <div class=\"header-icon\">\n <span class=\"fa-solid fa-rectangle-list\"></span>\n </div>\n <div class=\"header-text\">\n <h2 class=\"dialog-title\">{{ dialogTitle }}</h2>\n <p class=\"dialog-subtitle\">{{ dialogSubtitle }}</p>\n </div>\n </div>\n <button class=\"close-button\" (click)=\"onCancel()\" title=\"Close\">\n <span class=\"fa-solid fa-times\"></span>\n </button>\n </div>\n\n <!-- Search and Filters -->\n <div class=\"search-section\">\n <div class=\"search-bar\">\n <span class=\"fa-solid fa-search search-icon\"></span>\n <input\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search lists...\"\n [value]=\"searchText\"\n (input)=\"onSearchInput($event)\"\n />\n @if (searchText) {\n <button class=\"clear-search\" (click)=\"clearSearch()\">\n <span class=\"fa-solid fa-times-circle\"></span>\n </button>\n }\n </div>\n\n @if (config.allowCreate !== false) {\n <button class=\"create-button\" (click)=\"showCreateListForm()\" [disabled]=\"showCreateForm\">\n <span class=\"fa-solid fa-plus\"></span>\n <span class=\"button-text\">New</span>\n </button>\n }\n </div>\n\n <!-- Filter Tabs -->\n <div class=\"filter-tabs\">\n <div class=\"tabs-left\">\n <button\n class=\"tab-button\"\n [class.active]=\"activeTab === 'all'\"\n (click)=\"setActiveTab('all')\">\n All\n </button>\n <button\n class=\"tab-button\"\n [class.active]=\"activeTab === 'my-lists'\"\n (click)=\"setActiveTab('my-lists')\">\n My Lists\n </button>\n <button\n class=\"tab-button\"\n [class.active]=\"activeTab === 'recent'\"\n (click)=\"setActiveTab('recent')\">\n Recent\n </button>\n </div>\n <div class=\"tabs-right\">\n <select class=\"sort-select\" [value]=\"sortOption\" (change)=\"setSortOption($any($event.target).value)\">\n <option value=\"name\">Sort: Name</option>\n <option value=\"recent\">Sort: Recent</option>\n <option value=\"item-count\">Sort: Items</option>\n </select>\n </div>\n </div>\n\n <!-- Create List Form -->\n @if (showCreateForm) {\n <div class=\"create-form\">\n <div class=\"create-form-header\">\n <span class=\"fa-solid fa-plus-circle\"></span>\n <span>Create New List</span>\n </div>\n <div class=\"create-form-body\">\n <div class=\"form-group\">\n <input\n type=\"text\"\n class=\"form-input\"\n placeholder=\"List name *\"\n [(ngModel)]=\"newListName\"\n [disabled]=\"saving\"\n (keyup.enter)=\"createList()\"\n />\n </div>\n <div class=\"form-group\">\n <textarea\n class=\"form-input form-textarea\"\n placeholder=\"Description (optional)\"\n [(ngModel)]=\"newListDescription\"\n [disabled]=\"saving\"\n rows=\"2\">\n </textarea>\n </div>\n @if (categories.length > 0) {\n <div class=\"form-group\">\n <select class=\"form-input\" [(ngModel)]=\"newListCategoryId\" [disabled]=\"saving\">\n <option [ngValue]=\"null\">No category</option>\n @for (category of categories; track category.ID) {\n <option [ngValue]=\"category.ID\">{{ category.Name }}</option>\n }\n </select>\n </div>\n }\n <div class=\"create-form-actions\">\n <button\n class=\"btn btn-primary\"\n (click)=\"createList()\"\n [disabled]=\"!newListName.trim() || saving\">\n @if (saving) {\n <span class=\"fa-solid fa-spinner fa-spin\"></span>\n }\n Create List\n </button>\n <button class=\"btn btn-secondary\" (click)=\"cancelCreateList()\" [disabled]=\"saving\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- List Content -->\n <div class=\"list-content\">\n @if (loading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading lists...\" size=\"medium\"></mj-loading>\n </div>\n } @else if (filteredLists.length === 0) {\n @if (searchText) {\n <mj-empty-state\n Variant=\"no-results\"\n Icon=\"fa-solid fa-magnifying-glass\"\n Title=\"No lists found\"\n Message=\"Try a different search term\" />\n } @else {\n <mj-empty-state\n Icon=\"fa-solid fa-rectangle-list\"\n Title=\"No lists yet\"\n Message=\"Create your first list to get started\"\n [ActionText]=\"config.allowCreate !== false ? 'Create List' : ''\"\n ActionIcon=\"fa-solid fa-plus\"\n (Action)=\"showCreateListForm()\" />\n }\n } @else {\n <div class=\"list-items\">\n @for (vm of filteredLists; track vm.list.ID) {\n <div\n class=\"list-item\"\n [class.selected-add]=\"vm.isSelectedForAdd || addedToLists.has(vm.list.ID)\"\n [class.selected-remove]=\"vm.isSelectedForRemove || removedFromLists.has(vm.list.ID)\"\n [class.is-member]=\"vm.isFullMember || vm.isPartialMember\">\n\n <!-- Checkbox / Selection Area -->\n <div class=\"list-item-select\">\n @if (showAddButton(vm)) {\n <button\n class=\"select-btn add-btn\"\n [class.selected]=\"vm.isSelectedForAdd || addedToLists.has(vm.list.ID)\"\n (click)=\"toggleListForAdd(vm)\"\n [title]=\"(vm.isSelectedForAdd || addedToLists.has(vm.list.ID)) ? 'Remove from selection' : 'Add to this list'\">\n @if (vm.isSelectedForAdd || addedToLists.has(vm.list.ID)) {\n <span class=\"fa-solid fa-check\"></span>\n } @else {\n <span class=\"fa-solid fa-plus\"></span>\n }\n </button>\n }\n @if (showRemoveButton(vm) && (vm.isFullMember || vm.isPartialMember)) {\n <button\n class=\"select-btn remove-btn\"\n [class.selected]=\"vm.isSelectedForRemove || removedFromLists.has(vm.list.ID)\"\n (click)=\"toggleListForRemove(vm)\"\n [title]=\"(vm.isSelectedForRemove || removedFromLists.has(vm.list.ID)) ? 'Cancel removal' : 'Remove from this list'\">\n @if (vm.isSelectedForRemove || removedFromLists.has(vm.list.ID)) {\n <span class=\"fa-solid fa-undo\"></span>\n } @else {\n <span class=\"fa-solid fa-minus\"></span>\n }\n </button>\n }\n </div>\n\n <!-- List Info -->\n <div class=\"list-item-content\">\n <div class=\"list-item-header\">\n <span class=\"fa-solid fa-folder list-icon\"></span>\n <span class=\"list-name\">{{ vm.list.Name }}</span>\n @if (newlyCreatedLists.includes(vm.list)) {\n <span class=\"badge badge-new\">New</span>\n }\n </div>\n <div class=\"list-item-meta\">\n @if (vm.list.Description) {\n <span class=\"list-description\">{{ vm.list.Description }}</span>\n <span class=\"meta-separator\">•</span>\n }\n <span class=\"list-count\">{{ vm.itemCount }} item{{ vm.itemCount !== 1 ? 's' : '' }}</span>\n <span class=\"meta-separator\">•</span>\n <span class=\"list-updated\">{{ formatDate(vm.lastUpdated) }}</span>\n </div>\n </div>\n\n <!-- Membership Indicator -->\n @if (config.showMembership !== false) {\n <div class=\"membership-indicator\" [class]=\"getMembershipClass(vm)\">\n <span [class]=\"getMembershipIcon(vm)\"></span>\n <span class=\"membership-text\">{{ getMembershipText(vm) }}</span>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Footer -->\n <div class=\"dialog-footer\">\n <div class=\"footer-summary\">\n @if (hasChanges) {\n @if (addCount > 0) {\n <span class=\"summary-item add\">\n <span class=\"fa-solid fa-plus-circle\"></span>\n {{ addCount }} list{{ addCount !== 1 ? 's' : '' }}\n </span>\n }\n @if (removeCount > 0) {\n <span class=\"summary-item remove\">\n <span class=\"fa-solid fa-minus-circle\"></span>\n {{ removeCount }} list{{ removeCount !== 1 ? 's' : '' }}\n </span>\n }\n } @else {\n <span class=\"summary-empty\">No changes</span>\n }\n </div>\n <div class=\"footer-actions\">\n <button class=\"btn btn-secondary\" (click)=\"onCancel()\" [disabled]=\"saving\">\n Cancel\n </button>\n <button\n class=\"btn btn-primary\"\n (click)=\"applyChanges()\"\n [disabled]=\"!hasChanges || saving\">\n @if (saving) {\n <span class=\"fa-solid fa-spinner fa-spin\"></span>\n }\n Apply Changes\n </button>\n </div>\n </div>\n </div>\n </div>\n}\n"]}
|
|
1
|
+
{"version":3,"file":"list-management-dialog.component.js","sourceRoot":"","sources":["../../../../src/lib/components/list-management-dialog/list-management-dialog.component.ts","../../../../src/lib/components/list-management-dialog/list-management-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnDestroy,\n ChangeDetectorRef\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { debounceTime, takeUntil } from 'rxjs/operators';\nimport { Metadata } from '@memberjunction/core';\nimport { MJListEntity, MJListCategoryEntity } from '@memberjunction/core-entities';\nimport { ListManagementService } from '../../services/list-management.service';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport {\n ListManagementDialogConfig,\n ListManagementResult,\n ListItemViewModel,\n ListFilterTab,\n ListSortOption,\n CreateListConfig,\n ListOperationDetail\n} from '../../models/list-management.models';\n\n/**\n * A gorgeous, responsive dialog for managing list membership.\n * Supports adding/removing records from multiple lists with membership indicators.\n *\n * Features:\n * - Search and filter lists\n * - Visual membership indicators (full/partial/none)\n * - Inline list creation\n * - Mobile-responsive bottom sheet on small screens\n * - Batch operations with progress feedback\n */\n@Component({\n standalone: false,\n selector: 'mj-list-management-dialog',\n templateUrl: './list-management-dialog.component.html',\n styleUrls: ['./list-management-dialog.component.css']\n})\nexport class ListManagementDialogComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n /**\n * Configuration for the dialog.\n *\n * Initialization is deliberately order-independent with {@link visible}:\n * Angular assigns inputs in template attribute order, so a host binding\n * `[visible]` before `[config]` would otherwise open the dialog while\n * `config` is still undefined — `loadData()` would bail silently and the\n * dialog would render permanently empty.\n */\n @Input()\n get config(): ListManagementDialogConfig {\n return this._config;\n }\n set config(value: ListManagementDialogConfig) {\n this._config = value;\n this.tryInitialize();\n }\n private _config!: ListManagementDialogConfig;\n\n /**\n * Controls dialog visibility\n */\n @Input()\n get visible(): boolean {\n return this._visible;\n }\n set visible(value: boolean) {\n if (value && !this._visible) {\n this._pendingInit = true;\n }\n this._visible = value;\n this.tryInitialize();\n }\n private _visible = false;\n\n /** Set on each closed→open transition; cleared once init actually runs (requires config). */\n private _pendingInit = false;\n\n /** Runs initialization once per open, as soon as BOTH visible and config are available. */\n private tryInitialize(): void {\n if (this._pendingInit && this._visible && this._config) {\n this._pendingInit = false;\n void this.initializeDialog();\n }\n }\n\n /**\n * Emitted when dialog is closed with results\n */\n @Output() complete = new EventEmitter<ListManagementResult>();\n\n /**\n * Emitted when dialog is cancelled\n */\n @Output() cancel = new EventEmitter<void>();\n\n // State\n loading = false;\n saving = false;\n searchText = '';\n activeTab: ListFilterTab = 'all';\n sortOption: ListSortOption = 'name';\n showCreateForm = false;\n\n // Data\n allLists: ListItemViewModel[] = [];\n filteredLists: ListItemViewModel[] = [];\n categories: MJListCategoryEntity[] = [];\n\n // Create form state\n newListName = '';\n newListDescription = '';\n newListCategoryId: string | null = null;\n\n // Track changes\n private originalMembership = new Map<string, boolean>();\n public addedToLists: Set<string> = new Set();\n public removedFromLists: Set<string> = new Set();\n public newlyCreatedLists: MJListEntity[] = [];\n\n // Cleanup\n private destroy$ = new Subject<void>();\n private searchSubject = new Subject<string>();\n\n constructor(\n private listService: ListManagementService,\n private cdr: ChangeDetectorRef\n ) {\n super();}\n\n ngOnInit(): void {\n this.setupSearchDebounce();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Get dialog title based on config\n */\n get dialogTitle(): string {\n if (this.config?.dialogTitle) {\n return this.config.dialogTitle;\n }\n\n const recordCount = this.config?.recordIds?.length || 0;\n const recordText = recordCount === 1 ? '1 record' : `${recordCount} records`;\n\n switch (this.config?.mode) {\n case 'add':\n return `Add ${recordText} to Lists`;\n case 'remove':\n return `Remove ${recordText} from Lists`;\n default:\n return `Manage List Membership`;\n }\n }\n\n /**\n * Get subtitle showing context\n */\n get dialogSubtitle(): string {\n const recordCount = this.config?.recordIds?.length || 0;\n const entityName = this.config?.entityName || 'records';\n\n if (recordCount === 1 && this.config?.recordDisplayNames?.[0]) {\n return `\"${this.config.recordDisplayNames[0]}\" from ${entityName}`;\n }\n\n return `${recordCount} ${entityName} record${recordCount !== 1 ? 's' : ''}`;\n }\n\n /**\n * Check if there are pending changes\n */\n get hasChanges(): boolean {\n return this.addedToLists.size > 0 || this.removedFromLists.size > 0;\n }\n\n /**\n * Get count of lists to add to\n */\n get addCount(): number {\n return this.addedToLists.size;\n }\n\n /**\n * Get count of lists to remove from\n */\n get removeCount(): number {\n return this.removedFromLists.size;\n }\n\n /**\n * Setup search with debounce\n */\n private setupSearchDebounce(): void {\n this.searchSubject.pipe(\n debounceTime(300),\n takeUntil(this.destroy$)\n ).subscribe((searchText: string) => {\n this.searchText = searchText;\n this.applyFilters();\n });\n }\n\n /**\n * Initialize dialog when opened\n */\n private async initializeDialog(): Promise<void> {\n // Per ListManagementService's multi-provider contract: thread this\n // component's Provider input into the (root-injected) service. Null is\n // fine — the service falls back to the global provider.\n this.listService.Provider = this.Provider;\n this.resetState();\n await this.loadData();\n }\n\n /**\n * Reset all state\n */\n private resetState(): void {\n this.searchText = '';\n this.activeTab = 'all';\n this.sortOption = 'name';\n this.showCreateForm = false;\n this.newListName = '';\n this.newListDescription = '';\n this.newListCategoryId = null;\n this.addedToLists.clear();\n this.removedFromLists.clear();\n this.newlyCreatedLists = [];\n this.originalMembership.clear();\n }\n\n /**\n * Load lists and membership data\n */\n private async loadData(): Promise<void> {\n if (!this.config) return;\n\n this.loading = true;\n this.cdr.detectChanges();\n\n try {\n const md = this.ProviderToUse;\n\n // Load lists and membership in parallel\n const [lists, membership, categories] = await Promise.all([\n this.listService.getListsForEntity(\n this.config.entityId,\n md.CurrentUser.ID,\n true // Force refresh\n ),\n this.listService.getRecordMembership(\n this.config.entityId,\n this.config.recordIds\n ),\n this.listService.getListCategories()\n ]);\n\n this.categories = categories;\n\n // Build view models\n this.allLists = await this.listService.buildListViewModels(\n lists,\n this.config.recordIds,\n membership\n );\n\n // Store original membership state\n for (const vm of this.allLists) {\n this.originalMembership.set(vm.list.ID, vm.isFullMember || vm.isPartialMember);\n }\n\n // Pre-select lists if configured\n if (this.config.preSelectedListIds) {\n for (const listId of this.config.preSelectedListIds) {\n const vm = this.allLists.find(l => UUIDsEqual(l.list.ID, listId));\n if (vm) {\n vm.isSelectedForAdd = true;\n this.addedToLists.add(listId);\n }\n }\n }\n\n this.applyFilters();\n } catch (error) {\n console.error('Error loading list data:', error);\n } finally {\n this.loading = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Handle search input\n */\n onSearchInput(event: Event): void {\n const value = (event.target as HTMLInputElement).value;\n this.searchSubject.next(value);\n }\n\n /**\n * Clear search\n */\n clearSearch(): void {\n this.searchText = '';\n this.searchSubject.next('');\n }\n\n /**\n * Change active tab\n */\n setActiveTab(tab: ListFilterTab): void {\n this.activeTab = tab;\n this.applyFilters();\n }\n\n /**\n * Change sort option\n */\n setSortOption(option: ListSortOption): void {\n this.sortOption = option;\n this.applyFilters();\n }\n\n /**\n * Apply all filters and sorting\n */\n private applyFilters(): void {\n let result = [...this.allLists];\n\n // Apply search filter\n if (this.searchText.trim()) {\n const search = this.searchText.toLowerCase();\n result = result.filter(vm =>\n vm.list.Name.toLowerCase().includes(search) ||\n (vm.list.Description?.toLowerCase().includes(search))\n );\n }\n\n // Apply tab filter\n switch (this.activeTab) {\n case 'my-lists':\n // Already filtered by user in loadData\n break;\n case 'recent':\n // Sort by last updated and take top 10\n result = result\n .sort((a, b) => b.lastUpdated.getTime() - a.lastUpdated.getTime())\n .slice(0, 10);\n break;\n // 'all' and 'shared' - no additional filtering for now\n }\n\n // Apply sorting\n switch (this.sortOption) {\n case 'name':\n result.sort((a, b) => a.list.Name.localeCompare(b.list.Name));\n break;\n case 'recent':\n result.sort((a, b) => b.lastUpdated.getTime() - a.lastUpdated.getTime());\n break;\n case 'item-count':\n result.sort((a, b) => b.itemCount - a.itemCount);\n break;\n }\n\n this.filteredLists = result;\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle list selection for adding\n */\n toggleListForAdd(vm: ListItemViewModel): void {\n if (this.config?.mode === 'remove') return;\n\n const listId = vm.list.ID;\n\n if (vm.isSelectedForAdd || this.addedToLists.has(listId)) {\n // Deselect\n vm.isSelectedForAdd = false;\n this.addedToLists.delete(listId);\n } else {\n // Select for add\n vm.isSelectedForAdd = true;\n vm.isSelectedForRemove = false;\n this.addedToLists.add(listId);\n this.removedFromLists.delete(listId);\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Toggle list selection for removal\n */\n toggleListForRemove(vm: ListItemViewModel): void {\n if (this.config?.mode === 'add') return;\n if (!this.config?.allowRemove && this.config?.mode !== 'manage') return;\n\n const listId = vm.list.ID;\n\n if (vm.isSelectedForRemove || this.removedFromLists.has(listId)) {\n // Deselect\n vm.isSelectedForRemove = false;\n this.removedFromLists.delete(listId);\n } else {\n // Select for remove\n vm.isSelectedForRemove = true;\n vm.isSelectedForAdd = false;\n this.removedFromLists.add(listId);\n this.addedToLists.delete(listId);\n }\n\n this.cdr.detectChanges();\n }\n\n /**\n * Get membership indicator class\n */\n getMembershipClass(vm: ListItemViewModel): string {\n if (vm.isFullMember) return 'full-member';\n if (vm.isPartialMember) return 'partial-member';\n return 'not-member';\n }\n\n /**\n * Get membership indicator text\n */\n getMembershipText(vm: ListItemViewModel): string {\n if (vm.isFullMember) {\n return `${vm.membershipCount}/${vm.totalSelectedRecords}`;\n }\n if (vm.isPartialMember) {\n return `${vm.membershipCount}/${vm.totalSelectedRecords}`;\n }\n return `0/${vm.totalSelectedRecords}`;\n }\n\n /**\n * Get membership icon\n */\n getMembershipIcon(vm: ListItemViewModel): string {\n if (vm.isFullMember) return 'fa-solid fa-check-circle';\n if (vm.isPartialMember) return 'fa-solid fa-circle-half-stroke';\n return 'fa-regular fa-circle';\n }\n\n /**\n * Show create list form\n */\n showCreateListForm(): void {\n this.showCreateForm = true;\n this.newListName = '';\n this.newListDescription = '';\n this.newListCategoryId = null;\n }\n\n /**\n * Cancel create list form\n */\n cancelCreateList(): void {\n this.showCreateForm = false;\n this.newListName = '';\n this.newListDescription = '';\n this.newListCategoryId = null;\n }\n\n /**\n * Create a new list\n */\n async createList(): Promise<void> {\n if (!this.newListName.trim() || !this.config) return;\n\n this.saving = true;\n\n try {\n const createConfig: CreateListConfig = {\n name: this.newListName.trim(),\n description: this.newListDescription.trim() || undefined,\n categoryId: this.newListCategoryId || undefined,\n entityId: this.config.entityId\n };\n\n const newList = await this.listService.createList(createConfig);\n\n if (newList) {\n this.newlyCreatedLists.push(newList);\n\n // Add to view models and select for add\n const vm: ListItemViewModel = {\n list: newList,\n itemCount: 0,\n membershipCount: 0,\n totalSelectedRecords: this.config.recordIds.length,\n isFullMember: false,\n isPartialMember: false,\n isNotMember: true,\n lastUpdated: new Date(),\n isSelectedForAdd: true,\n isSelectedForRemove: false\n };\n\n this.allLists.unshift(vm);\n this.addedToLists.add(newList.ID);\n\n this.showCreateForm = false;\n this.newListName = '';\n this.newListDescription = '';\n this.newListCategoryId = null;\n\n this.applyFilters();\n }\n } catch (error) {\n console.error('Error creating list:', error);\n } finally {\n this.saving = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Apply changes and close dialog\n */\n async applyChanges(): Promise<void> {\n if (!this.config) return;\n\n this.saving = true;\n\n const result: ListManagementResult = {\n action: 'apply',\n added: [],\n removed: [],\n newListsCreated: this.newlyCreatedLists,\n summary: { added: 0, removed: 0, skipped: 0, failed: 0 }\n };\n\n try {\n // Process additions\n if (this.addedToLists.size > 0) {\n const addResult = await this.listService.addRecordsToLists(\n [...this.addedToLists],\n this.config.recordIds,\n true // Skip duplicates\n );\n result.summary!.added += addResult.success;\n result.summary!.skipped += addResult.skipped;\n result.summary!.failed += addResult.failed;\n\n for (const listId of this.addedToLists) {\n const vm = this.allLists.find(l => UUIDsEqual(l.list.ID, listId));\n if (vm) {\n result.added.push({\n listId,\n listName: vm.list.Name,\n recordIds: this.config.recordIds\n });\n }\n }\n }\n\n // Process removals\n if (this.removedFromLists.size > 0) {\n const removeResult = await this.listService.removeRecordsFromLists(\n [...this.removedFromLists],\n this.config.recordIds\n );\n result.summary!.removed += removeResult.success;\n result.summary!.failed += removeResult.failed;\n\n for (const listId of this.removedFromLists) {\n const vm = this.allLists.find(l => UUIDsEqual(l.list.ID, listId));\n if (vm) {\n result.removed.push({\n listId,\n listName: vm.list.Name,\n recordIds: this.config.recordIds\n });\n }\n }\n }\n\n this.complete.emit(result);\n } catch (error) {\n console.error('Error applying changes:', error);\n } finally {\n this.saving = false;\n this._visible = false;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Cancel and close dialog\n */\n onCancel(): void {\n const result: ListManagementResult = {\n action: 'cancel',\n added: [],\n removed: [],\n newListsCreated: []\n };\n\n this._visible = false;\n this.cancel.emit();\n }\n\n /**\n * Format date for display\n */\n formatDate(date: Date): string {\n const now = new Date();\n const diff = now.getTime() - date.getTime();\n const minutes = Math.floor(diff / 60000);\n const hours = Math.floor(minutes / 60);\n const days = Math.floor(hours / 24);\n\n if (minutes < 1) return 'just now';\n if (minutes < 60) return `${minutes}m ago`;\n if (hours < 24) return `${hours}h ago`;\n if (days < 7) return `${days}d ago`;\n\n return date.toLocaleDateString();\n }\n\n /**\n * Check if we should show the add button for a list\n */\n showAddButton(vm: ListItemViewModel): boolean {\n if (this.config?.mode === 'remove') return false;\n return !vm.isFullMember || !this.originalMembership.get(vm.list.ID);\n }\n\n /**\n * Check if we should show the remove button for a list\n */\n showRemoveButton(vm: ListItemViewModel): boolean {\n if (this.config?.mode === 'add') return false;\n if (!this.config?.allowRemove && this.config?.mode !== 'manage') return false;\n return vm.isFullMember || vm.isPartialMember || this.originalMembership.get(vm.list.ID) === true;\n }\n}\n","@if (visible) {\n <div class=\"dialog-overlay\" (click)=\"onCancel()\">\n <div class=\"dialog-container\" (click)=\"$event.stopPropagation()\">\n <!-- Header -->\n <div class=\"dialog-header\">\n <div class=\"header-content\">\n <div class=\"header-icon\">\n <span class=\"fa-solid fa-rectangle-list\"></span>\n </div>\n <div class=\"header-text\">\n <h2 class=\"dialog-title\">{{ dialogTitle }}</h2>\n <p class=\"dialog-subtitle\">{{ dialogSubtitle }}</p>\n </div>\n </div>\n <button class=\"close-button\" (click)=\"onCancel()\" title=\"Close\">\n <span class=\"fa-solid fa-times\"></span>\n </button>\n </div>\n\n <!-- Search and Filters -->\n <div class=\"search-section\">\n <div class=\"search-bar\">\n <span class=\"fa-solid fa-search search-icon\"></span>\n <input\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search lists...\"\n [value]=\"searchText\"\n (input)=\"onSearchInput($event)\"\n />\n @if (searchText) {\n <button class=\"clear-search\" (click)=\"clearSearch()\">\n <span class=\"fa-solid fa-times-circle\"></span>\n </button>\n }\n </div>\n\n @if (config.allowCreate !== false) {\n <button class=\"create-button\" (click)=\"showCreateListForm()\" [disabled]=\"showCreateForm\">\n <span class=\"fa-solid fa-plus\"></span>\n <span class=\"button-text\">New</span>\n </button>\n }\n </div>\n\n <!-- Filter Tabs -->\n <div class=\"filter-tabs\">\n <div class=\"tabs-left\">\n <button\n class=\"tab-button\"\n [class.active]=\"activeTab === 'all'\"\n (click)=\"setActiveTab('all')\">\n All\n </button>\n <button\n class=\"tab-button\"\n [class.active]=\"activeTab === 'my-lists'\"\n (click)=\"setActiveTab('my-lists')\">\n My Lists\n </button>\n <button\n class=\"tab-button\"\n [class.active]=\"activeTab === 'recent'\"\n (click)=\"setActiveTab('recent')\">\n Recent\n </button>\n </div>\n <div class=\"tabs-right\">\n <select class=\"sort-select\" [value]=\"sortOption\" (change)=\"setSortOption($any($event.target).value)\">\n <option value=\"name\">Sort: Name</option>\n <option value=\"recent\">Sort: Recent</option>\n <option value=\"item-count\">Sort: Items</option>\n </select>\n </div>\n </div>\n\n <!-- Create List Form -->\n @if (showCreateForm) {\n <div class=\"create-form\">\n <div class=\"create-form-header\">\n <span class=\"fa-solid fa-plus-circle\"></span>\n <span>Create New List</span>\n </div>\n <div class=\"create-form-body\">\n <div class=\"form-group\">\n <input\n type=\"text\"\n class=\"form-input\"\n placeholder=\"List name *\"\n [(ngModel)]=\"newListName\"\n [disabled]=\"saving\"\n (keyup.enter)=\"createList()\"\n />\n </div>\n <div class=\"form-group\">\n <textarea\n class=\"form-input form-textarea\"\n placeholder=\"Description (optional)\"\n [(ngModel)]=\"newListDescription\"\n [disabled]=\"saving\"\n rows=\"2\">\n </textarea>\n </div>\n @if (categories.length > 0) {\n <div class=\"form-group\">\n <select class=\"form-input\" [(ngModel)]=\"newListCategoryId\" [disabled]=\"saving\">\n <option [ngValue]=\"null\">No category</option>\n @for (category of categories; track category.ID) {\n <option [ngValue]=\"category.ID\">{{ category.Name }}</option>\n }\n </select>\n </div>\n }\n <div class=\"create-form-actions\">\n <button\n class=\"btn btn-primary\"\n (click)=\"createList()\"\n [disabled]=\"!newListName.trim() || saving\">\n @if (saving) {\n <span class=\"fa-solid fa-spinner fa-spin\"></span>\n }\n Create List\n </button>\n <button class=\"btn btn-secondary\" (click)=\"cancelCreateList()\" [disabled]=\"saving\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n }\n\n <!-- List Content -->\n <div class=\"list-content\">\n @if (loading) {\n <div class=\"loading-state\">\n <mj-loading text=\"Loading lists...\" size=\"medium\"></mj-loading>\n </div>\n } @else if (filteredLists.length === 0) {\n @if (searchText) {\n <mj-empty-state\n Variant=\"no-results\"\n Icon=\"fa-solid fa-magnifying-glass\"\n Title=\"No lists found\"\n Message=\"Try a different search term\" />\n } @else {\n <mj-empty-state\n Icon=\"fa-solid fa-rectangle-list\"\n Title=\"No lists yet\"\n Message=\"Create your first list to get started\"\n [ActionText]=\"config.allowCreate !== false ? 'Create List' : ''\"\n ActionIcon=\"fa-solid fa-plus\"\n (Action)=\"showCreateListForm()\" />\n }\n } @else {\n <div class=\"list-items\">\n @for (vm of filteredLists; track vm.list.ID) {\n <div\n class=\"list-item\"\n [class.selected-add]=\"vm.isSelectedForAdd || addedToLists.has(vm.list.ID)\"\n [class.selected-remove]=\"vm.isSelectedForRemove || removedFromLists.has(vm.list.ID)\"\n [class.is-member]=\"vm.isFullMember || vm.isPartialMember\">\n\n <!-- Checkbox / Selection Area -->\n <div class=\"list-item-select\">\n @if (showAddButton(vm)) {\n <button\n class=\"select-btn add-btn\"\n [class.selected]=\"vm.isSelectedForAdd || addedToLists.has(vm.list.ID)\"\n (click)=\"toggleListForAdd(vm)\"\n [title]=\"(vm.isSelectedForAdd || addedToLists.has(vm.list.ID)) ? 'Remove from selection' : 'Add to this list'\">\n @if (vm.isSelectedForAdd || addedToLists.has(vm.list.ID)) {\n <span class=\"fa-solid fa-check\"></span>\n } @else {\n <span class=\"fa-solid fa-plus\"></span>\n }\n </button>\n }\n @if (showRemoveButton(vm) && (vm.isFullMember || vm.isPartialMember)) {\n <button\n class=\"select-btn remove-btn\"\n [class.selected]=\"vm.isSelectedForRemove || removedFromLists.has(vm.list.ID)\"\n (click)=\"toggleListForRemove(vm)\"\n [title]=\"(vm.isSelectedForRemove || removedFromLists.has(vm.list.ID)) ? 'Cancel removal' : 'Remove from this list'\">\n @if (vm.isSelectedForRemove || removedFromLists.has(vm.list.ID)) {\n <span class=\"fa-solid fa-undo\"></span>\n } @else {\n <span class=\"fa-solid fa-minus\"></span>\n }\n </button>\n }\n </div>\n\n <!-- List Info -->\n <div class=\"list-item-content\">\n <div class=\"list-item-header\">\n <span class=\"fa-solid fa-folder list-icon\"></span>\n <span class=\"list-name\">{{ vm.list.Name }}</span>\n @if (newlyCreatedLists.includes(vm.list)) {\n <span class=\"badge badge-new\">New</span>\n }\n </div>\n <div class=\"list-item-meta\">\n @if (vm.list.Description) {\n <span class=\"list-description\">{{ vm.list.Description }}</span>\n <span class=\"meta-separator\">•</span>\n }\n <span class=\"list-count\">{{ vm.itemCount }} item{{ vm.itemCount !== 1 ? 's' : '' }}</span>\n <span class=\"meta-separator\">•</span>\n <span class=\"list-updated\">{{ formatDate(vm.lastUpdated) }}</span>\n </div>\n </div>\n\n <!-- Membership Indicator -->\n @if (config.showMembership !== false) {\n <div class=\"membership-indicator\" [class]=\"getMembershipClass(vm)\">\n <span [class]=\"getMembershipIcon(vm)\"></span>\n <span class=\"membership-text\">{{ getMembershipText(vm) }}</span>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Footer -->\n <div class=\"dialog-footer\">\n <div class=\"footer-summary\">\n @if (hasChanges) {\n @if (addCount > 0) {\n <span class=\"summary-item add\">\n <span class=\"fa-solid fa-plus-circle\"></span>\n {{ addCount }} list{{ addCount !== 1 ? 's' : '' }}\n </span>\n }\n @if (removeCount > 0) {\n <span class=\"summary-item remove\">\n <span class=\"fa-solid fa-minus-circle\"></span>\n {{ removeCount }} list{{ removeCount !== 1 ? 's' : '' }}\n </span>\n }\n } @else {\n <span class=\"summary-empty\">No changes</span>\n }\n </div>\n <div class=\"footer-actions\">\n <button class=\"btn btn-secondary\" (click)=\"onCancel()\" [disabled]=\"saving\">\n Cancel\n </button>\n <button\n class=\"btn btn-primary\"\n (click)=\"applyChanges()\"\n [disabled]=\"!hasChanges || saving\">\n @if (saving) {\n <span class=\"fa-solid fa-spinner fa-spin\"></span>\n }\n Apply Changes\n </button>\n </div>\n </div>\n </div>\n </div>\n}\n"]}
|
|
@@ -683,7 +683,7 @@ export class ListShareDialogComponent extends BaseAngularComponent {
|
|
|
683
683
|
i0.ɵɵconditionalCreate(0, ListShareDialogComponent_Conditional_0_Template, 16, 6, "mj-dialog", 1);
|
|
684
684
|
} if (rf & 2) {
|
|
685
685
|
i0.ɵɵconditional(ctx.visible ? 0 : -1);
|
|
686
|
-
} }, dependencies: [i2.CheckboxControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.MJButtonDirective, i3.MJDialogComponent, i3.MJDialogActionsComponent, i3.MJDropdownComponent, i3.MJEmptyStateComponent, i4.LoadingComponent], styles: [".share-dialog-content[_ngcontent-%COMP%] {\n padding: 0;\n min-height: 200px;\n}\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 200px;\n}\n\n\n
|
|
686
|
+
} }, dependencies: [i2.CheckboxControlValueAccessor, i2.NgControlStatus, i2.NgModel, i3.MJButtonDirective, i3.MJDialogComponent, i3.MJDialogActionsComponent, i3.MJDropdownComponent, i3.MJEmptyStateComponent, i4.LoadingComponent], styles: [".share-dialog-content[_ngcontent-%COMP%] {\n padding: 0;\n min-height: 200px;\n}\n\n.loading-container[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 200px;\n}\n\n\n.section-title[_ngcontent-%COMP%] {\n margin: 0 0 12px 0;\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.section-divider[_ngcontent-%COMP%] {\n margin: 16px 0;\n border: none;\n border-top: 1px solid var(--mj-border-default);\n}\n\n\n.add-share-section[_ngcontent-%COMP%] {\n margin-bottom: 16px;\n}\n\n.search-type-toggle[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n.search-type-toggle[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n flex: 1;\n}\n\n.search-type-toggle[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 6px;\n}\n\n\n.search-container[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.search-input-wrapper[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n}\n\n.search-input-wrapper[_ngcontent-%COMP%] .search-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 12px;\n color: var(--mj-text-muted);\n pointer-events: none;\n z-index: 1;\n}\n\n.search-input-wrapper[_ngcontent-%COMP%] .mj-input[_ngcontent-%COMP%] {\n padding-left: 36px;\n}\n\n.search-results[_ngcontent-%COMP%] {\n position: absolute;\n top: 100%;\n left: 0;\n right: 0;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 4px;\n box-shadow: var(--mj-shadow-md);\n max-height: 200px;\n overflow-y: auto;\n z-index: 1000;\n}\n\n.search-result-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 12px;\n cursor: pointer;\n transition: background-color 0.15s;\n}\n\n.search-result-item[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-sunken);\n}\n\n.search-result-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n width: 20px;\n text-align: center;\n}\n\n.recipient-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.recipient-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.recipient-email[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n\n.selected-recipient[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-top: 12px;\n padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n}\n\n.recipient-chip[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 12px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 20px;\n flex: 1;\n}\n\n.recipient-chip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.recipient-chip[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 500;\n}\n\n.permission-dropdown[_ngcontent-%COMP%] {\n width: 150px;\n}\n\n\n.permission-option[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n padding: 4px 0;\n}\n\n.permission-label[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n.permission-desc[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-secondary);\n}\n\n\n.current-shares-section[_ngcontent-%COMP%] {\n margin-top: 16px;\n}\n\n.share-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.share-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n transition: background-color 0.15s;\n}\n\n.share-item[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.share-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n flex: 1;\n}\n\n.share-type-icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 50%;\n}\n\n.share-details[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.share-name[_ngcontent-%COMP%] {\n font-weight: 500;\n color: var(--mj-text-primary);\n}\n\n.share-email[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n}\n\n.share-type-label[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-secondary);\n background: var(--mj-border-default);\n padding: 2px 6px;\n border-radius: 3px;\n display: inline-block;\n width: fit-content;\n}\n\n.share-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.permission-dropdown-small[_ngcontent-%COMP%] {\n width: 110px;\n}\n\n.permission-badge[_ngcontent-%COMP%] {\n padding: 4px 10px;\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-radius: 4px;\n font-size: 12px;\n font-weight: 500;\n}\n\n\n.readonly-notice[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px;\n background: color-mix(in srgb, var(--mj-status-warning) 15%, var(--mj-bg-surface));\n border-radius: 6px;\n margin-top: 16px;\n color: var(--mj-status-warning);\n font-size: 13px;\n}\n\n.readonly-notice[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n\n.notify-toggle[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border-top: 1px solid var(--mj-border-subtle);\n font-size: 12.5px;\n color: var(--mj-text-secondary);\n}\n\n.notify-toggle[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n cursor: pointer;\n}\n\n.notify-toggle[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n\n\n.audit-log-link[_ngcontent-%COMP%] {\n margin-left: auto;\n font-size: 12px;\n color: var(--mj-text-link);\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n cursor: pointer;\n}\n\n.audit-log-link[_ngcontent-%COMP%]:hover {\n text-decoration: underline;\n}"] });
|
|
687
687
|
}
|
|
688
688
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ListShareDialogComponent, [{
|
|
689
689
|
type: Component,
|
|
@@ -372,7 +372,7 @@ export class TagChipsComponent extends BaseAngularComponent {
|
|
|
372
372
|
i0.ɵɵconditional(ctx.extraTagCount > 0 ? 3 : -1);
|
|
373
373
|
i0.ɵɵadvance();
|
|
374
374
|
i0.ɵɵconditional(ctx.Editable ? 4 : -1);
|
|
375
|
-
} }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel], styles: [".tag-chips[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n align-items: center;\n}\n\n.tag-chips--loading[_ngcontent-%COMP%] {\n opacity: 0.6;\n}\n\n.tag-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 2px 8px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-border-default));\n font-size: 11px;\n cursor: pointer;\n user-select: none;\n transition: background 0.12s ease;\n}\n\n.tag-chip[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 18%, var(--mj-bg-surface));\n}\n\n.tag-chip__name[_ngcontent-%COMP%] {\n white-space: nowrap;\n}\n\n.tag-chip__remove[_ngcontent-%COMP%] {\n cursor: pointer;\n margin-left: 2px;\n opacity: 0.6;\n font-size: 10px;\n}\n\n.tag-chip__remove[_ngcontent-%COMP%]:hover {\n opacity: 1;\n color: var(--mj-status-error);\n}\n\n.tag-chip--more[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n border-color: var(--mj-border-default);\n}\n\n.tag-chip-add[_ngcontent-%COMP%] {\n position: relative;\n display: inline-block;\n}\n\n.tag-chip-add__input[_ngcontent-%COMP%] {\n padding: 3px 8px;\n border: 1px dashed var(--mj-border-default);\n border-radius: 999px;\n background: transparent;\n font-size: 11px;\n width: 110px;\n color: var(--mj-text-primary);\n}\n\n.tag-chip-add__input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-style: solid;\n border-color: var(--mj-brand-primary);\n}\n\n.tag-chip-add__suggestions[_ngcontent-%COMP%] {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 50;\n margin-top: 2px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n box-shadow: var(--mj-shadow-md);\n min-width: 180px;\n max-height: 200px;\n overflow-y: auto;\n}\n\n.tag-chip-add__suggestion[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n width: 100%;\n text-align: left;\n background: none;\n border: none;\n padding: 6px 10px;\n font-size: 12px;\n color: var(--mj-text-primary);\n cursor: pointer;\n}\n\n.tag-chip-add__suggestion[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n\n
|
|
375
|
+
} }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel], styles: [".tag-chips[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n align-items: center;\n}\n\n.tag-chips--loading[_ngcontent-%COMP%] {\n opacity: 0.6;\n}\n\n.tag-chip[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 2px 8px;\n border-radius: 999px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 25%, var(--mj-border-default));\n font-size: 11px;\n cursor: pointer;\n user-select: none;\n transition: background 0.12s ease;\n}\n\n.tag-chip[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 18%, var(--mj-bg-surface));\n}\n\n.tag-chip__name[_ngcontent-%COMP%] {\n white-space: nowrap;\n}\n\n.tag-chip__remove[_ngcontent-%COMP%] {\n cursor: pointer;\n margin-left: 2px;\n opacity: 0.6;\n font-size: 10px;\n}\n\n.tag-chip__remove[_ngcontent-%COMP%]:hover {\n opacity: 1;\n color: var(--mj-status-error);\n}\n\n.tag-chip--more[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n border-color: var(--mj-border-default);\n}\n\n.tag-chip-add[_ngcontent-%COMP%] {\n position: relative;\n display: inline-block;\n}\n\n.tag-chip-add__input[_ngcontent-%COMP%] {\n padding: 3px 8px;\n border: 1px dashed var(--mj-border-default);\n border-radius: 999px;\n background: transparent;\n font-size: 11px;\n width: 110px;\n color: var(--mj-text-primary);\n}\n\n.tag-chip-add__input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-style: solid;\n border-color: var(--mj-brand-primary);\n}\n\n.tag-chip-add__suggestions[_ngcontent-%COMP%] {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 50;\n margin-top: 2px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n box-shadow: var(--mj-shadow-md);\n min-width: 180px;\n max-height: 200px;\n overflow-y: auto;\n}\n\n.tag-chip-add__suggestion[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n width: 100%;\n text-align: left;\n background: none;\n border: none;\n padding: 6px 10px;\n font-size: 12px;\n color: var(--mj-text-primary);\n cursor: pointer;\n}\n\n.tag-chip-add__suggestion[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n}\n\n\n.tag-chip-add__suggestion--create[_ngcontent-%COMP%] {\n border-top: 1px solid var(--mj-border-default);\n color: var(--mj-brand-primary);\n font-weight: 500;\n}\n.tag-chip-add__suggestion--create[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n}"], changeDetection: 0 });
|
|
376
376
|
}
|
|
377
377
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TagChipsComponent, [{
|
|
378
378
|
type: Component,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-list-management",
|
|
3
|
-
"version": "6.1.0-edge.
|
|
3
|
+
"version": "6.1.0-edge.7",
|
|
4
4
|
"description": "MemberJunction: Angular Components for managing entity list membership with beautiful, responsive UI",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
@@ -16,27 +16,27 @@
|
|
|
16
16
|
"author": "",
|
|
17
17
|
"license": "BUSL-1.1",
|
|
18
18
|
"devDependencies": {
|
|
19
|
-
"@angular/compiler": "21.
|
|
20
|
-
"@angular/compiler-cli": "21.
|
|
21
|
-
"@memberjunction/ng-test-utils": "6.1.0-edge.
|
|
19
|
+
"@angular/compiler": "21.2.22",
|
|
20
|
+
"@angular/compiler-cli": "21.2.22",
|
|
21
|
+
"@memberjunction/ng-test-utils": "6.1.0-edge.7",
|
|
22
22
|
"vitest": "^4.0.18"
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
25
|
-
"@angular/common": "^21.
|
|
26
|
-
"@angular/core": "^21.
|
|
27
|
-
"@angular/forms": "^21.
|
|
25
|
+
"@angular/common": "^21.2.22",
|
|
26
|
+
"@angular/core": "^21.2.22",
|
|
27
|
+
"@angular/forms": "^21.2.22",
|
|
28
28
|
"rxjs": "^7.8.2"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@memberjunction/core": "6.1.0-edge.
|
|
32
|
-
"@memberjunction/core-entities": "6.1.0-edge.
|
|
33
|
-
"@memberjunction/global": "6.1.0-edge.
|
|
34
|
-
"@memberjunction/graphql-dataprovider": "6.1.0-edge.
|
|
35
|
-
"@memberjunction/lists-base": "6.1.0-edge.
|
|
36
|
-
"@memberjunction/ng-base-types": "6.1.0-edge.
|
|
37
|
-
"@memberjunction/ng-container-directives": "6.1.0-edge.
|
|
38
|
-
"@memberjunction/ng-shared-generic": "6.1.0-edge.
|
|
39
|
-
"@memberjunction/ng-ui-components": "6.1.0-edge.
|
|
31
|
+
"@memberjunction/core": "6.1.0-edge.7",
|
|
32
|
+
"@memberjunction/core-entities": "6.1.0-edge.7",
|
|
33
|
+
"@memberjunction/global": "6.1.0-edge.7",
|
|
34
|
+
"@memberjunction/graphql-dataprovider": "6.1.0-edge.7",
|
|
35
|
+
"@memberjunction/lists-base": "6.1.0-edge.7",
|
|
36
|
+
"@memberjunction/ng-base-types": "6.1.0-edge.7",
|
|
37
|
+
"@memberjunction/ng-container-directives": "6.1.0-edge.7",
|
|
38
|
+
"@memberjunction/ng-shared-generic": "6.1.0-edge.7",
|
|
39
|
+
"@memberjunction/ng-ui-components": "6.1.0-edge.7",
|
|
40
40
|
"tslib": "^2.8.1"
|
|
41
41
|
},
|
|
42
42
|
"sideEffects": false,
|