Fájlbetöltés kész, stíluslap elkezve
This commit is contained in:
parent
0203cc0dd6
commit
e1823c9aec
24
index.php
Normal file
24
index.php
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
?>
|
||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="hu">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8"/>
|
||||||
|
<title>MKK Közivezető-választás</title>
|
||||||
|
<script src="js/req.js"></script>
|
||||||
|
<script src="js/mkkkvv.js"></script>
|
||||||
|
<link rel="stylesheet" href="mkkkvv.css"/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<section id="mainbox">
|
||||||
|
<input oninput="search_in_names(this.value)" type="text" placeholder="Ki legyen a Közivezető? :)" id="nameinput">
|
||||||
|
<section id="hintzone">
|
||||||
|
<section id="hintbox">
|
||||||
|
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
</body>
|
||||||
|
</html>
|
92
interface.php
Normal file
92
interface.php
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
<?php
|
||||||
|
define("DUPLICATE_NAME_IN_SAME_GROUP", true);
|
||||||
|
|
||||||
|
// kiolvassa a választható emberek listáját
|
||||||
|
function read_electable_people(string $fname): array
|
||||||
|
{
|
||||||
|
$s = file_get_contents($fname);
|
||||||
|
|
||||||
|
// szétszedés csoportnév-csoporttag sorozatra
|
||||||
|
$group_name_seq = preg_split("/(\*\*)|(__)/", trim($s), -1, PREG_SPLIT_NO_EMPTY);
|
||||||
|
|
||||||
|
// csoportok feldolgozása egyenként
|
||||||
|
$ep = [];
|
||||||
|
for ($i = 0; $i < count($group_name_seq); $i += 2) {
|
||||||
|
$group = trim($group_name_seq[$i]); // csoport kiolvasása
|
||||||
|
$names = preg_split("/(\n)|(\r\n)/", trim($group_name_seq[$i + 1]), -1, PREG_SPLIT_NO_EMPTY); // nevek a csoportból
|
||||||
|
|
||||||
|
foreach ($names as $name) {
|
||||||
|
if (trim($name) === "") { // üres sorokat átugorja
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$new_rec = ["name" => $name, "group" => $group];
|
||||||
|
if (DUPLICATE_NAME_IN_SAME_GROUP || !in_array($new_rec, $ep)) {
|
||||||
|
$ep[] = $new_rec;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return $ep;
|
||||||
|
}
|
||||||
|
|
||||||
|
define("MINIMUM_NEEDLE_LENGTH", 3);
|
||||||
|
|
||||||
|
// keresés a nevek között
|
||||||
|
function search_in_names(array $records, string $needle): array
|
||||||
|
{
|
||||||
|
$needle = trim($needle);
|
||||||
|
|
||||||
|
if (strlen($needle) < MINIMUM_NEEDLE_LENGTH) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$hitpos_array = [];
|
||||||
|
|
||||||
|
$filter = function(array $var) use (&$hitpos_array, $needle) : bool {
|
||||||
|
$hitpos = stripos($var["name"], $needle);
|
||||||
|
|
||||||
|
if ($hitpos != false) {
|
||||||
|
$hitpos_array[] = $hitpos;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $hitpos !== false;
|
||||||
|
};
|
||||||
|
|
||||||
|
$filter_res = array_values(array_filter($records, $filter));
|
||||||
|
|
||||||
|
if (count($filter_res) > 0) {
|
||||||
|
for ($i = 0; $i < count($filter_res); $i++) {
|
||||||
|
$filter_res[$i]["hitpos"] = $hitpos_array[$i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $filter_res;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --------------------------------
|
||||||
|
|
||||||
|
define("ELECTABLE_PEOPLE_DATABASE", "data/electable_people_test.md");
|
||||||
|
|
||||||
|
$action = json_decode($_POST["action"]) ?? "none";
|
||||||
|
|
||||||
|
$res = "";
|
||||||
|
|
||||||
|
switch ($action) {
|
||||||
|
case "search":
|
||||||
|
{
|
||||||
|
$needle = json_decode($_POST["needle"]);
|
||||||
|
$p = read_electable_people(ELECTABLE_PEOPLE_DATABASE);
|
||||||
|
$hits = search_in_names($p, $needle);
|
||||||
|
$res = $hits;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "none":
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
echo json_encode($res);
|
||||||
|
|
||||||
|
//$p = read_electable_people("data/electable_people_test.md");
|
||||||
|
|
||||||
|
return;
|
63
js/mkkkvv.js
Normal file
63
js/mkkkvv.js
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
const MINIMUM_NEEDLE_LENGTH = 3;
|
||||||
|
const CANVAS = document.create
|
||||||
|
|
||||||
|
|
||||||
|
// keresés indítása a nevek között
|
||||||
|
function search_in_names(needle) {
|
||||||
|
let hintbox = document.getElementById("hintbox");
|
||||||
|
|
||||||
|
if (needle.length < 3) {
|
||||||
|
hintbox.innerHTML = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needle.trim().length < MINIMUM_NEEDLE_LENGTH) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
request({
|
||||||
|
action: "search",
|
||||||
|
needle: needle
|
||||||
|
}).then(resp => {
|
||||||
|
hintbox.innerHTML = "";
|
||||||
|
let hits = JSON.parse(resp);
|
||||||
|
console.log(hits);
|
||||||
|
hits.forEach((key, val) => {
|
||||||
|
if (needle.length < 3) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let hit = document.createElement("span");
|
||||||
|
hit.classList.add("hit");
|
||||||
|
|
||||||
|
let name_node = document.createElement("span");
|
||||||
|
name_node.classList.add("name");
|
||||||
|
|
||||||
|
let hp = key["hitpos"];
|
||||||
|
let name = key["name"];
|
||||||
|
|
||||||
|
if (hp > 0) {
|
||||||
|
let name_begin = name.slice(0, hp);
|
||||||
|
name_node.appendChild(document.createTextNode(name_begin));
|
||||||
|
}
|
||||||
|
|
||||||
|
let hl = document.createElement("span");
|
||||||
|
hl.classList.add("highlight");
|
||||||
|
hl.innerText = name.slice(hp, hp + needle.length);
|
||||||
|
name_node.appendChild(hl);
|
||||||
|
|
||||||
|
if (hp + needle.length < name.length) {
|
||||||
|
let name_end = name.slice(hp + needle.length, name.length);
|
||||||
|
name_node.appendChild(document.createTextNode(name_end));
|
||||||
|
}
|
||||||
|
|
||||||
|
hit.appendChild(name_node);
|
||||||
|
|
||||||
|
let group = document.createElement("span");
|
||||||
|
group.innerText = `(${key["group"]})`;
|
||||||
|
group.classList.add("group");
|
||||||
|
hit.appendChild(group);
|
||||||
|
|
||||||
|
hintbox.appendChild(hit);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
31
js/req.js
Normal file
31
js/req.js
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
// kérés indítása a szerver felé (eredeti: KL.)
|
||||||
|
function request(data, url = "interface.php", method = "POST") {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
var fd;
|
||||||
|
|
||||||
|
// ha van adat megadva...
|
||||||
|
if (data != null) {
|
||||||
|
fd = new FormData();
|
||||||
|
|
||||||
|
// mezők hozzáfűzése a kéréshez
|
||||||
|
for (let prop in data) {
|
||||||
|
if (Object.prototype.hasOwnProperty.call(data, prop)) {
|
||||||
|
fd.append(prop, JSON.stringify(data[prop]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// kérés feladása
|
||||||
|
fetch(url, {
|
||||||
|
method: method,
|
||||||
|
body: fd,
|
||||||
|
})
|
||||||
|
.then(response => response.text())
|
||||||
|
.then(data => resolve(data))
|
||||||
|
.catch((error) => {
|
||||||
|
console.error('Error: ', error);
|
||||||
|
reject(error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
@ -1,6 +0,0 @@
|
|||||||
<?php
|
|
||||||
// kiolvassa a választható emberek listáját
|
|
||||||
function read_electable_people(string $fname) : array {
|
|
||||||
|
|
||||||
return [];
|
|
||||||
}
|
|
54
mkkkvv.css
Normal file
54
mkkkvv.css
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
@import url('https://fonts.googleapis.com/css2?family=Faustina&display=swap');
|
||||||
|
|
||||||
|
body{
|
||||||
|
--C_PRIMARY: #f89a17;
|
||||||
|
--C_SEC: #44968e;
|
||||||
|
--C_TER: #2a5999;
|
||||||
|
--C_TRIADIC1: #85ea11;
|
||||||
|
--C_TRIADIC2: #11ea76;
|
||||||
|
--C_BG1: #c0ccdf;
|
||||||
|
--C_BG2: #e3ecf3;
|
||||||
|
|
||||||
|
font-family: 'Faustina', serif;
|
||||||
|
|
||||||
|
--MAINBOX_WIDTH: 30em;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="text"] {
|
||||||
|
font-family: 'Faustina', serif;
|
||||||
|
font-size: 32px;
|
||||||
|
border-color: #2a5999;
|
||||||
|
border-width: 0 0 0.1em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type="text"]:focus {
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
input#nameinput {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
section#hintbox {
|
||||||
|
background-color: var(--C_BG2);
|
||||||
|
margin: 0.2em 0.5em;
|
||||||
|
color: var(--C_TER);
|
||||||
|
font-size: 24px;
|
||||||
|
padding: 0.5em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.hit {
|
||||||
|
display: block;
|
||||||
|
position: static;
|
||||||
|
padding: 0.2em 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.highlight {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
section#mainbox {
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
width: min(var(--MAINBOX_WIDTH), calc(100vw - 1em));
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user