@memberjunction/ng-artifacts 5.30.1 → 5.32.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/dist/lib/components/artifact-message-card.component.d.ts +2 -1
- package/dist/lib/components/artifact-message-card.component.d.ts.map +1 -1
- package/dist/lib/components/artifact-message-card.component.js +7 -5
- package/dist/lib/components/artifact-message-card.component.js.map +1 -1
- package/dist/lib/components/artifact-type-plugin-viewer.component.d.ts +2 -1
- package/dist/lib/components/artifact-type-plugin-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/artifact-type-plugin-viewer.component.js +7 -6
- package/dist/lib/components/artifact-type-plugin-viewer.component.js.map +1 -1
- package/dist/lib/components/artifact-version-history.component.d.ts +2 -1
- package/dist/lib/components/artifact-version-history.component.d.ts.map +1 -1
- package/dist/lib/components/artifact-version-history.component.js +6 -5
- package/dist/lib/components/artifact-version-history.component.js.map +1 -1
- package/dist/lib/components/artifact-viewer-panel.component.d.ts +2 -1
- package/dist/lib/components/artifact-viewer-panel.component.d.ts.map +1 -1
- package/dist/lib/components/artifact-viewer-panel.component.js +18 -16
- package/dist/lib/components/artifact-viewer-panel.component.js.map +1 -1
- package/dist/lib/components/base-artifact-viewer.component.d.ts +2 -1
- package/dist/lib/components/base-artifact-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/base-artifact-viewer.component.js +5 -4
- package/dist/lib/components/base-artifact-viewer.component.js.map +1 -1
- package/dist/lib/components/plugins/component-artifact-viewer.component.d.ts +5 -0
- package/dist/lib/components/plugins/component-artifact-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/plugins/component-artifact-viewer.component.js +5 -0
- package/dist/lib/components/plugins/component-artifact-viewer.component.js.map +1 -1
- package/dist/lib/components/plugins/component-feedback-panel/component-feedback-panel.component.d.ts +2 -1
- package/dist/lib/components/plugins/component-feedback-panel/component-feedback-panel.component.d.ts.map +1 -1
- package/dist/lib/components/plugins/component-feedback-panel/component-feedback-panel.component.js +7 -7
- package/dist/lib/components/plugins/component-feedback-panel/component-feedback-panel.component.js.map +1 -1
- package/dist/lib/components/plugins/data-artifact-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/plugins/data-artifact-viewer.component.js +6 -6
- package/dist/lib/components/plugins/data-artifact-viewer.component.js.map +1 -1
- package/dist/lib/components/plugins/json-artifact-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/plugins/json-artifact-viewer.component.js +2 -2
- package/dist/lib/components/plugins/json-artifact-viewer.component.js.map +1 -1
- package/dist/lib/components/plugins/save-query-dialog.component.d.ts +2 -1
- package/dist/lib/components/plugins/save-query-dialog.component.d.ts.map +1 -1
- package/dist/lib/components/plugins/save-query-dialog.component.js +8 -6
- package/dist/lib/components/plugins/save-query-dialog.component.js.map +1 -1
- package/dist/lib/services/analyze-artifact.service.d.ts +7 -1
- package/dist/lib/services/analyze-artifact.service.d.ts.map +1 -1
- package/dist/lib/services/analyze-artifact.service.js +12 -2
- package/dist/lib/services/analyze-artifact.service.js.map +1 -1
- package/package.json +16 -16
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { EventEmitter, OnInit, OnDestroy } from '@angular/core';
|
|
2
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
2
3
|
import { MJArtifactEntity, MJArtifactVersionEntity } from '@memberjunction/core-entities';
|
|
3
4
|
import { UserInfo } from '@memberjunction/core';
|
|
4
5
|
import { ArtifactIconService } from '../services/artifact-icon.service';
|
|
@@ -7,7 +8,7 @@ import * as i0 from "@angular/core";
|
|
|
7
8
|
* Artifact message card component - displays a simple info bar for artifacts in conversation messages.
|
|
8
9
|
* Shows artifact icon, name, type badge, and version. Click to open full artifact viewer.
|
|
9
10
|
*/
|
|
10
|
-
export declare class ArtifactMessageCardComponent implements OnInit, OnDestroy {
|
|
11
|
+
export declare class ArtifactMessageCardComponent extends BaseAngularComponent implements OnInit, OnDestroy {
|
|
11
12
|
private artifactIconService;
|
|
12
13
|
artifactId: string;
|
|
13
14
|
versionNumber?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-message-card.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/artifact-message-card.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC1F,OAAO,EAAE,QAAQ,EAAW,MAAM,sBAAsB,CAAC;AAGzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;;AAExE;;;GAGG;AACH,qBA0Ka,4BAA6B,YAAW,MAAM,EAAE,SAAS;
|
|
1
|
+
{"version":3,"file":"artifact-message-card.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/artifact-message-card.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC1F,OAAO,EAAE,QAAQ,EAAW,MAAM,sBAAsB,CAAC;AAGzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;;AAExE;;;GAGG;AACH,qBA0Ka,4BAA6B,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAerF,OAAO,CAAC,mBAAmB;IAd9B,UAAU,EAAG,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAG,QAAQ,CAAC;IACvB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,eAAe,CAAC,EAAE,uBAAuB,CAAC;IACzC,eAAe;gBAA6B,MAAM;kBAAY,gBAAgB;kBAAY,uBAAuB;OAAK;IAEzH,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IAC1C,eAAe,EAAE,uBAAuB,GAAG,IAAI,CAAQ;IACvD,OAAO,UAAQ;IACf,KAAK,UAAS;IAErB,OAAO,CAAC,QAAQ,CAAuB;gBAEnB,mBAAmB,EAAE,mBAAmB;IAGtD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAa/B,IAAW,cAAc,IAAI,gBAAgB,GAAG,IAAI,CAEnD;IAED,IAAW,cAAc,IAAI,uBAAuB,GAAG,IAAI,CAE1D;IAED,WAAW,IAAI,IAAI;YAKL,YAAY;YAoCZ,kBAAkB;IAyBhC;;OAEG;IACH,IAAW,WAAW,IAAI,MAAM,CAK/B;IAED;;OAEG;IACH,IAAW,kBAAkB,IAAI,MAAM,GAAG,IAAI,CAK7C;IAED,IAAW,cAAc,IAAI,OAAO,CAKnC;IAED;;;OAGG;IACI,eAAe,IAAI,MAAM;IAKzB,iBAAiB,IAAI,MAAM;IAa3B,YAAY,IAAI,IAAI;yCA1JhB,4BAA4B;2CAA5B,4BAA4B;CA+JxC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
2
3
|
import { RunView } from '@memberjunction/core';
|
|
3
4
|
import { Subject } from 'rxjs';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
@@ -52,7 +53,7 @@ function ArtifactMessageCardComponent_Conditional_3_Template(rf, ctx) { if (rf &
|
|
|
52
53
|
* Artifact message card component - displays a simple info bar for artifacts in conversation messages.
|
|
53
54
|
* Shows artifact icon, name, type badge, and version. Click to open full artifact viewer.
|
|
54
55
|
*/
|
|
55
|
-
export class ArtifactMessageCardComponent {
|
|
56
|
+
export class ArtifactMessageCardComponent extends BaseAngularComponent {
|
|
56
57
|
artifactIconService;
|
|
57
58
|
artifactId;
|
|
58
59
|
versionNumber;
|
|
@@ -66,6 +67,7 @@ export class ArtifactMessageCardComponent {
|
|
|
66
67
|
error = false;
|
|
67
68
|
destroy$ = new Subject();
|
|
68
69
|
constructor(artifactIconService) {
|
|
70
|
+
super();
|
|
69
71
|
this.artifactIconService = artifactIconService;
|
|
70
72
|
}
|
|
71
73
|
async ngOnInit() {
|
|
@@ -101,7 +103,7 @@ export class ArtifactMessageCardComponent {
|
|
|
101
103
|
this.loading = true;
|
|
102
104
|
this.error = false;
|
|
103
105
|
// Load artifact directly
|
|
104
|
-
const rv =
|
|
106
|
+
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
105
107
|
const result = await rv.RunView({
|
|
106
108
|
EntityName: 'MJ: Conversation Artifacts',
|
|
107
109
|
ExtraFilter: `ID='${this.artifactId}'`,
|
|
@@ -129,7 +131,7 @@ export class ArtifactMessageCardComponent {
|
|
|
129
131
|
if (!this._artifact)
|
|
130
132
|
return;
|
|
131
133
|
try {
|
|
132
|
-
const rv =
|
|
134
|
+
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
133
135
|
const filter = this.versionNumber
|
|
134
136
|
? `ArtifactID='${this._artifact.ID}' AND VersionNumber=${this.versionNumber}`
|
|
135
137
|
: `ArtifactID='${this._artifact.ID}'`;
|
|
@@ -202,7 +204,7 @@ export class ArtifactMessageCardComponent {
|
|
|
202
204
|
}
|
|
203
205
|
}
|
|
204
206
|
static ɵfac = function ArtifactMessageCardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ArtifactMessageCardComponent)(i0.ɵɵdirectiveInject(i1.ArtifactIconService)); };
|
|
205
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ArtifactMessageCardComponent, selectors: [["mj-artifact-message-card"]], inputs: { artifactId: "artifactId", versionNumber: "versionNumber", currentUser: "currentUser", artifact: "artifact", artifactVersion: "artifactVersion" }, outputs: { actionPerformed: "actionPerformed" }, standalone: false, decls: 4, vars: 5, consts: [[1, "artifact-message-card"], [1, "artifact-skeleton"], [1, "artifact-error"], [1, "artifact-info-bar"], [1, "skeleton-icon"], [1, "skeleton-text"], [1, "fa-solid", "fa-exclamation-circle"], [1, "artifact-info-bar", 3, "click"], [1, "artifact-icon"], [1, "fa-solid", 3, "ngClass"], [1, "artifact-info"], [1, "artifact-name"], [1, "artifact-meta"], [1, "artifact-type-badge"], [1, "artifact-version"], [1, "open-icon"], [1, "fa-solid", "fa-arrow-up-right-from-square"]], template: function ArtifactMessageCardComponent_Template(rf, ctx) { if (rf & 1) {
|
|
207
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ArtifactMessageCardComponent, selectors: [["mj-artifact-message-card"]], inputs: { artifactId: "artifactId", versionNumber: "versionNumber", currentUser: "currentUser", artifact: "artifact", artifactVersion: "artifactVersion" }, outputs: { actionPerformed: "actionPerformed" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 5, consts: [[1, "artifact-message-card"], [1, "artifact-skeleton"], [1, "artifact-error"], [1, "artifact-info-bar"], [1, "skeleton-icon"], [1, "skeleton-text"], [1, "fa-solid", "fa-exclamation-circle"], [1, "artifact-info-bar", 3, "click"], [1, "artifact-icon"], [1, "fa-solid", 3, "ngClass"], [1, "artifact-info"], [1, "artifact-name"], [1, "artifact-meta"], [1, "artifact-type-badge"], [1, "artifact-version"], [1, "open-icon"], [1, "fa-solid", "fa-arrow-up-right-from-square"]], template: function ArtifactMessageCardComponent_Template(rf, ctx) { if (rf & 1) {
|
|
206
208
|
i0.ɵɵelementStart(0, "div", 0);
|
|
207
209
|
i0.ɵɵconditionalCreate(1, ArtifactMessageCardComponent_Conditional_1_Template, 3, 0, "div", 1)(2, ArtifactMessageCardComponent_Conditional_2_Template, 4, 0, "div", 2)(3, ArtifactMessageCardComponent_Conditional_3_Template, 13, 6, "div", 3);
|
|
208
210
|
i0.ɵɵelementEnd();
|
|
@@ -260,5 +262,5 @@ export class ArtifactMessageCardComponent {
|
|
|
260
262
|
}], actionPerformed: [{
|
|
261
263
|
type: Output
|
|
262
264
|
}] }); })();
|
|
263
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ArtifactMessageCardComponent, { className: "ArtifactMessageCardComponent", filePath: "src/lib/components/artifact-message-card.component.ts", lineNumber:
|
|
265
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ArtifactMessageCardComponent, { className: "ArtifactMessageCardComponent", filePath: "src/lib/components/artifact-message-card.component.ts", lineNumber: 183 }); })();
|
|
264
266
|
//# sourceMappingURL=artifact-message-card.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-message-card.component.js","sourceRoot":"","sources":["../../../src/lib/components/artifact-message-card.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy } from '@angular/core';\nimport { MJArtifactEntity, MJArtifactVersionEntity } from '@memberjunction/core-entities';\nimport { UserInfo, RunView } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { ArtifactIconService } from '../services/artifact-icon.service';\n\n/**\n * Artifact message card component - displays a simple info bar for artifacts in conversation messages.\n * Shows artifact icon, name, type badge, and version. Click to open full artifact viewer.\n */\n@Component({\n standalone: false,\n selector: 'mj-artifact-message-card',\n template: `\n <div class=\"artifact-message-card\" [class.loading]=\"loading\" [class.error]=\"error\">\n @if (loading) {\n <div class=\"artifact-skeleton\">\n <div class=\"skeleton-icon\"></div>\n <div class=\"skeleton-text\"></div>\n </div>\n } @else if (error) {\n <div class=\"artifact-error\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <span>Failed to load artifact</span>\n </div>\n } @else if (artifact) {\n <div class=\"artifact-info-bar\" (click)=\"openFullView()\">\n <div class=\"artifact-icon\">\n <i class=\"fa-solid\" [ngClass]=\"getArtifactIcon()\"></i>\n </div>\n <div class=\"artifact-info\">\n <span class=\"artifact-name\">{{ displayName }}</span>\n <div class=\"artifact-meta\">\n <span class=\"artifact-type-badge\" [style.background]=\"getTypeBadgeColor()\">\n {{ artifact.Type }}\n </span>\n <span class=\"artifact-version\">v{{ currentVersion?.VersionNumber || 1 }}</span>\n </div>\n </div>\n <div class=\"open-icon\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n .artifact-message-card {\n margin: 12px 0;\n }\n\n .artifact-skeleton {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n }\n\n .skeleton-icon {\n width: 32px;\n height: 32px;\n background: var(--mj-border-default);\n border-radius: 6px;\n animation: pulse 1.5s ease-in-out infinite;\n }\n\n .skeleton-text {\n flex: 1;\n height: 32px;\n background: var(--mj-border-default);\n border-radius: 4px;\n animation: pulse 1.5s ease-in-out infinite;\n }\n\n @keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n\n .artifact-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n border-radius: 6px;\n color: var(--mj-status-error);\n font-size: 14px;\n }\n\n .artifact-error i {\n font-size: 16px;\n }\n\n .artifact-info-bar {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n cursor: pointer;\n transition: all 200ms ease;\n }\n\n .artifact-info-bar:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-sm);\n }\n\n .artifact-icon {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n flex-shrink: 0;\n color: var(--mj-text-muted);\n font-size: 16px;\n }\n\n .artifact-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n }\n\n .artifact-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .artifact-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .artifact-type-badge {\n display: inline-block;\n padding: 2px 8px;\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.5px;\n border-radius: 3px;\n text-transform: uppercase;\n }\n\n .artifact-version {\n font-size: 11px;\n color: var(--mj-text-muted);\n font-weight: 500;\n }\n\n .open-icon {\n flex-shrink: 0;\n color: var(--mj-text-disabled);\n font-size: 14px;\n transition: color 200ms ease;\n }\n\n .artifact-info-bar:hover .open-icon {\n color: var(--mj-brand-primary);\n }\n `]\n})\nexport class ArtifactMessageCardComponent implements OnInit, OnDestroy {\n @Input() artifactId!: string;\n @Input() versionNumber?: number;\n @Input() currentUser!: UserInfo;\n @Input() artifact?: MJArtifactEntity; // Optional - if provided, skips loading\n @Input() artifactVersion?: MJArtifactVersionEntity; // Optional - if provided, skips loading\n @Output() actionPerformed = new EventEmitter<{action: string; artifact: MJArtifactEntity; version?: MJArtifactVersionEntity}>();\n\n public _artifact: MJArtifactEntity | null = null;\n public _currentVersion: MJArtifactVersionEntity | null = null;\n public loading = true;\n public error = false;\n\n private destroy$ = new Subject<void>();\n\n constructor(private artifactIconService: ArtifactIconService) {}\n\n async ngOnInit(): Promise<void> {\n // If entities are provided, use them directly\n if (this.artifact && this.artifactVersion) {\n this._artifact = this.artifact;\n this._currentVersion = this.artifactVersion;\n this.loading = false;\n } else {\n // Otherwise load from database\n await this.loadArtifact();\n }\n }\n\n // Getters to access the internal properties\n public get artifactEntity(): MJArtifactEntity | null {\n return this._artifact;\n }\n\n public get currentVersion(): MJArtifactVersionEntity | null {\n return this._currentVersion;\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private async loadArtifact(): Promise<void> {\n if (!this.artifactId) {\n this.error = true;\n this.loading = false;\n return;\n }\n\n try {\n this.loading = true;\n this.error = false;\n\n // Load artifact directly\n const rv = new RunView();\n const result = await rv.RunView<MJArtifactEntity>({\n EntityName: 'MJ: Conversation Artifacts',\n ExtraFilter: `ID='${this.artifactId}'`,\n MaxRows: 1,\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (result.Success && result.Results && result.Results.length > 0) {\n this._artifact = result.Results[0];\n // Load version content\n await this.loadVersionContent();\n } else {\n this.error = true;\n }\n\n } catch (err) {\n console.error('Error loading artifact:', err);\n this.error = true;\n } finally {\n this.loading = false;\n }\n }\n\n private async loadVersionContent(): Promise<void> {\n if (!this._artifact) return;\n\n try {\n const rv = new RunView();\n const filter = this.versionNumber\n ? `ArtifactID='${this._artifact.ID}' AND VersionNumber=${this.versionNumber}`\n : `ArtifactID='${this._artifact.ID}'`;\n\n const result = await rv.RunView<MJArtifactVersionEntity>({\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: filter,\n OrderBy: 'VersionNumber DESC',\n MaxRows: 1,\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (result.Success && result.Results && result.Results.length > 0) {\n this._currentVersion = result.Results[0];\n }\n } catch (err) {\n console.error('Error loading version content:', err);\n }\n }\n\n /**\n * Get the display name - prefer version-specific name if available, otherwise use artifact name\n */\n public get displayName(): string {\n if (this._currentVersion?.Name) {\n return this._currentVersion.Name;\n }\n return this._artifact?.Name || 'Untitled';\n }\n\n /**\n * Get the display description - prefer version-specific description if available, otherwise use artifact description\n */\n public get displayDescription(): string | null {\n if (this._currentVersion?.Description) {\n return this._currentVersion.Description;\n }\n return this._artifact?.Description || null;\n }\n\n public get isCodeArtifact(): boolean {\n if (!this._artifact) return false;\n const name = this._artifact.Name?.toLowerCase() || '';\n const codeExtensions = ['.js', '.ts', '.jsx', '.tsx', '.py', '.java', '.cs', '.cpp', '.c', '.go', '.rs', '.sql', '.html', '.css', '.scss'];\n return codeExtensions.some(ext => name.endsWith(ext));\n }\n\n /**\n * Get the icon for this artifact using the centralized icon service.\n * Fallback priority: Plugin icon > Metadata icon > Hardcoded mapping > Generic icon\n */\n public getArtifactIcon(): string {\n if (!this._artifact) return 'fa-file';\n return this.artifactIconService.getArtifactIcon(this._artifact);\n }\n\n public getTypeBadgeColor(): string {\n if (!this._artifact) return '#6B7280';\n\n const type = this._artifact.Type?.toLowerCase() || '';\n\n if (type.includes('code')) return '#8B5CF6'; // Purple\n if (type.includes('report')) return '#3B82F6'; // Blue\n if (type.includes('dashboard')) return '#10B981'; // Green\n if (type.includes('document')) return '#F59E0B'; // Orange\n\n return '#6B7280'; // Gray\n }\n\n public openFullView(): void {\n if (this._artifact) {\n this.actionPerformed.emit({ action: 'open', artifact: this._artifact, version: this._currentVersion || undefined });\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"artifact-message-card.component.js","sourceRoot":"","sources":["../../../src/lib/components/artifact-message-card.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnDestroy } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { MJArtifactEntity, MJArtifactVersionEntity } from '@memberjunction/core-entities';\nimport { UserInfo, RunView } from '@memberjunction/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { ArtifactIconService } from '../services/artifact-icon.service';\n\n/**\n * Artifact message card component - displays a simple info bar for artifacts in conversation messages.\n * Shows artifact icon, name, type badge, and version. Click to open full artifact viewer.\n */\n@Component({\n standalone: false,\n selector: 'mj-artifact-message-card',\n template: `\n <div class=\"artifact-message-card\" [class.loading]=\"loading\" [class.error]=\"error\">\n @if (loading) {\n <div class=\"artifact-skeleton\">\n <div class=\"skeleton-icon\"></div>\n <div class=\"skeleton-text\"></div>\n </div>\n } @else if (error) {\n <div class=\"artifact-error\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <span>Failed to load artifact</span>\n </div>\n } @else if (artifact) {\n <div class=\"artifact-info-bar\" (click)=\"openFullView()\">\n <div class=\"artifact-icon\">\n <i class=\"fa-solid\" [ngClass]=\"getArtifactIcon()\"></i>\n </div>\n <div class=\"artifact-info\">\n <span class=\"artifact-name\">{{ displayName }}</span>\n <div class=\"artifact-meta\">\n <span class=\"artifact-type-badge\" [style.background]=\"getTypeBadgeColor()\">\n {{ artifact.Type }}\n </span>\n <span class=\"artifact-version\">v{{ currentVersion?.VersionNumber || 1 }}</span>\n </div>\n </div>\n <div class=\"open-icon\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\"></i>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n .artifact-message-card {\n margin: 12px 0;\n }\n\n .artifact-skeleton {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n }\n\n .skeleton-icon {\n width: 32px;\n height: 32px;\n background: var(--mj-border-default);\n border-radius: 6px;\n animation: pulse 1.5s ease-in-out infinite;\n }\n\n .skeleton-text {\n flex: 1;\n height: 32px;\n background: var(--mj-border-default);\n border-radius: 4px;\n animation: pulse 1.5s ease-in-out infinite;\n }\n\n @keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n\n .artifact-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: color-mix(in srgb, var(--mj-status-error) 15%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-status-error) 30%, var(--mj-bg-surface));\n border-radius: 6px;\n color: var(--mj-status-error);\n font-size: 14px;\n }\n\n .artifact-error i {\n font-size: 16px;\n }\n\n .artifact-info-bar {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n cursor: pointer;\n transition: all 200ms ease;\n }\n\n .artifact-info-bar:hover {\n border-color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-sm);\n }\n\n .artifact-icon {\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n flex-shrink: 0;\n color: var(--mj-text-muted);\n font-size: 16px;\n }\n\n .artifact-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n }\n\n .artifact-name {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .artifact-meta {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .artifact-type-badge {\n display: inline-block;\n padding: 2px 8px;\n color: var(--mj-text-inverse);\n font-size: 10px;\n font-weight: 600;\n letter-spacing: 0.5px;\n border-radius: 3px;\n text-transform: uppercase;\n }\n\n .artifact-version {\n font-size: 11px;\n color: var(--mj-text-muted);\n font-weight: 500;\n }\n\n .open-icon {\n flex-shrink: 0;\n color: var(--mj-text-disabled);\n font-size: 14px;\n transition: color 200ms ease;\n }\n\n .artifact-info-bar:hover .open-icon {\n color: var(--mj-brand-primary);\n }\n `]\n})\nexport class ArtifactMessageCardComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n @Input() artifactId!: string;\n @Input() versionNumber?: number;\n @Input() currentUser!: UserInfo;\n @Input() artifact?: MJArtifactEntity; // Optional - if provided, skips loading\n @Input() artifactVersion?: MJArtifactVersionEntity; // Optional - if provided, skips loading\n @Output() actionPerformed = new EventEmitter<{action: string; artifact: MJArtifactEntity; version?: MJArtifactVersionEntity}>();\n\n public _artifact: MJArtifactEntity | null = null;\n public _currentVersion: MJArtifactVersionEntity | null = null;\n public loading = true;\n public error = false;\n\n private destroy$ = new Subject<void>();\n\n constructor(private artifactIconService: ArtifactIconService) {\n super();}\n\n async ngOnInit(): Promise<void> {\n // If entities are provided, use them directly\n if (this.artifact && this.artifactVersion) {\n this._artifact = this.artifact;\n this._currentVersion = this.artifactVersion;\n this.loading = false;\n } else {\n // Otherwise load from database\n await this.loadArtifact();\n }\n }\n\n // Getters to access the internal properties\n public get artifactEntity(): MJArtifactEntity | null {\n return this._artifact;\n }\n\n public get currentVersion(): MJArtifactVersionEntity | null {\n return this._currentVersion;\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n private async loadArtifact(): Promise<void> {\n if (!this.artifactId) {\n this.error = true;\n this.loading = false;\n return;\n }\n\n try {\n this.loading = true;\n this.error = false;\n\n // Load artifact directly\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJArtifactEntity>({\n EntityName: 'MJ: Conversation Artifacts',\n ExtraFilter: `ID='${this.artifactId}'`,\n MaxRows: 1,\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (result.Success && result.Results && result.Results.length > 0) {\n this._artifact = result.Results[0];\n // Load version content\n await this.loadVersionContent();\n } else {\n this.error = true;\n }\n\n } catch (err) {\n console.error('Error loading artifact:', err);\n this.error = true;\n } finally {\n this.loading = false;\n }\n }\n\n private async loadVersionContent(): Promise<void> {\n if (!this._artifact) return;\n\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const filter = this.versionNumber\n ? `ArtifactID='${this._artifact.ID}' AND VersionNumber=${this.versionNumber}`\n : `ArtifactID='${this._artifact.ID}'`;\n\n const result = await rv.RunView<MJArtifactVersionEntity>({\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: filter,\n OrderBy: 'VersionNumber DESC',\n MaxRows: 1,\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (result.Success && result.Results && result.Results.length > 0) {\n this._currentVersion = result.Results[0];\n }\n } catch (err) {\n console.error('Error loading version content:', err);\n }\n }\n\n /**\n * Get the display name - prefer version-specific name if available, otherwise use artifact name\n */\n public get displayName(): string {\n if (this._currentVersion?.Name) {\n return this._currentVersion.Name;\n }\n return this._artifact?.Name || 'Untitled';\n }\n\n /**\n * Get the display description - prefer version-specific description if available, otherwise use artifact description\n */\n public get displayDescription(): string | null {\n if (this._currentVersion?.Description) {\n return this._currentVersion.Description;\n }\n return this._artifact?.Description || null;\n }\n\n public get isCodeArtifact(): boolean {\n if (!this._artifact) return false;\n const name = this._artifact.Name?.toLowerCase() || '';\n const codeExtensions = ['.js', '.ts', '.jsx', '.tsx', '.py', '.java', '.cs', '.cpp', '.c', '.go', '.rs', '.sql', '.html', '.css', '.scss'];\n return codeExtensions.some(ext => name.endsWith(ext));\n }\n\n /**\n * Get the icon for this artifact using the centralized icon service.\n * Fallback priority: Plugin icon > Metadata icon > Hardcoded mapping > Generic icon\n */\n public getArtifactIcon(): string {\n if (!this._artifact) return 'fa-file';\n return this.artifactIconService.getArtifactIcon(this._artifact);\n }\n\n public getTypeBadgeColor(): string {\n if (!this._artifact) return '#6B7280';\n\n const type = this._artifact.Type?.toLowerCase() || '';\n\n if (type.includes('code')) return '#8B5CF6'; // Purple\n if (type.includes('report')) return '#3B82F6'; // Blue\n if (type.includes('dashboard')) return '#10B981'; // Green\n if (type.includes('document')) return '#F59E0B'; // Orange\n\n return '#6B7280'; // Gray\n }\n\n public openFullView(): void {\n if (this._artifact) {\n this.actionPerformed.emit({ action: 'open', artifact: this._artifact, version: this._currentVersion || undefined });\n }\n }\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { EventEmitter, OnInit, OnChanges, SimpleChanges, ViewContainerRef } from '@angular/core';
|
|
2
2
|
import { MJArtifactVersionEntity } from '@memberjunction/core-entities';
|
|
3
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
3
4
|
import { CompositeKey } from '@memberjunction/core';
|
|
4
5
|
import { BaseArtifactViewerPluginComponent, NavigationRequest } from './base-artifact-viewer.component';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
@@ -7,7 +8,7 @@ import * as i0 from "@angular/core";
|
|
|
7
8
|
* Artifact type plugin viewer that loads the appropriate plugin based on the artifact's DriverClass.
|
|
8
9
|
* Uses MJGlobal.Instance.ClassFactory.CreateInstance() to dynamically load viewer plugins.
|
|
9
10
|
*/
|
|
10
|
-
export declare class ArtifactTypePluginViewerComponent implements OnInit, OnChanges {
|
|
11
|
+
export declare class ArtifactTypePluginViewerComponent extends BaseAngularComponent implements OnInit, OnChanges {
|
|
11
12
|
artifactVersion: MJArtifactVersionEntity;
|
|
12
13
|
artifactTypeName: string;
|
|
13
14
|
contentType?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-type-plugin-viewer.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/artifact-type-plugin-viewer.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,YAAY,EACZ,MAAM,EACN,SAAS,EACT,aAAa,EAEb,gBAAgB,EAGjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,uBAAuB,EAAgD,MAAM,+BAA+B,CAAC;AACtH,OAAO,EAA+B,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGjF,OAAO,EAAE,iCAAiC,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;;AAExG;;;GAGG;AACH,qBA2Fa,iCAAkC,YAAW,MAAM,EAAE,SAAS;
|
|
1
|
+
{"version":3,"file":"artifact-type-plugin-viewer.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/artifact-type-plugin-viewer.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,YAAY,EACZ,MAAM,EACN,SAAS,EACT,aAAa,EAEb,gBAAgB,EAGjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,uBAAuB,EAAgD,MAAM,+BAA+B,CAAC;AACtH,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAA+B,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGjF,OAAO,EAAE,iCAAiC,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;;AAExG;;;GAGG;AACH,qBA2Fa,iCAAkC,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAC7F,eAAe,EAAG,uBAAuB,CAAC;IAC1C,gBAAgB,EAAG,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAQ;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAEjB,gBAAgB;oBAAiC,MAAM;sBAAgB,YAAY;OAAK;IACxF,iBAAiB,kCAAyC;IAC1D,YAAY,qBAA4B;IACxC,WAAW,qBAA4B;IAGjD,eAAe,EAAG,gBAAgB,CAAC;IAE5B,SAAS,UAAQ;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IACnC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAQ;IAExC,OAAO,CAAC,YAAY,CAAkC;IAEtD;;OAEG;IACH,IAAW,cAAc,IAAI,iCAAiC,GAAG,IAAI,CAEpE;IAED;;;OAGG;IACH,IAAW,gBAAgB,IAAI,OAAO,CAErC;IAED;;;OAGG;IACI,kBAAkB,IAAI,IAAI;IAI3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxD,WAAW,IAAI,IAAI;IAInB;;OAEG;YACW,UAAU;IAyIxB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAMhB;;OAEG;YACW,eAAe;IAW7B;;;;;;OAMG;YACW,kBAAkB;IAyBhC;;OAEG;YACW,mBAAmB;IAiBjC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAiBzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;yCA3SjB,iCAAiC;2CAAjC,iCAAiC;CAkT7C"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Component, Input, Output, EventEmitter, ViewChild, ViewContainerRef } from '@angular/core';
|
|
2
2
|
import { ArtifactMetadataEngine } from '@memberjunction/core-entities';
|
|
3
|
-
import {
|
|
3
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
4
|
+
import { LogError } from '@memberjunction/core';
|
|
4
5
|
import { MJGlobal } from '@memberjunction/global';
|
|
5
6
|
import { BaseArtifactViewerPluginComponent } from './base-artifact-viewer.component';
|
|
6
7
|
import * as i0 from "@angular/core";
|
|
@@ -52,7 +53,7 @@ function ArtifactTypePluginViewerComponent_Conditional_2_Template(rf, ctx) { if
|
|
|
52
53
|
* Artifact type plugin viewer that loads the appropriate plugin based on the artifact's DriverClass.
|
|
53
54
|
* Uses MJGlobal.Instance.ClassFactory.CreateInstance() to dynamically load viewer plugins.
|
|
54
55
|
*/
|
|
55
|
-
export class ArtifactTypePluginViewerComponent {
|
|
56
|
+
export class ArtifactTypePluginViewerComponent extends BaseAngularComponent {
|
|
56
57
|
artifactVersion;
|
|
57
58
|
artifactTypeName;
|
|
58
59
|
contentType;
|
|
@@ -254,7 +255,7 @@ export class ArtifactTypePluginViewerComponent {
|
|
|
254
255
|
*/
|
|
255
256
|
async getArtifactTypeById(id) {
|
|
256
257
|
try {
|
|
257
|
-
const md =
|
|
258
|
+
const md = this.ProviderToUse;
|
|
258
259
|
const artifactType = await md.GetEntityObject('MJ: Artifact Types');
|
|
259
260
|
const loaded = await artifactType.Load(id);
|
|
260
261
|
if (loaded) {
|
|
@@ -296,13 +297,13 @@ export class ArtifactTypePluginViewerComponent {
|
|
|
296
297
|
}
|
|
297
298
|
this.viewerContainer.clear();
|
|
298
299
|
}
|
|
299
|
-
static ɵfac = function ArtifactTypePluginViewerComponent_Factory(__ngFactoryType__) { return
|
|
300
|
+
static ɵfac = /*@__PURE__*/ (() => { let ɵArtifactTypePluginViewerComponent_BaseFactory; return function ArtifactTypePluginViewerComponent_Factory(__ngFactoryType__) { return (ɵArtifactTypePluginViewerComponent_BaseFactory || (ɵArtifactTypePluginViewerComponent_BaseFactory = i0.ɵɵgetInheritedFactory(ArtifactTypePluginViewerComponent)))(__ngFactoryType__ || ArtifactTypePluginViewerComponent); }; })();
|
|
300
301
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ArtifactTypePluginViewerComponent, selectors: [["mj-artifact-type-plugin-viewer"]], viewQuery: function ArtifactTypePluginViewerComponent_Query(rf, ctx) { if (rf & 1) {
|
|
301
302
|
i0.ɵɵviewQuery(_c0, 7, ViewContainerRef);
|
|
302
303
|
} if (rf & 2) {
|
|
303
304
|
let _t;
|
|
304
305
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.viewerContainer = _t.first);
|
|
305
|
-
} }, inputs: { artifactVersion: "artifactVersion", artifactTypeName: "artifactTypeName", contentType: "contentType", height: "height", readonly: "readonly", cssClass: "cssClass" }, outputs: { openEntityRecord: "openEntityRecord", navigationRequest: "navigationRequest", pluginLoaded: "pluginLoaded", tabsChanged: "tabsChanged" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 5, vars: 2, consts: [["viewerContainer", ""], [1, "artifact-type-plugin-viewer"], [1, "loading-state"], [1, "error-state"], [1, "fas", "fa-spinner", "fa-spin"], [1, "fas", "fa-exclamation-triangle"], [1, "error-title"], [1, "error-details"], [1, "error-tech-details"]], template: function ArtifactTypePluginViewerComponent_Template(rf, ctx) { if (rf & 1) {
|
|
306
|
+
} }, inputs: { artifactVersion: "artifactVersion", artifactTypeName: "artifactTypeName", contentType: "contentType", height: "height", readonly: "readonly", cssClass: "cssClass" }, outputs: { openEntityRecord: "openEntityRecord", navigationRequest: "navigationRequest", pluginLoaded: "pluginLoaded", tabsChanged: "tabsChanged" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 5, vars: 2, consts: [["viewerContainer", ""], [1, "artifact-type-plugin-viewer"], [1, "loading-state"], [1, "error-state"], [1, "fas", "fa-spinner", "fa-spin"], [1, "fas", "fa-exclamation-triangle"], [1, "error-title"], [1, "error-details"], [1, "error-tech-details"]], template: function ArtifactTypePluginViewerComponent_Template(rf, ctx) { if (rf & 1) {
|
|
306
307
|
i0.ɵɵelementStart(0, "div", 1);
|
|
307
308
|
i0.ɵɵconditionalCreate(1, ArtifactTypePluginViewerComponent_Conditional_1_Template, 4, 0, "div", 2);
|
|
308
309
|
i0.ɵɵconditionalCreate(2, ArtifactTypePluginViewerComponent_Conditional_2_Template, 6, 3, "div", 3);
|
|
@@ -364,5 +365,5 @@ export class ArtifactTypePluginViewerComponent {
|
|
|
364
365
|
type: ViewChild,
|
|
365
366
|
args: ['viewerContainer', { read: ViewContainerRef, static: true }]
|
|
366
367
|
}] }); })();
|
|
367
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ArtifactTypePluginViewerComponent, { className: "ArtifactTypePluginViewerComponent", filePath: "src/lib/components/artifact-type-plugin-viewer.component.ts", lineNumber:
|
|
368
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ArtifactTypePluginViewerComponent, { className: "ArtifactTypePluginViewerComponent", filePath: "src/lib/components/artifact-type-plugin-viewer.component.ts", lineNumber: 116 }); })();
|
|
368
369
|
//# sourceMappingURL=artifact-type-plugin-viewer.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-type-plugin-viewer.component.js","sourceRoot":"","sources":["../../../src/lib/components/artifact-type-plugin-viewer.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnChanges,\n SimpleChanges,\n ViewChild,\n ViewContainerRef,\n ComponentRef,\n Type\n} from '@angular/core';\nimport { MJArtifactVersionEntity, MJArtifactTypeEntity, ArtifactMetadataEngine } from '@memberjunction/core-entities';\nimport { Metadata, LogError, RunView, CompositeKey } from '@memberjunction/core';\nimport { MJGlobal } from '@memberjunction/global';\nimport { IArtifactViewerComponent } from '../interfaces/artifact-viewer-plugin.interface';\nimport { BaseArtifactViewerPluginComponent, NavigationRequest } from './base-artifact-viewer.component';\n\n/**\n * Artifact type plugin viewer that loads the appropriate plugin based on the artifact's DriverClass.\n * Uses MJGlobal.Instance.ClassFactory.CreateInstance() to dynamically load viewer plugins.\n */\n@Component({\n standalone: false,\n selector: 'mj-artifact-type-plugin-viewer',\n template: `\n <div class=\"artifact-type-plugin-viewer\">\n @if (isLoading) {\n <div class=\"loading-state\">\n <i class=\"fas fa-spinner fa-spin\"></i>\n <span>Loading artifact viewer...</span>\n </div>\n }\n @if (error) {\n <div class=\"error-state\">\n <i class=\"fas fa-exclamation-triangle\"></i>\n @if (errorTitle) {\n <div class=\"error-title\">{{ errorTitle }}</div>\n }\n <div class=\"error-details\">{{ error }}</div>\n @if (errorDetails) {\n <div class=\"error-tech-details\">{{ errorDetails }}</div>\n }\n </div>\n }\n <ng-container #viewerContainer></ng-container>\n </div>\n `,\n styles: [`\n .artifact-type-plugin-viewer {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .artifact-type-plugin-viewer ::ng-deep > * {\n flex: 1;\n min-height: 0;\n }\n\n .loading-state,\n .error-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px;\n gap: 16px;\n color: #6c757d;\n width: 100%;\n height: 100%;\n min-height: 200px;\n }\n\n .loading-state i {\n font-size: 32px;\n }\n\n .error-state {\n color: #dc3545;\n text-align: center;\n max-width: 600px;\n }\n\n .error-state i {\n font-size: 32px;\n }\n\n .error-state .error-title {\n font-weight: 600;\n font-size: 16px;\n margin-bottom: 8px;\n }\n\n .error-state .error-details {\n font-size: 14px;\n line-height: 1.5;\n color: #6c757d;\n }\n\n .error-state .error-tech-details {\n margin-top: 12px;\n padding: 12px;\n background: #f8f9fa;\n border-radius: 4px;\n font-family: monospace;\n font-size: 12px;\n color: #495057;\n word-break: break-word;\n }\n `]\n})\nexport class ArtifactTypePluginViewerComponent implements OnInit, OnChanges {\n @Input() artifactVersion!: MJArtifactVersionEntity;\n @Input() artifactTypeName!: string;\n @Input() contentType?: string;\n @Input() height?: string;\n @Input() readonly: boolean = true;\n @Input() cssClass?: string;\n\n @Output() openEntityRecord = new EventEmitter<{entityName: string; compositeKey: CompositeKey}>();\n @Output() navigationRequest = new EventEmitter<NavigationRequest>();\n @Output() pluginLoaded = new EventEmitter<void>();\n @Output() tabsChanged = new EventEmitter<void>();\n\n @ViewChild('viewerContainer', { read: ViewContainerRef, static: true })\n viewerContainer!: ViewContainerRef;\n\n public isLoading = true;\n public error: string | null = null;\n public errorDetails: string | null = null;\n public errorTitle: string | null = null;\n\n private componentRef: ComponentRef<any> | null = null;\n\n /**\n * Get the loaded plugin instance (if available)\n */\n public get pluginInstance(): BaseArtifactViewerPluginComponent | null {\n return this.componentRef?.instance as BaseArtifactViewerPluginComponent || null;\n }\n\n /**\n * Whether the loaded plugin supports user feedback.\n * Pass-through to the plugin instance for use by the parent panel wrapper.\n */\n public get SupportsFeedback(): boolean {\n return this.pluginInstance?.SupportsFeedback ?? false;\n }\n\n /**\n * Ask the loaded plugin to show its feedback UX.\n * Pass-through to the plugin instance, called from the parent panel header.\n */\n public AskUserForFeedback(): void {\n this.pluginInstance?.AskUserForFeedback();\n }\n\n async ngOnInit(): Promise<void> {\n await this.loadViewer();\n }\n\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\n if ((changes['artifactVersion'] || changes['artifactTypeName']) &&\n !changes['artifactVersion']?.firstChange) {\n await this.loadViewer();\n }\n }\n\n ngOnDestroy(): void {\n this.destroyCurrentViewer();\n }\n\n /**\n * Load the appropriate viewer plugin for the artifact\n */\n private async loadViewer(): Promise<void> {\n try {\n this.isLoading = true;\n this.error = null;\n this.errorTitle = null;\n this.errorDetails = null;\n\n if (!this.artifactVersion) {\n this.setError(\n 'Missing Artifact Data',\n 'Unable to display this artifact because the version information is missing.',\n 'artifactVersion is null or undefined'\n );\n this.isLoading = false;\n return;\n }\n\n if (!this.artifactTypeName) {\n this.setError(\n 'Missing Artifact Type',\n 'Unable to display this artifact because the type information is missing.',\n 'artifactTypeName is empty'\n );\n this.isLoading = false;\n return;\n }\n\n // Get the artifact type entity to find the DriverClass\n const artifactType = await this.getArtifactType();\n if (!artifactType) {\n this.setError(\n 'Unknown Artifact Type',\n `The artifact type \"${this.artifactTypeName}\" is not recognized. This might be a custom type that hasn't been properly configured.`,\n `Artifact type \"${this.artifactTypeName}\" not found in metadata`\n );\n this.isLoading = false;\n return;\n }\n\n // Resolve DriverClass by traversing parent hierarchy if needed\n const driverClass = await this.resolveDriverClass(artifactType);\n if (!driverClass) {\n this.setError(\n 'No Viewer Available',\n `This artifact type (${this.artifactTypeName}) doesn't have a viewer component configured. The artifact content may need to be viewed in the JSON tab.`,\n `No DriverClass in hierarchy and content is not valid JSON`\n );\n this.isLoading = false;\n return;\n }\n\n // Get the component type using MJGlobal ClassFactory\n // CreateInstance returns the registered component class for the given DriverClass key\n const tempInstance = await MJGlobal.Instance.ClassFactory.CreateInstanceAsync<BaseArtifactViewerPluginComponent>(\n BaseArtifactViewerPluginComponent,\n driverClass\n );\n\n if (!tempInstance) {\n this.setError(\n 'Viewer Component Not Found',\n `The viewer component \"${driverClass}\" is not registered in the application. This usually means the required package or module hasn't been loaded.`,\n `Component \"${driverClass}\" not found in ClassFactory registry. Ensure it's registered with @RegisterClass(BaseArtifactViewerPluginComponent, '${driverClass}').`\n );\n this.isLoading = false;\n return;\n }\n\n // Get the component type from the instance\n const componentType = tempInstance.constructor as Type<BaseArtifactViewerPluginComponent>;\n\n // Destroy previous viewer if exists\n this.destroyCurrentViewer();\n\n // Create and configure the viewer component\n this.componentRef = this.viewerContainer.createComponent(componentType);\n\n // Set inputs using setInput() which properly triggers ngOnChanges\n // This is critical for plugins like ComponentArtifactViewerComponent that\n // need to process the artifactVersion in ngOnChanges before pluginLoaded fires\n this.componentRef.setInput('artifactVersion', this.artifactVersion);\n if (this.height !== undefined) {\n this.componentRef.setInput('height', this.height);\n }\n if (this.readonly !== undefined) {\n this.componentRef.setInput('readonly', this.readonly);\n }\n if (this.cssClass !== undefined) {\n this.componentRef.setInput('cssClass', this.cssClass);\n }\n if (this.contentType !== undefined) {\n this.componentRef.setInput('contentType', this.contentType);\n }\n\n // Subscribe to openEntityRecord event if the plugin emits it\n const componentInstance = this.componentRef.instance;\n if (componentInstance.openEntityRecord) {\n componentInstance.openEntityRecord.subscribe((event: {entityName: string; compositeKey: CompositeKey}) => {\n this.openEntityRecord.emit(event);\n });\n }\n\n // Subscribe to navigationRequest event if the plugin emits it\n if (componentInstance.navigationRequest) {\n componentInstance.navigationRequest.subscribe((event: NavigationRequest) => {\n this.navigationRequest.emit(event);\n });\n }\n\n // Subscribe to tabsChanged event if the plugin emits it (e.g., after async spec loading)\n if (componentInstance.tabsChanged) {\n componentInstance.tabsChanged.subscribe(() => {\n this.tabsChanged.emit();\n });\n }\n\n // Trigger change detection\n this.componentRef.changeDetectorRef.detectChanges();\n\n this.isLoading = false;\n\n // Notify parent that plugin has loaded (for tab selection timing)\n this.pluginLoaded.emit();\n } catch (err) {\n console.error('Error loading artifact viewer:', err);\n LogError(err);\n const errorMessage = err instanceof Error ? err.message : String(err);\n const errorStack = err instanceof Error && err.stack ? err.stack : undefined;\n this.setError(\n 'Failed to Load Viewer',\n 'An unexpected error occurred while loading the artifact viewer. Please try refreshing the page or contact support if the problem persists.',\n errorStack || errorMessage\n );\n this.isLoading = false;\n }\n }\n\n /**\n * Set a structured error message with title, user-friendly description, and technical details\n */\n private setError(title: string, userMessage: string, technicalDetails: string): void {\n this.errorTitle = title;\n this.error = userMessage;\n this.errorDetails = technicalDetails;\n }\n\n /**\n * Get the artifact type entity for the current artifact using the cached ArtifactMetadataEngine\n */\n private async getArtifactType(): Promise<MJArtifactTypeEntity | null> {\n try {\n // Use the cached metadata engine instead of querying the database\n const artifactType = ArtifactMetadataEngine.Instance.FindArtifactType(this.artifactTypeName);\n return artifactType || null;\n } catch (err) {\n console.error('Error loading artifact type:', err);\n return null;\n }\n }\n\n /**\n * Resolves the DriverClass for an artifact type by traversing up the parent hierarchy.\n * Falls back to JSON viewer if content is valid JSON and no DriverClass is found.\n *\n * @param artifactType The artifact type to resolve the DriverClass for\n * @returns The DriverClass string, or null if none found and no JSON fallback available\n */\n private async resolveDriverClass(artifactType: MJArtifactTypeEntity): Promise<string | null> {\n // Check if current artifact type has a DriverClass\n if (artifactType.DriverClass) {\n console.log(`✅ Found DriverClass '${artifactType.DriverClass}' on artifact type '${artifactType.Name}'`);\n return artifactType.DriverClass;\n }\n\n // No DriverClass on current type - check if it has a parent\n if (artifactType.ParentID) {\n console.log(`🔍 No DriverClass on '${artifactType.Name}', checking parent...`);\n const parentType = await this.getArtifactTypeById(artifactType.ParentID);\n\n if (parentType) {\n // Recursively check parent\n return await this.resolveDriverClass(parentType);\n } else {\n console.warn(`⚠️ Parent artifact type '${artifactType.ParentID}' not found`);\n }\n }\n\n // Reached root with no DriverClass - check for JSON fallback\n console.log(`📄 No DriverClass found in hierarchy for '${artifactType.Name}', checking JSON fallback...`);\n return this.checkJsonFallback();\n }\n\n /**\n * Loads an artifact type by ID\n */\n private async getArtifactTypeById(id: string): Promise<MJArtifactTypeEntity | null> {\n try {\n const md = new Metadata();\n const artifactType = await md.GetEntityObject<MJArtifactTypeEntity>('MJ: Artifact Types');\n const loaded = await artifactType.Load(id);\n\n if (loaded) {\n return artifactType;\n }\n\n return null;\n } catch (err) {\n console.error('Error loading artifact type by ID:', err);\n return null;\n }\n }\n\n /**\n * Checks if the artifact content is valid JSON and returns the JSON viewer plugin if so\n */\n private checkJsonFallback(): string | null {\n if (!this.artifactVersion || !this.artifactVersion.Content) {\n console.log('❌ No content available for JSON fallback');\n return null;\n }\n\n try {\n // Try to parse the content as JSON\n JSON.parse(this.artifactVersion.Content);\n console.log('✅ Content is valid JSON, using JsonArtifactViewerPlugin as fallback');\n return 'JsonArtifactViewerPlugin';\n } catch {\n console.log('❌ Content is not valid JSON, no fallback available');\n return null;\n }\n }\n\n /**\n * Destroy the current viewer component\n */\n private destroyCurrentViewer(): void {\n if (this.componentRef) {\n this.componentRef.destroy();\n this.componentRef = null;\n }\n this.viewerContainer.clear();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"artifact-type-plugin-viewer.component.js","sourceRoot":"","sources":["../../../src/lib/components/artifact-type-plugin-viewer.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n OnInit,\n OnChanges,\n SimpleChanges,\n ViewChild,\n ViewContainerRef,\n ComponentRef,\n Type\n} from '@angular/core';\nimport { MJArtifactVersionEntity, MJArtifactTypeEntity, ArtifactMetadataEngine } from '@memberjunction/core-entities';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { Metadata, LogError, RunView, CompositeKey } from '@memberjunction/core';\nimport { MJGlobal } from '@memberjunction/global';\nimport { IArtifactViewerComponent } from '../interfaces/artifact-viewer-plugin.interface';\nimport { BaseArtifactViewerPluginComponent, NavigationRequest } from './base-artifact-viewer.component';\n\n/**\n * Artifact type plugin viewer that loads the appropriate plugin based on the artifact's DriverClass.\n * Uses MJGlobal.Instance.ClassFactory.CreateInstance() to dynamically load viewer plugins.\n */\n@Component({\n standalone: false,\n selector: 'mj-artifact-type-plugin-viewer',\n template: `\n <div class=\"artifact-type-plugin-viewer\">\n @if (isLoading) {\n <div class=\"loading-state\">\n <i class=\"fas fa-spinner fa-spin\"></i>\n <span>Loading artifact viewer...</span>\n </div>\n }\n @if (error) {\n <div class=\"error-state\">\n <i class=\"fas fa-exclamation-triangle\"></i>\n @if (errorTitle) {\n <div class=\"error-title\">{{ errorTitle }}</div>\n }\n <div class=\"error-details\">{{ error }}</div>\n @if (errorDetails) {\n <div class=\"error-tech-details\">{{ errorDetails }}</div>\n }\n </div>\n }\n <ng-container #viewerContainer></ng-container>\n </div>\n `,\n styles: [`\n .artifact-type-plugin-viewer {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n .artifact-type-plugin-viewer ::ng-deep > * {\n flex: 1;\n min-height: 0;\n }\n\n .loading-state,\n .error-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 40px;\n gap: 16px;\n color: #6c757d;\n width: 100%;\n height: 100%;\n min-height: 200px;\n }\n\n .loading-state i {\n font-size: 32px;\n }\n\n .error-state {\n color: #dc3545;\n text-align: center;\n max-width: 600px;\n }\n\n .error-state i {\n font-size: 32px;\n }\n\n .error-state .error-title {\n font-weight: 600;\n font-size: 16px;\n margin-bottom: 8px;\n }\n\n .error-state .error-details {\n font-size: 14px;\n line-height: 1.5;\n color: #6c757d;\n }\n\n .error-state .error-tech-details {\n margin-top: 12px;\n padding: 12px;\n background: #f8f9fa;\n border-radius: 4px;\n font-family: monospace;\n font-size: 12px;\n color: #495057;\n word-break: break-word;\n }\n `]\n})\nexport class ArtifactTypePluginViewerComponent extends BaseAngularComponent implements OnInit, OnChanges {\n @Input() artifactVersion!: MJArtifactVersionEntity;\n @Input() artifactTypeName!: string;\n @Input() contentType?: string;\n @Input() height?: string;\n @Input() readonly: boolean = true;\n @Input() cssClass?: string;\n\n @Output() openEntityRecord = new EventEmitter<{entityName: string; compositeKey: CompositeKey}>();\n @Output() navigationRequest = new EventEmitter<NavigationRequest>();\n @Output() pluginLoaded = new EventEmitter<void>();\n @Output() tabsChanged = new EventEmitter<void>();\n\n @ViewChild('viewerContainer', { read: ViewContainerRef, static: true })\n viewerContainer!: ViewContainerRef;\n\n public isLoading = true;\n public error: string | null = null;\n public errorDetails: string | null = null;\n public errorTitle: string | null = null;\n\n private componentRef: ComponentRef<any> | null = null;\n\n /**\n * Get the loaded plugin instance (if available)\n */\n public get pluginInstance(): BaseArtifactViewerPluginComponent | null {\n return this.componentRef?.instance as BaseArtifactViewerPluginComponent || null;\n }\n\n /**\n * Whether the loaded plugin supports user feedback.\n * Pass-through to the plugin instance for use by the parent panel wrapper.\n */\n public get SupportsFeedback(): boolean {\n return this.pluginInstance?.SupportsFeedback ?? false;\n }\n\n /**\n * Ask the loaded plugin to show its feedback UX.\n * Pass-through to the plugin instance, called from the parent panel header.\n */\n public AskUserForFeedback(): void {\n this.pluginInstance?.AskUserForFeedback();\n }\n\n async ngOnInit(): Promise<void> {\n await this.loadViewer();\n }\n\n async ngOnChanges(changes: SimpleChanges): Promise<void> {\n if ((changes['artifactVersion'] || changes['artifactTypeName']) &&\n !changes['artifactVersion']?.firstChange) {\n await this.loadViewer();\n }\n }\n\n ngOnDestroy(): void {\n this.destroyCurrentViewer();\n }\n\n /**\n * Load the appropriate viewer plugin for the artifact\n */\n private async loadViewer(): Promise<void> {\n try {\n this.isLoading = true;\n this.error = null;\n this.errorTitle = null;\n this.errorDetails = null;\n\n if (!this.artifactVersion) {\n this.setError(\n 'Missing Artifact Data',\n 'Unable to display this artifact because the version information is missing.',\n 'artifactVersion is null or undefined'\n );\n this.isLoading = false;\n return;\n }\n\n if (!this.artifactTypeName) {\n this.setError(\n 'Missing Artifact Type',\n 'Unable to display this artifact because the type information is missing.',\n 'artifactTypeName is empty'\n );\n this.isLoading = false;\n return;\n }\n\n // Get the artifact type entity to find the DriverClass\n const artifactType = await this.getArtifactType();\n if (!artifactType) {\n this.setError(\n 'Unknown Artifact Type',\n `The artifact type \"${this.artifactTypeName}\" is not recognized. This might be a custom type that hasn't been properly configured.`,\n `Artifact type \"${this.artifactTypeName}\" not found in metadata`\n );\n this.isLoading = false;\n return;\n }\n\n // Resolve DriverClass by traversing parent hierarchy if needed\n const driverClass = await this.resolveDriverClass(artifactType);\n if (!driverClass) {\n this.setError(\n 'No Viewer Available',\n `This artifact type (${this.artifactTypeName}) doesn't have a viewer component configured. The artifact content may need to be viewed in the JSON tab.`,\n `No DriverClass in hierarchy and content is not valid JSON`\n );\n this.isLoading = false;\n return;\n }\n\n // Get the component type using MJGlobal ClassFactory\n // CreateInstance returns the registered component class for the given DriverClass key\n const tempInstance = await MJGlobal.Instance.ClassFactory.CreateInstanceAsync<BaseArtifactViewerPluginComponent>(\n BaseArtifactViewerPluginComponent,\n driverClass\n );\n\n if (!tempInstance) {\n this.setError(\n 'Viewer Component Not Found',\n `The viewer component \"${driverClass}\" is not registered in the application. This usually means the required package or module hasn't been loaded.`,\n `Component \"${driverClass}\" not found in ClassFactory registry. Ensure it's registered with @RegisterClass(BaseArtifactViewerPluginComponent, '${driverClass}').`\n );\n this.isLoading = false;\n return;\n }\n\n // Get the component type from the instance\n const componentType = tempInstance.constructor as Type<BaseArtifactViewerPluginComponent>;\n\n // Destroy previous viewer if exists\n this.destroyCurrentViewer();\n\n // Create and configure the viewer component\n this.componentRef = this.viewerContainer.createComponent(componentType);\n\n // Set inputs using setInput() which properly triggers ngOnChanges\n // This is critical for plugins like ComponentArtifactViewerComponent that\n // need to process the artifactVersion in ngOnChanges before pluginLoaded fires\n this.componentRef.setInput('artifactVersion', this.artifactVersion);\n if (this.height !== undefined) {\n this.componentRef.setInput('height', this.height);\n }\n if (this.readonly !== undefined) {\n this.componentRef.setInput('readonly', this.readonly);\n }\n if (this.cssClass !== undefined) {\n this.componentRef.setInput('cssClass', this.cssClass);\n }\n if (this.contentType !== undefined) {\n this.componentRef.setInput('contentType', this.contentType);\n }\n\n // Subscribe to openEntityRecord event if the plugin emits it\n const componentInstance = this.componentRef.instance;\n if (componentInstance.openEntityRecord) {\n componentInstance.openEntityRecord.subscribe((event: {entityName: string; compositeKey: CompositeKey}) => {\n this.openEntityRecord.emit(event);\n });\n }\n\n // Subscribe to navigationRequest event if the plugin emits it\n if (componentInstance.navigationRequest) {\n componentInstance.navigationRequest.subscribe((event: NavigationRequest) => {\n this.navigationRequest.emit(event);\n });\n }\n\n // Subscribe to tabsChanged event if the plugin emits it (e.g., after async spec loading)\n if (componentInstance.tabsChanged) {\n componentInstance.tabsChanged.subscribe(() => {\n this.tabsChanged.emit();\n });\n }\n\n // Trigger change detection\n this.componentRef.changeDetectorRef.detectChanges();\n\n this.isLoading = false;\n\n // Notify parent that plugin has loaded (for tab selection timing)\n this.pluginLoaded.emit();\n } catch (err) {\n console.error('Error loading artifact viewer:', err);\n LogError(err);\n const errorMessage = err instanceof Error ? err.message : String(err);\n const errorStack = err instanceof Error && err.stack ? err.stack : undefined;\n this.setError(\n 'Failed to Load Viewer',\n 'An unexpected error occurred while loading the artifact viewer. Please try refreshing the page or contact support if the problem persists.',\n errorStack || errorMessage\n );\n this.isLoading = false;\n }\n }\n\n /**\n * Set a structured error message with title, user-friendly description, and technical details\n */\n private setError(title: string, userMessage: string, technicalDetails: string): void {\n this.errorTitle = title;\n this.error = userMessage;\n this.errorDetails = technicalDetails;\n }\n\n /**\n * Get the artifact type entity for the current artifact using the cached ArtifactMetadataEngine\n */\n private async getArtifactType(): Promise<MJArtifactTypeEntity | null> {\n try {\n // Use the cached metadata engine instead of querying the database\n const artifactType = ArtifactMetadataEngine.Instance.FindArtifactType(this.artifactTypeName);\n return artifactType || null;\n } catch (err) {\n console.error('Error loading artifact type:', err);\n return null;\n }\n }\n\n /**\n * Resolves the DriverClass for an artifact type by traversing up the parent hierarchy.\n * Falls back to JSON viewer if content is valid JSON and no DriverClass is found.\n *\n * @param artifactType The artifact type to resolve the DriverClass for\n * @returns The DriverClass string, or null if none found and no JSON fallback available\n */\n private async resolveDriverClass(artifactType: MJArtifactTypeEntity): Promise<string | null> {\n // Check if current artifact type has a DriverClass\n if (artifactType.DriverClass) {\n console.log(`✅ Found DriverClass '${artifactType.DriverClass}' on artifact type '${artifactType.Name}'`);\n return artifactType.DriverClass;\n }\n\n // No DriverClass on current type - check if it has a parent\n if (artifactType.ParentID) {\n console.log(`🔍 No DriverClass on '${artifactType.Name}', checking parent...`);\n const parentType = await this.getArtifactTypeById(artifactType.ParentID);\n\n if (parentType) {\n // Recursively check parent\n return await this.resolveDriverClass(parentType);\n } else {\n console.warn(`⚠️ Parent artifact type '${artifactType.ParentID}' not found`);\n }\n }\n\n // Reached root with no DriverClass - check for JSON fallback\n console.log(`📄 No DriverClass found in hierarchy for '${artifactType.Name}', checking JSON fallback...`);\n return this.checkJsonFallback();\n }\n\n /**\n * Loads an artifact type by ID\n */\n private async getArtifactTypeById(id: string): Promise<MJArtifactTypeEntity | null> {\n try {\n const md = this.ProviderToUse;\n const artifactType = await md.GetEntityObject<MJArtifactTypeEntity>('MJ: Artifact Types');\n const loaded = await artifactType.Load(id);\n\n if (loaded) {\n return artifactType;\n }\n\n return null;\n } catch (err) {\n console.error('Error loading artifact type by ID:', err);\n return null;\n }\n }\n\n /**\n * Checks if the artifact content is valid JSON and returns the JSON viewer plugin if so\n */\n private checkJsonFallback(): string | null {\n if (!this.artifactVersion || !this.artifactVersion.Content) {\n console.log('❌ No content available for JSON fallback');\n return null;\n }\n\n try {\n // Try to parse the content as JSON\n JSON.parse(this.artifactVersion.Content);\n console.log('✅ Content is valid JSON, using JsonArtifactViewerPlugin as fallback');\n return 'JsonArtifactViewerPlugin';\n } catch {\n console.log('❌ Content is not valid JSON, no fallback available');\n return null;\n }\n }\n\n /**\n * Destroy the current viewer component\n */\n private destroyCurrentViewer(): void {\n if (this.componentRef) {\n this.componentRef.destroy();\n this.componentRef = null;\n }\n this.viewerContainer.clear();\n }\n}\n"]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { EventEmitter, OnInit } from '@angular/core';
|
|
2
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
2
3
|
import { MJArtifactEntity, MJArtifactVersionEntity } from '@memberjunction/core-entities';
|
|
3
4
|
import { UserInfo } from '@memberjunction/core';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
|
-
export declare class ArtifactVersionHistoryComponent implements OnInit {
|
|
6
|
+
export declare class ArtifactVersionHistoryComponent extends BaseAngularComponent implements OnInit {
|
|
6
7
|
artifact: MJArtifactEntity;
|
|
7
8
|
currentUser: UserInfo;
|
|
8
9
|
closed: EventEmitter<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-version-history.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/artifact-version-history.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC1F,OAAO,EAAE,QAAQ,EAAW,MAAM,sBAAsB,CAAC;;AAEzD,qBA2Ga,+BAAgC,YAAW,MAAM;
|
|
1
|
+
{"version":3,"file":"artifact-version-history.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/artifact-version-history.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAC1F,OAAO,EAAE,QAAQ,EAAW,MAAM,sBAAsB,CAAC;;AAEzD,qBA2Ga,+BAAgC,SAAQ,oBAAqB,YAAW,MAAM;IAChF,QAAQ,EAAG,gBAAgB,CAAC;IAC5B,WAAW,EAAG,QAAQ,CAAC;IAEtB,MAAM,qBAA4B;IAClC,eAAe,uBAA8B;IAC7C,eAAe,uBAA8B;IAEhD,QAAQ,EAAE,uBAAuB,EAAE,CAAM;IACzC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IACtC,QAAQ,EAAE,OAAO,CAAS;IAC1B,qBAAqB,EAAE,MAAM,CAAM;IACnC,sBAAsB,EAAE,MAAM,CAAM;IAE3C,QAAQ;YAIM,YAAY;IAkB1B,eAAe,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI;IAKjD,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IAajE,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBvE,iBAAiB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI;IAgBzD,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAQ9C,cAAc,IAAI,MAAM;IAYxB,OAAO,IAAI,IAAI;yCA/GJ,+BAA+B;2CAA/B,+BAA+B;CAkH3C"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
2
3
|
import { RunView } from '@memberjunction/core';
|
|
3
4
|
import * as i0 from "@angular/core";
|
|
4
5
|
import * as i1 from "@angular/common";
|
|
@@ -75,7 +76,7 @@ function ArtifactVersionHistoryComponent_Conditional_10_Template(rf, ctx) { if (
|
|
|
75
76
|
i0.ɵɵadvance(5);
|
|
76
77
|
i0.ɵɵtextInterpolate(ctx_r2.getDiffSummary());
|
|
77
78
|
} }
|
|
78
|
-
export class ArtifactVersionHistoryComponent {
|
|
79
|
+
export class ArtifactVersionHistoryComponent extends BaseAngularComponent {
|
|
79
80
|
artifact;
|
|
80
81
|
currentUser;
|
|
81
82
|
closed = new EventEmitter();
|
|
@@ -91,7 +92,7 @@ export class ArtifactVersionHistoryComponent {
|
|
|
91
92
|
}
|
|
92
93
|
async loadVersions() {
|
|
93
94
|
try {
|
|
94
|
-
const rv =
|
|
95
|
+
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
95
96
|
const result = await rv.RunView({
|
|
96
97
|
EntityName: 'MJ: Artifact Versions',
|
|
97
98
|
ExtraFilter: `ArtifactID='${this.artifact.ID}'`,
|
|
@@ -180,8 +181,8 @@ export class ArtifactVersionHistoryComponent {
|
|
|
180
181
|
onClose() {
|
|
181
182
|
this.closed.emit();
|
|
182
183
|
}
|
|
183
|
-
static ɵfac = function ArtifactVersionHistoryComponent_Factory(__ngFactoryType__) { return
|
|
184
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ArtifactVersionHistoryComponent, selectors: [["mj-artifact-version-history"]], inputs: { artifact: "artifact", currentUser: "currentUser" }, outputs: { closed: "closed", versionRestored: "versionRestored", versionSelected: "versionSelected" }, standalone: false, decls: 11, vars: 2, consts: [[1, "version-history"], [1, "history-header"], ["title", "Close", 1, "btn-close", 3, "click"], [1, "fas", "fa-times"], [1, "version-list"], [1, "empty-state"], [1, "version-item", 3, "selected"], [1, "diff-panel"], [1, "fas", "fa-history"], [1, "version-item", 3, "click"], [1, "version-header"], [1, "version-info"], [1, "version-number"], [1, "version-date"], [1, "version-meta"], [1, "version-size"], [1, "version-actions"], [1, "btn-action", 3, "click"], [1, "fas", "fa-undo"], [1, "fas", "fa-code-compare"], [1, "fas", "fa-download"], [1, "diff-header"], [1, "btn-close-diff", 3, "click"], [1, "diff-content"]], template: function ArtifactVersionHistoryComponent_Template(rf, ctx) { if (rf & 1) {
|
|
184
|
+
static ɵfac = /*@__PURE__*/ (() => { let ɵArtifactVersionHistoryComponent_BaseFactory; return function ArtifactVersionHistoryComponent_Factory(__ngFactoryType__) { return (ɵArtifactVersionHistoryComponent_BaseFactory || (ɵArtifactVersionHistoryComponent_BaseFactory = i0.ɵɵgetInheritedFactory(ArtifactVersionHistoryComponent)))(__ngFactoryType__ || ArtifactVersionHistoryComponent); }; })();
|
|
185
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ArtifactVersionHistoryComponent, selectors: [["mj-artifact-version-history"]], inputs: { artifact: "artifact", currentUser: "currentUser" }, outputs: { closed: "closed", versionRestored: "versionRestored", versionSelected: "versionSelected" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 11, vars: 2, consts: [[1, "version-history"], [1, "history-header"], ["title", "Close", 1, "btn-close", 3, "click"], [1, "fas", "fa-times"], [1, "version-list"], [1, "empty-state"], [1, "version-item", 3, "selected"], [1, "diff-panel"], [1, "fas", "fa-history"], [1, "version-item", 3, "click"], [1, "version-header"], [1, "version-info"], [1, "version-number"], [1, "version-date"], [1, "version-meta"], [1, "version-size"], [1, "version-actions"], [1, "btn-action", 3, "click"], [1, "fas", "fa-undo"], [1, "fas", "fa-code-compare"], [1, "fas", "fa-download"], [1, "diff-header"], [1, "btn-close-diff", 3, "click"], [1, "diff-content"]], template: function ArtifactVersionHistoryComponent_Template(rf, ctx) { if (rf & 1) {
|
|
185
186
|
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "h3");
|
|
186
187
|
i0.ɵɵtext(3, "Version History");
|
|
187
188
|
i0.ɵɵelementEnd();
|
|
@@ -282,5 +283,5 @@ export class ArtifactVersionHistoryComponent {
|
|
|
282
283
|
}], versionSelected: [{
|
|
283
284
|
type: Output
|
|
284
285
|
}] }); })();
|
|
285
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ArtifactVersionHistoryComponent, { className: "ArtifactVersionHistoryComponent", filePath: "src/lib/components/artifact-version-history.component.ts", lineNumber:
|
|
286
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ArtifactVersionHistoryComponent, { className: "ArtifactVersionHistoryComponent", filePath: "src/lib/components/artifact-version-history.component.ts", lineNumber: 113 }); })();
|
|
286
287
|
//# sourceMappingURL=artifact-version-history.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-version-history.component.js","sourceRoot":"","sources":["../../../src/lib/components/artifact-version-history.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\nimport { MJArtifactEntity, MJArtifactVersionEntity } from '@memberjunction/core-entities';\nimport { UserInfo, RunView } from '@memberjunction/core';\n\n@Component({\n standalone: false,\n selector: 'mj-artifact-version-history',\n template: `\n <div class=\"version-history\">\n <div class=\"history-header\">\n <h3>Version History</h3>\n <button class=\"btn-close\" (click)=\"onClose()\" title=\"Close\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n \n <div class=\"version-list\">\n @if (versions.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fas fa-history\"></i>\n <p>No version history available</p>\n </div>\n }\n \n @for (version of versions; track version) {\n <div\n class=\"version-item\"\n [class.selected]=\"version.VersionNumber === selectedVersion\"\n (click)=\"onSelectVersion(version)\">\n <div class=\"version-header\">\n <div class=\"version-info\">\n <span class=\"version-number\">v{{ version.VersionNumber }}</span>\n <span class=\"version-date\">{{ version.__mj_CreatedAt | date:'short' }}</span>\n </div>\n <div class=\"version-meta\">\n <span class=\"version-size\">\n {{ getContentSize(version.Content) }}\n </span>\n </div>\n </div>\n @if (version.VersionNumber === selectedVersion) {\n <div class=\"version-actions\">\n <button class=\"btn-action\" (click)=\"onRestoreVersion(version); $event.stopPropagation()\">\n <i class=\"fas fa-undo\"></i> Restore\n </button>\n <button class=\"btn-action\" (click)=\"onCompareVersion(version); $event.stopPropagation()\">\n <i class=\"fas fa-code-compare\"></i> Compare\n </button>\n <button class=\"btn-action\" (click)=\"onDownloadVersion(version); $event.stopPropagation()\">\n <i class=\"fas fa-download\"></i> Download\n </button>\n </div>\n }\n </div>\n }\n </div>\n \n @if (showDiff && currentVersionContent && previousVersionContent && selectedVersion) {\n <div class=\"diff-panel\">\n <div class=\"diff-header\">\n <h4>Changes from v{{ (selectedVersion || 1) - 1 }} to v{{ selectedVersion }}</h4>\n <button class=\"btn-close-diff\" (click)=\"showDiff = false\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n <div class=\"diff-content\">\n <pre>{{ getDiffSummary() }}</pre>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n .version-history { display: flex; flex-direction: column; height: 100%; background: white; }\n .history-header { padding: 16px; border-bottom: 1px solid #D9D9D9; display: flex; justify-content: space-between; align-items: center; }\n .history-header h3 { margin: 0; font-size: 16px; }\n .btn-close { padding: 6px; background: transparent; border: none; cursor: pointer; border-radius: 3px; color: #666; }\n .btn-close:hover { background: rgba(0,0,0,0.1); }\n\n .version-list { flex: 1; overflow-y: auto; }\n .version-item { padding: 16px; border-bottom: 1px solid #E8E8E8; cursor: pointer; transition: background 150ms ease; }\n .version-item:hover { background: #F9F9F9; }\n .version-item.selected { background: #E3F2FD; border-left: 3px solid #1976D2; }\n\n .version-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 8px; }\n .version-info { display: flex; flex-direction: column; gap: 4px; }\n .version-number { font-size: 14px; font-weight: 600; }\n .version-date { font-size: 12px; color: #666; }\n .version-meta { display: flex; flex-direction: column; align-items: flex-end; gap: 4px; font-size: 12px; color: #666; }\n .version-author { display: flex; align-items: center; gap: 4px; }\n .version-size { color: #999; }\n\n .version-notes { font-size: 13px; color: #333; margin-bottom: 8px; }\n\n .version-actions { display: flex; gap: 8px; margin-top: 12px; }\n .btn-action { padding: 6px 12px; background: #0076B6; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 12px; display: flex; align-items: center; gap: 6px; }\n .btn-action:hover { background: #005A8C; }\n\n .empty-state { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 48px 24px; color: #999; }\n .empty-state i { font-size: 48px; margin-bottom: 16px; }\n .empty-state p { margin: 0; font-size: 14px; }\n\n .diff-panel { border-top: 2px solid #D9D9D9; max-height: 50%; overflow: hidden; display: flex; flex-direction: column; }\n .diff-header { padding: 12px 16px; background: #F8F8F8; border-bottom: 1px solid #D9D9D9; display: flex; justify-content: space-between; align-items: center; }\n .diff-header h4 { margin: 0; font-size: 13px; font-weight: 600; }\n .btn-close-diff { padding: 4px; background: transparent; border: none; cursor: pointer; border-radius: 3px; color: #666; }\n .btn-close-diff:hover { background: rgba(0,0,0,0.1); }\n .diff-content { flex: 1; overflow-y: auto; padding: 16px; }\n .diff-content pre { margin: 0; font-family: 'Courier New', monospace; font-size: 12px; white-space: pre-wrap; }\n `]\n})\nexport class ArtifactVersionHistoryComponent implements OnInit {\n @Input() artifact!: MJArtifactEntity;\n @Input() currentUser!: UserInfo;\n\n @Output() closed = new EventEmitter<void>();\n @Output() versionRestored = new EventEmitter<number>();\n @Output() versionSelected = new EventEmitter<number>();\n\n public versions: MJArtifactVersionEntity[] = [];\n public selectedVersion: number | null = null;\n public showDiff: boolean = false;\n public currentVersionContent: string = '';\n public previousVersionContent: string = '';\n\n ngOnInit() {\n this.loadVersions();\n }\n\n private async loadVersions(): Promise<void> {\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJArtifactVersionEntity>({\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: `ArtifactID='${this.artifact.ID}'`,\n OrderBy: 'VersionNumber DESC',\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (result.Success) {\n this.versions = result.Results || [];\n }\n } catch (error) {\n console.error('Failed to load version history:', error);\n }\n }\n\n onSelectVersion(version: MJArtifactVersionEntity): void {\n this.selectedVersion = version.VersionNumber;\n this.versionSelected.emit(version.VersionNumber);\n }\n\n async onRestoreVersion(version: MJArtifactVersionEntity): Promise<void> {\n if (!confirm(`Restore to version ${version.VersionNumber}? This will create a new version.`)) return;\n\n try {\n // Restoring creates a new version with the old content\n this.versionRestored.emit(version.VersionNumber);\n alert(`Version ${version.VersionNumber} has been restored as the latest version`);\n } catch (error) {\n console.error('Failed to restore version:', error);\n alert('Failed to restore version');\n }\n }\n\n async onCompareVersion(version: MJArtifactVersionEntity): Promise<void> {\n if (version.VersionNumber === 1) {\n alert('Cannot compare: this is the first version');\n return;\n }\n\n try {\n this.currentVersionContent = version.Content || '';\n\n // Load previous version\n const previousVersion = this.versions.find(v => v.VersionNumber === version.VersionNumber - 1);\n if (previousVersion) {\n this.previousVersionContent = previousVersion.Content || '';\n this.showDiff = true;\n }\n } catch (error) {\n console.error('Failed to load version for comparison:', error);\n alert('Failed to compare versions');\n }\n }\n\n onDownloadVersion(version: MJArtifactVersionEntity): void {\n try {\n const content = version.Content || '';\n const blob = new Blob([content], { type: 'text/plain' });\n const url = window.URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = `${this.artifact.Name}_v${version.VersionNumber}.txt`;\n link.click();\n window.URL.revokeObjectURL(url);\n } catch (error) {\n console.error('Failed to download version:', error);\n alert('Failed to download version');\n }\n }\n\n getContentSize(content: string | null): string {\n if (!content) return '0 B';\n const bytes = new Blob([content]).size;\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n }\n\n getDiffSummary(): string {\n // Simple line-based diff summary\n const currentLines = this.currentVersionContent.split('\\n');\n const previousLines = this.previousVersionContent.split('\\n');\n\n const added = currentLines.length - previousLines.length;\n const summary = `Lines: ${previousLines.length} → ${currentLines.length} (${added > 0 ? '+' : ''}${added})\\n\\n`;\n\n // Show a simple comparison\n return summary + '(Full diff view would require a diff library)';\n }\n\n onClose(): void {\n this.closed.emit();\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"artifact-version-history.component.js","sourceRoot":"","sources":["../../../src/lib/components/artifact-version-history.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { MJArtifactEntity, MJArtifactVersionEntity } from '@memberjunction/core-entities';\nimport { UserInfo, RunView } from '@memberjunction/core';\n\n@Component({\n standalone: false,\n selector: 'mj-artifact-version-history',\n template: `\n <div class=\"version-history\">\n <div class=\"history-header\">\n <h3>Version History</h3>\n <button class=\"btn-close\" (click)=\"onClose()\" title=\"Close\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n \n <div class=\"version-list\">\n @if (versions.length === 0) {\n <div class=\"empty-state\">\n <i class=\"fas fa-history\"></i>\n <p>No version history available</p>\n </div>\n }\n \n @for (version of versions; track version) {\n <div\n class=\"version-item\"\n [class.selected]=\"version.VersionNumber === selectedVersion\"\n (click)=\"onSelectVersion(version)\">\n <div class=\"version-header\">\n <div class=\"version-info\">\n <span class=\"version-number\">v{{ version.VersionNumber }}</span>\n <span class=\"version-date\">{{ version.__mj_CreatedAt | date:'short' }}</span>\n </div>\n <div class=\"version-meta\">\n <span class=\"version-size\">\n {{ getContentSize(version.Content) }}\n </span>\n </div>\n </div>\n @if (version.VersionNumber === selectedVersion) {\n <div class=\"version-actions\">\n <button class=\"btn-action\" (click)=\"onRestoreVersion(version); $event.stopPropagation()\">\n <i class=\"fas fa-undo\"></i> Restore\n </button>\n <button class=\"btn-action\" (click)=\"onCompareVersion(version); $event.stopPropagation()\">\n <i class=\"fas fa-code-compare\"></i> Compare\n </button>\n <button class=\"btn-action\" (click)=\"onDownloadVersion(version); $event.stopPropagation()\">\n <i class=\"fas fa-download\"></i> Download\n </button>\n </div>\n }\n </div>\n }\n </div>\n \n @if (showDiff && currentVersionContent && previousVersionContent && selectedVersion) {\n <div class=\"diff-panel\">\n <div class=\"diff-header\">\n <h4>Changes from v{{ (selectedVersion || 1) - 1 }} to v{{ selectedVersion }}</h4>\n <button class=\"btn-close-diff\" (click)=\"showDiff = false\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n <div class=\"diff-content\">\n <pre>{{ getDiffSummary() }}</pre>\n </div>\n </div>\n }\n </div>\n `,\n styles: [`\n .version-history { display: flex; flex-direction: column; height: 100%; background: white; }\n .history-header { padding: 16px; border-bottom: 1px solid #D9D9D9; display: flex; justify-content: space-between; align-items: center; }\n .history-header h3 { margin: 0; font-size: 16px; }\n .btn-close { padding: 6px; background: transparent; border: none; cursor: pointer; border-radius: 3px; color: #666; }\n .btn-close:hover { background: rgba(0,0,0,0.1); }\n\n .version-list { flex: 1; overflow-y: auto; }\n .version-item { padding: 16px; border-bottom: 1px solid #E8E8E8; cursor: pointer; transition: background 150ms ease; }\n .version-item:hover { background: #F9F9F9; }\n .version-item.selected { background: #E3F2FD; border-left: 3px solid #1976D2; }\n\n .version-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 8px; }\n .version-info { display: flex; flex-direction: column; gap: 4px; }\n .version-number { font-size: 14px; font-weight: 600; }\n .version-date { font-size: 12px; color: #666; }\n .version-meta { display: flex; flex-direction: column; align-items: flex-end; gap: 4px; font-size: 12px; color: #666; }\n .version-author { display: flex; align-items: center; gap: 4px; }\n .version-size { color: #999; }\n\n .version-notes { font-size: 13px; color: #333; margin-bottom: 8px; }\n\n .version-actions { display: flex; gap: 8px; margin-top: 12px; }\n .btn-action { padding: 6px 12px; background: #0076B6; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 12px; display: flex; align-items: center; gap: 6px; }\n .btn-action:hover { background: #005A8C; }\n\n .empty-state { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 48px 24px; color: #999; }\n .empty-state i { font-size: 48px; margin-bottom: 16px; }\n .empty-state p { margin: 0; font-size: 14px; }\n\n .diff-panel { border-top: 2px solid #D9D9D9; max-height: 50%; overflow: hidden; display: flex; flex-direction: column; }\n .diff-header { padding: 12px 16px; background: #F8F8F8; border-bottom: 1px solid #D9D9D9; display: flex; justify-content: space-between; align-items: center; }\n .diff-header h4 { margin: 0; font-size: 13px; font-weight: 600; }\n .btn-close-diff { padding: 4px; background: transparent; border: none; cursor: pointer; border-radius: 3px; color: #666; }\n .btn-close-diff:hover { background: rgba(0,0,0,0.1); }\n .diff-content { flex: 1; overflow-y: auto; padding: 16px; }\n .diff-content pre { margin: 0; font-family: 'Courier New', monospace; font-size: 12px; white-space: pre-wrap; }\n `]\n})\nexport class ArtifactVersionHistoryComponent extends BaseAngularComponent implements OnInit {\n @Input() artifact!: MJArtifactEntity;\n @Input() currentUser!: UserInfo;\n\n @Output() closed = new EventEmitter<void>();\n @Output() versionRestored = new EventEmitter<number>();\n @Output() versionSelected = new EventEmitter<number>();\n\n public versions: MJArtifactVersionEntity[] = [];\n public selectedVersion: number | null = null;\n public showDiff: boolean = false;\n public currentVersionContent: string = '';\n public previousVersionContent: string = '';\n\n ngOnInit() {\n this.loadVersions();\n }\n\n private async loadVersions(): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const result = await rv.RunView<MJArtifactVersionEntity>({\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: `ArtifactID='${this.artifact.ID}'`,\n OrderBy: 'VersionNumber DESC',\n ResultType: 'entity_object'\n }, this.currentUser);\n\n if (result.Success) {\n this.versions = result.Results || [];\n }\n } catch (error) {\n console.error('Failed to load version history:', error);\n }\n }\n\n onSelectVersion(version: MJArtifactVersionEntity): void {\n this.selectedVersion = version.VersionNumber;\n this.versionSelected.emit(version.VersionNumber);\n }\n\n async onRestoreVersion(version: MJArtifactVersionEntity): Promise<void> {\n if (!confirm(`Restore to version ${version.VersionNumber}? This will create a new version.`)) return;\n\n try {\n // Restoring creates a new version with the old content\n this.versionRestored.emit(version.VersionNumber);\n alert(`Version ${version.VersionNumber} has been restored as the latest version`);\n } catch (error) {\n console.error('Failed to restore version:', error);\n alert('Failed to restore version');\n }\n }\n\n async onCompareVersion(version: MJArtifactVersionEntity): Promise<void> {\n if (version.VersionNumber === 1) {\n alert('Cannot compare: this is the first version');\n return;\n }\n\n try {\n this.currentVersionContent = version.Content || '';\n\n // Load previous version\n const previousVersion = this.versions.find(v => v.VersionNumber === version.VersionNumber - 1);\n if (previousVersion) {\n this.previousVersionContent = previousVersion.Content || '';\n this.showDiff = true;\n }\n } catch (error) {\n console.error('Failed to load version for comparison:', error);\n alert('Failed to compare versions');\n }\n }\n\n onDownloadVersion(version: MJArtifactVersionEntity): void {\n try {\n const content = version.Content || '';\n const blob = new Blob([content], { type: 'text/plain' });\n const url = window.URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = `${this.artifact.Name}_v${version.VersionNumber}.txt`;\n link.click();\n window.URL.revokeObjectURL(url);\n } catch (error) {\n console.error('Failed to download version:', error);\n alert('Failed to download version');\n }\n }\n\n getContentSize(content: string | null): string {\n if (!content) return '0 B';\n const bytes = new Blob([content]).size;\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n }\n\n getDiffSummary(): string {\n // Simple line-based diff summary\n const currentLines = this.currentVersionContent.split('\\n');\n const previousLines = this.previousVersionContent.split('\\n');\n\n const added = currentLines.length - previousLines.length;\n const summary = `Lines: ${previousLines.length} → ${currentLines.length} (${added > 0 ? '+' : ''}${added})\\n\\n`;\n\n // Show a simple comparison\n return summary + '(Full diff view would require a diff library)';\n }\n\n onClose(): void {\n this.closed.emit();\n }\n}"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { EventEmitter, OnInit, OnChanges, OnDestroy, SimpleChanges, Type, ChangeDetectorRef } from '@angular/core';
|
|
2
|
+
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
2
3
|
import { DomSanitizer } from '@angular/platform-browser';
|
|
3
4
|
import { UserInfo, CompositeKey, DataSnapshot } from '@memberjunction/core';
|
|
4
5
|
import { MJArtifactEntity, MJArtifactVersionEntity, MJArtifactVersionAttributeEntity, MJCollectionEntity, MJCollectionArtifactEntity, MJConversationEntity } from '@memberjunction/core-entities';
|
|
@@ -8,7 +9,7 @@ import { ArtifactTypePluginViewerComponent } from './artifact-type-plugin-viewer
|
|
|
8
9
|
import { ArtifactViewerTab, NavigationRequest } from './base-artifact-viewer.component';
|
|
9
10
|
import { ArtifactIconService } from '../services/artifact-icon.service';
|
|
10
11
|
import * as i0 from "@angular/core";
|
|
11
|
-
export declare class ArtifactViewerPanelComponent implements OnInit, OnChanges, OnDestroy {
|
|
12
|
+
export declare class ArtifactViewerPanelComponent extends BaseAngularComponent implements OnInit, OnChanges, OnDestroy {
|
|
12
13
|
private cdr;
|
|
13
14
|
private notificationService;
|
|
14
15
|
private sanitizer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-viewer-panel.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/artifact-viewer-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAA6C,IAAI,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACxL,OAAO,EAAE,YAAY,EAAY,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,QAAQ,EAA+B,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzG,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,gCAAgC,EAAwB,kBAAkB,EAAE,0BAA0B,EAA0B,oBAAoB,EAAuF,MAAM,+BAA+B,CAAC;AACrU,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,OAAO,EAAE,iCAAiC,EAAE,MAAM,yCAAyC,CAAC;AAC5F,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;;AAGxE,qBAMa,4BAA6B,YAAW,MAAM,EAAE,SAAS,EAAE,SAAS;
|
|
1
|
+
{"version":3,"file":"artifact-viewer-panel.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/artifact-viewer-panel.component.ts"],"names":[],"mappings":"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"}
|