<?php namespace Xentral\Modules\DocumentScanner\DataTable; use Aura\SqlQuery\Exception; use Xentral\Components\Database\SqlQuery\SelectQuery; use Xentral\Widgets\DataTable\Column\Column; use Xentral\Widgets\DataTable\Column\ColumnCollection; use Xentral\Widgets\DataTable\Column\ColumnFormatter; use Xentral\Widgets\DataTable\Feature\ColumnFilterFeature; use Xentral\Widgets\DataTable\Feature\FeatureCollection; use Xentral\Widgets\DataTable\Filter\CustomFilter; use Xentral\Widgets\DataTable\Filter\FilterCollection; use Xentral\Widgets\DataTable\Options\DataTableOptions; use Xentral\Widgets\DataTable\Request\DataTableRequest; use Xentral\Widgets\DataTable\Type\AbstractDataTableType; final class DocScanFilesDataTable extends AbstractDataTableType { /** * @param ColumnCollection $columns * * @return void */ public function configureColumns(ColumnCollection $columns) { $preview = Column::visible('preview', 'Vorschau', 'center', '10%'); $preview->setFormatter(ColumnFormatter::template( '<span style="width:100px;text-align:center;display:block;">' . '<a href="index.php?module=dateien&action=send&id={ID}">' . '<img src="index.php?module=ajax&action=thumbnail&cmd=docscan&id={ID}" alt="{DATEINAME}"'. ' style="border:0;max-width:100px;max-height:100px;">' . '</a>' . '</span>' )); $title = Column::searchable('titel', 'Titel', 'left', '30%'); $title->setFormatter(function ($value, $row) { return !empty($value) ? sprintf('%s<br><i style="color:#999;">%s</i>', $value, $row['dateiname']) : $row['dateiname']; }); $filesize = Column::sortable('filesize', 'Dateigröße', 'right', '10%'); $filesize->setFormatter(ColumnFormatter::bytes()); $menu = Column::fixed('menu', 'Menü', 'center', '1%'); $menu->setFormatter(ColumnFormatter::template( '<table class="datatable-menu docscan-menu" align="center" border="0" cellpadding="0" cellspacing="0"><tr>' . '<td><a href="#" class="docscan-add-button" data-file="{FILE_ID}" data-type="{DOC_TYPE}" title="Datei zuweisen">' . '<img src="themes/new/images/add.png" alt="Datei zuweisen" border="0" align="center">' . '</a></td>' . '<td><a href="#" class="docscan-delete-button" data-file="{FILE_ID}" data-type="{DOC_TYPE}" title="Datei löschen">' . '<img src="themes/new/images/delete.svg" alt="Datei löschen" border="0" align="center">' . '</a></td>' . '</tr></table>' )); $date = Column::sortable('datum', 'Datum'); $date->setFormatter(ColumnFormatter::date('d.m.Y')); //$columns->add(Column::hidden('id', 'ID')); $columns->add($preview); $columns->add($title); $columns->add(Column::searchable('subjekt', 'Stichwort')); $columns->add(Column::searchable('objekte', 'Zuordnung')); $columns->add($filesize); $columns->add(Column::searchable('ersteller', 'Ersteller')); $columns->add(Column::searchable('bemerkung', 'Bemerkung')); $columns->add($date); $columns->add($menu); } /** * @param SelectQuery $query * * @throws Exception * * @return void */ public function configureQuery(SelectQuery $query) { $query ->cols([ 'd.id', 'd.titel', 'v.dateiname', 'v.size AS filesize', 'v.ersteller', 'v.bemerkung', 'v.datum', 's.subjekt', 'zuweisungen.objekte', 'd.id AS file_id', 'sb.kategorie AS doc_type', ]) ->from('datei AS d') ->leftJoin('datei_stichwoerter AS s', 'd.id = s.datei') ->innerJoin('docscan AS sb', 'd.id = sb.datei AND s.parameter = sb.id') ->joinSubSelect( 'LEFT', 'SELECT ds.datei FROM datei_stichwoerter AS ds WHERE ds.objekt NOT LIKE \'DocScan\' GROUP BY ds.datei', 'notdocscan', 'notdocscan.datei = d.id' ) ->joinSubSelect( 'LEFT', 'SELECT ds.datei, GROUP_CONCAT(ds.objekt SEPARATOR \', \') AS objekte FROM datei_stichwoerter AS ds WHERE ds.objekt NOT LIKE \'DocScan\' GROUP BY ds.datei', 'zuweisungen', 'zuweisungen.datei = d.id' ) ->joinSubSelect( 'LEFT', 'SELECT dvi1.datei, max(dvi1.version) AS version FROM datei_version AS dvi1 GROUP BY dvi1.datei', 'v2', 'v2.datei = d.id' ) ->leftJoin('datei_version AS v', 'v.datei = v2.datei AND v.version = v2.version') ->where('s.objekt LIKE ?', 'DocScan') ->where('d.geloescht = 0'); } /** * @param DataTableOptions $options * * @return void */ public function configureOptions(DataTableOptions $options) { $options->setDefaultSorting(['datum' => 'DESC']); } /** * @param FeatureCollection $features * * @return void */ public function configureFeatures(FeatureCollection $features) { $features->add(new ColumnFilterFeature()); parent::configureFeatures($features); } /** * @param FilterCollection $filters * * @return void */ public function configureFilters(FilterCollection $filters) { $closure = function (SelectQuery $query, DataTableRequest $request) { $filter = $request->getParams()->getFilterValues(); if ($filter['show-all'] !== 'true') { $query->where('notdocscan.datei IS NULL'); } }; $filters->add(new CustomFilter($closure)); } }