mirror of https://github.com/4xmen/xshop.git
parent
5bdd998c54
commit
5a3deaa61b
@ -1,11 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Models;
|
|
||||||
|
|
||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|
||||||
use Illuminate\Database\Eloquent\Model;
|
|
||||||
|
|
||||||
class user extends Model
|
|
||||||
{
|
|
||||||
use HasFactory;
|
|
||||||
}
|
|
@ -0,0 +1,38 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Providers;
|
||||||
|
|
||||||
|
use Illuminate\Support\Facades\Blade;
|
||||||
|
use Illuminate\Support\ServiceProvider;
|
||||||
|
|
||||||
|
class BladeServiceProvider extends ServiceProvider
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Register services.
|
||||||
|
*/
|
||||||
|
public function register(): void
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bootstrap services.
|
||||||
|
*/
|
||||||
|
public function boot(): void
|
||||||
|
{
|
||||||
|
//
|
||||||
|
Blade::directive('paginated', function ($expression) {
|
||||||
|
|
||||||
|
return "<?php
|
||||||
|
|
||||||
|
\$items = $expression;
|
||||||
|
\$total = \$items->total();
|
||||||
|
\$currentPage = \$items->currentPage();
|
||||||
|
\$perPage = \$items->perPage();
|
||||||
|
\$from = (\$currentPage - 1) * \$perPage + 1;
|
||||||
|
\$to = min(\$currentPage * \$perPage, \$total);
|
||||||
|
|
||||||
|
echo \"(\$from | \$to | \$total) \"; ?>";
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,88 @@
|
|||||||
|
function clearSelection()
|
||||||
|
{
|
||||||
|
if (window.getSelection) {window.getSelection().removeAllRanges();}
|
||||||
|
else if (document.selection) {document.selection.empty();}
|
||||||
|
}
|
||||||
|
|
||||||
|
window.addEventListener('load',function () {
|
||||||
|
let chkall = document.querySelectorAll(".chkall");
|
||||||
|
|
||||||
|
document.querySelector('#toggle-select').addEventListener('click',function () {
|
||||||
|
let checkboxes = document.querySelectorAll(".chkbox");
|
||||||
|
checkboxes.forEach(function(checkbox) {
|
||||||
|
if (!checkbox.checked){
|
||||||
|
checkbox.checked = true;
|
||||||
|
checkbox.setAttribute("checked", "");
|
||||||
|
}else{
|
||||||
|
checkbox.checked = false;
|
||||||
|
checkbox.removeAttribute("checked");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
// Attach an event listener for "change" and "click" events
|
||||||
|
chkall.forEach(function(chkall) {
|
||||||
|
chkall.addEventListener("change", handleCheckboxChange);
|
||||||
|
chkall.addEventListener("click", handleCheckboxChange);
|
||||||
|
});
|
||||||
|
|
||||||
|
function handleCheckboxChange() {
|
||||||
|
let isChecked = this.checked;
|
||||||
|
let table = this.closest("table");
|
||||||
|
|
||||||
|
if (isChecked) {
|
||||||
|
// Check all checkboxes in the table
|
||||||
|
let checkboxes = table.querySelectorAll(".chkbox");
|
||||||
|
checkboxes.forEach(function(checkbox) {
|
||||||
|
checkbox.checked = true;
|
||||||
|
checkbox.setAttribute("checked", "");
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// Uncheck all checkboxes in the table
|
||||||
|
let checkboxes = table.querySelectorAll(".chkbox");
|
||||||
|
checkboxes.forEach(function(checkbox) {
|
||||||
|
checkbox.checked = false;
|
||||||
|
checkbox.removeAttribute("checked");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// select with shift button
|
||||||
|
const chkboxes = document.querySelectorAll('.chkbox');
|
||||||
|
let lastChecked = null;
|
||||||
|
|
||||||
|
chkboxes.forEach(chkbox => {
|
||||||
|
chkbox.addEventListener('click', handleCheckboxClick);
|
||||||
|
chkbox.parentNode.querySelector('label').addEventListener('click', handleCheckboxClick);
|
||||||
|
});
|
||||||
|
|
||||||
|
function handleCheckboxClick(e) {
|
||||||
|
clearSelection();
|
||||||
|
|
||||||
|
let self = this;
|
||||||
|
if (e.target.tagName === 'LABEL'){
|
||||||
|
self = e.target.parentNode.querySelector('input');
|
||||||
|
}
|
||||||
|
if (!lastChecked) {
|
||||||
|
lastChecked = self;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.shiftKey) {
|
||||||
|
const start = Array.from(chkboxes).indexOf(self);
|
||||||
|
const end = Array.from(chkboxes).indexOf(lastChecked);
|
||||||
|
const range = Array.from(chkboxes).slice(Math.min(start, end) + 1, Math.max(start, end) );
|
||||||
|
|
||||||
|
range.forEach(chkbox => {
|
||||||
|
chkbox.checked = lastChecked.checked;
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
lastChecked = self;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
@ -1,20 +0,0 @@
|
|||||||
.circle-btn{
|
|
||||||
width: 75px;
|
|
||||||
height: 75px;
|
|
||||||
border-radius: 50%;
|
|
||||||
background: rgba(139, 0, 139, 0.86);
|
|
||||||
backdrop-filter: blur(4px);
|
|
||||||
border: 0;
|
|
||||||
box-shadow: 0px 3px 5px #11111177, inset 0 0 0 0 darkred;
|
|
||||||
user-select: none;
|
|
||||||
cursor: pointer;
|
|
||||||
transition: 500ms;
|
|
||||||
&:hover{
|
|
||||||
box-shadow: 0px 3px 5px #11111177, inset 0 0 0 40px darkred;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.custom-tooltip {
|
|
||||||
--bs-tooltip-bg: var(--bs-indigo);
|
|
||||||
--bs-tooltip-color: var(--bs-white);
|
|
||||||
}
|
|
@ -0,0 +1,5 @@
|
|||||||
|
#panel-breadcrumb{
|
||||||
|
height: 50px;
|
||||||
|
background: #00000033;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
@ -0,0 +1,53 @@
|
|||||||
|
body{
|
||||||
|
background: $body-bg;
|
||||||
|
}
|
||||||
|
|
||||||
|
.circle-btn{
|
||||||
|
width: 75px;
|
||||||
|
height: 75px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: $secondary-color-panel;
|
||||||
|
backdrop-filter: blur(4px);
|
||||||
|
border: 0;
|
||||||
|
box-shadow: 0px 3px 5px #11111177, inset 0 0 0 0 darkred;
|
||||||
|
user-select: none;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: 500ms;
|
||||||
|
&:hover{
|
||||||
|
box-shadow: 0px 3px 5px #11111177, inset 0 0 0 40px darkred;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.custom-tooltip {
|
||||||
|
--bs-tooltip-bg: var(--bs-indigo);
|
||||||
|
--bs-tooltip-color: var(--bs-white);
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid-equal {
|
||||||
|
display: grid;
|
||||||
|
grid-auto-columns: minmax(0, 1fr);
|
||||||
|
grid-auto-flow: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.btn,a.action-btn,a.circle-btn{
|
||||||
|
&:hover{
|
||||||
|
color:white;
|
||||||
|
i{
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.action-btn{
|
||||||
|
display: block;
|
||||||
|
font-size: 47px;
|
||||||
|
text-align: center;
|
||||||
|
i{
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
position: fixed;
|
||||||
|
inset-inline-end: 1rem;
|
||||||
|
bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,86 @@
|
|||||||
|
.item-list {
|
||||||
|
overflow: hidden;
|
||||||
|
background: $lighter-color;
|
||||||
|
//margin: 0 1rem;
|
||||||
|
border-radius: 4px;
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 25px;
|
||||||
|
padding: 1rem;
|
||||||
|
font-weight: 200;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.item-search {
|
||||||
|
form {
|
||||||
|
padding: 1rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.table-list {
|
||||||
|
width: 100%;
|
||||||
|
tr{
|
||||||
|
|
||||||
|
th{
|
||||||
|
background-color: #00000033;
|
||||||
|
background-image: url("../images/pattern.png");
|
||||||
|
}
|
||||||
|
|
||||||
|
td,th{
|
||||||
|
&:first-child{
|
||||||
|
width: 100px;
|
||||||
|
}
|
||||||
|
&:last-child{
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
vertical-align: center;
|
||||||
|
padding: .5rem;
|
||||||
|
border-bottom: 1px solid #ffffff11;
|
||||||
|
input{
|
||||||
|
margin: .5rem 1rem ;
|
||||||
|
}
|
||||||
|
a{
|
||||||
|
b{
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
td{
|
||||||
|
label{
|
||||||
|
padding: .45rem 1rem ;
|
||||||
|
cursor: pointer;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
input:checked + label{
|
||||||
|
background: lighten($primary-color-panel,10);
|
||||||
|
}
|
||||||
|
input{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:nth-child(even) td{
|
||||||
|
background: #00000010;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
&:hover{
|
||||||
|
td{
|
||||||
|
background-color: #00000044;
|
||||||
|
background-image: url("../images/pattern.png");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
tfoot th{
|
||||||
|
border-bottom: 0;
|
||||||
|
ul.pagination{
|
||||||
|
margin: 0;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -1,8 +1,10 @@
|
|||||||
// Body
|
// Body
|
||||||
$body-bg: #f8fafc;
|
$body-bg: #1b223a;
|
||||||
|
|
||||||
// Typography
|
// Typography
|
||||||
$font-family-sans-serif: 'Vazirmatn', sans-serif;
|
$font-family-sans-serif: 'Vazirmatn', sans-serif;
|
||||||
$font-size-base: 0.9rem;
|
$font-size-base: 0.9rem;
|
||||||
$line-height-base: 1.6;
|
$line-height-base: 1.6;
|
||||||
$primary-color-panel: #6e0000;
|
$primary-color-panel: #6e0000;
|
||||||
|
$secondary-color-panel: rgba(139, 0, 139, 0.86) ;
|
||||||
|
$lighter-color: #282d47;
|
@ -0,0 +1,192 @@
|
|||||||
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="mb-5 pb-5">
|
||||||
|
<div class="row">
|
||||||
|
|
||||||
|
{{-- list side bar start--}}
|
||||||
|
<div class="col-xl-3 mb-3">
|
||||||
|
<div class="item-list">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-8">
|
||||||
|
<h1>
|
||||||
|
@yield('list-title')
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
<div class="col-4 pt-3 text-end">
|
||||||
|
@if(hasRoute('trashed'))
|
||||||
|
<a class="btn btn-outline-danger me-2"
|
||||||
|
data-bs-toggle="tooltip"
|
||||||
|
data-bs-placement="top"
|
||||||
|
data-bs-custom-class="custom-tooltip"
|
||||||
|
data-bs-title="{{__("Trashed items")}}"
|
||||||
|
href="{{getRoute('trashed')}}"
|
||||||
|
>
|
||||||
|
<i class="ri-delete-bin-6-line"></i>
|
||||||
|
</a>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<form action="" class="p-2">
|
||||||
|
<div class="input-group mb-3">
|
||||||
|
<input type="text" class="form-control" placeholder="{{__("Search")}}..."
|
||||||
|
aria-label="{{__("Search")}}..." aria-describedby="button-addon2">
|
||||||
|
<button class="btn btn-outline-secondary" type="button" id="button-addon2">
|
||||||
|
<i class="ri-search-2-line"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
@yield('filter')
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{-- list side bar end--}}
|
||||||
|
|
||||||
|
|
||||||
|
{{-- list content start--}}
|
||||||
|
<div class="col-xl-9">
|
||||||
|
<div class="item-list">
|
||||||
|
<table class="table-list">
|
||||||
|
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>
|
||||||
|
<div
|
||||||
|
data-bs-toggle="tooltip"
|
||||||
|
data-bs-placement="top"
|
||||||
|
data-bs-custom-class="custom-tooltip"
|
||||||
|
data-bs-title="{{__("Check all")}}"
|
||||||
|
class="form-check form-switch mt-1 mx-2">
|
||||||
|
<input class="form-check-input chkall"
|
||||||
|
type="checkbox" role="switch">
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
@foreach($cols as $col)
|
||||||
|
<th>
|
||||||
|
<a href="?sort={{$col}}{{sortSuffix($col)}}">
|
||||||
|
{{__($col)}}
|
||||||
|
</a>
|
||||||
|
</th>
|
||||||
|
@endforeach
|
||||||
|
@yield('table-head')
|
||||||
|
<th class="text-center">
|
||||||
|
{{__("Totol")}}:
|
||||||
|
{{$items->total()}}
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach($items as $item)
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<input type="checkbox" id="chk-{{$item->id}}" class="chkbox"
|
||||||
|
name="id[{{$item->id}}]">
|
||||||
|
<label for="chk-{{$item->id}}">
|
||||||
|
{{$item->id}}
|
||||||
|
</label>
|
||||||
|
</td>
|
||||||
|
@foreach($cols as $k => $col)
|
||||||
|
@if($k == 0 && hasRoute('edit'))
|
||||||
|
<td>
|
||||||
|
<a href="{{getRoute('edit',$item->id)}}">
|
||||||
|
<b>
|
||||||
|
{{$item->name}}
|
||||||
|
</b>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
@else
|
||||||
|
<td>
|
||||||
|
{{$item->$col}}
|
||||||
|
</td>
|
||||||
|
@endif
|
||||||
|
@endforeach
|
||||||
|
@yield('table-body')
|
||||||
|
<td>
|
||||||
|
@if(hasRoute('destroy'))
|
||||||
|
<a href="{{getRoute('destroy',$item->id)}}"
|
||||||
|
class="btn btn-outline-danger btn-sm mx-1"
|
||||||
|
data-bs-toggle="tooltip"
|
||||||
|
data-bs-placement="top"
|
||||||
|
data-bs-custom-class="custom-tooltip"
|
||||||
|
data-bs-title="{{__("Remove")}}">
|
||||||
|
<i class="ri-close-line"></i>
|
||||||
|
</a>
|
||||||
|
@endif
|
||||||
|
@if(hasRoute('edit'))
|
||||||
|
<a href="{{getRoute('edit',$item->id)}}"
|
||||||
|
class="btn btn-outline-primary btn-sm mx-1"
|
||||||
|
data-bs-toggle="tooltip"
|
||||||
|
data-bs-placement="top"
|
||||||
|
data-bs-custom-class="custom-tooltip"
|
||||||
|
data-bs-title="{{__("Edit")}}">
|
||||||
|
<i class="ri-edit-2-line"></i>
|
||||||
|
</a>
|
||||||
|
@endif
|
||||||
|
@if(hasRoute('show'))
|
||||||
|
<a href="{{getRoute('show',$item->id)}}"
|
||||||
|
class="btn btn-outline-secondary btn-sm mx-1"
|
||||||
|
data-bs-toggle="tooltip"
|
||||||
|
data-bs-placement="top"
|
||||||
|
data-bs-custom-class="custom-tooltip"
|
||||||
|
data-bs-title="{{__("Show")}}">
|
||||||
|
<i class="ri-eye-line"></i>
|
||||||
|
</a>
|
||||||
|
@endif
|
||||||
|
@yield('list-btn')
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
|
||||||
|
|
||||||
|
{{-- pagination and toggle button start --}}
|
||||||
|
<tfoot>
|
||||||
|
<tr>
|
||||||
|
<th colspan="100%">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-3 text-start">
|
||||||
|
<div
|
||||||
|
id="toggle-select"
|
||||||
|
class="btn btn-outline-light mx-2"
|
||||||
|
data-bs-toggle="tooltip"
|
||||||
|
data-bs-placement="top"
|
||||||
|
data-bs-custom-class="custom-tooltip"
|
||||||
|
data-bs-title="{{__("Toggle selection")}}">
|
||||||
|
<i class="ri-toggle-line"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
{{$items->withQueryString()->links()}}
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3 text-center">
|
||||||
|
<div class="p-2" data-bs-toggle="tooltip"
|
||||||
|
data-bs-placement="top"
|
||||||
|
data-bs-custom-class="custom-tooltip"
|
||||||
|
data-bs-title="({{__("From - To - Total")}})">
|
||||||
|
@paginated($items)
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</tfoot>
|
||||||
|
{{-- pagination and toggle button end --}}
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{-- list content end--}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@if(hasRoute('create'))
|
||||||
|
<a class="action-btn circle-btn"
|
||||||
|
data-bs-toggle="tooltip"
|
||||||
|
data-bs-placement="top"
|
||||||
|
data-bs-custom-class="custom-tooltip"
|
||||||
|
data-bs-title="{{__("Add another one")}}"
|
||||||
|
href="{{getRoute('create')}}"
|
||||||
|
>
|
||||||
|
<i class="ri-add-line"></i>
|
||||||
|
</a>
|
||||||
|
@endif
|
||||||
|
@endsection
|
@ -1 +1,12 @@
|
|||||||
<?php
|
@extends('admin.templates.panel-list-template')
|
||||||
|
|
||||||
|
@section('list-title')
|
||||||
|
<i class="ri-user-3-line"></i>
|
||||||
|
{{__("Users list")}}
|
||||||
|
@endsection
|
||||||
|
@section('title')
|
||||||
|
{{__("Users list")}} |
|
||||||
|
@endsection
|
||||||
|
@section('filter')
|
||||||
|
|
||||||
|
@endsection
|
||||||
|
@ -0,0 +1,3 @@
|
|||||||
|
<nav id="panel-breadcrumb">
|
||||||
|
1
|
||||||
|
</nav>
|
Loading…
Reference in New Issue