diff --git a/app/Datatables/Botanic/FamiliesDataTable.php b/app/Datatables/Botanic/FamiliesDataTable.php
new file mode 100644
index 00000000..aa35023d
--- /dev/null
+++ b/app/Datatables/Botanic/FamiliesDataTable.php
@@ -0,0 +1,32 @@
+title('Nom'),
+ Column::make('alias'),
+ Column::make('latin'),
+ Column::make('genres_count')->title('Nb genres')->searchable(false)->addClass('text-right'),
+ Column::make('species_count')->title('Nb espèces')->searchable(false)->addClass('text-right'),
+ Column::make('varieties_count')->title('Nb variétés')->searchable(false)->addClass('text-right'),
+ self::makeColumnButtons(),
+ ];
+ }
+
+}
diff --git a/app/Datatables/Botanic/GenresDataTable.php b/app/Datatables/Botanic/GenresDataTable.php
new file mode 100644
index 00000000..0d28db6c
--- /dev/null
+++ b/app/Datatables/Botanic/GenresDataTable.php
@@ -0,0 +1,43 @@
+withCount('species')->withCount('varieties');
+ return self::buildQuery($model);
+ }
+
+ public function modifier($datatables)
+ {
+ $datatables
+ ->editColumn('family_name', function(Genre $genre) {
+ return $genre->family ? $genre->family->name : '';
+ })
+ ->rawColumns(['genre_name', 'action'])
+ ;
+ return Parent::modifier($datatables);
+ }
+
+ protected function getColumns()
+ {
+ return [
+ Column::make('name')->title('Nom'),
+ Column::make('alias'),
+ Column::make('latin'),
+ Column::make('family.name')->data('family_name')->title('Famille'),
+ Column::make('species_count')->title('Nb Espèces')->searchable(false)->addClass('text-right'),
+ Column::make('varieties_count')->title('Nb Variétés')->searchable(false)->addClass('text-right'),
+ self::makeColumnButtons(),
+ ];
+ }
+
+}
diff --git a/app/Datatables/Botanic/SpeciesDataTable.php b/app/Datatables/Botanic/SpeciesDataTable.php
new file mode 100644
index 00000000..babe4dfc
--- /dev/null
+++ b/app/Datatables/Botanic/SpeciesDataTable.php
@@ -0,0 +1,43 @@
+with('genre');
+ return self::buildQuery($model);
+ }
+
+ public function modifier($datatables)
+ {
+ $datatables
+ ->editColumn('genre_name', function(Specie $specie) {
+ return $specie->genre ? $specie->genre->name : '';
+ })
+ ->rawColumns(['genre_name', 'action'])
+ ;
+ return Parent::modifier($datatables);
+ }
+
+
+ protected function getColumns()
+ {
+ return [
+ Column::make('name')->title('Nom'),
+ Column::make('alias'),
+ Column::make('genre.name')->data('genre_name')->title('Genre'),
+ Column::make('latin'),
+ Column::make('varieties_count')->title('Nb variétés')->searchable(false)->addClass('text-right'),
+ self::makeColumnButtons(),
+ ];
+ }
+
+}
diff --git a/app/Datatables/Botanic/VarietiesDataTable.php b/app/Datatables/Botanic/VarietiesDataTable.php
new file mode 100644
index 00000000..69aee4ea
--- /dev/null
+++ b/app/Datatables/Botanic/VarietiesDataTable.php
@@ -0,0 +1,30 @@
+withCount('Articles')->select('botanic_varieties.*');
+ $model = $model::joinRelations('Specie')->select('botanic_varieties.*','botanic_species.name as specie_name')->with('Specie')->withCount('Articles');
+ return self::buildQuery($model);
+ }
+
+ protected function getColumns()
+ {
+ return [
+ Column::make('Specie.name')->data('specie_name')->title('Espèce'),
+ Column::make('name')->title('Nom'),
+ Column::make('articles_count')->title('Nb articles')->class('text-right')->searchable(false),
+ self::makeColumnButtons(),
+ ];
+ }
+
+}
diff --git a/app/Datatables/ParentDataTable.php b/app/Datatables/ParentDataTable.php
new file mode 100644
index 00000000..399293f1
--- /dev/null
+++ b/app/Datatables/ParentDataTable.php
@@ -0,0 +1,204 @@
+ 'tr']
+ public $colReorder = false;
+ public $fixedColumns = false;
+ public $scrollX = false;
+ public $scrollCollapse = true;
+ public $sortedColumn = 0;
+ public $sortedOrder = 'asc';
+ public $stateSave = false;
+
+ /**
+ * Build DataTable class.
+ *
+ * @param mixed $query Results from query() method.
+ * @return \Yajra\DataTables\DataTableAbstract
+ */
+ public function dataTable($query)
+ {
+ return $this->modifier(datatables()->eloquent($query));
+ }
+
+ public function modifier($datatables)
+ {
+ return $this->addButtons($datatables->setRowId('{{$id}}'));
+ }
+
+ /**
+ * Add buttons DataTable class.
+ *
+ * @param mixed $query Results from query() method.
+ * @return \Yajra\DataTables\DataTableAbstract
+ */
+ public function addButtons($datatables)
+ {
+ return $datatables->addColumn('action', $this->getHtmlButtons());
+ }
+
+ public function getHtmlButtons()
+ {
+ $buttons = '';
+
+ // $buttons .= '';
+ // $buttons .= '';
+ $buttons .= '';
+ $buttons .= '';
+ return $buttons;
+ // return view('components.datatables.buttons.row_action');
+ }
+
+ public function makeColumnButtons()
+ {
+ return Column::computed('action')
+ ->title('')
+ ->exportable(false)
+ ->printable(false)
+ ->searchable(false)
+ ->width("74")
+ ->addClass('text-center text-nowrap');
+ }
+
+ public static function isFilteredByField($field)
+ {
+ return (request()->has('filters.' . $field)) ? request()->input('filters.'. $field) : (request()->has($field) ? request()->input($field) : false);
+ }
+
+ /**
+ * Get query source of dataTable.
+ *
+ * @param \App\Family $model
+ * @return \Illuminate\Database\Eloquent\Builder
+ */
+ public function buildQuery($model)
+ {
+ return $model->newQuery();
+ }
+
+ /**
+ * Optional method if you want to use html builder.
+ *
+ * @return \Yajra\DataTables\Html\Builder
+ */
+ public function html()
+ {
+ return $this->buildHtml(strtolower($this->model_name) . '-table');
+ }
+
+ /**
+ * Optional method if you want to use html builder.
+ *
+ * @return \Yajra\DataTables\Html\Builder
+ */
+ public function buildHtml($table_id = false, $selector = false)
+ {
+ $table_id = $table_id ? $table_id : strtolower($this->model_name) . '-table';
+ $selector = $selector ? $selector : '#' . $this->model_name . '-filters';
+ return $this->builder()
+ ->setTableId($table_id)
+ ->parameters($this->getParameters())
+ ->columns($this->getColumns())
+ ->ajax([
+ 'data' => 'function(d) { d.filters = $("' . $selector . '").serializeJSON(); }',
+ 'url' => isset($this->url) ? $this->url : ''
+ ])
+ ->dom($this->getDom())
+ ->orderBy($this->sortedColumn,$this->sortedOrder)
+ ->buttons($this->getButtons());
+ }
+
+ public function getButtons() {
+ return [
+ Button::make('export'),
+ Button::make('print'),
+ Button::make('colvis'),
+ Button::make('columnsToggle')
+ ];
+ }
+
+ public function getParameters()
+ {
+ $data = [
+ 'pageLength' => 5,
+ 'scrollX' => $this->scrollX,
+ 'scrollCollapse' => $this->scrollCollapse,
+ 'searchDelay' => 500,
+ 'colReorder' => $this->colReorder,
+ 'fixedColumns' => $this->fixedColumns,
+ // 'autoWidth' => false,
+ 'stateSave' => $this->stateSave
+ ];
+ if ($this->rowReorder) {
+ $data['rowReorder'] = ['selector' => $this->rowReorderSelector];
+ }
+ return $data;
+ }
+
+ public function getDom()
+ {
+ $dom = '';
+ // $dom .= $this->getDatatablesHeaderDefault();
+ $dom .= "rt";
+ $dom .= $this->getDatatablesFooterDefault();
+ return $dom;
+ }
+
+ public function getDatatablesHeader() {
+ return view('components.datatables.header');
+ }
+
+ public function getDatatablesHeaderDefault() {
+ // return "
";
+ /*
+
+ $dom = 't<"row datatable-pager light"<"col-md-12"'
+ . '<"datatable-more-export-buttons filter-buttons pull-left">'
+ . '<"datatable-more-export-favorites-buttons filter-buttons pull-left">'
+ . '<"datatable-more-export-basket-buttons filter-buttons pull-left">'
+ . '<"datatable-download-buttons filter-buttons pull-left">'
+ . '>>'
+ . '<"dt-toolbar-footer"<"col"i><"col pull-right datatable-pager light nopadding-right"p>>';
+
+ */
+
+ $dom = "<'row dt-toolbar-header'<'col-lg-4'l><'col-lg-4'B><'col-lg-4 text-right add'f>>";
+ return $dom;
+ // return 't<"row datatable-pager light"<"col-md-12"<"datatable-more-export-buttons filter-buttons pull-left"><"datatable-more-export-favorites-buttons filter-buttons pull-left"><"datatable-more-export-basket-buttons filter-buttons pull-left"><"datatable-download-buttons filter-buttons pull-left">>><"dt-toolbar-footer"<"col-md-6"i><"col-md-6 pull-right datatable-pager light nopadding-right"p>>';
+
+ }
+
+ public function getDatatablesFooterDefault() {
+ return "<'row pt-3 dt-toolbar-footer'<'col-md-6'i><'col-md-6'p>>";
+ }
+
+ /**
+ * Get filename for export.
+ *
+ * @return string
+ */
+ protected function filename()
+ {
+ return self::buildFilename($this->model_name);
+ }
+
+ /**
+ * Get filename for export.
+ *
+ * @return string
+ */
+ protected function buildFilename($name)
+ {
+ return $name . '_' . date('YmdHis');
+ }
+}
\ No newline at end of file
diff --git a/app/Datatables/Shop/ArticleFamiliesDataTable.php b/app/Datatables/Shop/ArticleFamiliesDataTable.php
new file mode 100644
index 00000000..af307353
--- /dev/null
+++ b/app/Datatables/Shop/ArticleFamiliesDataTable.php
@@ -0,0 +1,28 @@
+title('Nom'),
+ Column::make('articles_count')->title('Nb articles')->addClass('text-right'),
+ self::makeColumnButtons(),
+ ];
+ }
+
+}
diff --git a/app/Datatables/Shop/ArticlesDataTable.php b/app/Datatables/Shop/ArticlesDataTable.php
new file mode 100644
index 00000000..3bb7143a
--- /dev/null
+++ b/app/Datatables/Shop/ArticlesDataTable.php
@@ -0,0 +1,31 @@
+select('shop_articles.*','family.name as family_name')->join('shop_article_families as family', 'family.id', '=', 'shop_articles.article_family_id')->groupBy('shop_articles.id');
+ $model = $model::with('article_family')->select('shop_articles.*');
+ // $model = $model::joinRelations('Family')->select('shop_articles.*','shop_article_families.name as family_name');
+ return self::buildQuery($model);
+ }
+
+ protected function getColumns()
+ {
+ return [
+ Column::make('article_family.name')->title('Famille')->orderable(false),
+ Column::make('name')->title('Nom'),
+ self::makeColumnButtons(),
+ ];
+
+ }
+
+}
diff --git a/app/Datatables/Shop/CategoriesDataTable.php b/app/Datatables/Shop/CategoriesDataTable.php
new file mode 100644
index 00000000..d70a2955
--- /dev/null
+++ b/app/Datatables/Shop/CategoriesDataTable.php
@@ -0,0 +1,28 @@
+title('Nom'),
+ Column::make('articles_count')->title('Nb Articles')->class('text-right')->searchable(false),
+ self::makeColumnButtons(),
+ ];
+ }
+
+}
diff --git a/app/Datatables/Shop/CustomersDataTable.php b/app/Datatables/Shop/CustomersDataTable.php
new file mode 100644
index 00000000..a8fddbe0
--- /dev/null
+++ b/app/Datatables/Shop/CustomersDataTable.php
@@ -0,0 +1,29 @@
+title('Nom'),
+ Column::make('address')->title('Adresse'),
+ Column::make('zipcode')->title('Code postal'),
+ Column::make('city')->title('Ville'),
+ self::makeColumnButtons(),
+ ];
+ }
+
+}
diff --git a/app/Datatables/Shop/InvoicesDataTable.php b/app/Datatables/Shop/InvoicesDataTable.php
new file mode 100644
index 00000000..f13b576e
--- /dev/null
+++ b/app/Datatables/Shop/InvoicesDataTable.php
@@ -0,0 +1,28 @@
+select('shop_packages.*');
+ $model = self::filterByFamily($model);
+ return self::buildQuery($model);
+ }
+
+ public static function filterByFamily($model, $family_id = false)
+ {
+ $family_id = $family_id ? $family_id : self::isFilteredByField('family_id');
+ return $family_id ? $model->byArticleFamily($family_id) : $model;
+ }
+
+ protected function getColumns()
+ {
+ return [
+ Column::make('article_family.name')->title('Famille d\'articles'),
+ Column::make('value')->title('Valeur'),
+ self::makeColumnButtons(),
+ ];
+ }
+
+}
diff --git a/app/Datatables/Shop/PriceGenericCategoriesDataTable.php b/app/Datatables/Shop/PriceGenericCategoriesDataTable.php
new file mode 100644
index 00000000..95e21596
--- /dev/null
+++ b/app/Datatables/Shop/PriceGenericCategoriesDataTable.php
@@ -0,0 +1,28 @@
+withCount('price_generics');
+ return self::buildQuery($model);
+ }
+
+ protected function getColumns()
+ {
+ return [
+ Column::make('name')->title('Nom'),
+ Column::make('price_generics_count')->title('Nb Tarifs')->class('text-right'),
+ self::makeColumnButtons(),
+ ];
+ }
+
+}
diff --git a/app/Datatables/Shop/PriceGenericsDataTable.php b/app/Datatables/Shop/PriceGenericsDataTable.php
new file mode 100644
index 00000000..320eb3fd
--- /dev/null
+++ b/app/Datatables/Shop/PriceGenericsDataTable.php
@@ -0,0 +1,31 @@
+withCount('prices');
+ return self::buildQuery($model);
+ }
+
+ protected function getColumns()
+ {
+ return [
+ Column::make('category.name')->title('Catégorie'),
+ Column::make('name')->title('Nom'),
+ Column::make('price_by_unit.price')->title('Prix HT')->class('text-right'),
+ Column::make('price_by_unit.price_taxed')->title('Prix TTC')->class('text-right'),
+ Column::make('prices_count')->title('Nb tarifs')->class('text-right'),
+ self::makeColumnButtons(),
+ ];
+ }
+
+}
diff --git a/app/Datatables/Shop/TagGroupsDataTable.php b/app/Datatables/Shop/TagGroupsDataTable.php
new file mode 100644
index 00000000..93d18d1a
--- /dev/null
+++ b/app/Datatables/Shop/TagGroupsDataTable.php
@@ -0,0 +1,28 @@
+title('Nb de tags')->searchable(false)->addClass('text-right'),
+ self::makeColumnButtons(),
+ ];
+ }
+
+}
diff --git a/app/Datatables/Shop/TagsDataTable.php b/app/Datatables/Shop/TagsDataTable.php
new file mode 100644
index 00000000..7fe2a3aa
--- /dev/null
+++ b/app/Datatables/Shop/TagsDataTable.php
@@ -0,0 +1,30 @@
+ 'tr'];
+
+ public function query(Tag $model)
+ {
+ $model = $model::with('group')->select(['tags.*']);
+ return self::buildQuery($model);
+ }
+
+ protected function getColumns()
+ {
+ return [
+ Column::make('group.name')->title('Groupe'),
+ Column::make('sort_order')->title('Ordre'),
+ Column::make('name')->title('Nom'),
+ self::makeColumnButtons(),
+ ];
+ }
+
+}
diff --git a/app/Datatables/Shop/UnitiesDataTable.php b/app/Datatables/Shop/UnitiesDataTable.php
new file mode 100644
index 00000000..4d1d32ba
--- /dev/null
+++ b/app/Datatables/Shop/UnitiesDataTable.php
@@ -0,0 +1,36 @@
+select('shop_unities.*');
+ $model = self::filterByFamily($model);
+ return self::buildQuery($model);
+ }
+
+ public static function filterByFamily($model, $family_id = false)
+ {
+ $family_id = $family_id ? $family_id : self::isFilteredByField('family_id');
+ return $family_id ? $model->byArticleFamily($family_id) : $model;
+ }
+
+ protected function getColumns()
+ {
+ return [
+ Column::make('package.article_family.name')->title('Famille'),
+ Column::make('package.value')->title('Package'),
+ Column::make('value')->title('Valeur'),
+ self::makeColumnButtons(),
+ ];
+ }
+
+}