UNPKG

rapidoc

Version:

RapiDoc - Open API spec viewer with built in console

99 lines (92 loc) 3.17 kB
import { LitElement, html } from 'lit-element'; import vars from '@/styles/vars'; import FontStyles from '@/styles/font-styles'; export default class JsonTree extends LitElement { render() { return html` ${FontStyles} <style> .tree{ font-family: var(--font-mono); font-size:12px; display:inline-block; overflow:hidden; word-break: break-all; width:100%; } .left-bracket{ display:inline-block; padding: 0 20px 0 0; cursor:pointer; border: 1px solid transparent; border-radius:3px; } .left-bracket:hover{ color:var(--primary-color); background-color:var(--hover-color); border: 1px solid var(--border-color); } .inside-bracket{ padding-left:12px; border-left:1px dotted var(--border-color); } .string{color:#86b300;} .number{color:#47afe8;} .null{color:orangered;} .boolean{color:#b96ff1} .object{color:var(--fg)} </style> <div class="tree"> ${this.generateTree(this.data)} </div> ` } static get properties() { return { data:{type: Object} }; } generateTree(data){ if (data===null){ return html`<div class="null" style="display:inline;">null</div>` } if (typeof data === 'object'){ let detailType = Array.isArray(data)?"array":"pure_object"; if (Object.keys(data).length===0){ return html`${ (Array.isArray(data)?'[ ]':'{ }') }` } return html` <div class="left-bracket expanded ${detailType==='array'?'array':'object'} " @click="${this.toggleExpand}" > ${detailType==='array'?'[':'{'}</div> <div class="inside-bracket"> ${Object.keys(data).map(key => html`<div class="item"> ${detailType==='pure_object'?html`${key}:`:``}${this.generateTree(data[key])}</div>` )} </div> <div class="right-bracket">${detailType==='array'?']':'}'}</div> ` } else{ return typeof data==='string'?html`<span class="${typeof data}">"${data}"</span>`: html`<span class="${typeof data}">${data}</span>`; } } toggleExpand(e){ console.log(e.target.nextElementSibling); if (e.target.classList.contains("expanded")){ e.target.classList.add("collapsed"); e.target.classList.remove("expanded"); e.target.innerHTML = e.target.classList.contains("array")? "[...]":"{...}"; e.target.nextElementSibling.style.display = "none"; e.target.nextElementSibling.nextElementSibling.style.display= "none"; } else{ e.target.classList.remove("collapsed"); e.target.classList.add("expanded"); e.target.innerHTML = e.target.classList.contains("array")? "[":"{"; e.target.nextElementSibling.style.display = "block"; e.target.nextElementSibling.nextElementSibling.style.display= "block"; } //console.log(e.target.parentElement.querySelectorAll(":scope > .inside-bracket")); } } // Register the element with the browser customElements.define('json-tree', JsonTree);