@mj-biz-apps/issues-ng 0.0.1 → 1.0.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/report-issue/report-issue.component.d.ts +74 -0
- package/dist/lib/components/report-issue/report-issue.component.d.ts.map +1 -0
- package/dist/lib/components/report-issue/report-issue.component.js +344 -0
- package/dist/lib/components/report-issue/report-issue.component.js.map +1 -0
- package/dist/lib/custom/custom-forms.module.d.ts +12 -0
- package/dist/lib/custom/custom-forms.module.d.ts.map +1 -0
- package/dist/lib/custom/custom-forms.module.js +43 -0
- package/dist/lib/custom/custom-forms.module.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsIssuesIssue/mjbizappsissuesissue.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsIssuesIssue/mjbizappsissuesissue.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsIssuesIssue/mjbizappsissuesissue.form.component.js +108 -0
- package/dist/lib/generated/Entities/mjBizAppsIssuesIssue/mjbizappsissuesissue.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsIssuesIssueComment/mjbizappsissuesissuecomment.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsIssuesIssueComment/mjbizappsissuesissuecomment.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsIssuesIssueComment/mjbizappsissuesissuecomment.form.component.js +65 -0
- package/dist/lib/generated/Entities/mjBizAppsIssuesIssueComment/mjbizappsissuesissuecomment.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsIssuesIssueNumberSequence/mjbizappsissuesissuenumbersequence.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsIssuesIssueNumberSequence/mjbizappsissuesissuenumbersequence.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsIssuesIssueNumberSequence/mjbizappsissuesissuenumbersequence.form.component.js +59 -0
- package/dist/lib/generated/Entities/mjBizAppsIssuesIssueNumberSequence/mjbizappsissuesissuenumbersequence.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsIssuesIssueStatus/mjbizappsissuesissuestatus.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsIssuesIssueStatus/mjbizappsissuesissuestatus.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsIssuesIssueStatus/mjbizappsissuesissuestatus.form.component.js +88 -0
- package/dist/lib/generated/Entities/mjBizAppsIssuesIssueStatus/mjbizappsissuesissuestatus.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsIssuesIssueType/mjbizappsissuesissuetype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsIssuesIssueType/mjbizappsissuesissuetype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsIssuesIssueType/mjbizappsissuesissuetype.form.component.js +94 -0
- package/dist/lib/generated/Entities/mjBizAppsIssuesIssueType/mjbizappsissuesissuetype.form.component.js.map +1 -0
- package/dist/lib/generated/class-registrations-manifest.d.ts +22 -0
- package/dist/lib/generated/class-registrations-manifest.d.ts.map +1 -0
- package/dist/lib/generated/class-registrations-manifest.js +34 -0
- package/dist/lib/generated/class-registrations-manifest.js.map +1 -0
- package/dist/lib/generated/generated-forms.module.d.ts +22 -0
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -0
- package/dist/lib/generated/generated-forms.module.js +75 -0
- package/dist/lib/generated/generated-forms.module.js.map +1 -0
- package/dist/public-api.d.ts +20 -0
- package/dist/public-api.d.ts.map +1 -0
- package/dist/public-api.js +30 -0
- package/dist/public-api.js.map +1 -0
- package/package.json +45 -7
- package/README.md +0 -45
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { EventEmitter } from '@angular/core';
|
|
2
|
+
import { mjBizAppsIssuesIssueEntity, mjBizAppsIssuesIssueTypeEntity } from '@mj-biz-apps/issues-entities';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/** Severity / Priority union (mirrors the Issue entity). */
|
|
5
|
+
type IssuePriority = 'Low' | 'Medium' | 'High' | 'Critical';
|
|
6
|
+
/**
|
|
7
|
+
* ReportIssueComponent — a self-contained "Report an Issue / Submit Feedback" dialog.
|
|
8
|
+
*
|
|
9
|
+
* This is the entry point the Shell Extension surfaces (avatar/context menu). It is a thin
|
|
10
|
+
* client-side UI: it creates an Issue record directly via the MJ entity API (which routes
|
|
11
|
+
* through GraphQLDataProvider in the browser), defaulting status to the configured default
|
|
12
|
+
* status and priority to the chosen type's DefaultPriority. Server-side IssueType action hooks
|
|
13
|
+
* fire automatically when the record is saved.
|
|
14
|
+
*
|
|
15
|
+
* It can be opened standalone, or "about" a specific record by setting SourceEntityID +
|
|
16
|
+
* SourceRecordID (e.g. "report an issue about THIS dashboard"). AppScope tags which product the
|
|
17
|
+
* issue belongs to.
|
|
18
|
+
*
|
|
19
|
+
* Usage:
|
|
20
|
+
* ```html
|
|
21
|
+
* <mj-report-issue [(Visible)]="showReport" AppScope="MJC"
|
|
22
|
+
* (Submitted)="onIssueSubmitted($event)"></mj-report-issue>
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare class ReportIssueComponent {
|
|
26
|
+
private cdr;
|
|
27
|
+
private _visible;
|
|
28
|
+
/** Controls dialog visibility. On open, loads reference data (once). */
|
|
29
|
+
set Visible(value: boolean);
|
|
30
|
+
get Visible(): boolean;
|
|
31
|
+
VisibleChange: EventEmitter<boolean>;
|
|
32
|
+
/** Optional polymorphic source: the entity this issue is about. */
|
|
33
|
+
SourceEntityID: string | null;
|
|
34
|
+
/** Optional polymorphic source: the record ID this issue is about. */
|
|
35
|
+
SourceRecordID: string | null;
|
|
36
|
+
/** Optional app/product scope tag stamped onto the issue. */
|
|
37
|
+
AppScope: string | null;
|
|
38
|
+
/** Optional reporter email for anonymous/external reporters. */
|
|
39
|
+
ReporterEmail: string | null;
|
|
40
|
+
/** Emits the created Issue after a successful submit. */
|
|
41
|
+
Submitted: EventEmitter<mjBizAppsIssuesIssueEntity>;
|
|
42
|
+
/** Emits when the dialog is cancelled/closed without submitting. */
|
|
43
|
+
Cancelled: EventEmitter<void>;
|
|
44
|
+
IsLoading: boolean;
|
|
45
|
+
IsSubmitting: boolean;
|
|
46
|
+
ErrorMessage: string | null;
|
|
47
|
+
IssueTypes: mjBizAppsIssuesIssueTypeEntity[];
|
|
48
|
+
Title: string;
|
|
49
|
+
Description: string;
|
|
50
|
+
SelectedTypeID: string | null;
|
|
51
|
+
Severity: IssuePriority;
|
|
52
|
+
readonly SeverityOptions: IssuePriority[];
|
|
53
|
+
private defaultStatusID;
|
|
54
|
+
private referenceLoaded;
|
|
55
|
+
/** Loads issue types + the default status the first time the dialog opens. */
|
|
56
|
+
private onOpen;
|
|
57
|
+
private loadReferenceData;
|
|
58
|
+
/** Whether the form is valid enough to submit. */
|
|
59
|
+
get CanSubmit(): boolean;
|
|
60
|
+
/** Creates the Issue record and emits Submitted on success. */
|
|
61
|
+
Submit(): Promise<void>;
|
|
62
|
+
/** Cancels the dialog without submitting. */
|
|
63
|
+
Cancel(): void;
|
|
64
|
+
/** Handles the dialog's own Close event (escape/backdrop/X). */
|
|
65
|
+
OnDialogClose(): void;
|
|
66
|
+
/** The DefaultPriority of the currently-selected type, or 'Medium'. */
|
|
67
|
+
private selectedTypeDefaultPriority;
|
|
68
|
+
private resetForm;
|
|
69
|
+
private close;
|
|
70
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ReportIssueComponent, never>;
|
|
71
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ReportIssueComponent, "mj-report-issue", never, { "Visible": { "alias": "Visible"; "required": false; }; "SourceEntityID": { "alias": "SourceEntityID"; "required": false; }; "SourceRecordID": { "alias": "SourceRecordID"; "required": false; }; "AppScope": { "alias": "AppScope"; "required": false; }; "ReporterEmail": { "alias": "ReporterEmail"; "required": false; }; }, { "VisibleChange": "VisibleChange"; "Submitted": "Submitted"; "Cancelled": "Cancelled"; }, never, never, true, never>;
|
|
72
|
+
}
|
|
73
|
+
export {};
|
|
74
|
+
//# sourceMappingURL=report-issue.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-issue.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/report-issue/report-issue.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,YAAY,EAGb,MAAM,eAAe,CAAC;AAgBvB,OAAO,EACL,0BAA0B,EAC1B,8BAA8B,EAE/B,MAAM,8BAA8B,CAAC;;AAEtC,4DAA4D;AAC5D,KAAK,aAAa,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAE5D;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAgBa,oBAAoB;IAC/B,OAAO,CAAC,GAAG,CAA6B;IAMxC,OAAO,CAAC,QAAQ,CAAS;IACzB,wEAAwE;IACxE,IACI,OAAO,CAAC,KAAK,EAAE,OAAO,EAMzB;IACD,IAAI,OAAO,IAAI,OAAO,CAErB;IACS,aAAa,wBAA+B;IAEtD,mEAAmE;IAC1D,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC9C,sEAAsE;IAC7D,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC9C,6DAA6D;IACpD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IACxC,gEAAgE;IACvD,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE7C,yDAAyD;IAC/C,SAAS,2CAAkD;IACrE,oEAAoE;IAC1D,SAAS,qBAA4B;IAMxC,SAAS,UAAS;IAClB,YAAY,UAAS;IACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEnC,UAAU,EAAE,8BAA8B,EAAE,CAAM;IAGlD,KAAK,SAAM;IACX,WAAW,SAAM;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IACrC,QAAQ,EAAE,aAAa,CAAY;IAE1C,SAAgB,eAAe,EAAE,aAAa,EAAE,CAAyC;IAEzF,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,eAAe,CAAS;IAMhC,8EAA8E;YAChE,MAAM;YAmBN,iBAAiB;IAmC/B,kDAAkD;IAClD,IAAW,SAAS,IAAI,OAAO,CAE9B;IAED,+DAA+D;IAClD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAyCpC,6CAA6C;IACtC,MAAM,IAAI,IAAI;IAKrB,gEAAgE;IACzD,aAAa,IAAI,IAAI;IAQ5B,uEAAuE;IACvE,OAAO,CAAC,2BAA2B;IAKnC,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,KAAK;yCAhMF,oBAAoB;2CAApB,oBAAoB;CAqMhC"}
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, inject, ChangeDetectorRef, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import { Metadata, RunView, LogError } from '@memberjunction/core';
|
|
5
|
+
import { MJDialogComponent, MJDialogTitlebarComponent, MJDialogActionsComponent, MJDropdownComponent, MJButtonDirective, } from '@memberjunction/ng-ui-components';
|
|
6
|
+
// LoadingComponent (<mj-loading>) is declared by SharedGenericModule (non-standalone),
|
|
7
|
+
// so we import the module rather than the component into this standalone component.
|
|
8
|
+
import { SharedGenericModule } from '@memberjunction/ng-shared-generic';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@angular/forms";
|
|
11
|
+
import * as i2 from "@memberjunction/ng-shared-generic";
|
|
12
|
+
function ReportIssueComponent_Conditional_0_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
13
|
+
i0.ɵɵelementStart(0, "div", 4);
|
|
14
|
+
i0.ɵɵelement(1, "mj-loading", 8);
|
|
15
|
+
i0.ɵɵelementEnd();
|
|
16
|
+
} }
|
|
17
|
+
function ReportIssueComponent_Conditional_0_Conditional_6_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
18
|
+
i0.ɵɵelementStart(0, "div", 9);
|
|
19
|
+
i0.ɵɵelement(1, "i", 17);
|
|
20
|
+
i0.ɵɵtext(2);
|
|
21
|
+
i0.ɵɵelementEnd();
|
|
22
|
+
} if (rf & 2) {
|
|
23
|
+
const ctx_r1 = i0.ɵɵnextContext(3);
|
|
24
|
+
i0.ɵɵadvance(2);
|
|
25
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.ErrorMessage, " ");
|
|
26
|
+
} }
|
|
27
|
+
function ReportIssueComponent_Conditional_0_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
28
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
29
|
+
i0.ɵɵelementStart(0, "div", 5);
|
|
30
|
+
i0.ɵɵconditionalCreate(1, ReportIssueComponent_Conditional_0_Conditional_6_Conditional_1_Template, 3, 1, "div", 9);
|
|
31
|
+
i0.ɵɵelementStart(2, "label", 10)(3, "span", 11);
|
|
32
|
+
i0.ɵɵtext(4, "Type");
|
|
33
|
+
i0.ɵɵelementEnd();
|
|
34
|
+
i0.ɵɵelementStart(5, "mj-dropdown", 12);
|
|
35
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ReportIssueComponent_Conditional_0_Conditional_6_Template_mj_dropdown_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.SelectedTypeID, $event) || (ctx_r1.SelectedTypeID = $event); return i0.ɵɵresetView($event); });
|
|
36
|
+
i0.ɵɵelementEnd()();
|
|
37
|
+
i0.ɵɵelementStart(6, "label", 10)(7, "span", 11);
|
|
38
|
+
i0.ɵɵtext(8, "Title ");
|
|
39
|
+
i0.ɵɵelementStart(9, "span", 13);
|
|
40
|
+
i0.ɵɵtext(10, "*");
|
|
41
|
+
i0.ɵɵelementEnd()();
|
|
42
|
+
i0.ɵɵelementStart(11, "input", 14);
|
|
43
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ReportIssueComponent_Conditional_0_Conditional_6_Template_input_ngModelChange_11_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.Title, $event) || (ctx_r1.Title = $event); return i0.ɵɵresetView($event); });
|
|
44
|
+
i0.ɵɵelementEnd()();
|
|
45
|
+
i0.ɵɵelementStart(12, "label", 10)(13, "span", 11);
|
|
46
|
+
i0.ɵɵtext(14, "Description");
|
|
47
|
+
i0.ɵɵelementEnd();
|
|
48
|
+
i0.ɵɵelementStart(15, "textarea", 15);
|
|
49
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ReportIssueComponent_Conditional_0_Conditional_6_Template_textarea_ngModelChange_15_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.Description, $event) || (ctx_r1.Description = $event); return i0.ɵɵresetView($event); });
|
|
50
|
+
i0.ɵɵelementEnd()();
|
|
51
|
+
i0.ɵɵelementStart(16, "label", 10)(17, "span", 11);
|
|
52
|
+
i0.ɵɵtext(18, "Severity");
|
|
53
|
+
i0.ɵɵelementEnd();
|
|
54
|
+
i0.ɵɵelementStart(19, "mj-dropdown", 16);
|
|
55
|
+
i0.ɵɵtwoWayListener("ngModelChange", function ReportIssueComponent_Conditional_0_Conditional_6_Template_mj_dropdown_ngModelChange_19_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.Severity, $event) || (ctx_r1.Severity = $event); return i0.ɵɵresetView($event); });
|
|
56
|
+
i0.ɵɵelementEnd()()();
|
|
57
|
+
} if (rf & 2) {
|
|
58
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
59
|
+
i0.ɵɵadvance();
|
|
60
|
+
i0.ɵɵconditional(ctx_r1.ErrorMessage ? 1 : -1);
|
|
61
|
+
i0.ɵɵadvance(4);
|
|
62
|
+
i0.ɵɵproperty("Data", ctx_r1.IssueTypes)("ValuePrimitive", true);
|
|
63
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.SelectedTypeID);
|
|
64
|
+
i0.ɵɵadvance(6);
|
|
65
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.Title);
|
|
66
|
+
i0.ɵɵadvance(4);
|
|
67
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.Description);
|
|
68
|
+
i0.ɵɵadvance(4);
|
|
69
|
+
i0.ɵɵproperty("Data", ctx_r1.SeverityOptions)("ValuePrimitive", true);
|
|
70
|
+
i0.ɵɵtwoWayProperty("ngModel", ctx_r1.Severity);
|
|
71
|
+
} }
|
|
72
|
+
function ReportIssueComponent_Conditional_0_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
73
|
+
i0.ɵɵtext(0, " Submitting\u2026 ");
|
|
74
|
+
} }
|
|
75
|
+
function ReportIssueComponent_Conditional_0_Conditional_10_Template(rf, ctx) { if (rf & 1) {
|
|
76
|
+
i0.ɵɵtext(0, " Submit ");
|
|
77
|
+
} }
|
|
78
|
+
function ReportIssueComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
79
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
80
|
+
i0.ɵɵelementStart(0, "mj-dialog", 1);
|
|
81
|
+
i0.ɵɵlistener("Close", function ReportIssueComponent_Conditional_0_Template_mj_dialog_Close_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnDialogClose()); });
|
|
82
|
+
i0.ɵɵelementStart(1, "mj-dialog-titlebar")(2, "span", 2);
|
|
83
|
+
i0.ɵɵelement(3, "i", 3);
|
|
84
|
+
i0.ɵɵtext(4, " Report an Issue");
|
|
85
|
+
i0.ɵɵelementEnd()();
|
|
86
|
+
i0.ɵɵconditionalCreate(5, ReportIssueComponent_Conditional_0_Conditional_5_Template, 2, 0, "div", 4)(6, ReportIssueComponent_Conditional_0_Conditional_6_Template, 20, 9, "div", 5);
|
|
87
|
+
i0.ɵɵelementStart(7, "mj-dialog-actions")(8, "button", 6);
|
|
88
|
+
i0.ɵɵlistener("click", function ReportIssueComponent_Conditional_0_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.Submit()); });
|
|
89
|
+
i0.ɵɵconditionalCreate(9, ReportIssueComponent_Conditional_0_Conditional_9_Template, 1, 0)(10, ReportIssueComponent_Conditional_0_Conditional_10_Template, 1, 0);
|
|
90
|
+
i0.ɵɵelementEnd();
|
|
91
|
+
i0.ɵɵelementStart(11, "button", 7);
|
|
92
|
+
i0.ɵɵlistener("click", function ReportIssueComponent_Conditional_0_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.Cancel()); });
|
|
93
|
+
i0.ɵɵtext(12, " Cancel ");
|
|
94
|
+
i0.ɵɵelementEnd()()();
|
|
95
|
+
} if (rf & 2) {
|
|
96
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
97
|
+
i0.ɵɵproperty("Visible", ctx_r1.Visible)("Width", 560)("Closeable", true);
|
|
98
|
+
i0.ɵɵadvance(5);
|
|
99
|
+
i0.ɵɵconditional(ctx_r1.IsLoading ? 5 : 6);
|
|
100
|
+
i0.ɵɵadvance(3);
|
|
101
|
+
i0.ɵɵproperty("disabled", !ctx_r1.CanSubmit);
|
|
102
|
+
i0.ɵɵadvance();
|
|
103
|
+
i0.ɵɵconditional(ctx_r1.IsSubmitting ? 9 : 10);
|
|
104
|
+
i0.ɵɵadvance(2);
|
|
105
|
+
i0.ɵɵproperty("disabled", ctx_r1.IsSubmitting);
|
|
106
|
+
} }
|
|
107
|
+
/**
|
|
108
|
+
* ReportIssueComponent — a self-contained "Report an Issue / Submit Feedback" dialog.
|
|
109
|
+
*
|
|
110
|
+
* This is the entry point the Shell Extension surfaces (avatar/context menu). It is a thin
|
|
111
|
+
* client-side UI: it creates an Issue record directly via the MJ entity API (which routes
|
|
112
|
+
* through GraphQLDataProvider in the browser), defaulting status to the configured default
|
|
113
|
+
* status and priority to the chosen type's DefaultPriority. Server-side IssueType action hooks
|
|
114
|
+
* fire automatically when the record is saved.
|
|
115
|
+
*
|
|
116
|
+
* It can be opened standalone, or "about" a specific record by setting SourceEntityID +
|
|
117
|
+
* SourceRecordID (e.g. "report an issue about THIS dashboard"). AppScope tags which product the
|
|
118
|
+
* issue belongs to.
|
|
119
|
+
*
|
|
120
|
+
* Usage:
|
|
121
|
+
* ```html
|
|
122
|
+
* <mj-report-issue [(Visible)]="showReport" AppScope="MJC"
|
|
123
|
+
* (Submitted)="onIssueSubmitted($event)"></mj-report-issue>
|
|
124
|
+
* ```
|
|
125
|
+
*/
|
|
126
|
+
export class ReportIssueComponent {
|
|
127
|
+
cdr = inject(ChangeDetectorRef);
|
|
128
|
+
// ----------------------------------------------------------------
|
|
129
|
+
// Inputs / Outputs
|
|
130
|
+
// ----------------------------------------------------------------
|
|
131
|
+
_visible = false;
|
|
132
|
+
/** Controls dialog visibility. On open, loads reference data (once). */
|
|
133
|
+
set Visible(value) {
|
|
134
|
+
const wasVisible = this._visible;
|
|
135
|
+
this._visible = value;
|
|
136
|
+
if (value && !wasVisible) {
|
|
137
|
+
void this.onOpen();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
get Visible() {
|
|
141
|
+
return this._visible;
|
|
142
|
+
}
|
|
143
|
+
VisibleChange = new EventEmitter();
|
|
144
|
+
/** Optional polymorphic source: the entity this issue is about. */
|
|
145
|
+
SourceEntityID = null;
|
|
146
|
+
/** Optional polymorphic source: the record ID this issue is about. */
|
|
147
|
+
SourceRecordID = null;
|
|
148
|
+
/** Optional app/product scope tag stamped onto the issue. */
|
|
149
|
+
AppScope = null;
|
|
150
|
+
/** Optional reporter email for anonymous/external reporters. */
|
|
151
|
+
ReporterEmail = null;
|
|
152
|
+
/** Emits the created Issue after a successful submit. */
|
|
153
|
+
Submitted = new EventEmitter();
|
|
154
|
+
/** Emits when the dialog is cancelled/closed without submitting. */
|
|
155
|
+
Cancelled = new EventEmitter();
|
|
156
|
+
// ----------------------------------------------------------------
|
|
157
|
+
// State
|
|
158
|
+
// ----------------------------------------------------------------
|
|
159
|
+
IsLoading = false;
|
|
160
|
+
IsSubmitting = false;
|
|
161
|
+
ErrorMessage = null;
|
|
162
|
+
IssueTypes = [];
|
|
163
|
+
// Form model
|
|
164
|
+
Title = '';
|
|
165
|
+
Description = '';
|
|
166
|
+
SelectedTypeID = null;
|
|
167
|
+
Severity = 'Medium';
|
|
168
|
+
SeverityOptions = ['Low', 'Medium', 'High', 'Critical'];
|
|
169
|
+
defaultStatusID = null;
|
|
170
|
+
referenceLoaded = false;
|
|
171
|
+
// ----------------------------------------------------------------
|
|
172
|
+
// Lifecycle
|
|
173
|
+
// ----------------------------------------------------------------
|
|
174
|
+
/** Loads issue types + the default status the first time the dialog opens. */
|
|
175
|
+
async onOpen() {
|
|
176
|
+
this.resetForm();
|
|
177
|
+
if (this.referenceLoaded) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
this.IsLoading = true;
|
|
181
|
+
this.cdr.detectChanges();
|
|
182
|
+
try {
|
|
183
|
+
await this.loadReferenceData();
|
|
184
|
+
this.referenceLoaded = true;
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
this.ErrorMessage = 'Failed to load issue options. Please try again.';
|
|
188
|
+
LogError(`ReportIssueComponent.onOpen: ${err instanceof Error ? err.message : String(err)}`);
|
|
189
|
+
}
|
|
190
|
+
finally {
|
|
191
|
+
this.IsLoading = false;
|
|
192
|
+
this.cdr.detectChanges();
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
async loadReferenceData() {
|
|
196
|
+
const rv = new RunView();
|
|
197
|
+
const [typesResult, statusesResult] = await rv.RunViews([
|
|
198
|
+
{
|
|
199
|
+
EntityName: 'MJ_BizApps_Issues: Issue Types',
|
|
200
|
+
ExtraFilter: 'IsActive = 1',
|
|
201
|
+
OrderBy: 'Name',
|
|
202
|
+
ResultType: 'entity_object',
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
EntityName: 'MJ_BizApps_Issues: Issue Status',
|
|
206
|
+
ExtraFilter: 'IsDefault = 1',
|
|
207
|
+
ResultType: 'entity_object',
|
|
208
|
+
},
|
|
209
|
+
]);
|
|
210
|
+
if (typesResult.Success) {
|
|
211
|
+
this.IssueTypes = typesResult.Results;
|
|
212
|
+
this.SelectedTypeID = this.IssueTypes[0]?.ID ?? null;
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
LogError(`ReportIssueComponent: failed to load Issue Types: ${typesResult.ErrorMessage}`);
|
|
216
|
+
}
|
|
217
|
+
if (statusesResult.Success) {
|
|
218
|
+
const statuses = statusesResult.Results;
|
|
219
|
+
this.defaultStatusID = statuses[0]?.ID ?? null;
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
LogError(`ReportIssueComponent: failed to load default status: ${statusesResult.ErrorMessage}`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// ----------------------------------------------------------------
|
|
226
|
+
// Actions
|
|
227
|
+
// ----------------------------------------------------------------
|
|
228
|
+
/** Whether the form is valid enough to submit. */
|
|
229
|
+
get CanSubmit() {
|
|
230
|
+
return !this.IsSubmitting && this.Title.trim().length > 0 && !!this.SelectedTypeID && !!this.defaultStatusID;
|
|
231
|
+
}
|
|
232
|
+
/** Creates the Issue record and emits Submitted on success. */
|
|
233
|
+
async Submit() {
|
|
234
|
+
if (!this.CanSubmit) {
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
this.IsSubmitting = true;
|
|
238
|
+
this.ErrorMessage = null;
|
|
239
|
+
this.cdr.detectChanges();
|
|
240
|
+
try {
|
|
241
|
+
const md = new Metadata();
|
|
242
|
+
const issue = await md.GetEntityObject('MJ_BizApps_Issues: Issues');
|
|
243
|
+
issue.NewRecord();
|
|
244
|
+
issue.Title = this.Title.trim();
|
|
245
|
+
issue.Description = this.Description.trim() || null;
|
|
246
|
+
issue.IssueTypeID = this.SelectedTypeID;
|
|
247
|
+
issue.StatusID = this.defaultStatusID;
|
|
248
|
+
issue.Severity = this.Severity;
|
|
249
|
+
issue.Priority = this.selectedTypeDefaultPriority();
|
|
250
|
+
issue.ReporterEmail = this.ReporterEmail;
|
|
251
|
+
issue.SourceEntityID = this.SourceEntityID;
|
|
252
|
+
issue.SourceRecordID = this.SourceRecordID;
|
|
253
|
+
issue.AppScope = this.AppScope;
|
|
254
|
+
const saved = await issue.Save();
|
|
255
|
+
if (!saved) {
|
|
256
|
+
this.ErrorMessage = issue.LatestResult?.CompleteMessage ?? 'Failed to submit the issue.';
|
|
257
|
+
LogError(`ReportIssueComponent.Submit: ${this.ErrorMessage}`);
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
this.Submitted.emit(issue);
|
|
261
|
+
this.close();
|
|
262
|
+
}
|
|
263
|
+
catch (err) {
|
|
264
|
+
this.ErrorMessage = 'An unexpected error occurred while submitting.';
|
|
265
|
+
LogError(`ReportIssueComponent.Submit: ${err instanceof Error ? err.message : String(err)}`);
|
|
266
|
+
}
|
|
267
|
+
finally {
|
|
268
|
+
this.IsSubmitting = false;
|
|
269
|
+
this.cdr.detectChanges();
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/** Cancels the dialog without submitting. */
|
|
273
|
+
Cancel() {
|
|
274
|
+
this.Cancelled.emit();
|
|
275
|
+
this.close();
|
|
276
|
+
}
|
|
277
|
+
/** Handles the dialog's own Close event (escape/backdrop/X). */
|
|
278
|
+
OnDialogClose() {
|
|
279
|
+
this.Cancel();
|
|
280
|
+
}
|
|
281
|
+
// ----------------------------------------------------------------
|
|
282
|
+
// Helpers
|
|
283
|
+
// ----------------------------------------------------------------
|
|
284
|
+
/** The DefaultPriority of the currently-selected type, or 'Medium'. */
|
|
285
|
+
selectedTypeDefaultPriority() {
|
|
286
|
+
const type = this.IssueTypes.find((t) => t.ID === this.SelectedTypeID);
|
|
287
|
+
return type?.DefaultPriority ?? 'Medium';
|
|
288
|
+
}
|
|
289
|
+
resetForm() {
|
|
290
|
+
this.Title = '';
|
|
291
|
+
this.Description = '';
|
|
292
|
+
this.Severity = 'Medium';
|
|
293
|
+
this.ErrorMessage = null;
|
|
294
|
+
this.SelectedTypeID = this.IssueTypes[0]?.ID ?? null;
|
|
295
|
+
}
|
|
296
|
+
close() {
|
|
297
|
+
this._visible = false;
|
|
298
|
+
this.VisibleChange.emit(false);
|
|
299
|
+
this.cdr.detectChanges();
|
|
300
|
+
}
|
|
301
|
+
static ɵfac = function ReportIssueComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ReportIssueComponent)(); };
|
|
302
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ReportIssueComponent, selectors: [["mj-report-issue"]], inputs: { Visible: "Visible", SourceEntityID: "SourceEntityID", SourceRecordID: "SourceRecordID", AppScope: "AppScope", ReporterEmail: "ReporterEmail" }, outputs: { VisibleChange: "VisibleChange", Submitted: "Submitted", Cancelled: "Cancelled" }, decls: 1, vars: 1, consts: [["Title", "Report an Issue", 3, "Visible", "Width", "Closeable"], ["Title", "Report an Issue", 3, "Close", "Visible", "Width", "Closeable"], [1, "ri-title"], [1, "fa-solid", "fa-life-ring"], [1, "ri-loading"], [1, "ri-body"], ["mjButton", "", "variant", "primary", 3, "click", "disabled"], ["mjButton", "", "variant", "secondary", 3, "click", "disabled"], ["text", "Loading options...", "size", "medium"], ["role", "alert", 1, "ri-error"], [1, "ri-field"], [1, "ri-label"], ["TextField", "Name", "ValueField", "ID", "Placeholder", "Select an issue type", 3, "ngModelChange", "Data", "ValuePrimitive", "ngModel"], [1, "ri-required"], ["type", "text", "maxlength", "500", "placeholder", "Short summary of the issue", 1, "mj-input", 3, "ngModelChange", "ngModel"], ["rows", "5", "placeholder", "What happened? Steps to reproduce, expected vs. actual\u2026", 1, "mj-textarea", 3, "ngModelChange", "ngModel"], [3, "ngModelChange", "Data", "ValuePrimitive", "ngModel"], [1, "fa-solid", "fa-triangle-exclamation"]], template: function ReportIssueComponent_Template(rf, ctx) { if (rf & 1) {
|
|
303
|
+
i0.ɵɵconditionalCreate(0, ReportIssueComponent_Conditional_0_Template, 13, 7, "mj-dialog", 0);
|
|
304
|
+
} if (rf & 2) {
|
|
305
|
+
i0.ɵɵconditional(ctx.Visible ? 0 : -1);
|
|
306
|
+
} }, dependencies: [CommonModule,
|
|
307
|
+
FormsModule, i1.DefaultValueAccessor, i1.NgControlStatus, i1.MaxLengthValidator, i1.NgModel, MJDialogComponent,
|
|
308
|
+
MJDialogTitlebarComponent,
|
|
309
|
+
MJDialogActionsComponent,
|
|
310
|
+
MJDropdownComponent,
|
|
311
|
+
MJButtonDirective,
|
|
312
|
+
SharedGenericModule, i2.LoadingComponent], styles: [".ri-title[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.ri-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.ri-loading[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 160px;\n}\n\n.ri-body[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 4px 2px;\n}\n\n.ri-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.ri-label[_ngcontent-%COMP%] {\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.ri-required[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.ri-error[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 12px;\n border-radius: 6px;\n font-size: 0.9rem;\n color: var(--mj-status-error-text);\n background: var(--mj-status-error-bg);\n border: 1px solid var(--mj-status-error-border);\n}\n\n\n\n.ri-field[_ngcontent-%COMP%] .mj-input[_ngcontent-%COMP%], \n.ri-field[_ngcontent-%COMP%] .mj-textarea[_ngcontent-%COMP%] {\n width: 100%;\n box-sizing: border-box;\n}\n\n.ri-field[_ngcontent-%COMP%] .mj-textarea[_ngcontent-%COMP%] {\n resize: vertical;\n min-height: 96px;\n}"] });
|
|
313
|
+
}
|
|
314
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ReportIssueComponent, [{
|
|
315
|
+
type: Component,
|
|
316
|
+
args: [{ selector: 'mj-report-issue', standalone: true, imports: [
|
|
317
|
+
CommonModule,
|
|
318
|
+
FormsModule,
|
|
319
|
+
MJDialogComponent,
|
|
320
|
+
MJDialogTitlebarComponent,
|
|
321
|
+
MJDialogActionsComponent,
|
|
322
|
+
MJDropdownComponent,
|
|
323
|
+
MJButtonDirective,
|
|
324
|
+
SharedGenericModule,
|
|
325
|
+
], template: "@if (Visible) {\n <mj-dialog [Visible]=\"Visible\" Title=\"Report an Issue\" [Width]=\"560\" [Closeable]=\"true\" (Close)=\"OnDialogClose()\">\n <mj-dialog-titlebar>\n <span class=\"ri-title\"><i class=\"fa-solid fa-life-ring\"></i> Report an Issue</span>\n </mj-dialog-titlebar>\n\n @if (IsLoading) {\n <div class=\"ri-loading\">\n <mj-loading text=\"Loading options...\" size=\"medium\"></mj-loading>\n </div>\n } @else {\n <div class=\"ri-body\">\n @if (ErrorMessage) {\n <div class=\"ri-error\" role=\"alert\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i> {{ ErrorMessage }}\n </div>\n }\n\n <label class=\"ri-field\">\n <span class=\"ri-label\">Type</span>\n <mj-dropdown\n [Data]=\"IssueTypes\"\n TextField=\"Name\"\n ValueField=\"ID\"\n [ValuePrimitive]=\"true\"\n Placeholder=\"Select an issue type\"\n [(ngModel)]=\"SelectedTypeID\">\n </mj-dropdown>\n </label>\n\n <label class=\"ri-field\">\n <span class=\"ri-label\">Title <span class=\"ri-required\">*</span></span>\n <input\n class=\"mj-input\"\n type=\"text\"\n maxlength=\"500\"\n placeholder=\"Short summary of the issue\"\n [(ngModel)]=\"Title\" />\n </label>\n\n <label class=\"ri-field\">\n <span class=\"ri-label\">Description</span>\n <textarea\n class=\"mj-textarea\"\n rows=\"5\"\n placeholder=\"What happened? Steps to reproduce, expected vs. actual\u2026\"\n [(ngModel)]=\"Description\"></textarea>\n </label>\n\n <label class=\"ri-field\">\n <span class=\"ri-label\">Severity</span>\n <mj-dropdown\n [Data]=\"SeverityOptions\"\n [ValuePrimitive]=\"true\"\n [(ngModel)]=\"Severity\">\n </mj-dropdown>\n </label>\n </div>\n }\n\n <mj-dialog-actions>\n <!-- Confirm/submit on the LEFT, cancel on the RIGHT (MJ convention). -->\n <button mjButton variant=\"primary\" [disabled]=\"!CanSubmit\" (click)=\"Submit()\">\n @if (IsSubmitting) { Submitting\u2026 } @else { Submit }\n </button>\n <button mjButton variant=\"secondary\" [disabled]=\"IsSubmitting\" (click)=\"Cancel()\">\n Cancel\n </button>\n </mj-dialog-actions>\n </mj-dialog>\n}\n", styles: [".ri-title {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.ri-title i {\n color: var(--mj-brand-primary);\n}\n\n.ri-loading {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 160px;\n}\n\n.ri-body {\n display: flex;\n flex-direction: column;\n gap: 16px;\n padding: 4px 2px;\n}\n\n.ri-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n\n.ri-label {\n font-size: 0.85rem;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.ri-required {\n color: var(--mj-status-error);\n}\n\n.ri-error {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 12px;\n border-radius: 6px;\n font-size: 0.9rem;\n color: var(--mj-status-error-text);\n background: var(--mj-status-error-bg);\n border: 1px solid var(--mj-status-error-border);\n}\n\n/* Native form controls use the shared MJ input/textarea classes; only layout here. */\n.ri-field .mj-input,\n.ri-field .mj-textarea {\n width: 100%;\n box-sizing: border-box;\n}\n\n.ri-field .mj-textarea {\n resize: vertical;\n min-height: 96px;\n}\n"] }]
|
|
326
|
+
}], null, { Visible: [{
|
|
327
|
+
type: Input
|
|
328
|
+
}], VisibleChange: [{
|
|
329
|
+
type: Output
|
|
330
|
+
}], SourceEntityID: [{
|
|
331
|
+
type: Input
|
|
332
|
+
}], SourceRecordID: [{
|
|
333
|
+
type: Input
|
|
334
|
+
}], AppScope: [{
|
|
335
|
+
type: Input
|
|
336
|
+
}], ReporterEmail: [{
|
|
337
|
+
type: Input
|
|
338
|
+
}], Submitted: [{
|
|
339
|
+
type: Output
|
|
340
|
+
}], Cancelled: [{
|
|
341
|
+
type: Output
|
|
342
|
+
}] }); })();
|
|
343
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ReportIssueComponent, { className: "ReportIssueComponent", filePath: "lib/components/report-issue/report-issue.component.ts", lineNumber: 68 }); })();
|
|
344
|
+
//# sourceMappingURL=report-issue.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report-issue.component.js","sourceRoot":"","sources":["../../../../src/lib/components/report-issue/report-issue.component.ts","../../../../src/lib/components/report-issue/report-issue.component.html"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,KAAK,EACL,MAAM,EACN,YAAY,EACZ,MAAM,EACN,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EACL,iBAAiB,EACjB,yBAAyB,EACzB,wBAAwB,EACxB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,kCAAkC,CAAC;AAC1C,uFAAuF;AACvF,oFAAoF;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;;;;;ICdlE,8BAAwB;IACtB,gCAAiE;IACnE,iBAAM;;;IAIF,8BAAmC;IACjC,wBAAgD;IAAC,YACnD;IAAA,iBAAM;;;IAD6C,eACnD;IADmD,oDACnD;;;;IAJJ,8BAAqB;IACnB,kHAAoB;IAOlB,AADF,iCAAwB,eACC;IAAA,oBAAI;IAAA,iBAAO;IAClC,uCAM+B;IAA7B,6UAA4B;IAEhC,AADE,iBAAc,EACR;IAGN,AADF,iCAAwB,eACC;IAAA,sBAAM;IAAA,gCAA0B;IAAA,kBAAC;IAAO,AAAP,iBAAO,EAAO;IACtE,kCAKwB;IAAtB,sTAAmB;IACvB,AANE,iBAKwB,EAClB;IAGN,AADF,kCAAwB,gBACC;IAAA,4BAAW;IAAA,iBAAO;IACzC,qCAI4B;IAA1B,qUAAyB;IAC7B,AAD8B,iBAAW,EACjC;IAGN,AADF,kCAAwB,gBACC;IAAA,yBAAQ;IAAA,iBAAO;IACtC,wCAGyB;IAAvB,kUAAsB;IAG5B,AADE,AADE,iBAAc,EACR,EACJ;;;IA7CJ,cAIC;IAJD,8CAIC;IAKG,eAAmB;IAGnB,AAHA,wCAAmB,wBAGI;IAEvB,qDAA4B;IAW5B,eAAmB;IAAnB,4CAAmB;IASnB,eAAyB;IAAzB,kDAAyB;IAMzB,eAAwB;IACxB,AADA,6CAAwB,wBACD;IACvB,+CAAsB;;;IASL,kCAAY;;;IAAU,wBAAO;;;;IA9DxD,oCAAkH;IAA1B,2LAAS,sBAAe,KAAC;IAE7G,AADF,0CAAoB,cACK;IAAA,uBAAqC;IAAC,gCAAe;IAC9E,AAD8E,iBAAO,EAChE;IAMnB,AAJF,oGAAiB,+EAIR;IAoDP,AAFF,yCAAmB,gBAE6D;IAAnB,wLAAS,eAAQ,KAAC;IACxC,AAAnC,0FAAoB,sEAAsB;IAC5C,iBAAS;IACT,kCAAkF;IAAnB,yLAAS,eAAQ,KAAC;IAC/E,yBACF;IAEJ,AADE,AADE,iBAAS,EACS,EACV;;;IApEyD,AAAd,AAA5C,wCAAmB,cAAsC,mBAAmB;IAKrF,eAoDC;IApDD,0CAoDC;IAIoC,eAAuB;IAAvB,4CAAuB;IACxD,cAAmD;IAAnD,8CAAmD;IAEhB,eAAyB;IAAzB,8CAAyB;;ADjCpE;;;;;;;;;;;;;;;;;;GAkBG;AAiBH,MAAM,OAAO,oBAAoB;IACvB,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAExC,mEAAmE;IACnE,mBAAmB;IACnB,mEAAmE;IAE3D,QAAQ,GAAG,KAAK,CAAC;IACzB,wEAAwE;IACxE,IACI,OAAO,CAAC,KAAc;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;YACzB,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IACD,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IACS,aAAa,GAAG,IAAI,YAAY,EAAW,CAAC;IAEtD,mEAAmE;IAC1D,cAAc,GAAkB,IAAI,CAAC;IAC9C,sEAAsE;IAC7D,cAAc,GAAkB,IAAI,CAAC;IAC9C,6DAA6D;IACpD,QAAQ,GAAkB,IAAI,CAAC;IACxC,gEAAgE;IACvD,aAAa,GAAkB,IAAI,CAAC;IAE7C,yDAAyD;IAC/C,SAAS,GAAG,IAAI,YAAY,EAA8B,CAAC;IACrE,oEAAoE;IAC1D,SAAS,GAAG,IAAI,YAAY,EAAQ,CAAC;IAE/C,mEAAmE;IACnE,QAAQ;IACR,mEAAmE;IAE5D,SAAS,GAAG,KAAK,CAAC;IAClB,YAAY,GAAG,KAAK,CAAC;IACrB,YAAY,GAAkB,IAAI,CAAC;IAEnC,UAAU,GAAqC,EAAE,CAAC;IAEzD,aAAa;IACN,KAAK,GAAG,EAAE,CAAC;IACX,WAAW,GAAG,EAAE,CAAC;IACjB,cAAc,GAAkB,IAAI,CAAC;IACrC,QAAQ,GAAkB,QAAQ,CAAC;IAE1B,eAAe,GAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAEjF,eAAe,GAAkB,IAAI,CAAC;IACtC,eAAe,GAAG,KAAK,CAAC;IAEhC,mEAAmE;IACnE,YAAY;IACZ,mEAAmE;IAEnE,8EAA8E;IACtE,KAAK,CAAC,MAAM;QAClB,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC/B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,YAAY,GAAG,iDAAiD,CAAC;YACtE,QAAQ,CAAC,gCAAgC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/F,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,MAAM,EAAE,GAAG,IAAI,OAAO,EAAE,CAAC;QACzB,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC;YACtD;gBACE,UAAU,EAAE,gCAAgC;gBAC5C,WAAW,EAAE,cAAc;gBAC3B,OAAO,EAAE,MAAM;gBACf,UAAU,EAAE,eAAe;aAC5B;YACD;gBACE,UAAU,EAAE,iCAAiC;gBAC7C,WAAW,EAAE,eAAe;gBAC5B,UAAU,EAAE,eAAe;aAC5B;SACF,CAAC,CAAC;QAEH,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,OAA2C,CAAC;YAC1E,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,qDAAqD,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC;QAC5F,CAAC;QAED,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,cAAc,CAAC,OAA6C,CAAC;YAC9E,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,wDAAwD,cAAc,CAAC,YAAY,EAAE,CAAC,CAAC;QAClG,CAAC;IACH,CAAC;IAED,mEAAmE;IACnE,UAAU;IACV,mEAAmE;IAEnE,kDAAkD;IAClD,IAAW,SAAS;QAClB,OAAO,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC;IAC/G,CAAC;IAED,+DAA+D;IACxD,KAAK,CAAC,MAAM;QACjB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAEzB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,eAAe,CAA6B,2BAA2B,CAAC,CAAC;YAChG,KAAK,CAAC,SAAS,EAAE,CAAC;YAClB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAChC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;YACpD,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,cAAe,CAAC;YACzC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,eAAgB,CAAC;YACvC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/B,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,2BAA2B,EAAE,CAAC;YACpD,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;YACzC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;YAC3C,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;YAC3C,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAE/B,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,YAAY,EAAE,eAAe,IAAI,6BAA6B,CAAC;gBACzF,QAAQ,CAAC,gCAAgC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;gBAC9D,OAAO;YACT,CAAC;YAED,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,YAAY,GAAG,gDAAgD,CAAC;YACrE,QAAQ,CAAC,gCAAgC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/F,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,6CAA6C;IACtC,MAAM;QACX,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACtB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED,gEAAgE;IACzD,aAAa;QAClB,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAED,mEAAmE;IACnE,UAAU;IACV,mEAAmE;IAEnE,uEAAuE;IAC/D,2BAA2B;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,cAAc,CAAC,CAAC;QACvE,OAAQ,IAAI,EAAE,eAAiC,IAAI,QAAQ,CAAC;IAC9D,CAAC;IAEO,SAAS;QACf,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC;IACvD,CAAC;IAEO,KAAK;QACX,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;IAC3B,CAAC;8GApMU,oBAAoB;6DAApB,oBAAoB;YCnEjC,6FAAe;;YAAf,sCAsEC;4BDfG,YAAY;YACZ,WAAW,kFACX,iBAAiB;YACjB,yBAAyB;YACzB,wBAAwB;YACxB,mBAAmB;YACnB,iBAAiB;YACjB,mBAAmB;;iFAKV,oBAAoB;cAhBhC,SAAS;2BACE,iBAAiB,cACf,IAAI,WACP;oBACP,YAAY;oBACZ,WAAW;oBACX,iBAAiB;oBACjB,yBAAyB;oBACzB,wBAAwB;oBACxB,mBAAmB;oBACnB,iBAAiB;oBACjB,mBAAmB;iBACpB;;kBAaA,KAAK;;kBAWL,MAAM;;kBAGN,KAAK;;kBAEL,KAAK;;kBAEL,KAAK;;kBAEL,KAAK;;kBAGL,MAAM;;kBAEN,MAAM;;kFAlCI,oBAAoB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as i0 from "@angular/core";
|
|
2
|
+
import * as i1 from "@angular/common";
|
|
3
|
+
import * as i2 from "@angular/forms";
|
|
4
|
+
import * as i3 from "@memberjunction/ng-base-forms";
|
|
5
|
+
import * as i4 from "@memberjunction/ng-link-directives";
|
|
6
|
+
import * as i5 from "../components/report-issue/report-issue.component";
|
|
7
|
+
export declare class CustomFormsModule {
|
|
8
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CustomFormsModule, never>;
|
|
9
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<CustomFormsModule, never, [typeof i1.CommonModule, typeof i2.FormsModule, typeof i3.BaseFormsModule, typeof i4.LinkDirectivesModule, typeof i5.ReportIssueComponent], [typeof i5.ReportIssueComponent]>;
|
|
10
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<CustomFormsModule>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=custom-forms.module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-forms.module.d.ts","sourceRoot":"","sources":["../../../src/lib/custom/custom-forms.module.ts"],"names":[],"mappings":";;;;;;AAWA,qBAca,iBAAiB;yCAAjB,iBAAiB;0CAAjB,iBAAiB;0CAAjB,iBAAiB;CAAI"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { NgModule } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
// MemberJunction Imports
|
|
5
|
+
import { BaseFormsModule } from '@memberjunction/ng-base-forms';
|
|
6
|
+
import { LinkDirectivesModule } from '@memberjunction/ng-link-directives';
|
|
7
|
+
// Standalone feature components (imported, not declared)
|
|
8
|
+
import { ReportIssueComponent } from '../components/report-issue/report-issue.component';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
export class CustomFormsModule {
|
|
11
|
+
static ɵfac = function CustomFormsModule_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CustomFormsModule)(); };
|
|
12
|
+
static ɵmod = /*@__PURE__*/ i0.ɵɵdefineNgModule({ type: CustomFormsModule });
|
|
13
|
+
static ɵinj = /*@__PURE__*/ i0.ɵɵdefineInjector({ imports: [CommonModule,
|
|
14
|
+
FormsModule,
|
|
15
|
+
BaseFormsModule,
|
|
16
|
+
LinkDirectivesModule,
|
|
17
|
+
// Standalone components used across the app
|
|
18
|
+
ReportIssueComponent] });
|
|
19
|
+
}
|
|
20
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CustomFormsModule, [{
|
|
21
|
+
type: NgModule,
|
|
22
|
+
args: [{
|
|
23
|
+
declarations: [],
|
|
24
|
+
imports: [
|
|
25
|
+
CommonModule,
|
|
26
|
+
FormsModule,
|
|
27
|
+
BaseFormsModule,
|
|
28
|
+
LinkDirectivesModule,
|
|
29
|
+
// Standalone components used across the app
|
|
30
|
+
ReportIssueComponent
|
|
31
|
+
],
|
|
32
|
+
exports: [
|
|
33
|
+
ReportIssueComponent
|
|
34
|
+
]
|
|
35
|
+
}]
|
|
36
|
+
}], null, null); })();
|
|
37
|
+
(function () { (typeof ngJitMode === "undefined" || ngJitMode) && i0.ɵɵsetNgModuleScope(CustomFormsModule, { imports: [CommonModule,
|
|
38
|
+
FormsModule,
|
|
39
|
+
BaseFormsModule,
|
|
40
|
+
LinkDirectivesModule,
|
|
41
|
+
// Standalone components used across the app
|
|
42
|
+
ReportIssueComponent], exports: [ReportIssueComponent] }); })();
|
|
43
|
+
//# sourceMappingURL=custom-forms.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-forms.module.js","sourceRoot":"","sources":["../../../src/lib/custom/custom-forms.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,yBAAyB;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAE1E,yDAAyD;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mDAAmD,CAAC;;AAgBzF,MAAM,OAAO,iBAAiB;2GAAjB,iBAAiB;4DAAjB,iBAAiB;gEAX1B,YAAY;YACZ,WAAW;YACX,eAAe;YACf,oBAAoB;YACpB,4CAA4C;YAC5C,oBAAoB;;iFAMX,iBAAiB;cAd7B,QAAQ;eAAC;gBACR,YAAY,EAAE,EAAE;gBAChB,OAAO,EAAE;oBACP,YAAY;oBACZ,WAAW;oBACX,eAAe;oBACf,oBAAoB;oBACpB,4CAA4C;oBAC5C,oBAAoB;iBACrB;gBACD,OAAO,EAAE;oBACP,oBAAoB;iBACrB;aACF;;wFACY,iBAAiB,cAX1B,YAAY;QACZ,WAAW;QACX,eAAe;QACf,oBAAoB;QACpB,4CAA4C;QAC5C,oBAAoB,aAGpB,oBAAoB"}
|
package/dist/lib/generated/Entities/mjBizAppsIssuesIssue/mjbizappsissuesissue.form.component.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { mjBizAppsIssuesIssueEntity } from '@mj-biz-apps/issues-entities';
|
|
2
|
+
import { BaseFormComponent } from '@memberjunction/ng-base-forms';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class mjBizAppsIssuesIssueFormComponent extends BaseFormComponent {
|
|
5
|
+
record: mjBizAppsIssuesIssueEntity;
|
|
6
|
+
ngOnInit(): Promise<void>;
|
|
7
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<mjBizAppsIssuesIssueFormComponent, never>;
|
|
8
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<mjBizAppsIssuesIssueFormComponent, "gen-mjbizappsissuesissue-form", never, {}, {}, never, never, false, never>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=mjbizappsissuesissue.form.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mjbizappsissuesissue.form.component.d.ts","sourceRoot":"","sources":["../../../../../src/lib/generated/Entities/mjBizAppsIssuesIssue/mjbizappsissuesissue.form.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;;AAGlE,qBAMa,iCAAkC,SAAQ,iBAAiB;IAC7D,MAAM,EAAG,0BAA0B,CAAC;IAE5B,QAAQ;yCAHd,iCAAiC;2CAAjC,iCAAiC;CAU7C"}
|