refactoring complete, now moving on to the mass actions refactoring in the datagrids and refactoring the existing grids

This commit is contained in:
Prashant Singh 2019-01-08 16:32:39 +05:30
parent dbc218243f
commit f7f4395c20
4 changed files with 210 additions and 371 deletions

View File

@ -128,16 +128,18 @@ abstract class AbsGrid
throw new \Exception('Multiple Search keys Found, Please Resolve the URL Manually');
}
$collection->where(function () use($collection, $info) {
foreach ($this->allColumns as $column) {
if($column['searchable'] == true)
$collection->orWhere($column['column'], 'like', '%'.$info['all'].'%');
}
});
if ($count_keys == 1) {
return $collection->where(function () use($collection, $info) {
foreach ($this->allColumns as $column) {
if($column['searchable'] == true)
$collection->orWhere($column['column'], 'like', '%'.$info['all'].'%');
}
});
}
} else {
if (array_keys($info)[0] == "like" || array_keys($info)[0] == "nlike") {
foreach ($info as $condition => $filter_value) {
$collection->where(
return $collection->where(
$columnName,
config("datagrid.operators.{$condition}"),
'%'.$filter_value.'%'
@ -146,13 +148,13 @@ abstract class AbsGrid
} else {
foreach ($info as $condition => $filter_value) {
if($columnType == 'datetime') {
$collection->whereDate(
return $collection->whereDate(
$columnName,
config("datagrid.operators.{$condition}"),
$filter_value
);
} else {
$collection->where(
return $collection->where(
$columnName,
config("datagrid.operators.{$condition}"),
$filter_value

View File

@ -1,257 +1,79 @@
/* Data grid css starts here */
.grid-container {
.filter-wrapper {
display: block;
box-sizing: border-box;
display: block;
width: 100%;
height: 100%;
}
.filter-row-one,
.filter-row-two {
display: flex;
flex-direction: row;
}
.filter-row-one {
height: 40px;
align-items: center;
justify-content: space-between;
.filter-row-one {
display: flex;
width: 100%;
flex-direction: row;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
}
.search-filter {
.control {
font-family: "montserrat", sans-serif;
padding-left: 10px;
width: 380px;
height: 36px;
border: 2px solid $control-border-color;
border-radius: 3px;
border-right: 0px;
border-top-right-radius: 0px;
border-bottom-right-radius: 0px;
font-size: 14px;
}
.ic-wrapper {
display: block;
height: 36px;
width: 36px;
border: 2px solid $control-border-color;
border-left: none;
border-radius: 2px;
.filter-row-two {
display: flex;
width: 100%;
flex-direction: row;
justify-content: flex-start;
align-items: center;
margin-bottom: 10px;
}
.search-icon {
margin-left: 4px;
margin-top: 4px;
height: 24px;
width: 24px;
}
}
}
.search-filter {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
.dropdown-filters {
display: inline-flex;
.more-filters {
.dropdown-toggle {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
font-family: "montserrat", sans-serif;
padding-left: 5px;
height: 36px;
width: 150px;
border: 2px solid $control-border-color;
border-radius: 2px;
background-color: $color-white;
color: $filter-toggle-color;
font-size: 14px;
.dropdown-header {
width: 100%;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
.arrow-down-icon {
margin-right: 5px;
}
}
}
.dropdown-list {
.dropdown-container {
ul {
li.filter-column-dropdown {
.filter-column-select {
width: 100%;
background: $color-white;
border: 2px solid $control-border-color;
border-radius: 3px;
height: 36px;
display: inline-block;
vertical-align: middle;
-webkit-transition: 0.2s
cubic-bezier(0.4, 0, 0.2, 1);
transition: 0.2s
cubic-bezier(0.4, 0, 0.2, 1);
padding: 0px 5px;
font-family: "montserrat", sans-serif;
margin-top: 10px;
margin-bottom: 5px;
}
}
li {
select {
background: $color-white;
border: 2px solid $control-border-color;
border-radius: 3px;
height: 36px;
width: 100%;
display: inline-block;
vertical-align: middle;
-webkit-transition: 0.2s
cubic-bezier(0.4, 0, 0.2, 1);
transition: 0.2s
cubic-bezier(0.4, 0, 0.2, 1);
padding: 0px 5px;
font-family: "montserrat", sans-serif;
margin-top: 10px;
margin-bottom: 5px;
}
input {
background: #fff;
border: 2px solid #c7c7c7;
border-radius: 3px;
height: 36px;
width: 100%;
display: inline-block;
vertical-align: middle;
-webkit-transition: 0.2s
cubic-bezier(0.4, 0, 0.2, 1);
transition: 0.2s
cubic-bezier(0.4, 0, 0.2, 1);
padding: 0px 5px;
font-family: "montserrat", sans-serif;
margin-top: 10px;
margin-bottom: 5px;
}
}
.filter-condition-dropdown-string {
display: none;
}
.filter-condition-dropdown-number {
display: none;
}
.filter-condition-dropdown-datetime {
display: none;
}
.filter-condition-dropdown-boolean {
display: none;
}
.filter-response-string {
display: none;
}
.filter-response-boolean {
display: none;
}
.filter-response-datetime {
display: none;
}
.filter-response-number {
display: none;
}
}
}
}
}
}
}
.filter-row-two {
display: flex;
flex-direction: row;
flex-wrap: wrap;
margin-top: 6px;
margin-bottom: 6px;
.filter-one {
margin-right: 10px;
.filter-name {
margin-right: 5px;
}
.filter-value {
display: inline-flex;
background: #e7e7e7;
padding-left: 5px;
color: $color-black-shade;
vertical-align: middle;
.f-value {
margin: auto;
}
.cross-icon {
margin: 5px;
height: 18px !important;
width: 18px !important;
cursor: pointer;
}
}
}
}
.control {
background: #ffffff;
border: 2px solid $control-border-color;
border-right: none;
border-top-right-radius: 0px;
border-bottom-right-radius: 0px;
border-radius: 3px;
height: 36px;
width: 360px;
padding-left: 10px;
font-size: 15px;
color: #8E8E8E;
}
.table {
thead {
.mass-action-wrapper {
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: center;
.massaction-remove {
margin-top: 4px;
margin-right: 10px;
}
.contorl:focus {
border-color: $brand-color;
}
.selected-items {
margin-right: 15px;
}
}
tr {
th.grid_head {
.icon-wrapper {
border: 2px solid $control-border-color;
border-radius: 3px;
border-top-left-radius: 0px;
border-bottom-left-radius: 0px;
height: 36px;
width: 36px;
margin-left: -1px;
.sort-down-icon, .sort-up-icon {
margin-left: 5px;
margin-top: -3px;
vertical-align: middle;
}
}
th.grid_head.sortable {
cursor: pointer;
}
th {
text-transform: capitalize;
}
}
}
tbody {
td.action {
a:first-child {
margin-right: 10px;
}
}
}
.pagination {
margin-top:20px;
.search-icon {
margin-top: 3px;
margin-left: 3px;
}
}
}
/* DataGrid css ends in here */
.dropdown-header {
display: inline-flex;
justify-content: space-between;
align-items: center;
height: 36px;
width: 100px;
border: 2px solid $control-border-color;
border-radius: 3px;
color: #8E8E8E;
padding: 0px 5px 0px 5px;
.arrow-icon-down {
float: right;
}
}

View File

@ -1,118 +1,134 @@
<div class="table">
<table>
<testgrid-filters></testgrid-filters>
@include('ui::testgrid.body', ['records' => $results['records']])
</table>
<testgrid-filters></testgrid-filters>
@push('scripts')
<script type="text/x-template" id="testgrid-filters">
<div id="testgrid-filters" class="filter-row-one" style="width: 100%; display: flex; flex-direction: row; align-items:center; justify-content: space-between;">
<div class="search-filter" style="display: inline-flex; align-items: center;">
<input type="search" id="search-field" class="control" placeholder="Search Here..." v-model="searchValue" />
<div class="ic-wrapper">
<span class="icon search-icon search-btn" v-on:click="searchCollection(searchValue)"></span>
</div>
</div>
<div class="dropdown-filters">
<div class="more-filters">
<div class="dropdown-toggle">
<div class="dropdown-header">
<span class="name">Filter</span>
<i class="icon arrow-down-icon active"></i>
</div>
{{-- start filter here --}}
<div class="grid-container">
<div class="filter-row-one" id="testgrid-filters">
<div class="search-filter">
<input type="search" id="search-field" class="control" placeholder="Search Here..." v-model="searchValue" />
<div class="icon-wrapper">
<span class="icon search-icon search-btn" v-on:click="searchCollection(searchValue)"></span>
</div>
<div class="dropdown-list bottom-right" style="display: none;">
<div class="dropdown-container">
<ul>
<li class="filter-column-dropdown">
<select class="filter-column-select" v-model="filterColumn" v-on:click="getColumnOrAlias(filterColumn)">
<option selected disabled>Select Column</option>
@foreach($results['columns'] as $column)
<option value="{{ $column['alias'] }}">
{{ $column['label'] }}
</option>
@endforeach
</select>
</li>
</div>
{{-- suitable for string columns --}}
<li class="filter-condition-dropdown-string" v-if='stringConditionSelect'>
<select class="control" v-model="stringCondition">
<option selected disabled>Select Condition</option>
<option value="like">Contains</option>
<option value="nlike">Does not contains</option>
<option value="eq">Is equal to</option>
<option value="neqs">Is not equal to</option>
</select>
</li>
<div class="dropdown-filters">
<div class="more-filters">
<div class="dropdown-toggle">
<div class="dropdown-header">
<span class="name">Filter</span>
<i class="icon arrow-down-icon active"></i>
</div>
</div>
<div class="dropdown-list bottom-right" style="display: none;">
<div class="dropdown-container">
<ul>
<li class="filter-column-dropdown">
<div class="control-group">
<select class="filter-column-select control" v-model="filterColumn" v-on:click="getColumnOrAlias(filterColumn)">
<option selected disabled>Select Column</option>
@foreach($results['columns'] as $column)
<option value="{{ $column['alias'] }}">
{{ $column['label'] }}
</option>
@endforeach
</select>
</div>
</li>
{{-- Response fields based on the type of columns to be filtered --}}
<li class="filter-condition-dropdown-string" v-if='stringCondition != null'>
<input type="text" class="control response-string" placeholder="String Value here" v-model="stringValue" />
</li>
{{-- suitable for string columns --}}
<li class="filter-condition-dropdown-string" v-if='stringConditionSelect'>
<div class="control-group">
<select class="control" v-model="stringCondition">
<option selected disabled>Select Condition</option>
<option value="like">Contains</option>
<option value="nlike">Does not contains</option>
<option value="eq">Is equal to</option>
<option value="neqs">Is not equal to</option>
</select>
</div>
</li>
{{-- suitable for numeric columns --}}
<li class="filter-condition-dropdown-number" v-if='numberConditionSelect'>
<select class="control" v-model="numberCondition">
<option selected disabled>Select Condition</option>
<option value="eq">Is equal to</option>
<option value="neqs">Is not equal to</option>
<option value="gt">Greater than</option>
<option value="lt">Less than</option>
<option value="gte">Greater than equals to</option>
<option value="lte">Less than equals to</option>
</select>
</li>
{{-- Response fields based on the type of columns to be filtered --}}
<li class="filter-condition-dropdown-string" v-if='stringCondition != null'>
<div class="control-group">
<input type="text" class="control response-string" placeholder="String Value here" v-model="stringValue" />
</div>
</li>
<li class="filter-response-number" v-if='numberCondition != null'>
<input type="number" class="control response-number" placeholder="Numeric Value here" v-model="numberValue"/>
</li>
{{-- suitable for numeric columns --}}
<li class="filter-condition-dropdown-number" v-if='numberConditionSelect'>
<div class="control-group">
<select class="control" v-model="numberCondition">
<option selected disabled>Select Condition</option>
<option value="eq">Is equal to</option>
<option value="neqs">Is not equal to</option>
<option value="gt">Greater than</option>
<option value="lt">Less than</option>
<option value="gte">Greater than equals to</option>
<option value="lte">Less than equals to</option>
</select>
</div>
</li>
{{-- suitable for boolean columns --}}
<li class="filter-condition-dropdown-boolean" v-if='booleanConditionSelect'>
<select class="control" v-model="booleanCondition">
<option selected disabled>Select Condition</option>
<option value="eq">Is equal to</option>
<option value="neqs">Is no equal to</option>
</select>
</li>
<li class="filter-response-number" v-if='numberCondition != null'>
<div class="control-group">
<input type="number" class="control response-number" placeholder="Numeric Value here" v-model="numberValue"/>
</div>
</li>
<li class="filter-condition-dropdown-boolean" v-if='booleanCondition != null'>
<select class="control" v-model="booleanValue">
<option selected disabled>Select Value</option>
<option value="1">True / Active</option>
<option value="0">False / Inactive</option>
</select>
</li>
{{-- suitable for boolean columns --}}
<li class="filter-condition-dropdown-boolean" v-if='booleanConditionSelect'>
<div class="control-group">
<select class="control" v-model="booleanCondition">
<option selected disabled>Select Condition</option>
<option value="eq">Is equal to</option>
<option value="neqs">Is no equal to</option>
</select>
</div>
</li>
{{-- suitable for date/time columns --}}
<li class="filter-condition-dropdown-datetime" v-if='datetimeConditionSelect'>
<select class="control" v-model="datetimeCondition">
<option selected disabled>Select Condition</option>
<option value="eq">Is equal to</option>
<option value="neqs">Is not equal to</option>
<option value="gt">Greater than</option>
<option value="lt">Less than</option>
<option value="gte">Greater than equals to</option>
<option value="lte">Less than equals to</option>
{{-- <option value="btw">Is Between</option> --}}
</select>
</li>
<li class="filter-condition-dropdown-boolean" v-if='booleanCondition != null'>
<div class="control-group">
<select class="control" v-model="booleanValue">
<option selected disabled>Select Value</option>
<option value="1">True / Active</option>
<option value="0">False / Inactive</option>
</select>
</div>
</li>
<li class="filter-condition-dropdown-boolean" v-if='datetimeCondition != null'>
<input class="control" v-model="datetimeValue" type="date">
</li>
{{-- suitable for date/time columns --}}
<li class="filter-condition-dropdown-datetime" v-if='datetimeConditionSelect'>
<div class="control-group">
<select class="control" v-model="datetimeCondition">
<option selected disabled>Select Condition</option>
<option value="eq">Is equal to</option>
<option value="neqs">Is not equal to</option>
<option value="gt">Greater than</option>
<option value="lt">Less than</option>
<option value="gte">Greater than equals to</option>
<option value="lte">Less than equals to</option>
{{-- <option value="btw">Is Between</option> --}}
</select>
</div>
</li>
<button class="btn btn-sm btn-primary apply-filter" v-on:click="getResponse">Apply</button>
</ul>
<li class="filter-condition-dropdown-boolean" v-if='datetimeCondition != null'>
<div class="control-group">
<input class="control" v-model="datetimeValue" type="date">
</div>
</li>
<button class="btn btn-sm btn-primary apply-filter" v-on:click="getResponse">Apply</button>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="filter-row-two" style="height: 100px; width: 100%">
<div class="filter-row-two" style="width: 100%; display: flex; flex-direction: row; justify-content: flex-start; align-items: center;">
{{-- <span class="filter-one">
<span class="filter-name">
Stock
@ -130,21 +146,24 @@
<span class="icon cross-icon"></span>
</span>
</div>
<thead>
<tr>
<th class="grid_head" id="mastercheckbox" style="width: 50px;">
<span class="checkbox">
<input type="checkbox" id="mastercheckbox">
<label class="checkbox-view" for="checkbox"></label>
</span>
</th>
@foreach($results['columns'] as $key => $column)
<th class="grid_head" data-column-alias="{{ $column['alias'] }}" data-column-name="{{ $column['column'] }}" data-column-sortable="{{ $column['sortable'] }}" data-column-type="{{ $column['type'] }}" style="width: {{ $column['width'] }}" v-on:click="sortCollection('{{ $column['alias'] }}')">{{ $column['label'] }}</th>
@endforeach
</tr>
</thead>
<slot></slot>
<table>
<thead>
<tr>
<th class="grid_head" id="mastercheckbox" style="width: 50px;">
<span class="checkbox">
<input type="checkbox" id="mastercheckbox">
<label class="checkbox-view" for="checkbox"></label>
</span>
</th>
@foreach($results['columns'] as $key => $column)
<th class="grid_head" data-column-alias="{{ $column['alias'] }}" data-column-name="{{ $column['column'] }}" data-column-sortable="{{ $column['sortable'] }}" data-column-type="{{ $column['type'] }}" style="width: {{ $column['width'] }}" v-on:click="sortCollection('{{ $column['alias'] }}')">{{ $column['label'] }}</th>
@endforeach
</tr>
</thead>
@include('ui::testgrid.body', ['records' => $results['records']])
</table>
</div>
</script>
@ -234,16 +253,12 @@
getResponse() {
if(this.type == 'string') {
console.log(this.columnOrAlias, this.stringCondition, this.stringValue);
this.formURL(this.columnOrAlias, this.stringCondition, this.stringValue)
} else if(this.type == 'number') {
console.log(this.columnOrAlias, this.numberCondition, this.numberValue);
this.formURL(this.columnOrAlias, this.numberCondition, this.numberValue);
} else if(this.type == 'boolean') {
console.log(this.columnOrAlias, this.booleanCondition, this.booleanValue);
this.formURL(this.columnOrAlias, this.booleanCondition, this.booleanValue);
} else if(this.type == 'datetime') {
console.log(this.columnOrAlias, this.datetimeCondition, this.datetimeValue);
this.formURL(this.columnOrAlias, this.datetimeCondition, this.datetimeValue);
}
},

View File

@ -1,8 +1,8 @@
const { mix } = require("laravel-mix");
require("laravel-mix-merge-manifest");
var publicPath = 'publishable/assets';
// var publicPath = "../../../public/vendor/webkul/ui/assets";
// var publicPath = 'publishable/assets';
var publicPath = "../../../public/vendor/webkul/ui/assets";
mix.setPublicPath(publicPath).mergeManifest();
mix.disableNotifications();