src/frontend/packages/core/src/shared/components/json-viewer/json-viewer.component.ts
import { Component, Input, OnChanges } from '@angular/core';
export interface Segment {
key: string;
value: any;
type: undefined | string;
description: string;
expanded: boolean;
}
@Component({
selector: 'app-json-viewer',
templateUrl: './json-viewer.component.html',
styleUrls: ['./json-viewer.component.scss']
})
export class JsonViewerComponent implements OnChanges {
@Input() json: any;
@Input() root: string;
// Whether to expand all initially
@Input() expanded = true;
/**
* deprecated It will be always true and deleted in version 3.0.0
*/
@Input() cleanOnChange = true;
@Input() small = false;
segments: Segment[] = [];
expand() {
this.setExpansion(true);
}
collapse() {
this.setExpansion(false);
}
private setExpansion(expanded: boolean) {
this.segments.forEach(segment => {
segment.expanded = expanded;
});
}
ngOnChanges() {
if (this.cleanOnChange) {
this.segments = [];
}
if (!this.json) {
return;
}
if (typeof this.json === 'object') {
Object.keys(this.json).forEach(key => {
this.segments.push(this.parseKeyValue(key, this.json[key]));
});
} else {
this.segments.push(this.parseKeyValue(`(${typeof this.json})`, this.json));
}
}
isExpandable(segment: Segment) {
return segment.type === 'object' || segment.type === 'array';
}
toggle(segment: Segment) {
if (this.isExpandable(segment)) {
segment.expanded = !segment.expanded;
}
}
private parseKeyValue(key: any, value: any): Segment {
const segment: Segment = {
key,
value,
type: undefined,
description: '' + value,
expanded: this.expanded
};
switch (typeof segment.value) {
case 'number': {
segment.type = 'number';
break;
}
case 'boolean': {
segment.type = 'boolean';
break;
}
case 'function': {
segment.type = 'function';
break;
}
case 'string': {
segment.type = 'string';
segment.description = '"' + segment.value + '"';
break;
}
case 'undefined': {
segment.type = 'undefined';
segment.description = 'undefined';
break;
}
case 'object': {
// yea, null is object
if (segment.value === null) {
segment.type = 'null';
segment.description = 'null';
} else if (Array.isArray(segment.value)) {
segment.type = 'array';
segment.description = 'Array[' + segment.value.length + '] ' + JSON.stringify(segment.value);
} else if (segment.value instanceof Date) {
segment.type = 'date';
} else {
segment.type = 'object';
segment.description = 'Object ' + JSON.stringify(segment.value);
}
break;
}
}
return segment;
}
}