@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.
- package/dist/lib/artifacts/skip-artifact-viewer.component.d.ts +33 -3
- package/dist/lib/artifacts/skip-artifact-viewer.component.d.ts.map +1 -1
- package/dist/lib/artifacts/skip-artifact-viewer.component.js +166 -22
- package/dist/lib/artifacts/skip-artifact-viewer.component.js.map +1 -1
- package/dist/lib/artifacts/skip-component-feedback-panel.component.d.ts +120 -0
- package/dist/lib/artifacts/skip-component-feedback-panel.component.d.ts.map +1 -0
- package/dist/lib/artifacts/skip-component-feedback-panel.component.js +473 -0
- package/dist/lib/artifacts/skip-component-feedback-panel.component.js.map +1 -0
- package/dist/lib/dynamic-report/dynamic-ui-component.d.ts +3 -1
- package/dist/lib/dynamic-report/dynamic-ui-component.d.ts.map +1 -1
- package/dist/lib/dynamic-report/dynamic-ui-component.js +211 -179
- package/dist/lib/dynamic-report/dynamic-ui-component.js.map +1 -1
- package/dist/lib/dynamic-report/linear-report.d.ts +3 -1
- package/dist/lib/dynamic-report/linear-report.d.ts.map +1 -1
- package/dist/lib/dynamic-report/linear-report.js +10 -4
- package/dist/lib/dynamic-report/linear-report.js.map +1 -1
- package/dist/lib/dynamic-report/skip-dynamic-report-wrapper.d.ts +10 -0
- package/dist/lib/dynamic-report/skip-dynamic-report-wrapper.d.ts.map +1 -1
- package/dist/lib/dynamic-report/skip-dynamic-report-wrapper.js +41 -9
- package/dist/lib/dynamic-report/skip-dynamic-report-wrapper.js.map +1 -1
- package/dist/lib/module.d.ts +22 -21
- package/dist/lib/module.d.ts.map +1 -1
- package/dist/lib/module.js +6 -2
- package/dist/lib/module.js.map +1 -1
- package/dist/lib/skip-chat/skip-chat.component.d.ts.map +1 -1
- package/dist/lib/skip-chat/skip-chat.component.js +3 -3
- package/dist/lib/skip-chat/skip-chat.component.js.map +1 -1
- package/dist/lib/skip-single-message/skip-single-message.component.d.ts.map +1 -1
- package/dist/lib/skip-single-message/skip-single-message.component.js +3 -3
- package/dist/lib/skip-single-message/skip-single-message.component.js.map +1 -1
- 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
|