Compare commits
5 Commits
5e0793c7fc
...
8a1a7d19b5
Author | SHA1 | Date |
---|---|---|
schrom01 | 8a1a7d19b5 | |
schrom01 | c3fd986144 | |
schrom01 | 930bd7de4b | |
schrom01 | a945fca764 | |
schrom01 | 403099ebd6 |
Binary file not shown.
|
@ -0,0 +1,55 @@
|
||||||
|
<?php
|
||||||
|
require $_SERVER['DOCUMENT_ROOT'] . '/spreadSheetReader/read_write_xlsx.php';
|
||||||
|
$fileName = $_SERVER['DOCUMENT_ROOT'] . '/data/data.xlsx';
|
||||||
|
function objectToArray($object, $fullJSON) {
|
||||||
|
return [$object -> id,
|
||||||
|
$object -> lastSave,
|
||||||
|
$fullJSON,
|
||||||
|
$object -> timeWatchM,
|
||||||
|
$object -> timeWatchW,
|
||||||
|
$object -> timeWatchD,
|
||||||
|
$object -> countWatchM,
|
||||||
|
$object -> countWatchW,
|
||||||
|
$object -> countWatchD];
|
||||||
|
}
|
||||||
|
|
||||||
|
function findRowIndex($id, $data) {
|
||||||
|
$rowCounter = -1;
|
||||||
|
foreach ($data as $row) {
|
||||||
|
$rowCounter ++;
|
||||||
|
if($row[0] == $id) {
|
||||||
|
return $rowCounter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $rowCounter + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
$entityBody = '{"lastSave": 0, "timeWatchM": 0, "timeWatchW": 0, "timeWatchD": 0, "countWatchM": 0, "countWatchW": 0, "countWatchD": 0, "id":"test","watches":[{"actions":[]},{"actions":[]},{"actions":[]}]}';
|
||||||
|
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
||||||
|
$entityBody = file_get_contents('php://input');
|
||||||
|
$entityBodyObject = json_decode($entityBody);
|
||||||
|
|
||||||
|
echo "POST Request received.<br>";
|
||||||
|
|
||||||
|
if(property_exists($entityBodyObject, "id")) {
|
||||||
|
$data = read_xls_file($fileName);
|
||||||
|
|
||||||
|
foreach ($data as $row) {
|
||||||
|
echo "new Row: <br>";
|
||||||
|
foreach ($row as $cell) {
|
||||||
|
echo $cell." ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$rowIndex = findRowIndex($entityBodyObject->id, $data);
|
||||||
|
$data[$rowIndex] = objectToArray($entityBodyObject, $entityBody);
|
||||||
|
write_xlsxFile($fileName, $data);
|
||||||
|
echo "<br>Data saved.<br>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
280
index.html
280
index.html
|
@ -1,140 +1,142 @@
|
||||||
<html>
|
<html lang="de">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<link rel="stylesheet" href="css/custom.css">
|
<link rel="stylesheet" href="css/custom.css">
|
||||||
<link rel="stylesheet" href="css/bootstrap.css">
|
<link rel="stylesheet" href="css/bootstrap.css">
|
||||||
|
<title>Genderwatch-protocol</title>
|
||||||
</head>
|
|
||||||
<body>
|
</head>
|
||||||
<section>
|
<body>
|
||||||
<div class="container">
|
<section>
|
||||||
<h1>Genderwatch-protocol</h1>
|
<div class="container">
|
||||||
<h2 style="margin-left: 10px;">Aktuelles Thema</h2>
|
<h1>Genderwatch-protocol</h1>
|
||||||
<table class="table-bordered">
|
<a href="data/data.xlsx">Anonyme Daten herunterladen</a>
|
||||||
<tr>
|
<h2 style="margin-left: 10px;">Aktuelles Thema</h2>
|
||||||
<td colspan="2">
|
<table class="table-bordered">
|
||||||
<input class="form-control" type="text" id="topicInput" placeholder="Thema hier eingeben">
|
<tr>
|
||||||
</td>
|
<td colspan="2">
|
||||||
<td>
|
<input class="form-control" type="text" id="topicInput" placeholder="Thema hier eingeben">
|
||||||
<button class="" onclick="closeTopic()">
|
</td>
|
||||||
Thema abschliessen
|
<td>
|
||||||
</button>
|
<button class="" onclick="closeTopic()">
|
||||||
</td>
|
Thema abschliessen
|
||||||
</tr>
|
</button>
|
||||||
<tr>
|
</td>
|
||||||
<th>
|
</tr>
|
||||||
M
|
<tr>
|
||||||
</th>
|
<th>
|
||||||
<th>
|
M
|
||||||
W
|
</th>
|
||||||
</th>
|
<th>
|
||||||
<th>
|
W
|
||||||
D
|
</th>
|
||||||
</th>
|
<th>
|
||||||
</tr>
|
D
|
||||||
|
</th>
|
||||||
<tr>
|
</tr>
|
||||||
<td id="time-0">
|
|
||||||
0
|
<tr>
|
||||||
</td>
|
<td id="time-0">
|
||||||
<td id="time-1">
|
0
|
||||||
0
|
</td>
|
||||||
</td>
|
<td id="time-1">
|
||||||
<td id="time-2">
|
0
|
||||||
0
|
</td>
|
||||||
</td>
|
<td id="time-2">
|
||||||
</tr>
|
0
|
||||||
<tr>
|
</td>
|
||||||
<td id="count-0">
|
</tr>
|
||||||
0
|
<tr>
|
||||||
</td>
|
<td id="count-0">
|
||||||
<td id="count-1">
|
0
|
||||||
0
|
</td>
|
||||||
</td>
|
<td id="count-1">
|
||||||
<td id="count-2">
|
0
|
||||||
0
|
</td>
|
||||||
</td>
|
<td id="count-2">
|
||||||
</tr>
|
0
|
||||||
<tr>
|
</td>
|
||||||
<td>
|
</tr>
|
||||||
<button class="" onclick="start(0)">Beginnt zu Reden</button>
|
<tr>
|
||||||
</td>
|
<td>
|
||||||
<td>
|
<button class="" onclick="start(0)">Beginnt zu Reden</button>
|
||||||
<button class="" onclick="start(1)">Beginnt zu Reden</button>
|
</td>
|
||||||
</td>
|
<td>
|
||||||
<td>
|
<button class="" onclick="start(1)">Beginnt zu Reden</button>
|
||||||
<button class="" onclick="start(2)">Beginnt zu Reden</button>
|
</td>
|
||||||
</td>
|
<td>
|
||||||
</tr>
|
<button class="" onclick="start(2)">Beginnt zu Reden</button>
|
||||||
<tr>
|
</td>
|
||||||
<td colspan="3">
|
</tr>
|
||||||
<button class="" style="width: 98%;" onclick="stop()">Hört auf zu Reden, -> Stille</button>
|
<tr>
|
||||||
</td>
|
<td colspan="3">
|
||||||
</tr>
|
<button class="" style="width: 98%;" onclick="stop()">Hört auf zu Reden, -> Stille</button>
|
||||||
<tr>
|
</td>
|
||||||
<td colspan="3">
|
</tr>
|
||||||
<button class="" style="width: 98%;" onclick="resetButton()">Reset</button>
|
<tr>
|
||||||
</td>
|
<td colspan="3">
|
||||||
</tr>
|
<button class="" style="width: 98%;" onclick="resetButton()">Reset</button>
|
||||||
</table>
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="container">
|
</div>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
<H2>Abgeschlossene Themen</H2>
|
|
||||||
<button class="" onclick="buttonDeleteAllClosedTopics()">alle Löschen</button>
|
|
||||||
<table class="table-bordered">
|
<H2>Abgeschlossene Themen</H2>
|
||||||
<thead>
|
<button class="" onclick="buttonDeleteAllClosedTopics()">alle Löschen</button>
|
||||||
<tr>
|
<table class="table-bordered">
|
||||||
<th style="min-width: 100px;">
|
<thead>
|
||||||
Thema
|
<tr>
|
||||||
</th>
|
<th style="min-width: 100px;">
|
||||||
<th style="min-width: 100px;">
|
Thema
|
||||||
M
|
</th>
|
||||||
</th>
|
<th style="min-width: 100px;">
|
||||||
<th style="min-width: 100px;">
|
M
|
||||||
W
|
</th>
|
||||||
</th>
|
<th style="min-width: 100px;">
|
||||||
<th style="min-width: 100px;">
|
W
|
||||||
D
|
</th>
|
||||||
</th>
|
<th style="min-width: 100px;">
|
||||||
</tr>
|
D
|
||||||
</thead>
|
</th>
|
||||||
<tbody id="closedTopicsTable">
|
</tr>
|
||||||
|
</thead>
|
||||||
</tbody>
|
<tbody id="closedTopicsTable">
|
||||||
|
|
||||||
|
</tbody>
|
||||||
|
|
||||||
</table>
|
|
||||||
|
|
||||||
</div>
|
</table>
|
||||||
</section>
|
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
<script src="js/functions.js"></script>
|
|
||||||
<script>
|
|
||||||
closedTopics = JSON.parse(localStorage.getItem("closedTopics"))
|
<script src="js/functions.js"></script>
|
||||||
if(!closedTopics) {
|
<script>
|
||||||
closedTopics = []
|
closedTopics = JSON.parse(localStorage.getItem("closedTopics"))
|
||||||
}
|
if(!closedTopics) {
|
||||||
|
closedTopics = []
|
||||||
watches = JSON.parse(localStorage.getItem("watches"))
|
}
|
||||||
if(!watches){
|
|
||||||
reset()
|
actualTopic = JSON.parse(localStorage.getItem("actualTopic"))
|
||||||
}
|
if(!actualTopic) {
|
||||||
|
initializeNewTopic()
|
||||||
document.getElementById("topicInput").value = localStorage.getItem("actualTopic")
|
}
|
||||||
document.getElementById("topicInput").addEventListener('keyup', saveActualTopicToLocalStorage);
|
document.getElementById("topicInput").value = actualTopic.name
|
||||||
refreshClosedTopics()
|
|
||||||
setInterval(() => {
|
document.getElementById("topicInput").addEventListener('keyup', saveActualTopicName);
|
||||||
refreshWatch(0)
|
refreshClosedTopics()
|
||||||
refreshWatch(1)
|
setInterval(() => {
|
||||||
refreshWatch(2)
|
refreshWatch(0)
|
||||||
}, 100);
|
refreshWatch(1)
|
||||||
</script>
|
refreshWatch(2)
|
||||||
</body>
|
}, 100);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
</html>
|
</html>
|
|
@ -1,6 +1,12 @@
|
||||||
|
function initializeNewTopic() {
|
||||||
|
actualTopic = {"name": "", "id": randomId()}
|
||||||
|
reset()
|
||||||
|
document.getElementById("topicInput").value = actualTopic.name
|
||||||
|
}
|
||||||
|
|
||||||
function reset() {
|
function reset() {
|
||||||
actualTopic.watches = [{"actions": []}, {"actions": []}, {"actions": []}]
|
actualTopic.watches = [{"actions": []}, {"actions": []}, {"actions": []}]
|
||||||
saveWatchesToLocalStorage()
|
saveActualTopic()
|
||||||
}
|
}
|
||||||
|
|
||||||
function resetButton() {
|
function resetButton() {
|
||||||
|
@ -12,7 +18,7 @@ function resetButton() {
|
||||||
function buttonDeleteAllClosedTopics() {
|
function buttonDeleteAllClosedTopics() {
|
||||||
if(confirm("Sollen alle abgeschlossenen Themen gelöscht werden?")) {
|
if(confirm("Sollen alle abgeschlossenen Themen gelöscht werden?")) {
|
||||||
closedTopics = []
|
closedTopics = []
|
||||||
saveClosedTopicsToLocalStorage()
|
saveClosedTopics()
|
||||||
refreshClosedTopics()
|
refreshClosedTopics()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,8 +30,9 @@ function buttonDeleteClosedTopic(topicIndex) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function closeTopic() {
|
function closeTopic() {
|
||||||
|
stop()
|
||||||
let defaultname = "Thema"
|
let defaultname = "Thema"
|
||||||
let name = document.getElementById("topicInput").value
|
let name = actualTopic.name
|
||||||
let nameLessCounter = 1
|
let nameLessCounter = 1
|
||||||
while(!name){
|
while(!name){
|
||||||
let foundName = false
|
let foundName = false
|
||||||
|
@ -40,53 +47,50 @@ function closeTopic() {
|
||||||
name = defaultname + nameLessCounter
|
name = defaultname + nameLessCounter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
actualTopic.name = name
|
||||||
closedTopics.push({"name": name, "watches": watches})
|
closedTopics.push(actualTopic)
|
||||||
stop()
|
saveClosedTopics()
|
||||||
reset()
|
|
||||||
document.getElementById("topicInput").value = ""
|
|
||||||
saveActualTopicToLocalStorage()
|
|
||||||
saveClosedTopicsToLocalStorage()
|
|
||||||
refreshClosedTopics()
|
refreshClosedTopics()
|
||||||
|
initializeNewTopic()
|
||||||
}
|
}
|
||||||
|
|
||||||
function deleteTopic(topicIndex) {
|
function deleteTopic(topicIndex) {
|
||||||
closedTopics = closedTopics.slice(0, topicIndex).concat(closedTopics.slice(topicIndex+1))
|
closedTopics = closedTopics.slice(0, topicIndex).concat(closedTopics.slice(topicIndex+1))
|
||||||
saveClosedTopicsToLocalStorage()
|
saveClosedTopics()
|
||||||
refreshClosedTopics()
|
refreshClosedTopics()
|
||||||
}
|
}
|
||||||
|
|
||||||
function reopenTopic(topicIndex) {
|
function reopenTopic(topicIndex) {
|
||||||
if(watches[0]["actions"]["length"] > 0 || watches[1]["actions"]["length"] > 0 ||watches[2]["actions"]["length"] > 0 || document.getElementById("topicInput").value != "") {
|
if(actualTopic.watches[0]["actions"]["length"] > 0 || actualTopic.watches[1]["actions"]["length"] > 0 ||actualTopic.watches[2]["actions"]["length"] > 0 || actualTopic.name !== "") {
|
||||||
closeTopic()
|
closeTopic()
|
||||||
}
|
}
|
||||||
watches = closedTopics[topicIndex]["watches"]
|
actualTopic = closedTopics[topicIndex]
|
||||||
document.getElementById("topicInput").value = closedTopics[topicIndex]["name"]
|
document.getElementById("topicInput").value = actualTopic.name
|
||||||
deleteTopic(topicIndex)
|
deleteTopic(topicIndex)
|
||||||
saveWatchesToLocalStorage()
|
saveClosedTopics()
|
||||||
saveActualTopicToLocalStorage()
|
saveActualTopic()
|
||||||
}
|
}
|
||||||
|
|
||||||
function start(watchIndex) {
|
function start(watchIndex) {
|
||||||
stop()
|
stop()
|
||||||
watches[watchIndex].actions.push({"type": "start", "time": new Date().getTime()})
|
actualTopic.watches[watchIndex].actions.push({"type": "start", "time": new Date().getTime()})
|
||||||
saveWatchesToLocalStorage()
|
saveActualTopic()
|
||||||
}
|
}
|
||||||
|
|
||||||
function stop() {
|
function stop() {
|
||||||
watches.forEach(watch => {
|
actualTopic.watches.forEach(watch => {
|
||||||
if(watch["actions"]["length"] > 0) {
|
if(watch["actions"]["length"] > 0) {
|
||||||
if(watch["actions"]["length"] % 2 == 1){
|
if(watch["actions"]["length"] % 2 === 1){
|
||||||
watch["actions"].push({"type": "stop", "time": new Date().getTime()})
|
watch["actions"].push({"type": "stop", "time": new Date().getTime()})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
saveWatchesToLocalStorage()
|
saveActualTopic()
|
||||||
}
|
}
|
||||||
|
|
||||||
function calcPercForWatch(watchIndex, topic) {
|
function calcPercForWatch(watchIndex, topic) {
|
||||||
let sumAll = sumAllwatches(topic)
|
let sumAll = sumAllwatches(topic)
|
||||||
if(sumAll == 0) {
|
if(sumAll === 0) {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
return Math.round(sumForWatch(topic.watches[watchIndex]) / sumAllwatches(topic) * 100)
|
return Math.round(sumForWatch(topic.watches[watchIndex]) / sumAllwatches(topic) * 100)
|
||||||
|
@ -112,7 +116,7 @@ function countForWatch(watch) {
|
||||||
|
|
||||||
function calcPercCountForWatch(watchindex, topic) {
|
function calcPercCountForWatch(watchindex, topic) {
|
||||||
let sumAll = sumCountAllWatches(topic)
|
let sumAll = sumCountAllWatches(topic)
|
||||||
if(sumAll == 0) {
|
if(sumAll === 0) {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
return Math.round(countForWatch(topic.watches[watchindex]) / sumAll * 100)
|
return Math.round(countForWatch(topic.watches[watchindex]) / sumAll * 100)
|
||||||
|
@ -132,14 +136,14 @@ function timeToISO(time){
|
||||||
|
|
||||||
function refreshWatch(watchIndex) {
|
function refreshWatch(watchIndex) {
|
||||||
let timeCell = document.getElementById("time-" + watchIndex)
|
let timeCell = document.getElementById("time-" + watchIndex)
|
||||||
timeCell.textContent = timeToISO(sumForWatch(watches[watchIndex]))
|
timeCell.textContent = timeToISO(sumForWatch(actualTopic.watches[watchIndex]))
|
||||||
if(watches[watchIndex]["actions"].length != 0 && watches[watchIndex]["actions"].slice(-1)[0]["type"] == "start"){
|
if(actualTopic.watches[watchIndex]["actions"].length !== 0 && actualTopic.watches[watchIndex]["actions"].slice(-1)[0]["type"] === "start"){
|
||||||
timeCell.classList.add("active")
|
timeCell.classList.add("active")
|
||||||
} else {
|
} else {
|
||||||
timeCell.classList.remove("active")
|
timeCell.classList.remove("active")
|
||||||
}
|
}
|
||||||
let countCell = document.getElementById("count-" + watchIndex)
|
let countCell = document.getElementById("count-" + watchIndex)
|
||||||
countCell.textContent = countForWatch(watches[watchIndex]) + " Wortmeldungen"
|
countCell.textContent = countForWatch(actualTopic.watches[watchIndex]) + " Wortmeldungen"
|
||||||
}
|
}
|
||||||
|
|
||||||
function refreshClosedTopics() {
|
function refreshClosedTopics() {
|
||||||
|
@ -178,15 +182,20 @@ function refreshClosedTopics() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function saveWatchesToLocalStorage() {
|
function saveActualTopicName() {
|
||||||
localStorage.setItem("watches", JSON.stringify(watches))
|
actualTopic.name = document.getElementById("topicInput").value
|
||||||
|
saveActualTopic()
|
||||||
}
|
}
|
||||||
|
|
||||||
function saveActualTopicToLocalStorage() {
|
|
||||||
localStorage.setItem("actualTopic", document.getElementById("topicInput").value)
|
|
||||||
|
function saveActualTopic() {
|
||||||
|
//save it to LocalStorage
|
||||||
|
localStorage.setItem("actualTopic", JSON.stringify(actualTopic))
|
||||||
}
|
}
|
||||||
|
|
||||||
function saveClosedTopicsToLocalStorage() {
|
function saveClosedTopics() {
|
||||||
|
//save it to LocalStorage
|
||||||
localStorage.setItem("closedTopics", JSON.stringify(closedTopics))
|
localStorage.setItem("closedTopics", JSON.stringify(closedTopics))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -202,4 +211,10 @@ function elt (type, attrs, ...children) {
|
||||||
else node.appendChild(document.createTextNode(child))
|
else node.appendChild(document.createTextNode(child))
|
||||||
}
|
}
|
||||||
return node
|
return node
|
||||||
|
}
|
||||||
|
|
||||||
|
// random.ts
|
||||||
|
function randomId() {
|
||||||
|
const uint32 = window.crypto.getRandomValues(new Uint32Array(1))[0];
|
||||||
|
return uint32.toString(16);
|
||||||
}
|
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,19 @@
|
||||||
|
<?php
|
||||||
|
require $_SERVER['DOCUMENT_ROOT'] . '/spreadSheetReader/SimpleXLSX.php';
|
||||||
|
require $_SERVER['DOCUMENT_ROOT'] . '/spreadSheetReader/SimpleXLSXGen.php';
|
||||||
|
function read_xls_file($filename){
|
||||||
|
$fileContent = [];
|
||||||
|
if ($xlsx = SimpleXLSX::parse($filename)) {
|
||||||
|
$fileContent = ($xlsx->rows());
|
||||||
|
} else {
|
||||||
|
echo SimpleXLSX::parseError();
|
||||||
|
}
|
||||||
|
return $fileContent;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function write_xlsxFile($filename, $data) {
|
||||||
|
$xlsx = SimpleXLSXGen::fromArray($data);
|
||||||
|
$xlsx->saveAs($filename);
|
||||||
|
}
|
Loading…
Reference in New Issue