[WIP] Working on uploader

This commit is contained in:
Ludovic CANDELLIER
2020-06-01 01:13:01 +02:00
parent 8cf5de7f9f
commit 9acf35f5ee
55 changed files with 1496 additions and 285 deletions

View File

@@ -25,6 +25,7 @@ var jsMain = [
'node_modules/jqtree/tree.jquery.js',
'node_modules/numeral/min/numeral.min.js',
'node_modules/numeral/min/locales/fr.min.js',
'build/js/include/plugins/jquery.hcaptions.js',
'build/js/include/url_on_tab.js',
'build/js/include/set_options.js',
// 'build/js/include/confirm.js',

View File

@@ -19,11 +19,7 @@ class ArticleFamiliesDataTable extends DataTable
{
return [
Column::make('name'),
Column::computed('action')
->exportable(false)
->printable(false)
->width(120)
->addClass('text-center'),
self::makeColumnButtons(),
];
}

View File

@@ -20,6 +20,7 @@ class TagGroupsDataTable extends DataTable
{
return [
Column::make('name'),
Column::make('tags_count')->title('Nb de tags')->searchable(false)->addClass('text-right'),
self::makeColumnButtons(),
];
}

View File

@@ -12,13 +12,16 @@ class TagsDataTable extends DataTable
public function query(Tag $model)
{
$model = $model::with('group')->select(['tagging_tags.*']);
return self::buildQuery($model);
}
protected function getColumns()
{
return [
Column::make('name'),
Column::make('group.name')->title('Groupe'),
Column::make('order')->title('Ordre'),
Column::make('name')->title('Nom'),
self::makeColumnButtons(),
];
}

View File

@@ -7,6 +7,7 @@ use App\Http\Controllers\Controller;
use App\Repositories\Botanic\Varieties;
use App\Repositories\Botanic\Species;
use App\Repositories\Shop\TagGroups;
use App\DataTables\Botanic\VarietiesDataTable;
use App\Models\Shop\Variety;
@@ -30,25 +31,32 @@ class VarietyController extends Controller
public function create()
{
return view('Botanic.Admin.Varieties.create');
$data['tags_list'] = TagGroups::getTreeTags();
return view('Botanic.Admin.Varieties.create', $data);
}
public function store(Request $request)
{
$ret = Varieties::store($request);
$data = $request->all();
$images = isset($data['images']) ? $data['images'] : false;
// dump($images);
// exit;
unset($data['images']);
$variety = Varieties::store($data);
Varieties::storeImages($variety, $images);
return redirect()->route('Botanic.Admin.Varieties.index');
}
public function show($id)
{
$data = Varieties::get($id);
return view('Botanic.Admin.Varieties.view', $data);
return view('Botanic.Admin.Varieties.view', Varieties::get($id));
}
public function edit($id)
{
$data = Varieties::get($id);
$data = Varieties::getWithImages($id)->toArray();
$data['species'] = Species::getOptions();
$data['tags_list'] = TagGroups::getTreeTags();
return view('Botanic.Admin.Varieties.edit', $data);
}
@@ -57,4 +65,9 @@ class VarietyController extends Controller
return Varieties::destroy($id);
}
public function deleteImage($id)
{
}
}

View File

@@ -9,6 +9,7 @@ use App\Repositories\Shop\Articles;
use App\Repositories\Shop\ArticleAttributeFamilies;
use App\Repositories\Shop\ArticleFamilies;
use App\Repositories\Shop\Categories;
use App\Repositories\Shop\TagGroups;
use App\DataTables\Shop\ArticlesDataTable;
class ArticleController extends Controller
@@ -29,6 +30,7 @@ class ArticleController extends Controller
$data['categories'] = Categories::getOptions();
$data['families'] = ArticleFamilies::getOptions();
$data['attribute_families'] = ArticleAttributeFamilies::getOptions();
$data['tags_list'] = TagGroups::getTreeTags();
$data['models'] = ['App\Models\Botanic\Specie' => 'Espèces', 'App\Models\Botanic\Variety' => 'Variétés'];
return view('Shop.Admin.Articles.create', $data);
}
@@ -49,6 +51,10 @@ class ArticleController extends Controller
{
$data = Articles::get($id);
$data['categories'] = Articles::getOptions();
$data['families'] = ArticleFamilies::getOptions();
$data['attribute_families'] = ArticleAttributeFamilies::getOptions();
$data['tags_list'] = TagGroups::getTreeTags();
$data['models'] = ['App\Models\Botanic\Specie' => 'Espèces', 'App\Models\Botanic\Variety' => 'Variétés'];
return view('Shop.Admin.Articles.edit', $data);
}

View File

@@ -24,6 +24,7 @@ class CategoryController extends Controller
public function create()
{
$data = [];
$data['category_id'] = 0;
$data['categories'] = Categories::getOptions();
return view('Shop.Admin.Categories.create', $data);
}
@@ -42,7 +43,7 @@ class CategoryController extends Controller
public function edit($id)
{
$data = Categories::get($id);
$data = Categories::get($id)->toArray();
$data['categories'] = Categories::getOptions();
return view('Shop.Admin.Categories.edit', $data);
}

View File

@@ -3,9 +3,13 @@
namespace App\Models\Botanic;
use Illuminate\Database\Eloquent\Model;
use Spatie\MediaLibrary\HasMedia\HasMedia;
use Spatie\MediaLibrary\HasMedia\HasMediaTrait;
class Variety extends Model
class Variety extends Model implements HasMedia
{
use HasMediaTrait;
protected $guarded = ['id'];
protected $table = 'botanic_varieties';
@@ -13,4 +17,9 @@ class Variety extends Model
{
return $this->belongsTo('App\Models\Botanic\Specie');
}
public function Articles()
{
return $this->belongsTo('App\Models\Shop\Article','id','model_id');
}
}

View File

@@ -3,7 +3,8 @@
namespace App\Models\Shop;
use Illuminate\Database\Eloquent\Model;
use Spatie\MediaLibrary\HasMedia\HasMedia;
use Spatie\MediaLibrary\HasMedia\HasMediaTrait;
use Rinvex\Categories\Traits\Categorizable;
use Conner\Tagging\Taggable;
@@ -11,6 +12,7 @@ class Article extends Model
{
use Categorizable;
use Taggable;
use HasMediaTrait;
protected $guarded = ['id'];
protected $table = 'shop_articles';

View File

@@ -9,10 +9,9 @@ class Tag extends Model
protected $guarded = ['id'];
protected $table = 'tagging_tags';
public function group()
{
return $this->hasOne('App\Models\Shop\TagGroup');
return $this->hasOne('App\Models\Shop\TagGroup','id','tag_group_id');
}
}

View File

@@ -45,11 +45,20 @@ class Varieties
return Variety::find($id);
}
public static function getWithImages($id)
{
$variety = self::get($id);
$variety->getMedia();
// $variety = $variety->toArray();
foreach ($variety->media as $key => $media) {
$variety->media[$key]['url'] = $media->getUrl();
}
return $variety;
}
public static function store($data)
{
$id = isset($data['id']) ? $data['id'] : false;
$item = $id ? self::update($data) : self::create($data);
return $item->id;
return isset($data['id']) ? self::update($data) : self::create($data);
}
public static function create($data)
@@ -59,7 +68,9 @@ class Varieties
public static function update($data)
{
return Variety::find($id)->update($data);
$variety = self::get($data['id']);
$variety->update($data);
return $variety;
}
public static function destroy($id)
@@ -67,4 +78,13 @@ class Varieties
return Variety::destroy($id);
}
public static function storeImages($variety, $files)
{
if ($files) {
foreach ($files as $file) {
$variety->addMedia($file)->toMediaCollection('images');
}
}
}
}

View File

@@ -8,25 +8,25 @@ use Illuminate\Support\Str;
use Yajra\DataTables\DataTables;
use App\Models\Shop\Article;
use App\Models\Shop\ArticleComponent;
class Articles
class ArticleComponents
{
public static function getDatatable()
{
$model = Article::orderBy('name');
$model = ArticleComponent::orderBy('name');
return Datatables::of($model)->make(true);
}
public static function getAll()
{
return Article::orderBy('name','asc')->get();
return ArticleComponent::orderBy('name','asc')->get();
}
public static function get($id)
{
return Article::find($id);
return ArticleComponent::find($id);
}
public static function store($data)
@@ -38,17 +38,17 @@ class Articles
public static function create($data)
{
return Article::create($data);
return ArticleComponent::create($data);
}
public static function update($data)
{
return Article::find($id)->update($data);
return ArticleComponent::find($id)->update($data);
}
public static function destroy($id)
{
return Article::destroy($id);
return ArticleComponent::destroy($id);
}
}

View File

@@ -2,10 +2,6 @@
namespace App\Repositories\Shop;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use Yajra\DataTables\DataTables;
use App\Models\Shop\TagGroup;
@@ -24,6 +20,23 @@ class TagGroups
return TagGroup::get()->SortBy('name')->pluck('name','id')->toArray();
}
public static function getTreeTags()
{
$items = TagGroup::with('tags')->get();
$tags = [];
foreach ($items as $group) {
$group_tags = [];
foreach ($group->tags as $tag) {
$group_tags[$tag->id] = $tag->name;
}
$tags[] = [
'label' => $group->name,
'options' => $group_tags,
];
}
return $tags;
}
public static function getAll()
{
return TagGroup::orderBy('name','asc')->get();

View File

@@ -8,25 +8,30 @@ use Illuminate\Support\Str;
use Yajra\DataTables\DataTables;
use App\Models\Shop\TagGroup;
use App\Models\Shop\Tag;
class TagGroups
class Tags
{
public static function getDatatable()
{
$model = TagGroup::orderBy('name');
$model = Tag::orderBy('name');
return Datatables::of($model)->make(true);
}
public static function getOptions()
{
return Tag::get()->pluck('name','id')->toArray();
}
public static function getAll()
{
return TagGroup::orderBy('name','asc')->get();
return Tag::orderBy('order','asc')->get();
}
public static function get($id)
{
return TagGroup::find($id);
return Tag::find($id);
}
public static function store($data)
@@ -38,17 +43,17 @@ class TagGroups
public static function create($data)
{
return TagGroup::create($data);
return Tag::create($data);
}
public static function update($data)
{
return TagGroup::find($id)->update($data);
return Tag::find($id)->update($data);
}
public static function destroy($id)
{
return TagGroup::destroy($id);
return Tag::destroy($id);
}
}

View File

@@ -13,7 +13,7 @@ function renderContractDriveTPL(filename, data, selector) {
function getTemplate(file, data) {
var source = getSource(file);
var template = Handlebars.compile(source);
return template(data);
return template(data);
}
function getSource(file) {
@@ -21,11 +21,11 @@ function getSource(file) {
$.ajax({
async: false,
dataType: 'html',
type: 'GET',
url: file + '?' + Date.now(),
success: function(data) {
source = data;
}
type: 'GET',
url: file + '?' + Date.now(),
success: function(data) {
source = data;
}
});
return source;
}

View File

@@ -0,0 +1,241 @@
(function($){
var Captions = function(el, opts) {
var _this = this,
$this = $(el),
$el = $this.clone(),
href = $this.attr('href'),
$target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))), //strip for ie7
_overlay_css = {};
if ( ! $target.length )
{
$target = $this.next(opts.data_selector);
}
if ($target.length) {
this.set_from_attr(el, opts);
$wrap = $('<div class="drop-panel" />',{position: 'relative', 'z-index': 1, display: 'block', overflow: 'hidden'})
.append($el)
.append($target);
$this.replaceWith($wrap);
$target.hide();
$wrap.css({ 'position':'relative', 'overflow':'hidden', display: 'block', padding:'2px' });
if (opts.find_image && $this.not('img'))
{
var img = $wrap.find('img'),
w = img.width(),
h = img.height();
}
else {
var w = $wrap.outerWidth(),
h = $wrap.outerHeight();
}
var overlay_w = opts.width || w,
overlay_h = opts.height || h;
$target.css({ 'width':overlay_w, 'height':overlay_h, 'position':'absolute', 'z-index':33, overflow: 'hidden' });
var _overlay_css = {};
if (opts.overlay_bg) {
_overlay_css.background = opts.overlay_bg;
}
if (opts.overlay_opacity<1) {
_overlay_css.opacity = opts.overlay_opacity;
}
// CSS: Overlay X Position
_overlay_css.left = (opts.overlay_x == 'left')
? 0
: (opts.overlay_x == 'right')
? w-overlay_w
: (w - overlay_w) / 2 + 'px';
// CSS: Overlay Y Position
_overlay_css.top = (opts.overlay_y == 'top')
? 0
: (opts.overlay_y == 'bottom')
? h-overlay_h
: (h - overlay_h) / 2 + 'px';
// CSS: Apply rules
$target.css(_overlay_css);
// slide effect
if (opts.effect=='slide') {
var slide_css = {};
switch (opts.direction) {
case 'top':
slide_css.top = '-'+overlay_h+'px';
break;
case 'bottom':
slide_css.top = h+'px';
break;
case 'left':
slide_css.left = '-'+overlay_w+'px';
break;
case 'right':
default:
slide_css.left = w+'px';
break;
}
// Apply Slide rules
$target.css('z-index',opts.zindex+1).css(slide_css);
// Hover events
$wrap.hover(function(){
$target.show().stop(true, true).animate({ 'top': _overlay_css.top, 'left': _overlay_css.left }, +opts.speed, opts.onshow());
}, function(){
$target.show().stop(true, true).animate(slide_css, +opts.speed, opts.onhide());
});
// fade effect
} else if (opts.effect=='fade') {
$target.css('z-index',opts.zindex+1).hide();
$wrap.hover(function () {
$target.stop(true, true).fadeIn(+opts.speed, opts.onshow());
}, function () {
$target.stop(true, true).fadeOut(+opts.speed, opts.onhide());
});
// just show/hide
} else {
$target.css('z-index',opts.zindex+1).hide();
$wrap.hover(function () {
$target.show(0, opts.onshow());
}, function () {
$target.hide(0, opts.onhide());
});
}
}
};
Captions.prototype = {
constructor: Captions,
set_from_attr: function(el, opt){
var cfg={},
attrs=el.attributes,
l=attrs.length;
for (var i=0; i<l; i++)
{
attr = attrs.item(i);
if (/cap-/i.test(attr.nodeName))
{
opt[attr.nodeName.replace('cap-', '')] = attr.nodeValue;
}
}
}
};
$.fn.hcaptions = function (option) {
return this.each(function () {
var $this = $(this)
, data = $this.data('captions')
, options = $.extend({}, $.fn.hcaptions.defaults, $this.data(), typeof option == 'object' && option);
if (!data) $this.data('captions', (data = new Captions(this, options)));
if (typeof option == 'string') data[option]();
});
};
$.fn.hcaptions.defaults = {
/**
* Selector for caption content
* @type {String}
*/
data_selector: '.cap-overlay',
/**
* Overlay width
* @default full width
* @type {Number}
*/
width: 0,
/**
* Overlay height
* @type {Number}
*/
height: 0,
/**
* Horizontal position for the overlay
* @options [center, left, right]
* @type {String}
*/
overlay_x: 'center',
/**
* Vertical position for the overlay
* @options [center, top, bottom]
* @type {String}
*/
overlay_y: 'center',
/**
* Background css for overlay
* @type {String}
*/
overlay_bg: '',
/**
* Opacity of overlay
* @type {Number}
*/
overlay_opacity: 1,
/**
* Effect of overlay
* @options [fade, slide, show/hide]
* @type {String}
*/
effect: 'slide',
/**
* Animation speed in ms
* @type {Number}
*/
speed: 400,
/**
* Direction of overlay
* @options [top, bottom, right, left]
* @type {String}
*/
direction: 'top',
/**
* Z-Index Base
* @type {Number}
*/
zindex: 2,
find_image: false,
/**
* On show callback
* @return {[type]} [description]
*/
onshow: function(){},
/**
* On hide callback
* @return {[type]} [description]
*/
onhide: function(){}
};
})(jQuery);

View File

@@ -0,0 +1,487 @@
.tool-container, .tool-item, .btn-toolbar {
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
box-sizing: content-box;
}
.btn-toolbar {
background: #364347;
width: 20px;
height: 20px;
text-align: center;
padding: 10px;
border-radius: 6px;
display: block;
transition: none;
}
.btn-toolbar > i {
color: #02baf2;
font-size: 16px;
}
.btn-toolbar:hover {
background: #02baf2;
cursor: pointer;
}
.btn-toolbar:hover > i {
color: white;
}
.btn-toolbar-primary {
background-color: #009dcd;
}
.btn-toolbar-primary.pressed {
background-color: #02baf2;
}
.btn-toolbar-primary:hover {
background-color: #02baf2;
}
.btn-toolbar-primary > i {
color: white;
}
.btn-toolbar-danger {
background-color: #cc0000;
}
.btn-toolbar-danger.pressed {
background-color: #f84545;
}
.btn-toolbar-danger:hover {
background-color: #f84545;
}
.btn-toolbar-danger > i {
color: white;
}
.btn-toolbar-warning {
background-color: #f3bc65;
}
.btn-toolbar-warning.pressed {
background-color: #fad46b;
}
.btn-toolbar-warning:hover {
background-color: #fad46b;
}
.btn-toolbar-warning > i {
color: white;
}
.btn-toolbar-info {
background-color: #e96300;
}
.btn-toolbar-info.pressed {
background-color: #f58410;
}
.btn-toolbar-info:hover {
background-color: #f58410;
}
.btn-toolbar-info > i {
color: white;
}
.btn-toolbar-success {
background-color: #28948c;
}
.btn-toolbar-success.pressed {
background-color: #3eb5ac;
}
.btn-toolbar-success:hover {
background-color: #3eb5ac;
}
.btn-toolbar-success > i {
color: white;
}
.btn-toolbar-info-o {
background-color: #9175bd;
}
.btn-toolbar-info-o.pressed {
background-color: #a88cd5;
}
.btn-toolbar-info-o:hover {
background-color: #a88cd5;
}
.btn-toolbar-info-o > i {
color: white;
}
.btn-toolbar-light {
background-color: #b2c6cd;
}
.btn-toolbar-light.pressed {
background-color: #d6e1e5;
}
.btn-toolbar-light:hover {
background-color: #d6e1e5;
}
.btn-toolbar-light > i {
color: white;
}
.btn-toolbar-dark {
background-color: #364347;
}
.btn-toolbar-dark.pressed {
background-color: #5e696d;
}
.btn-toolbar-dark:hover {
background-color: #5e696d;
}
.btn-toolbar-dark > i {
color: white;
}
.tool-container {
background-color: #5e696d;
background-size: 100% 100%;
border-radius: 6px;
position: absolute;
}
.tool-container.tool-top,
.tool-container.tool-bottom {
height: 40px;
border-bottom: 0px solid #beb8b8;
}
.tool-container.tool-top .tool-item,
.tool-container.tool-bottom .tool-item {
float: left;
border-right: 0;
border-left: 0;
}
.tool-item {
height: 100%;
display: block;
width: 20px;
height: 20px;
text-align: center;
padding: 10px;
transition: none;
}
.tool-item > .fa {
color: #b2c6cd;
}
.tool-item.selected,
.tool-item:hover {
background: #02baf2;
}
.tool-item.selected > .fa,
.tool-item:hover > .fa {
color: white;
}
.tool-top .tool-item:first-child:hover,
.tool-bottom .tool-item:first-child:hover {
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
}
.tool-top .tool-item:last-child:hover,
.tool-bottom .tool-item:last-child:hover {
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
}
.tool-vertical-top .tool-item:first-child:hover,
.tool-vertical-bottom .tool-item:first-child:hover,
.tool-right .tool-item:first-child:hover,
.tool-left .tool-item:first-child:hover {
border-top-left-radius: 6px;
border-top-right-radius: 6px;
}
.tool-vertical-top .tool-item:last-child:hover,
.tool-vertical-bottom .tool-item:last-child:hover,
.tool-right .tool-item:last-child:hover,
.tool-left .tool-item:last-child:hover {
border-bottom-left-radius: 6px;
border-bottom-right-radius: 6px;
}
.tool-container .arrow {
width: 0;
height: 0;
position: absolute;
border-width: 7px;
border-style: solid;
}
.tool-container.tool-top .arrow {
border-color: #5e696d transparent transparent;
left: 50%;
bottom: -14px;
margin-left: -7px;
}
.tool-container.tool-bottom .arrow {
border-color: transparent transparent #5e696d;
left: 50%;
top: -14px;
margin-left: -7px;
}
.tool-container.tool-left .arrow {
border-color: transparent transparent transparent #5e696d;
top: 50%;
right: -14px;
margin-top: -7px;
}
.tool-container.tool-right .arrow {
border-color: transparent #5e696d transparent transparent;
top: 50%;
left: -14px;
margin-top: -7px;
}
.toolbar-primary {
background-color: #02baf2;
}
.toolbar-primary.tool-top .arrow {
border-color: #02baf2 transparent transparent;
}
.toolbar-primary.tool-bottom .arrow {
border-color: transparent transparent #02baf2;
}
.toolbar-primary.tool-left .arrow {
border-color: transparent transparent transparent #02baf2;
}
.toolbar-primary.tool-right .arrow {
border-color: transparent #02baf2 transparent transparent;
}
.toolbar-primary .tool-item > .fa {
color: white;
}
.toolbar-primary .tool-item.selected,
.toolbar-primary .tool-item:hover {
background: #009dcd;
color: white;
}
.toolbar-danger {
background-color: #f84545;
}
.toolbar-danger.tool-top .arrow {
border-color: #f84545 transparent transparent;
}
.toolbar-danger.tool-bottom .arrow {
border-color: transparent transparent #f84545;
}
.toolbar-danger.tool-left .arrow {
border-color: transparent transparent transparent #f84545;
}
.toolbar-danger.tool-right .arrow {
border-color: transparent #f84545 transparent transparent;
}
.toolbar-danger .tool-item > .fa {
color: white;
}
.toolbar-danger .tool-item.selected,
.toolbar-danger .tool-item:hover {
background: #cc0000;
color: white;
}
.toolbar-warning {
background-color: #f3bc65;
}
.toolbar-warning.tool-top .arrow {
border-color: #f3bc65 transparent transparent;
}
.toolbar-warning.tool-bottom .arrow {
border-color: transparent transparent #f3bc65;
}
.toolbar-warning.tool-left .arrow {
border-color: transparent transparent transparent #f3bc65;
}
.toolbar-warning.tool-right .arrow {
border-color: transparent #f3bc65 transparent transparent;
}
.toolbar-warning .tool-item > .fa {
color: white;
}
.toolbar-warning .tool-item.selected,
.toolbar-warning .tool-item:hover {
background: #fad46b;
color: white;
}
.toolbar-info {
background-color: #e96300;
}
.toolbar-info.tool-top .arrow {
border-color: #e96300 transparent transparent;
}
.toolbar-info.tool-bottom .arrow {
border-color: transparent transparent #e96300;
}
.toolbar-info.tool-left .arrow {
border-color: transparent transparent transparent #e96300;
}
.toolbar-info.tool-right .arrow {
border-color: transparent #e96300 transparent transparent;
}
.toolbar-info .tool-item > .fa {
color: white;
}
.toolbar-info .tool-item.selected,
.toolbar-info .tool-item:hover {
background: #f58410;
color: white;
}
.toolbar-success {
background-color: #28948c;
}
.toolbar-success.tool-top .arrow {
border-color: #28948c transparent transparent;
}
.toolbar-success.tool-bottom .arrow {
border-color: transparent transparent #28948c;
}
.toolbar-success.tool-left .arrow {
border-color: transparent transparent transparent #28948c;
}
.toolbar-success.tool-right .arrow {
border-color: transparent #28948c transparent transparent;
}
.toolbar-success .tool-item > .fa {
color: white;
}
.toolbar-success .tool-item.selected,
.toolbar-success .tool-item:hover {
background: #3eb5ac;
color: white;
}
.toolbar-info-o {
background-color: #9175bd;
}
.toolbar-info-o.tool-top .arrow {
border-color: #9175bd transparent transparent;
}
.toolbar-info-o.tool-bottom .arrow {
border-color: transparent transparent #9175bd;
}
.toolbar-info-o.tool-left .arrow {
border-color: transparent transparent transparent #9175bd;
}
.toolbar-info-o.tool-right .arrow {
border-color: transparent #9175bd transparent transparent;
}
.toolbar-info-o .tool-item > .fa {
color: white;
}
.toolbar-info-o .tool-item.selected,
.toolbar-info-o .tool-item:hover {
background: #a88cd5;
color: white;
}
.toolbar-light {
background-color: #b2c6cd;
}
.toolbar-light.tool-top .arrow {
border-color: #b2c6cd transparent transparent;
}
.toolbar-light.tool-bottom .arrow {
border-color: transparent transparent #b2c6cd;
}
.toolbar-light.tool-left .arrow {
border-color: transparent transparent transparent #b2c6cd;
}
.toolbar-light.tool-right .arrow {
border-color: transparent #b2c6cd transparent transparent;
}
.toolbar-light .tool-item > .fa {
color: white;
}
.toolbar-light .tool-item.selected,
.toolbar-light .tool-item:hover {
background: #d6e1e5;
color: white;
}
.toolbar-dark {
background-color: #364347;
}
.toolbar-dark.tool-top .arrow {
border-color: #364347 transparent transparent;
}
.toolbar-dark.tool-bottom .arrow {
border-color: transparent transparent #364347;
}
.toolbar-dark.tool-left .arrow {
border-color: transparent transparent transparent #364347;
}
.toolbar-dark.tool-right .arrow {
border-color: transparent #364347 transparent transparent;
}
.toolbar-dark .tool-item > .fa {
color: white;
}
.toolbar-dark .tool-item.selected,
.toolbar-dark .tool-item:hover {
background: #5e696d;
color: white;
}
.animate-standard {
-webkit-animation: standardAnimate 0.3s 1 ease;
}
.animate-flyin {
-webkit-animation: rotateAnimate 0.5s 1 ease;
}
.animate-grow {
-webkit-animation: growAnimate 0.4s 1 ease;
}
.animate-flip {
-webkit-animation: flipAnimate 0.4s 1 ease;
}
.animate-bounce {
-webkit-animation: bounceAnimate 0.4s 1 ease-out;
}
@-webkit-keyframes rotateAnimate {
from {
transform: rotate(180deg) translate(-120px);
opacity: 0;
}
to {
transform: rotate(0deg) translate(0px);
opacity: 1;
}
}
@-webkit-keyframes standardAnimate {
from {
transform: translateY(20px);
opacity: 0;
}
to {
transform: translateY(0px);
opacity: 1;
}
}
@-webkit-keyframes growAnimate {
0% {
transform: scale(0) translateY(40px);
opacity: 0;
}
70% {
transform: scale(1.5) translate(0px);
}
100% {
transform: scale(1) translate(0px);
opacity: 1;
}
}
@-webkit-keyframes rotate2Animate {
from {
transform: rotate(-90deg);
transform-origin: 0% 100%;
opacity: 0;
}
to {
transform: rotate(0deg);
opacity: 1;
}
}
@-webkit-keyframes flipAnimate {
from {
transform: rotate3d(2, 2, 2, 180deg);
opacity: 0;
}
to {
transform: rotate3d(0, 0, 0, 0deg);
opacity: 1;
}
}
@-webkit-keyframes bounceAnimate {
0% {
transform: translateY(40px);
opacity: 0;
}
30% {
transform: translateY(-40px);
}
70% {
transform: translateY(20px);
}
100% {
transform: translateY(0px);
opacity: 1;
}
}
.hidden {
display: none;
}

View File

@@ -0,0 +1,307 @@
/**
* Toolbar.js
*
* @fileoverview jQuery plugin that creates tooltip style toolbars.
* @link http://paulkinzett.github.com/toolbar/
* @author Paul Kinzett (http://kinzett.co.nz/)
* @version 1.1.0
* @requires jQuery 1.7+
*
* @license jQuery Toolbar Plugin v1.1.0
* http://paulkinzett.github.com/toolbar/
* Copyright 2013 - 2015 Paul Kinzett (http://kinzett.co.nz/)
* Released under the MIT license.
* <https://raw.github.com/paulkinzett/toolbar/master/LICENSE.txt>
*/
if ( typeof Object.create !== 'function' ) {
Object.create = function( obj ) {
function F() {}
F.prototype = obj;
return new F();
};
}
(function( $, window, document, undefined ) {
var ToolBar = {
init: function( options, elem ) {
var self = this;
self.elem = elem;
self.$elem = $( elem );
self.options = $.extend( {}, $.fn.toolbar.options, options );
self.metadata = self.$elem.data();
self.overrideOptions();
self.toolbar = $('<div class="tool-container" />')
.addClass('tool-'+self.options.position)
.addClass('toolbar-'+self.options.style)
.append('<div class="tool-items" />')
.append('<div class="arrow" />')
.appendTo('body')
.css('opacity', 0)
.hide();
self.toolbar_arrow = self.toolbar.find('.arrow');
self.initializeToolbar();
},
overrideOptions: function() {
var self = this;
$.each( self.options, function( $option ) {
if (typeof(self.$elem.data('toolbar-'+$option)) != "undefined") {
self.options[$option] = self.$elem.data('toolbar-'+$option);
}
});
},
initializeToolbar: function() {
var self = this;
self.populateContent();
self.setTrigger();
self.toolbarWidth = self.toolbar.width();
},
setTrigger: function() {
var self = this;
if (self.options.event != 'click') {
var moveTime;
function decideTimeout () {
if (self.$elem.hasClass('pressed')) {
moveTime = setTimeout(function() {
self.hide();
}, 150);
} else {
clearTimeout(moveTime);
};
};
self.$elem.on({
mouseenter: function(event) {
if (self.$elem.hasClass('pressed')) {
clearTimeout(moveTime);
} else {
self.show();
}
}
});
self.$elem.parent().on({
mouseleave: function(event){ decideTimeout(); }
});
$('.tool-container').on({
mouseenter: function(event){ clearTimeout(moveTime); },
mouseleave: function(event){ decideTimeout(); }
});
}
if (self.options.event == 'click') {
self.$elem.on('click', function(event) {
event.preventDefault();
if(self.$elem.hasClass('pressed')) {
self.hide();
} else {
self.show();
}
});
if (self.options.hideOnClick) {
$('html').on("click.toolbar", function ( event ) {
if (event.target != self.elem &&
self.$elem.has(event.target).length === 0 &&
self.toolbar.has(event.target).length === 0 &&
self.toolbar.is(":visible")) {
self.hide();
}
});
}
}
if (self.options.hover) {
var moveTime;
function decideTimeout () {
if (self.$elem.hasClass('pressed')) {
moveTime = setTimeout(function() {
self.hide();
}, 150);
} else {
clearTimeout(moveTime);
};
};
self.$elem.on({
mouseenter: function(event) {
if (self.$elem.hasClass('pressed')) {
clearTimeout(moveTime);
} else {
self.show();
}
}
});
self.$elem.parent().on({
mouseleave: function(event){ decideTimeout(); }
});
$('.tool-container').on({
mouseenter: function(event){ clearTimeout(moveTime); },
mouseleave: function(event){ decideTimeout(); }
});
}
$(window).resize(function( event ) {
event.stopPropagation();
if ( self.toolbar.is(":visible") ) {
self.toolbarCss = self.getCoordinates(self.options.position, 20);
self.collisionDetection();
self.toolbar.css( self.toolbarCss );
self.toolbar_arrow.css( self.arrowCss );
}
});
},
populateContent: function() {
var self = this;
var location = self.toolbar.find('.tool-items');
var content = $(self.options.content).clone( true ).find('a').addClass('tool-item');
location.html(content);
location.find('.tool-item').on('click', function(event) {
event.preventDefault();
self.$elem.trigger('toolbarItemClick', this);
});
},
calculatePosition: function() {
var self = this;
self.arrowCss = {};
self.toolbarCss = self.getCoordinates(self.options.position, self.options.adjustment);
self.toolbarCss.position = 'absolute';
self.toolbarCss.zIndex = self.options.zIndex;
self.collisionDetection();
self.toolbar.css(self.toolbarCss);
self.toolbar_arrow.css(self.arrowCss);
},
getCoordinates: function( position, adjustment ) {
var self = this;
self.coordinates = self.$elem.offset();
if (self.options.adjustment && self.options.adjustment[self.options.position]) {
adjustment = self.options.adjustment[self.options.position] + adjustment;
}
switch(self.options.position) {
case 'top':
return {
left: self.coordinates.left-(self.toolbar.width()/2)+(self.$elem.outerWidth()/2),
top: self.coordinates.top-self.$elem.outerHeight()-adjustment,
right: 'auto'
};
case 'left':
return {
left: self.coordinates.left-(self.toolbar.width()/2)-(self.$elem.outerWidth()/2)-adjustment,
top: self.coordinates.top-(self.toolbar.height()/2)+(self.$elem.outerHeight()/2),
right: 'auto'
};
case 'right':
return {
left: self.coordinates.left+(self.toolbar.width()/2)+(self.$elem.outerWidth()/2)+adjustment,
top: self.coordinates.top-(self.toolbar.height()/2)+(self.$elem.outerHeight()/2),
right: 'auto'
};
case 'bottom':
return {
left: self.coordinates.left-(self.toolbar.width()/2)+(self.$elem.outerWidth()/2),
top: self.coordinates.top+self.$elem.outerHeight()+adjustment,
right: 'auto'
};
}
},
collisionDetection: function() {
var self = this;
var edgeOffset = 20;
if(self.options.position == 'top' || self.options.position == 'bottom') {
self.arrowCss = {left: '50%', right: '50%'};
if( self.toolbarCss.left < edgeOffset ) {
self.toolbarCss.left = edgeOffset;
self.arrowCss.left = self.$elem.offset().left + self.$elem.width()/2-(edgeOffset);
}
else if(($(window).width() - (self.toolbarCss.left + self.toolbarWidth)) < edgeOffset) {
self.toolbarCss.right = edgeOffset;
self.toolbarCss.left = 'auto';
self.arrowCss.left = 'auto';
self.arrowCss.right = ($(window).width()-self.$elem.offset().left)-(self.$elem.width()/2)-(edgeOffset)-5;
}
}
},
show: function() {
var self = this;
self.$elem.addClass('pressed');
self.calculatePosition();
self.toolbar.show().css({'opacity': 1}).addClass('animate-'+self.options.animation);
self.$elem.trigger('toolbarShown');
},
hide: function() {
var self = this;
var animation = {'opacity': 0};
self.$elem.removeClass('pressed');
switch(self.options.position) {
case 'top':
animation.top = '+=20';
break;
case 'left':
animation.left = '+=20';
break;
case 'right':
animation.left = '-=20';
break;
case 'bottom':
animation.top = '-=20';
break;
}
self.toolbar.animate(animation, 200, function() {
self.toolbar.hide();
});
self.$elem.trigger('toolbarHidden');
},
getToolbarElement: function () {
return this.toolbar.find('.tool-items');
}
};
$.fn.toolbar = function( options ) {
if ($.isPlainObject( options )) {
return this.each(function() {
var toolbarObj = Object.create( ToolBar );
toolbarObj.init( options, this );
$(this).data('toolbarObj', toolbarObj);
});
} else if ( typeof options === 'string' && options.indexOf('_') !== 0 ) {
var toolbarObj = $(this).data('toolbarObj');
var method = toolbarObj[options];
return method.apply(toolbarObj, $.makeArray(arguments).slice(1));
}
};
$.fn.toolbar.options = {
content: '#myContent',
position: 'top',
hideOnClick: false,
zIndex: 120,
hover: false,
style: 'default',
animation: 'standard',
adjustment: 10
};
}) ( jQuery, window, document );

View File

@@ -130,7 +130,8 @@
"prefer-stable": true,
"scripts": {
"post-autoload-dump": [
"@php artisan package:discover --ansi"
"@php artisan package:discover --ansi",
"@php artisan vendor:publish --provider=\"Sebastienheyd\\Boilerplate\\BoilerplateServiceProvider\" --tag=public --force -q"
],
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""

View File

@@ -2,7 +2,7 @@
return [
'register' => false, // Allow to register new users on backend login page
'register_role' => 'backend_user', // Given role to new users (except the first one who is admin)
'register_role' => 'customer', // Given role to new users (except the first one who is admin)
'providers' => [
'users' => [
'driver' => 'eloquent',

View File

@@ -6,7 +6,7 @@ return [
'thumbs_dir' => 'thumbs',
'hide_thumbs_dir' => true,
'authorized' => [
'size' => '2048',
'size' => '32768',
'mimes' => [// @see https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types)
'jpg',
'jpeg',

View File

@@ -34,6 +34,7 @@
},
"dependencies": {
"@activix/bootstrap-datetimepicker": "^2.0.7",
"@ciar4n/izmir": "^1.0.0",
"@claviska/jquery-minicolors": "^2.3.4",
"admin-lte": "^3.0.2",
"animate.css": "^3.7.0",
@@ -90,6 +91,7 @@
"imports-loader": "^0.8.0",
"input-switch": "^1.1.0",
"inputmask": "^4.0.8",
"ionicons": "^5.0.1",
"isotope-layout": "^3.0.6",
"izimodal": "^1.5.1",
"jQuery-QueryBuilder": "^2.5.2",

View File

@@ -1,7 +1,6 @@
<?php
return [
'title' => 'Résidences',
'name' => 'Référence',
'parameters' => 'Paramètres',
'label' => 'Libellé',
@@ -24,13 +23,25 @@ return [
'description' => 'Gérer les articles',
'add' => 'Ajouter un article',
'edit' => 'Editer un article',
'del' => 'Effacer u article',
'del' => 'Effacer un article',
'list' => 'Liste des articles',
'successadd' => 'L\'article été correctement ajouté',
'successmod' => 'L\'article a été correctement modifié',
'successdel' => 'L\'article a été correctement effacé',
'confirmdelete' => 'Confirmez-vous la suppression de l\'article ?',
],
'tags' => [
'title' => 'Tags',
'description' => 'Gérer les tags',
'add' => 'Ajouter un tag',
'edit' => 'Editer un tag',
'del' => 'Effacer un tag',
'list' => 'Liste des tags',
'successadd' => 'Le tag été correctement ajouté',
'successmod' => 'Le tag a été correctement modifié',
'successdel' => 'Le tag a été correctement effacé',
'confirmdelete' => 'Confirmez-vous la suppression du tag ?',
],
'customers' => [
'title' => "Clients",
'description' => 'Gérer les clients',

View File

@@ -1,12 +1,12 @@
@extends('layout.index', [
'title' => __('Botanic.varieties.title'),
'subtitle' => __('Botanic.varieties.edit'),
'breadcrumb' => ['Familles']
'breadcrumb' => [__('Botanic.varieties.title'), __('Botanic.varieties.edit')]
])
@section('content')
{{ Form::open(['route' => 'Botanic.Admin.Varieties.store', 'id' => 'form', 'autocomplete' => 'off']) }}
{{ Form::open(['route' => 'Botanic.Admin.Varieties.store', 'id' => 'form', 'autocomplete' => 'off', 'files' => true]) }}
<input type="hidden" name="id" value="{{ $id }}">
@include('Botanic.Admin.Varieties.form')

View File

@@ -1,3 +1,7 @@
@include('boilerplate::load.fileinput')
@include('boilerplate::load.select2')
@include('boilerplate::load.tinymce')
<div class="row">
<div class="col-md-8">
<div class="row">
@@ -11,17 +15,27 @@
</div>
</div>
{{ Form::label('tags', 'Tags') }}
@include('components.select-tree', ['name' => 'tags', 'list' => $tags_list, 'value' => isset($tags) ? $tags : null, 'class' => 'select2 form-control', 'multiple' => true])
{{ Form::label('description', 'Description') }}
@include('components.textarea', ['name' => 'description', 'value' => isset($description) ? $description : null, 'class' => 'editor', 'rows' => 5, 'required' => false])
</div>
<div class="col-md-4">
@include('components.uploader.widget', ['images' => $media])
</div>
</div>
<div class="row">
<div class="col-md-8">
<div class="float-right mt-3">
@include('components.button-save')
</div>
</div>
</div>
@include('components.save')
@push('js')
<script>
$(function() {
$(".select2").select2();
$('.editor').tinymce({});
});
</script>
@endpush

View File

@@ -7,23 +7,23 @@
<div class="row">
<div class="col-2">
{{ Form::label('tax_id', 'TVA') }}
@include('components.select', ['name' => 'prices[][tax_id]', 'value' => (isset($tax_id)) ? $tax_id : null, 'list' => isset($taxes) ? $taxes : null, 'required' => true])
{{ Form::label('tax_id', 'TVA') }}<br/>
@include('components.select', ['name' => 'prices[][tax_id]', 'value' => (isset($tax_id)) ? $tax_id : null, 'list' => isset($taxes) ? $taxes : null, 'required' => true, 'class' => 'form-control-sm'])
</div>
<div class="col-2">
{{ Form::label('price', 'Prix HT') }}
@include('components.money', ['name' => 'prices[][price}', 'value' => (isset($price)) ? $price : 0, 'required' => true])
@include('components.money', ['name' => 'prices[][price}', 'value' => (isset($price)) ? $price : 0, 'required' => true, 'class' => 'form-control-sm'])
</div>
<div class="col-2">
{{ Form::label('price_taxed', 'Prix TTC') }}
@include('components.money', ['name' => 'prices[][price_taxed]', 'value' => (isset($price_ht)) ? $price_ht : 0, 'required' => true])
@include('components.money', ['name' => 'prices[][price_taxed]', 'value' => (isset($price_ht)) ? $price_ht : 0, 'required' => true, 'class' => 'form-control-sm'])
</div>
<div class="col-2">
<br/>
<button class="btn btn-primary btn-xs add-new-attribute-btn mt-3" data-toggle="collapse" href="#attributes" type="button">
<button class="btn btn-primary btn-xs add-new-attribute mt-1" href="#attributes" type="button">
Ajout d'un attribut
<i class="fas fa-plus"></i>
</button>
@@ -39,22 +39,27 @@
</div>
</div>
<div class="collapse" id="attributes">
<div class="d-none" id="attributes">
<div class="card-body">
<div class="row">
<div id="append_attribute" class="row">
</div>
<div class="row row-new-attribute row-attribute">
<div class="col-xs-3 col-md-2">
{{ Form::label('quantity', 'Quantité') }}
@include('components.input', ['name' => 'prices[][quantity][]', 'value' => (isset($quantity)) ? $quantity : 1, 'required' => true])
{{ Form::label('quantity', 'Quantité') }}<br/>
@include('components.input', ['name' => 'prices[][quantity][]', 'value' => (isset($quantity)) ? $quantity : 1, 'required' => true, 'class' => 'form-control-sm'])
</div>
<div class="col-xs-4 col-md-4">
{{ Form::label('attribute_family_id', 'Attributs') }}
@include('components.select', ['name' => 'prices[][attribute_family_id][]', 'value' => (isset($attribute_value['attribute_family_id'])) ? $attribute_value['attribute_family_id'] : null, 'list' => $attribute_families, 'required' => true])
{{ Form::label('attribute_family_id', 'Attributs') }}<br/>
@include('components.select', ['name' => 'prices[][attribute_family_id][]', 'value' => (isset($attribute_value['attribute_family_id'])) ? $attribute_value['attribute_family_id'] : null, 'list' => $attribute_families, 'required' => true, 'class' => 'form-control-sm'])
</div>
<div class="col-xs-5 col-md-4">
{{ Form::label('attribute_value_id', 'Valeur') }}
@include('components.select', ['name' => 'prices[][attribute_value_id][]', 'value' => (isset($attribute_value['id'])) ? $attribute_value['id'] : null, 'list' => (isset($attribute_values)) ? $attribute_values : null, 'required' => true])
{{ Form::label('attribute_value_id', 'Valeur') }}<br/>
@include('components.select', ['name' => 'prices[][attribute_value_id][]', 'value' => (isset($attribute_value['id'])) ? $attribute_value['id'] : null, 'list' => (isset($attribute_values)) ? $attribute_values : null, 'required' => true, 'class' => 'form-control-sm'])
</div>
</div>

View File

@@ -33,7 +33,7 @@
<div class="row">
<div class="col-12">
{{ Form::label('tags', 'Tags') }}
@include('components.select', ['name' => 'tags', 'value' => isset($tags) ? $tags : null, 'class' => 'select2 form-control', 'multiple' => true])
@include('components.select-tree', ['name' => 'tags', 'list' => $tags_list, 'value' => isset($tags) ? $tags : null, 'class' => 'select2 form-control', 'multiple' => true])
</div>
</div>
@@ -46,7 +46,6 @@
</div>
<div class="col-md-4">
{{ Form::label('photo', 'Photos') }}
@include('components.file', ['name' => 'photo', 'value' => isset($photo) ? $photo : null, 'required' => true])
@include('components.uploader.widget', ['images' => isset($media) ? $media : null])
</div>
</div>

View File

@@ -1,5 +1,4 @@
@include('Shop.Admin.Articles.partials.block_price_new')
<div id="append_price" class="row">
@include('Shop.Admin.Articles.partials.list-prices')
@@ -26,5 +25,22 @@
hideSection: true
});
function append_attribute() {
}
$("#append_attribute").appender({
rowSection: '.row-new-attribute',
type: '.row-attribute',
addBtn: '.add-new-attribute',
appendEffect: 'slide',
addClass: 'animated bounceInLeft',
rowNumber: '.row-attribute-number',
deleteBtn: '.delete-new-attribute-btn',
callback: append_attribute,
rowNumberStart: 2,
hideSection: true
});
</script>
@endpush

View File

@@ -2,16 +2,18 @@
@include('boilerplate::load.select2')
@include('boilerplate::load.tinymce')
<input type="hidden" name="category_id" value="{{ $category_id }}">
<div class="row">
<div class="col-md-8">
<div class="row">
<div class="col-6">
<div class="col-8">
{{ Form::label('name', 'Nom') }}
@include('components.input', ['name' => 'name', 'value' => isset($name) ? $name : null, 'required' => true])
</div>
<div class="col-6">
{{ Form::label('category_id', 'Catégorie parente') }}
@include('components.select', ['name' => 'category_id', 'list' => $categories, 'value' => isset($category_id) ? $category_id : null, 'class' => 'select2 form-control'])
<div class="col-4 text-right">
{{ Form::label('visible', 'Visible') }}<br/>
@include('components.toggle', ['name' => 'visible', 'value' => isset($visible) ? $visible : null])
</div>
</div>
<div class="row">
@@ -33,19 +35,13 @@
</div>
</div>
<div class="row">
<div class="col-md-8">
<div class="float-right mt-3">
@include('components.button-save')
</div>
</div>
</div>
@include('components.save')
@push('js')
<script>
$(function() {
$(".select2").select2();
$('.editor').tinymce({});
});
</script>
<script>
$(function() {
$(".select2").select2();
$('.editor').tinymce({});
});
</script>
@endpush

View File

@@ -1,7 +1,7 @@
<div class="row">
<div class="col-md-3 col-sm-6 col-xs-12">
<a href="{!! route('Shop.Admin.Orders.index') !!}">
@include('Shop.Admin.Dashboard.components.infobox', ['count' => (isset($nb_orders)) ? $nb_orders : 0, 'class' => 'bg-aqua', 'icon' => 'fa-building-o', 'text' => 'Commandes'])
@include('Shop.Admin.Dashboard.components.infobox', ['count' => (isset($nb_orders)) ? $nb_orders : 0, 'class' => 'bg-aqua', 'icon' => 'ion ion-bag', 'text' => 'Commandes'])
</a>
</div>
<!-- /.col -->
@@ -17,7 +17,7 @@
<div class="col-md-3 col-sm-6 col-xs-12">
<a href="{!!route('Shop.Admin.Orders.index') !!}">
@include('Shop.Admin.Dashboard.components.infobox', ['count' => (isset($nb_dossiers_encours)) ? $nb_dossiers_encours : 0, 'class' => 'bg-yellow', 'icon' => 'fa-hourglass-start', 'text' => 'CA du mois'])
@include('Shop.Admin.Dashboard.components.infobox', ['count' => (isset($total_invoices)) ? $total_invoices : 0, 'class' => 'bg-yellow', 'icon' => 'ion ion-stats-bars', 'text' => 'CA du mois'])
</a>
</div>
<!-- /.col -->

View File

@@ -0,0 +1,42 @@
<div class="card">
<div class="card-header">
<h3 class="card-title">Dernières commandes</h3>
<div class="card-tools">
<button type="button" class="btn btn-tool" data-widget="collapse"><i class="fa fa-minus"></i>
</button>
<button type="button" class="btn btn-tool" data-widget="remove"><i class="fa fa-times"></i></button>
</div>
</div>
<!-- /.box-header -->
<div class="card-body">
<div class="table-responsive">
<table class="table no-margin">
<thead>
<tr>
<th>Nom</th>
<th>Localisation</th>
<th>Date</th>
<th>Montant</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="pages/examples/invoice.html">Ludovic CANDELLIER</a></td>
<td>Amiens (80)</td>
<td>14/05/2020</td>
<td><span class="label label-success">300.53 </span></td>
</tr>
</tbody>
</table>
</div>
<!-- /.table-responsive -->
</div>
<!-- /.box-body -->
<div class="card-header clearfix">
<a href="javascript:void(0)" class="btn btn-sm btn-info btn-flat pull-left">Nouvelle commande</a>
<a href="javascript:void(0)" class="btn btn-sm btn-default btn-flat pull-right">Voir toutes les commandes</a>
</div>
<!-- /.box-footer -->
</div>
<!-- /.box -->

View File

@@ -1,43 +0,0 @@
<!-- TABLE: LATEST ORDERS -->
<div class="box box-info">
<div class="box-header with-border">
<h3 class="box-title">Derniers dossiers</h3>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i>
</button>
<button type="button" class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button>
</div>
</div>
<!-- /.box-header -->
<div class="box-body">
<div class="table-responsive">
<table class="table no-margin">
<thead>
<tr>
<th>Résidence</th>
<th>Lot</th>
<th>Prix</th>
<th>Vendeur</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="pages/examples/invoice.html">Résidence</a></td>
<td>Lot</td>
<td><span class="label label-success">Prix</span></td>
<td>Vendeur</td>
</tr>
</tbody>
</table>
</div>
<!-- /.table-responsive -->
</div>
<!-- /.box-body -->
<div class="box-footer clearfix">
<a href="javascript:void(0)" class="btn btn-sm btn-info btn-flat pull-left">Nouveau dossier</a>
<a href="javascript:void(0)" class="btn btn-sm btn-default btn-flat pull-right">Voir tous les dossiers</a>
</div>
<!-- /.box-footer -->
</div>
<!-- /.box -->

View File

@@ -1,15 +1,15 @@
<div class="box box-default">
<div class="box-header with-border">
<h3 class="box-title">Type de lots</h3>
<div class="card">
<div class="card-header">
<h3 class="card-title">Répartion par types</h3>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i>
<div class="card-tools">
<button type="button" class="btn btn-tool" data-widget="collapse"><i class="fa fa-minus"></i>
</button>
<button type="button" class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button>
<button type="button" class="btn btn-tool" data-widget="remove"><i class="fa fa-times"></i></button>
</div>
</div>
<!-- /.box-header -->
<div class="box-body">
<div class="card-body">
<div class="row">
<div class="col-md-8">
<div class="chart-responsive">
@@ -20,12 +20,10 @@
<!-- /.col -->
<div class="col-md-4">
<ul class="chart-legend clearfix">
<li><i class="fa fa-circle-o text-red"></i> T1</li>
<li><i class="fa fa-circle-o text-green"></i> T2</li>
<li><i class="fa fa-circle-o text-yellow"></i> T3</li>
<li><i class="fa fa-circle-o text-aqua"></i> T4</li>
<li><i class="fa fa-circle-o text-light-blue"></i> T5</li>
<li><i class="fa fa-circle-o text-gray"></i> Part</li>
<li><i class="fa fa-circle-o text-red"></i> Semences</li>
<li><i class="fa fa-circle-o text-green"></i> Plants</li>
<li><i class="fa fa-circle-o text-yellow"></i> Plats</li>
<li><i class="fa fa-circle-o text-aqua"></i> Outils</li>
</ul>
</div>
<!-- /.col -->
@@ -33,7 +31,7 @@
<!-- /.row -->
</div>
<!-- /.box-body -->
<div class="box-footer no-padding">
<div class="card-footer">
<ul class="nav nav-pills nav-stacked">
<li>
<a href="#">

View File

@@ -13,11 +13,11 @@
<div class="row">
<div class="col-md-8">
@include('Shop.Admin.Dashboard._partials.latest_orders')
@include('Shop.Admin.Dashboard._partials.latestOrders')
</div>
<div class="col-md-4">
@include('Shop.Admin.Dashboard._partials.stats_sections')
@include('Shop.Admin.Dashboard._partials.ordersByTypes')
</div>
</div>

View File

@@ -1,40 +1,40 @@
<div class="row">
<div class="col-md-12">
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">Evolution du CA</h3>
<div class="card">
<div class="card-header">
<h3 class="card-title">Evolution du CA</h3>
<div class="box-tools pull-right">
<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
<div class="card-tools">
<button type="button" class="btn btn-tool" data-card-widget="collapse">
<i class="fas fa-minus"></i>
</button>
<div class="btn-group">
<button type="button" class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown"><i class="fa fa-wrench"></i></button>
<ul class="dropdown-menu" role="menu">
<li><a href="#">Par semaine</a></li>
<li><a href="#">Par mois</a></li>
<li class="divider"></li>
<li><a href="#">Autre chose</a></li>
</ul>
<button type="button" class="btn btn-tool dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-wrench"></i>
</button>
<div class="dropdown-menu dropdown-menu-right" role="menu">
<a href="#" class="dropdown-item">Par semaine</a>
<a href="#" class="dropdown-item">Par mois</a>
<a class="dropdown-divider"></a>
<a href="#" class="dropdown-item">Autre chose</a>
</div>
</div>
<button type="button" class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button>
<button type="button" class="btn btn-tool" data-widget="remove">
<i class="fa fa-times"></i>
</button>
</div>
</div>
<!-- /.box-header -->
<div class="box-body">
<div class="card-body">
<div class="row">
<div class="col-md-12">
@include('Shop.Admin.Dashboard.components.chart')
</div>
</div>
<!-- /.row -->
</div>
<!-- ./box-body -->
<div class="box-footer">
<div class="card-footer">
@include('Shop.Admin.Dashboard._partials.evolutions')
</div>
<!-- /.box-footer -->
</div>
<!-- /.box -->
</div>
<!-- /.col -->
</div>
<!-- /.row -->

View File

@@ -1,20 +0,0 @@
<div class="pad box-pane-right bg-green" style="min-height: 280px">
<div class="description-block margin-bottom">
<div class="sparkbar pad" data-color="#fff"><canvas width="34" height="30" style="display: inline-block; width: 34px; height: 30px; vertical-align: top;"></canvas></div>
<h5 class="description-header">{{ $nb_residences }}</h5>
<span class="description-text">Résidences</span>
</div>
<div class="description-block margin-bottom">
<div class="sparkbar pad" data-color="#fff"><canvas width="34" height="30" style="display: inline-block; width: 34px; height: 30px; vertical-align: top;"></canvas></div>
<h5 class="description-header">{{ $nb_lots }}</h5>
<span class="description-text">Lots</span>
</div>
<div class="description-block">
<div class="sparkbar pad" data-color="#fff"><canvas width="34" height="30" style="display: inline-block; width: 34px; height: 30px; vertical-align: top;"></canvas></div>
<h5 class="description-header">{{ $lots_percent }} %</h5>
<span class="description-text">En cours</span>
</div>
</div>

View File

@@ -1,14 +1,14 @@
@extends('layout.index', [
'title' => __('article_families.title'),
'subtitle' => __('article_families.create.title'),
'breadcrumb' => [__('article_families.title'), __('article_families.create.title')]
'title' => __('tags.title'),
'subtitle' => __('tags.create.title'),
'breadcrumb' => [__('tags.title'), __('tags.create.title')]
])
@include('boilerplate::load.fileinput')
@section('content')
{{ Form::open(['route' => 'Shop.Admin.ArticleFamilies.store', 'id' => 'article-family-form', 'autocomplete' => 'off', 'files' => true]) }}
{{ Form::open(['route' => 'Shop.Admin.ArticleFamilies.store', 'id' => 'tag-form', 'autocomplete' => 'off', 'files' => true]) }}
<div class="row">
<div class="col-sm-12 mbl">

View File

@@ -1,11 +1,5 @@
@include('boilerplate::load.tinymce')
<div class="row">
<div class="col-md-8">
{{ Form::label('group_id', 'Groupe') }}
@include('components.select', ['name' => 'group_id', 'list' => isset($groups) ? $groups : null, 'value' => isset($group_id) ? $group_id : null, 'required' => true])
{{ Form::label('name', 'Nom') }}
@include('components.input', ['name' => 'name', 'value' => isset($name) ? $name : null, 'required' => true])
@@ -21,10 +15,3 @@
</div>
</div>
@push('js')
<script>
$(function() {
$('.editor').tinymce({});
});
</script>
@endpush

View File

@@ -8,7 +8,7 @@
<div class="row pb-3">
<div class="col text-right">
<a href="{{ route('Shop.Admin.Tags.create') }}" class="btn btn-sm btn-success">{{ __('Shop.Admin.Tags.add') }} <i class="fa fa-plus"></i></a>
<a href="{{ route('Shop.Admin.Tags.create') }}" class="btn btn-sm btn-success">{{ __('Shop.tags.add') }} <i class="fa fa-plus"></i></a>
</div>
</div>
@@ -17,5 +17,12 @@
@endsection
@push('scripts')
@include('components.js.datatable', ['route' => '/Shop/Admin/Tags', 'model' => 'Tags'])
<script>
$.extend( true, $.fn.dataTable.defaults, {
rowReorder: true
} );
</script>
@include('components.js.datatable', ['route' => '/Shop/Admin/Tags', 'model' => 'tags'])
@endpush

View File

@@ -0,0 +1,5 @@
<div id="header-basket">
<div class="" data-refresh-url="/module/ps_Shoppingcart/ajax">
<i class="fa fa-3x fa-shopping-basket"></i>
</div>
</div>

View File

@@ -0,0 +1,7 @@
<div class="language-selector dropdown js-dropdown">
<span class="language-selector-label">Langue :</span>
<a data-target="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="Sélecteur de langue">
<span class="expand-more">Français</span>
<i class="material-icons expand-more">&#xE313;</i>
</a>
</div>

View File

@@ -1,72 +1,25 @@
<nav class="header-nav">
<div class="container">
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-6 left-nav">
<div id="ishiheaderblock" class="clearfix">
<div class="header-text">Obtenez 25% de réduction aujourd hui</div>
</div>
<div class="pull-left">
<div id="menu-icon" class="menu-icon hidden-lg-up">
<i class="fa fa-bars" aria-hidden="true"></i>
</div>
<img src="/img/logo.png" class="img-responvive" height="64">
</div>
<div class="pull-left">
{{ include("Shop._partials.search")}}
</div>
</div>
<div class="col-xs-12 col-sm-12 col-md-6 right-nav">
<div class="language-selector dropdown js-dropdown">
<span class="language-selector-label">Langue :</span>
<a data-target="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="Sélecteur de langue">
<span class="expand-more">Français</span>
<i class="material-icons expand-more">&#xE313;</i>
</a>
<!--
<ul class="dropdown-menu" aria-labelledby="language-selector-label">
<li >
<a href="en/" class="dropdown-item" data-iso-code="en">English</a>
</li>
<li >
<a href="ar/" class="dropdown-item" data-iso-code="ar">اللغة العربية</a>
</li>
<li >
<a href="es/" class="dropdown-item" data-iso-code="es">Español</a>
</li>
<li class="current" >
<a href="fr/" class="dropdown-item" data-iso-code="fr">Français</a>
</li>
<li >
<a href="it/" class="dropdown-item" data-iso-code="it">Italiano</a>
</li>
<li >
<a href="pl/" class="dropdown-item" data-iso-code="pl">Polski</a>
</li>
</ul>
-->
</div>
<!--
<div class="currency-selector dropdown js-dropdown">
<span class="currency-selector-label">Devise :</span>
<a data-target="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="Sélecteur de devise">
<span class="expand-more">USD $</span>
<i class="material-icons expand-more">&#xE313;</i>
</a>
<ul class="dropdown-menu" aria-labelledby="currency-selector-label">
<li >
<a title="Euro" rel="nofollow" href="fr/?SubmitCurrency=1&amp;id_currency=2" class="dropdown-item">EUR €</a>
</li>
<li class="current" >
<a title="Dollar des États-Unis" rel="nofollow" href="fr/?SubmitCurrency=1&amp;id_currency=1" class="dropdown-item">USD $</a>
</li>
</ul>
</div>
-->
<div class="user-info dropdown js-dropdown">
<span class="account-logo expand-more" data-toggle="dropdown" role="button">Compte client <i class="material-icons expand-more">&#xE313;</i></span>
<ul class="dropdown-menu" aria-labelledby="dLabel">
<li>
<a href="fr/mon-compte" title="Identifiez-vous" rel="nofollow">
<span>Connexion</span>
</a>
</li>
</ul>
</div>
{{ include("Shop._partials.header-profile")}}
{{ include("Shop._partials.header-basket")}}
</div>
</div>
</div>
</nav>

View File

@@ -0,0 +1,13 @@
<div class="user-info dropdown js-dropdown">
<span class="account-logo expand-more" data-toggle="dropdown" role="button">Compte client
<i class="material-icons expand-more">&#xE313;</i>
</span>
<ul class="dropdown-menu" aria-labelledby="dLabel">
<li>
<a href="fr/mon-compte" title="Identifiez-vous" rel="nofollow">
<span>Connexion</span>
</a>
</li>
</ul>
</div>

View File

@@ -2,19 +2,13 @@
<div class="header-banner"></div>
{{ include("Shop._partials.header-nav") }}
{{ include("Shop._partials.header-top")}}
<div class="nav-full-width">
<div class="container">
<div class="row">
{{ include("Shop._partials.sections")}}
{{ include("Shop._partials.search")}}
<div id="menu-icon" class="menu-icon hidden-lg-up">
<i class="fa fa-bars" aria-hidden="true"></i>
</div>
<div id="_mobile_cart"></div>
<div id="_mobile_seach_widget"></div>
<div id="_mobile_user_info"></div>

View File

@@ -7,7 +7,7 @@
<meta name="robots" content="noindex, nofollow">
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>{{ $title }} | {{ config('app.name') }}</title>
<link rel="stylesheet" href="{{ mix('/boilerplate.min.css', '/assets/vendor/boilerplate') }}">
<link rel="stylesheet" href="{{ mix('/adminlte.min.css', '/assets/vendor/boilerplate') }}">
@stack('css')
</head>
<body class="{{ $bodyClass ?? 'login-page'}}">

View File

@@ -0,0 +1,7 @@
@if (isset($list) && count($list))
@foreach($list as $key => $optgroup)
<optgroup label="{{ $optgroup['label'] }}">
@include('components.options', ['list' => $optgroup['options']])
</optgroup>
@endforeach
@endif

View File

@@ -0,0 +1,13 @@
<select
name="{{ $name }}"
@if (isset($id_name))id="{{ $id_name }}"@endif
class="@if (isset($class)){{ $class }} @else form-control @endif"
@if (isset($style))style="{{ $style }}" @endif
@if (isset($required))required="required"@endif
@if (isset($multiple))multiple="multiple"@endif
>
@if (isset($with_empty))
<option>{{ $with_empty }}</option>
@endif
@include('components.options-tree')
</select>

View File

@@ -6,7 +6,9 @@
@if (isset($required))required="required"@endif
@if (isset($multiple))multiple="multiple"@endif
>
<option></option>
@if (isset($with_empty))
<option>{{ $with_empty }}</option>
@endif
@if (isset($complex) && $complex)
@include('components.options-complex')
@else

View File

@@ -0,0 +1 @@
<input type="checkbox" name="{{ $name }}" @if ($value)checked @endif class="active-checkbox" data-toggle="toggle" data-size="mini" data-width="50" data-height="25" data-onstyle="success" data-offstyle="danger">

View File

@@ -0,0 +1,13 @@
<div class="col row-image"></div>
<button type="button" class="btn btn-danger delete-image-btn"><i class="fa fa-minus-circle"></i></button>
<div class="thumbnail">
<img src="{{ $image['url'] }}" class="img-fluid" height="92">
<div class="caption">
<h3>{{ $image['title'] }}</h3>
<p>Poids : {{ $image['filesize'] }}</p>
</div>
</div>
</div>

View File

@@ -0,0 +1,10 @@
<div class="col row-new-image row-image mt-3 mb-2">
<p>
<button type="button" class="btn btn-danger delete-new-image-btn"><i class="fa fa-minus-circle"></i></button>
Photo <span class="row-image-number"></span>
</p>
<input name="images[]" type="file" class="file" data-show-upload="false" data-show-caption="true" data-msg-placeholder="Choisissez une photo">
</div>

View File

@@ -0,0 +1,5 @@
<label>Titre</label>
<input name="images[][title]" type="text" class="form-control">
<label>Type de photo</label>
@include('components.select',['name' => 'images[][type_image_id]' , 'list' => isset($type_images) ? $type_images : null])

View File

@@ -0,0 +1,34 @@
@if ($images)
<div class="row" id="uploader-mini-gallery">
@foreach($images as $image)
<figure class="mr-2">
<img src="{{ $image['url'] }}" class="img-thumbnail img-caption" style="max-height:92px;">
<figcaption class="text-center pt-2">
<button type="button" class="btn btn-xs btn-outline-secondary">
<i class="fas fa-expand-alt" data-id="{{ $image['id'] }}"></i>
</button>
<button type="button" class="btn btn-xs btn-outline-danger">
<i class="fas fa-trash" data-id="{{ $image['id'] }}"></i>
</button>
</figcaption>
</figure>
@endforeach
</div>
@endif
@push('js')
<script>
$('#uploader-mini-gallery .fa-trash').click(function() {
id = $(this).data('id');
console.log(id);
$.ajax({
type: 'DELETE',
url: {{ route('Botanic.Admin.Varieties.deleteImage') }},
data: {id: id},
success: function(data) {
source = data;
}
});
})
</script>
@endpush

View File

@@ -0,0 +1,34 @@
<div class="card">
<div class="card-header">
<h3 class="card-title">Photos</h3>
<div class="card-tools">
<button type="button" class="btn btn-xs btn-primary add-image pull-right">Ajout <i class="fa fa-plus"></i></button>
</div>
</div>
<div class="card-body pb-0">
@include('components.uploader.mini-gallery', ['images' => $images])
<div id="uploader-new-images"></div>
@include('components.uploader.block_image_new', ['name' => 'images[]', 'required' => true])
</div>
</div>
@push('js')
<script>
function append_image() {
$("#uploader-new-images .file").fileinput();
}
$("#uploader-new-images").appender({
rowSection: '.row-new-image',
type: '.row-image',
addBtn: '.add-image',
appendEffect: 'fade',
addClass: 'animated fadeIn',
rowNumber: '.row-image-number',
deleteBtn: '.delete-new-image-btn',
callback: append_image,
hideSection: true
});
</script>
@endpush

View File

@@ -9,5 +9,6 @@ Route::prefix('Varieties')->name('Varieties.')->group(function () {
Route::post('store', 'VarietyController@store')->name('store');
Route::get('edit/{id}', 'VarietyController@edit')->name('edit');
Route::post('getSelect', 'VarietyController@getOptionsWithSpecie')->name('getSelect');
Route::delete('deleteImage', 'VarietyController@deleteImage')->name('deleteImage');
});