@ruc-lib/org-chart 2.0.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/README.md ADDED
@@ -0,0 +1,202 @@
1
+ # ruclib-org-chart
2
+
3
+ A component for creating a org chart. There are various features like Downloading, Collapseing and Expanding available in it.
4
+
5
+ # Features
6
+
7
+ - User is allowed to input the data source in the correct JSON format (specific to organizational structure); otherwise, print console for that specific missing properties.
8
+ - User is allowed to select different templates for displaying the organizational chart, including various node shapes such as Portrait, Landscape, and Triangle.
9
+ - User is allowed to search by title or subtitle in the organizational chart, with the ability to toggle the visibility of the search bar based on configuration.
10
+ - User is allowed to see the searched node highlighted, while other nodes will be faded when a search is performed.
11
+ - User is allowed to access a hamburger menu (three horizontal lines) that displays a list of options such as Expand All, Collapse All, Download PNG, Download SVG, and Download PDF.
12
+ - User is allowed to expand all nodes by clicking the "Expand All" button and collapse all nodes by clicking the "Collapse All" button.
13
+ - User is allowed to download the organizational chart in PNG format by clicking the "Download PNG" button, in SVG format with the "Download SVG" option, and in PDF format using the "Download PDF" button.
14
+ - User is allowed to hover over any node in the chart, which will highlight the parent and child nodes while fading other nodes, along with displaying a tooltip containing the node's description.
15
+ - User is allowed to click the expand icon on any node to toggle between expanding or collapsing the node, provided it has child data.
16
+ - User is allowed to configure custom CSS for the organizational chart, including styling options like node color, background color.
17
+
18
+
19
+ # Installation guide
20
+
21
+ # Install complete library
22
+
23
+ `npm install @uxpractice/ruc-lib`
24
+
25
+ # Install individual component
26
+
27
+ If users only need the dataflow component, they can install it separately
28
+ `npm install @ruc-lib/org-chart`
29
+
30
+ # Usage
31
+
32
+ After installing the the required package successfully, we have to import the CSS in our style.scss file in following way.
33
+
34
+ `@import "../../../node_modules/primeng/resources/themes/lara-light-indigo/theme.css";`
35
+ `@import "../../../node_modules/primeng/resources/primeng.min.css";`
36
+
37
+ here path of the scss file is subject to change as per choice of the installation
38
+
39
+ for library
40
+ `@import "../node_modules/primeng/resources/themes/lara-light-indigo/theme.css";`
41
+ `@import "../node_modules/primeng/resources/primeng.min.css";`
42
+
43
+ for seperate package
44
+ `@import "../node_modules/primeng/resources/themes/lara-light-indigo/theme.css";`
45
+ `@import "../node_modules/primeng/resources/primeng.min.css";`
46
+
47
+
48
+ # import required modules
49
+
50
+ for library
51
+ `import { RuclibOrgChartModule } from '@uxpractice/ruc-lib/org-chart';`
52
+
53
+ for seperate package
54
+ `import { RuclibOrgChartModule } from '@ruc-lib/org-chart';`
55
+
56
+ # use component selector
57
+
58
+ ```
59
+ <uxp-org-chart [rucInputData]="inputOrgData" [customTheme]="customTheme"></uxp-org-chart>
60
+ ```
61
+
62
+
63
+ # Input and Output
64
+
65
+ # Inputs
66
+ rucInputData -> It is the configuration input to configure the org chart
67
+
68
+ customTheme -> It is the name of the theme.
69
+ # Output
70
+
71
+ # rucInputData (sample object)
72
+
73
+ # Detail definition of the each property can be found in type definition file.
74
+
75
+ ```
76
+ const inputOrgData = {
77
+ isDisplayHambergerMenu: true,
78
+ isDisplaySearchBar : true,
79
+ nodeTemplate: 'triangle', // portrait , triangle, landscape
80
+ hambergerMenuList : [
81
+ { label: 'Download pdf',
82
+ id: 1
83
+ },
84
+ { label: 'Download png',
85
+ id: 2
86
+ },
87
+ { label: 'Download jpeg',
88
+ id: 3
89
+ },
90
+ {
91
+ label: 'Expand All',
92
+ id: 4,
93
+ },
94
+ {
95
+ label: 'Collapse All',
96
+ id: 5,
97
+ }
98
+ ],
99
+ greyNodeStyle : {
100
+ backgroundColor: '#d3d3d3',
101
+ color: '#808080',
102
+ },
103
+ orgData: [
104
+ {
105
+ label: 'ceo',
106
+ expanded: false,
107
+ description: 'ceo description',
108
+ customNodeStyle: {
109
+ backgroundColor: '#3498db',
110
+ color: 'white',
111
+ padding: '1.5em',
112
+ borderRadius: '0px',
113
+ },
114
+
115
+ data: {
116
+ image:'https://primefaces.org/cdn/primeng/images/demo/avatar/amyelsner.png',
117
+ name: 'Amy Elsner',
118
+ title: 'CEO',
119
+ },
120
+ children: [
121
+ {
122
+ expanded: false,
123
+ label: 'cmo',
124
+ description: 'cmo description',
125
+ customNodeStyle: {
126
+ backgroundColor: 'rgb(152, 1, 4)',
127
+ color: 'white',
128
+ padding: '1.5em',
129
+ borderRadius: '0px',
130
+ },
131
+ data: {
132
+ image:
133
+ 'https://primefaces.org/cdn/primeng/images/demo/avatar/annafali.png',
134
+ name: 'Ahaanna Fali',
135
+ title: 'CMO',
136
+ }
137
+ },
138
+ {
139
+ expanded: false,
140
+ label: 'CTO',
141
+ description: 'CTO description',
142
+ customNodeStyle: {
143
+ backgroundColor: 'rgb(152, 1, 4)',
144
+ color: 'white',
145
+ padding: '1.5em',
146
+ borderRadius: '0px',
147
+ },
148
+ data: {
149
+ image:
150
+ 'https://primefaces.org/cdn/primeng/images/demo/avatar/stephenshaw.png',
151
+ name: 'Stephen Shaw',
152
+ title: 'CTO',
153
+ },
154
+ children: [
155
+ {
156
+ expanded: false,
157
+ label: 'Architect',
158
+ description: 'CTO description',
159
+ customNodeStyle: {
160
+ backgroundColor: 'rgb(137, 152, 1)',
161
+ color: 'white',
162
+ padding: '1.5em',
163
+ borderRadius: '0px',
164
+ },
165
+ data: {
166
+ image:
167
+ 'https://primefaces.org/cdn/primeng/images/demo/avatar/stephenshaw.png',
168
+ name: 'Thomas Shaw',
169
+ title: 'Architect',
170
+ }
171
+ },
172
+ {
173
+ expanded: false,
174
+ label: 'Manager',
175
+ description: 'CTO description',
176
+ customNodeStyle: {
177
+ backgroundColor: 'rgb(137, 152, 1)',
178
+ color: 'white',
179
+ padding: '1.5em',
180
+ borderRadius: '0px',
181
+ },
182
+ data: {
183
+ image:
184
+ 'https://primefaces.org/cdn/primeng/images/demo/avatar/stephenshaw.png',
185
+ name: 'Steve Shaw',
186
+ title: 'Manager',
187
+ }
188
+ }],
189
+ },
190
+ ],
191
+ },
192
+ ]
193
+ }
194
+
195
+ ```
196
+
197
+
198
+ # Contribution
199
+ Contributions are welcome! Feel free to open issues or pull requests for any enhancements or fixes.
200
+
201
+ # Acknowledgements
202
+ Thank you for choosing the Data flow Component Library. If you have any feedback or suggestions, please let us know!
@@ -0,0 +1,4 @@
1
+ export * from './lib/ruclib-org-chart.module';
2
+ export * from './lib/org-chart/org-chart.component';
3
+ // export * from './services/org-chart.service';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLHFDQUFxQyxDQUFDO0FBQ3BELGdEQUFnRCIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL3J1Y2xpYi1vcmctY2hhcnQubW9kdWxlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvb3JnLWNoYXJ0L29yZy1jaGFydC5jb21wb25lbnQnO1xyXG4vLyBleHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL29yZy1jaGFydC5zZXJ2aWNlJzsiXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnLWNoYXJ0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2ludGVyZmFjZXMvb3JnLWNoYXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUcmVlTm9kZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tVHJlZU5vZGUgZXh0ZW5kcyBUcmVlTm9kZSB7XHJcbiAgICBjdXN0b21Ob2RlU3R5bGU/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB9OyAvLyBTdHlsaW5nIGZvciBvcmcgY2hhcnQgbm9kZVxyXG4gICAgb3JpZ2luYWxTdHlsZT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIH07IC8vIGlnbm9yZSBpdCBhcyBpdHMgYXNzaWduaW5nIGluc2lkZSBsaWJyYXJ5XHJcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZzsgLy8gZGVzY3JpcHRpb24gaW5zaWRlIG5vZGUgd2hlbiB3ZSBob3ZlciBvbiBpdFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbU5vZGVTdHlsZSB7XHJcbiAgYmFja2dyb3VuZENvbG9yPzogc3RyaW5nO1xyXG4gIGNvbG9yPzogc3RyaW5nO1xyXG4gIHBhZGRpbmc/OiBzdHJpbmc7XHJcbiAgYm9yZGVyUmFkaXVzPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE9yZ0RhdGFJdGVtIHtcclxuICBsYWJlbD86IHN0cmluZztcclxuICBleHBhbmRlZD86IGJvb2xlYW47IFxyXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xyXG4gIGN1c3RvbU5vZGVTdHlsZT86IEN1c3RvbU5vZGVTdHlsZTsgLy8gQ3VzdG9tIHN0eWxpbmcgZm9yIG5vZGVcclxuICB0eXBlPzogc3RyaW5nOyAvLyBpZ25vcmUgaXQgYXMgaXQgaXMgYXNzaWduaW5nIGluc2lkZSBsaWJyYXJ5IFxyXG4gIGRhdGE/OiB7XHJcbiAgICBpbWFnZT86IHN0cmluZztcclxuICAgIG5hbWU/OiBzdHJpbmc7XHJcbiAgICB0aXRsZTogc3RyaW5nO1xyXG4gIH07XHJcbiAgY2hpbGRyZW4/OiBPcmdEYXRhSXRlbVtdO1xyXG4gIG9yaWdpbmFsU3R5bGU/OiBDdXN0b21Ob2RlU3R5bGU7IC8vIEN1c3RvbSBzdHlsaW5nIGZvciBub2RlXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgT3JnRGF0YSB7XHJcbiAgaXNEaXNwbGF5SGFtYmVyZ2VyTWVudT86IGJvb2xlYW47IC8vIFRvIGRpc3BsYXkgU2VhcmNoIGJhci4gSXQgY2FuIGJlIHRydWUgfCBmYWxzZVxyXG4gIGlzRGlzcGxheVNlYXJjaEJhcj86IGJvb2xlYW47IC8vIFRvIGRpc3BsYXkgU2VhcmNoIGJhci4gSXQgY2FuIGJlIHRydWUgfCBmYWxzZVxyXG4gIG5vZGVUZW1wbGF0ZTogc3RyaW5nOyAgLy8gVGVtcGxhdGUgaGF2ZSB0aHJlZSBvcHRpb25zICdwb3J0cmFpdCcgfCAndHJpYW5nbGUnIHwgJ2xhbmRzY2FwZSc7XHJcbiAgaGFtYmVyZ2VyTWVudUxpc3Q6IHsgbGFiZWw6IHN0cmluZzsgaWQ6IG51bWJlciB9W107XHJcbiAgZ3JleU5vZGVTdHlsZTogQ3VzdG9tTm9kZVN0eWxlO1xyXG4gIG9yZ0RhdGE6IE9yZ0RhdGFJdGVtW107XHJcbn1cclxuICAiXX0=
@@ -0,0 +1,209 @@
1
+ import { Component, ViewChild, Input } from '@angular/core';
2
+ import { checkPropsType, downloadChart } from '../../utils/chart-download.util';
3
+ import { OrganizationChart } from 'primeng/organizationchart';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ import * as i2 from "primeng/api";
7
+ import * as i3 from "@angular/forms";
8
+ import * as i4 from "primeng/organizationchart";
9
+ import * as i5 from "@angular/material/input";
10
+ import * as i6 from "@angular/material/form-field";
11
+ import * as i7 from "@angular/material/menu";
12
+ import * as i8 from "@angular/material/button";
13
+ import * as i9 from "@angular/material/icon";
14
+ /** Displays an organizational chart with nodes and relationships (Org Chart Component) */
15
+ export class OrgChartComponent {
16
+ constructor() {
17
+ this.searchText = '';
18
+ this.hoveredNode = null;
19
+ }
20
+ /** Initializes the component */
21
+ ngOnInit() {
22
+ let updatedJson = this.addDefaultKeysIfNotAvailable(this.rucInputData);
23
+ this.rucInputData.orgData = this.updateRucInputData(updatedJson.orgData);
24
+ checkPropsType(this.rucInputData); // To check rucInputData is in correct format or not
25
+ this.expandAllNodes();
26
+ }
27
+ /** add default property for grey nodes if user does not provided */
28
+ addDefaultKeysIfNotAvailable(orgData) {
29
+ if (!orgData.hasOwnProperty('greyNodeStyle')) {
30
+ orgData.greyNodeStyle = {
31
+ backgroundColor: '#d3d3d3',
32
+ color: '#808080',
33
+ };
34
+ }
35
+ return orgData;
36
+ }
37
+ /** manipulate input json as If customNodeStyle exists, create originalStyle for node and its children */
38
+ updateRucInputData(data) {
39
+ return data.map((node) => {
40
+ node['type'] = 'person';
41
+ if (node.customNodeStyle) {
42
+ node.originalStyle = { ...node.customNodeStyle };
43
+ }
44
+ if (node.children && node.children.length > 0) {
45
+ node['type'] = 'person';
46
+ node.children = this.updateRucInputData(node.children); // Recursive call
47
+ }
48
+ return node;
49
+ });
50
+ }
51
+ /** Expands all nodes in the org chart */
52
+ expandAllNodes() {
53
+ this.rucInputData.orgData = this.expandNodes(this.rucInputData.orgData);
54
+ }
55
+ /** Recursively expands all nodes in the given array
56
+ * @param nodes Nodes to expand @returns Expanded nodes */
57
+ expandNodes(nodes) {
58
+ return nodes.map((node) => ({
59
+ ...node,
60
+ expanded: true,
61
+ children: node.children ? this.expandNodes(node.children) : [],
62
+ }));
63
+ }
64
+ /** Collapses all nodes in the org chart */
65
+ collapseAllNodes() {
66
+ this.rucInputData.orgData = this.collapseNodes(this.rucInputData.orgData);
67
+ }
68
+ /** Recursively collapses all nodes in the given array
69
+ * @param nodes Nodes to collapse @returns Collapsed nodes */
70
+ collapseNodes(nodes) {
71
+ return nodes.map((node) => ({
72
+ ...node,
73
+ expanded: false,
74
+ children: node.children ? this.collapseNodes(node.children) : [],
75
+ }));
76
+ }
77
+ /** Gets the background color of a node based on search text
78
+ @param node Node to check @returns Whether the node matches the search text */
79
+ getBackgroungColorOfNode(node) {
80
+ return (!this.searchText ||
81
+ node.data.title.toLowerCase().includes(this.searchText.toLowerCase()) ||
82
+ node.data.name.toLowerCase().includes(this.searchText.toLowerCase()) ||
83
+ node.label?.toLowerCase().includes(this.searchText.toLowerCase()));
84
+ }
85
+ /** Handles node hover event @param node Hovered node */
86
+ onNodeHover(node) {
87
+ if (this.searchText)
88
+ return;
89
+ this.hoveredNode = node;
90
+ this.updateNodeStyles();
91
+ }
92
+ /** Handles node leave event */
93
+ onNodeLeave() {
94
+ this.hoveredNode = null;
95
+ this.resetNodeStyles();
96
+ }
97
+ /** Updates node styles based on the hovered node */
98
+ updateNodeStyles() {
99
+ this.applyStyles(this.rucInputData.orgData, true);
100
+ }
101
+ /** Resets node styles to their original state */
102
+ resetNodeStyles() {
103
+ this.applyStyles(this.rucInputData.orgData, false);
104
+ }
105
+ /** Applies grey node style to non-matching nodes @param nodes Nodes to apply styles to */
106
+ applyGreyNodes(nodes) {
107
+ nodes.forEach((node) => {
108
+ const isMatching = this.searchText
109
+ ? node.data?.title.includes(this.searchText)
110
+ : false;
111
+ node.customNodeStyle = isMatching
112
+ ? node.customNodeStyle || node.originalStyle
113
+ : {
114
+ ...node.originalStyle,
115
+ backgroundColor: this.rucInputData.greyNodeStyle.backgroundColor,
116
+ color: this.rucInputData.greyNodeStyle.color,
117
+ };
118
+ if (node.children) {
119
+ this.applyGreyNodes(node.children);
120
+ }
121
+ });
122
+ }
123
+ /** Applies styles to nodes based on the hovered node
124
+ * @param nodes Nodes to apply styles @param isHovered Whether the node is hovered */
125
+ applyStyles(nodes, isHovered) {
126
+ nodes.forEach((node) => {
127
+ if (isHovered) {
128
+ node.customNodeStyle =
129
+ node === this.hoveredNode ||
130
+ this.isParent(node, this.hoveredNode) ||
131
+ this.isChild(node, this.hoveredNode)
132
+ ? node.customNodeStyle || node.originalStyle
133
+ : {
134
+ ...node.originalStyle,
135
+ backgroundColor: this.rucInputData.greyNodeStyle.backgroundColor,
136
+ color: this.rucInputData.greyNodeStyle.color,
137
+ };
138
+ }
139
+ else {
140
+ node.customNodeStyle = node.originalStyle;
141
+ }
142
+ if (node.children) {
143
+ this.applyStyles(node.children, isHovered);
144
+ }
145
+ });
146
+ }
147
+ /** Use the downloadChart utility method */
148
+ downloadChart(format) {
149
+ const chartContainer = this.orgChart.el.nativeElement;
150
+ downloadChart(chartContainer, format); // Calls the utility function
151
+ }
152
+ /** Handles menu click event @param id Menu item ID */
153
+ onMenuClick(id, event) {
154
+ event.preventDefault();
155
+ event.stopPropagation();
156
+ switch (id) {
157
+ case 1:
158
+ this.downloadChart('pdf');
159
+ break;
160
+ case 2:
161
+ this.downloadChart('png');
162
+ break;
163
+ case 3:
164
+ this.downloadChart('jpeg');
165
+ break;
166
+ case 4:
167
+ this.expandAllNodes();
168
+ break;
169
+ case 5:
170
+ this.collapseAllNodes();
171
+ break;
172
+ default:
173
+ console.warn(`Unknown menu item ID: ${id}. Please enter valid id.`);
174
+ break;
175
+ }
176
+ }
177
+ /** Gets tooltip data for a node @param node Node to get tooltip data */
178
+ getTooltipData(node) {
179
+ return node.description || '';
180
+ }
181
+ /** Checks if a node is a parent of another node.
182
+ * @param currentNode The current node to check.
183
+ * @param hoveredNode The node to check for parentage.
184
+ * @returns Whether the current node is a parent of the hovered node. */
185
+ isParent(currentNode, hoveredNode) {
186
+ return hoveredNode && currentNode.children?.includes(hoveredNode);
187
+ }
188
+ /** Checks if a node is a child of another node.
189
+ * @param node The node to check for child status
190
+ * @param target The node to check for parentage.
191
+ * @returns Whether the node is a child of the target node.*/
192
+ isChild(node, target) {
193
+ return target && target.children?.includes(node);
194
+ }
195
+ }
196
+ OrgChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OrgChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
197
+ 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 *ngIf=\"node.data.image\"><img [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\" *ngIf=\"node.data.image\" >\r\n <img [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\" *ngIf=\"node.data.image\">\r\n <img [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"] }] });
198
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OrgChartComponent, decorators: [{
199
+ type: Component,
200
+ 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 *ngIf=\"node.data.image\"><img [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\" *ngIf=\"node.data.image\" >\r\n <img [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\" *ngIf=\"node.data.image\">\r\n <img [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"] }]
201
+ }], propDecorators: { rucInputData: [{
202
+ type: Input
203
+ }], customTheme: [{
204
+ type: Input
205
+ }], orgChart: [{
206
+ type: ViewChild,
207
+ args: ['orgChart', { static: false }]
208
+ }] } });
209
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnLWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvb3JnLWNoYXJ0L29yZy1jaGFydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL29yZy1jaGFydC9vcmctY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7Ozs7Ozs7O0FBRTlELDJGQUEyRjtBQU0zRixNQUFNLE9BQU8saUJBQWlCO0lBTDlCO1FBU0UsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNoQixnQkFBVyxHQUEwQixJQUFJLENBQUM7S0EyTTNDO0lBdk1DLGlDQUFpQztJQUNqQyxRQUFRO1FBQ04sSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pFLGNBQWMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxxREFBcUQ7UUFDeEYsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxvRUFBb0U7SUFDcEUsNEJBQTRCLENBQUMsT0FBZ0I7UUFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLEVBQUU7WUFDNUMsT0FBTyxDQUFDLGFBQWEsR0FBRztnQkFDdEIsZUFBZSxFQUFFLFNBQVM7Z0JBQzFCLEtBQUssRUFBRSxT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N0IsU0FBUzsrQkFDRSxlQUFlOzhCQUtoQixZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBS29DLFFBQVE7c0JBQWpELFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q2hpbGQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEN1c3RvbVRyZWVOb2RlLCBPcmdEYXRhLCBPcmdEYXRhSXRlbSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvb3JnLWNoYXJ0JztcclxuaW1wb3J0IHsgVHJlZU5vZGUgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IGNoZWNrUHJvcHNUeXBlLCBkb3dubG9hZENoYXJ0IH0gZnJvbSAnLi4vLi4vdXRpbHMvY2hhcnQtZG93bmxvYWQudXRpbCc7XHJcbmltcG9ydCB7IE9yZ2FuaXphdGlvbkNoYXJ0IH0gZnJvbSAncHJpbWVuZy9vcmdhbml6YXRpb25jaGFydCc7XHJcblxyXG4vKiogRGlzcGxheXMgYW4gb3JnYW5pemF0aW9uYWwgY2hhcnQgd2l0aCBub2RlcyBhbmQgcmVsYXRpb25zaGlwcyAoT3JnIENoYXJ0IENvbXBvbmVudCkgICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAndXhwLW9yZy1jaGFydCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL29yZy1jaGFydC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vb3JnLWNoYXJ0LmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBPcmdDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgcnVjSW5wdXREYXRhITogT3JnRGF0YTtcclxuICBASW5wdXQoKSBjdXN0b21UaGVtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHNlbGVjdGVkTm9kZXMhOiBDdXN0b21UcmVlTm9kZVtdO1xyXG4gIHNlYXJjaFRleHQgPSAnJztcclxuICBob3ZlcmVkTm9kZTogQ3VzdG9tVHJlZU5vZGUgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgQFZpZXdDaGlsZCgnb3JnQ2hhcnQnLCB7IHN0YXRpYzogZmFsc2UgfSkgb3JnQ2hhcnQhOiBPcmdhbml6YXRpb25DaGFydDtcclxuXHJcbiAgLyoqIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQgICovXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBsZXQgdXBkYXRlZEpzb24gPSB0aGlzLmFkZERlZmF1bHRLZXlzSWZOb3RBdmFpbGFibGUodGhpcy5ydWNJbnB1dERhdGEpO1xyXG4gICAgdGhpcy5ydWNJbnB1dERhdGEub3JnRGF0YSA9IHRoaXMudXBkYXRlUnVjSW5wdXREYXRhKHVwZGF0ZWRKc29uLm9yZ0RhdGEpO1xyXG4gICAgY2hlY2tQcm9wc1R5cGUodGhpcy5ydWNJbnB1dERhdGEpOyAvLyBUbyBjaGVjayBydWNJbnB1dERhdGEgaXMgaW4gY29ycmVjdCBmb3JtYXQgb3Igbm90IFxyXG4gICAgdGhpcy5leHBhbmRBbGxOb2RlcygpO1xyXG4gIH0gXHJcblxyXG4gIC8qKiBhZGQgZGVmYXVsdCBwcm9wZXJ0eSBmb3IgZ3JleSBub2RlcyBpZiB1c2VyIGRvZXMgbm90IHByb3ZpZGVkICovXHJcbiAgYWRkRGVmYXVsdEtleXNJZk5vdEF2YWlsYWJsZShvcmdEYXRhOiBPcmdEYXRhKSB7XHJcbiAgICBpZiAoIW9yZ0RhdGEuaGFzT3duUHJvcGVydHkoJ2dyZXlOb2RlU3R5bGUnKSkge1xyXG4gICAgICBvcmdEYXRhLmdyZXlOb2RlU3R5bGUgPSB7XHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnI2QzZDNkMycsXHJcbiAgICAgICAgY29sb3I6ICcjODA4MDgwJyxcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiBvcmdEYXRhO1xyXG4gIH1cclxuXHJcbiAgLyoqIG1hbmlwdWxhdGUgaW5wdXQganNvbiBhcyBJZiBjdXN0b21Ob2RlU3R5bGUgZXhpc3RzLCBjcmVhdGUgb3JpZ2luYWxTdHlsZSBmb3Igbm9kZSBhbmQgaXRzIGNoaWxkcmVuICAqL1xyXG4gIHVwZGF0ZVJ1Y0lucHV0RGF0YShkYXRhOiBPcmdEYXRhSXRlbVtdKTogT3JnRGF0YUl0ZW1bXSB7XHJcbiAgICByZXR1cm4gZGF0YS5tYXAoKG5vZGU6IE9yZ0RhdGFJdGVtKSA9PiB7XHJcbiAgICAgIG5vZGVbJ3R5cGUnXSA9ICdwZXJzb24nO1xyXG4gICAgICBpZiAobm9kZS5jdXN0b21Ob2RlU3R5bGUpIHtcclxuICAgICAgICBub2RlLm9yaWdpbmFsU3R5bGUgPSB7IC4uLm5vZGUuY3VzdG9tTm9kZVN0eWxlIH07XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbm9kZVsndHlwZSddID0gJ3BlcnNvbic7XHJcbiAgICAgICAgbm9kZS5jaGlsZHJlbiA9IHRoaXMudXBkYXRlUnVjSW5wdXREYXRhKG5vZGUuY2hpbGRyZW4pOyAvLyBSZWN1cnNpdmUgY2FsbFxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBub2RlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogRXhwYW5kcyBhbGwgbm9kZXMgaW4gdGhlIG9yZyBjaGFydCAqL1xyXG4gIGV4cGFuZEFsbE5vZGVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5ydWNJbnB1dERhdGEub3JnRGF0YSA9IHRoaXMuZXhwYW5kTm9kZXModGhpcy5ydWNJbnB1dERhdGEub3JnRGF0YSk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVjdXJzaXZlbHkgZXhwYW5kcyBhbGwgbm9kZXMgaW4gdGhlIGdpdmVuIGFycmF5XHJcbiAgICogQHBhcmFtIG5vZGVzIE5vZGVzIHRvIGV4cGFuZCBAcmV0dXJucyBFeHBhbmRlZCBub2RlcyAqL1xyXG4gIGV4cGFuZE5vZGVzKG5vZGVzOiBPcmdEYXRhSXRlbVtdKTogT3JnRGF0YUl0ZW1bXSB7XHJcbiAgICByZXR1cm4gbm9kZXMubWFwKChub2RlKSA9PiAoe1xyXG4gICAgICAuLi5ub2RlLFxyXG4gICAgICBleHBhbmRlZDogdHJ1ZSxcclxuICAgICAgY2hpbGRyZW46IG5vZGUuY2hpbGRyZW4gPyB0aGlzLmV4cGFuZE5vZGVzKG5vZGUuY2hpbGRyZW4pIDogW10sXHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICAvKiogQ29sbGFwc2VzIGFsbCBub2RlcyBpbiB0aGUgb3JnIGNoYXJ0ICAgKi9cclxuICBjb2xsYXBzZUFsbE5vZGVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5ydWNJbnB1dERhdGEub3JnRGF0YSA9IHRoaXMuY29sbGFwc2VOb2Rlcyh0aGlzLnJ1Y0lucHV0RGF0YS5vcmdEYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKiBSZWN1cnNpdmVseSBjb2xsYXBzZXMgYWxsIG5vZGVzIGluIHRoZSBnaXZlbiBhcnJheVxyXG4gICAqIEBwYXJhbSBub2RlcyBOb2RlcyB0byBjb2xsYXBzZSBAcmV0dXJucyBDb2xsYXBzZWQgbm9kZXMgICovXHJcbiAgY29sbGFwc2VOb2Rlcyhub2RlczogT3JnRGF0YUl0ZW1bXSk6IE9yZ0RhdGFJdGVtW10ge1xyXG4gICAgcmV0dXJuIG5vZGVzLm1hcCgobm9kZSkgPT4gKHtcclxuICAgICAgLi4ubm9kZSxcclxuICAgICAgZXhwYW5kZWQ6IGZhbHNlLFxyXG4gICAgICBjaGlsZHJlbjogbm9kZS5jaGlsZHJlbiA/IHRoaXMuY29sbGFwc2VOb2Rlcyhub2RlLmNoaWxkcmVuKSA6IFtdLFxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEdldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgYSBub2RlIGJhc2VkIG9uIHNlYXJjaCB0ZXh0XHJcbiAgICBAcGFyYW0gbm9kZSBOb2RlIHRvIGNoZWNrIEByZXR1cm5zIFdoZXRoZXIgdGhlIG5vZGUgbWF0Y2hlcyB0aGUgc2VhcmNoIHRleHQgKi9cclxuICBnZXRCYWNrZ3JvdW5nQ29sb3JPZk5vZGUobm9kZTogQ3VzdG9tVHJlZU5vZGUpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgICF0aGlzLnNlYXJjaFRleHQgfHxcclxuICAgICAgbm9kZS5kYXRhLnRpdGxlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zZWFyY2hUZXh0LnRvTG93ZXJDYXNlKCkpIHx8XHJcbiAgICAgIG5vZGUuZGF0YS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zZWFyY2hUZXh0LnRvTG93ZXJDYXNlKCkpIHx8XHJcbiAgICAgIG5vZGUubGFiZWw/LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zZWFyY2hUZXh0LnRvTG93ZXJDYXNlKCkpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqIEhhbmRsZXMgbm9kZSBob3ZlciBldmVudCBAcGFyYW0gbm9kZSBIb3ZlcmVkIG5vZGUgKi9cclxuICBvbk5vZGVIb3Zlcihub2RlOiBDdXN0b21UcmVlTm9kZSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc2VhcmNoVGV4dCkgcmV0dXJuO1xyXG4gICAgdGhpcy5ob3ZlcmVkTm9kZSA9IG5vZGU7XHJcbiAgICB0aGlzLnVwZGF0ZU5vZGVTdHlsZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKiBIYW5kbGVzIG5vZGUgbGVhdmUgZXZlbnQgKi9cclxuICBvbk5vZGVMZWF2ZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuaG92ZXJlZE5vZGUgPSBudWxsO1xyXG4gICAgdGhpcy5yZXNldE5vZGVTdHlsZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKiAgIFVwZGF0ZXMgbm9kZSBzdHlsZXMgYmFzZWQgb24gdGhlIGhvdmVyZWQgbm9kZSAqL1xyXG4gIHVwZGF0ZU5vZGVTdHlsZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFwcGx5U3R5bGVzKHRoaXMucnVjSW5wdXREYXRhLm9yZ0RhdGEsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqICAgUmVzZXRzIG5vZGUgc3R5bGVzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlICovXHJcbiAgcmVzZXROb2RlU3R5bGVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy5hcHBseVN0eWxlcyh0aGlzLnJ1Y0lucHV0RGF0YS5vcmdEYXRhLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICAvKiogQXBwbGllcyBncmV5IG5vZGUgc3R5bGUgdG8gbm9uLW1hdGNoaW5nIG5vZGVzIEBwYXJhbSBub2RlcyBOb2RlcyB0byBhcHBseSBzdHlsZXMgdG8gKi9cclxuICBhcHBseUdyZXlOb2Rlcyhub2RlczpPcmdEYXRhSXRlbVtdKTogdm9pZCB7XHJcbiAgICBub2Rlcy5mb3JFYWNoKChub2RlOiBPcmdEYXRhSXRlbSkgPT4ge1xyXG4gICAgICBjb25zdCBpc01hdGNoaW5nID0gdGhpcy5zZWFyY2hUZXh0XHJcbiAgICAgICAgPyBub2RlLmRhdGE/LnRpdGxlLmluY2x1ZGVzKHRoaXMuc2VhcmNoVGV4dClcclxuICAgICAgICA6IGZhbHNlO1xyXG4gICAgICBub2RlLmN1c3RvbU5vZGVTdHlsZSA9IGlzTWF0Y2hpbmdcclxuICAgICAgICA/IG5vZGUuY3VzdG9tTm9kZVN0eWxlIHx8IG5vZGUub3JpZ2luYWxTdHlsZVxyXG4gICAgICAgIDoge1xyXG4gICAgICAgICAgICAuLi5ub2RlLm9yaWdpbmFsU3R5bGUsXHJcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5ydWNJbnB1dERhdGEuZ3JleU5vZGVTdHlsZS5iYWNrZ3JvdW5kQ29sb3IsXHJcbiAgICAgICAgICAgIGNvbG9yOiB0aGlzLnJ1Y0lucHV0RGF0YS5ncmV5Tm9kZVN0eWxlLmNvbG9yLFxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgdGhpcy5hcHBseUdyZXlOb2Rlcyhub2RlLmNoaWxkcmVuKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogQXBwbGllcyBzdHlsZXMgdG8gbm9kZXMgYmFzZWQgb24gdGhlIGhvdmVyZWQgbm9kZVxyXG4gICAqIEBwYXJhbSBub2RlcyBOb2RlcyB0byBhcHBseSBzdHlsZXMgQHBhcmFtIGlzSG92ZXJlZCBXaGV0aGVyIHRoZSBub2RlIGlzIGhvdmVyZWQgKi9cclxuICBhcHBseVN0eWxlcyhub2RlczogT3JnRGF0YUl0ZW1bXSwgaXNIb3ZlcmVkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBub2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XHJcbiAgICAgIGlmIChpc0hvdmVyZWQpIHtcclxuICAgICAgICBub2RlLmN1c3RvbU5vZGVTdHlsZSA9XHJcbiAgICAgICAgICBub2RlID09PSB0aGlzLmhvdmVyZWROb2RlIHx8XHJcbiAgICAgICAgICB0aGlzLmlzUGFyZW50KG5vZGUsIHRoaXMuaG92ZXJlZE5vZGUpIHx8XHJcbiAgICAgICAgICB0aGlzLmlzQ2hpbGQobm9kZSwgdGhpcy5ob3ZlcmVkTm9kZSlcclxuICAgICAgICAgICAgPyBub2RlLmN1c3RvbU5vZGVTdHlsZSB8fCBub2RlLm9yaWdpbmFsU3R5bGVcclxuICAgICAgICAgICAgOiB7XHJcbiAgICAgICAgICAgICAgICAuLi5ub2RlLm9yaWdpbmFsU3R5bGUsXHJcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMucnVjSW5wdXREYXRhLmdyZXlOb2RlU3R5bGUuYmFja2dyb3VuZENvbG9yLFxyXG4gICAgICAgICAgICAgICAgY29sb3I6IHRoaXMucnVjSW5wdXREYXRhLmdyZXlOb2RlU3R5bGUuY29sb3IsXHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBub2RlLmN1c3RvbU5vZGVTdHlsZSA9IG5vZGUub3JpZ2luYWxTdHlsZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcclxuICAgICAgICB0aGlzLmFwcGx5U3R5bGVzKG5vZGUuY2hpbGRyZW4sIGlzSG92ZXJlZCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqICBVc2UgdGhlIGRvd25sb2FkQ2hhcnQgdXRpbGl0eSBtZXRob2QgKi9cclxuICBkb3dubG9hZENoYXJ0KGZvcm1hdDogJ3BuZycgfCAnanBlZycgfCAncGRmJyk6IHZvaWQge1xyXG4gICAgY29uc3QgY2hhcnRDb250YWluZXIgPSB0aGlzLm9yZ0NoYXJ0LmVsLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBkb3dubG9hZENoYXJ0KGNoYXJ0Q29udGFpbmVyLCBmb3JtYXQpOyAvLyBDYWxscyB0aGUgdXRpbGl0eSBmdW5jdGlvblxyXG4gIH1cclxuXHJcbiAgLyoqIEhhbmRsZXMgbWVudSBjbGljayBldmVudCBAcGFyYW0gaWQgTWVudSBpdGVtIElEICAqL1xyXG4gIG9uTWVudUNsaWNrKGlkOiBudW1iZXIsZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHN3aXRjaCAoaWQpIHtcclxuICAgICAgY2FzZSAxOlxyXG4gICAgICAgIHRoaXMuZG93bmxvYWRDaGFydCgncGRmJyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgMjpcclxuICAgICAgICB0aGlzLmRvd25sb2FkQ2hhcnQoJ3BuZycpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDM6XHJcbiAgICAgICAgdGhpcy5kb3dubG9hZENoYXJ0KCdqcGVnJyk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgNDpcclxuICAgICAgICB0aGlzLmV4cGFuZEFsbE5vZGVzKCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgNTpcclxuICAgICAgICB0aGlzLmNvbGxhcHNlQWxsTm9kZXMoKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBjb25zb2xlLndhcm4oYFVua25vd24gbWVudSBpdGVtIElEOiAke2lkfS4gUGxlYXNlIGVudGVyIHZhbGlkIGlkLmApO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEdldHMgdG9vbHRpcCBkYXRhIGZvciBhIG5vZGUgQHBhcmFtIG5vZGUgTm9kZSB0byBnZXQgdG9vbHRpcCBkYXRhICovXHJcbiAgZ2V0VG9vbHRpcERhdGEobm9kZTogQ3VzdG9tVHJlZU5vZGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIG5vZGUuZGVzY3JpcHRpb24gfHwgJyc7XHJcbiAgfVxyXG5cclxuICAvKiogQ2hlY2tzIGlmIGEgbm9kZSBpcyBhIHBhcmVudCBvZiBhbm90aGVyIG5vZGUuXHJcbiAgICogQHBhcmFtIGN1cnJlbnROb2RlIFRoZSBjdXJyZW50IG5vZGUgdG8gY2hlY2suXHJcbiAgICogQHBhcmFtIGhvdmVyZWROb2RlIFRoZSBub2RlIHRvIGNoZWNrIGZvciBwYXJlbnRhZ2UuXHJcbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgY3VycmVudCBub2RlIGlzIGEgcGFyZW50IG9mIHRoZSBob3ZlcmVkIG5vZGUuICovXHJcbiAgaXNQYXJlbnQoXHJcbiAgICBjdXJyZW50Tm9kZTogVHJlZU5vZGUsXHJcbiAgICBob3ZlcmVkTm9kZTogVHJlZU5vZGUgfCBudWxsXHJcbiAgKTogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIGhvdmVyZWROb2RlICYmIGN1cnJlbnROb2RlLmNoaWxkcmVuPy5pbmNsdWRlcyhob3ZlcmVkTm9kZSk7XHJcbiAgfVxyXG5cclxuICAvKiogQ2hlY2tzIGlmIGEgbm9kZSBpcyBhIGNoaWxkIG9mIGFub3RoZXIgbm9kZS5cclxuICAgKiBAcGFyYW0gbm9kZSBUaGUgbm9kZSB0byBjaGVjayBmb3IgY2hpbGQgc3RhdHVzXHJcbiAgICogQHBhcmFtIHRhcmdldCBUaGUgbm9kZSB0byBjaGVjayBmb3IgcGFyZW50YWdlLlxyXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIG5vZGUgaXMgYSBjaGlsZCBvZiB0aGUgdGFyZ2V0IG5vZGUuKi9cclxuICBpc0NoaWxkKG5vZGU6IFRyZWVOb2RlLCB0YXJnZXQ6IFRyZWVOb2RlIHwgbnVsbCk6IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0YXJnZXQgJiYgdGFyZ2V0LmNoaWxkcmVuPy5pbmNsdWRlcyhub2RlKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz17e2N1c3RvbVRoZW1lfX0+XHJcbiAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxyXG4gICAgPCEtLSBIYW1idXJnZXIgTWVudSAtLT5cclxuICAgIDxidXR0b24gKm5nSWY9XCJydWNJbnB1dERhdGEuaXNEaXNwbGF5SGFtYmVyZ2VyTWVudSA9PT0gdHJ1ZVwiIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudVwiIFxyXG4gICAgICBjbGFzcz1cImxlZnQgaGFtYnVyZ2VyLWJ1dHRvblwiPlxyXG4gICAgICA8bWF0LWljb24+bWVudTwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICBcclxuICAgIDwhLS0gTWVudSAtLT5cclxuICAgIDxtYXQtbWVudSAjbWVudT1cIm1hdE1lbnVcIj5cclxuICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgbWVudSBvZiBydWNJbnB1dERhdGEuaGFtYmVyZ2VyTWVudUxpc3RcIiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJvbk1lbnVDbGljayhtZW51LmlkLCAkZXZlbnQpO1wiIFxyXG4gICAgICBbaWRdPVwiJ21lbnUtaXRlbS0nICsgbWVudS5pZFwiPlxyXG4gICAgICAgIHt7IG1lbnUubGFiZWwgfX1cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L21hdC1tZW51PlxyXG4gIFxyXG4gICAgPCEtLSBTZWFyY2ggQmFyIC0tPlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwicnVjSW5wdXREYXRhLmlzRGlzcGxheVNlYXJjaEJhciA9PT0gdHJ1ZVwiIGNsYXNzPVwic2VhcmNoLWJveCByaWdodFwiIFxyXG4gICAgICA+XHJcbiAgICAgIDxtYXQtbGFiZWw+U2VhcmNoPC9tYXQtbGFiZWw+XHJcbiAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIlR5cGUgdG8gc2VhcmNoLi4uXCIgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXh0XCIgLz5cclxuICAgICAgPG1hdC1pY29uIG1hdFN1ZmZpeD5zZWFyY2g8L21hdC1pY29uPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICA8L2Rpdj5cclxuICBcclxuICBcclxuICA8ZGl2IGNsYXNzPVwib3JnLWNoYXJ0LWNvbnRhaW5lciBcIiBpZD1cIm9yZy1jaGFydC1kYXRhXCI+XHJcbiAgPHAtb3JnYW5pemF0aW9uQ2hhcnQgI29yZ0NoYXJ0IGNsYXNzPVwib3JnLWNoYXJ0XCIgW3ZhbHVlXT1cInRoaXMucnVjSW5wdXREYXRhLm9yZ0RhdGFcIiBzZWxlY3Rpb25Nb2RlPVwibXVsdGlwbGVcIlxyXG4gICAgWyhzZWxlY3Rpb24pXT1cInNlbGVjdGVkTm9kZXNcIj5cclxuICAgIDxuZy10ZW1wbGF0ZSBsZXQtbm9kZSBwVGVtcGxhdGU9XCJwZXJzb25cIj5cclxuICAgICAgPGRpdiAqbmdJZj1cInRoaXMucnVjSW5wdXREYXRhLm5vZGVUZW1wbGF0ZSA9PT0gJ3BvcnRyYWl0J1wiICBjbGFzcz1cImZsZXggZmxleC1jb2wgbm9kZUNvbnRlbnRcIiBbbmdTdHlsZV09XCJnZXRCYWNrZ3JvdW5nQ29sb3JPZk5vZGUobm9kZSkgPyBub2RlLmN1c3RvbU5vZGVTdHlsZSA6IHJ1Y0lucHV0RGF0YS5ncmV5Tm9kZVN0eWxlXCIgKG1vdXNlZW50ZXIpPVwib25Ob2RlSG92ZXIobm9kZSlcIlxyXG4gICAgICAgIFt0aXRsZV09XCJnZXRUb29sdGlwRGF0YShub2RlKVwiIChtb3VzZWxlYXZlKT1cIm9uTm9kZUxlYXZlKClcIj4gXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyXCIgID5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwibm9kZS5kYXRhLmltYWdlXCI+PGltZyAgIFtzcmNdPVwibm9kZS5kYXRhLmltYWdlXCIgY2xhc3M9XCJwb3J0cmFpdEltYWdlRGltZW5zaW9uXCIgLz48L3NwYW4+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1ib2xkIG1iLTJcIj57eyBub2RlLmRhdGEubmFtZSB9fTwvZGl2PlxyXG4gICAgICAgICAgPGRpdj57eyBub2RlLmRhdGEudGl0bGUgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICBcclxuICAgICAgPGRpdiAqbmdJZj1cInRoaXMucnVjSW5wdXREYXRhLm5vZGVUZW1wbGF0ZSA9PT0gJ3RyaWFuZ2xlJ1wiICBjbGFzcz1cImZsZXggdHJpYW5sZ2UtdXAgZmxleC1jb2wgbm9kZUNvbnRlbnRcIiBbbmdTdHlsZV09XCJnZXRCYWNrZ3JvdW5nQ29sb3JPZk5vZGUobm9kZSkgPyBub2RlLmN1c3RvbU5vZGVTdHlsZSA6IHJ1Y0lucHV0RGF0YS5ncmV5Tm9kZVN0eWxlXCIgKG1vdXNlZW50ZXIpPVwib25Ob2RlSG92ZXIobm9kZSlcIlxyXG4gICAgICAgIFt0aXRsZV09XCJnZXRUb29sdGlwRGF0YShub2RlKVwiIChtb3VzZWxlYXZlKT1cIm9uTm9kZUxlYXZlKClcIj4gXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyXCIgKm5nSWY9XCJub2RlLmRhdGEuaW1hZ2VcIiA+XHJcbiAgICAgICAgICA8aW1nICBbc3JjXT1cIm5vZGUuZGF0YS5pbWFnZVwiIGNsYXNzPVwidHJpYW5nbGVJbWFnZURpbWVuc2lvblwiIC8+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1ib2xkIG1iLTJcIj57eyBub2RlLmRhdGEubmFtZSB9fTwvZGl2PlxyXG4gICAgICAgICAgPGRpdj57eyBub2RlLmRhdGEudGl0bGUgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDxkaXYgKm5nSWY9XCJ0aGlzLnJ1Y0lucHV0RGF0YS5ub2RlVGVtcGxhdGUgPT09ICdsYW5kc2NhcGUnXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGJvcmRlclNvbGlkR3JleVwiIFtuZ1N0eWxlXT1cImdldEJhY2tncm91bmdDb2xvck9mTm9kZShub2RlKSA/IG5vZGUuY3VzdG9tTm9kZVN0eWxlIDogcnVjSW5wdXREYXRhLmdyZXlOb2RlU3R5bGVcIlxyXG4gICAgICAobW91c2VlbnRlcik9XCJvbk5vZGVIb3Zlcihub2RlKVwiXHJcbiAgICAgIFt0aXRsZV09XCJnZXRUb29sdGlwRGF0YShub2RlKVwiIChtb3VzZWxlYXZlKT1cIm9uTm9kZUxlYXZlKClcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm9keVwiID5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uXCIgKm5nSWY9XCJub2RlLmRhdGEuaW1hZ2VcIj5cclxuICAgICAgICAgICAgPGltZyAgW3NyY109XCJub2RlLmRhdGEuaW1hZ2VcIiBjbGFzcz1cImxhbmRzY2FwZUltYWdlRGltZW5zaW9uXCIgLz5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICA8ZGl2Pnt7bm9kZS5kYXRhLm5hbWV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXY+e3tub2RlLmRhdGEudGl0bGV9fTwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+IFxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L3Atb3JnYW5pemF0aW9uQ2hhcnQ+XHJcbiAgPC9kaXY+XHJcbiAgXHJcbjwvZGl2PiJdfQ==
@@ -0,0 +1,26 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { ButtonModule } from 'primeng/button';
4
+ import { OrganizationChartModule } from 'primeng/organizationchart';
5
+ import { MatInputModule } from '@angular/material/input';
6
+ import { FormsModule } from '@angular/forms';
7
+ import { MatMenuModule } from '@angular/material/menu';
8
+ import { MatButtonModule } from '@angular/material/button';
9
+ import { MatIconModule } from '@angular/material/icon';
10
+ import { OrgChartComponent } from './org-chart/org-chart.component';
11
+ import { BrowserModule } from '@angular/platform-browser';
12
+ import * as i0 from "@angular/core";
13
+ export class RuclibOrgChartModule {
14
+ }
15
+ RuclibOrgChartModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibOrgChartModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
16
+ 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] });
17
+ 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] });
18
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RuclibOrgChartModule, decorators: [{
19
+ type: NgModule,
20
+ args: [{
21
+ imports: [CommonModule, ButtonModule, BrowserModule, FormsModule, OrganizationChartModule, MatInputModule, MatMenuModule, MatButtonModule, MatIconModule],
22
+ declarations: [OrgChartComponent],
23
+ exports: [OrgChartComponent]
24
+ }]
25
+ }] });
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVjbGliLW9yZy1jaGFydC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3J1Y2xpYi1vcmctY2hhcnQubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7QUFPMUQsTUFBTSxPQUFPLG9CQUFvQjs7a0hBQXBCLG9CQUFvQjttSEFBcEIsb0JBQW9CLGlCQUhoQixpQkFBaUIsYUFEdEIsWUFBWSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLHVCQUF1QixFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLGFBQWEsYUFFOUksaUJBQWlCO21IQUVoQixvQkFBb0IsWUFKckIsWUFBWSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLHVCQUF1QixFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLGFBQWE7NEZBSTdJLG9CQUFvQjtrQkFMaEMsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsdUJBQXVCLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsYUFBYSxDQUFDO29CQUN6SixZQUFZLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztvQkFDakMsT0FBTyxFQUFFLENBQUMsaUJBQWlCLENBQUM7aUJBQzdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xyXG5pbXBvcnQgeyBPcmdhbml6YXRpb25DaGFydE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvb3JnYW5pemF0aW9uY2hhcnQnO1xyXG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBPcmdDaGFydENvbXBvbmVudCB9IGZyb20gJy4vb3JnLWNoYXJ0L29yZy1jaGFydC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBCcm93c2VyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEJ1dHRvbk1vZHVsZSwgQnJvd3Nlck1vZHVsZSwgRm9ybXNNb2R1bGUsIE9yZ2FuaXphdGlvbkNoYXJ0TW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgTWF0TWVudU1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBNYXRJY29uTW9kdWxlXSxcclxuICBkZWNsYXJhdGlvbnM6IFtPcmdDaGFydENvbXBvbmVudF0sXHJcbiAgZXhwb3J0czogW09yZ0NoYXJ0Q29tcG9uZW50XVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUnVjbGliT3JnQ2hhcnRNb2R1bGUge31cclxuXHJcbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVjLWxpYi1vcmctY2hhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVjLWxpYi1vcmctY2hhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=