diff --git a/wire/core/Pagefile.php b/wire/core/Pagefile.php index a5eafddd..c26b061a 100644 --- a/wire/core/Pagefile.php +++ b/wire/core/Pagefile.php @@ -1476,6 +1476,28 @@ class Pagefile extends WireData implements WireArrayItem { 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 diff --git a/wire/modules/Fieldtype/FieldtypeFile/FieldtypeFile.module b/wire/modules/Fieldtype/FieldtypeFile/FieldtypeFile.module index 6459da66..991cbe24 100644 --- a/wire/modules/Fieldtype/FieldtypeFile/FieldtypeFile.module +++ b/wire/modules/Fieldtype/FieldtypeFile/FieldtypeFile.module @@ -730,7 +730,7 @@ class FieldtypeFile extends FieldtypeMulti implements ConfigurableModule, Fieldt foreach($value as $pagefile) { /** @var Pagefile $pagefile */ - if($pagefile->isTemp()) $value->removeQuietly($pagefile); + if($pagefile->isTemp() || $pagefile->hidden()) $value->removeQuietly($pagefile); } $textformatters = $field->get('textformatters'); diff --git a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.css b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.css index 7f737f5f..ac20ac9f 100644 --- a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.css +++ b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.css @@ -1 +1 @@ -.InputfieldImage .InputfieldHeader .InputfieldImageListToggle{float:right;padding-right:.75em;position:relative}.InputfieldImage .InputfieldHeader .InputfieldImageListToggle--active{opacity:.5}.InputfieldImage .InputfieldHeader .InputfieldImageListToggle:first-child{padding-right:1em}.InputfieldImage .InputfieldHeader .InputfieldImageSizeSlider{float:right;width:100px;position:relative;top:8px;right:1em}.InputfieldImage .InputfieldHeader .InputfieldImageSizeSlider .ui-slider-handle{outline:none}.InputfieldImage.InputfieldFileEmpty .InputfieldImageListToggle,.InputfieldImage.InputfieldFileEmpty .InputfieldImageSizeSlider,.InputfieldImage.InputfieldStateCollapsed .InputfieldImageListToggle,.InputfieldImage.InputfieldStateCollapsed .InputfieldImageSizeSlider{display:none}.InputfieldImageErrors{padding-left:0;margin-left:0}.InputfieldImageErrors li{margin-bottom:.5em;margin-top:0;color:#fff;background-color:#fc3a3f;padding:.3em .5em}.gridImages{list-style:none;padding-left:0;position:relative;margin:0;margin-right:-0.6em;display:block;list-style:none}.gridImage .gridImage__overflow,.InputfieldImageEditAll .gridImage .gridImage__overflow img,.InputfieldImageEdit__image{background-color:#fefefe;background-image:linear-gradient(45deg, #cbcbcb 25%, transparent 25%, transparent 75%, #cbcbcb 75%, #cbcbcb),linear-gradient(45deg, #cbcbcb 25%, transparent 25%, transparent 75%, #cbcbcb 75%, #cbcbcb);background-size:16px 16px;background-position:0 0,8px 8px}.gridImage{list-style:none;position:relative;display:inline-block;box-shadow:0 1px 3px rgba(0,0,0,.2);border-radius:2px;background:#fff;padding:.4em;vertical-align:top;border:1px dashed transparent}li.gridImage{display:inline-block;margin:0 .6em .6em 0}.gridImage__overflow{width:100%;height:100%;overflow:hidden;position:relative}.gridImage__overflow>img{position:absolute;top:50%;left:50%;-ms-transform:translate3d(-50%, -50%, 0);transform:translate3d(-50%, -50%, 0)}.gridImage.gridImagePlaceholder .gridImage__overflow{background:#fff}.gridImage.ui-sortable-placeholder{display:inline-block;border-radius:2px;border:1px dashed #ccc;padding:.4em;visibility:visible !important;vertical-align:top;background-color:transparent;box-shadow:none}.gridImage.ui-sortable-placeholder::after{content:" ";display:block}.gridImage__hover{position:absolute;top:0;left:0;width:100%;height:100%;padding:.4em}.gridImage__inner{position:relative;width:100%;height:100%}.gridImage:hover .gridImage__inner{background:rgba(62,185,152,.7)}.gridImage__resize{position:absolute;display:block;height:100%;width:100%;line-height:130px;text-align:center;color:#fff;font-size:1.3em;cursor:move;text-shadow:0 0 7px rgba(62,185,152,.7)}.gridImage__resize.pw-resizing{text-shadow:none;background:rgba(0,0,0,.7)}.gridImage__progress{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;color:#3eb998;width:100%;height:10px;background:transparent;position:absolute;bottom:0;left:0}.gridImage__progress::-webkit-progress-bar{background-color:inherit}.gridImage__progress[value]::-webkit-progress-value{background-color:#3eb998}.gridImage__progress[value]::-moz-progress-bar{background-color:#3eb998}.gridImage__progress[value="-1"]{background-color:#e83561}.gridImage__btn{position:relative;float:left;background:#fff;padding:.2em .6em;color:#aaa;z-index:2;cursor:pointer}.gridImage .gridImage__btn{display:none}.gridImage__btn--single{display:block !important;position:static}.gridImage__btn>input{display:none}.gridImage:hover .gridImage__btn{display:block}.gridImage:hover .gridImage__btn:hover{display:block;color:#e83561;background-color:#fff}.gridImage__edit{position:absolute;display:block;height:100%;width:100%;line-height:130px;text-align:center;color:#fff !important;font-size:1.3em;cursor:move;text-shadow:0 0 7px rgba(62,185,152,.7);display:none}.gridImage__edit span{cursor:pointer}.gridImage:hover .gridImage__edit{display:block}.gridImage__edit:hover{color:#fff}.gridImage__tooltip{pointer-events:none;position:absolute;bottom:100%;padding:20px;-webkit-filter:drop-shadow(0 0 5px rgba(0, 0, 0, 0.1));filter:drop-shadow(0 0 5px rgba(0, 0, 0, 0.1));left:50%;transform:translate(-50%, 0);margin-bottom:12px;background:#fff;z-index:110;box-shadow:0 0 1px rgba(0,0,0,.25);opacity:0;transition:opacity .2s 2}.gridImage:hover .gridImage__tooltip{display:block;opacity:1;transition:opacity .2s 1s}.InputfieldImageSorting .gridImage__tooltip{display:none !important}.gridImage__tooltip input{pointer-events:none}.gridImage__tooltip table{margin:0;border-spacing:10px 0;border-collapse:separate}.gridImage__tooltip table th{color:#000;font-weight:bold;text-align:right}.gridImage__tooltip table th,.gridImage__tooltip table td{border:none !important;background:#fff !important}.gridImage__tooltip:after{top:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-color:rgba(255,255,255,0);border-top-color:#fff;border-width:10px;margin-left:-10px}.gridImage.gridImageEditing .gridImage__inner{background:rgba(62,185,152,.5)}.gridImage--active{background-color:#3eb998}.gridImage--active .gridImage__inner{background:rgba(62,185,152,.5)}.gridImage--active .gridImage__btn{background-color:#3eb998;color:#fff}.gridImage--active .gridImage__btn:hover{background-color:#3eb998}.gridImage--active:hover .gridImage__btn:hover{background-color:#3eb998}.gridImage--delete{background-color:#e83561}.InputfieldImageEditSingle.gridImage--delete{background-color:transparent}.InputfieldImageEditSingle.gridImage--delete .InputfieldImageEdit__inner{outline:3px solid #e83561}.gridImage--delete .gridImage__trash{background-color:#e83561;color:#fff;display:block}.gridImage--delete .gridImage__trash:hover{background-color:#e83561}.gridImage--delete:hover .gridImage__edit{display:none}.gridImage--delete:hover .gridImage__trash:hover{background-color:#e83561;color:#fff}.gridImage--delete:hover .gridImage__inner{background:rgba(232,53,97,.3)}.InputfieldImageEdit{position:relative;display:none}.InputfieldImageEdit--active,.InputfieldImageEditSingle{display:block}.InputfieldImageEdit__core{margin-bottom:.5em}.InputfieldImageEdit__inner{position:relative;display:flex;flex-flow:row;margin:1em .6em 1em 0;-webkit-filter:drop-shadow(0 1px 3px rgba(0, 0, 0, 0.2));filter:drop-shadow(0 1px 3px rgba(0, 0, 0, 0.2));background-color:#fff}.InputfieldImageEdit__close{cursor:pointer;position:absolute;font-size:1.4em;right:.5em;top:0;color:#ccc !important;text-decoration:none !important}.InputfieldFileSingle .InputfieldImageEdit__close{display:none}.InputfieldImageEdit__trash-single{cursor:pointer;position:absolute;font-size:1.4em;right:0;top:0;color:#aaa !important;text-decoration:none !important}.InputfieldImageEdit__trash-single:hover{color:#e83561}.InputfieldImageEdit__arrow{bottom:100%;content:" ";height:0;width:0;position:absolute;pointer-events:none;border:.5em solid rgba(255,255,255,0);border-bottom-color:#fff;transform:translate(-50%, 0)}.InputfieldImageEdit__imagewrapper{display:inline-block;display:flex;vertical-align:top;justify-content:space-around;width:300px;border-right:1px solid #eee;min-height:1em;padding:20px}.InputfieldImageEdit__imagewrapper>div{width:100%;position:relative}.InputfieldImageEdit__imagewrapper .detail{text-align:center;margin-top:2px}.InputfieldImageEdit__imagewrapper .detail-upload{display:block;opacity:0}.InputfieldImageEdit__imagewrapper .detail-focus{display:none}.InputfieldImageEdit__imagewrapper:hover .detail-upload{opacity:.7}.InputfieldImageEdit__imagewrapper>div.focusWrap .detail-upload{display:none}.InputfieldImageEdit__imagewrapper>div.focusWrap .detail-focus{display:block;opacity:.7}.InputfieldImageEdit__replace img{opacity:.5}.InputfieldImageEdit__edit{display:inline-block;vertical-align:top;min-height:100%;padding:20px;flex-grow:1}.InputfieldImageEdit__edit .InputfieldFileDescription input,.InputfieldImageEdit__edit .InputfieldFileTags input{width:100%}.InputfieldImageEdit__image{position:relative;margin:0 auto;height:auto;cursor:zoom-in;max-width:100%}.InputfieldImageEdit__name{font-weight:bold;display:inline-block;margin-right:.5em !important;overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto;cursor:pointer}.InputfieldImageEdit__info{font-size:.9em;color:#ccc;white-space:nowrap}.InputfieldImageEdit__buttons{margin:1em 0 .5em 0}.InputfieldImageEdit__buttons button{margin-bottom:.5em}.InputfieldImageEdit__buttons button a,.InputfieldImageEdit__buttons button a:hover{text-decoration:none}.InputfieldImageEdit .InputfieldFileDescription+.InputfieldFileTags{margin-top:.5em}.gridImage__overflow .focusArea,.InputfieldImageEdit .focusArea{display:none;position:absolute;top:0;left:0;width:100%;height:100%;color:#fff;cursor:default}.gridImage__overflow .focusArea.focusActive,.InputfieldImageEdit .focusArea.focusActive{display:block;overflow:hidden}.gridImage__overflow .focusArea .focusCircle,.InputfieldImageEdit .focusArea .focusCircle{cursor:move;width:40px;height:40px;margin:-20px !important;border:3px solid #eb1d61;border-radius:50%;background-color:rgba(255,255,255,.6);background-image:url(data:image/gif;base64,R0lGODlhBAAEAIAAAOsdYQAAACH5BAAAAAAALAAAAAAEAAQAAAIEhI8JBQA7);background-position:15px 15px;background-repeat:no-repeat}.InputfieldImage .ImageData{display:none}.InputfieldImageValidExtensions{margin-left:1em}.InputfieldImageUpload{position:relative;margin:1em 0 0}.InputfieldImageUpload .AjaxUploadDropHere{display:none;position:absolute;top:0;right:0;opacity:.75;cursor:pointer}.ie-no-drop .InputfieldImageUpload .AjaxUploadDropHere{display:none;visibility:hidden}.InputfieldImageUpload .InputfieldImageRefresh{margin-bottom:0}.AdminThemeUikit .InputfieldImageValidExtensions{position:relative;top:-15px}.InputfieldImageNarrow .InputfieldHeader .InputfieldImageSizeSlider{width:50px}.InputfieldImageNarrow .InputfieldImageEdit__inner{display:block;padding-top:.5em}.InputfieldImageNarrow .InputfieldImageEdit__imagewrapper{display:block;width:100%;padding-bottom:0}.InputfieldImageNarrow .InputfieldImageEdit__edit{width:100%;padding-top:0}.InputfieldImageNarrow .InputfieldImageEdit__edit .InputfieldImageEdit__buttons,.InputfieldImageNarrow .InputfieldImageEdit__edit .InputfieldImageEdit__info{display:block;text-align:center}.InputfieldImageNarrow .InputfieldImageEdit__name{margin:0;display:block;text-align:center}.InputfieldImageNarrow .InputfieldImageUpload .AjaxUploadDropHere{display:none !important}.InputfieldFileSingle .gridImages .gridImage img,.InputfieldRenderValueMode .gridImages .gridImage img{cursor:zoom-in}.InputfieldImageEditAll .gridImage{display:block;width:100%}.InputfieldImageEditAll .gridImage:before,.InputfieldImageEditAll .gridImage:after{content:"";display:table;border-collapse:collapse}.InputfieldImageEditAll .gridImage:after{clear:both}.InputfieldImageEditAll .gridImage__overflow{position:relative;z-index:2;top:0;left:0;float:left;background:none;display:block;height:auto !important;width:23%;overflow:visible;cursor:move;padding:10px;padding-right:0}.InputfieldImageEditAll .gridImage__overflow>img{display:block;position:static !important;top:0;left:0;transition:none;-ms-transform:none;transform:none;width:100%;max-width:100% !important;height:initial !important;cursor:move}.InputfieldImageEditAll .gridImage__overflow>.focusArea{position:absolute;top:10px;left:10px}.InputfieldImageEditAll .gridImage .ImageData{position:relative;float:left;display:block;width:77%;padding-left:20px;padding-right:10px;z-index:3}.InputfieldImageEditAll .gridImage .ImageData .InputfieldFileDescription{margin-bottom:.5em}.InputfieldImageEditAll .gridImage .ImageData .InputfieldImageEdit__name{margin-bottom:0;margin-top:1em;position:relative;z-index:100;cursor:pointer}.InputfieldImageEditAll .gridImage .ImageData .InputfieldFileSort{display:none}.InputfieldImageEditAll .gridImage .ImageData input{position:relative;z-index:4}.InputfieldImageEditAll .gridImage.gridImagePlaceholder .gridImage__overflow{background:#fff}.InputfieldImageEditAll .gridImage__inner .gridImage__edit{display:none}.InputfieldImageEditAll .gridImage:hover .gridImage__inner{background:none}.InputfieldImageEditAll .gridImage .InputfieldImageEdit__core input{width:100%}.InputfieldImageEditAll .gridImage__resize{margin-top:10px;color:#e83561;text-shadow:none}.InputfieldImageEditAll .gridImage__progress{bottom:10px;margin-left:10px}.InputfieldImageEditAll .gridImage.gridImageUploading .gridImage__overflow{margin-bottom:10px}.InputfieldImageEditAll .gridImage.gridImageUploading .gridImage__inner{overflow:hidden}.InputfieldImageEditAll .gridImage__btn{z-index:5;display:block !important;top:0;right:0;float:right;background:transparent}.InputfieldImageEditAll .gridImage__edit{display:none}.InputfieldImageEditAll .gridImage__tooltip{display:none !important}.InputfieldImageEditAll .gridImage--delete{background-color:#e83561;border-bottom:8px solid transparent;height:45px;overflow:hidden}.InputfieldImageEditAll .gridImage--delete .gridImage__overflow{display:none}.InputfieldImageEditAll .gridImage--delete .ImageData{padding-left:10px;width:100%}.InputfieldImageEditAll .gridImage--delete .ImageData .InputfieldImageEdit__name{color:rgba(255,255,255,.6);margin-top:3px;text-decoration:line-through}.InputfieldImageEditAll .gridImage--delete .InputfieldImageEdit__info{color:rgba(255,255,255,.4)}.InputfieldImageEditAll .gridImage--delete .InputfieldImageEdit__buttons,.InputfieldImageEditAll .gridImage--delete .InputfieldImageEdit__core,.InputfieldImageEditAll .gridImage--delete .InputfieldImageEdit__additional{display:none}.InputfieldImageEditAll .gridImage--delete .gridImage__btn{color:#fff}.InputfieldImageEditAll .gridImage--delete:hover .gridImage__btn:hover{color:#fff;background-color:#e83561}.InputfieldImageEditAll .gridImage--delete:hover .gridImage__hover,.InputfieldImageEditAll .gridImage--delete .gridImage__hover{background:rgba(255,255,255,0)}.InputfieldImageEditAll.InputfieldImageNarrow .gridImage__overflow{display:block;width:100% !important;height:auto !important;padding:0}.InputfieldImageEditAll.InputfieldImageNarrow .gridImage__overflow img{width:100% !important;height:auto !important}.InputfieldImageEditAll.InputfieldImageNarrow .gridImage__overflow>.focusArea{top:0;left:0}.InputfieldImageEditAll.InputfieldImageNarrow .gridImage .ImageData{padding:0;width:100% !important;display:block}.InputfieldImageEditAll.InputfieldImageNarrow .gridImage .ImageData .InputfieldImageEdit__name{margin-top:.5em}.InputfieldImageEditAll.InputfieldImageNarrow .gridImage .ImageData .InputfieldImageEdit__name,.InputfieldImageEditAll.InputfieldImageNarrow .gridImage .ImageData .InputfieldImageEdit__buttons,.InputfieldImageEditAll.InputfieldImageNarrow .gridImage .ImageData .InputfieldImageEdit__info{text-align:center;display:block}.InputfieldFileActionNote{display:none;white-space:nowrap}.InputfieldImageList .gridImage__overflow.landscape img{height:100%}.InputfieldImageList .gridImage__overflow.portrait img{width:100%}.InputfieldImageList[data-ragged="1"] .gridImage__overflow.portrait img{width:auto;height:100%} +.InputfieldImage .InputfieldHeader .InputfieldImageListToggle{float:right;padding-right:.75em;position:relative}.InputfieldImage .InputfieldHeader .InputfieldImageListToggle--active{opacity:.5}.InputfieldImage .InputfieldHeader .InputfieldImageListToggle:first-child{padding-right:1em}.InputfieldImage .InputfieldHeader .InputfieldImageSizeSlider{float:right;width:100px;position:relative;top:8px;right:1em}.InputfieldImage .InputfieldHeader .InputfieldImageSizeSlider .ui-slider-handle{outline:none}.InputfieldImage.InputfieldFileEmpty .InputfieldImageListToggle,.InputfieldImage.InputfieldFileEmpty .InputfieldImageSizeSlider,.InputfieldImage.InputfieldStateCollapsed .InputfieldImageListToggle,.InputfieldImage.InputfieldStateCollapsed .InputfieldImageSizeSlider{display:none}.InputfieldImageErrors{padding-left:0;margin-left:0}.InputfieldImageErrors li{margin-bottom:.5em;margin-top:0;color:#fff;background-color:#fc3a3f;padding:.3em .5em}.gridImages{list-style:none;padding-left:0;position:relative;margin:0;margin-right:-0.6em;display:block;list-style:none}.gridImage .gridImage__overflow,.InputfieldImageEditAll .gridImage .gridImage__overflow img,.InputfieldImageEdit__image{background-color:#fefefe;background-image:linear-gradient(45deg, #cbcbcb 25%, transparent 25%, transparent 75%, #cbcbcb 75%, #cbcbcb),linear-gradient(45deg, #cbcbcb 25%, transparent 25%, transparent 75%, #cbcbcb 75%, #cbcbcb);background-size:16px 16px;background-position:0 0,8px 8px}.gridImage{list-style:none;position:relative;display:inline-block;box-shadow:0 1px 3px rgba(0,0,0,.2);border-radius:2px;background:#fff;padding:.4em;vertical-align:top;border:1px dashed transparent}li.gridImage{display:inline-block;margin:0 .6em .6em 0}.gridImage__overflow{width:100%;height:100%;overflow:hidden;position:relative}.gridImage__overflow>img{position:absolute;top:50%;left:50%;-ms-transform:translate3d(-50%, -50%, 0);transform:translate3d(-50%, -50%, 0)}.gridImage.gridImagePlaceholder .gridImage__overflow{background:#fff}.gridImage.ui-sortable-placeholder{display:inline-block;border-radius:2px;border:1px dashed #ccc;padding:.4em;visibility:visible !important;vertical-align:top;background-color:transparent;box-shadow:none}.gridImage.ui-sortable-placeholder::after{content:" ";display:block}.gridImage__hover{position:absolute;top:0;left:0;width:100%;height:100%;padding:.4em}.gridImage__inner{position:relative;width:100%;height:100%}.gridImage:hover .gridImage__inner{background:rgba(62,185,152,.7)}.gridImage__resize{position:absolute;display:block;height:100%;width:100%;line-height:130px;text-align:center;color:#fff;font-size:1.3em;cursor:move;text-shadow:0 0 7px rgba(62,185,152,.7)}.gridImage__resize.pw-resizing{text-shadow:none;background:rgba(0,0,0,.7)}.gridImage__progress{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;color:#3eb998;width:100%;height:10px;background:transparent;position:absolute;bottom:0;left:0}.gridImage__progress::-webkit-progress-bar{background-color:inherit}.gridImage__progress[value]::-webkit-progress-value{background-color:#3eb998}.gridImage__progress[value]::-moz-progress-bar{background-color:#3eb998}.gridImage__progress[value="-1"]{background-color:#e83561}.gridImage__btn{position:relative;float:left;background:#fff;padding:.2em .6em;color:#aaa;z-index:2;cursor:pointer}.gridImage .gridImage__btn{display:none}.gridImage__btn--single{display:block !important;position:static}.gridImage__btn>input{display:none}.gridImage:hover .gridImage__btn{display:block}.gridImage:hover .gridImage__btn:hover{display:block;color:#e83561;background-color:#fff}.gridImage__edit{position:absolute;display:block;height:100%;width:100%;line-height:130px;text-align:center;color:#fff !important;font-size:1.3em;cursor:move;text-shadow:0 0 7px rgba(62,185,152,.7);display:none}.gridImage__edit span{cursor:pointer}.gridImage:hover .gridImage__edit{display:block}.gridImage__edit:hover{color:#fff}.gridImage__tooltip{pointer-events:none;position:absolute;bottom:100%;padding:20px;-webkit-filter:drop-shadow(0 0 5px rgba(0, 0, 0, 0.1));filter:drop-shadow(0 0 5px rgba(0, 0, 0, 0.1));left:50%;transform:translate(-50%, 0);margin-bottom:12px;background:#fff;z-index:110;box-shadow:0 0 1px rgba(0,0,0,.25);opacity:0;transition:opacity .2s 2}.gridImage:hover .gridImage__tooltip{display:block;opacity:1;transition:opacity .2s 1s}.InputfieldImageSorting .gridImage__tooltip{display:none !important}.gridImage__tooltip input{pointer-events:none}.gridImage__tooltip table{margin:0;border-spacing:10px 0;border-collapse:separate}.gridImage__tooltip table th{color:#000;font-weight:bold;text-align:right}.gridImage__tooltip table th,.gridImage__tooltip table td{border:none !important;background:#fff !important}.gridImage__tooltip:after{top:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-color:rgba(255,255,255,0);border-top-color:#fff;border-width:10px;margin-left:-10px}.gridImage.gridImageEditing .gridImage__inner{background:rgba(62,185,152,.5)}.gridImage--active{background-color:#3eb998}.gridImage--active .gridImage__inner{background:rgba(62,185,152,.5)}.gridImage--active .gridImage__btn{background-color:#3eb998;color:#fff}.gridImage--active .gridImage__btn:hover{background-color:#3eb998}.gridImage--active:hover .gridImage__btn:hover{background-color:#3eb998}.gridImage--delete{background-color:#e83561}.InputfieldImageEditSingle.gridImage--delete{background-color:transparent}.InputfieldImageEditSingle.gridImage--delete .InputfieldImageEdit__inner{outline:3px solid #e83561}.gridImage--delete .gridImage__trash{background-color:#e83561;color:#fff;display:block}.gridImage--delete .gridImage__trash:hover{background-color:#e83561}.gridImage--delete:hover .gridImage__edit{display:none}.gridImage--delete:hover .gridImage__trash:hover{background-color:#e83561;color:#fff}.gridImage--delete:hover .gridImage__inner{background:rgba(232,53,97,.3)}.gridImage.InputfieldFileItemHidden{border-style:dashed !important}.gridImage.InputfieldFileItemHidden img{opacity:.3}.gridImage.InputfieldFileItemHidden .gridImage__overflow{background-image:none}.InputfieldImageEdit{position:relative;display:none}.InputfieldImageEdit--active,.InputfieldImageEditSingle{display:block}.InputfieldImageEdit__core{margin-bottom:.5em}.InputfieldImageEdit__inner{position:relative;display:flex;flex-flow:row;margin:1em .6em 1em 0;-webkit-filter:drop-shadow(0 1px 3px rgba(0, 0, 0, 0.2));filter:drop-shadow(0 1px 3px rgba(0, 0, 0, 0.2));background-color:#fff}.InputfieldImageEdit__close{cursor:pointer;position:absolute;font-size:1.4em;right:.5em;top:0;color:#ccc !important;text-decoration:none !important}.InputfieldFileSingle .InputfieldImageEdit__close{display:none}.InputfieldImageEdit__trash-single{cursor:pointer;position:absolute;font-size:1.4em;right:0;top:0;color:#aaa !important;text-decoration:none !important}.InputfieldImageEdit__trash-single:hover{color:#e83561}.InputfieldImageEdit__arrow{bottom:100%;content:" ";height:0;width:0;position:absolute;pointer-events:none;border:.5em solid rgba(255,255,255,0);border-bottom-color:#fff;transform:translate(-50%, 0)}.InputfieldImageEdit__imagewrapper{display:inline-block;display:flex;vertical-align:top;justify-content:space-around;width:300px;border-right:1px solid #eee;min-height:1em;padding:20px}.InputfieldImageEdit__imagewrapper>div{width:100%;position:relative}.InputfieldImageEdit__imagewrapper .detail{text-align:center;margin-top:2px}.InputfieldImageEdit__imagewrapper .detail-upload{display:block;opacity:0}.InputfieldImageEdit__imagewrapper .detail-focus{display:none}.InputfieldImageEdit__imagewrapper:hover .detail-upload{opacity:.7}.InputfieldImageEdit__imagewrapper>div.focusWrap .detail-upload{display:none}.InputfieldImageEdit__imagewrapper>div.focusWrap .detail-focus{display:block;opacity:.7}.InputfieldImageEdit__replace img{opacity:.5}.InputfieldImageEdit__edit{display:inline-block;vertical-align:top;min-height:100%;padding:20px;flex-grow:1}.InputfieldImageEdit__edit .InputfieldFileDescription input,.InputfieldImageEdit__edit .InputfieldFileTags input{width:100%}.InputfieldImageEdit__image{position:relative;margin:0 auto;height:auto;cursor:zoom-in;max-width:100%}.InputfieldImageEdit__name{font-weight:bold;display:inline-block;margin-right:.5em !important;overflow-wrap:break-word;word-wrap:break-word;-ms-word-break:break-all;word-break:break-all;word-break:break-word;-ms-hyphens:auto;-moz-hyphens:auto;-webkit-hyphens:auto;hyphens:auto;cursor:pointer}.InputfieldImageEdit__info{font-size:.9em;color:#ccc;white-space:nowrap}.InputfieldImageEdit__buttons{margin:1em 0 .5em 0}.InputfieldImageEdit__buttons button{margin-bottom:.5em}.InputfieldImageEdit__buttons button a,.InputfieldImageEdit__buttons button a:hover{text-decoration:none}.InputfieldImageEdit .InputfieldFileDescription+.InputfieldFileTags{margin-top:.5em}.gridImage__overflow .focusArea,.InputfieldImageEdit .focusArea{display:none;position:absolute;top:0;left:0;width:100%;height:100%;color:#fff;cursor:default}.gridImage__overflow .focusArea.focusActive,.InputfieldImageEdit .focusArea.focusActive{display:block;overflow:hidden}.gridImage__overflow .focusArea .focusCircle,.InputfieldImageEdit .focusArea .focusCircle{cursor:move;width:40px;height:40px;margin:-20px !important;border:3px solid #eb1d61;border-radius:50%;background-color:rgba(255,255,255,.6);background-image:url(data:image/gif;base64,R0lGODlhBAAEAIAAAOsdYQAAACH5BAAAAAAALAAAAAAEAAQAAAIEhI8JBQA7);background-position:15px 15px;background-repeat:no-repeat}.InputfieldImage .ImageData{display:none}.InputfieldImageValidExtensions{margin-left:1em}.InputfieldImageUpload{position:relative;margin:1em 0 0}.InputfieldImageUpload .AjaxUploadDropHere{display:none;position:absolute;top:0;right:0;opacity:.75;cursor:pointer}.ie-no-drop .InputfieldImageUpload .AjaxUploadDropHere{display:none;visibility:hidden}.InputfieldImageUpload .InputfieldImageRefresh{margin-bottom:0}.AdminThemeUikit .InputfieldImageValidExtensions{position:relative;top:-15px}.InputfieldImageNarrow .InputfieldHeader .InputfieldImageSizeSlider{width:50px}.InputfieldImageNarrow .InputfieldImageEdit__inner{display:block;padding-top:.5em}.InputfieldImageNarrow .InputfieldImageEdit__imagewrapper{display:block;width:100%;padding-bottom:0}.InputfieldImageNarrow .InputfieldImageEdit__edit{width:100%;padding-top:0}.InputfieldImageNarrow .InputfieldImageEdit__edit .InputfieldImageEdit__buttons,.InputfieldImageNarrow .InputfieldImageEdit__edit .InputfieldImageEdit__info{display:block;text-align:center}.InputfieldImageNarrow .InputfieldImageEdit__name{margin:0;display:block;text-align:center}.InputfieldImageNarrow .InputfieldImageUpload .AjaxUploadDropHere{display:none !important}.InputfieldFileSingle .gridImages .gridImage img,.InputfieldRenderValueMode .gridImages .gridImage img{cursor:zoom-in}.InputfieldImageEditAll .gridImage{display:block;width:100%}.InputfieldImageEditAll .gridImage:before,.InputfieldImageEditAll .gridImage:after{content:"";display:table;border-collapse:collapse}.InputfieldImageEditAll .gridImage:after{clear:both}.InputfieldImageEditAll .gridImage__overflow{position:relative;z-index:2;top:0;left:0;float:left;background:none;display:block;height:auto !important;width:23%;overflow:visible;cursor:move;padding:10px;padding-right:0}.InputfieldImageEditAll .gridImage__overflow>img{display:block;position:static !important;top:0;left:0;transition:none;-ms-transform:none;transform:none;width:100%;max-width:100% !important;height:initial !important;cursor:move}.InputfieldImageEditAll .gridImage__overflow>.focusArea{position:absolute;top:10px;left:10px}.InputfieldImageEditAll .gridImage .ImageData{position:relative;float:left;display:block;width:77%;padding-left:20px;padding-right:10px;z-index:3}.InputfieldImageEditAll .gridImage .ImageData .InputfieldFileDescription{margin-bottom:.5em}.InputfieldImageEditAll .gridImage .ImageData .InputfieldImageEdit__name{margin-bottom:0;margin-top:1em;position:relative;z-index:100;cursor:pointer}.InputfieldImageEditAll .gridImage .ImageData .InputfieldFileSort{display:none}.InputfieldImageEditAll .gridImage .ImageData input{position:relative;z-index:4}.InputfieldImageEditAll .gridImage.gridImagePlaceholder .gridImage__overflow{background:#fff}.InputfieldImageEditAll .gridImage__inner .gridImage__edit{display:none}.InputfieldImageEditAll .gridImage:hover .gridImage__inner{background:none}.InputfieldImageEditAll .gridImage .InputfieldImageEdit__core input{width:100%}.InputfieldImageEditAll .gridImage__resize{margin-top:10px;color:#e83561;text-shadow:none}.InputfieldImageEditAll .gridImage__progress{bottom:10px;margin-left:10px}.InputfieldImageEditAll .gridImage.gridImageUploading .gridImage__overflow{margin-bottom:10px}.InputfieldImageEditAll .gridImage.gridImageUploading .gridImage__inner{overflow:hidden}.InputfieldImageEditAll .gridImage__btn{z-index:5;display:block !important;top:0;right:0;float:right;background:transparent}.InputfieldImageEditAll .gridImage__edit{display:none}.InputfieldImageEditAll .gridImage__tooltip{display:none !important}.InputfieldImageEditAll .gridImage--delete{background-color:#e83561;border-bottom:8px solid transparent;height:45px;overflow:hidden}.InputfieldImageEditAll .gridImage--delete .gridImage__overflow{display:none}.InputfieldImageEditAll .gridImage--delete .ImageData{padding-left:10px;width:100%}.InputfieldImageEditAll .gridImage--delete .ImageData .InputfieldImageEdit__name{color:rgba(255,255,255,.6);margin-top:3px;text-decoration:line-through}.InputfieldImageEditAll .gridImage--delete .InputfieldImageEdit__info{color:rgba(255,255,255,.4)}.InputfieldImageEditAll .gridImage--delete .InputfieldImageEdit__buttons,.InputfieldImageEditAll .gridImage--delete .InputfieldImageEdit__core,.InputfieldImageEditAll .gridImage--delete .InputfieldImageEdit__additional{display:none}.InputfieldImageEditAll .gridImage--delete .gridImage__btn{color:#fff}.InputfieldImageEditAll .gridImage--delete:hover .gridImage__btn:hover{color:#fff;background-color:#e83561}.InputfieldImageEditAll .gridImage--delete:hover .gridImage__hover,.InputfieldImageEditAll .gridImage--delete .gridImage__hover{background:rgba(255,255,255,0)}.InputfieldImageEditAll.InputfieldImageNarrow .gridImage__overflow{display:block;width:100% !important;height:auto !important;padding:0}.InputfieldImageEditAll.InputfieldImageNarrow .gridImage__overflow img{width:100% !important;height:auto !important}.InputfieldImageEditAll.InputfieldImageNarrow .gridImage__overflow>.focusArea{top:0;left:0}.InputfieldImageEditAll.InputfieldImageNarrow .gridImage .ImageData{padding:0;width:100% !important;display:block}.InputfieldImageEditAll.InputfieldImageNarrow .gridImage .ImageData .InputfieldImageEdit__name{margin-top:.5em}.InputfieldImageEditAll.InputfieldImageNarrow .gridImage .ImageData .InputfieldImageEdit__name,.InputfieldImageEditAll.InputfieldImageNarrow .gridImage .ImageData .InputfieldImageEdit__buttons,.InputfieldImageEditAll.InputfieldImageNarrow .gridImage .ImageData .InputfieldImageEdit__info{text-align:center;display:block}.InputfieldFileActionNote{display:none;white-space:nowrap}.InputfieldImageList .gridImage__overflow.landscape img{height:100%}.InputfieldImageList .gridImage__overflow.portrait img{width:100%}.InputfieldImageList[data-ragged="1"] .gridImage__overflow.portrait img{width:auto;height:100%} diff --git a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.module b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.module index f6d4b47c..23444552 100755 --- a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.module +++ b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.module @@ -5,7 +5,7 @@ * * Inputfield for FieldtypeImage fields * - * ProcessWire 3.x, Copyright 2023 by Ryan Cramer + * ProcessWire 3.x, Copyright 2024 by Ryan Cramer * https://processwire.com * * Accessible Properties @@ -59,7 +59,7 @@ class InputfieldImage extends InputfieldFile implements InputfieldItemList, Inpu return array( 'title' => __('Images', __FILE__), // Module Title 'summary' => __('One or more image uploads (sortable)', __FILE__), // Module Summary - 'version' => 127, + 'version' => 128, 'permanent' => true, ); } @@ -145,6 +145,8 @@ class InputfieldImage extends InputfieldFile implements InputfieldItemList, Inpu 'drag-drop-in' => $this->_('drag and drop in new images above'), '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.'), + 'visibility' => $this->_('Visibility'), + 'hidden' => $this->_('Hidden'), )); $themeDefaults = array( @@ -325,7 +327,9 @@ class InputfieldImage extends InputfieldFile implements InputfieldItemList, Inpu protected function renderItemWrap($out) { $item = $this->currentItem; $id = $item && !$this->renderValueMode ? " id='file_$item->hash'" : ""; - return "$out"; + $class = "ImageOuter $this->itemClass"; + if($item->hidden()) $class .= ' InputfieldFileItemHidden'; + return "$out"; } /** @@ -658,6 +662,11 @@ class InputfieldImage extends InputfieldFile implements InputfieldItemList, Inpu foreach($pagefile->extras() as $name => $extra) { if($extra->exists()) $fileStats .= " • $extra->filesizeStr $name ($extra->savingsPct)"; } + + if($pagefile->hidden()) { + $fileStats .= '  ' . wireIconMarkup('eye-slash') . ' ' . + $sanitizer->entities1($this->labels['hidden']); + } $class = 'gridImage__overflow'; if($pagefile->ext() === 'svg') { @@ -1023,15 +1032,25 @@ class InputfieldImage extends InputfieldFile implements InputfieldItemList, Inpu 'pas' => $this->_('Paste'), 'x50' => $this->_('Reduce 50%'), 'bw' => $this->_('B&W'), // Black and White - 'sep' => $this->_('Sepia'), + 'sep' => $this->_('Sepia'), + 'hide' => $this->_('Hide'), + 'unhide' => $this->_('Unhide'), ); - $actions = array( - 'dup' => $labels['dup'], - ); + $actions = array(); + + if($this->maxFiles != 1) { + if($pagefile->hidden()) { + $actions['unhide'] = $labels['unhide']; + } else { + $actions['hide'] = $labels['hide']; + } + } if($this->maxFiles && count($pagefile->pagefiles) >= $this->maxFiles) { - unset($actions['dup']); + // no dup action + } else { + $actions['dup'] = $labels['dup']; } if($pagefile->ext() != 'svg') { @@ -1257,6 +1276,13 @@ class InputfieldImage extends InputfieldFile implements InputfieldItemList, Inpu count($this->getPagefileVariations($pagefile)) ) ); + + if($pagefile->hidden()) { + $data[] = array( + $this->labels['visibility'], + wireIconMarkup('eye-slash') . ' ' . $this->labels['hidden'] + ); + } if(strlen($pagefile->description)) { $data[] = array( @@ -1411,8 +1437,14 @@ class InputfieldImage extends InputfieldFile implements InputfieldItemList, Inpu // remove variations } else if($action == 'rmf') { // remove focus - $pagefile->focus(false); - $success = true; + $pagefile->focus(false); + $success = true; + } else if($action == 'hide') { + $pagefile->hidden(true); + $success = true; + } else if($action == 'unhide') { + $pagefile->hidden(false); + $success = true; } else { /** @var ImageSizer $sizer Image sizer actions */ $sizer = $this->wire(new ImageSizer($pagefile->filename())); diff --git a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.scss b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.scss index c3f5e841..d4edecd2 100755 --- a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.scss +++ b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.scss @@ -5,7 +5,6 @@ $gridMargin: 0 0.6em 0.6em 0; $itemPadding: 0.4em; $focusPointCircleSize: 40px; - .InputfieldImage { .InputfieldHeader { .InputfieldImageListToggle { @@ -400,6 +399,16 @@ $focusPointCircleSize: 40px; 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.