Add ajax pagination & search for skinlib

This commit is contained in:
printempw 2017-06-30 10:33:41 +08:00
parent a0d1924165
commit 34962255a2
19 changed files with 437 additions and 278 deletions

View File

@ -28,94 +28,91 @@ class SkinlibController extends Controller
$this->user = $users->get(session('uid'));
}
public function index(Request $request)
public function index()
{
$filter = $request->input('filter', 'skin');
$sort = $request->input('sort', 'time');
$uid = intval($request->input('uid', 0));
$page = $request->input('page', 1);
$page = $page <= 0 ? 1 : $page;
$sort_by = ($sort == "time") ? "upload_at" : $sort;
if ($filter == "skin") {
$textures = Texture::where(function($query) {
// Nested condition, DO NOT MODIFY
$query->where('type', '=', 'steve')->orWhere('type', '=', 'alex');
});
} else {
$textures = Texture::where('type', $filter);
}
if ($uid != 0) {
$textures = $textures->where('uploader', $uid);
}
if (!is_null($this->user)) {
// show private textures when show uploaded textures of current user
if ($uid != $this->user->uid && !$this->user->isAdmin()) {
$textures = $textures->where('public', 1)
->merge($textures->where('uploader', $this->user->uid));
}
} else {
$textures = $textures->where('public', 1);
}
$total_pages = ceil($textures->count() / 20);
$textures = $textures->orderBy($sort_by, 'desc')->skip(($page - 1) * 20)->take(20)->get();
return view('skinlib.index')->with('user', $this->user)
->with('sort', $sort)
->with('filter', $filter)
->with('uploader', $uid)
->with('textures', $textures)
->with('page', $page)
->with('total_pages', $total_pages);
return view('skinlib.index', ['user' => $this->user]);
}
public function search(Request $request)
/**
* Get skin library data filtered.
* Available Query String: filter, uploader, page, sort, keyword, items_per_page.
*
* @param Request $request [description]
* @return [type] [description]
*/
public function getSkinlibFiltered(Request $request)
{
$q = $request->input('q', '');
// Available filters: skin, steve, alex, cape
$filter = $request->input('filter', 'skin');
$sort = $request->input('sort', 'time');
$sort_by = ($sort == "time") ? "upload_at" : $sort;
// Filter result by uploader's uid
$uploader = intval($request->input('uploader', 0));
if ($q == '') {
return redirect('skinlib');
}
// Available sorting methods: time, likes
$sort = $request->input('sort', 'time');
$sortBy = ($sort == "time") ? "upload_at" : $sort;
// Current page
$page = $request->input('page', 1);
$currentPage = ($page <= 0) ? 1 : $page;
// How many items to show in one page
$itemsPerPage = $request->input('items_per_page', 20);
// Keyword to search
$keyword = $request->input('keyword', '');
// Check if user logged in
$anonymous = is_null($this->user);
if ($filter == "skin") {
$textures = Texture::like('name', $q)->where(function($query) use ($q) {
$query->where('type', '=', 'steve')
->orWhere('type', '=', 'alex');
})->orderBy($sort_by, 'desc')->get();
$query = Texture::where(function ($innerQuery) {
// Nested condition, DO NOT MODIFY
$innerQuery->where('type', '=', 'steve')->orWhere('type', '=', 'alex');
});
} else {
$textures = Texture::like('name', $q)
->where('type', $filter)
->where('public', 1)
->orderBy($sort_by, 'desc')->get();
$query = Texture::where('type', $filter);
}
if (!is_null($this->user)) {
// show private textures when show uploaded textures of current user
if (!$this->user->isAdmin()) {
$textures = $textures->where('public', 1)
->merge($textures->where('uploader', $this->user->uid));
if ($keyword !== "") {
$query = $query->like('name', $keyword);
}
if ($uploader !== 0) {
$query = $query->where('uploader', $uploader);
}
if ($anonymous) {
// Show public textures only to anonymous visitors
$query = $query->where('public', 1);
} else {
// Show private textures when show uploaded textures of current user
if ($uploader != $this->user->uid && !$this->user->isAdmin()) {
$query = $query->where(function ($innerQuery) {
$innerQuery->where('public', '=', '1')->orWhere('uploader', '=', $this->user->uid);
});
}
} else {
$textures = $textures->where('public', 1);
}
return view('skinlib.search')->with('user', $this->user)
->with('sort', $sort)
->with('filter', $filter)
->with('uploader', 0)
->with('q', $q)
->with('textures', $textures);
$totalPages = ceil($query->count() / 20);
$textures = $query->orderBy($sortBy, 'desc')
->skip(($currentPage - 1) * $itemsPerPage)
->take($itemsPerPage)
->get();
if (! $anonymous) {
foreach ($textures as $item) {
$item->liked = $this->user->getCloset()->has($item->tid);
}
}
return response()->json([
'items' => $textures,
'anonymous' => $anonymous,
'total_pages' => $totalPages
]);
}
public function show($tid)

View File

@ -12,6 +12,17 @@ console.log(`\n %c Blessing Skin v${blessing.version} %c https://blessing.studio
$.locales = {};
$.currentLocale = {};
$.defaultPaginatorConfig = {
visiblePages: 5,
currentPage: 1,
first: '<li><a style="cursor: pointer;">«</a></li>',
prev: '<li><a style="cursor: pointer;"></a></li>',
next: '<li><a style="cursor: pointer;"></a></li>',
last: '<li><a style="cursor: pointer;">»</a></li>',
page: '<li><a style="cursor: pointer;">{{page}}</a></li>',
wrapper: '<ul class="pagination pagination-sm no-margin"></ul>'
};
/**
* Check if given value is empty.
*
@ -23,6 +34,8 @@ function isEmpty(obj) {
// null and undefined are "empty"
if (obj == null) return true;
if (typeof (obj) == 'number' || typeof (obj) == 'boolean') return false;
// Assume if it has a length property with a non-zero value
// that that property is correct.
if (obj.length > 0) return false;
@ -145,13 +158,14 @@ function showAjaxError(json) {
* Get parameters in query string with key.
*
* @param {string} key
* @param {string} defaultValue
* @return {string}
*/
function getQueryString(key) {
function getQueryString(key, defaultValue) {
result = location.search.match(new RegExp('[\?\&]'+key+'=([^\&]+)','i'));
if (result == null || result.length < 1){
return null;
return defaultValue;
} else {
return result[1];
}

View File

@ -1,38 +1,29 @@
/*
* @Author: printempw
* @Date: 2016-07-19 10:46:38
* @Last Modified by: g-plane
* @Last Modified time: 2017-04-25 21:56:19
* @Last Modified by: printempw
* @Last Modified time: 2017-06-30 10:25:12
*/
'use strict';
$(document).ready(() => swal.setDefaults({
confirmButtonText: trans('general.confirm'),
cancelButtonText: trans('general.cancel')
}));
$(document).ready(() => {
swal.setDefaults({
confirmButtonText: trans('general.confirm'),
cancelButtonText: trans('general.cancel')
});
$('#page-select').on('change', function () {
let sort = getQueryString('sort'),
page = getQueryString('page'),
filter = getQueryString('filter');
if ($('#skinlib-container').length != 0) {
// Initially render skinlib
requestSkinlibData().then(result => {
renderSkinlib(result.items);
let targetPage = $(this).val();
// if has query strings
if (filter || sort) {
if (page == null) {
// append "&page=" to current URL
window.location = `${location.href}&page=${targetPage}`;
} else {
window.location = `?filter=${filter}&sort=${sort}&page=${targetPage}`;
}
} else {
window.location = `?page=${targetPage}`;
updatePaginator(
$.skinlib.page,
result.total_pages || 1
);
});
}
});
$('#private').on('ifToggled', function () {
@ -42,6 +33,223 @@ $('#type-skin').on('ifToggled', function () {
$(this).prop('checked') ? $('#skin-type').show() : $('#skin-type').hide();
});
$.skinlib = {
page: getQueryString('page', 1),
filter: getQueryString('filter', 'skin'),
sort: getQueryString('sort', 'time'),
uploader: getQueryString('uploader', 0),
keyword: decodeURI(getQueryString('keyword', ''))
};
$(document).ready(() => {
});
function renderSkinlib(items) {
let container = $('#skinlib-container').html('');
if (items.length === 0) {
$('#skinlib-paginator').hide();
container.html(`<p style="text-align: center; margin: 30px 0;">
${ trans('general.noResult') }
</p>`);
} else {
$('#skinlib-paginator').show();
for (const item of items) {
container.append(renderSkinlibItemComponent(item));
}
}
$('.overlay').hide();
}
function reloadSkinlib() {
requestSkinlibData().then(result => {
$('.overlay').show();
renderSkinlib(result.items);
updatePaginator($.skinlib.page, result.total_pages || 1);
}).then(() => {
updateUrlQueryString();
updateBreadCrumb();
});
}
function requestSkinlibData() {
return Promise.resolve($.ajax({
type: 'GET',
url: url('skinlib/data'),
dataType: 'json',
data: $.skinlib,
error: showAjaxError
}));
}
function renderSkinlibItemComponent(item) {
let title = "";
let anonymous = "";
let liked = item.liked ? 'liked' : '';
if (item.liked === undefined) {
// If user haven't logged in
title = trans('skinlib.anonymous');
anonymous = 'anonymous';
} else {
title = item.liked ? trans('skinlib.removeFromCloset') : trans('skinlib.addToCloset');
}
return `<a href="${ url('skinlib/show/' + item.tid) }">
<div class="item" tid="${ item.tid }">
<div class="item-body">
<img src="${ url('preview/' + item.tid + '.png') }">
</div>
<div class="item-footer">
<p class="texture-name">
<span title="${ item.name }">${ item.name }
<small>${ trans("skinlib.filter." + item.type) }</small>
</span>
</p>
<a title="${title}" class="more like ${liked} ${anonymous}" tid="${ item.tid }" href="javascript:;" data-placement="top" data-toggle="tooltip"><i class="fa fa-heart"></i></a>
<small class="more private-label ${(item.public == 0) ? '' : 'hide'}" tid="${ item.tid }">
${ trans('skinlib.private') }
</small>
</div>
</div>
</a>`;
}
function updatePaginator(currentPage, totalPages) {
$.skinlib.page = currentPage;
$('p.pagination').text(trans('general.pagination', {
page: currentPage,
total: totalPages
}));
let paginator = $('#skinlib-paginator');
if (paginator.html().length == 0) {
// init paginator
$('#skinlib-paginator').jqPaginator($.extend({}, $.defaultPaginatorConfig, {
currentPage: parseInt(currentPage),
totalPages: parseInt(totalPages),
onPageChange: onPageChange
}));
} else {
$('#skinlib-paginator').jqPaginator('option', {
currentPage: parseInt(currentPage),
totalPages: parseInt(totalPages)
});
}
let pageSelectElement = $('select.pagination').html('');
for (let i = 1; i <= totalPages; i++) {
pageSelectElement.append(`
<option value="${i}" ${ (i == currentPage) ? 'selected' : '' }>${i}</option>
`);
}
}
function onPageChange(page, type) {
$.skinlib.page = page;
updateBreadCrumb();
if (type == "init") {
console.log('Init paginator', page);
} else {
$('.overlay').show();
reloadSkinlib();
console.log('Rendering page', page);
}
}
$('select.pagination').on('change', function () {
onPageChange(parseInt($(this).val()));
});
$(document).on('click', '.more.like', function () {
let tid = $(this).attr('tid');
if ($(this).hasClass('anonymous'))
return;
if ($(this).hasClass('liked')) {
removeFromCloset(tid);
} else {
addToCloset(tid);
}
});
$('.filter').click(function (e) {
e.preventDefault();
let selectedFilter = $(this).data('filter');
if (selectedFilter == "uploader") {
$.skinlib.uploader = $(this).data('uid');
console.log('Show items uploaded by uid ' + $.skinlib.uploader);
} else {
$.skinlib.filter = selectedFilter;
console.log('Filter by ' + $.skinlib.filter);
}
reloadSkinlib();
});
$('.sort').click(function (e) {
e.preventDefault();
$.skinlib.sort = $(this).data('sort');
console.log('Sort by ' + $.skinlib.sort);
reloadSkinlib();
});
$('#search-form').submit(function (e) {
e.preventDefault();
$.skinlib.keyword = $('#navbar-search-input').val();
console.log('Search keyword: ' + $.skinlib.keyword);
reloadSkinlib();
});
function updateUrlQueryString() {
let query = $.param($.skinlib);
window.history.pushState(null, null, url(`skinlib?${query}`));
}
function updateBreadCrumb() {
if ($.skinlib.filter == "cape") {
$('#filter-indicator').html(trans('general.cape'));
} else {
$('#filter-indicator').html(trans('general.skin') + `<small>
${ trans('skinlib.filter.' + $.skinlib.filter) }
</small>`);
}
if ($.skinlib.uploader != 0) {
$('#uploader-indicator').html(trans('skinlib.filter.uploader', {uid: $.skinlib.uploader}));
} else {
$('#uploader-indicator').html(trans('skinlib.filter.allUsers'));
}
$('#sort-indicator').html(trans('skinlib.sort.' + $.skinlib.sort));
if ($.skinlib.keyword != "") {
$('#search-indicator').html(trans('general.searchResult', {
keyword: decodeURI($.skinlib.keyword)
}));
$('#navbar-search-input').val(decodeURI($.skinlib.keyword));
}
}
function addToCloset(tid) {
$.getJSON(url(`skinlib/info/${tid}`), (json) => {
swal({
@ -274,7 +482,7 @@ function changeTextureName(tid, oldName) {
});
}
$('.private-label').click(function () {
$(document).on('click', '.private-label', function () {
swal({
text: trans('skinlib.setPublicNotice'),
type: 'warning',

View File

@ -261,20 +261,12 @@ $(document).ready(function() {
if (window.location.pathname.includes('/user/closet')) {
Promise.resolve($.ajax({
type: 'GET',
url: /(^https?.*)\/user\/closet/.exec(window.location.href)[1] + '/user/closet-data',
url: url('/user/closet-data'),
dataType: 'json'
})).then(result => {
renderCloset(result.items, result.category);
$('#closet-paginator').jqPaginator({
$('#closet-paginator').jqPaginator($.extend({}, $.defaultPaginatorConfig, {
totalPages: result.total_pages,
visiblePages: 5,
currentPage: 1,
first: '<li><a style="cursor: pointer;">«</a></li>',
prev: '<li><a style="cursor: pointer;"></a></li>',
next: '<li><a style="cursor: pointer;"></a></li>',
last: '<li><a style="cursor: pointer;">»</a></li>',
page: '<li><a style="cursor: pointer;">{{page}}</a></li>',
wrapper: '<ul class="pagination pagination-sm no-margin"></ul>',
onPageChange: page => {
reloadCloset(
$('#skin-category').hasClass('active') ? 'skin' : 'cape',
@ -282,7 +274,7 @@ $(document).ready(function() {
$('input[name=q]').val()
);
}
});
}));
}).catch(error => showAjaxError);
$('input[name=q]').on('input', debounce(() => {

View File

@ -40,13 +40,6 @@ input:-webkit-autofill {
-webkit-box-shadow: 0 0 0px 1000px #fff inset !important;
}
#page-select {
padding-left: 0;
margin: 0 20px 0 0;
border-radius: 4px;
padding: 5.5px 14px;
}
.item {
display: block;
background: #EFF1F0;

View File

@ -74,3 +74,32 @@ table {
.table > tbody > tr > td {
border-top: none;
}
select.pagination {
padding-left: 0;
margin: 0 20px 0 0;
border-radius: 4px;
padding: 5.5px 14px;
}
.overlay span {
position: absolute;
top: 50%;
left: 50%;
margin-left: -40px;
margin-top: 25px;
color: #000;
font-size: 20px;
}
#skinlib-container {
min-height: 20em;
}
.private-label {
margin-top: 2px;
}
.dropdown-menu .divider {
margin: 3px 0;
}

View File

@ -27,7 +27,7 @@ close: Close
skin: Skin
cape: Cape
pagination: Page :page, total :total
loading: Loading
texture-preview: Texture Preview
walk: Walk

View File

@ -47,6 +47,20 @@
setNewTextureName: 'Please enter the new texture name:',
emptyNewTextureName: 'Empty new texture name.',
// Skinlib
filter: {
skin: '(Any Model)',
steve: '(Steve)',
alex: '(Alex)',
cape: '(Cape)',
uploader: 'User (UID = :uid) Uploaded',
allUsers: 'All Users'
},
sort: {
time: 'Newestly Uploaded',
likes: 'Most Likes'
},
// Upload
emptyTextureName: 'Empty texture name.',
emptyTextureType: 'Please select a type for this texture.',
@ -173,6 +187,8 @@
confirm: 'OK',
cancel: 'Cancel',
more: 'More',
pagination: 'Page :page, total :total',
searchResult: '(Search result of keyword ":keyword")',
noResult: 'No result.'
}
};

View File

@ -29,10 +29,6 @@ item:
anonymous: Please login first
private: Private
search:
title: 'Search Result: :query'
no-keywords: No keywords given
show:
title: Texture Details
anonymous: You must login to use closets

View File

@ -27,7 +27,7 @@ close: 关闭
skin: 皮肤
cape: 披风
pagination: 第 :page 页,共 :total 页
loading: 正在加载
texture-preview: 材质预览
walk: 行走

View File

@ -42,6 +42,22 @@
removeFromCloset: '从衣柜中移除',
setItemName: '给你的皮肤起个名字吧~',
emptyItemName: '你还没有填写要收藏的材质名称啊',
anonymous: '请先登录',
private: '私密',
// Skinlib
filter: {
skin: '(任意模型)',
steve: 'Steve',
alex: 'Alex',
cape: '(披风)',
uploader: '用户UID = :uid上传',
allUsers: '所有用户'
},
sort: {
time: '最新上传',
likes: '最多收藏'
},
// Rename
setNewTextureName: '请输入新的材质名称:',
@ -173,6 +189,8 @@
confirm: '确定',
cancel: '取消',
more: '更多',
pagination: '第 :page 页,共 :total 页',
searchResult: '(关键词 “:keyword” 的搜索结果)',
noResult: '无结果'
},
vendor: {

View File

@ -29,10 +29,6 @@ item:
anonymous: 请先登录
private: 私密
search:
title: 搜索结果::query
no-keywords: 未指定关键字
show:
title: 材质详情
anonymous: 登录后才能使用衣柜哦

View File

@ -8,27 +8,33 @@
<div class="container">
<!-- Content Header (Page header) -->
<section class="content-header">
<h1>
{{ trans('general.skinlib') }}
<h1>{{ trans('general.skinlib') }}
<small id="search-indicator"></small>
</h1>
@include('vendor.breadcrumb')
<ol class="breadcrumb">
<li><i class="fa fa-tags"></i> {{ trans('skinlib.filter.now-showing') }}</li>
<li id="filter-indicator"></li>
<li id="uploader-indicator"></li>
<li class="active" id="sort-indicator"></li>
</ol>
</section>
<!-- Main content -->
<section class="content">
<div class="box box-default">
<div class="box-body">
@forelse ($textures as $texture)
<a href="{{ url("skinlib/show/$texture->tid") }}">
@include('skinlib.item')
</a>
@empty
<p style="text-align: center; margin: 30px 0;">{{ trans('skinlib.general.no-result') }}</p>
@endforelse
</div><!-- /.box-body -->
<!-- Container of Skin Library -->
<div id="skinlib-container" class="box-body"></div>
<div class="box-footer">
@include('vendor.pagination')
<!-- Pagination -->
<div class="pull-right" id="skinlib-paginator"></div>
<select class="pull-right pagination"></select>
<p class="pull-right pagination"></p>
</div>
<div class="overlay">
<i class="fa fa-refresh fa-spin"></i>
<span>{{ trans('general.loading') }}</span>
</div>
</div><!-- /.box -->
</section><!-- /.content -->

View File

@ -1,30 +0,0 @@
<div class="item" tid="{{ $texture['tid'] }}">
<div class="item-body">
<img src="{{ url("preview/{$texture['tid']}.png") }}">
</div>
<div class="item-footer">
<p class="texture-name">
<span title="{{ $texture['name'] }}">{{ $texture['name'] }}
<small>{{ trans("skinlib.item.{$texture['type']}") }}</small>
</span>
</p>
@if (Session::has('uid'))
@if ($user->getCloset()->has($texture['tid']))
<a title="{{ trans('skinlib.item.remove-from-closet') }}" class="more like liked" tid="{{ $texture['tid'] }}" href="javascript:removeFromCloset({{ $texture['tid'] }});" data-placement="top" data-toggle="tooltip"><i class="fa fa-heart"></i></a>
@else
<a title="{{ trans('skinlib.item.add-to-closet') }}" class="more like" tid="{{ $texture['tid'] }}" href="javascript:addToCloset({{ $texture['tid'] }});" data-placement="top" data-toggle="tooltip"><i class="fa fa-heart"></i></a>
@endif
@else
<a title="{{ trans('skinlib.item.anonymous') }}" class="more like" href="javascript:;" data-placement="top" data-toggle="tooltip"><i class="fa fa-heart"></i></a>
@endif
@if ($texture['public'] == "0")
<small class="more private-label" tid="{{ $texture['tid'] }}">{{ trans('skinlib.item.private') }}</small>
@endif
</div>
</div>

View File

@ -20,7 +20,9 @@
<nav class="navbar navbar-static-top">
<div class="container">
<div class="navbar-header">
<a href="{{ option('site_url') }}" class="navbar-brand">{{ option('site_name') }}</a>
<a href="{{ option('site_url') }}" class="navbar-brand">
{{ option('site_name') }}
</a>
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-collapse">
<i class="fa fa-bars"></i>
</button>
@ -29,8 +31,12 @@
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse pull-left" id="navbar-collapse">
<ul class="nav navbar-nav">
<li class="active"><a href="{{ url('skinlib') }}">{{ trans('general.skinlib') }}</a></li>
<li><a href="{{ url('user/closet') }}">{{ trans('general.my-closet') }}</a></li>
<li class="active">
<a href="{{ url('skinlib') }}">{{ trans('general.skinlib') }}</a>
</li>
<li>
<a href="{{ url('user/closet') }}">{{ trans('general.my-closet') }}</a>
</li>
@unless (isset($with_out_filter))
<!-- Filters -->
@ -39,15 +45,21 @@
<i class="fa fa-filter" aria-hidden="true"></i> {{ trans('skinlib.general.filter') }} <span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li><a href='?{{ isset($_GET["q"]) ? "q=$q&" : "" }}filter=skin&{{ isset($_GET["uid"]) ? "uid=$uploader&" : "" }}sort={{ $sort }}'>{{ trans('general.skin') }} <small>{{ trans('skinlib.filter.any-model') }}</small></a></li>
<li><a href='?{{ isset($_GET["q"]) ? "q=$q&" : "" }}filter=steve&{{ isset($_GET["uid"]) ? "uid=$uploader&" : "" }}sort={{ $sort }}'>{{ trans('general.skin') }} <small>{{ trans('skinlib.filter.steve-model') }}</small></a></li>
<li><a href='?{{ isset($_GET["q"]) ? "q=$q&" : "" }}filter=alex&{{ isset($_GET["uid"]) ? "uid=$uploader&" : "" }}sort={{ $sort }}'>{{ trans('general.skin') }} <small>{{ trans('skinlib.filter.alex-model') }}</small></a></li>
<li><a class="filter" data-filter="skin" href="#">{{ trans('general.skin') }} <small>{{ trans('skinlib.filter.any-model') }}</small></a></li>
<li><a class="filter" data-filter="steve" href="#">{{ trans('general.skin') }} <small>{{ trans('skinlib.filter.steve-model') }}</small></a></li>
<li><a class="filter" data-filter="alex" href="#">{{ trans('general.skin') }} <small>{{ trans('skinlib.filter.alex-model') }}</small></a></li>
<li class="divider"></li>
<li><a href='?{{ isset($_GET["q"]) ? "q=$q&" : "" }}filter=cape&{{ isset($_GET["uid"]) ? "uid=$uploader&" : "" }}sort={{ $sort }}'>{{ trans('general.cape') }}</a></li>
<li><a class="filter" data-filter="cape" href="#">{{ trans('general.cape') }}</a></li>
@if (!is_null($user))
<li class="divider"></li>
<li><a href="?{{ isset($_GET["filter"]) ? "filter=$filter&" : "" }}uid={{ $user->uid }}&sort={{ $sort }}">{{ trans('skinlib.general.my-upload') }}</a></li>
<li><a class="filter" data-filter="uploader" data-uid="{{ $user->uid }}" href="#">{{ trans('skinlib.general.my-upload') }}</a></li>
@endif
<li class="divider"></li>
<li><a href="{{ url('skinlib') }}">{{ trans('skinlib.filter.clean-filter') }}</a></li>
</ul>
@ -59,18 +71,21 @@
<i class="fa fa-sort-amount-desc" aria-hidden="true"></i> {{ trans('skinlib.general.sort') }} <span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li><a href='?{{ isset($_GET["q"]) ? "q=$q&" : "" }}filter={{ $filter }}{{ isset($_GET['uid']) ? "&uid={$_GET['uid']}" : "" }}&sort=likes'>{{ trans('skinlib.sort.most-likes') }}</a></li>
<li><a class="sort" data-sort="likes" href="#">{{ trans('skinlib.sort.most-likes') }}</a></li>
<li class="divider"></li>
<li><a href='?{{ isset($_GET["q"]) ? "q=$q&" : "" }}filter={{ $filter }}{{ isset($_GET['uid']) ? "&uid={$_GET['uid']}" : "" }}&sort=time'>{{ trans('skinlib.sort.newest-uploaded') }}</a></li>
<li><a class="sort" data-sort="time" href="#">{{ trans('skinlib.sort.newest-uploaded') }}</a></li>
</ul>
</li>
@endunless
</ul>
<form class="navbar-form navbar-left" role="search" action="{{ url('skinlib/search') }}">
@unless (isset($with_out_filter))
<form class="navbar-form navbar-left" id="search-form" role="search">
<div class="form-group">
<input type="text" class="form-control" id="navbar-search-input" name="q" placeholder="{{ trans('skinlib.general.search-textures') }}" value="{{ $q or '' }}" />
</div>
</form>
@endunless
</div><!-- /.navbar-collapse -->
<!-- Navbar Right Menu -->
<div class="navbar-custom-menu">

View File

@ -1,34 +0,0 @@
@extends('skinlib.master')
@section('title', trans('skinlib.search.title', ['query' => isset($_GET['q']) ? $_GET['q'] : trans('skinlib.search.no-keywords')]))
@section('content')
<!-- Full Width Column -->
<div class="content-wrapper">
<div class="container">
<!-- Content Header (Page header) -->
<section class="content-header">
<h1>
{{ $__env->getSections()['title'] }}
</h1>
@include('vendor.breadcrumb')
</section>
<!-- Main content -->
<section class="content">
<div class="box box-default">
<div class="box-body">
@forelse ($textures as $texture)
<a href="{{ url("skinlib/show/$texture->tid") }}">
@include('skinlib.item')
</a>
@empty
<p style="text-align: center; margin: 30px 0;">{{ trans('skinlib.general.no-result') }}</p>
@endforelse
</div><!-- /.box-body -->
</div><!-- /.box -->
</section><!-- /.content -->
</div><!-- /.container -->
</div><!-- /.content-wrapper -->
@endsection

View File

@ -1,27 +0,0 @@
<ol class="breadcrumb">
<li><i class="fa fa-tags"></i> {{ trans('skinlib.filter.now-showing') }}</li>
<li>
@if ($filter == "skin")
{{ trans('skinlib.filter.skin') }}
<small>{{ trans('skinlib.filter.any-model') }}</small>
@elseif ($filter == "steve")
{{ trans('skinlib.filter.skin') }}
<small>{{ trans('skinlib.filter.steve-model') }}</small>
@elseif ($filter == "alex")
{{ trans('skinlib.filter.skin') }}
<small>{{ trans('skinlib.filter.alex-model') }}</small>
@elseif ($filter == "cape")
{{ trans('skinlib.filter.cape') }}
@endif
</li>
@unless ($uploader == 0)
<li>{{ trans('skinlib.filter.uploader', ['name' => App::make('users')->get($_GET['uid'])->getNickName()]) }}</li>
@endunless
<li class="active">
@if ($sort == "time")
{{ trans('skinlib.sort.newest-uploaded') }}
@elseif ($sort == "likes")
{{ trans('skinlib.sort.most-likes') }}
@endif
</li>
</ol>

View File

@ -1,30 +0,0 @@
<!-- Pagination -->
<ul class="pagination pagination-sm no-margin pull-right">
<?php
// build base URL
$base_url = ($filter != "" && $sort != "") ? "?filter=$filter&sort=$sort&" : "?";
$base_url .= isset($_GET['uid']) ? "uid={$_GET['uid']}&" : "";
?>
<li><a href="{{ $base_url }}page=1">«</a></li>
@if ($page != 1)
<li><a href="{{ $base_url }}page={{ $page-1 }}">{{ $page - 1 }}</a></li>
@endif
<li><a href="{{ $base_url }}page={{ $page }}" class="active">{{ $page }}</a></li>
@if ($total_pages > $page)
<li><a href="{{ $base_url }}page={{ $page+1 }}">{{ $page+1 }}</a></li>
@endif
<li><a href="{{ $base_url }}page={{ $total_pages }}">»</a></li>
</ul>
<select id="page-select" class="pull-right">
@for ($i = 1; $i <= $total_pages; $i++)
<option value='{{ $i }}' {{ ($i == $page) ? 'selected="selected"' : '' }}>{{ $i }}</option>
@endfor
</select>
<p class="pull-right">{{ trans('general.pagination', ['page' => $page , 'total' => $total_pages]) }}</p>

View File

@ -76,10 +76,10 @@ Route::group(['middleware' => 'auth', 'prefix' => 'user'], function ()
*/
Route::group(['prefix' => 'skinlib'], function ()
{
Route::get ('', 'SkinlibController@index');
Route::any ('/info/{tid}', 'SkinlibController@info');
Route::any ('/show/{tid}', 'SkinlibController@show');
Route::any ('/search', 'SkinlibController@search');
Route::get('', 'SkinlibController@index');
Route::any('/info/{tid}', 'SkinlibController@info');
Route::any('/show/{tid}', 'SkinlibController@show');
Route::any('/data', 'SkinlibController@getSkinlibFiltered');
Route::group(['middleware' => 'auth'], function ()
{