From f19d95b2d7dfeb9b89a190def89a7facf6e7bde0 Mon Sep 17 00:00:00 2001 From: flashwave Date: Tue, 27 Mar 2018 05:15:03 +0200 Subject: [PATCH] Management beginnings. --- assets/less/manage/classes/container.less | 4 + assets/less/manage/classes/footer.less | 13 ++ assets/less/manage/classes/header.less | 126 +++++++++++++++++++ assets/less/manage/classes/listing.less | 20 +++ assets/less/manage/classes/user-listing.less | 10 ++ assets/less/manage/main.less | 25 ++++ public/auth.php | 4 +- public/manage.php | 52 ++++++++ public/settings.php | 9 +- src/Application.php | 1 + src/Model.php | 1 + utility.php | 18 +++ views/manage/forums.twig | 1 + views/manage/macros.twig | 38 ++++++ views/manage/master.twig | 55 ++++++++ views/manage/notfound.twig | 7 ++ views/manage/overview.twig | 1 + views/manage/roles.twig | 1 + views/manage/users.twig | 19 +++ views/mio/master.twig | 14 ++- 20 files changed, 404 insertions(+), 15 deletions(-) create mode 100644 assets/less/manage/classes/container.less create mode 100644 assets/less/manage/classes/footer.less create mode 100644 assets/less/manage/classes/header.less create mode 100644 assets/less/manage/classes/listing.less create mode 100644 assets/less/manage/classes/user-listing.less create mode 100644 assets/less/manage/main.less create mode 100644 public/manage.php create mode 100644 views/manage/forums.twig create mode 100644 views/manage/macros.twig create mode 100644 views/manage/master.twig create mode 100644 views/manage/notfound.twig create mode 100644 views/manage/overview.twig create mode 100644 views/manage/roles.twig create mode 100644 views/manage/users.twig diff --git a/assets/less/manage/classes/container.less b/assets/less/manage/classes/container.less new file mode 100644 index 00000000..f3ed90e9 --- /dev/null +++ b/assets/less/manage/classes/container.less @@ -0,0 +1,4 @@ +.container { + max-width: 1200px; + margin: 2px auto; +} diff --git a/assets/less/manage/classes/footer.less b/assets/less/manage/classes/footer.less new file mode 100644 index 00000000..6118e8e2 --- /dev/null +++ b/assets/less/manage/classes/footer.less @@ -0,0 +1,13 @@ +.footer { + text-align: center; + padding: 1em; + + &__link { + text-decoration: none; + color: inherit; + + &:hover { + text-decoration: underline; + } + } +} diff --git a/assets/less/manage/classes/header.less b/assets/less/manage/classes/header.less new file mode 100644 index 00000000..e0ca5b90 --- /dev/null +++ b/assets/less/manage/classes/header.less @@ -0,0 +1,126 @@ +.header { + background-color: #111; + background-image: linear-gradient(0deg, #222, #333); + font-size: 1.5em; + + &__wrapper { + display: flex; + max-width: 1200px; + margin: 0 auto; + } + + &__logo, + &__link { + padding: 8px 10px; + color: #fff; + text-decoration: none; + display: block; + } + + &__navigation { + display: flex; + } + + &__navigation { + flex-grow: 1; + flex-shrink: 1; + } + + &__logo { + flex-grow: 0; + flex-shrink: 0; + } + + &__link { + cursor: pointer; + transition: background-color .2s; + + &:hover { + background-color: #333; + } + + &--active, + &:active { + background-color: #222; + } + } + + &__user { + flex-grow: 0; + flex-shrink: 1; + + &__toggle { + background-size: contain; + background-repeat: no-repeat; + background-position: right; + padding-right: 45px; + min-width: 100px; + transition: background-color .2s, min-width .2s; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + + &__state { + display: none; + + &:checked ~ .header__user__toggle { + background-color: #333; + min-width: 150px; + } + + &:checked ~ .header__user__menu { + max-height: 250px; + } + } + + &__menu { + overflow: hidden; + text-align: right; + max-height: 0px; + width: 100%; + position: absolute; + background-color: #333; + z-index: 1000; + transition: max-height .2s; + box-shadow: 0 5px 5px 0 fade(#444, 80%); + } + + &__link { + padding: 8px 10px; + display: block; + color: inherit; + text-decoration: none; + transition: background-color .2s; + + &:hover { + background-color: #444; + } + + &:active { + background-color: #2a2a2a; + } + } + + &__section { + margin: 1px 2px; + + &:first-child { + margin-top: 2px; + } + + &:last-child { + margin-bottom: 2px; + } + + &:not(:last-child) { + padding-bottom: 1px; + margin-bottom: 1px; + border-bottom: 1px solid #444; + } + } + } +} diff --git a/assets/less/manage/classes/listing.less b/assets/less/manage/classes/listing.less new file mode 100644 index 00000000..bf53791f --- /dev/null +++ b/assets/less/manage/classes/listing.less @@ -0,0 +1,20 @@ +.listing { + display: flex; + flex-direction: column; + + &__entry { + border-right: 4px solid #a00; + padding-right: 1px; + display: block; + + &:not(:last-child) { + margin-bottom: 2px; + } + + &__content { + width: 100%; + background-color: #333; + min-height: 50px; + } + } +} diff --git a/assets/less/manage/classes/user-listing.less b/assets/less/manage/classes/user-listing.less new file mode 100644 index 00000000..75684a44 --- /dev/null +++ b/assets/less/manage/classes/user-listing.less @@ -0,0 +1,10 @@ +.user-listing { + flex-direction: row; + flex-wrap: wrap; + justify-content: center; + + &__entry { + min-width: 296px; + margin: 2px; + } +} diff --git a/assets/less/manage/main.less b/assets/less/manage/main.less new file mode 100644 index 00000000..44025b15 --- /dev/null +++ b/assets/less/manage/main.less @@ -0,0 +1,25 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; + position: relative; +} + +html, +body { + width: 100%; + height: 100%; +} + +.manage { + background-color: #222; + font: 12px/20px 'Open Sans', sans-serif; + color: #fff; +} + +@import "classes/container"; +@import "classes/footer"; +@import "classes/header"; +@import "classes/listing"; + +@import "classes/user-listing"; diff --git a/public/auth.php b/public/auth.php index 18ee0e58..fdc53cf6 100644 --- a/public/auth.php +++ b/public/auth.php @@ -51,7 +51,7 @@ switch ($mode) { return; } - echo $app->templating->render('logout'); + echo $app->templating->render('@auth.logout'); break; case 'login': @@ -175,6 +175,6 @@ switch ($mode) { $app->templating->var('auth_register_error', $auth_register_error); } - echo $app->templating->render('auth'); + echo $app->templating->render('@auth.auth'); break; } diff --git a/public/manage.php b/public/manage.php new file mode 100644 index 00000000..e7f3126d --- /dev/null +++ b/public/manage.php @@ -0,0 +1,52 @@ +getSession(); + +if ($manage_session === null) { + header('Location: /'); + return; +} + +$app->templating->addPath('manage', __DIR__ . '/../views/manage'); + +$manage_user = $manage_session->user; +$manage_modes = [ + 'overview' => [ + 'title' => 'Overview', + ], + 'forums' => [ + 'title' => 'Forums', + ], + 'users' => [ + 'title' => 'Users', + ], + 'roles' => [ + 'title' => 'Roles', + ], +]; +$manage_mode = $_GET['m'] ?? key($manage_modes); + +$app->templating->vars(compact('manage_mode', 'manage_modes', 'manage_user', 'manage_session')); + +if (!array_key_exists($manage_mode, $manage_modes)) { + http_response_code(404); + $app->templating->var('manage_title', 'Not Found'); + echo $app->templating->render('@manage.notfound'); + return; +} + +$app->templating->var('title', $manage_modes[$manage_mode]['title']); + +switch ($manage_mode) { + case 'users': + $users_page = (int)($_GET['p'] ?? 1); + $manage_users = User::paginate(32, ['*'], 'p', $users_page); + $app->templating->vars(compact('manage_users', 'users_page')); + break; +} + +echo $app->templating->render("@manage.{$manage_mode}"); diff --git a/public/settings.php b/public/settings.php index 897e3a32..a1d5788a 100644 --- a/public/settings.php +++ b/public/settings.php @@ -71,25 +71,20 @@ $settings_profile_fields = [ $settings_user = $settings_session->user; -$settings_mode = $_GET['m'] ?? null; $settings_modes = [ 'account' => 'Account', 'avatar' => 'Avatar', 'sessions' => 'Sessions', 'login-history' => 'Login History', ]; - -// if no mode is explicitly set just go to the index -if ($settings_mode === null) { - $settings_mode = key($settings_modes); -} +$settings_mode = $_GET['m'] ?? key($settings_modes); $app->templating->vars(compact('settings_mode', 'settings_modes', 'settings_user', 'settings_session')); if (!array_key_exists($settings_mode, $settings_modes)) { http_response_code(404); $app->templating->var('settings_title', 'Not Found'); - echo $app->templating->render("settings.notfound"); + echo $app->templating->render('settings.notfound'); return; } diff --git a/src/Application.php b/src/Application.php index d99570d6..32fe0f03 100644 --- a/src/Application.php +++ b/src/Application.php @@ -164,6 +164,7 @@ class Application extends ApplicationBase $twig->addFilter('byte_symbol'); $twig->addFilter('country_name', 'get_country_name'); $twig->addFilter('flip', 'array_flip'); + $twig->addFilter('create_pagination'); // avoid using config() in templates whenever possible // in all honesty this shouldn't even be a thing diff --git a/src/Model.php b/src/Model.php index 0ab74fbc..e20332e6 100644 --- a/src/Model.php +++ b/src/Model.php @@ -1,6 +1,7 @@ deconstructImages(); } +function create_pagination($paginator) +{ + $window = \Illuminate\Pagination\UrlWindow::make($paginator); + + $pagination = array_map( + function ($str) { + return substr($str, 2); + }, + array_merge( + $window['first'] ?? [], + $window['slider'] ?? [], + $window['last'] ?? [] + ) + ); + + return $pagination; +} + function is_int_ex($value, int $boundary_low, int $boundary_high): bool { return is_int($value) && $value >= $boundary_low && $value <= $boundary_high; diff --git a/views/manage/forums.twig b/views/manage/forums.twig new file mode 100644 index 00000000..b796b165 --- /dev/null +++ b/views/manage/forums.twig @@ -0,0 +1 @@ +{% extends '@manage/master.twig' %} diff --git a/views/manage/macros.twig b/views/manage/macros.twig new file mode 100644 index 00000000..8db014cc --- /dev/null +++ b/views/manage/macros.twig @@ -0,0 +1,38 @@ +{% macro link(url, content, class) %} +{% spaceless %} +{{ content|raw }} +{% endspaceless %} +{% endmacro %} + +{% macro pagination(url, pages, current, class, name) %} + {% set pagess = pages|create_pagination %} + {% set separator %}{% if '%3F' in url|default('')|url_encode %}&{% else %}?{% endif %}{% endset %} + {% set current_page = current|default(1) %} + {% set url = url ~ separator ~ name|default('page') ~ "=" %} + + +{% endmacro %} diff --git a/views/manage/master.twig b/views/manage/master.twig new file mode 100644 index 00000000..cda32d67 --- /dev/null +++ b/views/manage/master.twig @@ -0,0 +1,55 @@ +{% from '@manage/macros.twig' import link %} + + + + + + Flashii Broom Closet + + + + +
+ + + {% block content %} +
+

This page has no content.

+
+ {% endblock %} + +
+ {{ link('https://flash.moe', 'flash.moe', 'footer__link') }} 2013-{{ + ''|date('Y') }} / + {{ link('https://github.com/flashwave/misuzu/tree/' ~ git_branch(), git_branch(), 'footer__link') }} # {{ link('https://github.com/flashwave/misuzu/commit/' ~ git_hash(true), git_hash(), 'footer__link') }} +
+
+ + diff --git a/views/manage/notfound.twig b/views/manage/notfound.twig new file mode 100644 index 00000000..4c0fae0d --- /dev/null +++ b/views/manage/notfound.twig @@ -0,0 +1,7 @@ +{% extends '@manage/master.twig' %} + +{% block content %} +
+

Could not find what you were looking for.

+
+{% endblock %} diff --git a/views/manage/overview.twig b/views/manage/overview.twig new file mode 100644 index 00000000..b796b165 --- /dev/null +++ b/views/manage/overview.twig @@ -0,0 +1 @@ +{% extends '@manage/master.twig' %} diff --git a/views/manage/roles.twig b/views/manage/roles.twig new file mode 100644 index 00000000..b796b165 --- /dev/null +++ b/views/manage/roles.twig @@ -0,0 +1 @@ +{% extends '@manage/master.twig' %} diff --git a/views/manage/users.twig b/views/manage/users.twig new file mode 100644 index 00000000..f07d55f3 --- /dev/null +++ b/views/manage/users.twig @@ -0,0 +1,19 @@ +{% extends '@manage/master.twig' %} +{% from '@manage/macros.twig' import pagination %} + +{% block content %} +
+ {% for user in manage_users %} + + {% endfor %} +
+ + {{ pagination('?m=users', manage_users, users_page, null, 'p') }} +{% endblock %} diff --git a/views/mio/master.twig b/views/mio/master.twig index c151379e..37dd8bb7 100644 --- a/views/mio/master.twig +++ b/views/mio/master.twig @@ -13,26 +13,28 @@ {% include '@mio/_layout/meta.twig' %} - +
-
+ {% block content %}
@@ -55,7 +57,7 @@ {{ navigation(mio_navigation) }} {% endblock %} - +