OpenXE/classes/Modules/DocumentScanner/DataTable/DocScanFilesDataTable.php
2021-05-21 08:49:41 +02:00

164 lines
5.9 KiB
PHP

<?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));
}
}