| 
									
										
										
										
											2017-10-24 00:11:23 -07:00
										 |  |  | import Component from '@ember/component'; | 
					
						
							| 
									
										
										
										
											2019-08-31 20:51:14 -07:00
										 |  |  | import { set, setProperties } from '@ember/object'; | 
					
						
							| 
									
										
										
										
											2017-10-24 00:11:23 -07:00
										 |  |  | import { warn } from '@ember/debug'; | 
					
						
							| 
									
										
										
										
											2019-08-31 20:51:14 -07:00
										 |  |  | import { action } from '@ember/object'; | 
					
						
							| 
									
										
										
										
											2018-02-21 09:46:04 -08:00
										 |  |  | import { IDatasetColumn, IDatasetColumnWithHtmlComments } from 'wherehows-web/typings/api/datasets/columns'; | 
					
						
							| 
									
										
										
										
											2019-08-31 20:51:14 -07:00
										 |  |  | import $ from 'jquery'; | 
					
						
							| 
									
										
										
										
											2017-10-24 00:11:23 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Cached module reference to the class name for visually hiding toggled off schema view | 
					
						
							|  |  |  |  * @type {string} | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2017-10-25 02:11:28 -07:00
										 |  |  | const hiddenClassName = 'hidden'; | 
					
						
							| 
									
										
										
										
											2017-10-24 00:11:23 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | export default class DatasetSchema extends Component { | 
					
						
							|  |  |  |   /** | 
					
						
							|  |  |  |    * Flag indicating that the schema should be rendered in a tabular format | 
					
						
							|  |  |  |    * @type {boolean} | 
					
						
							| 
									
										
										
										
											2017-10-24 01:06:18 -07:00
										 |  |  |    * @default true | 
					
						
							| 
									
										
										
										
											2017-10-24 00:11:23 -07:00
										 |  |  |    */ | 
					
						
							| 
									
										
										
										
											2017-10-24 01:06:18 -07:00
										 |  |  |   isTable = true; | 
					
						
							| 
									
										
										
										
											2017-10-24 00:11:23 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /** | 
					
						
							|  |  |  |    * Default json schema string | 
					
						
							|  |  |  |    * @type {string} | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   json = '{}'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-21 09:46:04 -08:00
										 |  |  |   /** | 
					
						
							|  |  |  |    * List of schema properties for the dataset | 
					
						
							|  |  |  |    * @type {IDatasetColumnWithHtmlComments | IDatasetColumn} | 
					
						
							|  |  |  |    */ | 
					
						
							| 
									
										
										
										
											2018-05-15 13:13:37 -07:00
										 |  |  |   schemas: Array<IDatasetColumnWithHtmlComments | IDatasetColumn> = []; | 
					
						
							| 
									
										
										
										
											2018-02-21 09:46:04 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-24 00:11:23 -07:00
										 |  |  |   /** | 
					
						
							|  |  |  |    * Reference to the jsonViewer dom element | 
					
						
							| 
									
										
										
										
											2018-02-21 09:46:04 -08:00
										 |  |  |    * @type {Element | null} | 
					
						
							| 
									
										
										
										
											2017-10-24 00:11:23 -07:00
										 |  |  |    */ | 
					
						
							| 
									
										
										
										
											2018-02-21 09:46:04 -08:00
										 |  |  |   jsonViewer: Element | null = null; | 
					
						
							| 
									
										
										
										
											2017-10-24 00:11:23 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /** | 
					
						
							|  |  |  |    * Reference to the jsonTable dom element | 
					
						
							| 
									
										
										
										
											2018-02-21 09:46:04 -08:00
										 |  |  |    * @type {Element | null} | 
					
						
							| 
									
										
										
										
											2017-10-24 00:11:23 -07:00
										 |  |  |    */ | 
					
						
							| 
									
										
										
										
											2018-02-21 09:46:04 -08:00
										 |  |  |   jsonTable: Element | null = null; | 
					
						
							| 
									
										
										
										
											2017-10-24 00:11:23 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /** | 
					
						
							|  |  |  |    * Constructs a readable JSON structure of the dataset schema | 
					
						
							|  |  |  |    * @param {Element} jsonViewer | 
					
						
							|  |  |  |    * @return {JQuery} | 
					
						
							|  |  |  |    */ | 
					
						
							| 
									
										
										
										
											2018-08-01 16:35:10 -07:00
										 |  |  |   buildJsonView(this: DatasetSchema, jsonViewer: Element): JQuery<Element> | void { | 
					
						
							| 
									
										
										
										
											2017-10-24 00:11:23 -07:00
										 |  |  |     try { | 
					
						
							| 
									
										
										
										
											2019-08-31 20:51:14 -07:00
										 |  |  |       return $(jsonViewer).JSONView(JSON.parse(this.json)); | 
					
						
							| 
									
										
										
										
											2017-10-24 00:11:23 -07:00
										 |  |  |     } catch (e) { | 
					
						
							| 
									
										
										
										
											2019-08-31 20:51:14 -07:00
										 |  |  |       warn(`Exception occurred parsing JSON schema: ${e.message}`, false, { | 
					
						
							|  |  |  |         id: 'dataset-schema-parse-error' | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2017-10-24 00:11:23 -07:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /** | 
					
						
							|  |  |  |    * Constructs a table view of the dataset schema | 
					
						
							|  |  |  |    * @param {Element} jsonTable | 
					
						
							|  |  |  |    * @return {JQuery} | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   buildTableView = (jsonTable: Element) => $(jsonTable).treegrid(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-21 09:46:04 -08:00
										 |  |  |   /** | 
					
						
							|  |  |  |    * Builds or rebuild the dataset schema / json view based on a flag to toggle this behaviour | 
					
						
							|  |  |  |    */ | 
					
						
							| 
									
										
										
										
											2019-08-31 20:51:14 -07:00
										 |  |  |   buildView(this: DatasetSchema): void { | 
					
						
							|  |  |  |     const { jsonTable, jsonViewer, isTable } = this; | 
					
						
							|  |  |  |     if (isTable) { | 
					
						
							| 
									
										
										
										
											2018-02-21 09:46:04 -08:00
										 |  |  |       jsonTable && this.buildTableView(jsonTable); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       jsonViewer && this.buildJsonView(jsonViewer); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-24 00:11:23 -07:00
										 |  |  |   /** | 
					
						
							|  |  |  |    * Retains references to the DOM elements for showing the schema | 
					
						
							|  |  |  |    */ | 
					
						
							| 
									
										
										
										
											2019-08-31 20:51:14 -07:00
										 |  |  |   cacheDomReference(this: DatasetSchema): void { | 
					
						
							|  |  |  |     const { jsonViewer, jsonTable, element } = this; | 
					
						
							| 
									
										
										
										
											2017-10-24 00:11:23 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (!(jsonViewer && jsonTable)) { | 
					
						
							|  |  |  |       setProperties(this, { | 
					
						
							| 
									
										
										
										
											2019-08-31 20:51:14 -07:00
										 |  |  |         jsonViewer: element.querySelector('#json-viewer'), | 
					
						
							|  |  |  |         jsonTable: element.querySelector('#json-table') | 
					
						
							| 
									
										
										
										
											2017-10-24 00:11:23 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-31 20:51:14 -07:00
										 |  |  |   didReceiveAttrs(): void { | 
					
						
							| 
									
										
										
										
											2018-02-21 09:46:04 -08:00
										 |  |  |     this.buildView(); | 
					
						
							| 
									
										
										
										
											2017-10-24 00:11:23 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-31 20:51:14 -07:00
										 |  |  |   didRender(): void { | 
					
						
							| 
									
										
										
										
											2017-10-24 00:11:23 -07:00
										 |  |  |     this.cacheDomReference(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-31 20:51:14 -07:00
										 |  |  |   willDestroyElement(this: DatasetSchema): void { | 
					
						
							| 
									
										
										
										
											2017-10-24 00:11:23 -07:00
										 |  |  |     setProperties(this, { | 
					
						
							|  |  |  |       jsonViewer: null, | 
					
						
							|  |  |  |       jsonTable: null | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-21 09:46:04 -08:00
										 |  |  |   /** | 
					
						
							|  |  |  |    * Handles the toggling of table vs. json view of dataset schema information | 
					
						
							|  |  |  |    * @param {"table" | "json"} view | 
					
						
							|  |  |  |    */ | 
					
						
							| 
									
										
										
										
											2018-05-14 14:54:03 -07:00
										 |  |  |   @action | 
					
						
							| 
									
										
										
										
											2019-08-31 20:51:14 -07:00
										 |  |  |   showView(this: DatasetSchema, view: 'table' | 'json' = 'table'): void { | 
					
						
							| 
									
										
										
										
											2018-02-21 09:46:04 -08:00
										 |  |  |     const isTable = set(this, 'isTable', view === 'table'); | 
					
						
							| 
									
										
										
										
											2019-08-31 20:51:14 -07:00
										 |  |  |     const { jsonViewer, jsonTable } = this; | 
					
						
							| 
									
										
										
										
											2018-02-21 09:46:04 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (jsonTable && jsonViewer) { | 
					
						
							|  |  |  |       this.buildView(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       isTable | 
					
						
							|  |  |  |         ? (jsonViewer.classList.add(hiddenClassName), jsonTable.classList.remove(hiddenClassName)) | 
					
						
							|  |  |  |         : (jsonViewer.classList.remove(hiddenClassName), jsonTable.classList.add(hiddenClassName)); | 
					
						
							| 
									
										
										
										
											2017-10-24 00:11:23 -07:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-02-21 09:46:04 -08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2017-10-24 00:11:23 -07:00
										 |  |  | } |