blob: 2b49562c6dc6f09c365e33578311f14b025278f8 [file] [log] [blame]
Sukanya Pandey96f69ca2020-05-20 15:32:57 +05301<template>
Sukanya Pandey615b3152020-08-19 19:13:49 +05302 <div :class="isFullWindow ? 'full-window-container' : 'terminal-container'">
Sukanya Pandeyd9dc6fb2020-11-03 11:13:23 +05303 <b-row class="d-flex">
4 <b-col class="d-flex flex-column justify-content-end">
5 <dl class="mb-2" sm="6" md="6">
6 <dt class="d-inline font-weight-bold mr-1">
7 {{ $t('pageSerialOverLan.status') }}:
8 </dt>
9 <dd class="d-inline">
10 <status-icon :status="hostStatusIcon" /> {{ connectionStatus }}
11 </dd>
12 </dl>
13 </b-col>
Sukanya Pandey615b3152020-08-19 19:13:49 +053014
Sukanya Pandeyd9dc6fb2020-11-03 11:13:23 +053015 <b-col v-if="!isFullWindow" class="d-flex justify-content-end">
16 <b-button
17 variant="link"
18 type="button"
19 class="pr-0 button-launch"
20 @click="openConsoleWindow()"
21 >
22 <icon-launch aria-hidden="true" />
Sukanya Pandey615b3152020-08-19 19:13:49 +053023
Sukanya Pandeyd9dc6fb2020-11-03 11:13:23 +053024 {{ $t('pageSerialOverLan.openNewTab') }}
25 </b-button>
26 </b-col>
27 </b-row>
Sukanya Pandey615b3152020-08-19 19:13:49 +053028 <div id="terminal" ref="panel"></div>
29 </div>
Sukanya Pandey96f69ca2020-05-20 15:32:57 +053030</template>
31
32<script>
33import { AttachAddon } from 'xterm-addon-attach';
34import { FitAddon } from 'xterm-addon-fit';
35import { Terminal } from 'xterm';
Sukanya Pandey615b3152020-08-19 19:13:49 +053036import IconLaunch from '@carbon/icons-vue/es/launch/20';
37import StatusIcon from '@/components/Global/StatusIcon';
Sukanya Pandey96f69ca2020-05-20 15:32:57 +053038
39export default {
40 name: 'SerialOverLanConsole',
Sukanya Pandey615b3152020-08-19 19:13:49 +053041 components: {
42 IconLaunch,
Derick Montague602e98a2020-10-21 16:20:00 -050043 StatusIcon,
Sukanya Pandey615b3152020-08-19 19:13:49 +053044 },
45 props: {
46 isFullWindow: {
47 type: Boolean,
Derick Montague602e98a2020-10-21 16:20:00 -050048 default: true,
49 },
Sukanya Pandey615b3152020-08-19 19:13:49 +053050 },
51 computed: {
52 hostStatus() {
53 return this.$store.getters['global/hostStatus'];
54 },
55 hostStatusIcon() {
56 return this.hostStatus === 'on' ? 'success' : 'danger';
57 },
58 connectionStatus() {
59 return this.hostStatus === 'on'
60 ? this.$t('pageSerialOverLan.connected')
61 : this.$t('pageSerialOverLan.disconnected');
Derick Montague602e98a2020-10-21 16:20:00 -050062 },
Sukanya Pandey615b3152020-08-19 19:13:49 +053063 },
64 created() {
65 this.$store.dispatch('global/getHostStatus');
66 },
Sukanya Pandey96f69ca2020-05-20 15:32:57 +053067 mounted() {
68 this.openTerminal();
69 },
70 methods: {
71 openTerminal() {
72 const token = this.$store.getters['authentication/token'];
73
74 const ws = new WebSocket(`wss://${window.location.host}/console0`, [
Derick Montague602e98a2020-10-21 16:20:00 -050075 token,
Sukanya Pandey96f69ca2020-05-20 15:32:57 +053076 ]);
77
78 // Refer https://github.com/xtermjs/xterm.js/ for xterm implementation and addons.
79
80 const term = new Terminal({
81 fontSize: 15,
82 fontFamily:
Derick Montague602e98a2020-10-21 16:20:00 -050083 'SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace',
Sukanya Pandey96f69ca2020-05-20 15:32:57 +053084 });
85
86 const attachAddon = new AttachAddon(ws);
87 term.loadAddon(attachAddon);
88
89 const fitAddon = new FitAddon();
90 term.loadAddon(fitAddon);
91
92 const SOL_THEME = {
93 background: '#19273c',
94 cursor: 'rgba(83, 146, 255, .5)',
Derick Montague602e98a2020-10-21 16:20:00 -050095 scrollbar: 'rgba(83, 146, 255, .5)',
Sukanya Pandey96f69ca2020-05-20 15:32:57 +053096 };
97 term.setOption('theme', SOL_THEME);
98
99 term.open(this.$refs.panel);
100 fitAddon.fit();
101
102 try {
Derick Montague602e98a2020-10-21 16:20:00 -0500103 ws.onopen = function () {
Sukanya Pandey96f69ca2020-05-20 15:32:57 +0530104 console.log('websocket console0/ opened');
105 };
Derick Montague602e98a2020-10-21 16:20:00 -0500106 ws.onclose = function (event) {
Sukanya Pandey96f69ca2020-05-20 15:32:57 +0530107 console.log(
108 'websocket console0/ closed. code: ' +
109 event.code +
110 ' reason: ' +
111 event.reason
112 );
113 };
114 } catch (error) {
115 console.log(error);
116 }
Sukanya Pandey615b3152020-08-19 19:13:49 +0530117 },
118 openConsoleWindow() {
119 window.open(
120 '#/console/serial-over-lan-console',
121 '_blank',
122 'directories=no,titlebar=no,toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=yes,width=600,height=550'
123 );
Derick Montague602e98a2020-10-21 16:20:00 -0500124 },
125 },
Sukanya Pandey96f69ca2020-05-20 15:32:57 +0530126};
127</script>
128
Sukanya Pandey615b3152020-08-19 19:13:49 +0530129<style lang="scss" scoped>
Sukanya Pandey96f69ca2020-05-20 15:32:57 +0530130@import '~xterm/css/xterm.css';
131
Sukanya Pandey615b3152020-08-19 19:13:49 +0530132.terminal-container {
133 #terminal {
134 overflow: auto;
135 }
136}
137@include media-breakpoint-up(xs) {
138 .terminal-container {
139 width: 100%;
140 }
141}
142@include media-breakpoint-up(sm) {
143 .terminal-container {
144 width: 80%;
145 }
146}
147@include media-breakpoint-up(md) {
148 .terminal-container {
149 width: 65%;
150 }
151}
152@include media-breakpoint-up(lg) {
153 .terminal-container {
154 width: 80%;
155 }
156}
157@include media-breakpoint-up(xl) {
158 .terminal-container {
159 width: 60%;
160 }
161}
162
163.full-window-container {
164 width: 97%;
165 max-width: 960px;
166 margin: 1.5%;
167 #terminal {
168 overflow: auto;
169 }
Sukanya Pandey96f69ca2020-05-20 15:32:57 +0530170}
171</style>