Build out new table generator
This commit is contained in:
parent
aca8bcc3fe
commit
2074a09663
|
@ -1,5 +1,6 @@
|
||||||
:root {
|
:root {
|
||||||
--font-size: 16px;
|
--font-size: 16px;
|
||||||
|
--font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
* {
|
* {
|
||||||
|
@ -10,7 +11,7 @@
|
||||||
|
|
||||||
html {
|
html {
|
||||||
font-size: var(--font-size);
|
font-size: var(--font-size);
|
||||||
font-family: sans-serif;
|
font-family: var(--font-family);
|
||||||
}
|
}
|
||||||
|
|
||||||
body {
|
body {
|
||||||
|
@ -49,6 +50,37 @@ main > section {
|
||||||
|
|
||||||
table {
|
table {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
border-collapse: collapse;
|
||||||
|
outline-width: none;
|
||||||
|
font-family: var(--font-family);
|
||||||
|
border: 1px solid rgba(0, 0, 0, 0.1);
|
||||||
|
|
||||||
|
& > caption {
|
||||||
|
margin: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
& :is(td,th) {
|
||||||
|
border: 1px solid rgba(0, 0, 0, 0.4);
|
||||||
|
padding: 0.5rem 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
& thead tr {
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
& tbody tr:nth-of-type(even) {
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
&:hover { background: rgba(0, 0, 0, 0.2); }
|
||||||
|
}
|
||||||
|
|
||||||
|
td:hover {
|
||||||
|
color: white;
|
||||||
|
background: rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
tr:hover {
|
||||||
|
background: rgba(0, 0, 0, 0.2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
|
|
|
@ -5,10 +5,11 @@
|
||||||
namespace Admin;
|
namespace Admin;
|
||||||
|
|
||||||
use Router;
|
use Router;
|
||||||
|
use SQLite3Result;
|
||||||
|
|
||||||
function register_routes(Router $r): Router
|
function register_routes(Router $r): Router
|
||||||
{
|
{
|
||||||
if (user()->authlevel === 1) {
|
if (user() !== false && user()->authlevel === 1) {
|
||||||
$r->get('/admin', 'Admin\donothing');
|
$r->get('/admin', 'Admin\donothing');
|
||||||
|
|
||||||
$r->form('/admin/main', 'Admin\primary');
|
$r->form('/admin/main', 'Admin\primary');
|
||||||
|
@ -111,21 +112,9 @@ function primary(): string
|
||||||
*/
|
*/
|
||||||
function items(): string
|
function items(): string
|
||||||
{
|
{
|
||||||
$items = db()->query('SELECT id, name FROM items ORDER BY id;');
|
$items = db()->query('SELECT * FROM items ORDER BY id;');
|
||||||
$page = "<h2>Edit Items</h2>Click an item's name to edit it.<br><br><table>\n";
|
$page = "<h2>Edit Items</h2>Click an item's name or ID to edit it.<br><br><table>\n";
|
||||||
|
$page .= build_bulk_table($items, 'name', '/admin/items');
|
||||||
$hasItems = false;
|
|
||||||
while ($row = $items->fetchArray(SQLITE3_BOTH)) {
|
|
||||||
$hasItems = true;
|
|
||||||
$page .= <<<HTML
|
|
||||||
<tr>
|
|
||||||
<td width="8%" style="background-color: #eeeeee;">{$row["id"]}</td>
|
|
||||||
<td style="background-color: #eeeeee;"><a href="/admin/items/{$row['id']}" hx-get="/admin/items/{$row['id']}" hx-target="#main">{$row["name"]}</a></td>
|
|
||||||
</tr>
|
|
||||||
HTML;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$hasItems) $page .= "<tr><td width=\"8%\" style=\"background-color: #eeeeee;\">No items found.</td></tr>\n";
|
|
||||||
|
|
||||||
page_title('Admin: Items');
|
page_title('Admin: Items');
|
||||||
return \Render\content($page . '</table>', 'layouts/admin');
|
return \Render\content($page . '</table>', 'layouts/admin');
|
||||||
|
@ -174,21 +163,9 @@ function edit_item(int $id): string
|
||||||
*/
|
*/
|
||||||
function drops()
|
function drops()
|
||||||
{
|
{
|
||||||
|
$drops = db()->query('SELECT * FROM drops ORDER BY id;');
|
||||||
$page = "<h2>Edit Drops</h2>Click an item's name to edit it.<br><br><table>\n";
|
$page = "<h2>Edit Drops</h2>Click an item's name to edit it.<br><br><table>\n";
|
||||||
|
$page .= build_bulk_table($drops, 'name', '/admin/drops');
|
||||||
$drops = db()->query('SELECT id, name FROM drops ORDER BY id;');
|
|
||||||
$has_drops = false;
|
|
||||||
while ($row = $drops->fetchArray(SQLITE3_ASSOC)) {
|
|
||||||
$has_drops = true;
|
|
||||||
$page .= <<<HTML
|
|
||||||
<tr>
|
|
||||||
<td width="8%" style="background-color: #eeeeee;">{$row["id"]}</td>
|
|
||||||
<td style="background-color: #eeeeee;"><a href="/admin/drops/{$row['id']}" hx-get="/admin/drops/{$row['id']}" hx-target="#main">{$row["name"]}</a></td>
|
|
||||||
</tr>
|
|
||||||
HTML;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!$has_drops) { $page .= "<tr><td width=\"8%\" style=\"background-color: #eeeeee;\">No drops found.</td></tr>\n"; }
|
|
||||||
|
|
||||||
page_title('Admin: Drops');
|
page_title('Admin: Drops');
|
||||||
return \Render\content($page . '</table>', 'layouts/admin');
|
return \Render\content($page . '</table>', 'layouts/admin');
|
||||||
|
@ -870,3 +847,41 @@ function addnews()
|
||||||
|
|
||||||
display_admin($page, "Add News");
|
display_admin($page, "Add News");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build an HTML table containing all columns and rows of a given data structure. Takes a SQLiteResult3 of a SELECT *
|
||||||
|
* query.
|
||||||
|
*/
|
||||||
|
function build_bulk_table(SQLite3Result $query_data, string $edit_column, string $edit_link): string
|
||||||
|
{
|
||||||
|
$data = [];
|
||||||
|
while ($row = $query_data->fetchArray(SQLITE3_ASSOC)) $data[] = $row;
|
||||||
|
if (empty($data)) return 'No data.';
|
||||||
|
|
||||||
|
$columns = array_diff(array_keys($data[0]), ['password']); // Filter columns inline
|
||||||
|
$html = '<table><colgroup>';
|
||||||
|
foreach ($columns as $_) $html .= '<col>';
|
||||||
|
$html .= '</colgroup><thead><tr>';
|
||||||
|
foreach ($columns as $column) {
|
||||||
|
if ($column === 'id') $column = 'ID';
|
||||||
|
$html .= '<th>' . make_safe(ucfirst($column)) . '</th>';
|
||||||
|
}
|
||||||
|
$html .= '</tr></thead><tbody>';
|
||||||
|
|
||||||
|
foreach ($data as $row) {
|
||||||
|
$html .= '<tr>';
|
||||||
|
foreach ($columns as $column) {
|
||||||
|
$name = make_safe($row[$column]);
|
||||||
|
if (in_array($column, ['id', $edit_column])) {
|
||||||
|
$html .= <<<HTML
|
||||||
|
<td><a href="{$edit_link}/{$row['id']}" hx-get="{$edit_link}/{$row['id']}" hx-target="#main">{$name}</a></td>
|
||||||
|
HTML;
|
||||||
|
} else {
|
||||||
|
$html .= "<td>$name</td>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$html .= '</tr>';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $html . '</tbody></table>';
|
||||||
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@ function register_routes(Router $r): Router
|
||||||
*/
|
*/
|
||||||
function first()
|
function first()
|
||||||
{
|
{
|
||||||
echo <<<HTML
|
return <<<HTML
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>Dragon Knight Installation</title>
|
<title>Dragon Knight Installation</title>
|
||||||
|
@ -43,7 +43,7 @@ function second()
|
||||||
{
|
{
|
||||||
if (file_exists('../database.db')) unlink('../database.db');
|
if (file_exists('../database.db')) unlink('../database.db');
|
||||||
|
|
||||||
echo "<html><head><title>Dragon Knight Installation</title></head><body><b>Dragon Knight Installation: Page Two</b><br><br>";
|
$page = "<html><head><title>Dragon Knight Installation</title></head><body><b>Dragon Knight Installation: Page Two</b><br><br>";
|
||||||
|
|
||||||
$query = db()->exec(<<<SQL
|
$query = db()->exec(<<<SQL
|
||||||
CREATE TABLE babble (
|
CREATE TABLE babble (
|
||||||
|
@ -54,7 +54,7 @@ function second()
|
||||||
);
|
);
|
||||||
SQL);
|
SQL);
|
||||||
|
|
||||||
echo table_status_msg($query === true, 'Babble', 'create');
|
$page .= table_status_msg($query === true, 'Babble', 'create');
|
||||||
|
|
||||||
$query = db()->exec(<<<SQL
|
$query = db()->exec(<<<SQL
|
||||||
CREATE TABLE drops (
|
CREATE TABLE drops (
|
||||||
|
@ -67,7 +67,7 @@ function second()
|
||||||
);
|
);
|
||||||
SQL);
|
SQL);
|
||||||
|
|
||||||
echo table_status_msg($query === true, 'Drops', 'create');
|
$page .= table_status_msg($query === true, 'Drops', 'create');
|
||||||
|
|
||||||
$query = db()->exec(<<<SQL
|
$query = db()->exec(<<<SQL
|
||||||
INSERT INTO drops VALUES
|
INSERT INTO drops VALUES
|
||||||
|
@ -105,7 +105,7 @@ function second()
|
||||||
(32, 'Fortune Drop', 5, 1, 'goldbonus,10', 'X');
|
(32, 'Fortune Drop', 5, 1, 'goldbonus,10', 'X');
|
||||||
SQL);
|
SQL);
|
||||||
|
|
||||||
echo table_status_msg($query === true, 'Drops', 'populate');
|
$page .= table_status_msg($query === true, 'Drops', 'populate');
|
||||||
|
|
||||||
$query = db()->exec(<<<SQL
|
$query = db()->exec(<<<SQL
|
||||||
CREATE TABLE forum (
|
CREATE TABLE forum (
|
||||||
|
@ -120,7 +120,7 @@ function second()
|
||||||
);
|
);
|
||||||
SQL);
|
SQL);
|
||||||
|
|
||||||
echo table_status_msg($query === true, 'Forum', 'create');
|
$page .= table_status_msg($query === true, 'Forum', 'create');
|
||||||
|
|
||||||
$query = db()->exec(<<<SQL
|
$query = db()->exec(<<<SQL
|
||||||
CREATE TABLE items (
|
CREATE TABLE items (
|
||||||
|
@ -133,7 +133,7 @@ function second()
|
||||||
);
|
);
|
||||||
SQL);
|
SQL);
|
||||||
|
|
||||||
echo table_status_msg($query === true, 'Items', 'create');
|
$page .= table_status_msg($query === true, 'Items', 'create');
|
||||||
|
|
||||||
$query = db()->exec(<<<SQL
|
$query = db()->exec(<<<SQL
|
||||||
INSERT INTO items VALUES
|
INSERT INTO items VALUES
|
||||||
|
@ -172,7 +172,7 @@ function second()
|
||||||
(33, 3, 'Destiny Aegis', 25000, 100, 'maxhp,50');
|
(33, 3, 'Destiny Aegis', 25000, 100, 'maxhp,50');
|
||||||
SQL);
|
SQL);
|
||||||
|
|
||||||
echo table_status_msg($query === true, 'Drops', 'populate');
|
$page .= table_status_msg($query === true, 'Drops', 'populate');
|
||||||
|
|
||||||
$query = db()->exec(<<<SQL
|
$query = db()->exec(<<<SQL
|
||||||
CREATE TABLE levels (
|
CREATE TABLE levels (
|
||||||
|
@ -201,7 +201,7 @@ function second()
|
||||||
);
|
);
|
||||||
SQL);
|
SQL);
|
||||||
|
|
||||||
echo table_status_msg($query === true, 'Levels', 'create');
|
$page .= table_status_msg($query === true, 'Levels', 'create');
|
||||||
|
|
||||||
$query = db()->exec(<<<SQL
|
$query = db()->exec(<<<SQL
|
||||||
INSERT INTO levels VALUES
|
INSERT INTO levels VALUES
|
||||||
|
@ -307,7 +307,7 @@ function second()
|
||||||
(100, 16777215, 0, 0, 0, 0, 0, 0, 16777215, 0, 0, 0, 0, 0, 0, 16777215, 0, 0, 0, 0, 0, 0);
|
(100, 16777215, 0, 0, 0, 0, 0, 0, 16777215, 0, 0, 0, 0, 0, 0, 16777215, 0, 0, 0, 0, 0, 0);
|
||||||
SQL);
|
SQL);
|
||||||
|
|
||||||
echo table_status_msg($query === true, 'Levels', 'populate');
|
$page .= table_status_msg($query === true, 'Levels', 'populate');
|
||||||
|
|
||||||
$query = db()->exec(<<<SQL
|
$query = db()->exec(<<<SQL
|
||||||
CREATE TABLE monsters (
|
CREATE TABLE monsters (
|
||||||
|
@ -323,7 +323,7 @@ function second()
|
||||||
);
|
);
|
||||||
SQL);
|
SQL);
|
||||||
|
|
||||||
echo table_status_msg($query === true, 'Monsters', 'create');
|
$page .= table_status_msg($query === true, 'Monsters', 'create');
|
||||||
|
|
||||||
$query = db()->exec(<<<SQL
|
$query = db()->exec(<<<SQL
|
||||||
INSERT INTO monsters VALUES
|
INSERT INTO monsters VALUES
|
||||||
|
@ -480,7 +480,7 @@ function second()
|
||||||
(151, 'Lucifuge', 600, 600, 400, 50, 10000, 10000, 2);
|
(151, 'Lucifuge', 600, 600, 400, 50, 10000, 10000, 2);
|
||||||
SQL);
|
SQL);
|
||||||
|
|
||||||
echo table_status_msg($query === true, 'Monsters', 'populate');
|
$page .= table_status_msg($query === true, 'Monsters', 'populate');
|
||||||
|
|
||||||
$query = db()->exec(<<<SQL
|
$query = db()->exec(<<<SQL
|
||||||
CREATE TABLE news (
|
CREATE TABLE news (
|
||||||
|
@ -491,11 +491,11 @@ function second()
|
||||||
);
|
);
|
||||||
SQL);
|
SQL);
|
||||||
|
|
||||||
echo table_status_msg($query === true, 'News', 'create');
|
$page .= table_status_msg($query === true, 'News', 'create');
|
||||||
|
|
||||||
$query = db()->exec("INSERT INTO news (content) VALUES ('This is the first news post. Please use the admin control panel to add another one and make this one go away.');");
|
$query = db()->exec("INSERT INTO news (content) VALUES ('This is the first news post. Please use the admin control panel to add another one and make this one go away.');");
|
||||||
|
|
||||||
echo table_status_msg($query === true, 'News', 'populate');
|
$page .= table_status_msg($query === true, 'News', 'populate');
|
||||||
|
|
||||||
$query = db()->exec(<<<SQL
|
$query = db()->exec(<<<SQL
|
||||||
CREATE TABLE spells (
|
CREATE TABLE spells (
|
||||||
|
@ -507,7 +507,7 @@ function second()
|
||||||
);
|
);
|
||||||
SQL);
|
SQL);
|
||||||
|
|
||||||
echo table_status_msg($query === true, 'Spells', 'create');
|
$page .= table_status_msg($query === true, 'Spells', 'create');
|
||||||
|
|
||||||
$query = db()->exec(<<<SQL
|
$query = db()->exec(<<<SQL
|
||||||
INSERT INTO spells VALUES
|
INSERT INTO spells VALUES
|
||||||
|
@ -532,7 +532,7 @@ function second()
|
||||||
(19, 'Barrier', 30, 50, 5);
|
(19, 'Barrier', 30, 50, 5);
|
||||||
SQL);
|
SQL);
|
||||||
|
|
||||||
echo table_status_msg($query === true, 'Spells', 'populate');
|
$page .= table_status_msg($query === true, 'Spells', 'populate');
|
||||||
|
|
||||||
$query = db()->exec(<<<SQL
|
$query = db()->exec(<<<SQL
|
||||||
CREATE TABLE towns (
|
CREATE TABLE towns (
|
||||||
|
@ -547,7 +547,7 @@ function second()
|
||||||
);
|
);
|
||||||
SQL);
|
SQL);
|
||||||
|
|
||||||
echo table_status_msg($query === true, 'Towns', 'create');
|
$page .= table_status_msg($query === true, 'Towns', 'create');
|
||||||
|
|
||||||
$query = db()->exec(<<<SQL
|
$query = db()->exec(<<<SQL
|
||||||
INSERT INTO towns VALUES
|
INSERT INTO towns VALUES
|
||||||
|
@ -561,7 +561,7 @@ function second()
|
||||||
(8, 'Endworld', -250, -250, 125, 9000, 160, '16,27,33');
|
(8, 'Endworld', -250, -250, 125, 9000, 160, '16,27,33');
|
||||||
SQL);
|
SQL);
|
||||||
|
|
||||||
echo table_status_msg($query === true, 'Towns', 'populate');
|
$page .= table_status_msg($query === true, 'Towns', 'populate');
|
||||||
|
|
||||||
$query = db()->exec(<<<SQL
|
$query = db()->exec(<<<SQL
|
||||||
CREATE TABLE users (
|
CREATE TABLE users (
|
||||||
|
@ -618,10 +618,10 @@ function second()
|
||||||
);
|
);
|
||||||
SQL);
|
SQL);
|
||||||
|
|
||||||
echo table_status_msg($query === true, 'Users', 'create');
|
$page .= table_status_msg($query === true, 'Users', 'create');
|
||||||
|
|
||||||
$time = round((microtime(true) - START), 4);
|
$time = round((microtime(true) - START), 4);
|
||||||
echo "<br>Database setup complete in $time seconds.<br><br><a href=\"/install/third\">Click here to continue with installation.</a></body></html>";
|
return $page . "<br>Database setup complete in $time seconds.<br><br><a href=\"/install/third\">Click here to continue with installation.</a></body></html>";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -629,7 +629,7 @@ function second()
|
||||||
*/
|
*/
|
||||||
function third()
|
function third()
|
||||||
{
|
{
|
||||||
echo <<<HTML
|
return <<<HTML
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>Dragon Knight Installation</title>
|
<title>Dragon Knight Installation</title>
|
||||||
|
@ -678,7 +678,7 @@ function fourth()
|
||||||
|
|
||||||
file_put_contents('../.installed', date('Y-m-d H:i:s'));
|
file_put_contents('../.installed', date('Y-m-d H:i:s'));
|
||||||
|
|
||||||
echo <<<HTML
|
return <<<HTML
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>Dragon Knight Installation</title>
|
<title>Dragon Knight Installation</title>
|
||||||
|
@ -708,7 +708,7 @@ function fifth()
|
||||||
exit('Dragon Knight was unable to send your URL. Please go back and try again, or just continue on to <a href=\"/\">the game</a>.');
|
exit('Dragon Knight was unable to send your URL. Please go back and try again, or just continue on to <a href=\"/\">the game</a>.');
|
||||||
}
|
}
|
||||||
|
|
||||||
echo <<<HTML
|
return <<<HTML
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>Dragon Knight Installation</title>
|
<title>Dragon Knight Installation</title>
|
||||||
|
|
|
@ -26,8 +26,7 @@ function login()
|
||||||
if (is_post()) {
|
if (is_post()) {
|
||||||
$form = validate($_POST, [
|
$form = validate($_POST, [
|
||||||
'username' => ['length:3-18', 'alpha-spaces'],
|
'username' => ['length:3-18', 'alpha-spaces'],
|
||||||
'password' => ['length:6-255'],
|
'password' => ['length:6-255']
|
||||||
'remember' => ['bool']
|
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if (!$form['valid']) exit(ul_from_validate_errors($form['errors']));
|
if (!$form['valid']) exit(ul_from_validate_errors($form['errors']));
|
||||||
|
|
|
@ -23,11 +23,18 @@ $uri = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
|
||||||
$GLOBALS['cache'] = [];
|
$GLOBALS['cache'] = [];
|
||||||
$GLOBALS['state'] = [];
|
$GLOBALS['state'] = [];
|
||||||
|
|
||||||
if (!file_exists('../.installed') && $uri[0] !== 'install') {
|
/**
|
||||||
|
* These are table names whose data we want to be able to edit in the admin panel in bulk.
|
||||||
|
*/
|
||||||
|
define('ADMIN_BULK_DATA_STRUCTS', [
|
||||||
|
'users', 'items', 'drops', 'towns', 'monsters', 'levels', 'spells'
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (!file_exists('../.installed') && $uri[0] !== 'install') { // need to install the game
|
||||||
redirect('/install');
|
redirect('/install');
|
||||||
} elseif (file_exists(('../.installed')) && $uri[0] === 'install') {
|
} elseif (file_exists(('../.installed')) && $uri[0] === 'install') { // game is installed, go play!
|
||||||
redirect('/');
|
redirect('/');
|
||||||
} elseif (file_exists(('../.installed')) && $uri[0] !== 'install') {
|
} elseif (file_exists(('../.installed')) && $uri[0] !== 'install') { // boostrap the game
|
||||||
if (!env('game_open')) {
|
if (!env('game_open')) {
|
||||||
echo Render\content('The game is currently closed for maintanence. Please check back later.');
|
echo Render\content('The game is currently closed for maintanence. Please check back later.');
|
||||||
exit;
|
exit;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user