2022-01-08 20:11:27 +01:00
console . info ( "Config Editor 1.5" ) ;
2021-12-03 02:46:05 +01:00
const LitElement = window . LitElement || Object . getPrototypeOf ( customElements . get ( "hui-masonry-view" ) ) ;
2021-12-01 03:01:04 +01:00
const html = LitElement . prototype . html ;
class ConfigEditor extends LitElement {
static get properties ( ) {
return {
2021-12-03 02:46:05 +01:00
_hass : { type : Object } ,
2021-12-01 03:01:04 +01:00
code : { type : String } ,
fileList : { type : Array } ,
openedFile : { type : String } ,
infoLine : { type : String } ,
2021-12-03 02:46:05 +01:00
} ;
2021-12-01 03:01:04 +01:00
}
constructor ( ) {
super ( ) ;
this . code = '' ;
this . fileList = [ ] ;
this . openedFile = '' ;
this . infoLine = '' ;
}
render ( ) {
if ( ! this . _hass . states [ 'config_editor.version' ] ) { return html ` <ha-card>Missing 'config_editor:' in configuration.yaml for github.com/htmltiger/config-editor</ha-card> ` ; }
if ( this . fileList . length < 1 ) {
2022-01-08 20:11:27 +01:00
this . openedFile = localStorage . getItem ( 'config_editorOpen' ) ;
if ( ! this . openedFile ) {
this . openedFile = '' ;
}
this . List ( ) ;
2021-12-01 03:01:04 +01:00
}
2022-01-08 20:11:27 +01:00
2021-12-01 03:01:04 +01:00
return html `
< ha - card >
2022-01-04 17:50:54 +01:00
< ha - code - editor id = "code" mode = "yaml" @ value - changed = $ { this . updateText } > < / h a - c o d e - e d i t o r >
2022-01-08 20:11:27 +01:00
< div style = "position: -webkit-sticky; position: sticky; bottom: 0; z-index:2; background: var(--app-header-background-color); color: var(--app-header-text-color, white)" >
2021-12-03 02:46:05 +01:00
< div >
2021-12-01 03:01:04 +01:00
< button @ click = "${this.List}" > Get List < / b u t t o n >
2021-12-05 04:52:14 +01:00
< select @ change = $ { this . Load } >
$ { [ '' ] . concat ( this . fileList ) . map ( value => html ` <option ?selected= ${ value === this . openedFile } value= ${ value } > ${ value } </option> ` ) }
2021-12-01 03:01:04 +01:00
< / s e l e c t >
< button @ click = "${this.Save}" > Save < / b u t t o n >
< / d i v >
2022-01-08 20:15:29 +01:00
< code > # $ { this . infoLine } < / c o d e >
2022-01-04 17:50:54 +01:00
< / d i v >
2021-12-01 03:01:04 +01:00
< / h a - c a r d >
` ;
}
updateText ( e ) {
2021-12-03 02:46:05 +01:00
this . code = e . detail . value ;
2022-01-08 20:11:27 +01:00
localStorage . setItem ( 'config_editorText' , this . code ) ;
}
async oldText ( dhis ) {
dhis . renderRoot . querySelector ( '#code' ) . value = dhis . code ;
dhis . infoLine = html ` <b style='background:#ff7a81'>Auto loaded from this browser!</b> ` ;
2021-12-01 03:01:04 +01:00
}
2021-12-03 02:46:05 +01:00
async Coder ( ) {
if ( customElements . get ( "developer-tools-event" ) ) { return ; }
await customElements . whenDefined ( "partial-panel-resolver" ) ;
const p = document . createElement ( 'partial-panel-resolver' ) ;
p . hass = { panels : [ { url _path : "tmp" , component _name : "developer-tools" } ] } ;
p . _updateRoutes ( ) ;
await p . routerOptions . routes . tmp . load ( )
await customElements . whenDefined ( "developer-tools-router" ) ;
const d = document . createElement ( "developer-tools-router" ) ;
2021-12-03 03:26:04 +01:00
await d . routerOptions . routes . event . load ( ) ;
2021-12-03 02:46:05 +01:00
}
2021-12-01 03:01:04 +01:00
async List ( ) {
this . infoLine = 'List Loading...' ;
const e = ( await this . _hass . callWS ( { type : "config_editor/ws" , action : 'list' , data : '' , file : '' } ) ) ;
2021-12-30 03:44:32 +01:00
this . fileList = e . file . slice ( ) . sort ( ) ;
2021-12-01 03:01:04 +01:00
this . infoLine = e . msg ;
2022-01-08 20:11:27 +01:00
if ( this . openedFile ) {
this . code = localStorage . getItem ( 'config_editorText' ) ;
setTimeout ( this . oldText , 1000 , this ) ;
}
2021-12-01 03:01:04 +01:00
}
async Load ( x ) {
2021-12-03 02:46:05 +01:00
this . code = '' ; this . renderRoot . querySelector ( '#code' ) . value = '' ; this . infoLine = '' ;
2021-12-01 03:01:04 +01:00
this . openedFile = x . target . value
2022-01-08 20:11:27 +01:00
if ( this . openedFile ) {
this . infoLine = 'Loading: ' + this . openedFile ;
const e = ( await this . _hass . callWS ( { type : "config_editor/ws" , action : 'load' , data : '' , file : this . openedFile } ) ) ;
this . openedFile = e . file ;
this . infoLine = e . msg ;
this . renderRoot . querySelector ( '#code' ) . value = e . data ;
this . code = e . data ;
}
localStorage . setItem ( 'config_editorOpen' , this . openedFile ) ;
localStorage . setItem ( 'config_editorText' , this . code ) ;
2021-12-01 03:01:04 +01:00
}
async Save ( ) {
2021-12-05 04:28:10 +01:00
if ( this . renderRoot . querySelector ( '#code' ) . value != this . code ) {
2021-12-01 03:01:04 +01:00
this . infoLine = 'Something not right!' ;
return ;
}
2021-12-05 04:28:10 +01:00
if ( ! this . openedFile && this . code ) {
this . openedFile = prompt ( "type abc.yaml or folder/abc.yaml" ) ;
}
if ( this . openedFile && this . openedFile . endsWith ( ".yaml" ) ) {
if ( ! this . code ) { this . infoLine = '' ; this . infoLine = 'Text is empty!' ; return ; }
this . infoLine = 'Saving: ' + this . openedFile ;
const e = ( await this . _hass . callWS ( { type : "config_editor/ws" , action : 'save' , data : this . code , file : this . openedFile } ) ) ;
this . infoLine = e . msg ;
} else { this . openedFile = '' ; }
2021-12-01 03:01:04 +01:00
}
getCardSize ( ) {
return 5 ;
}
setConfig ( config ) {
2021-12-03 02:46:05 +01:00
this . Coder ( ) ;
2021-12-01 03:01:04 +01:00
}
set hass ( hass ) {
this . _hass = hass ;
}
shouldUpdate ( changedProps ) {
2021-12-03 02:46:05 +01:00
if ( changedProps . has ( 'code' ) || changedProps . has ( 'openedFile' ) || changedProps . has ( 'fileList' ) || changedProps . has ( 'infoLine' ) ) { return true ; }
2021-12-01 03:01:04 +01:00
}
} customElements . define ( 'config-editor-card' , ConfigEditor ) ;
window . customCards = window . customCards || [ ] ;
window . customCards . push ( {
type : 'config-editor-card' ,
name : 'Config Editor Card' ,
preview : false ,
description : 'Basic editor for configuration.yaml'
} ) ;