started docs; fixed color stuff

This commit is contained in:
Sören Oesterwind 2022-02-25 17:22:59 +01:00
parent 94eccbca1f
commit fadc44a1f4
5 changed files with 484 additions and 95 deletions

View File

@ -6,5 +6,5 @@
- [X] time on countdown page
- [X] one-way messaging
- [ ] Better UI
- [ ] Progress bar
- [ ] Endpoint docs
- [X] Progress bar
- [P] Endpoint docs

323
docs/swagger.yaml Normal file
View File

@ -0,0 +1,323 @@
swagger: "2.0"
info:
description: "This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters."
version: "1.0.0"
title: "openCountdown API"
license:
name: "Apache 2.0"
url: "http://www.apache.org/licenses/LICENSE-2.0.html"
host: "localhost:3005"
basePath: "/api/v1"
tags:
- name: "pet"
description: "Everything about your Pets"
externalDocs:
description: "Find out more"
url: "http://swagger.io"
- name: "store"
description: "Access to Petstore orders"
- name: "user"
description: "Operations about user"
externalDocs:
description: "Find out more about about openCountdown"
url: "http://swagger.io"
schemes:
- "http"
paths:
/set/mode:
get:
tags:
- "pet"
summary: "Set the current timers mode"
description: ""
operationId: "setMode"
parameters:
- in: path
name: mode
required: true
type: string
description: The timers mode, can be any of timer, clock, test or black.
produces:
- "application/json"
responses:
"200":
description: "Request was succesful"
/set/timerGoal:
get:
tags:
- "pet"
summary: "Sets the timers goal to `time`, using epoch"
description: ""
operationId: "setTimerGoal"
parameters:
- in: path
name: "time"
required: true
type: number
description: The time when the timer will reach 0 in milliseconds since the epoch start.
produces:
- "application/json"
responses:
"200":
description: "Request was succesful"
/set/addMillisToTimer:
get:
tags:
- "pet"
summary: "Sets the timers goal to now + `time`"
description: ""
operationId: "addMillis"
parameters:
- in: path
name: "time"
required: true
type: number
description: Adds the given input to the current time. Using milliseconds
produces:
- "application/json"
responses:
"200":
description: "Request was succesful"
/set/layout/showTime:
get:
tags:
- "layout"
summary: "If set to true will show the current time on timer page"
description: ""
operationId: "showTime"
parameters:
- in: path
name: "show"
required: true
type: boolean
description: If true will show the current time as a clock below the timer
produces:
- "application/json"
responses:
"200":
description: "Request was succesful"
/set/layout/showMillis:
get:
tags:
- "layout"
summary: "If set to true will show the milliseconds left on timer page"
description: ""
operationId: "showMillis"
parameters:
- in: path
name: "show"
required: true
type: boolean
description: If true will show the milliseconds left on the timer page
produces:
- "application/json"
responses:
"200":
description: "Request was succesful"
/set/progressbar/show:
get:
tags:
- "progressbar"
summary: "If set to true will show the progressbar"
description: ""
operationId: "showProgress"
parameters:
- in: path
name: "show"
required: true
type: boolean
description: "If true will show the progressbar on the timer page"
produces:
- "application/json"
responses:
"200":
description: "Request was succesful"
/set/progressbar/colors:
get:
tags:
- "progressbar"
summary: "Allows to set the color by value"
description: ""
operationId: "progressColors"
parameters:
- in: path
name: "colors"
required: true
type: string
description: "Takes a dictonary with the key being the time left on the countdown and any css color as the value. Example: `{5000: 'red'}`"
produces:
- "application/json"
responses:
"200":
description: "Request was succesful"
/set/text/enableColoring:
get:
tags:
- "text"
summary: "Enable or disable color based on value for the timer"
description: ""
operationId: "textEnableColoring"
parameters:
- in: path
name: "show"
required: true
type: boolean
description: "If true the timer will change color by value, else the timer stays white."
produces:
- "application/json"
responses:
"200":
description: "Request was succesful"
/set/text/colors:
get:
tags:
- "text"
summary: "Allows to set the color by value"
description: ""
operationId: "textColors"
parameters:
- in: path
name: "colors"
required: true
type: string
description: "Takes a dictonary with the key being the time left on the countdown and any css color as the value. Example: `{5000: 'red'}`"
produces:
- "application/json"
responses:
"200":
description: "Request was succesful"
definitions:
Order:
type: "object"
properties:
id:
type: "integer"
format: "int64"
petId:
type: "integer"
format: "int64"
quantity:
type: "integer"
format: "int32"
shipDate:
type: "string"
format: "date-time"
status:
type: "string"
description: "Order Status"
enum:
- "placed"
- "approved"
- "delivered"
complete:
type: "boolean"
default: false
xml:
name: "Order"
Category:
type: "object"
properties:
id:
type: "integer"
format: "int64"
name:
type: "string"
xml:
name: "Category"
User:
type: "object"
properties:
id:
type: "integer"
format: "int64"
username:
type: "string"
firstName:
type: "string"
lastName:
type: "string"
email:
type: "string"
password:
type: "string"
phone:
type: "string"
userStatus:
type: "integer"
format: "int32"
description: "User Status"
xml:
name: "User"
Tag:
type: "object"
properties:
id:
type: "integer"
format: "int64"
name:
type: "string"
xml:
name: "Tag"
Pet:
type: "object"
required:
- "name"
- "photoUrls"
properties:
id:
type: "integer"
format: "int64"
category:
$ref: "#/definitions/Category"
name:
type: "string"
example: "doggie"
photoUrls:
type: "array"
xml:
name: "photoUrl"
wrapped: true
items:
type: "string"
tags:
type: "array"
xml:
name: "tag"
wrapped: true
items:
$ref: "#/definitions/Tag"
status:
type: "string"
description: "pet status in the store"
enum:
- "available"
- "pending"
- "sold"
xml:
name: "Pet"
ApiResponse:
type: "object"
properties:
code:
type: "integer"
format: "int32"
type:
type: "string"
message:
type: "string"
externalDocs:
description: "Find out more about Swagger"
url: "http://swagger.io"

View File

@ -28,9 +28,16 @@ currentState = {
showMessage: false,
messageAppearTime: 0,
showProgressbar: true,
colorSegments: {20000: "#FFAE00", 5000: "#ff0000", "START": "yellow"}
colorSegments: {20000: "#FFAE00", 5000: "#ff0000", "START": "yellow"},
textColors: {},
srvTime: 0,
enableColoredText: true,
debug: false
};
currentState.textColors = currentState.colorSegments
app.get("/", function (req, res) {
const data = fs.readFileSync("templates/adminPanel.html", "utf8");
res.send(data);
@ -42,6 +49,7 @@ app.get("/timer", function (req, res) {
});
app.get("/api/v1/data", function (req, res) {
currentState.srvTime = new Date().getTime()
res.json(currentState);
});
@ -50,13 +58,13 @@ app.get("/api/v1/set/mode", function (req, res) {
res.json({ status: "ok" });
});
app.get("/api/v1/set/showMillis", function (req, res) {
app.get("/api/v1/set/layout/showMillis", function (req, res) {
currentState.showMilliSeconds = (req.query.show === 'true');
res.json({ status: "ok" });
});
app.get("/api/v1/set/timerGoal", function (req, res) {
currentState.countdownGoal = new Date(parseInt(req.query.time)).getTime();
currentState.countdownGoal = new Date(parseInt(req.query.time)).getTime(); // ToDO error handling
res.json({ status: "ok" });
});
@ -83,16 +91,41 @@ app.get("/api/v1/ctrl/timer/restart", function (req, res) {
res.json({ status: "ok" });
});
app.get("/api/v1/set/showTime", function (req, res) {
app.get("/api/v1/set/layout/showTime", function (req, res) {
currentState.showTimeOnCountdown = (req.query.show === 'true');
res.json({ status: "ok" });
});
app.get("/api/v1/set/showProgressBar", function (req, res) {
app.get("/api/v1/set/progressbar/show", function (req, res) {
currentState.showProgressbar = (req.query.show === 'true');
res.json({ status: "ok" });
});
app.get("/api/v1/set/progressbar/colors", function (req, res) {
try {
currentState.colorSegments = JSON.parse(req.query.colors);
res.json({ status: "ok" });
} catch (error) {
res.json({ status: "error", message: error });
}
});
app.get("/api/v1/set/text/colors", function (req, res) {
try {
if(req.query.copy === "true"){
currentState.textColors = currentState.colorSegments;
} else {
currentState.textColors = JSON.parse(req.query.colors);
}
res.json({ status: "ok" });
} catch (error) {
res.json({ status: "error", message: error });
}
});
app.get("/api/v1/set/text/enableColoring", function (req, res) {
currentState.enableColoredText = (req.query.enable === 'true');
});
app.get("/api/v1/ctrl/message/show", function (req, res) {
currentState.message = req.query.msg
@ -101,6 +134,11 @@ app.get("/api/v1/ctrl/message/show", function (req, res) {
res.json({ status: "ok" });
});
app.get("/api/v1/debug", function (req, res) {
currentState.debug = (req.query.enable === 'true');
res.json({ status: "ok" });
});
app.get("/api/v1/ctrl/message/hide", function (req, res) {
currentState.showMessage = false
res.json({ status: "ok" });

View File

@ -13,6 +13,10 @@ function enterFullscreen(element) {
}
}
function returnData() {
return (JSON.parse(document.getElementById("incomeData").innerHTML))
}
function percentage(partialValue, totalValue) {
return (100 * partialValue) / totalValue;
}
@ -23,6 +27,8 @@ function updateFullscreen(){
}
}
function msToTime(s, data) {
isSmallerThenZero = false
if (s < 0) {
@ -50,28 +56,33 @@ function msToTime(s, data) {
}
function findProgessColor(colors, value) {
console.info("\n\n\n\n\n")
const allColors = Object.keys(colors);
let resColor = colors["START"]
for (let color in allColors) {
const currColor = allColors[color]
console.log(color, currColor, parseInt(currColor), value, colors[String(currColor)])
// console.log(color, currColor, parseInt(currColor), value, colors[String(currColor)], resColor)
if (value <= parseInt(currColor)) {
console.log("trith")
resColor = colors[currColor]
resColor = colors[String(currColor)]
break
}
}
// console.info(resColor, value)
return (resColor)
}
function handleUpdate() {
resp = httpGet("/api/v1/data");
resp.onloadend = function (e) {
if(resp.status == 200){
resp = resp.responseText;
var data = JSON.parse(resp);
document.getElementById("incomeData").innerHTML = JSON.stringify(data)
document.getElementById("timediff").innerHTML = new Date().getTime() - data.srvTime;
if(data.debug){
document.getElementById("timediff").style.display = "block";
}else{
document.getElementById("timediff").style.display = "none";
}
if (data.defaultFullScreen && document.getElementById("initalDate").innerHTML.includes("true") && allowFullscreen) {
enterFullscreen(document.documentElement);
@ -103,17 +114,25 @@ function handleUpdate() {
} else if (data.mode == "timer") {
document.getElementById("wholeProgBar").style.display = "block";
if (data.timerRunState) {
const now = new Date()
const diff = data.countdownGoal - now.getTime()
document.getElementById("timer").innerHTML = msToTime(diff, data);
if (diff > 0) {
document.getElementById("progBar").style.width = percentage(diff, data.timeAmountInital) + "%";
} else {
document.getElementById("progBar").style.width = "0%";
}
document.getElementById("progBar").style.backgroundColor = findProgessColor(data.colorSegments, diff)
document.getElementById("testImg").style.display = "none";
if (data.enableColoredText) {
document.getElementById("timer").style.color = findProgessColor(data.textColors, diff)
} else {
document.getElementById("timer").style.color = "white"
}
}
if (data.showTimeOnCountdown) {
@ -134,11 +153,19 @@ function handleUpdate() {
}
}
}
}
function httpGet(theUrl) {
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("GET", theUrl, false); // false for synchronous request
xmlHttp.open("GET", theUrl, true); // false for synchronous request
xmlHttp.send(null);
return xmlHttp.responseText;
xmlHttp.onerror = function (e) {
console.log(e);
};
return xmlHttp;
}
function getTime() {

View File

@ -34,9 +34,10 @@
00:00:00
</div>
<div class="clockSec" id="clockSec">
</div>
<div class="clockSec" id="timediff">
</div>
</div>
<script src="js/countdown.js"></script>
<script src="js/script.js"></script>