Stairs/web/index.html
Mark van Renswoude f6808c4833 Implemented time triggers logic
Frontend needs quite a bit of work still
2018-01-14 13:56:30 +01:00

268 lines
12 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<meta name="theme-color" content="#000000">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="bundle.css">
<script src="bundle.js"></script>
</head>
<body>
<div id="app">
<div v-cloak>
<div id="container">
<div class="header">
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAXBJREFUeNrsWdENgjAQLcYBcAPcACdQN4AN2MC4gRsYJ9ENdAPYADaADepdUhM1qFjurgp9ScMHgd713V3ftUp5eHgMF1rrGEau6VHD2HMbH5qJOLHra+fkzbsYRshM8pLTgUIgSgvuMMoYw+iMYTr6QhNYMrNiNywILlyVKdcyyPsmcRsyU50kgHtQQu2AdNJFpDkAK4I/LIWMb2AsIBcq0iRGeQGPTZfV6QE0+gDGF2rosGEgMQxIAhnZAiPN84upRf0/OlpsLCBp3yq0chgtCUUZrRw6QDO3EWHSqF9tarZaSKJXeJDdbQlsE0KD6JN/KoRsGhxXKClCKHJIfkThwMWhA6dBSolRijkJOd1ZUv9yQ9OpqbHpiaUVaEbZE7tIIjoBKXysos1c4V8ebLEdbv2bcMsE7gjuBdvXRSJ4F+/wqIXXrIGwmX3zwacLDheNO91OjLQKd14VMDCnYgCxVjI3NTe1mSoPD49x4SrAAG9qPn4eovCMAAAAAElFTkSuQmCC" />
<h1>{{ $t('title') }}</h1>
<h2>{{ version.systemID !== null ? $t('systemID') + ': ' + version.systemID : '' }}</h2>
<div class="wifistatus">
<div class="connection">
<div class="indicator" :data-status="wifiStatus.ap.enabled ? 'connected' : 'disconnected'"></div> {{ $t('wifiStatus.accesspoint.title') }} {{ wifiStatus.ap.enabled ? wifiStatus.ap.ip : $t('wifiStatus.accesspoint.disabled') }}
</div>
<div class="connection">
<div class="indicator" :data-status="getWiFiStationStatus()"></div> {{ $t('wifiStatus.stationmode.title') }} {{ getWiFiStationStatusText() }}
</div>
</div>
</div>
<div v-if="loading" class="loading">
{{ $t('loading') }} {{ loadingIndicator }}
</div>
<div v-if="!loading">
<div class="tabs">
<button class="button" :class="{ 'button-outline': activeTab != 'status' }" @click="activeTab = 'status'">{{ $t('status.tabTitle') }}</button>
<button class="button" :class="{ 'button-outline': activeTab != 'triggers' }" @click="activeTab = 'triggers'">{{ $t('triggers.tabTitle') }}</button>
<button class="button" :class="{ 'button-outline': activeTab != 'connection' }" @click="activeTab = 'connection'">{{ $t('connection.tabTitle') }}</button>
<button class="button" :class="{ 'button-outline': activeTab != 'system' }" @click="activeTab = 'system'">{{ $t('system.tabTitle') }}</button>
</div>
<div v-if="activeTab == 'status'">
<!--
Status tab
-->
<h3>{{ $t('status.title') }}</h3>
<div>
<input type="radio" name="allSteps" :value="true" v-model="allSteps" id="allStepsTrue">
<label class="label-inline" for="allStepsTrue">{{ $t('status.allStepsTrue') }}</label>
</div>
<div>
<input type="radio" name="allSteps" :value="false" v-model="allSteps" id="allStepsFalse">
<label class="label-inline" for="allStepsFalse">{{ $t('status.allStepsFalse') }}</label>
</div>
<div class="sliders">
<div class="step" v-if="allSteps">
<span class="value">{{ Math.floor(allStepsValue / 255 * 100) }}%</span>
<div class="slidercontainer">
<input type="range" min="0" max="255" class="slider" v-model.number="allStepsValue">
</div>
</div>
<div class="step" v-if="!allSteps" v-for="(step, index) in steps">
<span class="value">{{ Math.floor(step.value / 255 * 100) }}%</span>
<div class="slidercontainer">
<input type="range" min="0" max="255" class="slider" v-model.number="step.value">
</div>
</div>
</div>
</div>
<div v-if="activeTab == 'triggers'">
<!--
Triggers tab
-->
<form @submit.prevent="applyTriggers">
<fieldset>
<h3>{{ $t('triggers.timeTitle') }}</h3>
<div class="warning" v-if="!wifiStatus.station.enabled || wifiStatus.station.status != 3">
{{ $t('triggers.timeInternet') }}
</div>
<div v-if="triggers.time.triggers.length" class="timeTriggers">
<div v-for="(trigger, index) in triggers.time.triggers" class="trigger">
<!-- enabled -->
<input type="radio" v-model="trigger.triggerType" value="0" :name="'triggerType' + index" :id="'triggerType0' + index"><label class="label-inline" :for="'triggerType0' + index">{{ $t('triggers.timeFixedTime') }}</label>
<input type="radio" v-model="trigger.triggerType" value="1" :name="'triggerType' + index" :id="'triggerType1' + index"><label class="label-inline" :for="'triggerType1' + index">{{ $t('triggers.timeSunrise') }}</label>
<input type="radio" v-model="trigger.triggerType" value="2" :name="'triggerType' + index" :id="'triggerType2' + index"><label class="label-inline" :for="'triggerType2' + index">{{ $t('triggers.timeSunset') }}</label>
<label :for="'time' + index">{{ $t('triggers.timeTime') }}</label>
<input type="number" :id="'time' + index" v-model.number="trigger.time">
<!-- daysOfWeek -->
<div class="step">
<span class="value">{{ Math.floor(trigger.brightness / 255 * 100) }}%</span>
<div class="slidercontainer">
<input type="range" min="0" max="255" class="slider" v-model.number="trigger.brightness">
</div>
</div>
</div>
</div>
<div v-else class="nodata">
{{ $t('triggers.timeNoData') }}
</div>
</fieldset>
<fieldset>
<h3>{{ $t('triggers.motionTitle') }}</h3>
</fieldset>
</form>
</div>
<div v-if="activeTab == 'connection'">
<!--
Connection tab
-->
<form @submit.prevent="applyConnection">
<fieldset>
<h3>{{ $t('connection.title') }}</h3>
<input type="checkbox" id="accesspoint" v-model="connection.accesspoint">
<label class="label-inline" for="accesspoint">{{ $t('connection.accesspoint') }}</label>
<span class="hint">{{ $t('connection.accesspointHint') }}</span>
<input type="checkbox" id="station" v-model="connection.station">
<label class="label-inline" for="station">{{ $t('connection.stationmode') }}</label>
<span class="hint">{{ $t('connection.stationmodeHint') }}</span>
<label for="ssid">{{ $t('connection.ssid') }}</label>
<input type="text" id="ssid" v-model="connection.ssid" :disabled="!connection.station">
<label for="password">{{ $t('connection.password') }}</label>
<input type="password" id="password" v-model="connection.password" :disabled="!connection.station">
<input type="checkbox" id="dhcp" v-model="connection.dhcp" :disabled="!connection.station">
<label class="label-inline" for="dhcp">{{ $t('connection.dhcp') }}</label>
<span class="hint">{{ $t('connection.dhcpHint') }}</span>
<div class="suboptions">
<label for="ip">{{ $t('connection.ipaddress') }}</label>
<input type="text" id="ip" v-model="connection.ip" :disabled="!connection.station || connection.dhcp">
<label for="subnetmask">{{ $t('connection.subnetmask') }}</label>
<input type="text" id="subnetmask" v-model="connection.subnetmask" :disabled="!connection.station || connection.dhcp">
<label for="gateway">{{ $t('connection.gateway') }}</label>
<input type="text" id="gateway" v-model="connection.gateway" :disabled="!connection.station || connection.dhcp">
</div>
<label for="hostname">{{ $t('connection.hostname') }}</label>
<input type="text" :placeholder="$t('connection.hostnamePlaceholder')" id="hostname" v-model="connection.hostname" :disabled="!connection.station">
<div class="buttons">
<input class="button-primary" type="submit" :disabled="saving" :value="saving ? $t('applyButtonSaving') : $t('applyButton')">
</div>
</fieldset>
</form>
</div>
<div v-if="activeTab == 'system'">
<!--
System tab
-->
<form @submit.prevent="uploadFirmware" id="system">
<fieldset>
<h3>{{ $t('system.firmwareTitle') }}</h3>
<input type="file" id="firmwareFile">
<div class="buttons">
<input class="button-primary" type="submit" :disabled="saving" :value="saving ? $t('applyButtonSaving') : $t('applyButton')">
</div>
<div v-if="uploadProgress !== false">
{{ uploadProgress }}%
</div>
</fieldset>
</form>
<form @submit.prevent="applySystem" id="system">
<fieldset>
<h3>{{ $t('system.ntpTitle') }}</h3>
<div class="warning" v-if="!wifiStatus.station.enabled || wifiStatus.station.status != 3">
{{ $t('triggers.timeInternet') }}
</div>
<label for="lat">{{ $t('system.ntpLat') }}</label>
<input type="text" id="lat" v-model="system.lat">
<label for="lng">{{ $t('system.ntpLng') }}</label>
<input type="text" id="lng" v-model="system.lng">
<div class="suboptions">
<label for="location" class="label-inline">{{ $t('system.ntpLocation') }}</label>
<input type="text" id="location" v-model="location">
<button class="button button-outline" @click.prevent="searchLocation" :disabled="searchingLocation">{{ $t('system.ntpLocationSearch') }}</button>
</div>
<h3>{{ $t('system.pinsTitle') }}</h3>
<label for="pinLEDAP">{{ $t('system.pinLEDAP') }}</label>
<input type="number" id="pinLEDAP" v-model.number="system.pins.ledAP">
<label for="pinLEDSTA">{{ $t('system.pinLEDSTA') }}</label>
<input type="number" id="pinLEDSTA" v-model.number="system.pins.ledSTA">
<label for="pinAPButton">{{ $t('system.pinAPButton') }}</label>
<input type="number" id="pinAPButton" v-model.number="system.pins.apButton">
<label for="pinPWMDriverSDA">{{ $t('system.pinPWMDriverSDA') }}</label>
<input type="number" id="pinPWMDriverSDA" v-model.number="system.pins.pwmSDA">
<label for="pinPWMDriverSCL">{{ $t('system.pinPWMDriverSCL') }}</label>
<input type="number" id="pinPWMDriverSCL" v-model.number="system.pins.pwmSCL">
<label for="pwmAddress">{{ $t('system.pwmAddress') }}</label>
<input type="number" id="pwmAddress" v-model.number="system.pwmAddress">
<label for="pwmFrequency">{{ $t('system.pwmFrequency') }}</label>
<input type="number" id="pwmFrequency" v-model.number="system.pwmFrequency">
<h3>{{ $t('system.mapsTitle') }}</h3>
<label for="mapsAPIKey">{{ $t('system.mapsAPIKey') }}</label>
<input type="number" id="mapsAPIKey" v-model.number="system.mapsAPIKey">
<span class="hint">{{ $t('system.mapsAPIKeyhint') }}</span>
<div class="buttons">
<input class="button-primary" type="submit" :disabled="saving" :value="saving ? $t('applyButtonSaving') : $t('applyButton')">
</div>
</fieldset>
</form>
</div>
</div>
<div class="clearfix"></div>
</div>
<div class="version">
{{ $t('copyright') }}<br>
{{ version.version !== null ? $t('firmwareVersion') + version.version : '' }}
</div>
</div>
</div>
<script language="javascript">
console.log('Initializing...');
startApp();
</script>
</body>
</html>