finish profile directory (mostly)
This commit is contained in:
parent
9ed46c335d
commit
7e2553646c
14 changed files with 346 additions and 56 deletions
File diff suppressed because one or more lines are too long
69
src/public/css/people.css
Normal file
69
src/public/css/people.css
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
|
||||||
|
.title {
|
||||||
|
margin-top: 2rem;
|
||||||
|
margin-left: 3rem;
|
||||||
|
font-size: 3rem;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.desc {
|
||||||
|
margin-left: 3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
#people-container {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
padding: 1rem 2rem;
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr 1fr 1fr;
|
||||||
|
grid-row-gap: 2rem;
|
||||||
|
grid-auto-rows: 1fr;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
max-width: 90rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile {
|
||||||
|
margin: 1rem;
|
||||||
|
text-decoration: none;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile:hover {
|
||||||
|
outline: 1px solid var(--blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile strong {
|
||||||
|
font-size: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile .pfp, .profile .pfp img {
|
||||||
|
padding: none;
|
||||||
|
margin: none;
|
||||||
|
height: 6rem;
|
||||||
|
border-radius: .3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media(max-width: 1400px) {
|
||||||
|
#people-container {
|
||||||
|
max-width: 90rem;
|
||||||
|
grid-template-columns: 1fr 1fr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media(max-width: 1000px) {
|
||||||
|
#people-container {
|
||||||
|
max-width: 50rem;
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
td:nth-child(1) {
|
||||||
|
font-weight: bold;
|
||||||
|
color: var(--subtext);
|
||||||
|
padding-right: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
td:nth-child(2) {
|
||||||
|
color: var(--text);
|
||||||
|
}
|
41
src/web/_controller/apps/people.php
Normal file
41
src/web/_controller/apps/people.php
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
<?php /* Copyright (c) 2024 Freya Murphy */
|
||||||
|
class People_controller extends Controller {
|
||||||
|
|
||||||
|
// the people model
|
||||||
|
private $people_model;
|
||||||
|
|
||||||
|
// format model
|
||||||
|
protected $format_model;
|
||||||
|
|
||||||
|
function __construct($load) {
|
||||||
|
parent::__construct($load);
|
||||||
|
$this->people_model = $this->load->model('apps/people');
|
||||||
|
$this->format_model = $this->load->model('format');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function index(): void {
|
||||||
|
parent::index();
|
||||||
|
$data = $this->people_model->get_data();
|
||||||
|
$this->view('header', $data);
|
||||||
|
$this->view('apps/people/main', $data);
|
||||||
|
$this->view('footer', $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array<string,mixed>
|
||||||
|
*/
|
||||||
|
public function people(): array {
|
||||||
|
$data = $this->people_model->get_users();
|
||||||
|
|
||||||
|
$this->view('apps/people/people', $data);
|
||||||
|
|
||||||
|
$max = 0;
|
||||||
|
foreach ($data['users'] as $user) {
|
||||||
|
$max = max($max, $user['id']);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
88
src/web/_model/apps/people.php
Normal file
88
src/web/_model/apps/people.php
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
<?php /* Copyright (c) 2024 Freya Murphy */
|
||||||
|
class People_model extends Model {
|
||||||
|
|
||||||
|
private $request_model;
|
||||||
|
|
||||||
|
function __construct($load) {
|
||||||
|
parent::__construct($load);
|
||||||
|
$this->request_model = $this->load->model('request');
|
||||||
|
}
|
||||||
|
|
||||||
|
private function get_filted_query($select) {
|
||||||
|
$filter_username = $this->request_model->get_str('filter_username', FALSE);
|
||||||
|
$filter_fisrt_name = $this->request_model->get_str('filter_first_name', FALSE);
|
||||||
|
$filter_last_name = $this->request_model->get_str('filter_last_name', FALSE);
|
||||||
|
$filter_email = $this->request_model->get_str('filter_email', FALSE);
|
||||||
|
$max = $this->request_model->get_int('max', FALSE);
|
||||||
|
|
||||||
|
$query = $this->db
|
||||||
|
->select($select)
|
||||||
|
->from('api.user u');
|
||||||
|
|
||||||
|
if ($filter_username) {
|
||||||
|
$query = $query
|
||||||
|
->where('u.username')
|
||||||
|
->like('%' . $filter_username . '%');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($filter_fisrt_name) {
|
||||||
|
$query = $query
|
||||||
|
->where('u.first_name')
|
||||||
|
->like('%'. $filter_fisrt_name . '%');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($filter_last_name) {
|
||||||
|
$query = $query
|
||||||
|
->where('u.last_name')
|
||||||
|
->like('%' . $filter_last_name . '%');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($filter_email) {
|
||||||
|
$query = $query
|
||||||
|
->where('u.email')
|
||||||
|
->like('%' . $filter_email . '%');
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($max) {
|
||||||
|
$query = $query
|
||||||
|
->where('u.id')
|
||||||
|
->le($max);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $query;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function get_users(): array {
|
||||||
|
$page = $this->request_model->get_int('page', 0);
|
||||||
|
$page_size = 24;
|
||||||
|
$offset = $page_size * $page;
|
||||||
|
|
||||||
|
$users = $this->get_filted_query('*')
|
||||||
|
->order_by('u.id', 'DESC')
|
||||||
|
->offset($offset)
|
||||||
|
->limit($page_size)
|
||||||
|
->rows();
|
||||||
|
|
||||||
|
$count = $this->get_filted_query('COUNT(u.id) AS count')
|
||||||
|
->row()['count'];
|
||||||
|
|
||||||
|
$max = 0;
|
||||||
|
|
||||||
|
foreach ($users as $user) {
|
||||||
|
$max = max($max, $user['id']);
|
||||||
|
}
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'users' => $users,
|
||||||
|
'count' => $count,
|
||||||
|
'page_size' => $page_size,
|
||||||
|
'max_id' => $max
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function get_data(): array {
|
||||||
|
$data = parent::get_data();
|
||||||
|
$data['title'] = lang('title');
|
||||||
|
return $data;
|
||||||
|
}
|
||||||
|
}
|
|
@ -39,7 +39,8 @@ class Format_model extends Model {
|
||||||
* @returns the formatted date
|
* @returns the formatted date
|
||||||
*/
|
*/
|
||||||
public function date($date) {
|
public function date($date) {
|
||||||
return $date;
|
$date=date_create($date);
|
||||||
|
return date_format($date, "Y-m-d H:i");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
35
src/web/_views/apps/people/card.php
Normal file
35
src/web/_views/apps/people/card.php
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
<?php /* Copyright (c) 2024 Freya Murphy */ ?>
|
||||||
|
<?php /* vi: syntax=php */ ?>
|
||||||
|
<a
|
||||||
|
class="card profile"
|
||||||
|
href="/profile?id=<?=$user['id']?>"
|
||||||
|
>
|
||||||
|
<div class="row">
|
||||||
|
<?php $this->view('template/pfp', array('user' => $user, 'link' => FALSE)); ?>
|
||||||
|
<div class="col ml">
|
||||||
|
<strong class=""><?=$this->format_model->name($user)?></strong>
|
||||||
|
<span class="dim"><?=lang('joined') . ' ' . $this->format_model->date($user['created'])?></span>
|
||||||
|
<span class="dim"><?=lang('seen') . ' ' . $this->format_model->date($user['seen'])?></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td><?=lang('tbl_username')?></td>
|
||||||
|
<td><?=$user['username']?></td>
|
||||||
|
<tr>
|
||||||
|
<tr>
|
||||||
|
<td><?=lang('tbl_email')?></td>
|
||||||
|
<td><?=$user['email']?></td>
|
||||||
|
<tr>
|
||||||
|
<tr>
|
||||||
|
<td><?=lang('tbl_gender')?></td>
|
||||||
|
<td><?=$user['gender']?></td>
|
||||||
|
<tr>
|
||||||
|
<tr>
|
||||||
|
<td><?=lang('tbl_uid')?></td>
|
||||||
|
<td><?=$user['id']?></td>
|
||||||
|
<tr>
|
||||||
|
</table>
|
||||||
|
</a>
|
||||||
|
<?
|
67
src/web/_views/apps/people/main.php
Normal file
67
src/web/_views/apps/people/main.php
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
<?php /* Copyright (c) 2024 Freya Murphy */ ?>
|
||||||
|
<?php /* vi: syntax=php */ ?>
|
||||||
|
<div id="main-content" class="col">
|
||||||
|
<h1 class="title"><?=lang('title')?></h1>
|
||||||
|
<h3 class="desc"><?=lang('desc')?></h3>
|
||||||
|
<hr>
|
||||||
|
<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'];
|
||||||
|
?>
|
||||||
|
<?php if ($loaded >= $page_size && $page_size < $total): ?>
|
||||||
|
<?=ilang('action_load_users',
|
||||||
|
id: 'action-load-users',
|
||||||
|
class: 'btn btn-line btn-wide mt mb',
|
||||||
|
attrs: array(
|
||||||
|
'loaded' => $loaded,
|
||||||
|
'pageSize' => $page_size,
|
||||||
|
'userCount' => $total,
|
||||||
|
'userMax' => $max
|
||||||
|
)
|
||||||
|
)?>
|
||||||
|
<script>
|
||||||
|
|
||||||
|
var urlParams = new URLSearchParams(window.location.search).toString();
|
||||||
|
|
||||||
|
$('#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 url = '/people/people?page=' + page + '&max=' + userMax + '&' + urlParams;
|
||||||
|
$.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 ?>
|
||||||
|
</div>
|
7
src/web/_views/apps/people/people.php
Normal file
7
src/web/_views/apps/people/people.php
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<?php /* Copyright (c) 2024 Freya Murphy */ ?>
|
||||||
|
<?php /* vi: syntax=php */ ?>
|
||||||
|
<?php
|
||||||
|
foreach($users as $user) {
|
||||||
|
$this->view('apps/people/card', array('user' => $user));
|
||||||
|
}
|
||||||
|
?>
|
|
@ -2,7 +2,16 @@
|
||||||
<?php /* vi: syntax=php */ ?>
|
<?php /* vi: syntax=php */ ?>
|
||||||
<?php
|
<?php
|
||||||
$class = isset($class) ? $class : '';
|
$class = isset($class) ? $class : '';
|
||||||
|
$link = isset($link) ? $link : TRUE;
|
||||||
?>
|
?>
|
||||||
|
<?php if($link): ?>
|
||||||
<a class="image-loading pfp <?=$class?>" href="/profile?id=<?=$user['id']?>">
|
<a class="image-loading pfp <?=$class?>" href="/profile?id=<?=$user['id']?>">
|
||||||
|
<?php else: ?>
|
||||||
|
<div class="image-loading pfp <?=$class?>">
|
||||||
|
<?php endif; ?>
|
||||||
<img src="/api/rpc/profile_avatar?user_id=<?=$user['id']?>"/>
|
<img src="/api/rpc/profile_avatar?user_id=<?=$user['id']?>"/>
|
||||||
|
<?php if ($link): ?>
|
||||||
</a>
|
</a>
|
||||||
|
<?php else: ?>
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
|
@ -61,7 +61,7 @@
|
||||||
</div>
|
</div>
|
||||||
<?php if ($self): ?>
|
<?php if ($self): ?>
|
||||||
<div class="row pb">
|
<div class="row pb">
|
||||||
<?php $this->view('template/pfp', array('user' => $user))?>
|
<?php $this->view('template/pfp', array('user' => $self))?>
|
||||||
<form class="ml action-new-comment-form row">
|
<form class="ml action-new-comment-form row">
|
||||||
<input
|
<input
|
||||||
type="hidden"
|
type="hidden"
|
||||||
|
|
|
@ -35,6 +35,11 @@ class Aesthetic {
|
||||||
'css/auth.css'
|
'css/auth.css'
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
'people' => array(
|
||||||
|
'css' => [
|
||||||
|
'css/people.css'
|
||||||
|
],
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -4,5 +4,6 @@ $routes = array();
|
||||||
$routes['home'] = 'apps/home';
|
$routes['home'] = 'apps/home';
|
||||||
$routes['error'] = 'apps/error';
|
$routes['error'] = 'apps/error';
|
||||||
$routes['auth'] = 'apps/auth';
|
$routes['auth'] = 'apps/auth';
|
||||||
|
$routes['people'] = 'apps/people';
|
||||||
|
|
||||||
$routes[''] = '_index';
|
$routes[''] = '_index';
|
||||||
|
|
|
@ -46,6 +46,8 @@ class DatabaseQuery {
|
||||||
if (!$this->where) {
|
if (!$this->where) {
|
||||||
$this->where = TRUE;
|
$this->where = TRUE;
|
||||||
$this->query .= "WHERE ";
|
$this->query .= "WHERE ";
|
||||||
|
} else {
|
||||||
|
$this->query .= "AND ";
|
||||||
}
|
}
|
||||||
$this->query .= "$cond ";
|
$this->query .= "$cond ";
|
||||||
return $this;
|
return $this;
|
||||||
|
@ -85,6 +87,8 @@ class DatabaseQuery {
|
||||||
if (!$this->where) {
|
if (!$this->where) {
|
||||||
$this->where = TRUE;
|
$this->where = TRUE;
|
||||||
$this->query .= "WHERE ";
|
$this->query .= "WHERE ";
|
||||||
|
} else {
|
||||||
|
$this->query .= "AND ";
|
||||||
}
|
}
|
||||||
if (empty($array)) {
|
if (empty($array)) {
|
||||||
$this->query .= "FALSE\n";
|
$this->query .= "FALSE\n";
|
||||||
|
@ -95,16 +99,6 @@ class DatabaseQuery {
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function and() {
|
|
||||||
$this->query .= "AND ";
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function or() {
|
|
||||||
$this->query .= "OR ";
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function join($table, $on, $type = 'LEFT') {
|
public function join($table, $on, $type = 'LEFT') {
|
||||||
$this->query .= "$type JOIN $table ON $on\n";
|
$this->query .= "$type JOIN $table ON $on\n";
|
||||||
return $this;
|
return $this;
|
||||||
|
|
17
src/web/lang/en_US/apps/people.php
Normal file
17
src/web/lang/en_US/apps/people.php
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$lang['title'] = 'Directory';
|
||||||
|
$lang['desc'] = 'Explore other people on xssbook!';
|
||||||
|
|
||||||
|
$lang['joined'] = 'Joined: ';
|
||||||
|
$lang['seen'] = 'Seen: ';
|
||||||
|
|
||||||
|
$lang['tbl_username'] = 'Username';
|
||||||
|
$lang['tbl_email'] = 'Email ';
|
||||||
|
$lang['tbl_uid'] = 'User ID ';
|
||||||
|
$lang['tbl_gender'] = 'Gender ';
|
||||||
|
|
||||||
|
$lang['action_load_users_text'] = 'Load more users';
|
||||||
|
$lang['action_load_users_tip'] = 'Load more users';
|
||||||
|
|
||||||
|
?>
|
Loading…
Reference in a new issue