From a12cb029bbdf0b0b8e4706d10f4dffb00c9d6da5 Mon Sep 17 00:00:00 2001 From: Ryan Cramer Date: Fri, 3 Mar 2017 10:37:33 -0500 Subject: [PATCH] Various updates supporting core admin theme customization and bump version to 3.0.54 --- wire/core/AdminTheme.php | 27 +- wire/core/AdminThemeFramework.php | 718 ++++++++++++++++++ wire/core/ProcessWire.php | 4 +- .../InputfieldAsmSelect.css | 1 + .../plugins/pwlink/plugin.js | 9 +- .../plugins/pwlink/plugin.min.js | 2 +- .../InputfieldCheckboxes.module | 4 +- .../InputfieldFile/InputfieldFile.js | 17 +- .../InputfieldFile/InputfieldFile.min.js | 2 +- .../InputfieldFile/InputfieldFile.module | 37 +- .../InputfieldImage/InputfieldImage.module | 9 +- .../InputfieldRadios/InputfieldRadios.module | 2 + .../InputfieldSubmit/InputfieldSubmit.module | 25 +- .../Jquery/JqueryWireTabs/JqueryWireTabs.js | 19 +- .../JqueryWireTabs/JqueryWireTabs.min.js | 2 +- wire/modules/LanguageSupport/LanguageTabs.css | 192 +++-- wire/modules/LanguageSupport/LanguageTabs.js | 2 +- .../LanguageSupport/LanguageTabs.min.js | 2 +- .../LanguageSupport/LanguageTabs.module | 1 + .../modules/LanguageSupport/LanguageTabs.scss | 98 ++- .../Process/ProcessField/ProcessField.css | 2 +- .../Process/ProcessField/ProcessField.js | 2 +- .../Process/ProcessField/ProcessField.min.js | 2 +- .../ProcessPageAdd/ProcessPageAdd.module | 2 + 24 files changed, 1090 insertions(+), 91 deletions(-) create mode 100644 wire/core/AdminThemeFramework.php diff --git a/wire/core/AdminTheme.php b/wire/core/AdminTheme.php index 6e971841..5e82906d 100644 --- a/wire/core/AdminTheme.php +++ b/wire/core/AdminTheme.php @@ -116,24 +116,16 @@ abstract class AdminTheme extends WireData implements Module { // if admin theme has already been set, then no need to continue if($this->wire('adminTheme')) return; - $isCurrent = false; $adminTheme = $this->wire('user')->admin_theme; if($adminTheme) { // there is user specified admin theme // check if this is the one that should be used - if($adminTheme == $this->className()) $isCurrent = true; + if($adminTheme == $this->className()) $this->setCurrent(); } else if($this->wire('config')->defaultAdminTheme == $this->className()) { // there is no user specified admin theme, so use this one - $isCurrent = true; - } - - // set as an API variable and populate configuration variables - if($isCurrent) { - $this->wire('adminTheme', $this); - $this->config->paths->set('adminTemplates', $this->config->paths->get($this->className())); - $this->config->urls->set('adminTemplates', $this->config->urls->get($this->className())); + $this->setCurrent(); } // adjust $config adminThumbOptions[scale] for auto detect when requested @@ -163,6 +155,19 @@ abstract class AdminTheme extends WireData implements Module { return $this->wire('adminTheme') === $this; } + /** + * Set this admin theme as the current one + * + */ + protected function setCurrent() { + $config = $this->wire('config'); + $name = $this->className(); + $config->paths->set('adminTemplates', $config->paths->get($name)); + $config->urls->set('adminTemplates', $config->urls->get($name)); + $config->set('defaultAdminTheme', $name); + $this->wire('adminTheme', $this); + } + /** * Enables hooks to append extra markup to various sections of the admin page * @@ -186,9 +191,11 @@ abstract class AdminTheme extends WireData implements Module { "window.CKEDITOR_BASEPATH='" . $this->wire('config')->urls->InputfieldCKEditor . 'ckeditor-' . InputfieldCKEditor::CKEDITOR_VERSION . "/';"; } + /* if($isLoggedin && $this->wire('config')->advanced) { $parts['footer'] = "

" . $this->_('Advanced Mode') . "

"; } + */ foreach($this->preRenderURLs as $url) { $parts['head'] .= ""; } diff --git a/wire/core/AdminThemeFramework.php b/wire/core/AdminThemeFramework.php new file mode 100644 index 00000000..223a8359 --- /dev/null +++ b/wire/core/AdminThemeFramework.php @@ -0,0 +1,718 @@ +set('useAsLogin', false); + $this->wire('modules')->get('JqueryUI')->use('panel'); + $this->sanitizer = $this->wire('sanitizer'); + } + + /** + * Override get() method from WireData to support additional properties + * + * @param string $key + * @return bool|int|mixed|null|string + * + */ + public function get($key) { + switch($key) { + case 'isSuperuser': $value = $this->isSuperuser; break; + case 'isEditor': $value = $this->isEditor; break; + case 'isLoggedIn': $value = $this->isLoggedIn; break; + case 'isModal': $value = $this->isModal; break; + default: $value = parent::get($key); + } + return $value; + } + + /** + * Initialize and attach hooks + * + */ + public function init() { + + $user = $this->wire('user'); + if(!$user->isLoggedin() && $this->useAsLogin) $this->setCurrent(); + parent::init(); + + // if this is not the current admin theme, exit now so no hooks are attached + if(!$this->isCurrent()) return; + + $this->isLoggedIn = $user->isLoggedin(); + $this->isSuperuser = $this->isLoggedIn && $user->isSuperuser(); + $this->isEditor = $this->isLoggedIn && ($this->isSuperuser || $user->hasPermission('page-edit')); + + $modal = $this->wire('input')->get('modal'); + if($modal) $this->isModal = $modal == 'inline' ? 'inline' : true; + + // test notices when requested + if($this->wire('input')->get('test_notices')) $this->testNotices(); + } + + /** + * Perform a translation, based on text from shared admin file: /wire/templates-admin/default.php + * + * @param string $text + * @return string + * + */ + public function _($text) { + static $translate = null; + if(is_null($translate)) $translate = $this->wire('languages') !== null; + if($translate === false) return $text; + $value = __($text, $this->wire('config')->paths->root . 'wire/templates-admin/default.php'); + if($value === $text) $value = parent::_($text); + return $value; + } + + /** + * Get the current page headline + * + * @return string + * + */ + public function getHeadline() { + $headline = $this->wire('processHeadline'); + if(!$headline) $headline = $this->wire('page')->get('title|name'); + return $this->sanitizer->entities1($headline); + } + + /** + * Get navigation title for the given page, return blank if page should not be shown + * + * @param Page $p + * @return string + * + */ + public function getPageTitle(Page $p) { + + if($p->name == 'add' && $p->parent->name == 'page') { + // ProcessPageAdd: avoid showing this menu item if there are no predefined family settings to use + $numAddable = $this->wire('session')->getFor('ProcessPageAdd', 'numAddable'); + if($numAddable === null) { + /** @var ProcessPageAdd $processPageAdd */ + $processPageAdd = $this->wire('modules')->getModule('ProcessPageAdd', array('noInit' => true)); + if($processPageAdd) { + $addData = $processPageAdd->executeNavJSON(array('getArray' => true)); + $numAddable = $addData['list']; + } + } + if(!$numAddable) return ''; + $title = $this->getAddNewLabel(); + + } else { + $title = $this->_($p->title); + } + + $title = $this->sanitizer->entities1($title); + + return $title; + } + + /** + * Get icon used by the given page + * + * @param Page $p + * @return mixed|null|string + * + */ + public function getPageIcon(Page $p) { + $icon = ''; + if($p->template == 'admin') { + $info = $this->wire('modules')->getModuleInfo($p->process); + if(!empty($info['icon'])) $icon = $info['icon']; + } + // allow for option of an admin field overriding the module icon + $pageIcon = $p->get('page_icon'); + if($pageIcon) $icon = $pageIcon; + if(!$icon) switch($p->id) { + case 22: $icon = 'gears'; break; // Setup + case 21: $icon = 'plug'; break; // Modules + case 28: $icon = 'key'; break; // Access + } + if(!$icon && $p->parent->id != $this->wire('config')->adminRootPageID) { + $icon = 'file-o ui-priority-secondary'; + } + return $icon; + } + + /** + * Get “Add New” button actions + * + * - Returns array of arrays, each with 'url', 'label' and 'icon' properties. + * - Returns empty array if Add New button should not be displayed. + * + * @return array + * + */ + public function getAddNewActions() { + + $page = $this->wire('page'); + $process = $this->wire('process'); + $input = $this->wire('input'); + + if(!$this->isEditor) return array(); + if($page->name != 'page' || $this->wire('input')->urlSegment1) return array(); + if($input->urlSegment1 || $input->get('modal')) return array(); + if(strpos($process, 'ProcessPageList') !== 0) return array(); + + /** @var ProcessPageAdd $module */ + $module = $this->wire('modules')->getModule('ProcessPageAdd', array('noInit' => true)); + $data = $module->executeNavJSON(array('getArray' => true)); + $actions = array(); + + foreach($data['list'] as $item) { + $item['url'] = $data['url'] . $item['url']; + $actions[] = $item; + } + + return $actions; + } + + /** + * Get the translated “Add New” label that’s used in a couple spots + * + * @return string + * + */ + public function getAddNewLabel() { + return $this->_('Add New'); + } + + /** + * Get the classes that will be used in the tag + * + * @return string + * + */ + public function getBodyClass() { + + $page = $this->wire('page'); + $process = $this->wire('process'); + + $classes = array( + "id-{$page->id}", + "template-{$page->template->name}", + "pw-init", + parent::getBodyClass(), + ); + + if($this->isModal) $classes[] = 'modal'; + if($this->isModal === 'inline') $classes[] = 'modal-inline'; + if($this->wire('input')->urlSegment1) $classes[] = 'hasUrlSegments'; + if($process) $classes[] = $process->className(); + + return implode(' ', $classes); + } + + /** + * Get Javascript that must be present in the document + * + * @return string + * + */ + public function getHeadJS() { + + /** @var Config $config */ + $config = $this->wire('config'); + + /** @var Paths $urls */ + $urls = $config->urls; + + /** @var array $jsConfig */ + $jsConfig = $config->js(); + $jsConfig['debug'] = $config->debug; + + $jsConfig['urls'] = array( + 'root' => $urls->root, + 'admin' => $urls->admin, + 'modules' => $urls->modules, + 'core' => $urls->core, + 'files' => $urls->files, + 'templates' => $urls->templates, + 'adminTemplates' => $urls->adminTemplates, + ); + + $out = + "var ProcessWire = { config: " . wireEncodeJSON($jsConfig, true, $config->debug) . " }; " . + "var config = ProcessWire.config;\n"; // legacy support + + return $out; + } + + + /** + * Allow the given Page to appear in admin theme navigation? + * + * @param Page $p Page to test + * @param PageArray|array $children Children of page, if applicable (optional) + * @param string|null $permission Specify required permission (optional) + * @return bool + * + */ + public function allowPageInNav(Page $p, $children = array(), $permission = null) { + + if($this->isSuperuser) return true; + if($p->viewable()) return true; + $allow = false; + + foreach($children as $child) { + if($child->viewable()) { + $allow = true; + break; + } + } + + if($allow) return true; + + if($permission === null && $p->process) { + // determine permission + $moduleInfo = $this->wire('modules')->getModuleInfo($p->process); + if(!empty($moduleInfo['permission'])) $permission = $moduleInfo['permission']; + } + + if($permission) { + $allow = $this->wire('user')->hasPermission($permission); + } + + return $allow; + } + + /** + * Return nav array of primary navigation + * + * @return array + * + */ + public function getPrimaryNavArray() { + + $items = array(); + $config = $this->wire('config'); + $admin = $this->wire('pages')->get($config->adminRootPageID); + + foreach($admin->children("check_access=0") as $p) { + $item = $this->pageToNavArray($p); + if($item) $items[] = $item; + } + + return $items; + } + + /** + * Get navigation array from a Process module + * + * @param array|Module|string $module Module info array or Module object or string + * @param Page $p Page upon which the Process module is contained + * @return array + * + */ + public function moduleToNavArray($module, Page $p) { + + $config = $this->wire('config'); + $modules = $this->wire('modules'); + $textdomain = str_replace($config->paths->root, '/', $modules->getModuleFile($p->process)); + $user = $this->wire('user'); + $navArray = array(); + + if(is_array($module)) { + $moduleInfo = $module; + } else { + $moduleInfo = $modules->getModuleInfo($module); + } + + foreach($moduleInfo['nav'] as $navItem) { + + $permission = empty($navItem['permission']) ? '' : $navItem['permission']; + if($permission && !$user->hasPermission($permission)) continue; + + $navArray[] = array( + 'id' => 0, + 'parent_id' => $p->id, + 'title' => $this->sanitizer->entities1(__($navItem['label'], $textdomain)), // translate from context of Process module + 'name' => '', + 'url' => $p->url . $navItem['url'], + 'icon' => empty($navItem['icon']) ? '' : $navItem['icon'], + 'children' => array(), + 'navJSON' => empty($navItem['navJSON']) ? '' : $p->url . $navItem['navJSON'], + ); + } + + return $navArray; + } + + /** + * Get a navigation array the given Page, or null if page not allowed in nav + * + * @param Page $p + * @return array|null + * + */ + public function pageToNavArray(Page $p) { + + $children = $p->numChildren ? $p->children("check_access=0") : array(); + + if(!$this->allowPageInNav($p, $children)) return null; + + $navArray = array( + 'id' => $p->id, + 'parent_id' => $p->parent_id, + 'url' => $p->url, + 'name' => $p->name, + 'title' => $this->getPageTitle($p), + 'icon' => $this->getPageIcon($p), + 'children' => array(), + 'navJSON' => '', + ); + + if(!count($children)) { + // no children available + if($p->template == 'admin' && $p->process) { + // see if process module defines its own navigation + $moduleInfo = $this->wire('modules')->getModuleInfo($p->process); + if(!empty($moduleInfo['nav'])) { + $navArray['children'] = $this->moduleToNavArray($moduleInfo, $p); + } + } else { + // The /page/ and /page/list/ are the same process, so just keep them on /page/ instead. + if(strpos($navArray['url'], '/page/list/') !== false) { + $navArray['url'] = str_replace('/page/list/', '/page/', $navArray['url']); + } + } + return $navArray; + } + + // if we reach this point, then we have a PageArray of children + + $modules = $this->wire('modules'); + + foreach($children as $c) { + + if(!$c->process) continue; + $moduleInfo = $modules->getModuleInfo($c->process); + $permission = empty($moduleInfo['permission']) ? '' : $moduleInfo['permission']; + if(!$this->allowPageInNav($c, array(), $permission)) continue; + + $childItem = array( + 'id' => $c->id, + 'parent_id' => $c->parent_id, + 'title' => $this->getPageTitle($c), + 'name' => $c->name, + 'url' => $c->url, + 'icon' => $this->getPageIcon($c), + 'children' => array(), + 'navJSON' => empty($moduleInfo['useNavJSON']) ? '' : $c->url . 'navJSON/', + ); + + if(!empty($moduleInfo['nav'])) { + $childItem['children'] = $this->moduleToNavArray($moduleInfo, $c); // @todo should $p be $c? + } + + $navArray['children'][] = $childItem; + + } // foreach + + return $navArray; + } + + /** + * Get navigation items for the “user” menu + * + * This is hookable so that something else could add stuff to it. + * See the method body for details on format used. + * + * @return array + * + */ + public function ___getUserNavArray() { + $urls = $this->wire('urls'); + $navArray = array(); + + $navArray[] = array( + 'url' => $urls->root, + 'title' => $this->_('View site'), + 'icon' => 'eye', + ); + + if($this->wire('user')->hasPermission('profile-edit')) $navArray[] = array( + 'url' => $urls->admin . 'profile/', + 'title' => $this->_('Profile'), + 'icon' => 'user', + 'permission' => 'profile-edit', + ); + + $navArray[] = array( + 'url' => $urls->admin . 'login/logout/', + 'title' => $this->_('Logout'), + 'icon' => 'power-off', + ); + + return $navArray; + } + + /** + * Get the browser + * + * @return string + * + */ + public function getBrowserTitle() { + + $browserTitle = $this->wire('processBrowserTitle'); + $modal = $this->wire('input')->get('modal'); + + if(!$browserTitle) { + if($modal) return $this->wire('processHeadline'); + $browserTitle = $this->_(strip_tags($this->wire('page')->get('title|name'))) . ' • ProcessWire'; + } + + if(!$modal) { + $httpHost = $this->wire('config')->httpHost; + if(strpos($httpHost, 'www.') === 0) $httpHost = substr($httpHost, 4); // remove www + if(strpos($httpHost, ':')) $httpHost = preg_replace('/:\d+/', '', $httpHost); // remove port + $browserTitle .= " • $httpHost"; + } + + return $this->sanitizer->entities1($browserTitle); + } + + /** + * Test all notice types + * + */ + public function testNotices() { + if(!$this->wire('user')->isLoggedin()) return; + $this->message('Message test'); + $this->message('Message test debug', Notice::debug); + $this->message('Message test markup <a href="#">example</a>', Notice::allowMarkup); + $this->warning('Warning test'); + $this->warning('Warning test debug', Notice::debug); + $this->warning('Warning test markup <a href="#">example</a>', Notice::allowMarkup); + $this->error('Error test'); + $this->error('Error test debug', Notice::debug); + $this->error('Error test markup <a href="#">example</a>', Notice::allowMarkup); + } + + /** + * Render runtime notices div#notices + * + * @param array $options See defaults in method + * @param Notices $notices + * @return string + * + */ + public function renderNotices($notices, array $options = array()) { + + if(!count($notices)) return ''; + + if($this->isLoggedIn && $this->wire('modules')->isInstalled('SystemNotifications')) { + $systemNotifications = $this->wire('modules')->get('SystemNotifications'); + if(!$systemNotifications->placement) return ''; + } + + $defaults = array( + 'messageClass' => 'NoticeMessage', // class for messages + 'messageIcon' => 'check-square', // default icon to show with notices + 'warningClass' => 'NoticeWarning', // class for warnings + 'warningIcon' => 'exclamation-circle', // icon for warnings + 'errorClass' => 'NoticeError', // class for errors + 'errorIcon' => 'exclamation-triangle', // icon for errors + 'debugClass' => 'NoticeDebug', // class for debug items (appended) + 'debugIcon' => 'bug', // icon for debug notices + 'closeClass' => 'notice-remove', // class for close notices link <a> + 'closeIcon' => 'times', // icon for close notices link + 'listMarkup' => "<ul class='pw-notices' id='notices'>{out}</ul><!--/notices-->", + 'itemMarkup' => "<li class='{class}'>{remove}{icon}{text}</li>" + ); + + $options = array_merge($defaults, $options); + $config = $this->wire('config'); + $out = ''; + + foreach($notices as $n => $notice) { + + $text = $notice->text; + if($notice->flags & Notice::allowMarkup) { + // leave $text alone + } else { + // unencode + re-encode entities, just in case module already entity some or all of output + if(strpos($text, '&') !== false) $text = $this->sanitizer->unentities($text); + $text = $this->sanitizer->entities($text); + } + + if($notice instanceof NoticeError) { + $class = $options['errorClass']; + $icon = $options['errorIcon']; + + } else if($notice instanceof NoticeWarning) { + $class = $options['warningClass']; + $icon = $options['warningIcon']; + + } else { + $class = $options['messageClass']; + $icon = $options['messageIcon']; + } + + if($notice->flags & Notice::debug) { + $class .= " " . $options['debugClass']; + $icon = $options['debugIcon']; + } + + // indicate which class the notice originated from in debug mode + if($notice->class && $config->debug) $text = "{$notice->class}: $text"; + + // show remove link for first item only + if($n) { + $remove = ''; + } else { + $removeIcon = $this->renderIcon($options['closeIcon']); + $removeLabel = $this->_('Close all'); + $remove = "<a class='$options[closeClass]' href='#' title='$removeLabel'>$removeIcon</a>"; + } + + $replacements = array( + '{class}' => $class, + '{remove}' => $remove, + '{icon}' => $this->renderNavIcon($notice->icon ? $notice->icon : $icon), + '{text}' => $text, + ); + + $out .= str_replace(array_keys($replacements), array_values($replacements), $options['itemMarkup']); + } + + $out = str_replace('{out}', $out, $options['listMarkup']); + $out .= $this->renderExtraMarkup('notices'); + + return $out; + } + + /** + * Render markup for a font-awesome icon + * + * @param string $icon Name of icon to render, excluding the “fa-” prefix + * @param bool $fw Specify true to make fixed width (default=false). + * @return string + * + */ + public function renderIcon($icon, $fw = false) { + if($fw) $icon .= ' fa-fw'; + return "<i class='fa fa-$icon'></i>"; + } + + /** + * Render markup for a font-awesome icon that precedes a navigation label + * + * This is the same as renderIcon() except that fixed-width is assumed and a "nav-nav-icon" + * class is added to it. + * + * @param string $icon Name of icon to render, excluding the “fa-” prefix + * @return string + * + */ + public function renderNavIcon($icon) { + return $this->renderIcon("$icon pw-nav-icon", true); + } + + /** + * Render an extra markup region + * + * @param string $for + * @return mixed|string + * + */ + public function renderExtraMarkup($for) { + static $extras = array(); + if(empty($extras)) $extras = $this->getExtraMarkup(); + return isset($extras[$for]) ? $extras[$for] : ''; + } + + /** + * Module Configuration + * + * @param InputfieldWrapper $inputfields + * + */ + public function getModuleConfigInputfields(InputfieldWrapper $inputfields) { + + /** @var InputfieldCheckbox $f */ + $f = $this->modules->get('InputfieldCheckbox'); + $f->name = 'useAsLogin'; + $f->label = $this->_('Use this admin theme for login screen?'); + $f->description = $this->_('When checked, this admin theme will be used on the user login screen.'); + $f->icon = 'sign-in'; + $f->collapsed = Inputfield::collapsedBlank; + if($this->get('useAsLogin')) $f->attr('checked', 'checked'); + $inputfields->add($f); + + if($f->attr('checked') && $this->input->requestMethod('GET')) { + $class = $this->className(); + foreach($this->modules->findByPrefix('AdminTheme') as $name) { + if($name == $class) continue; + $cfg = $this->modules->getConfig($name); + if(!empty($cfg['useAsLogin'])) { + unset($cfg['useAsLogin']); + $this->modules->saveConfig($name, $cfg); + $this->message("Removed 'useAsLogin' setting from $name", Notice::debug); + } + } + } + } +} + diff --git a/wire/core/ProcessWire.php b/wire/core/ProcessWire.php index f79abce1..296d8fb3 100644 --- a/wire/core/ProcessWire.php +++ b/wire/core/ProcessWire.php @@ -45,7 +45,7 @@ class ProcessWire extends Wire { * Reversion revision number * */ - const versionRevision = 53; + const versionRevision = 54; /** * Version suffix string (when applicable) @@ -282,7 +282,7 @@ class ProcessWire extends Wire { if($config->useFunctionsAPI) { $file = $config->paths->core . 'FunctionsAPI.php'; /** @noinspection PhpIncludeInspection */ - include($file); + include_once($file); } diff --git a/wire/modules/Inputfield/InputfieldAsmSelect/InputfieldAsmSelect.css b/wire/modules/Inputfield/InputfieldAsmSelect/InputfieldAsmSelect.css index d3c9f11d..7e36cb0f 100644 --- a/wire/modules/Inputfield/InputfieldAsmSelect/InputfieldAsmSelect.css +++ b/wire/modules/Inputfield/InputfieldAsmSelect/InputfieldAsmSelect.css @@ -35,6 +35,7 @@ display: inline; } +.pw-init .InputfieldAsmSelect select[multiple], .pw-fouc-fix .InputfieldAsmSelect select[multiple] { display: none; } diff --git a/wire/modules/Inputfield/InputfieldCKEditor/plugins/pwlink/plugin.js b/wire/modules/Inputfield/InputfieldCKEditor/plugins/pwlink/plugin.js index 42eca387..272c6237 100644 --- a/wire/modules/Inputfield/InputfieldCKEditor/plugins/pwlink/plugin.js +++ b/wire/modules/Inputfield/InputfieldCKEditor/plugins/pwlink/plugin.js @@ -116,8 +116,13 @@ // existing link $existingLink = jQuery(node.$); selectionText = node.getHtml(); - selection.selectElement(node); - + selection.selectElement(node); + } else if(nodeName == 'td' || nodeName == 'th' || nodeName == 'tr') { + var firstChar = selectionText.substring(0,1); + if(firstChar == "\n" || firstChar == "\r") { + ProcessWire.alert('Your selection includes part of the table. Please try selecting the text again.'); + return; + } } else if(nodeName == 'img') { // linked image var $img = jQuery(node.$); diff --git a/wire/modules/Inputfield/InputfieldCKEditor/plugins/pwlink/plugin.min.js b/wire/modules/Inputfield/InputfieldCKEditor/plugins/pwlink/plugin.min.js index ad4f23b7..bb64af03 100644 --- a/wire/modules/Inputfield/InputfieldCKEditor/plugins/pwlink/plugin.min.js +++ b/wire/modules/Inputfield/InputfieldCKEditor/plugins/pwlink/plugin.min.js @@ -1 +1 @@ -(function(){CKEDITOR.plugins.add("pwlink",{requires:"dialog,fakeobjects",init:function(b){var d="a[!href,target,name,title,rel]";var c="a[href]";var e=ProcessWire.config.InputfieldCKEditor.pwlink.classOptions;if(e.length){d+="("+e+")"}b.addCommand("pwlink",{allowedContent:d,requiredContent:c,exec:a});b.addCommand("anchor",new CKEDITOR.dialogCommand("anchor",{allowedContent:"a[!name,id]",requiredContent:"a[name]"}));b.addCommand("unlink",new CKEDITOR.unlinkCommand());b.addCommand("removeAnchor",new CKEDITOR.removeAnchorCommand());b.setKeystroke(CKEDITOR.CTRL+76,"pwlink");if(b.ui.addButton){b.ui.addButton("PWLink",{label:b.lang.link.toolbar,command:"pwlink",toolbar:"links,10",hidpi:true,icon:(CKEDITOR.env.hidpi?this.path+"images/hidpi/pwlink.png":this.path+"images/pwlink.png")});b.ui.addButton("Unlink",{label:b.lang.link.unlink,command:"unlink",toolbar:"links,20"});b.ui.addButton("Anchor",{label:b.lang.link.anchor.toolbar,command:"anchor",toolbar:"links,30"})}b.on("doubleclick",function(f){var g=CKEDITOR.plugins.link.getSelectedLink(b)||f.data.element;if(g.is("a")&&!g.getAttribute("name")&&!g.isReadOnly()){var h=jQuery(g.$);if(h.children("img").length==0){f.cancel();b.commands.pwlink.exec()}}});b.on("instanceReady",function(f){f.editor.removeMenuItem("link")});if(b.contextMenu){b.addMenuItem("pwlinkitem",{label:ProcessWire.config.InputfieldCKEditor.pwlink.edit,command:"pwlink",group:"link",icon:(CKEDITOR.env.hidpi?this.path+"images/hidpi/pwlink.png":this.path+"images/pwlink.png")});b.contextMenu.addListener(function(g){if(!g||g.isReadOnly()){return null}var f=CKEDITOR.plugins.link.tryRestoreFakeAnchor(b,g);var h={};if(!f&&!(f=CKEDITOR.plugins.link.getSelectedLink(b))){return null}if(f.getAttribute("href")&&f.getChildCount()){h={pwlinkitem:CKEDITOR.TRISTATE_OFF}}return h})}}});function a(g){var i=jQuery("#Inputfield_id");if(i.length){var f=i.val()}else{var f=jQuery("#"+g.name).closest(".Inputfield").attr("data-pid")}var u=jQuery("#"+g.name);var v=g.getSelection(true);var s=v.getStartElement();var b=s.getName();var j=v.getSelectedText();var t=null;var p=CKEDITOR.plugins.link.getEditorAnchors(g);if(b=="a"){t=jQuery(s.$);j=s.getHtml();v.selectElement(s)}else{if(b=="img"){var k=jQuery(s.$);t=k.parent("a");j=s.$.outerHTML}else{if(j.length<1){return}else{}}}var m=ProcessWire.config.urls.admin+"page/link/?id="+f+"&modal=1";var d=u.closest(".LanguageSupport");if(d.length){m+="&lang="+d.data("language")}if(t!=null){var q=["href","title","class","rel","target"];for(var r=0;r<q.length;r++){var w=t.attr(q[r]);if(w&&w.length){m+="&"+q[r]+"="+encodeURIComponent(w)}}}if(p.length>0){for(var r=0;r<p.length;r++){m+="&anchors[]="+encodeURIComponent(p[r].id)}}var c=ProcessWire.config.InputfieldCKEditor.pwlink.label;var l=ProcessWire.config.InputfieldCKEditor.pwlink.cancel;var o;function h(){var y=o.contents();var x=jQuery(jQuery("#link_markup",y).text());if(x.attr("href")&&x.attr("href").length){x.html(j);var n=jQuery("<div />").append(x).html();g.insertHtml(n)}o.dialog("close")}var e={title:"<i class='fa fa-link'></i> "+c,open:function(){if(jQuery(".cke_maximized").length>0){jQuery(".ui-dialog").css("z-index",9999);jQuery(".ui-widget-overlay").css("z-index",9998)}},buttons:[{"class":"pw_link_submit_insert",html:"<i class='fa fa-link'></i> "+c,click:h},{html:"<i class='fa fa-times-circle'></i> "+l,click:function(){o.dialog("close")},"class":"ui-priority-secondary"}]};var o=pwModalWindow(m,e,"medium");o.load(function(){var n=o.contents();n.find("#ProcessPageEditLinkForm").data("iframe",o);jQuery("#link_page_url",n).keydown(function(x){var y=jQuery(this);var z=jQuery.trim(y.val());if(x.keyCode==13){x.preventDefault();if(z.length>0){h()}return false}})})}})(); \ No newline at end of file +(function(){CKEDITOR.plugins.add("pwlink",{requires:"dialog,fakeobjects",init:function(b){var d="a[!href,target,name,title,rel]";var c="a[href]";var e=ProcessWire.config.InputfieldCKEditor.pwlink.classOptions;if(e.length){d+="("+e+")"}b.addCommand("pwlink",{allowedContent:d,requiredContent:c,exec:a});b.addCommand("anchor",new CKEDITOR.dialogCommand("anchor",{allowedContent:"a[!name,id]",requiredContent:"a[name]"}));b.addCommand("unlink",new CKEDITOR.unlinkCommand());b.addCommand("removeAnchor",new CKEDITOR.removeAnchorCommand());b.setKeystroke(CKEDITOR.CTRL+76,"pwlink");if(b.ui.addButton){b.ui.addButton("PWLink",{label:b.lang.link.toolbar,command:"pwlink",toolbar:"links,10",hidpi:true,icon:(CKEDITOR.env.hidpi?this.path+"images/hidpi/pwlink.png":this.path+"images/pwlink.png")});b.ui.addButton("Unlink",{label:b.lang.link.unlink,command:"unlink",toolbar:"links,20"});b.ui.addButton("Anchor",{label:b.lang.link.anchor.toolbar,command:"anchor",toolbar:"links,30"})}b.on("doubleclick",function(f){var g=CKEDITOR.plugins.link.getSelectedLink(b)||f.data.element;if(g.is("a")&&!g.getAttribute("name")&&!g.isReadOnly()){var h=jQuery(g.$);if(h.children("img").length==0){f.cancel();b.commands.pwlink.exec()}}});b.on("instanceReady",function(f){f.editor.removeMenuItem("link")});if(b.contextMenu){b.addMenuItem("pwlinkitem",{label:ProcessWire.config.InputfieldCKEditor.pwlink.edit,command:"pwlink",group:"link",icon:(CKEDITOR.env.hidpi?this.path+"images/hidpi/pwlink.png":this.path+"images/pwlink.png")});b.contextMenu.addListener(function(g){if(!g||g.isReadOnly()){return null}var f=CKEDITOR.plugins.link.tryRestoreFakeAnchor(b,g);var h={};if(!f&&!(f=CKEDITOR.plugins.link.getSelectedLink(b))){return null}if(f.getAttribute("href")&&f.getChildCount()){h={pwlinkitem:CKEDITOR.TRISTATE_OFF}}return h})}}});function a(g){var i=jQuery("#Inputfield_id");if(i.length){var f=i.val()}else{var f=jQuery("#"+g.name).closest(".Inputfield").attr("data-pid")}var u=jQuery("#"+g.name);var w=g.getSelection(true);var s=w.getStartElement();var c=s.getName();var j=w.getSelectedText();var t=null;var p=CKEDITOR.plugins.link.getEditorAnchors(g);if(c=="a"){t=jQuery(s.$);j=s.getHtml();w.selectElement(s)}else{if(c=="td"||c=="th"||c=="tr"){var v=j.substring(0,1);if(v=="\n"||v=="\r"){ProcessWire.alert("Your selection includes part of the table. Please try selecting the text again.");return}}else{if(c=="img"){var k=jQuery(s.$);t=k.parent("a");j=s.$.outerHTML}else{if(j.length<1){return}else{}}}}var m=ProcessWire.config.urls.admin+"page/link/?id="+f+"&modal=1";var d=u.closest(".LanguageSupport");if(d.length){m+="&lang="+d.data("language")}if(t!=null){var q=["href","title","class","rel","target"];for(var r=0;r<q.length;r++){var x=t.attr(q[r]);if(x&&x.length){m+="&"+q[r]+"="+encodeURIComponent(x)}}}if(p.length>0){for(var r=0;r<p.length;r++){m+="&anchors[]="+encodeURIComponent(p[r].id)}}var b=ProcessWire.config.InputfieldCKEditor.pwlink.label;var l=ProcessWire.config.InputfieldCKEditor.pwlink.cancel;var o;function h(){var z=o.contents();var y=jQuery(jQuery("#link_markup",z).text());if(y.attr("href")&&y.attr("href").length){y.html(j);var n=jQuery("<div />").append(y).html();g.insertHtml(n)}o.dialog("close")}var e={title:"<i class='fa fa-link'></i> "+b,open:function(){if(jQuery(".cke_maximized").length>0){jQuery(".ui-dialog").css("z-index",9999);jQuery(".ui-widget-overlay").css("z-index",9998)}},buttons:[{"class":"pw_link_submit_insert",html:"<i class='fa fa-link'></i> "+b,click:h},{html:"<i class='fa fa-times-circle'></i> "+l,click:function(){o.dialog("close")},"class":"ui-priority-secondary"}]};var o=pwModalWindow(m,e,"medium");o.load(function(){var n=o.contents();n.find("#ProcessPageEditLinkForm").data("iframe",o);jQuery("#link_page_url",n).keydown(function(y){var z=jQuery(this);var A=jQuery.trim(z.val());if(y.keyCode==13){y.preventDefault();if(A.length>0){h()}return false}})})}})(); \ No newline at end of file diff --git a/wire/modules/Inputfield/InputfieldCheckboxes/InputfieldCheckboxes.module b/wire/modules/Inputfield/InputfieldCheckboxes/InputfieldCheckboxes.module index ebcb5a0f..a082617c 100644 --- a/wire/modules/Inputfield/InputfieldCheckboxes/InputfieldCheckboxes.module +++ b/wire/modules/Inputfield/InputfieldCheckboxes/InputfieldCheckboxes.module @@ -37,6 +37,7 @@ class InputfieldCheckboxes extends InputfieldSelectMultiple implements Inputfiel $inline = $columns === 1 || $columns > 10; $liAttr = ''; $ulClass = ''; + $inputClass = $this->wire('sanitizer')->entities($this->attr('class')); $entityEncode = $this->getSetting('entityEncodeText') === false ? false : true; if($this->table) { @@ -69,7 +70,7 @@ class InputfieldCheckboxes extends InputfieldSelectMultiple implements Inputfiel $checked = ''; if($this->isOptionSelected($key)) $checked = " checked='checked'"; - $id = $this->id . "_" . $this->wire('sanitizer')->name($key); + $id = $this->id . "_" . $this->wire('sanitizer')->name($key); $attrs = $this->getOptionAttributes($key); $disabled = empty($attrs['disabled']) ? '' : " disabled='disabled'"; @@ -85,6 +86,7 @@ class InputfieldCheckboxes extends InputfieldSelectMultiple implements Inputfiel "type='checkbox' " . "name='{$this->name}[]' " . "id='$id' " . + "class='$inputClass' " . "value='" . htmlspecialchars($key, ENT_QUOTES, 'UTF-8') . "' />"; if($table) { diff --git a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.js b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.js index 6b38821e..7d23eb5a 100755 --- a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.js +++ b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.js @@ -399,18 +399,27 @@ $(document).ready(function() { this.value = ''; }, false); - dropArea.addEventListener("dragleave", function() { $(this).removeClass('ui-state-hover'); }, false); - dropArea.addEventListener("dragenter", function() { $(this).addClass('ui-state-hover'); }, false); + dropArea.addEventListener("dragleave", function() { + $(this).removeClass('ui-state-hover'); + $(this).closest('.Inputfield').removeClass('pw-drag-in-file'); + }, false); + dropArea.addEventListener("dragenter", function() { + $(this).addClass('ui-state-hover'); + $(this).closest('.Inputfield').addClass('pw-drag-in-file InputfieldStateConfirmLeave'); + }, false); dropArea.addEventListener("dragover", function (evt) { - if(!$(this).is('ui-state-hover')) $(this).addClass('ui-state-hover'); + 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"); + $(this).removeClass("ui-state-hover").closest('.Inputfield').removeClass('pw-drag-in-file InputfieldStateConfirmLeave'); evt.preventDefault(); evt.stopPropagation(); }, false); diff --git a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.min.js b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.min.js index 04d993ae..15ab693a 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(){a($(this))}).on("dblclick",".InputfieldFileDelete",function(){var i=$(this).find("input");var h=$(this).parents(".InputfieldFileList").find(".InputfieldFileDelete input");if(i.is(":checked")){h.removeAttr("checked").change()}else{h.attr("checked","checked").change()}return false});function a(j){var h=j.parents(".InputfieldFileInfo");var i=j.closest(".InputfieldFile").hasClass("InputfieldItemListCollapse");if(j.is(":checked")){h.addClass("ui-state-error");if(!i){h.siblings(".InputfieldFileData").slideUp("fast")}}else{h.removeClass("ui-state-error");if(!i){h.siblings(".InputfieldFileData").slideDown("fast")}}}function c(h){h.each(function(){var j=$(this);var k=j.children("li").length;if(j.closest(".InputfieldRenderValueMode").length){return}var i=j.closest(".Inputfield");if(k<2){if(k==0){i.addClass("InputfieldFileEmpty").removeClass("InputfieldFileMultiple InputfieldFileSingle")}else{i.addClass("InputfieldFileSingle").removeClass("InputfieldFileEmpty InputfieldFileMultiple")}return}else{j.closest(".Inputfield").removeClass("InputfieldFileSingle InputfieldFileEmpty").addClass("InputfieldFileMultiple")}j.sortable({start:function(m,l){l.item.children(".InputfieldFileInfo").addClass("ui-state-highlight")},stop:function(m,l){$(this).children("li").each(function(o){$(this).find(".InputfieldFileSort").val(o)});l.item.children(".InputfieldFileInfo").removeClass("ui-state-highlight");i.addClass("InputfieldFileJustSorted InputfieldStateChanged");setTimeout(function(){i.removeClass("InputfieldFileJustSorted")},500)}})}).find(".ui-widget-header, .ui-state-default").hover(function(){$(this).addClass("ui-state-hover")},function(){$(this).removeClass("ui-state-hover")})}function d(){$("body").addClass("ie-no-drop");$(document).on("change",".InputfieldFileUpload input[type=file]",function(){var k=$(this);var p=k.parent(".InputMask");if(k.val().length>1){p.addClass("ui-state-disabled")}else{p.removeClass("ui-state-disabled")}if(p.next(".InputMask").length>0){return}var h=k.closest(".InputfieldFile");var m=k.closest(".InputfieldFileUpload");var l=h.find(".InputfieldFileList");var o=parseInt(m.find(".InputfieldFileMaxFiles").val());var j=l.children("li").length+m.find("input[type=file]").length+1;if(o>0&&j>=o){return}m.find(".InputMask").not(":last").each(function(){var r=$(this);if(r.find("input[type=file]").val()<1){r.remove()}});var q=p.clone().removeClass("ui-state-disabled");q.children("input[type=file]").val("");q.insertAfter(p);q.css("margin-left","0.5em").removeClass("ui-state-active");var i=k.val();var n=i.lastIndexOf("/");if(n===-1){n=i.lastIndexOf("\\")}i=i.substring(n+1);p.find(".ui-button-text").text(i).prepend("<i class='fa fa-fw fa-file-o'></i>");p.removeClass("ui-state-active")})}function e(i){if(i.length>0){var h=i.find(".InputfieldFileUpload")}else{var h=$(".InputfieldFileUpload")}h.closest(".InputfieldContent").each(function(k){if($(this).hasClass("InputfieldFileInit")){return}j($(this),k);$(this).addClass("InputfieldFileInit")});function j(r,z){var q=r.parents("form");var k=r.closest(".InputfieldRepeaterItem");var n=k.length?k.attr("data-editUrl"):q.attr("action");n+=(n.indexOf("?")>-1?"&":"?")+"InputfieldFileAjax=1";var D=q.find("input._post_token");var p=D.attr("name");var u=D.val();var B=r.find(".InputfieldFileUpload");var m=B.data("fieldname");m=m.slice(0,-2);var C=B.data("extensions").toLowerCase();var y=B.data("maxfilesize");var t=r.find("input[type=file]").get(0);var s=r.get(0);var l=r.find(".InputfieldFileList");if(l.size()<1){l=$("<ul class='InputfieldFileList InputfieldFileListBlank'></ul>");r.prepend(l);r.parent(".Inputfield").addClass("InputfieldFileEmpty")}var A=l.get(0);var v=parseInt(r.find(".InputfieldFileMaxFiles").val());l.children().addClass("InputfieldFileItemExisting");r.find(".AjaxUploadDropHere").show();var w=null;function o(G){var J=$('<li class="InputfieldFile ui-widget AjaxUpload"><p class="InputfieldFileInfo ui-widget ui-widget-header InputfieldItemHeader"></p></li>'),I=$('<div class="ui-progressbar ui-widget ui-widget-content ui-corner-all" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0"></div>'),H=$('<div class="ui-progressbar-value ui-widget-header InputfieldItemHeader ui-corner-left" style="width: 0%; "></div>'),K,L,N,M;I.append(H);J.append(I);N=new XMLHttpRequest();N.upload.addEventListener("progress",function(O){if(O.lengthComputable){var P=(O.loaded/O.total)*100;H.width(P+"%");if(P>4){H.html("<span>"+parseInt(P)+"%</span>")}$("body").addClass("pw-uploading")}else{}},false);N.addEventListener("load",function(){N.getAllResponseHeaders();var U=$.parseJSON(N.responseText);if(U.error!==undefined){U=[U]}for(var S=0;S<U.length;S++){var P=U[S];if(P.error){var T=J.clone();T.find(".InputfieldFileInfo").addClass("ui-state-error");T.find(".InputfieldFileStats").text(" - "+P.message);T.find(".ui-progressbar").remove();J.after(T)}else{if(P.replace){var R=r.find(".InputfieldFileList").children("li:eq(0)");if(R.size()>0){R.slideUp("fast",function(){R.remove()})}}var Z=r.find("input[type=file]");if(Z.val()){Z.replaceWith(Z.clone(true))}var W=$(P.markup);W.hide();if(P.overwrite){var Y=W.find(".InputfieldFileName").text();var aa=null;l.children(".InputfieldFileItemExisting").each(function(){if(aa===null&&$(this).find(".InputfieldFileName").text()==Y){aa=$(this)}});if(aa!==null){var V=W.find(".InputfieldFileInfo");var O=W.find(".InputfieldFileLink");var Q=aa.find(".InputfieldFileInfo");var X=aa.find(".InputfieldFileLink");Q.html(V.html()+"<i class='fa fa-check'></i>");X.html(O.html());aa.addClass("InputfieldFileItemExisting");aa.effect("highlight",500)}else{l.append(W);W.slideDown();W.addClass("InputfieldFileItemExisting")}}else{l.append(W);W.slideDown()}}}J.remove();if(w){clearTimeout(w)}w=setTimeout(function(){$("body").removeClass("pw-uploading");if(v!=1&&!l.is(".ui-sortable")){c(l)}l.trigger("AjaxUploadDone")},500)},false);N.open("POST",n,true);N.setRequestHeader("X-FILENAME",encodeURIComponent(G.name));N.setRequestHeader("X-FIELDNAME",m);N.setRequestHeader("Content-Type","application/octet-stream");N.setRequestHeader("X-"+p,u);N.setRequestHeader("X-REQUESTED-WITH","XMLHttpRequest");N.send(G);M="<i class='fa fa-fw fa-spin fa-spinner'></i> <span class=\"InputfieldFileName\">"+G.name+'</span><span class="InputfieldFileStats"> • '+parseInt(G.size/1024,10)+" kb</span>";J.find("p.ui-widget-header").html(M);l.append(J);var E=l.closest(".Inputfield");E.addClass("InputfieldStateChanged");var F=E.find(".InputfieldFileItem").length;if(F==1){E.removeClass("InputfieldFileEmpty").removeClass("InputfieldFileMultiple").addClass("InputfieldFileSingle")}else{if(F>1){E.removeClass("InputfieldFileEmpty").removeClass("InputfieldFileSingle").addClass("InputfieldFileMultiple")}}}function x(G){function H(J,K){return'<li class="InputfieldFile ui-widget AjaxUpload"><p class="InputfieldFileInfo ui-widget ui-widget-header InputfieldItemHeader ui-state-error">  '+J+' <span class="InputfieldFileStats"> • '+K+"</span></p></li>"}if(typeof G!=="undefined"){for(var F=0,E=G.length;F<E;F++){var I=G[F].name.split(".").pop().toLowerCase();if(C.indexOf(I)==-1){l.append(H(G[F].name,I+" is a invalid file extension, please use one of: "+C))}else{if(G[F].size>y&&y>2000000){l.append(H(G[F].name,"Filesize "+parseInt(G[F].size/1024,10)+" kb is too big. Maximum allowed is "+parseInt(y/1024,10)+" kb"))}else{o(G[F])}}if(v==1){break}}}else{A.innerHTML="No support for the File API in this web browser"}}t.addEventListener("change",function(E){x(this.files);E.preventDefault();E.stopPropagation();this.value=""},false);s.addEventListener("dragleave",function(){$(this).removeClass("ui-state-hover")},false);s.addEventListener("dragenter",function(){$(this).addClass("ui-state-hover")},false);s.addEventListener("dragover",function(E){if(!$(this).is("ui-state-hover")){$(this).addClass("ui-state-hover")}E.preventDefault();E.stopPropagation()},false);s.addEventListener("drop",function(E){x(E.dataTransfer.files);$(this).removeClass("ui-state-hover");E.preventDefault();E.stopPropagation()},false)}}c($(".InputfieldFileList"));if(window.File&&window.FileList&&window.FileReader&&($("#PageIDIndicator").length>0||$(".InputfieldAllowAjaxUpload").length>0)){e("")}else{d()}var g=767;var f=false;var b=function(){$(".AjaxUploadDropHere").each(function(){var h=$(this);if(h.parent().width()<=g){h.hide()}else{h.show()}});f=false};$(window).resize(function(){if(f){return}f=true;setTimeout(b,1000)}).resize();$(document).on("reloaded",".InputfieldHasFileList",function(h){c($(this).find(".InputfieldFileList"));e($(this));b()})}); \ No newline at end of file +$(document).ready(function(){$(document).on("change",".InputfieldFileDelete input",function(){a($(this))}).on("dblclick",".InputfieldFileDelete",function(){var i=$(this).find("input");var h=$(this).parents(".InputfieldFileList").find(".InputfieldFileDelete input");if(i.is(":checked")){h.removeAttr("checked").change()}else{h.attr("checked","checked").change()}return false});function a(j){var h=j.parents(".InputfieldFileInfo");var i=j.closest(".InputfieldFile").hasClass("InputfieldItemListCollapse");if(j.is(":checked")){h.addClass("ui-state-error");if(!i){h.siblings(".InputfieldFileData").slideUp("fast")}}else{h.removeClass("ui-state-error");if(!i){h.siblings(".InputfieldFileData").slideDown("fast")}}}function c(h){h.each(function(){var j=$(this);var k=j.children("li").length;if(j.closest(".InputfieldRenderValueMode").length){return}var i=j.closest(".Inputfield");if(k<2){if(k==0){i.addClass("InputfieldFileEmpty").removeClass("InputfieldFileMultiple InputfieldFileSingle")}else{i.addClass("InputfieldFileSingle").removeClass("InputfieldFileEmpty InputfieldFileMultiple")}return}else{j.closest(".Inputfield").removeClass("InputfieldFileSingle InputfieldFileEmpty").addClass("InputfieldFileMultiple")}j.sortable({start:function(m,l){l.item.children(".InputfieldFileInfo").addClass("ui-state-highlight")},stop:function(m,l){$(this).children("li").each(function(o){$(this).find(".InputfieldFileSort").val(o)});l.item.children(".InputfieldFileInfo").removeClass("ui-state-highlight");i.addClass("InputfieldFileJustSorted InputfieldStateChanged");setTimeout(function(){i.removeClass("InputfieldFileJustSorted")},500)}})}).find(".ui-widget-header, .ui-state-default").hover(function(){$(this).addClass("ui-state-hover")},function(){$(this).removeClass("ui-state-hover")})}function d(){$("body").addClass("ie-no-drop");$(document).on("change",".InputfieldFileUpload input[type=file]",function(){var k=$(this);var p=k.parent(".InputMask");if(k.val().length>1){p.addClass("ui-state-disabled")}else{p.removeClass("ui-state-disabled")}if(p.next(".InputMask").length>0){return}var h=k.closest(".InputfieldFile");var m=k.closest(".InputfieldFileUpload");var l=h.find(".InputfieldFileList");var o=parseInt(m.find(".InputfieldFileMaxFiles").val());var j=l.children("li").length+m.find("input[type=file]").length+1;if(o>0&&j>=o){return}m.find(".InputMask").not(":last").each(function(){var r=$(this);if(r.find("input[type=file]").val()<1){r.remove()}});var q=p.clone().removeClass("ui-state-disabled");q.children("input[type=file]").val("");q.insertAfter(p);q.css("margin-left","0.5em").removeClass("ui-state-active");var i=k.val();var n=i.lastIndexOf("/");if(n===-1){n=i.lastIndexOf("\\")}i=i.substring(n+1);p.find(".ui-button-text").text(i).prepend("<i class='fa fa-fw fa-file-o'></i>");p.removeClass("ui-state-active")})}function e(i){if(i.length>0){var h=i.find(".InputfieldFileUpload")}else{var h=$(".InputfieldFileUpload")}h.closest(".InputfieldContent").each(function(k){if($(this).hasClass("InputfieldFileInit")){return}j($(this),k);$(this).addClass("InputfieldFileInit")});function j(r,z){var q=r.parents("form");var k=r.closest(".InputfieldRepeaterItem");var n=k.length?k.attr("data-editUrl"):q.attr("action");n+=(n.indexOf("?")>-1?"&":"?")+"InputfieldFileAjax=1";var D=q.find("input._post_token");var p=D.attr("name");var u=D.val();var B=r.find(".InputfieldFileUpload");var m=B.data("fieldname");m=m.slice(0,-2);var C=B.data("extensions").toLowerCase();var y=B.data("maxfilesize");var t=r.find("input[type=file]").get(0);var s=r.get(0);var l=r.find(".InputfieldFileList");if(l.size()<1){l=$("<ul class='InputfieldFileList InputfieldFileListBlank'></ul>");r.prepend(l);r.parent(".Inputfield").addClass("InputfieldFileEmpty")}var A=l.get(0);var v=parseInt(r.find(".InputfieldFileMaxFiles").val());l.children().addClass("InputfieldFileItemExisting");r.find(".AjaxUploadDropHere").show();var w=null;function o(G){var J=$('<li class="InputfieldFile ui-widget AjaxUpload"><p class="InputfieldFileInfo ui-widget ui-widget-header InputfieldItemHeader"></p></li>'),I=$('<div class="ui-progressbar ui-widget ui-widget-content ui-corner-all" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0"></div>'),H=$('<div class="ui-progressbar-value ui-widget-header InputfieldItemHeader ui-corner-left" style="width: 0%; "></div>'),K,L,N,M;I.append(H);J.append(I);N=new XMLHttpRequest();N.upload.addEventListener("progress",function(O){if(O.lengthComputable){var P=(O.loaded/O.total)*100;H.width(P+"%");if(P>4){H.html("<span>"+parseInt(P)+"%</span>")}$("body").addClass("pw-uploading")}else{}},false);N.addEventListener("load",function(){N.getAllResponseHeaders();var U=$.parseJSON(N.responseText);if(U.error!==undefined){U=[U]}for(var S=0;S<U.length;S++){var P=U[S];if(P.error){var T=J.clone();T.find(".InputfieldFileInfo").addClass("ui-state-error");T.find(".InputfieldFileStats").text(" - "+P.message);T.find(".ui-progressbar").remove();J.after(T)}else{if(P.replace){var R=r.find(".InputfieldFileList").children("li:eq(0)");if(R.size()>0){R.slideUp("fast",function(){R.remove()})}}var Z=r.find("input[type=file]");if(Z.val()){Z.replaceWith(Z.clone(true))}var W=$(P.markup);W.hide();if(P.overwrite){var Y=W.find(".InputfieldFileName").text();var aa=null;l.children(".InputfieldFileItemExisting").each(function(){if(aa===null&&$(this).find(".InputfieldFileName").text()==Y){aa=$(this)}});if(aa!==null){var V=W.find(".InputfieldFileInfo");var O=W.find(".InputfieldFileLink");var Q=aa.find(".InputfieldFileInfo");var X=aa.find(".InputfieldFileLink");Q.html(V.html()+"<i class='fa fa-check'></i>");X.html(O.html());aa.addClass("InputfieldFileItemExisting");aa.effect("highlight",500)}else{l.append(W);W.slideDown();W.addClass("InputfieldFileItemExisting")}}else{l.append(W);W.slideDown()}}}J.remove();if(w){clearTimeout(w)}w=setTimeout(function(){$("body").removeClass("pw-uploading");if(v!=1&&!l.is(".ui-sortable")){c(l)}l.trigger("AjaxUploadDone")},500)},false);N.open("POST",n,true);N.setRequestHeader("X-FILENAME",encodeURIComponent(G.name));N.setRequestHeader("X-FIELDNAME",m);N.setRequestHeader("Content-Type","application/octet-stream");N.setRequestHeader("X-"+p,u);N.setRequestHeader("X-REQUESTED-WITH","XMLHttpRequest");N.send(G);M="<i class='fa fa-fw fa-spin fa-spinner'></i> <span class=\"InputfieldFileName\">"+G.name+'</span><span class="InputfieldFileStats"> • '+parseInt(G.size/1024,10)+" kb</span>";J.find("p.ui-widget-header").html(M);l.append(J);var E=l.closest(".Inputfield");E.addClass("InputfieldStateChanged");var F=E.find(".InputfieldFileItem").length;if(F==1){E.removeClass("InputfieldFileEmpty").removeClass("InputfieldFileMultiple").addClass("InputfieldFileSingle")}else{if(F>1){E.removeClass("InputfieldFileEmpty").removeClass("InputfieldFileSingle").addClass("InputfieldFileMultiple")}}}function x(G){function H(J,K){return'<li class="InputfieldFile ui-widget AjaxUpload"><p class="InputfieldFileInfo ui-widget ui-widget-header InputfieldItemHeader ui-state-error">  '+J+' <span class="InputfieldFileStats"> • '+K+"</span></p></li>"}if(typeof G!=="undefined"){for(var F=0,E=G.length;F<E;F++){var I=G[F].name.split(".").pop().toLowerCase();if(C.indexOf(I)==-1){l.append(H(G[F].name,I+" is a invalid file extension, please use one of: "+C))}else{if(G[F].size>y&&y>2000000){l.append(H(G[F].name,"Filesize "+parseInt(G[F].size/1024,10)+" kb is too big. Maximum allowed is "+parseInt(y/1024,10)+" kb"))}else{o(G[F])}}if(v==1){break}}}else{A.innerHTML="No support for the File API in this web browser"}}t.addEventListener("change",function(E){x(this.files);E.preventDefault();E.stopPropagation();this.value=""},false);s.addEventListener("dragleave",function(){$(this).removeClass("ui-state-hover");$(this).closest(".Inputfield").removeClass("pw-drag-in-file")},false);s.addEventListener("dragenter",function(){$(this).addClass("ui-state-hover");$(this).closest(".Inputfield").addClass("pw-drag-in-file InputfieldStateConfirmLeave")},false);s.addEventListener("dragover",function(E){if(!$(this).is("ui-state-hover")){$(this).addClass("ui-state-hover");$(this).closest(".Inputfield").addClass("pw-drag-in-file")}E.preventDefault();E.stopPropagation()},false);s.addEventListener("drop",function(E){x(E.dataTransfer.files);$(this).removeClass("ui-state-hover").closest(".Inputfield").removeClass("pw-drag-in-file InputfieldStateConfirmLeave");E.preventDefault();E.stopPropagation()},false)}}c($(".InputfieldFileList"));if(window.File&&window.FileList&&window.FileReader&&($("#PageIDIndicator").length>0||$(".InputfieldAllowAjaxUpload").length>0)){e("")}else{d()}var g=767;var f=false;var b=function(){$(".AjaxUploadDropHere").each(function(){var h=$(this);if(h.parent().width()<=g){h.hide()}else{h.show()}});f=false};$(window).resize(function(){if(f){return}f=true;setTimeout(b,1000)}).resize();$(document).on("reloaded",".InputfieldHasFileList",function(h){c($(this).find(".InputfieldFileList"));e($(this));b()})}); \ No newline at end of file diff --git a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.module b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.module index 52677666..fd64cf36 100644 --- a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.module +++ b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.module @@ -79,6 +79,14 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel protected $isAjax = false; + /** + * Admin theme specific settings + * + * @var array + * + */ + protected $themeSettings = array(); + /** * Commonly used text labels, translated, indexed by label name * @@ -142,6 +150,12 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel $this->uploadOnlyMode = (int) $this->wire('input')->get('uploadOnlyMode'); $this->addClass('InputfieldItemList', 'wrapClass'); $this->addClass('InputfieldHasFileList', 'wrapClass'); + + $themeDefaults = array( + 'error' => "<span class='ui-state-error-text'>{out}</span>", + ); + $themeSettings = $this->wire('config')->InputfieldFile; + $this->themeSettings = is_array($themeSettings) ? array_merge($themeDefaults, $themeSettings) : $themeDefaults; } public function get($key) { @@ -209,6 +223,7 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel $out = ''; $tabs = ''; static $hasLangTabs = null; + static $langTabSettings = array(); if($this->renderValueMode) { if($this->wire('languages')) { @@ -231,7 +246,12 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel $languages = array(null); } else { $numLanguages = $languages->count(); - if(is_null($hasLangTabs)) $hasLangTabs = $this->wire('modules')->isInstalled('LanguageTabs'); + if(is_null($hasLangTabs)) { + $hasLangTabs = $this->wire('modules')->isInstalled('LanguageTabs'); + if($hasLangTabs) { + $langTabSettings = $this->wire('modules')->getModule('LanguageTabs')->getSettings(); + } + } } foreach($languages as $language) { @@ -241,7 +261,8 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel $labelClass = "detail"; if($language) { - $descriptionFieldLabel = (string) $language->getUnformatted('title'); + $tabField = empty($langTabSettings['tabField']) ? 'title' : $langTabSettings['tabField']; + $descriptionFieldLabel = (string) $language->getUnformatted($tabField); if(empty($descriptionFieldLabel)) $descriptionFieldLabel = $language->get('name'); $descriptionFieldLabel = $this->wire('sanitizer')->entities($descriptionFieldLabel); if(!$language->isDefault()) $descriptionFieldName = "description{$language->id}_$id"; @@ -251,7 +272,9 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel $descriptionFieldLabel = "<s>$descriptionFieldLabel</s>"; } $tabID = "langTab_{$id}__$language"; - $tabs .= "<li><a data-lang='$language' class='langTab$language' href='#$tabID'>$descriptionFieldLabel</a></li>"; + $aClass = "langTab$language"; + if(!empty($langTabSettings['aClass'])) $aClass .= " " . $langTabSettings['aClass']; + $tabs .= "<li><a data-lang='$language' class='$aClass' href='#$tabID'>$descriptionFieldLabel</a></li>"; $out .= "<div class='InputfieldFileDescription LanguageSupport' data-language='$language' id='$tabID'>"; // open wrapper } else { $out .= "<div class='InputfieldFileDescription'>"; // open wrapper @@ -271,7 +294,9 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel } if($numLanguages && $hasLangTabs) { - $out = "<div class='hasLangTabs langTabsContainer'><div class='langTabs'><ul>$tabs</ul>$out</div></div>"; + $ulClass = empty($langTabSettings['ulClass']) ? '' : " class='$langTabSettings[ulClass]'"; + $ulAttr = empty($langTabSettings['ulAttrs']) ? '' : " $langTabSettings[ulAttrs]"; + $out = "<div class='hasLangTabs langTabsContainer'><div class='langTabs'><ul $ulAttr$ulClass>$tabs</ul>$out</div></div>"; if($this->isAjax) $out .= "<script>setupLanguageTabs($('#wrap_" . $this->attr('id') . "'));</script>"; } @@ -328,7 +353,7 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel $out = "<p class='InputfieldFileInfo InputfieldItemHeader ui-state-default ui-widget-header'>" . - wireIconMarkupFile($pagefile->basename, "fa-fw HideIfEmpty") . + wireIconMarkupFile($pagefile->basename, "fa-fw HideIfEmpty") . ' ' . "<a class='InputfieldFileName' title='$pagefile->basename' target='_blank' href='{$pagefile->url}'>$displayName</a> " . "<span class='InputfieldFileStats'>" . str_replace(' ', ' ', $pagefile->filesizeStr) . "</span> "; @@ -443,7 +468,7 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel if(!$this->noAjax) $out .= " <span class='AjaxUploadDropHere description'> <span> - <i class='fa fa-upload'></i> $dragDropLabel + <i class='fa fa-cloud-upload'></i> $dragDropLabel </span> </span> "; diff --git a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.module b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.module index 159643bc..b4e3f455 100755 --- a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.module +++ b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.module @@ -80,7 +80,6 @@ class InputfieldImage extends InputfieldFile implements InputfieldItemList, Inpu */ protected $modalClass = 'pw-modal-large'; - protected $themeSettings = array(); public function init() { parent::init(); @@ -126,15 +125,15 @@ class InputfieldImage extends InputfieldFile implements InputfieldItemList, Inpu 'na' => $this->_('N/A'), // for JS 'changes' => $this->_('This images field may have unsaved changes that could be lost after this action. Please save before cropping, or double-click the button proceed anyway.'), )); - + $themeDefaults = array( - 'error' => "<span class='ui-state-error-text'>{out}</span>", + // 'error' => "<span class='ui-state-error-text'>{out}</span>", // provided by InputfieldFile 'buttonClass' => "ui-button ui-corner-all ui-state-default", 'buttonText' => "<span class='ui-button-text'>{out}</span>", ); $themeSettings = $this->wire('config')->InputfieldImage; - $this->themeSettings = is_array($themeSettings) ? array_merge($themeDefaults, $themeSettings) : $themeDefaults; - + $themeSettings = is_array($themeSettings) ? array_merge($themeDefaults, $themeSettings) : $themeDefaults; + $this->themeSettings = array_merge($this->themeSettings, $themeSettings); } /** diff --git a/wire/modules/Inputfield/InputfieldRadios/InputfieldRadios.module b/wire/modules/Inputfield/InputfieldRadios/InputfieldRadios.module index 1f9cc439..97bd6cca 100644 --- a/wire/modules/Inputfield/InputfieldRadios/InputfieldRadios.module +++ b/wire/modules/Inputfield/InputfieldRadios/InputfieldRadios.module @@ -67,6 +67,7 @@ class InputfieldRadios extends InputfieldSelect { $label = $this->entityEncode($label, Inputfield::textFormatBasic); $label = str_replace('!wbr!', '<wbr>', $label); $label = "<span class='$textClass'>$label</span>"; + $class = trim($this->wire('sanitizer')->entities($this->attr('class'))); $out .= "<li$liAttr><label$attrs>" . @@ -74,6 +75,7 @@ class InputfieldRadios extends InputfieldSelect { "type='radio' " . "name='{$this->name}' " . "id='$id' " . + "class='$class' " . "value='" . htmlspecialchars($key, ENT_QUOTES) . "' />" . "<span class='$textClass'>$label</span>" . "</label></li>"; diff --git a/wire/modules/Inputfield/InputfieldSubmit/InputfieldSubmit.module b/wire/modules/Inputfield/InputfieldSubmit/InputfieldSubmit.module index bd5bd676..abf5756f 100644 --- a/wire/modules/Inputfield/InputfieldSubmit/InputfieldSubmit.module +++ b/wire/modules/Inputfield/InputfieldSubmit/InputfieldSubmit.module @@ -7,8 +7,9 @@ * https://processwire.com * License: MPL 2.0 * - * @property bool $header Whether or not button will also appear in header. - * @property bool $secondary Whether or not button is secondary. + * @property bool $header Whether or not button will also appear in header (default=false). + * @property bool $secondary Whether or not button is secondary (default=false). + * @property bool $small Whether or not button should be small, where supported (default=false). * @property string $dropdownInputName #pw-internal * */ @@ -42,6 +43,7 @@ class InputfieldSubmit extends Inputfield { $this->attr('value', $this->_('Submit')); // Standard submit button label $this->attr('class', 'ui-button ui-widget ui-state-default ui-corner-all'); $this->skipLabel = Inputfield::skipLabelBlank; + $this->set('small', false); // name of 'hidden' input that will receive the clicked dropdown item value $this->set('dropdownInputName', '_action_value'); @@ -95,6 +97,21 @@ class InputfieldSubmit extends Inputfield { } return $this; } + + /** + * Make this button small? + * + * By default, buttons are regular size. This makes them small. + * Supported only for non-dropdown, non-header buttons. + * + * @param bool $small Default=true + * @return $this + * + */ + public function setSmall($small = true) { + $this->set('small', $small ? true : false); + return $this; + } /** * Render ready @@ -111,6 +128,9 @@ class InputfieldSubmit extends Inputfield { $class = str_replace('head_button_clone', 'pw-head-button', $class); $this->attr('class', $class); } + if($this->getSetting('small')) { + $this->addClass('InputfieldSubmitSmall', 'wrapClass'); + } return parent::renderReady($parent, $renderValueMode); } @@ -126,6 +146,7 @@ class InputfieldSubmit extends Inputfield { $icon = $icon ? "<i class='fa fa-$icon'></i> " : ''; $value = $this->entityEncode($this->attr('value')); $out = "<button $attrs><span class='ui-button-text'>$icon$value</span></button>"; + if($this->getSetting('small')) $out = "<small>$out</small>"; if(count($this->dropdownItems)) $out .= $this->renderDropdown(); return $out; } diff --git a/wire/modules/Jquery/JqueryWireTabs/JqueryWireTabs.js b/wire/modules/Jquery/JqueryWireTabs/JqueryWireTabs.js index da232041..7023af95 100644 --- a/wire/modules/Jquery/JqueryWireTabs/JqueryWireTabs.js +++ b/wire/modules/Jquery/JqueryWireTabs/JqueryWireTabs.js @@ -144,8 +144,14 @@ var $oldTab = $tabList.find("a." + aActiveClass); var $newTab = $(this); - var $oldTabContent = $($oldTab.attr('href')); - var $newTabContent = $($newTab.attr('href')); + if(!$oldTab.length) $oldTab = $tabList.find("a:eq(0)"); + + + var oldTabHref = $oldTab.attr('href'); + var newTabHref = $newTab.attr('href'); + + var $oldTabContent = oldTabHref && oldTabHref.indexOf('#') === 0 ? $(oldTabHref) : null; + var $newTabContent = newTabHref && newTabHref.indexOf('#') === 0 ? $(newTabHref) : null; var newTabID = $newTab.attr('id'); var oldTabID = $oldTab.attr('id'); @@ -158,8 +164,13 @@ $newTab.closest('li').addClass(liActiveClass); } - $oldTabContent.hide(); - $newTabContent.show(); + if($oldTabContent) $oldTabContent.hide(); + if($newTabContent) { + $newTabContent.show(); + } else if(newTabHref && newTabHref.length) { + window.location.href = newTabHref; + return true; + } // add a target classname equal to the ID of the selected tab // so there is opportunity for 3rd party CSS adjustments outside this plugin diff --git a/wire/modules/Jquery/JqueryWireTabs/JqueryWireTabs.min.js b/wire/modules/Jquery/JqueryWireTabs/JqueryWireTabs.min.js index 019dd70a..494d80c3 100644 --- a/wire/modules/Jquery/JqueryWireTabs/JqueryWireTabs.min.js +++ b/wire/modules/Jquery/JqueryWireTabs/JqueryWireTabs.min.js @@ -1 +1 @@ -(function(a){a.fn.WireTabs=function(d){var e={rememberTabs:0,cookieName:"WireTabs",items:null,skipRememberTabIDs:[],itemsParent:null,ulClass:"WireTabs nav",ulAttrs:"",liActiveClass:"",aActiveClass:"on",id:""};var c=0;var b=ProcessWire.config.JqueryWireTabs;var g=["rememberTabs","cookieName","liActiveClass","aActiveClass","ulClass","ulAttrs"];for(var h=0;h<g.length;h++){var f=g[h];if(b[f]!="undefined"){e[f]=b[f]}}a.extend(e,d);return this.each(function(m){var o=null;var i=a(this);var l="";var q=true;function r(){if(!e.items){return}if(e.items.length<1){return}if(e.id.length){o=a("#"+e.id);if(o.length){q=false}else{o=null}}if(!o){o=a("<ul"+(e.ulAttrs?" "+e.ulAttrs:"")+"></ul>");o.addClass(e.ulClass);if(e.id.length){o.attr("id",e.id)}}e.items.each(j);if(q){i.prepend(o)}var t=i;var w=null;var y=p();if(e.rememberTabs==0){t.submit(function(){k(l);return true})}var s=window.location.href;var u="";if(s.indexOf("WireTab")){var v=new RegExp("[&;?]WireTab=([-_a-z0-9]+)","i");u=s.match(v);u=u?u[1]:"";if(u.length){w=o.find("a#_"+u)}}if(w==null){var x=document.location.hash.replace("#","");if(x.length){w=o.find("a#_"+x);if(w.length==0){w=null}else{document.location.hash=""}}}if(w==null&&y.length>0&&e.rememberTabs>-1){w=o.find("a#_"+y)}if(w&&w.length>0){w.click();if(e.rememberTabs==0){k("")}setTimeout(function(){w.click()},200)}else{o.children("li:first").children("a").click()}}function j(){c++;var w=a(this);if(!w.attr("id")){w.attr("id","WireTab"+c)}var v=w.attr("title")||w.attr("id");w.removeAttr("title");var s=w.attr("id");var u=a("a#_"+s);if(u.length>0){u.click(n)}else{var u=a("<a></a>").attr("href","#"+s).attr("id","_"+s).html(v).click(n);o.append(a("<li></li>").append(u))}var t=w.attr("data-tooltip");if(w.hasClass("WireTabTip")||t){u.addClass("tooltip");u.attr("title",t?t:v)}w.hide()}function n(){var u=e.aActiveClass;var s=e.liActiveClass;var t=o.find("a."+u);var w=a(this);var v=a(t.attr("href"));var y=a(w.attr("href"));var x=w.attr("id");var z=t.attr("id");t.removeClass(u);w.addClass(u);if(s.length){t.closest("li").removeClass(s);w.closest("li").addClass(s)}v.hide();y.show();if(z){i.removeClass(v.attr("id"))}i.addClass(x);if(e.rememberTabs>-1){if(jQuery.inArray(x,e.skipRememberTabIDs)!=-1){x=""}if(e.rememberTabs==1){k(x)}l=x}a(document).trigger("wiretabclick",[y,v]);return false}function k(s){document.cookie=e.cookieName+"="+escape(s)}function p(){var t=new RegExp("(?:^|;)\\s?"+e.cookieName+"=(.*?)(?:;|$)","i");var s=document.cookie.match(t);s=s?s[1]:"";return s}r()})}})(jQuery); \ No newline at end of file +(function(a){a.fn.WireTabs=function(d){var e={rememberTabs:0,cookieName:"WireTabs",items:null,skipRememberTabIDs:[],itemsParent:null,ulClass:"WireTabs nav",ulAttrs:"",liActiveClass:"",aActiveClass:"on",id:""};var c=0;var b=ProcessWire.config.JqueryWireTabs;var g=["rememberTabs","cookieName","liActiveClass","aActiveClass","ulClass","ulAttrs"];for(var h=0;h<g.length;h++){var f=g[h];if(b[f]!="undefined"){e[f]=b[f]}}a.extend(e,d);return this.each(function(m){var o=null;var i=a(this);var l="";var q=true;function r(){if(!e.items){return}if(e.items.length<1){return}if(e.id.length){o=a("#"+e.id);if(o.length){q=false}else{o=null}}if(!o){o=a("<ul"+(e.ulAttrs?" "+e.ulAttrs:"")+"></ul>");o.addClass(e.ulClass);if(e.id.length){o.attr("id",e.id)}}e.items.each(j);if(q){i.prepend(o)}var t=i;var w=null;var y=p();if(e.rememberTabs==0){t.submit(function(){k(l);return true})}var s=window.location.href;var u="";if(s.indexOf("WireTab")){var v=new RegExp("[&;?]WireTab=([-_a-z0-9]+)","i");u=s.match(v);u=u?u[1]:"";if(u.length){w=o.find("a#_"+u)}}if(w==null){var x=document.location.hash.replace("#","");if(x.length){w=o.find("a#_"+x);if(w.length==0){w=null}else{document.location.hash=""}}}if(w==null&&y.length>0&&e.rememberTabs>-1){w=o.find("a#_"+y)}if(w&&w.length>0){w.click();if(e.rememberTabs==0){k("")}setTimeout(function(){w.click()},200)}else{o.children("li:first").children("a").click()}}function j(){c++;var w=a(this);if(!w.attr("id")){w.attr("id","WireTab"+c)}var v=w.attr("title")||w.attr("id");w.removeAttr("title");var s=w.attr("id");var u=a("a#_"+s);if(u.length>0){u.click(n)}else{var u=a("<a></a>").attr("href","#"+s).attr("id","_"+s).html(v).click(n);o.append(a("<li></li>").append(u))}var t=w.attr("data-tooltip");if(w.hasClass("WireTabTip")||t){u.addClass("tooltip");u.attr("title",t?t:v)}w.hide()}function n(){var t=e.aActiveClass;var z=e.liActiveClass;var u=o.find("a."+t);var x=a(this);if(!u.length){u=o.find("a:eq(0)")}var w=u.attr("href");var y=x.attr("href");var v=w&&w.indexOf("#")===0?a(w):null;var s=y&&y.indexOf("#")===0?a(y):null;var B=x.attr("id");var A=u.attr("id");u.removeClass(t);x.addClass(t);if(z.length){u.closest("li").removeClass(z);x.closest("li").addClass(z)}if(v){v.hide()}if(s){s.show()}else{if(y&&y.length){window.location.href=y;return true}}if(A){i.removeClass(v.attr("id"))}i.addClass(B);if(e.rememberTabs>-1){if(jQuery.inArray(B,e.skipRememberTabIDs)!=-1){B=""}if(e.rememberTabs==1){k(B)}l=B}a(document).trigger("wiretabclick",[s,v]);return false}function k(s){document.cookie=e.cookieName+"="+escape(s)}function p(){var t=new RegExp("(?:^|;)\\s?"+e.cookieName+"=(.*?)(?:;|$)","i");var s=document.cookie.match(t);s=s?s[1]:"";return s}r()})}})(jQuery); \ No newline at end of file diff --git a/wire/modules/LanguageSupport/LanguageTabs.css b/wire/modules/LanguageSupport/LanguageTabs.css index 4a44d392..c811c846 100644 --- a/wire/modules/LanguageSupport/LanguageTabs.css +++ b/wire/modules/LanguageSupport/LanguageTabs.css @@ -1,50 +1,36 @@ -.langTabs { +.body.LanguageTabsJqueryUI .pw-content .langTabsContainer .InputfieldError, +.body.LanguageTabsJqueryUI #content .langTabsContainer .InputfieldError { + margin-bottom: 0; } + +.langTabs.ui-tabs { position: relative; padding: 0; } - -.LanguageTabsJqueryUI .langTabs > ul { - display: none; } -.LanguageTabsJqueryUI .hasLangTabs .langTabs > ul { - display: block; } -.LanguageTabsJqueryUI .pw-content .langTabsContainer, -.LanguageTabsJqueryUI #content .langTabsContainer { - padding-bottom: 0; } -.LanguageTabsJqueryUI .pw-content .langTabsContainer .InputfieldError, -.LanguageTabsJqueryUI #content .langTabsContainer .InputfieldError { - margin-bottom: 0; } -.LanguageTabsJqueryUI .langTabs .ui-tabs-nav.ui-widget-header { - padding: 2px 3px 0; - border-bottom: none; } -.LanguageTabsJqueryUI .langTabs .ui-tabs-panel { - padding: 0.9em; - border-top: none; } -.LanguageTabsJqueryUI .langTabs .ui-tabs-panel .LanguageSupportLabel { - display: none; } -.LanguageTabsJqueryUI .langTabs.ui-tabs .ui-tabs-nav { - margin-bottom: 0; } -.LanguageTabsJqueryUI .langTabs.ui-tabs .ui-tabs-nav li { - margin: 0 4px 0 0; } -.LanguageTabsJqueryUI .langTabs.ui-tabs .ui-tabs-nav li a { - padding: 0.3em 0.7em; - font-weight: bold; - outline: none; - font-size: 0.846153846153846em; } -.LanguageTabsJqueryUI .langTabs.ui-tabs .ui-tabs-nav li.ui-state-active.ui-state-default { - border: 1px solid #fff; - padding-bottom: 0; } -.LanguageTabsJqueryUI .langTabs.ui-tabs .ui-tabs-nav li.ui-state-active { - background: #fff; } -.LanguageTabsJqueryUI .langTabs.ui-tabs .ui-tabs-nav li.ui-state-active a { - cursor: default; - background: #fff; - margin: 0; } -.LanguageTabsJqueryUI .langTabEmpty a { - opacity: 0.7; - font-weight: normal !important; } -.LanguageTabsJqueryUI .InputfieldImage .InputfieldFileLink + .langTabsContainer { - margin-top: 0.5em; } -.LanguageTabsJqueryUI .hadLanguageSupport > .InputfieldContent > .LanguageSupport { - margin-bottom: 0; } + .langTabs.ui-tabs .ui-tabs-nav { + margin-bottom: 0; } + .langTabs.ui-tabs .ui-tabs-nav.ui-widget-header { + padding: 2px 3px 0; + border-bottom: none; } + .langTabs.ui-tabs .ui-tabs-nav li { + margin: 0 4px 0 0; } + .langTabs.ui-tabs .ui-tabs-nav li a { + padding: 0.3em 0.7em; + font-weight: bold; + outline: none; + font-size: 0.846153846153846em; } + .langTabs.ui-tabs .ui-tabs-nav li.ui-state-active.ui-state-default { + border: 1px solid #fff; + padding-bottom: 0; } + .langTabs.ui-tabs .ui-tabs-nav li.ui-state-active { + background: #fff; } + .langTabs.ui-tabs .ui-tabs-nav li.ui-state-active a { + cursor: default; + background: #fff; + margin: 0; } + .langTabs.ui-tabs .ui-tabs-panel { + padding: 0.9em; + border-top: none; } + .langTabs.ui-tabs .ui-tabs-panel .LanguageSupportLabel { + display: none; } .langTabsToggle { float: right; @@ -53,6 +39,22 @@ .InputfieldStateCollapsed .langTabsToggle { display: none; } +.langTabEmpty a { + opacity: 0.7; + font-weight: normal !important; } + +.langTabs > ul.ui-tabs { + display: none; } + +.hasLangTabs .langTabs > ul.ui-tabs { + display: block; } + +.InputfieldImage .InputfieldFileLink + .langTabsContainer { + margin-top: 0.5em; } + +.hadLanguageSupport > .InputfieldContent > .LanguageSupport { + margin-bottom: 0; } + .langTabsHidden, .hadLanguageSupport .LanguageSupportLabel { display: none; } @@ -63,7 +65,105 @@ right: 1em; display: none; } +/* +.langTabs { + position: relative; + padding: 0; +} + +body.LanguageTabsJqueryUI { + .langTabs > ul { + display: none; + } + + .hasLangTabs .langTabs > ul { + display: block; + } + .pw-content .langTabsContainer, + #content .langTabsContainer { + padding-bottom: 0; + } + + .pw-content .langTabsContainer .InputfieldError, + #content .langTabsContainer .InputfieldError { + margin-bottom: 0; + } + + .langTabs .ui-tabs-nav.ui-widget-header { + padding: 2px 3px 0; + border-bottom: none; + } + .langTabs .ui-tabs-panel { + padding: 0.9em; + border-top: none; + } + .langTabs .ui-tabs-panel .LanguageSupportLabel { + display: none; + + } + .langTabs.ui-tabs .ui-tabs-nav { + margin-bottom: 0; + } + .langTabs.ui-tabs .ui-tabs-nav li { + margin: 0 4px 0 0; + } + .langTabs.ui-tabs .ui-tabs-nav li a { + padding: 0.3em 0.7em; + font-weight: bold; + outline: none; + font-size: 0.846153846153846em; + } + .langTabs.ui-tabs .ui-tabs-nav li.ui-state-active.ui-state-default { + border: 1px solid #fff; + padding-bottom: 0; + } + .langTabs.ui-tabs .ui-tabs-nav li.ui-state-active { + background: #fff; + } + .langTabs.ui-tabs .ui-tabs-nav li.ui-state-active a { + cursor: default; + background: #fff; + margin: 0; + } + .langTabEmpty a { + opacity: 0.7; + font-weight: normal !important; + } + + .InputfieldImage .InputfieldFileLink + .langTabsContainer { + margin-top: 0.5em; + } + + .hadLanguageSupport > .InputfieldContent > .LanguageSupport { + margin-bottom: 0; + } + +} + +.langTabsToggle { + float: right; + margin-right: 1em; +} + +.InputfieldStateCollapsed .langTabsToggle { + display: none; +} + +.langTabsHidden, +.hadLanguageSupport .LanguageSupportLabel { + display: none; +} + +.langTabsNote { + position: absolute; + top: 5px; + right: 1em; + display: none; +} + .langTabs > ul > li { - cursor: pointer; } + cursor: pointer; +} +*/ /*# sourceMappingURL=LanguageTabs.css.map */ diff --git a/wire/modules/LanguageSupport/LanguageTabs.js b/wire/modules/LanguageSupport/LanguageTabs.js index 39a78294..30c763f5 100644 --- a/wire/modules/LanguageSupport/LanguageTabs.js +++ b/wire/modules/LanguageSupport/LanguageTabs.js @@ -39,7 +39,7 @@ function setupLanguageTabs($form) { else $langTabs = $form.find('.langTabs'); $langTabs.each(function() { var $this = $(this); - if($this.hasClass('langTabsInit')) return; + if($this.hasClass('langTabsInit') || $this.hasClass('ui-tabs')) return; var $inputfield = $this.closest('.Inputfield'); var $content = $inputfield.children('.InputfieldContent'); if(!$content.hasClass('langTabsContainer')) { diff --git a/wire/modules/LanguageSupport/LanguageTabs.min.js b/wire/modules/LanguageSupport/LanguageTabs.min.js index 8cbd80ae..86a5b6dc 100644 --- a/wire/modules/LanguageSupport/LanguageTabs.min.js +++ b/wire/modules/LanguageSupport/LanguageTabs.min.js @@ -1 +1 @@ -var clickLanguageTabActive=false;function longclickLanguageTab(c){if(clickLanguageTabActive){return}clickLanguageTabActive=true;var b=$(this);var d=b.attr("data-lang");var a=b.closest("form").find("a.langTab"+d).not(b);b.click();a.click();a.effect("highlight",250);setTimeout(function(){clickLanguageTabActive=false},250)}function setupLanguageTabs(b){var c;var a=ProcessWire.config.LanguageTabs;if(b.hasClass("langTabs")){c=b}else{c=b.find(".langTabs")}c.each(function(){var j=$(this);if(j.hasClass("langTabsInit")){return}var g=j.closest(".Inputfield");var f=g.children(".InputfieldContent");if(!f.hasClass("langTabsContainer")){if(g.find(".langTabsContainer").length==0){f.addClass("langTabsContainer")}}if(a.jQueryUI){j.tabs({active:a.activeTab})}j.addClass("langTabsInit");if(g.length){g.addClass("hasLangTabs")}var i=j.parent(".InputfieldContent");if(i.length){var e=$("<span></span>").attr("title",a.labelOpen).attr("class","langTabsToggle").append("<i class='fa fa-folder-o'></i>");i.prev(".InputfieldHeader").append(e)}var k=j.find("a");var h=null;var d=i.find(".langTabsNote");k.on("mouseover",function(){if(h){clearTimeout(h)}if(i.width()<500){return}h=setTimeout(function(){d.fadeIn("fast")},250)}).on("mouseout",function(){if(h){clearTimeout(h)}if(i.width()<500){return}h=setTimeout(function(){d.fadeOut("fast")},250)}).on("click",function(){var n=$(this);var o=n.closest("ul").siblings(".LanguageSupport");var m=o.filter(".LanguageSupportCurrent");var l=o.filter(n.attr("href"));if(m.attr("id")==l.attr("id")){n.trigger("longclick")}else{m.removeClass("LanguageSupportCurrent");l.addClass("LanguageSupportCurrent")}});if(!a.jQueryUI){k.eq(a.activeTab).click()}})}function toggleLanguageTabs(){var g=$(this);var b=g.closest(".InputfieldHeader");var d=b.next(".InputfieldContent");var f=b.parent(".Inputfield");var e=d.children(".langTabs");var c=e.children("ul");var a=ProcessWire.config.LanguageTabs;if(d.hasClass("langTabsContainer")){c.find("a").click();d.removeClass("langTabsContainer");f.removeClass("hasLangTabs").addClass("langTabsOff");g.addClass("langTabsOff");if(a.jQueryUI){e.tabs("destroy")}else{c.hide()}g.attr("title",ProcessWire.config.LanguageTabs.labelClose).find("i").removeClass("fa-folder-o").addClass("fa-folder-open-o")}else{d.addClass("langTabsContainer");f.addClass("hasLangTabs").removeClass("langTabsOff");g.removeClass("langTabsOff");if(a.jQueryUI){e.tabs()}else{c.show()}$(this).attr("title",a.labelOpen).find("i").addClass("fa-folder-o").removeClass("fa-folder-open-o")}return false}function hideLanguageTabs(){$(".InputfieldContent").each(function(){var c=0;$(this).children(".LanguageSupport").each(function(){if(++c==1){$(this).closest(".Inputfield").addClass("hadLanguageSupport");return}$(this).addClass("langTabsHidden")})});var b=$(".langTabs").find("li:eq(0)");var a=ProcessWire.config.LanguageTabs;if(!b.hasClass(a.liActiveClass)){b.find("a").click()}$(".langTabsToggle, .LanguageSupportLabel:visible, .langTabs > ul").addClass("langTabsHidden");$(".hasLangTabs").removeClass("hasLangTabs").addClass("hadLangTabs")}function unhideLanguageTabs(){$(".langTabsHidden").removeClass("langTabsHidden");$(".hadLangTabs").removeClass("hadLangTabs").addClass("hasLangTabs");$(".hadLanguageSupport").removeClass("hadLanguageSupport")}jQuery(document).ready(function(){$(document).on("click",".langTabsToggle",toggleLanguageTabs);$(document).on("longclick",".langTabs a",longclickLanguageTab);$(document).on("reloaded",".Inputfield",function(){setupLanguageTabs($(this))});$(document).on("AjaxUploadDone",".InputfieldHasFileList .InputfieldFileList",function(){setupLanguageTabs($(this))})}); \ No newline at end of file +var clickLanguageTabActive=false;function longclickLanguageTab(c){if(clickLanguageTabActive){return}clickLanguageTabActive=true;var b=$(this);var d=b.attr("data-lang");var a=b.closest("form").find("a.langTab"+d).not(b);b.click();a.click();a.effect("highlight",250);setTimeout(function(){clickLanguageTabActive=false},250)}function setupLanguageTabs(b){var c;var a=ProcessWire.config.LanguageTabs;if(b.hasClass("langTabs")){c=b}else{c=b.find(".langTabs")}c.each(function(){var j=$(this);if(j.hasClass("langTabsInit")||j.hasClass("ui-tabs")){return}var g=j.closest(".Inputfield");var f=g.children(".InputfieldContent");if(!f.hasClass("langTabsContainer")){if(g.find(".langTabsContainer").length==0){f.addClass("langTabsContainer")}}if(a.jQueryUI){j.tabs({active:a.activeTab})}j.addClass("langTabsInit");if(g.length){g.addClass("hasLangTabs")}var i=j.parent(".InputfieldContent");if(i.length){var e=$("<span></span>").attr("title",a.labelOpen).attr("class","langTabsToggle").append("<i class='fa fa-folder-o'></i>");i.prev(".InputfieldHeader").append(e)}var k=j.find("a");var h=null;var d=i.find(".langTabsNote");k.on("mouseover",function(){if(h){clearTimeout(h)}if(i.width()<500){return}h=setTimeout(function(){d.fadeIn("fast")},250)}).on("mouseout",function(){if(h){clearTimeout(h)}if(i.width()<500){return}h=setTimeout(function(){d.fadeOut("fast")},250)}).on("click",function(){var n=$(this);var o=n.closest("ul").siblings(".LanguageSupport");var m=o.filter(".LanguageSupportCurrent");var l=o.filter(n.attr("href"));if(m.attr("id")==l.attr("id")){n.trigger("longclick")}else{m.removeClass("LanguageSupportCurrent");l.addClass("LanguageSupportCurrent")}});if(!a.jQueryUI){k.eq(a.activeTab).click()}})}function toggleLanguageTabs(){var g=$(this);var b=g.closest(".InputfieldHeader");var d=b.next(".InputfieldContent");var f=b.parent(".Inputfield");var e=d.children(".langTabs");var c=e.children("ul");var a=ProcessWire.config.LanguageTabs;if(d.hasClass("langTabsContainer")){c.find("a").click();d.removeClass("langTabsContainer");f.removeClass("hasLangTabs").addClass("langTabsOff");g.addClass("langTabsOff");if(a.jQueryUI){e.tabs("destroy")}else{c.hide()}g.attr("title",ProcessWire.config.LanguageTabs.labelClose).find("i").removeClass("fa-folder-o").addClass("fa-folder-open-o")}else{d.addClass("langTabsContainer");f.addClass("hasLangTabs").removeClass("langTabsOff");g.removeClass("langTabsOff");if(a.jQueryUI){e.tabs()}else{c.show()}$(this).attr("title",a.labelOpen).find("i").addClass("fa-folder-o").removeClass("fa-folder-open-o")}return false}function hideLanguageTabs(){$(".InputfieldContent").each(function(){var c=0;$(this).children(".LanguageSupport").each(function(){if(++c==1){$(this).closest(".Inputfield").addClass("hadLanguageSupport");return}$(this).addClass("langTabsHidden")})});var b=$(".langTabs").find("li:eq(0)");var a=ProcessWire.config.LanguageTabs;if(!b.hasClass(a.liActiveClass)){b.find("a").click()}$(".langTabsToggle, .LanguageSupportLabel:visible, .langTabs > ul").addClass("langTabsHidden");$(".hasLangTabs").removeClass("hasLangTabs").addClass("hadLangTabs")}function unhideLanguageTabs(){$(".langTabsHidden").removeClass("langTabsHidden");$(".hadLangTabs").removeClass("hadLangTabs").addClass("hasLangTabs");$(".hadLanguageSupport").removeClass("hadLanguageSupport")}jQuery(document).ready(function(){$(document).on("click",".langTabsToggle",toggleLanguageTabs);$(document).on("longclick",".langTabs a",longclickLanguageTab);$(document).on("reloaded",".Inputfield",function(){setupLanguageTabs($(this))});$(document).on("AjaxUploadDone",".InputfieldHasFileList .InputfieldFileList",function(){setupLanguageTabs($(this))})}); \ No newline at end of file diff --git a/wire/modules/LanguageSupport/LanguageTabs.module b/wire/modules/LanguageSupport/LanguageTabs.module index a22da4b9..bd5105e2 100644 --- a/wire/modules/LanguageSupport/LanguageTabs.module +++ b/wire/modules/LanguageSupport/LanguageTabs.module @@ -84,6 +84,7 @@ class LanguageTabs extends WireData implements Module, ConfigurableModule { 'aClass' => '', 'loadStyles' => true, 'loadScripts' => true, + 'tabField' => $this->get('tabField'), ); $settings = $this->wire('config')->get('LanguageTabs'); diff --git a/wire/modules/LanguageSupport/LanguageTabs.scss b/wire/modules/LanguageSupport/LanguageTabs.scss index 55779f87..cea39254 100644 --- a/wire/modules/LanguageSupport/LanguageTabs.scss +++ b/wire/modules/LanguageSupport/LanguageTabs.scss @@ -1,10 +1,105 @@ +.body.LanguageTabsJqueryUI { + .pw-content .langTabsContainer, + #content .langTabsContainer { + // padding-bottom: 0; + } + .pw-content .langTabsContainer .InputfieldError, + #content .langTabsContainer .InputfieldError { + margin-bottom: 0; + } +} + +.langTabs.ui-tabs { + position: relative; + padding: 0; + + .ui-tabs-nav { + margin-bottom: 0; + &.ui-widget-header { + padding: 2px 3px 0; + border-bottom: none; + } + li { + margin: 0 4px 0 0; + a { + padding: 0.3em 0.7em; + font-weight: bold; + outline: none; + font-size: 0.846153846153846em; + } + } + li.ui-state-active.ui-state-default { + border: 1px solid #fff; + padding-bottom: 0; + } + li.ui-state-active { + background: #fff; + a { + cursor: default; + background: #fff; + margin: 0; + } + } + } + + .ui-tabs-panel { + padding: 0.9em; + border-top: none; + .LanguageSupportLabel { + display: none; + } + } +} + +.langTabsToggle { + float: right; + margin-right: 1em; +} + +.InputfieldStateCollapsed .langTabsToggle { + display: none; +} + +.langTabEmpty a { + opacity: 0.7; + font-weight: normal !important; +} + +.langTabs > ul.ui-tabs { + display: none; +} + +.hasLangTabs .langTabs > ul.ui-tabs { + display: block; +} + +.InputfieldImage .InputfieldFileLink + .langTabsContainer { + margin-top: 0.5em; +} + +.hadLanguageSupport > .InputfieldContent > .LanguageSupport { + margin-bottom: 0; +} + +.langTabsHidden, +.hadLanguageSupport .LanguageSupportLabel { + display: none; +} + +.langTabsNote { + position: absolute; + top: 5px; + right: 1em; + display: none; +} +/* .langTabs { position: relative; padding: 0; } -.LanguageTabsJqueryUI { +body.LanguageTabsJqueryUI { .langTabs > ul { display: none; } @@ -97,3 +192,4 @@ .langTabs > ul > li { cursor: pointer; } +*/ diff --git a/wire/modules/Process/ProcessField/ProcessField.css b/wire/modules/Process/ProcessField/ProcessField.css index 52133524..131081bc 100644 --- a/wire/modules/Process/ProcessField/ProcessField.css +++ b/wire/modules/Process/ProcessField/ProcessField.css @@ -4,7 +4,7 @@ margin-bottom: 1em; } -#columnWidthSlider { +.InputfieldColumnWidthSlider { float: left; width: 70%; position: relative; diff --git a/wire/modules/Process/ProcessField/ProcessField.js b/wire/modules/Process/ProcessField/ProcessField.js index a17388b4..84d21b76 100644 --- a/wire/modules/Process/ProcessField/ProcessField.js +++ b/wire/modules/Process/ProcessField/ProcessField.js @@ -34,7 +34,7 @@ $(document).ready(function() { setAsmListItemStatus(); if($columnWidth.size() > 0) { - var $slider = $("<div id='columnWidthSlider'></div>"); + var $slider = $("<div class='InputfieldColumnWidthSlider'></div>"); var columnWidthVal = parseInt($("#columnWidth").val()); $columnWidth.val(columnWidthVal + '%'); $columnWidth.after($slider); diff --git a/wire/modules/Process/ProcessField/ProcessField.min.js b/wire/modules/Process/ProcessField/ProcessField.min.js index 0518f60a..465cd35d 100644 --- a/wire/modules/Process/ProcessField/ProcessField.min.js +++ b/wire/modules/Process/ProcessField/ProcessField.min.js @@ -1 +1 @@ -$(document).ready(function(){var e=function(){$("#field_filter_form").submit()};$("#templates_id").change(e);$("#fieldtype").change(e);$("#show_system").click(e);var b=$("#asmListItemStatus");var d=$("#columnWidth");function a(){var i=b.attr("data-tpl");if(!i){return}var k=$("#Inputfield_showIf").val();var j=$("#Inputfield_required").is(":checked")?true:false;if(k&&k.length>0){i="<i class='fa fa-question-circle'></i>"+i}if(j){i="<i class='fa fa-asterisk'></i>"+i}var h=parseInt(d.val());if(h==100){h=0}if(h>0){h=h+"%"}else{h=""}i=i.replace("%",h);b.val(i)}$("#Inputfield_showIf").change(a);$("#Inputfield_required").change(a);a();if(d.size()>0){var f=$("<div id='columnWidthSlider'></div>");var c=parseInt($("#columnWidth").val());d.val(c+"%");d.after(f);f.slider({range:"min",min:10,max:100,value:parseInt(d.val()),slide:function(i,h){var j=h.value+"%";d.val(j);a()}});d.change(function(){var h=parseInt($(this).val());if(h>100){h=100}if(h<10){h=10}$(this).val(h+"%");f.slider("option","value",h)})}var g=$("#ProcessFieldEdit");if(g.size()>0&&$("li.WireTab").size()>1){g.find("script").remove();g.WireTabs({items:$(".Inputfields li.WireTab"),id:"FieldEditTabs",skipRememberTabIDs:["delete"]})}$("#fieldgroupContextSelect").change(function(){var i=$("#Inputfield_id").val();var j=$(this).val();var h="./edit?id="+i;if(j>0){h+="&fieldgroup_id="+j}window.location=h});$("a.fieldFlag").click(function(){return false});$("#export_data").click(function(){$(this).select()});$(".import_toggle input[type=radio]").change(function(){var h=$(this).parents("p.import_toggle").next("table");var i=$(this).closest(".InputfieldFieldset");if($(this).is(":checked")&&$(this).val()==0){h.hide();i.addClass("ui-priority-secondary")}else{h.show();i.removeClass("ui-priority-secondary")}}).change();$("#wrap_Inputfield_send_templates").find(":input").change(function(){$("#_send_templates_changed").val("changed")});$("#viewRoles_37").click(function(){if($(this).is(":checked")){$("input.viewRoles").attr("checked","checked")}});$("input.viewRoles:not(#viewRoles_37)").click(function(){if($("#viewRoles_37").is(":checked")){return false}return true});$("input.editRoles:not(:disabled)").click(function(){if($(this).is(":checked")){$(this).closest("tr").find("input.viewRoles").attr("checked","checked")}});$(".override-select-all").click(function(){var h=$(this).closest("table").find("input[type=checkbox]");if($(this).hasClass("override-checked")){h.removeAttr("checked");$(this).removeClass("override-checked")}else{h.attr("checked","checked");$(this).addClass("override-checked")}return false})}); \ No newline at end of file +$(document).ready(function(){var e=function(){$("#field_filter_form").submit()};$("#templates_id").change(e);$("#fieldtype").change(e);$("#show_system").click(e);var b=$("#asmListItemStatus");var d=$("#columnWidth");function a(){var i=b.attr("data-tpl");if(!i){return}var k=$("#Inputfield_showIf").val();var j=$("#Inputfield_required").is(":checked")?true:false;if(k&&k.length>0){i="<i class='fa fa-question-circle'></i>"+i}if(j){i="<i class='fa fa-asterisk'></i>"+i}var h=parseInt(d.val());if(h==100){h=0}if(h>0){h=h+"%"}else{h=""}i=i.replace("%",h);b.val(i)}$("#Inputfield_showIf").change(a);$("#Inputfield_required").change(a);a();if(d.size()>0){var f=$("<div class='InputfieldColumnWidthSlider'></div>");var c=parseInt($("#columnWidth").val());d.val(c+"%");d.after(f);f.slider({range:"min",min:10,max:100,value:parseInt(d.val()),slide:function(i,h){var j=h.value+"%";d.val(j);a()}});d.change(function(){var h=parseInt($(this).val());if(h>100){h=100}if(h<10){h=10}$(this).val(h+"%");f.slider("option","value",h)})}var g=$("#ProcessFieldEdit");if(g.size()>0&&$("li.WireTab").size()>1){g.find("script").remove();g.WireTabs({items:$(".Inputfields li.WireTab"),id:"FieldEditTabs",skipRememberTabIDs:["delete"]})}$("#fieldgroupContextSelect").change(function(){var i=$("#Inputfield_id").val();var j=$(this).val();var h="./edit?id="+i;if(j>0){h+="&fieldgroup_id="+j}window.location=h});$("a.fieldFlag").click(function(){return false});$("#export_data").click(function(){$(this).select()});$(".import_toggle input[type=radio]").change(function(){var h=$(this).parents("p.import_toggle").next("table");var i=$(this).closest(".InputfieldFieldset");if($(this).is(":checked")&&$(this).val()==0){h.hide();i.addClass("ui-priority-secondary")}else{h.show();i.removeClass("ui-priority-secondary")}}).change();$("#wrap_Inputfield_send_templates").find(":input").change(function(){$("#_send_templates_changed").val("changed")});$("#viewRoles_37").click(function(){if($(this).is(":checked")){$("input.viewRoles").attr("checked","checked")}});$("input.viewRoles:not(#viewRoles_37)").click(function(){if($("#viewRoles_37").is(":checked")){return false}return true});$("input.editRoles:not(:disabled)").click(function(){if($(this).is(":checked")){$(this).closest("tr").find("input.viewRoles").attr("checked","checked")}});$(".override-select-all").click(function(){var h=$(this).closest("table").find("input[type=checkbox]");if($(this).hasClass("override-checked")){h.removeAttr("checked");$(this).removeClass("override-checked")}else{h.attr("checked","checked");$(this).addClass("override-checked")}return false})}); \ No newline at end of file diff --git a/wire/modules/Process/ProcessPageAdd/ProcessPageAdd.module b/wire/modules/Process/ProcessPageAdd/ProcessPageAdd.module index 915403c0..daef3622 100644 --- a/wire/modules/Process/ProcessPageAdd/ProcessPageAdd.module +++ b/wire/modules/Process/ProcessPageAdd/ProcessPageAdd.module @@ -634,6 +634,7 @@ class ProcessPageAdd extends Process implements ConfigurableModule, WirePageEdit $inputfield = $field->getInputfield($page); if($inputfield) { if($this->template && $this->template->noLang) $inputfield->useLanguages = false; + $inputfield->columnWidth = 100; $form->append($inputfield); } break; @@ -646,6 +647,7 @@ class ProcessPageAdd extends Process implements ConfigurableModule, WirePageEdit // skip it } else { $inputfield = $field->getInputfield($page); + $inputfield->columnWidth = 100; if($inputfield) $form->append($inputfield); } }