summaryrefslogtreecommitdiff
path: root/src/web
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2024-04-03 11:25:57 -0400
committerFreya Murphy <freya@freyacat.org>2024-04-03 11:25:57 -0400
commit740df2706934231a91c5e2d5061198ea962c357c (patch)
treeb3de8027238850d43c6841f834a88e75ba90ce75 /src/web
parentfinish profile directory (mostly) (diff)
downloadxssbook2-740df2706934231a91c5e2d5061198ea962c357c.tar.gz
xssbook2-740df2706934231a91c5e2d5061198ea962c357c.tar.bz2
xssbook2-740df2706934231a91c5e2d5061198ea962c357c.zip
profile page
Diffstat (limited to '')
-rw-r--r--src/web/_controller/_util/post.php18
-rw-r--r--src/web/_controller/apps/profile.php35
-rw-r--r--src/web/_model/apps/auth.php2
-rw-r--r--src/web/_model/apps/error.php2
-rw-r--r--src/web/_model/apps/home.php2
-rw-r--r--src/web/_model/apps/people.php2
-rw-r--r--src/web/_model/apps/profile.php37
-rw-r--r--src/web/_views/apps/auth/login.php8
-rw-r--r--src/web/_views/apps/people/main.php20
-rw-r--r--src/web/_views/apps/profile/main.php37
-rw-r--r--src/web/_views/header.php2
-rw-r--r--src/web/_views/modal/new_post.php12
-rw-r--r--src/web/_views/modal/register.php31
-rw-r--r--src/web/_views/template/posts.php4
-rw-r--r--src/web/config/aesthetic.php10
-rw-r--r--src/web/config/routes.php1
-rw-r--r--src/web/core/_model.php2
-rw-r--r--src/web/helper/lang.php2
-rw-r--r--src/web/lang/en_US/apps/profile.php18
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';
+
+?>