1
0
mirror of https://github.com/processwire/processwire.git synced 2025-08-08 07:47:00 +02:00

Add feature request processwire/processwire-requests#520 - ability do disable (hide) image items in a multiple image field

This commit is contained in:
Ryan Cramer
2024-02-23 13:20:37 -05:00
parent 837a8fd32a
commit f893cec515
5 changed files with 76 additions and 13 deletions

View File

@@ -1476,6 +1476,28 @@ class Pagefile extends WireData implements WireArrayItem {
return $filenames; return $filenames;
} }
/**
* Get or set hidden state of this file
*
* Files that are hidden do not appear in the formatted field value,
* but do appear in the unformatted value.
*
* @param bool|null $set
* @since 3.0.237
*
*/
public function hidden($set = null) {
$value = (bool) $this->filedata('_hide');
if($set === null || $set === $value) return $value;
if($set === false) {
$this->filedata(false, '_hide');
} else if($set === true) {
$this->filedata('_hide', true);
} else {
throw new WireException('Invalid arg for Pagefile::hidden(arg)');
}
return $set;
}
/** /**
* Ensures that isset() and empty() work for dynamic class properties * Ensures that isset() and empty() work for dynamic class properties

View File

@@ -730,7 +730,7 @@ class FieldtypeFile extends FieldtypeMulti implements ConfigurableModule, Fieldt
foreach($value as $pagefile) { foreach($value as $pagefile) {
/** @var Pagefile $pagefile */ /** @var Pagefile $pagefile */
if($pagefile->isTemp()) $value->removeQuietly($pagefile); if($pagefile->isTemp() || $pagefile->hidden()) $value->removeQuietly($pagefile);
} }
$textformatters = $field->get('textformatters'); $textformatters = $field->get('textformatters');

File diff suppressed because one or more lines are too long

View File

@@ -5,7 +5,7 @@
* *
* Inputfield for FieldtypeImage fields * Inputfield for FieldtypeImage fields
* *
* ProcessWire 3.x, Copyright 2023 by Ryan Cramer * ProcessWire 3.x, Copyright 2024 by Ryan Cramer
* https://processwire.com * https://processwire.com
* *
* Accessible Properties * Accessible Properties
@@ -59,7 +59,7 @@ class InputfieldImage extends InputfieldFile implements InputfieldItemList, Inpu
return array( return array(
'title' => __('Images', __FILE__), // Module Title 'title' => __('Images', __FILE__), // Module Title
'summary' => __('One or more image uploads (sortable)', __FILE__), // Module Summary 'summary' => __('One or more image uploads (sortable)', __FILE__), // Module Summary
'version' => 127, 'version' => 128,
'permanent' => true, 'permanent' => true,
); );
} }
@@ -145,6 +145,8 @@ class InputfieldImage extends InputfieldFile implements InputfieldItemList, Inpu
'drag-drop-in' => $this->_('drag and drop in new images above'), 'drag-drop-in' => $this->_('drag and drop in new images above'),
'na' => $this->_('N/A'), // for JS 'na' => $this->_('N/A'), // for JS
'changes' => $this->_('This images field may have unsaved changes that could be lost after this action. Please save before cropping, or double-click the button proceed anyway.'), 'changes' => $this->_('This images field may have unsaved changes that could be lost after this action. Please save before cropping, or double-click the button proceed anyway.'),
'visibility' => $this->_('Visibility'),
'hidden' => $this->_('Hidden'),
)); ));
$themeDefaults = array( $themeDefaults = array(
@@ -325,7 +327,9 @@ class InputfieldImage extends InputfieldFile implements InputfieldItemList, Inpu
protected function renderItemWrap($out) { protected function renderItemWrap($out) {
$item = $this->currentItem; $item = $this->currentItem;
$id = $item && !$this->renderValueMode ? " id='file_$item->hash'" : ""; $id = $item && !$this->renderValueMode ? " id='file_$item->hash'" : "";
return "<li$id class='ImageOuter $this->itemClass'>$out</li>"; $class = "ImageOuter $this->itemClass";
if($item->hidden()) $class .= ' InputfieldFileItemHidden';
return "<li$id class='$class'>$out</li>";
} }
/** /**
@@ -659,6 +663,11 @@ class InputfieldImage extends InputfieldFile implements InputfieldItemList, Inpu
if($extra->exists()) $fileStats .= " &bull; $extra->filesizeStr $name ($extra->savingsPct)"; if($extra->exists()) $fileStats .= " &bull; $extra->filesizeStr $name ($extra->savingsPct)";
} }
if($pagefile->hidden()) {
$fileStats .= '&nbsp; ' . wireIconMarkup('eye-slash') . ' ' .
$sanitizer->entities1($this->labels['hidden']);
}
$class = 'gridImage__overflow'; $class = 'gridImage__overflow';
if($pagefile->ext() === 'svg') { if($pagefile->ext() === 'svg') {
$class .= ' ' . ($pagefile->ratio < 1 ? 'portrait' : 'landscape'); $class .= ' ' . ($pagefile->ratio < 1 ? 'portrait' : 'landscape');
@@ -1024,14 +1033,24 @@ class InputfieldImage extends InputfieldFile implements InputfieldItemList, Inpu
'x50' => $this->_('Reduce 50%'), 'x50' => $this->_('Reduce 50%'),
'bw' => $this->_('B&W'), // Black and White 'bw' => $this->_('B&W'), // Black and White
'sep' => $this->_('Sepia'), 'sep' => $this->_('Sepia'),
'hide' => $this->_('Hide'),
'unhide' => $this->_('Unhide'),
); );
$actions = array( $actions = array();
'dup' => $labels['dup'],
); if($this->maxFiles != 1) {
if($pagefile->hidden()) {
$actions['unhide'] = $labels['unhide'];
} else {
$actions['hide'] = $labels['hide'];
}
}
if($this->maxFiles && count($pagefile->pagefiles) >= $this->maxFiles) { if($this->maxFiles && count($pagefile->pagefiles) >= $this->maxFiles) {
unset($actions['dup']); // no dup action
} else {
$actions['dup'] = $labels['dup'];
} }
if($pagefile->ext() != 'svg') { if($pagefile->ext() != 'svg') {
@@ -1258,6 +1277,13 @@ class InputfieldImage extends InputfieldFile implements InputfieldItemList, Inpu
) )
); );
if($pagefile->hidden()) {
$data[] = array(
$this->labels['visibility'],
wireIconMarkup('eye-slash') . ' ' . $this->labels['hidden']
);
}
if(strlen($pagefile->description)) { if(strlen($pagefile->description)) {
$data[] = array( $data[] = array(
$this->labels['description'], $this->labels['description'],
@@ -1413,6 +1439,12 @@ class InputfieldImage extends InputfieldFile implements InputfieldItemList, Inpu
// remove focus // remove focus
$pagefile->focus(false); $pagefile->focus(false);
$success = true; $success = true;
} else if($action == 'hide') {
$pagefile->hidden(true);
$success = true;
} else if($action == 'unhide') {
$pagefile->hidden(false);
$success = true;
} else { } else {
/** @var ImageSizer $sizer Image sizer actions */ /** @var ImageSizer $sizer Image sizer actions */
$sizer = $this->wire(new ImageSizer($pagefile->filename())); $sizer = $this->wire(new ImageSizer($pagefile->filename()));

View File

@@ -5,7 +5,6 @@ $gridMargin: 0 0.6em 0.6em 0;
$itemPadding: 0.4em; $itemPadding: 0.4em;
$focusPointCircleSize: 40px; $focusPointCircleSize: 40px;
.InputfieldImage { .InputfieldImage {
.InputfieldHeader { .InputfieldHeader {
.InputfieldImageListToggle { .InputfieldImageListToggle {
@@ -400,6 +399,16 @@ $focusPointCircleSize: 40px;
background: rgba($deleteColor, 0.3); background: rgba($deleteColor, 0.3);
} }
} }
&.InputfieldFileItemHidden {
border-style: dashed !important;
img {
opacity: 0.3;
}
.gridImage__overflow {
background-image: none;
}
}
} }
// A type of item that appears in a ul.gridImages but is not itself a .gridImage. // A type of item that appears in a ul.gridImages but is not itself a .gridImage.