summaryrefslogtreecommitdiff
path: root/src/web/_views/apps
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2024-12-23 11:13:27 -0500
committerFreya Murphy <freya@freyacat.org>2024-12-23 11:13:27 -0500
commit5a2ba9c2e7605bb788bc406184547d22c6436867 (patch)
treecbd988d534e8a8593a31d70571222443f80da0b3 /src/web/_views/apps
parentfix about modal (diff)
downloadxssbook2-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.php87
-rw-r--r--src/web/_views/apps/error/main.php6
-rw-r--r--src/web/_views/apps/home/main.php27
-rw-r--r--src/web/_views/apps/people/card.php15
-rw-r--r--src/web/_views/apps/people/footer.php3
-rw-r--r--src/web/_views/apps/people/header.php6
-rw-r--r--src/web/_views/apps/people/main.php72
-rw-r--r--src/web/_views/apps/people/people.php7
-rw-r--r--src/web/_views/apps/profile/main.php269
-rw-r--r--src/web/_views/apps/settings/main.php200
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>