161 lines
4.5 KiB
PHP
161 lines
4.5 KiB
PHP
<?php
|
|
|
|
namespace SilverStripe\Forms\GridField;
|
|
|
|
use SilverStripe\Forms\GridField\GridField;
|
|
use SilverStripe\Forms\GridField\GridField_ColumnProvider;
|
|
use SilverStripe\ORM\DataObject;
|
|
use SilverStripe\Versioned\Versioned;
|
|
use SilverStripe\Core\Convert;
|
|
use SilverStripe\Core\Injector\Injector;
|
|
use SilverStripe\Versioned\RecursiveStagesInterface;
|
|
use SilverStripe\Versioned\VersionedGridFieldState\VersionedGridFieldState;
|
|
use SilverStripe\View\HTML;
|
|
|
|
class GridFieldVersionTag extends AbstractGridFieldComponent implements GridField_ColumnProvider
|
|
{
|
|
protected ?string $column = null;
|
|
|
|
protected array $versionedLabelFields = [];
|
|
|
|
public function __construct($versionedLabelFields = ['Name', 'Title'])
|
|
{
|
|
$this->setVersionedLabelFields($versionedLabelFields);
|
|
}
|
|
|
|
public function getColumn(): ?string
|
|
{
|
|
return $this->column;
|
|
}
|
|
|
|
public function setColumn(string $column): static
|
|
{
|
|
$this->column = $column;
|
|
return $this;
|
|
}
|
|
|
|
public function getVersionedLabelFields(): array
|
|
{
|
|
return $this->versionedLabelFields;
|
|
}
|
|
|
|
public function setVersionedLabelFields(array $versionedLabelFields): static
|
|
{
|
|
$this->versionedLabelFields = $versionedLabelFields;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Modify the list of columns displayed in the table.
|
|
*
|
|
* @see {@link GridFieldDataColumns->getDisplayFields()}
|
|
* @see {@link GridFieldDataColumns}.
|
|
*
|
|
* @param GridField $gridField
|
|
* @param array $columns List reference of all column names.
|
|
*/
|
|
public function augmentColumns($gridField, &$columns): void
|
|
{
|
|
// Skip if not versioned, or column already set
|
|
if ($this->getColumn()) {
|
|
return;
|
|
}
|
|
|
|
$matchedVersionedFields = array_intersect(
|
|
$columns ?? [],
|
|
$this->versionedLabelFields
|
|
);
|
|
|
|
if (count($matchedVersionedFields ?? []) > 0) {
|
|
// Get first matched column
|
|
$this->setColumn(reset($matchedVersionedFields));
|
|
} elseif ($columns) {
|
|
// Use first column if none of preferred matches
|
|
$this->setColumn(reset($columns));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Names of all columns which are affected by this component.
|
|
*
|
|
* @param GridField $gridField
|
|
* @return array
|
|
*/
|
|
public function getColumnsHandled($gridField): array
|
|
{
|
|
return $this->getColumn() ? [$this->getColumn()] : [];
|
|
}
|
|
|
|
/**
|
|
* HTML for the column, content of the <td> element.
|
|
*
|
|
* @param GridField $gridField
|
|
* @param DataObject $record Record displayed in this row
|
|
* @param string $columnName
|
|
* @return string HTML for the column.
|
|
*/
|
|
public function getColumnContent($gridField, $record, $columnName): string
|
|
{
|
|
$flagContent = '';
|
|
$flags = $this->getStatusFlags($record);
|
|
foreach ($flags as $class => $data) {
|
|
$flagAttributes = [
|
|
'class' => "ss-gridfield-badge badge status-{$class}",
|
|
];
|
|
if (isset($data['title'])) {
|
|
$flagAttributes['title'] = $data['title'];
|
|
}
|
|
$flagContent .= ' ' . HTML::createTag('span', $flagAttributes, Convert::raw2xml($data['text']));
|
|
}
|
|
return $flagContent;
|
|
}
|
|
|
|
/**
|
|
* Attributes for the column
|
|
*/
|
|
public function getColumnAttributes($gridField, $record, $columnName): array
|
|
{
|
|
return [];
|
|
}
|
|
|
|
/**
|
|
* Metadata for the column
|
|
*/
|
|
public function getColumnMetadata($gridField, $columnName): array
|
|
{
|
|
return [];
|
|
}
|
|
|
|
/**
|
|
* Get status flags for a given record
|
|
*/
|
|
private function getStatusFlags(DataObject $record): array
|
|
{
|
|
if ($record->hasExtension(Versioned::class)) {
|
|
return [];
|
|
}
|
|
|
|
if ($this->stagesDifferRecursive($record)) {
|
|
return [
|
|
'modified' => [
|
|
'text' => _t(__CLASS__ . '.MODIFIEDONDRAFTSHORT', 'Modified'),
|
|
'title' => _t(__CLASS__ . '.MODIFIEDONDRAFTHELP', 'Item has unpublished changes'),
|
|
]
|
|
];
|
|
}
|
|
|
|
return [];
|
|
}
|
|
|
|
/**
|
|
* Check if stages differ for a given record and all its relations
|
|
*/
|
|
private function stagesDifferRecursive(DataObject $record): bool
|
|
{
|
|
/** @var RecursiveStagesInterface $service */
|
|
$service = Injector::inst()->get(RecursiveStagesInterface::class);
|
|
|
|
return $service->stagesDifferRecursive($record);
|
|
}
|
|
}
|