App.vue 9.57 KB
Newer Older
Nanyang Fu's avatar
init  
Nanyang Fu committed
1 2
<template>
  <div id="app">
WuFeiyang's avatar
WuFeiyang committed
3
    <b-navbar class="Widget">
WuFeiyang's avatar
WuFeiyang committed
4
      <b-dropdown id="dropdown-1" text="Add Widget" class="m-md-2" variant="primary" size="lg">
WuFeiyang's avatar
WuFeiyang committed
5 6 7 8 9
        <b-dropdown-item
          v-for="(availableWidget,index) in availableWidgets"
          :key="index"
          class="smallFont"
        >
WuFeiyang's avatar
WuFeiyang committed
10
          <div v-on:click="addWidget(availableWidget)">{{availableWidget}}</div>
WuFeiyang's avatar
WuFeiyang committed
11 12
        </b-dropdown-item>
      </b-dropdown>
WuFeiyang's avatar
WuFeiyang committed
13
      <b-button
WuFeiyang's avatar
WuFeiyang committed
14
        class="largeFont"
WuFeiyang's avatar
WuFeiyang committed
15 16 17 18
        @click="saveWidgetList"
        style="margin-left:2%"
        variant="primary"
      >Save</b-button>
WuFeiyang's avatar
WuFeiyang committed
19 20 21 22
      <b-form-file
        id="file"
        type="file"
        @change="loadTextFromFile"
WuFeiyang's avatar
WuFeiyang committed
23
        placeholder="Choose a widgetTemplate file to load"
WuFeiyang's avatar
WuFeiyang committed
24 25
        accept=".json"
        style="width:30%;margin-left:2%"
WuFeiyang's avatar
WuFeiyang committed
26
        class="smallFont"
WuFeiyang's avatar
WuFeiyang committed
27
      />
WuFeiyang's avatar
WuFeiyang committed
28 29
    </b-navbar>

WuFeiyang's avatar
WuFeiyang committed
30 31
    <!-- <b-button @click="test">test</b-button> -->

WuFeiyang's avatar
WuFeiyang committed
32
    <grid-layout
WuFeiyang's avatar
WuFeiyang committed
33 34 35 36 37 38 39 40 41
      :layout.sync="widgetList"
      :col-num="12"
      :row-height="30"
      :is-draggable="true"
      :is-resizable="true"
      :is-mirrored="false"
      :vertical-compact="true"
      :margin="[10, 10]"
      :use-css-transforms="true"
WuFeiyang's avatar
WuFeiyang committed
42
    >
WuFeiyang's avatar
WuFeiyang committed
43 44 45 46 47 48 49 50
      <grid-item
        v-for="(widget) in widgetList"
        :x="widget.x"
        :y="widget.y"
        :w="widget.w"
        :h="widget.h"
        :i="widget.i"
        :key="widget.i"
WuFeiyang's avatar
WuFeiyang committed
51 52
        drag-allow-from=".vue-draggable-handle"
        drag-ignore-from=".no-drag"
WuFeiyang's avatar
WuFeiyang committed
53 54
      >
        <div style="border-color: rgb(206, 212, 218);">
WuFeiyang's avatar
WuFeiyang committed
55
          <div class="vue-draggable-handle" style="height:20px;background-color:rgb(0, 123, 255)"></div>
WuFeiyang's avatar
WuFeiyang committed
56
          <component class="no-drag" :is="widget.widgetComponentName" :ref="widget.ref"></component>
WuFeiyang's avatar
WuFeiyang committed
57 58
        </div>
      </grid-item>
WuFeiyang's avatar
WuFeiyang committed
59
    </grid-layout>
Nanyang Fu's avatar
init  
Nanyang Fu committed
60 61 62
  </div>
</template>

WuFeiyang's avatar
WuFeiyang committed
63 64
     

Nanyang Fu's avatar
init  
Nanyang Fu committed
65
<script lang="ts">
WuFeiyang's avatar
WuFeiyang committed
66 67
import { Component, Vue } from "vue-property-decorator";
import axios from "axios";
WuFeiyang's avatar
WuFeiyang committed
68
import { GridItemData, GridLayout, GridItem } from "vue-grid-layout";
WuFeiyang's avatar
WuFeiyang committed
69
import VueRouter from "vue-router";
WuFeiyang's avatar
WuFeiyang committed
70 71 72 73

import { WidgetRef } from "./models/WidgetRef";
import { WidgetConfig, AllWidgetConfig } from "./models/WidgetConfig";
import { Action, UpdatePayload } from "./models/UpdatePayload";
WuFeiyang's avatar
WuFeiyang committed
74
import { Widget } from "./models/widget";
WuFeiyang's avatar
WuFeiyang committed
75
import { ResourceInfo } from "./models/Customview";
WuFeiyang's avatar
WuFeiyang committed
76
import { indexOf } from "typescript-collections/dist/lib/arrays";
Nanyang Fu's avatar
init  
Nanyang Fu committed
77

WuFeiyang's avatar
WuFeiyang committed
78 79 80 81 82
//when add more available widgets add ref to the widgets
import Status from "./components/Status/Status.vue";
import WaveView from "./components/WaveView/WaveView.vue";
import Method from "./components/Method/Method.vue";
import Config from "./components/Config/Config.vue";
WuFeiyang's avatar
WuFeiyang committed
83
import Thing from "./components/Thing/Thing.vue";
84
import State from "./components/State/State.vue";
WuFeiyang's avatar
WuFeiyang committed
85
import VarBroadcast from "./components/VarBroadcast/VarBroadcast.vue";
WuFeiyang's avatar
WuFeiyang committed
86
import AutoBroadcast from "./components/AutoBroadcast/AutoBroadcast.vue";
WuFeiyang's avatar
WuFeiyang committed
87
import SlideShow from "./components/SlideShow/SlideShow.vue";
WuFeiyang's avatar
WuFeiyang committed
88
import CardReader from "./components/CardReader/CardReader.vue";
89
// import Gauge from "./components/Gauge/Gauge.vue";
WuFeiyang's avatar
WuFeiyang committed
90 91

//this is the view selecotr class
Nanyang Fu's avatar
init  
Nanyang Fu committed
92 93
@Component({
  components: {
WuFeiyang's avatar
WuFeiyang committed
94 95 96 97
    //when add more available widgets add ref to the widgets
    Status,
    WaveView,
    Method,
WuFeiyang's avatar
WuFeiyang committed
98
    Config,
WuFeiyang's avatar
WuFeiyang committed
99
    Thing,
WuFeiyang's avatar
WuFeiyang committed
100
    GridLayout,
101
    GridItem,
WuFeiyang's avatar
WuFeiyang committed
102
    State,
WuFeiyang's avatar
WuFeiyang committed
103
    VarBroadcast,
WuFeiyang's avatar
WuFeiyang committed
104
    AutoBroadcast,
WuFeiyang's avatar
WuFeiyang committed
105 106
    SlideShow,
    CardReader
WuFeiyang's avatar
WuFeiyang committed
107
  }
Nanyang Fu's avatar
init  
Nanyang Fu committed
108
})
Nanyang Fu's avatar
t  
Nanyang Fu committed
109
export default class App extends Vue {
WuFeiyang's avatar
WuFeiyang committed
110
  widgetList: WidgetRef[] = [];
WuFeiyang's avatar
WuFeiyang committed
111
  fileName: string = "widgetTemplate.json";
WuFeiyang's avatar
WuFeiyang committed
112 113 114 115 116
  private lastWidgetIndex: number = 0;
  isShowAddWidget: Boolean = false;
  text: string = "";

  //when add more available widgets add its name here
WuFeiyang's avatar
WuFeiyang committed
117 118 119 120 121 122
  availableWidgets = [
    "Status",
    "Config",
    "WaveView",
    "Method",
    "Thing",
WuFeiyang's avatar
WuFeiyang committed
123
    "State",
WuFeiyang's avatar
WuFeiyang committed
124
    "VarBroadcast",
WuFeiyang's avatar
WuFeiyang committed
125
    "AutoBroadcast",
WuFeiyang's avatar
WuFeiyang committed
126 127
    "SlideShow",
    "CardReader"
WuFeiyang's avatar
WuFeiyang committed
128
  ];
WuFeiyang's avatar
WuFeiyang committed
129
  
WuFeiyang's avatar
WuFeiyang committed
130 131 132 133 134

  toggleShowAddWidget(): void {
    this.isShowAddWidget = !this.isShowAddWidget;
  }

135
  pokeAndUpdateUI(ref: string, sample: any) {
WuFeiyang's avatar
WuFeiyang committed
136
    Vue.nextTick(() => {
WuFeiyang's avatar
WuFeiyang committed
137
      ((this.$refs[ref] as Array<Widget>)[0] as Widget).samplePoke(sample);
WuFeiyang's avatar
WuFeiyang committed
138
      ((this.$refs[ref] as Array<Widget>)[0] as Widget).updateUI();
WuFeiyang's avatar
WuFeiyang committed
139
    });
WuFeiyang's avatar
WuFeiyang committed
140
  }
WuFeiyang's avatar
WuFeiyang committed
141

WuFeiyang's avatar
WuFeiyang committed
142 143
  dataAccess(URL: string) {
    axios
WuFeiyang's avatar
WuFeiyang committed
144
      .get(URL, {
WuFeiyang's avatar
WuFeiyang committed
145 146 147 148 149 150
        headers: {
          Pragma: "no-cache",
          "Cache-Control": "no-cache"
        }
      })
      .then(dataresponse => {
WuFeiyang's avatar
WuFeiyang committed
151 152 153 154 155 156 157 158 159 160 161 162 163
        var samplePath = dataresponse.data.CFET2CORE_SAMPLE_PATH as string;
        console.log(samplePath);
        samplePath = samplePath.slice(samplePath.lastIndexOf('/')+1);
        console.log(samplePath);
        if(samplePath.startsWith("data")|| samplePath.startsWith("Data"))
        {
          console.log("success");
          this.addWidget("WaveView");
        }
        else{
          var resourcetype = dataresponse.data.ResourceType;
          this.addWidget(resourcetype);
        }
WuFeiyang's avatar
WuFeiyang committed
164 165 166 167 168
        var tempRef = (this.lastWidgetIndex - 1).toString();
        this.pokeAndUpdateUI(tempRef, dataresponse.data);
      });
  }

WuFeiyang's avatar
WuFeiyang committed
169
 mounted() {
WuFeiyang's avatar
WuFeiyang committed
170
    var fragment = window.location.hash;
WuFeiyang's avatar
WuFeiyang committed
171
    if (fragment != "#blank" && fragment != "#Blank" && fragment != "#") {
WuFeiyang's avatar
WuFeiyang committed
172 173
      fragment = fragment.substring(1, fragment.length);
      var customViewURL = "/customView/template" + fragment;
WuFeiyang's avatar
WuFeiyang committed
174
      var isCustomview: boolean = false;
WuFeiyang's avatar
WuFeiyang committed
175
      //axios之前出现过cache过多刷不出来的问题,所以本项目的axios都加上了禁止cache的头文件
WuFeiyang's avatar
WuFeiyang committed
176
      axios
WuFeiyang's avatar
WuFeiyang committed
177 178 179 180 181 182 183 184 185 186 187 188
        .get(customViewURL, {
          headers: {
            Pragma: "no-cache",
            "Cache-Control": "no-cache"
          }
        })
        .then(response => {
          if (
            response.data.CFET2CORE_SAMPLE_ISVALID == true &&
            response.data.CFET2CORE_SAMPLE_VAL != null
          ) {
            isCustomview = true;
WuFeiyang's avatar
WuFeiyang committed
189
           
WuFeiyang's avatar
WuFeiyang committed
190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212
            //返回有值的customview template,进行load处理
            var customviewTemplate: string;
            customviewTemplate = response.data.CFET2CORE_SAMPLE_VAL;
            var widgets = Object.assign(
              new AllWidgetConfig(),
              JSON.parse(customviewTemplate)
            );
            this.widgetList = widgets.widgetList;
            this.lastWidgetIndex = Number(widgets.currentRef);
            this.$forceUpdate();
            //替换startpath
            Vue.nextTick(() => {
              // fragment = fragment.substring(1,fragment.length);
              // for (var wid of this.widgetList) {
              //      ((this.$refs[wid.ref] as Array<Widget>)[0] as Widget).replaceStartPath( fragment as string);
              //  }
              //刷新值
              this.importActiveWidgetList();
              // for (var wid of this.widgetList) {
              //   ((this.$refs[wid.ref] as Array<Widget>)[0] as Widget).refresh();
              // }
            });
          }
WuFeiyang's avatar
WuFeiyang committed
213 214 215 216 217 218 219
          else{
            var dataURL = fragment;
            this.dataAccess(dataURL);
          }
        }).catch(err=>{
            var dataURL = fragment;
            this.dataAccess(dataURL);
WuFeiyang's avatar
WuFeiyang committed
220
        });
WuFeiyang's avatar
WuFeiyang committed
221
    }
WuFeiyang's avatar
WuFeiyang committed
222

WuFeiyang's avatar
WuFeiyang committed
223
    PubSub.subscribe("VarBroadcast",(messageName:string, Args:any)=>{
WuFeiyang's avatar
WuFeiyang committed
224 225 226 227
      //接收到消息调用全部widget的parentUpdate函数
      for (var widget of this.widgetList) {
      ((this.$refs[widget.ref] as Array<Widget>)[0] as Widget).parentUpdate(Args);}
    });
WuFeiyang's avatar
WuFeiyang committed
228 229 230 231
  }

  exportActiveWidgetList(): AllWidgetConfig {
    for (var widget of this.widgetList) {
WuFeiyang's avatar
WuFeiyang committed
232 233 234
      widget.widgetConfig = ((this.$refs[widget.ref] as Array<
        Widget
      >)[0] as Widget).getConfig();
WuFeiyang's avatar
WuFeiyang committed
235 236 237 238 239 240 241 242 243
    }
    var widgetConfigList = new AllWidgetConfig();
    widgetConfigList.widgetList = this.widgetList;
    widgetConfigList.currentRef = this.lastWidgetIndex.toString();
    return widgetConfigList;
  }

  importActiveWidgetList() {
    for (var wid of this.widgetList) {
WuFeiyang's avatar
WuFeiyang committed
244 245 246
      ((this.$refs[wid.ref] as Array<Widget>)[0] as Widget).setConfig(
        wid.widgetConfig as WidgetConfig
      );
WuFeiyang's avatar
WuFeiyang committed
247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262
    }
  }

  loadTextFromFile(ev: any) {
    const file = ev.target.files[0];
    const reader = new FileReader();
    reader.readAsText(file);
    var widgets;
    reader.onload = e => {
      widgets = Object.assign(
        new AllWidgetConfig(),
        JSON.parse((e.target as any).result)
      );
      this.widgetList = widgets.widgetList;
      this.lastWidgetIndex = Number(widgets.currentRef);
      this.$forceUpdate();
WuFeiyang's avatar
WuFeiyang committed
263 264
      Vue.nextTick(() => {
        // changed here
WuFeiyang's avatar
WuFeiyang committed
265
        this.importActiveWidgetList();
WuFeiyang's avatar
WuFeiyang committed
266
      });
WuFeiyang's avatar
WuFeiyang committed
267
    };
WuFeiyang's avatar
WuFeiyang committed
268
  }
WuFeiyang's avatar
WuFeiyang committed
269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289

  saveWidgetList(): void {
    var data = JSON.stringify(this.exportActiveWidgetList());

    const blob = new Blob([data]);
    if (window.navigator.msSaveOrOpenBlob) {
      // 兼容IE10
      navigator.msSaveBlob(blob, this.fileName);
    } else {
      //  chrome/firefox
      let aTag = document.createElement("a");
      aTag.download = this.fileName;
      aTag.href = URL.createObjectURL(blob);
      aTag.click();
      URL.revokeObjectURL(aTag.href);
    }
  }

  addWidget(widgetName: string): void {
    var newWidget = new WidgetRef();
    newWidget.widgetComponentName = widgetName;
WuFeiyang's avatar
WuFeiyang committed
290
    newWidget.ref = this.lastWidgetIndex.toString();
WuFeiyang's avatar
WuFeiyang committed
291 292
    newWidget.y = this.lastWidgetIndex * 6;
    newWidget.i = Number(newWidget.ref);
WuFeiyang's avatar
WuFeiyang committed
293 294 295 296 297 298 299 300 301 302 303 304 305 306
    this.lastWidgetIndex++;
    this.widgetList = [...this.widgetList, newWidget];
  }

  update(payload: UpdatePayload) {
    for (var wid of this.widgetList) {
      (this.$refs[wid.ref] as Widget).parentUpdate(payload);
    }
    if (payload.action == "") {
      for (var wid of this.widgetList) {
        (this.$refs[wid.ref] as Widget).refresh();
      }
    }
  }
Nanyang Fu's avatar
t  
Nanyang Fu committed
307
}
Nanyang Fu's avatar
init  
Nanyang Fu committed
308 309 310 311
</script>

<style>
#app {
WuFeiyang's avatar
WuFeiyang committed
312
  font-family: "Avenir", Helvetica, Arial, sans-serif;
Nanyang Fu's avatar
init  
Nanyang Fu committed
313 314 315 316
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
WuFeiyang's avatar
WuFeiyang committed
317
}
WuFeiyang's avatar
WuFeiyang committed
318
.Widget {
WuFeiyang's avatar
WuFeiyang committed
319 320
  width: 100%;
  border-color: rgb(206, 212, 218);
Nanyang Fu's avatar
init  
Nanyang Fu committed
321 322
}
</style>