diff options
author | Freya Murphy <freya@freyacat.org> | 2024-12-23 11:13:27 -0500 |
---|---|---|
committer | Freya Murphy <freya@freyacat.org> | 2024-12-23 11:13:27 -0500 |
commit | 5a2ba9c2e7605bb788bc406184547d22c6436867 (patch) | |
tree | cbd988d534e8a8593a31d70571222443f80da0b3 /src/web/_views/apps | |
parent | fix about modal (diff) | |
download | xssbook2-5a2ba9c2e7605bb788bc406184547d22c6436867.tar.gz xssbook2-5a2ba9c2e7605bb788bc406184547d22c6436867.tar.bz2 xssbook2-5a2ba9c2e7605bb788bc406184547d22c6436867.zip |
v2.1.0, refactor w/ crimson
Diffstat (limited to 'src/web/_views/apps')
-rw-r--r-- | src/web/_views/apps/auth/login.php | 87 | ||||
-rw-r--r-- | src/web/_views/apps/error/main.php | 6 | ||||
-rw-r--r-- | src/web/_views/apps/home/main.php | 27 | ||||
-rw-r--r-- | src/web/_views/apps/people/card.php | 15 | ||||
-rw-r--r-- | src/web/_views/apps/people/footer.php | 3 | ||||
-rw-r--r-- | src/web/_views/apps/people/header.php | 6 | ||||
-rw-r--r-- | src/web/_views/apps/people/main.php | 72 | ||||
-rw-r--r-- | src/web/_views/apps/people/people.php | 7 | ||||
-rw-r--r-- | src/web/_views/apps/profile/main.php | 269 | ||||
-rw-r--r-- | src/web/_views/apps/settings/main.php | 200 |
10 files changed, 0 insertions, 692 deletions
diff --git a/src/web/_views/apps/auth/login.php b/src/web/_views/apps/auth/login.php deleted file mode 100644 index ac4cd02..0000000 --- a/src/web/_views/apps/auth/login.php +++ /dev/null @@ -1,87 +0,0 @@ -<?php /* Copyright (c) 2024 Freya Murphy */ ?> -<?php /* vi: syntax=php */ ?> -<main id="main"> - <div class="branding col"> - <h1>xssbook</h1> - <span><?=ucfirst(lang('login_branding'))?></span> - </div> - <div class="form card col"> - <form id="action-login" class="col" action=""> - <div class="form-input mb"> - <input - type="text" - name="username" - id="login-username" - placeholder=" " - autofocus="true" - > - <label for="username"> - <?=ucfirst(lang('ph_username'))?> - </label> - </div> - <div class="form-input mb"> - <input - type="password" - name="password" - id="login-password" - placeholder=" " - > - <label for="password"> - <?=ucfirst(lang('ph_password'))?> - </label> - </div> - <?=ilang('action_login', - class: 'btn btn-primary btn-alt grow', - button: TRUE, - attrs: array('type' => 'submit') - )?> - <?/*=ilang('action_forgot_passwd', - class: 'btn btn-blend btn-primary grow mt' - )*/?> - </form> - <hr> - <?=ilang('action_create_account', - id: 'action-register', - class: 'btn btn-success btn-alt grow', - button: TRUE, - attrs: array('type' => 'submit') - )?> - </div> - <script> - - const onLogin = function(data) { - let jwt = data.token; - - $.ajax({ - url: '/auth/update', - method: 'POST', - data: JSON.stringify({ - key: 'jwt', - value: jwt - }), - success: function (_) { - window.location = '/home'; - } - }) - }; - - $('#action-login').on('submit', function(e) { - e.preventDefault(); - let username = $('#login-username').val(); - let password = $('#login-password').val(); - - $.ajax({ - url: '/api/rpc/login', - method: 'POST', - data: JSON.stringify({ username, password }), - success: onLogin - }); - }); - - $('#action-register').on('click', function() { - $.get( "/modal/register", function (data) { - $(document.body).append(data); - }); - }) - </script> -</main> diff --git a/src/web/_views/apps/error/main.php b/src/web/_views/apps/error/main.php deleted file mode 100644 index bcc6f90..0000000 --- a/src/web/_views/apps/error/main.php +++ /dev/null @@ -1,6 +0,0 @@ -<?php /* Copyright (c) 2024 Freya Murphy */ ?> -<?php /* vi: syntax=php */ ?> -<main id="main"> - <h1><?=$title?></h1> - <span><?=ucfirst($msg)?></span> -</main> diff --git a/src/web/_views/apps/home/main.php b/src/web/_views/apps/home/main.php deleted file mode 100644 index 864034a..0000000 --- a/src/web/_views/apps/home/main.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php /* Copyright (c) 2024 Freya Murphy */ ?> -<?php /* vi: syntax=php */ ?> -<main id="main"> -<?php if ($self): ?> - <div id="new-post" class="card"> - <div class="row grow"> - <?=pfp($self)?> - <a - id="action-new-post" - class="btn btn-alt grow ml" - autocomplete="off" - aria-label="<?=ucfirst(lang('action_new_post_tip'))?>" - > - <?=ucfirst(lang('action_new_post_text', sub: [$self['first_name']]))?> - </a> - </div> - <script> - $('#action-new-post').on('click', function() { - $.get( "/modal/new_post", function (data) { - $(document.body).append(data); - }); - }) - </script> - </div> -<?php endif; ?> - <?php $this->post_controller->index(); ?> -</main> diff --git a/src/web/_views/apps/people/card.php b/src/web/_views/apps/people/card.php deleted file mode 100644 index 93b1350..0000000 --- a/src/web/_views/apps/people/card.php +++ /dev/null @@ -1,15 +0,0 @@ -<?php /* Copyright (c) 2024 Freya Murphy */ ?> -<?php /* vi: syntax=php */ ?> -<a - class="card profile" - href="/profile?id=<?=$user['id']?>" -> - <div class="col"> - <?=pfp($user, FALSE)?> - <div class="col ml"> - <span class="name"><?=$this->format_model->name($user)?></span> - <span class="subtext"><?=$user['username']?></span> - </div> - </div> -</a> -<? diff --git a/src/web/_views/apps/people/footer.php b/src/web/_views/apps/people/footer.php deleted file mode 100644 index f18e031..0000000 --- a/src/web/_views/apps/people/footer.php +++ /dev/null @@ -1,3 +0,0 @@ -<?php /* Copyright (c) 2024 Freya Murphy */ ?> -<?php /* vi: syntax=php */ ?> -</main> diff --git a/src/web/_views/apps/people/header.php b/src/web/_views/apps/people/header.php deleted file mode 100644 index b1099ec..0000000 --- a/src/web/_views/apps/people/header.php +++ /dev/null @@ -1,6 +0,0 @@ -<?php /* Copyright (c) 2024 Freya Murphy */ ?> -<?php /* vi: syntax=php */ ?> -<main id="main"> - <h1 class="title"><?=ucfirst(lang('title'))?></h1> - <h3 class="desc"><?=ucfirst(lang('desc'))?></h3> - <hr> diff --git a/src/web/_views/apps/people/main.php b/src/web/_views/apps/people/main.php deleted file mode 100644 index ec84ab9..0000000 --- a/src/web/_views/apps/people/main.php +++ /dev/null @@ -1,72 +0,0 @@ -<?php /* Copyright (c) 2024 Freya Murphy */ ?> -<?php /* vi: syntax=php */ ?> -<div id="people-container" class="col"> -<?php - $pdata = $this->people(); -?> -</div> -<?php - $loaded = count($pdata['users']); - $page_size = $pdata['page_size']; - $total = $pdata['count']; - $max = $pdata['max_id']; - $filter_uid = $pdata['filter_uid']; - $filer_type = $pdata['filter_type']; -?> -<?php if ($loaded >= $page_size && $page_size < $total): ?> - <?=ilang('action_load_users', - id: 'action-load-users', - class: 'btn btn-blend grow mb', - attrs: array( - 'loaded' => $loaded, - 'pageSize' => $page_size, - 'userCount' => $total, - 'userMax' => $max, - 'filterUid' => $filter_uid, - 'filterType' => $filer_type - ) - )?> - <script> - - $('#action-load-users').on('click', function() { - let me = $(this); - let page = me.attr('page'); - if (!page) { - page = '1'; - } - let newPage = Number(page) + 1; - me.attr('page', newPage + ''); - - let loaded = Number(me.attr('loaded')); - let pageSize = Number(me.attr('pageSize')); - let userCount = Number(me.attr('userCount')); - let userMax = Number(me.attr('userMax')); - - let filterType = me.attr('filterType'); - let filterUid = me.attr('filterUid'); - - let url = '/people/people?page=' + page + '&max=' + userMax; - - if (filterType && filterUid) { - url += '&filter=' + filterType + '&uid=' + filterUid; - } - - $.get(url, function (data) { - if (data === '') { - me.remove(); - return; - } - - let container = $('#people-container'); - container.append(data); - - loaded += pageSize; - if (loaded >= userCount) { - me.remove(); - } else { - me.attr('loaded', loaded + ''); - } - }); - }); - </script> -<?php endif ?> diff --git a/src/web/_views/apps/people/people.php b/src/web/_views/apps/people/people.php deleted file mode 100644 index 5fc0d17..0000000 --- a/src/web/_views/apps/people/people.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php /* Copyright (c) 2024 Freya Murphy */ ?> -<?php /* vi: syntax=php */ ?> -<?php - foreach($users as $user) { - $this->view('apps/people/card', array('user' => $user)); - } -?> diff --git a/src/web/_views/apps/profile/main.php b/src/web/_views/apps/profile/main.php deleted file mode 100644 index b2ad496..0000000 --- a/src/web/_views/apps/profile/main.php +++ /dev/null @@ -1,269 +0,0 @@ -<?php /* Copyright (c) 2024 Freya Murphy */ ?> -<?php /* vi: syntax=php */ ?> -<main id="main"> - <div id="profile-header-container"> - <div id="profile-header" class="col"> - <?=image('/api/rpc/profile_banner?user_id=' . $user['id'], 'banner', mime: $user['banner_mime'])?> - <div class="info row"> - <div class="pfp-wrapper"> - <?=pfp($user)?> - </div> - <div class="col content grow"> - <div class="row grow"> - <div class="col mb"> - <strong class="name"><?=$this->format_model->name($user)?></strong> - <span class="subtext"><?=$user['follower_count'] . ' ' . ucfirst(lang('followers'))?></span> - </div> - <?php if ( - $this->main->session && - (!isset($self) || $self['id'] != $user['id']) - ): ?> - <div class="follow"> - <?=ilang( - 'action_follow', - id: 'action-follow-follow', - class: 'btn btn-alt', - style: (!$following && !$followed) ? '' : 'display: none', - sub: [$user['first_name']] - )?> - <?=ilang( - 'action_follow_back', - id: 'action-follow-follow-back', - class: 'btn btn-alt', - style: (!$following && $followed) ? '' : 'display: none', - sub: [$user['first_name']] - )?> - <?=ilang( - 'action_following', - id: 'action-follow-following', - class: 'btn btn-alt btn-primary', - style: ($following && !$followed) ? '' : 'display: none', - sub: [$user['first_name']] - )?> - <?=ilang( - 'action_friends', - id: 'action-follow-friends', - class: 'btn btn-alt btn-primary', - style: ($following && $followed) ? '' : 'display: none', - sub: [$user['first_name']] - )?> - </div> - <script> - let following = <?=json_encode($following)?>; - let followed = <?=json_encode($followed)?>; - let followId = <?=json_encode($follow_id)?>; - let followee_id = <?=json_encode($user['id'])?>; - let btns = {}; - - const disableBtn = (btn) => { - btn.css('display', 'none'); - }; - - const enableBtn = (btn) => { - btn.css('display', ''); - }; - - const updateFollow = () => { - for (let btn of Object.values(btns)) { - disableBtn(btn); - } - if (!following && !followed) { - enableBtn(btns['follow']); - } else if (!following && followed) { - enableBtn(btns['follow-back']); - } else if (following && !followed) { - enableBtn(btns['following']); - } else if (following && followed) { - enableBtn(btns['friends']); - } - } - - const onPatchFollow = (data) => { - following = data[0].value; - updateFollow(); - } - - const onPostFollow = (data) => { - followId = data[0].id; - following = true; - updateFollow(); - } - - const onClickFollow = () => { - if (followId) { - $.ajax({ - url: '/api/follow?id=eq.' + followId, - method: 'PATCH', - data: JSON.stringify({ followee_id, value: !following }), - success: onPatchFollow - }); - } else { - $.ajax({ - url: '/api/follow', - method: 'POST', - data: JSON.stringify({ followee_id, value: !following }), - success: onPostFollow, - }); - } - } - - const loadBtn = (name) => { - let btn = $('#action-follow-' + name); - btn.on('click', onClickFollow); - - btns[name] = btn; - }; - - loadBtn('follow'); - loadBtn('follow-back'); - loadBtn('following'); - loadBtn('friends'); - </script> - <?php endif; ?> - </div> - <?php if(strlen($user['profile_bio']) > 0): ?> - <br> - <strong><?=ucfirst(lang('bio'))?></strong> - <span class="subtext"><?=$user['profile_bio']?></span> - <?php endif; ?> - </div> - </div> - <hr> - <div class="row options"> - <?=ilang('action_posts', - sub: [$user['first_name']], - class: 'btn btn-primary btn-border', - id: 'action-posts' - )?> - <?=ilang('action_about', - sub: [$user['first_name']], - class: 'btn', - id: 'action-about' - )?> - <?=ilang('action_followers', - sub: [$user['first_name']], - class: 'btn', - id: 'action-followers' - )?> - <?=ilang('action_following', - sub: [$user['first_name']], - class: 'btn', - id: 'action-following' - )?> - </div> - </div> - </div> - <div id="tab-container" class="mt"> - <div id="tab-posts" class="tab"> - <?php - $_GET['user_id'] = $user['id']; - $this->post_controller->index(); - ?> - </div> - <div id="tab-about" class="tab card"> - <h1><?=ucfirst(lang('about_general'))?></h1> - <table> - <tr> - <td><strong><?=ucfirst(lang('about_general_username'))?></strong></td> - <td><?=$user['username']?></td> - </tr> - <tr> - <td><strong><?=ucfirst(lang('about_general_full_name'))?></strong></td> - <td><?=$user['first_name'] . ' ' . $user['last_name']?></td> - </tr> - <tr> - <td><strong><?=ucfirst(lang('about_general_email'))?></strong></td> - <td><?=$user['email']?></td> - </tr> - <tr> - <td><strong><?=ucfirst(lang('about_general_gender'))?></strong></td> - <td><?=$user['gender']?></td> - </tr> - <tr> - <td><strong><?=ucfirst(lang('about_general_birth_date'))?></strong></td> - <td><?=$this->main->date($user['birth_date'])?></td> - </tr> - </table> - <h1><?=ucfirst(lang('about_stats'))?></h1> - <table> - <tr> - <td><strong><?=ucfirst(lang('about_stats_posts'))?></strong></td> - <td><?=$user['post_count']?></td> - </tr> - <tr> - <td><strong><?=ucfirst(lang('about_stats_like'))?></strong></td> - <td><?=$user['like_count']?></td> - </tr> - <tr> - <td><strong><?=ucfirst(lang('about_stats_comments'))?></strong></td> - <td><?=$user['comment_count']?></td> - </tr> - <tr> - <td><strong><?=ucfirst(lang('about_stats_following'))?></strong></td> - <td><?=$user['followed_count']?></td> - </tr> - <tr> - <td><strong><?=ucfirst(lang('about_stats_joined'))?></strong></td> - <td><?=$this->main->date($user['created'])?></td> - </tr> - <tr> - <td><strong><?=ucfirst(lang('about_stats_seen'))?></strong></td> - <td><?=$this->main->date($user['seen'])?></td> - </tr> - </table> - </div> - <div id="tab-followers" class="tab"> - <?php - $_GET['filter'] = 'follower'; - $_GET['uid'] = $user['id']; - $this->people_controller->content(); - ?> - </div> - <div id="tab-following" class="tab"> - <?php - $_GET['filter'] = 'followee'; - $_GET['uid'] = $user['id']; - $this->people_controller->content(); - ?> - </div> - </div> - <script> - let tabs = {}; - - const disableTab = (tab) => { - tab.btn.removeClass('btn-primary'); - tab.btn.removeClass('btn-border'); - tab.tab.css('display', 'none'); - }; - - const enableTab = (tab) => { - tab.btn.addClass('btn-primary'); - tab.btn.addClass('btn-border'); - tab.tab.css('display', ''); - }; - - const loadTab = (name, disable = true) => { - let btn = $('#action-' + name); - btn.on('click', function() { - for (let tab of Object.values(tabs)) { - disableTab(tab); - } - enableTab(tabs[name]); - }); - - tabs[name] = { - 'btn': btn, - 'tab': $('#tab-' + name) - }; - - if (disable) { - disableTab(tabs[name]); - } - }; - - loadTab('posts', false); - loadTab('about'); - loadTab('followers'); - loadTab('following'); - </script> -</main> diff --git a/src/web/_views/apps/settings/main.php b/src/web/_views/apps/settings/main.php deleted file mode 100644 index 2033acc..0000000 --- a/src/web/_views/apps/settings/main.php +++ /dev/null @@ -1,200 +0,0 @@ -<?php /* Copyright (c) 2024 Freya Murphy */ ?> -<?php /* vi: syntax=php */ ?> - -<?php - -$user = $this->main->user(); - -function __create_form($user, $col) { - $ph = ucfirst(lang('ph_' . $col)); - $val = $user[$col]; - return "<form action=\"\" class=\"row mt settings-form\" onsubmit=\"handleSubmit(event)\"> - <div class=\"form-input mb\" style=\"flex: 1\"> - <input - type=\"text\" - name=\"{$col}\" - id=\"{$col}\" - placeholder=\" \" - value=\"{$val}\" - > - <label for=\"{$col}\"> - {$ph} - </label> - </div> - <input type=\"hidden\" name=\"col\" value=\"{$col}\"> - <input type=\"hidden\" name=\"uid\" value=\"{$user['id']}\"> - <button - class=\"btn btn-submit ml\" - style=\"flex: 0; height: fit-content;\" - ><i class=\"mi\">check</i></button> - </form>"; -} - -?> - -<script> - -function onSuccess() { - successToast(<?=json_encode(ucfirst(lang('settings_success')))?>); -} - -function handleSubmit(e) { - e.preventDefault(); - let el = e.target.elements; - let col = el.col.value; - let uid = el.uid.value; - let val = el[col].value; - - $.ajax({ - url: '/api/user?id=eq.' + uid, - method: 'PATCH', - data: JSON.stringify({ [col]: val }), - success: onSuccess - }); - -} - -function handlePassword(e) { - e.preventDefault(); - let el = e.target.elements; - let curr = el.curr_password.value; - let newp = el.new_password.value; - - $.ajax({ - url: '/api/rpc/update_password', - method: 'POST', - data: JSON.stringify({ - new_password: newp, - current_password: curr - }), - success: onSuccess - }) -} - -const toBase64 = file => new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.readAsDataURL(file); - reader.onload = () => resolve(reader.result); - reader.onerror = reject; -}); - -function updateMedia(media_type) { - - var input = document.createElement('input'); - input.type = 'file'; - - input.onchange = async (e) => { - var file = e.target.files[0]; - var data = (await toBase64(file)).split(";"); - var mime = data[0].split(":")[1]; - var content = data[1].split(",")[1]; - - $.ajax({ - url: '/api/rpc/update_user_media', - method: 'POST', - data: JSON.stringify({ - media_type, mime, content - }), - success: onSuccess - }); - - } - - input.click(); - -} - -function resetMedia(media_type) { - $.ajax({ - url: '/api/rpc/delete_user_media', - method: 'POST', - data: JSON.stringify({ - media_type - }), - success: onSuccess - }); -} -</script> - -<main id="main"> - <div id="settings" class="card"> - <h1><?=ucfirst(lang('title'))?></h1> - <hr class="mt"> - <h2><?=ucfirst(lang('general_title'))?></h2> - <strong><?=ucfirst(lang('general_desc'))?></strong> - <?=__create_form($user, 'username')?> - <?=__create_form($user, 'email')?> - <?=__create_form($user, 'first_name')?> - <?=__create_form($user, 'last_name')?> - <?=__create_form($user, 'gender')?> - <?=__create_form($user, 'profile_bio')?> - <hr class="mt"> - <h2><?=ucfirst(lang('security_title'))?></h2> - <strong><?=ucfirst(lang('security_desc'))?></strong> - <form action="" class="col mt settings-form" onsubmit="handlePassword(event)"> - <div class="form-input mb" style="flex: 1"> - <input - type="password" - name="curr_password" - id="curr_password" - placeholder=" " - > - <label for="curr_password"> - <?=ucwords(lang('ph_current_pass'))?> - </label> - </div> - <div class="form-input mb" style="flex: 1"> - <input - type="password" - name="new_password" - id="new_password" - placeholder=" " - > - <label for="new_password"> - <?=ucwords(lang('ph_new_pass'))?> - </label> - </div> - <button - class="btn grow btn-alt btn-submit" - style="flex: 0; height: fit-content;" - ><?=lang('update')?></button> - </form> - <hr class="mt"> - <h2><?=ucfirst(lang('media_title'))?></h2> - <strong><?=ucfirst(lang('media_desc'))?></strong> - <h3><?=ucfirst(lang('ph_avatar'))?></h3> - <div class="row"> - <?=image( - "/api/rpc/profile_avatar?user_id={$user['id']}", - height: '100px' - )?> - <div class="col ml"> - <button - class="btn btn-alt btn-primary" - onclick="updateMedia('avatar')" - ><?=ucfirst(lang('update'))?></button> - <button - class="btn btn-alt btn-primary mt" - onclick="resetMedia('avatar')" - ><?=ucfirst(lang('reset'))?></button> - </div> - </div> - <h3><?=ucfirst(lang('ph_banner'))?></h3> - <div class="row"> - <?=image( - "/api/rpc/profile_banner?user_id={$user['id']}", - height: '100px' - )?> - <div class="col ml"> - <button - class="btn btn-alt btn-primary" - onclick="updateMedia('banner')" - ><?=ucfirst(lang('update'))?></button> - <button - class="btn btn-alt btn-primary mt" - onclick="resetMedia('banner')" - ><?=ucfirst(lang('reset'))?></button> - </div> - </div> - </div> -</main> |