@seniorsistemas/angular-components 19.9.4 → 19.9.5

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 (60) hide show
  1. package/autocomplete/README.md +4 -0
  2. package/autocomplete/lib/autocomplete/autocomplete.component.d.ts +7 -1
  3. package/autocomplete/lib/autocomplete/components/autocomplete-chip/autocomplete-chip.component.d.ts +3 -1
  4. package/esm2022/autocomplete/lib/autocomplete/autocomplete.component.mjs +10 -4
  5. package/esm2022/autocomplete/lib/autocomplete/components/autocomplete-chip/autocomplete-chip.component.mjs +5 -3
  6. package/esm2022/dynamic-form/dynamic-form/form-field/fields/select/select-field.component.mjs +2 -2
  7. package/esm2022/editor/lib/editor/editor.component.mjs +3 -3
  8. package/esm2022/insights/lib/insights/components/insights-card/insights-card.component.mjs +21 -3
  9. package/esm2022/insights/lib/insights/components/insights-sidebar/insights-sidebar.component.mjs +14 -3
  10. package/esm2022/insights/lib/insights/insights.component.mjs +15 -4
  11. package/esm2022/paginator/lib/paginator/paginator.component.mjs +2 -2
  12. package/esm2022/rating-scale/lib/rating-scale/models/rating-scale-node.mjs +1 -1
  13. package/esm2022/rating-scale/lib/rating-scale/rating-scale.component.mjs +23 -3
  14. package/esm2022/select/lib/select/components/select-option/select-option.component.mjs +5 -3
  15. package/esm2022/select/lib/select/select.component.mjs +6 -4
  16. package/esm2022/speech-recognition/lib/speech-recognition/speech-recognition/speech-recognition.component.mjs +7 -3
  17. package/esm2022/split-button/lib/split-button/split-button.component.mjs +11 -3
  18. package/esm2022/table/lib/table/table-column/table-columns.component.mjs +1 -1
  19. package/esm2022/text-area/lib/text-area/text-area.component.mjs +1 -1
  20. package/esm2022/token-list/lib/token-list/token-list.component.mjs +7 -3
  21. package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs +13 -5
  22. package/fesm2022/seniorsistemas-angular-components-autocomplete.mjs.map +1 -1
  23. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +1 -1
  24. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
  25. package/fesm2022/seniorsistemas-angular-components-editor.mjs +2 -2
  26. package/fesm2022/seniorsistemas-angular-components-editor.mjs.map +1 -1
  27. package/fesm2022/seniorsistemas-angular-components-insights.mjs +47 -7
  28. package/fesm2022/seniorsistemas-angular-components-insights.mjs.map +1 -1
  29. package/fesm2022/seniorsistemas-angular-components-paginator.mjs +1 -1
  30. package/fesm2022/seniorsistemas-angular-components-paginator.mjs.map +1 -1
  31. package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs +22 -2
  32. package/fesm2022/seniorsistemas-angular-components-rating-scale.mjs.map +1 -1
  33. package/fesm2022/seniorsistemas-angular-components-select.mjs +9 -5
  34. package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
  35. package/fesm2022/seniorsistemas-angular-components-speech-recognition.mjs +6 -2
  36. package/fesm2022/seniorsistemas-angular-components-speech-recognition.mjs.map +1 -1
  37. package/fesm2022/seniorsistemas-angular-components-split-button.mjs +10 -2
  38. package/fesm2022/seniorsistemas-angular-components-split-button.mjs.map +1 -1
  39. package/fesm2022/seniorsistemas-angular-components-table.mjs +1 -1
  40. package/fesm2022/seniorsistemas-angular-components-table.mjs.map +1 -1
  41. package/fesm2022/seniorsistemas-angular-components-text-area.mjs +1 -1
  42. package/fesm2022/seniorsistemas-angular-components-text-area.mjs.map +1 -1
  43. package/fesm2022/seniorsistemas-angular-components-token-list.mjs +6 -2
  44. package/fesm2022/seniorsistemas-angular-components-token-list.mjs.map +1 -1
  45. package/insights/README.md +12 -0
  46. package/insights/lib/insights/components/insights-card/insights-card.component.d.ts +22 -1
  47. package/insights/lib/insights/components/insights-sidebar/insights-sidebar.component.d.ts +9 -1
  48. package/insights/lib/insights/insights.component.d.ts +9 -1
  49. package/package.json +7 -7
  50. package/rating-scale/README.md +38 -13
  51. package/rating-scale/lib/rating-scale/models/rating-scale-node.d.ts +8 -0
  52. package/rating-scale/lib/rating-scale/rating-scale.component.d.ts +4 -1
  53. package/select/README.md +2 -0
  54. package/select/lib/select/components/select-option/select-option.component.d.ts +3 -1
  55. package/select/lib/select/select.component.d.ts +3 -1
  56. package/speech-recognition/README.md +1 -0
  57. package/speech-recognition/lib/speech-recognition/speech-recognition/speech-recognition.component.d.ts +3 -1
  58. package/split-button/README.md +2 -0
  59. package/split-button/lib/split-button/split-button.component.d.ts +5 -1
  60. package/token-list/lib/token-list/token-list.component.d.ts +3 -1
@@ -28,11 +28,27 @@ class InsightsCardComponent {
28
28
  translateService = inject(TranslateService);
29
29
  _destroyRef = inject(DestroyRef);
30
30
  insight;
31
+ icons;
31
32
  open = false;
32
33
  isLoading = false;
33
34
  content;
34
35
  likeSelected = false;
35
36
  dislikeSelected = false;
37
+ get lightbulbIconClass() {
38
+ return this.icons?.lightbulb ?? 'fal fa-lightbulb';
39
+ }
40
+ get copyIconClass() {
41
+ return this.icons?.copy ?? 'fal fa-copy';
42
+ }
43
+ get redoIconClass() {
44
+ return this.icons?.redo ?? 'fal fa-redo';
45
+ }
46
+ get thumbsUpIconClass() {
47
+ return this.icons?.thumbsUp ?? (this.likeSelected ? 'fas fa-thumbs-up' : 'fal fa-thumbs-up');
48
+ }
49
+ get thumbsDownIconClass() {
50
+ return this.icons?.thumbsDown ?? (this.dislikeSelected ? 'fas fa-thumbs-down' : 'fal fa-thumbs-down');
51
+ }
36
52
  toggle() {
37
53
  const newOpenState = !this.open;
38
54
  this.open = newOpenState;
@@ -92,14 +108,16 @@ class InsightsCardComponent {
92
108
  });
93
109
  }
94
110
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: InsightsCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
95
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: InsightsCardComponent, isStandalone: true, selector: "s-insights-card", inputs: { insight: "insight" }, ngImport: i0, template: "<div\r\n class=\"insights-card\"\r\n [ngClass]=\"{ 'insights-card--close': !open }\"\r\n>\r\n <div\r\n class=\"header\"\r\n (click)=\"toggle()\"\r\n >\r\n <s-badge\r\n text=\"Insight\"\r\n iconClass=\"fal fa-lightbulb\"\r\n ></s-badge>\r\n <span class=\"insight-title\">{{ insight.title }}</span>\r\n <span class=\"toggle-icon\">\r\n <i\r\n class=\"fas\"\r\n [ngClass]=\"{\r\n 'fa-angle-down': !open,\r\n 'fa-angle-up': open,\r\n }\"\r\n >\r\n </i>\r\n </span>\r\n </div>\r\n <div class=\"content\">\r\n @if (isLoading) {\r\n <s-insights-card-loader></s-insights-card-loader>\r\n } @else {\r\n @if (content) {\r\n <span\r\n class=\"text\"\r\n [innerHTML]=\"content\"\r\n ></span>\r\n <span class=\"insight-footer\">{{ 'platform.angular_components.insight_footer' | translate }}</span>\r\n } @else {\r\n <span class=\"text text--error\">{{\r\n 'platform.angular_components.error_loading_insight_alt' | translate\r\n }}</span>\r\n }\r\n <div class=\"options\">\r\n <button\r\n [disabled]=\"!content\"\r\n (click)=\"copyContent()\"\r\n class=\"option\"\r\n >\r\n <i class=\"fal fa-copy\"></i>\r\n </button>\r\n <button\r\n (click)=\"reloadContent()\"\r\n class=\"option\"\r\n >\r\n <i class=\"fal fa-redo\"></i>\r\n </button>\r\n @if (insight.onLikeSelected) {\r\n <button\r\n [disabled]=\"!content\"\r\n (click)=\"onLikeSelected()\"\r\n class=\"option\"\r\n >\r\n <i\r\n [ngClass]=\"{\r\n fal: !likeSelected,\r\n fas: likeSelected,\r\n 'fa-thumbs-up': true,\r\n }\"\r\n >\r\n </i>\r\n </button>\r\n }\r\n @if (insight.onDislikeSelected) {\r\n <button\r\n [disabled]=\"!content\"\r\n (click)=\"onDislikeSelected()\"\r\n class=\"option\"\r\n >\r\n <i\r\n [ngClass]=\"{\r\n fal: !dislikeSelected,\r\n fas: dislikeSelected,\r\n 'fa-thumbs-down': true,\r\n }\"\r\n ></i>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n", styles: [".insights-card{background-color:#fff;border:1px solid #9ecad4;border-radius:4px;cursor:pointer;display:flex;flex-direction:column;overflow:hidden}.insights-card .header{align-items:center;background-color:#f1f7f8;border-bottom:1px solid #9ecad4;display:flex;gap:8px;min-height:60px;padding:8px 16px;-webkit-user-select:none;user-select:none}.insights-card .header .insight-title{color:#428bca;flex-grow:1;font-family:Open Sans,sans-serif;font-size:14px;line-height:150%}.insights-card .header .toggle-icon{color:#888b99;font-size:20px}.insights-card .content{align-items:center;justify-content:space-between;cursor:auto;display:flex;flex-direction:column;gap:16px;min-height:160px;padding:24px}.insights-card .content .text{color:#212533;font-family:Open Sans,sans-serif;font-size:14px;width:100%}.insights-card .content .text--error{text-align:center}.insights-card .content .insight-footer{color:#888b99;font-family:Open Sans,sans-serif;font-size:12px;text-align:center}.insights-card .content .options{display:flex;gap:8px}.insights-card .content .options .option{background-color:transparent;border:none;color:#428bca;cursor:pointer;font-size:12px}.insights-card .content .options .option:disabled{color:#c1c1cc;cursor:auto}.insights-card--close{border-color:#dedce5}.insights-card--close .header{background-color:#fbfafc;border:none;border-color:#dedce5}.insights-card--close .header .insight-title{color:#888b99}.insights-card--close .content{display:none}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: BadgeComponent, selector: "s-badge", inputs: ["type", "color", "title", "text", "selectable", "iconClass", "iconPosition", "infoSign", "enableTruncateText"], outputs: ["selected"] }, { kind: "component", type: InsightsCardLoaderComponent, selector: "s-insights-card-loader" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
111
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: InsightsCardComponent, isStandalone: true, selector: "s-insights-card", inputs: { insight: "insight", icons: "icons" }, ngImport: i0, template: "<div\r\n class=\"insights-card\"\r\n [ngClass]=\"{ 'insights-card--close': !open }\"\r\n>\r\n <div\r\n class=\"header\"\r\n (click)=\"toggle()\"\r\n >\r\n <s-badge\r\n text=\"Insight\"\r\n [iconClass]=\"lightbulbIconClass\"\r\n ></s-badge>\r\n <span class=\"insight-title\">{{ insight.title }}</span>\r\n <span class=\"toggle-icon\">\r\n <i\r\n class=\"fas\"\r\n [ngClass]=\"{\r\n 'fa-angle-down': !open,\r\n 'fa-angle-up': open,\r\n }\"\r\n >\r\n </i>\r\n </span>\r\n </div>\r\n <div class=\"content\">\r\n @if (isLoading) {\r\n <s-insights-card-loader></s-insights-card-loader>\r\n } @else {\r\n @if (content) {\r\n <span\r\n class=\"text\"\r\n [innerHTML]=\"content\"\r\n ></span>\r\n <span class=\"insight-footer\">{{ 'platform.angular_components.insight_footer' | translate }}</span>\r\n } @else {\r\n <span class=\"text text--error\">{{\r\n 'platform.angular_components.error_loading_insight_alt' | translate\r\n }}</span>\r\n }\r\n <div class=\"options\">\r\n <button\r\n [disabled]=\"!content\"\r\n (click)=\"copyContent()\"\r\n class=\"option\"\r\n >\r\n <i [class]=\"copyIconClass\"></i>\r\n </button>\r\n <button\r\n (click)=\"reloadContent()\"\r\n class=\"option\"\r\n >\r\n <i [class]=\"redoIconClass\"></i>\r\n </button>\r\n @if (insight.onLikeSelected) {\r\n <button\r\n [disabled]=\"!content\"\r\n (click)=\"onLikeSelected()\"\r\n class=\"option\"\r\n >\r\n <i [class]=\"thumbsUpIconClass\"></i>\r\n </button>\r\n }\r\n @if (insight.onDislikeSelected) {\r\n <button\r\n [disabled]=\"!content\"\r\n (click)=\"onDislikeSelected()\"\r\n class=\"option\"\r\n >\r\n <i [class]=\"thumbsDownIconClass\"></i>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n", styles: [".insights-card{background-color:#fff;border:1px solid #9ecad4;border-radius:4px;cursor:pointer;display:flex;flex-direction:column;overflow:hidden}.insights-card .header{align-items:center;background-color:#f1f7f8;border-bottom:1px solid #9ecad4;display:flex;gap:8px;min-height:60px;padding:8px 16px;-webkit-user-select:none;user-select:none}.insights-card .header .insight-title{color:#428bca;flex-grow:1;font-family:Open Sans,sans-serif;font-size:14px;line-height:150%}.insights-card .header .toggle-icon{color:#888b99;font-size:20px}.insights-card .content{align-items:center;justify-content:space-between;cursor:auto;display:flex;flex-direction:column;gap:16px;min-height:160px;padding:24px}.insights-card .content .text{color:#212533;font-family:Open Sans,sans-serif;font-size:14px;width:100%}.insights-card .content .text--error{text-align:center}.insights-card .content .insight-footer{color:#888b99;font-family:Open Sans,sans-serif;font-size:12px;text-align:center}.insights-card .content .options{display:flex;gap:8px}.insights-card .content .options .option{background-color:transparent;border:none;color:#428bca;cursor:pointer;font-size:12px}.insights-card .content .options .option:disabled{color:#c1c1cc;cursor:auto}.insights-card--close{border-color:#dedce5}.insights-card--close .header{background-color:#fbfafc;border:none;border-color:#dedce5}.insights-card--close .header .insight-title{color:#888b99}.insights-card--close .content{display:none}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: BadgeComponent, selector: "s-badge", inputs: ["type", "color", "title", "text", "selectable", "iconClass", "iconPosition", "infoSign", "enableTruncateText"], outputs: ["selected"] }, { kind: "component", type: InsightsCardLoaderComponent, selector: "s-insights-card-loader" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
96
112
  }
97
113
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: InsightsCardComponent, decorators: [{
98
114
  type: Component,
99
- args: [{ selector: 's-insights-card', standalone: true, imports: [NgClass, BadgeComponent, InsightsCardLoaderComponent, TranslatePipe], template: "<div\r\n class=\"insights-card\"\r\n [ngClass]=\"{ 'insights-card--close': !open }\"\r\n>\r\n <div\r\n class=\"header\"\r\n (click)=\"toggle()\"\r\n >\r\n <s-badge\r\n text=\"Insight\"\r\n iconClass=\"fal fa-lightbulb\"\r\n ></s-badge>\r\n <span class=\"insight-title\">{{ insight.title }}</span>\r\n <span class=\"toggle-icon\">\r\n <i\r\n class=\"fas\"\r\n [ngClass]=\"{\r\n 'fa-angle-down': !open,\r\n 'fa-angle-up': open,\r\n }\"\r\n >\r\n </i>\r\n </span>\r\n </div>\r\n <div class=\"content\">\r\n @if (isLoading) {\r\n <s-insights-card-loader></s-insights-card-loader>\r\n } @else {\r\n @if (content) {\r\n <span\r\n class=\"text\"\r\n [innerHTML]=\"content\"\r\n ></span>\r\n <span class=\"insight-footer\">{{ 'platform.angular_components.insight_footer' | translate }}</span>\r\n } @else {\r\n <span class=\"text text--error\">{{\r\n 'platform.angular_components.error_loading_insight_alt' | translate\r\n }}</span>\r\n }\r\n <div class=\"options\">\r\n <button\r\n [disabled]=\"!content\"\r\n (click)=\"copyContent()\"\r\n class=\"option\"\r\n >\r\n <i class=\"fal fa-copy\"></i>\r\n </button>\r\n <button\r\n (click)=\"reloadContent()\"\r\n class=\"option\"\r\n >\r\n <i class=\"fal fa-redo\"></i>\r\n </button>\r\n @if (insight.onLikeSelected) {\r\n <button\r\n [disabled]=\"!content\"\r\n (click)=\"onLikeSelected()\"\r\n class=\"option\"\r\n >\r\n <i\r\n [ngClass]=\"{\r\n fal: !likeSelected,\r\n fas: likeSelected,\r\n 'fa-thumbs-up': true,\r\n }\"\r\n >\r\n </i>\r\n </button>\r\n }\r\n @if (insight.onDislikeSelected) {\r\n <button\r\n [disabled]=\"!content\"\r\n (click)=\"onDislikeSelected()\"\r\n class=\"option\"\r\n >\r\n <i\r\n [ngClass]=\"{\r\n fal: !dislikeSelected,\r\n fas: dislikeSelected,\r\n 'fa-thumbs-down': true,\r\n }\"\r\n ></i>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n", styles: [".insights-card{background-color:#fff;border:1px solid #9ecad4;border-radius:4px;cursor:pointer;display:flex;flex-direction:column;overflow:hidden}.insights-card .header{align-items:center;background-color:#f1f7f8;border-bottom:1px solid #9ecad4;display:flex;gap:8px;min-height:60px;padding:8px 16px;-webkit-user-select:none;user-select:none}.insights-card .header .insight-title{color:#428bca;flex-grow:1;font-family:Open Sans,sans-serif;font-size:14px;line-height:150%}.insights-card .header .toggle-icon{color:#888b99;font-size:20px}.insights-card .content{align-items:center;justify-content:space-between;cursor:auto;display:flex;flex-direction:column;gap:16px;min-height:160px;padding:24px}.insights-card .content .text{color:#212533;font-family:Open Sans,sans-serif;font-size:14px;width:100%}.insights-card .content .text--error{text-align:center}.insights-card .content .insight-footer{color:#888b99;font-family:Open Sans,sans-serif;font-size:12px;text-align:center}.insights-card .content .options{display:flex;gap:8px}.insights-card .content .options .option{background-color:transparent;border:none;color:#428bca;cursor:pointer;font-size:12px}.insights-card .content .options .option:disabled{color:#c1c1cc;cursor:auto}.insights-card--close{border-color:#dedce5}.insights-card--close .header{background-color:#fbfafc;border:none;border-color:#dedce5}.insights-card--close .header .insight-title{color:#888b99}.insights-card--close .content{display:none}\n"] }]
115
+ args: [{ selector: 's-insights-card', standalone: true, imports: [NgClass, BadgeComponent, InsightsCardLoaderComponent, TranslatePipe], template: "<div\r\n class=\"insights-card\"\r\n [ngClass]=\"{ 'insights-card--close': !open }\"\r\n>\r\n <div\r\n class=\"header\"\r\n (click)=\"toggle()\"\r\n >\r\n <s-badge\r\n text=\"Insight\"\r\n [iconClass]=\"lightbulbIconClass\"\r\n ></s-badge>\r\n <span class=\"insight-title\">{{ insight.title }}</span>\r\n <span class=\"toggle-icon\">\r\n <i\r\n class=\"fas\"\r\n [ngClass]=\"{\r\n 'fa-angle-down': !open,\r\n 'fa-angle-up': open,\r\n }\"\r\n >\r\n </i>\r\n </span>\r\n </div>\r\n <div class=\"content\">\r\n @if (isLoading) {\r\n <s-insights-card-loader></s-insights-card-loader>\r\n } @else {\r\n @if (content) {\r\n <span\r\n class=\"text\"\r\n [innerHTML]=\"content\"\r\n ></span>\r\n <span class=\"insight-footer\">{{ 'platform.angular_components.insight_footer' | translate }}</span>\r\n } @else {\r\n <span class=\"text text--error\">{{\r\n 'platform.angular_components.error_loading_insight_alt' | translate\r\n }}</span>\r\n }\r\n <div class=\"options\">\r\n <button\r\n [disabled]=\"!content\"\r\n (click)=\"copyContent()\"\r\n class=\"option\"\r\n >\r\n <i [class]=\"copyIconClass\"></i>\r\n </button>\r\n <button\r\n (click)=\"reloadContent()\"\r\n class=\"option\"\r\n >\r\n <i [class]=\"redoIconClass\"></i>\r\n </button>\r\n @if (insight.onLikeSelected) {\r\n <button\r\n [disabled]=\"!content\"\r\n (click)=\"onLikeSelected()\"\r\n class=\"option\"\r\n >\r\n <i [class]=\"thumbsUpIconClass\"></i>\r\n </button>\r\n }\r\n @if (insight.onDislikeSelected) {\r\n <button\r\n [disabled]=\"!content\"\r\n (click)=\"onDislikeSelected()\"\r\n class=\"option\"\r\n >\r\n <i [class]=\"thumbsDownIconClass\"></i>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n", styles: [".insights-card{background-color:#fff;border:1px solid #9ecad4;border-radius:4px;cursor:pointer;display:flex;flex-direction:column;overflow:hidden}.insights-card .header{align-items:center;background-color:#f1f7f8;border-bottom:1px solid #9ecad4;display:flex;gap:8px;min-height:60px;padding:8px 16px;-webkit-user-select:none;user-select:none}.insights-card .header .insight-title{color:#428bca;flex-grow:1;font-family:Open Sans,sans-serif;font-size:14px;line-height:150%}.insights-card .header .toggle-icon{color:#888b99;font-size:20px}.insights-card .content{align-items:center;justify-content:space-between;cursor:auto;display:flex;flex-direction:column;gap:16px;min-height:160px;padding:24px}.insights-card .content .text{color:#212533;font-family:Open Sans,sans-serif;font-size:14px;width:100%}.insights-card .content .text--error{text-align:center}.insights-card .content .insight-footer{color:#888b99;font-family:Open Sans,sans-serif;font-size:12px;text-align:center}.insights-card .content .options{display:flex;gap:8px}.insights-card .content .options .option{background-color:transparent;border:none;color:#428bca;cursor:pointer;font-size:12px}.insights-card .content .options .option:disabled{color:#c1c1cc;cursor:auto}.insights-card--close{border-color:#dedce5}.insights-card--close .header{background-color:#fbfafc;border:none;border-color:#dedce5}.insights-card--close .header .insight-title{color:#888b99}.insights-card--close .content{display:none}\n"] }]
100
116
  }], propDecorators: { insight: [{
101
117
  type: Input,
102
118
  args: [{ required: true }]
119
+ }], icons: [{
120
+ type: Input
103
121
  }] } });
104
122
 
105
123
  class InsightsSidebarComponent {
@@ -111,6 +129,13 @@ class InsightsSidebarComponent {
111
129
  emptyTemplate = null;
112
130
  noPermissionText;
113
131
  noPermissionTemplate = null;
132
+ /**
133
+ * @description Ícone do botão de fechar o sidebar.
134
+ * @default 'far fa-chevron-double-right'
135
+ */
136
+ closeIconClass = 'far fa-chevron-double-right';
137
+ /** @description Ícones customizáveis de cada `s-insights-card` renderizado no sidebar. */
138
+ icons;
114
139
  closedSidebar = output();
115
140
  openedSidebar = output();
116
141
  opened = false;
@@ -132,11 +157,11 @@ class InsightsSidebarComponent {
132
157
  this.closedSidebar.emit();
133
158
  }
134
159
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: InsightsSidebarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
135
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: InsightsSidebarComponent, isStandalone: true, selector: "s-insights-sidebar", inputs: { insights: "insights", hasPermission: "hasPermission", introText: "introText", introTemplate: "introTemplate", emptyText: "emptyText", emptyTemplate: "emptyTemplate", noPermissionText: "noPermissionText", noPermissionTemplate: "noPermissionTemplate" }, outputs: { closedSidebar: "closedSidebar", openedSidebar: "openedSidebar" }, ngImport: i0, template: "<div\r\n class=\"sidebar\"\r\n [class.opened]=\"opened\"\r\n>\r\n <div class=\"header\">\r\n <button\r\n (click)=\"close()\"\r\n class=\"option\"\r\n >\r\n <span class=\"far fa-chevron-double-right\"></span>\r\n </button>\r\n <div class=\"title\">\r\n <span><ng-container [ngTemplateOutlet]=\"iassistIcon\"></ng-container></span>\r\n <span>IAssist Insights</span>\r\n </div>\r\n </div>\r\n <div class=\"intro\">\r\n @if (hasPermission) {\r\n @if (insights.length) {\r\n @if (introTemplate) {\r\n <ng-container *ngTemplateOutlet=\"introTemplate\"></ng-container>\r\n } @else {\r\n <span class=\"text\">{{ introText || 'platform.angular_components.insight_intro' | translate }}</span>\r\n }\r\n } @else {\r\n @if (emptyTemplate) {\r\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\r\n } @else {\r\n <span class=\"text\">{{ emptyText || 'platform.angular_components.insight_empty' | translate }}</span>\r\n }\r\n }\r\n } @else {\r\n @if (noPermissionTemplate) {\r\n <ng-container *ngTemplateOutlet=\"noPermissionTemplate\"></ng-container>\r\n } @else {\r\n <span>{{ noPermissionText || 'platform.angular_components.insight_no_permission' | translate }}</span>\r\n }\r\n }\r\n </div>\r\n <div class=\"insights\">\r\n @if (insights.length) {\r\n @for (insight of insights; track insight) {\r\n <s-insights-card [insight]=\"insight\"> </s-insights-card>\r\n }\r\n }\r\n </div>\r\n</div>\r\n\r\n<ng-template #iassistIcon>\r\n <div style=\"width: 28px; height: 28px\">\r\n <span *sSVGFactory=\"'iassist'\"></span>\r\n </div>\r\n</ng-template>\r\n", styles: [".sidebar{background-color:#fff;border-left:1px solid #dedce5;height:100%;overflow-x:hidden;position:fixed;right:-25%;transition:.5s;top:0;width:25%;z-index:1002}.sidebar .header{border-bottom:1px solid #dedce5;display:flex;gap:16px;padding:12px 20px}.sidebar .header .option{background-color:transparent;border:none;color:#428bca;cursor:pointer;font-size:16px;padding:12px}.sidebar .header .title{align-items:center;color:#212533;display:flex;font-family:Open Sans,sans-serif;font-size:16px;gap:16px;line-height:1;-webkit-user-select:none;user-select:none}.sidebar .intro{margin:8px 40px}.sidebar .intro .text{color:#212533;display:flex;font-family:Open Sans,sans-serif;font-size:14px;justify-content:center;line-height:1.5;text-align:center;-webkit-user-select:none;user-select:none}.sidebar.opened{right:0}.sidebar.opened .insights{padding:12px}.insights{display:flex;flex-direction:column;gap:12px}@media (max-width: 1366px){.sidebar{right:-50%;width:50%}}@media (max-width: 768px){.sidebar{right:-75%;width:75%}}@media (max-width: 600px){.sidebar{right:-100%;width:100%}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: InsightsCardComponent, selector: "s-insights-card", inputs: ["insight"] }, { kind: "directive", type: SVGFactoryDirective, selector: "[sSVGFactory]", inputs: ["sSVGFactory"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
160
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: InsightsSidebarComponent, isStandalone: true, selector: "s-insights-sidebar", inputs: { insights: "insights", hasPermission: "hasPermission", introText: "introText", introTemplate: "introTemplate", emptyText: "emptyText", emptyTemplate: "emptyTemplate", noPermissionText: "noPermissionText", noPermissionTemplate: "noPermissionTemplate", closeIconClass: "closeIconClass", icons: "icons" }, outputs: { closedSidebar: "closedSidebar", openedSidebar: "openedSidebar" }, ngImport: i0, template: "<div\r\n class=\"sidebar\"\r\n [class.opened]=\"opened\"\r\n>\r\n <div class=\"header\">\r\n <button\r\n (click)=\"close()\"\r\n class=\"option\"\r\n >\r\n <span [class]=\"closeIconClass\"></span>\r\n </button>\r\n <div class=\"title\">\r\n <span><ng-container [ngTemplateOutlet]=\"iassistIcon\"></ng-container></span>\r\n <span>IAssist Insights</span>\r\n </div>\r\n </div>\r\n <div class=\"intro\">\r\n @if (hasPermission) {\r\n @if (insights.length) {\r\n @if (introTemplate) {\r\n <ng-container *ngTemplateOutlet=\"introTemplate\"></ng-container>\r\n } @else {\r\n <span class=\"text\">{{ introText || 'platform.angular_components.insight_intro' | translate }}</span>\r\n }\r\n } @else {\r\n @if (emptyTemplate) {\r\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\r\n } @else {\r\n <span class=\"text\">{{ emptyText || 'platform.angular_components.insight_empty' | translate }}</span>\r\n }\r\n }\r\n } @else {\r\n @if (noPermissionTemplate) {\r\n <ng-container *ngTemplateOutlet=\"noPermissionTemplate\"></ng-container>\r\n } @else {\r\n <span>{{ noPermissionText || 'platform.angular_components.insight_no_permission' | translate }}</span>\r\n }\r\n }\r\n </div>\r\n <div class=\"insights\">\r\n @if (insights.length) {\r\n @for (insight of insights; track insight) {\r\n <s-insights-card\r\n [insight]=\"insight\"\r\n [icons]=\"icons\"\r\n >\r\n </s-insights-card>\r\n }\r\n }\r\n </div>\r\n</div>\r\n\r\n<ng-template #iassistIcon>\r\n <div style=\"width: 28px; height: 28px\">\r\n <span *sSVGFactory=\"'iassist'\"></span>\r\n </div>\r\n</ng-template>\r\n", styles: [".sidebar{background-color:#fff;border-left:1px solid #dedce5;height:100%;overflow-x:hidden;position:fixed;right:-25%;transition:.5s;top:0;width:25%;z-index:1002}.sidebar .header{border-bottom:1px solid #dedce5;display:flex;gap:16px;padding:12px 20px}.sidebar .header .option{background-color:transparent;border:none;color:#428bca;cursor:pointer;font-size:16px;padding:12px}.sidebar .header .title{align-items:center;color:#212533;display:flex;font-family:Open Sans,sans-serif;font-size:16px;gap:16px;line-height:1;-webkit-user-select:none;user-select:none}.sidebar .intro{margin:8px 40px}.sidebar .intro .text{color:#212533;display:flex;font-family:Open Sans,sans-serif;font-size:14px;justify-content:center;line-height:1.5;text-align:center;-webkit-user-select:none;user-select:none}.sidebar.opened{right:0}.sidebar.opened .insights{padding:12px}.insights{display:flex;flex-direction:column;gap:12px}@media (max-width: 1366px){.sidebar{right:-50%;width:50%}}@media (max-width: 768px){.sidebar{right:-75%;width:75%}}@media (max-width: 600px){.sidebar{right:-100%;width:100%}}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: InsightsCardComponent, selector: "s-insights-card", inputs: ["insight", "icons"] }, { kind: "directive", type: SVGFactoryDirective, selector: "[sSVGFactory]", inputs: ["sSVGFactory"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
136
161
  }
137
162
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: InsightsSidebarComponent, decorators: [{
138
163
  type: Component,
139
- args: [{ selector: 's-insights-sidebar', standalone: true, imports: [NgTemplateOutlet, InsightsCardComponent, SVGFactoryDirective, TranslatePipe], template: "<div\r\n class=\"sidebar\"\r\n [class.opened]=\"opened\"\r\n>\r\n <div class=\"header\">\r\n <button\r\n (click)=\"close()\"\r\n class=\"option\"\r\n >\r\n <span class=\"far fa-chevron-double-right\"></span>\r\n </button>\r\n <div class=\"title\">\r\n <span><ng-container [ngTemplateOutlet]=\"iassistIcon\"></ng-container></span>\r\n <span>IAssist Insights</span>\r\n </div>\r\n </div>\r\n <div class=\"intro\">\r\n @if (hasPermission) {\r\n @if (insights.length) {\r\n @if (introTemplate) {\r\n <ng-container *ngTemplateOutlet=\"introTemplate\"></ng-container>\r\n } @else {\r\n <span class=\"text\">{{ introText || 'platform.angular_components.insight_intro' | translate }}</span>\r\n }\r\n } @else {\r\n @if (emptyTemplate) {\r\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\r\n } @else {\r\n <span class=\"text\">{{ emptyText || 'platform.angular_components.insight_empty' | translate }}</span>\r\n }\r\n }\r\n } @else {\r\n @if (noPermissionTemplate) {\r\n <ng-container *ngTemplateOutlet=\"noPermissionTemplate\"></ng-container>\r\n } @else {\r\n <span>{{ noPermissionText || 'platform.angular_components.insight_no_permission' | translate }}</span>\r\n }\r\n }\r\n </div>\r\n <div class=\"insights\">\r\n @if (insights.length) {\r\n @for (insight of insights; track insight) {\r\n <s-insights-card [insight]=\"insight\"> </s-insights-card>\r\n }\r\n }\r\n </div>\r\n</div>\r\n\r\n<ng-template #iassistIcon>\r\n <div style=\"width: 28px; height: 28px\">\r\n <span *sSVGFactory=\"'iassist'\"></span>\r\n </div>\r\n</ng-template>\r\n", styles: [".sidebar{background-color:#fff;border-left:1px solid #dedce5;height:100%;overflow-x:hidden;position:fixed;right:-25%;transition:.5s;top:0;width:25%;z-index:1002}.sidebar .header{border-bottom:1px solid #dedce5;display:flex;gap:16px;padding:12px 20px}.sidebar .header .option{background-color:transparent;border:none;color:#428bca;cursor:pointer;font-size:16px;padding:12px}.sidebar .header .title{align-items:center;color:#212533;display:flex;font-family:Open Sans,sans-serif;font-size:16px;gap:16px;line-height:1;-webkit-user-select:none;user-select:none}.sidebar .intro{margin:8px 40px}.sidebar .intro .text{color:#212533;display:flex;font-family:Open Sans,sans-serif;font-size:14px;justify-content:center;line-height:1.5;text-align:center;-webkit-user-select:none;user-select:none}.sidebar.opened{right:0}.sidebar.opened .insights{padding:12px}.insights{display:flex;flex-direction:column;gap:12px}@media (max-width: 1366px){.sidebar{right:-50%;width:50%}}@media (max-width: 768px){.sidebar{right:-75%;width:75%}}@media (max-width: 600px){.sidebar{right:-100%;width:100%}}\n"] }]
164
+ args: [{ selector: 's-insights-sidebar', standalone: true, imports: [NgTemplateOutlet, InsightsCardComponent, SVGFactoryDirective, TranslatePipe], template: "<div\r\n class=\"sidebar\"\r\n [class.opened]=\"opened\"\r\n>\r\n <div class=\"header\">\r\n <button\r\n (click)=\"close()\"\r\n class=\"option\"\r\n >\r\n <span [class]=\"closeIconClass\"></span>\r\n </button>\r\n <div class=\"title\">\r\n <span><ng-container [ngTemplateOutlet]=\"iassistIcon\"></ng-container></span>\r\n <span>IAssist Insights</span>\r\n </div>\r\n </div>\r\n <div class=\"intro\">\r\n @if (hasPermission) {\r\n @if (insights.length) {\r\n @if (introTemplate) {\r\n <ng-container *ngTemplateOutlet=\"introTemplate\"></ng-container>\r\n } @else {\r\n <span class=\"text\">{{ introText || 'platform.angular_components.insight_intro' | translate }}</span>\r\n }\r\n } @else {\r\n @if (emptyTemplate) {\r\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\r\n } @else {\r\n <span class=\"text\">{{ emptyText || 'platform.angular_components.insight_empty' | translate }}</span>\r\n }\r\n }\r\n } @else {\r\n @if (noPermissionTemplate) {\r\n <ng-container *ngTemplateOutlet=\"noPermissionTemplate\"></ng-container>\r\n } @else {\r\n <span>{{ noPermissionText || 'platform.angular_components.insight_no_permission' | translate }}</span>\r\n }\r\n }\r\n </div>\r\n <div class=\"insights\">\r\n @if (insights.length) {\r\n @for (insight of insights; track insight) {\r\n <s-insights-card\r\n [insight]=\"insight\"\r\n [icons]=\"icons\"\r\n >\r\n </s-insights-card>\r\n }\r\n }\r\n </div>\r\n</div>\r\n\r\n<ng-template #iassistIcon>\r\n <div style=\"width: 28px; height: 28px\">\r\n <span *sSVGFactory=\"'iassist'\"></span>\r\n </div>\r\n</ng-template>\r\n", styles: [".sidebar{background-color:#fff;border-left:1px solid #dedce5;height:100%;overflow-x:hidden;position:fixed;right:-25%;transition:.5s;top:0;width:25%;z-index:1002}.sidebar .header{border-bottom:1px solid #dedce5;display:flex;gap:16px;padding:12px 20px}.sidebar .header .option{background-color:transparent;border:none;color:#428bca;cursor:pointer;font-size:16px;padding:12px}.sidebar .header .title{align-items:center;color:#212533;display:flex;font-family:Open Sans,sans-serif;font-size:16px;gap:16px;line-height:1;-webkit-user-select:none;user-select:none}.sidebar .intro{margin:8px 40px}.sidebar .intro .text{color:#212533;display:flex;font-family:Open Sans,sans-serif;font-size:14px;justify-content:center;line-height:1.5;text-align:center;-webkit-user-select:none;user-select:none}.sidebar.opened{right:0}.sidebar.opened .insights{padding:12px}.insights{display:flex;flex-direction:column;gap:12px}@media (max-width: 1366px){.sidebar{right:-50%;width:50%}}@media (max-width: 768px){.sidebar{right:-75%;width:75%}}@media (max-width: 600px){.sidebar{right:-100%;width:100%}}\n"] }]
140
165
  }], propDecorators: { insights: [{
141
166
  type: Input
142
167
  }], hasPermission: [{
@@ -153,6 +178,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
153
178
  type: Input
154
179
  }], noPermissionTemplate: [{
155
180
  type: Input
181
+ }], closeIconClass: [{
182
+ type: Input
183
+ }], icons: [{
184
+ type: Input
156
185
  }] } });
157
186
 
158
187
  /**
@@ -181,6 +210,13 @@ class InsightsComponent {
181
210
  emptyText;
182
211
  /** @description Texto exibido quando o usuário não tem permissão. */
183
212
  noPermissionText;
213
+ /**
214
+ * @description Ícone do botão de fechar o sidebar.
215
+ * @default 'far fa-chevron-double-right'
216
+ */
217
+ closeIconClass = 'far fa-chevron-double-right';
218
+ /** @description Ícones customizáveis de cada card de insight exibido no sidebar. */
219
+ icons;
184
220
  sidebar = null;
185
221
  templates = null;
186
222
  /** @description Emitido quando o painel de insights é aberto. */
@@ -217,7 +253,7 @@ class InsightsComponent {
217
253
  this.noPermissionTemplate = this.getNoPermissionTemplate();
218
254
  }
219
255
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: InsightsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
220
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: InsightsComponent, isStandalone: true, selector: "s-insights, s-ia-insight", inputs: { insights: "insights", hasPermission: "hasPermission", introText: "introText", emptyText: "emptyText", noPermissionText: "noPermissionText" }, outputs: { openInsights: "openInsights", closedInsights: "closedInsights" }, providers: [
256
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: InsightsComponent, isStandalone: true, selector: "s-insights, s-ia-insight", inputs: { insights: "insights", hasPermission: "hasPermission", introText: "introText", emptyText: "emptyText", noPermissionText: "noPermissionText", closeIconClass: "closeIconClass", icons: "icons" }, outputs: { openInsights: "openInsights", closedInsights: "closedInsights" }, providers: [
221
257
  {
222
258
  provide: DEPRECATED_CONFIG,
223
259
  useValue: {
@@ -226,7 +262,7 @@ class InsightsComponent {
226
262
  removalVersion: '20.0.0',
227
263
  },
228
264
  },
229
- ], queries: [{ propertyName: "templates", predicate: TemplateDirective }], viewQueries: [{ propertyName: "sidebar", first: true, predicate: InsightsSidebarComponent, descendants: true }], hostDirectives: [{ directive: i1.DeprecatedSelectorDirective }], ngImport: i0, template: "<s-insights-sidebar\n #sidebar\n [insights]=\"insights\"\n [hasPermission]=\"hasPermission\"\n [introText]=\"introText\"\n [introTemplate]=\"introTemplate\"\n [emptyText]=\"emptyText\"\n [emptyTemplate]=\"emptyTemplate\"\n [noPermissionText]=\"noPermissionText\"\n [noPermissionTemplate]=\"noPermissionTemplate\"\n (openedSidebar)=\"openInsights.emit()\"\n (closedSidebar)=\"closedInsights.emit()\"\n>\n</s-insights-sidebar>\n", dependencies: [{ kind: "component", type: InsightsSidebarComponent, selector: "s-insights-sidebar", inputs: ["insights", "hasPermission", "introText", "introTemplate", "emptyText", "emptyTemplate", "noPermissionText", "noPermissionTemplate"], outputs: ["closedSidebar", "openedSidebar"] }] });
265
+ ], queries: [{ propertyName: "templates", predicate: TemplateDirective }], viewQueries: [{ propertyName: "sidebar", first: true, predicate: InsightsSidebarComponent, descendants: true }], hostDirectives: [{ directive: i1.DeprecatedSelectorDirective }], ngImport: i0, template: "<s-insights-sidebar\n #sidebar\n [insights]=\"insights\"\n [hasPermission]=\"hasPermission\"\n [introText]=\"introText\"\n [introTemplate]=\"introTemplate\"\n [emptyText]=\"emptyText\"\n [emptyTemplate]=\"emptyTemplate\"\n [noPermissionText]=\"noPermissionText\"\n [noPermissionTemplate]=\"noPermissionTemplate\"\n [closeIconClass]=\"closeIconClass\"\n [icons]=\"icons\"\n (openedSidebar)=\"openInsights.emit()\"\n (closedSidebar)=\"closedInsights.emit()\"\n>\n</s-insights-sidebar>\n", dependencies: [{ kind: "component", type: InsightsSidebarComponent, selector: "s-insights-sidebar", inputs: ["insights", "hasPermission", "introText", "introTemplate", "emptyText", "emptyTemplate", "noPermissionText", "noPermissionTemplate", "closeIconClass", "icons"], outputs: ["closedSidebar", "openedSidebar"] }] });
230
266
  }
231
267
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: InsightsComponent, decorators: [{
232
268
  type: Component,
@@ -239,7 +275,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
239
275
  removalVersion: '20.0.0',
240
276
  },
241
277
  },
242
- ], standalone: true, imports: [InsightsSidebarComponent], template: "<s-insights-sidebar\n #sidebar\n [insights]=\"insights\"\n [hasPermission]=\"hasPermission\"\n [introText]=\"introText\"\n [introTemplate]=\"introTemplate\"\n [emptyText]=\"emptyText\"\n [emptyTemplate]=\"emptyTemplate\"\n [noPermissionText]=\"noPermissionText\"\n [noPermissionTemplate]=\"noPermissionTemplate\"\n (openedSidebar)=\"openInsights.emit()\"\n (closedSidebar)=\"closedInsights.emit()\"\n>\n</s-insights-sidebar>\n" }]
278
+ ], standalone: true, imports: [InsightsSidebarComponent], template: "<s-insights-sidebar\n #sidebar\n [insights]=\"insights\"\n [hasPermission]=\"hasPermission\"\n [introText]=\"introText\"\n [introTemplate]=\"introTemplate\"\n [emptyText]=\"emptyText\"\n [emptyTemplate]=\"emptyTemplate\"\n [noPermissionText]=\"noPermissionText\"\n [noPermissionTemplate]=\"noPermissionTemplate\"\n [closeIconClass]=\"closeIconClass\"\n [icons]=\"icons\"\n (openedSidebar)=\"openInsights.emit()\"\n (closedSidebar)=\"closedInsights.emit()\"\n>\n</s-insights-sidebar>\n" }]
243
279
  }], propDecorators: { insights: [{
244
280
  type: Input
245
281
  }], hasPermission: [{
@@ -250,6 +286,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
250
286
  type: Input
251
287
  }], noPermissionText: [{
252
288
  type: Input
289
+ }], closeIconClass: [{
290
+ type: Input
291
+ }], icons: [{
292
+ type: Input
253
293
  }], sidebar: [{
254
294
  type: ViewChild,
255
295
  args: [InsightsSidebarComponent]
@@ -1 +1 @@
1
- {"version":3,"file":"seniorsistemas-angular-components-insights.mjs","sources":["../../projects/angular-components/insights/src/lib/insights/components/insights-card/components/insights-card-loader/insights-card-loader.component.ts","../../projects/angular-components/insights/src/lib/insights/components/insights-card/components/insights-card-loader/insights-card-loader.component.html","../../projects/angular-components/insights/src/lib/insights/components/insights-card/insights-card.component.ts","../../projects/angular-components/insights/src/lib/insights/components/insights-card/insights-card.component.html","../../projects/angular-components/insights/src/lib/insights/components/insights-sidebar/insights-sidebar.component.ts","../../projects/angular-components/insights/src/lib/insights/components/insights-sidebar/insights-sidebar.component.html","../../projects/angular-components/insights/src/lib/insights/insights.component.ts","../../projects/angular-components/insights/src/lib/insights/insights.component.html","../../projects/angular-components/insights/src/lib/insights/insights.module.ts","../../projects/angular-components/insights/src/seniorsistemas-angular-components-insights.ts"],"sourcesContent":["import { Component } from '@angular/core';\r\nimport { SVGFactoryDirective } from '@seniorsistemas/angular-components/common';\r\nimport { TranslatePipe } from '@ngx-translate/core';\r\n\r\n@Component({\r\n selector: 's-insights-card-loader',\r\n templateUrl: './insights-card-loader.component.html',\r\n styleUrls: ['./insights-card-loader.component.scss'],\r\n standalone: true,\r\n imports: [SVGFactoryDirective, TranslatePipe],\r\n})\r\nexport class InsightsCardLoaderComponent {}\r\n","<div class=\"insights-card-loader\">\n <div class=\"loader\">\n <div class=\"loader-icon\">\n <div *sSVGFactory=\"'iassist'\"></div>\n </div>\n </div>\n \n <span class=\"loader-label\">{{ \"platform.angular_components.loading_insight\" | translate }}</span>\n</div>\n","import { Clipboard } from '@angular/cdk/clipboard';\r\nimport { Component, DestroyRef, Input, inject } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\nimport { TranslateService, TranslatePipe } from '@ngx-translate/core';\r\nimport { ToastService } from '@seniorsistemas/angular-components/toast';\r\nimport { finalize, first } from 'rxjs/operators';\r\n\r\nimport { marked } from 'marked';\r\nimport { InsightsItem } from '../../models/insights-item';\r\nimport { NgClass } from '@angular/common';\r\nimport { BadgeComponent } from '@seniorsistemas/angular-components/badge';\r\nimport { InsightsCardLoaderComponent } from './components/insights-card-loader/insights-card-loader.component';\r\n\r\n@Component({\r\n selector: 's-insights-card',\r\n templateUrl: './insights-card.component.html',\r\n styleUrls: ['./insights-card.component.scss'],\r\n standalone: true,\r\n imports: [NgClass, BadgeComponent, InsightsCardLoaderComponent, TranslatePipe],\r\n})\r\nexport class InsightsCardComponent {\r\n private readonly clipboard = inject(Clipboard);\r\n private readonly toastService = inject(ToastService);\r\n private readonly translateService = inject(TranslateService);\r\n private readonly _destroyRef = inject(DestroyRef);\r\n\r\n @Input({ required: true })\r\n public insight!: InsightsItem;\r\n\r\n public open = false;\r\n public isLoading = false;\r\n public content?: string;\r\n\r\n public likeSelected = false;\r\n public dislikeSelected = false;\r\n\r\n public toggle(): void {\r\n const newOpenState = !this.open;\r\n this.open = newOpenState;\r\n if (newOpenState === true && this.insight.onOpenSidebar) {\r\n this.insight.onOpenSidebar();\r\n } else if (newOpenState === false && this.insight.onCloseSideBar) {\r\n this.insight.onCloseSideBar();\r\n }\r\n if (newOpenState === true) {\r\n this._requestInsight();\r\n }\r\n }\r\n\r\n public onLikeSelected(): void {\r\n if (this.likeSelected) {\r\n this.likeSelected = false;\r\n } else {\r\n this.likeSelected = true;\r\n this.dislikeSelected = false;\r\n this.insight.onLikeSelected?.();\r\n }\r\n }\r\n\r\n public onDislikeSelected(): void {\r\n if (this.dislikeSelected) {\r\n this.dislikeSelected = false;\r\n } else {\r\n this.dislikeSelected = true;\r\n this.likeSelected = false;\r\n this.insight.onDislikeSelected?.();\r\n }\r\n }\r\n\r\n public copyContent(): void {\r\n if (!this.content) return;\r\n\r\n this.insight.onCopy?.(this.content);\r\n\r\n if (this.clipboard.copy(this.content)) {\r\n this.toastService.show({\r\n severity: 'info',\r\n title: this.translateService.instant('platform.angular_components.copied_to_clipboard'),\r\n });\r\n }\r\n }\r\n\r\n public reloadContent(): void {\r\n this._requestInsight();\r\n }\r\n\r\n private _requestInsight(): void {\r\n this.isLoading = true;\r\n\r\n this.insight.request$\r\n .pipe(\r\n first(),\r\n finalize(() => (this.isLoading = false)),\r\n takeUntilDestroyed(this._destroyRef),\r\n )\r\n .subscribe(async (content: string) => {\r\n this.content = await marked(content);\r\n if (this.insight.onContentLoaded) {\r\n this.insight.onContentLoaded();\r\n }\r\n });\r\n }\r\n}\r\n","<div\r\n class=\"insights-card\"\r\n [ngClass]=\"{ 'insights-card--close': !open }\"\r\n>\r\n <div\r\n class=\"header\"\r\n (click)=\"toggle()\"\r\n >\r\n <s-badge\r\n text=\"Insight\"\r\n iconClass=\"fal fa-lightbulb\"\r\n ></s-badge>\r\n <span class=\"insight-title\">{{ insight.title }}</span>\r\n <span class=\"toggle-icon\">\r\n <i\r\n class=\"fas\"\r\n [ngClass]=\"{\r\n 'fa-angle-down': !open,\r\n 'fa-angle-up': open,\r\n }\"\r\n >\r\n </i>\r\n </span>\r\n </div>\r\n <div class=\"content\">\r\n @if (isLoading) {\r\n <s-insights-card-loader></s-insights-card-loader>\r\n } @else {\r\n @if (content) {\r\n <span\r\n class=\"text\"\r\n [innerHTML]=\"content\"\r\n ></span>\r\n <span class=\"insight-footer\">{{ 'platform.angular_components.insight_footer' | translate }}</span>\r\n } @else {\r\n <span class=\"text text--error\">{{\r\n 'platform.angular_components.error_loading_insight_alt' | translate\r\n }}</span>\r\n }\r\n <div class=\"options\">\r\n <button\r\n [disabled]=\"!content\"\r\n (click)=\"copyContent()\"\r\n class=\"option\"\r\n >\r\n <i class=\"fal fa-copy\"></i>\r\n </button>\r\n <button\r\n (click)=\"reloadContent()\"\r\n class=\"option\"\r\n >\r\n <i class=\"fal fa-redo\"></i>\r\n </button>\r\n @if (insight.onLikeSelected) {\r\n <button\r\n [disabled]=\"!content\"\r\n (click)=\"onLikeSelected()\"\r\n class=\"option\"\r\n >\r\n <i\r\n [ngClass]=\"{\r\n fal: !likeSelected,\r\n fas: likeSelected,\r\n 'fa-thumbs-up': true,\r\n }\"\r\n >\r\n </i>\r\n </button>\r\n }\r\n @if (insight.onDislikeSelected) {\r\n <button\r\n [disabled]=\"!content\"\r\n (click)=\"onDislikeSelected()\"\r\n class=\"option\"\r\n >\r\n <i\r\n [ngClass]=\"{\r\n fal: !dislikeSelected,\r\n fas: dislikeSelected,\r\n 'fa-thumbs-down': true,\r\n }\"\r\n ></i>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n","import { Component, Input, output, TemplateRef } from '@angular/core';\r\n\r\nimport { InsightsItem } from '../../models/index';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { InsightsCardComponent } from '../insights-card/insights-card.component';\r\nimport { SVGFactoryDirective } from '@seniorsistemas/angular-components/common';\r\nimport { TranslatePipe } from '@ngx-translate/core';\r\n\r\n@Component({\r\n selector: 's-insights-sidebar',\r\n templateUrl: './insights-sidebar.component.html',\r\n styleUrls: ['./insights-sidebar.component.scss'],\r\n standalone: true,\r\n imports: [NgTemplateOutlet, InsightsCardComponent, SVGFactoryDirective, TranslatePipe],\r\n})\r\nexport class InsightsSidebarComponent {\r\n @Input()\r\n public insights: InsightsItem[] = [];\r\n\r\n @Input()\r\n public hasPermission = false;\r\n\r\n @Input()\r\n public introText?: string;\r\n\r\n @Input()\r\n public introTemplate: TemplateRef<any> | null = null;\r\n\r\n @Input()\r\n public emptyText?: string;\r\n\r\n @Input()\r\n public emptyTemplate: TemplateRef<any> | null = null;\r\n\r\n @Input()\r\n public noPermissionText?: string;\r\n\r\n @Input()\r\n public noPermissionTemplate: TemplateRef<any> | null = null;\r\n\r\n public closedSidebar = output<void>();\r\n\r\n public openedSidebar = output<void>();\r\n\r\n public opened = false;\r\n\r\n public toggle(): void {\r\n const newState = !this.opened;\r\n if (newState) {\r\n this.open();\r\n } else {\r\n this.close();\r\n }\r\n }\r\n\r\n public open(): void {\r\n this.opened = true;\r\n this.openedSidebar.emit();\r\n }\r\n\r\n public close(): void {\r\n this.opened = false;\r\n this.closedSidebar.emit();\r\n }\r\n}\r\n","<div\r\n class=\"sidebar\"\r\n [class.opened]=\"opened\"\r\n>\r\n <div class=\"header\">\r\n <button\r\n (click)=\"close()\"\r\n class=\"option\"\r\n >\r\n <span class=\"far fa-chevron-double-right\"></span>\r\n </button>\r\n <div class=\"title\">\r\n <span><ng-container [ngTemplateOutlet]=\"iassistIcon\"></ng-container></span>\r\n <span>IAssist Insights</span>\r\n </div>\r\n </div>\r\n <div class=\"intro\">\r\n @if (hasPermission) {\r\n @if (insights.length) {\r\n @if (introTemplate) {\r\n <ng-container *ngTemplateOutlet=\"introTemplate\"></ng-container>\r\n } @else {\r\n <span class=\"text\">{{ introText || 'platform.angular_components.insight_intro' | translate }}</span>\r\n }\r\n } @else {\r\n @if (emptyTemplate) {\r\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\r\n } @else {\r\n <span class=\"text\">{{ emptyText || 'platform.angular_components.insight_empty' | translate }}</span>\r\n }\r\n }\r\n } @else {\r\n @if (noPermissionTemplate) {\r\n <ng-container *ngTemplateOutlet=\"noPermissionTemplate\"></ng-container>\r\n } @else {\r\n <span>{{ noPermissionText || 'platform.angular_components.insight_no_permission' | translate }}</span>\r\n }\r\n }\r\n </div>\r\n <div class=\"insights\">\r\n @if (insights.length) {\r\n @for (insight of insights; track insight) {\r\n <s-insights-card [insight]=\"insight\"> </s-insights-card>\r\n }\r\n }\r\n </div>\r\n</div>\r\n\r\n<ng-template #iassistIcon>\r\n <div style=\"width: 28px; height: 28px\">\r\n <span *sSVGFactory=\"'iassist'\"></span>\r\n </div>\r\n</ng-template>\r\n","import {\r\n AfterContentInit,\r\n Component,\r\n ContentChildren,\r\n Input,\r\n output,\r\n QueryList,\r\n TemplateRef,\r\n ViewChild,\r\n} from '@angular/core';\r\n\r\nimport { DEPRECATED_CONFIG } from '@seniorsistemas/angular-components/common/deprecated-selector';\r\nimport { DeprecatedSelectorDirective } from '@seniorsistemas/angular-components/common/deprecated-selector';\r\nimport { TemplateDirective } from '@seniorsistemas/angular-components/template';\r\n\r\nimport { InsightsSidebarComponent } from './components/insights-sidebar/insights-sidebar.component';\r\nimport { InsightsItem } from './models/insights-item';\r\nimport { InsightsTemplateTypes } from './models/insights-template-types';\r\n/**\r\n * @description Componente de painel lateral de insights com IA. Exibe uma lista de itens\r\n * de insights em um sidebar, suportando templates customizáveis para o conteúdo de\r\n * introdução, estado vazio e sem permissão. Também exporta como seletor legado `s-ia-insight`.\r\n *\r\n * @example\r\n * ```html\r\n * <s-insights\r\n * [insights]=\"listaInsights\"\r\n * [hasPermission]=\"true\"\r\n * (openInsights)=\"onAbrir()\" />\r\n * ```\r\n *\r\n * @category Structure\r\n */\r\n@Component({\r\n selector: 's-insights, s-ia-insight',\r\n templateUrl: './insights.component.html',\r\n hostDirectives: [DeprecatedSelectorDirective],\r\n providers: [\r\n {\r\n provide: DEPRECATED_CONFIG,\r\n useValue: {\r\n oldSelector: 's-ia-insight',\r\n newSelector: 's-insights',\r\n removalVersion: '20.0.0',\r\n },\r\n },\r\n ],\r\n standalone: true,\r\n imports: [InsightsSidebarComponent],\r\n})\r\nexport class InsightsComponent implements AfterContentInit {\r\n /** @description Lista de itens de insight a serem exibidos no painel. @default [] */\r\n @Input()\r\n public insights: InsightsItem[] = [];\r\n\r\n /** @description Indica se o usuário tem permissão para ver os insights. @default true */\r\n @Input()\r\n public hasPermission = true;\r\n\r\n /** @description Texto de introdução exibido no topo do painel (quando sem template customizado). */\r\n @Input()\r\n public introText?: string;\r\n\r\n /** @description Texto exibido quando não há insights disponíveis. */\r\n @Input()\r\n public emptyText?: string;\r\n\r\n /** @description Texto exibido quando o usuário não tem permissão. */\r\n @Input()\r\n public noPermissionText?: string;\r\n\r\n @ViewChild(InsightsSidebarComponent)\r\n public sidebar: InsightsSidebarComponent | null = null;\r\n\r\n @ContentChildren(TemplateDirective)\r\n public templates: QueryList<TemplateDirective> | null = null;\r\n\r\n /** @description Emitido quando o painel de insights é aberto. */\r\n public openInsights = output<void>();\r\n\r\n /** @description Emitido quando o painel de insights é fechado. */\r\n public closedInsights = output<void>();\r\n\r\n public introTemplate: TemplateRef<any> | null = null;\r\n public emptyTemplate: TemplateRef<any> | null = null;\r\n public noPermissionTemplate: TemplateRef<any> | null = null;\r\n\r\n public ngAfterContentInit(): void {\r\n this._getTemplates();\r\n }\r\n\r\n public open(): void {\r\n this.sidebar?.open();\r\n }\r\n\r\n public close(): void {\r\n this.sidebar?.close();\r\n }\r\n\r\n public getIntroTemplate(): TemplateRef<any> | null {\r\n return this._getCustomTemplate('intro');\r\n }\r\n\r\n public getNoPermissionTemplate(): TemplateRef<any> | null {\r\n return this._getCustomTemplate('no-permission');\r\n }\r\n\r\n public getEmptyTemplate(): TemplateRef<any> | null {\r\n return this._getCustomTemplate('empty');\r\n }\r\n\r\n private _getCustomTemplate(type: InsightsTemplateTypes): TemplateRef<any> | null {\r\n return this.templates?.find((template: TemplateDirective) => template.type === type)?.template ?? null;\r\n }\r\n\r\n private _getTemplates(): void {\r\n this.introTemplate = this.getIntroTemplate();\r\n this.emptyTemplate = this.getEmptyTemplate();\r\n this.noPermissionTemplate = this.getNoPermissionTemplate();\r\n }\r\n}\r\n","<s-insights-sidebar\n #sidebar\n [insights]=\"insights\"\n [hasPermission]=\"hasPermission\"\n [introText]=\"introText\"\n [introTemplate]=\"introTemplate\"\n [emptyText]=\"emptyText\"\n [emptyTemplate]=\"emptyTemplate\"\n [noPermissionText]=\"noPermissionText\"\n [noPermissionTemplate]=\"noPermissionTemplate\"\n (openedSidebar)=\"openInsights.emit()\"\n (closedSidebar)=\"closedInsights.emit()\"\n>\n</s-insights-sidebar>\n","import { NgModule } from '@angular/core';\r\n\r\nimport { TemplateModule } from '@seniorsistemas/angular-components/template';\r\n\r\nimport { InsightsComponent } from './insights.component';\r\n\r\n@NgModule({\r\n imports: [TemplateModule, InsightsComponent],\r\n exports: [InsightsComponent, TemplateModule],\r\n})\r\nexport class InsightsModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seniorsistemas-angular-components-insights.mjs","sources":["../../projects/angular-components/insights/src/lib/insights/components/insights-card/components/insights-card-loader/insights-card-loader.component.ts","../../projects/angular-components/insights/src/lib/insights/components/insights-card/components/insights-card-loader/insights-card-loader.component.html","../../projects/angular-components/insights/src/lib/insights/components/insights-card/insights-card.component.ts","../../projects/angular-components/insights/src/lib/insights/components/insights-card/insights-card.component.html","../../projects/angular-components/insights/src/lib/insights/components/insights-sidebar/insights-sidebar.component.ts","../../projects/angular-components/insights/src/lib/insights/components/insights-sidebar/insights-sidebar.component.html","../../projects/angular-components/insights/src/lib/insights/insights.component.ts","../../projects/angular-components/insights/src/lib/insights/insights.component.html","../../projects/angular-components/insights/src/lib/insights/insights.module.ts","../../projects/angular-components/insights/src/seniorsistemas-angular-components-insights.ts"],"sourcesContent":["import { Component } from '@angular/core';\r\nimport { SVGFactoryDirective } from '@seniorsistemas/angular-components/common';\r\nimport { TranslatePipe } from '@ngx-translate/core';\r\n\r\n@Component({\r\n selector: 's-insights-card-loader',\r\n templateUrl: './insights-card-loader.component.html',\r\n styleUrls: ['./insights-card-loader.component.scss'],\r\n standalone: true,\r\n imports: [SVGFactoryDirective, TranslatePipe],\r\n})\r\nexport class InsightsCardLoaderComponent {}\r\n","<div class=\"insights-card-loader\">\n <div class=\"loader\">\n <div class=\"loader-icon\">\n <div *sSVGFactory=\"'iassist'\"></div>\n </div>\n </div>\n \n <span class=\"loader-label\">{{ \"platform.angular_components.loading_insight\" | translate }}</span>\n</div>\n","import { Clipboard } from '@angular/cdk/clipboard';\r\nimport { Component, DestroyRef, Input, inject } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\n\r\nimport { TranslateService, TranslatePipe } from '@ngx-translate/core';\r\nimport { ToastService } from '@seniorsistemas/angular-components/toast';\r\nimport { finalize, first } from 'rxjs/operators';\r\n\r\nimport { marked } from 'marked';\r\nimport { InsightsItem } from '../../models/insights-item';\r\nimport { NgClass } from '@angular/common';\r\nimport { BadgeComponent } from '@seniorsistemas/angular-components/badge';\r\nimport { InsightsCardLoaderComponent } from './components/insights-card-loader/insights-card-loader.component';\r\n\r\n/**\r\n * @description Ícones customizáveis do `s-insights-card`. Chaves não informadas mantêm o ícone padrão.\r\n */\r\nexport interface InsightsCardIcons {\r\n /** Ícone do badge \"Insight\" no cabeçalho. Padrão: `fal fa-lightbulb`. */\r\n lightbulb?: string;\r\n /** Ícone do botão de copiar conteúdo. Padrão: `fal fa-copy`. */\r\n copy?: string;\r\n /** Ícone do botão de recarregar conteúdo. Padrão: `fal fa-redo`. */\r\n redo?: string;\r\n /** Ícone do botão de like. Padrão: `fal fa-thumbs-up` (não selecionado) / `fas fa-thumbs-up` (selecionado). */\r\n thumbsUp?: string;\r\n /** Ícone do botão de dislike. Padrão: `fal fa-thumbs-down` (não selecionado) / `fas fa-thumbs-down` (selecionado). */\r\n thumbsDown?: string;\r\n}\r\n\r\n@Component({\r\n selector: 's-insights-card',\r\n templateUrl: './insights-card.component.html',\r\n styleUrls: ['./insights-card.component.scss'],\r\n standalone: true,\r\n imports: [NgClass, BadgeComponent, InsightsCardLoaderComponent, TranslatePipe],\r\n})\r\nexport class InsightsCardComponent {\r\n private readonly clipboard = inject(Clipboard);\r\n private readonly toastService = inject(ToastService);\r\n private readonly translateService = inject(TranslateService);\r\n private readonly _destroyRef = inject(DestroyRef);\r\n\r\n @Input({ required: true })\r\n public insight!: InsightsItem;\r\n\r\n @Input()\r\n public icons?: InsightsCardIcons;\r\n\r\n public open = false;\r\n public isLoading = false;\r\n public content?: string;\r\n\r\n public likeSelected = false;\r\n public dislikeSelected = false;\r\n\r\n public get lightbulbIconClass(): string {\r\n return this.icons?.lightbulb ?? 'fal fa-lightbulb';\r\n }\r\n\r\n public get copyIconClass(): string {\r\n return this.icons?.copy ?? 'fal fa-copy';\r\n }\r\n\r\n public get redoIconClass(): string {\r\n return this.icons?.redo ?? 'fal fa-redo';\r\n }\r\n\r\n public get thumbsUpIconClass(): string {\r\n return this.icons?.thumbsUp ?? (this.likeSelected ? 'fas fa-thumbs-up' : 'fal fa-thumbs-up');\r\n }\r\n\r\n public get thumbsDownIconClass(): string {\r\n return this.icons?.thumbsDown ?? (this.dislikeSelected ? 'fas fa-thumbs-down' : 'fal fa-thumbs-down');\r\n }\r\n\r\n public toggle(): void {\r\n const newOpenState = !this.open;\r\n this.open = newOpenState;\r\n if (newOpenState === true && this.insight.onOpenSidebar) {\r\n this.insight.onOpenSidebar();\r\n } else if (newOpenState === false && this.insight.onCloseSideBar) {\r\n this.insight.onCloseSideBar();\r\n }\r\n if (newOpenState === true) {\r\n this._requestInsight();\r\n }\r\n }\r\n\r\n public onLikeSelected(): void {\r\n if (this.likeSelected) {\r\n this.likeSelected = false;\r\n } else {\r\n this.likeSelected = true;\r\n this.dislikeSelected = false;\r\n this.insight.onLikeSelected?.();\r\n }\r\n }\r\n\r\n public onDislikeSelected(): void {\r\n if (this.dislikeSelected) {\r\n this.dislikeSelected = false;\r\n } else {\r\n this.dislikeSelected = true;\r\n this.likeSelected = false;\r\n this.insight.onDislikeSelected?.();\r\n }\r\n }\r\n\r\n public copyContent(): void {\r\n if (!this.content) return;\r\n\r\n this.insight.onCopy?.(this.content);\r\n\r\n if (this.clipboard.copy(this.content)) {\r\n this.toastService.show({\r\n severity: 'info',\r\n title: this.translateService.instant('platform.angular_components.copied_to_clipboard'),\r\n });\r\n }\r\n }\r\n\r\n public reloadContent(): void {\r\n this._requestInsight();\r\n }\r\n\r\n private _requestInsight(): void {\r\n this.isLoading = true;\r\n\r\n this.insight.request$\r\n .pipe(\r\n first(),\r\n finalize(() => (this.isLoading = false)),\r\n takeUntilDestroyed(this._destroyRef),\r\n )\r\n .subscribe(async (content: string) => {\r\n this.content = await marked(content);\r\n if (this.insight.onContentLoaded) {\r\n this.insight.onContentLoaded();\r\n }\r\n });\r\n }\r\n}\r\n","<div\r\n class=\"insights-card\"\r\n [ngClass]=\"{ 'insights-card--close': !open }\"\r\n>\r\n <div\r\n class=\"header\"\r\n (click)=\"toggle()\"\r\n >\r\n <s-badge\r\n text=\"Insight\"\r\n [iconClass]=\"lightbulbIconClass\"\r\n ></s-badge>\r\n <span class=\"insight-title\">{{ insight.title }}</span>\r\n <span class=\"toggle-icon\">\r\n <i\r\n class=\"fas\"\r\n [ngClass]=\"{\r\n 'fa-angle-down': !open,\r\n 'fa-angle-up': open,\r\n }\"\r\n >\r\n </i>\r\n </span>\r\n </div>\r\n <div class=\"content\">\r\n @if (isLoading) {\r\n <s-insights-card-loader></s-insights-card-loader>\r\n } @else {\r\n @if (content) {\r\n <span\r\n class=\"text\"\r\n [innerHTML]=\"content\"\r\n ></span>\r\n <span class=\"insight-footer\">{{ 'platform.angular_components.insight_footer' | translate }}</span>\r\n } @else {\r\n <span class=\"text text--error\">{{\r\n 'platform.angular_components.error_loading_insight_alt' | translate\r\n }}</span>\r\n }\r\n <div class=\"options\">\r\n <button\r\n [disabled]=\"!content\"\r\n (click)=\"copyContent()\"\r\n class=\"option\"\r\n >\r\n <i [class]=\"copyIconClass\"></i>\r\n </button>\r\n <button\r\n (click)=\"reloadContent()\"\r\n class=\"option\"\r\n >\r\n <i [class]=\"redoIconClass\"></i>\r\n </button>\r\n @if (insight.onLikeSelected) {\r\n <button\r\n [disabled]=\"!content\"\r\n (click)=\"onLikeSelected()\"\r\n class=\"option\"\r\n >\r\n <i [class]=\"thumbsUpIconClass\"></i>\r\n </button>\r\n }\r\n @if (insight.onDislikeSelected) {\r\n <button\r\n [disabled]=\"!content\"\r\n (click)=\"onDislikeSelected()\"\r\n class=\"option\"\r\n >\r\n <i [class]=\"thumbsDownIconClass\"></i>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n","import { Component, Input, output, TemplateRef } from '@angular/core';\r\n\r\nimport { InsightsItem } from '../../models/index';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { InsightsCardComponent, InsightsCardIcons } from '../insights-card/insights-card.component';\r\nimport { SVGFactoryDirective } from '@seniorsistemas/angular-components/common';\r\nimport { TranslatePipe } from '@ngx-translate/core';\r\n\r\n@Component({\r\n selector: 's-insights-sidebar',\r\n templateUrl: './insights-sidebar.component.html',\r\n styleUrls: ['./insights-sidebar.component.scss'],\r\n standalone: true,\r\n imports: [NgTemplateOutlet, InsightsCardComponent, SVGFactoryDirective, TranslatePipe],\r\n})\r\nexport class InsightsSidebarComponent {\r\n @Input()\r\n public insights: InsightsItem[] = [];\r\n\r\n @Input()\r\n public hasPermission = false;\r\n\r\n @Input()\r\n public introText?: string;\r\n\r\n @Input()\r\n public introTemplate: TemplateRef<any> | null = null;\r\n\r\n @Input()\r\n public emptyText?: string;\r\n\r\n @Input()\r\n public emptyTemplate: TemplateRef<any> | null = null;\r\n\r\n @Input()\r\n public noPermissionText?: string;\r\n\r\n @Input()\r\n public noPermissionTemplate: TemplateRef<any> | null = null;\r\n\r\n /**\r\n * @description Ícone do botão de fechar o sidebar.\r\n * @default 'far fa-chevron-double-right'\r\n */\r\n @Input()\r\n public closeIconClass = 'far fa-chevron-double-right';\r\n\r\n /** @description Ícones customizáveis de cada `s-insights-card` renderizado no sidebar. */\r\n @Input()\r\n public icons?: InsightsCardIcons;\r\n\r\n public closedSidebar = output<void>();\r\n\r\n public openedSidebar = output<void>();\r\n\r\n public opened = false;\r\n\r\n public toggle(): void {\r\n const newState = !this.opened;\r\n if (newState) {\r\n this.open();\r\n } else {\r\n this.close();\r\n }\r\n }\r\n\r\n public open(): void {\r\n this.opened = true;\r\n this.openedSidebar.emit();\r\n }\r\n\r\n public close(): void {\r\n this.opened = false;\r\n this.closedSidebar.emit();\r\n }\r\n}\r\n","<div\r\n class=\"sidebar\"\r\n [class.opened]=\"opened\"\r\n>\r\n <div class=\"header\">\r\n <button\r\n (click)=\"close()\"\r\n class=\"option\"\r\n >\r\n <span [class]=\"closeIconClass\"></span>\r\n </button>\r\n <div class=\"title\">\r\n <span><ng-container [ngTemplateOutlet]=\"iassistIcon\"></ng-container></span>\r\n <span>IAssist Insights</span>\r\n </div>\r\n </div>\r\n <div class=\"intro\">\r\n @if (hasPermission) {\r\n @if (insights.length) {\r\n @if (introTemplate) {\r\n <ng-container *ngTemplateOutlet=\"introTemplate\"></ng-container>\r\n } @else {\r\n <span class=\"text\">{{ introText || 'platform.angular_components.insight_intro' | translate }}</span>\r\n }\r\n } @else {\r\n @if (emptyTemplate) {\r\n <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\r\n } @else {\r\n <span class=\"text\">{{ emptyText || 'platform.angular_components.insight_empty' | translate }}</span>\r\n }\r\n }\r\n } @else {\r\n @if (noPermissionTemplate) {\r\n <ng-container *ngTemplateOutlet=\"noPermissionTemplate\"></ng-container>\r\n } @else {\r\n <span>{{ noPermissionText || 'platform.angular_components.insight_no_permission' | translate }}</span>\r\n }\r\n }\r\n </div>\r\n <div class=\"insights\">\r\n @if (insights.length) {\r\n @for (insight of insights; track insight) {\r\n <s-insights-card\r\n [insight]=\"insight\"\r\n [icons]=\"icons\"\r\n >\r\n </s-insights-card>\r\n }\r\n }\r\n </div>\r\n</div>\r\n\r\n<ng-template #iassistIcon>\r\n <div style=\"width: 28px; height: 28px\">\r\n <span *sSVGFactory=\"'iassist'\"></span>\r\n </div>\r\n</ng-template>\r\n","import {\r\n AfterContentInit,\r\n Component,\r\n ContentChildren,\r\n Input,\r\n output,\r\n QueryList,\r\n TemplateRef,\r\n ViewChild,\r\n} from '@angular/core';\r\n\r\nimport { DEPRECATED_CONFIG } from '@seniorsistemas/angular-components/common/deprecated-selector';\r\nimport { DeprecatedSelectorDirective } from '@seniorsistemas/angular-components/common/deprecated-selector';\r\nimport { TemplateDirective } from '@seniorsistemas/angular-components/template';\r\n\r\nimport { InsightsSidebarComponent } from './components/insights-sidebar/insights-sidebar.component';\r\nimport { InsightsCardIcons } from './components/insights-card/insights-card.component';\r\nimport { InsightsItem } from './models/insights-item';\r\nimport { InsightsTemplateTypes } from './models/insights-template-types';\r\n/**\r\n * @description Componente de painel lateral de insights com IA. Exibe uma lista de itens\r\n * de insights em um sidebar, suportando templates customizáveis para o conteúdo de\r\n * introdução, estado vazio e sem permissão. Também exporta como seletor legado `s-ia-insight`.\r\n *\r\n * @example\r\n * ```html\r\n * <s-insights\r\n * [insights]=\"listaInsights\"\r\n * [hasPermission]=\"true\"\r\n * (openInsights)=\"onAbrir()\" />\r\n * ```\r\n *\r\n * @category Structure\r\n */\r\n@Component({\r\n selector: 's-insights, s-ia-insight',\r\n templateUrl: './insights.component.html',\r\n hostDirectives: [DeprecatedSelectorDirective],\r\n providers: [\r\n {\r\n provide: DEPRECATED_CONFIG,\r\n useValue: {\r\n oldSelector: 's-ia-insight',\r\n newSelector: 's-insights',\r\n removalVersion: '20.0.0',\r\n },\r\n },\r\n ],\r\n standalone: true,\r\n imports: [InsightsSidebarComponent],\r\n})\r\nexport class InsightsComponent implements AfterContentInit {\r\n /** @description Lista de itens de insight a serem exibidos no painel. @default [] */\r\n @Input()\r\n public insights: InsightsItem[] = [];\r\n\r\n /** @description Indica se o usuário tem permissão para ver os insights. @default true */\r\n @Input()\r\n public hasPermission = true;\r\n\r\n /** @description Texto de introdução exibido no topo do painel (quando sem template customizado). */\r\n @Input()\r\n public introText?: string;\r\n\r\n /** @description Texto exibido quando não há insights disponíveis. */\r\n @Input()\r\n public emptyText?: string;\r\n\r\n /** @description Texto exibido quando o usuário não tem permissão. */\r\n @Input()\r\n public noPermissionText?: string;\r\n\r\n /**\r\n * @description Ícone do botão de fechar o sidebar.\r\n * @default 'far fa-chevron-double-right'\r\n */\r\n @Input()\r\n public closeIconClass = 'far fa-chevron-double-right';\r\n\r\n /** @description Ícones customizáveis de cada card de insight exibido no sidebar. */\r\n @Input()\r\n public icons?: InsightsCardIcons;\r\n\r\n @ViewChild(InsightsSidebarComponent)\r\n public sidebar: InsightsSidebarComponent | null = null;\r\n\r\n @ContentChildren(TemplateDirective)\r\n public templates: QueryList<TemplateDirective> | null = null;\r\n\r\n /** @description Emitido quando o painel de insights é aberto. */\r\n public openInsights = output<void>();\r\n\r\n /** @description Emitido quando o painel de insights é fechado. */\r\n public closedInsights = output<void>();\r\n\r\n public introTemplate: TemplateRef<any> | null = null;\r\n public emptyTemplate: TemplateRef<any> | null = null;\r\n public noPermissionTemplate: TemplateRef<any> | null = null;\r\n\r\n public ngAfterContentInit(): void {\r\n this._getTemplates();\r\n }\r\n\r\n public open(): void {\r\n this.sidebar?.open();\r\n }\r\n\r\n public close(): void {\r\n this.sidebar?.close();\r\n }\r\n\r\n public getIntroTemplate(): TemplateRef<any> | null {\r\n return this._getCustomTemplate('intro');\r\n }\r\n\r\n public getNoPermissionTemplate(): TemplateRef<any> | null {\r\n return this._getCustomTemplate('no-permission');\r\n }\r\n\r\n public getEmptyTemplate(): TemplateRef<any> | null {\r\n return this._getCustomTemplate('empty');\r\n }\r\n\r\n private _getCustomTemplate(type: InsightsTemplateTypes): TemplateRef<any> | null {\r\n return this.templates?.find((template: TemplateDirective) => template.type === type)?.template ?? null;\r\n }\r\n\r\n private _getTemplates(): void {\r\n this.introTemplate = this.getIntroTemplate();\r\n this.emptyTemplate = this.getEmptyTemplate();\r\n this.noPermissionTemplate = this.getNoPermissionTemplate();\r\n }\r\n}\r\n","<s-insights-sidebar\n #sidebar\n [insights]=\"insights\"\n [hasPermission]=\"hasPermission\"\n [introText]=\"introText\"\n [introTemplate]=\"introTemplate\"\n [emptyText]=\"emptyText\"\n [emptyTemplate]=\"emptyTemplate\"\n [noPermissionText]=\"noPermissionText\"\n [noPermissionTemplate]=\"noPermissionTemplate\"\n [closeIconClass]=\"closeIconClass\"\n [icons]=\"icons\"\n (openedSidebar)=\"openInsights.emit()\"\n (closedSidebar)=\"closedInsights.emit()\"\n>\n</s-insights-sidebar>\n","import { NgModule } from '@angular/core';\r\n\r\nimport { TemplateModule } from '@seniorsistemas/angular-components/template';\r\n\r\nimport { InsightsComponent } from './insights.component';\r\n\r\n@NgModule({\r\n imports: [TemplateModule, InsightsComponent],\r\n exports: [InsightsComponent, TemplateModule],\r\n})\r\nexport class InsightsModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -155,7 +155,7 @@ class PaginatorComponent {
155
155
  this.requestedPage.set(pageIndex);
156
156
  }
157
157
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PaginatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
158
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PaginatorComponent, isStandalone: true, selector: "s-paginator", inputs: { totalRecords: { classPropertyName: "totalRecords", publicName: "totalRecords", isSignal: true, isRequired: true, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, rowsPerPageOptions: { classPropertyName: "rowsPerPageOptions", publicName: "rowsPerPageOptions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rows: "rowsChange", pageChange: "pageChange" }, ngImport: i0, template: "<div class=\"flex justify-between\">\n <section class=\"flex items-center gap-2\">\n <div\n class=\"inline-block h-8 divide-x divide-grayscale-30 overflow-hidden rounded-medium border border-grayscale-30 bg-grayscale-0\"\n >\n @for (btn of buttons(); track $index) {\n @let active = btn.pageIndex === currentPage();\n @let ariaLabelKey =\n btn.ariaLabelKey ??\n (active\n ? 'platform.angular_components.aria_current_page'\n : 'platform.angular_components.aria_page_number');\n <button\n [class.bg-criticality-blue]=\"active\"\n [class.text-grayscale-0]=\"active\"\n [class.text-criticality-blue]=\"!active\"\n (sInteractiveContent)=\"activatedButton(btn)\"\n [disabled]=\"btn.disabled || (btn.validate && btn.validate()) || false\"\n [attr.aria-label]=\"ariaLabelKey | translate: { page: btn.pageIndex }\"\n [attr.aria-current]=\"active ? 'page' : null\"\n class=\"group h-8 w-8 hover:bg-grayscale-20 hover:text-grayscale-100 disabled:hover:bg-[transparent] disabled:hover:text-criticality-blue\"\n >\n <div class=\"group-disabled:opacity-50\">\n @let page = btn.pageIndex;\n @let icon = btn.icon;\n @if (page !== undefined) {\n {{ page }}\n }\n @if (icon) {\n <i [class]=\"icon\" aria-hidden=\"true\"></i>\n }\n </div>\n </button>\n }\n </div>\n <s-select\n [options]=\"rowsPerPageOptions()\"\n [ariaLabel]=\"'platform.angular_components.aria_page_selection' | translate\"\n [(ngModel)]=\"rows\"\n (ngModelChange)=\"rowsPerPageChange()\"\n ></s-select>\n </section>\n <section class=\"flex items-center gap-2\">\n @let text =\n totalRecords() === 0\n ? 'platform.angular_components.total_record'\n : 'platform.angular_components.total_records';\n <p class=\"text-[14px] text-[#212533]\">\n {{ text | translate: { count: totalRecords() } }}\n </p>\n <ng-content></ng-content>\n </section>\n</div>\n\n", dependencies: [{ kind: "directive", type: InteractiveContentDirective, selector: "[sInteractiveContent]", inputs: ["focusable", "disabled", "stopPropagation"], outputs: ["sInteractiveContent"] }, { kind: "component", type: SelectComponent, selector: "s-select", inputs: ["placeholder", "multiple", "options", "optionLabel", "optionValue", "showClear", "filter", "checkmark", "filterBy", "group", "virtualScroll", "virtualScrollItemSize", "emptyMessage", "disabled", "showOptions", "ariaLabel", "ariaLabelledBy"], outputs: ["disabledChange", "showOptionsChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] });
158
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PaginatorComponent, isStandalone: true, selector: "s-paginator", inputs: { totalRecords: { classPropertyName: "totalRecords", publicName: "totalRecords", isSignal: true, isRequired: true, transformFunction: null }, rows: { classPropertyName: "rows", publicName: "rows", isSignal: true, isRequired: false, transformFunction: null }, rowsPerPageOptions: { classPropertyName: "rowsPerPageOptions", publicName: "rowsPerPageOptions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rows: "rowsChange", pageChange: "pageChange" }, ngImport: i0, template: "<div class=\"flex justify-between\">\n <section class=\"flex items-center gap-2\">\n <div\n class=\"inline-block h-8 divide-x divide-grayscale-30 overflow-hidden rounded-medium border border-grayscale-30 bg-grayscale-0\"\n >\n @for (btn of buttons(); track $index) {\n @let active = btn.pageIndex === currentPage();\n @let ariaLabelKey =\n btn.ariaLabelKey ??\n (active\n ? 'platform.angular_components.aria_current_page'\n : 'platform.angular_components.aria_page_number');\n <button\n [class.bg-criticality-blue]=\"active\"\n [class.text-grayscale-0]=\"active\"\n [class.text-criticality-blue]=\"!active\"\n (sInteractiveContent)=\"activatedButton(btn)\"\n [disabled]=\"btn.disabled || (btn.validate && btn.validate()) || false\"\n [attr.aria-label]=\"ariaLabelKey | translate: { page: btn.pageIndex }\"\n [attr.aria-current]=\"active ? 'page' : null\"\n class=\"group h-8 w-8 hover:bg-grayscale-20 hover:text-grayscale-100 disabled:hover:bg-[transparent] disabled:hover:text-criticality-blue\"\n >\n <div class=\"group-disabled:opacity-50\">\n @let page = btn.pageIndex;\n @let icon = btn.icon;\n @if (page !== undefined) {\n {{ page }}\n }\n @if (icon) {\n <i [class]=\"icon\" aria-hidden=\"true\"></i>\n }\n </div>\n </button>\n }\n </div>\n <s-select\n [options]=\"rowsPerPageOptions()\"\n [ariaLabel]=\"'platform.angular_components.aria_page_selection' | translate\"\n [(ngModel)]=\"rows\"\n (ngModelChange)=\"rowsPerPageChange()\"\n ></s-select>\n </section>\n <section class=\"flex items-center gap-2\">\n @let text =\n totalRecords() === 0\n ? 'platform.angular_components.total_record'\n : 'platform.angular_components.total_records';\n <p class=\"text-[14px] text-[#212533]\">\n {{ text | translate: { count: totalRecords() } }}\n </p>\n <ng-content></ng-content>\n </section>\n</div>\n\n", dependencies: [{ kind: "directive", type: InteractiveContentDirective, selector: "[sInteractiveContent]", inputs: ["focusable", "disabled", "stopPropagation"], outputs: ["sInteractiveContent"] }, { kind: "component", type: SelectComponent, selector: "s-select", inputs: ["placeholder", "multiple", "options", "optionLabel", "optionValue", "showClear", "filter", "checkmark", "checkIconClass", "filterBy", "group", "virtualScroll", "virtualScrollItemSize", "emptyMessage", "disabled", "showOptions", "ariaLabel", "ariaLabelledBy"], outputs: ["disabledChange", "showOptionsChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] });
159
159
  }
160
160
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PaginatorComponent, decorators: [{
161
161
  type: Component,
@@ -1 +1 @@
1
- {"version":3,"file":"seniorsistemas-angular-components-paginator.mjs","sources":["../../projects/angular-components/paginator/src/lib/paginator/paginator.component.ts","../../projects/angular-components/paginator/src/lib/paginator/paginator.component.html","../../projects/angular-components/paginator/src/seniorsistemas-angular-components-paginator.ts"],"sourcesContent":["import { Component, computed, effect, input, model, OnDestroy, output, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { InteractiveContentDirective } from '@seniorsistemas/angular-components/interactive-content';\nimport { SelectComponent } from '@seniorsistemas/angular-components/select';\nimport { TranslateModule } from '@ngx-translate/core';\n\nimport { PageChange, PaginatorInternalButton } from '../models/paginator.models';\n/**\n * @description Componente de paginação standalone que exibe botões de páginas,\n * seletor de itens por página e navegação para primeira/última página.\n * Emite `pageChange` a cada mudança de página ou tamanho de página.\n *\n * @example\n * ```html\n * <s-paginator\n * [totalRecords]=\"total\"\n * [(rows)]=\"tamanhoPagina\"\n * (pageChange)=\"onPaginaMudou($event)\" />\n * ```\n *\n * @category Structure\n */\n@Component({\n selector: 's-paginator',\n standalone: true,\n imports: [InteractiveContentDirective, SelectComponent, FormsModule, TranslateModule],\n templateUrl: './paginator.component.html',\n})\nexport class PaginatorComponent implements OnDestroy {\n /** @description Número total de registros. Campo obrigatório. */\n totalRecords = input.required<number>();\n /** @description Número de itens por página. Suporta two-way binding. @default 10 */\n rows = model(10);\n /** @description Opções do seletor de itens por página. @default [10, 20, 50, 100, 200] */\n rowsPerPageOptions = input<number[]>([10, 20, 50, 100, 200]);\n /** @description Emitido sempre que a página ou o número de itens por página muda. */\n pageChange = output<PageChange>();\n\n private readonly currentPageEffect = effect(() => {\n const totalPages = this.totalPages();\n const page = this.currentPage() - 1;\n this.pageChange.emit({\n page,\n pageCount: totalPages,\n rows: this.rows(),\n first: this.rows() * page,\n });\n });\n private readonly MAX_PAGE_BUTTONS = 5;\n private readonly hasPreviousPage = computed(() => {\n const previousPage = this.currentPage() - 1;\n return previousPage >= 1;\n });\n\n private readonly hasNextPage = computed(() => {\n const nextPage = this.currentPage() + 1;\n return nextPage <= this.totalPages();\n });\n\n private readonly requestedPage = signal(1);\n /** @description Página atual, sempre reajustada para o intervalo válido de `[1, totalPages]`. */\n protected readonly currentPage = computed(() => {\n const maxPage = Math.max(this.totalPages(), 1);\n return Math.min(Math.max(this.requestedPage(), 1), maxPage);\n });\n\n protected buttons = computed(() => {\n const navigationPageButtons: PaginatorInternalButton[] = [];\n const maxPageButtons = this.MAX_PAGE_BUTTONS;\n const currentPage = this.currentPage();\n const middle = Math.floor(maxPageButtons / 2);\n const _startPage = currentPage - middle;\n let startPage = _startPage < 1 ? 1 : _startPage;\n const _endPage = startPage + maxPageButtons - 1;\n const endPageIsMoreThanTotalPages = _endPage > this.totalPages();\n\n if (endPageIsMoreThanTotalPages) {\n const diff = _endPage - this.totalPages();\n const canModifyStartPage = startPage - diff >= 1;\n if (canModifyStartPage) {\n startPage = startPage - diff;\n }\n }\n const endPage = endPageIsMoreThanTotalPages ? this.totalPages() : _endPage;\n\n for (let i = startPage; i <= endPage; i++) {\n navigationPageButtons.push({\n clicked: (page) => this.goToPage(page.pageIndex as number),\n pageIndex: i,\n });\n }\n\n return [\n this.FIRST_PAGE_BUTTON,\n this.PREVIOUS_PAGE_BUTTON,\n ...navigationPageButtons,\n this.NEXT_PAGE_BUTTON,\n this.LAST_PAGE_BUTTON,\n ];\n });\n\n private readonly FIRST_PAGE_BUTTON: PaginatorInternalButton = {\n clicked: this.goFirstPage.bind(this),\n icon: 'fas fa-step-backward',\n ariaLabelKey: 'platform.angular_components.aria_first_page',\n validate: computed(() => {\n return !this.hasPreviousPage();\n }),\n };\n\n private readonly PREVIOUS_PAGE_BUTTON: PaginatorInternalButton = {\n clicked: this.goPreviousPage.bind(this),\n icon: 'fas fa-caret-left',\n ariaLabelKey: 'platform.angular_components.aria_previous_page',\n validate: computed(() => {\n return !this.hasPreviousPage();\n }),\n };\n\n private readonly LAST_PAGE_BUTTON: PaginatorInternalButton = {\n clicked: this.goLastPage.bind(this),\n icon: 'fas fa-step-forward',\n ariaLabelKey: 'platform.angular_components.aria_last_page',\n validate: computed(() => {\n return !this.hasNextPage();\n }),\n };\n\n private readonly NEXT_PAGE_BUTTON: PaginatorInternalButton = {\n clicked: this.goNextPage.bind(this),\n icon: 'fas fa-caret-right',\n ariaLabelKey: 'platform.angular_components.aria_next_page',\n validate: computed(() => {\n return !this.hasNextPage();\n }),\n };\n\n private totalPages = computed(() => {\n return Math.ceil(this.totalRecords() / this.rows());\n });\n\n public ngOnDestroy(): void {\n this.currentPageEffect.destroy();\n }\n\n protected rowsPerPageChange(): void {\n if (this.currentPage() !== 1) {\n this.goToPage(1);\n }\n }\n\n protected activatedButton(button: PaginatorInternalButton): void {\n button.clicked(button);\n }\n\n private goFirstPage(): void {\n this.goToPage(1);\n }\n\n private goNextPage(): void {\n if (!this.hasNextPage()) {\n return;\n }\n this.goToPage(this.currentPage() + 1);\n }\n\n private goPreviousPage(): void {\n if (!this.hasPreviousPage()) {\n return;\n }\n this.goToPage(this.currentPage() - 1);\n }\n\n private goLastPage(): void {\n this.goToPage(this.totalPages());\n }\n\n private goToPage(pageIndex: number): void {\n this.requestedPage.set(pageIndex);\n }\n}\n\n","<div class=\"flex justify-between\">\n <section class=\"flex items-center gap-2\">\n <div\n class=\"inline-block h-8 divide-x divide-grayscale-30 overflow-hidden rounded-medium border border-grayscale-30 bg-grayscale-0\"\n >\n @for (btn of buttons(); track $index) {\n @let active = btn.pageIndex === currentPage();\n @let ariaLabelKey =\n btn.ariaLabelKey ??\n (active\n ? 'platform.angular_components.aria_current_page'\n : 'platform.angular_components.aria_page_number');\n <button\n [class.bg-criticality-blue]=\"active\"\n [class.text-grayscale-0]=\"active\"\n [class.text-criticality-blue]=\"!active\"\n (sInteractiveContent)=\"activatedButton(btn)\"\n [disabled]=\"btn.disabled || (btn.validate && btn.validate()) || false\"\n [attr.aria-label]=\"ariaLabelKey | translate: { page: btn.pageIndex }\"\n [attr.aria-current]=\"active ? 'page' : null\"\n class=\"group h-8 w-8 hover:bg-grayscale-20 hover:text-grayscale-100 disabled:hover:bg-[transparent] disabled:hover:text-criticality-blue\"\n >\n <div class=\"group-disabled:opacity-50\">\n @let page = btn.pageIndex;\n @let icon = btn.icon;\n @if (page !== undefined) {\n {{ page }}\n }\n @if (icon) {\n <i [class]=\"icon\" aria-hidden=\"true\"></i>\n }\n </div>\n </button>\n }\n </div>\n <s-select\n [options]=\"rowsPerPageOptions()\"\n [ariaLabel]=\"'platform.angular_components.aria_page_selection' | translate\"\n [(ngModel)]=\"rows\"\n (ngModelChange)=\"rowsPerPageChange()\"\n ></s-select>\n </section>\n <section class=\"flex items-center gap-2\">\n @let text =\n totalRecords() === 0\n ? 'platform.angular_components.total_record'\n : 'platform.angular_components.total_records';\n <p class=\"text-[14px] text-[#212533]\">\n {{ text | translate: { count: totalRecords() } }}\n </p>\n <ng-content></ng-content>\n </section>\n</div>\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seniorsistemas-angular-components-paginator.mjs","sources":["../../projects/angular-components/paginator/src/lib/paginator/paginator.component.ts","../../projects/angular-components/paginator/src/lib/paginator/paginator.component.html","../../projects/angular-components/paginator/src/seniorsistemas-angular-components-paginator.ts"],"sourcesContent":["import { Component, computed, effect, input, model, OnDestroy, output, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { InteractiveContentDirective } from '@seniorsistemas/angular-components/interactive-content';\nimport { SelectComponent } from '@seniorsistemas/angular-components/select';\nimport { TranslateModule } from '@ngx-translate/core';\n\nimport { PageChange, PaginatorInternalButton } from '../models/paginator.models';\n/**\n * @description Componente de paginação standalone que exibe botões de páginas,\n * seletor de itens por página e navegação para primeira/última página.\n * Emite `pageChange` a cada mudança de página ou tamanho de página.\n *\n * @example\n * ```html\n * <s-paginator\n * [totalRecords]=\"total\"\n * [(rows)]=\"tamanhoPagina\"\n * (pageChange)=\"onPaginaMudou($event)\" />\n * ```\n *\n * @category Structure\n */\n@Component({\n selector: 's-paginator',\n standalone: true,\n imports: [InteractiveContentDirective, SelectComponent, FormsModule, TranslateModule],\n templateUrl: './paginator.component.html',\n})\nexport class PaginatorComponent implements OnDestroy {\n /** @description Número total de registros. Campo obrigatório. */\n totalRecords = input.required<number>();\n /** @description Número de itens por página. Suporta two-way binding. @default 10 */\n rows = model(10);\n /** @description Opções do seletor de itens por página. @default [10, 20, 50, 100, 200] */\n rowsPerPageOptions = input<number[]>([10, 20, 50, 100, 200]);\n /** @description Emitido sempre que a página ou o número de itens por página muda. */\n pageChange = output<PageChange>();\n\n private readonly currentPageEffect = effect(() => {\n const totalPages = this.totalPages();\n const page = this.currentPage() - 1;\n this.pageChange.emit({\n page,\n pageCount: totalPages,\n rows: this.rows(),\n first: this.rows() * page,\n });\n });\n private readonly MAX_PAGE_BUTTONS = 5;\n private readonly hasPreviousPage = computed(() => {\n const previousPage = this.currentPage() - 1;\n return previousPage >= 1;\n });\n\n private readonly hasNextPage = computed(() => {\n const nextPage = this.currentPage() + 1;\n return nextPage <= this.totalPages();\n });\n\n private readonly requestedPage = signal(1);\n /** @description Página atual, sempre reajustada para o intervalo válido de `[1, totalPages]`. */\n protected readonly currentPage = computed(() => {\n const maxPage = Math.max(this.totalPages(), 1);\n return Math.min(Math.max(this.requestedPage(), 1), maxPage);\n });\n\n protected buttons = computed(() => {\n const navigationPageButtons: PaginatorInternalButton[] = [];\n const maxPageButtons = this.MAX_PAGE_BUTTONS;\n const currentPage = this.currentPage();\n const middle = Math.floor(maxPageButtons / 2);\n const _startPage = currentPage - middle;\n let startPage = _startPage < 1 ? 1 : _startPage;\n const _endPage = startPage + maxPageButtons - 1;\n const endPageIsMoreThanTotalPages = _endPage > this.totalPages();\n\n if (endPageIsMoreThanTotalPages) {\n const diff = _endPage - this.totalPages();\n const canModifyStartPage = startPage - diff >= 1;\n if (canModifyStartPage) {\n startPage = startPage - diff;\n }\n }\n const endPage = endPageIsMoreThanTotalPages ? this.totalPages() : _endPage;\n\n for (let i = startPage; i <= endPage; i++) {\n navigationPageButtons.push({\n clicked: (page) => this.goToPage(page.pageIndex as number),\n pageIndex: i,\n });\n }\n\n return [\n this.FIRST_PAGE_BUTTON,\n this.PREVIOUS_PAGE_BUTTON,\n ...navigationPageButtons,\n this.NEXT_PAGE_BUTTON,\n this.LAST_PAGE_BUTTON,\n ];\n });\n\n private readonly FIRST_PAGE_BUTTON: PaginatorInternalButton = {\n clicked: this.goFirstPage.bind(this),\n icon: 'fas fa-step-backward',\n ariaLabelKey: 'platform.angular_components.aria_first_page',\n validate: computed(() => {\n return !this.hasPreviousPage();\n }),\n };\n\n private readonly PREVIOUS_PAGE_BUTTON: PaginatorInternalButton = {\n clicked: this.goPreviousPage.bind(this),\n icon: 'fas fa-caret-left',\n ariaLabelKey: 'platform.angular_components.aria_previous_page',\n validate: computed(() => {\n return !this.hasPreviousPage();\n }),\n };\n\n private readonly LAST_PAGE_BUTTON: PaginatorInternalButton = {\n clicked: this.goLastPage.bind(this),\n icon: 'fas fa-step-forward',\n ariaLabelKey: 'platform.angular_components.aria_last_page',\n validate: computed(() => {\n return !this.hasNextPage();\n }),\n };\n\n private readonly NEXT_PAGE_BUTTON: PaginatorInternalButton = {\n clicked: this.goNextPage.bind(this),\n icon: 'fas fa-caret-right',\n ariaLabelKey: 'platform.angular_components.aria_next_page',\n validate: computed(() => {\n return !this.hasNextPage();\n }),\n };\n\n private totalPages = computed(() => {\n return Math.ceil(this.totalRecords() / this.rows());\n });\n\n public ngOnDestroy(): void {\n this.currentPageEffect.destroy();\n }\n\n protected rowsPerPageChange(): void {\n if (this.currentPage() !== 1) {\n this.goToPage(1);\n }\n }\n\n protected activatedButton(button: PaginatorInternalButton): void {\n button.clicked(button);\n }\n\n private goFirstPage(): void {\n this.goToPage(1);\n }\n\n private goNextPage(): void {\n if (!this.hasNextPage()) {\n return;\n }\n this.goToPage(this.currentPage() + 1);\n }\n\n private goPreviousPage(): void {\n if (!this.hasPreviousPage()) {\n return;\n }\n this.goToPage(this.currentPage() - 1);\n }\n\n private goLastPage(): void {\n this.goToPage(this.totalPages());\n }\n\n private goToPage(pageIndex: number): void {\n this.requestedPage.set(pageIndex);\n }\n}\n\n","<div class=\"flex justify-between\">\n <section class=\"flex items-center gap-2\">\n <div\n class=\"inline-block h-8 divide-x divide-grayscale-30 overflow-hidden rounded-medium border border-grayscale-30 bg-grayscale-0\"\n >\n @for (btn of buttons(); track $index) {\n @let active = btn.pageIndex === currentPage();\n @let ariaLabelKey =\n btn.ariaLabelKey ??\n (active\n ? 'platform.angular_components.aria_current_page'\n : 'platform.angular_components.aria_page_number');\n <button\n [class.bg-criticality-blue]=\"active\"\n [class.text-grayscale-0]=\"active\"\n [class.text-criticality-blue]=\"!active\"\n (sInteractiveContent)=\"activatedButton(btn)\"\n [disabled]=\"btn.disabled || (btn.validate && btn.validate()) || false\"\n [attr.aria-label]=\"ariaLabelKey | translate: { page: btn.pageIndex }\"\n [attr.aria-current]=\"active ? 'page' : null\"\n class=\"group h-8 w-8 hover:bg-grayscale-20 hover:text-grayscale-100 disabled:hover:bg-[transparent] disabled:hover:text-criticality-blue\"\n >\n <div class=\"group-disabled:opacity-50\">\n @let page = btn.pageIndex;\n @let icon = btn.icon;\n @if (page !== undefined) {\n {{ page }}\n }\n @if (icon) {\n <i [class]=\"icon\" aria-hidden=\"true\"></i>\n }\n </div>\n </button>\n }\n </div>\n <s-select\n [options]=\"rowsPerPageOptions()\"\n [ariaLabel]=\"'platform.angular_components.aria_page_selection' | translate\"\n [(ngModel)]=\"rows\"\n (ngModelChange)=\"rowsPerPageChange()\"\n ></s-select>\n </section>\n <section class=\"flex items-center gap-2\">\n @let text =\n totalRecords() === 0\n ? 'platform.angular_components.total_record'\n : 'platform.angular_components.total_records';\n <p class=\"text-[14px] text-[#212533]\">\n {{ text | translate: { count: totalRecords() } }}\n </p>\n <ng-content></ng-content>\n </section>\n</div>\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -39,6 +39,26 @@ class RatingScaleComponent {
39
39
  value;
40
40
  _onChange;
41
41
  _onTouched;
42
+ ngOnChanges(changes) {
43
+ if (changes['nodes']) {
44
+ this.nodes?.forEach((node) => {
45
+ const hasSelectedIcon = !!node.selectedIcon;
46
+ const hasUnselectedIcon = !!node.unselectedIcon;
47
+ if (hasSelectedIcon !== hasUnselectedIcon) {
48
+ console.warn(`s-rating-scale: o nó "${node.id}" informou apenas um de "selectedIcon"/"unselectedIcon" — os dois devem ser informados juntos. Nenhum ícone será exibido para esse nó até que ambos sejam informados.`);
49
+ }
50
+ });
51
+ }
52
+ }
53
+ getNodeIconClass(node) {
54
+ if (node.selectedIcon && node.unselectedIcon) {
55
+ return this.value?.id === node.id ? node.selectedIcon : node.unselectedIcon;
56
+ }
57
+ if (node.selectedIcon || node.unselectedIcon) {
58
+ return undefined;
59
+ }
60
+ return node.icon ? `fas ${node.icon}` : undefined;
61
+ }
42
62
  writeValue(value) {
43
63
  if (!this.disabled) {
44
64
  this.value = value;
@@ -63,7 +83,7 @@ class RatingScaleComponent {
63
83
  useExisting: forwardRef(() => RatingScaleComponent),
64
84
  multi: true,
65
85
  },
66
- ], ngImport: i0, template: "<div\n class=\"flex flex-col\"\n [class.opacity-50]=\"disabled\">\n <div class=\"flex\">\n @for (node of nodes; track node.id) {\n <button\n class=\"flex flex-grow items-center justify-center rounded-xbig border border-secondary bg-grayscale-0 p-2 mx-0.5 first:ml-0 last:mr-0\"\n [class.bg-hippie-blue-100]=\"value?.id === node.id && !disabled\"\n [class.border-criticality-blue]=\"value?.id === node.id && !disabled\"\n [class.text-criticality-blue]=\"value?.id === node.id && !disabled\"\n [class.cursor-pointer]=\"!disabled\"\n [class.hover:bg-grayscale-20]=\"!disabled\"\n [class.focus:border-2]=\"!disabled\"\n [class.focus:outline-none]=\"!disabled\"\n tabindex=\"0\"\n (click)=\"onSelect(node)\">\n @if (node.icon) {\n <span\n class=\"m-1.5 text-base text-grayscale-60 fas\"\n [ngClass]=\"node.icon\">\n </span>\n }\n @if (node.title) {\n <span class=\"m-1.5 text-sm font-normal leading-[150%] text-grayscale-90\">{{ node.title }}</span>\n }\n </button>\n }\n </div>\n <div class=\"flex justify-between py-3\">\n <span class=\"font-open-sans text-sm font-normal leading-[150%] text-[#080808]\">{{ startLabel }}</span>\n <span class=\"font-open-sans text-sm font-normal leading-[150%] text-[#080808]\">{{ endLabel }}</span>\n </div>\n</div>", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
86
+ ], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"flex flex-col\"\n [class.opacity-50]=\"disabled\">\n <div class=\"flex\">\n @for (node of nodes; track node.id) {\n <button\n class=\"flex flex-grow items-center justify-center rounded-xbig border border-secondary bg-grayscale-0 p-2 mx-0.5 first:ml-0 last:mr-0\"\n [class.bg-hippie-blue-100]=\"value?.id === node.id && !disabled\"\n [class.border-criticality-blue]=\"value?.id === node.id && !disabled\"\n [class.text-criticality-blue]=\"value?.id === node.id && !disabled\"\n [class.cursor-pointer]=\"!disabled\"\n [class.hover:bg-grayscale-20]=\"!disabled\"\n [class.focus:border-2]=\"!disabled\"\n [class.focus:outline-none]=\"!disabled\"\n tabindex=\"0\"\n (click)=\"onSelect(node)\">\n @let nodeIconClass = getNodeIconClass(node);\n @if (nodeIconClass) {\n <span\n class=\"m-1.5 text-base text-grayscale-60\"\n [ngClass]=\"nodeIconClass\">\n </span>\n }\n @if (node.title) {\n <span class=\"m-1.5 text-sm font-normal leading-[150%] text-grayscale-90\">{{ node.title }}</span>\n }\n </button>\n }\n </div>\n <div class=\"flex justify-between py-3\">\n <span class=\"font-open-sans text-sm font-normal leading-[150%] text-[#080808]\">{{ startLabel }}</span>\n <span class=\"font-open-sans text-sm font-normal leading-[150%] text-[#080808]\">{{ endLabel }}</span>\n </div>\n</div>", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
67
87
  }
68
88
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RatingScaleComponent, decorators: [{
69
89
  type: Component,
@@ -73,7 +93,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
73
93
  useExisting: forwardRef(() => RatingScaleComponent),
74
94
  multi: true,
75
95
  },
76
- ], standalone: true, imports: [NgClass], template: "<div\n class=\"flex flex-col\"\n [class.opacity-50]=\"disabled\">\n <div class=\"flex\">\n @for (node of nodes; track node.id) {\n <button\n class=\"flex flex-grow items-center justify-center rounded-xbig border border-secondary bg-grayscale-0 p-2 mx-0.5 first:ml-0 last:mr-0\"\n [class.bg-hippie-blue-100]=\"value?.id === node.id && !disabled\"\n [class.border-criticality-blue]=\"value?.id === node.id && !disabled\"\n [class.text-criticality-blue]=\"value?.id === node.id && !disabled\"\n [class.cursor-pointer]=\"!disabled\"\n [class.hover:bg-grayscale-20]=\"!disabled\"\n [class.focus:border-2]=\"!disabled\"\n [class.focus:outline-none]=\"!disabled\"\n tabindex=\"0\"\n (click)=\"onSelect(node)\">\n @if (node.icon) {\n <span\n class=\"m-1.5 text-base text-grayscale-60 fas\"\n [ngClass]=\"node.icon\">\n </span>\n }\n @if (node.title) {\n <span class=\"m-1.5 text-sm font-normal leading-[150%] text-grayscale-90\">{{ node.title }}</span>\n }\n </button>\n }\n </div>\n <div class=\"flex justify-between py-3\">\n <span class=\"font-open-sans text-sm font-normal leading-[150%] text-[#080808]\">{{ startLabel }}</span>\n <span class=\"font-open-sans text-sm font-normal leading-[150%] text-[#080808]\">{{ endLabel }}</span>\n </div>\n</div>" }]
96
+ ], standalone: true, imports: [NgClass], template: "<div\n class=\"flex flex-col\"\n [class.opacity-50]=\"disabled\">\n <div class=\"flex\">\n @for (node of nodes; track node.id) {\n <button\n class=\"flex flex-grow items-center justify-center rounded-xbig border border-secondary bg-grayscale-0 p-2 mx-0.5 first:ml-0 last:mr-0\"\n [class.bg-hippie-blue-100]=\"value?.id === node.id && !disabled\"\n [class.border-criticality-blue]=\"value?.id === node.id && !disabled\"\n [class.text-criticality-blue]=\"value?.id === node.id && !disabled\"\n [class.cursor-pointer]=\"!disabled\"\n [class.hover:bg-grayscale-20]=\"!disabled\"\n [class.focus:border-2]=\"!disabled\"\n [class.focus:outline-none]=\"!disabled\"\n tabindex=\"0\"\n (click)=\"onSelect(node)\">\n @let nodeIconClass = getNodeIconClass(node);\n @if (nodeIconClass) {\n <span\n class=\"m-1.5 text-base text-grayscale-60\"\n [ngClass]=\"nodeIconClass\">\n </span>\n }\n @if (node.title) {\n <span class=\"m-1.5 text-sm font-normal leading-[150%] text-grayscale-90\">{{ node.title }}</span>\n }\n </button>\n }\n </div>\n <div class=\"flex justify-between py-3\">\n <span class=\"font-open-sans text-sm font-normal leading-[150%] text-[#080808]\">{{ startLabel }}</span>\n <span class=\"font-open-sans text-sm font-normal leading-[150%] text-[#080808]\">{{ endLabel }}</span>\n </div>\n</div>" }]
77
97
  }], propDecorators: { nodes: [{
78
98
  type: Input,
79
99
  args: [{ required: true }]
@@ -1 +1 @@
1
- {"version":3,"file":"seniorsistemas-angular-components-rating-scale.mjs","sources":["../../projects/angular-components/rating-scale/src/lib/rating-scale/rating-scale.component.ts","../../projects/angular-components/rating-scale/src/lib/rating-scale/rating-scale.component.html","../../projects/angular-components/rating-scale/src/lib/rating-scale/rating-scale.module.ts","../../projects/angular-components/rating-scale/src/seniorsistemas-angular-components-rating-scale.ts"],"sourcesContent":["import { NgClass } from '@angular/common';\r\nimport { Component, Input, forwardRef } from '@angular/core';\r\n\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { RatingScaleNode } from './models/rating-scale-node';\r\n\r\n/**\r\n * @description Componente de escala de avaliação que permite ao usuário selecionar um nó de uma escala visual.\r\n * Implementa `ControlValueAccessor` para integração com Reactive Forms e Template-Driven Forms.\r\n * Ideal para pesquisas de satisfação (NPS, CSAT) e questionários de feedback.\r\n *\r\n * @example\r\n * ```html\r\n * <s-rating-scale\r\n * [nodes]=\"ratingNodes\"\r\n * startLabel=\"Péssimo\"\r\n * endLabel=\"Ótimo\"\r\n * [(ngModel)]=\"rating\"\r\n * />\r\n * ```\r\n *\r\n * @category Feedback\r\n */\r\n@Component({\r\n selector: 's-rating-scale',\r\n templateUrl: './rating-scale.component.html',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => RatingScaleComponent),\r\n multi: true,\r\n },\r\n ],\r\n standalone: true,\r\n imports: [NgClass],\r\n})\r\nexport class RatingScaleComponent implements ControlValueAccessor {\r\n /**\r\n * @description Lista de nós que compõem a escala de avaliação. Campo obrigatório.\r\n * Cada `RatingScaleNode` define o valor, rótulo e cor do item na escala.\r\n */\r\n @Input({ required: true })\r\n public nodes!: RatingScaleNode[];\r\n\r\n /** @description Rótulo exibido no início (extremidade esquerda) da escala. */\r\n @Input()\r\n public startLabel?: string;\r\n\r\n /** @description Rótulo exibido no final (extremidade direita) da escala. */\r\n @Input()\r\n public endLabel?: string;\r\n\r\n /**\r\n * @description Quando `true`, a escala fica desabilitada e o usuário não pode selecionar nenhum nó.\r\n *\r\n * @default false\r\n */\r\n @Input()\r\n public disabled = false;\r\n\r\n public value?: RatingScaleNode;\r\n private _onChange?: (value: RatingScaleNode) => void;\r\n private _onTouched?: (value: RatingScaleNode) => void;\r\n\r\n public writeValue(value: RatingScaleNode): void {\r\n if (!this.disabled) {\r\n this.value = value;\r\n }\r\n }\r\n public registerOnChange(onChange: (value: RatingScaleNode) => void): void {\r\n this._onChange = onChange;\r\n }\r\n public registerOnTouched(onTouched: (value: RatingScaleNode) => void): void {\r\n this._onTouched = onTouched;\r\n }\r\n\r\n public onSelect(rating: RatingScaleNode) {\r\n this.value = rating;\r\n if (this._onChange) {\r\n this._onChange(this.value);\r\n }\r\n }\r\n}\r\n","<div\n class=\"flex flex-col\"\n [class.opacity-50]=\"disabled\">\n <div class=\"flex\">\n @for (node of nodes; track node.id) {\n <button\n class=\"flex flex-grow items-center justify-center rounded-xbig border border-secondary bg-grayscale-0 p-2 mx-0.5 first:ml-0 last:mr-0\"\n [class.bg-hippie-blue-100]=\"value?.id === node.id && !disabled\"\n [class.border-criticality-blue]=\"value?.id === node.id && !disabled\"\n [class.text-criticality-blue]=\"value?.id === node.id && !disabled\"\n [class.cursor-pointer]=\"!disabled\"\n [class.hover:bg-grayscale-20]=\"!disabled\"\n [class.focus:border-2]=\"!disabled\"\n [class.focus:outline-none]=\"!disabled\"\n tabindex=\"0\"\n (click)=\"onSelect(node)\">\n @if (node.icon) {\n <span\n class=\"m-1.5 text-base text-grayscale-60 fas\"\n [ngClass]=\"node.icon\">\n </span>\n }\n @if (node.title) {\n <span class=\"m-1.5 text-sm font-normal leading-[150%] text-grayscale-90\">{{ node.title }}</span>\n }\n </button>\n }\n </div>\n <div class=\"flex justify-between py-3\">\n <span class=\"font-open-sans text-sm font-normal leading-[150%] text-[#080808]\">{{ startLabel }}</span>\n <span class=\"font-open-sans text-sm font-normal leading-[150%] text-[#080808]\">{{ endLabel }}</span>\n </div>\n</div>","import { NgModule } from '@angular/core';\r\n\r\nimport { RatingScaleComponent } from './rating-scale.component';\r\n\r\n@NgModule({\r\n imports: [RatingScaleComponent],\r\n exports: [RatingScaleComponent],\r\n})\r\nexport class RatingScaleModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seniorsistemas-angular-components-rating-scale.mjs","sources":["../../projects/angular-components/rating-scale/src/lib/rating-scale/rating-scale.component.ts","../../projects/angular-components/rating-scale/src/lib/rating-scale/rating-scale.component.html","../../projects/angular-components/rating-scale/src/lib/rating-scale/rating-scale.module.ts","../../projects/angular-components/rating-scale/src/seniorsistemas-angular-components-rating-scale.ts"],"sourcesContent":["import { NgClass } from '@angular/common';\r\nimport { Component, Input, OnChanges, SimpleChanges, forwardRef } from '@angular/core';\r\n\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { RatingScaleNode } from './models/rating-scale-node';\r\n\r\n/**\r\n * @description Componente de escala de avaliação que permite ao usuário selecionar um nó de uma escala visual.\r\n * Implementa `ControlValueAccessor` para integração com Reactive Forms e Template-Driven Forms.\r\n * Ideal para pesquisas de satisfação (NPS, CSAT) e questionários de feedback.\r\n *\r\n * @example\r\n * ```html\r\n * <s-rating-scale\r\n * [nodes]=\"ratingNodes\"\r\n * startLabel=\"Péssimo\"\r\n * endLabel=\"Ótimo\"\r\n * [(ngModel)]=\"rating\"\r\n * />\r\n * ```\r\n *\r\n * @category Feedback\r\n */\r\n@Component({\r\n selector: 's-rating-scale',\r\n templateUrl: './rating-scale.component.html',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => RatingScaleComponent),\r\n multi: true,\r\n },\r\n ],\r\n standalone: true,\r\n imports: [NgClass],\r\n})\r\nexport class RatingScaleComponent implements ControlValueAccessor, OnChanges {\r\n /**\r\n * @description Lista de nós que compõem a escala de avaliação. Campo obrigatório.\r\n * Cada `RatingScaleNode` define o valor, rótulo e cor do item na escala.\r\n */\r\n @Input({ required: true })\r\n public nodes!: RatingScaleNode[];\r\n\r\n /** @description Rótulo exibido no início (extremidade esquerda) da escala. */\r\n @Input()\r\n public startLabel?: string;\r\n\r\n /** @description Rótulo exibido no final (extremidade direita) da escala. */\r\n @Input()\r\n public endLabel?: string;\r\n\r\n /**\r\n * @description Quando `true`, a escala fica desabilitada e o usuário não pode selecionar nenhum nó.\r\n *\r\n * @default false\r\n */\r\n @Input()\r\n public disabled = false;\r\n\r\n public value?: RatingScaleNode;\r\n private _onChange?: (value: RatingScaleNode) => void;\r\n private _onTouched?: (value: RatingScaleNode) => void;\r\n\r\n public ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['nodes']) {\r\n this.nodes?.forEach((node) => {\r\n const hasSelectedIcon = !!node.selectedIcon;\r\n const hasUnselectedIcon = !!node.unselectedIcon;\r\n if (hasSelectedIcon !== hasUnselectedIcon) {\r\n console.warn(\r\n `s-rating-scale: o nó \"${node.id}\" informou apenas um de \"selectedIcon\"/\"unselectedIcon\" — os dois devem ser informados juntos. Nenhum ícone será exibido para esse nó até que ambos sejam informados.`,\r\n );\r\n }\r\n });\r\n }\r\n }\r\n\r\n public getNodeIconClass(node: RatingScaleNode): string | undefined {\r\n if (node.selectedIcon && node.unselectedIcon) {\r\n return this.value?.id === node.id ? node.selectedIcon : node.unselectedIcon;\r\n }\r\n if (node.selectedIcon || node.unselectedIcon) {\r\n return undefined;\r\n }\r\n return node.icon ? `fas ${node.icon}` : undefined;\r\n }\r\n\r\n public writeValue(value: RatingScaleNode): void {\r\n if (!this.disabled) {\r\n this.value = value;\r\n }\r\n }\r\n public registerOnChange(onChange: (value: RatingScaleNode) => void): void {\r\n this._onChange = onChange;\r\n }\r\n public registerOnTouched(onTouched: (value: RatingScaleNode) => void): void {\r\n this._onTouched = onTouched;\r\n }\r\n\r\n public onSelect(rating: RatingScaleNode) {\r\n this.value = rating;\r\n if (this._onChange) {\r\n this._onChange(this.value);\r\n }\r\n }\r\n}\r\n","<div\n class=\"flex flex-col\"\n [class.opacity-50]=\"disabled\">\n <div class=\"flex\">\n @for (node of nodes; track node.id) {\n <button\n class=\"flex flex-grow items-center justify-center rounded-xbig border border-secondary bg-grayscale-0 p-2 mx-0.5 first:ml-0 last:mr-0\"\n [class.bg-hippie-blue-100]=\"value?.id === node.id && !disabled\"\n [class.border-criticality-blue]=\"value?.id === node.id && !disabled\"\n [class.text-criticality-blue]=\"value?.id === node.id && !disabled\"\n [class.cursor-pointer]=\"!disabled\"\n [class.hover:bg-grayscale-20]=\"!disabled\"\n [class.focus:border-2]=\"!disabled\"\n [class.focus:outline-none]=\"!disabled\"\n tabindex=\"0\"\n (click)=\"onSelect(node)\">\n @let nodeIconClass = getNodeIconClass(node);\n @if (nodeIconClass) {\n <span\n class=\"m-1.5 text-base text-grayscale-60\"\n [ngClass]=\"nodeIconClass\">\n </span>\n }\n @if (node.title) {\n <span class=\"m-1.5 text-sm font-normal leading-[150%] text-grayscale-90\">{{ node.title }}</span>\n }\n </button>\n }\n </div>\n <div class=\"flex justify-between py-3\">\n <span class=\"font-open-sans text-sm font-normal leading-[150%] text-[#080808]\">{{ startLabel }}</span>\n <span class=\"font-open-sans text-sm font-normal leading-[150%] text-[#080808]\">{{ endLabel }}</span>\n </div>\n</div>","import { NgModule } from '@angular/core';\r\n\r\nimport { RatingScaleComponent } from './rating-scale.component';\r\n\r\n@NgModule({\r\n imports: [RatingScaleComponent],\r\n exports: [RatingScaleComponent],\r\n})\r\nexport class RatingScaleModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}