Add status flag to File and Image Edit Form

API extension hook "getIsModifiedOnStage" renamed to "updateIsModifiedOnStage", also moved "getIsDeletedFromStage", "getIsModifiedOnStage" and "getIsAddedToStage" from SiteTree class to Versioned data extension class
This commit is contained in:
Christopher Joe 2016-10-04 17:09:11 +13:00 committed by Damian Mooyman
parent 60247a9fbd
commit d7ded0fb4a
6 changed files with 86 additions and 6 deletions

View File

@ -475,10 +475,14 @@ class File extends DataObject implements ShortcodeHandler, AssetContainer, Thumb
$previewLink = Convert::raw2att($this->PreviewLink());
$image = "<img src=\"{$previewLink}\" class=\"editor__thumbnail\" />";
$statusTitle = $this->getStatusTitle();
$statusFlag = ($statusTitle) ? "<span class=\"editor__status-flag\">{$statusTitle}</span>" : '';
$content = Tab::create('Main',
HeaderField::create('TitleHeader', $this->Title, 1)
->addExtraClass('editor__heading'),
LiteralField::create('StatusFlag', $statusFlag),
LiteralField::create("IconFull", $image)
->addExtraClass('editor__file-preview'),
TabSet::create('Editor',
@ -511,7 +515,18 @@ class File extends DataObject implements ShortcodeHandler, AssetContainer, Thumb
return $fields;
}
protected function getStatusTitle() {
$statusTitle = '';
if ($this->getIsAddedToStage()) {
$statusTitle = _t('File.DRAFT', 'Draft');
} elseif ($this->getIsModifiedOnStage()) {
$statusTitle = _t('File.MODIFIED', 'Modified');
}
return $statusTitle;
}
/**
* Returns a category based on the file extension.
* This can be useful when grouping files by type,

View File

@ -51,6 +51,9 @@ class Image extends File implements ShortcodeHandler {
$image = "<img src=\"{$previewLink}\" class=\"editor__thumbnail\" />";
$link = $this->Link();
$statusTitle = $this->getStatusTitle();
$statusFlag = "<span class=\"editor__status-flag\">{$statusTitle}</span>";
$content = Tab::create('Main',
HeaderField::create('TitleHeader', $this->Title, 1)
@ -92,10 +95,15 @@ class Image extends File implements ShortcodeHandler {
'TitleHeader',
LiteralField::create(
"DisplaySize",
sprintf('<div class="editor__specs">%spx, %s</div>',
$dimensions, $this->getSize())
sprintf('<div class="editor__specs">%spx, %s %s</div>',
$dimensions, $this->getSize(), $statusFlag)
)
);
} else {
$content->insertAfter(
'TitleHeader',
LiteralField::create('StatusFlag', $statusFlag)
);
}
$fields = FieldList::create(TabSet::create('Root', $content));

View File

@ -2328,8 +2328,56 @@ class Versioned extends DataExtension implements TemplateGlobalProvider {
);
return (bool)$result->value();
}
/**
* Compares current draft with live version, and returns true if no draft version of this page exists but the page
* is still published (eg, after triggering "Delete from draft site" in the CMS).
*
* @return bool
*/
public function getIsDeletedFromStage() {
if(!$this->owner->ID) return true;
$stageVersion = Versioned::get_versionnumber_by_stage($this->owner->class, Versioned::DRAFT, $this->owner->ID);
// Return true for both completely deleted pages and for pages just deleted from stage
return !($stageVersion);
}
/**
* Compares current draft with live version, and returns true if these versions differ, meaning there have been
* unpublished changes to the draft site.
*
* @return bool
*/
public function getIsModifiedOnStage() {
// New unsaved pages could be never be published
if(!$this->owner->ID) return false;
$stageVersion = Versioned::get_versionnumber_by_stage($this->owner->class, 'Stage', $this->owner->ID);
$liveVersion = Versioned::get_versionnumber_by_stage($this->owner->class, 'Live', $this->owner->ID);
$isModified = ($stageVersion && $stageVersion != $liveVersion);
$this->owner->extend('updateIsModifiedOnStage', $isModified);
return $isModified;
}
/**
* Compares current draft with live version, and returns true if no live version exists, meaning the page was never
* published.
*
* @return bool
*/
public function getIsAddedToStage() {
// New unsaved pages could be never be published
if(!$this->owner->ID) return false;
$stageVersion = Versioned::get_versionnumber_by_stage($this->owner->class, 'Stage', $this->owner->ID);
$liveVersion = Versioned::get_versionnumber_by_stage($this->owner->class, 'Live', $this->owner->ID);
return ($stageVersion && !$liveVersion);
}
/**
* Return the equivalent of a DataList::create() call, querying the latest

View File

@ -7,6 +7,9 @@ if (typeof(ss) === 'undefined' || typeof(ss.i18n) === 'undefined') {
} else {
ss.i18n.addDictionary('en', {
"FormField.NONE": "None",
"File.DRAFT": "Draft",
"File.MODIFIED": "Modified",
"File.PUBLISHED": "Published",
"FILEIFRAMEFIELD.CONFIRMDELETE": "Are you sure you want to delete this file?",
"FILEIFRAMEFIELD.DELETEFILE": "Delete File",
"FILEIFRAMEFIELD.DELETEIMAGE": "Delete Image",
@ -47,4 +50,4 @@ if (typeof(ss) === 'undefined' || typeof(ss.i18n) === 'undefined') {
"UploadField.WRITEFAILED": "Failed to write file to disk",
"VALIDATOR.FIELDREQUIRED": "Please fill out \"%s\", it is required."
});
}
}

View File

@ -1,5 +1,8 @@
{
"FormField.NONE": "None",
"FormField.NONE": "None",
"File.DRAFT": "Draft",
"File.MODIFIED": "Modified",
"File.PUBLISHED": "Published",
"FILEIFRAMEFIELD.CONFIRMDELETE": "Are you sure you want to delete this file?",
"FILEIFRAMEFIELD.DELETEFILE": "Delete File",
"FILEIFRAMEFIELD.DELETEIMAGE": "Delete Image",

View File

@ -202,6 +202,7 @@ en:
CssType: 'CSS file'
DmgType: 'Apple disk image'
DocType: 'Word document'
DRAFT: 'Draft'
Filename: Filename
GifType: 'GIF image - good for diagrams'
GzType: 'GZIP compressed file'
@ -212,6 +213,7 @@ en:
IcoType: 'Icon image'
JpgType: 'JPEG image - good for photos'
JsType: 'Javascript file'
MODIFIED: 'Modified'
Mp3Type: 'MP3 audio file'
MpgType: 'MPEG video file'
NOFILESIZE: 'Filesize is zero bytes.'
@ -220,6 +222,7 @@ en:
PLURALNAME: Files
PdfType: 'Adobe Acrobat PDF file'
PngType: 'PNG image - good general-purpose format'
PUBLISHED: 'Published'
SINGULARNAME: File
TOOLARGE: 'Filesize is too large, maximum {size} allowed'
TOOLARGESHORT: 'File size exceeds {size}'