from flask_socketio import SocketIO, emit
import os
+from director.database.read import read as database_read
+
app = Flask(__name__, instance_relative_config=False)
socketio = SocketIO(app, logger=True, engineio_logger=True)
def index():
return render_template("index.html")
+@app.route("/admin", methods=['get'])
+def admin():
+ indexes, current = database_read()
+ return render_template("admin.html", indexes=indexes, current=current)
+
@app.route("/script/<path:filename>", methods=["get"])
def script(filename):
return send_from_directory(os.path.join(app.root_path, "build"), filename)
@app.route("/test")
def test():
+ return [database_read()]
#emit("update", ["data__product", {"data":{"product":{"currentPrice":100}}}], json=True, namespace="/", broadcast=True)
return ""
--- /dev/null
+"""
+ package to read and write to the database
+
+ check if file exists and pragam check the database on init
+"""
+
+from .utils import integrity_check
+import sqlite3
+import os
+
+assert os.path.exists("./data/main.db"), "Database missing"
+assert integrity_check(), "Database integrity error"
--- /dev/null
+import sqlite3
+
+from .utils import list_tables
+
+def read():
+ tables = list_tables()
+
+ with sqlite3.connect("./data/main.db") as connection:
+ cursor = connection.cursor()
+
+ data = {}
+ for table in tables:
+ cursor.execute(f"SELECT * FROM {table};")
+
+ names = list(map(lambda x: x[0], cursor.description))
+ rows = [dict(zip(names, row)) for row in cursor.fetchall()]
+
+ if table == "indexes":
+ indexes = rows[0]
+ else:
+ data.update({table: rows})
+
+ return indexes, data
--- /dev/null
+import sqlite3
+
+def integrity_check():
+ """
+ check the database is ok and return true if it is
+ """
+ with sqlite3.connect("./data/main.db") as connection:
+ cursor = connection.cursor()
+ integrity = cursor.execute('PRAGMA integrity_check')
+
+ return integrity.fetchone()[0] == "ok"
+
+def list_tables():
+ """
+ get a list of all the tables in the database
+ """
+ with sqlite3.connect("./data/main.db") as connection:
+ cursor = connection.cursor()
+ cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
+ return [table[0] for table in cursor.fetchall()]
--- /dev/null
+interface Body {
+ [index: string]: number;
+}
+
+export function setupTrigger() {
+ // setup all trigger buttons to send post request on click
+ const el: HTMLCollectionOf<Element> =
+ document.getElementsByClassName("trigger");
+
+ for (let e of el) {
+ e.addEventListener("click", (event) => {
+ let time: number = Math.round(Date.now() / 1000);
+ let body: Body = {};
+
+ if (event.target instanceof Element) {
+ body[`${event.target.getAttribute('name')}`] = time;
+
+ fetch(".", {
+ method: "POST",
+ body: JSON.stringify(body)
+ });
+ }
+ })
+ }
+}
#}
<html>
+ <head>
+ <script type="module" defer>
+
+import { setupTrigger } from "/script/admin.js";
+setupTrigger();
+
+ </script>
+ </head>
<body>
- <form>
- {% include "admin/list.html" %}
- <form>
+ {% for table in current %}
+ <details>
+ <summary>{{ table }}</summary>
+ <form>
+ {% for row in current[table] %}
+
+ {# CREATE RADIO BUTTON FOR ROW #}
+
+ {% if loop.index0 == indexes["int--" ~ table] %}
+ <input type="radio" name="{{ "indexes~~int--" ~ table }}" value="{{ loop.index0 }}" checked="checked" >
+ {% else %}
+ <input type="radio" name="{{ "indexes~~int--" ~ table }}" value="{{ loop.index0 }}" >
+ {% endif %}
+
+
+ {# CREATE FEILDS #}
+
+ <div style="display: inline-block; vertical-align: middle; border: 1px solid gray;">
+ {% for feild in row %}
+
+ {# SELECT ELEMENT FROM TYPE #}
+
+ {% set type, label = feild.split('--') %}
+ {% set value = row[feild] %}
+ {% set name = table ~ "~~" ~ feild %}
+
+ {% if type == "textarea" %}
+ {% include "admin/textarea.html" %}
+ {% elif type == "text" %}
+ {% include "admin/text.html" %}
+ {% elif type == "number" %}
+ {% include "admin/number.html" %}
+ {% elif type == "float" %}
+ {% include "admin/float.html" %}
+ {% elif type == "trigger" %}
+ {% include "admin/trigger.html" %}
+ {% endif %}
+
+ <br>
+ {% endfor %}
+ </div><br>
+
+ {% endfor %}
+ </form>
+ </details>
+ {% endfor %}
</body>
</html>
--- /dev/null
+<label>{{ label }}</label><br>
+<input type="number" name="{{ name }}" value="{{ value }}" step="0.01" />
+++ /dev/null
-{#
-
- interates through the state variable and includes the relevant template for
- each element. not tested more than double nested
-
-#}
-{% for element in state %}
- {% if element.tag == "textarea" %}
- {% include "admin/textarea.html" %}
- {% elif element.tag == "select" %}
- {% include "admin/select.html" %}
- {% elif element.tag == "text" %}
- {% include "admin/text.html" %}
- {% elif element.tag == "number" %}
- {% include "admin/number.html" %}
- {% endif %}
- <br>
-{% endfor %}
-<label>{{ element.name }}</label><br>
-<input type="number" name="{{ element.name }}" value="{{ element.text }}" />
+<label>{{ label }}</label><br>
+<input type="number" name="{{ name }}" value="{{ value }}" />
+++ /dev/null
-<details>
- <summary>{{ element.name }}</summary>
- <input type="radio" name="{{ element.name }}" value="soup" checked />
- <div style="display: inline-block; vertical-align: middle;">
- {% block list %}
- {% set state = element.elements %}
- {% include "admin/list.html" %}
- {% endblock %}
- </div>
-</details>
-<label>{{ element.name }}</label><br>
-<input type="text" name="{{ element.name }}" value="{{ element.text }}" />
+<label>{{ label }}</label><br>
+<input type="text" name="{{ name }}" value="{{ value }}" />
-<label>{{ element.name }}</label><br>
-<textarea name="{{ element.name }}">
- {{- element.default -}}
+<label>{{ label }}</label><br>
+<textarea name="{{ name }}">
+ {{- value -}}
</textarea>
--- /dev/null
+<noscript style="color: red;">Trigger will not function without JS</noscript><br>
+<button type="button" name="{{ name }}" value="{{ label }}" class="trigger">
+ {{ label }}
+</button>