Added be page and also add netlify api minification

Signed-off-by: Ari Archer <ari.web.xyz@gmail.com>
This commit is contained in:
Ari Archer 2022-09-02 18:14:05 +03:00
parent ab4aebdd82
commit eea543fe09
6 changed files with 362 additions and 1 deletions

View file

@ -10,5 +10,6 @@ clean:
.github \ .github \
netlify: build clean netlify: build clean
./scripts/netlifyapis.sh
.PHONY: build clean netlify .PHONY: build clean netlify

View file

@ -44,7 +44,8 @@
"Additional notes": { "Additional notes": {
"placeholder": "Additional things you have tried to do", "placeholder": "Additional things you have tried to do",
"id": "additional", "id": "additional",
"optional": true "optional": true,
"textbox": true
} }
} }
} }

195
content/js/be/index.js Normal file
View file

@ -0,0 +1,195 @@
"use strict";
const FORM_CHECKERS = {
android: (e, edata) => {
let data = Object.fromEntries(new FormData(e.target).entries());
console.log(data);
console.log(edata);
function no_has_gh(str) {
return str.indexOf(data["gh-username"]) !== -1;
}
if (!/^[0-9a-zA-Z]+$/.test(data["gh-username"]))
alert("Invalid github username");
else if (
edata["disallowed-android-versions"].includes(
data["and-version"].toLowerCase()
)
)
alert("Disallowed android version");
else if (data["ctree-url"])
if (no_has_gh(data["ctree-url"]))
alert(
"You have not provided any (valid) url from common trees"
);
else if (no_has_gh(data["dev-url"])) alert("No valid device url");
else if (data["err-url"].indexOf("pastebin.com") !== -1)
alert("Pastebin is not allowed");
else if (no_has_gh(data["kern-url"]))
alert("No valid kernel tree given");
else if (data["rom-url"].indexOf("github") === -1)
alert("No github url provided for the rom");
else if (no_has_gh(data["ven-url"]))
alert("No valid vendor url specified");
else return true;
return false;
},
};
function append_children(parent, ...children) {
for (let child of children) parent.appendChild(child);
}
function submit_btn() {
let submit = document.createElement("button");
submit.innerText = "Submit";
submit.id = "submit-button";
return submit;
}
function to_clipboard(text) {
if (window.clipboardData && window.clipboardData.setData) {
return window.clipboardData.setData("Text", text);
} else if (
document.queryCommandSupported &&
document.queryCommandSupported("copy")
) {
var textarea = document.createElement("textarea");
textarea.textContent = text;
textarea.style.position = "fixed";
document.body.appendChild(textarea);
textarea.select();
try {
return document.execCommand("copy");
} catch (ex) {
console.warn("Copy to clipboard failed.", ex);
return prompt("Copy to clipboard: Ctrl+C, Enter", text);
} finally {
document.body.removeChild(textarea);
}
}
}
function render_type(type, data) {
if (type.startsWith("%") || !(type in data)) {
document.body.innerHTML = "<h1>Not a valid type, not rendering</h1>";
setTimeout(() => (document.location = "."), 1000);
return;
}
document.body.innerHTML =
"<h1>Rendering form... (if this takes too long please see the dev console)</h1>";
let form = document.createElement("form");
form.id = "form";
for (let [key, value] of Object.entries(data[type])) {
let label = document.createElement("label");
label.innerText = key;
label.setAttribute("for", value.id);
let input = document.createElement(
value.textbox ? "textarea" : "input"
);
input.id = input.name = value.id;
input.placeholder = input.title = value.placeholder;
input.required = !value.optional;
append_children(form, input, label, document.createElement("br"));
}
form.appendChild(submit_btn());
document.body.innerHTML = "";
let title = document.createElement("h1");
title.innerText = `Error report form: ${type}`;
document.body.innerHTML = `${title.outerHTML}${form.outerHTML}`;
document.getElementById("form").addEventListener("submit", (e) => {
e.preventDefault();
let is_good = true;
if (type in FORM_CHECKERS)
is_good = FORM_CHECKERS[type](e, data[`%${type}`]);
if (is_good) {
let text = `Error submission form: ${type}
From: ${document.location}
`;
for (let [key, value] of new FormData(e.target).entries()) {
if (!value) continue;
text += `${
document.querySelector(`label[for="${key}"]`).innerText
}: ${value}\n`;
}
document.body.innerText = text;
document.body.onclick = () => {
to_clipboard(document.body.innerText);
alert("Copied to clipboard");
};
}
return false;
});
}
function render_full(data) {
document.body.innerHTML = "<h1>Pick a type (no `t` GET param found)</h1>";
let label = document.createElement("label");
label.setAttribute("for", "types");
label.innerText = "Pick the error report type:";
let select = document.createElement("select");
select.name = "types";
select.id = "types";
let submit = submit_btn();
submit.onclick = () => {
let val = select.value;
if (!val) alert("Not a valid type :(");
render_type(val, data);
};
for (let key in data) {
if (key.startsWith("%")) continue;
let option = document.createElement("option");
option.value = key;
option.innerText = key;
select.appendChild(option);
}
append_children(document.body, label, select, submit);
}
function main() {
let type = new URL(document.location).searchParams.get("t");
fetch("/api/errtemplate.json")
.then((response) => {
return response.json();
})
.then((data) => {
if (type) render_type(type, data);
else render_full(data);
})
.catch((err) => {
alert(`Error, please report it to ${document.domain}/git: ${err}`);
});
}
document.addEventListener("DOMContentLoaded", main);

View file

@ -0,0 +1,85 @@
*,
*::before,
*::after {
background-color: #181818;
color: whitesmoke;
font-family: sans-serif;
}
body {
max-width: 1200px;
margin: auto;
padding: 4em;
}
h1,
h2 {
margin-bottom: 0.7em;
text-align: center;
}
#types {
margin-left: 1em;
}
#types,
label[for="types"] {
font-weight: bold;
margin-top: 2em;
}
#submit-button {
display: block;
margin: 1em;
width: 20%;
border: none;
padding: 0.5em;
background-color: rgba(0, 0, 0, 0.3);
transition: background-color 0.4s ease-in-out;
}
#submit-button:focus,
#submit-button:hover {
cursor: pointer;
background-color: rgba(0, 0, 0, 0.8);
transition: background-color 0.4s ease-in-out;
}
label {
margin-left: 1em;
}
form * {
margin-bottom: 0.5em;
}
textarea {
resize: none;
height: 10em;
}
textarea,
input {
padding: 0.3em;
width: 60%;
}
@media screen and (max-width: 800px) {
form * {
display: block;
width: 100%;
}
label::after {
content: "^";
}
body {
padding: 2em;
}
#submit-button {
width: 100%;
margin: 0;
}
}

67
page/be/index.html Normal file
View file

@ -0,0 +1,67 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Ari::web -&gt; Be</title>
<meta name="description" content="Error submission forms for ABOT" />
<meta
name="keywords"
content="ari, ari-web, form, page-form, android, linux, google, be, build error, building, error"
/>
<meta
name="robots"
content="follow, index, max-snippet:-1, max-video-preview:-1, max-image-preview:large"
/>
<meta property="og:type" content="website" />
<meta name="color-scheme" content="dark" />
<meta name="theme-color" content="#181818" />
<link rel="manifest" href="/manifest.json" />
<link rel="stylesheet" href="/content/styles/clean/index.css" />
<link rel="stylesheet" href="/content/styles/be/index.css" />
<script type="text/javascript">
<!--//--><![CDATA[//><!--
/**
* @licstart The following is the entire license notice for the JavaScript
* code in this page.
*
* Copyright (C) 2022 Ari Archer
*
* The JavaScript code in this page is free software: you can redistribute
* it and/or modify it under the terms of the GNU General Public License
* (GNU GPL) as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version. The code is
* distributed WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU GPL
* for more details.
*
* As additional permission under GNU GPL version 3 section 7, you may
* distribute non-source (e.g., minimized or compacted) forms of that code
* without the copy of the GNU GPL normally required by section 4, provided
* you include this license notice and a URL through which recipients can
* access the Corresponding Source.
*
* @licend The above is the entire license notice for the JavaScript code
* in this page.
*/
//--><!]]>
</script>
<script src="/content/js/be/index.js" defer></script>
</head>
<body>
<h1>Please stand by while I'm fetching the required data...</h1>
<h2>
If this takes too long please check the dev tools using CTRL + SHIFT
+ I and opening the console
</h2>
</body>
</html>

12
scripts/netlifyapis.sh Executable file
View file

@ -0,0 +1,12 @@
#!/usr/bin/env sh
set -e
main() {
for api in api/*; do
api_cont="$(sed 's/^\s*//g; s/: /:/g' "$api" | tr -d '\n')"
printf '%s' "$api_cont" >"$api"
done
}
main "$@"