@memberjunction/ng-list-management 5.51.0 → 6.1.0-edge.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +7 -0
- 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 +2 -2
- package/dist/lib/components/audience-source-summary/audience-source-summary.component.js.map +1 -1
- package/dist/lib/components/tag-chips/tag-chips.component.d.ts.map +1 -1
- package/dist/lib/components/tag-chips/tag-chips.component.js +4 -2
- package/dist/lib/components/tag-chips/tag-chips.component.js.map +1 -1
- package/package.json +19 -19
package/LICENSE
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
ISC License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 MemberJunction
|
|
4
|
+
|
|
5
|
+
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
|
|
6
|
+
|
|
7
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
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;
|
|
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;yCA1DL,8BAA8B;2CAA9B,8BAA8B;CA6D1C"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, inject } from '@angular/core';
|
|
2
2
|
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
3
|
-
import { Metadata } from '@memberjunction/core';
|
|
4
3
|
import * as i0 from "@angular/core";
|
|
5
4
|
function AudienceSourceSummaryComponent_Conditional_0_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
6
5
|
i0.ɵɵtext(0, " \u00B7 resolves to ");
|
|
@@ -89,7 +88,8 @@ export class AudienceSourceSummaryComponent extends BaseAngularComponent {
|
|
|
89
88
|
*/
|
|
90
89
|
async resolveLabel(source) {
|
|
91
90
|
try {
|
|
92
|
-
|
|
91
|
+
// ProviderToUse always resolves (it falls back to the global default itself).
|
|
92
|
+
const md = this.ProviderToUse;
|
|
93
93
|
if (source.kind === 'list') {
|
|
94
94
|
const list = await md.GetEntityObject('MJ: Lists', this.ProviderToUse.CurrentUser ?? undefined);
|
|
95
95
|
const loaded = await list.Load(source.listId);
|
package/dist/lib/components/audience-source-summary/audience-source-summary.component.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audience-source-summary.component.js","sourceRoot":"","sources":["../../../../src/lib/components/audience-source-summary/audience-source-summary.component.ts","../../../../src/lib/components/audience-source-summary/audience-source-summary.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAErG,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC
|
|
1
|
+
{"version":3,"file":"audience-source-summary.component.js","sourceRoot":"","sources":["../../../../src/lib/components/audience-source-summary/audience-source-summary.component.ts","../../../../src/lib/components/audience-source-summary/audience-source-summary.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, inject } from '@angular/core';\n\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { Metadata } from '@memberjunction/core';\nimport type { MJListEntity, MJUserViewEntity } from '@memberjunction/core-entities';\nimport type { AudienceSource } from '@memberjunction/lists-base';\n\n/**\n * Compact, read-only summary of an `AudienceSource`. Resolves names\n * (list / view → display name) so the user sees the audience as\n * \"VIP Donors Q4 2026 (List, 348 records)\" rather than a raw UUID.\n *\n * Pairs naturally with `AudienceSourcePickerComponent`: bind the same\n * `Source` to both, and the summary reflects the picker's current\n * selection live.\n */\n@Component({\n standalone: false,\n selector: 'mj-audience-source-summary',\n templateUrl: './audience-source-summary.component.html',\n styleUrls: ['./audience-source-summary.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AudienceSourceSummaryComponent extends BaseAngularComponent {\n private readonly cdr = inject(ChangeDetectorRef);\n\n @Input()\n set Source(value: AudienceSource | null) {\n this._source = value;\n if (value) void this.resolveLabel(value);\n else this.label = null;\n }\n get Source(): AudienceSource | null {\n return this._source;\n }\n private _source: AudienceSource | null = null;\n\n /** Optional pre-computed count to surface (e.g., from a prior resolve). */\n @Input() RecordCount: number | null = null;\n\n public label: string | null = null;\n public icon = 'fa-solid fa-bullseye';\n\n public get kindLabel(): string {\n if (!this._source) return '';\n if (this._source.kind === 'list') return 'List';\n if (this._source.kind === 'view') return 'View';\n return 'Ad-hoc Filter';\n }\n\n /**\n * Resolve a human-readable label for the source. Names are looked up\n * one-at-a-time; cheap because each picker change fires at most once.\n * Falls back to the underlying ID if the lookup fails — the summary\n * is informational, never load-bearing.\n */\n private async resolveLabel(source: AudienceSource): Promise<void> {\n try {\n // ProviderToUse always resolves (it falls back to the global default itself).\n const md = this.ProviderToUse as unknown as Metadata;\n if (source.kind === 'list') {\n const list = await md.GetEntityObject<MJListEntity>('MJ: Lists', this.ProviderToUse.CurrentUser ?? undefined);\n const loaded = await list.Load(source.listId);\n this.label = loaded ? list.Name : source.listId;\n this.icon = 'fa-solid fa-list';\n } else if (source.kind === 'view') {\n const view = await md.GetEntityObject<MJUserViewEntity>('MJ: User Views', this.ProviderToUse.CurrentUser ?? undefined);\n const loaded = await view.Load(source.viewId);\n this.label = loaded ? view.Name : source.viewId;\n this.icon = 'fa-solid fa-eye';\n } else {\n this.label = `${source.entityName} — ${this.truncate(source.extraFilter, 80)}`;\n this.icon = 'fa-solid fa-filter';\n }\n } catch {\n this.label = '(unable to resolve)';\n } finally {\n this.cdr.markForCheck();\n }\n }\n\n private truncate(s: string, n: number): string {\n return s.length <= n ? s : `${s.slice(0, n - 1)}…`;\n }\n}\n","@if (Source && label) {\n <div class=\"audience-summary\">\n <i [class]=\"icon\"></i>\n <div class=\"audience-summary__body\">\n <div class=\"audience-summary__name\">\n Audience: <strong>{{ label }}</strong>\n </div>\n <div class=\"audience-summary__detail\">\n <span class=\"audience-summary__kind\">{{ kindLabel }}</span>\n @if (RecordCount != null) {\n · resolves to <strong>{{ RecordCount }} record(s)</strong>\n } @else {\n · resolves at execution time\n }\n </div>\n </div>\n </div>\n} @else {\n <div class=\"audience-summary audience-summary--empty\">\n <i class=\"fa-solid fa-bullseye\"></i>\n <span>No audience selected.</span>\n </div>\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tag-chips.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/tag-chips/tag-chips.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyD,YAAY,EAAS,MAAM,EAAkB,MAAM,eAAe,CAAC;AAEnI,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,KAAK,EAAE,WAAW,EAAsB,MAAM,+BAA+B,CAAC;;AAErF;;;;;;;;;;GAUG;AAEH,UAAU,UAAU;IAClB,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAOa,iBAAkB,SAAQ,oBAAqB,YAAW,MAAM;IAC3E,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAEjD,gDAAgD;IAChD,IACI,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAKlC;IACD,IAAI,UAAU,IAAI,MAAM,GAAG,IAAI,CAE9B;IACD,OAAO,CAAC,WAAW,CAAuB;IAE1C,+DAA+D;IAC/D,IACI,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAKhC;IACD,IAAI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAE5B;IACD,OAAO,CAAC,SAAS,CAAuB;IAExC,4DAA4D;IACnD,QAAQ,UAAS;IAE1B,wEAAwE;IAC/D,UAAU,SAAK;IAExB,2EAA2E;IACjE,UAAU;eAA6B,MAAM;cAAQ,MAAM;OAAM;IAE3E,sEAAsE;IAC5D,WAAW,qBAA4B;IAE1C,IAAI,EAAE,UAAU,EAAE,CAAM;IACxB,OAAO,UAAS;IAChB,QAAQ,SAAM;IACd,WAAW,EAAE,WAAW,EAAE,CAAM;IAChC,eAAe,UAAS;IAC/B;8EAC0E;IACnE,YAAY,UAAS;IAE5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAuB;IAEjC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAK/B,IAAW,aAAa,IAAI,UAAU,EAAE,CAEvC;IAED,IAAW,aAAa,IAAI,MAAM,CAEjC;IAEM,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;IAI3B,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBtD,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsC3D;;;;;OAKG;IACU,gBAAgB,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAe9C,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtD;uEACmE;IACtD,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;YAM3B,eAAe;YAsBf,gBAAgB;IA4B9B;;;;OAIG;YACW,QAAQ;IAuDtB,OAAO,CAAC,QAAQ;yCA/QL,iBAAiB;2CAAjB,iBAAiB;
|
|
1
|
+
{"version":3,"file":"tag-chips.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/tag-chips/tag-chips.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyD,YAAY,EAAS,MAAM,EAAkB,MAAM,eAAe,CAAC;AAEnI,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,KAAK,EAAE,WAAW,EAAsB,MAAM,+BAA+B,CAAC;;AAErF;;;;;;;;;;GAUG;AAEH,UAAU,UAAU;IAClB,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAC;IACrB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAOa,iBAAkB,SAAQ,oBAAqB,YAAW,MAAM;IAC3E,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IAEjD,gDAAgD;IAChD,IACI,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAKlC;IACD,IAAI,UAAU,IAAI,MAAM,GAAG,IAAI,CAE9B;IACD,OAAO,CAAC,WAAW,CAAuB;IAE1C,+DAA+D;IAC/D,IACI,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAKhC;IACD,IAAI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAE5B;IACD,OAAO,CAAC,SAAS,CAAuB;IAExC,4DAA4D;IACnD,QAAQ,UAAS;IAE1B,wEAAwE;IAC/D,UAAU,SAAK;IAExB,2EAA2E;IACjE,UAAU;eAA6B,MAAM;cAAQ,MAAM;OAAM;IAE3E,sEAAsE;IAC5D,WAAW,qBAA4B;IAE1C,IAAI,EAAE,UAAU,EAAE,CAAM;IACxB,OAAO,UAAS;IAChB,QAAQ,SAAM;IACd,WAAW,EAAE,WAAW,EAAE,CAAM;IAChC,eAAe,UAAS;IAC/B;8EAC0E;IACnE,YAAY,UAAS;IAE5B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAuB;IAEjC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAK/B,IAAW,aAAa,IAAI,UAAU,EAAE,CAEvC;IAED,IAAW,aAAa,IAAI,MAAM,CAEjC;IAEM,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;IAI3B,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBtD,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsC3D;;;;;OAKG;IACU,gBAAgB,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAe9C,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtD;uEACmE;IACtD,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;YAM3B,eAAe;YAsBf,gBAAgB;IA4B9B;;;;OAIG;YACW,QAAQ;IAuDtB,OAAO,CAAC,QAAQ;yCA/QL,iBAAiB;2CAAjB,iBAAiB;CAoR7B"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, inject } from '@angular/core';
|
|
2
2
|
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
3
|
-
import { LogError,
|
|
3
|
+
import { LogError, RunView } from '@memberjunction/core';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
import * as i1 from "@angular/forms";
|
|
6
6
|
const _forTrack0 = ($index, $item) => $item.TaggedItemID;
|
|
@@ -353,7 +353,9 @@ export class TagChipsComponent extends BaseAngularComponent {
|
|
|
353
353
|
}
|
|
354
354
|
}
|
|
355
355
|
metadata() {
|
|
356
|
-
|
|
356
|
+
// ProviderToUse always resolves (it falls back to the global default itself), so a
|
|
357
|
+
// `?? new Metadata()` arm here was dead code that would have defeated an injected provider.
|
|
358
|
+
return this.ProviderToUse;
|
|
357
359
|
}
|
|
358
360
|
static ɵfac = /*@__PURE__*/ (() => { let ɵTagChipsComponent_BaseFactory; return function TagChipsComponent_Factory(__ngFactoryType__) { return (ɵTagChipsComponent_BaseFactory || (ɵTagChipsComponent_BaseFactory = i0.ɵɵgetInheritedFactory(TagChipsComponent)))(__ngFactoryType__ || TagChipsComponent); }; })();
|
|
359
361
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TagChipsComponent, selectors: [["mj-tag-chips"]], inputs: { EntityName: "EntityName", RecordID: "RecordID", Editable: "Editable", MaxDisplay: "MaxDisplay" }, outputs: { TagClicked: "TagClicked", TagsChanged: "TagsChanged" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 5, vars: 4, consts: [[1, "tag-chips"], [1, "tag-chip"], [1, "tag-chip", "tag-chip--more"], [1, "tag-chip-add"], [1, "tag-chip", 3, "click"], [1, "fa-solid", "fa-tag"], [1, "tag-chip__name"], ["title", "Remove tag", 1, "fa-solid", "fa-xmark", "tag-chip__remove"], ["title", "Remove tag", 1, "fa-solid", "fa-xmark", "tag-chip__remove", 3, "click"], ["type", "text", "placeholder", "Add tag\u2026", 1, "tag-chip-add__input", 3, "ngModelChange", "keydown.enter", "ngModel"], [1, "tag-chip-add__suggestions"], ["type", "button", 1, "tag-chip-add__suggestion"], ["type", "button", "title", "Create a new tag with this name", 1, "tag-chip-add__suggestion", "tag-chip-add__suggestion--create"], ["type", "button", 1, "tag-chip-add__suggestion", 3, "click"], ["type", "button", "title", "Create a new tag with this name", 1, "tag-chip-add__suggestion", "tag-chip-add__suggestion--create", 3, "click"], [1, "fa-solid", "fa-plus"]], template: function TagChipsComponent_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tag-chips.component.js","sourceRoot":"","sources":["../../../../src/lib/components/tag-chips/tag-chips.component.ts","../../../../src/lib/components/tag-chips/tag-chips.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 { LogError, Metadata, RunView } from '@memberjunction/core';\nimport type { MJTagEntity, MJTaggedItemEntity } from '@memberjunction/core-entities';\n\n/**\n * Compact tag chips for a single record (mockup 22). Loads tags by\n * querying `MJ: Tagged Items` filtered to `(EntityID, RecordID)`, then\n * resolves names from `MJ: Tags` in a single batch. Render-only by\n * default; pass `Editable=true` to surface an inline add field and\n * per-chip remove buttons.\n *\n * Intentionally lightweight — not a tag manager. For richer tag tooling\n * (cloud view, related records, etc.) use `mj-record-tags` from\n * `@memberjunction/ng-record-tags`.\n */\n\ninterface DisplayTag {\n /** TaggedItem row ID — used for removal. */\n TaggedItemID: string;\n /** Tag.ID — useful for downstream filtering / lookups. */\n TagID: string;\n /** Tag display name. */\n Name: string;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-tag-chips',\n templateUrl: './tag-chips.component.html',\n styleUrls: ['./tag-chips.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TagChipsComponent extends BaseAngularComponent implements OnInit {\n private readonly cdr = inject(ChangeDetectorRef);\n\n /** Entity name (e.g. 'MJ: Lists'). Required. */\n @Input()\n set EntityName(value: string | null) {\n if (this._entityName !== value) {\n this._entityName = value;\n if (this.initialized && value && this._recordId) void this.loadTags();\n }\n }\n get EntityName(): string | null {\n return this._entityName;\n }\n private _entityName: string | null = null;\n\n /** Record ID (the row's primary key, serialized). Required. */\n @Input()\n set RecordID(value: string | null) {\n if (this._recordId !== value) {\n this._recordId = value;\n if (this.initialized && value && this._entityName) void this.loadTags();\n }\n }\n get RecordID(): string | null {\n return this._recordId;\n }\n private _recordId: string | null = null;\n\n /** When true, shows add input + remove buttons on chips. */\n @Input() Editable = false;\n\n /** Cap visible chips and surface \"+N more\". Defaults to 6 for cards. */\n @Input() MaxDisplay = 6;\n\n /** Emitted when a chip is clicked. Lets the parent drive filter-by-tag. */\n @Output() TagClicked = new EventEmitter<{ TagID: string; Name: string }>();\n\n /** Emitted after add/remove so parents can refresh dependent data. */\n @Output() TagsChanged = new EventEmitter<void>();\n\n public tags: DisplayTag[] = [];\n public loading = false;\n public addInput = '';\n public suggestions: MJTagEntity[] = [];\n public showSuggestions = false;\n /** True when the trimmed input doesn't exactly match any existing tag —\n * drives the \"Create '<term>'\" affordance at the top of the dropdown. */\n public canCreateNew = false;\n\n private initialized = false;\n private entityID: string | null = null;\n\n async ngOnInit(): Promise<void> {\n this.initialized = true;\n if (this._entityName && this._recordId) await this.loadTags();\n }\n\n public get displayedTags(): DisplayTag[] {\n return this.tags.slice(0, this.MaxDisplay);\n }\n\n public get extraTagCount(): number {\n return Math.max(0, this.tags.length - this.MaxDisplay);\n }\n\n public OnTagClick(tag: DisplayTag): void {\n this.TagClicked.emit({ TagID: tag.TagID, Name: tag.Name });\n }\n\n public async OnRemove(tag: DisplayTag, event: Event): Promise<void> {\n event.stopPropagation();\n if (!this.Editable) return;\n try {\n const md = this.metadata();\n const entity = await md.GetEntityObject<MJTaggedItemEntity>('MJ: Tagged Items', this.ProviderToUse.CurrentUser ?? undefined);\n const loaded = await entity.Load(tag.TaggedItemID);\n if (!loaded) return;\n const ok = await entity.Delete();\n if (ok) {\n this.tags = this.tags.filter((t) => t.TaggedItemID !== tag.TaggedItemID);\n this.TagsChanged.emit();\n this.cdr.markForCheck();\n }\n } catch (e) {\n LogError(`tag-chips: remove failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n public async OnAddInputChange(value: string): Promise<void> {\n this.addInput = value;\n const term = value.trim();\n if (term.length < 1) {\n this.suggestions = [];\n this.canCreateNew = false;\n this.showSuggestions = false;\n this.cdr.markForCheck();\n return;\n }\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const escaped = term.replace(/'/g, \"''\");\n const result = await rv.RunView<MJTagEntity>({\n EntityName: 'MJ: Tags',\n ExtraFilter: `Name LIKE '%${escaped}%'`,\n OrderBy: 'Name',\n MaxRows: 8,\n ResultType: 'entity_object',\n });\n const alreadyApplied = new Set(this.tags.map((t) => t.TagID));\n this.suggestions = (result.Results ?? []).filter((t) => !alreadyApplied.has(t.ID));\n // Offer \"Create '<term>'\" when the typed text doesn't exactly\n // match any existing tag (case-insensitive). Without this, typing\n // a brand-new tag name and hitting Enter does nothing — there's\n // no suggestion to click.\n const lowerTerm = term.toLowerCase();\n this.canCreateNew = !this.suggestions.some(\n (s) => s.Name.toLowerCase() === lowerTerm,\n );\n this.showSuggestions = true;\n } catch (e) {\n LogError(`tag-chips: suggestion lookup failed: ${e instanceof Error ? e.message : String(e)}`);\n } finally {\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Enter-key handler on the input. If suggestions are showing,\n * picks the first one (existing tag); otherwise creates a new tag\n * from the typed text and applies it. Closes the suggestion menu\n * on either path.\n */\n public async OnAddInputSubmit(event?: Event): Promise<void> {\n event?.preventDefault();\n const term = this.addInput.trim();\n if (term.length === 0) return;\n // Existing tag in suggestions takes priority — Enter selects the\n // first match (matching most autocomplete UIs).\n if (this.suggestions.length > 0) {\n await this.OnAddTag(this.suggestions[0]);\n return;\n }\n if (this.canCreateNew) {\n await this.CreateAndAddTag(term);\n }\n }\n\n public async OnAddTag(tag: MJTagEntity): Promise<void> {\n if (!this._entityName || !this._recordId) return;\n await this.applyTagToRecord(tag.ID, tag.Name);\n }\n\n /** Click handler for the \"Create '<term>'\" affordance. Creates the\n * `MJ: Tags` row then attaches it via the standard apply path. */\n public async OnCreateNew(): Promise<void> {\n const term = this.addInput.trim();\n if (term.length === 0) return;\n await this.CreateAndAddTag(term);\n }\n\n private async CreateAndAddTag(name: string): Promise<void> {\n if (!this._entityName || !this._recordId) return;\n try {\n const md = this.metadata();\n const tag = await md.GetEntityObject<MJTagEntity>('MJ: Tags', this.ProviderToUse.CurrentUser ?? undefined);\n tag.NewRecord();\n tag.Name = name;\n // MJ: Tags requires both Name (canonical) and DisplayName (UI).\n // Default DisplayName to the same text the user typed — they can\n // refine it later via the Tags entity editor if needed.\n tag.DisplayName = name;\n const ok = await tag.Save();\n if (!ok) {\n LogError(`tag-chips: create-tag save failed: ${tag.LatestResult?.CompleteMessage ?? 'unknown'}`);\n return;\n }\n await this.applyTagToRecord(tag.ID, tag.Name);\n } catch (e) {\n LogError(`tag-chips: create-and-add failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n private async applyTagToRecord(tagId: string, tagName: string): Promise<void> {\n if (!this._entityName || !this._recordId) return;\n try {\n const md = this.metadata();\n const entity = await md.GetEntityObject<MJTaggedItemEntity>('MJ: Tagged Items', this.ProviderToUse.CurrentUser ?? undefined);\n entity.NewRecord();\n entity.TagID = tagId;\n entity.RecordID = this._recordId;\n const entityInfo = md.EntityByName(this._entityName);\n if (entityInfo) entity.EntityID = entityInfo.ID;\n entity.Weight = 1.0;\n const ok = await entity.Save();\n if (!ok) {\n LogError(`tag-chips: attach-tag save failed: ${entity.LatestResult?.CompleteMessage ?? 'unknown'}`);\n return;\n }\n this.tags = [...this.tags, { TaggedItemID: entity.ID, TagID: tagId, Name: tagName }];\n this.addInput = '';\n this.suggestions = [];\n this.canCreateNew = false;\n this.showSuggestions = false;\n this.TagsChanged.emit();\n this.cdr.markForCheck();\n } catch (e) {\n LogError(`tag-chips: apply failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n /**\n * Bulk-load tags + their names in two RunViews — one for the join\n * rows and one to resolve display names. Cheap; this typically returns\n * fewer than 10 rows.\n */\n private async loadTags(): Promise<void> {\n if (!this._entityName || !this._recordId) {\n this.tags = [];\n return;\n }\n this.loading = true;\n this.cdr.markForCheck();\n try {\n const md = this.metadata();\n const entityInfo = md.EntityByName(this._entityName);\n if (!entityInfo) {\n this.tags = [];\n return;\n }\n this.entityID = entityInfo.ID;\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const recordIdEscaped = this._recordId.replace(/'/g, \"''\");\n const joinResult = await rv.RunView<{ ID: string; TagID: string }>({\n EntityName: 'MJ: Tagged Items',\n ExtraFilter: `EntityID='${entityInfo.ID}' AND RecordID='${recordIdEscaped}'`,\n Fields: ['ID', 'TagID'],\n ResultType: 'simple',\n });\n if (!joinResult.Success) {\n this.tags = [];\n return;\n }\n const rows = joinResult.Results ?? [];\n if (rows.length === 0) {\n this.tags = [];\n return;\n }\n const tagIds = Array.from(new Set(rows.map((r) => String(r.TagID))));\n const tagsResult = await rv.RunView<{ ID: string; Name: string }>({\n EntityName: 'MJ: Tags',\n ExtraFilter: `ID IN (${tagIds.map((id) => `'${id}'`).join(',')})`,\n Fields: ['ID', 'Name'],\n ResultType: 'simple',\n });\n const nameById = new Map<string, string>();\n for (const t of tagsResult.Results ?? []) nameById.set(String(t.ID), String(t.Name));\n this.tags = rows\n .map((r) => ({\n TaggedItemID: String(r.ID),\n TagID: String(r.TagID),\n Name: nameById.get(String(r.TagID)) ?? '(unknown tag)',\n }))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n } finally {\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n private metadata(): Metadata {\n return (this.ProviderToUse as unknown as Metadata) ?? new Metadata();\n }\n}\n","<div class=\"tag-chips\" [class.tag-chips--loading]=\"loading\">\n @for (tag of displayedTags; track tag.TaggedItemID) {\n <span class=\"tag-chip\" (click)=\"OnTagClick(tag)\">\n <i class=\"fa-solid fa-tag\"></i>\n <span class=\"tag-chip__name\">{{ tag.Name }}</span>\n @if (Editable) {\n <i\n class=\"fa-solid fa-xmark tag-chip__remove\"\n title=\"Remove tag\"\n (click)=\"OnRemove(tag, $event)\"></i>\n }\n </span>\n }\n\n @if (extraTagCount > 0) {\n <span class=\"tag-chip tag-chip--more\">+{{ extraTagCount }} more</span>\n }\n\n @if (Editable) {\n <div class=\"tag-chip-add\">\n <input\n type=\"text\"\n class=\"tag-chip-add__input\"\n [(ngModel)]=\"addInput\"\n (ngModelChange)=\"OnAddInputChange($event)\"\n (keydown.enter)=\"OnAddInputSubmit($event)\"\n placeholder=\"Add tag…\" />\n @if (showSuggestions && (suggestions.length > 0 || canCreateNew)) {\n <div class=\"tag-chip-add__suggestions\">\n @for (s of suggestions; track s.ID) {\n <button class=\"tag-chip-add__suggestion\" (click)=\"OnAddTag(s)\" type=\"button\">\n <i class=\"fa-solid fa-tag\"></i>\n {{ s.Name }}\n </button>\n }\n @if (canCreateNew) {\n <button\n class=\"tag-chip-add__suggestion tag-chip-add__suggestion--create\"\n (click)=\"OnCreateNew()\"\n type=\"button\"\n title=\"Create a new tag with this name\">\n <i class=\"fa-solid fa-plus\"></i>\n Create \"{{ addInput.trim() }}\"\n </button>\n }\n </div>\n }\n </div>\n }\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"tag-chips.component.js","sourceRoot":"","sources":["../../../../src/lib/components/tag-chips/tag-chips.component.ts","../../../../src/lib/components/tag-chips/tag-chips.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 { LogError, Metadata, RunView } from '@memberjunction/core';\nimport type { MJTagEntity, MJTaggedItemEntity } from '@memberjunction/core-entities';\n\n/**\n * Compact tag chips for a single record (mockup 22). Loads tags by\n * querying `MJ: Tagged Items` filtered to `(EntityID, RecordID)`, then\n * resolves names from `MJ: Tags` in a single batch. Render-only by\n * default; pass `Editable=true` to surface an inline add field and\n * per-chip remove buttons.\n *\n * Intentionally lightweight — not a tag manager. For richer tag tooling\n * (cloud view, related records, etc.) use `mj-record-tags` from\n * `@memberjunction/ng-record-tags`.\n */\n\ninterface DisplayTag {\n /** TaggedItem row ID — used for removal. */\n TaggedItemID: string;\n /** Tag.ID — useful for downstream filtering / lookups. */\n TagID: string;\n /** Tag display name. */\n Name: string;\n}\n\n@Component({\n standalone: false,\n selector: 'mj-tag-chips',\n templateUrl: './tag-chips.component.html',\n styleUrls: ['./tag-chips.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class TagChipsComponent extends BaseAngularComponent implements OnInit {\n private readonly cdr = inject(ChangeDetectorRef);\n\n /** Entity name (e.g. 'MJ: Lists'). Required. */\n @Input()\n set EntityName(value: string | null) {\n if (this._entityName !== value) {\n this._entityName = value;\n if (this.initialized && value && this._recordId) void this.loadTags();\n }\n }\n get EntityName(): string | null {\n return this._entityName;\n }\n private _entityName: string | null = null;\n\n /** Record ID (the row's primary key, serialized). Required. */\n @Input()\n set RecordID(value: string | null) {\n if (this._recordId !== value) {\n this._recordId = value;\n if (this.initialized && value && this._entityName) void this.loadTags();\n }\n }\n get RecordID(): string | null {\n return this._recordId;\n }\n private _recordId: string | null = null;\n\n /** When true, shows add input + remove buttons on chips. */\n @Input() Editable = false;\n\n /** Cap visible chips and surface \"+N more\". Defaults to 6 for cards. */\n @Input() MaxDisplay = 6;\n\n /** Emitted when a chip is clicked. Lets the parent drive filter-by-tag. */\n @Output() TagClicked = new EventEmitter<{ TagID: string; Name: string }>();\n\n /** Emitted after add/remove so parents can refresh dependent data. */\n @Output() TagsChanged = new EventEmitter<void>();\n\n public tags: DisplayTag[] = [];\n public loading = false;\n public addInput = '';\n public suggestions: MJTagEntity[] = [];\n public showSuggestions = false;\n /** True when the trimmed input doesn't exactly match any existing tag —\n * drives the \"Create '<term>'\" affordance at the top of the dropdown. */\n public canCreateNew = false;\n\n private initialized = false;\n private entityID: string | null = null;\n\n async ngOnInit(): Promise<void> {\n this.initialized = true;\n if (this._entityName && this._recordId) await this.loadTags();\n }\n\n public get displayedTags(): DisplayTag[] {\n return this.tags.slice(0, this.MaxDisplay);\n }\n\n public get extraTagCount(): number {\n return Math.max(0, this.tags.length - this.MaxDisplay);\n }\n\n public OnTagClick(tag: DisplayTag): void {\n this.TagClicked.emit({ TagID: tag.TagID, Name: tag.Name });\n }\n\n public async OnRemove(tag: DisplayTag, event: Event): Promise<void> {\n event.stopPropagation();\n if (!this.Editable) return;\n try {\n const md = this.metadata();\n const entity = await md.GetEntityObject<MJTaggedItemEntity>('MJ: Tagged Items', this.ProviderToUse.CurrentUser ?? undefined);\n const loaded = await entity.Load(tag.TaggedItemID);\n if (!loaded) return;\n const ok = await entity.Delete();\n if (ok) {\n this.tags = this.tags.filter((t) => t.TaggedItemID !== tag.TaggedItemID);\n this.TagsChanged.emit();\n this.cdr.markForCheck();\n }\n } catch (e) {\n LogError(`tag-chips: remove failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n public async OnAddInputChange(value: string): Promise<void> {\n this.addInput = value;\n const term = value.trim();\n if (term.length < 1) {\n this.suggestions = [];\n this.canCreateNew = false;\n this.showSuggestions = false;\n this.cdr.markForCheck();\n return;\n }\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const escaped = term.replace(/'/g, \"''\");\n const result = await rv.RunView<MJTagEntity>({\n EntityName: 'MJ: Tags',\n ExtraFilter: `Name LIKE '%${escaped}%'`,\n OrderBy: 'Name',\n MaxRows: 8,\n ResultType: 'entity_object',\n });\n const alreadyApplied = new Set(this.tags.map((t) => t.TagID));\n this.suggestions = (result.Results ?? []).filter((t) => !alreadyApplied.has(t.ID));\n // Offer \"Create '<term>'\" when the typed text doesn't exactly\n // match any existing tag (case-insensitive). Without this, typing\n // a brand-new tag name and hitting Enter does nothing — there's\n // no suggestion to click.\n const lowerTerm = term.toLowerCase();\n this.canCreateNew = !this.suggestions.some(\n (s) => s.Name.toLowerCase() === lowerTerm,\n );\n this.showSuggestions = true;\n } catch (e) {\n LogError(`tag-chips: suggestion lookup failed: ${e instanceof Error ? e.message : String(e)}`);\n } finally {\n this.cdr.markForCheck();\n }\n }\n\n /**\n * Enter-key handler on the input. If suggestions are showing,\n * picks the first one (existing tag); otherwise creates a new tag\n * from the typed text and applies it. Closes the suggestion menu\n * on either path.\n */\n public async OnAddInputSubmit(event?: Event): Promise<void> {\n event?.preventDefault();\n const term = this.addInput.trim();\n if (term.length === 0) return;\n // Existing tag in suggestions takes priority — Enter selects the\n // first match (matching most autocomplete UIs).\n if (this.suggestions.length > 0) {\n await this.OnAddTag(this.suggestions[0]);\n return;\n }\n if (this.canCreateNew) {\n await this.CreateAndAddTag(term);\n }\n }\n\n public async OnAddTag(tag: MJTagEntity): Promise<void> {\n if (!this._entityName || !this._recordId) return;\n await this.applyTagToRecord(tag.ID, tag.Name);\n }\n\n /** Click handler for the \"Create '<term>'\" affordance. Creates the\n * `MJ: Tags` row then attaches it via the standard apply path. */\n public async OnCreateNew(): Promise<void> {\n const term = this.addInput.trim();\n if (term.length === 0) return;\n await this.CreateAndAddTag(term);\n }\n\n private async CreateAndAddTag(name: string): Promise<void> {\n if (!this._entityName || !this._recordId) return;\n try {\n const md = this.metadata();\n const tag = await md.GetEntityObject<MJTagEntity>('MJ: Tags', this.ProviderToUse.CurrentUser ?? undefined);\n tag.NewRecord();\n tag.Name = name;\n // MJ: Tags requires both Name (canonical) and DisplayName (UI).\n // Default DisplayName to the same text the user typed — they can\n // refine it later via the Tags entity editor if needed.\n tag.DisplayName = name;\n const ok = await tag.Save();\n if (!ok) {\n LogError(`tag-chips: create-tag save failed: ${tag.LatestResult?.CompleteMessage ?? 'unknown'}`);\n return;\n }\n await this.applyTagToRecord(tag.ID, tag.Name);\n } catch (e) {\n LogError(`tag-chips: create-and-add failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n private async applyTagToRecord(tagId: string, tagName: string): Promise<void> {\n if (!this._entityName || !this._recordId) return;\n try {\n const md = this.metadata();\n const entity = await md.GetEntityObject<MJTaggedItemEntity>('MJ: Tagged Items', this.ProviderToUse.CurrentUser ?? undefined);\n entity.NewRecord();\n entity.TagID = tagId;\n entity.RecordID = this._recordId;\n const entityInfo = md.EntityByName(this._entityName);\n if (entityInfo) entity.EntityID = entityInfo.ID;\n entity.Weight = 1.0;\n const ok = await entity.Save();\n if (!ok) {\n LogError(`tag-chips: attach-tag save failed: ${entity.LatestResult?.CompleteMessage ?? 'unknown'}`);\n return;\n }\n this.tags = [...this.tags, { TaggedItemID: entity.ID, TagID: tagId, Name: tagName }];\n this.addInput = '';\n this.suggestions = [];\n this.canCreateNew = false;\n this.showSuggestions = false;\n this.TagsChanged.emit();\n this.cdr.markForCheck();\n } catch (e) {\n LogError(`tag-chips: apply failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n /**\n * Bulk-load tags + their names in two RunViews — one for the join\n * rows and one to resolve display names. Cheap; this typically returns\n * fewer than 10 rows.\n */\n private async loadTags(): Promise<void> {\n if (!this._entityName || !this._recordId) {\n this.tags = [];\n return;\n }\n this.loading = true;\n this.cdr.markForCheck();\n try {\n const md = this.metadata();\n const entityInfo = md.EntityByName(this._entityName);\n if (!entityInfo) {\n this.tags = [];\n return;\n }\n this.entityID = entityInfo.ID;\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const recordIdEscaped = this._recordId.replace(/'/g, \"''\");\n const joinResult = await rv.RunView<{ ID: string; TagID: string }>({\n EntityName: 'MJ: Tagged Items',\n ExtraFilter: `EntityID='${entityInfo.ID}' AND RecordID='${recordIdEscaped}'`,\n Fields: ['ID', 'TagID'],\n ResultType: 'simple',\n });\n if (!joinResult.Success) {\n this.tags = [];\n return;\n }\n const rows = joinResult.Results ?? [];\n if (rows.length === 0) {\n this.tags = [];\n return;\n }\n const tagIds = Array.from(new Set(rows.map((r) => String(r.TagID))));\n const tagsResult = await rv.RunView<{ ID: string; Name: string }>({\n EntityName: 'MJ: Tags',\n ExtraFilter: `ID IN (${tagIds.map((id) => `'${id}'`).join(',')})`,\n Fields: ['ID', 'Name'],\n ResultType: 'simple',\n });\n const nameById = new Map<string, string>();\n for (const t of tagsResult.Results ?? []) nameById.set(String(t.ID), String(t.Name));\n this.tags = rows\n .map((r) => ({\n TaggedItemID: String(r.ID),\n TagID: String(r.TagID),\n Name: nameById.get(String(r.TagID)) ?? '(unknown tag)',\n }))\n .sort((a, b) => a.Name.localeCompare(b.Name));\n } finally {\n this.loading = false;\n this.cdr.markForCheck();\n }\n }\n\n private metadata(): Metadata {\n // ProviderToUse always resolves (it falls back to the global default itself), so a\n // `?? new Metadata()` arm here was dead code that would have defeated an injected provider.\n return this.ProviderToUse as unknown as Metadata;\n }\n}\n","<div class=\"tag-chips\" [class.tag-chips--loading]=\"loading\">\n @for (tag of displayedTags; track tag.TaggedItemID) {\n <span class=\"tag-chip\" (click)=\"OnTagClick(tag)\">\n <i class=\"fa-solid fa-tag\"></i>\n <span class=\"tag-chip__name\">{{ tag.Name }}</span>\n @if (Editable) {\n <i\n class=\"fa-solid fa-xmark tag-chip__remove\"\n title=\"Remove tag\"\n (click)=\"OnRemove(tag, $event)\"></i>\n }\n </span>\n }\n\n @if (extraTagCount > 0) {\n <span class=\"tag-chip tag-chip--more\">+{{ extraTagCount }} more</span>\n }\n\n @if (Editable) {\n <div class=\"tag-chip-add\">\n <input\n type=\"text\"\n class=\"tag-chip-add__input\"\n [(ngModel)]=\"addInput\"\n (ngModelChange)=\"OnAddInputChange($event)\"\n (keydown.enter)=\"OnAddInputSubmit($event)\"\n placeholder=\"Add tag…\" />\n @if (showSuggestions && (suggestions.length > 0 || canCreateNew)) {\n <div class=\"tag-chip-add__suggestions\">\n @for (s of suggestions; track s.ID) {\n <button class=\"tag-chip-add__suggestion\" (click)=\"OnAddTag(s)\" type=\"button\">\n <i class=\"fa-solid fa-tag\"></i>\n {{ s.Name }}\n </button>\n }\n @if (canCreateNew) {\n <button\n class=\"tag-chip-add__suggestion tag-chip-add__suggestion--create\"\n (click)=\"OnCreateNew()\"\n type=\"button\"\n title=\"Create a new tag with this name\">\n <i class=\"fa-solid fa-plus\"></i>\n Create \"{{ addInput.trim() }}\"\n </button>\n }\n </div>\n }\n </div>\n }\n</div>\n"]}
|
package/package.json
CHANGED
|
@@ -1,17 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-list-management",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.1.0-edge.0",
|
|
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",
|
|
7
7
|
"files": [
|
|
8
8
|
"/dist"
|
|
9
9
|
],
|
|
10
|
-
"scripts": {
|
|
11
|
-
"test": "vitest run",
|
|
12
|
-
"build": "ngc",
|
|
13
|
-
"test:watch": "vitest"
|
|
14
|
-
},
|
|
15
10
|
"keywords": [
|
|
16
11
|
"MemberJunction",
|
|
17
12
|
"Angular",
|
|
@@ -23,32 +18,37 @@
|
|
|
23
18
|
"devDependencies": {
|
|
24
19
|
"@angular/compiler": "21.1.3",
|
|
25
20
|
"@angular/compiler-cli": "21.1.3",
|
|
26
|
-
"@memberjunction/ng-test-utils": "
|
|
21
|
+
"@memberjunction/ng-test-utils": "6.1.0-edge.0",
|
|
27
22
|
"vitest": "^4.0.18"
|
|
28
23
|
},
|
|
29
24
|
"peerDependencies": {
|
|
30
25
|
"@angular/common": "21.1.3",
|
|
31
26
|
"@angular/core": "21.1.3",
|
|
32
27
|
"@angular/forms": "21.1.3",
|
|
33
|
-
"@angular/router": "21.1.3",
|
|
34
28
|
"rxjs": "^7.8.2"
|
|
35
29
|
},
|
|
36
30
|
"dependencies": {
|
|
37
|
-
"@memberjunction/core": "
|
|
38
|
-
"@memberjunction/core-entities": "
|
|
39
|
-
"@memberjunction/global": "
|
|
40
|
-
"@memberjunction/graphql-dataprovider": "
|
|
41
|
-
"@memberjunction/lists-base": "
|
|
42
|
-
"@memberjunction/ng-base-types": "
|
|
43
|
-
"@memberjunction/ng-container-directives": "
|
|
44
|
-
"@memberjunction/ng-shared": "
|
|
45
|
-
"@memberjunction/ng-
|
|
46
|
-
"@memberjunction/ng-ui-components": "5.51.0",
|
|
31
|
+
"@memberjunction/core": "6.1.0-edge.0",
|
|
32
|
+
"@memberjunction/core-entities": "6.1.0-edge.0",
|
|
33
|
+
"@memberjunction/global": "6.1.0-edge.0",
|
|
34
|
+
"@memberjunction/graphql-dataprovider": "6.1.0-edge.0",
|
|
35
|
+
"@memberjunction/lists-base": "6.1.0-edge.0",
|
|
36
|
+
"@memberjunction/ng-base-types": "6.1.0-edge.0",
|
|
37
|
+
"@memberjunction/ng-container-directives": "6.1.0-edge.0",
|
|
38
|
+
"@memberjunction/ng-shared-generic": "6.1.0-edge.0",
|
|
39
|
+
"@memberjunction/ng-ui-components": "6.1.0-edge.0",
|
|
47
40
|
"tslib": "^2.8.1"
|
|
48
41
|
},
|
|
49
42
|
"sideEffects": false,
|
|
50
43
|
"repository": {
|
|
51
44
|
"type": "git",
|
|
52
45
|
"url": "https://github.com/MemberJunction/MJ"
|
|
46
|
+
},
|
|
47
|
+
"mjUILayer": "widgets",
|
|
48
|
+
"scripts": {
|
|
49
|
+
"test": "vitest run",
|
|
50
|
+
"test:types": "tsc --noEmit -p tsconfig.spec.json",
|
|
51
|
+
"build": "ngc",
|
|
52
|
+
"test:watch": "vitest"
|
|
53
53
|
}
|
|
54
|
-
}
|
|
54
|
+
}
|