@grafana/ui
Version:
Grafana Components Library
1 lines • 21.4 kB
Source Map (JSON)
{"version":3,"file":"json_explorer.mjs","sources":["../../../../../src/components/JSONFormatter/json_explorer/json_explorer.ts"],"sourcesContent":["// Based on work https://github.com/mohsen1/json-formatter-js\n// License MIT, Copyright (c) 2015 Mohsen Azimi\n\nimport { isNumber } from 'lodash';\n\nimport { isObject, getObjectName, getType, getValuePreview, cssClass, createElement } from './helpers';\n\nconst DATE_STRING_REGEX =\n /(^\\d{1,4}[\\.|\\\\/|-]\\d{1,2}[\\.|\\\\/|-]\\d{1,4})(\\s*(?:0?[1-9]:[0-5]|1(?=[012])\\d:[0-5])\\d\\s*[ap]m)?$/;\nconst PARTIAL_DATE_REGEX = /\\d{2}:\\d{2}:\\d{2} GMT-\\d{4}/;\nconst JSON_DATE_REGEX = /\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}Z/;\n\n// When toggling, don't animated removal or addition of more than a few items\nconst MAX_ANIMATED_TOGGLE_ITEMS = 10;\n\nconst requestAnimationFrame =\n (typeof window !== 'undefined' && window.requestAnimationFrame) ||\n ((cb: () => void) => {\n cb();\n return 0;\n });\n\nexport interface JsonExplorerConfig {\n animateOpen?: boolean;\n animateClose?: boolean;\n theme?: string;\n}\n\nconst _defaultConfig: JsonExplorerConfig = {\n animateOpen: true,\n animateClose: true,\n};\n\n/**\n * @class JsonExplorer\n *\n * JsonExplorer allows you to render JSON objects in HTML with a\n * **collapsible** navigation.\n */\nexport class JsonExplorer {\n // Hold the open state after the toggler is used\n private _isOpen: boolean | null = null;\n\n // A reference to the element that we render to\n private element: HTMLDivElement | null = null;\n\n private skipChildren = false;\n\n /**\n * @param {object} json The JSON object you want to render. It has to be an\n * object or array. Do NOT pass raw JSON string.\n *\n * @param {number} [open=1] his number indicates up to how many levels the\n * rendered tree should expand. Set it to `0` to make the whole tree collapsed\n * or set it to `Infinity` to expand the tree deeply\n *\n * @param {object} [config=defaultConfig] -\n * defaultConfig = {\n * hoverPreviewEnabled: false,\n * hoverPreviewArrayCount: 100,\n * hoverPreviewFieldCount: 5\n * }\n *\n * Available configurations:\n * #####Hover Preview\n * * `hoverPreviewEnabled`: enable preview on hover\n * * `hoverPreviewArrayCount`: number of array items to show in preview Any\n * array larger than this number will be shown as `Array[XXX]` where `XXX`\n * is length of the array.\n * * `hoverPreviewFieldCount`: number of object properties to show for object\n * preview. Any object with more properties that thin number will be\n * truncated.\n *\n * @param {string} [key=undefined] The key that this object in its parent\n * context\n */\n constructor(\n public json: any,\n private open = 1,\n private config: JsonExplorerConfig = _defaultConfig,\n private key?: string\n ) {}\n\n /*\n * is formatter open?\n */\n private get isOpen(): boolean {\n if (this._isOpen !== null) {\n return this._isOpen;\n } else {\n return this.open > 0;\n }\n }\n\n /*\n * set open state (from toggler)\n */\n private set isOpen(value: boolean) {\n this._isOpen = value;\n }\n\n /*\n * is this a date string?\n */\n private get isDate(): boolean {\n return (\n this.type === 'string' &&\n (DATE_STRING_REGEX.test(this.json) || JSON_DATE_REGEX.test(this.json) || PARTIAL_DATE_REGEX.test(this.json))\n );\n }\n\n /*\n * is this a URL string?\n */\n private get isUrl(): boolean {\n return this.type === 'string' && this.json.indexOf('http') === 0;\n }\n\n /*\n * is this an array?\n */\n private get isArray(): boolean {\n return Array.isArray(this.json);\n }\n\n /*\n * is this an object?\n * Note: In this context arrays are object as well\n */\n private get isObject(): boolean {\n return isObject(this.json);\n }\n\n /*\n * is this an empty object with no properties?\n */\n private get isEmptyObject(): boolean {\n return !this.keys.length && !this.isArray;\n }\n\n /*\n * is this an empty object or array?\n */\n private get isEmpty(): boolean {\n return this.isEmptyObject || (this.keys && !this.keys.length && this.isArray);\n }\n\n /*\n * did we receive a key argument?\n * This means that the formatter was called as a sub formatter of a parent formatter\n */\n private get hasKey(): boolean {\n return typeof this.key !== 'undefined';\n }\n\n /*\n * if this is an object, get constructor function name\n */\n private get constructorName(): string {\n return getObjectName(this.json);\n }\n\n /*\n * get type of this value\n * Possible values: all JavaScript primitive types plus \"array\" and \"null\"\n */\n private get type(): string {\n return getType(this.json);\n }\n\n /*\n * get object keys\n * If there is an empty key we pad it wit quotes to make it visible\n */\n private get keys(): string[] {\n if (this.isObject) {\n return Object.keys(this.json).map((key) => (key ? key : '\"\"'));\n } else {\n return [];\n }\n }\n\n /**\n * Toggles `isOpen` state\n *\n */\n toggleOpen() {\n this.isOpen = !this.isOpen;\n\n if (this.element) {\n if (this.isOpen) {\n this.appendChildren(this.config.animateOpen);\n } else {\n this.removeChildren(this.config.animateClose);\n }\n this.element.classList.toggle(cssClass('open'));\n }\n }\n\n /**\n * Open all children up to a certain depth.\n * Allows actions such as expand all/collapse all\n *\n */\n openAtDepth(depth = 1) {\n if (depth < 0) {\n return;\n }\n\n this.open = depth;\n this.isOpen = depth !== 0;\n\n if (this.element) {\n this.removeChildren(false);\n\n if (depth === 0) {\n this.element.classList.remove(cssClass('open'));\n } else {\n this.appendChildren(this.config.animateOpen);\n this.element.classList.add(cssClass('open'));\n }\n }\n }\n\n isNumberArray() {\n return this.json.length > 0 && this.json.length < 4 && (isNumber(this.json[0]) || isNumber(this.json[1]));\n }\n\n renderArray() {\n const arrayWrapperSpan = createElement('span');\n arrayWrapperSpan.appendChild(createElement('span', 'bracket', '['));\n\n // some pretty handling of number arrays\n if (this.isNumberArray()) {\n this.json.forEach((val: any, index: number) => {\n if (index > 0) {\n arrayWrapperSpan.appendChild(createElement('span', 'array-comma', ','));\n }\n arrayWrapperSpan.appendChild(createElement('span', 'number', val));\n });\n this.skipChildren = true;\n } else {\n arrayWrapperSpan.appendChild(createElement('span', 'number', this.json.length));\n }\n\n arrayWrapperSpan.appendChild(createElement('span', 'bracket', ']'));\n return arrayWrapperSpan;\n }\n\n /**\n * Renders an HTML element and installs event listeners\n *\n * @returns {HTMLDivElement}\n */\n render(skipRoot = false): HTMLDivElement {\n // construct the root element and assign it to this.element\n this.element = createElement('div', 'row');\n\n // construct the toggler link\n const togglerLink = createElement('a', 'toggler-link');\n const togglerIcon = createElement('span', 'toggler');\n\n // if this is an object we need a wrapper span (toggler)\n if (this.isObject) {\n togglerLink.appendChild(togglerIcon);\n }\n\n // if this is child of a parent formatter we need to append the key\n if (this.hasKey) {\n togglerLink.appendChild(createElement('span', 'key', `${this.key}:`));\n }\n\n // Value for objects and arrays\n if (this.isObject) {\n // construct the value holder element\n const value = createElement('span', 'value');\n\n // we need a wrapper span for objects\n const objectWrapperSpan = createElement('span');\n\n // get constructor name and append it to wrapper span\n const constructorName = createElement('span', 'constructor-name', this.constructorName);\n objectWrapperSpan.appendChild(constructorName);\n\n // if it's an array append the array specific elements like brackets and length\n if (this.isArray) {\n const arrayWrapperSpan = this.renderArray();\n objectWrapperSpan.appendChild(arrayWrapperSpan);\n }\n\n // append object wrapper span to toggler link\n value.appendChild(objectWrapperSpan);\n togglerLink.appendChild(value);\n // Primitive values\n } else {\n // make a value holder element\n const value = this.isUrl ? createElement('a') : createElement('span');\n\n // add type and other type related CSS classes\n value.classList.add(cssClass(this.type));\n if (this.isDate) {\n value.classList.add(cssClass('date'));\n }\n if (this.isUrl) {\n value.classList.add(cssClass('url'));\n value.setAttribute('href', this.json);\n }\n\n // Append value content to value element\n const valuePreview = getValuePreview(this.json, this.json);\n value.appendChild(document.createTextNode(valuePreview));\n\n // append the value element to toggler link\n togglerLink.appendChild(value);\n }\n\n // construct a children element\n const children = createElement('div', 'children');\n\n // set CSS classes for children\n if (this.isObject) {\n children.classList.add(cssClass('object'));\n }\n if (this.isArray) {\n children.classList.add(cssClass('array'));\n }\n if (this.isEmpty) {\n children.classList.add(cssClass('empty'));\n }\n\n // set CSS classes for root element\n if (this.config && this.config.theme) {\n this.element.classList.add(cssClass(this.config.theme));\n }\n if (this.isOpen) {\n this.element.classList.add(cssClass('open'));\n }\n\n // append toggler and children elements to root element\n if (!skipRoot) {\n this.element.appendChild(togglerLink);\n }\n\n if (!this.skipChildren) {\n this.element.appendChild(children);\n } else {\n // remove togglerIcon\n togglerLink.removeChild(togglerIcon);\n }\n\n // if formatter is set to be open call appendChildren\n if (this.isObject && this.isOpen) {\n this.appendChildren();\n }\n\n // add event listener for toggling\n if (this.isObject) {\n togglerLink.addEventListener('click', this.toggleOpen.bind(this));\n }\n\n return this.element;\n }\n\n /**\n * Appends all the children to children element\n * Animated option is used when user triggers this via a click\n */\n appendChildren(animated = false) {\n const children = this.element && this.element.querySelector(`div.${cssClass('children')}`);\n\n if (!children || this.isEmpty) {\n return;\n }\n\n if (animated) {\n let index = 0;\n const addAChild = () => {\n const key = this.keys[index];\n const formatter = new JsonExplorer(this.json[key], this.open - 1, this.config, key);\n children.appendChild(formatter.render());\n\n index += 1;\n\n if (index < this.keys.length) {\n if (index > MAX_ANIMATED_TOGGLE_ITEMS) {\n addAChild();\n } else {\n requestAnimationFrame(addAChild);\n }\n }\n };\n\n requestAnimationFrame(addAChild);\n } else {\n this.keys.forEach((key) => {\n const formatter = new JsonExplorer(this.json[key], this.open - 1, this.config, key);\n children.appendChild(formatter.render());\n });\n }\n }\n\n /**\n * Removes all the children from children element\n * Animated option is used when user triggers this via a click\n */\n removeChildren(animated = false) {\n const childrenElement = this.element && this.element.querySelector<HTMLDivElement>(`div.${cssClass('children')}`);\n\n if (animated) {\n let childrenRemoved = 0;\n const removeAChild = () => {\n if (childrenElement && childrenElement.children.length) {\n childrenElement.removeChild(childrenElement.children[0]);\n childrenRemoved += 1;\n if (childrenRemoved > MAX_ANIMATED_TOGGLE_ITEMS) {\n removeAChild();\n } else {\n requestAnimationFrame(removeAChild);\n }\n }\n };\n requestAnimationFrame(removeAChild);\n } else {\n if (childrenElement) {\n childrenElement.innerHTML = '';\n }\n }\n }\n}\n"],"names":[],"mappings":"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"}