some changes

This commit is contained in:
2018-09-13 09:07:29 +02:00
parent 684a548fc0
commit feb4f088d3
17 changed files with 13925 additions and 1322 deletions

BIN
data/favicon-32x32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
data/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

107
data/index.html Normal file
View File

@@ -0,0 +1,107 @@
<!DOCTYPE html>
<html>
<head>
<title>ESP Kit</title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-32x32.png">
<link rel="stylesheet" type="text/css" href="styles.css">
<script src="script.js"></script>
</head>
<body class="sui">
<div class="content">
<!-- <form class="param-control container open collapsible">
<span class="heading">Debug</span>
<div class="content">
<ul>
<li class="form-row ParamWs"
data-name="scrollText"
data-label="Audio"
data-placeholder="some scroll text"
data-endpoint="audiosprocket.lan/audio">
</li>
</ul>
<br>
</div>
</form> -->
<form class="param-control container collapsible open" action="#" method="POST">
<span class="heading">Strip</span>
<div class="content">
<ul>
<li class="form-row ParamColor"
data-mode="2"
data-name="color"
data-label="Color"
data-endpoint="ws://192.168.1.246/pixel">
</li>
<li class="form-row ParamColor"
data-mode="2"
data-name="color2"
data-label="Color 2"
data-endpoint="/pixel">
</li>
<li class="form-row LedStripPatternSwitch"
data-group="stripPattern"
data-id="1"
data-mode="3"
data-name="Rainbow"
data-label="Rainbow"
data-endpoint="ws://192.168.1.246/pixel">
</li>
<li class="form-row LedStripPatternSwitch"
data-group="stripPattern"
data-name="TheaterChase"
data-label="Theater Chase"
data-id="2"
data-mode="3"
data-endpoint="ws://192.168.1.246/pixel">
</li>
<li class="form-row LedStripPatternSwitch"
data-group="stripPattern"
data-name="Scanner"
data-label="Scanner"
data-id="4"
data-mode="3"
data-endpoint="ws://192.168.1.246/pixel">
</li>
</ul>
</div>
</form>
<div class="settings container collapsible open">
<span class="heading">WiFi Settings</span>
<div class="content">
<!-- <div class="Form" data-name="configForm" data-endpoint="/config.json"></div> -->
<form action="/wifiConfig" method="POST">
<!-- <li class="form-row">
<label for="ap">AP Mode</label>
<label class="switch ap-mode">
<input type="checkbox" name="apMode">
<span class="slider round" data-bind="apMode" data-state="false"></span>
</label>
</li -->
<li class="form-row">
<label for="ssid">SSID</label>
<input type="text" name="ssid" placeholder="Default AP: Th1ngs4P">
</li>
<li class="form-row">
<label for="password">PW</label>
<input type="password" name="password" placeholder="Default: th3r31sn0sp00n">
</li>
<li class="form-row">
<label for="hostName">Hostname</label>
<input type="text" name="hostName" placeholder="Default: 192.168.1.143">
</li>
<li class="form-row">
<button type="submit">Save</button>
</li>
</ul>
</form>
</div>
</div>
</div>
</body>
</html>

93
data/matrix.html Normal file
View File

@@ -0,0 +1,93 @@
<!DOCTYPE html>
<html>
<head>
<title>ESP Kit</title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-32x32.png">
<link rel="stylesheet" type="text/css" href="styles.css">
<script src="script.js"></script>
</head>
<body class="sui">
<div class="content">
<form class="param-control container open collapsible">
<span class="heading">Debug</span>
<div class="content">
<ul>
<li class="form-row ParamWs"
data-name="scrollText"
data-label="Audio"
data-placeholder="some scroll text"
data-endpoint="audiosprocket.lan/audio">
</li>
</ul>
<br>
</div>
</form>
<form class="param-control container collapsible open" action="#" method="POST">
<span class="heading">Strip</span>
<div class="content">
<ul>
<li class="form-row ParamColor"
data-name="color"
data-label="Color"
data-endpoint="/patterns">
</li>
<li class="form-row LedStripPatternSwitch"
data-group="stripPattern"
data-name="Rainbow"
data-label="Rainbow"
data-endpoint="/strip/pattern">
</li>
<li class="form-row LedStripPatternSwitch"
data-group="stripPattern"
data-name="Scanner"
data-label="Scanner"
data-endpoint="/strip/pattern">
</li>
<li class="form-row LedStripPatternSwitch"
data-group="stripPattern"
data-name="TheaterChase"
data-label="Theater Chase"
data-endpoint="/strip/pattern">
</li>
</ul>
</div>
</form>
<div class="settings container collapsible open">
<span class="heading">WiFi Settings</span>
<div class="content">
<form action="/wifiConfig" method="POST">
<!-- <li class="form-row">
<label for="ap">AP Mode</label>
<label class="switch ap-mode">
<input type="checkbox" name="apMode">
<span class="slider round" data-bind="apMode" data-state="false"></span>
</label>
</li -->
<li class="form-row">
<label for="ssid">SSID</label>
<input type="text" name="ssid" placeholder="Default AP: Th1ngs4P">
</li>
<li class="form-row">
<label for="password">PW</label>
<input type="password" name="password" placeholder="Default: th3r31sn0sp00n">
</li>
<li class="form-row">
<label for="hostName">Hostname</label>
<input type="text" name="hostName" placeholder="Default: 192.168.1.143">
</li>
<li class="form-row">
<button type="submit">Save</button>
</li>
</ul>
</form>
</div>
</div>
</div>
</body>
</html>

12063
data/script.js Normal file

File diff suppressed because it is too large Load Diff

273
data/styles.css Normal file
View File

@@ -0,0 +1,273 @@
.hidden {
display: none;
}
.shown {
display: block;
}
.disabled {
opacity: 0.65;
}
.sui {
background: #000000;
color: #0eb8c0;
font-family: "Open Sans";
font-size: 16px;
}
.sui * {
margin: 0;
padding: 0;
-webkit-tap-highlight-color: transparent;
}
.sui > .content {
padding: 16px;
}
.sui label {
color: #b3b2b2;
}
.sui button {
background: #097479;
color: #eeeeee;
font-size: 0.9em;
border: 0;
padding: .8em;
margin: 0 .4em;
}
.heading {
font-size: 1.2em;
display: block;
margin-bottom: 16px;
}
.container {
background: #333333;
padding: 16px;
border-radius: 2px;
border: solid 1px #555555;
margin-bottom: 8px;
}
.container.collapsible > .heading {
margin-bottom: 0;
}
.container.collapsible > .heading:hover {
cursor: pointer;
}
.container.collapsible > .content {
display: none;
}
.container.collapsible.open > .heading {
margin-bottom: 16px;
}
.container.collapsible.open > .content {
display: block;
}
input[type=range] {
-webkit-appearance: none;
width: 100%;
margin: 8.4px 0;
padding: 0 !important;
background-color: transparent;
}
input[type=range]:focus {
outline: none;
}
input[type=range]::-webkit-slider-runnable-track {
width: 100%;
height: 3.2px;
cursor: pointer;
box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
background: #097479;
border-radius: 1.3px;
border: 0.2px solid #010101;
}
input[type=range]::-webkit-slider-thumb {
box-shadow: 0.6px 0.6px 2.8px #000000, 0px 0px 0.6px #0d0d0d;
border: 0.4px solid #000000;
height: 20px;
width: 20px;
border-radius: 50px;
background: #0eb8c0;
cursor: pointer;
-webkit-appearance: none;
margin-top: -8.6px;
}
input[type=range]:focus::-webkit-slider-runnable-track {
background: #0eb4bb;
}
input[type=range]::-moz-range-track {
width: 100%;
height: 3.2px;
cursor: pointer;
box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
background: #097479;
border-radius: 1.3px;
border: 0.2px solid #010101;
}
input[type=range]::-moz-range-thumb {
box-shadow: 0.6px 0.6px 2.8px #000000, 0px 0px 0.6px #0d0d0d;
border: 0.4px solid #000000;
height: 20px;
width: 20px;
border-radius: 50px;
background: #0eb8c0;
cursor: pointer;
}
input[type=range]::-ms-track {
width: 100%;
height: 3.2px;
cursor: pointer;
background: transparent;
border-color: transparent;
color: transparent;
}
input[type=range]::-ms-fill-lower {
background: #043437;
border: 0.2px solid #010101;
border-radius: 2.6px;
box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
}
input[type=range]::-ms-fill-upper {
background: #097479;
border: 0.2px solid #010101;
border-radius: 2.6px;
box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
}
input[type=range]::-ms-thumb {
box-shadow: 0.6px 0.6px 2.8px #000000, 0px 0px 0.6px #0d0d0d;
border: 0.4px solid #000000;
height: 20px;
width: 20px;
border-radius: 50px;
background: #0eb8c0;
cursor: pointer;
height: 3.2px;
}
input[type=range]:focus::-ms-fill-lower {
background: #097479;
}
input[type=range]:focus::-ms-fill-upper {
background: #0eb4bb;
}
/* The switch - the box around the slider */
.switch {
position: relative;
display: inline;
/* The slider */
/* Rounded sliders */
}
.switch input {
display: none;
}
.switch .slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #7b7b7b;
-webkit-transition: .4s;
transition: .4s;
margin-left: -50px;
margin-top: 4px;
}
.switch .slider:before {
position: absolute;
content: "";
height: 26px;
width: 26px;
left: 4px;
bottom: 4px;
background-color: white;
-webkit-transition: .4s;
transition: .4s;
}
.switch input:checked + .slider {
background-color: #097479;
}
.switch input:focus + .slider {
box-shadow: 0 0 1px #0eb8c0;
}
.switch input:checked + .slider:before {
-webkit-transform: translateX(26px);
-ms-transform: translateX(26px);
transform: translateX(26px);
}
.switch .slider.round {
border-radius: 34px;
height: 34px;
width: 60px;
}
.switch .slider.round:before {
border-radius: 50%;
}
form .form-row {
display: flex;
justify-content: flex-end;
flex-wrap: wrap;
padding: .2em;
}
form .form-row > label {
padding: .5em 1em .5em 0;
flex: 1;
}
form .form-row > label + label {
flex: 0;
}
form .form-row > label.switch + label {
flex: 1;
}
form .form-row > input {
flex: 2;
}
form .form-row > span {
flex: 2;
text-align: right;
}
form .form-row input[type="checkbox"] {
margin-top: 12px;
}
@media screen and (min-width: 768px) {
form .form-row > input,
form .form-row > span {
flex: 3;
}
}
@media screen and (min-width: 992px) {
form .form-row > input,
form .form-row > span {
flex: 4;
}
}
@media screen and (min-width: 1200px) {
form .form-row > input,
form .form-row > span {
flex: 5;
}
}
.sui input {
padding: .5em;
}
.sui input[type="text"],
.sui input[type="password"] {
height: 16px;
background: transparent;
border: none;
color: #eeeeee;
}
.sui input[type="text"]:focus,
.sui input[type="password"]:focus,
.sui input[type="text"]:hover,
.sui input[type="password"]:hover {
outline: none;
border-bottom: solid 1px #097479;
box-shadow: 3px #097479;
}
.sui input[type="checkbox"] {
transform: scale(2);
}
.ColorPicker {
flex: none !important;
background-color: transparent;
border: 0;
height: 50px;
width: 75px;
}

2580
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -4,18 +4,18 @@
"description": "template project for websprockets",
"main": "index.js",
"scripts": {
"clear": "rimraf target",
"setup": "yarn clear && mkdirp target",
"clear": "rimraf data",
"setup": "yarn clear && mkdirp data",
"test": "echo \"no test specified\" && exit 0",
"dev": "yarn setup && yarn build:frontend && npm-run-all --parallel watch:*",
"build:js": "webpack",
"build:css": "lessc src/styles/main.less target/styles.css",
"build:html": "cp -r src/pages/* target/",
"build:css": "lessc src/styles/main.less data/styles.css",
"build:html": "cp -r src/pages/* data/",
"build:frontend": "yarn setup && yarn build:css && yarn build:html && yarn build:js",
"watch:html": "nodemon -q -w src/pages/ --ext \".\" --exec \"npm run build:html\"",
"watch:css": "nodemon -q -w src/styles --ext \".\" --exec \"npm run build:css\"",
"watch:js": "nodemon -q -w src/app --ext \".\" --exec \"npm run build:js\"",
"watch:livereload": "cd target && live-server --port=3000",
"watch:livereload": "cd data && live-server --port=3000",
"docker:build": "docker build -t wirelos/sprocket-ui .",
"docker:run": "docker run -p 8080:8080 -d registry.gitlab.com/wirelos/sprocket-ui",
"docker:release": "docker tag wirelos/sprocket-ui registry.gitlab.com/wirelos/sprocket-ui && docker push registry.gitlab.com/wirelos/sprocket-ui"

View File

@@ -1,12 +1,15 @@
import $ from 'jquery';
import Switch from './base/Switch/Switch';
import Store from '../core/store/RestStore';
import RestStore from '../core/store/RestStore';
export default class LedStripPatternSwitch extends Switch {
constructor(ctx, node) {
super(ctx, node);
this.store = new Store(this.config.endpoint);
this.store = new RestStore(this.config.endpoint);
this.ws = new WebSocket(this.config.endpoint.indexOf('/') === 0 ? "ws://" + window.location.host + this.config.endpoint : this.config.endpoint );
this.modes = ["init", "Color", "Pattern", "octoPrint"];
this.patterns = [ "none", "Rainbow", "Scanner", "ColorWipe", "TheaterChase"];
}
@@ -14,18 +17,23 @@ export default class LedStripPatternSwitch extends Switch {
onClick(evt) {
// FIXME separate mode from pattern
let payload = {
id: this.patterns.indexOf(this.config.name),
pattern: this.config.name.substring(0,1),
group: this.config.group,
mode: 'P',
state: this.state
//id: this.patterns.indexOf(this.config.name),
//pattern: this.config.name.substring(0,1),
//group: this.config.group,
//mode: 'P',
//state: this.state
value: ''+this.config.id,
mode: ''+this.config.mode,
foo: this.value
};
this.ctx.mediator.trigger('/ledStripPreset/switched', payload);
}
subscribe() {
this.ctx.mediator.on('/ledStripPreset/switched', (payload) => {
this.store.save(payload);
//this.store.save(payload);
console.log(payload);
this.ws.send(JSON.stringify(payload));
if (payload.state
&& payload.id !== this.patterns.indexOf(this.config.name)
&& payload.group === this.config.group) {

View File

@@ -7,7 +7,7 @@ export default class ParamColor extends ColorPicker {
constructor(ctx, node) {
super(ctx, node);
//this.store = new Store(this.config.endpoint);
this.ws = new WebSocket(this.config.endpoint.indexOf('/') > -1 ? "ws://" + window.location.host + this.config.endpoint : this.config.endpoint );
this.ws = new WebSocket(this.config.endpoint.indexOf('/') === 0 ? "ws://" + window.location.host + this.config.endpoint : this.config.endpoint );
this.ws.onopen = (event) => {
console.log('open ' + this.config.endpoint);
};
@@ -20,8 +20,12 @@ export default class ParamColor extends ColorPicker {
/*this.store.save({
rgb: parseInt(this.value.replace('#', '0x'))
});*/
let cmd = this.config.id + parseInt(this.value.replace('#', '0x'));
this.ws.send(cmd);
//let cmd = this.config.id + parseInt(this.value.replace('#', '0x'));
console.log(parseInt(this.value.replace('#', '0x')));
this.ws.send(JSON.stringify({
mode: this.config.mode,
value: parseInt(this.value.replace('#', '0x'))
}));
}
}

View File

@@ -8,7 +8,7 @@ export default class ParamWs extends TextInput {
super(ctx, node);
//this.store = new Store(this.config.endpoint);
this.ws = new WebSocket(this.config.endpoint.indexOf('/') > -1 ? "ws://" + window.location.host + this.config.endpoint : this.config.endpoint );
this.ws = new WebSocket(this.config.endpoint.indexOf('/') === 0 ? "ws://" + window.location.host + this.config.endpoint : this.config.endpoint );
this.ws.onopen = (event) => {
console.log('open ' + this.config.endpoint);
};

View File

@@ -0,0 +1,3 @@
<form action="{{endpoint}}">
<button class="js-submit">Submit</button>
</form>

View File

@@ -0,0 +1,43 @@
import $ from 'jquery';
import Component from '../../../core/Component';
import TextInput from '../TextInput/TextInput';
import Store from '../../../core/store/RestStore';
export default class Form extends Component {
constructor(ctx, node) {
super(ctx, node);
this.store = new Store(this.config.endpoint);
this.render(this.config);
this.fields = [];
let tf1 = new TextInput(ctx);
tf1.config = {
name: 'ssid',
label: 'SSID',
placeholder: 'some AP'
};
tf1.value = 'MyAp';
this.fields.push(tf1);
this.fields.forEach((f) => {
f.render({
name: 'ssid',
label: 'SSID',
placeholder: 'some AP'
});
this.node.prepend(f);
});
this.node.delegate('click', '.js-submit', this.onSubmit.bind(this));
}
onSubmit(evt) {
let obj = {};
obj[this.config.name] = this.value;
//this.store.save(obj);
console.log(this.value);
}
}

View File

@@ -1,3 +1,4 @@
export { default as Form } from './base/Form/Form'
export { default as Switch } from './base/Switch/Switch'
export { default as Slider } from './base/Slider/Slider'
export { default as TextInput } from './base/TextInput/TextInput'

View File

@@ -7,9 +7,9 @@ export default class Component {
constructor(ctx, node, template) {
this.ctx = ctx;
this.node = node;
this.node = node ? node : $();
this.component = this.constructor.name;
this.config = this.node.data();
this.config = this.node.data() || {name: 'none'};
this.data = {};
this.markup = template;
}
@@ -33,6 +33,7 @@ export default class Component {
render(data) {
if (data) data.helpers = this.templateHelpers();
let rendered = Mustache.render(this.markup, data);
if(!this.node) this.node = $(rendered);
this.node.html(rendered);
this.bindData();
}

View File

@@ -31,34 +31,40 @@
<div class="content">
<ul>
<li class="form-row ParamColor"
data-id="C"
data-mode="2"
data-name="color"
data-label="Color"
data-endpoint="/patterns">
data-endpoint="ws://192.168.1.246/pixel">
</li>
<li class="form-row ParamColor"
data-id="D"
data-mode="2"
data-name="color2"
data-label="Color 2"
data-endpoint="/patterns">
data-endpoint="/pixel">
</li>
<li class="form-row LedStripPatternSwitch"
data-group="stripPattern"
data-id="1"
data-mode="3"
data-name="Rainbow"
data-label="Rainbow"
data-endpoint="/strip/pattern">
</li>
<li class="form-row LedStripPatternSwitch"
data-group="stripPattern"
data-name="Scanner"
data-label="Scanner"
data-endpoint="/strip/pattern">
data-endpoint="ws://192.168.1.246/pixel">
</li>
<li class="form-row LedStripPatternSwitch"
data-group="stripPattern"
data-name="TheaterChase"
data-label="Theater Chase"
data-endpoint="/strip/pattern">
data-id="2"
data-mode="3"
data-endpoint="ws://192.168.1.246/pixel">
</li>
<li class="form-row LedStripPatternSwitch"
data-group="stripPattern"
data-name="Scanner"
data-label="Scanner"
data-id="4"
data-mode="3"
data-endpoint="ws://192.168.1.246/pixel">
</li>
</ul>
</div>
@@ -66,6 +72,7 @@
<div class="settings container collapsible open">
<span class="heading">WiFi Settings</span>
<div class="content">
<!-- <div class="Form" data-name="configForm" data-endpoint="/config.json"></div> -->
<form action="/wifiConfig" method="POST">
<!-- <li class="form-row">
<label for="ap">AP Mode</label>

View File

@@ -1,7 +1,7 @@
module.exports = {
entry: './src/app/main.js',
output: {
filename: './target/script.js'
filename: './data/script.js'
},
module: {
loaders: [{