improve search

shift-build-2464
Nadim Salloum 2021-06-16 16:26:38 +03:00
parent 07cc39cbd5
commit 3d446c601d
5 changed files with 137 additions and 26 deletions

View File

@ -130,17 +130,20 @@ class Car extends Model
public function scopeFilter($query, array $filters)
{
$query->when($filters['search'] ?? null, function ($query, $search) {
$query->where(function ($query) use ($search) {
$query->orWhere('colour', 'like', $search . '%')
->orWhere('stammnummer', 'like', $search . '%')
->orWhere('vin', 'like', $search . '%')
->orWhereHas('carModel', function ($query) use ($search) {
$query->where('name', 'like', $search.'%')
->orWhereHas('brand', function ($query) use ($search) {
$query->where('name', 'like', $search.'%');
$parts = explode(' ', $search);
foreach ($parts as $part) {
$query->where(function ($query) use ($part) {
$query->orWhere('colour', 'like', $part . '%')
->orWhere('stammnummer', 'like', $part . '%')
->orWhere('vin', 'like', $part . '%')
->orWhereHas('carModel', function ($query) use ($part) {
$query->where('name', 'like', $part.'%')
->orWhereHas('brand', function ($query) use ($part) {
$query->where('name', 'like', $part.'%');
});
});
});
}
})->when($filters['trashed'] ?? null, function ($query, $trashed) {
if ($trashed === 'with') {
$query->withTrashed();

View File

@ -81,16 +81,20 @@ class Contact extends Model
public function scopeFilter($query, array $filters)
{
$query->when($filters['search'] ?? null, function ($query, $search) {
$query->where(function ($query) use ($search) {
$query->where('firstname', 'like', '%' . $search . '%')
->orWhere('lastname', 'like', '%' . $search . '%')
->orWhere('company', 'like', '%' . $search . '%')
->orWhere('email', 'like', '%' . $search . '%')
->orWhere('zip', 'like', $search . '%')
->orWhere('city', 'like', '%' . $search . '%')
->orWhere('address', 'like', '%' . $search . '%')
->orWhere('phone', 'like', '%' . $search . '%');
$parts = explode(' ', $search);
foreach ($parts as $part) {
$query->where(function ($query) use ($part) {
$query->where('firstname', 'like', '%' . $part . '%')
->orWhere('lastname', 'like', '%' . $part . '%')
->orWhere('company', 'like', '%' . $part . '%')
->orWhere('email', 'like', '%' . $part . '%')
->orWhere('zip', 'like', $part . '%')
->orWhere('city', 'like', '%' . $part . '%')
->orWhere('address', 'like', '%' . $part . '%')
->orWhere('phone', 'like', '%' . $part . '%');
});
}
})->when($filters['trashed'] ?? null, function ($query, $trashed) {
if ($trashed === 'with') {
$query->withTrashed();

112
public/js/app.js vendored
View File

@ -28098,9 +28098,58 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
/*!***************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/Pages/Cars/Index.vue?vue&type=template&id=5cf1bb2b ***!
\***************************************************************************************************************************************************************************************************************************************************************************/
/***/ (() => {
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
throw new Error("Module build failed (from ./node_modules/babel-loader/lib/index.js):\nSyntaxError: /var/www/html/resources/js/Pages/Cars/Index.vue: Unexpected token, expected \",\" (26:14)\n\n\u001b[0m \u001b[90m 24 |\u001b[39m _createVNode(_component_simple_table\u001b[33m,\u001b[39m {\u001b[0m\n\u001b[0m \u001b[90m 25 |\u001b[39m title\u001b[33m:\u001b[39m cars\u001b[33m.\u001b[39mtotal \u001b[33m+\u001b[39m \u001b[32m' '\u001b[39m \u001b[33m+\u001b[39m (cars\u001b[33m.\u001b[39mtotal \u001b[33m===\u001b[39m \u001b[32m'1'\u001b[39m \u001b[33m?\u001b[39m \u001b[32m'Auto'\u001b[39m \u001b[33m:\u001b[39m \u001b[32m'Autos'\u001b[39m\u001b[33m,\u001b[39m\u001b[0m\n\u001b[0m\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 26 |\u001b[39m data\u001b[33m:\u001b[39m $props\u001b[33m.\u001b[39mcars\u001b[33m,\u001b[39m\u001b[0m\n\u001b[0m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\u001b[0m\n\u001b[0m \u001b[90m 27 |\u001b[39m columns\u001b[33m:\u001b[39m $data\u001b[33m.\u001b[39mcolumns\u001b[33m,\u001b[39m\u001b[0m\n\u001b[0m \u001b[90m 28 |\u001b[39m defaultSort\u001b[33m:\u001b[39m $props\u001b[33m.\u001b[39msort\u001b[33m,\u001b[39m\u001b[0m\n\u001b[0m \u001b[90m 29 |\u001b[39m filters\u001b[33m:\u001b[39m $props\u001b[33m.\u001b[39mfilters\u001b[33m,\u001b[39m\u001b[0m\n at Parser._raise (/var/www/html/node_modules/@babel/parser/lib/index.js:816:17)\n at Parser.raiseWithData (/var/www/html/node_modules/@babel/parser/lib/index.js:809:17)\n at Parser.raise (/var/www/html/node_modules/@babel/parser/lib/index.js:770:17)\n at Parser.unexpected (/var/www/html/node_modules/@babel/parser/lib/index.js:9896:16)\n at Parser.expect (/var/www/html/node_modules/@babel/parser/lib/index.js:9870:28)\n at Parser.parseParenAndDistinguishExpression (/var/www/html/node_modules/@babel/parser/lib/index.js:11504:14)\n at Parser.parseExprAtom (/var/www/html/node_modules/@babel/parser/lib/index.js:11191:23)\n at Parser.parseExprSubscripts (/var/www/html/node_modules/@babel/parser/lib/index.js:10869:23)\n at Parser.parseUpdate (/var/www/html/node_modules/@babel/parser/lib/index.js:10849:21)\n at Parser.parseMaybeUnary (/var/www/html/node_modules/@babel/parser/lib/index.js:10827:23)");
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "render": () => (/* binding */ render)
/* harmony export */ });
/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm-bundler.js");
var _hoisted_1 = {
"class": "font-semibold text-xl text-gray-800 leading-tight"
};
var _hoisted_2 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" Alle Autos ");
var _hoisted_3 = {
"class": "w-full mx-auto"
};
function render(_ctx, _cache, $props, $setup, $data, $options) {
var _component_bread_crumb = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("bread-crumb");
var _component_simple_table = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("simple-table");
var _component_layout = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("layout");
return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(_component_layout, null, {
header: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("h2", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_bread_crumb, {
text: "Autos",
href: _ctx.route('cars')
}, null, 8
/* PROPS */
, ["href"]), _hoisted_2])];
}),
"default": (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_simple_table, {
title: $props.cars.total + ' ' + ($props.cars.total === 1 ? 'Auto' : 'Autos'),
data: $props.cars,
columns: $data.columns,
defaultSort: $props.sort,
filters: $props.filters,
currentRoute: $data.currentRoute,
print: true
}, null, 8
/* PROPS */
, ["title", "data", "columns", "defaultSort", "filters", "currentRoute"])])];
}),
_: 1
/* STABLE */
});
}
/***/ }),
@ -28287,9 +28336,58 @@ function render(_ctx, _cache, $props, $setup, $data, $options) {
/*!**************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/Pages/Cars/Sold.vue?vue&type=template&id=0d5a2eea ***!
\**************************************************************************************************************************************************************************************************************************************************************************/
/***/ (() => {
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
throw new Error("Module build failed (from ./node_modules/babel-loader/lib/index.js):\nSyntaxError: /var/www/html/resources/js/Pages/Cars/Sold.vue: Unexpected token, expected \",\" (26:14)\n\n\u001b[0m \u001b[90m 24 |\u001b[39m _createVNode(_component_simple_table\u001b[33m,\u001b[39m {\u001b[0m\n\u001b[0m \u001b[90m 25 |\u001b[39m title\u001b[33m:\u001b[39m cars\u001b[33m.\u001b[39mtotal \u001b[33m+\u001b[39m \u001b[32m' '\u001b[39m \u001b[33m+\u001b[39m (cars\u001b[33m.\u001b[39mtotal \u001b[33m===\u001b[39m \u001b[32m'1'\u001b[39m \u001b[33m?\u001b[39m \u001b[32m'Auto'\u001b[39m \u001b[33m:\u001b[39m \u001b[32m'Autos'\u001b[39m\u001b[33m,\u001b[39m\u001b[0m\n\u001b[0m\u001b[31m\u001b[1m>\u001b[22m\u001b[39m\u001b[90m 26 |\u001b[39m data\u001b[33m:\u001b[39m $props\u001b[33m.\u001b[39mcars\u001b[33m,\u001b[39m\u001b[0m\n\u001b[0m \u001b[90m |\u001b[39m \u001b[31m\u001b[1m^\u001b[22m\u001b[39m\u001b[0m\n\u001b[0m \u001b[90m 27 |\u001b[39m columns\u001b[33m:\u001b[39m $data\u001b[33m.\u001b[39mcolumns\u001b[33m,\u001b[39m\u001b[0m\n\u001b[0m \u001b[90m 28 |\u001b[39m defaultSort\u001b[33m:\u001b[39m $props\u001b[33m.\u001b[39msort\u001b[33m,\u001b[39m\u001b[0m\n\u001b[0m \u001b[90m 29 |\u001b[39m filters\u001b[33m:\u001b[39m $props\u001b[33m.\u001b[39mfilters\u001b[33m,\u001b[39m\u001b[0m\n at Parser._raise (/var/www/html/node_modules/@babel/parser/lib/index.js:816:17)\n at Parser.raiseWithData (/var/www/html/node_modules/@babel/parser/lib/index.js:809:17)\n at Parser.raise (/var/www/html/node_modules/@babel/parser/lib/index.js:770:17)\n at Parser.unexpected (/var/www/html/node_modules/@babel/parser/lib/index.js:9896:16)\n at Parser.expect (/var/www/html/node_modules/@babel/parser/lib/index.js:9870:28)\n at Parser.parseParenAndDistinguishExpression (/var/www/html/node_modules/@babel/parser/lib/index.js:11504:14)\n at Parser.parseExprAtom (/var/www/html/node_modules/@babel/parser/lib/index.js:11191:23)\n at Parser.parseExprSubscripts (/var/www/html/node_modules/@babel/parser/lib/index.js:10869:23)\n at Parser.parseUpdate (/var/www/html/node_modules/@babel/parser/lib/index.js:10849:21)\n at Parser.parseMaybeUnary (/var/www/html/node_modules/@babel/parser/lib/index.js:10827:23)");
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "render": () => (/* binding */ render)
/* harmony export */ });
/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.esm-bundler.js");
var _hoisted_1 = {
"class": "font-semibold text-xl text-gray-800 leading-tight"
};
var _hoisted_2 = /*#__PURE__*/(0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" Verkaufte Autos ");
var _hoisted_3 = {
"class": "w-full mx-auto"
};
function render(_ctx, _cache, $props, $setup, $data, $options) {
var _component_bread_crumb = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("bread-crumb");
var _component_simple_table = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("simple-table");
var _component_layout = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("layout");
return (0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createBlock)(_component_layout, null, {
header: (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("h2", _hoisted_1, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_bread_crumb, {
text: "Autos",
href: _ctx.route('cars')
}, null, 8
/* PROPS */
, ["href"]), _hoisted_2])];
}),
"default": (0,vue__WEBPACK_IMPORTED_MODULE_0__.withCtx)(function () {
return [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)("div", _hoisted_3, [(0,vue__WEBPACK_IMPORTED_MODULE_0__.createVNode)(_component_simple_table, {
title: $props.cars.total + ' ' + ($props.cars.total === 1 ? 'Auto' : 'Autos'),
data: $props.cars,
columns: $data.columns,
defaultSort: $props.sort,
filters: $props.filters,
currentRoute: $data.currentRoute,
print: true
}, null, 8
/* PROPS */
, ["title", "data", "columns", "defaultSort", "filters", "currentRoute"])])];
}),
_: 1
/* STABLE */
});
}
/***/ }),
@ -67255,6 +67353,9 @@ __webpack_require__.r(__webpack_exports__);
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "render": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_Index_vue_vue_type_template_id_5cf1bb2b__WEBPACK_IMPORTED_MODULE_0__.render)
/* harmony export */ });
/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_Index_vue_vue_type_template_id_5cf1bb2b__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./Index.vue?vue&type=template&id=5cf1bb2b */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/Pages/Cars/Index.vue?vue&type=template&id=5cf1bb2b");
@ -67284,6 +67385,9 @@ __webpack_require__.r(__webpack_exports__);
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ "render": () => (/* reexport safe */ _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_Sold_vue_vue_type_template_id_0d5a2eea__WEBPACK_IMPORTED_MODULE_0__.render)
/* harmony export */ });
/* harmony import */ var _node_modules_babel_loader_lib_index_js_clonedRuleSet_5_use_0_node_modules_vue_loader_dist_templateLoader_js_ruleSet_1_rules_2_node_modules_vue_loader_dist_index_js_ruleSet_0_use_0_Sold_vue_vue_type_template_id_0d5a2eea__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!../../../../node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!../../../../node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./Sold.vue?vue&type=template&id=0d5a2eea */ "./node_modules/babel-loader/lib/index.js??clonedRuleSet-5.use[0]!./node_modules/vue-loader/dist/templateLoader.js??ruleSet[1].rules[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./resources/js/Pages/Cars/Sold.vue?vue&type=template&id=0d5a2eea");

View File

@ -7,7 +7,7 @@
</h2>
</template>
<div class="w-full mx-auto">
<simple-table :title="cars.total + ' ' + (cars.total === 1 ? 'Auto' : 'Autos'" :data="cars" :columns="columns" :defaultSort="sort" :filters="filters" :currentRoute="currentRoute" :print="true" />
<simple-table :title="cars.total + ' ' + (cars.total === 1 ? 'Auto' : 'Autos')" :data="cars" :columns="columns" :defaultSort="sort" :filters="filters" :currentRoute="currentRoute" :print="true" />
</div>
</layout>
</template>

View File

@ -7,7 +7,7 @@
</h2>
</template>
<div class="w-full mx-auto">
<simple-table :title="cars.total + ' ' + (cars.total === 1 ? 'Auto' : 'Autos'" :data="cars" :columns="columns" :defaultSort="sort" :filters="filters" :currentRoute="currentRoute" :print="true" />
<simple-table :title="cars.total + ' ' + (cars.total === 1 ? 'Auto' : 'Autos')" :data="cars" :columns="columns" :defaultSort="sort" :filters="filters" :currentRoute="currentRoute" :print="true" />
</div>
</layout>
</template>