mirror of https://github.com/4xmen/xshop.git
added morph selector
parent
dffb0dd187
commit
40c538212f
@ -0,0 +1,62 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Api;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Models\Category;
|
||||||
|
use App\Models\Clip;
|
||||||
|
use App\Models\Gallery;
|
||||||
|
use App\Models\Group;
|
||||||
|
use App\Models\Post;
|
||||||
|
use App\Models\Product;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
class MorphController extends Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
public $limit = 5;
|
||||||
|
//
|
||||||
|
public function search(Request $request)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (auth()->check() ){
|
||||||
|
return abort(403);
|
||||||
|
}
|
||||||
|
$morph = $request->input('morph', Product::class);
|
||||||
|
|
||||||
|
$q = '%' . $request->input('q') . '%';
|
||||||
|
switch ($morph) {
|
||||||
|
case Product::class:
|
||||||
|
$q = Product::where('name', 'LIKE', $q)
|
||||||
|
->orWhere('description', 'LIKE', $q);
|
||||||
|
break;
|
||||||
|
case Post::class:
|
||||||
|
$q = Post::where('title', 'LIKE', $q)
|
||||||
|
->orWhere('subtitle', 'LIKE', $q)
|
||||||
|
->orWhere('body', 'LIKE', $q);
|
||||||
|
break;
|
||||||
|
case Group::class:
|
||||||
|
$q = Group::where('name', 'LIKE', $q)
|
||||||
|
->orWhere('subtitle', 'LIKE', $q)
|
||||||
|
->orWhere('description', 'LIKE', $q);
|
||||||
|
break;
|
||||||
|
case Category::class:
|
||||||
|
$q = Category::where('name', 'LIKE', $q)
|
||||||
|
->orWhere('subtitle', 'LIKE', $q)
|
||||||
|
->orWhere('description', 'LIKE', $q);
|
||||||
|
break;
|
||||||
|
case Clip::class:
|
||||||
|
$q = Clip::where('title', 'LIKE', $q)
|
||||||
|
->orWhere('body', 'LIKE', $q);
|
||||||
|
break;
|
||||||
|
case Gallery::class:
|
||||||
|
$q = Gallery::where('title', 'LIKE', $q)
|
||||||
|
->orWhere('description', 'LIKE', $q);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return ['OK' => false, 'error' => __("Invalid morph")];
|
||||||
|
}
|
||||||
|
|
||||||
|
return ['OK' => true, 'data' => $q->orderByDesc('updated_at')->limit($this->limit)->get()];
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,119 @@
|
|||||||
|
<template>
|
||||||
|
<div id="morph-selector">
|
||||||
|
<div v-if="this.morph != null && this.id != null">
|
||||||
|
{{ humanReadableMorph(morph) }}: [{{ id }}]
|
||||||
|
</div>
|
||||||
|
<select class="form-control" v-model="morph" @change="updateList">
|
||||||
|
<option v-for="m in morphs" :value="m"> {{ humanReadableMorph(m) }}</option>
|
||||||
|
</select>
|
||||||
|
<label id="q" class="mt-2">
|
||||||
|
Search
|
||||||
|
<!-- WIP : translate-->
|
||||||
|
</label>
|
||||||
|
<input @input="updateList" type="text" id="q" v-model="q" class="form-control">
|
||||||
|
<div v-if="all.length > 0">
|
||||||
|
|
||||||
|
<ul class="list-group my-2">
|
||||||
|
<template v-for="item in all">
|
||||||
|
<li :class="`list-group-item `+(id == item.id?'selected':'') " @click="selectId(item.id)">
|
||||||
|
|
||||||
|
<template v-if="item.name != undefined">
|
||||||
|
<template v-if="xlang == null">
|
||||||
|
{{ item.name }}
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
{{ item.name[xlang] }}
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
<template v-if="item.title != undefined">
|
||||||
|
<template v-if="xlang == null">
|
||||||
|
{{ item.title }}
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
{{ item.title[xlang] }}
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
</li>
|
||||||
|
</template>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div v-if="this.morph != null && this.id != null">
|
||||||
|
<input type="hidden" :value="morph" name="attachable_type">
|
||||||
|
<input type="hidden" :value="id" name="attachable_id">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: "morph-selector",
|
||||||
|
components: {},
|
||||||
|
data: () => {
|
||||||
|
return {
|
||||||
|
morph: null,
|
||||||
|
q: '',
|
||||||
|
all: [],
|
||||||
|
id: null,
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
morphs: {
|
||||||
|
default: [],
|
||||||
|
},
|
||||||
|
morphSearchLink: {
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
xlang: {
|
||||||
|
default: null
|
||||||
|
},
|
||||||
|
xid: {
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
xmorph: {
|
||||||
|
default: null,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
if (this.xmorph != null && this.xmorph != 'null' && this.xmorph != '') {
|
||||||
|
this.morph = this.xmorph;
|
||||||
|
}
|
||||||
|
if (this.xid != null && this.xid != 'null' && this.xid != '') {
|
||||||
|
this.id = parseInt(this.xid);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {},
|
||||||
|
methods: {
|
||||||
|
selectId(i) {
|
||||||
|
this.id = i;
|
||||||
|
},
|
||||||
|
async updateList() {
|
||||||
|
this.id = null;
|
||||||
|
const url = this.morphSearchLink;
|
||||||
|
if (url != null) {
|
||||||
|
let res = await axios.post(url, {
|
||||||
|
morph: this.morph,
|
||||||
|
q: this.q,
|
||||||
|
});
|
||||||
|
if (res.data.OK) {
|
||||||
|
this.all = res.data.data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
humanReadableMorph(morph) {
|
||||||
|
const tmp = morph.split('\\');
|
||||||
|
return tmp[tmp.length - 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
#morph-selector {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.list-group-item.selected {
|
||||||
|
background: darkred;
|
||||||
|
}
|
||||||
|
</style>
|
Loading…
Reference in New Issue