@memberjunction/ng-skip-chat 2.102.0 → 2.104.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.
Files changed (31) hide show
  1. package/dist/lib/artifacts/skip-artifact-viewer.component.d.ts +33 -3
  2. package/dist/lib/artifacts/skip-artifact-viewer.component.d.ts.map +1 -1
  3. package/dist/lib/artifacts/skip-artifact-viewer.component.js +166 -22
  4. package/dist/lib/artifacts/skip-artifact-viewer.component.js.map +1 -1
  5. package/dist/lib/artifacts/skip-component-feedback-panel.component.d.ts +120 -0
  6. package/dist/lib/artifacts/skip-component-feedback-panel.component.d.ts.map +1 -0
  7. package/dist/lib/artifacts/skip-component-feedback-panel.component.js +473 -0
  8. package/dist/lib/artifacts/skip-component-feedback-panel.component.js.map +1 -0
  9. package/dist/lib/dynamic-report/dynamic-ui-component.d.ts +3 -1
  10. package/dist/lib/dynamic-report/dynamic-ui-component.d.ts.map +1 -1
  11. package/dist/lib/dynamic-report/dynamic-ui-component.js +211 -179
  12. package/dist/lib/dynamic-report/dynamic-ui-component.js.map +1 -1
  13. package/dist/lib/dynamic-report/linear-report.d.ts +3 -1
  14. package/dist/lib/dynamic-report/linear-report.d.ts.map +1 -1
  15. package/dist/lib/dynamic-report/linear-report.js +10 -4
  16. package/dist/lib/dynamic-report/linear-report.js.map +1 -1
  17. package/dist/lib/dynamic-report/skip-dynamic-report-wrapper.d.ts +10 -0
  18. package/dist/lib/dynamic-report/skip-dynamic-report-wrapper.d.ts.map +1 -1
  19. package/dist/lib/dynamic-report/skip-dynamic-report-wrapper.js +41 -9
  20. package/dist/lib/dynamic-report/skip-dynamic-report-wrapper.js.map +1 -1
  21. package/dist/lib/module.d.ts +22 -21
  22. package/dist/lib/module.d.ts.map +1 -1
  23. package/dist/lib/module.js +6 -2
  24. package/dist/lib/module.js.map +1 -1
  25. package/dist/lib/skip-chat/skip-chat.component.d.ts.map +1 -1
  26. package/dist/lib/skip-chat/skip-chat.component.js +3 -3
  27. package/dist/lib/skip-chat/skip-chat.component.js.map +1 -1
  28. package/dist/lib/skip-single-message/skip-single-message.component.d.ts.map +1 -1
  29. package/dist/lib/skip-single-message/skip-single-message.component.js +3 -3
  30. package/dist/lib/skip-single-message/skip-single-message.component.js.map +1 -1
  31. package/package.json +15 -15
@@ -0,0 +1,120 @@
1
+ import { EventEmitter, OnInit, OnChanges, SimpleChanges } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Interface representing a component in the dependency hierarchy
5
+ */
6
+ export interface ComponentNode {
7
+ name: string;
8
+ title: string;
9
+ description?: string;
10
+ location: 'embedded' | 'registry';
11
+ dependencies?: ComponentNode[];
12
+ namespace?: string;
13
+ registry?: string;
14
+ }
15
+ /**
16
+ * Interface for feedback submission
17
+ */
18
+ export interface ComponentFeedback {
19
+ componentName: string;
20
+ componentNamespace: string;
21
+ componentVersion?: string;
22
+ rating: number;
23
+ comments?: string;
24
+ conversationID?: string;
25
+ conversationDetailID?: string;
26
+ reportID?: string;
27
+ dashboardID?: string;
28
+ }
29
+ /**
30
+ * Component feedback panel that displays component hierarchy tree
31
+ * and allows users to select components and provide star ratings with comments
32
+ */
33
+ export declare class SkipComponentFeedbackPanelComponent implements OnInit, OnChanges {
34
+ rootComponent: ComponentNode | null;
35
+ conversationID?: string;
36
+ conversationDetailID?: string;
37
+ reportID?: string;
38
+ dashboardID?: string;
39
+ isVisible: boolean;
40
+ feedbackSubmitted: EventEmitter<ComponentFeedback>;
41
+ componentSelected: EventEmitter<ComponentNode>;
42
+ closed: EventEmitter<void>;
43
+ selectedComponent: ComponentNode | null;
44
+ starRating: number;
45
+ hoverRating: number;
46
+ feedbackComment: string;
47
+ expandedNodes: Set<string>;
48
+ isSubmitting: boolean;
49
+ submitSuccess: boolean;
50
+ submitError: string;
51
+ ngOnInit(): void;
52
+ ngOnChanges(changes: SimpleChanges): void;
53
+ /**
54
+ * Toggle node expansion in the tree
55
+ */
56
+ toggleNode(node: ComponentNode): void;
57
+ /**
58
+ * Check if a node is expanded
59
+ */
60
+ isNodeExpanded(node: ComponentNode): boolean;
61
+ /**
62
+ * Select a component for feedback
63
+ */
64
+ selectComponent(node: ComponentNode, event?: MouseEvent): void;
65
+ /**
66
+ * Check if a component is selected
67
+ */
68
+ isComponentSelected(node: ComponentNode): boolean;
69
+ /**
70
+ * Set star rating on click
71
+ */
72
+ setRating(rating: number): void;
73
+ /**
74
+ * Set hover rating for visual feedback
75
+ */
76
+ setHoverRating(rating: number): void;
77
+ /**
78
+ * Clear hover rating
79
+ */
80
+ clearHoverRating(): void;
81
+ /**
82
+ * Get the current displayed rating (hover or actual)
83
+ */
84
+ getDisplayRating(): number;
85
+ /**
86
+ * Check if a star should be filled
87
+ */
88
+ isStarFilled(index: number): boolean;
89
+ /**
90
+ * Reset the feedback form
91
+ */
92
+ resetFeedbackForm(): void;
93
+ /**
94
+ * Check if the form is valid for submission
95
+ */
96
+ canSubmit(): boolean;
97
+ /**
98
+ * Submit the feedback
99
+ */
100
+ submitFeedback(): Promise<void>;
101
+ /**
102
+ * Close the panel
103
+ */
104
+ closePanel(): void;
105
+ /**
106
+ * Get indentation level for a node (for visual hierarchy)
107
+ */
108
+ getNodeIndentation(depth: number): string;
109
+ /**
110
+ * Recursively build the component tree HTML
111
+ */
112
+ buildComponentTree(node: ComponentNode, depth?: number): any[];
113
+ /**
114
+ * Get all tree items for rendering
115
+ */
116
+ getTreeItems(): any[];
117
+ static ɵfac: i0.ɵɵFactoryDeclaration<SkipComponentFeedbackPanelComponent, never>;
118
+ static ɵcmp: i0.ɵɵComponentDeclaration<SkipComponentFeedbackPanelComponent, "skip-component-feedback-panel", never, { "rootComponent": { "alias": "rootComponent"; "required": false; }; "conversationID": { "alias": "conversationID"; "required": false; }; "conversationDetailID": { "alias": "conversationDetailID"; "required": false; }; "reportID": { "alias": "reportID"; "required": false; }; "dashboardID": { "alias": "dashboardID"; "required": false; }; "isVisible": { "alias": "isVisible"; "required": false; }; }, { "feedbackSubmitted": "feedbackSubmitted"; "componentSelected": "componentSelected"; "closed": "closed"; }, never, never, true, never>;
119
+ }
120
+ //# sourceMappingURL=skip-component-feedback-panel.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skip-component-feedback-panel.component.d.ts","sourceRoot":"","sources":["../../../src/lib/artifacts/skip-component-feedback-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;;AAQzG;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,UAAU,GAAG,UAAU,CAAC;IAClC,YAAY,CAAC,EAAE,aAAa,EAAE,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,qBAca,mCAAoC,YAAW,MAAM,EAAE,SAAS;IAClE,aAAa,EAAE,aAAa,GAAG,IAAI,CAAQ;IAC3C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,UAAS;IAEjB,iBAAiB,kCAAyC;IAC1D,iBAAiB,8BAAqC;IACtD,MAAM,qBAA4B;IAE5C,iBAAiB,EAAE,aAAa,GAAG,IAAI,CAAQ;IAC/C,UAAU,SAAK;IACf,WAAW,SAAK;IAChB,eAAe,SAAM;IACrB,aAAa,cAAqB;IAClC,YAAY,UAAS;IACrB,aAAa,UAAS;IACtB,WAAW,SAAM;IAEjB,QAAQ,IAAI,IAAI;IAOhB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAUzC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IASrC;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO;IAI5C;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI;IAU9D;;OAEG;IACH,mBAAmB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO;IAIjD;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIpC;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAIxB;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIpC;;OAEG;IACH,iBAAiB,IAAI,IAAI;IAQzB;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IA4CrC;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIzC;;OAEG;IACH,kBAAkB,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,SAAI,GAAG,GAAG,EAAE;IAgBzD;;OAEG;IACH,YAAY,IAAI,GAAG,EAAE;yCArNV,mCAAmC;2CAAnC,mCAAmC;CA2N/C"}
@@ -0,0 +1,473 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { ButtonModule } from '@progress/kendo-angular-buttons';
5
+ import { InputsModule } from '@progress/kendo-angular-inputs';
6
+ import { DropDownsModule } from '@progress/kendo-angular-dropdowns';
7
+ import { LayoutModule } from '@progress/kendo-angular-layout';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/common";
10
+ import * as i2 from "@angular/forms";
11
+ import * as i3 from "@progress/kendo-angular-buttons";
12
+ const _forTrack0 = ($index, $item) => $item.node.name;
13
+ const _c0 = () => [1, 2, 3, 4, 5];
14
+ function SkipComponentFeedbackPanelComponent_div_0_Conditional_15_For_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
15
+ const _r5 = i0.ɵɵgetCurrentView();
16
+ i0.ɵɵelementStart(0, "i", 25);
17
+ i0.ɵɵlistener("click", function SkipComponentFeedbackPanelComponent_div_0_Conditional_15_For_2_Conditional_1_Template_i_click_0_listener($event) { i0.ɵɵrestoreView(_r5); const item_r4 = i0.ɵɵnextContext().$implicit; const ctx_r1 = i0.ɵɵnextContext(3); ctx_r1.toggleNode(item_r4.node); return i0.ɵɵresetView($event.stopPropagation()); });
18
+ i0.ɵɵelementEnd();
19
+ } if (rf & 2) {
20
+ const item_r4 = i0.ɵɵnextContext().$implicit;
21
+ const ctx_r1 = i0.ɵɵnextContext(3);
22
+ i0.ɵɵclassProp("fa-solid", true)("fa-chevron-right", !ctx_r1.isNodeExpanded(item_r4.node))("fa-chevron-down", ctx_r1.isNodeExpanded(item_r4.node));
23
+ } }
24
+ function SkipComponentFeedbackPanelComponent_div_0_Conditional_15_For_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
25
+ i0.ɵɵelement(0, "span", 20);
26
+ } }
27
+ function SkipComponentFeedbackPanelComponent_div_0_Conditional_15_For_2_Conditional_7_Template(rf, ctx) { if (rf & 1) {
28
+ i0.ɵɵelementStart(0, "span", 24);
29
+ i0.ɵɵtext(1, "Registry");
30
+ i0.ɵɵelementEnd();
31
+ } }
32
+ function SkipComponentFeedbackPanelComponent_div_0_Conditional_15_For_2_Template(rf, ctx) { if (rf & 1) {
33
+ const _r3 = i0.ɵɵgetCurrentView();
34
+ i0.ɵɵelementStart(0, "div", 18);
35
+ i0.ɵɵlistener("click", function SkipComponentFeedbackPanelComponent_div_0_Conditional_15_For_2_Template_div_click_0_listener($event) { const item_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.selectComponent(item_r4.node, $event)); });
36
+ i0.ɵɵtemplate(1, SkipComponentFeedbackPanelComponent_div_0_Conditional_15_For_2_Conditional_1_Template, 1, 6, "i", 19)(2, SkipComponentFeedbackPanelComponent_div_0_Conditional_15_For_2_Conditional_2_Template, 1, 0, "span", 20);
37
+ i0.ɵɵelement(3, "i", 21);
38
+ i0.ɵɵelementStart(4, "div", 22)(5, "span", 23);
39
+ i0.ɵɵtext(6);
40
+ i0.ɵɵelementEnd();
41
+ i0.ɵɵtemplate(7, SkipComponentFeedbackPanelComponent_div_0_Conditional_15_For_2_Conditional_7_Template, 2, 0, "span", 24);
42
+ i0.ɵɵelementEnd()();
43
+ } if (rf & 2) {
44
+ const item_r4 = ctx.$implicit;
45
+ const ctx_r1 = i0.ɵɵnextContext(3);
46
+ i0.ɵɵstyleProp("padding-left", ctx_r1.getNodeIndentation(item_r4.depth));
47
+ i0.ɵɵclassProp("selected", ctx_r1.isComponentSelected(item_r4.node));
48
+ i0.ɵɵadvance();
49
+ i0.ɵɵconditional(item_r4.hasChildren ? 1 : 2);
50
+ i0.ɵɵadvance(5);
51
+ i0.ɵɵtextInterpolate(item_r4.node.title || item_r4.node.name);
52
+ i0.ɵɵadvance();
53
+ i0.ɵɵconditional(item_r4.node.location === "registry" ? 7 : -1);
54
+ } }
55
+ function SkipComponentFeedbackPanelComponent_div_0_Conditional_15_Template(rf, ctx) { if (rf & 1) {
56
+ i0.ɵɵelementStart(0, "div", 12);
57
+ i0.ɵɵrepeaterCreate(1, SkipComponentFeedbackPanelComponent_div_0_Conditional_15_For_2_Template, 8, 7, "div", 17, _forTrack0);
58
+ i0.ɵɵelementEnd();
59
+ } if (rf & 2) {
60
+ const ctx_r1 = i0.ɵɵnextContext(2);
61
+ i0.ɵɵadvance();
62
+ i0.ɵɵrepeater(ctx_r1.getTreeItems());
63
+ } }
64
+ function SkipComponentFeedbackPanelComponent_div_0_Conditional_16_Template(rf, ctx) { if (rf & 1) {
65
+ i0.ɵɵelementStart(0, "div", 13);
66
+ i0.ɵɵelement(1, "i", 26);
67
+ i0.ɵɵelementStart(2, "span");
68
+ i0.ɵɵtext(3, "No component hierarchy available");
69
+ i0.ɵɵelementEnd()();
70
+ } }
71
+ function SkipComponentFeedbackPanelComponent_div_0_Conditional_18_Conditional_5_Template(rf, ctx) { if (rf & 1) {
72
+ i0.ɵɵelementStart(0, "p", 28);
73
+ i0.ɵɵtext(1);
74
+ i0.ɵɵelementEnd();
75
+ } if (rf & 2) {
76
+ const ctx_r1 = i0.ɵɵnextContext(3);
77
+ i0.ɵɵadvance();
78
+ i0.ɵɵtextInterpolate(ctx_r1.selectedComponent.description);
79
+ } }
80
+ function SkipComponentFeedbackPanelComponent_div_0_Conditional_18_For_11_Template(rf, ctx) { if (rf & 1) {
81
+ const _r7 = i0.ɵɵgetCurrentView();
82
+ i0.ɵɵelementStart(0, "i", 44);
83
+ i0.ɵɵlistener("click", function SkipComponentFeedbackPanelComponent_div_0_Conditional_18_For_11_Template_i_click_0_listener() { const star_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.setRating(star_r8)); })("mouseenter", function SkipComponentFeedbackPanelComponent_div_0_Conditional_18_For_11_Template_i_mouseenter_0_listener() { const star_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.setHoverRating(star_r8)); })("mouseleave", function SkipComponentFeedbackPanelComponent_div_0_Conditional_18_For_11_Template_i_mouseleave_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.clearHoverRating()); });
84
+ i0.ɵɵelementEnd();
85
+ } if (rf & 2) {
86
+ const star_r8 = ctx.$implicit;
87
+ const ctx_r1 = i0.ɵɵnextContext(3);
88
+ i0.ɵɵclassProp("fa-solid", ctx_r1.isStarFilled(star_r8))("fa-regular", !ctx_r1.isStarFilled(star_r8))("fa-star", true);
89
+ } }
90
+ function SkipComponentFeedbackPanelComponent_div_0_Conditional_18_Conditional_12_Template(rf, ctx) { if (rf & 1) {
91
+ i0.ɵɵelementStart(0, "span", 33);
92
+ i0.ɵɵtext(1);
93
+ i0.ɵɵelementEnd();
94
+ } if (rf & 2) {
95
+ const ctx_r1 = i0.ɵɵnextContext(3);
96
+ i0.ɵɵadvance();
97
+ i0.ɵɵtextInterpolate1("", ctx_r1.starRating, " out of 5 stars");
98
+ } }
99
+ function SkipComponentFeedbackPanelComponent_div_0_Conditional_18_Conditional_13_Template(rf, ctx) { if (rf & 1) {
100
+ i0.ɵɵelementStart(0, "span", 34);
101
+ i0.ɵɵtext(1, "Click to rate");
102
+ i0.ɵɵelementEnd();
103
+ } }
104
+ function SkipComponentFeedbackPanelComponent_div_0_Conditional_18_Conditional_21_Template(rf, ctx) { if (rf & 1) {
105
+ i0.ɵɵelementStart(0, "span", 39);
106
+ i0.ɵɵtext(1);
107
+ i0.ɵɵelementEnd();
108
+ } if (rf & 2) {
109
+ const ctx_r1 = i0.ɵɵnextContext(3);
110
+ i0.ɵɵadvance();
111
+ i0.ɵɵtextInterpolate1("", ctx_r1.feedbackComment.length, "/1000");
112
+ } }
113
+ function SkipComponentFeedbackPanelComponent_div_0_Conditional_18_Conditional_24_Template(rf, ctx) { if (rf & 1) {
114
+ i0.ɵɵelement(0, "i", 45);
115
+ i0.ɵɵelementStart(1, "span");
116
+ i0.ɵɵtext(2, "Submitting...");
117
+ i0.ɵɵelementEnd();
118
+ } }
119
+ function SkipComponentFeedbackPanelComponent_div_0_Conditional_18_Conditional_25_Template(rf, ctx) { if (rf & 1) {
120
+ i0.ɵɵelement(0, "i", 46);
121
+ i0.ɵɵelementStart(1, "span");
122
+ i0.ɵɵtext(2, "Submit Feedback");
123
+ i0.ɵɵelementEnd();
124
+ } }
125
+ function SkipComponentFeedbackPanelComponent_div_0_Conditional_18_Conditional_26_Template(rf, ctx) { if (rf & 1) {
126
+ i0.ɵɵelementStart(0, "div", 42);
127
+ i0.ɵɵelement(1, "i", 47);
128
+ i0.ɵɵelementStart(2, "span");
129
+ i0.ɵɵtext(3, "Feedback submitted successfully!");
130
+ i0.ɵɵelementEnd()();
131
+ } }
132
+ function SkipComponentFeedbackPanelComponent_div_0_Conditional_18_Conditional_27_Template(rf, ctx) { if (rf & 1) {
133
+ i0.ɵɵelementStart(0, "div", 43);
134
+ i0.ɵɵelement(1, "i", 48);
135
+ i0.ɵɵelementStart(2, "span");
136
+ i0.ɵɵtext(3);
137
+ i0.ɵɵelementEnd()();
138
+ } if (rf & 2) {
139
+ const ctx_r1 = i0.ɵɵnextContext(3);
140
+ i0.ɵɵadvance(3);
141
+ i0.ɵɵtextInterpolate(ctx_r1.submitError);
142
+ } }
143
+ function SkipComponentFeedbackPanelComponent_div_0_Conditional_18_Template(rf, ctx) { if (rf & 1) {
144
+ const _r6 = i0.ɵɵgetCurrentView();
145
+ i0.ɵɵelementStart(0, "div", 15)(1, "div", 10);
146
+ i0.ɵɵelement(2, "i", 27);
147
+ i0.ɵɵelementStart(3, "span");
148
+ i0.ɵɵtext(4);
149
+ i0.ɵɵelementEnd()();
150
+ i0.ɵɵtemplate(5, SkipComponentFeedbackPanelComponent_div_0_Conditional_18_Conditional_5_Template, 2, 1, "p", 28);
151
+ i0.ɵɵelementStart(6, "div", 29)(7, "label", 30);
152
+ i0.ɵɵtext(8, "Your Rating");
153
+ i0.ɵɵelementEnd();
154
+ i0.ɵɵelementStart(9, "div", 31);
155
+ i0.ɵɵrepeaterCreate(10, SkipComponentFeedbackPanelComponent_div_0_Conditional_18_For_11_Template, 1, 6, "i", 32, i0.ɵɵrepeaterTrackByIdentity);
156
+ i0.ɵɵelementEnd();
157
+ i0.ɵɵtemplate(12, SkipComponentFeedbackPanelComponent_div_0_Conditional_18_Conditional_12_Template, 2, 1, "span", 33)(13, SkipComponentFeedbackPanelComponent_div_0_Conditional_18_Conditional_13_Template, 2, 0, "span", 34);
158
+ i0.ɵɵelementEnd();
159
+ i0.ɵɵelementStart(14, "div", 35)(15, "label", 36);
160
+ i0.ɵɵtext(16, " Comments ");
161
+ i0.ɵɵelementStart(17, "span", 37);
162
+ i0.ɵɵtext(18, "(optional)");
163
+ i0.ɵɵelementEnd()();
164
+ i0.ɵɵelementStart(19, "textarea", 38);
165
+ i0.ɵɵtwoWayListener("ngModelChange", function SkipComponentFeedbackPanelComponent_div_0_Conditional_18_Template_textarea_ngModelChange_19_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵtwoWayBindingSet(ctx_r1.feedbackComment, $event) || (ctx_r1.feedbackComment = $event); return i0.ɵɵresetView($event); });
166
+ i0.ɵɵtext(20, " ");
167
+ i0.ɵɵelementEnd();
168
+ i0.ɵɵtemplate(21, SkipComponentFeedbackPanelComponent_div_0_Conditional_18_Conditional_21_Template, 2, 1, "span", 39);
169
+ i0.ɵɵelementEnd();
170
+ i0.ɵɵelementStart(22, "div", 40)(23, "button", 41);
171
+ i0.ɵɵlistener("click", function SkipComponentFeedbackPanelComponent_div_0_Conditional_18_Template_button_click_23_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.submitFeedback()); });
172
+ i0.ɵɵtemplate(24, SkipComponentFeedbackPanelComponent_div_0_Conditional_18_Conditional_24_Template, 3, 0)(25, SkipComponentFeedbackPanelComponent_div_0_Conditional_18_Conditional_25_Template, 3, 0);
173
+ i0.ɵɵelementEnd()();
174
+ i0.ɵɵtemplate(26, SkipComponentFeedbackPanelComponent_div_0_Conditional_18_Conditional_26_Template, 4, 0, "div", 42)(27, SkipComponentFeedbackPanelComponent_div_0_Conditional_18_Conditional_27_Template, 4, 1, "div", 43);
175
+ i0.ɵɵelementEnd();
176
+ } if (rf & 2) {
177
+ const ctx_r1 = i0.ɵɵnextContext(2);
178
+ i0.ɵɵadvance(4);
179
+ i0.ɵɵtextInterpolate1("Rate: ", ctx_r1.selectedComponent.title || ctx_r1.selectedComponent.name, "");
180
+ i0.ɵɵadvance();
181
+ i0.ɵɵconditional(ctx_r1.selectedComponent.description ? 5 : -1);
182
+ i0.ɵɵadvance(5);
183
+ i0.ɵɵrepeater(i0.ɵɵpureFunction0(10, _c0));
184
+ i0.ɵɵadvance(2);
185
+ i0.ɵɵconditional(ctx_r1.starRating > 0 ? 12 : 13);
186
+ i0.ɵɵadvance(7);
187
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r1.feedbackComment);
188
+ i0.ɵɵadvance(2);
189
+ i0.ɵɵconditional(ctx_r1.feedbackComment.length > 0 ? 21 : -1);
190
+ i0.ɵɵadvance(2);
191
+ i0.ɵɵproperty("themeColor", "primary")("disabled", !ctx_r1.canSubmit());
192
+ i0.ɵɵadvance();
193
+ i0.ɵɵconditional(ctx_r1.isSubmitting ? 24 : 25);
194
+ i0.ɵɵadvance(2);
195
+ i0.ɵɵconditional(ctx_r1.submitSuccess ? 26 : -1);
196
+ i0.ɵɵadvance();
197
+ i0.ɵɵconditional(ctx_r1.submitError ? 27 : -1);
198
+ } }
199
+ function SkipComponentFeedbackPanelComponent_div_0_Conditional_19_Template(rf, ctx) { if (rf & 1) {
200
+ i0.ɵɵelementStart(0, "div", 16);
201
+ i0.ɵɵelement(1, "i", 49);
202
+ i0.ɵɵelementStart(2, "p");
203
+ i0.ɵɵtext(3, "Select a component from the tree to provide feedback");
204
+ i0.ɵɵelementEnd()();
205
+ } }
206
+ function SkipComponentFeedbackPanelComponent_div_0_Template(rf, ctx) { if (rf & 1) {
207
+ const _r1 = i0.ɵɵgetCurrentView();
208
+ i0.ɵɵelementStart(0, "div", 1);
209
+ i0.ɵɵlistener("click", function SkipComponentFeedbackPanelComponent_div_0_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.closePanel()); });
210
+ i0.ɵɵelementStart(1, "div", 2);
211
+ i0.ɵɵlistener("click", function SkipComponentFeedbackPanelComponent_div_0_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView($event.stopPropagation()); });
212
+ i0.ɵɵelementStart(2, "div", 3)(3, "div", 4);
213
+ i0.ɵɵelement(4, "i", 5);
214
+ i0.ɵɵelementStart(5, "span");
215
+ i0.ɵɵtext(6, "Component Feedback");
216
+ i0.ɵɵelementEnd()();
217
+ i0.ɵɵelementStart(7, "button", 6);
218
+ i0.ɵɵlistener("click", function SkipComponentFeedbackPanelComponent_div_0_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.closePanel()); });
219
+ i0.ɵɵelement(8, "i", 7);
220
+ i0.ɵɵelementEnd()();
221
+ i0.ɵɵelementStart(9, "div", 8)(10, "div", 9)(11, "div", 10);
222
+ i0.ɵɵelement(12, "i", 11);
223
+ i0.ɵɵelementStart(13, "span");
224
+ i0.ɵɵtext(14, "Select Component");
225
+ i0.ɵɵelementEnd()();
226
+ i0.ɵɵtemplate(15, SkipComponentFeedbackPanelComponent_div_0_Conditional_15_Template, 3, 0, "div", 12)(16, SkipComponentFeedbackPanelComponent_div_0_Conditional_16_Template, 4, 0, "div", 13);
227
+ i0.ɵɵelementEnd();
228
+ i0.ɵɵelementStart(17, "div", 14);
229
+ i0.ɵɵtemplate(18, SkipComponentFeedbackPanelComponent_div_0_Conditional_18_Template, 28, 11, "div", 15)(19, SkipComponentFeedbackPanelComponent_div_0_Conditional_19_Template, 4, 0, "div", 16);
230
+ i0.ɵɵelementEnd()()()();
231
+ } if (rf & 2) {
232
+ const ctx_r1 = i0.ɵɵnextContext();
233
+ i0.ɵɵadvance(15);
234
+ i0.ɵɵconditional(ctx_r1.rootComponent ? 15 : 16);
235
+ i0.ɵɵadvance(3);
236
+ i0.ɵɵconditional(ctx_r1.selectedComponent ? 18 : 19);
237
+ } }
238
+ /**
239
+ * Component feedback panel that displays component hierarchy tree
240
+ * and allows users to select components and provide star ratings with comments
241
+ */
242
+ export class SkipComponentFeedbackPanelComponent {
243
+ rootComponent = null;
244
+ conversationID;
245
+ conversationDetailID;
246
+ reportID;
247
+ dashboardID;
248
+ isVisible = false;
249
+ feedbackSubmitted = new EventEmitter();
250
+ componentSelected = new EventEmitter();
251
+ closed = new EventEmitter();
252
+ selectedComponent = null;
253
+ starRating = 0;
254
+ hoverRating = 0;
255
+ feedbackComment = '';
256
+ expandedNodes = new Set();
257
+ isSubmitting = false;
258
+ submitSuccess = false;
259
+ submitError = '';
260
+ ngOnInit() {
261
+ // Expand root node by default
262
+ if (this.rootComponent) {
263
+ this.expandedNodes.add(this.rootComponent.name);
264
+ }
265
+ }
266
+ ngOnChanges(changes) {
267
+ if (changes['rootComponent'] && this.rootComponent) {
268
+ // Reset expanded nodes when component changes
269
+ this.expandedNodes.clear();
270
+ this.expandedNodes.add(this.rootComponent.name);
271
+ this.selectedComponent = null;
272
+ this.resetFeedbackForm();
273
+ }
274
+ }
275
+ /**
276
+ * Toggle node expansion in the tree
277
+ */
278
+ toggleNode(node) {
279
+ const key = node.name;
280
+ if (this.expandedNodes.has(key)) {
281
+ this.expandedNodes.delete(key);
282
+ }
283
+ else {
284
+ this.expandedNodes.add(key);
285
+ }
286
+ }
287
+ /**
288
+ * Check if a node is expanded
289
+ */
290
+ isNodeExpanded(node) {
291
+ return this.expandedNodes.has(node.name);
292
+ }
293
+ /**
294
+ * Select a component for feedback
295
+ */
296
+ selectComponent(node, event) {
297
+ if (event) {
298
+ event.stopPropagation();
299
+ }
300
+ this.selectedComponent = node;
301
+ this.resetFeedbackForm();
302
+ this.componentSelected.emit(node);
303
+ }
304
+ /**
305
+ * Check if a component is selected
306
+ */
307
+ isComponentSelected(node) {
308
+ return this.selectedComponent?.name === node.name;
309
+ }
310
+ /**
311
+ * Set star rating on click
312
+ */
313
+ setRating(rating) {
314
+ this.starRating = rating;
315
+ }
316
+ /**
317
+ * Set hover rating for visual feedback
318
+ */
319
+ setHoverRating(rating) {
320
+ this.hoverRating = rating;
321
+ }
322
+ /**
323
+ * Clear hover rating
324
+ */
325
+ clearHoverRating() {
326
+ this.hoverRating = 0;
327
+ }
328
+ /**
329
+ * Get the current displayed rating (hover or actual)
330
+ */
331
+ getDisplayRating() {
332
+ return this.hoverRating || this.starRating;
333
+ }
334
+ /**
335
+ * Check if a star should be filled
336
+ */
337
+ isStarFilled(index) {
338
+ return index <= this.getDisplayRating();
339
+ }
340
+ /**
341
+ * Reset the feedback form
342
+ */
343
+ resetFeedbackForm() {
344
+ this.starRating = 0;
345
+ this.hoverRating = 0;
346
+ this.feedbackComment = '';
347
+ this.submitSuccess = false;
348
+ this.submitError = '';
349
+ }
350
+ /**
351
+ * Check if the form is valid for submission
352
+ */
353
+ canSubmit() {
354
+ return !!this.selectedComponent && this.starRating > 0 && !this.isSubmitting;
355
+ }
356
+ /**
357
+ * Submit the feedback
358
+ */
359
+ async submitFeedback() {
360
+ if (!this.canSubmit() || !this.selectedComponent) {
361
+ return;
362
+ }
363
+ this.isSubmitting = true;
364
+ this.submitError = '';
365
+ this.submitSuccess = false;
366
+ try {
367
+ // Convert 0-5 star rating to 0-100 scale
368
+ const scaledRating = this.starRating * 20;
369
+ const feedback = {
370
+ componentName: this.selectedComponent.name,
371
+ componentNamespace: this.selectedComponent.namespace || this.selectedComponent.registry || 'Skip',
372
+ componentVersion: undefined, // Will use latest version if not specified
373
+ rating: scaledRating,
374
+ comments: this.feedbackComment.trim() || undefined,
375
+ conversationID: this.conversationID,
376
+ conversationDetailID: this.conversationDetailID,
377
+ reportID: this.reportID,
378
+ dashboardID: this.dashboardID
379
+ };
380
+ this.feedbackSubmitted.emit(feedback);
381
+ // Show success message
382
+ this.submitSuccess = true;
383
+ // Reset form after a short delay
384
+ setTimeout(() => {
385
+ this.resetFeedbackForm();
386
+ this.submitSuccess = false;
387
+ }, 2000);
388
+ }
389
+ catch (error) {
390
+ this.submitError = 'Failed to submit feedback. Please try again.';
391
+ console.error('Error submitting feedback:', error);
392
+ }
393
+ finally {
394
+ this.isSubmitting = false;
395
+ }
396
+ }
397
+ /**
398
+ * Close the panel
399
+ */
400
+ closePanel() {
401
+ this.closed.emit();
402
+ }
403
+ /**
404
+ * Get indentation level for a node (for visual hierarchy)
405
+ */
406
+ getNodeIndentation(depth) {
407
+ return `${depth * 20}px`;
408
+ }
409
+ /**
410
+ * Recursively build the component tree HTML
411
+ */
412
+ buildComponentTree(node, depth = 0) {
413
+ const items = [{
414
+ node,
415
+ depth,
416
+ hasChildren: !!(node.dependencies && node.dependencies.length > 0)
417
+ }];
418
+ if (this.isNodeExpanded(node) && node.dependencies) {
419
+ for (const child of node.dependencies) {
420
+ items.push(...this.buildComponentTree(child, depth + 1));
421
+ }
422
+ }
423
+ return items;
424
+ }
425
+ /**
426
+ * Get all tree items for rendering
427
+ */
428
+ getTreeItems() {
429
+ if (!this.rootComponent) {
430
+ return [];
431
+ }
432
+ return this.buildComponentTree(this.rootComponent);
433
+ }
434
+ static ɵfac = function SkipComponentFeedbackPanelComponent_Factory(t) { return new (t || SkipComponentFeedbackPanelComponent)(); };
435
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SkipComponentFeedbackPanelComponent, selectors: [["skip-component-feedback-panel"]], inputs: { rootComponent: "rootComponent", conversationID: "conversationID", conversationDetailID: "conversationDetailID", reportID: "reportID", dashboardID: "dashboardID", isVisible: "isVisible" }, outputs: { feedbackSubmitted: "feedbackSubmitted", componentSelected: "componentSelected", closed: "closed" }, standalone: true, features: [i0.ɵɵNgOnChangesFeature, i0.ɵɵStandaloneFeature], decls: 1, vars: 1, consts: [["class", "feedback-panel-overlay", 3, "click", 4, "ngIf"], [1, "feedback-panel-overlay", 3, "click"], [1, "feedback-panel", 3, "click"], [1, "panel-header"], [1, "panel-title"], [1, "fa-solid", "fa-comment-dots"], ["kendoButton", "", "fillMode", "flat", 1, "close-button", 3, "click"], [1, "fa-solid", "fa-times"], [1, "panel-content"], [1, "tree-section"], [1, "section-header"], [1, "fa-solid", "fa-sitemap"], [1, "component-tree"], [1, "empty-state"], [1, "feedback-section"], [1, "selected-component-info"], [1, "no-selection-message"], [1, "tree-item", 3, "selected", "padding-left"], [1, "tree-item", 3, "click"], [1, "tree-toggle", 3, "fa-solid", "fa-chevron-right", "fa-chevron-down"], [1, "tree-spacer"], [1, "fa-solid", "fa-cube", "component-icon"], [1, "component-info"], [1, "component-name"], [1, "component-badge", "registry"], [1, "tree-toggle", 3, "click"], [1, "fa-solid", "fa-info-circle"], [1, "fa-solid", "fa-star"], [1, "component-description"], [1, "star-rating-container"], [1, "rating-label"], [1, "star-rating"], [1, "star", 3, "fa-solid", "fa-regular", "fa-star"], [1, "rating-text"], [1, "rating-text", "placeholder"], [1, "comment-container"], [1, "comment-label"], [1, "optional-label"], ["placeholder", "Share your thoughts about this component...", "rows", "4", "maxlength", "1000", 1, "comment-input", 3, "ngModelChange", "ngModel"], [1, "char-count"], [1, "submit-container"], ["kendoButton", "", 1, "submit-button", 3, "click", "themeColor", "disabled"], [1, "message", "success-message"], [1, "message", "error-message"], [1, "star", 3, "click", "mouseenter", "mouseleave"], [1, "fa-solid", "fa-spinner", "fa-spin"], [1, "fa-solid", "fa-paper-plane"], [1, "fa-solid", "fa-check-circle"], [1, "fa-solid", "fa-exclamation-circle"], [1, "fa-solid", "fa-hand-pointer"]], template: function SkipComponentFeedbackPanelComponent_Template(rf, ctx) { if (rf & 1) {
436
+ i0.ɵɵtemplate(0, SkipComponentFeedbackPanelComponent_div_0_Template, 20, 2, "div", 0);
437
+ } if (rf & 2) {
438
+ i0.ɵɵproperty("ngIf", ctx.isVisible);
439
+ } }, dependencies: [CommonModule, i1.NgIf, FormsModule, i2.DefaultValueAccessor, i2.NgControlStatus, i2.MaxLengthValidator, i2.NgModel, ButtonModule, i3.ButtonComponent, InputsModule,
440
+ DropDownsModule,
441
+ LayoutModule], styles: ["\n\n.feedback-panel-overlay[_ngcontent-%COMP%] {\n position: fixed;\n top: 60px; \n\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.4);\n z-index: 9999; \n\n display: flex;\n justify-content: flex-start; \n\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease-in-out;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n\n\n.feedback-panel[_ngcontent-%COMP%] {\n width: 450px;\n height: 100%;\n background-color: #ffffff;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.15); \n\n display: flex;\n flex-direction: column;\n animation: _ngcontent-%COMP%_slideInFromLeft 0.3s ease-out; \n\n}\n\n@keyframes _ngcontent-%COMP%_slideInFromLeft {\n from {\n transform: translateX(-100%); \n\n }\n to {\n transform: translateX(0);\n }\n}\n\n\n\n.panel-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid #e0e0e0;\n background-color: #f8f9fa;\n}\n\n.panel-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 18px;\n font-weight: 600;\n color: #333;\n}\n\n.panel-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #3B82F6;\n font-size: 20px;\n}\n\n.close-button[_ngcontent-%COMP%] {\n min-width: 32px;\n height: 32px;\n padding: 0;\n border-radius: 4px;\n}\n\n.close-button[_ngcontent-%COMP%]:hover {\n background-color: #e0e0e0;\n}\n\n\n\n.panel-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 20px;\n padding: 20px;\n}\n\n\n\n.section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: #555;\n margin-bottom: 12px;\n padding-bottom: 8px;\n border-bottom: 2px solid #3B82F6;\n}\n\n.section-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #3B82F6;\n}\n\n\n\n.tree-section[_ngcontent-%COMP%] {\n background-color: #f8f9fa;\n border-radius: 8px;\n padding: 16px;\n}\n\n.component-tree[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.tree-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s ease;\n user-select: none;\n position: relative;\n}\n\n.tree-item[_ngcontent-%COMP%]:hover {\n background-color: #e3f2fd;\n}\n\n.tree-item.selected[_ngcontent-%COMP%] {\n background-color: #3B82F6;\n color: white;\n font-weight: 500;\n}\n\n.tree-item.selected[_ngcontent-%COMP%] .component-icon[_ngcontent-%COMP%], \n.tree-item.selected[_ngcontent-%COMP%] .tree-toggle[_ngcontent-%COMP%] {\n color: white;\n}\n\n.tree-item.selected[_ngcontent-%COMP%] .component-badge[_ngcontent-%COMP%] {\n background-color: rgba(255, 255, 255, 0.2);\n color: white;\n border-color: rgba(255, 255, 255, 0.3);\n}\n\n.tree-toggle[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #666;\n cursor: pointer;\n transition: transform 0.2s ease;\n width: 16px;\n text-align: center;\n}\n\n.tree-spacer[_ngcontent-%COMP%] {\n width: 16px;\n display: inline-block;\n}\n\n.component-icon[_ngcontent-%COMP%] {\n font-size: 16px;\n color: #3B82F6;\n}\n\n.component-info[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 8px;\n overflow: hidden;\n}\n\n.component-name[_ngcontent-%COMP%] {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: 14px;\n}\n\n.component-badge[_ngcontent-%COMP%] {\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 10px;\n background-color: #e3f2fd;\n color: #1976d2;\n border: 1px solid #bbdefb;\n white-space: nowrap;\n font-weight: 500;\n}\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 20px;\n color: #999;\n font-size: 14px;\n}\n\n\n\n.feedback-section[_ngcontent-%COMP%] {\n background-color: #ffffff;\n border-radius: 8px;\n border: 1px solid #e0e0e0;\n padding: 16px;\n min-height: 300px;\n}\n\n.selected-component-info[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.component-description[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #666;\n line-height: 1.5;\n margin: 0;\n padding: 12px;\n background-color: #f8f9fa;\n border-radius: 6px;\n border-left: 3px solid #3B82F6;\n}\n\n\n\n.star-rating-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.rating-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: #333;\n}\n\n.star-rating[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n\n.star[_ngcontent-%COMP%] {\n font-size: 32px;\n color: #ffd700;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.star[_ngcontent-%COMP%]:hover {\n transform: scale(1.2);\n filter: brightness(1.1);\n}\n\n.star.fa-regular[_ngcontent-%COMP%] {\n color: #d0d0d0;\n}\n\n.rating-text[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #666;\n margin-top: 4px;\n}\n\n.rating-text.placeholder[_ngcontent-%COMP%] {\n color: #999;\n font-style: italic;\n}\n\n\n\n.comment-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n position: relative;\n}\n\n.comment-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: #333;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.optional-label[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: normal;\n color: #999;\n}\n\n.comment-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px;\n border: 1px solid #d0d0d0;\n border-radius: 6px;\n font-size: 14px;\n font-family: inherit;\n resize: vertical;\n min-height: 80px;\n transition: border-color 0.2s ease;\n}\n\n.comment-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #3B82F6;\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);\n}\n\n.char-count[_ngcontent-%COMP%] {\n position: absolute;\n bottom: 8px;\n right: 12px;\n font-size: 11px;\n color: #999;\n background-color: white;\n padding: 2px 4px;\n}\n\n\n\n.submit-container[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n}\n\n.submit-button[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n font-size: 14px;\n font-weight: 500;\n}\n\n.submit-button[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.submit-button[_ngcontent-%COMP%] i.fa-spinner[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_spin 1s linear infinite;\n}\n\n@keyframes _ngcontent-%COMP%_spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n\n\n.message[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border-radius: 6px;\n font-size: 14px;\n animation: _ngcontent-%COMP%_slideDown 0.3s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.success-message[_ngcontent-%COMP%] {\n background-color: #d4edda;\n color: #155724;\n border: 1px solid #c3e6cb;\n}\n\n.success-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #28a745;\n}\n\n.error-message[_ngcontent-%COMP%] {\n background-color: #f8d7da;\n color: #721c24;\n border: 1px solid #f5c6cb;\n}\n\n.error-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #dc3545;\n}\n\n\n\n.no-selection-message[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 40px 20px;\n color: #999;\n text-align: center;\n}\n\n.no-selection-message[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 48px;\n color: #d0d0d0;\n}\n\n.no-selection-message[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n line-height: 1.5;\n}\n\n\n\n.panel-content[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 8px;\n}\n\n.panel-content[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background-color: #f1f1f1;\n}\n\n.panel-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background-color: #c0c0c0;\n border-radius: 4px;\n}\n\n.panel-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background-color: #a0a0a0;\n}"] });
442
+ }
443
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SkipComponentFeedbackPanelComponent, [{
444
+ type: Component,
445
+ args: [{ selector: 'skip-component-feedback-panel', standalone: true, imports: [
446
+ CommonModule,
447
+ FormsModule,
448
+ ButtonModule,
449
+ InputsModule,
450
+ DropDownsModule,
451
+ LayoutModule
452
+ ], template: "<div class=\"feedback-panel-overlay\" *ngIf=\"isVisible\" (click)=\"closePanel()\">\n <div class=\"feedback-panel\" (click)=\"$event.stopPropagation()\">\n <!-- Header -->\n <div class=\"panel-header\">\n <div class=\"panel-title\">\n <i class=\"fa-solid fa-comment-dots\"></i>\n <span>Component Feedback</span>\n </div>\n <button kendoButton class=\"close-button\" (click)=\"closePanel()\" fillMode=\"flat\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"panel-content\">\n <!-- Component Tree Section -->\n <div class=\"tree-section\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-sitemap\"></i>\n <span>Select Component</span>\n </div>\n\n @if (rootComponent) {\n <div class=\"component-tree\">\n @for (item of getTreeItems(); track item.node.name) {\n <div\n class=\"tree-item\"\n [class.selected]=\"isComponentSelected(item.node)\"\n [style.padding-left]=\"getNodeIndentation(item.depth)\"\n (click)=\"selectComponent(item.node, $event)\">\n\n <!-- Expand/Collapse Icon -->\n @if (item.hasChildren) {\n <i\n class=\"tree-toggle\"\n [class.fa-solid]=\"true\"\n [class.fa-chevron-right]=\"!isNodeExpanded(item.node)\"\n [class.fa-chevron-down]=\"isNodeExpanded(item.node)\"\n (click)=\"toggleNode(item.node); $event.stopPropagation()\">\n </i>\n } @else {\n <span class=\"tree-spacer\"></span>\n }\n\n <!-- Component Icon -->\n <i class=\"fa-solid fa-cube component-icon\"></i>\n\n <!-- Component Name -->\n <div class=\"component-info\">\n <span class=\"component-name\">{{ item.node.title || item.node.name }}</span>\n @if (item.node.location === 'registry') {\n <span class=\"component-badge registry\">Registry</span>\n }\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"empty-state\">\n <i class=\"fa-solid fa-info-circle\"></i>\n <span>No component hierarchy available</span>\n </div>\n }\n </div>\n\n <!-- Feedback Form Section -->\n <div class=\"feedback-section\">\n @if (selectedComponent) {\n <div class=\"selected-component-info\">\n <div class=\"section-header\">\n <i class=\"fa-solid fa-star\"></i>\n <span>Rate: {{ selectedComponent.title || selectedComponent.name }}</span>\n </div>\n\n @if (selectedComponent.description) {\n <p class=\"component-description\">{{ selectedComponent.description }}</p>\n }\n\n <!-- Star Rating -->\n <div class=\"star-rating-container\">\n <label class=\"rating-label\">Your Rating</label>\n <div class=\"star-rating\">\n @for (star of [1, 2, 3, 4, 5]; track star) {\n <i\n class=\"star\"\n [class.fa-solid]=\"isStarFilled(star)\"\n [class.fa-regular]=\"!isStarFilled(star)\"\n [class.fa-star]=\"true\"\n (click)=\"setRating(star)\"\n (mouseenter)=\"setHoverRating(star)\"\n (mouseleave)=\"clearHoverRating()\">\n </i>\n }\n </div>\n @if (starRating > 0) {\n <span class=\"rating-text\">{{ starRating }} out of 5 stars</span>\n } @else {\n <span class=\"rating-text placeholder\">Click to rate</span>\n }\n </div>\n\n <!-- Comment Input -->\n <div class=\"comment-container\">\n <label class=\"comment-label\">\n Comments\n <span class=\"optional-label\">(optional)</span>\n </label>\n <textarea\n class=\"comment-input\"\n [(ngModel)]=\"feedbackComment\"\n placeholder=\"Share your thoughts about this component...\"\n rows=\"4\"\n maxlength=\"1000\">\n </textarea>\n @if (feedbackComment.length > 0) {\n <span class=\"char-count\">{{ feedbackComment.length }}/1000</span>\n }\n </div>\n\n <!-- Submit Button -->\n <div class=\"submit-container\">\n <button\n kendoButton\n [themeColor]=\"'primary'\"\n [disabled]=\"!canSubmit()\"\n (click)=\"submitFeedback()\"\n class=\"submit-button\">\n @if (isSubmitting) {\n <i class=\"fa-solid fa-spinner fa-spin\"></i>\n <span>Submitting...</span>\n } @else {\n <i class=\"fa-solid fa-paper-plane\"></i>\n <span>Submit Feedback</span>\n }\n </button>\n </div>\n\n <!-- Success/Error Messages -->\n @if (submitSuccess) {\n <div class=\"message success-message\">\n <i class=\"fa-solid fa-check-circle\"></i>\n <span>Feedback submitted successfully!</span>\n </div>\n }\n @if (submitError) {\n <div class=\"message error-message\">\n <i class=\"fa-solid fa-exclamation-circle\"></i>\n <span>{{ submitError }}</span>\n </div>\n }\n </div>\n } @else {\n <div class=\"no-selection-message\">\n <i class=\"fa-solid fa-hand-pointer\"></i>\n <p>Select a component from the tree to provide feedback</p>\n </div>\n }\n </div>\n </div>\n </div>\n</div>\n", styles: ["/* Overlay */\n.feedback-panel-overlay {\n position: fixed;\n top: 60px; /* Start below typical banner height */\n left: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0, 0, 0, 0.4);\n z-index: 9999; /* Below banner but above content */\n display: flex;\n justify-content: flex-start; /* Changed from flex-end to flex-start */\n animation: fadeIn 0.2s ease-in-out;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n/* Panel Container */\n.feedback-panel {\n width: 450px;\n height: 100%;\n background-color: #ffffff;\n box-shadow: 2px 0 8px rgba(0, 0, 0, 0.15); /* Changed from -2px to 2px for left shadow */\n display: flex;\n flex-direction: column;\n animation: slideInFromLeft 0.3s ease-out; /* Changed animation name */\n}\n\n@keyframes slideInFromLeft {\n from {\n transform: translateX(-100%); /* Changed from 100% to -100% */\n }\n to {\n transform: translateX(0);\n }\n}\n\n/* Header */\n.panel-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 16px 20px;\n border-bottom: 1px solid #e0e0e0;\n background-color: #f8f9fa;\n}\n\n.panel-title {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 18px;\n font-weight: 600;\n color: #333;\n}\n\n.panel-title i {\n color: #3B82F6;\n font-size: 20px;\n}\n\n.close-button {\n min-width: 32px;\n height: 32px;\n padding: 0;\n border-radius: 4px;\n}\n\n.close-button:hover {\n background-color: #e0e0e0;\n}\n\n/* Content */\n.panel-content {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 20px;\n padding: 20px;\n}\n\n/* Section Headers */\n.section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 14px;\n font-weight: 600;\n color: #555;\n margin-bottom: 12px;\n padding-bottom: 8px;\n border-bottom: 2px solid #3B82F6;\n}\n\n.section-header i {\n color: #3B82F6;\n}\n\n/* Component Tree */\n.tree-section {\n background-color: #f8f9fa;\n border-radius: 8px;\n padding: 16px;\n}\n\n.component-tree {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.tree-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s ease;\n user-select: none;\n position: relative;\n}\n\n.tree-item:hover {\n background-color: #e3f2fd;\n}\n\n.tree-item.selected {\n background-color: #3B82F6;\n color: white;\n font-weight: 500;\n}\n\n.tree-item.selected .component-icon,\n.tree-item.selected .tree-toggle {\n color: white;\n}\n\n.tree-item.selected .component-badge {\n background-color: rgba(255, 255, 255, 0.2);\n color: white;\n border-color: rgba(255, 255, 255, 0.3);\n}\n\n.tree-toggle {\n font-size: 12px;\n color: #666;\n cursor: pointer;\n transition: transform 0.2s ease;\n width: 16px;\n text-align: center;\n}\n\n.tree-spacer {\n width: 16px;\n display: inline-block;\n}\n\n.component-icon {\n font-size: 16px;\n color: #3B82F6;\n}\n\n.component-info {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 8px;\n overflow: hidden;\n}\n\n.component-name {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: 14px;\n}\n\n.component-badge {\n font-size: 10px;\n padding: 2px 6px;\n border-radius: 10px;\n background-color: #e3f2fd;\n color: #1976d2;\n border: 1px solid #bbdefb;\n white-space: nowrap;\n font-weight: 500;\n}\n\n.empty-state {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 20px;\n color: #999;\n font-size: 14px;\n}\n\n/* Feedback Form Section */\n.feedback-section {\n background-color: #ffffff;\n border-radius: 8px;\n border: 1px solid #e0e0e0;\n padding: 16px;\n min-height: 300px;\n}\n\n.selected-component-info {\n display: flex;\n flex-direction: column;\n gap: 20px;\n}\n\n.component-description {\n font-size: 13px;\n color: #666;\n line-height: 1.5;\n margin: 0;\n padding: 12px;\n background-color: #f8f9fa;\n border-radius: 6px;\n border-left: 3px solid #3B82F6;\n}\n\n/* Star Rating */\n.star-rating-container {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.rating-label {\n font-size: 14px;\n font-weight: 500;\n color: #333;\n}\n\n.star-rating {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n\n.star {\n font-size: 32px;\n color: #ffd700;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.star:hover {\n transform: scale(1.2);\n filter: brightness(1.1);\n}\n\n.star.fa-regular {\n color: #d0d0d0;\n}\n\n.rating-text {\n font-size: 13px;\n color: #666;\n margin-top: 4px;\n}\n\n.rating-text.placeholder {\n color: #999;\n font-style: italic;\n}\n\n/* Comment Input */\n.comment-container {\n display: flex;\n flex-direction: column;\n gap: 8px;\n position: relative;\n}\n\n.comment-label {\n font-size: 14px;\n font-weight: 500;\n color: #333;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.optional-label {\n font-size: 12px;\n font-weight: normal;\n color: #999;\n}\n\n.comment-input {\n width: 100%;\n padding: 12px;\n border: 1px solid #d0d0d0;\n border-radius: 6px;\n font-size: 14px;\n font-family: inherit;\n resize: vertical;\n min-height: 80px;\n transition: border-color 0.2s ease;\n}\n\n.comment-input:focus {\n outline: none;\n border-color: #3B82F6;\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);\n}\n\n.char-count {\n position: absolute;\n bottom: 8px;\n right: 12px;\n font-size: 11px;\n color: #999;\n background-color: white;\n padding: 2px 4px;\n}\n\n/* Submit Button */\n.submit-container {\n display: flex;\n justify-content: flex-end;\n}\n\n.submit-button {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n font-size: 14px;\n font-weight: 500;\n}\n\n.submit-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.submit-button i.fa-spinner {\n animation: spin 1s linear infinite;\n}\n\n@keyframes spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n/* Messages */\n.message {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n border-radius: 6px;\n font-size: 14px;\n animation: slideDown 0.3s ease-out;\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.success-message {\n background-color: #d4edda;\n color: #155724;\n border: 1px solid #c3e6cb;\n}\n\n.success-message i {\n color: #28a745;\n}\n\n.error-message {\n background-color: #f8d7da;\n color: #721c24;\n border: 1px solid #f5c6cb;\n}\n\n.error-message i {\n color: #dc3545;\n}\n\n/* No Selection Message */\n.no-selection-message {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n padding: 40px 20px;\n color: #999;\n text-align: center;\n}\n\n.no-selection-message i {\n font-size: 48px;\n color: #d0d0d0;\n}\n\n.no-selection-message p {\n margin: 0;\n font-size: 14px;\n line-height: 1.5;\n}\n\n/* Scrollbar Styling */\n.panel-content::-webkit-scrollbar {\n width: 8px;\n}\n\n.panel-content::-webkit-scrollbar-track {\n background-color: #f1f1f1;\n}\n\n.panel-content::-webkit-scrollbar-thumb {\n background-color: #c0c0c0;\n border-radius: 4px;\n}\n\n.panel-content::-webkit-scrollbar-thumb:hover {\n background-color: #a0a0a0;\n}\n"] }]
453
+ }], null, { rootComponent: [{
454
+ type: Input
455
+ }], conversationID: [{
456
+ type: Input
457
+ }], conversationDetailID: [{
458
+ type: Input
459
+ }], reportID: [{
460
+ type: Input
461
+ }], dashboardID: [{
462
+ type: Input
463
+ }], isVisible: [{
464
+ type: Input
465
+ }], feedbackSubmitted: [{
466
+ type: Output
467
+ }], componentSelected: [{
468
+ type: Output
469
+ }], closed: [{
470
+ type: Output
471
+ }] }); })();
472
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SkipComponentFeedbackPanelComponent, { className: "SkipComponentFeedbackPanelComponent", filePath: "src/lib/artifacts/skip-component-feedback-panel.component.ts", lineNumber: 55 }); })();
473
+ //# sourceMappingURL=skip-component-feedback-panel.component.js.map