diff --git a/wire/core/Pagefile.php b/wire/core/Pagefile.php index dfbef42a..6af8a130 100644 --- a/wire/core/Pagefile.php +++ b/wire/core/Pagefile.php @@ -12,7 +12,7 @@ * Pagefile objects are contained by a `Pagefiles` object. * #pw-body * - * ProcessWire 3.x, Copyright 2018 by Ryan Cramer + * ProcessWire 3.x, Copyright 2019 by Ryan Cramer * https://processwire.com * * @property-read string $url URL to the file on the server. @@ -23,6 +23,7 @@ * @property-read string $name Returns the filename without the path, same as the "basename" property. * @property-read string $hash Get a unique hash (for the page) representing this Pagefile. * @property-read array $tagsArray Get file tags as an array. #pw-group-tags @since 3.0.17 + * @property-read array $fieldValues Custom field values. #pw-internal @since 3.0.142 * @property int $sort Sort order in database. #pw-group-other * @property string $basename Returns the filename without the path. * @property string $description Value of the file’s description field (string), if enabled. Note you can also set this property directly. @@ -77,6 +78,17 @@ class Pagefile extends WireData { */ protected $filedata = array(); + /** + * Custom field values indexed by field name, loaded on request + * + * Values here have been run through wakeupValue and sanitizeValue already. + * Prior to that they are stored in $filedata (above). + * + * @var array + * + */ + protected $fieldValues = array(); + /** * Construct a new Pagefile * @@ -227,6 +239,8 @@ class Pagefile extends WireData { $language = $languages->get((int) $matches[1]); if($language && $language->id) return $this->setDescription($value, $language); } + } else if($this->setFieldValue($key, $value)) { + return $this; } return parent::set($key, $value); @@ -237,7 +251,6 @@ class Pagefile extends WireData { * * Filedata is any additional data that you want to store with the file’s database record. * - * * - To get a value, specify just the $key argument. Null is returned if request value is not present. * - To get all values, omit all arguments. An associative array will be returned. * - To set a value, specify the $key and the $value to set. @@ -558,11 +571,120 @@ class Pagefile extends WireData { $value = filemtime($this->filename()); if(strpos($key, 'Str')) $value = wireDate($this->wire('config')->dateFormat, $value); break; + case 'fieldValues': + return $this->fieldValues; + break; + default: + $value = $this->getFieldValue($key); + } if(is_null($value)) return parent::get($key); return $value; } + /** + * Get a custom field value + * + * #pw-internal Most non-core cases should just use get() or direct access rather than this method + * + * @param string $name + * @param bool|null Get as formatted value? true=yes, false=no, null=use page output formatting setting (default=null) + * @return mixed|null Returns value or null if not present + * @since 3.0.142 + * + */ + public function getFieldValue($name, $formatted = null) { + + $field = $this->wire('fields')->get($name); + if(!$field) return null; + + $template = $this->pagefiles->getFieldsTemplate(); + if(!$template) return null; + + $fieldgroup = $template->fieldgroup; + if(!$fieldgroup->hasField($field)) return null; + + $field = $fieldgroup->getFieldContext($field); // get in context + $fieldtype = $field->type; /** @var Fieldtype $fieldtype */ + $fileField = $this->pagefiles->getField(); /** @var Field $fileField */ + $fileFieldtype = $fileField->type; /** @var FieldtypeFile|FieldtypeImage $fileFieldtype */ + $page = $fileFieldtype->getFieldsPage($fileField); + + if(array_key_exists($name, $this->fieldValues)) { + $value = $this->fieldValues[$name]; + } else { + $idKey = "_$field->id"; + $value = $this->filedata($idKey); + if($value !== null) { + $value = $fieldtype->wakeupValue($page, $field, $value); + $value = $fieldtype->sanitizeValue($page, $field, $value); + } + $this->fieldValues[$name] = $value; + unset($this->filedata[$idKey]); // avoid storing double copies + } + + if($value === null) { + $value = $fieldtype->getBlankValue($page, $field); + $value = $fieldtype->sanitizeValue($page, $field, $value); + $this->fieldValues[$name] = $value; + } + + if($formatted === null) $formatted = $this->page->of(); + if($formatted) $value = $fieldtype->formatValue($page, $field, $value); + + return $value; + } + + /** + * Set a custom field value + * + * #pw-internal Most non-core cases should use set() instead + * + * @param string $name + * @param mixed $value + * @param bool|null $changed Specify true to force track change, false to force no change, or null to auto-detect (default=null) + * @return bool Returns true if value set, or false if not (like if there’s no template defined for the purpose) + * @since 3.0.142 + * + * + */ + public function setFieldValue($name, $value, $changed = null) { + + $template = $this->pagefiles->getFieldsTemplate(); + if(!$template) return false; + + $fieldgroup = $template->fieldgroup; + if(!$fieldgroup) return false; + + $field = $fieldgroup->getFieldContext($name); + if(!$field) return false; + + $page = $this->pagefiles->getFieldsPage(); + + /** @var Fieldtype $fieldtype */ + $fieldtype = $field->type; + $value = $fieldtype->sanitizeValue($page, $field, $value); + + if($changed === null && $this->page->trackChanges()) { + // detect if a change has taken place + $oldValue = $this->getFieldValue($field->name, false); + if(is_object($oldValue) && $oldValue instanceof Wire && $oldValue === $value) { + // $oldValue and new $value are the same object instance, so ask it if anything has changed + $changed = $oldValue->isChanged(); + if($changed) $this->trackChange($field->name); + } else if($oldValue != $value) { + // $oldValue and new $value differ, record change + $this->trackChange($field->name, $oldValue, $value); + } + } else if($changed === true) { + $this->trackChange($field->name); + } + + $this->fieldValues[$field->name] = $value; + + return true; + } + /** * Hookable no-cache URL * diff --git a/wire/core/Pagefiles.php b/wire/core/Pagefiles.php index e678593e..e9feab36 100644 --- a/wire/core/Pagefiles.php +++ b/wire/core/Pagefiles.php @@ -108,6 +108,12 @@ class Pagefiles extends WireArray implements PageFieldValueInterface { * */ protected $formatted = false; + + /** + * @var Template|null + * + */ + protected $fieldsTemplate = null; /** * Construct a Pagefiles object @@ -117,6 +123,7 @@ class Pagefiles extends WireArray implements PageFieldValueInterface { */ public function __construct(Page $page) { $this->setPage($page); + parent::__construct(); } /** @@ -917,6 +924,44 @@ class Pagefiles extends WireArray implements PageFieldValueInterface { return $this->formatted; } + /** + * Get Template object used for Pagefile custom fields, if available (false if not) + * + * #pw-internal + * + * @return bool|Template + * @since 3.0.142 + * + */ + public function getFieldsTemplate() { + if($this->fieldsTemplate === null) { + /** @var Field $field */ + $field = $this->getField(); + if($field) { + $this->fieldsTemplate = false; + /** @var FieldtypeFile $fieldtype */ + $fieldtype = $field->type; + $template = $fieldtype ? $fieldtype->getFieldsTemplate($field) : null; + if($template) $this->fieldsTemplate = $template; + } + } + return $this->fieldsTemplate; + } + + /** + * Get mock/placeholder Page object used for Pagefile custom fields + * + * @return Page + * @since 3.0.142 + * + */ + public function getFieldsPage() { + $field = $this->getField(); + /** @var FieldtypeFile $fieldtype */ + $fieldtype = $field->type; + return $fieldtype->getFieldsPage($field); + } + /** * Debug info * diff --git a/wire/modules/Fieldtype/FieldtypeFile.module b/wire/modules/Fieldtype/FieldtypeFile.module index b8a732f8..60c303a1 100644 --- a/wire/modules/Fieldtype/FieldtypeFile.module +++ b/wire/modules/Fieldtype/FieldtypeFile.module @@ -9,19 +9,20 @@ * /wire/core/Fieldtype.php * /wire/core/FieldtypeMulti.php * - * ProcessWire 3.x, Copyright 2017 by Ryan Cramer + * ProcessWire 3.x, Copyright 2019 by Ryan Cramer * https://processwire.com - * + * + * @property array $allowFieldtypes Allowed Fieldtype types for custom fields * @method string formatValueString(Page $page, Field $field, $value) * */ -class FieldtypeFile extends FieldtypeMulti { +class FieldtypeFile extends FieldtypeMulti implements ConfigurableModule { public static function getModuleInfo() { return array( 'title' => __('Files', __FILE__), - 'version' => 105, + 'version' => 106, 'summary' => __('Field that stores one or more files', __FILE__), 'permanent' => true, ); @@ -95,12 +96,40 @@ class FieldtypeFile extends FieldtypeMulti { */ protected $defaultInputfieldClass = ''; + /** + * Default fieldtypes allowed for custom fields + * + * @var array + * + */ + protected $defaultAllowFieldtypes = array( + 'Checkbox', + 'Datetime', + 'Email', + 'FieldsetClose', + 'FieldsetOpen', + 'Float', + 'Integer', + 'Page', + 'PageTitle', + 'PageTitleLanguage', + 'Text', + 'TextLanguage', + 'Textarea', + 'TextareaLanguage', + 'Toggle', + 'URL', + ); + + /** * Construct * */ public function __construct() { $this->defaultInputfieldClass = str_replace('Fieldtype', 'Inputfield', $this->className); + if($this->className() === 'FieldtypeFile') $this->allowFieldtypes = $this->defaultAllowFieldtypes; + parent::__construct(); } /** @@ -214,7 +243,11 @@ class FieldtypeFile extends FieldtypeMulti { if(isset($v['modified'])) $pagefile->modified = $v['modified']; if(isset($v['created'])) $pagefile->created = $v['created']; if(isset($v['tags'])) $pagefile->tags = $v['tags']; - if(!empty($v['filedata'])) $pagefile->filedata = json_decode($v['filedata'], true); + if(!empty($v['filedata'])) { + $filedata = json_decode($v['filedata'], true); + unset($filedata['ix']); + $pagefile->filedata = $filedata; + } $pagefile->setTrackChanges(true); $pagefiles->add($pagefile); } @@ -238,10 +271,12 @@ class FieldtypeFile extends FieldtypeMulti { if(!$value instanceof Pagefiles) return $sleepValue; foreach($value as $pagefile) { + /** @var Pagefile $pagefile */ + $item = array( 'data' => $pagefile->basename, 'description' => $pagefile->description(true), - ); + ); $fileSchema = $field->get('fileSchema'); @@ -255,9 +290,12 @@ class FieldtypeFile extends FieldtypeMulti { } if($fileSchema & self::fileSchemaFiledata) { - $item['filedata'] = null; - $filedata = $pagefile->filedata; - if(!empty($filedata)) $item['filedata'] = json_encode($filedata); + $filedata = $this->sleepFiledata($field, $pagefile); + if(empty($filedata)) { + $item['filedata'] = null; + } else { + $item['filedata'] = json_encode($filedata); + } } $sleepValue[] = $item; @@ -265,8 +303,121 @@ class FieldtypeFile extends FieldtypeMulti { return $sleepValue; } - public function ___exportValue(Page $page, Field $field, $value, array $options = array()) { + /** + * Get the filedata from given $pagefile ready for placement in a sleep value + * + * @param Field $fileField Field having type FieldtypeFile or FieldtypeImage (or derivative) + * @param Pagefile|Pageimage $pagefile + * @return array Sleep value array + * @since 3.0.142 + * + */ + protected function sleepFiledata(Field $fileField, Pagefile $pagefile) { + $filedata = $pagefile->filedata; + $template = $this->getFieldsTemplate($fileField); + + if(!$template) return $filedata; // custom field template not in use, return filedata as-is + if(!is_array($filedata)) $filedata = array(); + + $fieldValues = $pagefile->fieldValues; // field values that were loaded + $fieldgroup = $template->fieldgroup; + $idKeys = array(); // _123 type field ID keys that are populated + $mockPage = $this->getFieldsPage($fileField); + + // sleep values from pagefile->fieldValues and place back into filedata + foreach($fieldValues as $key => $value) { + $field = $fieldgroup->getFieldContext($key); + if(!$field) continue; + $idKey = "_$field->id"; + if($value === null) { + // null to remove value + unset($filedata[$idKey]); + continue; + } + $sleepValue = $field->type->sleepValue($mockPage, $field, $value); + if($sleepValue === null) { + unset($filedata[$idKey]); + } else { + $filedata[$idKey] = $sleepValue; + $idKeys[$idKey] = $idKey; + } + } + + // check for data that should no longer be here + // validate that all field ID keys resolve to fields in the fieldgroup + foreach($filedata as $key => $value) { + if(isset($idKeys[$key])) continue; // valid, skip + if(strpos($key, '_') !== 0) continue; // some other filedata, skip + $fieldID = ltrim($key, '_'); + if(!ctype_digit($fieldID)) continue; // not a custom field, skip + if($fieldgroup->hasField((int) $fieldID)) continue; // valid, skip + unset($filedata[$key]); // at this point, it can be removed + } + + // build fieldValues index + $index = array(); + foreach($filedata as $idKey => $value) { + $id = ltrim($idKey, '_'); + if(!ctype_digit($id)) continue; + $key = "{$id}_"; + $indexValue = $this->filedataIndexValue($key, $value); + if($indexValue !== null) $index[] = $indexValue; + } + unset($filedata['ix']); + if(count($index)) $filedata['ix'] = implode(' ', $index); + + return $filedata; + } + + /** + * Get indexable value for filedata or null if not one that will be indexed + * + * @param string $key + * @param mixed $value + * @return null|string + * + */ + protected function filedataIndexValue($key, $value) { + + $indexValue = null; + + if(is_array($value) && count($value) && !is_array(reset($value))) { + $a = array(); + foreach($value as $k => $v) { + if(is_array($v) || !strlen("$v")) continue; + $kk = is_int($k) ? $key : "{$key}{$k}_"; + $v = $this->filedataIndexValue($kk, $v); + if($v !== null) $a[] = $v; + } + if(count($a)) $indexValue = implode(' ', $a); + + } else if(is_int($value)) { + // integer index + $indexValue = "$key$value"; + + } else if(is_string($value) && ctype_alnum($value) && strlen($value) <= 128) { + // one word string + $indexValue = "$key$value"; + } + + return $indexValue; + } + + + /** + * Export value + * + * @param Page $page + * @param Field $field + * @param array|float|int|null|object|string $value + * @param array $options + * @return array|float|int|string + * + */ + public function ___exportValue(Page $page, Field $field, $value, array $options = array()) { + + /** @var Pagefiles $pagefiles */ $pagefiles = $value; $value = $this->sleepValue($page, $field, $value); $exportValue = array(); @@ -500,9 +651,32 @@ class FieldtypeFile extends FieldtypeMulti { return $out; } + /** + * Get match query + * + * @param DatabaseQuerySelect $query + * @param string $table + * @param string $subfield + * @param string $operator + * @param mixed $value + * @return DatabaseQuery|DatabaseQuerySelect + * @throws PageFinderSyntaxException + * @throws WireException + * + */ public function getMatchQuery($query, $table, $subfield, $operator, $value) { + + if($subfield && !in_array($subfield, array('data', 'count', 'filedata', 'created', 'modified', 'description', 'tags'))) { + // match custom fields + if($this->getMatchQuerySubfield($query, $subfield, $operator, $value)) { + // successfully handled + } else { + // requested subfield does not match what's available + throw new PageFinderSyntaxException("Property '$subfield' not recognized in selector: $query->selector"); + } + } - if(in_array($operator, array("*=", "~=", "%=", "^=", "$="))) { + if(in_array($operator, array("*=", "~=", "!~=", "%=", "^=", "$="))) { // fulltext match filename or description /** @var DatabaseQuerySelectFulltext $ft */ $ft = $this->wire(new DatabaseQuerySelectFulltext($query)); @@ -511,15 +685,117 @@ class FieldtypeFile extends FieldtypeMulti { } else { $query = parent::getMatchQuery($query, $table, $subfield, $operator, $value); } + return $query; } + /** + * Get match query for custom field selector + * + * @param DatabaseQuerySelect $query + * @param string $subfield + * @param string $operator + * @param mixed $value + * @return bool + * @throws PageFinderSyntaxException + * + */ + protected function getMatchQuerySubfield($query, &$subfield, &$operator, &$value) { + + /** @var Sanitizer $sanitizer */ + $sanitizer = $this->wire('sanitizer'); + $selector = $query->selector; + $property = ''; + + if($selector && substr_count($selector->field(), '.') > 1) { + // field in format field.subfield.property + $parts = explode('.', $selector->field()); + while(count($parts) > 2) $property = array_pop($parts); + } + + $field = $this->wire('fields')->get($subfield); + $fileField = $query->field; + + if($fileField && !$fileField->type instanceof FieldtypeFile) $fileField = null; + if(!$field || !$fileField) return false; + + $template = $this->getFieldsTemplate($fileField); + if(!$template || !$template->fieldgroup->hasField($field)) { + throw new PageFinderSyntaxException("Field '$fileField->name' does not have subfield '$field->name'"); + } + + if($field->type instanceof FieldtypePage) { + if($property) { + throw new PageFinderSyntaxException("Property '$property' not supported in field '" . $selector->field() . "'"); + } else if(!ctype_digit("$value") && $sanitizer->pagePathName($value) === $value) { + // page path to ID + $p = $this->wire('pages')->get($value); + if($p->id && $p->viewable(false)) $value = $p->id; + } + } + + if(($operator === '=' || $operator === '!=') && ctype_alnum("$value") && strlen("$value") <= 128) { + // we can match our index value in filedata[ix] + $operator = $operator === '=' ? '~=' : '!~='; + $value = $property ? "{$field->id}_{$property}_$value" : "{$field->id}_$value";; + + } else if($operator === '=') { + $operator = ctype_alnum("$value") ? '~=' : '*='; // ok + + } else if($operator === '!=' && ctype_alnum("$value")) { + $operator = '!~='; // ok + + } else if($operator === '~=' || $operator === '!~=' || $operator === '%=' || $operator === '*=') { + // ok + + } else { + throw new PageFinderSyntaxException("Operator $operator is not supported by $this in selector: $selector"); + } + + $subfield = 'filedata'; + + return true; + } + + /** + * Get selector info + * + * @param Field $field + * @param array $data + * @return array + * + */ public function ___getSelectorInfo(Field $field, array $data = array()) { $info = parent::___getSelectorInfo($field, $data); $info['subfields']['data']['label'] = $this->_('filename'); + $template = $this->getFieldsTemplate($field); + if($template) { + foreach($template->fieldgroup as $f) { + $f = $template->fieldgroup->getFieldContext($f); + if($f->type instanceof FieldtypePage) { + $info['subfields'][$f->name] = array( + 'name' => $f->name, + 'label' => $f->getLabel(), + 'operators' => array('=', '!='), + 'input' => 'page', + 'options' => array(), + ); + } else if($f->type instanceof FieldtypeCheckbox || $f->type->className() === 'FieldtypeToggle') { + $info['subfields'][$f->name] = $f->type->getSelectorInfo($f, $data); + } else { + } + } + } return $info; } + /** + * Get database schema + * + * @param Field $field + * @return array + * + */ public function getDatabaseSchema(Field $field) { $database = $this->wire('database'); @@ -745,9 +1021,60 @@ class FieldtypeFile extends FieldtypeMulti { */ public function getLoadQueryAutojoin(Field $field, DatabaseQuerySelect $query) { return null; - } + } + /** + * Return Template used to manage fields for given file field + * + * #pw-internal + * + * @param Field $field Field having type FieldtypeFile or FieldtypeImage + * @return Template|null Returns Template or null if it does not exist + * @since 3.0.142 + * + */ + public function getFieldsTemplate(Field $field) { + $template = $this->wire('templates')->get('field-' . $field->name); + if(!$template) return null; + // prepare fieldgroup used by template + $fieldgroup = $template->fieldgroup; + if($this->className() === 'FieldtypeFile') { + $allowFieldtypes = $this->allowFieldtypes; + } else { + $allowFieldtypes = $this->wire('fieldtypes')->get('FieldtypeFile')->get('allowFieldtypes'); + } + $allowFieldtypes = array_flip($allowFieldtypes); + foreach($fieldgroup as $f) { + $name = str_replace('Fieldtype', '', $f->type->className()); + if(!isset($allowFieldtypes[$name])) $fieldgroup->softRemove($f); + } + return $template; + } + + /** + * Get a mock/placeholder page for using custom fields in files + * + * #pw-internal + * + * @param Field $field + * @return Page + * @since 3.0.142 + * + */ + public function getFieldsPage(Field $field) { + $page = new Page(); + $page->template = $this->getFieldsTemplate($field); + $page->status = Page::statusOn | Page::statusCorrupted; // corrupted status prevents saving + return $page; + } + /** + * Field config + * + * @param Field $field + * @return InputfieldWrapper + * + */ public function ___getConfigInputfields(Field $field) { $inputfields = parent::___getConfigInputfields($field); @@ -891,6 +1218,83 @@ class FieldtypeFile extends FieldtypeMulti { return $inputfields; } + /** + * Module config + * + * @param InputfieldWrapper $inputfields + * + */ + public function getModuleConfigInputfields(InputfieldWrapper $inputfields) { + + if($this->className() != 'FieldtypeFile') return; + + /** @var InputfieldCheckboxes $f */ + $f = $this->wire('modules')->get('InputfieldCheckboxes'); + $f->attr('name', 'allowFieldtypes'); + $f->label = $this->_('Allowed Fieldtype modules for custom fields'); + $f->description = $this->_('Types with strikethrough are not likely to be 100% compatible.'); + $f->optionColumns = 3; + $f->entityEncodeText = false; + + $moduleNames = $this->wire('modules')->findByPrefix('Fieldtype'); + ksort($moduleNames); + $names = array(); + + // types always disallowed + $blacklist = array( + 'File', + 'Image', + 'Repeater', + 'RepeaterMatrix', + 'PageTable', + 'Options', + 'Comments', + 'Table' + ); + + foreach($moduleNames as $key => $moduleName) { + + list(,$name) = explode('Fieldtype', $moduleName, 2); + $names[$name] = $name; + + if(in_array($name, $blacklist)) { + unset($names[$name]); + continue; + } + + if(in_array($name, $this->defaultAllowFieldtypes)) continue; // these are fine + + // check schema of field by finding an example of one + $allow = false; + + foreach($this->wire('fields') as $field) { + // @var Field $field + if($field->type instanceof FieldtypeFile) continue; + if(!wireInstanceOf($field->type, $moduleName)) continue; + + // verify that field DB table is responsible for all data created by the field + $schema = $field->type->getDatabaseSchema($field); + if(isset($schema['xtra']['all']) && $schema['xtra']['all'] !== true) continue; + + unset($schema['data'], $schema['pages_id'], $schema['keys'], $schema['xtra']); + // if there's not any other schema required by the Fieldtype, it can be supported here + if(!count($schema)) $allow = true; + break; + } + if(!$allow) { + // indicate with strikethrough potential issue with this type + $names[$name] = "$name"; + } + } + + foreach($names as $key => $name) { + $f->addOption($key, $name); + } + + $f->val($this->allowFieldtypes); + $inputfields->add($f); + } + } diff --git a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.css b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.css index 62a83d97..2a59bcca 100644 --- a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.css +++ b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.css @@ -1,237 +1 @@ -.Inputfields > li > .InputfieldContent > ul.InputfieldFileList > li { - margin: 0 0 1em 0; - position: relative; - cursor: move; -} - -.pw-content .InputfieldFile.InputfieldItemListCollapse ul.InputfieldFileList > li, -.Inputfields > li.InputfieldHasFileList.InputfieldRenderValueMode > .InputfieldContent > ul.InputfieldFileList > li, -.Inputfields > li.InputfieldFile.InputfieldItemListCollapse > .InputfieldContent > ul.InputfieldFileList > li { - margin-bottom: 0.25em; -} - -.pw-content .Inputfields > .InputfieldItemList > .InputfieldContent > ul.InputfieldFileList > li:last-child { - margin-bottom: 0; -} - -.InputfieldItemList .InputfieldContent.ui-state-hover { - background: none; -} - -ul.InputfieldFileList li .InputfieldFileInfo, -.AjaxUpload .InputfieldFileInfo { - padding: 0.5em; - line-height: 1em; - margin-bottom: 0; - margin-top: 0; -} -ul.InputfieldFileList li .InputfieldFileInfo > i.fa, -.AjaxUpload .InputfieldFileInfo > i.fa { - position: relative; - left: 2px; -} -ul.InputfieldFileList li .InputfieldFileInfo .InputfieldFileName, -.AjaxUpload .InputfieldFileInfo .InputfieldFileName { - font-weight: bold; - cursor: pointer; -} -ul.InputfieldFileList li .InputfieldFileInfo .InputfieldFileName:hover, -.AjaxUpload .InputfieldFileInfo .InputfieldFileName:hover { - text-decoration: underline; - background: none; -} - -.InputfieldFileDrag { - opacity: 0.7; -} - -.InputfieldFileInfo:hover .InputfieldFileDrag { - opacity: 1; -} - -ul.InputfieldFileList li .InputfieldFileInfo .InputfieldFileStats, -.AjaxUpload .InputfieldFileStats { - opacity: 0.65; - font-size: 0.9166666em; -} - -ul.InputfieldFileList li .ui-state-error .InputfieldFileName { - text-decoration: line-through; -} - -ul.InputfieldFileList li .InputfieldFileDelete { - float: right; - cursor: pointer; -} -ul.InputfieldFileList li .InputfieldFileDelete, ul.InputfieldFileList li .InputfieldFileDelete input { - display: inline; - font-weight: normal; -} -ul.InputfieldFileList li .InputfieldFileDelete input { - position: absolute; - top: 0; - right: 0; - display: none; -} - -ul.InputfieldFileList li .ui-icon { - float: left; -} - -.InputfieldFileEmpty .HideIfEmpty, -.InputfieldFileSingle .HideIfSingle, -.InputfieldFileMultiple .HideIfMultiple { - display: none !important; -} - -ul.InputfieldFileList li .InputfieldFileData { - margin-top: 0; - margin-bottom: 0; - padding: 1em; -} - -.InputfieldFile.InputfieldItemListCollapse ul.InputfieldFileList li .InputfieldFileData { - display: none; -} - -ul.InputfieldFileList li .InputfieldFileLink { - font-weight: bold; - margin: 0.5em 0; -} -ul.InputfieldFileList li .InputfieldFileTags, -ul.InputfieldFileList li .InputfieldFileDescription { - font-weight: normal; - margin: 0; - padding: 0; -} -ul.InputfieldFileList li .InputfieldFileTags input[type=text], -ul.InputfieldFileList li .InputfieldFileDescription input[type=text] { - width: 100%; -} -ul.InputfieldFileList li .InputfieldFileTags label.pw-hidden, -ul.InputfieldFileList li .InputfieldFileDescription label.pw-hidden { - display: none; -} -ul.InputfieldFileList li .InputfieldFileDescription + .InputfieldFileTags { - margin-top: 0.5em; -} -ul.InputfieldFileList li .InputfieldFileSort { - display: none !important; -} - -.langTabsContainer + .InputfieldFileTags { - margin-top: 0.5em; -} - -.Inputfield .InputfieldFileTags input { - margin-bottom: 0.5em; -} - -ul.InputfieldFileListBlank + p.description { - margin-top: 0; -} - -.InputfieldFileValidExtensions { - margin-left: 1em; -} - -.Inputfields .InputfieldFileUpload { - position: relative; - margin: 1em 0 0 0; -} -.Inputfields .InputfieldFileUpload input[type=file] { - display: block; - margin: 0.25em 0; -} -.Inputfields .InputfieldFileUpload img { - max-width: 100px; -} -.Inputfields .InputfieldFileUpload .AjaxUploadDropHere { - display: none; - position: absolute; - top: 0; - right: 0; - opacity: 0.75; -} - -.AjaxUpload .ui-progressbar-value { - padding: 0 !important; -} -.AjaxUpload .ui-progressbar-value span { - float: right; - margin: 3px 5px; -} - -.InputfieldHasFileList .InputMask { - position: relative; - overflow: hidden; - line-height: 1 !important; - cursor: pointer; - font-size: 14px; - border: none; -} -.InputfieldHasFileList .InputMask i { - font-size: 14px; - margin: 0 3px 0 0; -} -.InputfieldHasFileList .InputMask:hover { - cursor: pointer; -} -.InputfieldHasFileList .InputMask:active { - box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.2); -} -.InputfieldHasFileList .InputMask > input[type=file] { - position: absolute; - top: 0; - left: 0; - height: 100%; - -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; - filter: alpha(opacity=0); - opacity: 0; - cursor: inherit; - width: 100%; -} - -.InputfieldFileDescription label.pw-hidden, -.InputfieldFileTags label.pw-hidden { - display: none; -} -.InputfieldFileDescription input::placeholder, -.InputfieldFileTags input::placeholder { - font-size: 13px; - color: #999; -} - -.AdminThemeDefault .InputfieldFileDescription input::placeholder { - padding-left: 3px; -} - -.InputfieldFileTags .selectize-control.multi .selectize-input > div { - background: #eee; - border-radius: 3px; - white-space: nowrap; -} -.InputfieldFileTags .selectize-control.multi .selectize-input > div a.remove { - color: #999; - border-color: #ddd; -} - -.pw-content ul.InputfieldFileList li .langTabs > ul, -#content ul.InputfieldFileList li .langTabs > ul { - padding-left: 0; -} - -.Inputfields .InputfieldFileList .langTabsContainer + .InputfieldFileTags { - display: block; - margin-top: 0.5em; -} - -.Inputfield ul.InputfieldFileList .hasLangTabs .InputfieldFileDescription, -.Inputfield .hasLangTabs .InputfieldFileDescription { - padding-top: 0.5em; -} -.Inputfield .InputfieldFileDescription.LanguageSupport { - padding-left: 0; - padding-right: 0; - padding-top: 0.4em; -} +.Inputfields>li>.InputfieldContent>ul.InputfieldFileList>li{margin:0 0 1em 0;position:relative;cursor:move}.pw-content .InputfieldFile.InputfieldItemListCollapse ul.InputfieldFileList>li,.Inputfields>li.InputfieldHasFileList.InputfieldRenderValueMode>.InputfieldContent>ul.InputfieldFileList>li,.Inputfields>li.InputfieldFile.InputfieldItemListCollapse>.InputfieldContent>ul.InputfieldFileList>li{margin-bottom:.25em}.pw-content .Inputfields>.InputfieldItemList>.InputfieldContent>ul.InputfieldFileList>li:last-child{margin-bottom:0}.InputfieldItemList .InputfieldContent.ui-state-hover{background:none}ul.InputfieldFileList li .InputfieldFileInfo,.AjaxUpload .InputfieldFileInfo{padding:.5em;line-height:1em;margin-bottom:0;margin-top:0}ul.InputfieldFileList li .InputfieldFileInfo>i.fa,.AjaxUpload .InputfieldFileInfo>i.fa{position:relative;left:2px}ul.InputfieldFileList li .InputfieldFileInfo .InputfieldFileName,.AjaxUpload .InputfieldFileInfo .InputfieldFileName{font-weight:bold;cursor:pointer}ul.InputfieldFileList li .InputfieldFileInfo .InputfieldFileName:hover,.AjaxUpload .InputfieldFileInfo .InputfieldFileName:hover{text-decoration:underline;background:none}.InputfieldFileDrag{opacity:.7}.InputfieldFileInfo:hover .InputfieldFileDrag{opacity:1}ul.InputfieldFileList li .InputfieldFileInfo .InputfieldFileStats,.AjaxUpload .InputfieldFileStats{opacity:.65;font-size:.9166666em}ul.InputfieldFileList li .ui-state-error .InputfieldFileName{text-decoration:line-through}ul.InputfieldFileList li .InputfieldFileDelete{float:right;cursor:pointer}ul.InputfieldFileList li .InputfieldFileDelete,ul.InputfieldFileList li .InputfieldFileDelete input{display:inline;font-weight:normal}ul.InputfieldFileList li .InputfieldFileDelete input{position:absolute;top:0;right:0;display:none}ul.InputfieldFileList li .ui-icon{float:left}.InputfieldFileEmpty .HideIfEmpty,.InputfieldFileSingle .HideIfSingle,.InputfieldFileMultiple .HideIfMultiple{display:none !important}ul.InputfieldFileList li .InputfieldFileData{margin-top:0;margin-bottom:0;padding:1em}ul.InputfieldFileList li .InputfieldFileData.InputfieldFileFields{padding:0}.InputfieldFile.InputfieldItemListCollapse ul.InputfieldFileList li .InputfieldFileData{display:none}ul.InputfieldFileList li .InputfieldFileLink{font-weight:bold;margin:.5em 0}ul.InputfieldFileList li .InputfieldFileTags,ul.InputfieldFileList li .InputfieldFileDescription{font-weight:normal;margin:0;padding:0}ul.InputfieldFileList li .InputfieldFileTags input[type=text],ul.InputfieldFileList li .InputfieldFileDescription input[type=text]{width:100%}ul.InputfieldFileList li .InputfieldFileTags label.pw-hidden,ul.InputfieldFileList li .InputfieldFileDescription label.pw-hidden{display:none}ul.InputfieldFileList li .InputfieldFileDescription+.InputfieldFileTags{margin-top:.5em}ul.InputfieldFileList li .InputfieldFileSort{display:none !important}.langTabsContainer+.InputfieldFileTags{margin-top:.5em}.Inputfield .InputfieldFileTags input{margin-bottom:.5em}ul.InputfieldFileListBlank+p.description{margin-top:0}.InputfieldFileValidExtensions{margin-left:1em}.Inputfields .InputfieldFileUpload{position:relative;margin:1em 0 0 0}.Inputfields .InputfieldFileUpload input[type=file]{display:block;margin:.25em 0}.Inputfields .InputfieldFileUpload img{max-width:100px}.Inputfields .InputfieldFileUpload .AjaxUploadDropHere{display:none;position:absolute;top:0;right:0;opacity:.75}.AjaxUpload .ui-progressbar-value{padding:0 !important}.AjaxUpload .ui-progressbar-value span{float:right;margin:3px 5px}.InputfieldHasFileList .InputMask{position:relative;overflow:hidden;line-height:1 !important;cursor:pointer;font-size:14px;border:none}.InputfieldHasFileList .InputMask i{font-size:14px;margin:0 3px 0 0}.InputfieldHasFileList .InputMask:hover{cursor:pointer}.InputfieldHasFileList .InputMask:active{box-shadow:inset 0 1px 3px rgba(0,0,0,.2)}.InputfieldHasFileList .InputMask>input[type=file]{position:absolute;top:0;left:0;height:100%;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0);opacity:0;cursor:inherit;width:100%}.InputfieldFileDescription label.pw-hidden,.InputfieldFileTags label.pw-hidden{display:none}.InputfieldFileDescription input::placeholder,.InputfieldFileTags input::placeholder{font-size:13px;color:#999}.AdminThemeDefault .InputfieldFileDescription input::placeholder{padding-left:3px}.InputfieldFileTags .selectize-control.multi .selectize-input>div{background:#eee;border-radius:3px;white-space:nowrap}.InputfieldFileTags .selectize-control.multi .selectize-input>div a.remove{color:#999;border-color:#ddd}.pw-content ul.InputfieldFileList li .langTabs>ul,#content ul.InputfieldFileList li .langTabs>ul{padding-left:0}.Inputfields .InputfieldFileList .langTabsContainer+.InputfieldFileTags{display:block;margin-top:.5em}.Inputfield ul.InputfieldFileList .hasLangTabs .InputfieldFileDescription,.Inputfield .hasLangTabs .InputfieldFileDescription{padding-top:.5em}.Inputfield .InputfieldFileDescription.LanguageSupport{padding-left:0;padding-right:0;padding-top:.4em} diff --git a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.js b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.js index 055a0bd7..2a0d1908 100755 --- a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.js +++ b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.js @@ -338,7 +338,15 @@ $(document).ready(function() { } } - } + setTimeout(function() { + var $inputfields = $markup.find('.Inputfield'); + if($inputfields.length) { + InputfieldsInit($markup.find('.Inputfields')); + $inputfields.trigger('reloaded', ['InputfieldFileUpload']); + } + }, 500); + + } // for $progressItem.remove(); diff --git a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.min.js b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.min.js index f62ec2c5..163b21dd 100644 --- a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.min.js +++ b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.min.js @@ -1 +1 @@ -$(document).ready(function(){$(document).on("change",".InputfieldFileDelete input",function(){d($(this))}).on("dblclick",".InputfieldFileDelete",function(){var k=$(this).find("input");var j=$(this).parents(".InputfieldFileList").find(".InputfieldFileDelete input");if(k.is(":checked")){j.removeAttr("checked").change()}else{j.attr("checked","checked").change()}return false});function d(l){var j=l.parents(".InputfieldFileInfo");var k=l.closest(".InputfieldFile").hasClass("InputfieldItemListCollapse");if(l.is(":checked")){j.addClass("ui-state-error");if(!k){j.siblings(".InputfieldFileData").slideUp("fast")}}else{j.removeClass("ui-state-error");if(!k){j.siblings(".InputfieldFileData").slideDown("fast")}}}function i(j){j.each(function(){var l=$(this);var m=l.children("li").length;if(l.closest(".InputfieldRenderValueMode").length){return}var k=l.closest(".Inputfield");if(m<2){if(m==0){k.addClass("InputfieldFileEmpty").removeClass("InputfieldFileMultiple InputfieldFileSingle")}else{k.addClass("InputfieldFileSingle").removeClass("InputfieldFileEmpty InputfieldFileMultiple")}return}else{l.closest(".Inputfield").removeClass("InputfieldFileSingle InputfieldFileEmpty").addClass("InputfieldFileMultiple")}l.sortable({start:function(o,n){n.item.children(".InputfieldFileInfo").addClass("ui-state-highlight")},stop:function(o,n){$(this).children("li").each(function(p){$(this).find(".InputfieldFileSort").val(p)});n.item.children(".InputfieldFileInfo").removeClass("ui-state-highlight");k.addClass("InputfieldFileJustSorted InputfieldStateChanged");setTimeout(function(){k.removeClass("InputfieldFileJustSorted")},500)}})}).find(".ui-widget-header, .ui-state-default").hover(function(){$(this).addClass("ui-state-hover")},function(){$(this).removeClass("ui-state-hover")})}function f(){$("body").addClass("ie-no-drop");$(document).on("change",".InputfieldFileUpload input[type=file]",function(){var n=$(this);var u=n.closest(".InputMask");if(n.val().length>1){u.addClass("ui-state-disabled")}else{u.removeClass("ui-state-disabled")}if(u.next(".InputMask").length>0){return}var j=n.closest(".InputfieldFile");var p=n.closest(".InputfieldFileUpload");var o=j.find(".InputfieldFileList");var t=parseInt(p.find(".InputfieldFileMaxFiles").val());var l=o.children("li").length+p.find("input[type=file]").length+1;var v=parseInt(p.attr("data-maxfilesize"));var m=false;p.find("input[type=file]").each(function(){if(typeof this.files[0]!=="undefined"){var w=this.files[0].size;if(w>v){ProcessWire.alert("File "+this.files[0].name+" is "+w+" bytes which exceeds max allowed size of "+v+" bytes");$(this).val("").closest(".InputMask").removeClass("ui-state-disabled ui-state-active");m=true}}});if(m){return false}if(t>0&&l>=t){}else{p.find(".InputMask").not(":last").each(function(){var w=$(this);if(w.find("input[type=file]").val()<1){w.remove()}});var s=u.clone().removeClass("ui-state-disabled");var r=s.find("input[type=file]");r.attr("id",r.attr("id")+"-");r.val("");s.insertAfter(u);s.css("margin-left","0.5em").removeClass("ui-state-active")}var k=n.val();var q=k.lastIndexOf("/");if(q===-1){q=k.lastIndexOf("\\")}k=k.substring(q+1);u.find(".ui-button-text").text(k).prepend("");u.removeClass("ui-state-active")})}function b(k){if(k.length>0){var j=k.find(".InputfieldFileUpload")}else{var j=$(".InputfieldFileUpload")}j.closest(".InputfieldContent").each(function(m){if($(this).hasClass("InputfieldFileInit")){return}l($(this),m);$(this).addClass("InputfieldFileInit")});function l(t,B){var s=t.parents("form");var m=t.closest(".InputfieldRepeaterItem");var p=m.length?m.attr("data-editUrl"):s.attr("action");p+=(p.indexOf("?")>-1?"&":"?")+"InputfieldFileAjax=1";var F=s.find("input._post_token");var r=F.attr("name");var w=F.val();var D=t.find(".InputfieldFileUpload");var o=D.data("fieldname");o=o.slice(0,-2);var E=D.data("extensions").toLowerCase();var A=D.data("maxfilesize");var v=t.find("input[type=file]").get(0);var u=t.get(0);var n=t.find(".InputfieldFileList");if(n.size()<1){n=$("");t.prepend(n);t.parent(".Inputfield").addClass("InputfieldFileEmpty")}var C=n.get(0);var x=parseInt(t.find(".InputfieldFileMaxFiles").val());n.children().addClass("InputfieldFileItemExisting");t.find(".AjaxUploadDropHere").show();var y=null;function q(I){var L=$('
  • '),K=$('
    '),J=$('
    '),M,N,P,O;K.append(J);L.append(K);P=new XMLHttpRequest();P.upload.addEventListener("progress",function(Q){if(Q.lengthComputable){var R=(Q.loaded/Q.total)*100;J.width(R+"%");if(R>4){J.html(""+parseInt(R)+"%")}$("body").addClass("pw-uploading")}else{}},false);P.addEventListener("load",function(){P.getAllResponseHeaders();var W=$.parseJSON(P.responseText);if(W.error!==undefined){W=[W]}for(var U=0;U0){T.slideUp("fast",function(){T.remove()})}}var ab=t.find("input[type=file]");if(ab.val()){ab.replaceWith(ab.clone(true))}var Y=$(R.markup);Y.hide();if(R.overwrite){var aa=Y.find(".InputfieldFileName").text();var ac=null;n.children(".InputfieldFileItemExisting").each(function(){if(ac===null&&$(this).find(".InputfieldFileName").text()==aa){ac=$(this)}});if(ac!==null){var X=Y.find(".InputfieldFileInfo");var Q=Y.find(".InputfieldFileLink");var S=ac.find(".InputfieldFileInfo");var Z=ac.find(".InputfieldFileLink");S.html(X.html()+"");Z.html(Q.html());ac.addClass("InputfieldFileItemExisting");ac.effect("highlight",500)}else{n.append(Y);Y.slideDown();Y.addClass("InputfieldFileItemExisting")}}else{n.append(Y);Y.slideDown()}}}L.remove();if(y){clearTimeout(y)}y=setTimeout(function(){$("body").removeClass("pw-uploading");if(x!=1&&!n.is(".ui-sortable")){i(n)}n.trigger("AjaxUploadDone")},500)},false);P.open("POST",p,true);P.setRequestHeader("X-FILENAME",encodeURIComponent(I.name));P.setRequestHeader("X-FIELDNAME",o);P.setRequestHeader("Content-Type","application/octet-stream");P.setRequestHeader("X-"+r,w);P.setRequestHeader("X-REQUESTED-WITH","XMLHttpRequest");P.send(I);O=" "+I.name+' • '+parseInt(I.size/1024,10)+" kb";L.find("p.ui-widget-header").html(O);n.append(L);var G=n.closest(".Inputfield");G.addClass("InputfieldStateChanged");var H=G.find(".InputfieldFileItem").length;if(H==1){G.removeClass("InputfieldFileEmpty").removeClass("InputfieldFileMultiple").addClass("InputfieldFileSingle")}else{if(H>1){G.removeClass("InputfieldFileEmpty").removeClass("InputfieldFileSingle").addClass("InputfieldFileMultiple")}}}function z(I){function J(L,M){return'
  •   '+L+' • '+M+"

  • "}if(typeof I!=="undefined"){for(var H=0,G=I.length;HA&&A>2000000){n.append(J(I[H].name,"Filesize "+parseInt(I[H].size/1024,10)+" kb is too big. Maximum allowed is "+parseInt(A/1024,10)+" kb"))}else{q(I[H])}}if(x==1){break}}}else{C.innerHTML="No support for the File API in this web browser"}}v.addEventListener("change",function(G){z(this.files);G.preventDefault();G.stopPropagation();this.value=""},false);u.addEventListener("dragleave",function(){$(this).removeClass("ui-state-hover");$(this).closest(".Inputfield").removeClass("pw-drag-in-file")},false);u.addEventListener("dragenter",function(G){G.preventDefault();$(this).addClass("ui-state-hover");$(this).closest(".Inputfield").addClass("pw-drag-in-file")},false);u.addEventListener("dragover",function(G){if(!$(this).is("ui-state-hover")){$(this).addClass("ui-state-hover");$(this).closest(".Inputfield").addClass("pw-drag-in-file")}G.preventDefault();G.stopPropagation()},false);u.addEventListener("drop",function(G){z(G.dataTransfer.files);$(this).removeClass("ui-state-hover").closest(".Inputfield").removeClass("pw-drag-in-file");G.preventDefault();G.stopPropagation()},false)}}function g(j){j.each(function(){var q=$(this);var o=q.find("input.InputfieldFileTagsInput:not(.selectized)");var m=q.find("input.InputfieldFileTagsSelect:not(.selectized)");if(o.length){o.selectize({plugins:["remove_button","drag_drop"],delimiter:" ",persist:false,createOnBlur:true,submitOnReturn:false,create:function(n){return{value:n,text:n}}})}if(m.length){if(!q.hasClass("Inputfield")){q=q.closest(".Inputfield")}var r=q.attr("data-configName");var p=ProcessWire.config[r];var l=[];for(var s=0;s"+n(t.value)+""},option:function(t,n){return"
    "+n(t.value)+"
    "}}})}})}i($(".InputfieldFileList"));g($(".InputfieldFileHasTags"));var a=false;if(window.File&&window.FileList&&window.FileReader&&($("#PageIDIndicator").length>0||$(".InputfieldAllowAjaxUpload").length>0)){b("");a=true}else{f()}var c=767;var h=false;var e=function(){if(!a){return}$(".AjaxUploadDropHere").each(function(){var j=$(this);if(j.parent().width()<=c){j.hide()}else{j.show()}});h=false};if(a){$(window).resize(function(){if(h){return}h=true;setTimeout(e,1000)}).resize();$(document).on("AjaxUploadDone",".InputfieldFileHasTags",function(j){g($(this))})}$(document).on("reloaded",".InputfieldHasFileList",function(j){i($(this).find(".InputfieldFileList"));b($(this));g($(this));if(a){e()}})}); \ No newline at end of file +$(document).ready(function(){$(document).on("change",".InputfieldFileDelete input",function(){setInputfieldFileStatus($(this))}).on("dblclick",".InputfieldFileDelete",function(){var $input=$(this).find("input");var $items=$(this).parents(".InputfieldFileList").find(".InputfieldFileDelete input");if($input.is(":checked"))$items.removeAttr("checked").change();else $items.attr("checked","checked").change();return false});function setInputfieldFileStatus($t){var $info=$t.parents(".InputfieldFileInfo");var collapsed=$t.closest(".InputfieldFile").hasClass("InputfieldItemListCollapse");if($t.is(":checked")){$info.addClass("ui-state-error");if(!collapsed)$info.siblings(".InputfieldFileData").slideUp("fast")}else{$info.removeClass("ui-state-error");if(!collapsed)$info.siblings(".InputfieldFileData").slideDown("fast")}}function initSortable($fileLists){$fileLists.each(function(){var $this=$(this);var qty=$this.children("li").length;if($this.closest(".InputfieldRenderValueMode").length)return;var $inputfield=$this.closest(".Inputfield");if(qty<2){if(qty==0)$inputfield.addClass("InputfieldFileEmpty").removeClass("InputfieldFileMultiple InputfieldFileSingle");else $inputfield.addClass("InputfieldFileSingle").removeClass("InputfieldFileEmpty InputfieldFileMultiple");return}else{$this.closest(".Inputfield").removeClass("InputfieldFileSingle InputfieldFileEmpty").addClass("InputfieldFileMultiple")}$this.sortable({start:function(e,ui){ui.item.children(".InputfieldFileInfo").addClass("ui-state-highlight")},stop:function(e,ui){$(this).children("li").each(function(n){$(this).find(".InputfieldFileSort").val(n)});ui.item.children(".InputfieldFileInfo").removeClass("ui-state-highlight");$inputfield.addClass("InputfieldFileJustSorted InputfieldStateChanged");setTimeout(function(){$inputfield.removeClass("InputfieldFileJustSorted")},500)}})}).find(".ui-widget-header, .ui-state-default").hover(function(){$(this).addClass("ui-state-hover")},function(){$(this).removeClass("ui-state-hover")})}function InitOldSchool(){$("body").addClass("ie-no-drop");$(document).on("change",".InputfieldFileUpload input[type=file]",function(){var $t=$(this);var $mask=$t.closest(".InputMask");if($t.val().length>1){$mask.addClass("ui-state-disabled")}else{$mask.removeClass("ui-state-disabled")}if($mask.next(".InputMask").length>0)return;var $inputfield=$t.closest(".InputfieldFile");var $upload=$t.closest(".InputfieldFileUpload");var $list=$inputfield.find(".InputfieldFileList");var maxFiles=parseInt($upload.find(".InputfieldFileMaxFiles").val());var numFiles=$list.children("li").length+$upload.find("input[type=file]").length+1;var maxFilesize=parseInt($upload.attr("data-maxfilesize"));var abort=false;$upload.find("input[type=file]").each(function(){if(typeof this.files[0]!=="undefined"){var size=this.files[0].size;if(size>maxFilesize){ProcessWire.alert("File "+this.files[0].name+" is "+size+" bytes which exceeds max allowed size of "+maxFilesize+" bytes");$(this).val("").closest(".InputMask").removeClass("ui-state-disabled ui-state-active");abort=true}}});if(abort)return false;if(maxFiles>0&&numFiles>=maxFiles){}else{$upload.find(".InputMask").not(":last").each(function(){var $m=$(this);if($m.find("input[type=file]").val()<1)$m.remove()});var $mask2=$mask.clone().removeClass("ui-state-disabled");var $input=$mask2.find("input[type=file]");$input.attr("id",$input.attr("id")+"-");$input.val("");$mask2.insertAfter($mask);$mask2.css("margin-left","0.5em").removeClass("ui-state-active")}var name=$t.val();var pos=name.lastIndexOf("/");if(pos===-1)pos=name.lastIndexOf("\\");name=name.substring(pos+1);$mask.find(".ui-button-text").text(name).prepend("");$mask.removeClass("ui-state-active")})}function InitHTML5($inputfield){if($inputfield.length>0){var $target=$inputfield.find(".InputfieldFileUpload")}else{var $target=$(".InputfieldFileUpload")}$target.closest(".InputfieldContent").each(function(i){if($(this).hasClass("InputfieldFileInit"))return;initHTML5Item($(this),i);$(this).addClass("InputfieldFileInit")});function initHTML5Item($this,i){var $form=$this.parents("form");var $repeaterItem=$this.closest(".InputfieldRepeaterItem");var postUrl=$repeaterItem.length?$repeaterItem.attr("data-editUrl"):$form.attr("action");postUrl+=(postUrl.indexOf("?")>-1?"&":"?")+"InputfieldFileAjax=1";var $postToken=$form.find("input._post_token");var postTokenName=$postToken.attr("name");var postTokenValue=$postToken.val();var $uploadData=$this.find(".InputfieldFileUpload");var fieldName=$uploadData.data("fieldname");fieldName=fieldName.slice(0,-2);var extensions=$uploadData.data("extensions").toLowerCase();var maxFilesize=$uploadData.data("maxfilesize");var filesUpload=$this.find("input[type=file]").get(0);var dropArea=$this.get(0);var $fileList=$this.find(".InputfieldFileList");if($fileList.size()<1){$fileList=$("
      ");$this.prepend($fileList);$this.parent(".Inputfield").addClass("InputfieldFileEmpty")}var fileList=$fileList.get(0);var maxFiles=parseInt($this.find(".InputfieldFileMaxFiles").val());$fileList.children().addClass("InputfieldFileItemExisting");$this.find(".AjaxUploadDropHere").show();var doneTimer=null;function uploadFile(file){var $progressItem=$('
    • '),$progressBar=$('
      '),$progressBarValue=$('
      '),img,reader,xhr,fileData;$progressBar.append($progressBarValue);$progressItem.append($progressBar);xhr=new XMLHttpRequest;xhr.upload.addEventListener("progress",function(evt){if(evt.lengthComputable){var completion=evt.loaded/evt.total*100;$progressBarValue.width(completion+"%");if(completion>4){$progressBarValue.html(""+parseInt(completion)+"%")}$("body").addClass("pw-uploading")}else{}},false);xhr.addEventListener("load",function(){xhr.getAllResponseHeaders();var response=$.parseJSON(xhr.responseText);if(response.error!==undefined)response=[response];for(var n=0;n0)$child.slideUp("fast",function(){$child.remove()})}var $input=$this.find("input[type=file]");if($input.val())$input.replaceWith($input.clone(true));var $markup=$(r.markup);$markup.hide();if(r.overwrite){var basename=$markup.find(".InputfieldFileName").text();var $item=null;$fileList.children(".InputfieldFileItemExisting").each(function(){if($item===null&&$(this).find(".InputfieldFileName").text()==basename){$item=$(this)}});if($item!==null){var $newInfo=$markup.find(".InputfieldFileInfo");var $newLink=$markup.find(".InputfieldFileLink");var $info=$item.find(".InputfieldFileInfo");var $link=$item.find(".InputfieldFileLink");$info.html($newInfo.html()+"");$link.html($newLink.html());$item.addClass("InputfieldFileItemExisting");$item.effect("highlight",500)}else{$fileList.append($markup);$markup.slideDown();$markup.addClass("InputfieldFileItemExisting")}}else{$fileList.append($markup);$markup.slideDown()}}setTimeout(function(){var $inputfields=$markup.find(".Inputfield");if($inputfields.length){InputfieldsInit($markup.find(".Inputfields"));$inputfields.trigger("reloaded",["InputfieldFileUpload"])}},500)}$progressItem.remove();if(doneTimer)clearTimeout(doneTimer);doneTimer=setTimeout(function(){$("body").removeClass("pw-uploading");if(maxFiles!=1&&!$fileList.is(".ui-sortable"))initSortable($fileList);$fileList.trigger("AjaxUploadDone")},500)},false);xhr.open("POST",postUrl,true);xhr.setRequestHeader("X-FILENAME",encodeURIComponent(file.name));xhr.setRequestHeader("X-FIELDNAME",fieldName);xhr.setRequestHeader("Content-Type","application/octet-stream");xhr.setRequestHeader("X-"+postTokenName,postTokenValue);xhr.setRequestHeader("X-REQUESTED-WITH","XMLHttpRequest");xhr.send(file);fileData=""+" "+''+file.name+""+' • '+parseInt(file.size/1024,10)+" kb";$progressItem.find("p.ui-widget-header").html(fileData);$fileList.append($progressItem);var $inputfield=$fileList.closest(".Inputfield");$inputfield.addClass("InputfieldStateChanged");var numFiles=$inputfield.find(".InputfieldFileItem").length;if(numFiles==1){$inputfield.removeClass("InputfieldFileEmpty").removeClass("InputfieldFileMultiple").addClass("InputfieldFileSingle")}else if(numFiles>1){$inputfield.removeClass("InputfieldFileEmpty").removeClass("InputfieldFileSingle").addClass("InputfieldFileMultiple")}}function traverseFiles(files){function errorItem(filename,message){return'
    • '+'

        '+filename+" "+' • '+message+"

    • "}if(typeof files!=="undefined"){for(var i=0,l=files.length;imaxFilesize&&maxFilesize>2e6){$fileList.append(errorItem(files[i].name,"Filesize "+parseInt(files[i].size/1024,10)+" kb is too big. Maximum allowed is "+parseInt(maxFilesize/1024,10)+" kb"))}else{uploadFile(files[i])}if(maxFiles==1)break}}else{fileList.innerHTML="No support for the File API in this web browser"}}filesUpload.addEventListener("change",function(evt){traverseFiles(this.files);evt.preventDefault();evt.stopPropagation();this.value=""},false);dropArea.addEventListener("dragleave",function(){$(this).removeClass("ui-state-hover");$(this).closest(".Inputfield").removeClass("pw-drag-in-file")},false);dropArea.addEventListener("dragenter",function(evt){evt.preventDefault();$(this).addClass("ui-state-hover");$(this).closest(".Inputfield").addClass("pw-drag-in-file")},false);dropArea.addEventListener("dragover",function(evt){if(!$(this).is("ui-state-hover")){$(this).addClass("ui-state-hover");$(this).closest(".Inputfield").addClass("pw-drag-in-file")}evt.preventDefault();evt.stopPropagation()},false);dropArea.addEventListener("drop",function(evt){traverseFiles(evt.dataTransfer.files);$(this).removeClass("ui-state-hover").closest(".Inputfield").removeClass("pw-drag-in-file");evt.preventDefault();evt.stopPropagation()},false)}}function initTags($inputfields){$inputfields.each(function(){var $inputfield=$(this);var $inputs=$inputfield.find("input.InputfieldFileTagsInput:not(.selectized)");var $selects=$inputfield.find("input.InputfieldFileTagsSelect:not(.selectized)");if($inputs.length){$inputs.selectize({plugins:["remove_button","drag_drop"],delimiter:" ",persist:false,createOnBlur:true,submitOnReturn:false,create:function(input){return{value:input,text:input}}})}if($selects.length){if(!$inputfield.hasClass("Inputfield"))$inputfield=$inputfield.closest(".Inputfield");var configName=$inputfield.attr("data-configName");var settings=ProcessWire.config[configName];var options=[];for(var n=0;n"+escape(item.value)+""},option:function(item,escape){return"
      "+escape(item.value)+"
      "}}})}})}initSortable($(".InputfieldFileList"));initTags($(".InputfieldFileHasTags"));var allowAjax=false;if(window.File&&window.FileList&&window.FileReader&&($("#PageIDIndicator").length>0||$(".InputfieldAllowAjaxUpload").length>0)){InitHTML5("");allowAjax=true}else{InitOldSchool()}var minContainerWidth=767;var resizeActive=false;var windowResize=function(){if(!allowAjax)return;$(".AjaxUploadDropHere").each(function(){var $t=$(this);if($t.parent().width()<=minContainerWidth){$t.hide()}else{$t.show()}});resizeActive=false};if(allowAjax){$(window).resize(function(){if(resizeActive)return;resizeActive=true;setTimeout(windowResize,1e3)}).resize();$(document).on("AjaxUploadDone",".InputfieldFileHasTags",function(event){initTags($(this))})}$(document).on("reloaded",".InputfieldHasFileList",function(event){initSortable($(this).find(".InputfieldFileList"));InitHTML5($(this));initTags($(this));if(allowAjax)windowResize()})}); \ No newline at end of file diff --git a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.module b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.module index 5638c00e..9f226a33 100644 --- a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.module +++ b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.module @@ -30,6 +30,7 @@ * @method void processInputAddFile($filename) * @method void processInputDeleteFile(Pagefile $pagefile) * @method bool processInputFile(WireInputData $input, Pagefile $pagefile, $n) + * @method bool processItemInputfields(Pagefile $pagefile, InputfieldWrapper $inputfields, $id, WireInputData $input) * */ class InputfieldFile extends Inputfield implements InputfieldItemList, InputfieldHasSortableValue { @@ -38,7 +39,7 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel return array( 'title' => __('Files', __FILE__), // Module Title 'summary' => __('One or more file uploads (sortable)', __FILE__), // Module Summary - 'version' => 125, + 'version' => 126, 'permanent' => true, ); } @@ -108,6 +109,14 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel * */ protected $labels = array(); + + /** + * Cached value of Fieldgroup used for Pagefile custom fields, as used by getItemInputfields() method + * + * @var Fieldgroup|null|bool Null when not yet known, false when known not applicable, Fieldgroup when known and in use + * + */ + protected $itemFieldgroup = null; /** * Initialize the InputfieldFile @@ -477,17 +486,21 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel "" . ""; - $out .= - "

      " . - "
      " . - $this->renderItemDescriptionField($pagefile, $id, $n); + $description = $this->renderItemDescriptionField($pagefile, $id, $n); + $class = 'InputfieldFileData '; + $class .= $description ? 'description ui-widget-content' : 'InputfieldFileFields'; - if(!$this->renderValueMode) $out .= - ""; - - $out .= - "
      "; + $out .= "

      " . $description; + $inputfields = $this->getItemInputfields($pagefile); + if($inputfields) $out .= $inputfields->render(); + + if(!$this->renderValueMode) { + $out .= ""; + } + + $out .= "
      "; + return $out; } @@ -661,6 +674,8 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel } } + $this->getItemInputfields(); // custom fields ready + return parent::renderReady($parent, $renderValueMode); } @@ -748,6 +763,8 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel } /** + * Process input to add a file + * * @param string $filename * @throws WireException * @@ -822,6 +839,12 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel } } + /** + * Process input to delete a Pagefile item + * + * @param Pagefile $pagefile + * + */ protected function ___processInputDeleteFile(Pagefile $pagefile) { $fileLabel = $this->wire('config')->debug ? $pagefile->url() : $pagefile->name; $this->message($this->_("Deleted file:") . " $fileLabel"); // Label that precedes a deleted filename @@ -829,8 +852,19 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel $this->trackChange('value'); } + /** + * Process input for one Pagefile + * + * @param WireInputData $input + * @param Pagefile $pagefile + * @param int $n + * @return bool + * + */ protected function ___processInputFile(WireInputData $input, Pagefile $pagefile, $n) { - + + $saveFields = false; // allow custom Inputfields to be saved? + $changed = false; // are there any changes to this file? $id = $this->name . '_' . $pagefile->hash; if($this->uploadOnlyMode) { @@ -839,8 +873,6 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel if($input->$key === null) return false; } - $changed = false; - // replace (currently only used by InputfieldImage) $key = "replace_$id"; $replace = $input->$key; @@ -918,8 +950,15 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel $sort = (int) $sort; $pagefile->sort = $sort; if($n !== $sort) $changed = true; + $saveFields = true; } } + + if($saveFields) { + // save custom Inputfields + $inputfields = $this->getItemInputfields($pagefile); + if($inputfields && $this->processItemInputfields($pagefile, $inputfields, $id, $input)) $changed = true; + } if(isset($input['delete_' . $id])) { $this->processInputDeleteFile($pagefile); @@ -938,6 +977,48 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel return $changed; } + /** + * Process custom Inputfields for Pagefile item + * + * @param Pagefile $pagefile + * @param InputfieldWrapper $inputfields + * @param string $id Pagefile ID string + * @param WireInputData $input + * @return bool True if changes detected, false if not + * @since 3.0.142 + * + */ + protected function ___processItemInputfields(Pagefile $pagefile, InputfieldWrapper $inputfields, $id, WireInputData $input) { + + $changed = false; + + foreach($inputfields->getAll() as $f) { + $f->resetTrackChanges(true); + $f->processInput($input); + if(!$f->isChanged() && !$pagefile->isTemp()) { + continue; + } + $name = str_replace("_$id", '', $f->attr('name')); + if($f->getSetting('useLanguages')) { + $value = $pagefile->getFieldValue($name); + if(is_object($value)) $value->setFromInputfield($f); + } else { + $value = $f->val(); + } + $pagefile->setFieldValue($name, $value, true); + $changed = true; + } + + return $changed; + } + + /** + * Process input + * + * @param WireInputData $input + * @return self + * + */ public function ___processInput(WireInputData $input) { if(is_null($this->value)) $this->value = $this->wire(new Pagefiles($this->wire('page'))); @@ -1080,7 +1161,13 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel * */ protected function allowCollapsedItems() { - return $this->descriptionRows == 0 && !$this->useTags && !$this->noCollapseItem; + $allow = $this->descriptionRows == 0 && !$this->useTags && !$this->noCollapseItem; + if($allow && $this->hasField) { + /** @var FieldtypeFile $fieldtype */ + $fieldtype = $this->hasField->type; + if($fieldtype->getFieldsTemplate($this->hasField)) $allow = false; + } + return $allow; } /** @@ -1094,6 +1181,90 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel return $this->wire('sanitizer')->entities(str_replace(' ', ', ', trim($extensions))); } + /** + * Get custom Inputfields for editing given Pagefile + * + * @param Pagefile|null $item Specify Pagefile item, or omit to prepare for render ready + * @return bool|InputfieldWrapper + * @since 3.0.142 + * + */ + public function getItemInputfields(Pagefile $item = null) { + + /** @var Pagefiles $pagefiles */ + $value = $this->val(); + $pagefiles = $value instanceof Pagefile ? $value->pagefiles : $value; + + if(!$pagefiles instanceof Pagefiles) { + // no value present on this Inputfield + return false; + } + + if($this->itemFieldgroup === false) { + // item fieldgroup already determined not in use + return false; + } + + if($this->itemFieldgroup === null) { + // item fieldgroup not yet determined + $this->itemFieldgroup = false; + $template = $pagefiles->getFieldsTemplate(); + if(!$template) return false; + $this->itemFieldgroup = $template->fieldgroup; + } + + /** @var Page $page */ + $page = $pagefiles->getFieldsPage(); + $id = $item ? ('_' . $this->pagefileId($item)) : ''; + + $inputfields = $this->itemFieldgroup->getPageInputfields($page, $id, '', false); + if(!$inputfields) return false; + + /** @var Languages|null $languages */ + $languages = $this->wire('languages'); + + foreach($inputfields->getAll() as $f) { + + if(!$item) { + // prepare inputfields for render rather than populating them + $f->renderReady(); + continue; + } + + /** @var Inputfield $f */ + $name = str_replace($id, '', $f->name); + $value = $item ? $item->getFieldValue($name) : null; + if($value === null) continue; + + if($languages && $f->getSetting('useLanguages') && $value instanceof LanguagesValueInterface) { + foreach($languages as $language) { + $f->set($language->isDefault() ? "value" : "value$language->id", $value->getLanguageValue($language->id)); + } + } else { + $f->val($value); + } + + if($f->className() === 'InputfieldCKEditor') { + // CKE does not like being placed in file/image fields. + // I'm sure it's possible, but needs more work and debugging, so it's disabled for now. + $allow = false; + } else { + $allow = true; + } + + if(!$allow) { + $inputfields->remove($f); + $this->prependMarkup = + "

      " . + sprintf($this->_('Field “%1$s” type “%2$s” is not supported in field “%3$s”'), $f->label, $f->className(), $this->label) . + '

      '; + $f->getParent()->remove($f); + } + } + + return $inputfields; + } + /** * Configuration settings for InputfieldFile * diff --git a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.scss b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.scss index 737a4016..c8d198b9 100755 --- a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.scss +++ b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.scss @@ -87,12 +87,18 @@ ul.InputfieldFileList li .ui-icon { display: none !important; } -ul.InputfieldFileList li .InputfieldFileData { - margin-top: 0; - margin-bottom: 0; - padding: 1em; +ul.InputfieldFileList li { + .InputfieldFileData { + margin-top: 0; + margin-bottom: 0; + padding: 1em; + } + .InputfieldFileData.InputfieldFileFields { + padding: 0; + } } + .InputfieldFile.InputfieldItemListCollapse ul.InputfieldFileList li .InputfieldFileData { display: none; } diff --git a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.css b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.css index 1f9397d0..cc0966b9 100755 --- 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{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;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__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__trash{position:absolute;background:#fff;padding:.2em .6em;color:#aaa;z-index:2;cursor:pointer}label.gridImage__trash{display:none}.gridImage__trash--single{display:block !important;position:static}.gridImage__trash>input{display:none}.gridImage:hover .gridImage__trash{display:block}.gridImage:hover label.gridImage__trash: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__trash{background-color:#3eb998;color:#fff}.gridImage--active .gridImage__trash:hover{background-color:#3eb998}.gridImage--active:hover .gridImage__trash: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}.gridImage--delete:hover .gridImage__inner{background:rgba(232,53,97,.3)}.InputfieldImageEdit{position:relative;display:none}.InputfieldImageEdit--active,.InputfieldImageEditSingle{display:block}.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;align-items:center;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 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 .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}.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:initial;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:initial}.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__trash{z-index:5;display:block !important;top:0;right:0}.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:hover .gridImage__trash: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} +.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{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;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__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__trash{position:absolute;background:#fff;padding:.2em .6em;color:#aaa;z-index:2;cursor:pointer}label.gridImage__trash{display:none}.gridImage__trash--single{display:block !important;position:static}.gridImage__trash>input{display:none}.gridImage:hover .gridImage__trash{display:block}.gridImage:hover label.gridImage__trash: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__trash{background-color:#3eb998;color:#fff}.gridImage--active .gridImage__trash:hover{background-color:#3eb998}.gridImage--active:hover .gridImage__trash: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}.gridImage--delete:hover .gridImage__inner{background:rgba(232,53,97,.3)}.InputfieldImageEdit{position:relative;display:none}.InputfieldImageEdit--active,.InputfieldImageEditSingle{display:block}.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 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 .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}.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:initial;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:initial}.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__trash{z-index:5;display:block !important;top:0;right:0}.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:hover .gridImage__trash: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} diff --git a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.js b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.js index 11bc5e02..aa93112f 100755 --- a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.js +++ b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.js @@ -1330,10 +1330,10 @@ function InputfieldImage($) { $grid.click(toggleClick); if($target.hasClass('InputfieldImage')) { - $target.find('.InputfieldHeader').append($list).append($left).append($grid); + $target.children('.InputfieldHeader').append($list).append($left).append($grid); defaultMode = getCookieData($target, 'mode'); } else { - $(".InputfieldImage .InputfieldHeader", $target).append($list).append($left).append($grid); + $(".InputfieldImage > .InputfieldHeader", $target).append($list).append($left).append($grid); } if(defaultMode == 'list') { @@ -2041,6 +2041,13 @@ function InputfieldImage($) { } else { setGridSize($inputfield, size); } + setTimeout(function() { + var $inputfields = $markup.find('.Inputfield'); + if($inputfields.length) { + InputfieldsInit($markup.find('.Inputfields')); + $inputfields.trigger('reloaded', ['InputfieldImageUpload']); + } + }, 250); }).css("display", ""); $markup.addClass('InputfieldFileItemExisting'); diff --git a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.min.js b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.min.js index 150feb31..933f7144 100644 --- a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.min.js +++ b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.min.js @@ -1 +1 @@ -function InputfieldImage($){var $uploadBeforeItem=null;var uploadReplace={file:"",item:null,edit:null};var magnificOptions={type:"image",closeOnContentClick:true,closeBtnInside:true};var cookieData=null;var retryGridItems=[];var gridSliding=false;function useAjaxUpload(){var isFileReaderSupport=window.File&&window.FileList&&window.FileReader;var isAjaxUpload=$(".InputfieldAllowAjaxUpload").length>0;var isPageIDIndicator=$("#PageIDIndicator").length>0;return isFileReaderSupport&&(isPageIDIndicator||isAjaxUpload)}function throttle(fn,threshhold,scope){threshhold||(threshhold=250);var last,deferTimer;return function(){var context=scope||this;var now=+new Date,args=arguments;if(last&&now .gridImage",start:function(e,ui){var size=getCookieData($el.closest(".Inputfield"),"size");ui.placeholder.append($("
      ").css({display:"block",height:size+"px",width:size+"px"}));timer=window.setTimeout(function(){closeEdit($el,null)},100);$el.addClass("InputfieldImageSorting")},stop:function(e,ui){var $this=$(this);if(timer!==null){ui.item.find(".InputfieldImageEdit__edit").click();clearTimeout(timer)}$this.children("li").each(function(n){var $sort=$(this).find(".InputfieldFileSort");if($sort.val()!=n)$sort.val(n).change()});$el.removeClass("InputfieldImageSorting")},cancel:".InputfieldImageEdit,.focusArea,input,textarea,button,select,option"};$el.sortable(sortableOptions)}function setupMagnificForRenderValue($el){var options=$.extend(true,{},magnificOptions);options.callbacks={elementParse:function(item){var src=$(item.el).attr("data-original");if(typeof src=="undefined"||!src)src=$(item.el).attr("src");item.src=src}};options.gallery={enabled:true};$el.find("img").magnificPopup(options)}function setupMagnificForSingle($el){var options=$.extend(true,{},magnificOptions);options.callbacks={elementParse:function(item){item.src=$(item.el).attr("src")}};options.gallery={enabled:false};$el.find("img").magnificPopup(options)}function findEditedElement($parent){return $parent.find(".InputfieldImageEdit--active")}function findEditMarkup($edit){return $("#"+$edit.find(".InputfieldImageEdit__edit").attr("data-current"))}function setDeleteStateOnAllItems($input){var checked=$input.is(":checked");var $items=$input.parents(".gridImages").find(".gridImage__deletebox");if(checked){$items.prop("checked","checked").change()}else{$items.removeAttr("checked").change()}}function updateGrid($inputfield){if(typeof $inputfield=="undefined"){var $gridImages=$(".gridImages")}else{var $gridImages=$inputfield.find(".gridImages")}$gridImages.each(function(){var $grid=$(this),$edit=findEditedElement($grid);if($edit.length){moveEdit(findEditMarkup($edit),$edit)}})}function checkInputfieldWidth($inputfield){var narrowItems=[];var mediumItems=[];var wideItems=[];var ni=0,mi=0,wi=0;var $inputfields;if(typeof $inputfield=="undefined"){$inputfields=$(".InputfieldImage.Inputfield")}else{$inputfields=$inputfield}$inputfields.removeClass("InputfieldImageNarrow InputfieldImageMedium InputfieldImageWide");$inputfields.each(function(){var $item=$(this);var width=$item.width();if(width<1)return;if(width<=500){narrowItems[ni]=$item;ni++}else if(width<=900){mediumItems[mi]=$item;mi++}else{wideItems[wi]=$item;wi++}});for(var n=0;n100?100:top,left:left>100?100:left,zoom:zoom>100?0:zoom};return focusData}function getFocusStr(focusObj){if(typeof focusObj=="undefined")focusObj=getFocus();return focusObj.top+" "+focusObj.left+" "+focusObj.zoom}function getFocusProperty(property){var focus=getFocus();return focus[property]}function setFocus(focusObj){focusData=focusObj;var focusStr=focusObj.top+" "+focusObj.left+" "+focusObj.zoom;$thumb.attr("data-focus",focusStr);$input=$edit.find(".InputfieldImageFocus");if(focusStr!=$input.val()){$input.val(focusStr).trigger("change")}}function setFocusProperty(property,value){var focus=getFocus();focus[property]=value;setFocus(focus)}function setFocusDragPosition(){var focus=getFocus();var $overlay=$focusCircle.parent();var w=$overlay.width();var h=$overlay.height();var x=Math.round(focus.left/100*w);var y=Math.round(focus.top/100*h);if(x<0)x=0;if(y<0)y=0;if(x>w)x=w;if(y>h)y=h;$focusCircle.css({top:y+"px",left:x+"px"})}$focusArea=$img.siblings(".focusArea");if(!$focusArea.length){$focusArea=$("
      ").addClass("focusArea");$img.after($focusArea)}$focusArea.css({height:$img.height()+"px",width:$img.width()+"px","background-color":"rgba(0,0,0,0.7)"}).addClass("focusActive");$focusCircle=$focusArea.find(".focusCircle");if(!$focusCircle.length){$focusCircle=$("
      ").addClass("focusCircle");$focusArea.append($focusCircle)}$img.parent().addClass("focusWrap");setFocusDragPosition();var zoomSlide=function(zoomPercent){var zoomBoxSize,focus,faWidth,faHeight;if(typeof zoomPercent=="undefined")zoomPercent=lastZoomPercent;lastZoomPercent=zoomPercent;faWidth=$focusArea.width();faHeight=$focusArea.height();if(faWidth>faHeight){$zoomBox.height(100-zoomPercent+"%");zoomBoxSize=$zoomBox.height();$zoomBox.width(zoomBoxSize)}else{$zoomBox.width(100-zoomPercent+"%");zoomBoxSize=$zoomBox.width();$zoomBox.height(zoomBoxSize)}focus=getFocus();var crop=getFocusZoomCropDimensions(focus.left,focus.top,zoomPercent,faWidth,faHeight,zoomBoxSize);$zoomBox.css({top:crop.top+"px",left:crop.left+"px","background-position":"-"+crop.left+"px -"+crop.top+"px","background-size":faWidth+"px "+faHeight+"px"});focus.zoom=zoomPercent;setFocusProperty("zoom",focus.zoom);if(mode=="grid")setGridSizeItem($thumb.parent(),gridSize,false,focus)};var dragEvent=function(event,ui){var $this=$(this);var circleSize=$this.outerHeight();var w=$this.parent().width();var h=$this.parent().height();var top=ui.position.top>0?ui.position.top:0;var left=ui.position.left>0?ui.position.left:0;top=top>0?top/h*100:0;left=left>0?left/w*100:0;var newFocus={top:top,left:left,zoom:getFocusProperty("zoom")};setFocus(newFocus);if(useZoomFocus){zoomSlide(newFocus.zoom)}else if(mode=="grid"){setGridSizeItem($thumb.parent(),gridSize,false,newFocus)}};$focusCircle.draggable({containment:"parent",drag:dragEvent,stop:dragEvent});if(useZoomFocus){var zoom=getFocusProperty("zoom");$zoomSlider=$("
      ").addClass("focusZoomSlider").css({"margin-top":"5px"});$zoomBox=$("
      ").addClass("focusZoomBox").css({position:"absolute",background:"transparent","background-image":"url("+$img.attr("src")+")"});$focusArea.prepend($zoomBox);$img.after($zoomSlider);$thumb.attr("src",$img.attr("src"));$zoomSlider.slider({min:0,max:50,value:zoom,range:"max",slide:function(event,ui){zoomSlide(ui.value)}});zoomSlide(zoom)}else{$focusArea.css("background-color","rgba(0,0,0,0.5)")}}function stopFocus($edit){$focusCircle=$edit.find(".focusCircle");if($focusCircle.length){var $focusWrap=$focusCircle.closest(".focusWrap");$focusWrap.find(".focusZoomSlider").slider("destroy").remove();$focusWrap.find(".focusZoomBox").remove();$focusWrap.removeClass("focusWrap");$focusCircle.draggable("destroy");$focusCircle.parent().removeClass("focusActive");$focusCircle.remove();var $button=$edit.find(".InputfieldImageButtonFocus");if($button.length){$icon=$button.find("i");$icon.removeClass("focusIconActive").toggleClass($icon.attr("data-toggle"))}}}function getFocusZoomPosition(focusPercent,sourceDimension,cropDimension){var focusPX=parseInt(sourceDimension*focusPercent/100);var position=parseInt(focusPX-cropDimension/2);var maxPosition=parseInt(sourceDimension-cropDimension);if(0>position)position=0;if(maxPosition=percentH?faWidth:faHeight;var cropDimension=maxDimension-maxDimension*zoomPercent/100;var posLeft=getFocusZoomPosition(focusLeft,faWidth,cropDimension);var posTop=getFocusZoomPosition(focusTop,faHeight,cropDimension);return{left:posLeft,top:posTop,width:cropDimension,height:cropDimension}}function getFocusZoomPosition4GridviewSquare(focusPercent,sourceDimPX,gridViewPX,zoomPercent,scale,smallestSidePX){var sourceDimPX=sourceDimPX*scale;var gridViewPercent=gridViewPX/sourceDimPX*100;var adjustPercent=gridViewPercent/2;var posPercent=focusPercent-adjustPercent;var posMinVal=0;var posMaxVal=100-gridViewPercent;if(posPercent<=posMinVal)posPercent=0;if(posPercent>=posMaxVal)posPercent=posMaxVal;var posPX=sourceDimPX/100*posPercent/scale;posPX=-1*parseInt(posPX);return posPX}function getFocusZoomCropDimensions4GridviewSquare(focusLeft,focusTop,zoomPercent,w,h,gridViewSize,scale){var smallestSidePX=w>=h?h:w;var posLeft=getFocusZoomPosition4GridviewSquare(focusLeft,w,gridViewSize,zoomPercent,scale,smallestSidePX);var posTop=getFocusZoomPosition4GridviewSquare(focusTop,h,gridViewSize,zoomPercent,scale,smallestSidePX);var transformLeft=parseInt(posLeft);var transformTop=parseInt(posTop);return{transformLeft:transformLeft,transformTop:transformTop,scale:scale}}function tearDownEdit($edit){stopFocus($edit);$edit.off("click",".InputfieldImageButtonFocus");$inputArea=$edit.find(".InputfieldImageEdit__edit");if($inputArea.children().not(".InputfieldFileSort").length){var $items=$inputArea.children();$("#"+$inputArea.attr("data-current")).find(".ImageData").append($items)}}function closeEdit($parent,$not){var $edit;if($parent){$edit=$parent.find(".InputfieldImageEdit--active")}else if($not){$edit=$(".InputfieldImageEdit--active").not($not.find(".InputfieldImageEdit--active"))}else{$edit=$(".InputfieldImageEdit--active")}if($edit.length){tearDownEdit($edit);$edit.removeClass("InputfieldImageEdit--active").removeAttr("id");$("#"+$edit.attr("data-for")).removeClass("gridImageEditing")}$(".InputfieldImageEdit__replace").removeClass("InputfieldImageEdit__replace")}function moveEdit($el,$edit){if(!$el||!$el.length)return;var $children=$el.parent().children().not(".InputfieldImageEdit");var lastTop=0;var found=false;var $insertBeforeItem=null;$children.each(function(){if($insertBeforeItem)return;var $item=$(this);var top=$item.offset().top;if(found&&top!=lastTop){$insertBeforeItem=$item}else if($item.attr("id")==$el.attr("id")){found=true}lastTop=top});if($insertBeforeItem){$edit.insertBefore($insertBeforeItem)}else{$edit.insertAfter($children.eq($children.length-1))}var $arrow=$edit.find(".InputfieldImageEdit__arrow");if($arrow.length)$arrow.css("left",$el.position().left+$el.outerWidth()/2+"px")}function initGridEvents(){$(window).resize(throttle(windowResize,200));$(document).on("click dblclick",".gridImage__trash",function(e){var $input=$(this).find("input");$input.prop("checked",inverseState).change();if(e.type=="dblclick"){setDeleteStateOnAllItems($input);e.preventDefault();e.stopPropagation()}});$(document).on("change",".gridImage__deletebox",function(){updateDeleteClass($(this))});$(document).on("click",".gridImage__edit",function(e){var $el=$(this).closest(".gridImage");if(!$el.length)return;if($el.closest(".InputfieldImageEditAll").length)return false;var $all=$el.closest(".gridImages");var $edit=$all.find(".InputfieldImageEdit");if($el.hasClass("gridImageEditing")){$edit.find(".InputfieldImageEdit__close").click()}else{moveEdit($el,$edit);tearDownEdit($edit);setupEdit($el,$edit);$edit.addClass("InputfieldImageEdit--active").attr("data-for",$el.attr("id"));$all.find(".gridImageEditing").removeClass("gridImageEditing");$el.addClass("gridImageEditing")}}).on("click",".InputfieldImageEditAll img",function(e){e.stopPropagation();e.preventDefault();$.magnificPopup.close();var options=$.extend(true,{},magnificOptions);var $img=$(this);options["items"]={src:$img.attr("data-original"),title:$img.attr("alt")};$.magnificPopup.open(options);return true}).on("click",".InputfieldImageButtonFocus",function(){var $button=$(this);var $icon=$button.find("i");var $edit=$button.closest(".InputfieldImageEdit, .gridImage");var $focusCircle=$edit.find(".focusCircle");if($focusCircle.length){stopFocus($edit)}else{startFocus($edit);$icon.addClass("focusIconActive");$icon.toggleClass($icon.attr("data-toggle"))}});$(document).on("click",function(e){var $el=$(e.target);if($el.closest(".InputfieldImageEdit").length){closeEdit(null,$el.parents(".gridImages"))}else if($el.is("input, textarea")&&$el.closest(".InputfieldImageEditAll").length){$el.focus().one("blur",function(){$el.closest(".gridImages").sortable("enable")});$el.closest(".gridImages").sortable("disable")}else if($el.closest(".gridImage__inner").length){closeEdit(null,$el.parents(".gridImages"))}else if($el.closest(".mfp-container").length){return}else if($el.closest(".ui-dialog").length){return}else if($el.is(".mfp-close")){return}else if($el.is("a.remove")){return}else{closeEdit(null,null)}});$(document).on("click",".InputfieldImageEdit__close",function(e){closeEdit($(this).parents(".gridImages"),null)});$(document).on("change",".InputfieldImage",function(){$(this).find(".InputfieldImageButtonCrop:not(.pw-modal-dblclick)").addClass("pw-modal-dblclick ui-state-disabled")}).on("click",".InputfieldImageButtonCrop.ui-state-disabled",function(e){var $button=$(this);var $list=$button.closest(".gridImages");if(!$list.hasClass("gridImagesAlerted")){ProcessWire.alert(ProcessWire.config.InputfieldImage.labels.changes);$list.addClass("gridImagesAlerted")}setTimeout(function(){$button.removeClass("ui-state-active")},500);return false});$(".ImagesGrid").on("click","button.pw-modal",function(e){e.preventDefault()});setupEditableFilename();checkInputfieldWidth()}function setupEditableFilename(){$(document).on("click",".InputfieldImageEdit__name",function(e){var $span=$(this).children("span");var $input=$span.closest(".gridImage, .InputfieldImageEdit").find(".InputfieldFileRename");var $list=$span.closest(".gridImages");$list.sortable("disable");$input.val($span.text());$span.on("keypress",function(e){if(e.which==13){$span.blur();return false}return true});$span.attr("autocomplete","off").attr("autocorrect","off").attr("autocapitalize","off").attr("spellcheck","false");$span.focus().on("blur",function(){var val=$(this).text();if($.trim(val).length<1){$span.text($input.val())}else if(val!=$input.val()){$input.val(val).change();$list.closest(".Inputfield").trigger("change")}$span.off("keypress");$list.sortable("enable")})})}function setListSize($inputfield,pct){pct=Math.floor(pct);$inputfield.find(".gridImage__overflow").each(function(){var dataPct=100-pct;var $this=$(this);$this.css("width",pct+"%");$this.siblings(".ImageData").css("width",dataPct+"%");$this.find("img").css({top:0,left:0,transform:"none"})});setCookieData($inputfield,"listSize",pct)}function setGridSize($inputfield,gridSize,ragged){if(!gridSize)return;var size=gridSize+"px";var $gridImages=$inputfield.find(".gridImages");if(typeof ragged=="undefined"||ragged==null)ragged=$gridImages.attr("data-ragged")?true:false;if(ragged){$gridImages.attr("data-ragged",1)}else{$gridImages.removeAttr("data-ragged")}$gridImages.find(".gridImage__overflow").each(function(){setGridSizeItem($(this),gridSize,ragged)});$gridImages.find(".gridImage__edit, .gridImage__resize").css("line-height",size);$gridImages.attr("data-size",gridSize);setCookieData($inputfield,"size",gridSize);if(retryGridItems.length)setTimeout(function(){while(retryGridItems.length){var item=retryGridItems.pop();setGridSizeItem(item.item,item.gridSize,ragged)}},150)}function setGridSizeItem($item,gridSize,ragged,focus){if($item.hasClass("gridImage__overflow")){var $img=$item.children("img")}else if($item.is("img")){var $img=$item;$item=$img.closest(".gridImage__overflow")}else{return}if(!gridSize){$img.removeAttr("width").removeAttr("height");$item.width("auto").height("auto");return}var zoom=0;var w=$img.width();var h=$img.height();var dataW=parseInt($img.attr("data-w"));var dataH=parseInt($img.attr("data-h"));if(!w)w=dataW;if(!h)h=dataH;if(!ragged&&typeof focus=="undefined"){var focusStr=$img.attr("data-focus");if(typeof focusStr=="undefined")focusStr="50.0 50.0 0";var focusArray=focusStr.split(" ");focus={top:parseFloat(focusArray[0]),left:parseFloat(focusArray[1]),zoom:parseInt(focusArray[2])}}if(!ragged)zoom=focus.zoom;if(ragged){$img.attr("height",gridSize).removeAttr("width");$img.css({"max-height":"100%","max-width":"none",top:"50%",left:"50%",transform:"translate3d(-50%, -50%, 0)"})}else if(zoom>0&&$item.closest(".InputfieldImageFocusZoom").length&&!gridSliding){if(w>=h){var maxHeight="100%";var maxWidth="none";if(w==dataW){h=gridSize;w=h/dataH*dataW}}else{var maxHeight="none";var maxWidth="100%";if(h==dataH){w=gridSize;h=w/dataW*dataH}}var scale=1+zoom/100*2;var crop=getFocusZoomCropDimensions4GridviewSquare(focus.left,focus.top,zoom,w,h,gridSize,scale);$img.css({left:"0px",top:"0px","transform-origin":"0px 0px",transform:"scale("+crop.scale+") translate3d("+crop.transformLeft+"px, "+crop.transformTop+"px, 0)","max-width":maxWidth,"max-height":maxHeight})}else if(w>=h){$img.attr("height",gridSize).removeAttr("width");if(focus.left<1)focus.left=.001;$img.css({"max-height":"100%","max-width":"none",top:"50%",left:focus.left+"%",transform:"translate3d(-"+focus.left+"%, -50%, 0)"})}else if(h>w){$img.attr("width",gridSize).removeAttr("height");if(focus.top<1)focus.top=.001;$img.css({"max-height":"none","max-width":"100%",top:focus.top+"%",left:"50%",transform:"translate3d(-50%, -"+focus.top+"%, 0)"})}else{$img.css({"max-height":"100%","max-width":"none",top:"50%",left:"50%",transform:"translate3d(-50%, -50%, 0)"});$img.removeAttr("width").attr("height",gridSize)}var w=$img.width();if(w){$item.css({width:ragged?w+"px":gridSize+"px",height:gridSize+"px"})}else{var tries=$item.attr("data-tries");if(!tries)tries=0;if(typeof tries=="undefined")tries=0;tries=parseInt(tries);if(tries>3){$item.css({width:gridSize+"px",height:gridSize+"px"})}else{retryGridItems.push({item:$item,gridSize:gridSize});$item.attr("data-tries",tries+1)}}}function setupImageListToggle($target){if($target.find(".InputfieldImageListToggle").length)return;var $list=$("").append("");var $left=$("").append("");var $grid=$("").append("");var activeClass="InputfieldImageListToggle--active";var defaultMode="";var toggleClick=function(e){var $a=$(this);var $inputfield=$a.closest(".Inputfield");var href=$a.attr("href");var size;var $aPrev=$a.parent().children("."+activeClass);var hrefPrev=$aPrev.attr("href");$aPrev.removeClass(activeClass);$a.addClass(activeClass);stopFocus($inputfield);if(href=="list"){if(!$inputfield.hasClass("InputfieldImageEditAll")){$inputfield.find(".InputfieldImageEdit--active .InputfieldImageEdit__close").click();$inputfield.addClass("InputfieldImageEditAll")}size=getCookieData($inputfield,"listSize");setListSize($inputfield,size);setCookieData($inputfield,"mode","list")}else if(href=="left"){$inputfield.removeClass("InputfieldImageEditAll");size=getCookieData($inputfield,"size");setGridSize($inputfield,size,true);setCookieData($inputfield,"mode","left");updateGrid()}else if(href=="grid"){$inputfield.removeClass("InputfieldImageEditAll");size=getCookieData($inputfield,"size");setGridSize($inputfield,size,false);setCookieData($inputfield,"mode","grid");if(hrefPrev=="left")setTimeout(function(){setGridSize($inputfield,size,false)},100)}setupSortable($inputfield.find(".gridImages"));$a.blur();return false};$list.click(toggleClick);$left.click(toggleClick);$grid.click(toggleClick);if($target.hasClass("InputfieldImage")){$target.find(".InputfieldHeader").append($list).append($left).append($grid);defaultMode=getCookieData($target,"mode")}else{$(".InputfieldImage .InputfieldHeader",$target).append($list).append($left).append($grid)}if(defaultMode=="list"){$list.click()}else if(defaultMode=="left"){$left.click()}else{}}function setupSizeSlider($inputfield){var $header=$inputfield.children(".InputfieldHeader");if($header.children(".InputfieldImageSizeSlider").length)return;var $gridImages=$inputfield.find(".gridImages");var gridSize=$gridImages.attr("data-gridsize");var min=gridSize/2;var max=gridSize*2;var $slider=$('');$header.append($slider);var sizeSlide=function(event,ui){var value=ui.value;var minPct=15;var divisor=Math.floor(gridSize/minPct);var v=value-min;var listSize=Math.floor(minPct+v/divisor);if($inputfield.hasClass("InputfieldImageEditAll")){setCookieData($inputfield,"size",value);setListSize($inputfield,listSize)}else{setCookieData($inputfield,"listSize",listSize);setGridSize($inputfield,value)}};$slider.slider({min:min,max:max,value:getCookieData($inputfield,"size"),range:"min",slide:sizeSlide,start:function(event,ui){gridSliding=true;if($inputfield.find(".InputfieldImageEdit:visible").length){$inputfield.find(".InputfieldImageEdit__close").click()}},stop:function(event,ui){gridSliding=false;sizeSlide(event,ui);updateGrid($inputfield)}})}function setCookieData($inputfield,property,value){var data=getCookieData($inputfield);var id=$inputfield.attr("id");var name=id?id.replace("wrap_Inputfield_",""):"";if(!name.length||typeof value=="undefined")return;if(data[name][property]==value)return;data[name][property]=value;$.cookie("InputfieldImage",data,{secure:window.location.protocol.indexOf("https:")===0});cookieData=data}function getCookieData($inputfield,property){if(cookieData&&typeof property=="undefined")return cookieData;var id=$inputfield.attr("id");var name=id?id.replace("wrap_Inputfield_",""):"na";var data=cookieData?cookieData:$.cookie("InputfieldImage");var value=null;if(!data)var data={};if(typeof data[name]=="undefined")data[name]={};if(typeof data[name].size=="undefined")data[name].size=parseInt($inputfield.find(".gridImages").attr("data-size"));if(typeof data[name].listSize=="undefined")data[name].listSize=23;if(typeof data[name].mode=="undefined")data[name].mode=$inputfield.find(".gridImages").attr("data-gridMode");if(cookieData==null)cookieData=data;if(typeof property=="undefined"){value=data}else if(property===true){value=data[name]}else if(typeof data[name][property]!="undefined"){value=data[name][property]}return value}function initInputfield($inputfield){if($inputfield.hasClass("InputfieldStateCollapsed"))return;var maxFiles=parseInt($inputfield.find(".InputfieldImageMaxFiles").val());var $gridImages=$inputfield.find(".gridImages");var size=getCookieData($inputfield,"size");var mode=getCookieData($inputfield,"mode");var ragged=mode=="left"?true:false;var renderValueMode=$inputfield.hasClass("InputfieldRenderValueMode");if(!size)size=$gridImages.attr("data-gridsize");size=parseInt(size);if(!renderValueMode&&($inputfield.hasClass("InputfieldImageEditAll")||mode=="list")){var listSize=getCookieData($inputfield,"listSize");setListSize($inputfield,listSize)}else{setGridSize($inputfield,size,ragged)}if(!$inputfield.hasClass("InputfieldImageInit")){$inputfield.addClass("InputfieldImageInit");if(renderValueMode){return setupMagnificForRenderValue($inputfield)}else if(maxFiles==1){$inputfield.addClass("InputfieldImageMax1");setupMagnificForSingle($inputfield)}else{setupSortable($gridImages)}setupImageListToggle($inputfield);setupSizeSlider($inputfield)}checkInputfieldWidth($inputfield);$inputfield.on("change",".InputfieldFileActionSelect",function(){var $note=$(this).next(".InputfieldFileActionNote");if($(this).val().length){$note.fadeIn()}else{$note.hide()}})}function initUploadOldSchool(){$("body").addClass("ie-no-drop");$(".InputfieldImage.InputfieldFileMultiple").each(function(){var $field=$(this),maxFiles=parseInt($field.find(".InputfieldFileMaxFiles").val()),$list=$field.find(".gridImages"),$uploadArea=$field.find(".InputfieldImageUpload");$uploadArea.on("change","input[type=file]",function(){var $t=$(this),$mask=$t.parent(".InputMask");if($t.val().length>1)$mask.addClass("ui-state-disabled");else $mask.removeClass("ui-state-disabled");if($t.next("input.InputfieldFile").length>0)return;var numFiles=$list.children("li").length+$uploadArea.find("input[type=file]").length+1;if(maxFiles>0&&numFiles>=maxFiles)return;$uploadArea.find(".InputMask").not(":last").each(function(){var $m=$(this);if($m.find("input[type=file]").val()<1)$m.remove()});var $i=$mask.clone().removeClass("ui-state-disabled");$i.children("input[type=file]").val("");$i.insertAfter($mask)})})}function initUploadHTML5($inputfield){var $target;if($inputfield.length>0){$target=$inputfield.find(".InputfieldImageUpload")}else{$target=$(".InputfieldImageUpload")}$target.each(function(i){var $this=$(this);var $content=$this.closest(".InputfieldContent");if($this.hasClass("InputfieldImageInitUpload"))return;initHTML5Item($content,i);$this.addClass("InputfieldImageInitUpload")});function initHTML5Item($this,i){var $form=$this.parents("form");var $repeaterItem=$this.closest(".InputfieldRepeaterItem");var postUrl=$repeaterItem.length?$repeaterItem.attr("data-editUrl"):$form.attr("action");postUrl+=(postUrl.indexOf("?")>-1?"&":"?")+"InputfieldFileAjax=1";var $postToken=$form.find("input._post_token");var postTokenName=$postToken.attr("name");var postTokenValue=$postToken.val();var $errorParent=$this.find(".InputfieldImageErrors").first();var fieldName=$this.find(".InputfieldImageUpload").data("fieldname");fieldName=fieldName.slice(0,-2);var $inputfield=$this.closest(".Inputfield.InputfieldImage");var extensions=$this.find(".InputfieldImageUpload").data("extensions").toLowerCase();var maxFilesize=$this.find(".InputfieldImageUpload").data("maxfilesize");var filesUpload=$this.find("input[type=file]").get(0);var $fileList=$this.find(".gridImages");var fileList=$fileList.get(0);var gridSize=$fileList.data("gridsize");var doneTimer=null;var maxFiles=parseInt($this.find(".InputfieldImageMaxFiles").val());var resizeSettings=getClientResizeSettings($inputfield);var useClientResize=resizeSettings.maxWidth>0||resizeSettings.maxHeight>0||resizeSettings.maxSize>0;setupDropzone($this);if(maxFiles!=1)setupDropInPlace($fileList);$fileList.children().addClass("InputfieldFileItemExisting");$inputfield.on("pwimageupload",function(event,data){traverseFiles([data.file],data.xhr)});function errorItem(message,filename){if(typeof filename!=="undefined")message=""+filename+": "+message;var icon=" ";return"
    • "+icon+message+"
    • "}function basename(str){var base=new String(str).substring(str.lastIndexOf("/")+1);if(base.lastIndexOf(".")!=-1)base=base.substring(0,base.lastIndexOf("."));return base}function setupDropzone($el){if($el.hasClass("InputfieldImageDropzoneInit"))return;var el=$el.get(0);var $inputfield=$el.closest(".Inputfield");function dragStart(){if($inputfield.hasClass("pw-drag-in-file"))return;$el.addClass("ui-state-hover");$inputfield.addClass("pw-drag-in-file")}function dragStop(){if(!$inputfield.hasClass("pw-drag-in-file"))return;$el.removeClass("ui-state-hover");$inputfield.removeClass("pw-drag-in-file")}el.addEventListener("dragleave",function(){dragStop()},false);el.addEventListener("dragenter",function(evt){evt.preventDefault();dragStart()},false);el.addEventListener("dragover",function(evt){if(!$el.is("ui-state-hover"))dragStart();evt.preventDefault();evt.stopPropagation();return false},false);el.addEventListener("drop",function(evt){traverseFiles(evt.dataTransfer.files);dragStop();evt.preventDefault();evt.stopPropagation();return false},false);$el.addClass("InputfieldImageDropzoneInit")}function setupDropInPlace($gridImages){var $i=null;var haltDrag=false;var timer=null;var $inputfield=$gridImages.closest(".Inputfield");function addInputfieldClass(){$inputfield.addClass("pw-drag-in-file")}function removeInputfieldClass(){$inputfield.removeClass("pw-drag-in-file")}function getCenterCoordinates($el){var offset=$el.offset();var width=$el.width();var height=$el.height();var centerX=offset.left+width/2;var centerY=offset.top+height/2;return{clientX:centerX,clientY:centerY}}function noDropInPlace(){return $gridImages.find(".InputfieldImageEdit--active").length>0}function dragEnter(evt){if(noDropInPlace())return;evt.preventDefault();evt.stopPropagation();addInputfieldClass();haltDrag=false;if($i==null){var gridSize=$gridImages.attr("data-size")+"px";var $o=$("
      ").addClass("gridImage__overflow");if($gridImages.closest(".InputfieldImageEditAll").length){$o.css({width:"100%",height:gridSize})}else{$o.css({width:gridSize,height:gridSize})}$i=$("
    • ").addClass("ImageOuter gridImage gridImagePlaceholder").append($o);$gridImages.append($i)}var coords=getCenterCoordinates($i);$i.simulate("mousedown",coords)}function dragOver(evt){if(noDropInPlace())return;evt.preventDefault();evt.stopPropagation();addInputfieldClass();haltDrag=false;if($i==null)return;var coords={clientX:evt.originalEvent.clientX,clientY:evt.originalEvent.clientY};$i.simulate("mousemove",coords)}function dragEnd(evt){if(noDropInPlace())return;evt.preventDefault();evt.stopPropagation();if($i==null)return false;haltDrag=true;if(timer)clearTimeout(timer);timer=setTimeout(function(){if(!haltDrag||$i==null)return;$i.remove();$i=null;removeInputfieldClass()},1e3)}function drop(evt){if(noDropInPlace())return;removeInputfieldClass();haltDrag=false;var coords={clientX:evt.clientX,clientY:evt.clientY};$i.simulate("mouseup",coords);$uploadBeforeItem=$i.next(".gridImage");$i.remove();$i=null}if($gridImages.length&&!$gridImages.hasClass("gridImagesInitDropInPlace")){$gridImages.on("dragenter",dragEnter);$gridImages.on("dragover",dragOver);$gridImages.on("dragleave",dragEnd);$gridImages.on("drop",drop);$gridImages.addClass("gridImagesInitDropInPlace")}}function uploadFile(file,extension,xhrsub){var labels=ProcessWire.config.InputfieldImage.labels;var filesizeStr=parseInt(file.size/1024,10)+" kB";var tooltipMarkup=""+'
      '+""+""+'"+""+""+""+""+""+""+"
      "+labels.dimensions+"'+labels.na+"
      "+labels.filesize+""+filesizeStr+"
      "+labels.variations+"0
      "+"
      ";var $progressItem=$('
    • '),$tooltip=$(tooltipMarkup),$imgWrapper=$('
      '),$imageData=$('
      '),$hover=$("
      "),$progressBar=$(""),$edit=$(' '),$spinner=$('
      '),reader,xhr,fileData,fileUrl=URL.createObjectURL(file),$fileList=$inputfield.find(".gridImages"),singleMode=maxFiles==1,size=getCookieData($inputfield,"size"),listSize=getCookieData($inputfield,"listSize"),listMode=$inputfield.hasClass("InputfieldImageEditAll"),$img=$('');$imgWrapper.append($img);$hover.find(".gridImage__inner").append($edit);$hover.find(".gridImage__inner").append($spinner.css("display","none"));$hover.find(".gridImage__inner").append($progressBar);$imageData.append($(""+'

      '+file.name+"

      "+''+filesizeStr+""));if(listMode){$imgWrapper.css("width",listSize+"%");$imageData.css("width",100-listSize+"%")}else{$imgWrapper.css({width:size+"px",height:size+"px"})}$progressItem.append($tooltip).append($imgWrapper).append($hover).append($imageData);$img.attr({src:fileUrl,"data-original":fileUrl});img=new Image;img.addEventListener("load",function(){$tooltip.find(".dimensions").html(this.width+" × "+this.height);var factor=Math.min(this.width,this.height)/size;$img.attr({width:this.width/factor,height:this.height/factor})},false);img.src=fileUrl;if(typeof xhrsub!="undefined"){xhr=xhrsub}else{xhr=new XMLHttpRequest}function updateProgress(evt){if(typeof evt!="undefined"){if(!evt.lengthComputable)return;$progressBar.attr("value",parseInt(evt.loaded/evt.total*100))}$("body").addClass("pw-uploading");$spinner.css("display","block")}xhr.upload.addEventListener("progress",updateProgress,false);xhr.addEventListener("load",function(){xhr.getAllResponseHeaders();var response=$.parseJSON(xhr.responseText);if(typeof response.ajaxResponse!="undefined")response=response.ajaxResponse;var wasZipFile=response.length>1;if(response.error!==undefined)response=[response];for(var n=0;n-1){uploadReplaceName=uploadReplaceName.substring(0,uploadReplaceName.indexOf("?"))}var uploadReplaceExt=uploadReplaceName.substring(uploadReplaceName.lastIndexOf(".")+1).toLowerCase();uploadReplaceName=uploadReplaceName.substring(0,uploadReplaceName.lastIndexOf("."));if(uploadReplaceExt==uploadNewExt){$imageEditName.children("span").text(uploadReplaceName).removeAttr("contenteditable")}$markup.find(".gridImage__edit").click()}uploadReplace.file="";uploadReplace.item=null;uploadReplace.edit=null}if(doneTimer)clearTimeout(doneTimer);$uploadBeforeItem=null;doneTimer=setTimeout(function(){if(maxFiles!=1){setupSortable($fileList)}else{setupMagnificForSingle($inputfield)}$("body").removeClass("pw-uploading");$fileList.trigger("AjaxUploadDone")},500);$inputfield.trigger("change").removeClass("InputfieldFileEmpty")},false);if(uploadReplace.edit){uploadReplace.edit.find(".InputfieldImageEdit__close").click()}else if($inputfield.find(".InputfieldImageEdit:visible").length){$inputfield.find(".InputfieldImageEdit__close").click()}if(uploadReplace.item){uploadReplace.item.replaceWith($progressItem);uploadReplace.item=$progressItem}else if($uploadBeforeItem&&$uploadBeforeItem.length){$uploadBeforeItem.before($progressItem)}else{$fileList.append($progressItem)}function sendUpload(file,imageData){if(typeof xhrsub=="undefined"){xhr.open("POST",postUrl,true)}xhr.setRequestHeader("X-FILENAME",encodeURIComponent(file.name));xhr.setRequestHeader("X-FIELDNAME",fieldName);if(uploadReplace.item)xhr.setRequestHeader("X-REPLACENAME",uploadReplace.file);xhr.setRequestHeader("Content-Type","application/octet-stream");xhr.setRequestHeader("X-"+postTokenName,postTokenValue);xhr.setRequestHeader("X-REQUESTED-WITH","XMLHttpRequest");if(typeof imageData!="undefined"&&imageData!=false){xhr.send(imageData)}else{xhr.send(file)}updateGrid();$inputfield.trigger("change");var numFiles=$inputfield.find(".InputfieldFileItem").length;if(numFiles==1){$inputfield.removeClass("InputfieldFileEmpty").removeClass("InputfieldFileMultiple").addClass("InputfieldFileSingle")}else if(numFiles>1){$inputfield.removeClass("InputfieldFileEmpty").removeClass("InputfieldFileSingle").addClass("InputfieldFileMultiple")}}updateProgress();var ext=file.name.substring(file.name.lastIndexOf(".")+1).toLowerCase();if(useClientResize&&(ext=="jpg"||ext=="jpeg"||ext=="png"||ext=="gif")){var resizer=new PWImageResizer(resizeSettings);$spinner.addClass("pw-resizing");resizer.resize(file,function(imageData){$spinner.removeClass("pw-resizing");sendUpload(file,imageData)})}else{sendUpload(file)}}function traverseFiles(files,xhr){var toKilobyte=function(i){return parseInt(i/1024,10)};if(typeof files==="undefined"){fileList.innerHTML="No support for the File API in this web browser";return}for(var i=0,l=files.length;imaxFilesize&&maxFilesize>2e6){var filesizeKB=toKilobyte(files[i].size),maxFilesizeKB=toKilobyte(maxFilesize);message="Filesize "+filesizeKB+" kb is too big. Maximum allowed is "+maxFilesizeKB+" kb";$errorParent.append(errorItem(message,files[i].name))}else if(typeof xhr!="undefined"){uploadFile(files[i],extension,xhr)}else{uploadFile(files[i],extension)}if(maxFiles==1)break}}filesUpload.addEventListener("change",function(evt){traverseFiles(this.files);evt.preventDefault();evt.stopPropagation();this.value=""},false)}function setupEnlargementDropzones(){var sel=".InputfieldImageEdit__imagewrapper img";$(document).on("dragenter",sel,function(){var $this=$(this);if($this.closest(".InputfieldImageMax1").length)return;var src=$this.attr("src");var $edit=$this.closest(".InputfieldImageEdit");var $parent=$this.closest(".InputfieldImageEdit__imagewrapper");$parent.addClass("InputfieldImageEdit__replace");uploadReplace.file=new String(src).substring(src.lastIndexOf("/")+1);uploadReplace.item=$("#"+$edit.attr("data-for"));uploadReplace.edit=$edit}).on("dragleave",sel,function(){var $this=$(this);if($this.closest(".InputfieldImageMax1").length)return;var $parent=$this.closest(".InputfieldImageEdit__imagewrapper");$parent.removeClass("InputfieldImageEdit__replace");uploadReplace.file="";uploadReplace.item=null;uploadReplace.edit=null})}setupEnlargementDropzones()}function getClientResizeSettings($inputfield){var settings={maxWidth:0,maxHeight:0,maxSize:0,quality:1,autoRotate:true,debug:ProcessWire.config.debug};var data=$inputfield.attr("data-resize");if(typeof data!="undefined"&&data.length){data=data.split(";");settings.maxWidth=data[0].length?parseInt(data[0]):0;settings.maxHeight=data[1].length?parseInt(data[1]):0;settings.maxSize=data[2].length?parseFloat(data[2]):0;settings.quality=parseFloat(data[3])}return settings}function init(){$(".InputfieldImage.Inputfield").each(function(){initInputfield($(this))});initGridEvents();if(useAjaxUpload()){initUploadHTML5("")}else{initUploadOldSchool()}$(document).on("reloaded",".InputfieldImage",function(){var $inputfield=$(this);initInputfield($inputfield);initUploadHTML5($inputfield)}).on("wiretabclick",function(e,$newTab,$oldTab){$newTab.find(".InputfieldImage").each(function(){initInputfield($(this))})}).on("opened",".InputfieldImage",function(){initInputfield($(this))})}init()}jQuery(document).ready(function($){InputfieldImage($)}); \ No newline at end of file +function InputfieldImage($){var $uploadBeforeItem=null;var uploadReplace={file:"",item:null,edit:null};var magnificOptions={type:"image",closeOnContentClick:true,closeBtnInside:true};var cookieData=null;var retryGridItems=[];var gridSliding=false;function useAjaxUpload(){var isFileReaderSupport=window.File&&window.FileList&&window.FileReader;var isAjaxUpload=$(".InputfieldAllowAjaxUpload").length>0;var isPageIDIndicator=$("#PageIDIndicator").length>0;return isFileReaderSupport&&(isPageIDIndicator||isAjaxUpload)}function throttle(fn,threshhold,scope){threshhold||(threshhold=250);var last,deferTimer;return function(){var context=scope||this;var now=+new Date,args=arguments;if(last&&now .gridImage",start:function(e,ui){var size=getCookieData($el.closest(".Inputfield"),"size");ui.placeholder.append($("
      ").css({display:"block",height:size+"px",width:size+"px"}));timer=window.setTimeout(function(){closeEdit($el,null)},100);$el.addClass("InputfieldImageSorting")},stop:function(e,ui){var $this=$(this);if(timer!==null){ui.item.find(".InputfieldImageEdit__edit").click();clearTimeout(timer)}$this.children("li").each(function(n){var $sort=$(this).find(".InputfieldFileSort");if($sort.val()!=n)$sort.val(n).change()});$el.removeClass("InputfieldImageSorting")},cancel:".InputfieldImageEdit,.focusArea,input,textarea,button,select,option"};$el.sortable(sortableOptions)}function setupMagnificForRenderValue($el){var options=$.extend(true,{},magnificOptions);options.callbacks={elementParse:function(item){var src=$(item.el).attr("data-original");if(typeof src=="undefined"||!src)src=$(item.el).attr("src");item.src=src}};options.gallery={enabled:true};$el.find("img").magnificPopup(options)}function setupMagnificForSingle($el){var options=$.extend(true,{},magnificOptions);options.callbacks={elementParse:function(item){item.src=$(item.el).attr("src")}};options.gallery={enabled:false};$el.find("img").magnificPopup(options)}function findEditedElement($parent){return $parent.find(".InputfieldImageEdit--active")}function findEditMarkup($edit){return $("#"+$edit.find(".InputfieldImageEdit__edit").attr("data-current"))}function setDeleteStateOnAllItems($input){var checked=$input.is(":checked");var $items=$input.parents(".gridImages").find(".gridImage__deletebox");if(checked){$items.prop("checked","checked").change()}else{$items.removeAttr("checked").change()}}function updateGrid($inputfield){if(typeof $inputfield=="undefined"){var $gridImages=$(".gridImages")}else{var $gridImages=$inputfield.find(".gridImages")}$gridImages.each(function(){var $grid=$(this),$edit=findEditedElement($grid);if($edit.length){moveEdit(findEditMarkup($edit),$edit)}})}function checkInputfieldWidth($inputfield){var narrowItems=[];var mediumItems=[];var wideItems=[];var ni=0,mi=0,wi=0;var $inputfields;if(typeof $inputfield=="undefined"){$inputfields=$(".InputfieldImage.Inputfield")}else{$inputfields=$inputfield}$inputfields.removeClass("InputfieldImageNarrow InputfieldImageMedium InputfieldImageWide");$inputfields.each(function(){var $item=$(this);var width=$item.width();if(width<1)return;if(width<=500){narrowItems[ni]=$item;ni++}else if(width<=900){mediumItems[mi]=$item;mi++}else{wideItems[wi]=$item;wi++}});for(var n=0;n100?100:top,left:left>100?100:left,zoom:zoom>100?0:zoom};return focusData}function getFocusStr(focusObj){if(typeof focusObj=="undefined")focusObj=getFocus();return focusObj.top+" "+focusObj.left+" "+focusObj.zoom}function getFocusProperty(property){var focus=getFocus();return focus[property]}function setFocus(focusObj){focusData=focusObj;var focusStr=focusObj.top+" "+focusObj.left+" "+focusObj.zoom;$thumb.attr("data-focus",focusStr);$input=$edit.find(".InputfieldImageFocus");if(focusStr!=$input.val()){$input.val(focusStr).trigger("change")}}function setFocusProperty(property,value){var focus=getFocus();focus[property]=value;setFocus(focus)}function setFocusDragPosition(){var focus=getFocus();var $overlay=$focusCircle.parent();var w=$overlay.width();var h=$overlay.height();var x=Math.round(focus.left/100*w);var y=Math.round(focus.top/100*h);if(x<0)x=0;if(y<0)y=0;if(x>w)x=w;if(y>h)y=h;$focusCircle.css({top:y+"px",left:x+"px"})}$focusArea=$img.siblings(".focusArea");if(!$focusArea.length){$focusArea=$("
      ").addClass("focusArea");$img.after($focusArea)}$focusArea.css({height:$img.height()+"px",width:$img.width()+"px","background-color":"rgba(0,0,0,0.7)"}).addClass("focusActive");$focusCircle=$focusArea.find(".focusCircle");if(!$focusCircle.length){$focusCircle=$("
      ").addClass("focusCircle");$focusArea.append($focusCircle)}$img.parent().addClass("focusWrap");setFocusDragPosition();var zoomSlide=function(zoomPercent){var zoomBoxSize,focus,faWidth,faHeight;if(typeof zoomPercent=="undefined")zoomPercent=lastZoomPercent;lastZoomPercent=zoomPercent;faWidth=$focusArea.width();faHeight=$focusArea.height();if(faWidth>faHeight){$zoomBox.height(100-zoomPercent+"%");zoomBoxSize=$zoomBox.height();$zoomBox.width(zoomBoxSize)}else{$zoomBox.width(100-zoomPercent+"%");zoomBoxSize=$zoomBox.width();$zoomBox.height(zoomBoxSize)}focus=getFocus();var crop=getFocusZoomCropDimensions(focus.left,focus.top,zoomPercent,faWidth,faHeight,zoomBoxSize);$zoomBox.css({top:crop.top+"px",left:crop.left+"px","background-position":"-"+crop.left+"px -"+crop.top+"px","background-size":faWidth+"px "+faHeight+"px"});focus.zoom=zoomPercent;setFocusProperty("zoom",focus.zoom);if(mode=="grid")setGridSizeItem($thumb.parent(),gridSize,false,focus)};var dragEvent=function(event,ui){var $this=$(this);var circleSize=$this.outerHeight();var w=$this.parent().width();var h=$this.parent().height();var top=ui.position.top>0?ui.position.top:0;var left=ui.position.left>0?ui.position.left:0;top=top>0?top/h*100:0;left=left>0?left/w*100:0;var newFocus={top:top,left:left,zoom:getFocusProperty("zoom")};setFocus(newFocus);if(useZoomFocus){zoomSlide(newFocus.zoom)}else if(mode=="grid"){setGridSizeItem($thumb.parent(),gridSize,false,newFocus)}};$focusCircle.draggable({containment:"parent",drag:dragEvent,stop:dragEvent});if(useZoomFocus){var zoom=getFocusProperty("zoom");$zoomSlider=$("
      ").addClass("focusZoomSlider").css({"margin-top":"5px"});$zoomBox=$("
      ").addClass("focusZoomBox").css({position:"absolute",background:"transparent","background-image":"url("+$img.attr("src")+")"});$focusArea.prepend($zoomBox);$img.after($zoomSlider);$thumb.attr("src",$img.attr("src"));$zoomSlider.slider({min:0,max:50,value:zoom,range:"max",slide:function(event,ui){zoomSlide(ui.value)}});zoomSlide(zoom)}else{$focusArea.css("background-color","rgba(0,0,0,0.5)")}}function stopFocus($edit){$focusCircle=$edit.find(".focusCircle");if($focusCircle.length){var $focusWrap=$focusCircle.closest(".focusWrap");$focusWrap.find(".focusZoomSlider").slider("destroy").remove();$focusWrap.find(".focusZoomBox").remove();$focusWrap.removeClass("focusWrap");$focusCircle.draggable("destroy");$focusCircle.parent().removeClass("focusActive");$focusCircle.remove();var $button=$edit.find(".InputfieldImageButtonFocus");if($button.length){$icon=$button.find("i");$icon.removeClass("focusIconActive").toggleClass($icon.attr("data-toggle"))}}}function getFocusZoomPosition(focusPercent,sourceDimension,cropDimension){var focusPX=parseInt(sourceDimension*focusPercent/100);var position=parseInt(focusPX-cropDimension/2);var maxPosition=parseInt(sourceDimension-cropDimension);if(0>position)position=0;if(maxPosition=percentH?faWidth:faHeight;var cropDimension=maxDimension-maxDimension*zoomPercent/100;var posLeft=getFocusZoomPosition(focusLeft,faWidth,cropDimension);var posTop=getFocusZoomPosition(focusTop,faHeight,cropDimension);return{left:posLeft,top:posTop,width:cropDimension,height:cropDimension}}function getFocusZoomPosition4GridviewSquare(focusPercent,sourceDimPX,gridViewPX,zoomPercent,scale,smallestSidePX){var sourceDimPX=sourceDimPX*scale;var gridViewPercent=gridViewPX/sourceDimPX*100;var adjustPercent=gridViewPercent/2;var posPercent=focusPercent-adjustPercent;var posMinVal=0;var posMaxVal=100-gridViewPercent;if(posPercent<=posMinVal)posPercent=0;if(posPercent>=posMaxVal)posPercent=posMaxVal;var posPX=sourceDimPX/100*posPercent/scale;posPX=-1*parseInt(posPX);return posPX}function getFocusZoomCropDimensions4GridviewSquare(focusLeft,focusTop,zoomPercent,w,h,gridViewSize,scale){var smallestSidePX=w>=h?h:w;var posLeft=getFocusZoomPosition4GridviewSquare(focusLeft,w,gridViewSize,zoomPercent,scale,smallestSidePX);var posTop=getFocusZoomPosition4GridviewSquare(focusTop,h,gridViewSize,zoomPercent,scale,smallestSidePX);var transformLeft=parseInt(posLeft);var transformTop=parseInt(posTop);return{transformLeft:transformLeft,transformTop:transformTop,scale:scale}}function tearDownEdit($edit){stopFocus($edit);$edit.off("click",".InputfieldImageButtonFocus");$inputArea=$edit.find(".InputfieldImageEdit__edit");if($inputArea.children().not(".InputfieldFileSort").length){var $items=$inputArea.children();$("#"+$inputArea.attr("data-current")).find(".ImageData").append($items)}}function closeEdit($parent,$not){var $edit;if($parent){$edit=$parent.find(".InputfieldImageEdit--active")}else if($not){$edit=$(".InputfieldImageEdit--active").not($not.find(".InputfieldImageEdit--active"))}else{$edit=$(".InputfieldImageEdit--active")}if($edit.length){tearDownEdit($edit);$edit.removeClass("InputfieldImageEdit--active").removeAttr("id");$("#"+$edit.attr("data-for")).removeClass("gridImageEditing")}$(".InputfieldImageEdit__replace").removeClass("InputfieldImageEdit__replace")}function moveEdit($el,$edit){if(!$el||!$el.length)return;var $children=$el.parent().children().not(".InputfieldImageEdit");var lastTop=0;var found=false;var $insertBeforeItem=null;$children.each(function(){if($insertBeforeItem)return;var $item=$(this);var top=$item.offset().top;if(found&&top!=lastTop){$insertBeforeItem=$item}else if($item.attr("id")==$el.attr("id")){found=true}lastTop=top});if($insertBeforeItem){$edit.insertBefore($insertBeforeItem)}else{$edit.insertAfter($children.eq($children.length-1))}var $arrow=$edit.find(".InputfieldImageEdit__arrow");if($arrow.length)$arrow.css("left",$el.position().left+$el.outerWidth()/2+"px")}function initGridEvents(){$(window).resize(throttle(windowResize,200));$(document).on("click dblclick",".gridImage__trash",function(e){var $input=$(this).find("input");$input.prop("checked",inverseState).change();if(e.type=="dblclick"){setDeleteStateOnAllItems($input);e.preventDefault();e.stopPropagation()}});$(document).on("change",".gridImage__deletebox",function(){updateDeleteClass($(this))});$(document).on("click",".gridImage__edit",function(e){var $el=$(this).closest(".gridImage");if(!$el.length)return;if($el.closest(".InputfieldImageEditAll").length)return false;var $all=$el.closest(".gridImages");var $edit=$all.find(".InputfieldImageEdit");if($el.hasClass("gridImageEditing")){$edit.find(".InputfieldImageEdit__close").click()}else{moveEdit($el,$edit);tearDownEdit($edit);setupEdit($el,$edit);$edit.addClass("InputfieldImageEdit--active").attr("data-for",$el.attr("id"));$all.find(".gridImageEditing").removeClass("gridImageEditing");$el.addClass("gridImageEditing")}}).on("click",".InputfieldImageEditAll img",function(e){e.stopPropagation();e.preventDefault();$.magnificPopup.close();var options=$.extend(true,{},magnificOptions);var $img=$(this);options["items"]={src:$img.attr("data-original"),title:$img.attr("alt")};$.magnificPopup.open(options);return true}).on("click",".InputfieldImageButtonFocus",function(){var $button=$(this);var $icon=$button.find("i");var $edit=$button.closest(".InputfieldImageEdit, .gridImage");var $focusCircle=$edit.find(".focusCircle");if($focusCircle.length){stopFocus($edit)}else{startFocus($edit);$icon.addClass("focusIconActive");$icon.toggleClass($icon.attr("data-toggle"))}});$(document).on("click",function(e){var $el=$(e.target);if($el.closest(".InputfieldImageEdit").length){closeEdit(null,$el.parents(".gridImages"))}else if($el.is("input, textarea")&&$el.closest(".InputfieldImageEditAll").length){$el.focus().one("blur",function(){$el.closest(".gridImages").sortable("enable")});$el.closest(".gridImages").sortable("disable")}else if($el.closest(".gridImage__inner").length){closeEdit(null,$el.parents(".gridImages"))}else if($el.closest(".mfp-container").length){return}else if($el.closest(".ui-dialog").length){return}else if($el.is(".mfp-close")){return}else if($el.is("a.remove")){return}else{closeEdit(null,null)}});$(document).on("click",".InputfieldImageEdit__close",function(e){closeEdit($(this).parents(".gridImages"),null)});$(document).on("change",".InputfieldImage",function(){$(this).find(".InputfieldImageButtonCrop:not(.pw-modal-dblclick)").addClass("pw-modal-dblclick ui-state-disabled")}).on("click",".InputfieldImageButtonCrop.ui-state-disabled",function(e){var $button=$(this);var $list=$button.closest(".gridImages");if(!$list.hasClass("gridImagesAlerted")){ProcessWire.alert(ProcessWire.config.InputfieldImage.labels.changes);$list.addClass("gridImagesAlerted")}setTimeout(function(){$button.removeClass("ui-state-active")},500);return false});$(".ImagesGrid").on("click","button.pw-modal",function(e){e.preventDefault()});setupEditableFilename();checkInputfieldWidth()}function setupEditableFilename(){$(document).on("click",".InputfieldImageEdit__name",function(e){var $span=$(this).children("span");var $input=$span.closest(".gridImage, .InputfieldImageEdit").find(".InputfieldFileRename");var $list=$span.closest(".gridImages");$list.sortable("disable");$input.val($span.text());$span.on("keypress",function(e){if(e.which==13){$span.blur();return false}return true});$span.attr("autocomplete","off").attr("autocorrect","off").attr("autocapitalize","off").attr("spellcheck","false");$span.focus().on("blur",function(){var val=$(this).text();if($.trim(val).length<1){$span.text($input.val())}else if(val!=$input.val()){$input.val(val).change();$list.closest(".Inputfield").trigger("change")}$span.off("keypress");$list.sortable("enable")})})}function setListSize($inputfield,pct){pct=Math.floor(pct);$inputfield.find(".gridImage__overflow").each(function(){var dataPct=100-pct;var $this=$(this);$this.css("width",pct+"%");$this.siblings(".ImageData").css("width",dataPct+"%");$this.find("img").css({top:0,left:0,transform:"none"})});setCookieData($inputfield,"listSize",pct)}function setGridSize($inputfield,gridSize,ragged){if(!gridSize)return;var size=gridSize+"px";var $gridImages=$inputfield.find(".gridImages");if(typeof ragged=="undefined"||ragged==null)ragged=$gridImages.attr("data-ragged")?true:false;if(ragged){$gridImages.attr("data-ragged",1)}else{$gridImages.removeAttr("data-ragged")}$gridImages.find(".gridImage__overflow").each(function(){setGridSizeItem($(this),gridSize,ragged)});$gridImages.find(".gridImage__edit, .gridImage__resize").css("line-height",size);$gridImages.attr("data-size",gridSize);setCookieData($inputfield,"size",gridSize);if(retryGridItems.length)setTimeout(function(){while(retryGridItems.length){var item=retryGridItems.pop();setGridSizeItem(item.item,item.gridSize,ragged)}},150)}function setGridSizeItem($item,gridSize,ragged,focus){if($item.hasClass("gridImage__overflow")){var $img=$item.children("img")}else if($item.is("img")){var $img=$item;$item=$img.closest(".gridImage__overflow")}else{return}if(!gridSize){$img.removeAttr("width").removeAttr("height");$item.width("auto").height("auto");return}var zoom=0;var w=$img.width();var h=$img.height();var dataW=parseInt($img.attr("data-w"));var dataH=parseInt($img.attr("data-h"));if(!w)w=dataW;if(!h)h=dataH;if(!ragged&&typeof focus=="undefined"){var focusStr=$img.attr("data-focus");if(typeof focusStr=="undefined")focusStr="50.0 50.0 0";var focusArray=focusStr.split(" ");focus={top:parseFloat(focusArray[0]),left:parseFloat(focusArray[1]),zoom:parseInt(focusArray[2])}}if(!ragged)zoom=focus.zoom;if(ragged){$img.attr("height",gridSize).removeAttr("width");$img.css({"max-height":"100%","max-width":"none",top:"50%",left:"50%",transform:"translate3d(-50%, -50%, 0)"})}else if(zoom>0&&$item.closest(".InputfieldImageFocusZoom").length&&!gridSliding){if(w>=h){var maxHeight="100%";var maxWidth="none";if(w==dataW){h=gridSize;w=h/dataH*dataW}}else{var maxHeight="none";var maxWidth="100%";if(h==dataH){w=gridSize;h=w/dataW*dataH}}var scale=1+zoom/100*2;var crop=getFocusZoomCropDimensions4GridviewSquare(focus.left,focus.top,zoom,w,h,gridSize,scale);$img.css({left:"0px",top:"0px","transform-origin":"0px 0px",transform:"scale("+crop.scale+") translate3d("+crop.transformLeft+"px, "+crop.transformTop+"px, 0)","max-width":maxWidth,"max-height":maxHeight})}else if(w>=h){$img.attr("height",gridSize).removeAttr("width");if(focus.left<1)focus.left=.001;$img.css({"max-height":"100%","max-width":"none",top:"50%",left:focus.left+"%",transform:"translate3d(-"+focus.left+"%, -50%, 0)"})}else if(h>w){$img.attr("width",gridSize).removeAttr("height");if(focus.top<1)focus.top=.001;$img.css({"max-height":"none","max-width":"100%",top:focus.top+"%",left:"50%",transform:"translate3d(-50%, -"+focus.top+"%, 0)"})}else{$img.css({"max-height":"100%","max-width":"none",top:"50%",left:"50%",transform:"translate3d(-50%, -50%, 0)"});$img.removeAttr("width").attr("height",gridSize)}var w=$img.width();if(w){$item.css({width:ragged?w+"px":gridSize+"px",height:gridSize+"px"})}else{var tries=$item.attr("data-tries");if(!tries)tries=0;if(typeof tries=="undefined")tries=0;tries=parseInt(tries);if(tries>3){$item.css({width:gridSize+"px",height:gridSize+"px"})}else{retryGridItems.push({item:$item,gridSize:gridSize});$item.attr("data-tries",tries+1)}}}function setupImageListToggle($target){if($target.find(".InputfieldImageListToggle").length)return;var $list=$("").append("");var $left=$("").append("");var $grid=$("").append("");var activeClass="InputfieldImageListToggle--active";var defaultMode="";var toggleClick=function(e){var $a=$(this);var $inputfield=$a.closest(".Inputfield");var href=$a.attr("href");var size;var $aPrev=$a.parent().children("."+activeClass);var hrefPrev=$aPrev.attr("href");$aPrev.removeClass(activeClass);$a.addClass(activeClass);stopFocus($inputfield);if(href=="list"){if(!$inputfield.hasClass("InputfieldImageEditAll")){$inputfield.find(".InputfieldImageEdit--active .InputfieldImageEdit__close").click();$inputfield.addClass("InputfieldImageEditAll")}size=getCookieData($inputfield,"listSize");setListSize($inputfield,size);setCookieData($inputfield,"mode","list")}else if(href=="left"){$inputfield.removeClass("InputfieldImageEditAll");size=getCookieData($inputfield,"size");setGridSize($inputfield,size,true);setCookieData($inputfield,"mode","left");updateGrid()}else if(href=="grid"){$inputfield.removeClass("InputfieldImageEditAll");size=getCookieData($inputfield,"size");setGridSize($inputfield,size,false);setCookieData($inputfield,"mode","grid");if(hrefPrev=="left")setTimeout(function(){setGridSize($inputfield,size,false)},100)}setupSortable($inputfield.find(".gridImages"));$a.blur();return false};$list.click(toggleClick);$left.click(toggleClick);$grid.click(toggleClick);if($target.hasClass("InputfieldImage")){$target.children(".InputfieldHeader").append($list).append($left).append($grid);defaultMode=getCookieData($target,"mode")}else{$(".InputfieldImage > .InputfieldHeader",$target).append($list).append($left).append($grid)}if(defaultMode=="list"){$list.click()}else if(defaultMode=="left"){$left.click()}else{}}function setupSizeSlider($inputfield){var $header=$inputfield.children(".InputfieldHeader");if($header.children(".InputfieldImageSizeSlider").length)return;var $gridImages=$inputfield.find(".gridImages");var gridSize=$gridImages.attr("data-gridsize");var min=gridSize/2;var max=gridSize*2;var $slider=$('');$header.append($slider);var sizeSlide=function(event,ui){var value=ui.value;var minPct=15;var divisor=Math.floor(gridSize/minPct);var v=value-min;var listSize=Math.floor(minPct+v/divisor);if($inputfield.hasClass("InputfieldImageEditAll")){setCookieData($inputfield,"size",value);setListSize($inputfield,listSize)}else{setCookieData($inputfield,"listSize",listSize);setGridSize($inputfield,value)}};$slider.slider({min:min,max:max,value:getCookieData($inputfield,"size"),range:"min",slide:sizeSlide,start:function(event,ui){gridSliding=true;if($inputfield.find(".InputfieldImageEdit:visible").length){$inputfield.find(".InputfieldImageEdit__close").click()}},stop:function(event,ui){gridSliding=false;sizeSlide(event,ui);updateGrid($inputfield)}})}function setCookieData($inputfield,property,value){var data=getCookieData($inputfield);var id=$inputfield.attr("id");var name=id?id.replace("wrap_Inputfield_",""):"";if(!name.length||typeof value=="undefined")return;if(data[name][property]==value)return;data[name][property]=value;$.cookie("InputfieldImage",data,{secure:window.location.protocol.indexOf("https:")===0});cookieData=data}function getCookieData($inputfield,property){if(cookieData&&typeof property=="undefined")return cookieData;var id=$inputfield.attr("id");var name=id?id.replace("wrap_Inputfield_",""):"na";var data=cookieData?cookieData:$.cookie("InputfieldImage");var value=null;if(!data)var data={};if(typeof data[name]=="undefined")data[name]={};if(typeof data[name].size=="undefined")data[name].size=parseInt($inputfield.find(".gridImages").attr("data-size"));if(typeof data[name].listSize=="undefined")data[name].listSize=23;if(typeof data[name].mode=="undefined")data[name].mode=$inputfield.find(".gridImages").attr("data-gridMode");if(cookieData==null)cookieData=data;if(typeof property=="undefined"){value=data}else if(property===true){value=data[name]}else if(typeof data[name][property]!="undefined"){value=data[name][property]}return value}function initInputfield($inputfield){if($inputfield.hasClass("InputfieldStateCollapsed"))return;var maxFiles=parseInt($inputfield.find(".InputfieldImageMaxFiles").val());var $gridImages=$inputfield.find(".gridImages");var size=getCookieData($inputfield,"size");var mode=getCookieData($inputfield,"mode");var ragged=mode=="left"?true:false;var renderValueMode=$inputfield.hasClass("InputfieldRenderValueMode");if(!size)size=$gridImages.attr("data-gridsize");size=parseInt(size);if(!renderValueMode&&($inputfield.hasClass("InputfieldImageEditAll")||mode=="list")){var listSize=getCookieData($inputfield,"listSize");setListSize($inputfield,listSize)}else{setGridSize($inputfield,size,ragged)}if(!$inputfield.hasClass("InputfieldImageInit")){$inputfield.addClass("InputfieldImageInit");if(renderValueMode){return setupMagnificForRenderValue($inputfield)}else if(maxFiles==1){$inputfield.addClass("InputfieldImageMax1");setupMagnificForSingle($inputfield)}else{setupSortable($gridImages)}setupImageListToggle($inputfield);setupSizeSlider($inputfield)}checkInputfieldWidth($inputfield);$inputfield.on("change",".InputfieldFileActionSelect",function(){var $note=$(this).next(".InputfieldFileActionNote");if($(this).val().length){$note.fadeIn()}else{$note.hide()}})}function initUploadOldSchool(){$("body").addClass("ie-no-drop");$(".InputfieldImage.InputfieldFileMultiple").each(function(){var $field=$(this),maxFiles=parseInt($field.find(".InputfieldFileMaxFiles").val()),$list=$field.find(".gridImages"),$uploadArea=$field.find(".InputfieldImageUpload");$uploadArea.on("change","input[type=file]",function(){var $t=$(this),$mask=$t.parent(".InputMask");if($t.val().length>1)$mask.addClass("ui-state-disabled");else $mask.removeClass("ui-state-disabled");if($t.next("input.InputfieldFile").length>0)return;var numFiles=$list.children("li").length+$uploadArea.find("input[type=file]").length+1;if(maxFiles>0&&numFiles>=maxFiles)return;$uploadArea.find(".InputMask").not(":last").each(function(){var $m=$(this);if($m.find("input[type=file]").val()<1)$m.remove()});var $i=$mask.clone().removeClass("ui-state-disabled");$i.children("input[type=file]").val("");$i.insertAfter($mask)})})}function initUploadHTML5($inputfield){var $target;if($inputfield.length>0){$target=$inputfield.find(".InputfieldImageUpload")}else{$target=$(".InputfieldImageUpload")}$target.each(function(i){var $this=$(this);var $content=$this.closest(".InputfieldContent");if($this.hasClass("InputfieldImageInitUpload"))return;initHTML5Item($content,i);$this.addClass("InputfieldImageInitUpload")});function initHTML5Item($this,i){var $form=$this.parents("form");var $repeaterItem=$this.closest(".InputfieldRepeaterItem");var postUrl=$repeaterItem.length?$repeaterItem.attr("data-editUrl"):$form.attr("action");postUrl+=(postUrl.indexOf("?")>-1?"&":"?")+"InputfieldFileAjax=1";var $postToken=$form.find("input._post_token");var postTokenName=$postToken.attr("name");var postTokenValue=$postToken.val();var $errorParent=$this.find(".InputfieldImageErrors").first();var fieldName=$this.find(".InputfieldImageUpload").data("fieldname");fieldName=fieldName.slice(0,-2);var $inputfield=$this.closest(".Inputfield.InputfieldImage");var extensions=$this.find(".InputfieldImageUpload").data("extensions").toLowerCase();var maxFilesize=$this.find(".InputfieldImageUpload").data("maxfilesize");var filesUpload=$this.find("input[type=file]").get(0);var $fileList=$this.find(".gridImages");var fileList=$fileList.get(0);var gridSize=$fileList.data("gridsize");var doneTimer=null;var maxFiles=parseInt($this.find(".InputfieldImageMaxFiles").val());var resizeSettings=getClientResizeSettings($inputfield);var useClientResize=resizeSettings.maxWidth>0||resizeSettings.maxHeight>0||resizeSettings.maxSize>0;setupDropzone($this);if(maxFiles!=1)setupDropInPlace($fileList);$fileList.children().addClass("InputfieldFileItemExisting");$inputfield.on("pwimageupload",function(event,data){traverseFiles([data.file],data.xhr)});function errorItem(message,filename){if(typeof filename!=="undefined")message=""+filename+": "+message;var icon=" ";return"
    • "+icon+message+"
    • "}function basename(str){var base=new String(str).substring(str.lastIndexOf("/")+1);if(base.lastIndexOf(".")!=-1)base=base.substring(0,base.lastIndexOf("."));return base}function setupDropzone($el){if($el.hasClass("InputfieldImageDropzoneInit"))return;var el=$el.get(0);var $inputfield=$el.closest(".Inputfield");function dragStart(){if($inputfield.hasClass("pw-drag-in-file"))return;$el.addClass("ui-state-hover");$inputfield.addClass("pw-drag-in-file")}function dragStop(){if(!$inputfield.hasClass("pw-drag-in-file"))return;$el.removeClass("ui-state-hover");$inputfield.removeClass("pw-drag-in-file")}el.addEventListener("dragleave",function(){dragStop()},false);el.addEventListener("dragenter",function(evt){evt.preventDefault();dragStart()},false);el.addEventListener("dragover",function(evt){if(!$el.is("ui-state-hover"))dragStart();evt.preventDefault();evt.stopPropagation();return false},false);el.addEventListener("drop",function(evt){traverseFiles(evt.dataTransfer.files);dragStop();evt.preventDefault();evt.stopPropagation();return false},false);$el.addClass("InputfieldImageDropzoneInit")}function setupDropInPlace($gridImages){var $i=null;var haltDrag=false;var timer=null;var $inputfield=$gridImages.closest(".Inputfield");function addInputfieldClass(){$inputfield.addClass("pw-drag-in-file")}function removeInputfieldClass(){$inputfield.removeClass("pw-drag-in-file")}function getCenterCoordinates($el){var offset=$el.offset();var width=$el.width();var height=$el.height();var centerX=offset.left+width/2;var centerY=offset.top+height/2;return{clientX:centerX,clientY:centerY}}function noDropInPlace(){return $gridImages.find(".InputfieldImageEdit--active").length>0}function dragEnter(evt){if(noDropInPlace())return;evt.preventDefault();evt.stopPropagation();addInputfieldClass();haltDrag=false;if($i==null){var gridSize=$gridImages.attr("data-size")+"px";var $o=$("
      ").addClass("gridImage__overflow");if($gridImages.closest(".InputfieldImageEditAll").length){$o.css({width:"100%",height:gridSize})}else{$o.css({width:gridSize,height:gridSize})}$i=$("
    • ").addClass("ImageOuter gridImage gridImagePlaceholder").append($o);$gridImages.append($i)}var coords=getCenterCoordinates($i);$i.simulate("mousedown",coords)}function dragOver(evt){if(noDropInPlace())return;evt.preventDefault();evt.stopPropagation();addInputfieldClass();haltDrag=false;if($i==null)return;var coords={clientX:evt.originalEvent.clientX,clientY:evt.originalEvent.clientY};$i.simulate("mousemove",coords)}function dragEnd(evt){if(noDropInPlace())return;evt.preventDefault();evt.stopPropagation();if($i==null)return false;haltDrag=true;if(timer)clearTimeout(timer);timer=setTimeout(function(){if(!haltDrag||$i==null)return;$i.remove();$i=null;removeInputfieldClass()},1e3)}function drop(evt){if(noDropInPlace())return;removeInputfieldClass();haltDrag=false;var coords={clientX:evt.clientX,clientY:evt.clientY};$i.simulate("mouseup",coords);$uploadBeforeItem=$i.next(".gridImage");$i.remove();$i=null}if($gridImages.length&&!$gridImages.hasClass("gridImagesInitDropInPlace")){$gridImages.on("dragenter",dragEnter);$gridImages.on("dragover",dragOver);$gridImages.on("dragleave",dragEnd);$gridImages.on("drop",drop);$gridImages.addClass("gridImagesInitDropInPlace")}}function uploadFile(file,extension,xhrsub){var labels=ProcessWire.config.InputfieldImage.labels;var filesizeStr=parseInt(file.size/1024,10)+" kB";var tooltipMarkup=""+'
      '+""+""+'"+""+""+""+""+""+""+"
      "+labels.dimensions+"'+labels.na+"
      "+labels.filesize+""+filesizeStr+"
      "+labels.variations+"0
      "+"
      ";var $progressItem=$('
    • '),$tooltip=$(tooltipMarkup),$imgWrapper=$('
      '),$imageData=$('
      '),$hover=$("
      "),$progressBar=$(""),$edit=$(' '),$spinner=$('
      '),reader,xhr,fileData,fileUrl=URL.createObjectURL(file),$fileList=$inputfield.find(".gridImages"),singleMode=maxFiles==1,size=getCookieData($inputfield,"size"),listSize=getCookieData($inputfield,"listSize"),listMode=$inputfield.hasClass("InputfieldImageEditAll"),$img=$('');$imgWrapper.append($img);$hover.find(".gridImage__inner").append($edit);$hover.find(".gridImage__inner").append($spinner.css("display","none"));$hover.find(".gridImage__inner").append($progressBar);$imageData.append($(""+'

      '+file.name+"

      "+''+filesizeStr+""));if(listMode){$imgWrapper.css("width",listSize+"%");$imageData.css("width",100-listSize+"%")}else{$imgWrapper.css({width:size+"px",height:size+"px"})}$progressItem.append($tooltip).append($imgWrapper).append($hover).append($imageData);$img.attr({src:fileUrl,"data-original":fileUrl});img=new Image;img.addEventListener("load",function(){$tooltip.find(".dimensions").html(this.width+" × "+this.height);var factor=Math.min(this.width,this.height)/size;$img.attr({width:this.width/factor,height:this.height/factor})},false);img.src=fileUrl;if(typeof xhrsub!="undefined"){xhr=xhrsub}else{xhr=new XMLHttpRequest}function updateProgress(evt){if(typeof evt!="undefined"){if(!evt.lengthComputable)return;$progressBar.attr("value",parseInt(evt.loaded/evt.total*100))}$("body").addClass("pw-uploading");$spinner.css("display","block")}xhr.upload.addEventListener("progress",updateProgress,false);xhr.addEventListener("load",function(){xhr.getAllResponseHeaders();var response=$.parseJSON(xhr.responseText);if(typeof response.ajaxResponse!="undefined")response=response.ajaxResponse;var wasZipFile=response.length>1;if(response.error!==undefined)response=[response];for(var n=0;n-1){uploadReplaceName=uploadReplaceName.substring(0,uploadReplaceName.indexOf("?"))}var uploadReplaceExt=uploadReplaceName.substring(uploadReplaceName.lastIndexOf(".")+1).toLowerCase();uploadReplaceName=uploadReplaceName.substring(0,uploadReplaceName.lastIndexOf("."));if(uploadReplaceExt==uploadNewExt){$imageEditName.children("span").text(uploadReplaceName).removeAttr("contenteditable")}$markup.find(".gridImage__edit").click()}uploadReplace.file="";uploadReplace.item=null;uploadReplace.edit=null}if(doneTimer)clearTimeout(doneTimer);$uploadBeforeItem=null;doneTimer=setTimeout(function(){if(maxFiles!=1){setupSortable($fileList)}else{setupMagnificForSingle($inputfield)}$("body").removeClass("pw-uploading");$fileList.trigger("AjaxUploadDone")},500);$inputfield.trigger("change").removeClass("InputfieldFileEmpty")},false);if(uploadReplace.edit){uploadReplace.edit.find(".InputfieldImageEdit__close").click()}else if($inputfield.find(".InputfieldImageEdit:visible").length){$inputfield.find(".InputfieldImageEdit__close").click()}if(uploadReplace.item){uploadReplace.item.replaceWith($progressItem);uploadReplace.item=$progressItem}else if($uploadBeforeItem&&$uploadBeforeItem.length){$uploadBeforeItem.before($progressItem)}else{$fileList.append($progressItem)}function sendUpload(file,imageData){if(typeof xhrsub=="undefined"){xhr.open("POST",postUrl,true)}xhr.setRequestHeader("X-FILENAME",encodeURIComponent(file.name));xhr.setRequestHeader("X-FIELDNAME",fieldName);if(uploadReplace.item)xhr.setRequestHeader("X-REPLACENAME",uploadReplace.file);xhr.setRequestHeader("Content-Type","application/octet-stream");xhr.setRequestHeader("X-"+postTokenName,postTokenValue);xhr.setRequestHeader("X-REQUESTED-WITH","XMLHttpRequest");if(typeof imageData!="undefined"&&imageData!=false){xhr.send(imageData)}else{xhr.send(file)}updateGrid();$inputfield.trigger("change");var numFiles=$inputfield.find(".InputfieldFileItem").length;if(numFiles==1){$inputfield.removeClass("InputfieldFileEmpty").removeClass("InputfieldFileMultiple").addClass("InputfieldFileSingle")}else if(numFiles>1){$inputfield.removeClass("InputfieldFileEmpty").removeClass("InputfieldFileSingle").addClass("InputfieldFileMultiple")}}updateProgress();var ext=file.name.substring(file.name.lastIndexOf(".")+1).toLowerCase();if(useClientResize&&(ext=="jpg"||ext=="jpeg"||ext=="png"||ext=="gif")){var resizer=new PWImageResizer(resizeSettings);$spinner.addClass("pw-resizing");resizer.resize(file,function(imageData){$spinner.removeClass("pw-resizing");sendUpload(file,imageData)})}else{sendUpload(file)}}function traverseFiles(files,xhr){var toKilobyte=function(i){return parseInt(i/1024,10)};if(typeof files==="undefined"){fileList.innerHTML="No support for the File API in this web browser";return}for(var i=0,l=files.length;imaxFilesize&&maxFilesize>2e6){var filesizeKB=toKilobyte(files[i].size),maxFilesizeKB=toKilobyte(maxFilesize);message="Filesize "+filesizeKB+" kb is too big. Maximum allowed is "+maxFilesizeKB+" kb";$errorParent.append(errorItem(message,files[i].name))}else if(typeof xhr!="undefined"){uploadFile(files[i],extension,xhr)}else{uploadFile(files[i],extension)}if(maxFiles==1)break}}filesUpload.addEventListener("change",function(evt){traverseFiles(this.files);evt.preventDefault();evt.stopPropagation();this.value=""},false)}function setupEnlargementDropzones(){var sel=".InputfieldImageEdit__imagewrapper img";$(document).on("dragenter",sel,function(){var $this=$(this);if($this.closest(".InputfieldImageMax1").length)return;var src=$this.attr("src");var $edit=$this.closest(".InputfieldImageEdit");var $parent=$this.closest(".InputfieldImageEdit__imagewrapper");$parent.addClass("InputfieldImageEdit__replace");uploadReplace.file=new String(src).substring(src.lastIndexOf("/")+1);uploadReplace.item=$("#"+$edit.attr("data-for"));uploadReplace.edit=$edit}).on("dragleave",sel,function(){var $this=$(this);if($this.closest(".InputfieldImageMax1").length)return;var $parent=$this.closest(".InputfieldImageEdit__imagewrapper");$parent.removeClass("InputfieldImageEdit__replace");uploadReplace.file="";uploadReplace.item=null;uploadReplace.edit=null})}setupEnlargementDropzones()}function getClientResizeSettings($inputfield){var settings={maxWidth:0,maxHeight:0,maxSize:0,quality:1,autoRotate:true,debug:ProcessWire.config.debug};var data=$inputfield.attr("data-resize");if(typeof data!="undefined"&&data.length){data=data.split(";");settings.maxWidth=data[0].length?parseInt(data[0]):0;settings.maxHeight=data[1].length?parseInt(data[1]):0;settings.maxSize=data[2].length?parseFloat(data[2]):0;settings.quality=parseFloat(data[3])}return settings}function init(){$(".InputfieldImage.Inputfield").each(function(){initInputfield($(this))});initGridEvents();if(useAjaxUpload()){initUploadHTML5("")}else{initUploadOldSchool()}$(document).on("reloaded",".InputfieldImage",function(){var $inputfield=$(this);initInputfield($inputfield);initUploadHTML5($inputfield)}).on("wiretabclick",function(e,$newTab,$oldTab){$newTab.find(".InputfieldImage").each(function(){initInputfield($(this))})}).on("opened",".InputfieldImage",function(){initInputfield($(this))})}init()}jQuery(document).ready(function($){InputfieldImage($)}); \ No newline at end of file diff --git a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.module b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.module index 38c9e6f0..42f941f1 100755 --- a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.module +++ b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.module @@ -53,7 +53,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' => 122, + 'version' => 123, 'permanent' => true, ); } @@ -672,10 +672,12 @@ class InputfieldImage extends InputfieldFile implements InputfieldItemList, Inpu
      "; - // @todo move the following to separate method shared by the renderSingle $ext = $pagefile->ext(); $basename = $pagefile->basename(false); $focus = $pagefile->focus(); + + $inputfields = $this->getItemInputfields($pagefile); + if($inputfields) $additional .= $inputfields->render(); $out .= "
      @@ -1062,7 +1064,8 @@ class InputfieldImage extends InputfieldFile implements InputfieldItemList, Inpu //$field->collapsed = Inputfield::collapsedBlank; $field->columnWidth = 50; $fieldset->add($field); - + + /** @var InputfieldInteger $field */ $field = $this->modules->get('InputfieldInteger'); $field->attr('name', 'clientQuality'); $field->label = $this->_('Client-side resize quality percent for JPEGs'); diff --git a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.scss b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.scss index 125e7f9c..465e33af 100755 --- a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.scss +++ b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.scss @@ -459,7 +459,7 @@ $focusPointCircleSize: 40px; display: inline-block; display: flex; vertical-align: top; - align-items: center; + // align-items: center; justify-content: space-around; width: 300px; border-right: 1px solid #eee;