@flowfuse/node-red-dashboard 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +53 -0
- package/dist/css/app.d047b42b.css +1 -0
- package/dist/css/chunk-vendors.2378ce49.css +24 -0
- package/dist/fonts/materialdesignicons-webfont.3de8526e.woff +0 -0
- package/dist/fonts/materialdesignicons-webfont.477c6ab0.woff2 +0 -0
- package/dist/fonts/materialdesignicons-webfont.48a1ce0c.eot +0 -0
- package/dist/fonts/materialdesignicons-webfont.dfd403cf.ttf +0 -0
- package/dist/index.html +1 -0
- package/dist/js/app.854a8cd5.js +2 -0
- package/dist/js/app.854a8cd5.js.map +1 -0
- package/dist/js/chunk-vendors.174e8921.js +43 -0
- package/dist/js/chunk-vendors.174e8921.js.map +1 -0
- package/nodes/config/locales/en-US/ui_base.json +19 -0
- package/nodes/config/locales/en-US/ui_group.html +4 -0
- package/nodes/config/locales/en-US/ui_group.json +16 -0
- package/nodes/config/ui_base.html +807 -0
- package/nodes/config/ui_base.js +678 -0
- package/nodes/config/ui_group.html +55 -0
- package/nodes/config/ui_group.js +34 -0
- package/nodes/config/ui_page.html +84 -0
- package/nodes/config/ui_page.js +33 -0
- package/nodes/config/ui_theme.html +101 -0
- package/nodes/config/ui_theme.js +15 -0
- package/nodes/store/index.js +34 -0
- package/nodes/utils/index.js +35 -0
- package/nodes/widgets/locales/en-US/ui_button.html +7 -0
- package/nodes/widgets/locales/en-US/ui_button.json +24 -0
- package/nodes/widgets/locales/en-US/ui_chart.html +41 -0
- package/nodes/widgets/locales/en-US/ui_chart.json +17 -0
- package/nodes/widgets/locales/en-US/ui_dropdown.html +24 -0
- package/nodes/widgets/locales/en-US/ui_form.html +16 -0
- package/nodes/widgets/locales/en-US/ui_form.json +36 -0
- package/nodes/widgets/locales/en-US/ui_markdown.html +10 -0
- package/nodes/widgets/locales/en-US/ui_slider.html +9 -0
- package/nodes/widgets/locales/en-US/ui_switch.html +32 -0
- package/nodes/widgets/locales/en-US/ui_template.html +59 -0
- package/nodes/widgets/locales/en-US/ui_template.json +18 -0
- package/nodes/widgets/locales/en-US/ui_text.html +16 -0
- package/nodes/widgets/locales/en-US/ui_text_input.html +19 -0
- package/nodes/widgets/ui_button.html +146 -0
- package/nodes/widgets/ui_button.js +65 -0
- package/nodes/widgets/ui_chart.html +314 -0
- package/nodes/widgets/ui_chart.js +195 -0
- package/nodes/widgets/ui_dropdown.html +199 -0
- package/nodes/widgets/ui_dropdown.js +19 -0
- package/nodes/widgets/ui_form.html +368 -0
- package/nodes/widgets/ui_form.js +18 -0
- package/nodes/widgets/ui_markdown.html +134 -0
- package/nodes/widgets/ui_markdown.js +14 -0
- package/nodes/widgets/ui_notification.html +139 -0
- package/nodes/widgets/ui_notification.js +14 -0
- package/nodes/widgets/ui_radio_group.html +186 -0
- package/nodes/widgets/ui_radio_group.js +20 -0
- package/nodes/widgets/ui_slider.html +162 -0
- package/nodes/widgets/ui_slider.js +31 -0
- package/nodes/widgets/ui_switch.html +194 -0
- package/nodes/widgets/ui_switch.js +98 -0
- package/nodes/widgets/ui_table.html +149 -0
- package/nodes/widgets/ui_table.js +16 -0
- package/nodes/widgets/ui_template.html +283 -0
- package/nodes/widgets/ui_template.js +19 -0
- package/nodes/widgets/ui_text.html +358 -0
- package/nodes/widgets/ui_text.js +98 -0
- package/nodes/widgets/ui_text_input.html +141 -0
- package/nodes/widgets/ui_text_input.js +37 -0
- package/package.json +114 -0
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/dist/index.html
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Vue App</title><script defer="defer" src="js/chunk-vendors.174e8921.js"></script><script defer="defer" src="js/app.854a8cd5.js"></script><link href="css/chunk-vendors.2378ce49.css" rel="stylesheet"><link href="css/app.d047b42b.css" rel="stylesheet"></head><body><div id="app"></div></body></html>
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(function(){var e={1462:function(e,t,s){"use strict";s(2062);var a=s(7707),i=s(1142),o=s(9199);function r(e,t,s,a,i,r){const n=(0,o.up)("router-view"),l=(0,o.up)("v-app");return(0,o.wg)(),(0,o.j4)(l,null,{default:(0,o.w5)((()=>[(0,o.Wm)(n)])),_:1})}s(7658);var n=s(7139);const l={key:0,class:"nrdb-layout--flex"},d=["id"],p=["id"];function u(e,t,s,a,i,r){const n=(0,o.up)("v-card"),u=(0,o.up)("BaselineLayout");return(0,o.wg)(),(0,o.j4)(u,{id:"nrdb-page-"+e.$route.meta.id,"page-title":e.$route.meta.title,class:"nrdb-ui-page"},{default:(0,o.w5)((()=>[r.orderedGroups?((0,o.wg)(),(0,o.iD)("div",l,[((0,o.wg)(!0),(0,o.iD)(o.HY,null,(0,o.Ko)(r.orderedGroups,(t=>((0,o.wg)(),(0,o.iD)("div",{id:"nrdb-ui-group-"+t.id,key:t.id,class:(0,o.C_)(["nrdb-ui-group",r.getGroupClass(t)]),style:(0,o.j5)({width:2*i.rowHeight*t.width+"px"})},[(0,o.Wm)(n,{variant:"outlined",class:"bg-group-background",style:(0,o.j5)({"min-height":i.rowHeight*t.height+"px"})},(0,o.Nv)({text:(0,o.w5)((()=>[(0,o._)("div",{class:"nrdb-group-widgets nr-db-layout-group--grid",style:(0,o.j5)(`grid-template-columns: repeat(${t.width}, 1fr); grid-template-rows: repeat(${t.height}, minmax(${i.rowHeight}px, auto)); `)},[((0,o.wg)(!0),(0,o.iD)(o.HY,null,(0,o.Ko)(e.widgetsByGroup(t.id),(e=>((0,o.wg)(),(0,o.iD)("div",{id:"nrdb-ui-widget-"+e.id,key:e.id,class:(0,o.C_)(["nrdb-ui-widget",r.getWidgetClass(e)]),style:(0,o.j5)([{display:"grid"},`grid-template-rows: repeat(${e.props.height}, ${i.rowHeight}px); grid-column-end: span ${e.props.width||t.width}`])},[((0,o.wg)(),(0,o.j4)((0,o.LL)(e.component),{id:e.id,props:e.props,state:e.state,style:(0,o.j5)(`grid-row-end: span ${e.props.height}`)},null,8,["id","props","state","style"]))],14,p)))),128))],4)])),_:2},[t.disp?{name:"title",fn:(0,o.w5)((()=>[(0,o.Uk)((0,o.zw)(t.name),1)])),key:"0"}:void 0]),1032,["style"])],14,d)))),128))])):(0,o.kq)("",!0)])),_:1},8,["id","page-title"])}function c(e,t,s,a,i,r){const n=(0,o.up)("v-app-bar-nav-icon"),l=(0,o.up)("v-app-bar-title"),d=(0,o.up)("v-app-bar"),p=(0,o.up)("v-list-item"),u=(0,o.up)("v-list"),c=(0,o.up)("v-navigation-drawer"),g=(0,o.up)("v-main"),h=(0,o.up)("v-app");return(0,o.wg)(),(0,o.j4)(h,{class:"nrdb-app nrdb-app--baseline"},{default:(0,o.w5)((()=>[((0,o.wg)(!0),(0,o.iD)(o.HY,null,(0,o.Ko)(e.siteTemplates(e.$route.meta.dashboard),(e=>((0,o.wg)(),(0,o.iD)("div",{key:e.id,style:{display:"none"}},[(0,o.Uk)(" Loaded site template '"+(0,o.zw)(e.id)+"' ",1),((0,o.wg)(),(0,o.j4)((0,o.LL)(e.component),{id:e.id,props:e.props,state:e.state},null,8,["id","props","state"]))])))),128)),((0,o.wg)(!0),(0,o.iD)(o.HY,null,(0,o.Ko)(e.pageTemplates(e.$route.meta.id),(e=>((0,o.wg)(),(0,o.iD)("div",{key:e.id,style:{display:"none"}},[(0,o.Uk)(" Loaded site template '"+(0,o.zw)(e.id)+"' ",1),((0,o.wg)(),(0,o.j4)((0,o.LL)(e.component),{id:e.id,props:e.props,state:e.state},null,8,["id","props","state"]))])))),128)),(0,o.Wm)(d,{elevation:1},{prepend:(0,o.w5)((()=>[(0,o.Wm)(n,{onClick:t[0]||(t[0]=e=>i.drawer=!i.drawer)})])),default:(0,o.w5)((()=>[(0,o.Wm)(l,null,{default:(0,o.w5)((()=>[(0,o.Uk)((0,o.zw)(s.pageTitle),1)])),_:1})])),_:1}),(0,o.Wm)(g,null,{default:(0,o.w5)((()=>[(0,o.Wm)(c,{modelValue:i.drawer,"onUpdate:modelValue":t[1]||(t[1]=e=>i.drawer=e)},{default:(0,o.w5)((()=>[(0,o.Wm)(u,{nav:""},{default:(0,o.w5)((()=>[((0,o.wg)(!0),(0,o.iD)(o.HY,null,(0,o.Ko)(r.orderedPages,(e=>((0,o.wg)(),(0,o.j4)(p,{key:e.id,"active-class":"v-list-item--active","prepend-icon":"mdi-home",title:`${e.name} (${e.route.path})`,to:{name:e.route.name},link:""},null,8,["title","to"])))),128))])),_:1})])),_:1},8,["modelValue"]),(0,o.WI)(e.$slots,"default",{class:"nrdb-layout"})])),_:3})])),_:3})}function g(e){const t=parseInt(e.replace("#",""),16),s=t>>16&255,a=t>>8&255,i=255&t;return[s,a,i]}function h(e){const t=g(e),s=Math.round((299*parseInt(t[0])+587*parseInt(t[1])+114*parseInt(t[2]))/1e3),a=s>125?"#000000":"#ffffff";return a}var m={name:"BaslineLayout",props:{pageTitle:{type:String,default:"Page Title Here"}},data(){return{drawer:!1}},computed:{...(0,n.rn)("ui",["pages","themes","pageData"]),...(0,n.Se)("ui",["siteTemplates","pageTemplates"]),theme:function(){const e=this.pages[this.$route.meta.id],t=this.themes[e.theme].colors;return t},orderedPages:function(){return Object.values(this.pages).sort(((e,t)=>e.order-t.order))}},watch:{theme:function(){this.updateTheme()}},mounted(){console.log("BaselineLayout mounted. siteTemplates:",this.siteTemplates(this.$route.meta.dashboard),"pageTemplates:",this.pageTemplates(this.$route.meta.id)),this.updateTheme()},methods:{go:function(e){this.$router.push({name:e})},updateTheme(){const e=this.$vuetify.theme.themes.nrdb.colors;e.surface=this.theme.surface,e.primary=this.theme.primary,e["on-primary"]=h(this.theme.primary),e.background=this.theme.bgPage,e["group-background"]=this.theme.groupBg,e["group-outline"]=this.theme.groupOutline}}},w=s(89);const b=(0,w.Z)(m,[["render",c]]);var f=b,y={name:"LayoutFlex",components:{BaselineLayout:f},data(){return{rowHeight:45}},computed:{...(0,n.rn)("ui",["groups","widgets"]),...(0,n.rn)("data",["properties"]),...(0,n.Se)("ui",["groupsByPage","widgetsByGroup"]),orderedGroups:function(){const e=this.groupsByPage(this.$route.meta.id);return e}},methods:{getWidgetClass(e){const t=[];t.push(`nrdb-${e.type}`);const s=this.properties[e.id];return e.props.className&&t.push(e.props.className),s&&s.class&&t.push(s.class),t.join(" ")},getGroupClass(e){const t=[];e.className&&t.push(e.className);const s=this.properties[e.id];return s&&s.class&&t.push(s.class),t.join(" ")}}};const v=(0,w.Z)(y,[["render",u],["__scopeId","data-v-2319a60e"]]);var k=v;const j={key:0,class:"nrdb-layout--grid"},$=["id"],_=["id"];function x(e,t,s,a,i,r){const n=(0,o.up)("v-card"),l=(0,o.up)("BaselineLayout");return(0,o.wg)(),(0,o.j4)(l,{id:"nrdb-page-"+e.$route.meta.id,"page-title":e.$route.meta.title,class:"nrdb-ui-page"},{default:(0,o.w5)((()=>[r.gridGroups?((0,o.wg)(),(0,o.iD)("div",j,[((0,o.wg)(!0),(0,o.iD)(o.HY,null,(0,o.Ko)(r.gridGroups,(t=>((0,o.wg)(),(0,o.iD)("div",{id:"nrdb-ui-group-"+t.id,key:t.id,class:(0,o.C_)(["nrdb-ui-group",r.getGroupClass(t)]),style:(0,o.j5)(`grid-column-end: span ${t.width}`)},[(0,o.Wm)(n,{variant:"outlined",class:"bg-group-background"},(0,o.Nv)({text:(0,o.w5)((()=>[(0,o._)("div",{class:"nrdb-group-widgets nr-db-layout-group--grid",style:(0,o.j5)(`grid-template-columns: repeat(${t.width}, 1fr); grid-template-rows: repeat(${t.height}, minmax(${i.rowHeight}, auto)); `)},[((0,o.wg)(!0),(0,o.iD)(o.HY,null,(0,o.Ko)(e.widgetsByGroup(t.id),(e=>((0,o.wg)(),(0,o.iD)("div",{id:"nrdb-ui-widget-"+e.id,key:e.id,class:(0,o.C_)(["nrdb-ui-widget",r.getWidgetClass(e)]),style:(0,o.j5)([{display:"grid"},`grid-template-rows: repeat(${e.props.height}, minmax(${i.rowHeight}, auto)); grid-column-end: span ${e.props.width||t.width}`])},[((0,o.wg)(),(0,o.j4)((0,o.LL)(e.component),{id:e.id,props:e.props,state:e.state,style:(0,o.j5)(`grid-row-end: span ${e.props.height}`)},null,8,["id","props","state","style"]))],14,_)))),128))],4)])),_:2},[t.disp?{name:"title",fn:(0,o.w5)((()=>[(0,o.Uk)((0,o.zw)(t.name),1)])),key:"0"}:void 0]),1024)],14,$)))),128))])):(0,o.kq)("",!0)])),_:1},8,["id","page-title"])}var D={name:"LayoutGrid",components:{BaselineLayout:f},data(){return{columns:12,rowHeight:"48px"}},computed:{...(0,n.rn)("ui",["groups","widgets"]),...(0,n.rn)("data",["properties"]),...(0,n.Se)("ui",["groupsByPage","widgetsByGroup"]),gridGroups:function(){const e=this.groupsByPage(this.$route.meta.id);return e}},methods:{getWidgetClass(e){const t=[];t.push(`nrdb-${e.type}`);const s=this.properties[e.id];return e.props.className&&t.push(e.props.className),s&&s.class&&t.push(s.class),t.join(" ")},getGroupClass(e){const t=[];e.className&&t.push(e.className);const s=this.properties[e.id];return s&&s.class&&t.push(s.class),t.join(" ")}}};const C=(0,w.Z)(D,[["render",x],["__scopeId","data-v-65d83cc8"]]);var V=C;const S={key:0,class:"nrdb-layout--notebook"},B=["id"],T=["id"];function O(e,t,s,a,i,r){const n=(0,o.up)("v-card"),l=(0,o.up)("BaselineLayout");return(0,o.wg)(),(0,o.j4)(l,{"page-title":e.$route.meta.title},{default:(0,o.w5)((()=>[r.orderedGroups?((0,o.wg)(),(0,o.iD)("div",S,[((0,o.wg)(!0),(0,o.iD)(o.HY,null,(0,o.Ko)(r.orderedGroups,(t=>((0,o.wg)(),(0,o.iD)("div",{id:"nrdb-ui-group-"+t.id,key:t.id,class:(0,o.C_)(["nrdb-ui-group",r.getGroupClass(t)])},[(0,o.Wm)(n,{variant:"outlined",class:"bg-group-background",style:(0,o.j5)({"min-height":i.rowHeight*t.height+"px"})},(0,o.Nv)({text:(0,o.w5)((()=>[(0,o._)("div",{class:"nr-db-layout-group--grid",style:(0,o.j5)(`grid-template-columns: repeat(${t.width}, 1fr); grid-template-rows: repeat(${t.height}, minmax(${i.rowHeight}px, auto)); `)},[((0,o.wg)(!0),(0,o.iD)(o.HY,null,(0,o.Ko)(e.widgetsByGroup(t.id),(e=>((0,o.wg)(),(0,o.iD)("div",{id:"nrdb-ui-widget-"+e.id,key:e.id,class:(0,o.C_)(["nrdb-ui-widget",r.getWidgetClass(e)]),style:(0,o.j5)([{display:"grid"},`grid-template-rows: repeat(${e.props.height}, ${i.rowHeight}px); grid-column-end: span ${e.props.width||t.width}`])},[((0,o.wg)(),(0,o.j4)((0,o.LL)(e.component),{id:e.id,props:e.props,state:e.state,style:(0,o.j5)(`grid-row-end: span ${e.props.height}`)},null,8,["id","props","state","style"]))],14,T)))),128))],4)])),_:2},[t.disp?{name:"title",fn:(0,o.w5)((()=>[(0,o.Uk)((0,o.zw)(t.name),1)])),key:"0"}:void 0]),1032,["style"])],10,B)))),128))])):(0,o.kq)("",!0)])),_:1},8,["page-title"])}var U={name:"LayoutFlex",components:{BaselineLayout:f},data(){return{rowHeight:45}},computed:{...(0,n.rn)("ui",["groups","widgets"]),...(0,n.rn)("data",["properties"]),...(0,n.Se)("ui",["groupsByPage","widgetsByGroup"]),orderedGroups:function(){const e=this.groupsByPage(this.$route.meta.id);return e}},methods:{getWidgetClass(e){const t=[];t.push(`nrdb-${e.type}`);const s=this.properties[e.id];return e.props.className&&t.push(e.props.className),s&&s.class&&t.push(s.class),t.join(" ")},getGroupClass(e){const t=[];e.className&&t.push(e.className);const s=this.properties[e.id];return s&&s.class&&t.push(s.class),t.join(" ")}}};const I=(0,w.Z)(U,[["render",O],["__scopeId","data-v-ce7ab564"]]);var N=I,P={flex:k,grid:V,notebook:N};function G(e,t,s,a,i,r){const n=(0,o.up)("v-btn");return(0,o.wg)(),(0,o.j4)(n,{block:"",variant:"flat",disabled:!s.state.enabled,onClick:r.action},{default:(0,o.w5)((()=>[(0,o.Uk)((0,o.zw)(s.props.label),1)])),_:1},8,["disabled","onClick"])}function H(e,t){const s=(0,n.oR)(),a=(0,o.f3)("$socket");(0,o.bv)((()=>{a&&(a.on("msg-input:"+e,(a=>{"enabled"in a&&(console.log("setting enabled"),s.commit("ui/widgetState",{widgetId:e,enabled:a.enabled})),"visible"in a&&s.commit("ui/widgetState",{widgetId:e,visible:a.visible}),t?t(a):s.commit("data/bind",{widgetId:e,msg:a})})),a.emit("widget-load",e))})),(0,o.SK)((()=>{a?.off("msg-input:"+e)}))}var L={name:"DBUIButton",inject:["$socket"],props:{id:{type:String,required:!0},props:{type:Object,default:()=>({})},state:{type:Object,default:()=>({})}},setup(e){H(e.id)},computed:{...(0,n.rn)("data",["messages"])},methods:{action(e){console.log("button clicked",e);const t={type:e.type,clientX:e.clientX,clientY:e.clientY,bbox:e.target.getBoundingClientRect()},s=this.messages[this.id]||{};s._event=t,this.$socket.emit("widget-action",this.id,s)}}};const q=(0,w.Z)(L,[["render",G]]);var A=q;function E(e,t,s,a,i,r){const n=(0,o.up)("v-combobox");return(0,o.wg)(),(0,o.j4)(n,{modelValue:i.value,"onUpdate:modelValue":[t[0]||(t[0]=e=>i.value=e),r.onChange],class:(0,o.C_)(e.className),label:s.props.label,multiple:s.props.multiple,items:s.props.options,"item-title":"label","item-value":"value",variant:"outlined","hide-details":"auto","error-messages":s.props.options?.length?"":"No options available"},null,8,["modelValue","class","label","multiple","items","error-messages","onUpdate:modelValue"])}var R={name:"DBUIDropdown",inject:["$socket"],props:{id:{type:String,required:!0},props:{type:Object,default:()=>({})}},data(){return{value:null}},computed:{...(0,n.rn)("data",["messages"])},created(){H(this.id,(e=>{let t=e.payload;Array.isArray(t)||(t=[t]),t=this.props.multiple?this.props.options.filter((e=>t.includes(e.value))):this.props.options.find((e=>e.value===t[0])),t&&(this.$store.commit("data/bind",{widgetId:this.id,msg:e}),this.value=t)})),this.$socket.emit("widget-load",this.id)},methods:{onChange(){const e=this.messages[this.id]||{};this.props.multiple?e.payload=this.value.map((e=>e.value)):this.value?e.payload=this.value.value:e.payload=null,this.$store.commit("data/bind",e),this.$socket.emit("widget-change",this.id,e.payload)}}};const W=(0,w.Z)(R,[["render",E]]);var Z=W;const M={key:0},z={key:1,class:"nrdb-table-nodata"},Y=["colspan"];function K(e,t,s,a,i,r){const n=(0,o.up)("v-table"),l=(0,o.up)("v-pagination");return(0,o.wg)(),(0,o.iD)("div",null,[(0,o.Wm)(n,{class:"nrdb-table"},{default:(0,o.w5)((()=>[(0,o._)("thead",null,[(0,o._)("tr",null,[((0,o.wg)(!0),(0,o.iD)(o.HY,null,(0,o.Ko)(r.columns,((e,t)=>((0,o.wg)(),(0,o.iD)("th",{key:t,class:"text-left"},(0,o.zw)(e.label),1)))),128))])]),r.rows?((0,o.wg)(),(0,o.iD)("tbody",M,[((0,o.wg)(!0),(0,o.iD)(o.HY,null,(0,o.Ko)(i.pagination.rows,((e,t)=>((0,o.wg)(),(0,o.iD)("tr",{key:t},[((0,o.wg)(!0),(0,o.iD)(o.HY,null,(0,o.Ko)(r.columns,((t,s)=>((0,o.wg)(),(0,o.iD)("td",{key:s},(0,o.zw)(e[t.key]),1)))),128))])))),128))])):((0,o.wg)(),(0,o.iD)("tbody",z,[(0,o._)("tr",null,[(0,o._)("td",{colspan:r.columns.length},"No Data",8,Y)])]))])),_:1}),r.rows&&s.props.maxrows>0?((0,o.wg)(),(0,o.j4)(l,{key:0,modelValue:i.pagination.page,"onUpdate:modelValue":t[0]||(t[0]=e=>i.pagination.page=e),length:i.pagination.pages,rounded:"0"},null,8,["modelValue","length"])):(0,o.kq)("",!0)])}var F={name:"DBUITable",inject:["$socket"],props:{id:{type:String,required:!0},props:{type:Object,default:()=>({})}},setup(e){H(e.id)},data(){return{input:{},isValid:null,pagination:{page:1,pages:0,rows:[]}}},computed:{...(0,n.rn)("data",["messages"]),columns(){if(this.props.autocols){if(this.messages[this.id]?.payload){const e=[];for(const t of this.messages[this.id].payload)Object.keys(t).forEach((t=>{e.includes(t)||e.push(t)}));return e.map((e=>({key:e,label:e})))}return[{key:"",label:""}]}return this.props.columns?this.props.columns:[{key:"",label:""}]},rows(){return this.messages[this.id]?.payload?this.messages[this.id].payload:void 0}},watch:{rows:{handler(){this.calculatePaginatedRows()}},"pagination.page":{handler(){this.calculatePaginatedRows()}},"props.maxrows":{handler(){this.calculatePaginatedRows()}}},mounted(){this.calculatePaginatedRows()},methods:{calculatePaginatedRows(){console.log("calculatePaginatedRows",this.pagination.page,this.props.maxrows),this.props.maxrows>0?(this.pagination.pages=Math.ceil(this.rows?.length/this.props.maxrows),this.pagination.rows=this.rows?.slice((this.pagination.page-1)*this.props.maxrows,this.pagination.page*this.props.maxrows),console.log("updated",this.pagination.pages,this.pagination.rows)):(this.pagination.page=1,this.pagination.pages=0,this.pagination.rows=this.rows)}}};const X=(0,w.Z)(F,[["render",K]]);var J=X;const Q={key:0,class:"nrdb-ui-form-label"},ee={class:"nrdb-ui-form-actions"};function te(e,t,s,a,i,r){const n=(0,o.up)("v-checkbox"),l=(0,o.up)("v-switch"),d=(0,o.up)("v-textarea"),p=(0,o.up)("v-text-field"),u=(0,o.up)("v-btn"),c=(0,o.up)("v-form");return(0,o.wg)(),(0,o.iD)(o.HY,null,[s.props.label?((0,o.wg)(),(0,o.iD)("label",Q,(0,o.zw)(s.props.label),1)):(0,o.kq)("",!0),(0,o.Wm)(c,{modelValue:i.isValid,"onUpdate:modelValue":t[0]||(t[0]=e=>i.isValid=e),onSubmit:(0,o.iM)(r.onSubmit,["prevent"])},{default:(0,o.w5)((()=>[(0,o._)("div",{class:(0,o.C_)(["nrdb-ui-form-rows",{"nrdb-ui-form-rows--split":s.props.splitLayout}])},[((0,o.wg)(!0),(0,o.iD)(o.HY,null,(0,o.Ko)(s.props.options,(t=>((0,o.wg)(),(0,o.iD)("div",{key:t.key,class:"nrdb-ui-form-row"},["checkbox"===t.type?((0,o.wg)(),(0,o.j4)(n,{key:0,modelValue:i.input[t.key],"onUpdate:modelValue":e=>i.input[t.key]=e,label:t.label,"hide-details":"auto"},null,8,["modelValue","onUpdate:modelValue","label"])):"switch"===t.type?((0,o.wg)(),(0,o.j4)(l,{key:1,modelValue:i.input[t.key],"onUpdate:modelValue":e=>i.input[t.key]=e,class:(0,o.C_)(["nrdb-ui-widget",{active:e.state}]),label:t.label,"hide-details":"auto",color:"primary"},null,8,["modelValue","onUpdate:modelValue","label","class"])):"multiline"===t.type?((0,o.wg)(),(0,o.j4)(d,{key:2,modelValue:i.input[t.key],"onUpdate:modelValue":e=>i.input[t.key]=e,rules:r.rules(t),class:"nrdb-ui-widget nrdb-ui-text-field",rows:t.rows,label:t.label,variant:"outlined","hide-details":"auto"},null,8,["modelValue","onUpdate:modelValue","rules","rows","label"])):((0,o.wg)(),(0,o.j4)(p,{key:3,modelValue:i.input[t.key],"onUpdate:modelValue":e=>i.input[t.key]=e,rules:r.rules(t),class:"nrdb-ui-widget nrdb-ui-text-field",label:t.label,type:t.type,variant:"outlined","hide-details":"auto"},null,8,["modelValue","onUpdate:modelValue","rules","label","type"]))])))),128))],2),(0,o._)("div",ee,[(0,o.Wm)(u,{type:"submit",variant:"flat",size:"large",disabled:!i.isValid},{default:(0,o.w5)((()=>[(0,o.Uk)((0,o.zw)(s.props.submit||"submit"),1)])),_:1},8,["disabled"]),s.props.cancel?((0,o.wg)(),(0,o.j4)(u,{key:0,variant:"outlined",size:"large",onClick:r.clear},{default:(0,o.w5)((()=>[(0,o.Uk)((0,o.zw)(s.props.cancel),1)])),_:1},8,["onClick"])):(0,o.kq)("",!0)])])),_:1},8,["modelValue","onSubmit"])],64)}var se={name:"DBUIForm",inject:["$socket"],props:{id:{type:String,required:!0},props:{type:Object,default:()=>({})}},setup(e){H(e.id)},data(){return{input:{},isValid:null}},computed:{...(0,n.rn)("data",["messages"])},mounted(){this.reset()},methods:{onSubmit:function(){this.$socket.emit("widget-action",this.id,{payload:this.input})},clear(){this.reset()},reset(){this.props.options.forEach((e=>{"check"===e.type||"switch"===e.type?this.input[e.key]=!1:"number"===e.type?this.input[e.key]=0:this.input[e.key]=""}))},rules(e){return e.required?[t=>(console.log("v",t),!!t||e.label+" is required")]:[]}}};const ae=(0,w.Z)(se,[["render",te]]);var ie=ae;function oe(e,t,s,a,i,r){return(0,o.wg)(),(0,o.iD)("canvas",{ref:"chart",class:(0,o.C_)(e.className)},null,2)}var re=s(6580),ne={name:"DBUIChart",inject:["$socket"],props:{id:{type:String,required:!0},props:{type:Object,default:()=>({})}},data(){return{chart:null}},computed:{...(0,n.rn)("data",["messages"])},watch:{"props.label":function(e){this.chart.options.plugins.title.text=e,this.chart.update()},"props.chartType":function(e){this.chart.config.type=e,this.chart.update()},"props.xAxisType":function(e){this.chart.options.scales.x.type=e,this.chart.update()}},created(){H(this.id,this.onMsgInput)},mounted(){const e=this.$refs.chart,t=new re.ZP(e,{type:this.props.chartType,data:{datasets:[]},options:{maintainAspectRatio:!1,parsing:!1,scales:{x:{type:this.props.xAxisType||"linear"},y:{beginAtZero:!0}},plugins:{title:{display:!0,text:this.props.label},legend:{display:!1}}}});this.chart=(0,o.XI)(t)},methods:{onMsgInput(e){Array.isArray(e.payload)&&!e.payload.length?this.clear():this.add(e)},clear(){this.chart.data.labels=[],this.chart.data.datasets=[],this.chart.update()},add(e){const t=e.payload,s=e.topic;null!==t&&void 0!==t?"line"===this.props.chartType||"scatter"===this.props.chartType?this.addToLine(t,s):"bar"===this.props.chartType&&this.addToBar(t,s):console.log("have no payload")},addToLine(e){const t={};"number"===typeof e?(t.x=(new Date).getTime(),t.y=e):"object"===typeof e&&"y"in e&&(t.x=e.x||(new Date).getTime(),t.y=e.y),this.chart.data.datasets.length?this.chart.data.datasets[0].data.push(t):this.chart.data.datasets.push({data:[t]}),this.chart.update()},addToBar(e,t){if(t=t||"","number"===typeof e){if(this.chart.data.labels.includes(t)){const s=this.chart.data.labels.indexOf(t);this.chart.data.datasets[0].data[s]=e}else this.chart.data.datasets.length||this.chart.data.datasets.push({data:[]}),this.chart.data.datasets[0].data.push(e),this.chart.data.labels.push(t);this.chart.update()}else console.log("Unsupported payload type for Bar Chart:",typeof e)}}};const le=(0,w.Z)(ne,[["render",oe]]);var de=le;function pe(e,t,s,a,i,r){const n=(0,o.up)("v-radio"),l=(0,o.up)("v-radio-group");return(0,o.wg)(),(0,o.j4)(l,{modelValue:r.value,"onUpdate:modelValue":t[0]||(t[0]=e=>r.value=e),class:(0,o.C_)(["nrdb-ui-radio-group","nrdb-ui-radio-group--cols-"+s.props.columns+" "+e.className]),label:r.label,variant:"outlined","hide-details":"auto"},{default:(0,o.w5)((()=>[((0,o.wg)(!0),(0,o.iD)(o.HY,null,(0,o.Ko)(s.props.options,(e=>((0,o.wg)(),(0,o.j4)(n,{key:e.value,label:e.label,value:e.value},null,8,["label","value"])))),128))])),_:1},8,["modelValue","class","label"])}var ue={name:"DBUIRadioGroup",inject:["$socket"],props:{id:{type:String,required:!0},props:{type:Object,default:()=>({})}},setup(e){H(e.id)},computed:{...(0,n.rn)("data",["messages"]),label:function(){return this.props.label},value:{get(){return this.messages[this.id]?.payload},set(e){if(this.value===e)return;const t=this.messages[this.id]||{};t.payload=e,this.messages[this.id]=t,this.$socket.emit("widget-change",this.id,e)}}}};const ce=(0,w.Z)(ue,[["render",pe]]);var ge=ce;function he(e,t,s,a,i,r){const n=(0,o.up)("v-slider");return(0,o.wg)(),(0,o.j4)(n,{modelValue:i.value,"onUpdate:modelValue":t[0]||(t[0]=e=>i.value=e),label:s.props.label,"hide-details":"auto",class:(0,o.C_)(e.className),min:s.props.min,max:s.props.max,step:s.props.step||1},null,8,["modelValue","label","class","min","max","step"])}var me={name:"DBUISlider",inject:["$socket"],props:{id:{type:String,required:!0},props:{type:Object,default:()=>({})}},setup(e){H(e.id)},data(){return{value:null}},computed:{...(0,n.rn)("data",["messages"]),storeValue:function(){return this.messages[this.id]?.payload}},watch:{storeValue:function(e,t){this.value!==e&&(this.value=e)},value:function(e,t){this.storeValue!==e&&this.onChange()}},methods:{onChange(){const e=this.messages[this.id]||{};e.payload=this.value,this.$store.commit("data/bind",e),this.$socket.emit("widget-change",this.id,this.value)}}};const we=(0,w.Z)(me,[["render",he]]);var be=we;const fe={key:0,class:"v-label"};function ye(e,t,s,a,i,r){const n=(0,o.up)("v-switch"),l=(0,o.up)("v-btn");return(0,o.wg)(),(0,o.iD)("div",{class:(0,o.C_)(["nrdb-switch",{"nrdb-nolabel":!s.props.label,[e.className]:!!e.className}])},[s.props.label?((0,o.wg)(),(0,o.iD)("label",fe,(0,o.zw)(s.props.label),1)):(0,o.kq)("",!0),r.icon?((0,o.wg)(),(0,o.j4)(l,{key:2,variant:"text",icon:r.icon,color:r.color,onClick:r.toggle},null,8,["icon","color","onClick"])):((0,o.wg)(),(0,o.j4)(n,{key:1,modelValue:r.state,"onUpdate:modelValue":t[0]||(t[0]=e=>r.state=e),class:(0,o.C_)({active:r.state}),"hide-details":"auto",color:"primary",onClick:r.onChange},null,8,["modelValue","class","onClick"]))],2)}var ve={name:"DBUISwitch",inject:["$socket"],props:{id:{type:String,required:!0},props:{type:Object,default:()=>({})}},setup(e){H(e.id)},computed:{...(0,n.rn)("data",["messages"]),icon:function(){if(this.props.onicon&&this.props.officon){const e=this.state?this.props.onicon:this.props.officon;return"mdi-"+e}return null},color:function(){return this.props.oncolor||this.props.offcolor?this.state?this.props.oncolor:this.props.offcolor:null},value:function(){return this.messages[this.id]?.payload},state:{get(){const e=this.value;return"boolean"===typeof e?e:this.props.evaluated?e===this.props.evaluated.on:this.value},set(e){const t=this.messages[this.id]||{};t.payload=e,this.messages[this.id]=t}}},methods:{onChange(){this.$socket.emit("widget-change",this.id,!this.value)},toggle(){this.state=!this.state,this.$socket.emit("widget-change",this.id,this.state)}}};const ke=(0,w.Z)(ve,[["render",ye]]);var je=ke,$e=s(3617),_e=s.n($e),xe=s(5792),De=(s(1657),s(5068)),Ce=s(2478);De.TU.use((0,Ce.G)({langPrefix:"hljs language-",highlight(e,t){const s=xe.Z.getLanguage(t)?t:"plaintext";return xe.Z.highlight(e,{language:s}).value}}));var Ve={name:"DBUIMarkdown",inject:["$socket"],props:{id:{type:String,required:!0},props:{type:Object,default:()=>({})}},setup(e){H(e.id);const t=e.props.content.replace(/\|\|/g,"mdORmd");let s=De.TU.parse(t);return s=s.replaceAll("mdORmd","||"),()=>(0,o.h)({props:["id","props"],errorCaptured:(e,t,s)=>(console.error("errorCaptured",e,t,s),!1),template:`<div class="nrdb-ui-markdown-content">${_e().sanitize(s)}</div>`,computed:{...(0,n.rn)("data",["messages"]),...(0,n.Se)("data",["getMsgProperty"]),msg(){return this.messages[this.id]||{}}},methods:{get(e,t){return this.getMsgProperty(this.id,e,t)}}},{id:e.id,props:e.props})},computed:{...(0,n.rn)("data",["messages"])},errorCaptured:(e,t,s)=>(console.error("errorCaptured",e,t,s),!1)};const Se=Ve;var Be=Se,Te={name:"DBUITemplate",inject:["$socket"],props:{id:{type:String,required:!0},props:{type:Object,default:()=>({})}},setup(e){return H(e.id),()=>(0,o.h)({props:["id","props"],errorCaptured:(e,t,s)=>(console.error("errorCaptured",e,t,s),!1),head(){let t=this.props||e;if(t.props&&(t=t.props),!t||"local"===t.templateScope)return{};const s={};return!t.format||"page:style"!==t.templateScope&&"site:style"!==t.templateScope||(s.style=[{innerHTML:t.format,"data-template-name":t.name,"data-template-scope":t.templateScope,"data-template-id":t.id}]),s},template:"local"!==e.props.templateScope?void 0:e.props.format,computed:{...(0,n.rn)("data",["messages"]),msg(){return this.messages[this.id]||{}}},methods:{send(e){this.$parent.send(this,e)},submit(e){this.$parent.submit(this,e)}}},{id:e.id,props:e.props})},errorCaptured:(e,t,s)=>(console.error("errorCaptured",e,t,s),!1),methods:{send(e,t){t._dashboard=t._dashboard||{},t._dashboard.sourceId=e.id,t._dashboard.templateId=this.id,this.$socket.emit("widget-action",this.id,t)},submit(e,t){const s=new FormData(t.target),a={topic:t.type,payload:Object.fromEntries(s.entries())};a._dashboard=a._dashboard||{},a._dashboard.sourceId=e.id,a._dashboard.templateId=this.id,this.$socket.emit("widget-action",this.id,a)}}};const Oe=Te;var Ue=Oe;const Ie={class:"nrdb-ui-text-label"},Ne={class:"nrdb-ui-text-value"};function Pe(e,t,s,a,i,r){return(0,o.wg)(),(0,o.iD)("div",{style:(0,o.j5)(s.props.style)},[(0,o._)("label",Ie,(0,o.zw)(s.props.label),1),(0,o._)("span",Ne,(0,o.zw)(null!==r.value?r.value:"No Message Received"),1)],4)}var Ge={name:"DBUIText",props:{id:{type:String,required:!0},props:{type:Object,default:()=>({})}},setup(e){H(e.id)},computed:{...(0,n.rn)("data",["messages","properties"]),value:function(){return this.messages[this.id]?.payload}}};const He=(0,w.Z)(Ge,[["render",Pe],["__scopeId","data-v-14b9f4fa"]]);var Le=He;function qe(e,t,s,a,i,r){const n=(0,o.up)("v-text-field"),l=(0,o.up)("v-textarea");return"textarea"!==r.type?((0,o.wg)(),(0,o.j4)(n,{key:0,modelValue:r.value,"onUpdate:modelValue":t[0]||(t[0]=e=>r.value=e),class:"nrdb-ui-text-field",label:r.label,type:r.type,rules:r.validation,variant:"outlined","hide-details":"auto",onBlur:r.onBlur},null,8,["modelValue","label","type","rules","onBlur"])):((0,o.wg)(),(0,o.j4)(l,{key:1,modelValue:r.value,"onUpdate:modelValue":t[1]||(t[1]=e=>r.value=e),class:"nrdb-ui-text-field",label:r.label,variant:"outlined","hide-details":"auto",onBlur:r.onBlur},null,8,["modelValue","label","onBlur"]))}var Ae={name:"DBUIText",inject:["$socket"],props:{id:{type:String,required:!0},props:{type:Object,default:()=>({})}},setup(e){H(e.id)},computed:{...(0,n.rn)("data",["messages"]),label:function(){return this.props.label},type:function(){return this.props.mode||"text"},value:{get(){return this.messages[this.id]?.payload},set(e){if(this.value===e)return;const t=this.messages[this.id]||{};t.payload=e,this.messages[this.id]=t}},validation:function(){return"email"===this.type?[e=>!e||/^[^\s@]+@[^\s@]+$/.test(e)||"E-mail must be valid"]:[]}},methods:{onBlur:function(){this.$socket.emit("widget-change",this.id,this.value)}}};const Ee=(0,w.Z)(Ae,[["render",qe]]);var Re=Ee,We={"ui-button":A,"ui-dropdown":Z,"ui-table":J,"ui-form":ie,"ui-chart":de,"ui-radio-group":ge,"ui-slider":be,"ui-switch":je,"ui-markdown":Be,"ui-template":Ue,"ui-text":Le,"ui-text-input":Re},Ze={name:"App",inject:["$socket"],computed:{...(0,n.rn)("ui",["dashboards","pages","widgets"])},created(){this.$socket.on("ui-config",((e,t)=>{console.log("ui-config received. topic:",e,"payload:",t),Object.values(t.pages).forEach((e=>{const s=t.dashboards[e.ui].path+e.path,a="Page:"+e.name;console.log("adding route",s),this.$router?.addRoute({path:s,name:a,component:P[e.layout],meta:{title:e.name,id:e.id,dashboard:e.ui}}),e.route={path:s,name:a},this.$router.push({name:a})})),Object.keys(t.widgets).forEach((e=>{const s=t.widgets[e];s.component=(0,o.Xl)(We[s.type])})),this.$store.commit("ui/dashboards",t.dashboards),this.$store.commit("ui/pages",t.pages),this.$store.commit("ui/groups",t.groups),this.$store.commit("ui/widgets",t.widgets),this.$store.commit("ui/themes",t.themes)}))},methods:{send:function(){this.$socket.emit("widget-action","<node-id>","hello world")},go:function(e){this.$router.push({name:e})}}};const Me=(0,w.Z)(Ze,[["render",r]]);var ze=Me,Ye=s(7851),Ke=s(2483);const Fe=[],Xe=(0,Ke.p7)({history:(0,Ke.PO)(),routes:Fe});Xe.beforeEach(((e,t,s)=>{e.meta.title?document.title=e.meta.title:document.title="Node-RED Dashboard 2.0",s()}));var Je=Xe,Qe=(s(9773),s(8727)),et=s(3447),tt=s(8600);const st=()=>({pages:null,groups:null,themes:null,widgets:null}),at={pages(e){return e.pages},groups(e){return e.groups},themes(e){return e.themes},widgets(e){return e.widgets},groupsByPage:e=>t=>{if(e.groups){const s=Object.values(e.groups).filter((e=>e.page===t));return s.sort(((e,t)=>{const s=e.order||Number.MAX_SAFE_INTEGER,a=t.order||Number.MAX_SAFE_INTEGER;return s-a}))}},widgetsByGroup:e=>t=>{if(e.widgets){const s=Object.values(e.widgets).filter((e=>e.props.group===t&&!("ui-template"===e.type&&"local"!==e.props.templateScope)));return s.sort(((e,t)=>{const s=e.props?.order||Number.MAX_SAFE_INTEGER,a=t.props?.order||Number.MAX_SAFE_INTEGER;return s-a}))}},siteTemplates:e=>t=>{if(e.widgets){const s=Object.values(e.widgets).filter((e=>"ui-template"===e.type&&e.props.dashboard===t&&e.props.templateScope.match(/^site:/)));return s}},pageTemplates:e=>t=>{if(e.widgets){const s=Object.values(e.widgets).filter((e=>"ui-template"===e.type&&e.props.page===t&&e.props.templateScope.match(/^page:/)));return s}}},it={pages(e,t){e.pages=t},groups(e,t){e.groups=t},themes(e,t){e.themes=t},widgets(e,t){e.widgets=t},widgetState(e,t){const s=t.widgetId;"enabled"in t&&(e.widgets[s].state.enabled=t.enabled),"visible"in t&&(e.widgets[s].state.visible=t.visible)}};var ot={namespaced:!0,state:st,getters:at,mutations:it},rt=s(6016);const nt=()=>({values:{},messages:{},properties:{}}),lt={"ui-property:class":"class"},dt={bind(e,t){const s=t.widgetId;if("msg"in t){if(t.msg?.topic&<[t.msg.topic]&&(0,rt.hasProperty)(t.msg,"payload")){const a=lt[t.msg.topic];return e.properties[s]=e.properties[s]||{},void(e.properties[s][a]=t.msg.payload)}e.messages[s]=t.msg}}},pt={value:e=>t=>e.values[t],getMsgProperty:e=>(t,s,a)=>{const i=e.messages[t]||{};return(0,rt.getDeepValue)(i,s,a)}};var ut={namespaced:!0,state:nt,mutations:dt,getters:pt},ct=(0,n.MT)({modules:{ui:ot,data:ut},plugins:[]});const gt={dark:!1,colors:{background:"#0000ff","group-background":"#ffffff",primary:"#0000ff",accent:"#ff6b99",secondary:"#26ff8c",success:"#a5d64c",surface:"#ffffff",info:"#ff53d0",warning:"#ff8e00",error:"#ff5252"}},ht=(0,Qe.Rd)({components:et,directives:tt,theme:{defaultTheme:"nrdb",themes:{nrdb:gt}}}),mt=new URL(window.location.href),wt=mt.pathname.split("/dashboard")[0],bt=wt+"/dashboard/socket.io",ft=(0,Ye.io)({path:bt});ft.on("disconnect",(e=>{console.log("SIO disconnected",e)})),ft.on("connect",(()=>{console.log("SIO connected")})),ft.on("connect_error",(e=>{console.log("SIO connect error:",e,e.data)}));const yt=(0,o.ri)(ze).use(ct).use(ht).use(Je),vt=(0,a.c)();yt.use(vt),yt.mixin(i.Zf),yt.provide("$socket",ft),yt.mount("#app")},6016:function(e,t,s){function a(e,t,s){if("undefined"===typeof e||null===e)return s;let a=!1,i=!1;const o="[",r="]",n=['"',"'"];let l=[],d=0,p=[],u="",c="";const g=()=>{p.length>0&&(l[d]=[p.join("")]),d++,p.length=0};for(let h=0,m=t.length;h<m;h++){const e=t.charAt(h);l[d]=l[d]||[],p=l[d],a?e===r?(a=!1,g()):p.push(e):i?e===c&&"\\"!==u?(i=!1,g()):p.push(e):n.includes(e)?(c=e,i=!0,g()):e===o?(a=!0,g()):"."===e?g():p.push(e),u=e}p.length>0&&(l[d]=[p.join("")]),l=l.flat();for(let h=0,m=l.length;h<m;h++){if(!l[h])continue;const e=l[h].charAt(0),t=l[h].charAt(l[h].length-1);'"'!==e&&"'"!==e||'"'!==t&&"'"!==t||e!==t||(l[h]=l[h].slice(1,-1))}for(let h=0,m=l.length;h<m;h++)if(""!==l[h]){if(e=e[l[h]],"undefined"===typeof e)return s;if(null===e)return null}return e||s}function i(e,t){return Object.prototype.hasOwnProperty.call(e,t)}s(7658),e.exports={getDeepValue:a,hasProperty:i}}},t={};function s(a){var i=t[a];if(void 0!==i)return i.exports;var o=t[a]={exports:{}};return e[a].call(o.exports,o,o.exports,s),o.exports}s.m=e,function(){var e=[];s.O=function(t,a,i,o){if(!a){var r=1/0;for(p=0;p<e.length;p++){a=e[p][0],i=e[p][1],o=e[p][2];for(var n=!0,l=0;l<a.length;l++)(!1&o||r>=o)&&Object.keys(s.O).every((function(e){return s.O[e](a[l])}))?a.splice(l--,1):(n=!1,o<r&&(r=o));if(n){e.splice(p--,1);var d=i();void 0!==d&&(t=d)}}return t}o=o||0;for(var p=e.length;p>0&&e[p-1][2]>o;p--)e[p]=e[p-1];e[p]=[a,i,o]}}(),function(){s.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return s.d(t,{a:t}),t}}(),function(){s.d=function(e,t){for(var a in t)s.o(t,a)&&!s.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})}}(),function(){s.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}}(),function(){s.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}}(),function(){var e={143:0};s.O.j=function(t){return 0===e[t]};var t=function(t,a){var i,o,r=a[0],n=a[1],l=a[2],d=0;if(r.some((function(t){return 0!==e[t]}))){for(i in n)s.o(n,i)&&(s.m[i]=n[i]);if(l)var p=l(s)}for(t&&t(a);d<r.length;d++)o=r[d],s.o(e,o)&&e[o]&&e[o][0](),e[o]=0;return s.O(p)},a=self["webpackChunk_flowforge_node_red_dashboard"]=self["webpackChunk_flowforge_node_red_dashboard"]||[];a.forEach(t.bind(null,0)),a.push=t.bind(null,a.push.bind(a))}();var a=s.O(void 0,[998],(function(){return s(1462)}));a=s.O(a)})();
|
|
2
|
+
//# sourceMappingURL=app.854a8cd5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"js/app.854a8cd5.js","mappings":"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","sources":["webpack://@flowforge/node-red-dashboard/./ui/src/App.vue","webpack://@flowforge/node-red-dashboard/./ui/src/layouts/Flex.vue","webpack://@flowforge/node-red-dashboard/./ui/src/layouts/Baseline.vue","webpack://@flowforge/node-red-dashboard/./ui/src/layouts/Baseline.vue?2081","webpack://@flowforge/node-red-dashboard/./ui/src/layouts/Flex.vue?32a7","webpack://@flowforge/node-red-dashboard/./ui/src/layouts/Grid.vue","webpack://@flowforge/node-red-dashboard/./ui/src/layouts/Grid.vue?7e24","webpack://@flowforge/node-red-dashboard/./ui/src/layouts/Notebook.vue","webpack://@flowforge/node-red-dashboard/./ui/src/layouts/Notebook.vue?1761","webpack://@flowforge/node-red-dashboard/./ui/src/layouts/index.js","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/ui-button/UIButton.vue","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/data-tracker.js","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/ui-button/UIButton.vue?86f5","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/ui-dropdown/UIDropdown.vue","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/ui-dropdown/UIDropdown.vue?fff3","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/ui-table/UITable.vue","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/ui-table/UITable.vue?d57a","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/ui-form/UIForm.vue","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/ui-form/UIForm.vue?3d40","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/ui-chart/UIChart.vue","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/ui-chart/UIChart.vue?e960","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/ui-radio-group/UIRadioGroup.vue","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/ui-radio-group/UIRadioGroup.vue?2d95","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/ui-slider/UISlider.vue","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/ui-slider/UISlider.vue?5d98","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/ui-switch/UISwitch.vue","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/ui-switch/UISwitch.vue?8154","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/ui-markdown/UIMarkdown.vue","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/ui-markdown/UIMarkdown.vue?83b7","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/ui-template/UITemplate.vue","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/ui-template/UITemplate.vue?354f","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/ui-text/UIText.vue","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/ui-text/UIText.vue?e46a","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/ui-text-input/UITextInput.vue","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/ui-text-input/UITextInput.vue?f728","webpack://@flowforge/node-red-dashboard/./ui/src/widgets/index.js","webpack://@flowforge/node-red-dashboard/./ui/src/App.vue?0e67","webpack://@flowforge/node-red-dashboard/./ui/src/router.js","webpack://@flowforge/node-red-dashboard/./ui/src/store/ui.js","webpack://@flowforge/node-red-dashboard/./ui/src/store/data.js","webpack://@flowforge/node-red-dashboard/./ui/src/store/index.js","webpack://@flowforge/node-red-dashboard/./ui/src/main.js","webpack://@flowforge/node-red-dashboard/./ui/src/util.js","webpack://@flowforge/node-red-dashboard/webpack/bootstrap","webpack://@flowforge/node-red-dashboard/webpack/runtime/chunk loaded","webpack://@flowforge/node-red-dashboard/webpack/runtime/compat get default export","webpack://@flowforge/node-red-dashboard/webpack/runtime/define property getters","webpack://@flowforge/node-red-dashboard/webpack/runtime/global","webpack://@flowforge/node-red-dashboard/webpack/runtime/hasOwnProperty shorthand","webpack://@flowforge/node-red-dashboard/webpack/runtime/make namespace object","webpack://@flowforge/node-red-dashboard/webpack/runtime/jsonp chunk loading","webpack://@flowforge/node-red-dashboard/webpack/startup"],"sourcesContent":["<template>\n <v-app>\n <router-view />\n </v-app>\n</template>\n\n<script>\nimport { mapState } from 'vuex'\nimport { markRaw } from 'vue' // eslint-disable-line import/order\n\n// eslint-disable-next-line n/no-missing-import\nimport layouts from './layouts' // import all layouts\n// eslint-disable-next-line n/no-missing-import\nimport widgetComponents from './widgets' // import all Vue Widget Components\n\nexport default {\n name: 'App',\n inject: ['$socket'],\n computed: {\n ...mapState('ui', ['dashboards', 'pages', 'widgets'])\n },\n created () {\n this.$socket.on('ui-config', (topic, payload) => {\n console.log('ui-config received. topic:', topic, 'payload:', payload)\n\n // loop over pages, add them to vue router\n Object.values(payload.pages).forEach(page => {\n const route = payload.dashboards[page.ui].path + page.path\n const routeName = 'Page:' + page.name\n console.log('adding route', route)\n this.$router?.addRoute({\n path: route,\n name: routeName,\n component: layouts[page.layout],\n meta: {\n title: page.name, // the page name\n id: page.id, // the pages id\n dashboard: page.ui // the dashboard id - to simplify determining which dashboard we're on\n }\n })\n // store data on the \"page\" object so it's easy for us to map in the navigation drawer\n page.route = {\n path: route,\n name: routeName\n }\n // navigate to this route, this ensures we navigate to _something_ when the app loads\n this.$router.push({\n name: routeName\n })\n })\n\n // loop over the widgets defined in Node-RED,\n // map their respective Vue component for rendering on a page\n Object.keys(payload.widgets).forEach(id => {\n const widget = payload.widgets[id]\n widget.component = markRaw(widgetComponents[widget.type])\n })\n\n // store this data in our VueX store for access across the app\n this.$store.commit('ui/dashboards', payload.dashboards)\n this.$store.commit('ui/pages', payload.pages)\n this.$store.commit('ui/groups', payload.groups)\n this.$store.commit('ui/widgets', payload.widgets)\n this.$store.commit('ui/themes', payload.themes)\n })\n },\n methods: {\n send: function () {\n this.$socket.emit('widget-action', '<node-id>', 'hello world')\n },\n go: function (name) {\n this.$router.push({\n name\n })\n }\n }\n}\n</script>\n\n<style>\n@import \"./stylesheets/common.css\";\n</style>\n","<template>\n <BaselineLayout :id=\"'nrdb-page-' + $route.meta.id\" :page-title=\"$route.meta.title\" class=\"nrdb-ui-page\">\n <div v-if=\"orderedGroups\" class=\"nrdb-layout--flex\">\n <div\n v-for=\"g in orderedGroups\"\n :id=\"'nrdb-ui-group-' + g.id\"\n :key=\"g.id\"\n class=\"nrdb-ui-group\"\n :class=\"getGroupClass(g)\"\n :style=\"{'width': ((rowHeight * 2 * g.width) + 'px')}\"\n >\n <v-card variant=\"outlined\" class=\"bg-group-background\" :style=\"{'min-height': ((rowHeight * g.height) + 'px')}\">\n <template v-if=\"g.disp\" #title>\n {{ g.name }}\n </template>\n <template #text>\n <div class=\"nrdb-group-widgets nr-db-layout-group--grid\" :style=\"`grid-template-columns: repeat(${ g.width }, 1fr); grid-template-rows: repeat(${g.height}, minmax(${rowHeight}px, auto)); `\">\n <div\n v-for=\"w in widgetsByGroup(g.id)\"\n :id=\"'nrdb-ui-widget-' + w.id\"\n :key=\"w.id\"\n class=\"nrdb-ui-widget\"\n :class=\"getWidgetClass(w)\"\n style=\"display: grid\"\n :style=\"`grid-template-rows: repeat(${w.props.height}, ${rowHeight}px); grid-column-end: span ${ w.props.width || g.width }`\"\n >\n <component :is=\"w.component\" :id=\"w.id\" :props=\"w.props\" :state=\"w.state\" :style=\"`grid-row-end: span ${w.props.height}`\" />\n </div>\n </div>\n </template>\n </v-card>\n </div>\n </div>\n </BaselineLayout>\n</template>\n\n<script>\nimport { mapGetters, mapState } from 'vuex'\n\nimport BaselineLayout from './Baseline.vue'\n\nexport default {\n name: 'LayoutFlex',\n components: {\n BaselineLayout\n },\n data () {\n return {\n rowHeight: 45\n }\n },\n computed: {\n ...mapState('ui', ['groups', 'widgets']),\n ...mapState('data', ['properties']),\n ...mapGetters('ui', ['groupsByPage', 'widgetsByGroup']),\n orderedGroups: function () {\n const groups = this.groupsByPage(this.$route.meta.id)\n return groups\n }\n },\n methods: {\n getWidgetClass (widget) {\n const classes = []\n // ensure each widget has a class for its type\n classes.push(`nrdb-${widget.type}`)\n // add any class set in the widget's properties\n const widgetProperties = this.properties[widget.id]\n if (widget.props.className) {\n classes.push(widget.props.className)\n }\n // add dynamically set class\n if (widgetProperties && widgetProperties.class) {\n classes.push(widgetProperties.class)\n }\n return classes.join(' ')\n },\n getGroupClass (group) {\n const classes = []\n // add any class set in the group's properties\n if (group.className) {\n classes.push(group.className)\n }\n // add dynamically set class(es)\n const properties = this.properties[group.id]\n if (properties && properties.class) {\n classes.push(properties.class)\n }\n return classes.join(' ')\n }\n }\n}\n</script>\n\n<style scoped>\n\n@import \"./grid-groups.css\";\n.nrdb-layout--flex {\n --layout-card-width: 320px;\n --layout-gap: 12px;\n}\n.nrdb-layout--flex {\n display: flex;\n flex-wrap: wrap;\n padding: var(--layout-gap);\n gap: var(--layout-gap);\n}\n\n.nrdb-layout--flex > div {\n width: var(--layout-card-width);\n max-width: 100%;\n}\n\n.v-card {\n width: 100%;\n}\n</style>\n","<template>\n <v-app class=\"nrdb-app nrdb-app--baseline\">\n <div v-for=\"siteTemplate in siteTemplates($route.meta.dashboard)\" :key=\"siteTemplate.id\" style=\"display: none\">\n Loaded site template '{{ siteTemplate.id }}'\n <component :is=\"siteTemplate.component\" :id=\"siteTemplate.id\" :props=\"siteTemplate.props\" :state=\"siteTemplate.state\" />\n </div>\n <div v-for=\"pageTemplate in pageTemplates($route.meta.id)\" :key=\"pageTemplate.id\" style=\"display: none\">\n Loaded site template '{{ pageTemplate.id }}'\n <component :is=\"pageTemplate.component\" :id=\"pageTemplate.id\" :props=\"pageTemplate.props\" :state=\"pageTemplate.state\" />\n </div>\n <v-app-bar :elevation=\"1\">\n <template #prepend>\n <v-app-bar-nav-icon @click=\"drawer = !drawer\" />\n </template>\n <v-app-bar-title>{{ pageTitle }}</v-app-bar-title>\n </v-app-bar>\n\n <v-main>\n <v-navigation-drawer v-model=\"drawer\">\n <v-list nav>\n <v-list-item\n v-for=\"page in orderedPages\" :key=\"page.id\" active-class=\"v-list-item--active\"\n prepend-icon=\"mdi-home\" :title=\"`${page.name} (${page.route.path})`\"\n :to=\"{name: page.route.name}\" link\n />\n </v-list>\n </v-navigation-drawer>\n <slot class=\"nrdb-layout\" />\n </v-main>\n </v-app>\n</template>\n\n<script>\nimport { mapGetters, mapState } from 'vuex'\n\n/**\n * Convert a hex to RGB color\n * @param {String(hex)} hex\n */\nfunction hexToRgb (hex) {\n const bigint = parseInt(hex.replace('#', ''), 16)\n const r = (bigint >> 16) & 255\n const g = (bigint >> 8) & 255\n const b = bigint & 255\n return [r, g, b]\n}\n\n/**\n * Given a hex color code to represent a bg, return an appropriately contrasting text color\n * @param {String(hex)} bg\n */\nfunction getContrast (bg) {\n const bgRgb = hexToRgb(bg)\n\n // http://www.w3.org/TR/AERT#color-contrast\n const brightness = Math.round(((parseInt(bgRgb[0]) * 299) +\n (parseInt(bgRgb[1]) * 587) +\n (parseInt(bgRgb[2]) * 114)) / 1000)\n\n const textColor = (brightness > 125) ? '#000000' : '#ffffff'\n return textColor\n}\n\nexport default {\n name: 'BaslineLayout',\n props: {\n pageTitle: {\n type: String,\n default: 'Page Title Here'\n }\n },\n data () {\n return {\n drawer: false\n }\n },\n computed: {\n ...mapState('ui', ['pages', 'themes', 'pageData']),\n ...mapGetters('ui', ['siteTemplates', 'pageTemplates']),\n\n theme: function () {\n const page = this.pages[this.$route.meta.id]\n const theme = this.themes[page.theme].colors\n return theme\n },\n orderedPages: function () {\n return Object.values(this.pages).sort((a, b) => a.order - b.order)\n }\n },\n watch: {\n theme: function () {\n this.updateTheme()\n }\n },\n mounted () {\n console.log('BaselineLayout mounted. siteTemplates:', this.siteTemplates(this.$route.meta.dashboard), 'pageTemplates:', this.pageTemplates(this.$route.meta.id))\n this.updateTheme()\n },\n methods: {\n go: function (name) {\n this.$router.push({\n name\n })\n },\n updateTheme () {\n const theme = this.$vuetify.theme.themes.nrdb.colors\n // convert NR Theming to Vuetify Theming\n theme.surface = this.theme.surface\n // primary bg\n theme.primary = this.theme.primary\n // primary font - auto calculated\n theme['on-primary'] = getContrast(this.theme.primary)\n // UI Background\n theme.background = this.theme.bgPage\n // Group Background\n theme['group-background'] = this.theme.groupBg\n theme['group-outline'] = this.theme.groupOutline\n }\n }\n}\n</script>\n","import { render } from \"./Baseline.vue?vue&type=template&id=6da8c792\"\nimport script from \"./Baseline.vue?vue&type=script&lang=js\"\nexport * from \"./Baseline.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./Flex.vue?vue&type=template&id=2319a60e&scoped=true\"\nimport script from \"./Flex.vue?vue&type=script&lang=js\"\nexport * from \"./Flex.vue?vue&type=script&lang=js\"\n\nimport \"./Flex.vue?vue&type=style&index=0&id=2319a60e&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-2319a60e\"]])\n\nexport default __exports__","<template>\n <BaselineLayout :id=\"'nrdb-page-' + $route.meta.id\" :page-title=\"$route.meta.title\" class=\"nrdb-ui-page\">\n <div v-if=\"gridGroups\" class=\"nrdb-layout--grid\">\n <div\n v-for=\"g in gridGroups\"\n :id=\"'nrdb-ui-group-' + g.id\"\n :key=\"g.id\"\n class=\"nrdb-ui-group\"\n :class=\"getGroupClass(g)\"\n :style=\"`grid-column-end: span ${ g.width }`\"\n >\n <v-card variant=\"outlined\" class=\"bg-group-background\">\n <template v-if=\"g.disp\" #title>\n {{ g.name }}\n </template>\n <template #text>\n <div class=\"nrdb-group-widgets nr-db-layout-group--grid\" :style=\"`grid-template-columns: repeat(${ g.width }, 1fr); grid-template-rows: repeat(${g.height}, minmax(${rowHeight}, auto)); `\">\n <div\n v-for=\"w in widgetsByGroup(g.id)\"\n :id=\"'nrdb-ui-widget-' + w.id\"\n :key=\"w.id\"\n class=\"nrdb-ui-widget\"\n :class=\"getWidgetClass(w)\"\n style=\"display: grid\"\n :style=\"`grid-template-rows: repeat(${w.props.height}, minmax(${rowHeight}, auto)); grid-column-end: span ${ w.props.width || g.width }`\"\n >\n <component :is=\"w.component\" :id=\"w.id\" :props=\"w.props\" :state=\"w.state\" :style=\"`grid-row-end: span ${w.props.height}`\" />\n </div>\n </div>\n </template>\n </v-card>\n </div>\n </div>\n </BaselineLayout>\n</template>\n\n<script>\n// eslint-disable-next-line import/order\nimport BaselineLayout from './Baseline.vue'\n// eslint-disable-next-line import/order, sort-imports\nimport { mapState, mapGetters } from 'vuex'\n\nexport default {\n name: 'LayoutGrid',\n components: {\n BaselineLayout\n },\n data () {\n return {\n columns: 12,\n rowHeight: '48px'\n }\n },\n computed: {\n ...mapState('ui', ['groups', 'widgets']),\n ...mapState('data', ['properties']),\n ...mapGetters('ui', ['groupsByPage', 'widgetsByGroup']),\n gridGroups: function () {\n const groups = this.groupsByPage(this.$route.meta.id)\n return groups\n }\n },\n methods: {\n getWidgetClass (widget) {\n const classes = []\n // ensure each widget has a class for its type\n classes.push(`nrdb-${widget.type}`)\n // add any class set in the widget's properties\n const widgetProperties = this.properties[widget.id]\n if (widget.props.className) {\n classes.push(widget.props.className)\n }\n // add dynamically set class\n if (widgetProperties && widgetProperties.class) {\n classes.push(widgetProperties.class)\n }\n return classes.join(' ')\n },\n getGroupClass (group) {\n const classes = []\n // add any class set in the group's properties\n if (group.className) {\n classes.push(group.className)\n }\n // add dynamically set class(es)\n const properties = this.properties[group.id]\n if (properties && properties.class) {\n classes.push(properties.class)\n }\n return classes.join(' ')\n }\n }\n}\n</script>\n\n<style scoped>\n\n@import \"./grid-groups.css\";\n\n.nrdb-layout--grid {\n --layout-card-width: 320px;\n --layout-gap: 12px;\n --widget-row-height: 48px;\n}\n.nrdb-layout--grid {\n display: grid;\n grid-template-columns: repeat(12, 1fr);\n flex-wrap: wrap;\n padding: var(--layout-gap);\n gap: var(--layout-gap);\n}\n\n.nrdb-layout--grid > div {\n width: 100%;\n /* max-width: 100%; */\n}\n\n.v-card {\n width: 100%;\n}\n\n@media only screen and (max-width: 1024px) {\n .nrdb-layout--grid {\n grid-template-columns: repeat(9, 1fr);\n }\n}\n\n@media only screen and (max-width: 768px) {\n .nrdb-layout--grid {\n grid-template-columns: repeat(6, 1fr);\n }\n}\n\n</style>\n","import { render } from \"./Grid.vue?vue&type=template&id=65d83cc8&scoped=true\"\nimport script from \"./Grid.vue?vue&type=script&lang=js\"\nexport * from \"./Grid.vue?vue&type=script&lang=js\"\n\nimport \"./Grid.vue?vue&type=style&index=0&id=65d83cc8&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-65d83cc8\"]])\n\nexport default __exports__","<template>\n <BaselineLayout :page-title=\"$route.meta.title\">\n <div v-if=\"orderedGroups\" class=\"nrdb-layout--notebook\">\n <div\n v-for=\"g in orderedGroups\"\n :id=\"'nrdb-ui-group-' + g.id\"\n :key=\"g.id\"\n class=\"nrdb-ui-group\"\n :class=\"getGroupClass(g)\"\n >\n <v-card variant=\"outlined\" class=\"bg-group-background\" :style=\"{'min-height': ((rowHeight * g.height) + 'px')}\">\n <template v-if=\"g.disp\" #title>\n {{ g.name }}\n </template>\n <template #text>\n <div class=\"nr-db-layout-group--grid\" :style=\"`grid-template-columns: repeat(${ g.width }, 1fr); grid-template-rows: repeat(${g.height}, minmax(${rowHeight}px, auto)); `\">\n <div\n v-for=\"w in widgetsByGroup(g.id)\"\n :id=\"'nrdb-ui-widget-' + w.id\"\n :key=\"w.id\"\n class=\"nrdb-ui-widget\"\n :class=\"getWidgetClass(w)\"\n style=\"display: grid\"\n :style=\"`grid-template-rows: repeat(${w.props.height}, ${rowHeight}px); grid-column-end: span ${ w.props.width || g.width }`\"\n >\n <component :is=\"w.component\" :id=\"w.id\" :props=\"w.props\" :state=\"w.state\" :style=\"`grid-row-end: span ${w.props.height}`\" />\n </div>\n </div>\n </template>\n </v-card>\n </div>\n </div>\n </BaselineLayout>\n</template>\n\n<script>\nimport { mapGetters, mapState } from 'vuex'\n\nimport BaselineLayout from './Baseline.vue'\n\nexport default {\n name: 'LayoutFlex',\n components: {\n BaselineLayout\n },\n data () {\n return {\n rowHeight: 45\n }\n },\n computed: {\n ...mapState('ui', ['groups', 'widgets']),\n ...mapState('data', ['properties']),\n ...mapGetters('ui', ['groupsByPage', 'widgetsByGroup']),\n orderedGroups: function () {\n const groups = this.groupsByPage(this.$route.meta.id)\n return groups\n }\n },\n methods: {\n getWidgetClass (widget) {\n const classes = []\n // ensure each widget has a class for its type\n classes.push(`nrdb-${widget.type}`)\n // add any class set in the widget's properties\n const widgetProperties = this.properties[widget.id]\n if (widget.props.className) {\n classes.push(widget.props.className)\n }\n // add dynamically set class\n if (widgetProperties && widgetProperties.class) {\n classes.push(widgetProperties.class)\n }\n return classes.join(' ')\n },\n getGroupClass (group) {\n const classes = []\n // add any class set in the group's properties\n if (group.className) {\n classes.push(group.className)\n }\n // add dynamically set class(es)\n const properties = this.properties[group.id]\n if (properties && properties.class) {\n classes.push(properties.class)\n }\n return classes.join(' ')\n }\n }\n}\n</script>\n\n<style scoped>\n\n@import \"./grid-groups.css\";\n.nrdb-layout--notebook {\n --layout-card-width: 1024px;\n --layout-gap: 12px;\n}\n.nrdb-layout--notebook {\n margin: auto;\n width: 100%;\n max-width: var(--layout-card-width);\n min-height: 100%;\n flex-wrap: wrap;\n padding: var(--layout-gap);\n}\n.nrdb-layout--notebook > div {\n width: 100%;\n margin-bottom: var(--layout-gap);\n}\n\n.v-card {\n width: 100%;\n}\n</style>\n","import { render } from \"./Notebook.vue?vue&type=template&id=ce7ab564&scoped=true\"\nimport script from \"./Notebook.vue?vue&type=script&lang=js\"\nexport * from \"./Notebook.vue?vue&type=script&lang=js\"\n\nimport \"./Notebook.vue?vue&type=style&index=0&id=ce7ab564&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-ce7ab564\"]])\n\nexport default __exports__","/* eslint-disable n/no-missing-import */\n/* eslint-disable n/file-extension-in-import */\n/* eslint-disable import/no-unresolved */\nimport Flex from './Flex'\nimport Grid from './Grid'\nimport Notebook from './Notebook'\n\nexport default {\n flex: Flex,\n grid: Grid,\n notebook: Notebook\n}\n","<template>\n <v-btn block variant=\"flat\" :disabled=\"!state.enabled\" @click=\"action\">{{ props.label }}</v-btn>\n</template>\n\n<script>\nimport { useDataTracker } from '../data-tracker.js' // eslint-disable-line import/order\nimport { mapState } from 'vuex' // eslint-disable-line import/order\n\nexport default {\n name: 'DBUIButton',\n inject: ['$socket'],\n props: {\n id: { type: String, required: true },\n props: { type: Object, default: () => ({}) },\n state: { type: Object, default: () => ({}) }\n },\n setup (props) {\n useDataTracker(props.id)\n },\n computed: {\n ...mapState('data', ['messages'])\n },\n methods: {\n action ($evt) {\n console.log('button clicked', $evt)\n const evt = {\n type: $evt.type,\n clientX: $evt.clientX,\n clientY: $evt.clientY,\n bbox: $evt.target.getBoundingClientRect()\n }\n const msg = this.messages[this.id] || {}\n msg._event = evt\n this.$socket.emit('widget-action', this.id, msg)\n }\n }\n}\n</script>\n\n<style scoped>\n</style>\n","import { inject, onMounted, onUnmounted } from 'vue'\nimport { useStore } from 'vuex'\n\n// by convention, composable function names start with \"use\"\nexport function useDataTracker (widgetId, onInput) {\n const store = useStore()\n const socket = inject('$socket')\n\n // a composable can also hook into its owner component's\n // lifecycle to setup and teardown side effects.\n onMounted(() => {\n if (socket) {\n // This will on in msg input for ALL components\n socket.on('msg-input:' + widgetId, (msg) => {\n // set states if passed into msg\n if ('enabled' in msg) {\n console.log('setting enabled')\n store.commit('ui/widgetState', {\n widgetId,\n enabled: msg.enabled\n })\n }\n\n if ('visible' in msg) {\n store.commit('ui/widgetState', {\n widgetId,\n visible: msg.visible\n })\n }\n\n if (onInput) {\n // sometimes we need to have different behaviour\n onInput(msg)\n } else {\n // but most of the time, we just care about the value of msg\n store.commit('data/bind', {\n widgetId,\n msg // TODO: we should sanitise what is stored in the store?\n // One way to do this is to permit only keys explicitly listed in the widget's config (default to topic+payload if none are specified)\n // A smarter? way to do this is to scan the template for msg.? binds and store only those keys\n // For now, we'll just store the whole msg\n })\n }\n })\n // let Node-RED know that this widget has loaded\n // useful as Node-RED can return (via msg-input) any stored data\n socket.emit('widget-load', widgetId)\n }\n })\n onUnmounted(() => {\n socket?.off('msg-input:' + widgetId)\n })\n}\n","import { render } from \"./UIButton.vue?vue&type=template&id=752e63e6\"\nimport script from \"./UIButton.vue?vue&type=script&lang=js\"\nexport * from \"./UIButton.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<!-- eslint-disable no-console -->\n<template>\n <v-combobox\n v-model=\"value\"\n :class=\"className\"\n :label=\"props.label\"\n :multiple=\"props.multiple\"\n :items=\"props.options\"\n item-title=\"label\"\n item-value=\"value\"\n variant=\"outlined\"\n hide-details=\"auto\"\n :error-messages=\"props.options?.length ? '' : 'No options available'\"\n @update:model-value=\"onChange\"\n />\n</template>\n\n<script>\nimport { mapState } from 'vuex'\n\nimport { useDataTracker } from '../data-tracker.js'\n\nexport default {\n name: 'DBUIDropdown',\n inject: ['$socket'],\n props: {\n id: { type: String, required: true },\n props: { type: Object, default: () => ({}) }\n },\n data () {\n return {\n value: null\n }\n },\n computed: {\n ...mapState('data', ['messages'])\n },\n created () {\n // can't do this in setup as we are using custom onInput function that needs access to 'this'\n useDataTracker(this.id, (msg) => {\n let payload = msg.payload\n\n // When a msg comes in from Node-RED, we need support 2 operations:\n // 1. add/replace the dropdown options (to support dynamic options e.g: nested dropdowns populated from a database)\n // 2. update the selected value(s)\n // additionally, we need to support both single and multi selection\n\n // For now, we only support selecting which item(s) are selected, not updating the available options\n\n // if the payload is an array, we assume it is a list of values to select\n\n // first, if we have a single value, we need to convert it to an array\n if (!Array.isArray(payload)) {\n payload = [payload]\n }\n\n // now if this is a single selection, we just need to find the option with the matching value\n if (!this.props.multiple) {\n payload = this.props.options.find((o) => {\n return o.value === payload[0]\n })\n } else {\n // this is a multi selection, we need to find all the options with matching values\n payload = this.props.options.filter((o) => {\n return payload.includes(o.value)\n })\n }\n // if we didn't find any matching options, we stop here\n if (!payload) {\n return\n }\n\n // update our vuex store with the value retrieved from Node-RED\n this.$store.commit('data/bind', {\n widgetId: this.id,\n msg\n })\n // ensure we set our local \"value\" to match\n this.value = payload\n })\n\n // let Node-RED know that this widget has loaded\n // useful as Node-RED can return (via msg-input) any stored data\n this.$socket.emit('widget-load', this.id)\n },\n methods: {\n onChange () {\n // ensure our data binding with vuex store is updated\n const msg = this.messages[this.id] || {}\n if (this.props.multiple) {\n // return an array\n msg.payload = this.value.map((option) => {\n return option.value\n })\n } else if (this.value) {\n // return a single value\n msg.payload = this.value.value\n } else {\n // return null\n msg.payload = null\n }\n this.$store.commit('data/bind', msg)\n this.$socket.emit('widget-change', this.id, msg.payload)\n }\n }\n}\n</script>\n\n<style scoped>\n</style>\n","import { render } from \"./UIDropdown.vue?vue&type=template&id=606546b5\"\nimport script from \"./UIDropdown.vue?vue&type=script&lang=js\"\nexport * from \"./UIDropdown.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <div>\n <v-table class=\"nrdb-table\">\n <thead>\n <tr>\n <th v-for=\"(col, $index) in columns\" :key=\"$index\" class=\"text-left\">{{ col.label }}</th>\n </tr>\n </thead>\n <tbody v-if=\"rows\">\n <tr\n v-for=\"(row, $index) in pagination.rows\"\n :key=\"$index\"\n >\n <td v-for=\"(col, $jndex) in columns\" :key=\"$jndex\">{{ row[col.key] }}</td>\n </tr>\n </tbody>\n <tbody v-else class=\"nrdb-table-nodata\">\n <tr><td :colspan=\"columns.length\">No Data</td></tr>\n </tbody>\n </v-table>\n <v-pagination\n v-if=\"rows && props.maxrows > 0\"\n v-model=\"pagination.page\"\n :length=\"pagination.pages\"\n rounded=\"0\"\n />\n </div>\n</template>\n\n<script>\n\nimport { useDataTracker } from '../data-tracker.js' // eslint-disable-line import/order\nimport { mapState } from 'vuex' // eslint-disable-line import/order\n\nexport default {\n name: 'DBUITable',\n inject: ['$socket'],\n props: {\n id: { type: String, required: true },\n props: { type: Object, default: () => ({}) }\n },\n setup (props) {\n useDataTracker(props.id)\n },\n data () {\n return {\n input: {},\n isValid: null,\n pagination: {\n page: 1,\n pages: 0,\n rows: []\n }\n }\n },\n computed: {\n ...mapState('data', ['messages']),\n columns () {\n if (this.props.autocols) {\n if (this.messages[this.id]?.payload) {\n // loop over data and get keys\n const cols = []\n for (const row of this.messages[this.id].payload) {\n Object.keys(row).forEach((key) => {\n if (!cols.includes(key)) {\n cols.push(key)\n }\n })\n }\n return cols.map((col) => {\n return { key: col, label: col }\n })\n } else {\n return [{\n key: '', label: ''\n }]\n }\n } else if (this.props.columns) {\n return this.props.columns\n } else {\n // even if auto cols is off, but we have no columns defined, still have a fall back\n return [{\n key: '', label: ''\n }]\n }\n },\n rows () {\n // store full set of data rows\n if (this.messages[this.id]?.payload) {\n return this.messages[this.id].payload\n } else {\n return undefined\n }\n }\n },\n watch: {\n rows: {\n handler () {\n this.calculatePaginatedRows()\n }\n },\n 'pagination.page': {\n handler () {\n this.calculatePaginatedRows()\n }\n },\n 'props.maxrows': {\n handler () {\n this.calculatePaginatedRows()\n }\n }\n },\n mounted () {\n this.calculatePaginatedRows()\n },\n methods: {\n calculatePaginatedRows () {\n console.log('calculatePaginatedRows', this.pagination.page, this.props.maxrows)\n if (this.props.maxrows > 0) {\n this.pagination.pages = Math.ceil(this.rows?.length / this.props.maxrows)\n this.pagination.rows = this.rows?.slice(\n (this.pagination.page - 1) * this.props.maxrows,\n (this.pagination.page) * this.props.maxrows\n )\n console.log('updated', this.pagination.pages, this.pagination.rows)\n } else {\n this.pagination.page = 1\n this.pagination.pages = 0\n this.pagination.rows = this.rows\n }\n }\n }\n}\n</script>\n\n<style>\n.nrdb-table {\n\n}\n.nrdb-table-nodata {\n text-align: center;\n}\n.nrdb-table-nodata td {\n opacity: 0.5;\n}\n</style>\n","import { render } from \"./UITable.vue?vue&type=template&id=05924896\"\nimport script from \"./UITable.vue?vue&type=script&lang=js\"\nexport * from \"./UITable.vue?vue&type=script&lang=js\"\n\nimport \"./UITable.vue?vue&type=style&index=0&id=05924896&lang=css\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <label v-if=\"props.label\" class=\"nrdb-ui-form-label\">{{ props.label }}</label>\n <v-form v-model=\"isValid\" @submit.prevent=\"onSubmit\">\n <div class=\"nrdb-ui-form-rows\" :class=\"{'nrdb-ui-form-rows--split': props.splitLayout}\">\n <div v-for=\"row in props.options\" :key=\"row.key\" class=\"nrdb-ui-form-row\">\n <v-checkbox v-if=\"row.type === 'checkbox'\" v-model=\"input[row.key]\" :label=\"row.label\" hide-details=\"auto\" />\n <v-switch v-else-if=\"row.type === 'switch'\" v-model=\"input[row.key]\" class=\"nrdb-ui-widget\" :label=\"row.label\" :class=\"{'active': state}\" hide-details=\"auto\" color=\"primary\" />\n <v-textarea\n v-else-if=\"row.type === 'multiline'\"\n v-model=\"input[row.key]\" :rules=\"rules(row)\"\n class=\"nrdb-ui-widget nrdb-ui-text-field\" :rows=\"row.rows\"\n :label=\"row.label\" variant=\"outlined\" hide-details=\"auto\"\n />\n <v-text-field\n v-else\n v-model=\"input[row.key]\" :rules=\"rules(row)\"\n class=\"nrdb-ui-widget nrdb-ui-text-field\"\n :label=\"row.label\" :type=\"row.type\" variant=\"outlined\" hide-details=\"auto\"\n />\n </div>\n </div>\n <div class=\"nrdb-ui-form-actions\">\n <v-btn type=\"submit\" variant=\"flat\" size=\"large\" :disabled=\"!isValid\">{{ props.submit || 'submit' }}</v-btn>\n <v-btn v-if=\"props.cancel\" variant=\"outlined\" size=\"large\" @click=\"clear\">{{ props.cancel }}</v-btn>\n </div>\n </v-form>\n</template>\n\n<script>\n\nimport { useDataTracker } from '../data-tracker.js' // eslint-disable-line import/order\nimport { mapState } from 'vuex' // eslint-disable-line import/order\n\nexport default {\n name: 'DBUIForm',\n inject: ['$socket'],\n props: {\n id: { type: String, required: true },\n props: { type: Object, default: () => ({}) }\n },\n setup (props) {\n useDataTracker(props.id)\n },\n data () {\n return {\n input: {},\n isValid: null\n }\n },\n computed: {\n ...mapState('data', ['messages'])\n },\n mounted () {\n this.reset()\n },\n methods: {\n onSubmit: function () {\n this.$socket.emit('widget-action', this.id, {\n payload: this.input\n })\n },\n clear () {\n this.reset()\n },\n reset () {\n this.props.options.forEach(row => {\n // set defaults\n if (row.type === 'check' || row.type === 'switch') {\n this.input[row.key] = false\n } else if (row.type === 'number') {\n this.input[row.key] = 0\n } else {\n this.input[row.key] = ''\n }\n })\n },\n rules (row) {\n if (row.required) {\n // is required\n return [(v) => {\n console.log('v', v)\n return !!v || row.label + ' is required'\n }]\n } else {\n // no rules\n return []\n }\n }\n }\n}\n</script>\n\n<style scoped>\n</style>\n","import { render } from \"./UIForm.vue?vue&type=template&id=6f50d95c\"\nimport script from \"./UIForm.vue?vue&type=script&lang=js\"\nexport * from \"./UIForm.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <canvas ref=\"chart\" :class=\"className\" />\n</template>\n\n<script>\nimport Chart from 'chart.js/auto' // eslint-disable-line import/no-named-as-default, import/order, n/file-extension-in-import\nimport { useDataTracker } from '../data-tracker.js' // eslint-disable-line import/order\n\nimport { shallowRef } from 'vue'\nimport { mapState } from 'vuex'\n\nexport default {\n name: 'DBUIChart',\n inject: ['$socket'],\n props: {\n id: { type: String, required: true },\n props: { type: Object, default: () => ({}) }\n },\n data () {\n return {\n chart: null\n }\n },\n computed: {\n ...mapState('data', ['messages'])\n },\n watch: {\n 'props.label': function (value) {\n this.chart.options.plugins.title.text = value\n this.chart.update()\n },\n 'props.chartType': function (value) {\n this.chart.config.type = value\n this.chart.update()\n },\n 'props.xAxisType': function (value) {\n this.chart.options.scales.x.type = value\n this.chart.update()\n }\n },\n created () {\n // can't do this in setup as we have custom onInput function\n useDataTracker(this.id, this.onMsgInput)\n },\n mounted () {\n // get a reference to the canvas element\n const el = this.$refs.chart\n // create our ChartJS object\n const chart = new Chart(el, {\n type: this.props.chartType,\n data: {\n // labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],\n // datasets: [{\n // label: '# of Votes',\n // data: [12, 19, 3, 5, 2, 3],\n // borderWidth: 1\n // }]\n datasets: []\n },\n // data: {\n // labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],\n // datasets: [{\n // data: [65, 59, 80, 81, 56, 55]\n // }]\n // },\n options: {\n maintainAspectRatio: false,\n parsing: false,\n scales: {\n x: {\n type: this.props.xAxisType || 'linear'\n },\n y: {\n beginAtZero: true\n }\n },\n plugins: {\n title: {\n display: true,\n text: this.props.label\n },\n legend: {\n display: false\n }\n }\n }\n })\n\n // don't want chart to be reactive, so we can use shallowRef\n this.chart = shallowRef(chart)\n },\n methods: {\n onMsgInput (msg) {\n // TODO:\n // what do we do with the msg object when chart receives it?\n // need some storage into vuex store, but what else, and in what format?\n if (Array.isArray(msg.payload) && !msg.payload.length) {\n // clear the chart\n this.clear()\n } else {\n // update the chart\n this.add(msg)\n }\n },\n clear () {\n this.chart.data.labels = []\n this.chart.data.datasets = []\n this.chart.update()\n },\n add (msg) {\n const payload = msg.payload\n const label = msg.topic\n // determine what type of msg we have\n if (payload !== null && payload !== undefined) {\n if (this.props.chartType === 'line' || this.props.chartType === 'scatter') {\n this.addToLine(payload, label)\n } else if (this.props.chartType === 'bar') {\n this.addToBar(payload, label)\n }\n } else {\n // no payload\n console.log('have no payload')\n }\n },\n /**\n * Function to handle adding a data point to Line Charts\n * @param {*} payload\n * @param {*} label\n */\n addToLine (payload) {\n const datapoint = {}\n // construct our datapoint\n if (typeof payload === 'number') {\n // just a number, assume we're plotting a time series\n datapoint.x = (new Date()).getTime()\n datapoint.y = payload\n } else if (typeof payload === 'object' && 'y' in payload) {\n // may have been given an x/y object already\n datapoint.x = payload.x || (new Date()).getTime()\n datapoint.y = payload.y\n }\n // the chart is empty, we're adding a new series\n if (!this.chart.data.datasets.length) {\n this.chart.data.datasets.push({\n data: [datapoint]\n })\n } else {\n // we're adding a new datapoint to an existing series\n this.chart.data.datasets[0].data.push(datapoint)\n }\n this.chart.update()\n },\n /**\n * Function to handle adding a data point to Bar Charts\n * @param {*} payload\n * @param {*} label\n */\n addToBar (payload, label) {\n label = label || ''\n // construct our datapoint\n if (typeof payload === 'number') {\n // is this series already a label in the chart?\n if (this.chart.data.labels.includes(label)) {\n // yes, so we need to find the index of this label\n const index = this.chart.data.labels.indexOf(label)\n // and update the data at this index\n this.chart.data.datasets[0].data[index] = payload\n } else {\n // no, so we need to add new label and data point\n if (!this.chart.data.datasets.length) {\n this.chart.data.datasets.push({ data: [] })\n }\n this.chart.data.datasets[0].data.push(payload)\n this.chart.data.labels.push(label)\n }\n this.chart.update()\n } else {\n // only support numbers for now\n console.log('Unsupported payload type for Bar Chart:', typeof payload)\n }\n }\n }\n}\n</script>\n\n<style scoped>\n</style>\n","import { render } from \"./UIChart.vue?vue&type=template&id=34172f10\"\nimport script from \"./UIChart.vue?vue&type=script&lang=js\"\nexport * from \"./UIChart.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <v-radio-group\n v-model=\"value\" class=\"nrdb-ui-radio-group\"\n :class=\"'nrdb-ui-radio-group--cols-' + props.columns + ' ' + className\"\n :label=\"label\" variant=\"outlined\" hide-details=\"auto\"\n >\n <v-radio\n v-for=\"option in props.options\" :key=\"option.value\"\n :label=\"option.label\" :value=\"option.value\"\n />\n </v-radio-group>\n</template>\n\n<script>\n\nimport { useDataTracker } from '../data-tracker.js' // eslint-disable-line import/order\nimport { mapState } from 'vuex' // eslint-disable-line import/order\n\nexport default {\n name: 'DBUIRadioGroup',\n inject: ['$socket'],\n props: {\n id: { type: String, required: true },\n props: { type: Object, default: () => ({}) }\n },\n setup (props) {\n useDataTracker(props.id)\n },\n computed: {\n ...mapState('data', ['messages']),\n label: function () {\n return this.props.label\n },\n value: {\n get () {\n return this.messages[this.id]?.payload\n },\n set (val) {\n if (this.value === val) {\n return // no change\n }\n const msg = this.messages[this.id] || {}\n msg.payload = val\n this.messages[this.id] = msg\n this.$socket.emit('widget-change', this.id, val)\n }\n }\n }\n}\n</script>\n","import { render } from \"./UIRadioGroup.vue?vue&type=template&id=04af922a\"\nimport script from \"./UIRadioGroup.vue?vue&type=script&lang=js\"\nexport * from \"./UIRadioGroup.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <v-slider\n v-model=\"value\" :label=\"props.label\" hide-details=\"auto\"\n :class=\"className\"\n :min=\"props.min\" :max=\"props.max\" :step=\"props.step || 1\"\n />\n</template>\n\n<script>\nimport { useDataTracker } from '../data-tracker.js' // eslint-disable-line import/order\nimport { mapState } from 'vuex' // eslint-disable-line import/order\n\nexport default {\n name: 'DBUISlider',\n inject: ['$socket'],\n props: {\n id: { type: String, required: true },\n props: { type: Object, default: () => ({}) }\n },\n setup (props) {\n useDataTracker(props.id)\n },\n data () {\n return {\n value: null\n }\n },\n computed: {\n ...mapState('data', ['messages']),\n storeValue: function () {\n return this.messages[this.id]?.payload\n }\n },\n watch: {\n storeValue: function (val, oldVal) {\n if (this.value === val) {\n return // no change\n }\n this.value = val\n },\n value: function (val, oldVal) {\n if (this.storeValue === val) {\n return // no change\n }\n this.onChange()\n }\n },\n methods: {\n onChange () {\n const msg = this.messages[this.id] || {}\n msg.payload = this.value\n this.$store.commit('data/bind', msg)\n this.$socket.emit('widget-change', this.id, this.value)\n }\n }\n}\n</script>\n\n<style scoped>\n</style>\n","import { render } from \"./UISlider.vue?vue&type=template&id=9e972d72\"\nimport script from \"./UISlider.vue?vue&type=script&lang=js\"\nexport * from \"./UISlider.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <div class=\"nrdb-switch\" :class=\"{'nrdb-nolabel': !props.label, [className]: !!className}\">\n <label v-if=\"props.label\" class=\"v-label\">{{ props.label }}</label>\n <v-switch v-if=\"!icon\" v-model=\"state\" :class=\"{'active': state}\" hide-details=\"auto\" color=\"primary\" @click=\"onChange\" />\n <v-btn v-else variant=\"text\" :icon=\"icon\" :color=\"color\" @click=\"toggle\" />\n </div>\n</template>\n\n<script>\nimport { useDataTracker } from '../data-tracker.js' // eslint-disable-line import/order\nimport { mapState } from 'vuex' // eslint-disable-line import/order\n\nexport default {\n name: 'DBUISwitch',\n inject: ['$socket'],\n props: {\n id: { type: String, required: true },\n props: { type: Object, default: () => ({}) }\n },\n setup (props) {\n useDataTracker(props.id)\n },\n computed: {\n ...mapState('data', ['messages']),\n icon: function () {\n if (this.props.onicon && this.props.officon) {\n const icon = this.state ? this.props.onicon : this.props.officon\n return 'mdi-' + icon\n } else {\n return null\n }\n },\n color: function () {\n if (this.props.oncolor || this.props.offcolor) {\n return this.state ? this.props.oncolor : this.props.offcolor\n }\n return null\n },\n value: function () {\n return this.messages[this.id]?.payload\n },\n state: {\n get () {\n const val = this.value\n if (typeof (val) === 'boolean') {\n return val\n } else if (this.props.evaluated) {\n return val === this.props.evaluated.on\n }\n return this.value\n },\n set (val) {\n const msg = this.messages[this.id] || {}\n msg.payload = val\n this.messages[this.id] = msg\n }\n }\n },\n methods: {\n onChange () {\n // only runs when clicked/changed in UI.\n // inverted as the store doesn't quite update quick enough, but this is reliable method\n this.$socket.emit('widget-change', this.id, !this.value)\n },\n toggle () {\n this.state = !this.state\n this.$socket.emit('widget-change', this.id, this.state)\n }\n }\n}\n</script>\n\n<style>\n.nrdb-switch {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n.nrdb-switch label {\n flex-grow: 1;\n}\n.nrdb-switch .v-selection-control {\n justify-content: flex-end;\n}\n.nrdb-switch.nrdb-nolabel .v-selection-control {\n justify-content: center;\n}\n</style>\n","import { render } from \"./UISwitch.vue?vue&type=template&id=3866e30f\"\nimport script from \"./UISwitch.vue?vue&type=script&lang=js\"\nexport * from \"./UISwitch.vue?vue&type=script&lang=js\"\n\nimport \"./UISwitch.vue?vue&type=style&index=0&id=3866e30f&lang=css\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<script>\nimport DOMPurify from 'dompurify'\nimport hljs from 'highlight.js'\nimport 'highlight.js/styles/default.css'\nimport { marked } from 'marked'\nimport { markedHighlight } from 'marked-highlight'\n\nimport { h } from 'vue'\nimport { mapGetters, mapState } from 'vuex' // eslint-disable-line import/order\n\nimport { useDataTracker } from '../data-tracker.js'\n\nmarked.use(markedHighlight({\n langPrefix: 'hljs language-',\n highlight (code, lang) {\n const language = hljs.getLanguage(lang) ? lang : 'plaintext'\n return hljs.highlight(code, { language }).value\n }\n}))\n\nexport default {\n name: 'DBUIMarkdown',\n inject: ['$socket'],\n props: {\n id: { type: String, required: true },\n props: { type: Object, default: () => ({}) }\n },\n setup (props) {\n useDataTracker(props.id)\n\n // handle {{ variable || 'placeholder' }} case where || is parsed as a table\n const content = props.props.content.replace(/\\|\\|/g, 'mdORmd')\n // convert to markdown\n let md = marked.parse(content)\n // reinject our || into the {{ }} where appropriate\n md = md.replaceAll('mdORmd', '||')\n return () => h({\n props: ['id', 'props'],\n errorCaptured: (err, vm, info) => {\n console.error('errorCaptured', err, vm, info)\n return false\n },\n template: `<div class=\"nrdb-ui-markdown-content\">${DOMPurify.sanitize(md)}</div>`,\n computed: {\n ...mapState('data', ['messages']),\n ...mapGetters('data', ['getMsgProperty']),\n msg () {\n return this.messages[this.id] || {}\n }\n },\n methods: {\n get (path, defaultValue) {\n return this.getMsgProperty(this.id, path, defaultValue)\n }\n }\n }, {\n id: props.id,\n props: props.props\n })\n },\n computed: {\n ...mapState('data', ['messages'])\n },\n errorCaptured: (err, vm, info) => {\n console.error('errorCaptured', err, vm, info)\n return false\n }\n}\n</script>\n<style>\n /* import hljs css */\n @import 'highlight.js/styles/default.css';\n</style>\n","import script from \"./UIMarkdown.vue?vue&type=script&lang=js\"\nexport * from \"./UIMarkdown.vue?vue&type=script&lang=js\"\n\nimport \"./UIMarkdown.vue?vue&type=style&index=0&id=1cc8886e&lang=css\"\n\nconst __exports__ = script;\n\nexport default __exports__","<script>\n\n// eslint-disable vue/one-component-per-file\n\nimport { h } from 'vue'\n\nimport { useDataTracker } from '../data-tracker.js' // eslint-disable-line import/order\nimport { mapState } from 'vuex' // eslint-disable-line import/order\n\nexport default {\n name: 'DBUITemplate',\n inject: ['$socket'],\n props: {\n id: { type: String, required: true },\n props: { type: Object, default: () => ({}) }\n },\n setup (props) {\n useDataTracker(props.id)\n return () => h({\n props: ['id', 'props'],\n errorCaptured: (err, vm, info) => {\n console.error('errorCaptured', err, vm, info)\n return false\n },\n head () {\n let _props = this.props || props\n if (_props.props) { _props = _props.props }\n if (!_props || _props.templateScope === 'local') {\n return {} // this is a \"widget template\" so we don't need to do anything\n }\n const setup = {}\n if (_props.format && (_props.templateScope === 'page:style' || _props.templateScope === 'site:style')) {\n setup.style = [{ innerHTML: _props.format, 'data-template-name': _props.name, 'data-template-scope': _props.templateScope, 'data-template-id': _props.id }]\n }\n // future?\n // if (_props.format && (_props.templateScope === 'page:script' || _props.templateScope === 'site:script')) {\n // setup.script = [{ textContent: _props.format, id: `${_props.name || _props.templateScope}-${_props.id}` }]\n // }\n // if (hasProperty(_props, 'script')) {\n // setup.script = [_props.head.script]\n // }\n // if (hasProperty(_props, 'meta')) {\n // setup.meta = [_props.head.meta]\n // }\n // if (hasProperty(_props, 'link')) {\n // setup.link = [_props.head.link]\n // }\n return setup\n },\n template: props.props.templateScope !== 'local' ? undefined : props.props.format,\n computed: {\n ...mapState('data', ['messages']),\n msg () {\n return this.messages[this.id] || {}\n }\n },\n methods: {\n send (msg) {\n this.$parent.send(this, msg)\n },\n submit ($evt) {\n this.$parent.submit(this, $evt)\n }\n }\n }, {\n id: props.id,\n props: props.props\n })\n },\n errorCaptured: (err, vm, info) => {\n console.error('errorCaptured', err, vm, info)\n return false\n },\n methods: {\n send (component, msg) {\n msg._dashboard = msg._dashboard || {}\n msg._dashboard.sourceId = component.id\n msg._dashboard.templateId = this.id\n this.$socket.emit('widget-action', this.id, msg) // TODO: should we have a widget-send emitter to differentiate from action?\n },\n submit (component, $evt) {\n // extract the form names and values from $evt.target & generate a msg\n // where the payload is an object of name/value pairs\n // and the topic is the event type (e.g. 'submit')\n const formData = new FormData($evt.target)\n const msg = {\n topic: $evt.type,\n payload: Object.fromEntries(formData.entries())\n }\n msg._dashboard = msg._dashboard || {}\n msg._dashboard.sourceId = component.id\n msg._dashboard.templateId = this.id\n this.$socket.emit('widget-action', this.id, msg) // TODO: should we have a widget-send emitter to differentiate from action?\n }\n }\n}\n</script>\n\n<style scoped>\n</style>\n","import script from \"./UITemplate.vue?vue&type=script&lang=js\"\nexport * from \"./UITemplate.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","<template>\n <div :style=\"props.style\">\n <label class=\"nrdb-ui-text-label\">{{ props.label }}</label>\n <span class=\"nrdb-ui-text-value\">{{ value !== null ? value : 'No Message Received' }}</span>\n </div>\n</template>\n\n<script>\n\nimport { useDataTracker } from '../data-tracker.js' // eslint-disable-line import/order\nimport { mapState } from 'vuex' // eslint-disable-line import/order\n\nexport default {\n name: 'DBUIText',\n props: {\n id: { type: String, required: true },\n props: { type: Object, default: () => ({}) }\n },\n setup (props) {\n useDataTracker(props.id)\n },\n computed: {\n ...mapState('data', ['messages', 'properties']),\n value: function () {\n return this.messages[this.id]?.payload\n }\n }\n}\n</script>\n\n<style scoped>\n/* Base Styling */\n.nrdb-ui-text {\n display: flex;\n flex-direction: row;\n gap: 2px;\n}\n.nrdb-ui-text-value {\n font-weight: 600;\n}\n\n/* Layouts */\n.nrdb-ui-text--row-left {\n align-items: center;\n justify-content: flex-start;\n}\n.nrdb-ui-text--row-center {\n align-items: center;\n justify-content: center;\n}\n.nrdb-ui-text--row-center label,\n.nrdb-ui-text--row-center span {\n text-align: center;\n}\n.nrdb-ui-text--row-right {\n align-items: center;\n justify-content: flex-end;\n}\n\n.nrdb-ui-text--row-spread {\n align-items: center;\n justify-content: space-between;\n}\n.nrdb-ui-text--col-center{\n align-items: center;\n justify-content: center;\n flex-direction: column;\n}\n</style>\n","import { render } from \"./UIText.vue?vue&type=template&id=14b9f4fa&scoped=true\"\nimport script from \"./UIText.vue?vue&type=script&lang=js\"\nexport * from \"./UIText.vue?vue&type=script&lang=js\"\n\nimport \"./UIText.vue?vue&type=style&index=0&id=14b9f4fa&scoped=true&lang=css\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-14b9f4fa\"]])\n\nexport default __exports__","<template>\n <v-text-field\n v-if=\"type !== 'textarea'\"\n v-model=\"value\" class=\"nrdb-ui-text-field\"\n :label=\"label\" :type=\"type\" :rules=\"validation\" variant=\"outlined\" hide-details=\"auto\" @blur=\"onBlur\"\n />\n <v-textarea\n v-else\n v-model=\"value\" class=\"nrdb-ui-text-field\"\n :label=\"label\" variant=\"outlined\" hide-details=\"auto\" @blur=\"onBlur\"\n />\n</template>\n\n<script>\n\nimport { useDataTracker } from '../data-tracker.js' // eslint-disable-line import/order\nimport { mapState } from 'vuex' // eslint-disable-line import/order\n\nexport default {\n name: 'DBUIText',\n inject: ['$socket'],\n props: {\n id: { type: String, required: true },\n props: { type: Object, default: () => ({}) }\n },\n setup (props) {\n useDataTracker(props.id)\n },\n computed: {\n ...mapState('data', ['messages']),\n label: function () {\n return this.props.label\n },\n type: function () {\n return this.props.mode || 'text'\n },\n value: {\n get () {\n return this.messages[this.id]?.payload\n },\n set (val) {\n if (this.value === val) {\n return // no change\n }\n const msg = this.messages[this.id] || {}\n msg.payload = val\n this.messages[this.id] = msg\n }\n },\n validation: function () {\n if (this.type === 'email') {\n return [v => !v || /^[^\\s@]+@[^\\s@]+$/.test(v) || 'E-mail must be valid']\n } else {\n return []\n }\n }\n },\n methods: {\n onBlur: function () {\n this.$socket.emit('widget-change', this.id, this.value)\n }\n }\n}\n</script>\n\n<style scoped>\n</style>\n","import { render } from \"./UITextInput.vue?vue&type=template&id=d1190fba\"\nimport script from \"./UITextInput.vue?vue&type=script&lang=js\"\nexport * from \"./UITextInput.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"../../../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","/*\n// sorted imports - temporarily disabled until I get it all working again!\nimport UIButton from './ui-button/UIButton.vue'\nimport UIChart from './ui-chart/UIChart.vue'\nimport UIDropdown from './ui-dropdown/UIDropdown.vue'\nimport UIMarkdown from './ui-markdown/UIMarkdown.vue'\nimport UISlider from './ui-slider/UISlider.vue'\nimport UISwitch from './ui-switch/UISwitch.vue'\nimport UITemplate from './ui-template/UITemplate.vue'\nimport UIText from './ui-text/UIText.vue'\nimport UITextInput from './ui-text-input/UITextInput.vue'\n*/\n\n/* eslint-disable import/order */\n/* eslint-disable n/no-missing-import */\n/* eslint-disable n/file-extension-in-import */\n/* eslint-disable import/no-unresolved */\nimport UIButton from './ui-button/UIButton'\nimport UIDropdown from './ui-dropdown/UIDropdown'\nimport UITable from './ui-table/UITable'\nimport UIForm from './ui-form/UIForm'\nimport UIChart from './ui-chart/UIChart'\nimport UIRadioGroup from './ui-radio-group/UIRadioGroup'\nimport UISlider from './ui-slider/UISlider'\nimport UISwitch from './ui-switch/UISwitch'\nimport UIMarkdown from './ui-markdown/UIMarkdown'\nimport UITemplate from './ui-template/UITemplate'\nimport UIText from './ui-text/UIText'\nimport UITextInput from './ui-text-input/UITextInput'\nexport default {\n 'ui-button': UIButton,\n 'ui-dropdown': UIDropdown,\n 'ui-table': UITable,\n 'ui-form': UIForm,\n 'ui-chart': UIChart,\n 'ui-radio-group': UIRadioGroup,\n 'ui-slider': UISlider,\n 'ui-switch': UISwitch,\n 'ui-markdown': UIMarkdown,\n 'ui-template': UITemplate,\n 'ui-text': UIText,\n 'ui-text-input': UITextInput\n}\n","import { render } from \"./App.vue?vue&type=template&id=d1327f94\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\n\nimport \"./App.vue?vue&type=style&index=0&id=d1327f94&lang=css\"\n\nimport exportComponent from \"../../node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { createRouter, createWebHistory } from 'vue-router'\n\nconst routes = []\n\nconst router = createRouter({\n history: createWebHistory(),\n routes\n})\n\nrouter.beforeEach((to, from, next) => {\n if (to.meta.title) {\n document.title = to.meta.title\n } else {\n document.title = 'Node-RED Dashboard 2.0'\n }\n next()\n})\n\nexport default router\n","/* eslint-disable n/no-missing-import */\n/* eslint-disable n/file-extension-in-import */\n/* eslint-disable import/no-unresolved */\n\n// initial state\nconst state = () => ({\n pages: null,\n groups: null,\n themes: null,\n widgets: null\n})\n\n// getters\nconst getters = {\n pages (state) {\n return state.pages\n },\n groups (state) {\n return state.groups\n },\n themes (state) {\n return state.themes\n },\n widgets (state) {\n return state.widgets\n },\n groupsByPage: (state) => (pageId) => {\n if (state.groups) {\n const groupsOnPage = Object.values(state.groups).filter((p) => {\n return p.page === pageId\n })\n // sort by .order\n return groupsOnPage.sort((a, b) => {\n // if order = 0, prioritise groups where order _is_ set\n const aOrder = a.order || Number.MAX_SAFE_INTEGER\n const bOrder = b.order || Number.MAX_SAFE_INTEGER\n return aOrder - bOrder\n })\n }\n },\n widgetsByGroup: (state) => (groupId) => {\n if (state.widgets) {\n const widgetsInGroup = Object.values(state.widgets).filter((w) => {\n // return all widgets that belong to the specified group (so long as it is not a non-local scoped ui-template)\n return w.props.group === groupId && !(w.type === 'ui-template' && w.props.templateScope !== 'local')\n })\n // sort by .order\n return widgetsInGroup.sort((a, b) => {\n // if order = 0, prioritise groups where order _is_ set\n const aOrder = a.props?.order || Number.MAX_SAFE_INTEGER\n const bOrder = b.props?.order || Number.MAX_SAFE_INTEGER\n return aOrder - bOrder\n })\n }\n },\n siteTemplates: (state) => (dashboardId) => {\n if (state.widgets) {\n const siteTemplates = Object.values(state.widgets).filter((w) => {\n // only return templates where templateScope matches /^site:/ and belong to the specified dashboard\n return w.type === 'ui-template' && w.props.dashboard === dashboardId && w.props.templateScope.match(/^site:/)\n })\n return siteTemplates\n }\n },\n pageTemplates: (state) => (pageId) => {\n if (state.widgets) {\n const pageTemplates = Object.values(state.widgets).filter((w) => {\n // only return templates where templateScope matches /^page:/ and belong to the specified page\n return w.type === 'ui-template' && w.props.page === pageId && w.props.templateScope.match(/^page:/)\n })\n return pageTemplates\n }\n }\n}\n\nconst mutations = {\n pages (state, pages) {\n state.pages = pages\n },\n groups (state, groups) {\n state.groups = groups\n },\n themes (state, themes) {\n state.themes = themes\n },\n widgets (state, widgets) {\n state.widgets = widgets\n },\n widgetState (state, data) {\n // TODO: Assumed widget is on the current page\n const wId = data.widgetId\n\n if ('enabled' in data) {\n state.widgets[wId].state.enabled = data.enabled\n }\n if ('visible' in data) {\n state.widgets[wId].state.visible = data.visible\n }\n }\n}\n\nexport default {\n namespaced: true,\n state,\n getters,\n mutations\n}\n","/**\n * Vuex store for tracking data bound to each widget\n */\n\nimport { getDeepValue, hasProperty } from '../util.js'\n\n// initial state is empty - we don't know if we have any widgets\nconst state = () => ({\n values: {},\n messages: {},\n properties: {}\n})\n\n// map of supported property messages\n// Any msg received with a topic matching a key in this object will be stored in the properties object under the value of the key\n// e.g. { topic: 'ui-property:class', payload: 'my-class' } will be stored as { class: 'my-class' }\nconst supportedPropertyMessages = {\n 'ui-property:class': 'class'\n}\n\nconst mutations = {\n bind (state, data) {\n const widgetId = data.widgetId\n // if packet contains a msg, then we process it\n if ('msg' in data) {\n // first, if the msg.topic is a supported property message, then we store it in the properties object\n // but do not store it in the messages object.\n // This permits the widget to receive property messages without affecting the widget's value\n if (data.msg?.topic && supportedPropertyMessages[data.msg.topic] && hasProperty(data.msg, 'payload')) {\n const controlProperty = supportedPropertyMessages[data.msg.topic]\n state.properties[widgetId] = state.properties[widgetId] || {}\n state.properties[widgetId][controlProperty] = data.msg.payload\n return // do not store in messages object\n }\n // if the msg was not a property message, then we store it in the messages object\n state.messages[widgetId] = data.msg\n }\n }\n}\n\nconst getters = {\n // get the value of a widget's data\n value: (state) => (widgetId) => {\n return state.values[widgetId]\n },\n // get the message of a widget's data\n getMsgProperty: (state) => (widgetId, path, defaultValue) => {\n const msg = state.messages[widgetId] || {}\n return getDeepValue(msg, path, defaultValue)\n }\n}\n\nexport default {\n namespaced: true,\n state,\n mutations,\n getters\n}\n","/* eslint-disable import/order */\nimport { createStore } from 'vuex'\n\nimport ui from './ui.js'\nimport data from './data.js'\n\nexport default createStore({\n modules: {\n ui,\n data\n },\n plugins: []\n})\n","/* eslint-disable import/first */\n/* eslint-disable n/file-extension-in-import */\n/* eslint-disable import/no-unresolved */\n/* eslint-disable import/order */\nimport { VueHeadMixin, createHead } from '@unhead/vue'\nimport { createApp } from 'vue'\nimport App from './App.vue'\nimport { io } from 'socket.io-client'\nimport router from './router.js'\n\n// Vuetify\nimport '@mdi/font/css/materialdesignicons.css'\nimport 'vuetify/styles'\nimport { createVuetify } from 'vuetify'\nimport * as components from 'vuetify/components'\nimport * as directives from 'vuetify/directives'\n\n// set a base theme on which we will add our custom NR-defined theme\nconst theme = {\n dark: false,\n colors: {\n background: '#0000ff',\n 'group-background': '#ffffff',\n primary: '#0000ff',\n accent: '#ff6b99',\n secondary: '#26ff8c',\n success: '#a5d64c',\n surface: '#ffffff',\n info: '#ff53d0',\n warning: '#ff8e00',\n error: '#ff5252'\n }\n}\n\nconst vuetify = createVuetify({\n components,\n directives,\n theme: {\n defaultTheme: 'nrdb',\n themes: {\n nrdb: theme\n }\n }\n})\n\nimport store from './store/index.js'\n\n/*\n * Configure SocketIO Client to Interact with Node-RED\n */\n// Inspect the current URL to determine the correct path to use for socket.io.\n// for example, the base path might be `:1880/` or if `httpNodeRoot` is set, it could be something like `:1880/nr/endpoints/v1`\n// 1. determine the base path to use (grab everything before the first /dashboard)\n// 2. append '/socket.io' to the base path\n// TODO: determine what to do when /dashboard is called something else (support multiple dashboards github #23 )\n// possible idea: pass the base path as a query param from the side bar, extract it then redirect?\nconst url = new URL(window.location.href)\nconst basePath = url.pathname.split('/dashboard')[0]\nconst path = basePath + '/dashboard/socket.io'\nconst socket = io({\n path\n})\n\n// handle final disconnection\nsocket.on('disconnect', (reason) => {\n console.log('SIO disconnected', reason)\n})\n\nsocket.on('connect', () => {\n console.log('SIO connected')\n})\n\nsocket.on('connect_error', (err) => {\n console.log('SIO connect error:', err, err.data)\n})\n\n/**\n * Create VueJS App\n */\nconst app = createApp(App)\n .use(store)\n .use(vuetify)\n .use(router)\n\nconst head = createHead()\napp.use(head)\napp.mixin(VueHeadMixin)\n\n// make the socket service available app-wide via this.$socket\napp.provide('$socket', socket)\n\n// mount the VueJS app into <div id=\"app\"></div> in /ui/public/index.html\napp.mount('#app')\n","/**\n * @description: Get a nested property value from an object by path\n * @param {object} obj - The object to retrieve the value from\n * @param {string} path - The path to the property\n * @param {any} defaultValue - The default value to return if the property is not found\n * @return {any} The value of the property\n * @example\n * const obj = { a: { b: { c: 'hello' } } }\n * getDeepValue(obj, 'a.b.c') // returns 'hello'\n * getDeepValue(obj, 'a.b.d') // returns undefined\n * getDeepValue(obj, 'a.b.d', 'default') // returns 'default'\n * getDeepValue(obj, 'a.b.d', null) // returns null\n *\n * @example\n * const obj = { 'a.b.c': 'hello' }\n * getDeepValue(obj, '[\\\"a.b.c\\\"]') // returns 'hello'\n */\nfunction getDeepValue (obj, path, defaultValue) {\n if (typeof obj === 'undefined' || obj === null) return defaultValue\n\n // scan chars - drop each new var into an array\n let inBracket = false\n let inQuote = false\n const inBracketCharStart = '['\n const inBracketCharEnd = ']'\n const quoteChars = ['\"', \"'\"]\n let newPath = []\n let index = 0\n let current = []\n let prevChar = ''\n let endQuoteChar = ''\n const newVar = () => {\n if (current.length > 0) {\n newPath[index] = [current.join('')]\n }\n index++\n current.length = 0\n }\n for (let i = 0, l = path.length; i < l; i++) {\n const char = path.charAt(i)\n newPath[index] = newPath[index] || []\n current = newPath[index]\n if (inBracket) {\n if (char === inBracketCharEnd) {\n inBracket = false\n newVar()\n } else {\n current.push(char)\n }\n } else if (inQuote) {\n if (char === endQuoteChar && prevChar !== '\\\\') {\n inQuote = false\n newVar()\n } else {\n current.push(char)\n }\n } else if (quoteChars.includes(char)) {\n endQuoteChar = char\n inQuote = true\n newVar()\n } else if (char === inBracketCharStart) {\n inBracket = true\n newVar()\n } else if (char === '.') {\n newVar()\n } else {\n current.push(char)\n }\n prevChar = char\n }\n // squash the remaining chars into the last var\n if (current.length > 0) {\n newPath[index] = [current.join('')]\n }\n\n newPath = newPath.flat()\n\n // scan path for surrounding \" or ' and remove them\n for (let i = 0, l = newPath.length; i < l; i++) {\n if (!newPath[i]) continue\n const firstChar = newPath[i].charAt(0)\n const lastChar = newPath[i].charAt(newPath[i].length - 1)\n if ((firstChar === '\"' || firstChar === \"'\") && (lastChar === '\"' || lastChar === \"'\") && firstChar === lastChar) {\n newPath[i] = newPath[i].slice(1, -1)\n }\n }\n\n for (let i = 0, l = newPath.length; i < l; i++) {\n if (newPath[i] === '') continue\n obj = obj[newPath[i]]\n if (typeof obj === 'undefined') return defaultValue\n if (obj === null) return null\n }\n return obj || defaultValue\n}\n\n/**\n * @description: Check if an object has a property\n * @param {Object} obj - The object to check for the property\n * @param {String} prop - The property to check for\n * @returns {Boolean} True if the object has the property, false otherwise\n */\nfunction hasProperty (obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop)\n}\n\nmodule.exports = {\n getDeepValue,\n hasProperty\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t143: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunk_flowforge_node_red_dashboard\"] = self[\"webpackChunk_flowforge_node_red_dashboard\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [998], function() { return __webpack_require__(1462); })\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["_createBlock","_component_v_app","_createVNode","_component_router_view","class","_component_BaselineLayout","id","_ctx","$route","meta","title","$options","orderedGroups","_createElementBlock","_hoisted_1","_Fragment","_renderList","g","key","_normalizeClass","getGroupClass","style","_normalizeStyle","$data","rowHeight","width","_component_v_card","variant","height","text","_withCtx","_createElementVNode","widgetsByGroup","w","getWidgetClass","props","_resolveDynamicComponent","component","state","disp","name","siteTemplates","dashboard","siteTemplate","_toDisplayString","pageTemplates","pageTemplate","_component_v_app_bar","elevation","prepend","_component_v_app_bar_nav_icon","onClick","_cache","$event","drawer","_component_v_app_bar_title","$props","pageTitle","_component_v_main","_component_v_navigation_drawer","_component_v_list","nav","orderedPages","page","_component_v_list_item","route","path","to","link","_renderSlot","$slots","hexToRgb","hex","bigint","parseInt","replace","r","b","getContrast","bg","bgRgb","brightness","Math","round","textColor","type","String","default","data","computed","mapState","mapGetters","theme","this","pages","themes","colors","Object","values","sort","a","order","watch","updateTheme","mounted","console","log","methods","go","$router","push","$vuetify","nrdb","surface","primary","background","bgPage","groupBg","groupOutline","__exports__","components","BaselineLayout","groups","groupsByPage","widget","classes","widgetProperties","properties","className","join","group","gridGroups","columns","flex","Flex","grid","Grid","notebook","Notebook","_component_v_btn","block","disabled","enabled","action","label","useDataTracker","widgetId","onInput","store","useStore","socket","inject","onMounted","on","msg","commit","visible","emit","onUnmounted","off","required","setup","$evt","evt","clientX","clientY","bbox","target","getBoundingClientRect","messages","_event","$socket","_component_v_combobox","value","onChange","multiple","items","options","length","created","payload","Array","isArray","filter","o","includes","find","$store","map","option","_component_v_table","col","$index","rows","pagination","row","$jndex","_hoisted_2","colspan","_hoisted_3","maxrows","_component_v_pagination","rounded","input","isValid","autocols","cols","keys","forEach","handler","calculatePaginatedRows","ceil","slice","_component_v_form","onSubmit","_withModifiers","splitLayout","_component_v_checkbox","_component_v_switch","color","_component_v_textarea","rules","_component_v_text_field","size","submit","cancel","clear","reset","v","ref","chart","plugins","update","config","scales","x","onMsgInput","el","$refs","Chart","chartType","datasets","maintainAspectRatio","parsing","xAxisType","y","beginAtZero","display","legend","shallowRef","add","labels","topic","undefined","addToLine","addToBar","datapoint","Date","getTime","index","indexOf","_component_v_radio_group","_component_v_radio","get","set","val","_component_v_slider","min","max","step","storeValue","oldVal","icon","toggle","onicon","officon","oncolor","offcolor","evaluated","marked","use","markedHighlight","langPrefix","highlight","code","lang","language","hljs","getLanguage","content","md","parse","replaceAll","h","errorCaptured","err","vm","info","error","template","DOMPurify","defaultValue","getMsgProperty","head","_props","templateScope","format","innerHTML","send","$parent","_dashboard","sourceId","templateId","formData","FormData","fromEntries","entries","validation","onBlur","mode","test","UIButton","UIDropdown","UITable","UIForm","UIChart","UIRadioGroup","UISlider","UISwitch","UIMarkdown","UITemplate","UIText","UITextInput","dashboards","ui","routeName","addRoute","layouts","layout","widgets","markRaw","widgetComponents","render","routes","router","createRouter","history","createWebHistory","beforeEach","from","next","document","getters","pageId","groupsOnPage","p","aOrder","Number","MAX_SAFE_INTEGER","bOrder","groupId","widgetsInGroup","dashboardId","match","mutations","widgetState","wId","namespaced","supportedPropertyMessages","bind","hasProperty","controlProperty","getDeepValue","createStore","modules","dark","accent","secondary","success","warning","vuetify","createVuetify","directives","defaultTheme","url","URL","window","location","href","basePath","pathname","split","io","reason","app","createApp","App","createHead","mixin","VueHeadMixin","provide","mount","obj","inBracket","inQuote","inBracketCharStart","inBracketCharEnd","quoteChars","newPath","current","prevChar","endQuoteChar","newVar","i","l","char","charAt","flat","firstChar","lastChar","prop","prototype","hasOwnProperty","call","module","exports","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","m","deferred","O","result","chunkIds","fn","priority","notFulfilled","Infinity","fulfilled","j","every","splice","n","getter","__esModule","d","definition","defineProperty","enumerable","globalThis","Function","e","Symbol","toStringTag","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","self","__webpack_exports__"],"sourceRoot":""}
|