@memberjunction/ng-list-management 6.1.4 → 6.2.0-edge.1
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/audience-source-picker/audience-source-picker.component.d.ts +74 -14
- package/dist/lib/components/audience-source-picker/audience-source-picker.component.d.ts.map +1 -1
- package/dist/lib/components/audience-source-picker/audience-source-picker.component.js +177 -57
- package/dist/lib/components/audience-source-picker/audience-source-picker.component.js.map +1 -1
- package/dist/lib/components/audience-source-summary/audience-source-summary.component.d.ts +7 -1
- package/dist/lib/components/audience-source-summary/audience-source-summary.component.d.ts.map +1 -1
- package/dist/lib/components/audience-source-summary/audience-source-summary.component.js +17 -5
- package/dist/lib/components/audience-source-summary/audience-source-summary.component.js.map +1 -1
- package/dist/lib/components/list-audit-log/list-audit-log.component.d.ts +30 -4
- package/dist/lib/components/list-audit-log/list-audit-log.component.d.ts.map +1 -1
- package/dist/lib/components/list-audit-log/list-audit-log.component.js +54 -14
- package/dist/lib/components/list-audit-log/list-audit-log.component.js.map +1 -1
- package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.d.ts +17 -1
- package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.d.ts.map +1 -1
- package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.js +45 -13
- package/dist/lib/components/list-delta-confirm/list-delta-confirm.component.js.map +1 -1
- package/dist/lib/components/list-invitations/list-invitations.component.d.ts +48 -8
- package/dist/lib/components/list-invitations/list-invitations.component.d.ts.map +1 -1
- package/dist/lib/components/list-invitations/list-invitations.component.js +108 -28
- package/dist/lib/components/list-invitations/list-invitations.component.js.map +1 -1
- package/dist/lib/components/list-management-dialog/list-management-dialog.component.d.ts +123 -15
- package/dist/lib/components/list-management-dialog/list-management-dialog.component.d.ts.map +1 -1
- package/dist/lib/components/list-management-dialog/list-management-dialog.component.js +312 -100
- 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.d.ts +128 -14
- package/dist/lib/components/list-share-dialog/list-share-dialog.component.d.ts.map +1 -1
- package/dist/lib/components/list-share-dialog/list-share-dialog.component.js +288 -92
- package/dist/lib/components/list-share-dialog/list-share-dialog.component.js.map +1 -1
- package/dist/lib/components/list-stats/list-stats.component.d.ts +32 -6
- package/dist/lib/components/list-stats/list-stats.component.d.ts.map +1 -1
- package/dist/lib/components/list-stats/list-stats.component.js +67 -15
- package/dist/lib/components/list-stats/list-stats.component.js.map +1 -1
- package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.d.ts +44 -8
- package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.d.ts.map +1 -1
- package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.js +100 -28
- package/dist/lib/components/save-view-as-list-dialog/save-view-as-list-dialog.component.js.map +1 -1
- package/dist/lib/components/shared-with-me/shared-with-me.component.d.ts +18 -2
- package/dist/lib/components/shared-with-me/shared-with-me.component.d.ts.map +1 -1
- package/dist/lib/components/shared-with-me/shared-with-me.component.js +41 -9
- package/dist/lib/components/shared-with-me/shared-with-me.component.js.map +1 -1
- package/dist/lib/components/tag-chips/tag-chips.component.d.ts +30 -6
- package/dist/lib/components/tag-chips/tag-chips.component.d.ts.map +1 -1
- package/dist/lib/components/tag-chips/tag-chips.component.js +76 -28
- package/dist/lib/components/tag-chips/tag-chips.component.js.map +1 -1
- package/dist/lib/services/list-management.service.d.ts +25 -1
- package/dist/lib/services/list-management.service.d.ts.map +1 -1
- package/dist/lib/services/list-management.service.js +59 -11
- package/dist/lib/services/list-management.service.js.map +1 -1
- package/dist/lib/services/list-sharing.service.d.ts +42 -1
- package/dist/lib/services/list-sharing.service.d.ts.map +1 -1
- package/dist/lib/services/list-sharing.service.js +85 -17
- package/dist/lib/services/list-sharing.service.js.map +1 -1
- package/package.json +11 -11
|
@@ -32,21 +32,79 @@ export declare class AudienceSourcePickerComponent extends BaseAngularComponent
|
|
|
32
32
|
/** When set, restrict the entity dropdown to this entity (lock it). */
|
|
33
33
|
LockedEntityName: string | null;
|
|
34
34
|
SourceChange: EventEmitter<import("@memberjunction/lists-base").ListSource | null>;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
35
|
+
ActiveTab: AudienceSourcePickerTab;
|
|
36
|
+
/** @deprecated Use {@link ActiveTab}. */
|
|
37
|
+
get activeTab(): AudienceSourcePickerTab;
|
|
38
|
+
/** @deprecated Use {@link ActiveTab}. */
|
|
39
|
+
set activeTab(value: AudienceSourcePickerTab);
|
|
40
|
+
EntityOptions: EntityInfo[];
|
|
41
|
+
/** @deprecated Use {@link EntityOptions}. */
|
|
42
|
+
get entityOptions(): EntityInfo[];
|
|
43
|
+
/** @deprecated Use {@link EntityOptions}. */
|
|
44
|
+
set entityOptions(value: EntityInfo[]);
|
|
45
|
+
SelectedEntityName: string | null;
|
|
46
|
+
/** @deprecated Use {@link SelectedEntityName}. */
|
|
47
|
+
get selectedEntityName(): string | null;
|
|
48
|
+
/** @deprecated Use {@link SelectedEntityName}. */
|
|
49
|
+
set selectedEntityName(value: string | null);
|
|
50
|
+
AvailableLists: MJListEntity[];
|
|
51
|
+
/** @deprecated Use {@link AvailableLists}. */
|
|
52
|
+
get availableLists(): MJListEntity[];
|
|
53
|
+
/** @deprecated Use {@link AvailableLists}. */
|
|
54
|
+
set availableLists(value: MJListEntity[]);
|
|
55
|
+
FilteredLists: MJListEntity[];
|
|
56
|
+
/** @deprecated Use {@link FilteredLists}. */
|
|
57
|
+
get filteredLists(): MJListEntity[];
|
|
58
|
+
/** @deprecated Use {@link FilteredLists}. */
|
|
59
|
+
set filteredLists(value: MJListEntity[]);
|
|
60
|
+
ListSearch: string;
|
|
61
|
+
/** @deprecated Use {@link ListSearch}. */
|
|
62
|
+
get listSearch(): string;
|
|
63
|
+
/** @deprecated Use {@link ListSearch}. */
|
|
64
|
+
set listSearch(value: string);
|
|
65
|
+
SelectedListId: string | null;
|
|
66
|
+
/** @deprecated Use {@link SelectedListId}. */
|
|
67
|
+
get selectedListId(): string | null;
|
|
68
|
+
/** @deprecated Use {@link SelectedListId}. */
|
|
69
|
+
set selectedListId(value: string | null);
|
|
70
|
+
AvailableViews: MJUserViewEntity[];
|
|
71
|
+
/** @deprecated Use {@link AvailableViews}. */
|
|
72
|
+
get availableViews(): MJUserViewEntity[];
|
|
73
|
+
/** @deprecated Use {@link AvailableViews}. */
|
|
74
|
+
set availableViews(value: MJUserViewEntity[]);
|
|
75
|
+
FilteredViews: MJUserViewEntity[];
|
|
76
|
+
/** @deprecated Use {@link FilteredViews}. */
|
|
77
|
+
get filteredViews(): MJUserViewEntity[];
|
|
78
|
+
/** @deprecated Use {@link FilteredViews}. */
|
|
79
|
+
set filteredViews(value: MJUserViewEntity[]);
|
|
80
|
+
ViewSearch: string;
|
|
81
|
+
/** @deprecated Use {@link ViewSearch}. */
|
|
82
|
+
get viewSearch(): string;
|
|
83
|
+
/** @deprecated Use {@link ViewSearch}. */
|
|
84
|
+
set viewSearch(value: string);
|
|
85
|
+
SelectedViewId: string | null;
|
|
86
|
+
/** @deprecated Use {@link SelectedViewId}. */
|
|
87
|
+
get selectedViewId(): string | null;
|
|
88
|
+
/** @deprecated Use {@link SelectedViewId}. */
|
|
89
|
+
set selectedViewId(value: string | null);
|
|
90
|
+
AdhocEntityName: string | null;
|
|
91
|
+
/** @deprecated Use {@link AdhocEntityName}. */
|
|
92
|
+
get adhocEntityName(): string | null;
|
|
93
|
+
/** @deprecated Use {@link AdhocEntityName}. */
|
|
94
|
+
set adhocEntityName(value: string | null);
|
|
95
|
+
AdhocFilter: string;
|
|
96
|
+
/** @deprecated Use {@link AdhocFilter}. */
|
|
97
|
+
get adhocFilter(): string;
|
|
98
|
+
/** @deprecated Use {@link AdhocFilter}. */
|
|
99
|
+
set adhocFilter(value: string);
|
|
100
|
+
Loading: boolean;
|
|
101
|
+
/** @deprecated Use {@link Loading}. */
|
|
102
|
+
get loading(): boolean;
|
|
103
|
+
/** @deprecated Use {@link Loading}. */
|
|
104
|
+
set loading(value: boolean);
|
|
49
105
|
ngOnInit(): Promise<void>;
|
|
106
|
+
SetTab(tab: AudienceSourcePickerTab): Promise<void>;
|
|
107
|
+
/** @deprecated Use {@link SetTab}. */
|
|
50
108
|
setTab(tab: AudienceSourcePickerTab): Promise<void>;
|
|
51
109
|
OnEntityChange(name: string): Promise<void>;
|
|
52
110
|
OnListSearchChange(): void;
|
|
@@ -58,6 +116,8 @@ export declare class AudienceSourcePickerComponent extends BaseAngularComponent
|
|
|
58
116
|
* Build the currently-selected `AudienceSource` from picker state, or
|
|
59
117
|
* `null` if the picker isn't yet in a complete state.
|
|
60
118
|
*/
|
|
119
|
+
get CurrentSource(): AudienceSource | null;
|
|
120
|
+
/** @deprecated Use {@link CurrentSource}. */
|
|
61
121
|
get currentSource(): AudienceSource | null;
|
|
62
122
|
private emitCurrentSource;
|
|
63
123
|
/**
|
package/dist/lib/components/audience-source-picker/audience-source-picker.component.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audience-source-picker.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/audience-source-picker/audience-source-picker.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyD,YAAY,EAAS,MAAM,EAAkB,MAAM,eAAe,CAAC;AAEnI,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAW,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACpF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;;AAEjE;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEhE,qBAOa,6BAA8B,SAAQ,oBAAqB,YAAW,MAAM;IACvF,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAEjD;;;OAGG;IACH,IACI,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,EActC;IACD,IAAI,MAAM,IAAI,cAAc,GAAG,IAAI,CAElC;IACD,OAAO,CAAC,OAAO,CAA+B;IAE9C,uEAAuE;IAC9D,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEtC,YAAY,uEAA6C;IAE5D,SAAS,EAAE,uBAAuB,CAAU;
|
|
1
|
+
{"version":3,"file":"audience-source-picker.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/audience-source-picker/audience-source-picker.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -179,16 +179,16 @@ export class AudienceSourcePickerComponent extends BaseAngularComponent {
|
|
|
179
179
|
this._source = value;
|
|
180
180
|
if (value) {
|
|
181
181
|
// Pick the right tab + restore the saved field values.
|
|
182
|
-
this.
|
|
182
|
+
this.ActiveTab = value.kind;
|
|
183
183
|
if (value.kind === 'list') {
|
|
184
|
-
this.
|
|
184
|
+
this.SelectedListId = value.listId;
|
|
185
185
|
}
|
|
186
186
|
else if (value.kind === 'view') {
|
|
187
|
-
this.
|
|
187
|
+
this.SelectedViewId = value.viewId;
|
|
188
188
|
}
|
|
189
189
|
else {
|
|
190
|
-
this.
|
|
191
|
-
this.
|
|
190
|
+
this.AdhocEntityName = value.entityName;
|
|
191
|
+
this.AdhocFilter = value.extraFilter;
|
|
192
192
|
}
|
|
193
193
|
}
|
|
194
194
|
}
|
|
@@ -199,48 +199,164 @@ export class AudienceSourcePickerComponent extends BaseAngularComponent {
|
|
|
199
199
|
/** When set, restrict the entity dropdown to this entity (lock it). */
|
|
200
200
|
LockedEntityName = null;
|
|
201
201
|
SourceChange = new EventEmitter();
|
|
202
|
-
|
|
203
|
-
|
|
202
|
+
ActiveTab = 'list';
|
|
203
|
+
/** @deprecated Use {@link ActiveTab}. */
|
|
204
|
+
get activeTab() {
|
|
205
|
+
return this.ActiveTab;
|
|
206
|
+
}
|
|
207
|
+
/** @deprecated Use {@link ActiveTab}. */
|
|
208
|
+
set activeTab(value) {
|
|
209
|
+
this.ActiveTab = value;
|
|
210
|
+
}
|
|
211
|
+
EntityOptions = [];
|
|
212
|
+
/** @deprecated Use {@link EntityOptions}. */
|
|
213
|
+
get entityOptions() {
|
|
214
|
+
return this.EntityOptions;
|
|
215
|
+
}
|
|
216
|
+
/** @deprecated Use {@link EntityOptions}. */
|
|
217
|
+
set entityOptions(value) {
|
|
218
|
+
this.EntityOptions = value;
|
|
219
|
+
}
|
|
204
220
|
// List-tab state
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
221
|
+
SelectedEntityName = null;
|
|
222
|
+
/** @deprecated Use {@link SelectedEntityName}. */
|
|
223
|
+
get selectedEntityName() {
|
|
224
|
+
return this.SelectedEntityName;
|
|
225
|
+
}
|
|
226
|
+
/** @deprecated Use {@link SelectedEntityName}. */
|
|
227
|
+
set selectedEntityName(value) {
|
|
228
|
+
this.SelectedEntityName = value;
|
|
229
|
+
}
|
|
230
|
+
AvailableLists = [];
|
|
231
|
+
/** @deprecated Use {@link AvailableLists}. */
|
|
232
|
+
get availableLists() {
|
|
233
|
+
return this.AvailableLists;
|
|
234
|
+
}
|
|
235
|
+
/** @deprecated Use {@link AvailableLists}. */
|
|
236
|
+
set availableLists(value) {
|
|
237
|
+
this.AvailableLists = value;
|
|
238
|
+
}
|
|
239
|
+
FilteredLists = [];
|
|
240
|
+
/** @deprecated Use {@link FilteredLists}. */
|
|
241
|
+
get filteredLists() {
|
|
242
|
+
return this.FilteredLists;
|
|
243
|
+
}
|
|
244
|
+
/** @deprecated Use {@link FilteredLists}. */
|
|
245
|
+
set filteredLists(value) {
|
|
246
|
+
this.FilteredLists = value;
|
|
247
|
+
}
|
|
248
|
+
ListSearch = '';
|
|
249
|
+
/** @deprecated Use {@link ListSearch}. */
|
|
250
|
+
get listSearch() {
|
|
251
|
+
return this.ListSearch;
|
|
252
|
+
}
|
|
253
|
+
/** @deprecated Use {@link ListSearch}. */
|
|
254
|
+
set listSearch(value) {
|
|
255
|
+
this.ListSearch = value;
|
|
256
|
+
}
|
|
257
|
+
SelectedListId = null;
|
|
258
|
+
/** @deprecated Use {@link SelectedListId}. */
|
|
259
|
+
get selectedListId() {
|
|
260
|
+
return this.SelectedListId;
|
|
261
|
+
}
|
|
262
|
+
/** @deprecated Use {@link SelectedListId}. */
|
|
263
|
+
set selectedListId(value) {
|
|
264
|
+
this.SelectedListId = value;
|
|
265
|
+
}
|
|
210
266
|
// View-tab state
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
267
|
+
AvailableViews = [];
|
|
268
|
+
/** @deprecated Use {@link AvailableViews}. */
|
|
269
|
+
get availableViews() {
|
|
270
|
+
return this.AvailableViews;
|
|
271
|
+
}
|
|
272
|
+
/** @deprecated Use {@link AvailableViews}. */
|
|
273
|
+
set availableViews(value) {
|
|
274
|
+
this.AvailableViews = value;
|
|
275
|
+
}
|
|
276
|
+
FilteredViews = [];
|
|
277
|
+
/** @deprecated Use {@link FilteredViews}. */
|
|
278
|
+
get filteredViews() {
|
|
279
|
+
return this.FilteredViews;
|
|
280
|
+
}
|
|
281
|
+
/** @deprecated Use {@link FilteredViews}. */
|
|
282
|
+
set filteredViews(value) {
|
|
283
|
+
this.FilteredViews = value;
|
|
284
|
+
}
|
|
285
|
+
ViewSearch = '';
|
|
286
|
+
/** @deprecated Use {@link ViewSearch}. */
|
|
287
|
+
get viewSearch() {
|
|
288
|
+
return this.ViewSearch;
|
|
289
|
+
}
|
|
290
|
+
/** @deprecated Use {@link ViewSearch}. */
|
|
291
|
+
set viewSearch(value) {
|
|
292
|
+
this.ViewSearch = value;
|
|
293
|
+
}
|
|
294
|
+
SelectedViewId = null;
|
|
295
|
+
/** @deprecated Use {@link SelectedViewId}. */
|
|
296
|
+
get selectedViewId() {
|
|
297
|
+
return this.SelectedViewId;
|
|
298
|
+
}
|
|
299
|
+
/** @deprecated Use {@link SelectedViewId}. */
|
|
300
|
+
set selectedViewId(value) {
|
|
301
|
+
this.SelectedViewId = value;
|
|
302
|
+
}
|
|
215
303
|
// Adhoc-tab state
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
304
|
+
AdhocEntityName = null;
|
|
305
|
+
/** @deprecated Use {@link AdhocEntityName}. */
|
|
306
|
+
get adhocEntityName() {
|
|
307
|
+
return this.AdhocEntityName;
|
|
308
|
+
}
|
|
309
|
+
/** @deprecated Use {@link AdhocEntityName}. */
|
|
310
|
+
set adhocEntityName(value) {
|
|
311
|
+
this.AdhocEntityName = value;
|
|
312
|
+
}
|
|
313
|
+
AdhocFilter = '';
|
|
314
|
+
/** @deprecated Use {@link AdhocFilter}. */
|
|
315
|
+
get adhocFilter() {
|
|
316
|
+
return this.AdhocFilter;
|
|
317
|
+
}
|
|
318
|
+
/** @deprecated Use {@link AdhocFilter}. */
|
|
319
|
+
set adhocFilter(value) {
|
|
320
|
+
this.AdhocFilter = value;
|
|
321
|
+
}
|
|
322
|
+
Loading = false;
|
|
323
|
+
/** @deprecated Use {@link Loading}. */
|
|
324
|
+
get loading() {
|
|
325
|
+
return this.Loading;
|
|
326
|
+
}
|
|
327
|
+
/** @deprecated Use {@link Loading}. */
|
|
328
|
+
set loading(value) {
|
|
329
|
+
this.Loading = value;
|
|
330
|
+
}
|
|
219
331
|
async ngOnInit() {
|
|
220
|
-
this.
|
|
332
|
+
this.EntityOptions = this.ProviderToUse.Entities
|
|
221
333
|
.filter((e) => !e.SchemaName.startsWith('sys'))
|
|
222
334
|
.sort((a, b) => a.Name.localeCompare(b.Name));
|
|
223
335
|
if (this.LockedEntityName) {
|
|
224
|
-
this.
|
|
225
|
-
this.
|
|
336
|
+
this.SelectedEntityName = this.LockedEntityName;
|
|
337
|
+
this.AdhocEntityName = this.LockedEntityName;
|
|
226
338
|
}
|
|
227
|
-
else if (this.
|
|
228
|
-
this.
|
|
229
|
-
this.
|
|
339
|
+
else if (this.EntityOptions.length > 0) {
|
|
340
|
+
this.SelectedEntityName = this.EntityOptions[0].Name;
|
|
341
|
+
this.AdhocEntityName = this.SelectedEntityName;
|
|
230
342
|
}
|
|
231
343
|
await this.refreshTabData();
|
|
232
344
|
}
|
|
233
|
-
async
|
|
234
|
-
this.
|
|
345
|
+
async SetTab(tab) {
|
|
346
|
+
this.ActiveTab = tab;
|
|
235
347
|
this.emitCurrentSource();
|
|
236
348
|
await this.refreshTabData();
|
|
237
349
|
}
|
|
350
|
+
/** @deprecated Use {@link SetTab}. */
|
|
351
|
+
async setTab(tab) {
|
|
352
|
+
return this.SetTab(tab);
|
|
353
|
+
}
|
|
238
354
|
async OnEntityChange(name) {
|
|
239
|
-
this.
|
|
240
|
-
this.
|
|
355
|
+
this.SelectedEntityName = name;
|
|
356
|
+
this.AdhocEntityName = name;
|
|
241
357
|
// Selecting a new entity invalidates any picked list/view.
|
|
242
|
-
this.
|
|
243
|
-
this.
|
|
358
|
+
this.SelectedListId = null;
|
|
359
|
+
this.SelectedViewId = null;
|
|
244
360
|
this.emitCurrentSource();
|
|
245
361
|
await this.refreshTabData();
|
|
246
362
|
}
|
|
@@ -251,11 +367,11 @@ export class AudienceSourcePickerComponent extends BaseAngularComponent {
|
|
|
251
367
|
this.recomputeFilteredViews();
|
|
252
368
|
}
|
|
253
369
|
OnSelectList(list) {
|
|
254
|
-
this.
|
|
370
|
+
this.SelectedListId = list.ID;
|
|
255
371
|
this.emitCurrentSource();
|
|
256
372
|
}
|
|
257
373
|
OnSelectView(view) {
|
|
258
|
-
this.
|
|
374
|
+
this.SelectedViewId = view.ID;
|
|
259
375
|
this.emitCurrentSource();
|
|
260
376
|
}
|
|
261
377
|
OnAdhocFilterChange() {
|
|
@@ -265,21 +381,25 @@ export class AudienceSourcePickerComponent extends BaseAngularComponent {
|
|
|
265
381
|
* Build the currently-selected `AudienceSource` from picker state, or
|
|
266
382
|
* `null` if the picker isn't yet in a complete state.
|
|
267
383
|
*/
|
|
268
|
-
get
|
|
269
|
-
if (this.
|
|
270
|
-
return this.
|
|
384
|
+
get CurrentSource() {
|
|
385
|
+
if (this.ActiveTab === 'list') {
|
|
386
|
+
return this.SelectedListId ? { kind: 'list', listId: this.SelectedListId } : null;
|
|
271
387
|
}
|
|
272
|
-
if (this.
|
|
273
|
-
return this.
|
|
388
|
+
if (this.ActiveTab === 'view') {
|
|
389
|
+
return this.SelectedViewId ? { kind: 'view', viewId: this.SelectedViewId } : null;
|
|
274
390
|
}
|
|
275
391
|
// adhoc
|
|
276
|
-
if (this.
|
|
277
|
-
return { kind: 'adhoc', entityName: this.
|
|
392
|
+
if (this.AdhocEntityName && this.AdhocFilter.trim().length > 0) {
|
|
393
|
+
return { kind: 'adhoc', entityName: this.AdhocEntityName, extraFilter: this.AdhocFilter.trim() };
|
|
278
394
|
}
|
|
279
395
|
return null;
|
|
280
396
|
}
|
|
397
|
+
/** @deprecated Use {@link CurrentSource}. */
|
|
398
|
+
get currentSource() {
|
|
399
|
+
return this.CurrentSource;
|
|
400
|
+
}
|
|
281
401
|
emitCurrentSource() {
|
|
282
|
-
this._source = this.
|
|
402
|
+
this._source = this.CurrentSource;
|
|
283
403
|
this.SourceChange.emit(this._source);
|
|
284
404
|
this.cdr.markForCheck();
|
|
285
405
|
}
|
|
@@ -289,15 +409,15 @@ export class AudienceSourcePickerComponent extends BaseAngularComponent {
|
|
|
289
409
|
* switching tabs doesn't re-query.
|
|
290
410
|
*/
|
|
291
411
|
async refreshTabData() {
|
|
292
|
-
if (!this.
|
|
412
|
+
if (!this.SelectedEntityName)
|
|
293
413
|
return;
|
|
294
|
-
this.
|
|
414
|
+
this.Loading = true;
|
|
295
415
|
this.cdr.markForCheck();
|
|
296
416
|
try {
|
|
297
|
-
const entityInfo = this.ProviderToUse.EntityByName(this.
|
|
417
|
+
const entityInfo = this.ProviderToUse.EntityByName(this.SelectedEntityName);
|
|
298
418
|
if (!entityInfo) {
|
|
299
|
-
this.
|
|
300
|
-
this.
|
|
419
|
+
this.AvailableLists = [];
|
|
420
|
+
this.AvailableViews = [];
|
|
301
421
|
this.recomputeFilteredLists();
|
|
302
422
|
this.recomputeFilteredViews();
|
|
303
423
|
return;
|
|
@@ -317,28 +437,28 @@ export class AudienceSourcePickerComponent extends BaseAngularComponent {
|
|
|
317
437
|
ResultType: 'entity_object',
|
|
318
438
|
}),
|
|
319
439
|
]);
|
|
320
|
-
this.
|
|
321
|
-
this.
|
|
440
|
+
this.AvailableLists = lists.Success ? lists.Results ?? [] : [];
|
|
441
|
+
this.AvailableViews = views.Success ? views.Results ?? [] : [];
|
|
322
442
|
this.recomputeFilteredLists();
|
|
323
443
|
this.recomputeFilteredViews();
|
|
324
444
|
}
|
|
325
445
|
finally {
|
|
326
|
-
this.
|
|
446
|
+
this.Loading = false;
|
|
327
447
|
this.cdr.markForCheck();
|
|
328
448
|
}
|
|
329
449
|
}
|
|
330
450
|
recomputeFilteredLists() {
|
|
331
|
-
const term = this.
|
|
332
|
-
this.
|
|
333
|
-
? this.
|
|
334
|
-
: this.
|
|
451
|
+
const term = this.ListSearch.trim().toLowerCase();
|
|
452
|
+
this.FilteredLists = term
|
|
453
|
+
? this.AvailableLists.filter((l) => l.Name.toLowerCase().includes(term))
|
|
454
|
+
: this.AvailableLists;
|
|
335
455
|
this.cdr.markForCheck();
|
|
336
456
|
}
|
|
337
457
|
recomputeFilteredViews() {
|
|
338
|
-
const term = this.
|
|
339
|
-
this.
|
|
340
|
-
? this.
|
|
341
|
-
: this.
|
|
458
|
+
const term = this.ViewSearch.trim().toLowerCase();
|
|
459
|
+
this.FilteredViews = term
|
|
460
|
+
? this.AvailableViews.filter((v) => v.Name.toLowerCase().includes(term))
|
|
461
|
+
: this.AvailableViews;
|
|
342
462
|
this.cdr.markForCheck();
|
|
343
463
|
}
|
|
344
464
|
static ɵfac = /*@__PURE__*/ (() => { let ɵAudienceSourcePickerComponent_BaseFactory; return function AudienceSourcePickerComponent_Factory(__ngFactoryType__) { return (ɵAudienceSourcePickerComponent_BaseFactory || (ɵAudienceSourcePickerComponent_BaseFactory = i0.ɵɵgetInheritedFactory(AudienceSourcePickerComponent)))(__ngFactoryType__ || AudienceSourcePickerComponent); }; })();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audience-source-picker.component.js","sourceRoot":"","sources":["../../../../src/lib/components/audience-source-picker/audience-source-picker.component.ts","../../../../src/lib/components/audience-source-picker/audience-source-picker.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, inject } from '@angular/core';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { RunView, type EntityInfo } from '@memberjunction/core';\nimport type { MJListEntity, MJUserViewEntity } from '@memberjunction/core-entities';\nimport type { AudienceSource } from '@memberjunction/lists-base';\n\n/**\n * Reusable picker for an `AudienceSource` (mockup 20). Three tabs:\n *\n * - **List** — pick from saved `MJ: List`s for the chosen entity.\n * - **View** — pick from saved `MJ: User View`s for the chosen entity.\n * Marked \"live\" so the user knows the record set is re-resolved at\n * execution time.\n * - **Ad-hoc Filter** — entity + free-form `ExtraFilter`. Skips\n * server-side validation; the consumer can pre-flight via\n * `ResolveAudience` (Action) or `AudienceResolver.Resolve` if desired.\n *\n * Emits the typed `AudienceSource` via `SourceChange` on selection; the\n * sister `AudienceSourceSummaryComponent` renders the friendly summary.\n * Multi-provider safe via `BaseAngularComponent.ProviderToUse`.\n */\nexport type AudienceSourcePickerTab = 'list' | 'view' | 'adhoc';\n\n@Component({\n standalone: false,\n selector: 'mj-audience-source-picker',\n templateUrl: './audience-source-picker.component.html',\n styleUrls: ['./audience-source-picker.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AudienceSourcePickerComponent extends BaseAngularComponent implements OnInit {\n private readonly cdr = inject(ChangeDetectorRef);\n\n /**\n * Pre-seed the picker with an existing audience. Useful when editing\n * a previously-configured audience on a saved campaign.\n */\n @Input()\n set Source(value: AudienceSource | null) {\n this._source = value;\n if (value) {\n // Pick the right tab + restore the saved field values.\n this.activeTab = value.kind;\n if (value.kind === 'list') {\n this.selectedListId = value.listId;\n } else if (value.kind === 'view') {\n this.selectedViewId = value.viewId;\n } else {\n this.adhocEntityName = value.entityName;\n this.adhocFilter = value.extraFilter;\n }\n }\n }\n get Source(): AudienceSource | null {\n return this._source;\n }\n private _source: AudienceSource | null = null;\n\n /** When set, restrict the entity dropdown to this entity (lock it). */\n @Input() LockedEntityName: string | null = null;\n\n @Output() SourceChange = new EventEmitter<AudienceSource | null>();\n\n public activeTab: AudienceSourcePickerTab = 'list';\n public entityOptions: EntityInfo[] = [];\n\n // List-tab state\n public selectedEntityName: string | null = null;\n public availableLists: MJListEntity[] = [];\n public filteredLists: MJListEntity[] = [];\n public listSearch = '';\n public selectedListId: string | null = null;\n\n // View-tab state\n public availableViews: MJUserViewEntity[] = [];\n public filteredViews: MJUserViewEntity[] = [];\n public viewSearch = '';\n public selectedViewId: string | null = null;\n\n // Adhoc-tab state\n public adhocEntityName: string | null = null;\n public adhocFilter = '';\n\n public loading = false;\n\n async ngOnInit(): Promise<void> {\n this.entityOptions = this.ProviderToUse.Entities\n .filter((e) => !e.SchemaName.startsWith('sys'))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n if (this.LockedEntityName) {\n this.selectedEntityName = this.LockedEntityName;\n this.adhocEntityName = this.LockedEntityName;\n } else if (this.entityOptions.length > 0) {\n this.selectedEntityName = this.entityOptions[0].Name;\n this.adhocEntityName = this.selectedEntityName;\n }\n await this.refreshTabData();\n }\n\n public async setTab(tab: AudienceSourcePickerTab): Promise<void> {\n this.activeTab = tab;\n this.emitCurrentSource();\n await this.refreshTabData();\n }\n\n public async OnEntityChange(name: string): Promise<void> {\n this.selectedEntityName = name;\n this.adhocEntityName = name;\n // Selecting a new entity invalidates any picked list/view.\n this.selectedListId = null;\n this.selectedViewId = null;\n this.emitCurrentSource();\n await this.refreshTabData();\n }\n\n public OnListSearchChange(): void {\n this.recomputeFilteredLists();\n }\n\n public OnViewSearchChange(): void {\n this.recomputeFilteredViews();\n }\n\n public OnSelectList(list: MJListEntity): void {\n this.selectedListId = list.ID;\n this.emitCurrentSource();\n }\n\n public OnSelectView(view: MJUserViewEntity): void {\n this.selectedViewId = view.ID;\n this.emitCurrentSource();\n }\n\n public OnAdhocFilterChange(): void {\n this.emitCurrentSource();\n }\n\n /**\n * Build the currently-selected `AudienceSource` from picker state, or\n * `null` if the picker isn't yet in a complete state.\n */\n public get currentSource(): AudienceSource | null {\n if (this.activeTab === 'list') {\n return this.selectedListId ? { kind: 'list', listId: this.selectedListId } : null;\n }\n if (this.activeTab === 'view') {\n return this.selectedViewId ? { kind: 'view', viewId: this.selectedViewId } : null;\n }\n // adhoc\n if (this.adhocEntityName && this.adhocFilter.trim().length > 0) {\n return { kind: 'adhoc', entityName: this.adhocEntityName, extraFilter: this.adhocFilter.trim() };\n }\n return null;\n }\n\n private emitCurrentSource(): void {\n this._source = this.currentSource;\n this.SourceChange.emit(this._source);\n this.cdr.markForCheck();\n }\n\n /**\n * Pull lists or views for the current tab from the server. We\n * intentionally batch the (list, view) pair on entity change so\n * switching tabs doesn't re-query.\n */\n private async refreshTabData(): Promise<void> {\n if (!this.selectedEntityName) return;\n this.loading = true;\n this.cdr.markForCheck();\n try {\n const entityInfo = this.ProviderToUse.EntityByName(this.selectedEntityName);\n if (!entityInfo) {\n this.availableLists = [];\n this.availableViews = [];\n this.recomputeFilteredLists();\n this.recomputeFilteredViews();\n return;\n }\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const [lists, views] = await Promise.all([\n rv.RunView<MJListEntity>({\n EntityName: 'MJ: Lists',\n ExtraFilter: `EntityID='${entityInfo.ID}'`,\n OrderBy: 'Name',\n ResultType: 'entity_object',\n }),\n rv.RunView<MJUserViewEntity>({\n EntityName: 'MJ: User Views',\n ExtraFilter: `EntityID='${entityInfo.ID}'`,\n OrderBy: 'Name',\n ResultType: 'entity_object',\n }),\n ]);\n this.availableLists = lists.Success ? lists.Results ?? [] : [];\n this.availableViews = views.Success ? views.Results ?? [] : [];\n this.recomputeFilteredLists();\n this.recomputeFilteredViews();\n } finally {\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n private recomputeFilteredLists(): void {\n const term = this.listSearch.trim().toLowerCase();\n this.filteredLists = term\n ? this.availableLists.filter((l) => l.Name.toLowerCase().includes(term))\n : this.availableLists;\n this.cdr.markForCheck();\n }\n\n private recomputeFilteredViews(): void {\n const term = this.viewSearch.trim().toLowerCase();\n this.filteredViews = term\n ? this.availableViews.filter((v) => v.Name.toLowerCase().includes(term))\n : this.availableViews;\n this.cdr.markForCheck();\n }\n}\n","<div class=\"audience-picker\">\n <!-- Tab strip -->\n <div class=\"audience-picker__tabs\">\n <button\n class=\"audience-picker__tab\"\n [class.audience-picker__tab--active]=\"activeTab === 'list'\"\n (click)=\"setTab('list')\">\n <i class=\"fa-solid fa-list\"></i>\n List\n </button>\n <button\n class=\"audience-picker__tab\"\n [class.audience-picker__tab--active]=\"activeTab === 'view'\"\n (click)=\"setTab('view')\">\n <i class=\"fa-solid fa-eye\"></i>\n View\n </button>\n <button\n class=\"audience-picker__tab\"\n [class.audience-picker__tab--active]=\"activeTab === 'adhoc'\"\n (click)=\"setTab('adhoc')\">\n <i class=\"fa-solid fa-filter\"></i>\n Ad-hoc Filter\n </button>\n </div>\n\n <!-- Entity selector (shared across tabs) -->\n <div class=\"audience-picker__field\">\n <label class=\"audience-picker__label\">Entity</label>\n <select\n class=\"mj-input mj-select audience-picker__entity\"\n [ngModel]=\"selectedEntityName\"\n (ngModelChange)=\"OnEntityChange($event)\"\n [disabled]=\"!!LockedEntityName\">\n @for (e of entityOptions; track e.ID) {\n <option [ngValue]=\"e.Name\">{{ e.Name }}</option>\n }\n </select>\n </div>\n\n @if (activeTab === 'list') {\n <div class=\"audience-picker__search\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n class=\"mj-input\"\n [(ngModel)]=\"listSearch\"\n (ngModelChange)=\"OnListSearchChange()\"\n placeholder=\"Search lists by name…\" />\n </div>\n @if (loading) {\n <div class=\"audience-picker__state\">\n <mj-loading text=\"Loading lists...\" size=\"small\"></mj-loading>\n </div>\n } @else if (filteredLists.length === 0) {\n <div class=\"audience-picker__state audience-picker__state--empty\">\n No lists found for this entity.\n </div>\n } @else {\n <div class=\"audience-picker__items\">\n @for (l of filteredLists; track l.ID) {\n <div\n class=\"audience-picker__item\"\n [class.audience-picker__item--selected]=\"selectedListId === l.ID\"\n (click)=\"OnSelectList(l)\">\n <i\n class=\"fa-solid\"\n [class.fa-circle-check]=\"selectedListId === l.ID\"\n [class.fa-circle]=\"selectedListId !== l.ID\"></i>\n <div class=\"audience-picker__item-body\">\n <div class=\"audience-picker__item-name\">{{ l.Name }}</div>\n @if (l.Description) {\n <div class=\"audience-picker__item-desc\">{{ l.Description }}</div>\n }\n </div>\n </div>\n }\n </div>\n }\n } @else if (activeTab === 'view') {\n <div class=\"audience-picker__search\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n class=\"mj-input\"\n [(ngModel)]=\"viewSearch\"\n (ngModelChange)=\"OnViewSearchChange()\"\n placeholder=\"Search views by name…\" />\n </div>\n @if (loading) {\n <div class=\"audience-picker__state\">\n <mj-loading text=\"Loading views...\" size=\"small\"></mj-loading>\n </div>\n } @else if (filteredViews.length === 0) {\n <div class=\"audience-picker__state audience-picker__state--empty\">\n No views found for this entity.\n </div>\n } @else {\n <div class=\"audience-picker__items\">\n @for (v of filteredViews; track v.ID) {\n <div\n class=\"audience-picker__item\"\n [class.audience-picker__item--selected]=\"selectedViewId === v.ID\"\n (click)=\"OnSelectView(v)\">\n <i\n class=\"fa-solid\"\n [class.fa-circle-check]=\"selectedViewId === v.ID\"\n [class.fa-circle]=\"selectedViewId !== v.ID\"></i>\n <div class=\"audience-picker__item-body\">\n <div class=\"audience-picker__item-name\">\n {{ v.Name }}\n <span class=\"audience-picker__live-badge\">live</span>\n </div>\n @if (v.Description) {\n <div class=\"audience-picker__item-desc\">{{ v.Description }}</div>\n }\n </div>\n </div>\n }\n </div>\n <div class=\"audience-picker__hint\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n A view is resolved live at execution — the record set may differ from\n what you see here if data changes.\n </div>\n }\n } @else {\n <!-- Ad-hoc filter tab -->\n <div class=\"audience-picker__field\">\n <label class=\"audience-picker__label\">Filter</label>\n <textarea\n class=\"mj-input audience-picker__filter\"\n rows=\"3\"\n [(ngModel)]=\"adhocFilter\"\n (ngModelChange)=\"OnAdhocFilterChange()\"\n placeholder=\"e.g. State IN ('CA','NY','TX') AND DonationCount >= 3\"></textarea>\n </div>\n <div class=\"audience-picker__hint audience-picker__hint--neutral\">\n <i class=\"fa-solid fa-circle-info\"></i>\n Ad-hoc filters are evaluated server-side at execution time. Validate the\n filter on the server (via the resolve-audience action or send preview)\n before relying on it for production.\n </div>\n }\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"audience-source-picker.component.js","sourceRoot":"","sources":["../../../../src/lib/components/audience-source-picker/audience-source-picker.component.ts","../../../../src/lib/components/audience-source-picker/audience-source-picker.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAU,MAAM,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEnI,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,OAAO,EAAmB,MAAM,sBAAsB,CAAC;;;;;;ICgCxD,iCAA2B;IAAA,YAAY;IAAA,iBAAS;;;IAAxC,mCAAkB;IAAC,cAAY;IAAZ,+BAAY;;;IAezC,+BAAoC;IAClC,iCAA8D;IAChE,iBAAM;;;IAEN,+BAAkE;IAChE,iDACF;IAAA,iBAAM;;;IAeI,+BAAwC;IAAA,YAAmB;IAAA,iBAAM;;;IAAzB,cAAmB;IAAnB,sCAAmB;;;;IAXjE,+BAG4B;IAA1B,2OAAS,yBAAe,KAAC;IACzB,wBAGkD;IAEhD,AADF,+BAAwC,cACE;IAAA,YAAY;IAAA,iBAAM;IAC1D,mIAAqB;IAIzB,AADE,iBAAM,EACF;;;;IAZJ,oFAAiE;IAI/D,cAAiD;IACjD,AADA,oEAAiD,gDACN;IAEH,eAAY;IAAZ,+BAAY;IACpD,cAEC;IAFD,2CAEC;;;IAdT,+BAAoC;IAClC,8HAgBC;IACH,iBAAM;;;IAjBJ,cAgBC;IAhBD,mCAgBC;;;;IAlCL,+BAAqC;IACnC,wBAAkC;IAClC,iCAIwC;IAFtC,0TAAwB;IACxB,iNAAiB,2BAAoB,KAAC;IAE1C,AALE,iBAIwC,EACpC;IASJ,AAJA,AAJF,+GAAe,yFAI0B,yFAIhC;;;IAZL,eAAwB;IAAxB,iDAAwB;IAI5B,cA4BC;IA5BD,gFA4BC;;;IAWC,+BAAoC;IAClC,iCAA8D;IAChE,iBAAM;;;IAEN,+BAAkE;IAChE,iDACF;IAAA,iBAAM;;;IAkBI,+BAAwC;IAAA,YAAmB;IAAA,iBAAM;;;IAAzB,cAAmB;IAAnB,sCAAmB;;;;IAdjE,+BAG4B;IAA1B,2OAAS,yBAAe,KAAC;IACzB,wBAGkD;IAEhD,AADF,+BAAwC,cACE;IACtC,YACA;IAAA,gCAA0C;IAAA,oBAAI;IAChD,AADgD,iBAAO,EACjD;IACN,mIAAqB;IAIzB,AADE,iBAAM,EACF;;;;IAfJ,oFAAiE;IAI/D,cAAiD;IACjD,AADA,oEAAiD,gDACN;IAGzC,eACA;IADA,0CACA;IAEF,eAEC;IAFD,2CAEC;;;IAjBT,+BAAoC;IAClC,8HAmBC;IACH,iBAAM;IACN,+BAAmC;IACjC,wBAAgD;IAChD,+HAEF;IAAA,iBAAM;;;IAzBJ,cAmBC;IAnBD,mCAmBC;;;;IArCL,+BAAqC;IACnC,wBAAkC;IAClC,iCAIwC;IAFtC,0TAAwB;IACxB,iNAAiB,2BAAoB,KAAC;IAE1C,AALE,iBAIwC,EACpC;IASJ,AAJA,AAJF,+GAAe,yFAI0B,8EAIhC;;;IAZL,eAAwB;IAAxB,iDAAwB;IAI5B,cAoCC;IApCD,gFAoCC;;;;IAIC,AADF,8BAAoC,eACI;IAAA,sBAAM;IAAA,iBAAQ;IACpD,oCAKsE;IAFpE,+TAAyB;IACzB,oNAAiB,4BAAqB,KAAC;IAE3C,AADwE,iBAAW,EAC7E;IACN,+BAAkE;IAChE,wBAAuC;IACvC,sMAGF;IAAA,iBAAM;;;IATF,eAAyB;IAAzB,kDAAyB;;ADpGjC,MAAM,OAAO,6BAA8B,SAAQ,oBAAoB;IACpD,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAEjD;;;OAGG;IACH,IACI,MAAM,CAAC,KAA4B;QACrC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,KAAK,EAAE,CAAC;YACV,uDAAuD;YACvD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;YAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC1B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC;YACrC,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACjC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,UAAU,CAAC;gBACxC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IACO,OAAO,GAA0B,IAAI,CAAC;IAE9C,uEAAuE;IAC9D,gBAAgB,GAAkB,IAAI,CAAC;IAEtC,YAAY,GAAG,IAAI,YAAY,EAAyB,CAAC;IAE5D,SAAS,GAA4B,MAAM,CAAC;IAEnD,yCAAyC;IACzC,IAAW,SAAS;QAClB,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IACD,yCAAyC;IACzC,IAAW,SAAS,CAAC,KAA8B;QACjD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IACzB,CAAC;IACM,aAAa,GAAiB,EAAE,CAAC;IAExC,6CAA6C;IAC7C,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IACD,6CAA6C;IAC7C,IAAW,aAAa,CAAC,KAAmB;QAC1C,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED,iBAAiB;IACV,kBAAkB,GAAkB,IAAI,CAAC;IAEhD,kDAAkD;IAClD,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IACD,kDAAkD;IAClD,IAAW,kBAAkB,CAAC,KAAoB;QAChD,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;IAClC,CAAC;IACM,cAAc,GAAmB,EAAE,CAAC;IAE3C,8CAA8C;IAC9C,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IACD,8CAA8C;IAC9C,IAAW,cAAc,CAAC,KAAqB;QAC7C,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;IACM,aAAa,GAAmB,EAAE,CAAC;IAE1C,6CAA6C;IAC7C,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IACD,6CAA6C;IAC7C,IAAW,aAAa,CAAC,KAAqB;QAC5C,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;IACM,UAAU,GAAG,EAAE,CAAC;IAEvB,0CAA0C;IAC1C,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IACD,0CAA0C;IAC1C,IAAW,UAAU,CAAC,KAAK;QACzB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IACM,cAAc,GAAkB,IAAI,CAAC;IAE5C,8CAA8C;IAC9C,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IACD,8CAA8C;IAC9C,IAAW,cAAc,CAAC,KAAoB;QAC5C,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED,iBAAiB;IACV,cAAc,GAAuB,EAAE,CAAC;IAE/C,8CAA8C;IAC9C,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IACD,8CAA8C;IAC9C,IAAW,cAAc,CAAC,KAAyB;QACjD,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;IACM,aAAa,GAAuB,EAAE,CAAC;IAE9C,6CAA6C;IAC7C,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IACD,6CAA6C;IAC7C,IAAW,aAAa,CAAC,KAAyB;QAChD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;IACM,UAAU,GAAG,EAAE,CAAC;IAEvB,0CAA0C;IAC1C,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IACD,0CAA0C;IAC1C,IAAW,UAAU,CAAC,KAAK;QACzB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IACM,cAAc,GAAkB,IAAI,CAAC;IAE5C,8CAA8C;IAC9C,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IACD,8CAA8C;IAC9C,IAAW,cAAc,CAAC,KAAoB;QAC5C,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED,kBAAkB;IACX,eAAe,GAAkB,IAAI,CAAC;IAE7C,+CAA+C;IAC/C,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IACD,+CAA+C;IAC/C,IAAW,eAAe,CAAC,KAAoB;QAC7C,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/B,CAAC;IACM,WAAW,GAAG,EAAE,CAAC;IAExB,2CAA2C;IAC3C,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IACD,2CAA2C;IAC3C,IAAW,WAAW,CAAC,KAAK;QAC1B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAEM,OAAO,GAAG,KAAK,CAAC;IAEvB,uCAAuC;IACvC,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IACD,uCAAuC;IACvC,IAAW,OAAO,CAAC,KAAK;QACtB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ;aAC7C,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;aAC9C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,CAAC;YAChD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAC/C,CAAC;aAAM,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACrD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACjD,CAAC;QACD,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;IAC9B,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,GAA4B;QAC9C,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;QACrB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;IAC9B,CAAC;IAED,sCAAsC;IAC/B,KAAK,CAAC,MAAM,CAAC,GAA4B;QAC9C,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,IAAY;QACtC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QAC/B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,2DAA2D;QAC3D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;IAC9B,CAAC;IAEM,kBAAkB;QACvB,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAChC,CAAC;IAEM,kBAAkB;QACvB,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAChC,CAAC;IAEM,YAAY,CAAC,IAAkB;QACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAEM,YAAY,CAAC,IAAsB;QACxC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,EAAE,CAAC;QAC9B,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAEM,mBAAmB;QACxB,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,IAAW,aAAa;QACtB,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACpF,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACpF,CAAC;QACD,QAAQ;QACR,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;QACnG,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6CAA6C;IAC7C,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAEO,iBAAiB;QACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC;QAClC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,cAAc;QAC1B,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAAE,OAAO;QACrC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC5E,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;gBACzB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;gBACzB,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAC9B,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAC9B,OAAO;YACT,CAAC;YACD,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC5D,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACvC,EAAE,CAAC,OAAO,CAAe;oBACvB,UAAU,EAAE,WAAW;oBACvB,WAAW,EAAE,aAAa,UAAU,CAAC,EAAE,GAAG;oBAC1C,OAAO,EAAE,MAAM;oBACf,UAAU,EAAE,eAAe;iBAC5B,CAAC;gBACF,EAAE,CAAC,OAAO,CAAmB;oBAC3B,UAAU,EAAE,gBAAgB;oBAC5B,WAAW,EAAE,aAAa,UAAU,CAAC,EAAE,GAAG;oBAC1C,OAAO,EAAE,MAAM;oBACf,UAAU,EAAE,eAAe;iBAC5B,CAAC;aACH,CAAC,CAAC;YACH,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/D,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAChC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,sBAAsB;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAClD,IAAI,CAAC,aAAa,GAAG,IAAI;YACvB,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACxE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;IAEO,sBAAsB;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAClD,IAAI,CAAC,aAAa,GAAG,IAAI;YACvB,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACxE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;QACxB,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1B,CAAC;iSApUU,6BAA6B,yBAA7B,6BAA6B;6DAA7B,6BAA6B;YC5BtC,AADF,AAFF,8BAA6B,aAEQ,gBAIN;YAAzB,0GAAS,WAAO,MAAM,CAAC,IAAC;YACxB,uBAAgC;YAChC,sBACF;YAAA,iBAAS;YACT,iCAG2B;YAAzB,0GAAS,WAAO,MAAM,CAAC,IAAC;YACxB,uBAA+B;YAC/B,sBACF;YAAA,iBAAS;YACT,iCAG4B;YAA1B,0GAAS,WAAO,OAAO,CAAC,IAAC;YACzB,uBAAkC;YAClC,gCACF;YACF,AADE,iBAAS,EACL;YAIJ,AADF,+BAAoC,gBACI;YAAA,uBAAM;YAAA,iBAAQ;YACpD,kCAIkC;YADhC,iIAAiB,0BAAsB,IAAC;YAExC,qGAEC;YAEL,AADE,iBAAS,EACL;YAsFJ,AA9CA,AAtCF,uFAA4B,iEAsCO,iEA8C1B;YAkBX,iBAAM;;YAzIA,eAA2D;YAA3D,wEAA2D;YAO3D,eAA2D;YAA3D,wEAA2D;YAO3D,eAA4D;YAA5D,yEAA4D;YAY5D,eAA8B;YAE9B,AAFA,gDAA8B,oCAEC;YAC/B,cAEC;YAFD,gCAEC;YAIL,eAqGC;YArGD,oFAqGC;;;iFD9GU,6BAA6B;cAPzC,SAAS;6BACI,KAAK,YACP,2BAA2B,mBAGpB,uBAAuB,CAAC,MAAM;;kBAS9C,KAAK;;kBAsBL,KAAK;;kBAEL,MAAM;;kFA/BI,6BAA6B","sourcesContent":["import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output, inject } from '@angular/core';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { RunView, type EntityInfo } from '@memberjunction/core';\nimport type { MJListEntity, MJUserViewEntity } from '@memberjunction/core-entities';\nimport type { AudienceSource } from '@memberjunction/lists-base';\n\n/**\n * Reusable picker for an `AudienceSource` (mockup 20). Three tabs:\n *\n * - **List** — pick from saved `MJ: List`s for the chosen entity.\n * - **View** — pick from saved `MJ: User View`s for the chosen entity.\n * Marked \"live\" so the user knows the record set is re-resolved at\n * execution time.\n * - **Ad-hoc Filter** — entity + free-form `ExtraFilter`. Skips\n * server-side validation; the consumer can pre-flight via\n * `ResolveAudience` (Action) or `AudienceResolver.Resolve` if desired.\n *\n * Emits the typed `AudienceSource` via `SourceChange` on selection; the\n * sister `AudienceSourceSummaryComponent` renders the friendly summary.\n * Multi-provider safe via `BaseAngularComponent.ProviderToUse`.\n */\nexport type AudienceSourcePickerTab = 'list' | 'view' | 'adhoc';\n\n@Component({\n standalone: false,\n selector: 'mj-audience-source-picker',\n templateUrl: './audience-source-picker.component.html',\n styleUrls: ['./audience-source-picker.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AudienceSourcePickerComponent extends BaseAngularComponent implements OnInit {\n private readonly cdr = inject(ChangeDetectorRef);\n\n /**\n * Pre-seed the picker with an existing audience. Useful when editing\n * a previously-configured audience on a saved campaign.\n */\n @Input()\n set Source(value: AudienceSource | null) {\n this._source = value;\n if (value) {\n // Pick the right tab + restore the saved field values.\n this.ActiveTab = value.kind;\n if (value.kind === 'list') {\n this.SelectedListId = value.listId;\n } else if (value.kind === 'view') {\n this.SelectedViewId = value.viewId;\n } else {\n this.AdhocEntityName = value.entityName;\n this.AdhocFilter = value.extraFilter;\n }\n }\n }\n get Source(): AudienceSource | null {\n return this._source;\n }\n private _source: AudienceSource | null = null;\n\n /** When set, restrict the entity dropdown to this entity (lock it). */\n @Input() LockedEntityName: string | null = null;\n\n @Output() SourceChange = new EventEmitter<AudienceSource | null>();\n\n public ActiveTab: AudienceSourcePickerTab = 'list';\n\n /** @deprecated Use {@link ActiveTab}. */\n public get activeTab(): AudienceSourcePickerTab {\n return this.ActiveTab;\n }\n /** @deprecated Use {@link ActiveTab}. */\n public set activeTab(value: AudienceSourcePickerTab) {\n this.ActiveTab = value;\n }\n public EntityOptions: EntityInfo[] = [];\n\n /** @deprecated Use {@link EntityOptions}. */\n public get entityOptions(): EntityInfo[] {\n return this.EntityOptions;\n }\n /** @deprecated Use {@link EntityOptions}. */\n public set entityOptions(value: EntityInfo[]) {\n this.EntityOptions = value;\n }\n\n // List-tab state\n public SelectedEntityName: string | null = null;\n\n /** @deprecated Use {@link SelectedEntityName}. */\n public get selectedEntityName(): string | null {\n return this.SelectedEntityName;\n }\n /** @deprecated Use {@link SelectedEntityName}. */\n public set selectedEntityName(value: string | null) {\n this.SelectedEntityName = value;\n }\n public AvailableLists: MJListEntity[] = [];\n\n /** @deprecated Use {@link AvailableLists}. */\n public get availableLists(): MJListEntity[] {\n return this.AvailableLists;\n }\n /** @deprecated Use {@link AvailableLists}. */\n public set availableLists(value: MJListEntity[]) {\n this.AvailableLists = value;\n }\n public FilteredLists: MJListEntity[] = [];\n\n /** @deprecated Use {@link FilteredLists}. */\n public get filteredLists(): MJListEntity[] {\n return this.FilteredLists;\n }\n /** @deprecated Use {@link FilteredLists}. */\n public set filteredLists(value: MJListEntity[]) {\n this.FilteredLists = value;\n }\n public ListSearch = '';\n\n /** @deprecated Use {@link ListSearch}. */\n public get listSearch() {\n return this.ListSearch;\n }\n /** @deprecated Use {@link ListSearch}. */\n public set listSearch(value) {\n this.ListSearch = value;\n }\n public SelectedListId: string | null = null;\n\n /** @deprecated Use {@link SelectedListId}. */\n public get selectedListId(): string | null {\n return this.SelectedListId;\n }\n /** @deprecated Use {@link SelectedListId}. */\n public set selectedListId(value: string | null) {\n this.SelectedListId = value;\n }\n\n // View-tab state\n public AvailableViews: MJUserViewEntity[] = [];\n\n /** @deprecated Use {@link AvailableViews}. */\n public get availableViews(): MJUserViewEntity[] {\n return this.AvailableViews;\n }\n /** @deprecated Use {@link AvailableViews}. */\n public set availableViews(value: MJUserViewEntity[]) {\n this.AvailableViews = value;\n }\n public FilteredViews: MJUserViewEntity[] = [];\n\n /** @deprecated Use {@link FilteredViews}. */\n public get filteredViews(): MJUserViewEntity[] {\n return this.FilteredViews;\n }\n /** @deprecated Use {@link FilteredViews}. */\n public set filteredViews(value: MJUserViewEntity[]) {\n this.FilteredViews = value;\n }\n public ViewSearch = '';\n\n /** @deprecated Use {@link ViewSearch}. */\n public get viewSearch() {\n return this.ViewSearch;\n }\n /** @deprecated Use {@link ViewSearch}. */\n public set viewSearch(value) {\n this.ViewSearch = value;\n }\n public SelectedViewId: string | null = null;\n\n /** @deprecated Use {@link SelectedViewId}. */\n public get selectedViewId(): string | null {\n return this.SelectedViewId;\n }\n /** @deprecated Use {@link SelectedViewId}. */\n public set selectedViewId(value: string | null) {\n this.SelectedViewId = value;\n }\n\n // Adhoc-tab state\n public AdhocEntityName: string | null = null;\n\n /** @deprecated Use {@link AdhocEntityName}. */\n public get adhocEntityName(): string | null {\n return this.AdhocEntityName;\n }\n /** @deprecated Use {@link AdhocEntityName}. */\n public set adhocEntityName(value: string | null) {\n this.AdhocEntityName = value;\n }\n public AdhocFilter = '';\n\n /** @deprecated Use {@link AdhocFilter}. */\n public get adhocFilter() {\n return this.AdhocFilter;\n }\n /** @deprecated Use {@link AdhocFilter}. */\n public set adhocFilter(value) {\n this.AdhocFilter = value;\n }\n\n public Loading = false;\n\n /** @deprecated Use {@link Loading}. */\n public get loading() {\n return this.Loading;\n }\n /** @deprecated Use {@link Loading}. */\n public set loading(value) {\n this.Loading = value;\n }\n\n async ngOnInit(): Promise<void> {\n this.EntityOptions = this.ProviderToUse.Entities\n .filter((e) => !e.SchemaName.startsWith('sys'))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n if (this.LockedEntityName) {\n this.SelectedEntityName = this.LockedEntityName;\n this.AdhocEntityName = this.LockedEntityName;\n } else if (this.EntityOptions.length > 0) {\n this.SelectedEntityName = this.EntityOptions[0].Name;\n this.AdhocEntityName = this.SelectedEntityName;\n }\n await this.refreshTabData();\n }\n\n public async SetTab(tab: AudienceSourcePickerTab): Promise<void> {\n this.ActiveTab = tab;\n this.emitCurrentSource();\n await this.refreshTabData();\n }\n\n /** @deprecated Use {@link SetTab}. */\n public async setTab(tab: AudienceSourcePickerTab): Promise<void> {\n return this.SetTab(tab);\n }\n\n public async OnEntityChange(name: string): Promise<void> {\n this.SelectedEntityName = name;\n this.AdhocEntityName = name;\n // Selecting a new entity invalidates any picked list/view.\n this.SelectedListId = null;\n this.SelectedViewId = null;\n this.emitCurrentSource();\n await this.refreshTabData();\n }\n\n public OnListSearchChange(): void {\n this.recomputeFilteredLists();\n }\n\n public OnViewSearchChange(): void {\n this.recomputeFilteredViews();\n }\n\n public OnSelectList(list: MJListEntity): void {\n this.SelectedListId = list.ID;\n this.emitCurrentSource();\n }\n\n public OnSelectView(view: MJUserViewEntity): void {\n this.SelectedViewId = view.ID;\n this.emitCurrentSource();\n }\n\n public OnAdhocFilterChange(): void {\n this.emitCurrentSource();\n }\n\n /**\n * Build the currently-selected `AudienceSource` from picker state, or\n * `null` if the picker isn't yet in a complete state.\n */\n public get CurrentSource(): AudienceSource | null {\n if (this.ActiveTab === 'list') {\n return this.SelectedListId ? { kind: 'list', listId: this.SelectedListId } : null;\n }\n if (this.ActiveTab === 'view') {\n return this.SelectedViewId ? { kind: 'view', viewId: this.SelectedViewId } : null;\n }\n // adhoc\n if (this.AdhocEntityName && this.AdhocFilter.trim().length > 0) {\n return { kind: 'adhoc', entityName: this.AdhocEntityName, extraFilter: this.AdhocFilter.trim() };\n }\n return null;\n }\n\n /** @deprecated Use {@link CurrentSource}. */\n public get currentSource(): AudienceSource | null {\n return this.CurrentSource;\n }\n\n private emitCurrentSource(): void {\n this._source = this.CurrentSource;\n this.SourceChange.emit(this._source);\n this.cdr.markForCheck();\n }\n\n /**\n * Pull lists or views for the current tab from the server. We\n * intentionally batch the (list, view) pair on entity change so\n * switching tabs doesn't re-query.\n */\n private async refreshTabData(): Promise<void> {\n if (!this.SelectedEntityName) return;\n this.Loading = true;\n this.cdr.markForCheck();\n try {\n const entityInfo = this.ProviderToUse.EntityByName(this.SelectedEntityName);\n if (!entityInfo) {\n this.AvailableLists = [];\n this.AvailableViews = [];\n this.recomputeFilteredLists();\n this.recomputeFilteredViews();\n return;\n }\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const [lists, views] = await Promise.all([\n rv.RunView<MJListEntity>({\n EntityName: 'MJ: Lists',\n ExtraFilter: `EntityID='${entityInfo.ID}'`,\n OrderBy: 'Name',\n ResultType: 'entity_object',\n }),\n rv.RunView<MJUserViewEntity>({\n EntityName: 'MJ: User Views',\n ExtraFilter: `EntityID='${entityInfo.ID}'`,\n OrderBy: 'Name',\n ResultType: 'entity_object',\n }),\n ]);\n this.AvailableLists = lists.Success ? lists.Results ?? [] : [];\n this.AvailableViews = views.Success ? views.Results ?? [] : [];\n this.recomputeFilteredLists();\n this.recomputeFilteredViews();\n } finally {\n this.Loading = false;\n this.cdr.markForCheck();\n }\n }\n\n private recomputeFilteredLists(): void {\n const term = this.ListSearch.trim().toLowerCase();\n this.FilteredLists = term\n ? this.AvailableLists.filter((l) => l.Name.toLowerCase().includes(term))\n : this.AvailableLists;\n this.cdr.markForCheck();\n }\n\n private recomputeFilteredViews(): void {\n const term = this.ViewSearch.trim().toLowerCase();\n this.FilteredViews = term\n ? this.AvailableViews.filter((v) => v.Name.toLowerCase().includes(term))\n : this.AvailableViews;\n this.cdr.markForCheck();\n }\n}\n","<div class=\"audience-picker\">\n <!-- Tab strip -->\n <div class=\"audience-picker__tabs\">\n <button\n class=\"audience-picker__tab\"\n [class.audience-picker__tab--active]=\"activeTab === 'list'\"\n (click)=\"setTab('list')\">\n <i class=\"fa-solid fa-list\"></i>\n List\n </button>\n <button\n class=\"audience-picker__tab\"\n [class.audience-picker__tab--active]=\"activeTab === 'view'\"\n (click)=\"setTab('view')\">\n <i class=\"fa-solid fa-eye\"></i>\n View\n </button>\n <button\n class=\"audience-picker__tab\"\n [class.audience-picker__tab--active]=\"activeTab === 'adhoc'\"\n (click)=\"setTab('adhoc')\">\n <i class=\"fa-solid fa-filter\"></i>\n Ad-hoc Filter\n </button>\n </div>\n\n <!-- Entity selector (shared across tabs) -->\n <div class=\"audience-picker__field\">\n <label class=\"audience-picker__label\">Entity</label>\n <select\n class=\"mj-input mj-select audience-picker__entity\"\n [ngModel]=\"selectedEntityName\"\n (ngModelChange)=\"OnEntityChange($event)\"\n [disabled]=\"!!LockedEntityName\">\n @for (e of entityOptions; track e.ID) {\n <option [ngValue]=\"e.Name\">{{ e.Name }}</option>\n }\n </select>\n </div>\n\n @if (activeTab === 'list') {\n <div class=\"audience-picker__search\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n class=\"mj-input\"\n [(ngModel)]=\"listSearch\"\n (ngModelChange)=\"OnListSearchChange()\"\n placeholder=\"Search lists by name…\" />\n </div>\n @if (loading) {\n <div class=\"audience-picker__state\">\n <mj-loading text=\"Loading lists...\" size=\"small\"></mj-loading>\n </div>\n } @else if (filteredLists.length === 0) {\n <div class=\"audience-picker__state audience-picker__state--empty\">\n No lists found for this entity.\n </div>\n } @else {\n <div class=\"audience-picker__items\">\n @for (l of filteredLists; track l.ID) {\n <div\n class=\"audience-picker__item\"\n [class.audience-picker__item--selected]=\"selectedListId === l.ID\"\n (click)=\"OnSelectList(l)\">\n <i\n class=\"fa-solid\"\n [class.fa-circle-check]=\"selectedListId === l.ID\"\n [class.fa-circle]=\"selectedListId !== l.ID\"></i>\n <div class=\"audience-picker__item-body\">\n <div class=\"audience-picker__item-name\">{{ l.Name }}</div>\n @if (l.Description) {\n <div class=\"audience-picker__item-desc\">{{ l.Description }}</div>\n }\n </div>\n </div>\n }\n </div>\n }\n } @else if (activeTab === 'view') {\n <div class=\"audience-picker__search\">\n <i class=\"fa-solid fa-search\"></i>\n <input\n class=\"mj-input\"\n [(ngModel)]=\"viewSearch\"\n (ngModelChange)=\"OnViewSearchChange()\"\n placeholder=\"Search views by name…\" />\n </div>\n @if (loading) {\n <div class=\"audience-picker__state\">\n <mj-loading text=\"Loading views...\" size=\"small\"></mj-loading>\n </div>\n } @else if (filteredViews.length === 0) {\n <div class=\"audience-picker__state audience-picker__state--empty\">\n No views found for this entity.\n </div>\n } @else {\n <div class=\"audience-picker__items\">\n @for (v of filteredViews; track v.ID) {\n <div\n class=\"audience-picker__item\"\n [class.audience-picker__item--selected]=\"selectedViewId === v.ID\"\n (click)=\"OnSelectView(v)\">\n <i\n class=\"fa-solid\"\n [class.fa-circle-check]=\"selectedViewId === v.ID\"\n [class.fa-circle]=\"selectedViewId !== v.ID\"></i>\n <div class=\"audience-picker__item-body\">\n <div class=\"audience-picker__item-name\">\n {{ v.Name }}\n <span class=\"audience-picker__live-badge\">live</span>\n </div>\n @if (v.Description) {\n <div class=\"audience-picker__item-desc\">{{ v.Description }}</div>\n }\n </div>\n </div>\n }\n </div>\n <div class=\"audience-picker__hint\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n A view is resolved live at execution — the record set may differ from\n what you see here if data changes.\n </div>\n }\n } @else {\n <!-- Ad-hoc filter tab -->\n <div class=\"audience-picker__field\">\n <label class=\"audience-picker__label\">Filter</label>\n <textarea\n class=\"mj-input audience-picker__filter\"\n rows=\"3\"\n [(ngModel)]=\"adhocFilter\"\n (ngModelChange)=\"OnAdhocFilterChange()\"\n placeholder=\"e.g. State IN ('CA','NY','TX') AND DonationCount >= 3\"></textarea>\n </div>\n <div class=\"audience-picker__hint audience-picker__hint--neutral\">\n <i class=\"fa-solid fa-circle-info\"></i>\n Ad-hoc filters are evaluated server-side at execution time. Validate the\n filter on the server (via the resolve-audience action or send preview)\n before relying on it for production.\n </div>\n }\n</div>\n"]}
|
|
@@ -18,7 +18,13 @@ export declare class AudienceSourceSummaryComponent extends BaseAngularComponent
|
|
|
18
18
|
/** Optional pre-computed count to surface (e.g., from a prior resolve). */
|
|
19
19
|
RecordCount: number | null;
|
|
20
20
|
label: string | null;
|
|
21
|
-
|
|
21
|
+
Icon: string;
|
|
22
|
+
/** @deprecated Use {@link Icon}. */
|
|
23
|
+
get icon(): string;
|
|
24
|
+
/** @deprecated Use {@link Icon}. */
|
|
25
|
+
set icon(value: string);
|
|
26
|
+
get KindLabel(): string;
|
|
27
|
+
/** @deprecated Use {@link KindLabel}. */
|
|
22
28
|
get kindLabel(): string;
|
|
23
29
|
/**
|
|
24
30
|
* Resolve a human-readable label for the source. Names are looked up
|
package/dist/lib/components/audience-source-summary/audience-source-summary.component.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audience-source-summary.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/audience-source-summary/audience-source-summary.component.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAGrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;;AAEjE;;;;;;;;GAQG;AACH,qBAOa,8BAA+B,SAAQ,oBAAoB;IACtE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAEjD,IACI,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,EAItC;IACD,IAAI,MAAM,IAAI,cAAc,GAAG,IAAI,CAElC;IACD,OAAO,CAAC,OAAO,CAA+B;IAE9C,2EAA2E;IAClE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEpC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC5B,IAAI,SAA0B;IAErC,IAAW,SAAS,IAAI,MAAM,CAK7B;IAED;;;;;OAKG;YACW,YAAY;IAyB1B,OAAO,CAAC,QAAQ;
|
|
1
|
+
{"version":3,"file":"audience-source-summary.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/audience-source-summary/audience-source-summary.component.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAGrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;;AAEjE;;;;;;;;GAQG;AACH,qBAOa,8BAA+B,SAAQ,oBAAoB;IACtE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAEjD,IACI,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,EAItC;IACD,IAAI,MAAM,IAAI,cAAc,GAAG,IAAI,CAElC;IACD,OAAO,CAAC,OAAO,CAA+B;IAE9C,2EAA2E;IAClE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEpC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC5B,IAAI,SAA0B;IAErC,oCAAoC;IACpC,IAAW,IAAI,WAEd;IACD,oCAAoC;IACpC,IAAW,IAAI,CAAC,KAAK,QAAA,EAEpB;IAED,IAAW,SAAS,IAAI,MAAM,CAK7B;IAED,yCAAyC;IACzC,IAAW,SAAS,IAAI,MAAM,CAE7B;IAED;;;;;OAKG;YACW,YAAY;IAyB1B,OAAO,CAAC,QAAQ;yCAxEL,8BAA8B;2CAA9B,8BAA8B;CA2E1C"}
|
|
@@ -70,8 +70,16 @@ export class AudienceSourceSummaryComponent extends BaseAngularComponent {
|
|
|
70
70
|
/** Optional pre-computed count to surface (e.g., from a prior resolve). */
|
|
71
71
|
RecordCount = null;
|
|
72
72
|
label = null;
|
|
73
|
-
|
|
74
|
-
|
|
73
|
+
Icon = 'fa-solid fa-bullseye';
|
|
74
|
+
/** @deprecated Use {@link Icon}. */
|
|
75
|
+
get icon() {
|
|
76
|
+
return this.Icon;
|
|
77
|
+
}
|
|
78
|
+
/** @deprecated Use {@link Icon}. */
|
|
79
|
+
set icon(value) {
|
|
80
|
+
this.Icon = value;
|
|
81
|
+
}
|
|
82
|
+
get KindLabel() {
|
|
75
83
|
if (!this._source)
|
|
76
84
|
return '';
|
|
77
85
|
if (this._source.kind === 'list')
|
|
@@ -80,6 +88,10 @@ export class AudienceSourceSummaryComponent extends BaseAngularComponent {
|
|
|
80
88
|
return 'View';
|
|
81
89
|
return 'Ad-hoc Filter';
|
|
82
90
|
}
|
|
91
|
+
/** @deprecated Use {@link KindLabel}. */
|
|
92
|
+
get kindLabel() {
|
|
93
|
+
return this.KindLabel;
|
|
94
|
+
}
|
|
83
95
|
/**
|
|
84
96
|
* Resolve a human-readable label for the source. Names are looked up
|
|
85
97
|
* one-at-a-time; cheap because each picker change fires at most once.
|
|
@@ -94,17 +106,17 @@ export class AudienceSourceSummaryComponent extends BaseAngularComponent {
|
|
|
94
106
|
const list = await md.GetEntityObject('MJ: Lists', this.ProviderToUse.CurrentUser ?? undefined);
|
|
95
107
|
const loaded = await list.Load(source.listId);
|
|
96
108
|
this.label = loaded ? list.Name : source.listId;
|
|
97
|
-
this.
|
|
109
|
+
this.Icon = 'fa-solid fa-list';
|
|
98
110
|
}
|
|
99
111
|
else if (source.kind === 'view') {
|
|
100
112
|
const view = await md.GetEntityObject('MJ: User Views', this.ProviderToUse.CurrentUser ?? undefined);
|
|
101
113
|
const loaded = await view.Load(source.viewId);
|
|
102
114
|
this.label = loaded ? view.Name : source.viewId;
|
|
103
|
-
this.
|
|
115
|
+
this.Icon = 'fa-solid fa-eye';
|
|
104
116
|
}
|
|
105
117
|
else {
|
|
106
118
|
this.label = `${source.entityName} — ${this.truncate(source.extraFilter, 80)}`;
|
|
107
|
-
this.
|
|
119
|
+
this.Icon = 'fa-solid fa-filter';
|
|
108
120
|
}
|
|
109
121
|
}
|
|
110
122
|
catch {
|