diff --git a/config.ini b/config.ini index 53fcbe1d..2cadddb9 100644 --- a/config.ini +++ b/config.ini @@ -42,7 +42,6 @@ listPosts=anonymous listPosts.sketchy=registered listPosts.unsafe=registered listPosts.hidden=nobody -listUsers=registered viewPost=anonymous viewPost.sketchy=registered viewPost.unsafe=registered @@ -59,5 +58,7 @@ hidePost.own=moderator hidePost.all=moderator deletePost.own=moderator deletePost.all=moderator +listUsers=registered +viewUser=registered listComments=anonymous listTags=anonymous diff --git a/public_html/media/css/user-view.css b/public_html/media/css/user-view.css new file mode 100644 index 00000000..c81a3cea --- /dev/null +++ b/public_html/media/css/user-view.css @@ -0,0 +1,33 @@ +#sidebar { + width: 200px; +} + +.details .key { + margin-right: 0.5em; +} + +.tabs ul { + list-style-type: none; + margin: 0 0 1em 0; + padding: 0; + border-bottom: 1px solid #eee; +} +.tabs li { + display: inline-block; +} + +.tabs li a { + display: inline-block; + padding: 0.5em 1em; + margin-bottom: -1px; +} + +.tabs li.active a { + border: 1px solid #eee; + border-bottom: 1px solid white; +} +.tabs li.inactive a { + border: 1px solid white; + border-bottom: 1px solid #eee; + color: silver; +} diff --git a/src/Controllers/AuthController.php b/src/Controllers/AuthController.php index e7d8271a..fb4d7e6e 100644 --- a/src/Controllers/AuthController.php +++ b/src/Controllers/AuthController.php @@ -136,6 +136,7 @@ class AuthController $dbUser->pass_salt = md5(mt_rand() . uniqid()); $dbUser->pass_hash = self::hashPassword($suppliedPass1, $dbUser->pass_salt); $dbUser->email = $suppliedEmail; + $dbUser->join_date = time(); $dbUser->staff_confirmed = $staffActivation ? false : true; $dbUser->email_confirmed = $emailActivation ? false : true; $dbUser->access_rank = R::findOne('user') === null ? AccessRank::Admin : AccessRank::Registered; diff --git a/src/Controllers/PostController.php b/src/Controllers/PostController.php index 0820ff32..589a40c3 100644 --- a/src/Controllers/PostController.php +++ b/src/Controllers/PostController.php @@ -262,7 +262,7 @@ class PostController }; $countDbQuery = R::$f->begin(); - $countDbQuery->select('COUNT(1) AS count'); + $countDbQuery->select('COUNT(1)')->as('count'); $buildDbQuery($countDbQuery, $query); $postCount = intval($countDbQuery->get('row')['count']); $pageCount = ceil($postCount / $postsPerPage); diff --git a/src/Controllers/UserController.php b/src/Controllers/UserController.php index 407e1e53..7f6a4aad 100644 --- a/src/Controllers/UserController.php +++ b/src/Controllers/UserController.php @@ -1,6 +1,16 @@ context->stylesheets []= 'user-view.css'; + $this->context->stylesheets []= 'post-list.css'; + $this->context->stylesheets []= 'paginator.css'; + if ($this->config->browsing->endlessScrolling) + $this->context->scripts []= 'paginator-endless.js'; $this->context->subTitle = $name; - throw new SimpleException('Not implemented'); + PrivilegesHelper::confirmWithException($this->context->user, Privilege::ViewUser); + + $postsPerPage = intval($this->config->browsing->postsPerPage); + $user = self::locateUser($name); + if ($tab === null) + $tab = 'favs'; + if ($page === null) + $page = 1; + + $buildDbQuery = function($dbQuery, $user, $tab) + { + $dbQuery->from('post'); + + + /* safety */ + $allowedSafety = array_filter(PostSafety::getAll(), function($safety) + { + return PrivilegesHelper::confirm($this->context->user, Privilege::ListPosts, PostSafety::toString($safety)) and + $this->context->user->hasEnabledSafety($safety); + }); + $dbQuery->where('safety IN (' . R::genSlots($allowedSafety) . ')'); + foreach ($allowedSafety as $s) + $dbQuery->put($s); + + + /* hidden */ + if (!PrivilegesHelper::confirm($this->context->user, Privilege::ListPosts, 'hidden')) + $dbQuery->andNot('hidden'); + + + /* tab */ + switch ($tab) + { + case 'uploads': + $dbQuery + ->and('uploader_id = ?') + ->put($user->id); + break; + case 'favs': + $dbQuery + ->and() + ->exists() + ->open() + ->select('1') + ->from('favoritee') + ->where('post_id = post.id') + ->and('favoritee.user_id = ?') + ->put($user->id) + ->close(); + break; + } + }; + + $countDbQuery = R::$f->begin()->select('COUNT(*)')->as('count'); + $buildDbQuery($countDbQuery, $user, $tab); + $postCount = intval($countDbQuery->get('row')['count']); + $pageCount = ceil($postCount / $postsPerPage); + $page = max(1, min($pageCount, $page)); + + $searchDbQuery = R::$f->begin()->select('*'); + $buildDbQuery($searchDbQuery, $user, $tab); + $searchDbQuery->orderBy('id DESC') + ->limit('?') + ->put($postsPerPage) + ->offset('?') + ->put(($page - 1) * $postsPerPage); + + $posts = $searchDbQuery->get(); + $this->context->transport->user = $user; + $this->context->transport->tab = $tab; + $this->context->transport->page = $page; + $this->context->transport->postCount = $postCount; + $this->context->transport->pageCount = $pageCount; + $this->context->transport->posts = $posts; } + + /** * @route /user/toggle-safety/{safety} */ diff --git a/src/Models/Privilege.php b/src/Models/Privilege.php index e6111939..cc7d088c 100644 --- a/src/Models/Privilege.php +++ b/src/Models/Privilege.php @@ -13,6 +13,8 @@ class Privilege extends Enum const DeletePost = 10; const ListUsers = 11; - const ListComments = 12; - const ListTags = 13; + const ViewUser = 12; + + const ListComments = 13; + const ListTags = 14; } diff --git a/src/Views/post-view.phtml b/src/Views/post-view.phtml index b8fb80b3..d67379e1 100644 --- a/src/Views/post-view.phtml +++ b/src/Views/post-view.phtml @@ -52,7 +52,7 @@
Uploader: - + context->transport->post->uploader->name ?> diff --git a/src/Views/user-view.phtml b/src/Views/user-view.phtml new file mode 100644 index 00000000..87f1ac57 --- /dev/null +++ b/src/Views/user-view.phtml @@ -0,0 +1,67 @@ + + +
+
+ +
+ + route->simpleControllerName; + $action = $context->route->simpleActionName; + $page = max(1, $page); + $page = min($context->transport->pageCount, $page); + $params = []; + $params['page'] = $page; + $params['tab'] = $context->transport->tab; + $params['name'] = $context->transport->user->name; + return \Chibi\UrlHelper::route($controller, $action, $params); + } + ?> + + renderFile('post-list') ?> +