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-bg: #f8fafc;
|
||||
$body-bg: #1b223a;
|
||||
|
||||
// Typography
|
||||
$font-family-sans-serif: 'Vazirmatn', sans-serif;
|
||||
$font-size-base: 0.9rem;
|
||||
$line-height-base: 1.6;
|
||||
$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