mirror of
https://github.com/Kovah/LinkAce.git
synced 2025-02-24 19:22:35 +01:00
Allow advanced searching by tags
This commit is contained in:
parent
11dd4a3955
commit
c6b3b7b7f0
@ -39,14 +39,11 @@ class SearchController extends Controller
|
||||
'search_description' => false,
|
||||
'private_only' => false,
|
||||
'only_category' => 0,
|
||||
'only_tag' => 0,
|
||||
'only_tags' => '',
|
||||
'order_by' => $this->order_by_options[0],
|
||||
])
|
||||
->with('categories', Category::byUser(auth()->user()->id)
|
||||
->orderBy('name', 'asc')->get())
|
||||
->with('tags', Tag::byUser(auth()->user()->id)
|
||||
->orderBy('name', 'asc')->get()
|
||||
);
|
||||
->orderBy('name', 'asc')->get());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -55,13 +52,16 @@ class SearchController extends Controller
|
||||
*/
|
||||
public function doSearch(SearchRequest $request)
|
||||
{
|
||||
// Get the query
|
||||
$raw_query = $request->get('query');
|
||||
$query = '%' . $raw_query . '%';
|
||||
$search_title = false;
|
||||
$search_description = false;
|
||||
|
||||
// Start building the search
|
||||
$search = Link::byUser(auth()->id())
|
||||
->where('url', 'like', $query);
|
||||
$search = Link::byUser(auth()->id());
|
||||
|
||||
// Search for the URL
|
||||
if ($raw_query = $request->get('query', false)) {
|
||||
$query = '%' . $raw_query . '%';
|
||||
$search->where('url', 'like', $query);
|
||||
|
||||
// Also search for the title if applicable
|
||||
if ($search_title = $request->get('search_title', false)) {
|
||||
@ -72,6 +72,7 @@ class SearchController extends Controller
|
||||
if ($search_description = $request->get('search_description', false)) {
|
||||
$search->orWhere('description', 'like', $query);
|
||||
}
|
||||
}
|
||||
|
||||
// Show private only if applicable
|
||||
if ($private_only = $request->get('private_only', false)) {
|
||||
@ -86,9 +87,9 @@ class SearchController extends Controller
|
||||
}
|
||||
|
||||
// Show by specific tag only if applicable
|
||||
if ($tag_id = $request->get('only_tag', false)) {
|
||||
$search->whereHas('tags', function ($query) use ($tag_id) {
|
||||
$query->where('id', $tag_id);
|
||||
if ($tag_names = $request->get('only_tags', false)) {
|
||||
$search->whereHas('tags', function ($query) use ($tag_names) {
|
||||
$query->whereIn('name', explode(',', $tag_names));
|
||||
});
|
||||
}
|
||||
|
||||
@ -110,13 +111,10 @@ class SearchController extends Controller
|
||||
'search_description' => $search_description,
|
||||
'private_only' => $private_only,
|
||||
'only_category' => $category_id,
|
||||
'only_tag' => $tag_id,
|
||||
'only_tags' => $tag_names,
|
||||
'order_by' => $orderby,
|
||||
])
|
||||
->with('categories', Category::byUser(auth()->user()->id)
|
||||
->orderBy('name', 'asc')->get())
|
||||
->with('tags', Tag::byUser(auth()->user()->id)
|
||||
->orderBy('name', 'asc')->get()
|
||||
);
|
||||
->orderBy('name', 'asc')->get());
|
||||
}
|
||||
}
|
||||
|
@ -23,8 +23,6 @@ class SearchRequest extends FormRequest
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
'query' => 'required',
|
||||
];
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
@ -4,7 +4,7 @@ return [
|
||||
'results' => 'results',
|
||||
|
||||
'filter_by_category' => 'Filter by Category',
|
||||
'filter_by_tag' => 'Filter by Tag',
|
||||
'filter_by_tag' => 'Filter by Tag(s)',
|
||||
'query' => 'Search for...',
|
||||
'search_title' => 'Search Title',
|
||||
'search_description' => 'Search Description',
|
||||
|
24
resources/views/actions/search/partials/tags-js.blade.php
Normal file
24
resources/views/actions/search/partials/tags-js.blade.php
Normal file
@ -0,0 +1,24 @@
|
||||
<script>
|
||||
$('#only_tags').selectize({
|
||||
delimiter: ',',
|
||||
persist: false,
|
||||
load: function (query, callback) {
|
||||
if (!query.length) return callback();
|
||||
$.ajax({
|
||||
url: '{{ route('ajax-tags') }}',
|
||||
type: 'post',
|
||||
data: {
|
||||
'query': query,
|
||||
'_token': '{{ csrf_token() }}'
|
||||
},
|
||||
dataType: 'json',
|
||||
error: function () {
|
||||
callback();
|
||||
},
|
||||
success: function (res) {
|
||||
callback(res);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
@ -13,7 +13,7 @@
|
||||
|
||||
<div class="form-group">
|
||||
<div class="input-group">
|
||||
<input type="text" name="query" id="query" required
|
||||
<input type="text" name="query" id="query"
|
||||
class="form-control form-control-lg{{ $errors->has('query') ? ' is-invalid' : '' }}"
|
||||
placeholder="@lang('search.query')"
|
||||
value="{{ old('query') ?: $query_settings['old_query'] }}">
|
||||
@ -27,7 +27,7 @@
|
||||
|
||||
<div class="row">
|
||||
|
||||
<div class="col-sm d-flex align-items-center small">
|
||||
<div class="col-sm d-flex align-items-center">
|
||||
<div class="custom-control custom-checkbox">
|
||||
<input type="checkbox" id="search_title" name="search_title" class="custom-control-input"
|
||||
@if($query_settings['search_title']) checked @endif>
|
||||
@ -37,7 +37,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm d-flex align-items-center small">
|
||||
<div class="col-sm d-flex align-items-center">
|
||||
<div class="custom-control custom-checkbox">
|
||||
<input type="checkbox" id="search_description" name="search_description"
|
||||
class="custom-control-input"
|
||||
@ -48,7 +48,7 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm d-flex align-items-center small">
|
||||
<div class="col-sm d-flex align-items-center">
|
||||
<div class="custom-control custom-checkbox">
|
||||
<input type="checkbox" id="private_only" name="private_only" class="custom-control-input"
|
||||
@if($query_settings['private_only']) checked @endif>
|
||||
@ -60,11 +60,11 @@
|
||||
|
||||
<div class="w-100 d-xl-none mb-3"></div>
|
||||
|
||||
<div class="col-sm small mb-2 mb-sm-0">
|
||||
<div class="col-sm mb-2 mb-sm-0">
|
||||
<label for="only_category" class="d-none" aria-hidden="true">
|
||||
@lang('search.filter_by_category')
|
||||
</label>
|
||||
<select id="only_category" name="only_category" class="custom-select custom-select-sm">
|
||||
<select id="only_category" name="only_category" class="custom-select">
|
||||
<option value="0">@lang('search.filter_by_category')</option>
|
||||
@foreach($categories as $category)
|
||||
<option value="{{ $category->id }}"
|
||||
@ -75,26 +75,19 @@
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-sm small mb-2 mb-sm-0">
|
||||
<label for="only_tag" class="d-none" aria-hidden="true">
|
||||
<div class="col-sm mb-2 mb-sm-0">
|
||||
<label for="only_tags" class="d-none" aria-hidden="true">
|
||||
@lang('search.filter_by_tag')
|
||||
</label>
|
||||
<select id="only_tag" name="only_tag" class="custom-select custom-select-sm">
|
||||
<option value="0">@lang('search.filter_by_tag')</option>
|
||||
@foreach($tags as $tag)
|
||||
<option value="{{ $tag->id }}"
|
||||
@if($query_settings['only_tag'] == $tag->id) selected @endif>
|
||||
{{ $tag->name }}
|
||||
</option>
|
||||
@endforeach
|
||||
</select>
|
||||
<input name="only_tags" id="only_tags" type="text" placeholder="@lang('search.filter_by_tag')"
|
||||
value="{{ $query_settings['only_tags'] }}">
|
||||
</div>
|
||||
|
||||
<div class="col-sm small">
|
||||
<div class="col-sm">
|
||||
<label for="order_by" class="d-none" aria-hidden="true">
|
||||
@lang('search.filter_by_tag')
|
||||
</label>
|
||||
<select id="order_by" name="order_by" class="custom-select custom-select-sm">
|
||||
<select id="order_by" name="order_by" class="custom-select">
|
||||
<option value="0">@lang('search.order_by')</option>
|
||||
@foreach($order_by_options as $order_by)
|
||||
<option value="{{ $order_by }}"
|
||||
@ -132,3 +125,7 @@
|
||||
</div>
|
||||
|
||||
@endsection
|
||||
|
||||
@push('scripts')
|
||||
@include('actions.search.partials.tags-js')
|
||||
@endpush
|
||||
|
Loading…
x
Reference in New Issue
Block a user