@ruc-lib/org-chart 2.0.3 → 3.1.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.
@@ -1,182 +0,0 @@
1
- import { jsPDF } from 'jspdf';
2
- import html2canvas from 'html2canvas';
3
- export const downloadChart = (chartContainer, format) => {
4
- if (!chartContainer) {
5
- console.error('Chart container not found!');
6
- return;
7
- }
8
- // Capture the chart container as an image (either PNG or JPEG)
9
- if (format === 'pdf') {
10
- createPDF(chartContainer);
11
- }
12
- else {
13
- captureElementAsImage(chartContainer, format)
14
- .then((imgData) => {
15
- downloadImage(imgData, format); // Download as PNG or JPEG
16
- })
17
- .catch(handleCanvasError);
18
- }
19
- };
20
- // Capture the element as an image and return a promise
21
- export const captureElementAsImage = (element, format) => {
22
- return new Promise((resolve, reject) => {
23
- html2canvas(element, {
24
- useCORS: true,
25
- scrollX: 0,
26
- scrollY: -window.scrollY,
27
- logging: false,
28
- backgroundColor: null,
29
- })
30
- .then((canvas) => {
31
- const imgData = canvas.toDataURL(`image/${format}`);
32
- resolve(imgData);
33
- })
34
- .catch((error) => reject(error));
35
- });
36
- };
37
- // Downloads the org chart as a PDF document.
38
- export const createPDF = (element) => {
39
- html2canvas(element, {
40
- useCORS: true,
41
- scale: 4,
42
- scrollX: 0,
43
- scrollY: -window.scrollY,
44
- logging: false,
45
- backgroundColor: null,
46
- })
47
- .then((canvas) => {
48
- const imgData = canvas.toDataURL('image/png'); // Capture as PNG (or you can use JPEG)
49
- const pdf = new jsPDF('p', 'mm', 'a4'); // Standard A4 page size
50
- // Get the dimensions of the PDF page
51
- const pdfWidth = pdf.internal.pageSize.width;
52
- const pdfHeight = pdf.internal.pageSize.height;
53
- const canvasWidth = canvas.width;
54
- const canvasHeight = canvas.height;
55
- const aspectRatio = canvasWidth / canvasHeight;
56
- let imgWidth = pdfWidth;
57
- let imgHeight = pdfWidth / aspectRatio;
58
- // If the image height exceeds the PDF page height, adjust it
59
- if (imgHeight > pdfHeight) {
60
- imgHeight = pdfHeight;
61
- imgWidth = pdfHeight * aspectRatio;
62
- }
63
- // Add the image to the PDF
64
- pdf.addImage(imgData, 'PNG', 0, 20, imgWidth, imgHeight); // Fit image on PDF page
65
- pdf.save('organization-chart.pdf'); // Download the PDF
66
- })
67
- .catch(handleCanvasError);
68
- };
69
- // Download the captured image in the required format (PNG/JPEG)
70
- export const downloadImage = (imgData, format) => {
71
- const link = document.createElement('a');
72
- link.href = imgData;
73
- link.download = `organization-chart.${format}`;
74
- link.click();
75
- };
76
- // Error handler for any issues during canvas generation or file creation
77
- export const handleCanvasError = (error) => {
78
- console.error('Error generating file:', error);
79
- };
80
- export const checkPropsType = (props) => {
81
- if (props.isDisplayHambergerMenu !== undefined && typeof props.isDisplayHambergerMenu !== 'boolean') {
82
- console.error('Error: isDisplayHambergerMenu should be a boolean.');
83
- }
84
- if (props.isDisplaySearchBar !== undefined && typeof props.isDisplaySearchBar !== 'boolean') {
85
- console.error('Error: isDisplaySearchBar should be a boolean.');
86
- }
87
- if (!['portrait', 'triangle', 'landscape'].includes(props.nodeTemplate)) {
88
- console.error('Error: nodeTemplate should be "portrait", "triangle", or "landscape".');
89
- }
90
- if (!Array.isArray(props.hambergerMenuList)) {
91
- console.error('Error: hambergerMenuList should be an array.');
92
- }
93
- else {
94
- props.hambergerMenuList.forEach(item => {
95
- if (typeof item.label !== 'string') {
96
- console.error('Error: hambergerMenuList label should be a string.');
97
- }
98
- if (typeof item.id !== 'number') {
99
- console.error('Error: hambergerMenuList id should be a number.');
100
- }
101
- });
102
- }
103
- // Check if greyNodeStyle is of type CustomNodeStyle
104
- const greyNodeStyle = props.greyNodeStyle;
105
- if (greyNodeStyle) {
106
- if (greyNodeStyle.backgroundColor && typeof greyNodeStyle.backgroundColor !== 'string') {
107
- console.error('Error: greyNodeStyle.backgroundColor should be a string.');
108
- }
109
- if (greyNodeStyle.color && typeof greyNodeStyle.color !== 'string') {
110
- console.error('Error: greyNodeStyle.color should be a string.');
111
- }
112
- if (greyNodeStyle.padding && typeof greyNodeStyle.padding !== 'string') {
113
- console.error('Error: greyNodeStyle.padding should be a string.');
114
- }
115
- if (greyNodeStyle.borderRadius && typeof greyNodeStyle.borderRadius !== 'string') {
116
- console.error('Error: greyNodeStyle.borderRadius should be a string.');
117
- }
118
- }
119
- // Check if orgData is an array of OrgDataItem objects
120
- if (!Array.isArray(props.orgData)) {
121
- console.error('Error: orgData should be an array.');
122
- }
123
- else {
124
- props.orgData.forEach(item => checkOrgDataItem(item));
125
- }
126
- };
127
- export const checkOrgDataItem = (item) => {
128
- if (item.label !== undefined && typeof item.label !== 'string') {
129
- console.error('Error: OrgDataItem label should be a string.');
130
- }
131
- if (item.expanded !== undefined && typeof item.expanded !== 'boolean') {
132
- console.error('Error: OrgDataItem expanded should be a boolean.');
133
- }
134
- if (item.description !== undefined && typeof item.description !== 'string') {
135
- console.error('Error: OrgDataItem description should be a string.');
136
- }
137
- if (item.customNodeStyle !== undefined) {
138
- const customNodeStyle = item.customNodeStyle;
139
- if (customNodeStyle.backgroundColor && typeof customNodeStyle.backgroundColor !== 'string') {
140
- console.error('Error: customNodeStyle.backgroundColor should be a string.');
141
- }
142
- if (customNodeStyle.color && typeof customNodeStyle.color !== 'string') {
143
- console.error('Error: customNodeStyle.color should be a string.');
144
- }
145
- if (customNodeStyle.padding && typeof customNodeStyle.padding !== 'string') {
146
- console.error('Error: customNodeStyle.padding should be a string.');
147
- }
148
- if (customNodeStyle.borderRadius && typeof customNodeStyle.borderRadius !== 'string') {
149
- console.error('Error: customNodeStyle.borderRadius should be a string.');
150
- }
151
- }
152
- if (item.data) {
153
- if (item.data.image !== undefined && typeof item.data.image !== 'string') {
154
- console.error('Error: OrgDataItem data.image should be a string.');
155
- }
156
- if (item.data.name !== undefined && typeof item.data.name !== 'string') {
157
- console.error('Error: OrgDataItem data.name should be a string.');
158
- }
159
- if (typeof item.data.title !== 'string') {
160
- console.error('Error: OrgDataItem data.title should be a string.');
161
- }
162
- }
163
- if (item.children && Array.isArray(item.children)) {
164
- item.children.forEach(child => checkOrgDataItem(child)); // Recursive call for children
165
- }
166
- if (item.originalStyle) {
167
- const originalStyle = item.originalStyle;
168
- if (originalStyle.backgroundColor && typeof originalStyle.backgroundColor !== 'string') {
169
- console.error('Error: originalStyle.backgroundColor should be a string.');
170
- }
171
- if (originalStyle.color && typeof originalStyle.color !== 'string') {
172
- console.error('Error: originalStyle.color should be a string.');
173
- }
174
- if (originalStyle.padding && typeof originalStyle.padding !== 'string') {
175
- console.error('Error: originalStyle.padding should be a string.');
176
- }
177
- if (originalStyle.borderRadius && typeof originalStyle.borderRadius !== 'string') {
178
- console.error('Error: originalStyle.borderRadius should be a string.');
179
- }
180
- }
181
- };
182
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtZG93bmxvYWQudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9jaGFydC1kb3dubG9hZC51dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDOUIsT0FBTyxXQUFXLE1BQU0sYUFBYSxDQUFDO0FBSXRDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLGNBQTJCLEVBQUUsTUFBOEIsRUFBUSxFQUFFO0lBQ2pHLElBQUksQ0FBQyxjQUFjLEVBQUU7UUFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQzVDLE9BQU87S0FDUjtJQUVELCtEQUErRDtJQUMvRCxJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUU7UUFDcEIsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0tBQzNCO1NBQU07UUFDTCxxQkFBcUIsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDO2FBQzFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2hCLGFBQWEsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQywwQkFBMEI7UUFDNUQsQ0FBQyxDQUFDO2FBQ0QsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7S0FDN0I7QUFDSCxDQUFDLENBQUE7QUFFRCx1REFBdUQ7QUFDdkQsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxPQUFvQixFQUFFLE1BQXNCLEVBQW1CLEVBQUU7SUFDckcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyxXQUFXLENBQUMsT0FBTyxFQUFFO1lBQ25CLE9BQU8sRUFBRSxJQUFJO1lBQ2IsT0FBTyxFQUFFLENBQUM7WUFDVixPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTztZQUN4QixPQUFPLEVBQUUsS0FBSztZQUNk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YUFBYSxDQUFDLFlBQVksS0FBSyxRQUFRLEVBQUU7WUFDaEYsT0FBTyxDQUFDLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1NBQ3hFO0tBQ0Y7QUFDSCxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqc1BERiB9IGZyb20gJ2pzcGRmJztcclxuaW1wb3J0IGh0bWwyY2FudmFzIGZyb20gJ2h0bWwyY2FudmFzJztcclxuaW1wb3J0IHsgT3JnRGF0YSwgT3JnRGF0YUl0ZW0gfSBmcm9tICcuLi9pbnRlcmZhY2VzL29yZy1jaGFydCc7XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IGRvd25sb2FkQ2hhcnQgPSAoY2hhcnRDb250YWluZXI6IEhUTUxFbGVtZW50LCBmb3JtYXQ6ICdwbmcnIHwgJ2pwZWcnIHwgJ3BkZicpOiB2b2lkID0+IHtcclxuICBpZiAoIWNoYXJ0Q29udGFpbmVyKSB7XHJcbiAgICBjb25zb2xlLmVycm9yKCdDaGFydCBjb250YWluZXIgbm90IGZvdW5kIScpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgLy8gQ2FwdHVyZSB0aGUgY2hhcnQgY29udGFpbmVyIGFzIGFuIGltYWdlIChlaXRoZXIgUE5HIG9yIEpQRUcpXHJcbiAgaWYgKGZvcm1hdCA9PT0gJ3BkZicpIHtcclxuICAgIGNyZWF0ZVBERihjaGFydENvbnRhaW5lcik7XHJcbiAgfSBlbHNlIHtcclxuICAgIGNhcHR1cmVFbGVtZW50QXNJbWFnZShjaGFydENvbnRhaW5lciwgZm9ybWF0KVxyXG4gICAgICAudGhlbigoaW1nRGF0YSkgPT4ge1xyXG4gICAgICAgIGRvd25sb2FkSW1hZ2UoaW1nRGF0YSwgZm9ybWF0KTsgLy8gRG93bmxvYWQgYXMgUE5HIG9yIEpQRUdcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKGhhbmRsZUNhbnZhc0Vycm9yKTtcclxuICB9XHJcbn1cclxuXHJcbi8vIENhcHR1cmUgdGhlIGVsZW1lbnQgYXMgYW4gaW1hZ2UgYW5kIHJldHVybiBhIHByb21pc2VcclxuZXhwb3J0IGNvbnN0IGNhcHR1cmVFbGVtZW50QXNJbWFnZSA9IChlbGVtZW50OiBIVE1MRWxlbWVudCwgZm9ybWF0OiAncG5nJyB8ICdqcGVnJyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgIGh0bWwyY2FudmFzKGVsZW1lbnQsIHtcclxuICAgICAgdXNlQ09SUzogdHJ1ZSxcclxuICAgICAgc2Nyb2xsWDogMCxcclxuICAgICAgc2Nyb2xsWTogLXdpbmRvdy5zY3JvbGxZLFxyXG4gICAgICBsb2dnaW5nOiBmYWxzZSxcclxuICAgICAgYmFja2dyb3VuZENvbG9yOiBudWxsLFxyXG4gICAgfSlcclxuICAgICAgLnRoZW4oKGNhbnZhcykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGltZ0RhdGEgPSBjYW52YXMudG9EYXRhVVJMKGBpbWFnZS8ke2Zvcm1hdH1gKTtcclxuICAgICAgICByZXNvbHZlKGltZ0RhdGEpO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiByZWplY3QoZXJyb3IpKTtcclxuICB9KTtcclxufVxyXG5cclxuLy8gRG93bmxvYWRzIHRoZSBvcmcgY2hhcnQgYXMgYSBQREYgZG9jdW1lbnQuXHJcbmV4cG9ydCBjb25zdCBjcmVhdGVQREYgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkID0+IHtcclxuICBodG1sMmNhbnZhcyhlbGVtZW50LCB7XHJcbiAgICB1c2VDT1JTOiB0cnVlLFxyXG4gICAgc2NhbGU6IDQsIFxyXG4gICAgc2Nyb2xsWDogMCxcclxuICAgIHNjcm9sbFk6IC13aW5kb3cuc2Nyb2xsWSxcclxuICAgIGxvZ2dpbmc6IGZhbHNlLFxyXG4gICAgYmFja2dyb3VuZENvbG9yOiBudWxsLFxyXG4gIH0pXHJcbiAgICAudGhlbigoY2FudmFzKSA9PiB7XHJcbiAgICAgIGNvbnN0IGltZ0RhdGEgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTsgLy8gQ2FwdHVyZSBhcyBQTkcgKG9yIHlvdSBjYW4gdXNlIEpQRUcpXHJcbiAgICAgIGNvbnN0IHBkZiA9IG5ldyBqc1BERigncCcsICdtbScsICdhNCcpOyAvLyBTdGFuZGFyZCBBNCBwYWdlIHNpemVcclxuXHJcbiAgICAgIC8vIEdldCB0aGUgZGltZW5zaW9ucyBvZiB0aGUgUERGIHBhZ2VcclxuICAgICAgY29uc3QgcGRmV2lkdGggPSBwZGYuaW50ZXJuYWwucGFnZVNpemUud2lkdGg7XHJcbiAgICAgIGNvbnN0IHBkZkhlaWdodCA9IHBkZi5pbnRlcm5hbC5wYWdlU2l6ZS5oZWlnaHQ7XHJcblxyXG4gICAgICBjb25zdCBjYW52YXNXaWR0aCA9IGNhbnZhcy53aWR0aDtcclxuICAgICAgY29uc3QgY2FudmFzSGVpZ2h0ID0gY2FudmFzLmhlaWdodDtcclxuXHJcbiAgICAgIGNvbnN0IGFzcGVjdFJhdGlvID0gY2FudmFzV2lkdGggLyBjYW52YXNIZWlnaHQ7XHJcblxyXG4gICAgICBsZXQgaW1nV2lkdGggPSBwZGZXaWR0aDtcclxuICAgICAgbGV0IGltZ0hlaWdodCA9IHBkZldpZHRoIC8gYXNwZWN0UmF0aW87XHJcblxyXG4gICAgICAvLyBJZiB0aGUgaW1hZ2UgaGVpZ2h0IGV4Y2VlZHMgdGhlIFBERiBwYWdlIGhlaWdodCwgYWRqdXN0IGl0XHJcbiAgICAgIGlmIChpbWdIZWlnaHQgPiBwZGZIZWlnaHQpIHtcclxuICAgICAgICBpbWdIZWlnaHQgPSBwZGZIZWlnaHQ7XHJcbiAgICAgICAgaW1nV2lkdGggPSBwZGZIZWlnaHQgKiBhc3BlY3RSYXRpbztcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gQWRkIHRoZSBpbWFnZSB0byB0aGUgUERGXHJcbiAgICAgIHBkZi5hZGRJbWFnZShpbWdEYXRhLCAnUE5HJywgMCwgMjAsIGltZ1dpZHRoLCBpbWdIZWlnaHQpOyAvLyBGaXQgaW1hZ2Ugb24gUERGIHBhZ2VcclxuICAgICAgcGRmLnNhdmUoJ29yZ2FuaXphdGlvbi1jaGFydC5wZGYnKTsgLy8gRG93bmxvYWQgdGhlIFBERlxyXG4gICAgfSlcclxuICAgIC5jYXRjaChoYW5kbGVDYW52YXNFcnJvcik7XHJcbn1cclxuXHJcbi8vIERvd25sb2FkIHRoZSBjYXB0dXJlZCBpbWFnZSBpbiB0aGUgcmVxdWlyZWQgZm9ybWF0IChQTkcvSlBFRylcclxuZXhwb3J0IGNvbnN0IGRvd25sb2FkSW1hZ2UgPSAoaW1nRGF0YTogc3RyaW5nLCBmb3JtYXQ6ICdwbmcnIHwgJ2pwZWcnKTogdm9pZCA9PiB7XHJcbiAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICBsaW5rLmhyZWYgPSBpbWdEYXRhO1xyXG4gIGxpbmsuZG93bmxvYWQgPSBgb3JnYW5pemF0aW9uLWNoYXJ0LiR7Zm9ybWF0fWA7XHJcbiAgbGluay5jbGljaygpO1xyXG59XHJcblxyXG4vLyBFcnJvciBoYW5kbGVyIGZvciBhbnkgaXNzdWVzIGR1cmluZyBjYW52YXMgZ2VuZXJhdGlvbiBvciBmaWxlIGNyZWF0aW9uXHJcbmV4cG9ydCBjb25zdCBoYW5kbGVDYW52YXNFcnJvciA9IChlcnJvcjogYW55KTogdm9pZCA9PiB7XHJcbiAgY29uc29sZS5lcnJvcignRXJyb3IgZ2VuZXJhdGluZyBmaWxlOicsIGVycm9yKTtcclxufVxyXG5cclxuICBcclxuZXhwb3J0IGNvbnN0IGNoZWNrUHJvcHNUeXBlID0gKHByb3BzOiBPcmdEYXRhKTogdm9pZCA9PiB7XHJcbiAgICBpZiAocHJvcHMuaXNEaXNwbGF5SGFtYmVyZ2VyTWVudSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBwcm9wcy5pc0Rpc3BsYXlIYW1iZXJnZXJNZW51ICE9PSAnYm9vbGVhbicpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IGlzRGlzcGxheUhhbWJlcmdlck1lbnUgc2hvdWxkIGJlIGEgYm9vbGVhbi4nKTtcclxuICAgIH1cclxuICBcclxuICAgIGlmIChwcm9wcy5pc0Rpc3BsYXlTZWFyY2hCYXIgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgcHJvcHMuaXNEaXNwbGF5U2VhcmNoQmFyICE9PSAnYm9vbGVhbicpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IGlzRGlzcGxheVNlYXJjaEJhciBzaG91bGQgYmUgYSBib29sZWFuLicpO1xyXG4gICAgfVxyXG4gIFxyXG4gICAgaWYgKCFbJ3BvcnRyYWl0JywgJ3RyaWFuZ2xlJywgJ2xhbmRzY2FwZSddLmluY2x1ZGVzKHByb3BzLm5vZGVUZW1wbGF0ZSkpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IG5vZGVUZW1wbGF0ZSBzaG91bGQgYmUgXCJwb3J0cmFpdFwiLCBcInRyaWFuZ2xlXCIsIG9yIFwibGFuZHNjYXBlXCIuJyk7XHJcbiAgICB9XHJcbiAgXHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJvcHMuaGFtYmVyZ2VyTWVudUxpc3QpKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBoYW1iZXJnZXJNZW51TGlzdCBzaG91bGQgYmUgYW4gYXJyYXkuJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwcm9wcy5oYW1iZXJnZXJNZW51TGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgaXRlbS5sYWJlbCAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBoYW1iZXJnZXJNZW51TGlzdCBsYWJlbCBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgaXRlbS5pZCAhPT0gJ251bWJlcicpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBoYW1iZXJnZXJNZW51TGlzdCBpZCBzaG91bGQgYmUgYSBudW1iZXIuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICBcclxuICAgIC8vIENoZWNrIGlmIGdyZXlOb2RlU3R5bGUgaXMgb2YgdHlwZSBDdXN0b21Ob2RlU3R5bGVcclxuICAgIGNvbnN0IGdyZXlOb2RlU3R5bGUgPSBwcm9wcy5ncmV5Tm9kZVN0eWxlO1xyXG4gICAgaWYgKGdyZXlOb2RlU3R5bGUpIHtcclxuICAgICAgaWYgKGdyZXlOb2RlU3R5bGUuYmFja2dyb3VuZENvbG9yICYmIHR5cGVvZiBncmV5Tm9kZVN0eWxlLmJhY2tncm91bmRDb2xvciAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogZ3JleU5vZGVTdHlsZS5iYWNrZ3JvdW5kQ29sb3Igc2hvdWxkIGJlIGEgc3RyaW5nLicpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChncmV5Tm9kZVN0eWxlLmNvbG9yICYmIHR5cGVvZiBncmV5Tm9kZVN0eWxlLmNvbG9yICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBncmV5Tm9kZVN0eWxlLmNvbG9yIHNob3VsZCBiZSBhIHN0cmluZy4nKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZ3JleU5vZGVTdHlsZS5wYWRkaW5nICYmIHR5cGVvZiBncmV5Tm9kZVN0eWxlLnBhZGRpbmcgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IGdyZXlOb2RlU3R5bGUucGFkZGluZyBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGdyZXlOb2RlU3R5bGUuYm9yZGVyUmFkaXVzICYmIHR5cGVvZiBncmV5Tm9kZVN0eWxlLmJvcmRlclJhZGl1cyAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogZ3JleU5vZGVTdHlsZS5ib3JkZXJSYWRpdXMgc2hvdWxkIGJlIGEgc3RyaW5nLicpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgXHJcbiAgICAvLyBDaGVjayBpZiBvcmdEYXRhIGlzIGFuIGFycmF5IG9mIE9yZ0RhdGFJdGVtIG9iamVjdHNcclxuICAgIGlmICghQXJyYXkuaXNBcnJheShwcm9wcy5vcmdEYXRhKSkge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogb3JnRGF0YSBzaG91bGQgYmUgYW4gYXJyYXkuJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwcm9wcy5vcmdEYXRhLmZvckVhY2goaXRlbSA9PiBjaGVja09yZ0RhdGFJdGVtKGl0ZW0pKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gICBleHBvcnQgY29uc3QgY2hlY2tPcmdEYXRhSXRlbSA9IChpdGVtOiBPcmdEYXRhSXRlbSk6IHZvaWQgPT4ge1xyXG4gICAgICBpZiAoaXRlbS5sYWJlbCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBpdGVtLmxhYmVsICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBPcmdEYXRhSXRlbSBsYWJlbCBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgIH1cclxuICAgIFxyXG4gICAgICBpZiAoaXRlbS5leHBhbmRlZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBpdGVtLmV4cGFuZGVkICE9PSAnYm9vbGVhbicpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogT3JnRGF0YUl0ZW0gZXhwYW5kZWQgc2hvdWxkIGJlIGEgYm9vbGVhbi4nKTtcclxuICAgICAgfVxyXG4gICAgXHJcbiAgICAgIGlmIChpdGVtLmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGl0ZW0uZGVzY3JpcHRpb24gIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IE9yZ0RhdGFJdGVtIGRlc2NyaXB0aW9uIHNob3VsZCBiZSBhIHN0cmluZy4nKTtcclxuICAgICAgfVxyXG4gICAgXHJcbiAgICAgIGlmIChpdGVtLmN1c3RvbU5vZGVTdHlsZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY29uc3QgY3VzdG9tTm9kZVN0eWxlID0gaXRlbS5jdXN0b21Ob2RlU3R5bGU7XHJcbiAgICAgICAgaWYgKGN1c3RvbU5vZGVTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgJiYgdHlwZW9mIGN1c3RvbU5vZGVTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogY3VzdG9tTm9kZVN0eWxlLmJhY2tncm91bmRDb2xvciBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChjdXN0b21Ob2RlU3R5bGUuY29sb3IgJiYgdHlwZW9mIGN1c3RvbU5vZGVTdHlsZS5jb2xvciAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBjdXN0b21Ob2RlU3R5bGUuY29sb3Igc2hvdWxkIGJlIGEgc3RyaW5nLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY3VzdG9tTm9kZVN0eWxlLnBhZGRpbmcgJiYgdHlwZW9mIGN1c3RvbU5vZGVTdHlsZS5wYWRkaW5nICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IGN1c3RvbU5vZGVTdHlsZS5wYWRkaW5nIHNob3VsZCBiZSBhIHN0cmluZy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGN1c3RvbU5vZGVTdHlsZS5ib3JkZXJSYWRpdXMgJiYgdHlwZW9mIGN1c3RvbU5vZGVTdHlsZS5ib3JkZXJSYWRpdXMgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogY3VzdG9tTm9kZVN0eWxlLmJvcmRlclJhZGl1cyBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICBcclxuICAgICAgaWYgKGl0ZW0uZGF0YSkge1xyXG4gICAgICAgIGlmIChpdGVtLmRhdGEuaW1hZ2UgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgaXRlbS5kYXRhLmltYWdlICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IE9yZ0RhdGFJdGVtIGRhdGEuaW1hZ2Ugc2hvdWxkIGJlIGEgc3RyaW5nLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXRlbS5kYXRhLm5hbWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgaXRlbS5kYXRhLm5hbWUgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogT3JnRGF0YUl0ZW0gZGF0YS5uYW1lIHNob3VsZCBiZSBhIHN0cmluZy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtLmRhdGEudGl0bGUgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogT3JnRGF0YUl0ZW0gZGF0YS50aXRsZSBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICBcclxuICAgICAgaWYgKGl0ZW0uY2hpbGRyZW4gJiYgQXJyYXkuaXNBcnJheShpdGVtLmNoaWxkcmVuKSkge1xyXG4gICAgICAgIGl0ZW0uY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiBjaGVja09yZ0RhdGFJdGVtKGNoaWxkKSk7IC8vIFJlY3Vyc2l2ZSBjYWxsIGZvciBjaGlsZHJlblxyXG4gICAgICB9XHJcbiAgICBcclxuICAgICAgaWYgKGl0ZW0ub3JpZ2luYWxTdHlsZSkge1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsU3R5bGUgPSBpdGVtLm9yaWdpbmFsU3R5bGU7XHJcbiAgICAgICAgaWYgKG9yaWdpbmFsU3R5bGUuYmFja2dyb3VuZENvbG9yICYmIHR5cGVvZiBvcmlnaW5hbFN0eWxlLmJhY2tncm91bmRDb2xvciAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBvcmlnaW5hbFN0eWxlLmJhY2tncm91bmRDb2xvciBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvcmlnaW5hbFN0eWxlLmNvbG9yICYmIHR5cGVvZiBvcmlnaW5hbFN0eWxlLmNvbG9yICE9PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IG9yaWdpbmFsU3R5bGUuY29sb3Igc2hvdWxkIGJlIGEgc3RyaW5nLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob3JpZ2luYWxTdHlsZS5wYWRkaW5nICYmIHR5cGVvZiBvcmlnaW5hbFN0eWxlLnBhZGRpbmcgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvcjogb3JpZ2luYWxTdHlsZS5wYWRkaW5nIHNob3VsZCBiZSBhIHN0cmluZy4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9yaWdpbmFsU3R5bGUuYm9yZGVyUmFkaXVzICYmIHR5cGVvZiBvcmlnaW5hbFN0eWxlLmJvcmRlclJhZGl1cyAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOiBvcmlnaW5hbFN0eWxlLmJvcmRlclJhZGl1cyBzaG91bGQgYmUgYSBzdHJpbmcuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiJdfQ==
@@ -1,409 +0,0 @@
1
- import * as i0 from '@angular/core';
2
- import { Component, Input, ViewChild, NgModule } from '@angular/core';
3
- import * as i1 from '@angular/common';
4
- import { CommonModule } from '@angular/common';
5
- import { ButtonModule } from 'primeng/button';
6
- import * as i4 from 'primeng/organizationchart';
7
- import { OrganizationChartModule } from 'primeng/organizationchart';
8
- import * as i5 from '@angular/material/input';
9
- import { MatInputModule } from '@angular/material/input';
10
- import * as i3 from '@angular/forms';
11
- import { FormsModule } from '@angular/forms';
12
- import * as i7 from '@angular/material/menu';
13
- import { MatMenuModule } from '@angular/material/menu';
14
- import * as i8 from '@angular/material/button';
15
- import { MatButtonModule } from '@angular/material/button';
16
- import * as i9 from '@angular/material/icon';
17
- import { MatIconModule } from '@angular/material/icon';
18
- import { jsPDF } from 'jspdf';
19
- import html2canvas from 'html2canvas';
20
- import * as i2 from 'primeng/api';
21
- import * as i6 from '@angular/material/form-field';
22
- import { BrowserModule } from '@angular/platform-browser';
23
-
24
- const downloadChart = (chartContainer, format) => {
25
- if (!chartContainer) {
26
- console.error('Chart container not found!');
27
- return;
28
- }
29
- // Capture the chart container as an image (either PNG or JPEG)
30
- if (format === 'pdf') {
31
- createPDF(chartContainer);
32
- }
33
- else {
34
- captureElementAsImage(chartContainer, format)
35
- .then((imgData) => {
36
- downloadImage(imgData, format); // Download as PNG or JPEG
37
- })
38
- .catch(handleCanvasError);
39
- }
40
- };
41
- // Capture the element as an image and return a promise
42
- const captureElementAsImage = (element, format) => {
43
- return new Promise((resolve, reject) => {
44
- html2canvas(element, {
45
- useCORS: true,
46
- scrollX: 0,
47
- scrollY: -window.scrollY,
48
- logging: false,
49
- backgroundColor: null,
50
- })
51
- .then((canvas) => {
52
- const imgData = canvas.toDataURL(`image/${format}`);
53
- resolve(imgData);
54
- })
55
- .catch((error) => reject(error));
56
- });
57
- };
58
- // Downloads the org chart as a PDF document.
59
- const createPDF = (element) => {
60
- html2canvas(element, {
61
- useCORS: true,
62
- scale: 4,
63
- scrollX: 0,
64
- scrollY: -window.scrollY,
65
- logging: false,
66
- backgroundColor: null,
67
- })
68
- .then((canvas) => {
69
- const imgData = canvas.toDataURL('image/png'); // Capture as PNG (or you can use JPEG)
70
- const pdf = new jsPDF('p', 'mm', 'a4'); // Standard A4 page size
71
- // Get the dimensions of the PDF page
72
- const pdfWidth = pdf.internal.pageSize.width;
73
- const pdfHeight = pdf.internal.pageSize.height;
74
- const canvasWidth = canvas.width;
75
- const canvasHeight = canvas.height;
76
- const aspectRatio = canvasWidth / canvasHeight;
77
- let imgWidth = pdfWidth;
78
- let imgHeight = pdfWidth / aspectRatio;
79
- // If the image height exceeds the PDF page height, adjust it
80
- if (imgHeight > pdfHeight) {
81
- imgHeight = pdfHeight;
82
- imgWidth = pdfHeight * aspectRatio;
83
- }
84
- // Add the image to the PDF
85
- pdf.addImage(imgData, 'PNG', 0, 20, imgWidth, imgHeight); // Fit image on PDF page
86
- pdf.save('organization-chart.pdf'); // Download the PDF
87
- })
88
- .catch(handleCanvasError);
89
- };
90
- // Download the captured image in the required format (PNG/JPEG)
91
- const downloadImage = (imgData, format) => {
92
- const link = document.createElement('a');
93
- link.href = imgData;
94
- link.download = `organization-chart.${format}`;
95
- link.click();
96
- };
97
- // Error handler for any issues during canvas generation or file creation
98
- const handleCanvasError = (error) => {
99
- console.error('Error generating file:', error);
100
- };
101
- const checkPropsType = (props) => {
102
- if (props.isDisplayHambergerMenu !== undefined && typeof props.isDisplayHambergerMenu !== 'boolean') {
103
- console.error('Error: isDisplayHambergerMenu should be a boolean.');
104
- }
105
- if (props.isDisplaySearchBar !== undefined && typeof props.isDisplaySearchBar !== 'boolean') {
106
- console.error('Error: isDisplaySearchBar should be a boolean.');
107
- }
108
- if (!['portrait', 'triangle', 'landscape'].includes(props.nodeTemplate)) {
109
- console.error('Error: nodeTemplate should be "portrait", "triangle", or "landscape".');
110
- }
111
- if (!Array.isArray(props.hambergerMenuList)) {
112
- console.error('Error: hambergerMenuList should be an array.');
113
- }
114
- else {
115
- props.hambergerMenuList.forEach(item => {
116
- if (typeof item.label !== 'string') {
117
- console.error('Error: hambergerMenuList label should be a string.');
118
- }
119
- if (typeof item.id !== 'number') {
120
- console.error('Error: hambergerMenuList id should be a number.');
121
- }
122
- });
123
- }
124
- // Check if greyNodeStyle is of type CustomNodeStyle
125
- const greyNodeStyle = props.greyNodeStyle;
126
- if (greyNodeStyle) {
127
- if (greyNodeStyle.backgroundColor && typeof greyNodeStyle.backgroundColor !== 'string') {
128
- console.error('Error: greyNodeStyle.backgroundColor should be a string.');
129
- }
130
- if (greyNodeStyle.color && typeof greyNodeStyle.color !== 'string') {
131
- console.error('Error: greyNodeStyle.color should be a string.');
132
- }
133
- if (greyNodeStyle.padding && typeof greyNodeStyle.padding !== 'string') {
134
- console.error('Error: greyNodeStyle.padding should be a string.');
135
- }
136
- if (greyNodeStyle.borderRadius && typeof greyNodeStyle.borderRadius !== 'string') {
137
- console.error('Error: greyNodeStyle.borderRadius should be a string.');
138
- }
139
- }
140
- // Check if orgData is an array of OrgDataItem objects
141
- if (!Array.isArray(props.orgData)) {
142
- console.error('Error: orgData should be an array.');
143
- }
144
- else {
145
- props.orgData.forEach(item => checkOrgDataItem(item));
146
- }
147
- };
148
- const checkOrgDataItem = (item) => {
149
- if (item.label !== undefined && typeof item.label !== 'string') {
150
- console.error('Error: OrgDataItem label should be a string.');
151
- }
152
- if (item.expanded !== undefined && typeof item.expanded !== 'boolean') {
153
- console.error('Error: OrgDataItem expanded should be a boolean.');
154
- }
155
- if (item.description !== undefined && typeof item.description !== 'string') {
156
- console.error('Error: OrgDataItem description should be a string.');
157
- }
158
- if (item.customNodeStyle !== undefined) {
159
- const customNodeStyle = item.customNodeStyle;
160
- if (customNodeStyle.backgroundColor && typeof customNodeStyle.backgroundColor !== 'string') {
161
- console.error('Error: customNodeStyle.backgroundColor should be a string.');
162
- }
163
- if (customNodeStyle.color && typeof customNodeStyle.color !== 'string') {
164
- console.error('Error: customNodeStyle.color should be a string.');
165
- }
166
- if (customNodeStyle.padding && typeof customNodeStyle.padding !== 'string') {
167
- console.error('Error: customNodeStyle.padding should be a string.');
168
- }
169
- if (customNodeStyle.borderRadius && typeof customNodeStyle.borderRadius !== 'string') {
170
- console.error('Error: customNodeStyle.borderRadius should be a string.');
171
- }
172
- }
173
- if (item.data) {
174
- if (item.data.image !== undefined && typeof item.data.image !== 'string') {
175
- console.error('Error: OrgDataItem data.image should be a string.');
176
- }
177
- if (item.data.name !== undefined && typeof item.data.name !== 'string') {
178
- console.error('Error: OrgDataItem data.name should be a string.');
179
- }
180
- if (typeof item.data.title !== 'string') {
181
- console.error('Error: OrgDataItem data.title should be a string.');
182
- }
183
- }
184
- if (item.children && Array.isArray(item.children)) {
185
- item.children.forEach(child => checkOrgDataItem(child)); // Recursive call for children
186
- }
187
- if (item.originalStyle) {
188
- const originalStyle = item.originalStyle;
189
- if (originalStyle.backgroundColor && typeof originalStyle.backgroundColor !== 'string') {
190
- console.error('Error: originalStyle.backgroundColor should be a string.');
191
- }
192
- if (originalStyle.color && typeof originalStyle.color !== 'string') {
193
- console.error('Error: originalStyle.color should be a string.');
194
- }
195
- if (originalStyle.padding && typeof originalStyle.padding !== 'string') {
196
- console.error('Error: originalStyle.padding should be a string.');
197
- }
198
- if (originalStyle.borderRadius && typeof originalStyle.borderRadius !== 'string') {
199
- console.error('Error: originalStyle.borderRadius should be a string.');
200
- }
201
- }
202
- };
203
-
204
- /** Displays an organizational chart with nodes and relationships (Org Chart Component) */
205
- class OrgChartComponent {
206
- constructor() {
207
- this.searchText = '';
208
- this.hoveredNode = null;
209
- }
210
- /** Initializes the component */
211
- ngOnInit() {
212
- let updatedJson = this.addDefaultKeysIfNotAvailable(this.rucInputData);
213
- this.rucInputData.orgData = this.updateRucInputData(updatedJson.orgData);
214
- checkPropsType(this.rucInputData); // To check rucInputData is in correct format or not
215
- this.expandAllNodes();
216
- }
217
- /** add default property for grey nodes if user does not provided */
218
- addDefaultKeysIfNotAvailable(orgData) {
219
- if (!orgData.hasOwnProperty('greyNodeStyle')) {
220
- orgData.greyNodeStyle = {
221
- backgroundColor: '#d3d3d3',
222
- color: '#808080',
223
- };
224
- }
225
- return orgData;
226
- }
227
- /** manipulate input json as If customNodeStyle exists, create originalStyle for node and its children */
228
- updateRucInputData(data) {
229
- return data.map((node) => {
230
- node['type'] = 'person';
231
- if (node.customNodeStyle) {
232
- node.originalStyle = Object.assign({}, node.customNodeStyle);
233
- }
234
- if (node.children && node.children.length > 0) {
235
- node['type'] = 'person';
236
- node.children = this.updateRucInputData(node.children); // Recursive call
237
- }
238
- return node;
239
- });
240
- }
241
- /** Expands all nodes in the org chart */
242
- expandAllNodes() {
243
- this.rucInputData.orgData = this.expandNodes(this.rucInputData.orgData);
244
- }
245
- /** Recursively expands all nodes in the given array
246
- * @param nodes Nodes to expand @returns Expanded nodes */
247
- expandNodes(nodes) {
248
- return nodes.map((node) => (Object.assign(Object.assign({}, node), { expanded: true, children: node.children ? this.expandNodes(node.children) : [] })));
249
- }
250
- /** Collapses all nodes in the org chart */
251
- collapseAllNodes() {
252
- this.rucInputData.orgData = this.collapseNodes(this.rucInputData.orgData);
253
- }
254
- /** Recursively collapses all nodes in the given array
255
- * @param nodes Nodes to collapse @returns Collapsed nodes */
256
- collapseNodes(nodes) {
257
- return nodes.map((node) => (Object.assign(Object.assign({}, node), { expanded: false, children: node.children ? this.collapseNodes(node.children) : [] })));
258
- }
259
- /** Gets the background color of a node based on search text
260
- @param node Node to check @returns Whether the node matches the search text */
261
- getBackgroungColorOfNode(node) {
262
- var _a;
263
- return (!this.searchText ||
264
- node.data.title.toLowerCase().includes(this.searchText.toLowerCase()) ||
265
- node.data.name.toLowerCase().includes(this.searchText.toLowerCase()) ||
266
- ((_a = node.label) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes(this.searchText.toLowerCase())));
267
- }
268
- /** Handles node hover event @param node Hovered node */
269
- onNodeHover(node) {
270
- if (this.searchText)
271
- return;
272
- this.hoveredNode = node;
273
- this.updateNodeStyles();
274
- }
275
- /** Handles node leave event */
276
- onNodeLeave() {
277
- this.hoveredNode = null;
278
- this.resetNodeStyles();
279
- }
280
- /** Updates node styles based on the hovered node */
281
- updateNodeStyles() {
282
- this.applyStyles(this.rucInputData.orgData, true);
283
- }
284
- /** Resets node styles to their original state */
285
- resetNodeStyles() {
286
- this.applyStyles(this.rucInputData.orgData, false);
287
- }
288
- /** Applies grey node style to non-matching nodes @param nodes Nodes to apply styles to */
289
- applyGreyNodes(nodes) {
290
- nodes.forEach((node) => {
291
- var _a;
292
- const isMatching = this.searchText
293
- ? (_a = node.data) === null || _a === void 0 ? void 0 : _a.title.includes(this.searchText)
294
- : false;
295
- node.customNodeStyle = isMatching
296
- ? node.customNodeStyle || node.originalStyle
297
- : Object.assign(Object.assign({}, node.originalStyle), { backgroundColor: this.rucInputData.greyNodeStyle.backgroundColor, color: this.rucInputData.greyNodeStyle.color });
298
- if (node.children) {
299
- this.applyGreyNodes(node.children);
300
- }
301
- });
302
- }
303
- /** Applies styles to nodes based on the hovered node
304
- * @param nodes Nodes to apply styles @param isHovered Whether the node is hovered */
305
- applyStyles(nodes, isHovered) {
306
- nodes.forEach((node) => {
307
- if (isHovered) {
308
- node.customNodeStyle =
309
- node === this.hoveredNode ||
310
- this.isParent(node, this.hoveredNode) ||
311
- this.isChild(node, this.hoveredNode)
312
- ? node.customNodeStyle || node.originalStyle
313
- : Object.assign(Object.assign({}, node.originalStyle), { backgroundColor: this.rucInputData.greyNodeStyle.backgroundColor, color: this.rucInputData.greyNodeStyle.color });
314
- }
315
- else {
316
- node.customNodeStyle = node.originalStyle;
317
- }
318
- if (node.children) {
319
- this.applyStyles(node.children, isHovered);
320
- }
321
- });
322
- }
323
- /** Use the downloadChart utility method */
324
- downloadChart(format) {
325
- const chartContainer = this.orgChart.el.nativeElement;
326
- downloadChart(chartContainer, format); // Calls the utility function
327
- }
328
- /** Handles menu click event @param id Menu item ID */
329
- onMenuClick(id, event) {
330
- event.preventDefault();
331
- event.stopPropagation();
332
- switch (id) {
333
- case 1:
334
- this.downloadChart('pdf');
335
- break;
336
- case 2:
337
- this.downloadChart('png');
338
- break;
339
- case 3:
340
- this.downloadChart('jpeg');
341
- break;
342
- case 4:
343
- this.expandAllNodes();
344
- break;
345
- case 5:
346
- this.collapseAllNodes();
347
- break;
348
- default:
349
- console.warn(`Unknown menu item ID: ${id}. Please enter valid id.`);
350
- break;
351
- }
352
- }
353
- /** Gets tooltip data for a node @param node Node to get tooltip data */
354
- getTooltipData(node) {
355
- return node.description || '';
356
- }
357
- /** Checks if a node is a parent of another node.
358
- * @param currentNode The current node to check.
359
- * @param hoveredNode The node to check for parentage.
360
- * @returns Whether the current node is a parent of the hovered node. */
361
- isParent(currentNode, hoveredNode) {
362
- var _a;
363
- return hoveredNode && ((_a = currentNode.children) === null || _a === void 0 ? void 0 : _a.includes(hoveredNode));
364
- }
365
- /** Checks if a node is a child of another node.
366
- * @param node The node to check for child status
367
- * @param target The node to check for parentage.
368
- * @returns Whether the node is a child of the target node.*/
369
- isChild(node, target) {
370
- var _a;
371
- return target && ((_a = target.children) === null || _a === void 0 ? void 0 : _a.includes(node));
372
- }
373
- }
374
- OrgChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OrgChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
375
- OrgChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OrgChartComponent, selector: "uxp-org-chart", inputs: { rucInputData: "rucInputData", customTheme: "customTheme" }, viewQueries: [{ propertyName: "orgChart", first: true, predicate: ["orgChart"], descendants: true }], ngImport: i0, template: "<div class={{customTheme}}>\r\n <div class=\"container\">\r\n <!-- Hamburger Menu -->\r\n <button *ngIf=\"rucInputData.isDisplayHambergerMenu === true\" mat-icon-button [matMenuTriggerFor]=\"menu\" \r\n class=\"left hamburger-button\">\r\n <mat-icon>menu</mat-icon>\r\n </button>\r\n \r\n <!-- Menu -->\r\n <mat-menu #menu=\"matMenu\">\r\n <button *ngFor=\"let menu of rucInputData.hambergerMenuList\" mat-menu-item (click)=\"onMenuClick(menu.id, $event);\" \r\n [id]=\"'menu-item-' + menu.id\">\r\n {{ menu.label }}\r\n </button>\r\n </mat-menu>\r\n \r\n <!-- Search Bar -->\r\n <mat-form-field *ngIf=\"rucInputData.isDisplaySearchBar === true\" class=\"search-box right\" \r\n >\r\n <mat-label>Search</mat-label>\r\n <input matInput placeholder=\"Type to search...\" [(ngModel)]=\"searchText\" />\r\n <mat-icon matSuffix>search</mat-icon>\r\n </mat-form-field>\r\n </div>\r\n \r\n \r\n <div class=\"org-chart-container \" id=\"org-chart-data\">\r\n <p-organizationChart #orgChart class=\"org-chart\" [value]=\"this.rucInputData.orgData\" selectionMode=\"multiple\"\r\n [(selection)]=\"selectedNodes\">\r\n <ng-template let-node pTemplate=\"person\">\r\n <div *ngIf=\"this.rucInputData.nodeTemplate === 'portrait'\" class=\"flex flex-col nodeContent\" [ngStyle]=\"getBackgroungColorOfNode(node) ? node.customNodeStyle : rucInputData.greyNodeStyle\" (mouseenter)=\"onNodeHover(node)\"\r\n [title]=\"getTooltipData(node)\" (mouseleave)=\"onNodeLeave()\"> \r\n <div class=\"flex flex-col items-center\" >\r\n <span><img *ngIf=\"node.data.image\" [src]=\"node.data.image\" class=\"portraitImageDimension\" /></span>\r\n <div class=\"font-bold mb-2\">{{ node.data.name }}</div>\r\n <div>{{ node.data.title }}\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div *ngIf=\"this.rucInputData.nodeTemplate === 'triangle'\" class=\"flex trianlge-up flex-col nodeContent\" [ngStyle]=\"getBackgroungColorOfNode(node) ? node.customNodeStyle : rucInputData.greyNodeStyle\" (mouseenter)=\"onNodeHover(node)\"\r\n [title]=\"getTooltipData(node)\" (mouseleave)=\"onNodeLeave()\"> \r\n <div class=\"flex flex-col items-center\" >\r\n <div *ngIf=\"!node.data.image\" class=\"triangleImageDimension\">\r\n </div>\r\n <img *ngIf=\"node.data.image\" [src]=\"node.data.image\" class=\"triangleImageDimension\" />\r\n <div class=\"font-bold mb-2\">{{ node.data.name }}</div>\r\n <div>{{ node.data.title }}\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"this.rucInputData.nodeTemplate === 'landscape'\">\r\n <div class=\"card borderSolidGrey\" [ngStyle]=\"getBackgroungColorOfNode(node) ? node.customNodeStyle : rucInputData.greyNodeStyle\"\r\n (mouseenter)=\"onNodeHover(node)\"\r\n [title]=\"getTooltipData(node)\" (mouseleave)=\"onNodeLeave()\">\r\n <div class=\"body\" >\r\n <div class=\"icon\">\r\n <img *ngIf=\"node.data.image\" [src]=\"node.data.image\" class=\"landscapeImageDimension\" />\r\n </div>\r\n <div class=\"content\">\r\n <div>{{node.data.name}}</div>\r\n <div>{{node.data.title}}</div>\r\n </div>\r\n </div> \r\n </div>\r\n </div>\r\n </ng-template>\r\n </p-organizationChart>\r\n </div>\r\n \r\n</div>", styles: [".org-chart-container{overflow-x:auto}.nodeContent{border:none;padding:1.5em;border-radius:\"8px\";background-color:none;color:#000}.card{display:flex;width:250px;height:100px;padding:24px;align-self:stretch;align-items:flex-start}.card .body{width:100%;display:flex}.card .body .icon{width:64px;height:64px}.trianlge-up{width:220px;background-color:#980104;clip-path:polygon(50% 0%,0% 100%,100% 100%)}mat-form-field{margin:10px}::ng-deep .p-organizationchart .p-organizationchart-node-content{border:none;background:none;color:#495057;padding:0!important}::ng-deep .p-organizationchart .p-organizationchart-node-content .p-node-toggler{background-color:#dee2e6;cursor:pointer}::ng-deep .p-organizationchart .p-organizationchart-node-content .p-node-toggler .p-node-toggler-icon{top:.2rem}.container{display:flex;justify-content:space-between;width:100%}.container .left{margin-right:auto}.container .right{margin-left:auto}mat-icon-button{margin-right:10px}.mat-form-field{margin-left:10px}.borderSolidGrey{border:1px solid lightgray}.landscapeImageDimension{width:3em;height:3em}.portraitImageDimension,.triangleImageDimension{margin-bottom:4px;width:3em;height:3em}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.OrganizationChart, selector: "p-organizationChart", inputs: ["value", "style", "styleClass", "selectionMode", "preserveSpace", "selection"], outputs: ["selectionChange", "onNodeSelect", "onNodeUnselect", "onNodeExpand", "onNodeCollapse"] }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: i7.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i7.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
376
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OrgChartComponent, decorators: [{
377
- type: Component,
378
- args: [{ selector: 'uxp-org-chart', template: "<div class={{customTheme}}>\r\n <div class=\"container\">\r\n <!-- Hamburger Menu -->\r\n <button *ngIf=\"rucInputData.isDisplayHambergerMenu === true\" mat-icon-button [matMenuTriggerFor]=\"menu\" \r\n class=\"left hamburger-button\">\r\n <mat-icon>menu</mat-icon>\r\n </button>\r\n \r\n <!-- Menu -->\r\n <mat-menu #menu=\"matMenu\">\r\n <button *ngFor=\"let menu of rucInputData.hambergerMenuList\" mat-menu-item (click)=\"onMenuClick(menu.id, $event);\" \r\n [id]=\"'menu-item-' + menu.id\">\r\n {{ menu.label }}\r\n </button>\r\n </mat-menu>\r\n \r\n <!-- Search Bar -->\r\n <mat-form-field *ngIf=\"rucInputData.isDisplaySearchBar === true\" class=\"search-box right\" \r\n >\r\n <mat-label>Search</mat-label>\r\n <input matInput placeholder=\"Type to search...\" [(ngModel)]=\"searchText\" />\r\n <mat-icon matSuffix>search</mat-icon>\r\n </mat-form-field>\r\n </div>\r\n \r\n \r\n <div class=\"org-chart-container \" id=\"org-chart-data\">\r\n <p-organizationChart #orgChart class=\"org-chart\" [value]=\"this.rucInputData.orgData\" selectionMode=\"multiple\"\r\n [(selection)]=\"selectedNodes\">\r\n <ng-template let-node pTemplate=\"person\">\r\n <div *ngIf=\"this.rucInputData.nodeTemplate === 'portrait'\" class=\"flex flex-col nodeContent\" [ngStyle]=\"getBackgroungColorOfNode(node) ? node.customNodeStyle : rucInputData.greyNodeStyle\" (mouseenter)=\"onNodeHover(node)\"\r\n [title]=\"getTooltipData(node)\" (mouseleave)=\"onNodeLeave()\"> \r\n <div class=\"flex flex-col items-center\" >\r\n <span><img *ngIf=\"node.data.image\" [src]=\"node.data.image\" class=\"portraitImageDimension\" /></span>\r\n <div class=\"font-bold mb-2\">{{ node.data.name }}</div>\r\n <div>{{ node.data.title }}\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div *ngIf=\"this.rucInputData.nodeTemplate === 'triangle'\" class=\"flex trianlge-up flex-col nodeContent\" [ngStyle]=\"getBackgroungColorOfNode(node) ? node.customNodeStyle : rucInputData.greyNodeStyle\" (mouseenter)=\"onNodeHover(node)\"\r\n [title]=\"getTooltipData(node)\" (mouseleave)=\"onNodeLeave()\"> \r\n <div class=\"flex flex-col items-center\" >\r\n <div *ngIf=\"!node.data.image\" class=\"triangleImageDimension\">\r\n </div>\r\n <img *ngIf=\"node.data.image\" [src]=\"node.data.image\" class=\"triangleImageDimension\" />\r\n <div class=\"font-bold mb-2\">{{ node.data.name }}</div>\r\n <div>{{ node.data.title }}\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"this.rucInputData.nodeTemplate === 'landscape'\">\r\n <div class=\"card borderSolidGrey\" [ngStyle]=\"getBackgroungColorOfNode(node) ? node.customNodeStyle : rucInputData.greyNodeStyle\"\r\n (mouseenter)=\"onNodeHover(node)\"\r\n [title]=\"getTooltipData(node)\" (mouseleave)=\"onNodeLeave()\">\r\n <div class=\"body\" >\r\n <div class=\"icon\">\r\n <img *ngIf=\"node.data.image\" [src]=\"node.data.image\" class=\"landscapeImageDimension\" />\r\n </div>\r\n <div class=\"content\">\r\n <div>{{node.data.name}}</div>\r\n <div>{{node.data.title}}</div>\r\n </div>\r\n </div> \r\n </div>\r\n </div>\r\n </ng-template>\r\n </p-organizationChart>\r\n </div>\r\n \r\n</div>", styles: [".org-chart-container{overflow-x:auto}.nodeContent{border:none;padding:1.5em;border-radius:\"8px\";background-color:none;color:#000}.card{display:flex;width:250px;height:100px;padding:24px;align-self:stretch;align-items:flex-start}.card .body{width:100%;display:flex}.card .body .icon{width:64px;height:64px}.trianlge-up{width:220px;background-color:#980104;clip-path:polygon(50% 0%,0% 100%,100% 100%)}mat-form-field{margin:10px}::ng-deep .p-organizationchart .p-organizationchart-node-content{border:none;background:none;color:#495057;padding:0!important}::ng-deep .p-organizationchart .p-organizationchart-node-content .p-node-toggler{background-color:#dee2e6;cursor:pointer}::ng-deep .p-organizationchart .p-organizationchart-node-content .p-node-toggler .p-node-toggler-icon{top:.2rem}.container{display:flex;justify-content:space-between;width:100%}.container .left{margin-right:auto}.container .right{margin-left:auto}mat-icon-button{margin-right:10px}.mat-form-field{margin-left:10px}.borderSolidGrey{border:1px solid lightgray}.landscapeImageDimension{width:3em;height:3em}.portraitImageDimension,.triangleImageDimension{margin-bottom:4px;width:3em;height:3em}\n"] }]
379
- }], propDecorators: { rucInputData: [{
380
- type: Input
381
- }], customTheme: [{
382
- type: Input
383
- }], orgChart: [{
384
- type: ViewChild,
385
- args: ['orgChart', { static: false }]
386
- }] } });
387
-
388
- class RuclibOrgChartModule {
389
- }
390
- RuclibOrgChartModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibOrgChartModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
391
- RuclibOrgChartModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: RuclibOrgChartModule, declarations: [OrgChartComponent], imports: [CommonModule, ButtonModule, BrowserModule, FormsModule, OrganizationChartModule, MatInputModule, MatMenuModule, MatButtonModule, MatIconModule], exports: [OrgChartComponent] });
392
- RuclibOrgChartModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibOrgChartModule, imports: [CommonModule, ButtonModule, BrowserModule, FormsModule, OrganizationChartModule, MatInputModule, MatMenuModule, MatButtonModule, MatIconModule] });
393
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibOrgChartModule, decorators: [{
394
- type: NgModule,
395
- args: [{
396
- imports: [CommonModule, ButtonModule, BrowserModule, FormsModule, OrganizationChartModule, MatInputModule, MatMenuModule, MatButtonModule, MatIconModule],
397
- declarations: [OrgChartComponent],
398
- exports: [OrgChartComponent]
399
- }]
400
- }] });
401
-
402
- // export * from './services/org-chart.service';
403
-
404
- /**
405
- * Generated bundle index. Do not edit.
406
- */
407
-
408
- export { OrgChartComponent, RuclibOrgChartModule };
409
- //# sourceMappingURL=ruc-lib-org-chart.mjs.map