diff options
Diffstat (limited to 'src/web')
-rw-r--r-- | src/web/_controller/_util/post.php | 18 | ||||
-rw-r--r-- | src/web/_controller/apps/profile.php | 35 | ||||
-rw-r--r-- | src/web/_model/apps/auth.php | 2 | ||||
-rw-r--r-- | src/web/_model/apps/error.php | 2 | ||||
-rw-r--r-- | src/web/_model/apps/home.php | 2 | ||||
-rw-r--r-- | src/web/_model/apps/people.php | 2 | ||||
-rw-r--r-- | src/web/_model/apps/profile.php | 37 | ||||
-rw-r--r-- | src/web/_views/apps/auth/login.php | 8 | ||||
-rw-r--r-- | src/web/_views/apps/people/main.php | 20 | ||||
-rw-r--r-- | src/web/_views/apps/profile/main.php | 37 | ||||
-rw-r--r-- | src/web/_views/header.php | 2 | ||||
-rw-r--r-- | src/web/_views/modal/new_post.php | 12 | ||||
-rw-r--r-- | src/web/_views/modal/register.php | 31 | ||||
-rw-r--r-- | src/web/_views/template/posts.php | 4 | ||||
-rw-r--r-- | src/web/config/aesthetic.php | 10 | ||||
-rw-r--r-- | src/web/config/routes.php | 1 | ||||
-rw-r--r-- | src/web/core/_model.php | 2 | ||||
-rw-r--r-- | src/web/helper/lang.php | 2 | ||||
-rw-r--r-- | src/web/lang/en_US/apps/profile.php | 18 |
19 files changed, 201 insertions, 44 deletions
diff --git a/src/web/_controller/_util/post.php b/src/web/_controller/_util/post.php index b48816d..4da2671 100644 --- a/src/web/_controller/_util/post.php +++ b/src/web/_controller/_util/post.php @@ -61,6 +61,7 @@ class Post_controller extends Controller { $page = $this->request_model->get_int('page', 0); $max = $this->request_model->get_int('max'); $offset = $page * $this->page_size; + $filter_uid = $this->request_model->get_int('user_id', FALSE); $user = $this->main->user(); $uid = isset($user) ? $user['id'] : NULL; @@ -78,6 +79,11 @@ class Post_controller extends Controller { ->where('p.id')->le($max); } + if ($uid) { + $query = $query + ->where('p.user_id')->eq($uid); + } + $posts = $query ->order_by('p.id', 'DESC') ->limit($this->page_size) @@ -96,9 +102,16 @@ class Post_controller extends Controller { $this->view('template/post', $data); } - $pc = $this->db + $query = $this->db ->select('COUNT(p.id) as pc') - ->from('api.post p') + ->from('api.post p'); + + if ($uid) { + $query = $query + ->where('p.user_id')->eq($uid); + } + + $pc = $query ->row()['pc']; return array( @@ -106,6 +119,7 @@ class Post_controller extends Controller { 'total' => $pc, 'page_size' => $this->page_size, 'max' => $max, + 'filter_uid' => $filter_uid ); } diff --git a/src/web/_controller/apps/profile.php b/src/web/_controller/apps/profile.php new file mode 100644 index 0000000..aaed348 --- /dev/null +++ b/src/web/_controller/apps/profile.php @@ -0,0 +1,35 @@ +<?php /* Copyright (c) 2024 Freya Murphy */ +class Profile_controller extends Controller { + + // the home model + private $profile_model; + + // the format model + protected $format_model; + + // the post model + protected $post_controller; + + function __construct($load) { + parent::__construct($load); + $this->profile_model = $this->load->model('apps/profile'); + $this->format_model = $this->load->model('format'); + $this->post_controller = $this->load->controller('_util/post'); + } + + public function index(): void { + parent::index(); + $data = $this->profile_model->get_data(); + + if (!$data) { + $this->error(404); + } + + $this->view('header', $data); + $this->view('apps/profile/main', $data); + $this->view('footer', $data); + } + +} + +?> diff --git a/src/web/_model/apps/auth.php b/src/web/_model/apps/auth.php index a1802de..8a359d5 100644 --- a/src/web/_model/apps/auth.php +++ b/src/web/_model/apps/auth.php @@ -5,7 +5,7 @@ class Auth_model extends Model { parent::__construct($load); } - public function get_data(): array { + public function get_data(): ?array { $data = parent::get_data(); $data['title'] = lang('login'); return $data; diff --git a/src/web/_model/apps/error.php b/src/web/_model/apps/error.php index 58e3346..4118c62 100644 --- a/src/web/_model/apps/error.php +++ b/src/web/_model/apps/error.php @@ -22,7 +22,7 @@ class Error_model extends Model { } } - public function get_data(): array { + public function get_data(): ?array { $data = parent::get_data(); $this->get_msg($data); return $data; diff --git a/src/web/_model/apps/home.php b/src/web/_model/apps/home.php index 82fbf26..caa254f 100644 --- a/src/web/_model/apps/home.php +++ b/src/web/_model/apps/home.php @@ -13,7 +13,7 @@ class Home_model extends Model { ->rows(); } - public function get_data(): array { + public function get_data(): ?array { $data = parent::get_data(); $data['title'] = lang('title'); $data['posts'] = $this->get_posts(); diff --git a/src/web/_model/apps/people.php b/src/web/_model/apps/people.php index 4b6bab4..1bb110f 100644 --- a/src/web/_model/apps/people.php +++ b/src/web/_model/apps/people.php @@ -80,7 +80,7 @@ class People_model extends Model { ); } - public function get_data(): array { + public function get_data(): ?array { $data = parent::get_data(); $data['title'] = lang('title'); return $data; diff --git a/src/web/_model/apps/profile.php b/src/web/_model/apps/profile.php new file mode 100644 index 0000000..592fbcb --- /dev/null +++ b/src/web/_model/apps/profile.php @@ -0,0 +1,37 @@ +<?php /* Copyright (c) 2024 Freya Murphy */ +class Profile_model extends Model { + + private $request_model; + + function __construct($load) { + parent::__construct($load); + $this->request_model = $this->load->model('request'); + } + + public function get_data(): ?array { + $uid = $this->request_model->get_int('id', FALSE); + if ($uid === FALSE) { + if ($this->main->session) { + $uid = $this->main->user()['id']; + } else { + return NULL; + } + } + + $user = $this->db + ->select('*') + ->from('api.user u') + ->where('u.id') + ->eq($uid) + ->row(); + + if (!$user) { + return NULL; + } + + $data = parent::get_data(); + $data['user'] = $user; + $data['title'] = lang('title', sub: [$user['first_name']]); + return $data; + } +} diff --git a/src/web/_views/apps/auth/login.php b/src/web/_views/apps/auth/login.php index d7f326b..231e12e 100644 --- a/src/web/_views/apps/auth/login.php +++ b/src/web/_views/apps/auth/login.php @@ -49,7 +49,7 @@ <script> var onLogin = function(data) { - let jwt = data.token; + var jwt = data.token; $.ajax({ url: '/auth/update', @@ -66,13 +66,13 @@ $('#action-login').on('submit', function(e) { e.preventDefault(); - let username = $('#login-username').val(); - let password = $('#login-password').val(); + var username = $('#login-username').val(); + var password = $('#login-password').val(); $.ajax({ url: '/api/rpc/login', method: 'POST', - data: JSON.stringify({ username, password }), + data: JSON.stringify({ username: username, password: password }), success: onLogin }); }); diff --git a/src/web/_views/apps/people/main.php b/src/web/_views/apps/people/main.php index 3b45333..66e6fb0 100644 --- a/src/web/_views/apps/people/main.php +++ b/src/web/_views/apps/people/main.php @@ -18,7 +18,7 @@ <?php if ($loaded >= $page_size && $page_size < $total): ?> <?=ilang('action_load_users', id: 'action-load-users', - class: 'btn btn-line btn-wide mt mb', + class: 'btn btn-line btn-wide mb', attrs: array( 'loaded' => $loaded, 'pageSize' => $page_size, @@ -31,27 +31,27 @@ var urlParams = new URLSearchParams(window.location.search).toString(); $('#action-load-users').on('click', function() { - let me = $(this); - let page = me.attr('page'); + var me = $(this); + var page = me.attr('page'); if (!page) { page = '1'; } - let newPage = Number(page) + 1; + var 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')); + var loaded = Number(me.attr('loaded')); + var pageSize = Number(me.attr('pageSize')); + var userCount = Number(me.attr('userCount')); + var userMax = Number(me.attr('userMax')); - let url = '/people/people?page=' + page + '&max=' + userMax + '&' + urlParams; + var url = '/people/people?page=' + page + '&max=' + userMax + '&' + urlParams; $.get(url, function (data) { if (data === '') { me.remove(); return; } - let container = $('#people-container'); + var container = $('#people-container'); container.append(data); loaded += pageSize; diff --git a/src/web/_views/apps/profile/main.php b/src/web/_views/apps/profile/main.php new file mode 100644 index 0000000..afa45bc --- /dev/null +++ b/src/web/_views/apps/profile/main.php @@ -0,0 +1,37 @@ +<div id="main-content"> + <div id="profile-header" class="col"> + <div class="banner image-loading"> + <img src="/api/rpc/profile_banner?user_id=<?=$user['id']?>"> + </div> + <div class="info row"> + <div class="pfp-wrapper"> + <?php $this->view('template/pfp', array('user' => $user)); ?> + </div> + <div class="col content"> + <strong class="name"><?=$this->format_model->name($user)?></strong> + <span class="dim"><?=lang('joined') . $this->format_model->date($user['created'])?></span> + </div> + </div> + <hr> + <div class="row options"> + <?=ilang('action_posts', + sub: [$user['first_name']], + class: 'btn' + )?> + <?=ilang('action_about', + sub: [$user['first_name']], + class: 'btn' + )?> + <?=ilang('action_friends', + sub: [$user['first_name']], + class: 'btn' + )?> + </div> + </div> + <div id="#tab-posts"> + <?php + $_GET['user_id'] = $user['id']; + $this->post_controller->index(); + ?> + </div> +</div> diff --git a/src/web/_views/header.php b/src/web/_views/header.php index 7c60197..6d9570e 100644 --- a/src/web/_views/header.php +++ b/src/web/_views/header.php @@ -55,7 +55,7 @@ </div> <script> $('#action-hamburger').on('click', function() { - let menu = $('.nav-center'); + var menu = $('.nav-center'); menu.toggleClass('visible'); }); </script> diff --git a/src/web/_views/modal/new_post.php b/src/web/_views/modal/new_post.php index 50b9b84..66cb8c8 100644 --- a/src/web/_views/modal/new_post.php +++ b/src/web/_views/modal/new_post.php @@ -31,18 +31,18 @@ <script> $('#new-post-form').submit(function(e) { e.preventDefault(); - let content = $('#new-post-content').val(); - let me = $(this); + var content = $('#new-post-content').val(); + var me = $(this); - const getPost = function(data) { + var getPost = function(data) { if (data) { $('#post-container').prepend(data); } me.closest('.modal-container').remove(); } - const onPost = function(data) { - let id = data[0].id; + var onPost = function(data) { + var id = data[0].id; $.get({ url: '/_util/post/post?id=' + id, success: getPost @@ -52,7 +52,7 @@ $.ajax({ url: '/api/post', method: 'POST', - data: JSON.stringify({ content }), + data: JSON.stringify({ content: content }), success: onPost }); }); diff --git a/src/web/_views/modal/register.php b/src/web/_views/modal/register.php index f4d364a..81cae9e 100644 --- a/src/web/_views/modal/register.php +++ b/src/web/_views/modal/register.php @@ -133,28 +133,28 @@ $('#register-form').submit(function(e) { e.preventDefault(); - const form = event.target; - const formFields = form.elements; + var form = event.target; + var formFields = form.elements; - let first_name = formFields.first_name.value.trim(); - let last_name = formFields.last_name.value.trim(); - let username = formFields.username.value.trim(); - let password = formFields.password.value.trim(); - let email = formFields.email.value.trim(); - let birth_date = formFields.birth_date.value.trim(); - let gender = formFields.gender.value.trim(); + var first_name = formFields.first_name.value.trim(); + var last_name = formFields.last_name.value.trim(); + var username = formFields.username.value.trim(); + var password = formFields.password.value.trim(); + var email = formFields.email.value.trim(); + var birth_date = formFields.birth_date.value.trim(); + var gender = formFields.gender.value.trim(); if(birth_date === '') { errorToast('toast_date_empty'); return; } - const onSuccess = () => { + var onSuccess = function() { $.ajax({ url: '/api/rpc/login', method: 'POST', data: JSON.stringify({ - username, password + username: username, password: password }), success: onLogin }); @@ -164,8 +164,13 @@ url: '/api/user', method: 'POST', data: JSON.stringify({ - first_name, last_name, username, password, - email, birth_date, gender + first_name: first_name, + last_name: last_name, + username: username, + password: password, + email: email, + birth_date: birth_date, + gender: gender }), success: onSuccess }); diff --git a/src/web/_views/template/posts.php b/src/web/_views/template/posts.php index 5e9156c..5fec698 100644 --- a/src/web/_views/template/posts.php +++ b/src/web/_views/template/posts.php @@ -6,16 +6,18 @@ $page_size = $pdata['page_size']; $total = $pdata['total']; $max = $pdata['max']; + $filterUid = $pdata['filter_uid']; if ($loaded >= $page_size && $page_size < $total) { ilang('action_load_posts', id: 'action-load-posts', - class: 'btn btn-line btn-wide mb', + class: 'btn btn-line btn-wide mb mt', attrs: array( 'loaded' => $loaded, 'pageSize' => $page_size, 'postCount' => $total, 'postMax' => $max, + 'userId' => $filterUid ) ); } diff --git a/src/web/config/aesthetic.php b/src/web/config/aesthetic.php index e528b09..99a1959 100644 --- a/src/web/config/aesthetic.php +++ b/src/web/config/aesthetic.php @@ -22,7 +22,6 @@ class Aesthetic { ), 'home' => array( 'js' => [ - 'js/routes/home.js', 'js/post.js', ], 'css' => [ @@ -40,6 +39,15 @@ class Aesthetic { 'css/people.css' ], ), + 'profile' => array( + 'js' => [ + 'js/post.js', + ], + 'css' => [ + 'css/profile.css', + 'css/post.css' + ], + ), ); } /** diff --git a/src/web/config/routes.php b/src/web/config/routes.php index 5bb9a1b..1275bfe 100644 --- a/src/web/config/routes.php +++ b/src/web/config/routes.php @@ -5,5 +5,6 @@ $routes['home'] = 'apps/home'; $routes['error'] = 'apps/error'; $routes['auth'] = 'apps/auth'; $routes['people'] = 'apps/people'; +$routes['profile'] = 'apps/profile'; $routes[''] = '_index'; diff --git a/src/web/core/_model.php b/src/web/core/_model.php index 936fab4..dfc7163 100644 --- a/src/web/core/_model.php +++ b/src/web/core/_model.php @@ -24,7 +24,7 @@ abstract class Model { /** * @returns the base model data */ - public function get_data(): array { + public function get_data(): ?array { $data = array(); $data['self'] = $this->main->user(); diff --git a/src/web/helper/lang.php b/src/web/helper/lang.php index 48acba9..9c694a1 100644 --- a/src/web/helper/lang.php +++ b/src/web/helper/lang.php @@ -26,7 +26,7 @@ function ilang($key, $button = FALSE, ) { $text = lang($key . "_text", FALSE, sub: $sub); - $tip = lang($key . "_tip", FALSE); + $tip = lang($key . "_tip", FALSE, sub: $sub); $icon = lang($key . "_icon", FALSE); $content = lang($key . "_content", FALSE); diff --git a/src/web/lang/en_US/apps/profile.php b/src/web/lang/en_US/apps/profile.php new file mode 100644 index 0000000..2cc9b4e --- /dev/null +++ b/src/web/lang/en_US/apps/profile.php @@ -0,0 +1,18 @@ +<?php + +$lang['title'] = '%s\'s profile'; + +$lang['joined'] = 'Joined: '; +$lang['seen'] = 'Seen: '; + +$lang['action_posts_text'] = 'Posts'; +$lang['action_posts_tip'] = 'View %s\'s posts'; +$lang['action_about_text'] = 'About'; +$lang['action_about_tip'] = 'View %s\'s information'; +$lang['action_friends_text'] = 'Friends'; +$lang['action_friends_tip'] = 'View %s\'s friends'; + +$lang['action_load_posts_text'] = 'Load more posts'; +$lang['action_load_posts_tip'] = 'Load more posts'; + +?> |