@memberjunction/ng-skip-chat 2.48.0 → 2.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/artifacts/skip-artifact-viewer.component.js +254 -270
- package/dist/lib/artifacts/skip-artifact-viewer.component.js.map +1 -1
- package/dist/lib/artifacts/skip-artifacts-counter.component.js +82 -90
- package/dist/lib/artifacts/skip-artifacts-counter.component.js.map +1 -1
- package/dist/lib/drill-down-info.js +4 -3
- package/dist/lib/drill-down-info.js.map +1 -1
- package/dist/lib/dynamic-report/base-report.js +147 -164
- package/dist/lib/dynamic-report/base-report.js.map +1 -1
- package/dist/lib/dynamic-report/dynamic-chart.js +77 -86
- package/dist/lib/dynamic-report/dynamic-chart.js.map +1 -1
- package/dist/lib/dynamic-report/dynamic-grid.js +80 -93
- package/dist/lib/dynamic-report/dynamic-grid.js.map +1 -1
- package/dist/lib/dynamic-report/dynamic-ui-component.js +173 -188
- package/dist/lib/dynamic-report/dynamic-ui-component.js.map +1 -1
- package/dist/lib/dynamic-report/linear-report.js +16 -26
- package/dist/lib/dynamic-report/linear-report.js.map +1 -1
- package/dist/lib/dynamic-report/skip-dynamic-report-wrapper.js +28 -28
- package/dist/lib/dynamic-report/skip-dynamic-report-wrapper.js.map +1 -1
- package/dist/lib/dynamic-report/skip-react-component-host.js +203 -212
- package/dist/lib/dynamic-report/skip-react-component-host.js.map +1 -1
- package/dist/lib/module.js +22 -22
- package/dist/lib/module.js.map +1 -1
- package/dist/lib/report-cache.js +2 -5
- package/dist/lib/report-cache.js.map +1 -1
- package/dist/lib/skip-chat/skip-chat.component.js +1052 -1087
- package/dist/lib/skip-chat/skip-chat.component.js.map +1 -1
- package/dist/lib/skip-single-message/skip-single-message.component.js +251 -259
- package/dist/lib/skip-single-message/skip-single-message.component.js.map +1 -1
- package/dist/lib/split-panel/skip-split-panel.component.js +52 -51
- package/dist/lib/split-panel/skip-split-panel.component.js.map +1 -1
- package/package.json +13 -13
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
1
|
import { Component, EventEmitter, Input, Output, ViewChildren, HostListener } from '@angular/core';
|
|
11
2
|
import { CompositeKey, LogError, Metadata, RunQuery, RunView } from '@memberjunction/core';
|
|
12
3
|
import { SkipReactComponentHost } from './skip-react-component-host';
|
|
@@ -546,67 +537,46 @@ function SkipDynamicUIComponentComponent_Conditional_1_Template(rf, ctx) { if (r
|
|
|
546
537
|
i0.ɵɵconditional(ctx_r1.currentError ? 26 : -1);
|
|
547
538
|
} }
|
|
548
539
|
export class SkipDynamicUIComponentComponent {
|
|
540
|
+
sanitizer;
|
|
541
|
+
cdr;
|
|
542
|
+
ngZone;
|
|
543
|
+
UIComponentCode = null;
|
|
544
|
+
ComponentObjectName = null;
|
|
545
|
+
ShowPrintReport = true;
|
|
546
|
+
ShowReportOptionsToggle = true;
|
|
547
|
+
ShowCreateReportButton = false;
|
|
548
|
+
matchingReportID = null;
|
|
549
|
+
DrillDownEvent = new EventEmitter();
|
|
550
|
+
CreateReportRequested = new EventEmitter();
|
|
551
|
+
htmlContainers;
|
|
552
|
+
// Properties for handling multiple report options
|
|
553
|
+
reportOptions = [];
|
|
554
|
+
selectedReportOptionIndex = 0;
|
|
555
|
+
currentError = null;
|
|
556
|
+
isCreatingReport = false;
|
|
557
|
+
// Toggle states for showing/hiding component details
|
|
558
|
+
showFunctionalRequirements = false;
|
|
559
|
+
showDataRequirements = false;
|
|
560
|
+
showTechnicalDesign = false;
|
|
561
|
+
showCode = false;
|
|
562
|
+
// Details panel height for resizing
|
|
563
|
+
detailsPanelHeight = '300px';
|
|
564
|
+
isResizing = false;
|
|
565
|
+
startY = 0;
|
|
566
|
+
startHeight = 0;
|
|
567
|
+
// Cache for React component hosts - lazy loaded per option
|
|
568
|
+
reactHostCache = new Map();
|
|
569
|
+
currentHostIndex = null;
|
|
570
|
+
callbacks = {
|
|
571
|
+
RefreshData: () => this.handleRefreshData(),
|
|
572
|
+
OpenEntityRecord: (entityName, key) => this.handleOpenEntityRecord(entityName, key),
|
|
573
|
+
UpdateUserState: (userState) => this.handleUpdateUserState(userState),
|
|
574
|
+
NotifyEvent: (eventName, eventData) => this.handleNotifyEvent(eventName, eventData)
|
|
575
|
+
};
|
|
549
576
|
constructor(sanitizer, cdr, ngZone) {
|
|
550
577
|
this.sanitizer = sanitizer;
|
|
551
578
|
this.cdr = cdr;
|
|
552
579
|
this.ngZone = ngZone;
|
|
553
|
-
this.UIComponentCode = null;
|
|
554
|
-
this.ComponentObjectName = null;
|
|
555
|
-
this.ShowPrintReport = true;
|
|
556
|
-
this.ShowReportOptionsToggle = true;
|
|
557
|
-
this.ShowCreateReportButton = false;
|
|
558
|
-
this.matchingReportID = null;
|
|
559
|
-
this.DrillDownEvent = new EventEmitter();
|
|
560
|
-
this.CreateReportRequested = new EventEmitter();
|
|
561
|
-
// Properties for handling multiple report options
|
|
562
|
-
this.reportOptions = [];
|
|
563
|
-
this.selectedReportOptionIndex = 0;
|
|
564
|
-
this.currentError = null;
|
|
565
|
-
this.isCreatingReport = false;
|
|
566
|
-
// Toggle states for showing/hiding component details
|
|
567
|
-
this.showFunctionalRequirements = false;
|
|
568
|
-
this.showDataRequirements = false;
|
|
569
|
-
this.showTechnicalDesign = false;
|
|
570
|
-
this.showCode = false;
|
|
571
|
-
// Details panel height for resizing
|
|
572
|
-
this.detailsPanelHeight = '300px';
|
|
573
|
-
this.isResizing = false;
|
|
574
|
-
this.startY = 0;
|
|
575
|
-
this.startHeight = 0;
|
|
576
|
-
// Cache for React component hosts - lazy loaded per option
|
|
577
|
-
this.reactHostCache = new Map();
|
|
578
|
-
this.currentHostIndex = null;
|
|
579
|
-
this.callbacks = {
|
|
580
|
-
RefreshData: () => this.handleRefreshData(),
|
|
581
|
-
OpenEntityRecord: (entityName, key) => this.handleOpenEntityRecord(entityName, key),
|
|
582
|
-
UpdateUserState: (userState) => this.handleUpdateUserState(userState),
|
|
583
|
-
NotifyEvent: (eventName, eventData) => this.handleNotifyEvent(eventName, eventData)
|
|
584
|
-
};
|
|
585
|
-
/**
|
|
586
|
-
* Handle resize movement
|
|
587
|
-
*/
|
|
588
|
-
this.onResize = (event) => {
|
|
589
|
-
if (!this.isResizing)
|
|
590
|
-
return;
|
|
591
|
-
const currentY = event instanceof MouseEvent ? event.clientY : event.touches[0].clientY;
|
|
592
|
-
const deltaY = currentY - this.startY;
|
|
593
|
-
const newHeight = Math.max(100, Math.min(600, this.startHeight + deltaY));
|
|
594
|
-
// Run inside Angular to update the binding
|
|
595
|
-
this.ngZone.run(() => {
|
|
596
|
-
this.detailsPanelHeight = `${newHeight}px`;
|
|
597
|
-
this.cdr.detectChanges();
|
|
598
|
-
});
|
|
599
|
-
};
|
|
600
|
-
/**
|
|
601
|
-
* Stop resizing
|
|
602
|
-
*/
|
|
603
|
-
this.stopResize = () => {
|
|
604
|
-
this.isResizing = false;
|
|
605
|
-
document.removeEventListener('mousemove', this.onResize);
|
|
606
|
-
document.removeEventListener('mouseup', this.stopResize);
|
|
607
|
-
document.removeEventListener('touchmove', this.onResize);
|
|
608
|
-
document.removeEventListener('touchend', this.stopResize);
|
|
609
|
-
};
|
|
610
580
|
}
|
|
611
581
|
/**
|
|
612
582
|
* Gets the currently selected report option
|
|
@@ -631,7 +601,7 @@ export class SkipDynamicUIComponentComponent {
|
|
|
631
601
|
*/
|
|
632
602
|
isTopRanked(index) {
|
|
633
603
|
const option = this.reportOptions[index];
|
|
634
|
-
return
|
|
604
|
+
return option?.AIRank === 1;
|
|
635
605
|
}
|
|
636
606
|
/**
|
|
637
607
|
* Handles when the user selects a tab
|
|
@@ -675,23 +645,21 @@ export class SkipDynamicUIComponentComponent {
|
|
|
675
645
|
this.currentError = {
|
|
676
646
|
type: 'Component Assembly Error',
|
|
677
647
|
message: 'Failed to assemble the component code. This usually happens when sub-components are missing or placeholders cannot be resolved.',
|
|
678
|
-
technicalDetails:
|
|
648
|
+
technicalDetails: error?.toString() || 'Unknown error during component assembly'
|
|
679
649
|
};
|
|
680
650
|
// Clear the UI component code to prevent partial rendering
|
|
681
651
|
this.UIComponentCode = null;
|
|
682
652
|
this.ComponentObjectName = null;
|
|
683
653
|
}
|
|
684
654
|
}
|
|
685
|
-
PrintReport() {
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
}
|
|
694
|
-
});
|
|
655
|
+
async PrintReport() {
|
|
656
|
+
const currentHost = this.getCurrentReactHost();
|
|
657
|
+
if (currentHost) {
|
|
658
|
+
currentHost.print();
|
|
659
|
+
}
|
|
660
|
+
else {
|
|
661
|
+
window.print();
|
|
662
|
+
}
|
|
695
663
|
}
|
|
696
664
|
/**
|
|
697
665
|
* Copy error details to clipboard for user to send back to Skip
|
|
@@ -716,18 +684,17 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
|
|
|
716
684
|
* Get the container element for a specific option index
|
|
717
685
|
*/
|
|
718
686
|
getContainerForOption(optionIndex) {
|
|
719
|
-
var _a;
|
|
720
687
|
if (!this.htmlContainers || this.htmlContainers.length === 0) {
|
|
721
688
|
return null;
|
|
722
689
|
}
|
|
723
690
|
if (this.reportOptions.length === 1) {
|
|
724
691
|
// Single option - use the only container
|
|
725
|
-
return
|
|
692
|
+
return this.htmlContainers.first?.nativeElement || null;
|
|
726
693
|
}
|
|
727
694
|
else {
|
|
728
695
|
// Multiple options - find container by data-tab-index
|
|
729
696
|
const container = this.htmlContainers.find(ref => ref.nativeElement.getAttribute('data-tab-index') === optionIndex.toString());
|
|
730
|
-
return
|
|
697
|
+
return container?.nativeElement || null;
|
|
731
698
|
}
|
|
732
699
|
}
|
|
733
700
|
/**
|
|
@@ -883,6 +850,31 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
|
|
|
883
850
|
document.addEventListener('touchend', this.stopResize);
|
|
884
851
|
});
|
|
885
852
|
}
|
|
853
|
+
/**
|
|
854
|
+
* Handle resize movement
|
|
855
|
+
*/
|
|
856
|
+
onResize = (event) => {
|
|
857
|
+
if (!this.isResizing)
|
|
858
|
+
return;
|
|
859
|
+
const currentY = event instanceof MouseEvent ? event.clientY : event.touches[0].clientY;
|
|
860
|
+
const deltaY = currentY - this.startY;
|
|
861
|
+
const newHeight = Math.max(100, Math.min(600, this.startHeight + deltaY));
|
|
862
|
+
// Run inside Angular to update the binding
|
|
863
|
+
this.ngZone.run(() => {
|
|
864
|
+
this.detailsPanelHeight = `${newHeight}px`;
|
|
865
|
+
this.cdr.detectChanges();
|
|
866
|
+
});
|
|
867
|
+
};
|
|
868
|
+
/**
|
|
869
|
+
* Stop resizing
|
|
870
|
+
*/
|
|
871
|
+
stopResize = () => {
|
|
872
|
+
this.isResizing = false;
|
|
873
|
+
document.removeEventListener('mousemove', this.onResize);
|
|
874
|
+
document.removeEventListener('mouseup', this.stopResize);
|
|
875
|
+
document.removeEventListener('touchmove', this.onResize);
|
|
876
|
+
document.removeEventListener('touchend', this.stopResize);
|
|
877
|
+
};
|
|
886
878
|
onWindowResize() {
|
|
887
879
|
// Ensure the details panel height remains valid on window resize
|
|
888
880
|
const currentHeight = parseInt(this.detailsPanelHeight, 10);
|
|
@@ -938,6 +930,7 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
|
|
|
938
930
|
}
|
|
939
931
|
return null;
|
|
940
932
|
}
|
|
933
|
+
_skipData;
|
|
941
934
|
get SkipData() {
|
|
942
935
|
return this._skipData ? this._skipData : undefined;
|
|
943
936
|
}
|
|
@@ -972,9 +965,8 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
|
|
|
972
965
|
if (data.componentOptions && data.componentOptions.length > 0) {
|
|
973
966
|
// Sort by AIRank (lower numbers = better ranking)
|
|
974
967
|
this.reportOptions = [...data.componentOptions].sort((a, b) => {
|
|
975
|
-
|
|
976
|
-
const
|
|
977
|
-
const rankB = (_b = b.AIRank) !== null && _b !== void 0 ? _b : Number.MAX_SAFE_INTEGER;
|
|
968
|
+
const rankA = a.AIRank ?? Number.MAX_SAFE_INTEGER;
|
|
969
|
+
const rankB = b.AIRank ?? Number.MAX_SAFE_INTEGER;
|
|
978
970
|
return rankA - rankB;
|
|
979
971
|
});
|
|
980
972
|
// Select the best option (first in sorted array)
|
|
@@ -987,81 +979,77 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
|
|
|
987
979
|
/**
|
|
988
980
|
* Create a React host for a specific option index
|
|
989
981
|
*/
|
|
990
|
-
createReactHostForOption(optionIndex) {
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
const placeholderMatch = componentCode.match(/<<([^>]+)>>/);
|
|
1004
|
-
const placeholderName = placeholderMatch ? placeholderMatch[1] : 'Unknown';
|
|
1005
|
-
this.currentError = {
|
|
1006
|
-
type: 'Incomplete Component',
|
|
1007
|
-
message: `This component option contains unresolved placeholders (${placeholderName}). The component generation was not completed successfully.`,
|
|
1008
|
-
technicalDetails: `The component code contains placeholder tokens that should have been replaced with actual implementations. This typically happens when the AI generation process was interrupted or encountered an error.\n\nPlaceholder found: <<${placeholderName}>>`
|
|
1009
|
-
};
|
|
1010
|
-
return;
|
|
1011
|
-
}
|
|
1012
|
-
const md = new Metadata();
|
|
1013
|
-
const data = this.getFlattenedDataContext();
|
|
1014
|
-
// Create the React component host directly in the tab container
|
|
1015
|
-
const reactHost = new SkipReactComponentHost({
|
|
1016
|
-
componentCode: componentCode,
|
|
1017
|
-
container: container,
|
|
1018
|
-
callbacks: this.callbacks,
|
|
1019
|
-
data: data,
|
|
1020
|
-
utilities: this.SetupUtilities(md),
|
|
1021
|
-
styles: this.SetupStyles()
|
|
1022
|
-
});
|
|
1023
|
-
// Initialize and render the React component
|
|
1024
|
-
yield reactHost.initialize();
|
|
1025
|
-
// Cache the host
|
|
1026
|
-
this.reactHostCache.set(optionIndex, reactHost);
|
|
1027
|
-
// Update current index if this is the selected option
|
|
1028
|
-
if (optionIndex === this.selectedReportOptionIndex) {
|
|
1029
|
-
this.currentHostIndex = optionIndex;
|
|
1030
|
-
}
|
|
1031
|
-
}
|
|
1032
|
-
catch (e) {
|
|
1033
|
-
console.error('Error creating React host:', e);
|
|
1034
|
-
// Determine the type of error and create a user-friendly message
|
|
1035
|
-
let errorType = 'Component Initialization Error';
|
|
1036
|
-
let errorMessage = 'Failed to initialize the React component.';
|
|
1037
|
-
let technicalDetails = e.toString();
|
|
1038
|
-
if ((_a = e.message) === null || _a === void 0 ? void 0 : _a.includes('JSX transpilation failed')) {
|
|
1039
|
-
errorType = 'Code Compilation Error';
|
|
1040
|
-
errorMessage = 'The component code could not be compiled. This usually indicates a syntax error in the generated code.';
|
|
1041
|
-
technicalDetails = e.message;
|
|
1042
|
-
}
|
|
1043
|
-
else if ((_b = e.message) === null || _b === void 0 ? void 0 : _b.includes('is not defined')) {
|
|
1044
|
-
errorType = 'Missing Dependency';
|
|
1045
|
-
errorMessage = 'The component is trying to use a feature or library that is not available.';
|
|
1046
|
-
}
|
|
1047
|
-
else if ((_c = e.message) === null || _c === void 0 ? void 0 : _c.includes('Cannot read properties')) {
|
|
1048
|
-
errorType = 'Property Access Error';
|
|
1049
|
-
errorMessage = 'The component is trying to access data that doesn\'t exist. This often happens when property names don\'t match the data structure.';
|
|
1050
|
-
}
|
|
982
|
+
async createReactHostForOption(optionIndex) {
|
|
983
|
+
const option = this.reportOptions[optionIndex];
|
|
984
|
+
if (!option)
|
|
985
|
+
return;
|
|
986
|
+
const container = this.getContainerForOption(optionIndex);
|
|
987
|
+
if (!container)
|
|
988
|
+
return;
|
|
989
|
+
try {
|
|
990
|
+
const componentCode = BuildSkipComponentCompleteCode(option.option);
|
|
991
|
+
// Check for unresolved placeholders in the code
|
|
992
|
+
if (componentCode.includes('<<') && componentCode.includes('>>')) {
|
|
993
|
+
const placeholderMatch = componentCode.match(/<<([^>]+)>>/);
|
|
994
|
+
const placeholderName = placeholderMatch ? placeholderMatch[1] : 'Unknown';
|
|
1051
995
|
this.currentError = {
|
|
1052
|
-
type:
|
|
1053
|
-
message:
|
|
1054
|
-
technicalDetails:
|
|
996
|
+
type: 'Incomplete Component',
|
|
997
|
+
message: `This component option contains unresolved placeholders (${placeholderName}). The component generation was not completed successfully.`,
|
|
998
|
+
technicalDetails: `The component code contains placeholder tokens that should have been replaced with actual implementations. This typically happens when the AI generation process was interrupted or encountered an error.\n\nPlaceholder found: <<${placeholderName}>>`
|
|
1055
999
|
};
|
|
1056
|
-
|
|
1000
|
+
return;
|
|
1057
1001
|
}
|
|
1058
|
-
|
|
1002
|
+
const md = new Metadata();
|
|
1003
|
+
const data = this.getFlattenedDataContext();
|
|
1004
|
+
// Create the React component host directly in the tab container
|
|
1005
|
+
const reactHost = new SkipReactComponentHost({
|
|
1006
|
+
componentCode: componentCode,
|
|
1007
|
+
container: container,
|
|
1008
|
+
callbacks: this.callbacks,
|
|
1009
|
+
data: data,
|
|
1010
|
+
utilities: this.SetupUtilities(md),
|
|
1011
|
+
styles: this.SetupStyles()
|
|
1012
|
+
});
|
|
1013
|
+
// Initialize and render the React component
|
|
1014
|
+
await reactHost.initialize();
|
|
1015
|
+
// Cache the host
|
|
1016
|
+
this.reactHostCache.set(optionIndex, reactHost);
|
|
1017
|
+
// Update current index if this is the selected option
|
|
1018
|
+
if (optionIndex === this.selectedReportOptionIndex) {
|
|
1019
|
+
this.currentHostIndex = optionIndex;
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
catch (e) {
|
|
1023
|
+
console.error('Error creating React host:', e);
|
|
1024
|
+
// Determine the type of error and create a user-friendly message
|
|
1025
|
+
let errorType = 'Component Initialization Error';
|
|
1026
|
+
let errorMessage = 'Failed to initialize the React component.';
|
|
1027
|
+
let technicalDetails = e.toString();
|
|
1028
|
+
if (e.message?.includes('JSX transpilation failed')) {
|
|
1029
|
+
errorType = 'Code Compilation Error';
|
|
1030
|
+
errorMessage = 'The component code could not be compiled. This usually indicates a syntax error in the generated code.';
|
|
1031
|
+
technicalDetails = e.message;
|
|
1032
|
+
}
|
|
1033
|
+
else if (e.message?.includes('is not defined')) {
|
|
1034
|
+
errorType = 'Missing Dependency';
|
|
1035
|
+
errorMessage = 'The component is trying to use a feature or library that is not available.';
|
|
1036
|
+
}
|
|
1037
|
+
else if (e.message?.includes('Cannot read properties')) {
|
|
1038
|
+
errorType = 'Property Access Error';
|
|
1039
|
+
errorMessage = 'The component is trying to access data that doesn\'t exist. This often happens when property names don\'t match the data structure.';
|
|
1040
|
+
}
|
|
1041
|
+
this.currentError = {
|
|
1042
|
+
type: errorType,
|
|
1043
|
+
message: errorMessage,
|
|
1044
|
+
technicalDetails: technicalDetails + '\n\nComponent Option: ' + (optionIndex + 1) + '\nComponent Name: ' + option.option.componentName
|
|
1045
|
+
};
|
|
1046
|
+
LogError(e);
|
|
1047
|
+
}
|
|
1059
1048
|
}
|
|
1060
1049
|
getFlattenedDataContext() {
|
|
1061
|
-
var _a;
|
|
1062
1050
|
const flattenedDataContext = {};
|
|
1063
|
-
if (
|
|
1064
|
-
const loadedItems = this.SkipData.dataContext.Items.filter((i) =>
|
|
1051
|
+
if (this.SkipData?.dataContext) {
|
|
1052
|
+
const loadedItems = this.SkipData.dataContext.Items.filter((i) => i.DataLoaded && i._Data?.length > 0);
|
|
1065
1053
|
for (let i = 0; i < loadedItems.length; i++) {
|
|
1066
1054
|
flattenedDataContext["data_item_" + i] = loadedItems[i]._Data;
|
|
1067
1055
|
}
|
|
@@ -1097,14 +1085,13 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
|
|
|
1097
1085
|
// TODO: Implement user state persistence if needed
|
|
1098
1086
|
}
|
|
1099
1087
|
handleNotifyEvent(eventName, eventData) {
|
|
1100
|
-
var _a;
|
|
1101
1088
|
console.log(`Component raised event: ${eventName} notified with data:`, eventData);
|
|
1102
1089
|
// Handle component errors from React host
|
|
1103
1090
|
if (eventName === 'componentError') {
|
|
1104
1091
|
this.currentError = {
|
|
1105
1092
|
type: eventData.source || 'React Component Error',
|
|
1106
1093
|
message: eventData.error || 'An unknown error occurred in the React component',
|
|
1107
|
-
technicalDetails: eventData.stackTrace ||
|
|
1094
|
+
technicalDetails: eventData.stackTrace || eventData.errorInfo?.componentStack || ''
|
|
1108
1095
|
};
|
|
1109
1096
|
}
|
|
1110
1097
|
// TODO: Handle other custom events as needed
|
|
@@ -1226,43 +1213,43 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
|
|
|
1226
1213
|
}
|
|
1227
1214
|
CreateSimpleRunQuery(rq) {
|
|
1228
1215
|
return {
|
|
1229
|
-
runQuery: (params) =>
|
|
1216
|
+
runQuery: async (params) => {
|
|
1230
1217
|
// Run a single query and return the results
|
|
1231
1218
|
try {
|
|
1232
|
-
const result =
|
|
1219
|
+
const result = await rq.RunQuery(params);
|
|
1233
1220
|
return result;
|
|
1234
1221
|
}
|
|
1235
1222
|
catch (error) {
|
|
1236
1223
|
LogError(error);
|
|
1237
1224
|
throw error; // Re-throw to handle it in the caller
|
|
1238
1225
|
}
|
|
1239
|
-
}
|
|
1226
|
+
}
|
|
1240
1227
|
};
|
|
1241
1228
|
}
|
|
1242
1229
|
CreateSimpleRunView(rv) {
|
|
1243
1230
|
return {
|
|
1244
|
-
runView: (params) =>
|
|
1231
|
+
runView: async (params) => {
|
|
1245
1232
|
// Run a single view and return the results
|
|
1246
1233
|
try {
|
|
1247
|
-
const result =
|
|
1234
|
+
const result = await rv.RunView(params);
|
|
1248
1235
|
return result;
|
|
1249
1236
|
}
|
|
1250
1237
|
catch (error) {
|
|
1251
1238
|
LogError(error);
|
|
1252
1239
|
throw error; // Re-throw to handle it in the caller
|
|
1253
1240
|
}
|
|
1254
|
-
}
|
|
1255
|
-
runViews: (params) =>
|
|
1241
|
+
},
|
|
1242
|
+
runViews: async (params) => {
|
|
1256
1243
|
// Runs multiple views and returns the results
|
|
1257
1244
|
try {
|
|
1258
|
-
const results =
|
|
1245
|
+
const results = await rv.RunViews(params);
|
|
1259
1246
|
return results;
|
|
1260
1247
|
}
|
|
1261
1248
|
catch (error) {
|
|
1262
1249
|
LogError(error);
|
|
1263
1250
|
throw error; // Re-throw to handle it in the caller
|
|
1264
1251
|
}
|
|
1265
|
-
}
|
|
1252
|
+
}
|
|
1266
1253
|
};
|
|
1267
1254
|
}
|
|
1268
1255
|
SetupCallbacks() {
|
|
@@ -1304,32 +1291,30 @@ Component Name: ${this.ComponentObjectName || 'Unknown'}`;
|
|
|
1304
1291
|
};
|
|
1305
1292
|
return cb;
|
|
1306
1293
|
}
|
|
1307
|
-
refreshReport(data) {
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
}
|
|
1317
|
-
});
|
|
1294
|
+
async refreshReport(data) {
|
|
1295
|
+
const currentHost = this.getCurrentReactHost();
|
|
1296
|
+
if (currentHost) {
|
|
1297
|
+
currentHost.refresh(data);
|
|
1298
|
+
}
|
|
1299
|
+
else {
|
|
1300
|
+
// If no React host is available, create one for the current option
|
|
1301
|
+
this.createReactHostForOption(this.selectedReportOptionIndex);
|
|
1302
|
+
}
|
|
1318
1303
|
}
|
|
1304
|
+
static ɵfac = function SkipDynamicUIComponentComponent_Factory(t) { return new (t || SkipDynamicUIComponentComponent)(i0.ɵɵdirectiveInject(i1.DomSanitizer), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i0.NgZone)); };
|
|
1305
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SkipDynamicUIComponentComponent, selectors: [["skip-dynamic-ui-component"]], viewQuery: function SkipDynamicUIComponentComponent_Query(rf, ctx) { if (rf & 1) {
|
|
1306
|
+
i0.ɵɵviewQuery(_c0, 5);
|
|
1307
|
+
} if (rf & 2) {
|
|
1308
|
+
let _t;
|
|
1309
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.htmlContainers = _t);
|
|
1310
|
+
} }, hostBindings: function SkipDynamicUIComponentComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
1311
|
+
i0.ɵɵlistener("resize", function SkipDynamicUIComponentComponent_resize_HostBindingHandler() { return ctx.onWindowResize(); }, false, i0.ɵɵresolveWindow);
|
|
1312
|
+
} }, inputs: { UIComponentCode: "UIComponentCode", ComponentObjectName: "ComponentObjectName", ShowPrintReport: "ShowPrintReport", ShowReportOptionsToggle: "ShowReportOptionsToggle", ShowCreateReportButton: "ShowCreateReportButton", matchingReportID: "matchingReportID", SkipData: "SkipData" }, outputs: { DrillDownEvent: "DrillDownEvent", CreateReportRequested: "CreateReportRequested" }, features: [i0.ɵɵNgOnChangesFeature], decls: 2, vars: 1, consts: [["htmlContainer", ""], [2, "height", "100%", "display", "flex", "flex-direction", "column", 3, "keepTabContent"], [2, "height", "100%", "display", "flex", "flex-direction", "column"], [2, "height", "100%", "display", "flex", "flex-direction", "column", 3, "tabSelect", "keepTabContent"], [3, "selected"], ["kendoTabTitle", ""], ["kendoTabContent", ""], [1, "fa-solid", "fa-star", "star-icon"], [1, "tab-action-bar"], [1, "tab-actions-left"], ["title", "Toggle Functional Requirements", 1, "tab-action-button", "toggle-button", 3, "click"], [1, "fa-solid", "fa-list-check"], ["title", "Toggle Data Requirements", 1, "tab-action-button", "toggle-button", 3, "click"], [1, "fa-solid", "fa-database"], ["title", "Toggle Technical Design", 1, "tab-action-button", "toggle-button", 3, "click"], [1, "fa-solid", "fa-cogs"], ["title", "Toggle Code View", 1, "tab-action-button", "toggle-button", 3, "click"], [1, "fa-solid", "fa-code"], [1, "tab-actions-right"], ["class", "tab-action-button create-button", 3, "disabled", "click", 4, "ngIf"], ["class", "tab-action-button print-button", "title", "Print Report", 3, "click", 4, "ngIf"], [2, "flex", "1", "display", "flex", "flex-direction", "column", "min-height", "0", "overflow", "hidden"], [2, "flex", "1", "position", "relative", "min-height", "0", "overflow", "auto"], [2, "top", "0", "left", "0", "right", "0", "bottom", "0", "display", "flex", "align-items", "flex-start", "justify-content", "center", "padding-top", "20px", "background", "rgba(255, 255, 255, 0.95)", "z-index", "10"], [1, "tab-action-button", "create-button", 3, "click", "disabled"], [1, "fa-solid", "fa-plus"], ["title", "Print Report", 1, "tab-action-button", "print-button", 3, "click"], [1, "fa-solid", "fa-print"], [1, "details-panel"], [2, "height", "100%"], [1, "panel-resizer", 3, "mousedown", "touchstart"], [1, "resizer-handle"], [1, "details-content"], [3, "innerHTML"], [1, "details-content", "code-content"], [2, "height", "100%", 3, "value", "autoFocus", "indentWithTab", "readonly"], [2, "width", "90%", "max-width", "600px", "height", "500px", "background-color", "#f8f9fa", "border", "2px solid #dc3545", "border-radius", "8px", "padding", "20px", "overflow-y", "auto", "box-shadow", "0 4px 6px rgba(0, 0, 0, 0.1)"], [2, "position", "relative"], ["kendoButton", "", 2, "position", "absolute", "top", "0", "right", "0", "font-size", "12px", 3, "click"], [1, "fa-solid", "fa-copy"], [2, "color", "#dc3545", "margin-top", "0", "margin-right", "150px", "font-size", "18px"], [1, "fa-solid", "fa-exclamation-triangle"], [2, "margin-bottom", "10px", "font-size", "14px"], [2, "background-color", "#fff", "border", "1px solid #dee2e6", "border-radius", "4px", "padding", "12px", "margin-bottom", "12px", "font-family", "'Courier New', monospace", "font-size", "12px"], [2, "margin-top", "8px"], [2, "background-color", "#e7f3ff", "border", "1px solid #b3d9ff", "border-radius", "4px", "padding", "12px", "margin-bottom", "12px"], [2, "font-size", "14px"], [2, "margin", "8px 0 0 20px", "padding", "0", "font-size", "13px"], ["kendoButton", "", 2, "font-size", "13px", 3, "click"], [1, "fa-solid", "fa-rotate"], [2, "cursor", "pointer", "color", "#0056b3"], [2, "margin-top", "8px", "white-space", "pre-wrap", "word-break", "break-word", "font-size", "11px"], [2, "position", "absolute", "top", "0", "left", "0", "right", "0", "bottom", "0", "display", "flex", "align-items", "flex-start", "justify-content", "center", "padding-top", "20px", "background", "rgba(255, 255, 255, 0.95)", "z-index", "10"]], template: function SkipDynamicUIComponentComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1313
|
+
i0.ɵɵtemplate(0, SkipDynamicUIComponentComponent_Conditional_0_Template, 3, 1, "kendo-tabstrip", 1)(1, SkipDynamicUIComponentComponent_Conditional_1_Template, 27, 12, "div", 2);
|
|
1314
|
+
} if (rf & 2) {
|
|
1315
|
+
i0.ɵɵconditional(ctx.reportOptions.length > 1 ? 0 : 1);
|
|
1316
|
+
} }, dependencies: [i2.NgIf, i3.TabStripComponent, i3.TabStripTabComponent, i3.TabContentDirective, i3.TabTitleDirective, i4.ButtonComponent, i5.CodeEditorComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n position: relative;\n }\n \n \n\n .tab-action-bar[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n background-color: #fafafa;\n border-bottom: 1px solid #e0e0e0;\n }\n \n .tab-actions-left[_ngcontent-%COMP%], \n .tab-actions-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n \n \n\n .tab-action-button[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n background-color: transparent;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: #333;\n transition: all 0.15s ease;\n white-space: nowrap;\n }\n \n .tab-action-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: #f5f5f5;\n border-color: #d0d0d0;\n }\n \n .tab-action-button[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n \n .tab-action-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n \n \n\n .tab-action-button.create-button[_ngcontent-%COMP%], \n .tab-action-button.print-button[_ngcontent-%COMP%] {\n background-color: white;\n color: #333;\n border-color: #e0e0e0;\n }\n \n .tab-action-button.create-button[_ngcontent-%COMP%]:hover:not(:disabled), \n .tab-action-button.print-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: #f5f5f5;\n border-color: #d0d0d0;\n }\n \n \n\n .tab-action-button.toggle-button[_ngcontent-%COMP%] {\n background-color: white;\n color: #666;\n border-color: #e0e0e0;\n }\n \n .tab-action-button.toggle-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: #f5f5f5;\n border-color: #d0d0d0;\n color: #333;\n }\n \n .tab-action-button.toggle-button.active[_ngcontent-%COMP%] {\n background-color: #5B4FE9;\n color: white;\n border-color: #5B4FE9;\n }\n \n .tab-action-button.toggle-button.active[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: #4940D4;\n border-color: #4940D4;\n }\n \n \n\n .details-panel[_ngcontent-%COMP%] {\n border-bottom: 1px solid #e0e0e0;\n background-color: #fafafa;\n overflow: hidden;\n transition: height 0.3s ease;\n }\n \n .details-content[_ngcontent-%COMP%] {\n padding: 16px;\n overflow-y: auto;\n height: 100%;\n font-size: 14px;\n line-height: 1.6;\n }\n \n .details-content.code-content[_ngcontent-%COMP%] {\n padding: 0;\n }\n \n \n\n .panel-resizer[_ngcontent-%COMP%] {\n height: 4px;\n background-color: #e0e0e0;\n cursor: ns-resize;\n position: relative;\n transition: background-color 0.2s ease;\n }\n \n .panel-resizer[_ngcontent-%COMP%]:hover {\n background-color: #d0d0d0;\n }\n \n .resizer-handle[_ngcontent-%COMP%] {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 40px;\n height: 2px;\n background-color: #999;\n border-radius: 1px;\n }\n \n \n\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(h1) { font-size: 1.5em; margin-top: 0; margin-bottom: 0.5em; }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(h2) { font-size: 1.3em; margin-top: 1em; margin-bottom: 0.5em; }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(h3) { font-size: 1.1em; margin-top: 1em; margin-bottom: 0.5em; }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(ul), .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(ol) { margin-left: 1.5em; }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(code) { \n background-color: #f4f4f4; \n padding: 2px 4px; \n border-radius: 3px; \n font-family: 'Courier New', monospace; \n font-size: 0.9em;\n }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(pre) { \n background-color: #f4f4f4; \n padding: 12px; \n border-radius: 4px; \n overflow-x: auto; \n }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(blockquote) { \n border-left: 4px solid #e0e0e0; \n padding-left: 16px; \n margin-left: 0; \n color: #666; \n }\n \n \n\n .k-tabstrip {\n border: none;\n height: 100%;\n display: flex;\n flex-direction: column;\n margin: 10px 5px 5px 5px;\n }\n \n .k-tabstrip-items {\n background: #f8f9fa;\n border: none;\n border-radius: 8px 8px 0 0;\n flex: 0 0 auto;\n padding: 8px 12px 0 12px;\n gap: 4px;\n display: flex;\n }\n \n .k-tabstrip-items-wrapper {\n height: 100%;\n }\n \n .k-content {\n flex: 1;\n overflow: hidden;\n padding: 0;\n background: white;\n border: 1px solid #e0e0e0;\n border-top: none;\n border-radius: 0 0 8px 8px;\n }\n \n .k-tabstrip .k-item {\n margin-right: 2px;\n border: none;\n background: transparent;\n border-radius: 6px 6px 0 0;\n padding: 2px;\n transition: all 0.2s ease;\n }\n \n .k-tabstrip .k-item.k-selected {\n background: white;\n border: 1px solid #e0e0e0;\n border-bottom: 1px solid white;\n margin-bottom: -1px;\n z-index: 1;\n }\n \n .k-tabstrip .k-link {\n padding: 8px 16px;\n font-weight: 500;\n font-size: 13px;\n color: #666;\n transition: all 0.15s ease;\n border-radius: 4px 4px 0 0;\n background: transparent;\n border: none;\n text-transform: lowercase;\n }\n \n .k-tabstrip .k-link:first-letter {\n text-transform: uppercase;\n }\n \n .k-tabstrip .k-item:hover:not(.k-selected) .k-link {\n color: #333;\n background: rgba(0, 0, 0, 0.04);\n }\n \n .k-tabstrip .k-item.k-selected .k-link {\n color: #1976d2;\n font-weight: 600;\n background: white;\n }\n \n \n\n .k-tabstrip .k-link .star-icon {\n display: inline-block;\n margin-right: 4px;\n color: #ffd700;\n font-size: 12px;\n vertical-align: middle;\n }\n \n \n\n .k-tabstrip-items::before, \n .k-tabstrip-items::after {\n display: none;\n }\n \n .k-tabstrip .k-item::before, \n .k-tabstrip .k-item::after {\n display: none;\n }\n \n \n\n .k-tabstrip .k-link:focus {\n outline: none;\n box-shadow: none;\n }\n \n \n\n .k-tabstrip .k-content.k-state-active {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n \n \n\n .react-host-container[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n }"] });
|
|
1319
1317
|
}
|
|
1320
|
-
SkipDynamicUIComponentComponent.ɵfac = function SkipDynamicUIComponentComponent_Factory(t) { return new (t || SkipDynamicUIComponentComponent)(i0.ɵɵdirectiveInject(i1.DomSanitizer), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i0.NgZone)); };
|
|
1321
|
-
SkipDynamicUIComponentComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: SkipDynamicUIComponentComponent, selectors: [["skip-dynamic-ui-component"]], viewQuery: function SkipDynamicUIComponentComponent_Query(rf, ctx) { if (rf & 1) {
|
|
1322
|
-
i0.ɵɵviewQuery(_c0, 5);
|
|
1323
|
-
} if (rf & 2) {
|
|
1324
|
-
let _t;
|
|
1325
|
-
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.htmlContainers = _t);
|
|
1326
|
-
} }, hostBindings: function SkipDynamicUIComponentComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
1327
|
-
i0.ɵɵlistener("resize", function SkipDynamicUIComponentComponent_resize_HostBindingHandler() { return ctx.onWindowResize(); }, false, i0.ɵɵresolveWindow);
|
|
1328
|
-
} }, inputs: { UIComponentCode: "UIComponentCode", ComponentObjectName: "ComponentObjectName", ShowPrintReport: "ShowPrintReport", ShowReportOptionsToggle: "ShowReportOptionsToggle", ShowCreateReportButton: "ShowCreateReportButton", matchingReportID: "matchingReportID", SkipData: "SkipData" }, outputs: { DrillDownEvent: "DrillDownEvent", CreateReportRequested: "CreateReportRequested" }, features: [i0.ɵɵNgOnChangesFeature], decls: 2, vars: 1, consts: [["htmlContainer", ""], [2, "height", "100%", "display", "flex", "flex-direction", "column", 3, "keepTabContent"], [2, "height", "100%", "display", "flex", "flex-direction", "column"], [2, "height", "100%", "display", "flex", "flex-direction", "column", 3, "tabSelect", "keepTabContent"], [3, "selected"], ["kendoTabTitle", ""], ["kendoTabContent", ""], [1, "fa-solid", "fa-star", "star-icon"], [1, "tab-action-bar"], [1, "tab-actions-left"], ["title", "Toggle Functional Requirements", 1, "tab-action-button", "toggle-button", 3, "click"], [1, "fa-solid", "fa-list-check"], ["title", "Toggle Data Requirements", 1, "tab-action-button", "toggle-button", 3, "click"], [1, "fa-solid", "fa-database"], ["title", "Toggle Technical Design", 1, "tab-action-button", "toggle-button", 3, "click"], [1, "fa-solid", "fa-cogs"], ["title", "Toggle Code View", 1, "tab-action-button", "toggle-button", 3, "click"], [1, "fa-solid", "fa-code"], [1, "tab-actions-right"], ["class", "tab-action-button create-button", 3, "disabled", "click", 4, "ngIf"], ["class", "tab-action-button print-button", "title", "Print Report", 3, "click", 4, "ngIf"], [2, "flex", "1", "display", "flex", "flex-direction", "column", "min-height", "0", "overflow", "hidden"], [2, "flex", "1", "position", "relative", "min-height", "0", "overflow", "auto"], [2, "top", "0", "left", "0", "right", "0", "bottom", "0", "display", "flex", "align-items", "flex-start", "justify-content", "center", "padding-top", "20px", "background", "rgba(255, 255, 255, 0.95)", "z-index", "10"], [1, "tab-action-button", "create-button", 3, "click", "disabled"], [1, "fa-solid", "fa-plus"], ["title", "Print Report", 1, "tab-action-button", "print-button", 3, "click"], [1, "fa-solid", "fa-print"], [1, "details-panel"], [2, "height", "100%"], [1, "panel-resizer", 3, "mousedown", "touchstart"], [1, "resizer-handle"], [1, "details-content"], [3, "innerHTML"], [1, "details-content", "code-content"], [2, "height", "100%", 3, "value", "autoFocus", "indentWithTab", "readonly"], [2, "width", "90%", "max-width", "600px", "height", "500px", "background-color", "#f8f9fa", "border", "2px solid #dc3545", "border-radius", "8px", "padding", "20px", "overflow-y", "auto", "box-shadow", "0 4px 6px rgba(0, 0, 0, 0.1)"], [2, "position", "relative"], ["kendoButton", "", 2, "position", "absolute", "top", "0", "right", "0", "font-size", "12px", 3, "click"], [1, "fa-solid", "fa-copy"], [2, "color", "#dc3545", "margin-top", "0", "margin-right", "150px", "font-size", "18px"], [1, "fa-solid", "fa-exclamation-triangle"], [2, "margin-bottom", "10px", "font-size", "14px"], [2, "background-color", "#fff", "border", "1px solid #dee2e6", "border-radius", "4px", "padding", "12px", "margin-bottom", "12px", "font-family", "'Courier New', monospace", "font-size", "12px"], [2, "margin-top", "8px"], [2, "background-color", "#e7f3ff", "border", "1px solid #b3d9ff", "border-radius", "4px", "padding", "12px", "margin-bottom", "12px"], [2, "font-size", "14px"], [2, "margin", "8px 0 0 20px", "padding", "0", "font-size", "13px"], ["kendoButton", "", 2, "font-size", "13px", 3, "click"], [1, "fa-solid", "fa-rotate"], [2, "cursor", "pointer", "color", "#0056b3"], [2, "margin-top", "8px", "white-space", "pre-wrap", "word-break", "break-word", "font-size", "11px"], [2, "position", "absolute", "top", "0", "left", "0", "right", "0", "bottom", "0", "display", "flex", "align-items", "flex-start", "justify-content", "center", "padding-top", "20px", "background", "rgba(255, 255, 255, 0.95)", "z-index", "10"]], template: function SkipDynamicUIComponentComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1329
|
-
i0.ɵɵtemplate(0, SkipDynamicUIComponentComponent_Conditional_0_Template, 3, 1, "kendo-tabstrip", 1)(1, SkipDynamicUIComponentComponent_Conditional_1_Template, 27, 12, "div", 2);
|
|
1330
|
-
} if (rf & 2) {
|
|
1331
|
-
i0.ɵɵconditional(ctx.reportOptions.length > 1 ? 0 : 1);
|
|
1332
|
-
} }, dependencies: [i2.NgIf, i3.TabStripComponent, i3.TabStripTabComponent, i3.TabContentDirective, i3.TabTitleDirective, i4.ButtonComponent, i5.CodeEditorComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n position: relative;\n }\n \n \n\n .tab-action-bar[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 8px 12px;\n background-color: #fafafa;\n border-bottom: 1px solid #e0e0e0;\n }\n \n .tab-actions-left[_ngcontent-%COMP%], \n .tab-actions-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n \n \n\n .tab-action-button[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 14px;\n background-color: transparent;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: #333;\n transition: all 0.15s ease;\n white-space: nowrap;\n }\n \n .tab-action-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: #f5f5f5;\n border-color: #d0d0d0;\n }\n \n .tab-action-button[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n \n .tab-action-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n \n \n\n .tab-action-button.create-button[_ngcontent-%COMP%], \n .tab-action-button.print-button[_ngcontent-%COMP%] {\n background-color: white;\n color: #333;\n border-color: #e0e0e0;\n }\n \n .tab-action-button.create-button[_ngcontent-%COMP%]:hover:not(:disabled), \n .tab-action-button.print-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: #f5f5f5;\n border-color: #d0d0d0;\n }\n \n \n\n .tab-action-button.toggle-button[_ngcontent-%COMP%] {\n background-color: white;\n color: #666;\n border-color: #e0e0e0;\n }\n \n .tab-action-button.toggle-button[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: #f5f5f5;\n border-color: #d0d0d0;\n color: #333;\n }\n \n .tab-action-button.toggle-button.active[_ngcontent-%COMP%] {\n background-color: #5B4FE9;\n color: white;\n border-color: #5B4FE9;\n }\n \n .tab-action-button.toggle-button.active[_ngcontent-%COMP%]:hover:not(:disabled) {\n background-color: #4940D4;\n border-color: #4940D4;\n }\n \n \n\n .details-panel[_ngcontent-%COMP%] {\n border-bottom: 1px solid #e0e0e0;\n background-color: #fafafa;\n overflow: hidden;\n transition: height 0.3s ease;\n }\n \n .details-content[_ngcontent-%COMP%] {\n padding: 16px;\n overflow-y: auto;\n height: 100%;\n font-size: 14px;\n line-height: 1.6;\n }\n \n .details-content.code-content[_ngcontent-%COMP%] {\n padding: 0;\n }\n \n \n\n .panel-resizer[_ngcontent-%COMP%] {\n height: 4px;\n background-color: #e0e0e0;\n cursor: ns-resize;\n position: relative;\n transition: background-color 0.2s ease;\n }\n \n .panel-resizer[_ngcontent-%COMP%]:hover {\n background-color: #d0d0d0;\n }\n \n .resizer-handle[_ngcontent-%COMP%] {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 40px;\n height: 2px;\n background-color: #999;\n border-radius: 1px;\n }\n \n \n\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(h1) { font-size: 1.5em; margin-top: 0; margin-bottom: 0.5em; }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(h2) { font-size: 1.3em; margin-top: 1em; margin-bottom: 0.5em; }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(h3) { font-size: 1.1em; margin-top: 1em; margin-bottom: 0.5em; }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(ul), .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(ol) { margin-left: 1.5em; }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(code) { \n background-color: #f4f4f4; \n padding: 2px 4px; \n border-radius: 3px; \n font-family: 'Courier New', monospace; \n font-size: 0.9em;\n }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(pre) { \n background-color: #f4f4f4; \n padding: 12px; \n border-radius: 4px; \n overflow-x: auto; \n }\n .details-content[_ngcontent-%COMP%] [_ngcontent-%COMP%]:deep(blockquote) { \n border-left: 4px solid #e0e0e0; \n padding-left: 16px; \n margin-left: 0; \n color: #666; \n }\n \n \n\n .k-tabstrip {\n border: none;\n height: 100%;\n display: flex;\n flex-direction: column;\n margin: 10px 5px 5px 5px;\n }\n \n .k-tabstrip-items {\n background: #f8f9fa;\n border: none;\n border-radius: 8px 8px 0 0;\n flex: 0 0 auto;\n padding: 8px 12px 0 12px;\n gap: 4px;\n display: flex;\n }\n \n .k-tabstrip-items-wrapper {\n height: 100%;\n }\n \n .k-content {\n flex: 1;\n overflow: hidden;\n padding: 0;\n background: white;\n border: 1px solid #e0e0e0;\n border-top: none;\n border-radius: 0 0 8px 8px;\n }\n \n .k-tabstrip .k-item {\n margin-right: 2px;\n border: none;\n background: transparent;\n border-radius: 6px 6px 0 0;\n padding: 2px;\n transition: all 0.2s ease;\n }\n \n .k-tabstrip .k-item.k-selected {\n background: white;\n border: 1px solid #e0e0e0;\n border-bottom: 1px solid white;\n margin-bottom: -1px;\n z-index: 1;\n }\n \n .k-tabstrip .k-link {\n padding: 8px 16px;\n font-weight: 500;\n font-size: 13px;\n color: #666;\n transition: all 0.15s ease;\n border-radius: 4px 4px 0 0;\n background: transparent;\n border: none;\n text-transform: lowercase;\n }\n \n .k-tabstrip .k-link:first-letter {\n text-transform: uppercase;\n }\n \n .k-tabstrip .k-item:hover:not(.k-selected) .k-link {\n color: #333;\n background: rgba(0, 0, 0, 0.04);\n }\n \n .k-tabstrip .k-item.k-selected .k-link {\n color: #1976d2;\n font-weight: 600;\n background: white;\n }\n \n \n\n .k-tabstrip .k-link .star-icon {\n display: inline-block;\n margin-right: 4px;\n color: #ffd700;\n font-size: 12px;\n vertical-align: middle;\n }\n \n \n\n .k-tabstrip-items::before, \n .k-tabstrip-items::after {\n display: none;\n }\n \n .k-tabstrip .k-item::before, \n .k-tabstrip .k-item::after {\n display: none;\n }\n \n \n\n .k-tabstrip .k-link:focus {\n outline: none;\n box-shadow: none;\n }\n \n \n\n .k-tabstrip .k-content.k-state-active {\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n \n \n\n .react-host-container[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n }"] });
|
|
1333
1318
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SkipDynamicUIComponentComponent, [{
|
|
1334
1319
|
type: Component,
|
|
1335
1320
|
args: [{ selector: 'skip-dynamic-ui-component', template: `
|