1
0
mirror of https://github.com/Kovah/LinkAce.git synced 2025-02-24 11:13:02 +01:00

Allow advanced searching by tags

This commit is contained in:
Kovah 2019-01-23 22:02:02 +01:00
parent 11dd4a3955
commit c6b3b7b7f0
No known key found for this signature in database
GPG Key ID: AAAA031BA9830D7B
5 changed files with 65 additions and 48 deletions

View File

@ -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,22 +52,26 @@ 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());
// Also search for the title if applicable
if ($search_title = $request->get('search_title', false)) {
$search->orWhere('title', 'like', $query);
}
// 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_description = $request->get('search_description', false)) {
$search->orWhere('description', 'like', $query);
// Also search for the title if applicable
if ($search_title = $request->get('search_title', false)) {
$search->orWhere('title', 'like', $query);
}
// Also search for the title if applicable
if ($search_description = $request->get('search_description', false)) {
$search->orWhere('description', 'like', $query);
}
}
// Show private only if applicable
@ -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());
}
}

View File

@ -23,8 +23,6 @@ class SearchRequest extends FormRequest
*/
public function rules()
{
return [
'query' => 'required',
];
return [];
}
}

View File

@ -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',

View 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>

View File

@ -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