diff --git a/.eslintrc.js b/.eslintrc.js index 36ad477a907..141c67f4664 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,41 +1,58 @@ module.exports = { env: { browser: true, - es2021: true, + es2021: true }, extends: [ 'eslint:recommended', - 'airbnb-base', + 'airbnb-base' ], globals: { MODx: 'readonly', Ext: 'readonly', - _: 'readonly', + _: 'readonly' }, ignorePatterns: [ - 'manager/assets/modext/workspace/workspace.panel.js', 'manager/assets/ext3/**/*.js', 'manager/assets/fileapi/**/*.js', 'manager/assets/lib/**/*.js', 'manager/assets/modext/modx.jsgrps-min.js', - 'setup/assets/js/ext-core.js', - 'setup/assets/js/ext-core-debug.js', - ], - overrides: [ + 'setup/assets/js/ext-core-debug.js' ], + overrides: [], parserOptions: { - ecmaVersion: 'latest', + ecmaVersion: 'latest' }, rules: { - // TODO Enable rules gradually - indent: 0, - quotes: ['error', 'single'], - semi: 0, - 'space-before-function-paren': 0, - 'comma-dangle': 0, - 'prefer-arrow-callback': 0, - 'space-before-blocks': 0, - 'object-shorthand': 0, - }, -} + 'arrow-parens': ['error', 'as-needed'], + 'comma-dangle': ['error', 'never'], + 'consistent-return': 0, + curly: ['error', 'all'], + eqeqeq: ['error', 'smart'], + 'func-names': ['warn', 'as-needed'], + indent: ['error', 4, { + VariableDeclarator: 'first', + SwitchCase: 1 + }], + 'max-len': ['warn', { + code: 140, + ignoreComments: true + }], + 'no-continue': 'warn', + 'no-new': 'warn', + 'no-param-reassign': 'warn', + 'no-plusplus': ['error', { + allowForLoopAfterthoughts: true + }], + 'no-underscore-dangle': 'warn', + 'no-unused-vars': ['error', { args: 'none' }], + 'no-use-before-define': ['error', 'nofunc'], + 'object-shorthand': ['error', 'consistent'], + 'one-var': ['error', 'consecutive'], + 'prefer-arrow-callback': 'warn', + 'prefer-rest-params': 'warn', + 'semi-style': ['warn', 'last'], + 'space-before-function-paren': ['error', 'never'] + } +}; diff --git a/core/src/Revolution/Processors/Model/GetListProcessor.php b/core/src/Revolution/Processors/Model/GetListProcessor.php index 0df7face444..f9ff359eb16 100644 --- a/core/src/Revolution/Processors/Model/GetListProcessor.php +++ b/core/src/Revolution/Processors/Model/GetListProcessor.php @@ -48,6 +48,9 @@ public function initialize() $this->setDefaultProperties([ 'start' => 0, 'limit' => 20, + 'isGroupingGrid' => false, + 'groupBy' => null, + 'groupDir' => 'ASC', 'sort' => $this->defaultSortField, 'dir' => $this->defaultSortDirection, 'combo' => false, @@ -187,6 +190,47 @@ public function getSortClassKey() return $this->classKey; } + /** + * Adds additional sortby criteria for grouping grids when the column being + * sorted is different than the one being grouped. Grouping is handled internally by Ext JS, + * so we do not (and should not) use groupby criteria in the query. + * + * @param xPDOQuery $c A reference to the current query being built + * @param string $sortBy The data index of the selected sorting column + * @param string $groupBy The data index of the selected grouping column + * @param string $groupKey The grouping column's fully qualified SQL column name + * @return void + */ + public function setGroupSort(xPDOQuery &$c, string $sortBy, string $groupBy, string $groupKey) + { + /* + When group sort and column sort are the same data index, sort the groups + based on the current column sort direction. Otherwise, add an initial sortby + to specify the group sort; the secondary (sorting within the groups) is subsequently + added later in the getData method. + */ + if ($sortBy === $groupBy || $this->useSecondaryGroupCondition($sortBy, $groupBy, $groupKey)) { + $this->setProperty('groupDir', $this->getProperty('dir')); + } else { + $c->sortby($groupKey, $this->getProperty('groupDir')); + } + } + + /** + * Allows child classes to specify the condition(s) that will trigger the use of an + * alternate sorting routine for use in the grouping grid the child class generates + * data for - defined in setGroupSort(). + * + * @param string $sortBy The data index of the selected sorting column + * @param string $groupBy The data index of the selected grouping column + * @param string $groupKey The grouping column's fully qualified SQL + * @return bool Whether the specified condition/set of conditions passes + */ + public function useSecondaryGroupCondition(string $sortBy, string $groupBy, string $groupKey): bool + { + return false; + } + /** * Can be used to adjust the query prior to the COUNT statement * diff --git a/core/src/Revolution/Processors/Security/Access/UserGroup/AccessNamespace/GetList.php b/core/src/Revolution/Processors/Security/Access/UserGroup/AccessNamespace/GetList.php index 77faee7faeb..10ed7a3fd00 100644 --- a/core/src/Revolution/Processors/Security/Access/UserGroup/AccessNamespace/GetList.php +++ b/core/src/Revolution/Processors/Security/Access/UserGroup/AccessNamespace/GetList.php @@ -57,6 +57,13 @@ public function initialize() if (!empty($userGroup)) { $this->userGroup = $this->modx->getObject(modUserGroup::class, $userGroup); } + /* + Need to sort on the int field (authority) instead of the composite string field + (role_display) to order properly with the format of '[authority] - [role_name]' + */ + if ($this->getProperty('sort') == 'role_display') { + $this->setProperty('sort', 'authority'); + } return $initialized; } @@ -94,15 +101,40 @@ public function prepareQueryAfterCount(xPDOQuery $c) $c->leftJoin(modAccessPolicy::class, 'Policy'); $c->select($this->modx->getSelectColumns(modAccessNamespace::class, 'modAccessNamespace')); $c->select([ - 'name' => 'Target.name', - 'role_name' => 'Role.name', - 'policy_name' => 'Policy.name', - 'policy_data' => 'Policy.data', + 'name' => '`Target`.`name`', + 'policy_name' => '`Policy`.`name`', + 'policy_data' => '`Policy`.`data`', + 'role_display' => 'CONCAT_WS(\' - \',`modAccessNamespace`.`authority`,`Role`.`name`)' ]); - + if ($this->getProperty('isGroupingGrid')) { + $groupBy = $this->getProperty('groupBy'); + $sortBy = $this->getProperty('sort'); + if (!empty($groupBy)) { + switch ($groupBy) { + case 'name': + $groupKey = '`Target`.`name`'; + break; + case 'role_display': + $groupKey = '`modAccessNamespace`.`authority`'; + break; + case 'policy_name': + $groupKey = '`Policy`.`name`'; + break; + default: + $groupKey = '`modAccessNamespace`.`' . $groupBy . '`'; + break; + } + $this->setGroupSort($c, $sortBy, $groupBy, $groupKey); + } + } return $c; } + public function useSecondaryGroupCondition(string $sortBy, string $groupBy, string $groupKey): bool + { + return $sortBy === 'authority' && $groupBy === 'role_display'; + } + /** * @param xPDOObject $object * @return array diff --git a/core/src/Revolution/Processors/Security/Access/UserGroup/Category/GetList.php b/core/src/Revolution/Processors/Security/Access/UserGroup/Category/GetList.php index ee2fa900819..a65e1f1198f 100644 --- a/core/src/Revolution/Processors/Security/Access/UserGroup/Category/GetList.php +++ b/core/src/Revolution/Processors/Security/Access/UserGroup/Category/GetList.php @@ -58,7 +58,13 @@ public function initialize() if (!empty($userGroup)) { $this->userGroup = $this->modx->getObject(modUserGroup::class, $userGroup); } - + /* + Need to sort on the int field (authority) instead of the composite string field + (role_display) to order properly with the format of '[authority] - [role_name]' + */ + if ($this->getProperty('sort') == 'role_display') { + $this->setProperty('sort', 'authority'); + } return $initialized; } @@ -96,15 +102,40 @@ public function prepareQueryAfterCount(xPDOQuery $c) $c->leftJoin(modAccessPolicy::class, 'Policy'); $c->select($this->modx->getSelectColumns(modAccessCategory::class, 'modAccessCategory')); $c->select([ - 'name' => 'Target.category', - 'role_name' => 'Role.name', - 'policy_name' => 'Policy.name', - 'policy_data' => 'Policy.data', + 'name' => '`Target`.`category`', + 'policy_name' => '`Policy`.`name`', + 'policy_data' => '`Policy`.`data`', + 'role_display' => 'CONCAT_WS(\' - \',`modAccessCategory`.`authority`,`Role`.`name`)' ]); - + if ($this->getProperty('isGroupingGrid')) { + $groupBy = $this->getProperty('groupBy'); + $sortBy = $this->getProperty('sort'); + if (!empty($groupBy)) { + switch ($groupBy) { + case 'name': + $groupKey = '`Target`.`category`'; + break; + case 'role_display': + $groupKey = '`modAccessCategory`.`authority`'; + break; + case 'policy_name': + $groupKey = '`Policy`.`name`'; + break; + default: + $groupKey = '`modAccessCategory`.`' . $groupBy . '`'; + break; + } + $this->setGroupSort($c, $sortBy, $groupBy, $groupKey); + } + } return $c; } + public function useSecondaryGroupCondition(string $sortBy, string $groupBy, string $groupKey): bool + { + return $sortBy === 'authority' && $groupBy === 'role_display'; + } + /** * @param xPDOObject|modAccessResourceGroup $object * @return array @@ -116,7 +147,6 @@ public function prepareRow(xPDOObject $object) if (empty($objectArray['name'])) { $objectArray['name'] = '(' . $this->modx->lexicon('none') . ')'; } - $objectArray['authority_name'] = !empty($objectArray['role_name']) ? $objectArray['role_name'] . ' - ' . $objectArray['authority'] : $objectArray['authority']; /* get permissions list */ $data = $objectArray['policy_data']; diff --git a/core/src/Revolution/Processors/Security/Access/UserGroup/Context/GetList.php b/core/src/Revolution/Processors/Security/Access/UserGroup/Context/GetList.php index c9aa91d880b..26ced21f3b9 100644 --- a/core/src/Revolution/Processors/Security/Access/UserGroup/Context/GetList.php +++ b/core/src/Revolution/Processors/Security/Access/UserGroup/Context/GetList.php @@ -56,6 +56,13 @@ public function initialize() if (!empty($userGroup)) { $this->userGroup = $this->modx->getObject(modUserGroup::class, $userGroup); } + /* + Need to sort on the int field (authority) instead of the composite string field + (role_display) to order properly with the format of '[authority] - [role_name]' + */ + if ($this->getProperty('sort') == 'role_display') { + $this->setProperty('sort', 'authority'); + } return $initialized; } @@ -91,13 +98,36 @@ public function prepareQueryAfterCount(xPDOQuery $c) $c->leftJoin(modAccessPolicy::class, 'Policy'); $c->select($this->modx->getSelectColumns(modAccessContext::class, 'modAccessContext')); $c->select([ - 'role_name' => 'Role.name', - 'policy_name' => 'Policy.name', - 'policy_data' => 'Policy.data', + 'policy_name' => '`Policy`.`name`', + 'policy_data' => '`Policy`.`data`', + 'role_display' => 'CONCAT_WS(\' - \',`modAccessContext`.`authority`,`Role`.`name`)' ]); + if ($this->getProperty('isGroupingGrid')) { + $groupBy = $this->getProperty('groupBy'); + $sortBy = $this->getProperty('sort'); + if (!empty($groupBy)) { + switch ($groupBy) { + case 'role_display': + $groupKey = '`modAccessContext`.`authority`'; + break; + case 'policy_name': + $groupKey = '`Policy`.`name`'; + break; + default: + $groupKey = '`modAccessContext`.`' . $groupBy . '`'; + break; + } + $this->setGroupSort($c, $sortBy, $groupBy, $groupKey); + } + } return $c; } + public function useSecondaryGroupCondition(string $sortBy, string $groupBy, string $groupKey): bool + { + return $sortBy === 'authority' && $groupBy === 'role_display'; + } + /** * @param xPDOObject|modAccessContext $object * @return array @@ -109,10 +139,6 @@ public function prepareRow(xPDOObject $object) if (empty($objectArray['name'])) { $objectArray['name'] = '(' . $this->modx->lexicon('none') . ')'; } - $objectArray['authority_name'] = !empty($objectArray['role_name']) - ? $objectArray['role_name'] . ' - ' . $objectArray['authority'] - : $objectArray['authority'] - ; /* get permissions list */ $data = $objectArray['policy_data']; diff --git a/core/src/Revolution/Processors/Security/Access/UserGroup/ResourceGroup/GetList.php b/core/src/Revolution/Processors/Security/Access/UserGroup/ResourceGroup/GetList.php index 770e183747b..2b951b2392a 100644 --- a/core/src/Revolution/Processors/Security/Access/UserGroup/ResourceGroup/GetList.php +++ b/core/src/Revolution/Processors/Security/Access/UserGroup/ResourceGroup/GetList.php @@ -58,7 +58,13 @@ public function initialize() if (!empty($userGroup)) { $this->userGroup = $this->modx->getObject(modUserGroup::class, $userGroup); } - + /* + Need to sort on the int field (authority) instead of the composite string field + (role_display) to order properly with the format of '[authority] - [role_name]' + */ + if ($this->getProperty('sort') == 'role_display') { + $this->setProperty('sort', 'authority'); + } return $initialized; } @@ -96,15 +102,40 @@ public function prepareQueryAfterCount(xPDOQuery $c) $c->leftJoin(modAccessPolicy::class, 'Policy'); $c->select($this->modx->getSelectColumns(modAccessResourceGroup::class, 'modAccessResourceGroup')); $c->select([ - 'name' => 'Target.name', - 'role_name' => 'Role.name', - 'policy_name' => 'Policy.name', - 'policy_data' => 'Policy.data', + 'name' => '`Target`.`name`', + 'policy_name' => '`Policy`.`name`', + 'policy_data' => '`Policy`.`data`', + 'role_display' => 'CONCAT_WS(\' - \',`modAccessResourceGroup`.`authority`,`Role`.`name`)' ]); - + if ($this->getProperty('isGroupingGrid')) { + $groupBy = $this->getProperty('groupBy'); + $sortBy = $this->getProperty('sort'); + if (!empty($groupBy)) { + switch ($groupBy) { + case 'name': + $groupKey = '`Target`.`name`'; + break; + case 'role_display': + $groupKey = '`modAccessResourceGroup`.`authority`'; + break; + case 'policy_name': + $groupKey = '`Policy`.`name`'; + break; + default: + $groupKey = '`modAccessResourceGroup`.`' . $groupBy . '`'; + break; + } + $this->setGroupSort($c, $sortBy, $groupBy, $groupKey); + } + } return $c; } + public function useSecondaryGroupCondition(string $sortBy, string $groupBy, string $groupKey): bool + { + return $sortBy === 'authority' && $groupBy === 'role_display'; + } + /** * @param xPDOObject|modAccessResourceGroup $object * @return array @@ -116,10 +147,6 @@ public function prepareRow(xPDOObject $object) if (empty($objectArray['name'])) { $objectArray['name'] = '(' . $this->modx->lexicon('none') . ')'; } - $objectArray['authority_name'] = !empty($objectArray['role_name']) - ? $objectArray['role_name'] . ' - ' . $objectArray['authority'] - : $objectArray['authority'] - ; /* get permissions list */ $data = $objectArray['policy_data']; diff --git a/core/src/Revolution/Processors/Security/Access/UserGroup/Source/GetList.php b/core/src/Revolution/Processors/Security/Access/UserGroup/Source/GetList.php index b35edd2dd1f..dc3269c4ad9 100644 --- a/core/src/Revolution/Processors/Security/Access/UserGroup/Source/GetList.php +++ b/core/src/Revolution/Processors/Security/Access/UserGroup/Source/GetList.php @@ -57,7 +57,13 @@ public function initialize() if (!empty($userGroup)) { $this->userGroup = $this->modx->getObject(modUserGroup::class, $userGroup); } - + /* + Need to sort on the int field (authority) instead of the composite string field + (role_display) to order properly with the format of '[authority] - [role_name]' + */ + if ($this->getProperty('sort') == 'role_display') { + $this->setProperty('sort', 'authority'); + } return $initialized; } @@ -102,15 +108,40 @@ public function prepareQueryAfterCount(xPDOQuery $c) $c->leftJoin(modAccessPolicy::class, 'Policy'); $c->select($this->modx->getSelectColumns(modAccessMediaSource::class, 'modAccessMediaSource')); $c->select([ - 'name' => 'Target.name', - 'role_name' => 'Role.name', - 'policy_name' => 'Policy.name', - 'policy_data' => 'Policy.data', + 'name' => '`Target`.`name`', + 'policy_name' => '`Policy`.`name`', + 'policy_data' => '`Policy`.`data`', + 'role_display' => 'CONCAT_WS(\' - \',`modAccessMediaSource`.`authority`,`Role`.`name`)' ]); - + if ($this->getProperty('isGroupingGrid')) { + $groupBy = $this->getProperty('groupBy'); + $sortBy = $this->getProperty('sort'); + if (!empty($groupBy)) { + switch ($groupBy) { + case 'name': + $groupKey = '`Target`.`name`'; + break; + case 'role_display': + $groupKey = '`modAccessMediaSource`.`authority`'; + break; + case 'policy_name': + $groupKey = '`Policy`.`name`'; + break; + default: + $groupKey = '`modAccessMediaSource`.`' . $groupBy . '`'; + break; + } + $this->setGroupSort($c, $sortBy, $groupBy, $groupKey); + } + } return $c; } + public function useSecondaryGroupCondition(string $sortBy, string $groupBy, string $groupKey): bool + { + return $sortBy === 'authority' && $groupBy === 'role_display'; + } + /** * @param xPDOObject $object * @return array diff --git a/manager/assets/modext/modx.jsgrps-min.js b/manager/assets/modext/modx.jsgrps-min.js index bd2892cde08..de8b41b6973 100644 --- a/manager/assets/modext/modx.jsgrps-min.js +++ b/manager/assets/modext/modx.jsgrps-min.js @@ -36,7 +36,7 @@ Ext.ns("Ext.ux.form"),Ext.ux.form.FileUploadField=Ext.extend(Ext.form.TextField, * @license TBA (To be announced) * */ -Ext.ux.form.SuperBoxSelect=function(config){Ext.ux.form.SuperBoxSelect.superclass.constructor.call(this,config),this.addEvents("beforeadditem","additem","newitem","beforeremoveitem","removeitem","clear")},Ext.ux.form.SuperBoxSelect=Ext.extend(Ext.ux.form.SuperBoxSelect,Ext.form.ComboBox,{addNewDataOnBlur:!1,allowAddNewData:!1,allowQueryAll:!0,backspaceDeletesLastItem:!0,classField:null,clearBtnCls:"",clearLastQueryOnEscape:!1,clearOnEscape:!1,displayFieldTpl:null,extraItemCls:"",extraItemStyle:"",expandBtnCls:"",fixFocusOnTabSelect:!0,forceFormValue:!0,forceSameValueQuery:!1,itemDelimiterKey:Ext.EventObject.ENTER,navigateItemsWithTab:!0,pinList:!0,preventDuplicates:!0,queryFilterRe:"",queryValuesDelimiter:"|",queryValuesIndicator:"valuesqry",removeValuesFromStore:!0,renderFieldBtns:!0,stackItems:!1,styleField:null,supressClearValueRemoveEvents:!1,validationEvent:"blur",valueDelimiter:",",initComponent:function(){Ext.apply(this,{items:new Ext.util.MixedCollection(!1),usedRecords:new Ext.util.MixedCollection(!1),addedRecords:[],remoteLookup:[],hideTrigger:!0,grow:!1,resizable:!1,multiSelectMode:!1,preRenderValue:null,filteredQueryData:""}),this.queryFilterRe&&Ext.isString(this.queryFilterRe)&&(this.queryFilterRe=new RegExp(this.queryFilterRe)),this.transform&&this.doTransform(),this.forceFormValue&&this.items.on({add:this.manageNameAttribute,remove:this.manageNameAttribute,clear:this.manageNameAttribute,scope:this}),Ext.ux.form.SuperBoxSelect.superclass.initComponent.call(this),"remote"===this.mode&&this.store&&this.store.on("load",this.onStoreLoad,this)},onRender:function(ct,position){var h=this.hiddenName;this.hiddenName=null,Ext.ux.form.SuperBoxSelect.superclass.onRender.call(this,ct,position),this.hiddenName=h,this.manageNameAttribute();var extraClass=!0===this.stackItems?"x-superboxselect-stacked":"";this.renderFieldBtns&&(extraClass+=" x-superboxselect-display-btns"),this.el.removeClass("x-form-text").addClass("x-superboxselect-input-field"),this.wrapEl=this.el.wrap({tag:"ul"}),this.outerWrapEl=this.wrapEl.wrap({tag:"div",cls:"x-form-text x-superboxselect "+extraClass}),this.inputEl=this.el.wrap({tag:"li",cls:"x-superboxselect-input"}),this.renderFieldBtns&&this.setupFieldButtons().manageClearBtn(),this.setupFormInterception()},doTransform:function(){var s=Ext.getDom(this.transform),transformValues=[];if(!this.store){this.mode="local";for(var d=[],opts=s.options,i=0,len=opts.length;i0&&(this.collapse(),(it=this.items.get(0)).el.focus()),!0):e.getKey()===e.BACKSPACE?(e.stopEvent(),this.currentFocus?(toDestroy=this.currentFocus,this.on("expand",(function(){this.collapse()}),this,{single:!0}),idx=this.items.indexOfKey(toDestroy.key),this.clearCurrentFocus(),idx0?(this.el.removeClass(this.emptyClass),this.setRawValue(""),this):(this.rendered&&this.emptyText&&this.getRawValue().length<1&&(this.setRawValue(this.emptyText),this.el.addClass(this.emptyClass)),this)},removeAllItems:function(){return this.items.each((function(item){item.preDestroy(!0)}),this),this.manageClearBtn(),this},killItems:function(){return this.items.each((function(item){item.kill()}),this),this.resetStore(),this.items.clear(),this.manageClearBtn(),this},resetStore:function(){return this.store.clearFilter(),this.removeValuesFromStore?(this.usedRecords.each((function(rec){this.store.add(rec)}),this),this.usedRecords.clear(),this.store.remoteSort||this.store.sort(this.displayField,"ASC"),this):this},sortStore:function(){var ss=this.store.getSortState();return ss&&ss.field&&this.store.sort(ss.field,ss.direction),this},getCaption:function(dataObject){"string"==typeof this.displayFieldTpl&&(this.displayFieldTpl=new Ext.XTemplate(this.displayFieldTpl));var caption,recordData=dataObject instanceof Ext.data.Record?dataObject.data:dataObject;return this.displayFieldTpl?caption=this.displayFieldTpl.apply(recordData):this.displayField&&(caption=recordData[this.displayField]),caption},addRecord:function(record){var display=record.data[this.displayField],caption=this.getCaption(record),val=record.data[this.valueField],cls=this.classField?record.data[this.classField]:"",style=this.styleField?record.data[this.styleField]:"";this.removeValuesFromStore&&(this.usedRecords.add(val,record),this.store.remove(record)),this.addItemBox(val,display,caption,cls,style),this.fireEvent("additem",this,val,record)},createRecord:function(recordData){if(!this.recordConstructor){var recordFields=[{name:this.valueField},{name:this.displayField}];this.classField&&recordFields.push({name:this.classField}),this.styleField&&recordFields.push({name:this.styleField}),this.recordConstructor=Ext.data.Record.create(recordFields)}return new this.recordConstructor(recordData)},addItems:function(newItemObjects){Ext.isArray(newItemObjects)?Ext.each(newItemObjects,(function(item){this.addItem(item)}),this):this.addItem(newItemObjects)},addNewItem:function(newItemObject){this.addItem(newItemObject,!0)},addItem:function(newItemObject,forcedAdd){var val=newItemObject[this.valueField];if(this.disabled)return!1;if(!this.preventDuplicates||!this.hasValue(val)){var record=this.findRecord(this.valueField,val);if(record)this.addRecord(record);else if(this.allowAddNewData){if("remote"===this.mode)return this.remoteLookup.push(newItemObject),void this.doQuery(val,!1,!1,forcedAdd);var rec=this.createRecord(newItemObject);return this.store.add(rec),this.addRecord(rec),!0}}},addItemBox:function(itemVal,itemDisplay,itemCaption,itemClass,itemStyle){var hConfig,itemKey=Ext.id(null,"sbx-item"),box=new Ext.ux.form.SuperBoxSelectItem({owner:this,disabled:this.disabled,renderTo:this.wrapEl,cls:this.extraItemCls+" "+itemClass,style:function(s){var ret="";switch(typeof s){case"function":ret=s.call();break;case"object":for(var p in s)ret+=p+":"+s[p]+";";break;case"string":ret=s+";"}return ret}(this.extraItemStyle)+" "+itemStyle,caption:itemCaption,display:itemDisplay,value:itemVal,key:itemKey,listeners:{remove:function(item){if(!1===this.fireEvent("beforeremoveitem",this,item.value))return!1;this.items.removeKey(item.key),this.removeValuesFromStore&&this.usedRecords.containsKey(item.value)&&(this.store.add(this.usedRecords.get(item.value)),this.usedRecords.removeKey(item.value),this.sortStore(),this.view&&this.view.render()),this.preventMultipleRemoveEvents||this.fireEvent.defer(250,this,["removeitem",this,item.value,this.findInStore(item.value)])},destroy:function(){this.collapse(),this.autoSize().manageClearBtn().validateValue()},scope:this}});box.render(),hConfig={tag:"input",type:"hidden",value:itemVal,name:this.hiddenName||this.name},this.disabled&&Ext.apply(hConfig,{disabled:"disabled"}),box.hidden=this.el.insertSibling(hConfig,"before"),this.items.add(itemKey,box),this.applyEmptyText().autoSize().manageClearBtn().validateValue()},manageClearBtn:function(){if(!this.renderFieldBtns||!this.rendered)return this;var cls="x-superboxselect-btn-hide";return 0===this.items.getCount()?this.buttonClear.addClass(cls):this.buttonClear.removeClass(cls),this},findInStore:function(val){var index=this.store.find(this.valueField,val);return index>-1&&this.store.getAt(index)},getSelectedRecords:function(){var ret=[];if(this.removeValuesFromStore)ret=this.usedRecords.getRange();else{var vals=[];this.items.each((function(item){vals.push(item.value)})),Ext.each(vals,(function(val){ret.push(this.findInStore(val))}),this)}return ret},findSelectedItem:function(el){var ret;return this.items.each((function(item){if(item.el.dom===el)return ret=item,!1})),ret},findSelectedRecord:function(el){var ret,item=this.findSelectedItem(el);return item&&(ret=this.findSelectedRecordByValue(item.value)),ret},findSelectedRecordByValue:function(val){var ret;return this.removeValuesFromStore?this.usedRecords.each((function(rec){if(rec.get(this.valueField)==val)return ret=rec,!1}),this):ret=this.findInStore(val),ret},getValue:function(){var ret=[];return this.items.each((function(item){ret.push(item.value)})),ret.join(this.valueDelimiter)},getCount:function(){return this.items.getCount()},getValueEx:function(){var ret=[];return this.items.each((function(item){var newItem={};newItem[this.valueField]=item.value,newItem[this.displayField]=item.display,this.classField&&(newItem[this.classField]=item.cls||""),this.styleField&&(newItem[this.styleField]=item.style||""),ret.push(newItem)}),this),ret},initValue:function(){Ext.isObject(this.value)||Ext.isArray(this.value)?(this.setValueEx(this.value),this.originalValue=this.getValue()):Ext.ux.form.SuperBoxSelect.superclass.initValue.call(this),"remote"===this.mode&&(this.setOriginal=!0)},addValue:function(value){if(!Ext.isEmpty(value)){var values=value;if(Ext.isArray(value)||(values=(value=""+value).split(this.valueDelimiter)),Ext.each(values,(function(val){var record=this.findRecord(this.valueField,val);record?this.addRecord(record):"remote"===this.mode&&this.remoteLookup.push(val)}),this),"remote"===this.mode){var q=this.remoteLookup.join(this.queryValuesDelimiter);this.doQuery(q,!1,!0)}}},setValue:function(value){this.rendered?(this.removeAllItems().resetStore(),this.remoteLookup=[],this.addValue(value)):this.value=value},setValueEx:function(data){this.rendered?(this.removeAllItems().resetStore(),Ext.isArray(data)||(data=[data]),this.remoteLookup=[],this.allowAddNewData&&"remote"===this.mode?Ext.each(data,(function(d){var r=this.findRecord(this.valueField,d[this.valueField])||this.createRecord(d);this.addRecord(r)}),this):Ext.each(data,(function(item){this.addItem(item)}),this)):this.value=data},hasValue:function(val){var has=!1;return this.items.each((function(item){if(item.value==val)return has=!0,!1}),this),has},onSelect:function(record,index){if(!1!==this.fireEvent("beforeselect",this,record,index)){var val=record.data[this.valueField];if(this.preventDuplicates&&this.hasValue(val))return;this.setRawValue(""),this.lastSelectionText="",!1!==this.fireEvent("beforeadditem",this,val,record,this.filteredQueryData)&&this.addRecord(record),0!==this.store.getCount()&&this.multiSelectMode?this.restrictHeight():this.collapse()}},onDestroy:function(){this.items.purgeListeners(),this.killItems(),this.allowQueryAll&&Ext.destroy(this.buttonExpand),this.renderFieldBtns&&Ext.destroy(this.buttonClear,this.buttonWrap),Ext.destroy(this.inputEl,this.wrapEl,this.outerWrapEl),Ext.ux.form.SuperBoxSelect.superclass.onDestroy.call(this)},autoSize:function(){if(!this.rendered)return this;this.metrics||(this.metrics=Ext.util.TextMetrics.createInstance(this.el));var v=this.el.dom.value,d=document.createElement("div");""===v&&this.emptyText&&this.items.getCount()<1&&(v=this.emptyText),d.appendChild(document.createTextNode(v)),v=d.innerHTML,d=null,v+=" ";var w=Math.max(this.metrics.getWidth(v)+24,24);return void 0!==this._width&&(w=Math.min(this._width,w)),this.el.setWidth(w),Ext.isIE&&(this.el.dom.style.top="0"),this.fireEvent("autosize",this,w),this},shouldQuery:function(q){if(this.lastQuery){var m=q.match("^"+this.lastQuery);return!(m&&!this.store.getCount())||m[0]!==this.lastQuery}return!0},doQuery:function(q,forceAll,valuesQuery,forcedAdd){if(q=Ext.isEmpty(q)?"":q,this.queryFilterRe){this.filteredQueryData="";var m=q.match(this.queryFilterRe);if(m&&m.length&&(this.filteredQueryData=m[0]),!(q=q.replace(this.queryFilterRe,""))&&m)return}var qe={query:q,forceAll,combo:this,cancel:!1};if(!1===this.fireEvent("beforequery",qe)||qe.cancel)return!1;q=qe.query,(!0===(forceAll=qe.forceAll)||q.length>=this.minChars||valuesQuery&&!Ext.isEmpty(q))&&(forcedAdd||this.forceSameValueQuery||this.shouldQuery(q)?(this.lastQuery=q,"local"==this.mode?(this.selectedIndex=-1,forceAll?this.store.clearFilter():this.store.filter(this.displayField,q),this.onLoad()):(this.store.baseParams[this.queryParam]=q,this.store.baseParams[this.queryValuesIndicator]=valuesQuery,this.store.load({params:this.getParams(q)}),forcedAdd||this.expand())):(this.selectedIndex=-1,this.onLoad()))},onStoreLoad:function(store,records,options){var q=options.params[this.queryParam]||store.baseParams[this.queryParam]||"",isValuesQuery=options.params[this.queryValuesIndicator]||store.baseParams[this.queryValuesIndicator];if(this.removeValuesFromStore&&this.store.each((function(record){this.usedRecords.containsKey(record.get(this.valueField))&&this.store.remove(record)}),this),isValuesQuery){var params=q.split(this.queryValuesDelimiter);Ext.each(params,(function(p){this.remoteLookup.remove(p);var rec=this.findRecord(this.valueField,p);rec&&this.addRecord(rec)}),this),this.setOriginal&&(this.setOriginal=!1,this.originalValue=this.getValue())}""!==q&&this.allowAddNewData&&Ext.each(this.remoteLookup,(function(r){if("object"==typeof r&&r[this.valueField]===q){if(this.remoteLookup.remove(r),records.length&&records[0].get(this.valueField)===q)return void this.addRecord(records[0]);var rec=this.createRecord(r);return this.store.add(rec),this.addRecord(rec),this.addedRecords.push(rec),void function(){this.isExpanded()&&this.collapse()}.defer(10,this)}}),this);var toAdd=[];if(""===q)Ext.each(this.addedRecords,(function(rec){this.preventDuplicates&&this.usedRecords.containsKey(rec.get(this.valueField))||toAdd.push(rec)}),this);else{var re=new RegExp(Ext.escapeRe(q)+".*","i");Ext.each(this.addedRecords,(function(rec){this.preventDuplicates&&this.usedRecords.containsKey(rec.get(this.valueField))||re.test(rec.get(this.displayField))&&toAdd.push(rec)}),this)}this.store.add(toAdd),this.sortStore(),0===this.store.getCount()&&this.isExpanded()&&this.collapse()}}),Ext.reg("superboxselect",Ext.ux.form.SuperBoxSelect),Ext.ux.form.SuperBoxSelectItem=function(config){Ext.apply(this,config),Ext.ux.form.SuperBoxSelectItem.superclass.constructor.call(this)},Ext.ux.form.SuperBoxSelectItem=Ext.extend(Ext.ux.form.SuperBoxSelectItem,Ext.Component,{initComponent:function(){Ext.ux.form.SuperBoxSelectItem.superclass.initComponent.call(this)},onElClick:function(e){var o=this.owner;if(o.clearCurrentFocus().collapse(),o.navigateItemsWithTab)this.focus();else{o.el.dom.focus();(function(){this.onLnkFocus(),o.currentFocus=this}).defer(10,this)}},onLnkClick:function(e){e&&e.stopEvent(),this.preDestroy(),this.owner.navigateItemsWithTab||this.owner.el.focus()},onLnkFocus:function(){this.el.addClass("x-superboxselect-item-focus"),this.owner.outerWrapEl.addClass("x-form-focus")},onLnkBlur:function(){this.el.removeClass("x-superboxselect-item-focus"),this.owner.outerWrapEl.removeClass("x-form-focus")},enableElListeners:function(){this.el.on("click",this.onElClick,this,{stopEvent:!0}),this.el.addClassOnOver("x-superboxselect-item x-superboxselect-item-hover")},enableLnkListeners:function(){this.lnk.on({click:this.onLnkClick,focus:this.onLnkFocus,blur:this.onLnkBlur,scope:this})},enableAllListeners:function(){this.enableElListeners(),this.enableLnkListeners()},disableAllListeners:function(){this.el.removeAllListeners(),this.lnk.un("click",this.onLnkClick,this),this.lnk.un("focus",this.onLnkFocus,this),this.lnk.un("blur",this.onLnkBlur,this)},onRender:function(ct,position){Ext.ux.form.SuperBoxSelectItem.superclass.onRender.call(this,ct,position);var el=this.el;el&&el.remove(),this.el=el=ct.createChild({tag:"li"},ct.last()),el.addClass("x-superboxselect-item");var btnEl=this.owner.navigateItemsWithTab?"a":"span";this.key;Ext.apply(el,{focus:function(){var c=this.down(btnEl+".x-superboxselect-item-close");c&&c.focus()},preDestroy:function(){this.preDestroy()}.createDelegate(this)}),this.enableElListeners(),el.update(this.caption);var cfg={tag:btnEl,class:"x-superboxselect-item-close",tabIndex:this.owner.navigateItemsWithTab?"0":"-1"};"a"===btnEl&&(cfg.href="#"),this.lnk=el.createChild(cfg),this.disabled?this.disableAllListeners():this.enableLnkListeners(),this.on({disable:this.disableAllListeners,enable:this.enableAllListeners,scope:this}),this.setupKeyMap()},setupKeyMap:function(){this.keyMap=new Ext.KeyMap(this.lnk,[{key:[Ext.EventObject.BACKSPACE,Ext.EventObject.DELETE,Ext.EventObject.SPACE],fn:this.preDestroy,scope:this},{key:[Ext.EventObject.RIGHT,Ext.EventObject.DOWN],fn:function(){this.moveFocus("right")},scope:this},{key:[Ext.EventObject.LEFT,Ext.EventObject.UP],fn:function(){this.moveFocus("left")},scope:this},{key:[Ext.EventObject.HOME],fn:function(){var l=this.owner.items.get(0).el.focus();l&&l.el.focus()},scope:this},{key:[Ext.EventObject.END],fn:function(){this.owner.el.focus()},scope:this},{key:Ext.EventObject.ENTER,fn:function(){}}]),this.keyMap.stopEvent=!0},moveFocus:function(dir){var el=this.el["left"==dir?"prev":"next"]()||this.owner.el;el.focus.defer(100,el)},preDestroy:function(supressEffect){if(!1!==this.fireEvent("remove",this)){var actionDestroy=function(){this.owner.navigateItemsWithTab&&this.moveFocus("right"),this.hidden.remove(),this.hidden=null,this.destroy()};return supressEffect?actionDestroy.call(this):this.el.hide({duration:.2,callback:actionDestroy,scope:this}),this}},kill:function(){this.hidden.remove(),this.hidden=null,this.purgeListeners(),this.destroy()},onDisable:function(){this.hidden&&this.hidden.dom.setAttribute("disabled","disabled"),this.keyMap.disable(),Ext.ux.form.SuperBoxSelectItem.superclass.onDisable.call(this)},onEnable:function(){this.hidden&&this.hidden.dom.removeAttribute("disabled"),this.keyMap.enable(),Ext.ux.form.SuperBoxSelectItem.superclass.onEnable.call(this)},onDestroy:function(){Ext.destroy(this.lnk,this.el),Ext.ux.form.SuperBoxSelectItem.superclass.onDestroy.call(this)}}),MODx.Component=function(config){config=config||{},MODx.Component.superclass.constructor.call(this,config),this.config=config,this._loadForm(),this.config.tabs&&this._loadTabs(),this._loadComponents(),this._loadActionButtons(),MODx.activePage=this},Ext.extend(MODx.Component,Ext.Component,{fields:{},form:null,action:!1,_loadForm:function(){if(!this.config.form)return!1;if(this.form=new Ext.form.BasicForm(Ext.get(this.config.form),{errorReader:MODx.util.JSONReader}),this.config.fields)for(var i in this.config.fields)if(this.config.fields.hasOwnProperty(i)){var f=this.config.fields[i];f.xtype&&(f=Ext.ComponentMgr.create(f)),this.fields[i]=f,this.form.add(f)}return this.form.render()},_loadActionButtons:function(){return!!this.config.buttons&&(this.ab=MODx.load({xtype:"modx-actionbuttons",form:this.form||null,formpanel:this.config.formpanel||null,actions:this.config.actions||null,items:this.config.buttons||[]}),this.ab)},_loadTabs:function(){if(!this.config.tabs)return!1;var o=this.config.tabOptions||{};return Ext.applyIf(o,{xtype:"modx-tabs",renderTo:this.config.tabs_div||"tabs_div",items:this.config.tabs}),MODx.load(o)},_loadComponents:function(){if(!this.config.components)return!1;for(var l=this.config.components.length,cp=Ext.getCmp("modx-content"),i=0;i","<-",""," "];if(-1!=ex.indexOf(el)||el.xtype&&"switch"==el.xtype)MODx.toolbar.ActionButtons.superclass.add.call(this,el);else{var id=el.id||Ext.id();if(Ext.applyIf(el,{xtype:"button",cls:el.icon?"x-btn-icon bmenu":"x-btn-text bmenu",scope:this,disabled:!!el.checkDirty,listeners:{},id}),el.button&&MODx.toolbar.ActionButtons.superclass.add.call(this,el),null===el.handler&&null===el.menu?el.handler=this.checkConfirm:el.confirm&&el.handler?el.handler=function(){Ext.Msg.confirm(_("warning"),el.confirm,(function(e){"yes"===e&&Ext.callback(el.handler,this)}),el.scope||this)}:el.handler||(el.handler=this.handleClick),el.javascript&&(el.listeners.click={fn:this.evalJS,scope:this}),"button"==el.xtype&&(el.listeners.render={fn:function(btn){el.checkDirty&&btn&&this.checkDirtyBtns.push(btn)},scope:this}),el.keys){el.keyMap=new Ext.KeyMap(Ext.get(document));for(var j=0;j{item&&item.validate&&!item.validate()&&(isv=!1)})),isv?(Ext.applyIf(o.params,{action:itm.process}),Ext.apply(f.baseParams,o.params),o.form.on("success",(function(r){if(o.form.clearDirty&&o.form.clearDirty(),MODx.msg.status({title:_("success"),message:r.result.message||_("save_successful"),dontHide:""!=r.result.message}),0!=itm.redirect){var redirect=this.redirect;"function"==typeof itm.redirect&&(redirect=itm.redirect),Ext.callback(redirect,this,[o,itm,r.result],1e3)}this.resetDirtyButtons(r.result)}),this),o.form.submit({headers:{"Powered-By":"MODx",modAuth:MODx.siteId}})):(o.form.fireEvent("failureSubmit"),Ext.Msg.alert(_("error"),_("correct_errors")))}else{var params=itm.params||{};Ext.applyIf(params,o.baseParams||{}),MODx.loadPage("?"+Ext.urlEncode(params))}return!1},resetDirtyButtons:function(r){for(var i=0;i0}},contextmenu:{fn:this._showContextMenu,scope:this}}),Ext.applyIf(config,{store:this.store,singleSelect:!0,overClass:"x-view-over",emptyText:'
'+_("file_err_filter")+"
",closeAction:"hide"}),MODx.DataView.superclass.constructor.call(this,config),this.config=config,this.cm=new Ext.menu.Menu},Ext.extend(MODx.DataView,Ext.DataView,{lookup:{},onLoadException:function(){this.getEl().update('
'+_("data_err_load")+"
")},_addContextMenuItem:function(items){for(var a=items,l=a.length,i=0;i ').compile()}),MODx.Button.superclass.constructor.call(this,config)},Ext.extend(MODx.Button,Ext.Button,{onRender:function(ct,position){this.template||(Ext.Button.buttonTemplate||(Ext.Button.buttonTemplate=new Ext.Template(' '),Ext.Button.buttonTemplate.compile()),this.template=Ext.Button.buttonTemplate);var btn,targs=this.getTemplateArgs();targs.iconCls=this.iconCls,btn=position?this.template.insertBefore(position,targs,!0):this.template.append(ct,targs,!0),this.btnEl=btn.child("i"),this.mon(this.btnEl,{scope:this,focus:this.onFocus,blur:this.onBlur}),this.initButtonEl(btn,this.btnEl),Ext.ButtonToggleMgr.register(this)}}),Ext.reg("modx-button",MODx.Button),MODx.SearchBar=function(config){config=config||{},Ext.applyIf(config,{renderTo:"modx-manager-search",listClass:"modx-manager-search-results",emptyText:_("search"),id:"modx-uberbar",maxHeight:this.getViewPortSize(),typeAhead:!0,listAlign:["tl-bl?",[-12,12]],triggerConfig:{tag:"button",id:"modx-uberbar-trigger",type:"submit","aria-label":"Go",cls:"x-form-trigger icon icon-large icon-search"},defaultAutoCreate:{tag:"input",type:"text",size:"24",tabindex:"0",hasfocus:!0,"aria-label":_("search")},hasfocus:!0,minChars:1,displayField:"name",valueField:"_action",width:380,itemSelector:".x-combo-list-item",tpl:new Ext.XTemplate('','
','','',"

{label:htmlEncode}

","
",'

{name:htmlEncode} – {description:htmlEncode}

',"
","
",{getClass:function(values){if(values.icon)return values.icon;if(values.class)switch(values.class){case"MODX\\Revolution\\modDocument":return"file";case"MODX\\Revolution\\modSymLink":return"files-o";case"MODX\\Revolution\\modWebLink":return"link";case"MODX\\Revolution\\modStaticResource":return"file-text-o"}switch(values.type){case"resources":return"file";case"chunks":return"th-large";case"templates":return"columns";case"snippets":return"code";case"tvs":return"list-alt";case"plugins":return"cogs";case"users":return"user";case"actions":return"mail-forward"}},getLabel:function(values){return values.label?values.label:_("search_resulttype_"+values.type)}}),store:new Ext.data.JsonStore({url:MODx.config.connector_url,baseParams:{action:"Search/Search"},root:"results",totalProperty:"total",fields:["name","_action","description","type","icon","label","class"],listeners:{beforeload:function(store,options){if(options.params._action)return!1}}}),listeners:{beforequery:{fn:function(){this.tpl.type=null}},focus:this.focusBar,blur:this.blurBar,afterrender:function(){document.getElementById("modx-manager-search").onclick=function(e){e.stopPropagation()}},scope:this}}),MODx.SearchBar.superclass.constructor.call(this,config),this.blur(),this.setKeyMap()},Ext.extend(MODx.SearchBar,Ext.form.ComboBox,{setKeyMap:function(){new Ext.KeyMap(document,{key:27,handler:function(){this.hideBar()},scope:this,stopEvent:!1})},initList:function(){if(!this.list){var cls="x-combo-list",listParent=Ext.getDom(this.getListParent()||Ext.getBody());this.list=new Ext.Layer({parentEl:listParent,shadow:this.shadow,cls:[cls,this.listClass].join(" "),constrain:!1,zindex:this.getZIndex(listParent)}),this.list.on("click",(function(e){e.stopPropagation()}));var lw=this.listWidth||Math.max(this.wrap.getWidth(),this.minListWidth);this.list.setSize(lw,0),this.list.swallowEvent("mousewheel"),this.assetHeight=0,!1!==this.syncFont&&this.list.setStyle("font-size",this.el.getStyle("font-size")),this.title&&(this.header=this.list.createChild({cls:cls+"-hd",html:this.title}),this.assetHeight+=this.header.getHeight()),this.innerList=this.list.createChild({cls:cls+"-inner"}),this.mon(this.innerList,"mouseover",this.onViewOver,this),this.mon(this.innerList,"mousemove",this.onViewMove,this),this.innerList.setWidth(lw-this.list.getFrameWidth("lr")),this.pageSize&&(this.footer=this.list.createChild({cls:cls+"-ft"}),this.pageTb=new Ext.PagingToolbar({store:this.store,pageSize:this.pageSize,renderTo:this.footer}),this.assetHeight+=this.footer.getHeight()),this.tpl||(this.tpl='
{'+this.displayField+"}
"),this.view=new Ext.DataView({applyTo:this.innerList,tpl:this.tpl,singleSelect:!0,selectedClass:this.selectedClass,itemSelector:this.itemSelector||"."+cls+"-item",emptyText:this.listEmptyText,deferEmptyText:!1}),this.view.on("click",(function(view,index,node,vent){view.select(node),window.event||(window.event=vent),this.onViewClick()}),this),this.bindStore(this.store,!0),this.resizable&&(this.resizer=new Ext.Resizable(this.list,{pinned:!0,handles:"se"}),this.mon(this.resizer,"resize",(function(r,w,h){this.maxHeight=h-this.handleHeight-this.list.getFrameWidth("tb")-this.assetHeight,this.listWidth=w,this.innerList.setWidth(w-this.list.getFrameWidth("lr")),this.restrictHeight()}),this),this[this.pageSize?"footer":"innerList"].setStyle("margin-bottom",this.handleHeight+"px"))}},onTypeAhead:function(){},onSelect:function(record,index){var e=Ext.EventObject;e.stopPropagation(),e.preventDefault();var target="?a="+record.data._action;if(e.ctrlKey||e.metaKey||e.shiftKey)return window.open(target);MODx.loadPage(target)},hideBar:function(){},focusBar:function(){this.selectText()},blurBar:function(){},getViewPortSize:function(){var height=300;return void 0!==window.innerHeight&&(height=window.innerHeight),height-70}}),Ext.reg("modx-searchbar",MODx.SearchBar),Ext.namespace("MODx.panel"),MODx.Panel=function(config){config=config||{},Ext.applyIf(config,{cls:"modx-panel",title:""}),MODx.Panel.superclass.constructor.call(this,config),this.config=config},Ext.extend(MODx.Panel,Ext.Panel),Ext.reg("modx-panel",MODx.Panel),MODx.FormPanel=function(config){config=config||{},Ext.applyIf(config,{autoHeight:!0,collapsible:!0,bodyStyle:"",layout:"anchor",border:!1,header:!1,method:"POST",cls:"modx-form",allowDrop:!0,errorReader:MODx.util.JSONReader,checkDirty:!0,useLoadingMask:!1,defaults:{collapsible:!1,autoHeight:!0,border:!1}}),config.items&&this.addChangeEvent(config.items),MODx.FormPanel.superclass.constructor.call(this,config),this.config=config,this.addEvents({setup:!0,fieldChange:!0,ready:!0,beforeSubmit:!0,success:!0,failure:!0,save:!0,actionNew:!0,actionContinue:!0,actionClose:!0,postReady:!0}),this.getForm().addEvents({success:!0,failure:!0}),this.dropTargets=[],this.on("ready",this.onReady),this.config.useLoadingMask&&this.on("render",(function(){this.mask=new Ext.LoadMask(this.getEl()),this.mask.show()})),this.fireEvent("setup",config)&&this.clearDirty(),this.focusFirstField()},Ext.extend(MODx.FormPanel,Ext.FormPanel,{isReady:!1,defaultValues:[],initialized:!1,isStatic:!1,errorHandlingTabs:[],errorHandlingIgnoreTabs:[],submit:function(o){var fm=this.getForm();return!(!fm.isValid()&&!o.bypassValidCheck)&&((o=o||{}).headers={"Powered-By":"MODx",modAuth:MODx.siteId},this.fireEvent("beforeSubmit",{form:fm,options:o,config:this.config})&&fm.submit({waitMsg:this.config.saveMsg||_("saving"),scope:this,headers:o.headers,clientValidation:!o.bypassValidCheck,failure:function(f,a){this.fireEvent("failure",{form:f,result:a.result,options:o,config:this.config})&&MODx.form.Handler.errorExt(a.result,f)},success:function(f,a){this.config.success&&Ext.callback(this.config.success,this.config.scope||this,[f,a]),this.fireEvent("success",{form:f,result:a.result,options:o,config:this.config}),this.clearDirty(),this.fireEvent("setup",this.config);var lastActiveEle=Ext.state.Manager.get("curFocus");if(lastActiveEle&&""!=lastActiveEle){Ext.state.Manager.clear("curFocus");var initFocus=document.getElementById(lastActiveEle);initFocus&&initFocus.focus()}}}),!0)},failure:function(o){if(this.warnUnsavedChanges=!0,-1!==this.getForm().baseParams.action.search(/\/create/i)){const btn=Ext.getCmp("modx-abtn-save");btn&&btn.enable()}this.fireEvent("failureSubmit")},focusFirstField:function(){if(this.getForm().items.getCount()>0){var fld=this.findFirstTextField();fld&&fld.focus(!1,200)}},findFirstTextField:function(i){i=i||0;var fld=this.getForm().items.itemAt(i);return!!fld&&((fld.isXType("combo")||fld.isXType("checkbox")||fld.isXType("radio")||fld.isXType("displayfield")||fld.isXType("statictextfield")||fld.isXType("hidden"))&&(i+=1,fld=this.findFirstTextField(i)),fld)},addChangeEvent:function(items){if(!items)return!1;"object"==typeof items&&items.items&&(items=items.items);for(var f=0;f{fieldKey=fieldKey.trim();const fieldCmpId=`modx-${formId}-${fieldKey}-file`,sourceKey=Ext.isEmpty(sharedSourceKey)?fieldKey:sharedSourceKey,sourceCmpId=`modx-${formId}-${sourceKey}-source`,fieldCmp=Ext.getCmp(fieldCmpId),sourceCmp=Ext.getCmp(sourceCmpId);fieldCmp&&sourceCmp&&(fieldCmp.config.source=sourceCmp.getValue())}))},destroy:function(){for(var i=0;i0&&keys.forEach((function(key){map.hasOwnProperty(key)&&"string"==typeof map[key].id?tabIds.push(map[key].id):"modx-panel-resource-tv"==key&&1==MODx.config.tvs_below_content&&tabIds.push(key)})),tabIds},showErroredTab:function(targetForms,tabsId){const mainTabs=Ext.getCmp(tabsId),searchTabs=this.getTabIdsFromKeys(mainTabs.items.map,targetForms);let component,mainTabName=null,mainTabIndex=null,erroredNode=null;mainTabs.items.length>mainTabs.initialConfig.items.length&&mainTabs.items.keys.forEach((function(key){mainTabs.items.map[key].hasOwnProperty("id")&&(this.errorHandlingIgnoreTabs.includes(mainTabs.items.map[key].id)||searchTabs.includes(mainTabs.items.map[key].id)||searchTabs.push(mainTabs.items.map[key].id))}),this);for(let i=0;i0&&erroredFlds[0].id},insertTagCopyUtility:function(cmp,elType){const helpTag=cmp.getEl().child(".example-replace-name"),elTag=cmp.getEl().child(".copy-this");let tagText,nameVal=cmp.previousSibling().getValue();helpTag&&(nameVal.length>0&&(helpTag.update(nameVal),tagText=elTag.dom.innerText),helpTag.on({click:function(){if(nameVal=cmp.previousSibling().getValue(),nameVal.length>0){tagText=elTag.dom.innerText;const tmp=document.createElement("textarea");if(tmp.value=tagText,document.body.appendChild(tmp),tmp.select(),document.execCommand("copy")){const feedback=document.createElement("span");feedback.className="element-panel feedback item-copied",feedback.textContent=_(elType+"_tag_copied"),elTag.insertSibling(feedback,"after"),setTimeout((function(){feedback.style.opacity=0,setTimeout((function(){feedback.remove()}),1200)}),10)}tmp.remove()}}}))},onChangeStaticSource:function(cmp,elType){const isStatic=Ext.getCmp(`modx-${elType}-static`).getValue(),staticFileField=Ext.getCmp(`modx-${elType}-static-file`),staticFile=staticFileField.getValue(),staticDir=staticFile.slice(0,staticFile.lastIndexOf("/")+1),staticFileFieldId=staticFileField.id,staticFileFieldContainer=Ext.getCmp(staticFileField.ownerCt.id),itemKey=staticFileFieldContainer.items.keys.indexOf(staticFileFieldId),previousSource=this.previousFileSource||0,currentSource=cmp.getValue(),currentRecord={static:isStatic,static_file:staticFile,source:currentSource,openTo:staticDir};let newStaticFile,changeFieldType=!1,updateFieldSource=!1;if("template"===elType)var newPreviewFileField,staticPreviewFileField=Ext.getCmp(`modx-${elType}-preview-file`),staticPreviewFile=staticPreviewFileField.getValue(),staticPreviewDir=staticPreviewFile.slice(0,staticPreviewFile.lastIndexOf("/")+1),staticPreviewFileFieldId=staticPreviewFileField.id,staticPreviewFileFieldContainer=Ext.getCmp(staticPreviewFileField.ownerCt.id),previewItemKey=staticPreviewFileFieldContainer.items.keys.indexOf(staticPreviewFileFieldId),currentPreviewRecord={static:isStatic,preview_file:staticPreviewFile,source:currentSource,openTo:staticPreviewDir};this.previousFileSource=currentSource,previousSource>0&&0==currentSource?(newStaticFile=this.getStaticFileField(elType,currentRecord,!1),"template"===elType&&(newPreviewFileField=this.getTemplatePreviewImageField(currentPreviewRecord,!1)),changeFieldType=!0):0==previousSource&¤tSource>0?(newStaticFile=this.getStaticFileField(elType,currentRecord),"template"===elType&&(newPreviewFileField=this.getTemplatePreviewImageField(currentPreviewRecord)),changeFieldType=!0,updateFieldSource=!0):updateFieldSource=!0,updateFieldSource&&(changeFieldType?(newStaticFile.source=currentSource,"template"===elType&&(newPreviewFileField.source=currentSource)):(staticFileField.config.source=currentSource,"template"===elType&&(staticPreviewFileField.config.source=currentSource))),changeFieldType&&(staticFileField.clearInvalid(),staticFileField.destroy(),staticFileFieldContainer.insert(itemKey,newStaticFile),"template"===elType&&(staticPreviewFileField.clearInvalid(),staticPreviewFileField.destroy(),staticPreviewFileFieldContainer.insert(previewItemKey,newPreviewFileField)),this.doLayout())},getStaticFileField:function(elType,record,loadBrowserField=!0){const sharedConfig={fieldLabel:_("static_file"),description:MODx.expandHelp?"":_("static_file_desc"),name:"static_file",id:`modx-${elType}-static-file`,maxLength:255,anchor:"100%",value:record.static_file||""};let finalConfig;return(0===record.source||!record.hasOwnProperty("source")&&Ext.isEmpty(MODx.config.default_media_source))&&(loadBrowserField=!1),finalConfig=loadBrowserField?Object.assign(sharedConfig,{xtype:"modx-combo-browser",browserEl:"modx-browser",triggerClass:"x-form-code-trigger",source:null!=record.source?record.source:MODx.config.default_media_source,openTo:record.openTo||""}):Object.assign(sharedConfig,{xtype:"textfield"}),record.static||(finalConfig.hidden=!0),finalConfig},getTemplatePreviewImageField:function(record,loadBrowserField=!0){const sharedConfig={fieldLabel:_("template_preview"),description:MODx.expandHelp?"":_("template_preview_description"),name:"preview_file",id:"modx-template-preview-file",allowedFileTypes:"jpg,jpeg,png,gif,bmp",maxLength:255,anchor:"100%",value:record.preview_file||""};let finalConfig;return(0===record.source||!record.hasOwnProperty("source")&&Ext.isEmpty(MODx.config.default_media_source))&&(loadBrowserField=!1),finalConfig=loadBrowserField?Object.assign(sharedConfig,{xtype:"modx-combo-browser",browserEl:"modx-browser",triggerClass:"x-form-image-trigger",source:null!=record.source?record.source:MODx.config.default_media_source,openTo:record.openTo||""}):Object.assign(sharedConfig,{xtype:"textfield"}),finalConfig},toggleFieldVisibility:function(ctrlId,containerId,fieldIds,ctrlValToShow,addSibling){const ctrlCmp=Ext.getCmp(ctrlId),containerCmp=Ext.getCmp(containerId);if(!ctrlCmp||void 0===ctrlCmp)return console.error(`toggleFieldVisibility: Could not get the control component with the id '${ctrlId}'`),!1;if(containerId&&(!containerCmp||void 0===containerCmp))return console.error(`toggleFieldVisibility: Could not get the container component with the id '${containerId}'`),!1;addSibling=!1!==addSibling,ctrlValToShow=!1!==ctrlValToShow;const showVal="combo-boolean"===ctrlCmp.xtype?ctrlCmp.getValue():ctrlCmp.checked,show=!1===ctrlValToShow?!showVal:showVal;show?(containerCmp.show(),containerCmp.doLayout()):containerCmp.hide(),fieldIds.forEach((field=>{const fieldCmp=Ext.getCmp(field),sibling=fieldCmp.nextSibling(),siblingIsHelp=sibling&&"label"===sibling.xtype;fieldCmp&&(show?(fieldCmp.show(),addSibling&&siblingIsHelp&&sibling.show()):(fieldCmp.hide(),addSibling&&siblingIsHelp&&sibling.hide()))}))},formatMainPanelTitle:function(formId,record,realtimeValue=null,returnBaseTitle=!1){let title="",baseTitle="";const modeCreate=!(record.hasOwnProperty("id")&&record.id>0),prefixSeparator=modeCreate&&!realtimeValue?"":": ",prefix=(modeCreate?_("create")+" ":_("edit")+" ")+_("resource"===formId?"document":formId)+prefixSeparator;if(!Ext.isEmpty(record)){const postfix=MODx.perm.tree_show_resource_ids&&!Ext.isEmpty(record.id)?` (${record.id})`:"";if("resource"===formId){const headerCmp=Ext.getCmp("modx-header-breadcrumbs");title=realtimeValue||record.pagetitle,baseTitle=this.encodeTitle(title,!1),title=void 0===title?prefix:this.encodeTitle(title)+postfix,headerCmp?headerCmp.updateHeader(title):Ext.getCmp("modx-resource-header").el.dom.innerText=title}else{const headerCmpId=`modx-${formId}-header`;realtimeValue?baseTitle=this.encodeTitle(realtimeValue):(title="template"===formId?record.templatename:record.name,baseTitle=this.encodeTitle(title)),title=void 0===title?prefix:prefix+baseTitle+postfix,Ext.getCmp(headerCmpId).getEl().update(title)}}if(returnBaseTitle)return baseTitle},encodeTitle:function(title,htmlEncode=!0){return title&&(title=htmlEncode?Ext.util.Format.htmlEncode(Ext.util.Format.stripTags(title)):Ext.util.Format.stripTags(title)),title},getElementProperties:function(properties){if(!Ext.isEmpty(properties)){const gridCmp=Ext.getCmp("modx-grid-element-properties");gridCmp&&(gridCmp.defaultProperties=properties,gridCmp.getStore().loadData(properties))}}}),Ext.reg("modx-formpanel",MODx.FormPanel),MODx.panel.Wizard=function(config){config=config||{},Ext.applyIf(config,{layout:"card",activeItem:0,resizable:!0,collapsible:!0,maximizable:!0,autoHeight:!0,width:750,firstPanel:"",lastPanel:"",defaults:{border:!1},modal:!0,txtFinish:_("finish"),txtNext:_("next"),txtBack:_("back"),bbar:[{id:"pi-btn-bck",itemId:"btn-back",text:config.txtBack||_("back"),handler:this.navHandler.createDelegate(this,[-1]),scope:this,disabled:!0},{id:"pi-btn-fwd",itemId:"btn-fwd",text:config.txtNext||_("next"),handler:this.navHandler.createDelegate(this,[1]),scope:this}]}),MODx.panel.Wizard.superclass.constructor.call(this,config),this.config=config,this.lastActiveItem=this.config.firstPanel,this._go()},Ext.extend(MODx.panel.Wizard,Ext.Panel,{windows:{},_go:function(){this.getBottomToolbar().items.item(1).setText(this.config.txtNext),this.proceed(this.config.firstPanel)},navHandler:function(dir){this.doLayout();var a=this.getLayout().activeItem;-1==dir?this.proceed(a.config.back||a.config.id):a.submit({scope:this,proceed:this.proceed})},proceed:function(id){this.doLayout(),this.getLayout().setActiveItem(id),id==this.config.firstPanel?(this.getBottomToolbar().items.item(0).setDisabled(!0),this.getBottomToolbar().items.item(1).setText(this.config.txtNext)):id==this.config.lastPanel?this.getBottomToolbar().items.item(1).setText(this.config.txtFinish):(this.getBottomToolbar().items.item(0).setDisabled(!1),this.getBottomToolbar().items.item(1).setText(this.config.txtNext))}}),Ext.reg("modx-panel-wizard",MODx.panel.Wizard),MODx.panel.WizardPanel=function(config){config=config||{},Ext.applyIf(config,{wizard:null,checkDirty:!1,bodyStyle:"padding: 3em 3em",hideMode:"offsets"}),MODx.panel.WizardPanel.superclass.constructor.call(this,config)},Ext.extend(MODx.panel.WizardPanel,MODx.FormPanel),Ext.reg("modx-wizard-panel",MODx.panel.WizardPanel),MODx.PanelSpacer={html:"
",border:!1},MODx.TemplatePanel=function(config){config=config||{},Ext.applyIf(config,{frame:!1,startingMarkup:'

{text}

',startingText:"Loading...",markup:null,plain:!0,border:!1}),MODx.TemplatePanel.superclass.constructor.call(this,config),this.on("render",this.init,this)},Ext.extend(MODx.TemplatePanel,Ext.Panel,{init:function(){this.defaultMarkup=new Ext.XTemplate(this.startingMarkup,{compiled:!0}),this.reset(),this.tpl=new Ext.XTemplate(this.markup,{compiled:!0})},reset:function(){this.body.hide(),this.defaultMarkup.overwrite(this.body,{text:this.startingText}),this.body.slideIn("r",{stopFx:!0,duration:.2}),setTimeout((function(){Ext.getCmp("modx-content").doLayout()}),500)},updateDetail:function(data){this.body.hide(),this.tpl.overwrite(this.body,data),this.body.slideIn("r",{stopFx:!0,duration:.2}),setTimeout((function(){Ext.getCmp("modx-content").doLayout()}),500)}}),Ext.reg("modx-template-panel",MODx.TemplatePanel),MODx.BreadcrumbsPanel=function(config){config=config||{},Ext.applyIf(config,{frame:!1,plain:!0,border:!1,desc:"This the description part of this panel",bdMarkup:"
    {text}

{text}

",root:{text:"Home",className:"first",root:!0,pnl:""},bodyCssClass:"breadcrumbs"}),MODx.BreadcrumbsPanel.superclass.constructor.call(this,config),this.on("render",this.init,this)},Ext.extend(MODx.BreadcrumbsPanel,Ext.Panel,{data:{trail:[]},init:function(){this.tpl=new Ext.XTemplate(this.bdMarkup,{compiled:!0}),this.reset(this.desc),this.body.on("click",this.onClick,this)},getResetText:function(srcInstance){if("object"!=typeof srcInstance||null==srcInstance)return srcInstance;var newInstance=srcInstance.constructor();for(var i in srcInstance)newInstance[i]=this.getResetText(srcInstance[i]);return newInstance.hasOwnProperty("pnl")&&delete newInstance.pnl,newInstance},updateDetail:function(data){(this.data=data,data.hasOwnProperty("trail"))&&data.trail.unshift(this.root);this._updatePanel(data)},getData:function(){return this.data},reset:function(msg){void 0===this.resetText&&(this.resetText=this.getResetText(this.root)),this.data={text:msg,trail:[this.resetText]},this._updatePanel(this.data)},onClick:function(e){for(var target=e.getTarget(),index=1,parent=target.parentElement;null!=(parent=parent.previousSibling);)index+=1;for(var remove=this.data.trail.length-index;remove>0;)this.data.trail.pop(),remove-=1;if(elm=target.className.split(" ")[0],""!=elm&&"controlBtn"==elm){var panel=target.className.split(" ")[1];if("install"==panel){var last=this.data.trail[this.data.trail.length-1];if(null!=last&&null!=last.rec)return this.data.trail.pop(),void Ext.getCmp("modx-package-grid").install(last.rec)}else Ext.getCmp(panel).activate()}},_updatePanel:function(data){this.body.hide(),this.tpl.overwrite(this.body,data),this.body.slideIn("r",{stopFx:!0,duration:.2}),setTimeout((function(){Ext.getCmp("modx-content").doLayout()}),500)}}),Ext.reg("modx-breadcrumbs-panel",MODx.BreadcrumbsPanel),Ext.override(Ext.TabPanel,{onStripMouseDown:function(e){if(0!==e.button)return;e.preventDefault();const t=this.findTargets(e);t.close?!1!==t.item.fireEvent("beforeclose",t.item)&&(t.item.fireEvent("close",t.item),this.remove(t.item)):t.item&&t.item!==this.activeTab&&(this.tabClicked=!0,this.setActiveTab(t.item))}}),MODx.Tabs=function(config={}){Ext.applyIf(config,{enableTabScroll:!0,layoutOnTabChange:!0,plain:!0,deferredRender:!0,hideMode:"offsets",defaults:{autoHeight:!0,hideMode:"offsets",border:!0,autoWidth:!0,bodyCssClass:"tab-panel-wrapper"},activeTab:0,tabClicked:!1,border:!1,autoScroll:!0,autoHeight:!0,cls:"modx-tabs"}),MODx.Tabs.superclass.constructor.call(this,config),this.config=config,this.on({afterrender:function(tabPanel){if(MODx.request&&Object.prototype.hasOwnProperty.call(MODx.request,"tab")){const tabId=parseInt(MODx.request.tab,10);"modx-leftbar-tabpanel"!==this.id&&this.setActiveTab(tabId)}tabPanel.on({beforetabchange:function(tabPanelCmp,newTab,currentTab){if(this.tabClicked&&newTab&¤tTab&&newTab.id!==currentTab.id){const resetVerticalTabPanelFilters="modx-vtabs"===currentTab.items?.items[0]?.xtype||"modx-vtabs"===currentTab.ownerCt?.xtype,changedBetweenVtabs="modx-vtabs"===newTab.ownerCt?.xtype&&"modx-vtabs"===currentTab.ownerCt?.xtype;if("modx-usergroup-permissions-panel"===newTab.itemId&&!this.stateful){const vTabPanel=newTab.items?.items[0];vTabPanel&&"modx-vtabs"===vTabPanel.xtype&&vTabPanel.setActiveTab(0)}this.clearFiltersBeforeChange(currentTab,resetVerticalTabPanelFilters,changedBetweenVtabs)}}})}})},Ext.extend(MODx.Tabs,Ext.TabPanel,{findGridObject:function(itemsSource){const grid=itemsSource.find((obj=>Object.entries(obj).find((([key,value])=>"xtype"===key&&value.includes("-grid-")))));if(grid)return grid;const nextItemsSource=itemsSource?.items;nextItemsSource&&this.findGridObject(nextItemsSource)},clearFiltersBeforeChange:function(tabObj,resetVtabFilters,changedVtabs){let itemsSource,gridObj=null;if(itemsSource=resetVtabFilters?changedVtabs?tabObj.items:tabObj.items.items[0].activeTab.items:tabObj.items,itemsSource.length>0&&(gridObj=this.findGridObject(itemsSource),!gridObj)){let customItemsSource=null;itemsSource?.map["modx-tree-panel-usergroup"]?customItemsSource=itemsSource.map["modx-tree-panel-usergroup"].items:itemsSource?.map["packages-breadcrumbs"]&&(customItemsSource=itemsSource.map["card-container"].items.map["modx-panel-packages"].items),customItemsSource&&(gridObj=this.findGridObject(customItemsSource))}if(gridObj){const toolbar=gridObj.getTopToolbar(),filterIds=[];toolbar&&toolbar.items.items.length>0&&toolbar.items.items.forEach((cmp=>{cmp.xtype&&(cmp.xtype.includes("combo")||"textfield"===cmp.xtype)&&cmp.itemId&&filterIds.push(cmp.itemId)})),filterIds.length>0&&gridObj.clearGridFilters(filterIds)}}}),Ext.reg("modx-tabs",MODx.Tabs),MODx.VerticalTabs=function(config={}){Ext.applyIf(config,{cls:"vertical-tabs-panel",headerCfg:{tag:"div",cls:"x-tab-panel-header vertical-tabs-header"},bwrapCfg:{tag:"div",cls:"x-tab-panel-bwrap vertical-tabs-bwrap"},defaults:{bodyCssClass:"vertical-tabs-body",autoScroll:!0,autoHeight:!0,autoWidth:!0,layout:"form"}}),MODx.VerticalTabs.superclass.constructor.call(this,config),this.config=config,this.on({afterrender:function(){if(MODx.request&&Object.prototype.hasOwnProperty.call(MODx.request,"vtab")){const tabId=parseInt(MODx.request.vtab,10);this.setActiveTab(tabId)}}})},Ext.extend(MODx.VerticalTabs,MODx.Tabs),Ext.reg("modx-vtabs",MODx.VerticalTabs),Ext.Window.prototype.floating={shadow:!1},Ext.override(Ext.Window,{animShow:function(){this.afterShow();var win=this;setTimeout((function(){win.el.hasClass("anim-ready")||(win.el.addClass("anim-ready"),setTimeout((function(){void 0!==win.mask&&(win.mask instanceof Ext.Element?win.mask.addClass("fade-in"):win.mask.el.addClass("fade-in")),win.el.addClass("zoom-in")}),250))}),300)},animHide:function(){this.afterHide()},onShow:function(){if(this.el.hasClass("x-window-dlg"))this.mask.addClass("fade-in"),this.el.applyStyles({opacity:1});else{this.addClass("anim-ready");var win=this;setTimeout((function(){void 0!==win.mask&&(win.mask instanceof Ext.Element?win.mask.addClass("fade-in"):win.mask.el.addClass("fade-in")),win.el.addClass("zoom-in")}),250)}},onHide:function(){if(this.el.hasClass("zoom-in")){this.el.removeClass("zoom-in"),void 0!==this.mask&&(this.mask instanceof Ext.Element?this.mask.removeClass("fade-in"):this.mask.el.removeClass("fade-in")),this.addClass("zoom-out");var win=this;setTimeout((function(){win.isDestroyed||(win.el.hide(),win.el.removeClass("zoom-out"),win.el.removeClass("anim-ready"))}),250)}else this.el.hasClass("x-window-dlg")&&(this.el.applyStyles({opacity:0}),void 0!==this.mask&&(this.mask instanceof Ext.Element?this.mask.removeClass("fade-in"):this.mask.el.removeClass("fade-in")))}}),MODx.Window=function(config){config=config||{},Ext.applyIf(config,{modal:!1,layout:"auto",closeAction:"hide",shadow:!0,resizable:!0,collapsible:!0,maximizable:!0,autoHeight:!1,autoScroll:!0,allowDrop:!0,width:400,constrain:!0,constrainHeader:!0,cls:"modx-window",buttons:[{text:config.cancelBtnText||_("cancel"),scope:this,handler:function(){"close"!==config.closeAction?this.hide():this.close()}},{text:config.saveBtnText||_("save"),cls:"primary-button",scope:this,handler:this.submit}],record:{},keys:[{key:Ext.EventObject.ENTER,fn:function(keyCode,event){var elem=event.getTarget(),component=Ext.getCmp(elem.id);if(component instanceof Ext.form.TextArea)return component.append("\n");this.submit()},scope:this}]}),MODx.Window.superclass.constructor.call(this,config),this.options=config,this.config=config,this.addEvents({success:!0,failure:!0,beforeSubmit:!0,updateWindow:!1}),this._loadForm(),this.on("show",(function(){this.config.blankValues&&this.fp.getForm().reset(),this.config.allowDrop&&this.loadDropZones(),this.syncSize(),this.focusFirstField()}),this),this.on("afterrender",(function(){this.originalHeight=this.el.getHeight(),this.toolsHeight=this.originalHeight-this.body.getHeight()+50,this.resizeWindow()})),Ext.EventManager.onWindowResize(this.resizeWindow,this)},Ext.extend(MODx.Window,Ext.Window,{_loadForm:function(){if(this.checkIfLoaded(this.config.record||null))return!1;var r=this.config.record;if(this.config.fields)for(var l=this.config.fields.length,i=0;i0){var fld=this.findFirstTextField();fld&&fld.focus(!1,200)}},findFirstTextField:function(i){i=i||0;var fld=this.fp.getForm().items.itemAt(i);return!!fld&&((fld.isXType("combo")||fld.isXType("checkbox")||fld.isXType("radio")||fld.isXType("displayfield")||fld.isXType("statictextfield")||fld.isXType("hidden"))&&(i+=1,fld=this.findFirstTextField(i)),fld)},submit:function(close){close=!1!==close;var f=this.fp.getForm();f.isValid()&&this.fireEvent("beforeSubmit",f.getValues())&&f.submit({waitMsg:this.config.waitMsg||_("saving"),submitEmptyText:!1!==this.config.submitEmptyText,scope:this,failure:function(frm,a){this.fireEvent("failure",{f:frm,a})&&MODx.form.Handler.errorExt(a.result,frm),this.doLayout()},success:function(frm,a){this.config.success&&Ext.callback(this.config.success,this.config.scope||this,[frm,a]),this.fireEvent("success",{f:frm,a}),close&&("close"!==this.config.closeAction?this.hide():this.close()),this.doLayout()}})},createForm:function(config){return Ext.applyIf(this.config,{formFrame:!0,border:!1,bodyBorder:!1,autoHeight:!0}),config=config||{},Ext.applyIf(config,{labelAlign:this.config.labelAlign||"top",labelWidth:this.config.labelWidth||100,labelSeparator:this.config.labelSeparator||"",frame:this.config.formFrame,border:this.config.border,bodyBorder:this.config.bodyBorder,autoHeight:this.config.autoHeight,anchor:"100% 100%",errorReader:MODx.util.JSONReader,defaults:this.config.formDefaults||{msgTarget:this.config.msgTarget||"under"},url:this.config.url,baseParams:this.config.baseParams||{},fileUpload:this.config.fileUpload||!1}),new Ext.FormPanel(config)},renderForm:function(){this.fp.on("destroy",(function(){Ext.EventManager.removeResizeListener(this.resizeWindow,this)}),this),this.add(this.fp)},checkIfLoaded:function(r){return r=r||{},!(!this.fp||!this.fp.getForm())&&(this.fp.getForm().reset(),this.fp.getForm().setValues(r),!0)},setValues:function(r){if(null===r)return!1;this.fp.getForm().setValues(r)},reset:function(){this.fp.getForm().reset()},hideField:function(f){f.disable(),f.hide();var d=f.getEl().up(".x-form-item");d&&d.setDisplayed(!1)},showField:function(f){f.enable(),f.show();var d=f.getEl().up(".x-form-item");d&&d.setDisplayed(!0)},loadDropZones:function(){if(this._dzLoaded)return!1;this.fp.getForm().items.each((function(fld){fld.isFormField&&(fld.isXType("textfield")||fld.isXType("textarea"))&&!fld.isXType("combo")&&new MODx.load({xtype:"modx-treedrop",target:fld,targetEl:fld.getEl().dom})})),this._dzLoaded=!0},resizeWindow:function(){var viewHeight=Ext.getBody().getViewSize().height,el=this.fp.getForm().el;viewHeight
{name:htmlEncode}',"
{description:htmlEncode}
")}),MODx.combo.UserGroup.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.UserGroup,MODx.combo.ComboBox),Ext.reg("modx-combo-usergroup",MODx.combo.UserGroup),MODx.combo.UserGroupRole=function(config){config=config||{},Ext.applyIf(config,{name:"role",hiddenName:"role",displayField:"name",valueField:"id",fields:["name","id"],pageSize:20,url:MODx.config.connector_url,baseParams:{action:"Security/Role/GetList"}}),MODx.combo.UserGroupRole.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.UserGroupRole,MODx.combo.ComboBox),Ext.reg("modx-combo-usergrouprole",MODx.combo.UserGroupRole),MODx.combo.EventGroup=function(config){config=config||{},Ext.applyIf(config,{name:"group",hiddenName:"group",displayField:"name",valueField:"name",fields:["name"],pageSize:20,url:MODx.config.connector_url,baseParams:{action:"System/Event/GroupList"},tpl:new Ext.XTemplate('
{name:htmlEncode}',"
")}),MODx.combo.EventGroup.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.EventGroup,MODx.combo.ComboBox),Ext.reg("modx-combo-eventgroup",MODx.combo.EventGroup),MODx.combo.ResourceGroup=function(config){config=config||{},Ext.applyIf(config,{name:"resourcegroup",hiddenName:"resourcegroup",displayField:"name",valueField:"id",fields:["name","id"],pageSize:20,url:MODx.config.connector_url,baseParams:{action:"Security/ResourceGroup/GetList"}}),MODx.combo.ResourceGroup.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.ResourceGroup,MODx.combo.ComboBox),Ext.reg("modx-combo-resourcegroup",MODx.combo.ResourceGroup),MODx.combo.Context=function(config){config=config||{},Ext.applyIf(config,{name:"context",hiddenName:"context",displayField:"key",valueField:"key",fields:["key","name"],pageSize:20,url:MODx.config.connector_url,baseParams:{action:"Context/GetList",exclude:config.exclude||""},tpl:new Ext.XTemplate('
{name:htmlEncode} ({key:htmlEncode})
')}),MODx.combo.Context.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Context,MODx.combo.ComboBox),Ext.reg("modx-combo-context",MODx.combo.Context),MODx.combo.Policy=function(config){config=config||{},Ext.applyIf(config,{name:"policy",hiddenName:"policy",displayField:"name",valueField:"id",fields:["id","name","permissions"],allowBlank:!1,editable:!1,pageSize:20,url:MODx.config.connector_url,baseParams:{action:"Security/Access/Policy/GetList"}}),MODx.combo.Policy.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Policy,MODx.combo.ComboBox),Ext.reg("modx-combo-policy",MODx.combo.Policy),MODx.combo.Template=function(config){config=config||{},Ext.applyIf(config,{url:MODx.config.connector_url,baseParams:{action:"Element/Template/GetList",combo:!0},fields:["id","templatename","description","category_name","preview","time"],name:"template",hiddenName:"template",displayField:"templatename",valueField:"id",pageSize:20,allowBlank:!0,editable:!0,typeAhead:!0,tpl:new Ext.XTemplate('
{this.label:htmlEncode}
{templatename:htmlEncode}
{description:htmlEncode()}
',{group:null,label:null,getGroup:function(label,time){var group=time+"_"+label;return group===this.group||Ext.isEmpty(group)?null:(this.group=group,this.label=label)}})}),MODx.combo.Template.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Template,MODx.combo.ComboBox),Ext.reg("modx-combo-template",MODx.combo.Template),MODx.combo.Category=function(config){config=config||{},Ext.applyIf(config,{name:"category",hiddenName:"category",displayField:"name",valueField:"id",fields:["id","category","parent","name"],forceSelection:!0,typeAhead:!1,allowBlank:!0,editable:!1,enableKeyEvents:!0,pageSize:20,url:MODx.config.connector_url,baseParams:{action:"Element/Category/GetList",showNone:!0,limit:0}}),MODx.combo.Category.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Category,MODx.combo.ComboBox,{_onblur:function(t,e){var v=this.getRawValue();this.setRawValue(v),this.setValue(v,!0)}}),Ext.reg("modx-combo-category",MODx.combo.Category),MODx.combo.Language=function(config){config=config||{},Ext.applyIf(config,{name:"language",hiddenName:"language",displayField:"name",valueField:"name",fields:["name"],typeAhead:!0,minChars:1,editable:!0,allowBlank:!0,url:MODx.config.connector_url,baseParams:{action:"System/Language/GetList"}}),MODx.combo.Language.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Language,MODx.combo.ComboBox),Ext.reg("modx-combo-language",MODx.combo.Language),MODx.combo.Charset=function(config){config=config||{},Ext.applyIf(config,{name:"charset",hiddenName:"charset",displayField:"text",valueField:"value",fields:["value","text"],forceSelection:!0,typeAhead:!1,editable:!1,allowBlank:!1,url:MODx.config.connector_url,baseParams:{action:"System/Charset/GetList"}}),MODx.combo.Charset.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Charset,MODx.combo.ComboBox),Ext.reg("modx-combo-charset",MODx.combo.Charset),MODx.combo.RTE=function(config){config=config||{},Ext.applyIf(config,{name:"rte",hiddenName:"rte",displayField:"value",valueField:"value",fields:["value"],forceSelection:!0,typeAhead:!1,editable:!1,allowBlank:!1,url:MODx.config.connector_url,baseParams:{action:"System/Rte/GetList"}}),MODx.combo.RTE.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.RTE,MODx.combo.ComboBox),Ext.reg("modx-combo-rte",MODx.combo.RTE),MODx.combo.Role=function(config){config=config||{},Ext.applyIf(config,{name:"role",hiddenName:"role",forceSelection:!0,typeAhead:!1,editable:!1,allowBlank:!1,pageSize:20,url:MODx.config.connector_url,baseParams:{action:"Security/Role/GetList",addNone:!0}}),MODx.combo.Role.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Role,MODx.combo.ComboBox),Ext.reg("modx-combo-role",MODx.combo.Role),MODx.combo.ContentType=function(config){config=config||{},Ext.applyIf(config,{name:"content_type",hiddenName:"content_type",forceSelection:!0,typeAhead:!1,editable:!1,allowBlank:!1,pageSize:20,url:MODx.config.connector_url,baseParams:{action:"System/ContentType/GetList"}}),MODx.combo.ContentType.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.ContentType,MODx.combo.ComboBox),Ext.reg("modx-combo-content-type",MODx.combo.ContentType),MODx.combo.ContentDisposition=function(config){config=config||{},Ext.applyIf(config,{store:new Ext.data.SimpleStore({fields:["d","v"],data:[[_("inline"),0],[_("attachment"),1]]}),name:"content_dispo",hiddenName:"content_dispo",displayField:"d",valueField:"v",mode:"local",triggerAction:"all",editable:!1,pageSize:20,selectOnFocus:!1,preventRender:!0}),MODx.combo.ContentDisposition.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.ContentDisposition,MODx.combo.ComboBox),Ext.reg("modx-combo-content-disposition",MODx.combo.ContentDisposition),MODx.combo.ClassDerivatives=function(config){config=config||{},Ext.applyIf(config,{name:"class",hiddenName:"class",url:MODx.config.connector_url,baseParams:{action:"System/Derivatives/GetList",class:"MODX\\Revolution\\modResource"},displayField:"name",valueField:"id",fields:["id","name"],forceSelection:!0,typeAhead:!1,editable:!1,allowBlank:!1,pageSize:20}),MODx.combo.ClassDerivatives.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.ClassDerivatives,MODx.combo.ComboBox),Ext.reg("modx-combo-class-derivatives",MODx.combo.ClassDerivatives),MODx.combo.Namespace=function(config){config=config||{},Ext.applyIf(config,{name:"namespace",hiddenName:"namespace",typeAhead:!0,minChars:1,queryParam:"query",editable:!0,allowBlank:!0,preselectValue:!1,pageSize:20,url:MODx.config.connector_url,baseParams:{action:"Workspace/PackageNamespace/GetList"},fields:["name"],displayField:"name",valueField:"name"}),MODx.combo.Namespace.superclass.constructor.call(this,config),!1!==config.preselectValue&&(this.store.on("load",this.preselectFirstValue,this,{single:!0}),this.store.load())},Ext.extend(MODx.combo.Namespace,MODx.combo.ComboBox,{preselectFirstValue:function(r){var item;if(""==this.config.preselectValue)item=r.getAt(0);else{var found=r.find("name",this.config.preselectValue);item=-1!=found?r.getAt(found):r.getAt(0)}item&&(this.setValue(item.data.name),this.fireEvent("select",this,item))}}),Ext.reg("modx-combo-namespace",MODx.combo.Namespace),MODx.combo.Browser=function(config){config=config||{},Ext.applyIf(config,{width:400,triggerAction:"all",triggerClass:"x-form-file-trigger",source:config.source||MODx.config.default_media_source}),MODx.combo.Browser.superclass.constructor.call(this,config),this.config=config},Ext.extend(MODx.combo.Browser,Ext.form.TriggerField,{browser:null,onTriggerClick:function(btn){return!this.disabled&&(this.browser=MODx.load({xtype:"modx-browser",closeAction:"close",id:Ext.id(),multiple:!0,source:this.config.source||MODx.config.default_media_source,hideFiles:this.config.hideFiles||!1,rootVisible:this.config.rootVisible||!1,allowedFileTypes:this.config.allowedFileTypes||"",wctx:this.config.wctx||"web",openTo:this.config.openTo||"",rootId:this.config.rootId||"/",hideSourceCombo:this.config.hideSourceCombo||!1,listeners:{select:{fn:function(data){this.setValue(data.relativeUrl),this.fireEvent("select",data)},scope:this}}}),this.browser.show(btn),!0)},onDestroy:function(){MODx.combo.Browser.superclass.onDestroy.call(this)}}),Ext.reg("modx-combo-browser",MODx.combo.Browser),MODx.combo.Country=function(config){config=config||{},Ext.applyIf(config,{name:"country",hiddenName:"country",url:MODx.config.connector_url,baseParams:{action:"System/Country/GetList",combo:!0},displayField:"country",valueField:"iso",fields:["iso","country","value"],editable:!0,typeAhead:!0}),MODx.combo.Country.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Country,MODx.combo.ComboBox),Ext.reg("modx-combo-country",MODx.combo.Country),MODx.combo.Gender=function(config){config=config||{},Ext.applyIf(config,{store:new Ext.data.SimpleStore({fields:["d","v"],data:[["",0],[_("user_male"),1],[_("user_female"),2],[_("user_other"),3]]}),displayField:"d",valueField:"v",mode:"local",triggerAction:"all",editable:!1,selectOnFocus:!1}),MODx.combo.Gender.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Gender,Ext.form.ComboBox),Ext.reg("modx-combo-gender",MODx.combo.Gender),MODx.combo.PropertySet=function(config){config=config||{},Ext.applyIf(config,{name:"propertyset",hiddenName:"propertyset",url:MODx.config.connector_url,baseParams:{action:"Element/PropertySet/GetList"},displayField:"name",valueField:"id",fields:["id","name"],editable:!1,pageSize:20,width:300}),MODx.combo.PropertySet.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.PropertySet,MODx.combo.ComboBox),Ext.reg("modx-combo-property-set",MODx.combo.PropertySet),MODx.ChangeParentField=function(config){config=config||{},Ext.applyIf(config,{triggerAction:"all",editable:!1,readOnly:!1,formpanel:"modx-panel-resource",parentcmp:"modx-resource-parent-hidden",contextcmp:"modx-resource-context-key",currentid:MODx.request.id}),MODx.ChangeParentField.superclass.constructor.call(this,config),this.config=config,this.on("click",this.onTriggerClick,this),this.addEvents({end:!0}),this.on("end",this.end,this)},Ext.extend(MODx.ChangeParentField,Ext.form.TriggerField,{oldValue:!1,oldDisplayValue:!1,end:function(p){var t=Ext.getCmp("modx-resource-tree");t&&(p.d=p.d||p.v,t.removeListener("click",this.handleChangeParent,this),t.on("click",t._handleClick,t),t.disableHref=!1,MODx.debug("Setting parent to: "+p.v),Ext.getCmp(this.config.parentcmp).setValue(p.v),this.setValue(p.d),this.oldValue=!1,"modx-template-picker-parent-id"!==this.config.parentcmp&&Ext.getCmp(this.config.formpanel).fireEvent("fieldChange"))},onTriggerClick:function(){if(this.disabled)return!1;if(this.oldValue)return this.fireEvent("end",{v:this.oldValue,d:this.oldDisplayValue}),!1;if(MODx.debug("onTriggerClick"),!Ext.getCmp("modx-resource-tree")){MODx.debug("no tree found, trying to activate");var tp=Ext.getCmp("modx-leftbar-tabpanel");return tp?(tp.on("tabchange",(function(tbp,tab){"modx-resource-tree-ct"==tab.id&&this.disableTreeClick()}),this),tp.activate("modx-resource-tree-ct")):MODx.debug("no tabpanel"),!1}this.disableTreeClick()},disableTreeClick:function(){return MODx.debug("Disabling tree click"),t=Ext.getCmp("modx-resource-tree"),t?(this.oldDisplayValue=this.getValue(),this.oldValue=Ext.getCmp(this.config.parentcmp).getValue(),this.setValue(_("resource_parent_select_node")),t.expand(),t.removeListener("click",t._handleClick),t.on("click",this.handleChangeParent,this),t.disableHref=!0,!0):(MODx.debug("No tree found in disableTreeClick!"),!1)},handleChangeParent:function(node,e){var t=Ext.getCmp("modx-resource-tree");if(!t)return!1;t.disableHref=!0;var id=node.id.split("_");if((id=id[1])==this.config.currentid)return MODx.msg.alert("",_("resource_err_own_parent")),!1;var ctxf=Ext.getCmp(this.config.contextcmp);if(ctxf){var ctxv=ctxf.getValue();node.attributes&&node.attributes.ctx!=ctxv&&ctxf.setValue(node.attributes.ctx)}return this.fireEvent("end",{v:"modContext"!=node.attributes.type?id:node.attributes.pk,d:Ext.util.Format.stripTags(node.text)}),e.preventDefault(),e.stopEvent(),!0}}),Ext.reg("modx-field-parent-change",MODx.ChangeParentField),MODx.combo.TVWidget=function(config){config=config||{},Ext.applyIf(config,{name:"widget",hiddenName:"widget",displayField:"name",valueField:"value",fields:["value","name"],editable:!1,url:MODx.config.connector_url,baseParams:{action:"Element/TemplateVar/Renders/GetOutputs"},value:"default"}),MODx.combo.TVWidget.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.TVWidget,MODx.combo.ComboBox),Ext.reg("modx-combo-tv-widget",MODx.combo.TVWidget),MODx.combo.TVInputType=function(config){config=config||{},Ext.applyIf(config,{name:"type",hiddenName:"type",displayField:"name",valueField:"value",editable:!1,fields:["value","name"],url:MODx.config.connector_url,baseParams:{action:"Element/TemplateVar/Renders/GetInputs"},value:"text"}),MODx.combo.TVInputType.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.TVInputType,MODx.combo.ComboBox),Ext.reg("modx-combo-tv-input-type",MODx.combo.TVInputType),MODx.combo.Dashboard=function(config){config=config||{},Ext.applyIf(config,{name:"dashboard",hiddenName:"dashboard",displayField:"name",valueField:"id",fields:["id","name","description"],pageSize:20,url:MODx.config.connector_url,baseParams:{action:"System/Dashboard/GetList"},tpl:new Ext.XTemplate('','
','

{name:htmlEncode}

','

{description:htmlEncode}

',"
")}),MODx.combo.Dashboard.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Dashboard,MODx.combo.ComboBox),Ext.reg("modx-combo-dashboard",MODx.combo.Dashboard),MODx.combo.MediaSource=function(config){config=config||{},Ext.applyIf(config,{name:"source",hiddenName:"source",displayField:"name",valueField:"id",fields:["id","name","description"],pageSize:20,url:MODx.config.connector_url,baseParams:{action:"Source/GetList"},tpl:new Ext.XTemplate('','
','

{name:htmlEncode}

','

{description:htmlEncode}

',"
")}),MODx.combo.MediaSource.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.MediaSource,MODx.combo.ComboBox),Ext.reg("modx-combo-source",MODx.combo.MediaSource),MODx.combo.MediaSourceType=function(config){config=config||{},Ext.applyIf(config,{name:"class_key",hiddenName:"class_key",displayField:"name",valueField:"class",fields:["id","class","name","description"],pageSize:20,url:MODx.config.connector_url,baseParams:{action:"Source/Type/GetList"},tpl:new Ext.XTemplate('','
','

{name:htmlEncode}

','

{description:htmlEncode}

',"
")}),MODx.combo.MediaSourceType.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.MediaSourceType,MODx.combo.ComboBox),Ext.reg("modx-combo-source-type",MODx.combo.MediaSourceType),MODx.combo.Authority=function(config){config=config||{},Ext.applyIf(config,{name:"authority",hiddenName:"authority",forceSelection:!0,typeAhead:!1,editable:!1,allowBlank:!1,pageSize:20,url:MODx.config.connector_url,baseParams:{action:"Security/Role/GetAuthorityList",addNone:!0}}),MODx.combo.Authority.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Authority,MODx.combo.ComboBox),Ext.reg("modx-combo-authority",MODx.combo.Authority),MODx.combo.ManagerTheme=function(config){config=config||{},Ext.applyIf(config,{name:"theme",hiddenName:"theme",displayField:"theme",valueField:"theme",fields:["theme"],url:MODx.config.connector_url,baseParams:{action:"Workspace/Theme/GetList"},typeAhead:!1,editable:!1}),MODx.combo.ManagerTheme.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.ManagerTheme,MODx.combo.ComboBox),Ext.reg("modx-combo-manager-theme",MODx.combo.ManagerTheme),MODx.combo.SettingKey=function(config){config=config||{},Ext.applyIf(config,{name:"key",hiddenName:"key",displayField:"key",valueField:"key",fields:["key"],url:MODx.config.connector_url,baseParams:{action:"System/Settings/GetList"},triggerAction:"all",editable:!0,forceSelection:!1,pageSize:20}),MODx.combo.SettingKey.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.SettingKey,MODx.combo.ComboBox),Ext.reg("modx-combo-setting-key",MODx.combo.SettingKey),MODx.combo.Visibility=function(config){config=config||{},Ext.applyIf(config,{name:"visibility",hiddenName:"visibility",store:new Ext.data.SimpleStore({fields:["d","v"],data:[[_("file_folder_visibility_public"),"public"],[_("file_folder_visibility_private"),"private"]]}),displayField:"d",valueField:"v",mode:"local",triggerAction:"all",editable:!1,selectOnFocus:!1,preventRender:!0,forceSelection:!0,enableKeyEvents:!0}),MODx.combo.Visibility.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Visibility,MODx.combo.ComboBox),Ext.reg("modx-combo-visibility",MODx.combo.Visibility),MODx.combo.Permission=function(config){config=config||{},Ext.applyIf(config,{name:"permission",hiddenName:"permission",displayField:"name",valueField:"name",fields:["name","description"],editable:!0,typeAhead:!1,forceSelection:!1,enableKeyEvents:!0,autoSelect:!1,pageSize:20,tpl:new Ext.XTemplate('
{name:htmlEncode}','

{description:htmlEncode}

'),url:MODx.config.connector_url,baseParams:{action:"Security/Access/Permission/GetList"}}),MODx.combo.Permission.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Permission,MODx.combo.ComboBox),Ext.reg("modx-combo-permission",MODx.combo.Permission),Ext.namespace("MODx.grid"),MODx.grid.Grid=function(config){if(config=config||{},this.config=config,this._loadStore(),this._loadColumnModel(),Ext.applyIf(config,{store:this.store,cm:this.cm,sm:new Ext.grid.RowSelectionModel({singleSelect:!0}),paging:!!config.bbar,loadMask:!0,autoHeight:!0,collapsible:!0,stripeRows:!0,header:!1,cls:"modx-grid",preventRender:!0,preventSaveRefresh:!0,showPerPage:!0,stateful:!1,showActionsColumn:!0,disableContextMenuAction:!1,menuConfig:{defaultAlign:"tl-b?",enableScrolling:!1},viewConfig:{forceFit:!0,enableRowBody:!0,autoFill:!0,showPreview:!0,scrollOffset:0,emptyText:config.emptyText||_("ext_emptymsg")},groupingConfig:{enableGroupingMenu:!0}}),config.paging){var pgItms=config.showPerPage?[_("per_page")+":",{xtype:"textfield",cls:"x-tbar-page-size",value:config.pageSize||parseInt(MODx.config.default_per_page)||20,listeners:{change:{fn:this.onChangePerPage,scope:this},render:{fn:function(cmp){new Ext.KeyMap(cmp.getEl(),{key:Ext.EventObject.ENTER,fn:this.blur,scope:cmp})},scope:this}}}]:[];if(config.pagingItems)for(var i=0;i 1 ? "'+(config.pluralText||_("records"))+'" : "'+(config.singleText||_("record"))+'"]})'};Ext.applyIf(config.groupingConfig,groupingConfig),Ext.applyIf(config,{view:new Ext.grid.GroupingView(config.groupingConfig)})}if(config.tbar)for(var ix=0;ix1)return!1;return!0};config.columns&&Array.isArray(config.columns)&&(void 0===config.actionsColumnWidth&&isPercentage(config.columns)&&(defaultActionsColumnWidth=.1),config.columns.push({id:"modx-actions",width:config.actionsColumnWidth||defaultActionsColumnWidth,menuDisabled:!0,renderer:this.actionsColumnRenderer.bind(this)})),config.cm&&config.cm.columns&&Array.isArray(config.cm.columns)&&(void 0===config.actionsColumnWidth&&isPercentage(config.cm.columns)&&(defaultActionsColumnWidth=.1),config.cm.columns.push({id:"modx-actions",width:config.actionsColumnWidth||defaultActionsColumnWidth,menuDisabled:!0,renderer:this.actionsColumnRenderer.bind(this)}))}MODx.grid.Grid.superclass.constructor.call(this,config),this._loadMenu(config),this.addEvents("beforeRemoveRow","afterRemoveRow","afterAutoSave"),this.autosave&&this.on("afterAutoSave",this.onAfterAutoSave,this),config.preventRender||this.render(),this.on({render:{fn:function(){const topToolbar=this.getTopToolbar();topToolbar&&topToolbar.initialConfig.cls&&"has-nested-filters"==topToolbar.initialConfig.cls&&(this.hasNestedFilters=!0)},scope:this},rowcontextmenu:{fn:this._showMenu,scope:this}}),config.autosave&&this.on("afteredit",this.saveRecord,this),config.paging&&config.grouping&&this.getBottomToolbar().bind(this.store),config.paging||config.hasOwnProperty("pageSize")||(config.pageSize=0),this.getStore().load({params:{start:config.pageStart||0,limit:config.hasOwnProperty("pageSize")?config.pageSize:parseInt(MODx.config.default_per_page)||20}}),this.getStore().on("exception",this.onStoreException,this),this.config=config,this.on("click",this.onClickHandler,this)},Ext.extend(MODx.grid.Grid,Ext.grid.EditorGridPanel,{windows:{},onStoreException:function(dataProxy,type,action,options,response){const responseStatusCode=response.status||"Unknown",responseStatusText=Ext.isEmpty(response.statusText)?"":`(${response.statusText})`;let output="",msg="";if(Ext.isEmpty(response.responseText))output=200!==responseStatusCode?`
${responseStatusCode} ${responseStatusText}
`:"";else try{const responseText=Ext.decode(response.responseText);responseText&&responseText.message&&(output=responseText.message)}catch(e){output=response.responseText}output?MODx.config.debug>0?(output=MODx.util.safeHtml(output,"
","class,colspan,rowspan"),msg=_("error_grid_get_content_toscreen",{message:`
${output}
`})):(msg=_("error_grid_get_content_tolog"),output=Ext.util.Format.stripTags(output).replaceAll(">",">").replaceAll("<","<"),console.error(output)):msg=_("error_grid_get_content_no_msg"),this.getView().emptyText=`
${msg}
`,this.getView().refresh(!1)},saveRecord:function(e){e.record.data.menu=null;var p=this.config.saveParams||{};Ext.apply(e.record.data,p);var d=Ext.util.JSON.encode(e.record.data),url=this.config.saveUrl||this.config.url||this.config.connector;MODx.Ajax.request({url,params:{action:this.config.save_action||"updateFromGrid",data:d},listeners:{success:{fn:function(r){this.config.save_callback&&Ext.callback(this.config.save_callback,this.config.scope||this,[r]),e.record.commit(),this.config.preventSaveRefresh||this.refresh(),this.fireEvent("afterAutoSave",r)},scope:this},failure:{fn:function(r){e.record.reject(),this.fireEvent("afterAutoSave",r)},scope:this}}})},onAfterAutoSave:function(response){if(!response.success&&""===response.message){var msg="";response.data.length&&Ext.each(response.data,(function(data,index,list){msg+=(""!=msg?"
":"")+data.msg}),this),Ext.isEmpty(msg)&&(msg=this.autosaveErrorMsg||_("error")),MODx.msg.alert(_("error"),msg)}},onChangePerPage:function(tf,nv){if(Ext.isEmpty(nv))return!1;nv=parseInt(nv),this.getBottomToolbar().pageSize=nv,this.store.load({params:{start:0,limit:nv}})},loadWindow:function(btn,e,win,or){var r=this.menu.record;this.windows[win.xtype]&&!win.force||(Ext.applyIf(win,{record:win.blankValues?{}:r,grid:this,listeners:{success:{fn:win.success||this.refresh,scope:win.scope||this}}}),or&&Ext.apply(win,or),this.windows[win.xtype]=Ext.ComponentMgr.create(win)),this.windows[win.xtype].setValues&&!0!==win.blankValues&&null!=r&&this.windows[win.xtype].setValues(r),this.windows[win.xtype].show(e.target)},confirm:function(type,text){var p={action:type},k=this.config.primaryKey||"id";p[k]=this.menu.record[k],MODx.msg.confirm({title:_(type),text:_(text)||_("confirm_remove"),url:this.config.url,params:p,listeners:{success:{fn:this.refresh,scope:this}}})},remove:function(text,action){if(this.destroying)return MODx.grid.Grid.superclass.remove.apply(this,arguments);var r=this.menu.record;text=text||"confirm_remove";var p=this.config.saveParams||{};Ext.apply(p,{action:action||"remove"});var k=this.config.primaryKey||"id";p[k]=r[k],this.fireEvent("beforeRemoveRow",r)&&MODx.msg.confirm({title:_("warning"),text:_(text,r),url:this.config.url,params:p,listeners:{success:{fn:function(){this.removeActiveRow(r)},scope:this}}})},removeActiveRow:function(r){if(this.fireEvent("afterRemoveRow",r)){var rx=this.getSelectionModel().getSelected();this.getStore().remove(rx)}},_loadMenu:function(){this.menu=new Ext.menu.Menu(this.config.menuConfig)},_showMenu:function(g,ri,e){if(e.stopEvent(),e.preventDefault(),this.menu.record=this.getStore().getAt(ri).data,this.getSelectionModel().isSelected(ri)||this.getSelectionModel().selectRow(ri),this.menu.removeAll(),this.getMenu){var m=this.getMenu(g,ri,e);m&&m.length&&m.length>0&&this.addContextMenuItem(m)}(!m||m.length<=0)&&this.menu.record.menu&&this.addContextMenuItem(this.menu.record.menu),this.menu.items.length>0&&this.menu.showAt(e.xy)},_loadStore:function(){this.config.grouping?this.store=new Ext.data.GroupingStore({url:this.config.url,baseParams:this.config.baseParams||{action:this.config.action||"getList"},reader:new Ext.data.JsonReader({totalProperty:"total",root:"results",fields:this.config.fields}),sortInfo:{field:this.config.sortBy||"id",direction:this.config.sortDir||"ASC"},remoteSort:this.config.remoteSort||!1,remoteGroup:this.config.remoteGroup||!1,groupField:this.config.groupBy||"name",storeId:this.config.storeId||Ext.id(),autoDestroy:!0,listeners:{load:function(){const cmp=Ext.getCmp("modx-content");cmp&&cmp.doLayout()}}}):this.store=new Ext.data.JsonStore({url:this.config.url,baseParams:this.config.baseParams||{action:this.config.action||"getList"},fields:this.config.fields,root:"results",totalProperty:"total",remoteSort:this.config.remoteSort||!1,storeId:this.config.storeId||Ext.id(),autoDestroy:!0,listeners:{load:function(){const cmp=Ext.getCmp("modx-content");cmp&&cmp.doLayout()}}})},_loadColumnModel:function(){if(this.config.columns){for(var c=this.config.columns,i=0;i
',{compiled:!0})},actionsColumnRenderer:function(value,metaData,record,rowIndex,colIndex,store){var actions=this.getActions.apply(this,[record,rowIndex,colIndex,store]);return!0!==this.config.disableContextMenuAction&&actions.push({text:_("context_menu"),action:"contextMenu",icon:"gear"}),this._getActionsColumnTpl().apply({actions})},renderLink:function(v,attr){var el=new Ext.Element(document.createElement("a"));for(var i in el.addClass("x-grid-link"),el.dom.title=_("edit"),attr)el.dom[i]=attr[i];return el.dom.innerHTML=Ext.util.Format.htmlEncode(v),el.dom.outerHTML},checkEditable:function(e){this.checkCellIsEditable(e)},checkCellIsEditable:function(e){if(-1===(e.record.data.perm||"").indexOf("edit"))return!1;switch(e.grid.xtype){case"modx-grid-role":{const isAuthorityField="authority"===e.field;if(e.record.json.isAssigned&&isAuthorityField)return!1;break}}return!0},setEditableCellClasses:function(record,lockConditions=[],lockedClasses="locked",conditionsRequireAll=!0){const permissions=record.data.perm.trim(),hasEditPermission=permissions.split(" ").includes("edit");let classes="",shouldLock=!1;return lockConditions.length>0&&(shouldLock=conditionsRequireAll?lockConditions.every((condition=>!0===Boolean(condition))):lockConditions.some((condition=>!0===Boolean(condition)))),Ext.isEmpty(permissions)?classes="editor-disabled":hasEditPermission&&shouldLock&&(classes=lockedClasses),classes},getLinkTemplate:function(controllerPath,displayValueIndex,options={}){Ext.applyIf(options,{linkParams:[],linkClass:"x-grid-link",linkTitle:_("edit"),linkTarget:"_blank"});let params="";return controllerPath=0===controllerPath.indexOf("?a=")?controllerPath:`?a=${controllerPath}`,options.linkParams.length>0&&(params=[],options.linkParams.forEach((param=>{params.push(`${param.key}={${param.valueIndex}}`)})),params=`&${params.join("&")}`),new Ext.Template(`{${displayValueIndex}:htmlEncode}`,{compiled:!0})},getActions:function(record,rowIndex,colIndex,store){return[]},onClickHandler:function(e){var target=e.getTarget();if(target.classList.contains("x-grid-action")&&target.dataset.action){var actionHandler="action"+target.dataset.action.charAt(0).toUpperCase()+target.dataset.action.slice(1);if(this[actionHandler]&&"function"==typeof this[actionHandler]||this[actionHandler=target.dataset.action]&&"function"==typeof this[actionHandler]){var record=this.getSelectionModel().getSelected(),recordIndex=this.store.indexOf(record);this.menu.record=record.data,this[actionHandler](record,recordIndex,e)}}},actionContextMenu:function(record,recordIndex,e){this._showMenu(this,recordIndex,e)},makeUrl:function(){if(Array.isArray(this.config.urlFilters)&&this.config.urlFilters.length>0){var s=this.getStore(),p={a:MODx.request.a};MODx.request.id&&(p.id=MODx.request.id),MODx.request.key&&(p.key=MODx.request.key);for(var i=0;i0&&window.history.replaceState(this.getStore().baseParams,document.title,this.makeUrl())},findTabPanel:function(referenceCmp){if(!referenceCmp.hasOwnProperty("ownerCt"))return console.error("MODx.grid.Grid::findTabPanel: This component must have an ownerCt to find its tab panel."),!1;const container=referenceCmp.ownerCt;return container.hasOwnProperty("xtype")&&container.xtype.includes("tabs")?container:this.findTabPanel(container)},hasNestedFilters:!1,currentLanguage:MODx.config.cultureKey||"en",applyRequestFilter:function(tabPanelIndex,requestKey="policy",tabPanelType="vtab",setEmptyToString=!1){const emptyVal=setEmptyToString?"":null;return Object.prototype.hasOwnProperty.call(MODx.request,tabPanelType)&&parseInt(MODx.request[tabPanelType],10)===tabPanelIndex&&Object.prototype.hasOwnProperty.call(MODx.request,requestKey)?MODx.util.url.getParamValue(requestKey):emptyVal},applyGridFilter:function(cmp,param="query"){const filterValue=cmp.getValue(),store=this.getStore(),urlParams={},tabPanel=this.findTabPanel(this),bottomToolbar=this.getBottomToolbar();let parentTabItems,activeParentTabIdx,hasParentTabPanel=!1;if(Ext.isEmpty(filterValue)?MODx.request[param]?urlParams[param]=MODx.request[param]:MODx.util.url.clearParam(cmp):urlParams[param]=filterValue,"ns"==param?store.baseParams.namespace=filterValue:store.baseParams[param]=filterValue,tabPanel){if("modx-vtabs"==tabPanel.xtype){const parentTabPanel=this.findTabPanel(tabPanel);if(parentTabPanel){const activeParentTab=parentTabPanel.getActiveTab();hasParentTabPanel=!0,parentTabItems=parentTabPanel.items,activeParentTabIdx=parentTabItems.indexOf(activeParentTab)}}const activeTab=tabPanel.getActiveTab(),tabItems=tabPanel.items,activeTabIdx=tabItems.indexOf(activeTab);hasParentTabPanel?(tabItems.length>1&&(urlParams.vtab=activeTabIdx),parentTabItems.length>1&&(urlParams.tab=activeParentTabIdx)):tabItems.length>1&&(urlParams.tab=activeTabIdx)}store.load(),MODx.util.url.setParams(urlParams),bottomToolbar&&bottomToolbar.changePage(1)},clearGridFilters:function(items){const store=this.getStore(),bottomToolbar=this.getBottomToolbar();(Array.isArray(items)?items:items.split(",")).forEach((item=>{const itemData=item.replace(/\s+/g,"").split(":"),itemId=itemData[0],itemDefaultVal=2==itemData.length?itemData[1]:null,cmp=this.getFilterComponent(itemId),param=MODx.util.url.getParamNameFromCmp(cmp),isCombo=cmp?.xtype?.includes("combo");if(isCombo?""===itemDefaultVal?cmp.setValue(null):cmp.setValue(itemDefaultVal):cmp.setValue(""),!Ext.isEmpty(itemDefaultVal)){Object.keys(cmp.baseParams).forEach((param=>{switch(param){case"namespace":cmp.baseParams[param]="core";break;case"topic":cmp.baseParams[param]="default"}}))}isCombo&&"local"!==cmp.mode&&cmp.getStore().load(),store.baseParams[param]=itemDefaultVal})),store.load(),MODx.util.url.clearAllParams(),bottomToolbar&&bottomToolbar.changePage(1)},hasNestedFilters:!1,getFilterComponent:function(filterId){const topToolbar=this.getTopToolbar(),cmp=this.hasNestedFilters&&"filter-query"!==filterId?topToolbar.find("itemId",`${filterId}-container`)[0].getComponent(filterId):topToolbar.getComponent(filterId);if(void 0!==cmp)return cmp;console.error(`getFilterComponent: The filter component with itemId '${filterId}' could not be retrieved.`)},refreshFilterOptions:function(filterData=[],clearDependentParams=!0){filterData.length>0&&(filterData.forEach((data=>{const filter=this.getFilterComponent(data.filterId);if(filter){const store=filter.getStore();if(filter.setValue(""),store){if(data.hasOwnProperty("dependentParams")){(Array.isArray(data.dependentParams)?data.dependentParams:data.dependentParams.split(",")).forEach((param=>{clearDependentParams&&store.baseParams.hasOwnProperty(param)&&(store.baseParams[param]="")}))}store.load()}}})),this.refresh())},updateDependentFilter:function(filterId,paramKey,paramValue,clearValue=!1){const filter=this.getFilterComponent(filterId),filterStore=filter?filter.getStore():null;filterStore&&"string"==typeof paramKey&&(clearValue&&filter.setValue(""),filterStore.baseParams[paramKey]=paramValue,filterStore.load())},getQueryFilterField:function(filterSpec="filter-query",implementation="default"){let queryValue="";const filterSpecs=filterSpec.split(":"),filterId=filterSpecs[0].trim();return queryValue=2===filterSpecs.length?filterSpecs[1]:MODx.request.query?MODx.util.url.decodeParamValue(MODx.request.query):"",{xtype:"textfield",itemId:filterId,emptyText:_("search"),value:queryValue,cls:"filter-query",listeners:{change:{fn:function(cmp,newValue,oldValue){this.applyGridFilter(cmp);const usergroupTree=Ext.getCmp("modx-tree-usergroup");if("user-group-users"===implementation&&usergroupTree){const selectedNode=usergroupTree.getSelectionModel().getSelectedNode(),groupId=MODx.util.tree.getGroupIdFromNode(selectedNode);MODx.util.url.setParams({group:groupId})}},scope:this},afterrender:{fn:function(cmp){MODx.request.query&&this.applyGridFilter(cmp)},scope:this},render:{fn:function(cmp){new Ext.KeyMap(cmp.getEl(),{key:Ext.EventObject.ENTER,fn:this.blur,scope:cmp})},scope:this}}}},getClearFiltersButton:function(filters="filter-query",dependentFilterResets=null){if(Ext.isEmpty(filters))return console.error("MODx.grid.Grid::getClearFiltersButton: There was a problem creating the Clear Filter button because the supplied filters list is invalid."),{};const config={text:_("filter_clear"),itemId:"filter-clear",listeners:{click:{fn:function(cmp){if(cmp.dependentResets){cmp.dependentResets.split(",").forEach((reset=>{const[filterId,filterDataIndex]=reset.split(":").map((item=>item.trim()));this.updateDependentFilter(filterId,filterDataIndex,"",!0)}))}this.clearGridFilters(filters)},scope:this},mouseout:{fn:function(evt){this.removeClass("x-btn-focus")}}}};return dependentFilterResets&&(config.dependentResets=dependentFilterResets),config}}),MODx.grid.LocalGrid=function(config){if((config=config||{}).grouping&&Ext.applyIf(config,{view:new Ext.grid.GroupingView({forceFit:!0,scrollOffset:0,hideGroupedColumn:!!config.hideGroupedColumn,groupTextTpl:config.groupTextTpl||'{text} ({[values.rs.length]} {[values.rs.length > 1 ? "'+(config.pluralText||_("records"))+'" : "'+(config.singleText||_("record"))+'"]})'})}),config.tbar)for(var i=0;i
',{compiled:!0})},actionsColumnRenderer:function(value,metaData,record,rowIndex,colIndex,store){var actions=this.getActions.apply(this,arguments);return!0!==this.config.disableContextMenuAction&&actions.push({text:_("context_menu"),action:"contextMenu",icon:"gear"}),this._getActionsColumnTpl().apply({actions})},renderLink:function(v,attr){var el=new Ext.Element(document.createElement("a"));for(var i in el.addClass("x-grid-link"),el.dom.title=_("edit"),attr)el.dom[i]=attr[i];return el.dom.innerHTML=Ext.util.Format.htmlEncode(v),el.dom.outerHTML},getActions:function(value,metaData,record,rowIndex,colIndex,store){return[]},onClick:function(e){var target=e.getTarget();if(target.classList.contains("x-grid-action")&&target.dataset.action){var actionHandler="action"+target.dataset.action.charAt(0).toUpperCase()+target.dataset.action.slice(1);if(this[actionHandler]&&"function"==typeof this[actionHandler]||this[actionHandler=target.dataset.action]&&"function"==typeof this[actionHandler]){var record=this.getSelectionModel().getSelected(),recordIndex=this.store.indexOf(record);this.menu.record=record.data,this[actionHandler](record,recordIndex,e)}}},actionContextMenu:function(record,recordIndex,e){this._showMenu(this,recordIndex,e)}}),Ext.reg("grid-local",MODx.grid.LocalGrid),Ext.reg("modx-grid-local",MODx.grid.LocalGrid), +Ext.ux.form.SuperBoxSelect=function(config){Ext.ux.form.SuperBoxSelect.superclass.constructor.call(this,config),this.addEvents("beforeadditem","additem","newitem","beforeremoveitem","removeitem","clear")},Ext.ux.form.SuperBoxSelect=Ext.extend(Ext.ux.form.SuperBoxSelect,Ext.form.ComboBox,{addNewDataOnBlur:!1,allowAddNewData:!1,allowQueryAll:!0,backspaceDeletesLastItem:!0,classField:null,clearBtnCls:"",clearLastQueryOnEscape:!1,clearOnEscape:!1,displayFieldTpl:null,extraItemCls:"",extraItemStyle:"",expandBtnCls:"",fixFocusOnTabSelect:!0,forceFormValue:!0,forceSameValueQuery:!1,itemDelimiterKey:Ext.EventObject.ENTER,navigateItemsWithTab:!0,pinList:!0,preventDuplicates:!0,queryFilterRe:"",queryValuesDelimiter:"|",queryValuesIndicator:"valuesqry",removeValuesFromStore:!0,renderFieldBtns:!0,stackItems:!1,styleField:null,supressClearValueRemoveEvents:!1,validationEvent:"blur",valueDelimiter:",",initComponent:function(){Ext.apply(this,{items:new Ext.util.MixedCollection(!1),usedRecords:new Ext.util.MixedCollection(!1),addedRecords:[],remoteLookup:[],hideTrigger:!0,grow:!1,resizable:!1,multiSelectMode:!1,preRenderValue:null,filteredQueryData:""}),this.queryFilterRe&&Ext.isString(this.queryFilterRe)&&(this.queryFilterRe=new RegExp(this.queryFilterRe)),this.transform&&this.doTransform(),this.forceFormValue&&this.items.on({add:this.manageNameAttribute,remove:this.manageNameAttribute,clear:this.manageNameAttribute,scope:this}),Ext.ux.form.SuperBoxSelect.superclass.initComponent.call(this),"remote"===this.mode&&this.store&&this.store.on("load",this.onStoreLoad,this)},onRender:function(ct,position){var h=this.hiddenName;this.hiddenName=null,Ext.ux.form.SuperBoxSelect.superclass.onRender.call(this,ct,position),this.hiddenName=h,this.manageNameAttribute();var extraClass=!0===this.stackItems?"x-superboxselect-stacked":"";this.renderFieldBtns&&(extraClass+=" x-superboxselect-display-btns"),this.el.removeClass("x-form-text").addClass("x-superboxselect-input-field"),this.wrapEl=this.el.wrap({tag:"ul"}),this.outerWrapEl=this.wrapEl.wrap({tag:"div",cls:"x-form-text x-superboxselect "+extraClass}),this.inputEl=this.el.wrap({tag:"li",cls:"x-superboxselect-input"}),this.renderFieldBtns&&this.setupFieldButtons().manageClearBtn(),this.setupFormInterception()},doTransform:function(){var s=Ext.getDom(this.transform),transformValues=[];if(!this.store){this.mode="local";for(var d=[],opts=s.options,i=0,len=opts.length;i0&&(this.collapse(),(it=this.items.get(0)).el.focus()),!0):e.getKey()===e.BACKSPACE?(e.stopEvent(),this.currentFocus?(toDestroy=this.currentFocus,this.on("expand",(function(){this.collapse()}),this,{single:!0}),idx=this.items.indexOfKey(toDestroy.key),this.clearCurrentFocus(),idx0?(this.el.removeClass(this.emptyClass),this.setRawValue(""),this):(this.rendered&&this.emptyText&&this.getRawValue().length<1&&(this.setRawValue(this.emptyText),this.el.addClass(this.emptyClass)),this)},removeAllItems:function(){return this.items.each((function(item){item.preDestroy(!0)}),this),this.manageClearBtn(),this},killItems:function(){return this.items.each((function(item){item.kill()}),this),this.resetStore(),this.items.clear(),this.manageClearBtn(),this},resetStore:function(){return this.store.clearFilter(),this.removeValuesFromStore?(this.usedRecords.each((function(rec){this.store.add(rec)}),this),this.usedRecords.clear(),this.store.remoteSort||this.store.sort(this.displayField,"ASC"),this):this},sortStore:function(){var ss=this.store.getSortState();return ss&&ss.field&&this.store.sort(ss.field,ss.direction),this},getCaption:function(dataObject){"string"==typeof this.displayFieldTpl&&(this.displayFieldTpl=new Ext.XTemplate(this.displayFieldTpl));var caption,recordData=dataObject instanceof Ext.data.Record?dataObject.data:dataObject;return this.displayFieldTpl?caption=this.displayFieldTpl.apply(recordData):this.displayField&&(caption=recordData[this.displayField]),caption},addRecord:function(record){var display=record.data[this.displayField],caption=this.getCaption(record),val=record.data[this.valueField],cls=this.classField?record.data[this.classField]:"",style=this.styleField?record.data[this.styleField]:"";this.removeValuesFromStore&&(this.usedRecords.add(val,record),this.store.remove(record)),this.addItemBox(val,display,caption,cls,style),this.fireEvent("additem",this,val,record)},createRecord:function(recordData){if(!this.recordConstructor){var recordFields=[{name:this.valueField},{name:this.displayField}];this.classField&&recordFields.push({name:this.classField}),this.styleField&&recordFields.push({name:this.styleField}),this.recordConstructor=Ext.data.Record.create(recordFields)}return new this.recordConstructor(recordData)},addItems:function(newItemObjects){Ext.isArray(newItemObjects)?Ext.each(newItemObjects,(function(item){this.addItem(item)}),this):this.addItem(newItemObjects)},addNewItem:function(newItemObject){this.addItem(newItemObject,!0)},addItem:function(newItemObject,forcedAdd){var val=newItemObject[this.valueField];if(this.disabled)return!1;if(!this.preventDuplicates||!this.hasValue(val)){var record=this.findRecord(this.valueField,val);if(record)this.addRecord(record);else if(this.allowAddNewData){if("remote"===this.mode)return this.remoteLookup.push(newItemObject),void this.doQuery(val,!1,!1,forcedAdd);var rec=this.createRecord(newItemObject);return this.store.add(rec),this.addRecord(rec),!0}}},addItemBox:function(itemVal,itemDisplay,itemCaption,itemClass,itemStyle){var hConfig,itemKey=Ext.id(null,"sbx-item"),box=new Ext.ux.form.SuperBoxSelectItem({owner:this,disabled:this.disabled,renderTo:this.wrapEl,cls:this.extraItemCls+" "+itemClass,style:function(s){var ret="";switch(typeof s){case"function":ret=s.call();break;case"object":for(var p in s)ret+=p+":"+s[p]+";";break;case"string":ret=s+";"}return ret}(this.extraItemStyle)+" "+itemStyle,caption:itemCaption,display:itemDisplay,value:itemVal,key:itemKey,listeners:{remove:function(item){if(!1===this.fireEvent("beforeremoveitem",this,item.value))return!1;this.items.removeKey(item.key),this.removeValuesFromStore&&this.usedRecords.containsKey(item.value)&&(this.store.add(this.usedRecords.get(item.value)),this.usedRecords.removeKey(item.value),this.sortStore(),this.view&&this.view.render()),this.preventMultipleRemoveEvents||this.fireEvent.defer(250,this,["removeitem",this,item.value,this.findInStore(item.value)])},destroy:function(){this.collapse(),this.autoSize().manageClearBtn().validateValue()},scope:this}});box.render(),hConfig={tag:"input",type:"hidden",value:itemVal,name:this.hiddenName||this.name},this.disabled&&Ext.apply(hConfig,{disabled:"disabled"}),box.hidden=this.el.insertSibling(hConfig,"before"),this.items.add(itemKey,box),this.applyEmptyText().autoSize().manageClearBtn().validateValue()},manageClearBtn:function(){if(!this.renderFieldBtns||!this.rendered)return this;var cls="x-superboxselect-btn-hide";return 0===this.items.getCount()?this.buttonClear.addClass(cls):this.buttonClear.removeClass(cls),this},findInStore:function(val){var index=this.store.find(this.valueField,val);return index>-1&&this.store.getAt(index)},getSelectedRecords:function(){var ret=[];if(this.removeValuesFromStore)ret=this.usedRecords.getRange();else{var vals=[];this.items.each((function(item){vals.push(item.value)})),Ext.each(vals,(function(val){ret.push(this.findInStore(val))}),this)}return ret},findSelectedItem:function(el){var ret;return this.items.each((function(item){if(item.el.dom===el)return ret=item,!1})),ret},findSelectedRecord:function(el){var ret,item=this.findSelectedItem(el);return item&&(ret=this.findSelectedRecordByValue(item.value)),ret},findSelectedRecordByValue:function(val){var ret;return this.removeValuesFromStore?this.usedRecords.each((function(rec){if(rec.get(this.valueField)==val)return ret=rec,!1}),this):ret=this.findInStore(val),ret},getValue:function(){var ret=[];return this.items.each((function(item){ret.push(item.value)})),ret.join(this.valueDelimiter)},getCount:function(){return this.items.getCount()},getValueEx:function(){var ret=[];return this.items.each((function(item){var newItem={};newItem[this.valueField]=item.value,newItem[this.displayField]=item.display,this.classField&&(newItem[this.classField]=item.cls||""),this.styleField&&(newItem[this.styleField]=item.style||""),ret.push(newItem)}),this),ret},initValue:function(){Ext.isObject(this.value)||Ext.isArray(this.value)?(this.setValueEx(this.value),this.originalValue=this.getValue()):Ext.ux.form.SuperBoxSelect.superclass.initValue.call(this),"remote"===this.mode&&(this.setOriginal=!0)},addValue:function(value){if(!Ext.isEmpty(value)){var values=value;if(Ext.isArray(value)||(values=(value=""+value).split(this.valueDelimiter)),Ext.each(values,(function(val){var record=this.findRecord(this.valueField,val);record?this.addRecord(record):"remote"===this.mode&&this.remoteLookup.push(val)}),this),"remote"===this.mode){var q=this.remoteLookup.join(this.queryValuesDelimiter);this.doQuery(q,!1,!0)}}},setValue:function(value){this.rendered?(this.removeAllItems().resetStore(),this.remoteLookup=[],this.addValue(value)):this.value=value},setValueEx:function(data){this.rendered?(this.removeAllItems().resetStore(),Ext.isArray(data)||(data=[data]),this.remoteLookup=[],this.allowAddNewData&&"remote"===this.mode?Ext.each(data,(function(d){var r=this.findRecord(this.valueField,d[this.valueField])||this.createRecord(d);this.addRecord(r)}),this):Ext.each(data,(function(item){this.addItem(item)}),this)):this.value=data},hasValue:function(val){var has=!1;return this.items.each((function(item){if(item.value==val)return has=!0,!1}),this),has},onSelect:function(record,index){if(!1!==this.fireEvent("beforeselect",this,record,index)){var val=record.data[this.valueField];if(this.preventDuplicates&&this.hasValue(val))return;this.setRawValue(""),this.lastSelectionText="",!1!==this.fireEvent("beforeadditem",this,val,record,this.filteredQueryData)&&this.addRecord(record),0!==this.store.getCount()&&this.multiSelectMode?this.restrictHeight():this.collapse()}},onDestroy:function(){this.items.purgeListeners(),this.killItems(),this.allowQueryAll&&Ext.destroy(this.buttonExpand),this.renderFieldBtns&&Ext.destroy(this.buttonClear,this.buttonWrap),Ext.destroy(this.inputEl,this.wrapEl,this.outerWrapEl),Ext.ux.form.SuperBoxSelect.superclass.onDestroy.call(this)},autoSize:function(){if(!this.rendered)return this;this.metrics||(this.metrics=Ext.util.TextMetrics.createInstance(this.el));var v=this.el.dom.value,d=document.createElement("div");""===v&&this.emptyText&&this.items.getCount()<1&&(v=this.emptyText),d.appendChild(document.createTextNode(v)),v=d.innerHTML,d=null,v+=" ";var w=Math.max(this.metrics.getWidth(v)+24,24);return void 0!==this._width&&(w=Math.min(this._width,w)),this.el.setWidth(w),Ext.isIE&&(this.el.dom.style.top="0"),this.fireEvent("autosize",this,w),this},shouldQuery:function(q){if(this.lastQuery){var m=q.match("^"+this.lastQuery);return!(m&&!this.store.getCount())||m[0]!==this.lastQuery}return!0},doQuery:function(q,forceAll,valuesQuery,forcedAdd){if(q=Ext.isEmpty(q)?"":q,this.queryFilterRe){this.filteredQueryData="";var m=q.match(this.queryFilterRe);if(m&&m.length&&(this.filteredQueryData=m[0]),!(q=q.replace(this.queryFilterRe,""))&&m)return}var qe={query:q,forceAll,combo:this,cancel:!1};if(!1===this.fireEvent("beforequery",qe)||qe.cancel)return!1;q=qe.query,(!0===(forceAll=qe.forceAll)||q.length>=this.minChars||valuesQuery&&!Ext.isEmpty(q))&&(forcedAdd||this.forceSameValueQuery||this.shouldQuery(q)?(this.lastQuery=q,"local"==this.mode?(this.selectedIndex=-1,forceAll?this.store.clearFilter():this.store.filter(this.displayField,q),this.onLoad()):(this.store.baseParams[this.queryParam]=q,this.store.baseParams[this.queryValuesIndicator]=valuesQuery,this.store.load({params:this.getParams(q)}),forcedAdd||this.expand())):(this.selectedIndex=-1,this.onLoad()))},onStoreLoad:function(store,records,options){var q=options.params[this.queryParam]||store.baseParams[this.queryParam]||"",isValuesQuery=options.params[this.queryValuesIndicator]||store.baseParams[this.queryValuesIndicator];if(this.removeValuesFromStore&&this.store.each((function(record){this.usedRecords.containsKey(record.get(this.valueField))&&this.store.remove(record)}),this),isValuesQuery){var params=q.split(this.queryValuesDelimiter);Ext.each(params,(function(p){this.remoteLookup.remove(p);var rec=this.findRecord(this.valueField,p);rec&&this.addRecord(rec)}),this),this.setOriginal&&(this.setOriginal=!1,this.originalValue=this.getValue())}""!==q&&this.allowAddNewData&&Ext.each(this.remoteLookup,(function(r){if("object"==typeof r&&r[this.valueField]===q){if(this.remoteLookup.remove(r),records.length&&records[0].get(this.valueField)===q)return void this.addRecord(records[0]);var rec=this.createRecord(r);return this.store.add(rec),this.addRecord(rec),this.addedRecords.push(rec),void function(){this.isExpanded()&&this.collapse()}.defer(10,this)}}),this);var toAdd=[];if(""===q)Ext.each(this.addedRecords,(function(rec){this.preventDuplicates&&this.usedRecords.containsKey(rec.get(this.valueField))||toAdd.push(rec)}),this);else{var re=new RegExp(Ext.escapeRe(q)+".*","i");Ext.each(this.addedRecords,(function(rec){this.preventDuplicates&&this.usedRecords.containsKey(rec.get(this.valueField))||re.test(rec.get(this.displayField))&&toAdd.push(rec)}),this)}this.store.add(toAdd),this.sortStore(),0===this.store.getCount()&&this.isExpanded()&&this.collapse()}}),Ext.reg("superboxselect",Ext.ux.form.SuperBoxSelect),Ext.ux.form.SuperBoxSelectItem=function(config){Ext.apply(this,config),Ext.ux.form.SuperBoxSelectItem.superclass.constructor.call(this)},Ext.ux.form.SuperBoxSelectItem=Ext.extend(Ext.ux.form.SuperBoxSelectItem,Ext.Component,{initComponent:function(){Ext.ux.form.SuperBoxSelectItem.superclass.initComponent.call(this)},onElClick:function(e){var o=this.owner;if(o.clearCurrentFocus().collapse(),o.navigateItemsWithTab)this.focus();else{o.el.dom.focus();(function(){this.onLnkFocus(),o.currentFocus=this}).defer(10,this)}},onLnkClick:function(e){e&&e.stopEvent(),this.preDestroy(),this.owner.navigateItemsWithTab||this.owner.el.focus()},onLnkFocus:function(){this.el.addClass("x-superboxselect-item-focus"),this.owner.outerWrapEl.addClass("x-form-focus")},onLnkBlur:function(){this.el.removeClass("x-superboxselect-item-focus"),this.owner.outerWrapEl.removeClass("x-form-focus")},enableElListeners:function(){this.el.on("click",this.onElClick,this,{stopEvent:!0}),this.el.addClassOnOver("x-superboxselect-item x-superboxselect-item-hover")},enableLnkListeners:function(){this.lnk.on({click:this.onLnkClick,focus:this.onLnkFocus,blur:this.onLnkBlur,scope:this})},enableAllListeners:function(){this.enableElListeners(),this.enableLnkListeners()},disableAllListeners:function(){this.el.removeAllListeners(),this.lnk.un("click",this.onLnkClick,this),this.lnk.un("focus",this.onLnkFocus,this),this.lnk.un("blur",this.onLnkBlur,this)},onRender:function(ct,position){Ext.ux.form.SuperBoxSelectItem.superclass.onRender.call(this,ct,position);var el=this.el;el&&el.remove(),this.el=el=ct.createChild({tag:"li"},ct.last()),el.addClass("x-superboxselect-item");var btnEl=this.owner.navigateItemsWithTab?"a":"span";this.key;Ext.apply(el,{focus:function(){var c=this.down(btnEl+".x-superboxselect-item-close");c&&c.focus()},preDestroy:function(){this.preDestroy()}.createDelegate(this)}),this.enableElListeners(),el.update(this.caption);var cfg={tag:btnEl,class:"x-superboxselect-item-close",tabIndex:this.owner.navigateItemsWithTab?"0":"-1"};"a"===btnEl&&(cfg.href="#"),this.lnk=el.createChild(cfg),this.disabled?this.disableAllListeners():this.enableLnkListeners(),this.on({disable:this.disableAllListeners,enable:this.enableAllListeners,scope:this}),this.setupKeyMap()},setupKeyMap:function(){this.keyMap=new Ext.KeyMap(this.lnk,[{key:[Ext.EventObject.BACKSPACE,Ext.EventObject.DELETE,Ext.EventObject.SPACE],fn:this.preDestroy,scope:this},{key:[Ext.EventObject.RIGHT,Ext.EventObject.DOWN],fn:function(){this.moveFocus("right")},scope:this},{key:[Ext.EventObject.LEFT,Ext.EventObject.UP],fn:function(){this.moveFocus("left")},scope:this},{key:[Ext.EventObject.HOME],fn:function(){var l=this.owner.items.get(0).el.focus();l&&l.el.focus()},scope:this},{key:[Ext.EventObject.END],fn:function(){this.owner.el.focus()},scope:this},{key:Ext.EventObject.ENTER,fn:function(){}}]),this.keyMap.stopEvent=!0},moveFocus:function(dir){var el=this.el["left"==dir?"prev":"next"]()||this.owner.el;el.focus.defer(100,el)},preDestroy:function(supressEffect){if(!1!==this.fireEvent("remove",this)){var actionDestroy=function(){this.owner.navigateItemsWithTab&&this.moveFocus("right"),this.hidden.remove(),this.hidden=null,this.destroy()};return supressEffect?actionDestroy.call(this):this.el.hide({duration:.2,callback:actionDestroy,scope:this}),this}},kill:function(){this.hidden.remove(),this.hidden=null,this.purgeListeners(),this.destroy()},onDisable:function(){this.hidden&&this.hidden.dom.setAttribute("disabled","disabled"),this.keyMap.disable(),Ext.ux.form.SuperBoxSelectItem.superclass.onDisable.call(this)},onEnable:function(){this.hidden&&this.hidden.dom.removeAttribute("disabled"),this.keyMap.enable(),Ext.ux.form.SuperBoxSelectItem.superclass.onEnable.call(this)},onDestroy:function(){Ext.destroy(this.lnk,this.el),Ext.ux.form.SuperBoxSelectItem.superclass.onDestroy.call(this)}}),MODx.Component=function(config){config=config||{},MODx.Component.superclass.constructor.call(this,config),this.config=config,this._loadForm(),this.config.tabs&&this._loadTabs(),this._loadComponents(),this._loadActionButtons(),MODx.activePage=this},Ext.extend(MODx.Component,Ext.Component,{fields:{},form:null,action:!1,_loadForm:function(){if(!this.config.form)return!1;if(this.form=new Ext.form.BasicForm(Ext.get(this.config.form),{errorReader:MODx.util.JSONReader}),this.config.fields)for(var i in this.config.fields)if(this.config.fields.hasOwnProperty(i)){var f=this.config.fields[i];f.xtype&&(f=Ext.ComponentMgr.create(f)),this.fields[i]=f,this.form.add(f)}return this.form.render()},_loadActionButtons:function(){return!!this.config.buttons&&(this.ab=MODx.load({xtype:"modx-actionbuttons",form:this.form||null,formpanel:this.config.formpanel||null,actions:this.config.actions||null,items:this.config.buttons||[]}),this.ab)},_loadTabs:function(){if(!this.config.tabs)return!1;var o=this.config.tabOptions||{};return Ext.applyIf(o,{xtype:"modx-tabs",renderTo:this.config.tabs_div||"tabs_div",items:this.config.tabs}),MODx.load(o)},_loadComponents:function(){if(!this.config.components)return!1;for(var l=this.config.components.length,cp=Ext.getCmp("modx-content"),i=0;i","<-",""," "];if(-1!=ex.indexOf(el)||el.xtype&&"switch"==el.xtype)MODx.toolbar.ActionButtons.superclass.add.call(this,el);else{var id=el.id||Ext.id();if(Ext.applyIf(el,{xtype:"button",cls:el.icon?"x-btn-icon bmenu":"x-btn-text bmenu",scope:this,disabled:!!el.checkDirty,listeners:{},id}),el.button&&MODx.toolbar.ActionButtons.superclass.add.call(this,el),null===el.handler&&null===el.menu?el.handler=this.checkConfirm:el.confirm&&el.handler?el.handler=function(){Ext.Msg.confirm(_("warning"),el.confirm,(function(e){"yes"===e&&Ext.callback(el.handler,this)}),el.scope||this)}:el.handler||(el.handler=this.handleClick),el.javascript&&(el.listeners.click={fn:this.evalJS,scope:this}),"button"==el.xtype&&(el.listeners.render={fn:function(btn){el.checkDirty&&btn&&this.checkDirtyBtns.push(btn)},scope:this}),el.keys){el.keyMap=new Ext.KeyMap(Ext.get(document));for(var j=0;j{item&&item.validate&&!item.validate()&&(isv=!1)})),isv?(Ext.applyIf(o.params,{action:itm.process}),Ext.apply(f.baseParams,o.params),o.form.on("success",(function(r){if(o.form.clearDirty&&o.form.clearDirty(),MODx.msg.status({title:_("success"),message:r.result.message||_("save_successful"),dontHide:""!=r.result.message}),0!=itm.redirect){var redirect=this.redirect;"function"==typeof itm.redirect&&(redirect=itm.redirect),Ext.callback(redirect,this,[o,itm,r.result],1e3)}this.resetDirtyButtons(r.result)}),this),o.form.submit({headers:{"Powered-By":"MODx",modAuth:MODx.siteId}})):(o.form.fireEvent("failureSubmit"),Ext.Msg.alert(_("error"),_("correct_errors")))}else{var params=itm.params||{};Ext.applyIf(params,o.baseParams||{}),MODx.loadPage("?"+Ext.urlEncode(params))}return!1},resetDirtyButtons:function(r){for(var i=0;i0}},contextmenu:{fn:this._showContextMenu,scope:this}}),Ext.applyIf(config,{store:this.store,singleSelect:!0,overClass:"x-view-over",emptyText:'
'+_("file_err_filter")+"
",closeAction:"hide"}),MODx.DataView.superclass.constructor.call(this,config),this.config=config,this.cm=new Ext.menu.Menu},Ext.extend(MODx.DataView,Ext.DataView,{lookup:{},onLoadException:function(){this.getEl().update('
'+_("data_err_load")+"
")},_addContextMenuItem:function(items){for(var a=items,l=a.length,i=0;i ').compile()}),MODx.Button.superclass.constructor.call(this,config)},Ext.extend(MODx.Button,Ext.Button,{onRender:function(ct,position){this.template||(Ext.Button.buttonTemplate||(Ext.Button.buttonTemplate=new Ext.Template(' '),Ext.Button.buttonTemplate.compile()),this.template=Ext.Button.buttonTemplate);var btn,targs=this.getTemplateArgs();targs.iconCls=this.iconCls,btn=position?this.template.insertBefore(position,targs,!0):this.template.append(ct,targs,!0),this.btnEl=btn.child("i"),this.mon(this.btnEl,{scope:this,focus:this.onFocus,blur:this.onBlur}),this.initButtonEl(btn,this.btnEl),Ext.ButtonToggleMgr.register(this)}}),Ext.reg("modx-button",MODx.Button),MODx.SearchBar=function(config){config=config||{},Ext.applyIf(config,{renderTo:"modx-manager-search",listClass:"modx-manager-search-results",emptyText:_("search"),id:"modx-uberbar",maxHeight:this.getViewPortSize(),typeAhead:!0,listAlign:["tl-bl?",[-12,12]],triggerConfig:{tag:"button",id:"modx-uberbar-trigger",type:"submit","aria-label":"Go",cls:"x-form-trigger icon icon-large icon-search"},defaultAutoCreate:{tag:"input",type:"text",size:"24",tabindex:"0",hasfocus:!0,"aria-label":_("search")},hasfocus:!0,minChars:1,displayField:"name",valueField:"_action",width:380,itemSelector:".x-combo-list-item",tpl:new Ext.XTemplate('','
','','',"

{label:htmlEncode}

","
",'

{name:htmlEncode} – {description:htmlEncode}

',"
","
",{getClass:function(values){if(values.icon)return values.icon;if(values.class)switch(values.class){case"MODX\\Revolution\\modDocument":return"file";case"MODX\\Revolution\\modSymLink":return"files-o";case"MODX\\Revolution\\modWebLink":return"link";case"MODX\\Revolution\\modStaticResource":return"file-text-o"}switch(values.type){case"resources":return"file";case"chunks":return"th-large";case"templates":return"columns";case"snippets":return"code";case"tvs":return"list-alt";case"plugins":return"cogs";case"users":return"user";case"actions":return"mail-forward"}},getLabel:function(values){return values.label?values.label:_("search_resulttype_"+values.type)}}),store:new Ext.data.JsonStore({url:MODx.config.connector_url,baseParams:{action:"Search/Search"},root:"results",totalProperty:"total",fields:["name","_action","description","type","icon","label","class"],listeners:{beforeload:function(store,options){if(options.params._action)return!1}}}),listeners:{beforequery:{fn:function(){this.tpl.type=null}},focus:this.focusBar,blur:this.blurBar,afterrender:function(){document.getElementById("modx-manager-search").onclick=function(e){e.stopPropagation()}},scope:this}}),MODx.SearchBar.superclass.constructor.call(this,config),this.blur(),this.setKeyMap()},Ext.extend(MODx.SearchBar,Ext.form.ComboBox,{setKeyMap:function(){new Ext.KeyMap(document,{key:27,handler:function(){this.hideBar()},scope:this,stopEvent:!1})},initList:function(){if(!this.list){var cls="x-combo-list",listParent=Ext.getDom(this.getListParent()||Ext.getBody());this.list=new Ext.Layer({parentEl:listParent,shadow:this.shadow,cls:[cls,this.listClass].join(" "),constrain:!1,zindex:this.getZIndex(listParent)}),this.list.on("click",(function(e){e.stopPropagation()}));var lw=this.listWidth||Math.max(this.wrap.getWidth(),this.minListWidth);this.list.setSize(lw,0),this.list.swallowEvent("mousewheel"),this.assetHeight=0,!1!==this.syncFont&&this.list.setStyle("font-size",this.el.getStyle("font-size")),this.title&&(this.header=this.list.createChild({cls:cls+"-hd",html:this.title}),this.assetHeight+=this.header.getHeight()),this.innerList=this.list.createChild({cls:cls+"-inner"}),this.mon(this.innerList,"mouseover",this.onViewOver,this),this.mon(this.innerList,"mousemove",this.onViewMove,this),this.innerList.setWidth(lw-this.list.getFrameWidth("lr")),this.pageSize&&(this.footer=this.list.createChild({cls:cls+"-ft"}),this.pageTb=new Ext.PagingToolbar({store:this.store,pageSize:this.pageSize,renderTo:this.footer}),this.assetHeight+=this.footer.getHeight()),this.tpl||(this.tpl='
{'+this.displayField+"}
"),this.view=new Ext.DataView({applyTo:this.innerList,tpl:this.tpl,singleSelect:!0,selectedClass:this.selectedClass,itemSelector:this.itemSelector||"."+cls+"-item",emptyText:this.listEmptyText,deferEmptyText:!1}),this.view.on("click",(function(view,index,node,vent){view.select(node),window.event||(window.event=vent),this.onViewClick()}),this),this.bindStore(this.store,!0),this.resizable&&(this.resizer=new Ext.Resizable(this.list,{pinned:!0,handles:"se"}),this.mon(this.resizer,"resize",(function(r,w,h){this.maxHeight=h-this.handleHeight-this.list.getFrameWidth("tb")-this.assetHeight,this.listWidth=w,this.innerList.setWidth(w-this.list.getFrameWidth("lr")),this.restrictHeight()}),this),this[this.pageSize?"footer":"innerList"].setStyle("margin-bottom",this.handleHeight+"px"))}},onTypeAhead:function(){},onSelect:function(record,index){var e=Ext.EventObject;e.stopPropagation(),e.preventDefault();var target="?a="+record.data._action;if(e.ctrlKey||e.metaKey||e.shiftKey)return window.open(target);MODx.loadPage(target)},hideBar:function(){},focusBar:function(){this.selectText()},blurBar:function(){},getViewPortSize:function(){var height=300;return void 0!==window.innerHeight&&(height=window.innerHeight),height-70}}),Ext.reg("modx-searchbar",MODx.SearchBar),Ext.namespace("MODx.panel"),MODx.Panel=function(config){config=config||{},Ext.applyIf(config,{cls:"modx-panel",title:""}),MODx.Panel.superclass.constructor.call(this,config),this.config=config},Ext.extend(MODx.Panel,Ext.Panel),Ext.reg("modx-panel",MODx.Panel),MODx.FormPanel=function(config){config=config||{},Ext.applyIf(config,{autoHeight:!0,collapsible:!0,bodyStyle:"",layout:"anchor",border:!1,header:!1,method:"POST",cls:"modx-form",allowDrop:!0,errorReader:MODx.util.JSONReader,checkDirty:!0,useLoadingMask:!1,defaults:{collapsible:!1,autoHeight:!0,border:!1}}),config.items&&this.addChangeEvent(config.items),MODx.FormPanel.superclass.constructor.call(this,config),this.config=config,this.addEvents({setup:!0,fieldChange:!0,ready:!0,beforeSubmit:!0,success:!0,failure:!0,save:!0,actionNew:!0,actionContinue:!0,actionClose:!0,postReady:!0}),this.getForm().addEvents({success:!0,failure:!0}),this.dropTargets=[],this.on("ready",this.onReady),this.config.useLoadingMask&&this.on("render",(function(){this.mask=new Ext.LoadMask(this.getEl()),this.mask.show()})),this.fireEvent("setup",config)&&this.clearDirty(),this.focusFirstField()},Ext.extend(MODx.FormPanel,Ext.FormPanel,{isReady:!1,defaultValues:[],initialized:!1,isStatic:!1,errorHandlingTabs:[],errorHandlingIgnoreTabs:[],submit:function(o){var fm=this.getForm();return!(!fm.isValid()&&!o.bypassValidCheck)&&((o=o||{}).headers={"Powered-By":"MODx",modAuth:MODx.siteId},this.fireEvent("beforeSubmit",{form:fm,options:o,config:this.config})&&fm.submit({waitMsg:this.config.saveMsg||_("saving"),scope:this,headers:o.headers,clientValidation:!o.bypassValidCheck,failure:function(f,a){this.fireEvent("failure",{form:f,result:a.result,options:o,config:this.config})&&MODx.form.Handler.errorExt(a.result,f)},success:function(f,a){this.config.success&&Ext.callback(this.config.success,this.config.scope||this,[f,a]),this.fireEvent("success",{form:f,result:a.result,options:o,config:this.config}),this.clearDirty(),this.fireEvent("setup",this.config);var lastActiveEle=Ext.state.Manager.get("curFocus");if(lastActiveEle&&""!=lastActiveEle){Ext.state.Manager.clear("curFocus");var initFocus=document.getElementById(lastActiveEle);initFocus&&initFocus.focus()}}}),!0)},failure:function(o){if(this.warnUnsavedChanges=!0,-1!==this.getForm().baseParams.action.search(/\/create/i)){const btn=Ext.getCmp("modx-abtn-save");btn&&btn.enable()}this.fireEvent("failureSubmit")},focusFirstField:function(){if(this.getForm().items.getCount()>0){var fld=this.findFirstTextField();fld&&fld.focus(!1,200)}},findFirstTextField:function(i){i=i||0;var fld=this.getForm().items.itemAt(i);return!!fld&&((fld.isXType("combo")||fld.isXType("checkbox")||fld.isXType("radio")||fld.isXType("displayfield")||fld.isXType("statictextfield")||fld.isXType("hidden"))&&(i+=1,fld=this.findFirstTextField(i)),fld)},addChangeEvent:function(items){if(!items)return!1;"object"==typeof items&&items.items&&(items=items.items);for(var f=0;f{fieldKey=fieldKey.trim();const fieldCmpId=`modx-${formId}-${fieldKey}-file`,sourceKey=Ext.isEmpty(sharedSourceKey)?fieldKey:sharedSourceKey,sourceCmpId=`modx-${formId}-${sourceKey}-source`,fieldCmp=Ext.getCmp(fieldCmpId),sourceCmp=Ext.getCmp(sourceCmpId);fieldCmp&&sourceCmp&&(fieldCmp.config.source=sourceCmp.getValue())}))},destroy:function(){for(var i=0;i0&&keys.forEach((function(key){map.hasOwnProperty(key)&&"string"==typeof map[key].id?tabIds.push(map[key].id):"modx-panel-resource-tv"==key&&1==MODx.config.tvs_below_content&&tabIds.push(key)})),tabIds},showErroredTab:function(targetForms,tabsId){const mainTabs=Ext.getCmp(tabsId),searchTabs=this.getTabIdsFromKeys(mainTabs.items.map,targetForms);let component,mainTabName=null,mainTabIndex=null,erroredNode=null;mainTabs.items.length>mainTabs.initialConfig.items.length&&mainTabs.items.keys.forEach((function(key){mainTabs.items.map[key].hasOwnProperty("id")&&(this.errorHandlingIgnoreTabs.includes(mainTabs.items.map[key].id)||searchTabs.includes(mainTabs.items.map[key].id)||searchTabs.push(mainTabs.items.map[key].id))}),this);for(let i=0;i0&&erroredFlds[0].id},insertTagCopyUtility:function(cmp,elType){const helpTag=cmp.getEl().child(".example-replace-name"),elTag=cmp.getEl().child(".copy-this");let tagText,nameVal=cmp.previousSibling().getValue();helpTag&&(nameVal.length>0&&(helpTag.update(nameVal),tagText=elTag.dom.innerText),helpTag.on({click:function(){if(nameVal=cmp.previousSibling().getValue(),nameVal.length>0){tagText=elTag.dom.innerText;const tmp=document.createElement("textarea");if(tmp.value=tagText,document.body.appendChild(tmp),tmp.select(),document.execCommand("copy")){const feedback=document.createElement("span");feedback.className="element-panel feedback item-copied",feedback.textContent=_(elType+"_tag_copied"),elTag.insertSibling(feedback,"after"),setTimeout((function(){feedback.style.opacity=0,setTimeout((function(){feedback.remove()}),1200)}),10)}tmp.remove()}}}))},onChangeStaticSource:function(cmp,elType){const isStatic=Ext.getCmp(`modx-${elType}-static`).getValue(),staticFileField=Ext.getCmp(`modx-${elType}-static-file`),staticFile=staticFileField.getValue(),staticDir=staticFile.slice(0,staticFile.lastIndexOf("/")+1),staticFileFieldId=staticFileField.id,staticFileFieldContainer=Ext.getCmp(staticFileField.ownerCt.id),itemKey=staticFileFieldContainer.items.keys.indexOf(staticFileFieldId),previousSource=this.previousFileSource||0,currentSource=cmp.getValue(),currentRecord={static:isStatic,static_file:staticFile,source:currentSource,openTo:staticDir};let newStaticFile,changeFieldType=!1,updateFieldSource=!1;if("template"===elType)var newPreviewFileField,staticPreviewFileField=Ext.getCmp(`modx-${elType}-preview-file`),staticPreviewFile=staticPreviewFileField.getValue(),staticPreviewDir=staticPreviewFile.slice(0,staticPreviewFile.lastIndexOf("/")+1),staticPreviewFileFieldId=staticPreviewFileField.id,staticPreviewFileFieldContainer=Ext.getCmp(staticPreviewFileField.ownerCt.id),previewItemKey=staticPreviewFileFieldContainer.items.keys.indexOf(staticPreviewFileFieldId),currentPreviewRecord={static:isStatic,preview_file:staticPreviewFile,source:currentSource,openTo:staticPreviewDir};this.previousFileSource=currentSource,previousSource>0&&0==currentSource?(newStaticFile=this.getStaticFileField(elType,currentRecord,!1),"template"===elType&&(newPreviewFileField=this.getTemplatePreviewImageField(currentPreviewRecord,!1)),changeFieldType=!0):0==previousSource&¤tSource>0?(newStaticFile=this.getStaticFileField(elType,currentRecord),"template"===elType&&(newPreviewFileField=this.getTemplatePreviewImageField(currentPreviewRecord)),changeFieldType=!0,updateFieldSource=!0):updateFieldSource=!0,updateFieldSource&&(changeFieldType?(newStaticFile.source=currentSource,"template"===elType&&(newPreviewFileField.source=currentSource)):(staticFileField.config.source=currentSource,"template"===elType&&(staticPreviewFileField.config.source=currentSource))),changeFieldType&&(staticFileField.clearInvalid(),staticFileField.destroy(),staticFileFieldContainer.insert(itemKey,newStaticFile),"template"===elType&&(staticPreviewFileField.clearInvalid(),staticPreviewFileField.destroy(),staticPreviewFileFieldContainer.insert(previewItemKey,newPreviewFileField)),this.doLayout())},getStaticFileField:function(elType,record,loadBrowserField=!0){const sharedConfig={fieldLabel:_("static_file"),description:MODx.expandHelp?"":_("static_file_desc"),name:"static_file",id:`modx-${elType}-static-file`,maxLength:255,anchor:"100%",value:record.static_file||""};let finalConfig;return(0===record.source||!record.hasOwnProperty("source")&&Ext.isEmpty(MODx.config.default_media_source))&&(loadBrowserField=!1),finalConfig=loadBrowserField?Object.assign(sharedConfig,{xtype:"modx-combo-browser",browserEl:"modx-browser",triggerClass:"x-form-code-trigger",source:null!=record.source?record.source:MODx.config.default_media_source,openTo:record.openTo||""}):Object.assign(sharedConfig,{xtype:"textfield"}),record.static||(finalConfig.hidden=!0),finalConfig},getTemplatePreviewImageField:function(record,loadBrowserField=!0){const sharedConfig={fieldLabel:_("template_preview"),description:MODx.expandHelp?"":_("template_preview_description"),name:"preview_file",id:"modx-template-preview-file",allowedFileTypes:"jpg,jpeg,png,gif,bmp",maxLength:255,anchor:"100%",value:record.preview_file||""};let finalConfig;return(0===record.source||!record.hasOwnProperty("source")&&Ext.isEmpty(MODx.config.default_media_source))&&(loadBrowserField=!1),finalConfig=loadBrowserField?Object.assign(sharedConfig,{xtype:"modx-combo-browser",browserEl:"modx-browser",triggerClass:"x-form-image-trigger",source:null!=record.source?record.source:MODx.config.default_media_source,openTo:record.openTo||""}):Object.assign(sharedConfig,{xtype:"textfield"}),finalConfig},toggleFieldVisibility:function(ctrlId,containerId,fieldIds,ctrlValToShow,addSibling){const ctrlCmp=Ext.getCmp(ctrlId),containerCmp=Ext.getCmp(containerId);if(!ctrlCmp||void 0===ctrlCmp)return console.error(`toggleFieldVisibility: Could not get the control component with the id '${ctrlId}'`),!1;if(containerId&&(!containerCmp||void 0===containerCmp))return console.error(`toggleFieldVisibility: Could not get the container component with the id '${containerId}'`),!1;addSibling=!1!==addSibling,ctrlValToShow=!1!==ctrlValToShow;const showVal="combo-boolean"===ctrlCmp.xtype?ctrlCmp.getValue():ctrlCmp.checked,show=!1===ctrlValToShow?!showVal:showVal;show?(containerCmp.show(),containerCmp.doLayout()):containerCmp.hide(),fieldIds.forEach((field=>{const fieldCmp=Ext.getCmp(field),sibling=fieldCmp.nextSibling(),siblingIsHelp=sibling&&"label"===sibling.xtype;fieldCmp&&(show?(fieldCmp.show(),addSibling&&siblingIsHelp&&sibling.show()):(fieldCmp.hide(),addSibling&&siblingIsHelp&&sibling.hide()))}))},formatMainPanelTitle:function(formId,record,realtimeValue=null,returnBaseTitle=!1){let title="",baseTitle="";const modeCreate=!(record.hasOwnProperty("id")&&record.id>0),prefixSeparator=modeCreate&&!realtimeValue?"":": ",prefix=(modeCreate?_("create")+" ":_("edit")+" ")+_("resource"===formId?"document":formId)+prefixSeparator;if(!Ext.isEmpty(record)){const postfix=MODx.perm.tree_show_resource_ids&&!Ext.isEmpty(record.id)?` (${record.id})`:"";if("resource"===formId){const headerCmp=Ext.getCmp("modx-header-breadcrumbs");title=realtimeValue||record.pagetitle,baseTitle=this.encodeTitle(title,!1),title=void 0===title?prefix:this.encodeTitle(title)+postfix,headerCmp?headerCmp.updateHeader(title):Ext.getCmp("modx-resource-header").el.dom.innerText=title}else{const headerCmpId=`modx-${formId}-header`;realtimeValue?baseTitle=this.encodeTitle(realtimeValue):(title="template"===formId?record.templatename:record.name,baseTitle=this.encodeTitle(title)),title=void 0===title?prefix:prefix+baseTitle+postfix,Ext.getCmp(headerCmpId).getEl().update(title)}}if(returnBaseTitle)return baseTitle},encodeTitle:function(title,htmlEncode=!0){return title&&(title=htmlEncode?Ext.util.Format.htmlEncode(Ext.util.Format.stripTags(title)):Ext.util.Format.stripTags(title)),title},getElementProperties:function(properties){if(!Ext.isEmpty(properties)){const gridCmp=Ext.getCmp("modx-grid-element-properties");gridCmp&&(gridCmp.defaultProperties=properties,gridCmp.getStore().loadData(properties))}}}),Ext.reg("modx-formpanel",MODx.FormPanel),MODx.panel.Wizard=function(config){config=config||{},Ext.applyIf(config,{layout:"card",activeItem:0,resizable:!0,collapsible:!0,maximizable:!0,autoHeight:!0,width:750,firstPanel:"",lastPanel:"",defaults:{border:!1},modal:!0,txtFinish:_("finish"),txtNext:_("next"),txtBack:_("back"),bbar:[{id:"pi-btn-bck",itemId:"btn-back",text:config.txtBack||_("back"),handler:this.navHandler.createDelegate(this,[-1]),scope:this,disabled:!0},{id:"pi-btn-fwd",itemId:"btn-fwd",text:config.txtNext||_("next"),handler:this.navHandler.createDelegate(this,[1]),scope:this}]}),MODx.panel.Wizard.superclass.constructor.call(this,config),this.config=config,this.lastActiveItem=this.config.firstPanel,this._go()},Ext.extend(MODx.panel.Wizard,Ext.Panel,{windows:{},_go:function(){this.getBottomToolbar().items.item(1).setText(this.config.txtNext),this.proceed(this.config.firstPanel)},navHandler:function(dir){this.doLayout();var a=this.getLayout().activeItem;-1==dir?this.proceed(a.config.back||a.config.id):a.submit({scope:this,proceed:this.proceed})},proceed:function(id){this.doLayout(),this.getLayout().setActiveItem(id),id==this.config.firstPanel?(this.getBottomToolbar().items.item(0).setDisabled(!0),this.getBottomToolbar().items.item(1).setText(this.config.txtNext)):id==this.config.lastPanel?this.getBottomToolbar().items.item(1).setText(this.config.txtFinish):(this.getBottomToolbar().items.item(0).setDisabled(!1),this.getBottomToolbar().items.item(1).setText(this.config.txtNext))}}),Ext.reg("modx-panel-wizard",MODx.panel.Wizard),MODx.panel.WizardPanel=function(config){config=config||{},Ext.applyIf(config,{wizard:null,checkDirty:!1,bodyStyle:"padding: 3em 3em",hideMode:"offsets"}),MODx.panel.WizardPanel.superclass.constructor.call(this,config)},Ext.extend(MODx.panel.WizardPanel,MODx.FormPanel),Ext.reg("modx-wizard-panel",MODx.panel.WizardPanel),MODx.PanelSpacer={html:"
",border:!1},MODx.TemplatePanel=function(config){config=config||{},Ext.applyIf(config,{frame:!1,startingMarkup:'

{text}

',startingText:"Loading...",markup:null,plain:!0,border:!1}),MODx.TemplatePanel.superclass.constructor.call(this,config),this.on("render",this.init,this)},Ext.extend(MODx.TemplatePanel,Ext.Panel,{init:function(){this.defaultMarkup=new Ext.XTemplate(this.startingMarkup,{compiled:!0}),this.reset(),this.tpl=new Ext.XTemplate(this.markup,{compiled:!0})},reset:function(){this.body.hide(),this.defaultMarkup.overwrite(this.body,{text:this.startingText}),this.body.slideIn("r",{stopFx:!0,duration:.2}),setTimeout((function(){Ext.getCmp("modx-content").doLayout()}),500)},updateDetail:function(data){this.body.hide(),this.tpl.overwrite(this.body,data),this.body.slideIn("r",{stopFx:!0,duration:.2}),setTimeout((function(){Ext.getCmp("modx-content").doLayout()}),500)}}),Ext.reg("modx-template-panel",MODx.TemplatePanel),MODx.BreadcrumbsPanel=function(config){config=config||{},Ext.applyIf(config,{frame:!1,plain:!0,border:!1,desc:"This the description part of this panel",bdMarkup:"
    {text}

{text}

",root:{text:"Home",className:"first",root:!0,pnl:""},bodyCssClass:"breadcrumbs"}),MODx.BreadcrumbsPanel.superclass.constructor.call(this,config),this.on("render",this.init,this)},Ext.extend(MODx.BreadcrumbsPanel,Ext.Panel,{data:{trail:[]},init:function(){this.tpl=new Ext.XTemplate(this.bdMarkup,{compiled:!0}),this.reset(this.desc),this.body.on("click",this.onClick,this)},getResetText:function(srcInstance){if("object"!=typeof srcInstance||null==srcInstance)return srcInstance;var newInstance=srcInstance.constructor();for(var i in srcInstance)newInstance[i]=this.getResetText(srcInstance[i]);return newInstance.hasOwnProperty("pnl")&&delete newInstance.pnl,newInstance},updateDetail:function(data){(this.data=data,data.hasOwnProperty("trail"))&&data.trail.unshift(this.root);this._updatePanel(data)},getData:function(){return this.data},reset:function(msg){void 0===this.resetText&&(this.resetText=this.getResetText(this.root)),this.data={text:msg,trail:[this.resetText]},this._updatePanel(this.data)},onClick:function(e){for(var target=e.getTarget(),index=1,parent=target.parentElement;null!=(parent=parent.previousSibling);)index+=1;for(var remove=this.data.trail.length-index;remove>0;)this.data.trail.pop(),remove-=1;if(elm=target.className.split(" ")[0],""!=elm&&"controlBtn"==elm){var panel=target.className.split(" ")[1];if("install"==panel){var last=this.data.trail[this.data.trail.length-1];if(null!=last&&null!=last.rec)return this.data.trail.pop(),void Ext.getCmp("modx-package-grid").install(last.rec)}else Ext.getCmp(panel).activate()}},_updatePanel:function(data){this.body.hide(),this.tpl.overwrite(this.body,data),this.body.slideIn("r",{stopFx:!0,duration:.2}),setTimeout((function(){Ext.getCmp("modx-content").doLayout()}),500)}}),Ext.reg("modx-breadcrumbs-panel",MODx.BreadcrumbsPanel),Ext.override(Ext.TabPanel,{onStripMouseDown:function(e){if(0!==e.button)return;e.preventDefault();const t=this.findTargets(e);t.close?!1!==t.item.fireEvent("beforeclose",t.item)&&(t.item.fireEvent("close",t.item),this.remove(t.item)):t.item&&t.item!==this.activeTab&&(this.tabClicked=!0,this.setActiveTab(t.item))}}),MODx.Tabs=function(config={}){Ext.applyIf(config,{enableTabScroll:!0,layoutOnTabChange:!0,plain:!0,deferredRender:!0,hideMode:"offsets",defaults:{autoHeight:!0,hideMode:"offsets",border:!0,autoWidth:!0,bodyCssClass:"tab-panel-wrapper"},activeTab:0,tabClicked:!1,border:!1,autoScroll:!0,autoHeight:!0,cls:"modx-tabs"}),MODx.Tabs.superclass.constructor.call(this,config),this.config=config,this.on({afterrender:function(tabPanel){if(MODx.request&&Object.prototype.hasOwnProperty.call(MODx.request,"tab")){const tabId=parseInt(MODx.request.tab,10);"modx-leftbar-tabpanel"!==this.id&&this.setActiveTab(tabId)}tabPanel.on({beforetabchange:function(tabPanelCmp,newTab,currentTab){if(this.tabClicked&&newTab&¤tTab&&newTab.id!==currentTab.id){const resetVerticalTabPanelFilters="modx-vtabs"===currentTab.items?.items[0]?.xtype||"modx-vtabs"===currentTab.ownerCt?.xtype,changedBetweenVtabs="modx-vtabs"===newTab.ownerCt?.xtype&&"modx-vtabs"===currentTab.ownerCt?.xtype;if("modx-usergroup-permissions-panel"===newTab.itemId&&!this.stateful){const vTabPanel=newTab.items?.items[0];vTabPanel&&"modx-vtabs"===vTabPanel.xtype&&vTabPanel.setActiveTab(0)}this.clearFiltersBeforeChange(currentTab,resetVerticalTabPanelFilters,changedBetweenVtabs)}}})}})},Ext.extend(MODx.Tabs,Ext.TabPanel,{findGridObject:function(itemsSource){const grid=itemsSource.find((obj=>Object.entries(obj).find((([key,value])=>"xtype"===key&&value.includes("-grid-")))));if(grid)return grid;const nextItemsSource=itemsSource?.items;nextItemsSource&&this.findGridObject(nextItemsSource)},clearFiltersBeforeChange:function(tabObj,resetVtabFilters,changedVtabs){let itemsSource,gridObj=null;if(itemsSource=resetVtabFilters?changedVtabs?tabObj.items:tabObj.items.items[0].activeTab.items:tabObj.items,itemsSource.length>0&&(gridObj=this.findGridObject(itemsSource),!gridObj)){let customItemsSource=null;itemsSource?.map["modx-tree-panel-usergroup"]?customItemsSource=itemsSource.map["modx-tree-panel-usergroup"].items:itemsSource?.map["packages-breadcrumbs"]&&(customItemsSource=itemsSource.map["card-container"].items.map["modx-panel-packages"].items),customItemsSource&&(gridObj=this.findGridObject(customItemsSource))}if(gridObj){const toolbar=gridObj.getTopToolbar(),filterIds=[];toolbar&&toolbar.items.items.length>0&&toolbar.items.items.forEach((cmp=>{cmp.xtype&&(cmp.xtype.includes("combo")||"textfield"===cmp.xtype)&&cmp.itemId&&filterIds.push(cmp.itemId)})),filterIds.length>0&&gridObj.clearGridFilters(filterIds)}}}),Ext.reg("modx-tabs",MODx.Tabs),MODx.VerticalTabs=function(config={}){Ext.applyIf(config,{cls:"vertical-tabs-panel",headerCfg:{tag:"div",cls:"x-tab-panel-header vertical-tabs-header"},bwrapCfg:{tag:"div",cls:"x-tab-panel-bwrap vertical-tabs-bwrap"},defaults:{bodyCssClass:"vertical-tabs-body",autoScroll:!0,autoHeight:!0,autoWidth:!0,layout:"form"}}),MODx.VerticalTabs.superclass.constructor.call(this,config),this.config=config,this.on({afterrender:function(){if(MODx.request&&Object.prototype.hasOwnProperty.call(MODx.request,"vtab")){const tabId=parseInt(MODx.request.vtab,10);this.setActiveTab(tabId)}}})},Ext.extend(MODx.VerticalTabs,MODx.Tabs),Ext.reg("modx-vtabs",MODx.VerticalTabs),Ext.Window.prototype.floating={shadow:!1},Ext.override(Ext.Window,{animShow:function(){this.afterShow();var win=this;setTimeout((function(){win.el.hasClass("anim-ready")||(win.el.addClass("anim-ready"),setTimeout((function(){void 0!==win.mask&&(win.mask instanceof Ext.Element?win.mask.addClass("fade-in"):win.mask.el.addClass("fade-in")),win.el.addClass("zoom-in")}),250))}),300)},animHide:function(){this.afterHide()},onShow:function(){if(this.el.hasClass("x-window-dlg"))this.mask.addClass("fade-in"),this.el.applyStyles({opacity:1});else{this.addClass("anim-ready");var win=this;setTimeout((function(){void 0!==win.mask&&(win.mask instanceof Ext.Element?win.mask.addClass("fade-in"):win.mask.el.addClass("fade-in")),win.el.addClass("zoom-in")}),250)}},onHide:function(){if(this.el.hasClass("zoom-in")){this.el.removeClass("zoom-in"),void 0!==this.mask&&(this.mask instanceof Ext.Element?this.mask.removeClass("fade-in"):this.mask.el.removeClass("fade-in")),this.addClass("zoom-out");var win=this;setTimeout((function(){win.isDestroyed||(win.el.hide(),win.el.removeClass("zoom-out"),win.el.removeClass("anim-ready"))}),250)}else this.el.hasClass("x-window-dlg")&&(this.el.applyStyles({opacity:0}),void 0!==this.mask&&(this.mask instanceof Ext.Element?this.mask.removeClass("fade-in"):this.mask.el.removeClass("fade-in")))}}),MODx.Window=function(config){config=config||{},Ext.applyIf(config,{modal:!1,layout:"auto",closeAction:"hide",shadow:!0,resizable:!0,collapsible:!0,maximizable:!0,autoHeight:!1,autoScroll:!0,allowDrop:!0,width:400,constrain:!0,constrainHeader:!0,cls:"modx-window",buttons:[{text:config.cancelBtnText||_("cancel"),scope:this,handler:function(){"close"!==config.closeAction?this.hide():this.close()}},{text:config.saveBtnText||_("save"),cls:"primary-button",scope:this,handler:this.submit}],record:{},keys:[{key:Ext.EventObject.ENTER,fn:function(keyCode,event){var elem=event.getTarget(),component=Ext.getCmp(elem.id);if(component instanceof Ext.form.TextArea)return component.append("\n");this.submit()},scope:this}]}),MODx.Window.superclass.constructor.call(this,config),this.options=config,this.config=config,this.addEvents({success:!0,failure:!0,beforeSubmit:!0,updateWindow:!1}),this._loadForm(),this.on("show",(function(){this.config.blankValues&&this.fp.getForm().reset(),this.config.allowDrop&&this.loadDropZones(),this.syncSize(),this.focusFirstField()}),this),this.on("afterrender",(function(){this.originalHeight=this.el.getHeight(),this.toolsHeight=this.originalHeight-this.body.getHeight()+50,this.resizeWindow()})),Ext.EventManager.onWindowResize(this.resizeWindow,this)},Ext.extend(MODx.Window,Ext.Window,{_loadForm:function(){if(this.checkIfLoaded(this.config.record||null))return!1;var r=this.config.record;if(this.config.fields)for(var l=this.config.fields.length,i=0;i0){var fld=this.findFirstTextField();fld&&fld.focus(!1,200)}},findFirstTextField:function(i){i=i||0;var fld=this.fp.getForm().items.itemAt(i);return!!fld&&((fld.isXType("combo")||fld.isXType("checkbox")||fld.isXType("radio")||fld.isXType("displayfield")||fld.isXType("statictextfield")||fld.isXType("hidden"))&&(i+=1,fld=this.findFirstTextField(i)),fld)},submit:function(close){close=!1!==close;var f=this.fp.getForm();f.isValid()&&this.fireEvent("beforeSubmit",f.getValues())&&f.submit({waitMsg:this.config.waitMsg||_("saving"),submitEmptyText:!1!==this.config.submitEmptyText,scope:this,failure:function(frm,a){this.fireEvent("failure",{f:frm,a})&&MODx.form.Handler.errorExt(a.result,frm),this.doLayout()},success:function(frm,a){this.config.success&&Ext.callback(this.config.success,this.config.scope||this,[frm,a]),this.fireEvent("success",{f:frm,a}),close&&("close"!==this.config.closeAction?this.hide():this.close()),this.doLayout()}})},createForm:function(config){return Ext.applyIf(this.config,{formFrame:!0,border:!1,bodyBorder:!1,autoHeight:!0}),config=config||{},Ext.applyIf(config,{labelAlign:this.config.labelAlign||"top",labelWidth:this.config.labelWidth||100,labelSeparator:this.config.labelSeparator||"",frame:this.config.formFrame,border:this.config.border,bodyBorder:this.config.bodyBorder,autoHeight:this.config.autoHeight,anchor:"100% 100%",errorReader:MODx.util.JSONReader,defaults:this.config.formDefaults||{msgTarget:this.config.msgTarget||"under"},url:this.config.url,baseParams:this.config.baseParams||{},fileUpload:this.config.fileUpload||!1}),new Ext.FormPanel(config)},renderForm:function(){this.fp.on("destroy",(function(){Ext.EventManager.removeResizeListener(this.resizeWindow,this)}),this),this.add(this.fp)},checkIfLoaded:function(r){return r=r||{},!(!this.fp||!this.fp.getForm())&&(this.fp.getForm().reset(),this.fp.getForm().setValues(r),!0)},setValues:function(r){if(null===r)return!1;this.fp.getForm().setValues(r)},reset:function(){this.fp.getForm().reset()},hideField:function(f){f.disable(),f.hide();var d=f.getEl().up(".x-form-item");d&&d.setDisplayed(!1)},showField:function(f){f.enable(),f.show();var d=f.getEl().up(".x-form-item");d&&d.setDisplayed(!0)},loadDropZones:function(){if(this._dzLoaded)return!1;this.fp.getForm().items.each((function(fld){fld.isFormField&&(fld.isXType("textfield")||fld.isXType("textarea"))&&!fld.isXType("combo")&&new MODx.load({xtype:"modx-treedrop",target:fld,targetEl:fld.getEl().dom})})),this._dzLoaded=!0},resizeWindow:function(){var viewHeight=Ext.getBody().getViewSize().height,el=this.fp.getForm().el;viewHeight
{name:htmlEncode}',"
{description:htmlEncode}
")}),MODx.combo.UserGroup.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.UserGroup,MODx.combo.ComboBox),Ext.reg("modx-combo-usergroup",MODx.combo.UserGroup),MODx.combo.UserGroupRole=function(config){config=config||{},Ext.applyIf(config,{name:"role",hiddenName:"role",displayField:"name",valueField:"id",fields:["name","id"],pageSize:20,url:MODx.config.connector_url,baseParams:{action:"Security/Role/GetList"}}),MODx.combo.UserGroupRole.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.UserGroupRole,MODx.combo.ComboBox),Ext.reg("modx-combo-usergrouprole",MODx.combo.UserGroupRole),MODx.combo.EventGroup=function(config){config=config||{},Ext.applyIf(config,{name:"group",hiddenName:"group",displayField:"name",valueField:"name",fields:["name"],pageSize:20,url:MODx.config.connector_url,baseParams:{action:"System/Event/GroupList"},tpl:new Ext.XTemplate('
{name:htmlEncode}',"
")}),MODx.combo.EventGroup.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.EventGroup,MODx.combo.ComboBox),Ext.reg("modx-combo-eventgroup",MODx.combo.EventGroup),MODx.combo.ResourceGroup=function(config){config=config||{},Ext.applyIf(config,{name:"resourcegroup",hiddenName:"resourcegroup",displayField:"name",valueField:"id",fields:["name","id"],pageSize:20,url:MODx.config.connector_url,baseParams:{action:"Security/ResourceGroup/GetList"}}),MODx.combo.ResourceGroup.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.ResourceGroup,MODx.combo.ComboBox),Ext.reg("modx-combo-resourcegroup",MODx.combo.ResourceGroup),MODx.combo.Context=function(config){config=config||{},Ext.applyIf(config,{name:"context",hiddenName:"context",displayField:"key",valueField:"key",fields:["key","name"],pageSize:20,url:MODx.config.connector_url,baseParams:{action:"Context/GetList",exclude:config.exclude||""},tpl:new Ext.XTemplate('
{name:htmlEncode} ({key:htmlEncode})
')}),MODx.combo.Context.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Context,MODx.combo.ComboBox),Ext.reg("modx-combo-context",MODx.combo.Context),MODx.combo.Policy=function(config){config=config||{},Ext.applyIf(config,{name:"policy",hiddenName:"policy",displayField:"name",valueField:"id",fields:["id","name","permissions"],allowBlank:!1,editable:!1,pageSize:20,url:MODx.config.connector_url,baseParams:{action:"Security/Access/Policy/GetList"}}),MODx.combo.Policy.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Policy,MODx.combo.ComboBox),Ext.reg("modx-combo-policy",MODx.combo.Policy),MODx.combo.Template=function(config){config=config||{},Ext.applyIf(config,{url:MODx.config.connector_url,baseParams:{action:"Element/Template/GetList",combo:!0},fields:["id","templatename","description","category_name","preview","time"],name:"template",hiddenName:"template",displayField:"templatename",valueField:"id",pageSize:20,allowBlank:!0,editable:!0,typeAhead:!0,tpl:new Ext.XTemplate('
{this.label:htmlEncode}
{templatename:htmlEncode}
{description:htmlEncode()}
',{group:null,label:null,getGroup:function(label,time){var group=time+"_"+label;return group===this.group||Ext.isEmpty(group)?null:(this.group=group,this.label=label)}})}),MODx.combo.Template.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Template,MODx.combo.ComboBox),Ext.reg("modx-combo-template",MODx.combo.Template),MODx.combo.Category=function(config){config=config||{},Ext.applyIf(config,{name:"category",hiddenName:"category",displayField:"name",valueField:"id",fields:["id","category","parent","name"],forceSelection:!0,typeAhead:!1,allowBlank:!0,editable:!1,enableKeyEvents:!0,pageSize:20,url:MODx.config.connector_url,baseParams:{action:"Element/Category/GetList",showNone:!0,limit:0}}),MODx.combo.Category.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Category,MODx.combo.ComboBox,{_onblur:function(t,e){var v=this.getRawValue();this.setRawValue(v),this.setValue(v,!0)}}),Ext.reg("modx-combo-category",MODx.combo.Category),MODx.combo.Language=function(config){config=config||{},Ext.applyIf(config,{name:"language",hiddenName:"language",displayField:"name",valueField:"name",fields:["name"],typeAhead:!0,minChars:1,editable:!0,allowBlank:!0,url:MODx.config.connector_url,baseParams:{action:"System/Language/GetList"}}),MODx.combo.Language.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Language,MODx.combo.ComboBox),Ext.reg("modx-combo-language",MODx.combo.Language),MODx.combo.Charset=function(config){config=config||{},Ext.applyIf(config,{name:"charset",hiddenName:"charset",displayField:"text",valueField:"value",fields:["value","text"],forceSelection:!0,typeAhead:!1,editable:!1,allowBlank:!1,url:MODx.config.connector_url,baseParams:{action:"System/Charset/GetList"}}),MODx.combo.Charset.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Charset,MODx.combo.ComboBox),Ext.reg("modx-combo-charset",MODx.combo.Charset),MODx.combo.RTE=function(config){config=config||{},Ext.applyIf(config,{name:"rte",hiddenName:"rte",displayField:"value",valueField:"value",fields:["value"],forceSelection:!0,typeAhead:!1,editable:!1,allowBlank:!1,url:MODx.config.connector_url,baseParams:{action:"System/Rte/GetList"}}),MODx.combo.RTE.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.RTE,MODx.combo.ComboBox),Ext.reg("modx-combo-rte",MODx.combo.RTE),MODx.combo.Role=function(config){config=config||{},Ext.applyIf(config,{name:"role",hiddenName:"role",forceSelection:!0,typeAhead:!1,editable:!1,allowBlank:!1,pageSize:20,url:MODx.config.connector_url,baseParams:{action:"Security/Role/GetList",addNone:!0}}),MODx.combo.Role.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Role,MODx.combo.ComboBox),Ext.reg("modx-combo-role",MODx.combo.Role),MODx.combo.ContentType=function(config){config=config||{},Ext.applyIf(config,{name:"content_type",hiddenName:"content_type",forceSelection:!0,typeAhead:!1,editable:!1,allowBlank:!1,pageSize:20,url:MODx.config.connector_url,baseParams:{action:"System/ContentType/GetList"}}),MODx.combo.ContentType.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.ContentType,MODx.combo.ComboBox),Ext.reg("modx-combo-content-type",MODx.combo.ContentType),MODx.combo.ContentDisposition=function(config){config=config||{},Ext.applyIf(config,{store:new Ext.data.SimpleStore({fields:["d","v"],data:[[_("inline"),0],[_("attachment"),1]]}),name:"content_dispo",hiddenName:"content_dispo",displayField:"d",valueField:"v",mode:"local",triggerAction:"all",editable:!1,pageSize:20,selectOnFocus:!1,preventRender:!0}),MODx.combo.ContentDisposition.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.ContentDisposition,MODx.combo.ComboBox),Ext.reg("modx-combo-content-disposition",MODx.combo.ContentDisposition),MODx.combo.ClassDerivatives=function(config){config=config||{},Ext.applyIf(config,{name:"class",hiddenName:"class",url:MODx.config.connector_url,baseParams:{action:"System/Derivatives/GetList",class:"MODX\\Revolution\\modResource"},displayField:"name",valueField:"id",fields:["id","name"],forceSelection:!0,typeAhead:!1,editable:!1,allowBlank:!1,pageSize:20}),MODx.combo.ClassDerivatives.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.ClassDerivatives,MODx.combo.ComboBox),Ext.reg("modx-combo-class-derivatives",MODx.combo.ClassDerivatives),MODx.combo.Namespace=function(config){config=config||{},Ext.applyIf(config,{name:"namespace",hiddenName:"namespace",typeAhead:!0,minChars:1,queryParam:"query",editable:!0,allowBlank:!0,preselectValue:!1,pageSize:20,url:MODx.config.connector_url,baseParams:{action:"Workspace/PackageNamespace/GetList"},fields:["name"],displayField:"name",valueField:"name"}),MODx.combo.Namespace.superclass.constructor.call(this,config),!1!==config.preselectValue&&(this.store.on("load",this.preselectFirstValue,this,{single:!0}),this.store.load())},Ext.extend(MODx.combo.Namespace,MODx.combo.ComboBox,{preselectFirstValue:function(r){var item;if(""==this.config.preselectValue)item=r.getAt(0);else{var found=r.find("name",this.config.preselectValue);item=-1!=found?r.getAt(found):r.getAt(0)}item&&(this.setValue(item.data.name),this.fireEvent("select",this,item))}}),Ext.reg("modx-combo-namespace",MODx.combo.Namespace),MODx.combo.Browser=function(config){config=config||{},Ext.applyIf(config,{width:400,triggerAction:"all",triggerClass:"x-form-file-trigger",source:config.source||MODx.config.default_media_source}),MODx.combo.Browser.superclass.constructor.call(this,config),this.config=config},Ext.extend(MODx.combo.Browser,Ext.form.TriggerField,{browser:null,onTriggerClick:function(btn){return!this.disabled&&(this.browser=MODx.load({xtype:"modx-browser",closeAction:"close",id:Ext.id(),multiple:!0,source:this.config.source||MODx.config.default_media_source,hideFiles:this.config.hideFiles||!1,rootVisible:this.config.rootVisible||!1,allowedFileTypes:this.config.allowedFileTypes||"",wctx:this.config.wctx||"web",openTo:this.config.openTo||"",rootId:this.config.rootId||"/",hideSourceCombo:this.config.hideSourceCombo||!1,listeners:{select:{fn:function(data){this.setValue(data.relativeUrl),this.fireEvent("select",data)},scope:this}}}),this.browser.show(btn),!0)},onDestroy:function(){MODx.combo.Browser.superclass.onDestroy.call(this)}}),Ext.reg("modx-combo-browser",MODx.combo.Browser),MODx.combo.Country=function(config){config=config||{},Ext.applyIf(config,{name:"country",hiddenName:"country",url:MODx.config.connector_url,baseParams:{action:"System/Country/GetList",combo:!0},displayField:"country",valueField:"iso",fields:["iso","country","value"],editable:!0,typeAhead:!0}),MODx.combo.Country.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Country,MODx.combo.ComboBox),Ext.reg("modx-combo-country",MODx.combo.Country),MODx.combo.Gender=function(config){config=config||{},Ext.applyIf(config,{store:new Ext.data.SimpleStore({fields:["d","v"],data:[["",0],[_("user_male"),1],[_("user_female"),2],[_("user_other"),3]]}),displayField:"d",valueField:"v",mode:"local",triggerAction:"all",editable:!1,selectOnFocus:!1}),MODx.combo.Gender.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Gender,Ext.form.ComboBox),Ext.reg("modx-combo-gender",MODx.combo.Gender),MODx.combo.PropertySet=function(config){config=config||{},Ext.applyIf(config,{name:"propertyset",hiddenName:"propertyset",url:MODx.config.connector_url,baseParams:{action:"Element/PropertySet/GetList"},displayField:"name",valueField:"id",fields:["id","name"],editable:!1,pageSize:20,width:300}),MODx.combo.PropertySet.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.PropertySet,MODx.combo.ComboBox),Ext.reg("modx-combo-property-set",MODx.combo.PropertySet),MODx.ChangeParentField=function(config){config=config||{},Ext.applyIf(config,{triggerAction:"all",editable:!1,readOnly:!1,formpanel:"modx-panel-resource",parentcmp:"modx-resource-parent-hidden",contextcmp:"modx-resource-context-key",currentid:MODx.request.id}),MODx.ChangeParentField.superclass.constructor.call(this,config),this.config=config,this.on("click",this.onTriggerClick,this),this.addEvents({end:!0}),this.on("end",this.end,this)},Ext.extend(MODx.ChangeParentField,Ext.form.TriggerField,{oldValue:!1,oldDisplayValue:!1,end:function(p){var t=Ext.getCmp("modx-resource-tree");t&&(p.d=p.d||p.v,t.removeListener("click",this.handleChangeParent,this),t.on("click",t._handleClick,t),t.disableHref=!1,MODx.debug("Setting parent to: "+p.v),Ext.getCmp(this.config.parentcmp).setValue(p.v),this.setValue(p.d),this.oldValue=!1,"modx-template-picker-parent-id"!==this.config.parentcmp&&Ext.getCmp(this.config.formpanel).fireEvent("fieldChange"))},onTriggerClick:function(){if(this.disabled)return!1;if(this.oldValue)return this.fireEvent("end",{v:this.oldValue,d:this.oldDisplayValue}),!1;if(MODx.debug("onTriggerClick"),!Ext.getCmp("modx-resource-tree")){MODx.debug("no tree found, trying to activate");var tp=Ext.getCmp("modx-leftbar-tabpanel");return tp?(tp.on("tabchange",(function(tbp,tab){"modx-resource-tree-ct"==tab.id&&this.disableTreeClick()}),this),tp.activate("modx-resource-tree-ct")):MODx.debug("no tabpanel"),!1}this.disableTreeClick()},disableTreeClick:function(){return MODx.debug("Disabling tree click"),t=Ext.getCmp("modx-resource-tree"),t?(this.oldDisplayValue=this.getValue(),this.oldValue=Ext.getCmp(this.config.parentcmp).getValue(),this.setValue(_("resource_parent_select_node")),t.expand(),t.removeListener("click",t._handleClick),t.on("click",this.handleChangeParent,this),t.disableHref=!0,!0):(MODx.debug("No tree found in disableTreeClick!"),!1)},handleChangeParent:function(node,e){var t=Ext.getCmp("modx-resource-tree");if(!t)return!1;t.disableHref=!0;var id=node.id.split("_");if((id=id[1])==this.config.currentid)return MODx.msg.alert("",_("resource_err_own_parent")),!1;var ctxf=Ext.getCmp(this.config.contextcmp);if(ctxf){var ctxv=ctxf.getValue();node.attributes&&node.attributes.ctx!=ctxv&&ctxf.setValue(node.attributes.ctx)}return this.fireEvent("end",{v:"modContext"!=node.attributes.type?id:node.attributes.pk,d:Ext.util.Format.stripTags(node.text)}),e.preventDefault(),e.stopEvent(),!0}}),Ext.reg("modx-field-parent-change",MODx.ChangeParentField),MODx.combo.TVWidget=function(config){config=config||{},Ext.applyIf(config,{name:"widget",hiddenName:"widget",displayField:"name",valueField:"value",fields:["value","name"],editable:!1,url:MODx.config.connector_url,baseParams:{action:"Element/TemplateVar/Renders/GetOutputs"},value:"default"}),MODx.combo.TVWidget.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.TVWidget,MODx.combo.ComboBox),Ext.reg("modx-combo-tv-widget",MODx.combo.TVWidget),MODx.combo.TVInputType=function(config){config=config||{},Ext.applyIf(config,{name:"type",hiddenName:"type",displayField:"name",valueField:"value",editable:!1,fields:["value","name"],url:MODx.config.connector_url,baseParams:{action:"Element/TemplateVar/Renders/GetInputs"},value:"text"}),MODx.combo.TVInputType.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.TVInputType,MODx.combo.ComboBox),Ext.reg("modx-combo-tv-input-type",MODx.combo.TVInputType),MODx.combo.Dashboard=function(config){config=config||{},Ext.applyIf(config,{name:"dashboard",hiddenName:"dashboard",displayField:"name",valueField:"id",fields:["id","name","description"],pageSize:20,url:MODx.config.connector_url,baseParams:{action:"System/Dashboard/GetList"},tpl:new Ext.XTemplate('','
','

{name:htmlEncode}

','

{description:htmlEncode}

',"
")}),MODx.combo.Dashboard.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Dashboard,MODx.combo.ComboBox),Ext.reg("modx-combo-dashboard",MODx.combo.Dashboard),MODx.combo.MediaSource=function(config){config=config||{},Ext.applyIf(config,{name:"source",hiddenName:"source",displayField:"name",valueField:"id",fields:["id","name","description"],pageSize:20,url:MODx.config.connector_url,baseParams:{action:"Source/GetList"},tpl:new Ext.XTemplate('','
','

{name:htmlEncode}

','

{description:htmlEncode}

',"
")}),MODx.combo.MediaSource.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.MediaSource,MODx.combo.ComboBox),Ext.reg("modx-combo-source",MODx.combo.MediaSource),MODx.combo.MediaSourceType=function(config){config=config||{},Ext.applyIf(config,{name:"class_key",hiddenName:"class_key",displayField:"name",valueField:"class",fields:["id","class","name","description"],pageSize:20,url:MODx.config.connector_url,baseParams:{action:"Source/Type/GetList"},tpl:new Ext.XTemplate('','
','

{name:htmlEncode}

','

{description:htmlEncode}

',"
")}),MODx.combo.MediaSourceType.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.MediaSourceType,MODx.combo.ComboBox),Ext.reg("modx-combo-source-type",MODx.combo.MediaSourceType),MODx.combo.Authority=function(config){config=config||{},Ext.applyIf(config,{name:"authority",hiddenName:"authority",forceSelection:!0,typeAhead:!1,editable:!1,allowBlank:!1,pageSize:20,url:MODx.config.connector_url,baseParams:{action:"Security/Role/GetAuthorityList",addNone:!0}}),MODx.combo.Authority.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Authority,MODx.combo.ComboBox),Ext.reg("modx-combo-authority",MODx.combo.Authority),MODx.combo.ManagerTheme=function(config){config=config||{},Ext.applyIf(config,{name:"theme",hiddenName:"theme",displayField:"theme",valueField:"theme",fields:["theme"],url:MODx.config.connector_url,baseParams:{action:"Workspace/Theme/GetList"},typeAhead:!1,editable:!1}),MODx.combo.ManagerTheme.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.ManagerTheme,MODx.combo.ComboBox),Ext.reg("modx-combo-manager-theme",MODx.combo.ManagerTheme),MODx.combo.SettingKey=function(config){config=config||{},Ext.applyIf(config,{name:"key",hiddenName:"key",displayField:"key",valueField:"key",fields:["key"],url:MODx.config.connector_url,baseParams:{action:"System/Settings/GetList"},triggerAction:"all",editable:!0,forceSelection:!1,pageSize:20}),MODx.combo.SettingKey.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.SettingKey,MODx.combo.ComboBox),Ext.reg("modx-combo-setting-key",MODx.combo.SettingKey),MODx.combo.Visibility=function(config){config=config||{},Ext.applyIf(config,{name:"visibility",hiddenName:"visibility",store:new Ext.data.SimpleStore({fields:["d","v"],data:[[_("file_folder_visibility_public"),"public"],[_("file_folder_visibility_private"),"private"]]}),displayField:"d",valueField:"v",mode:"local",triggerAction:"all",editable:!1,selectOnFocus:!1,preventRender:!0,forceSelection:!0,enableKeyEvents:!0}),MODx.combo.Visibility.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Visibility,MODx.combo.ComboBox),Ext.reg("modx-combo-visibility",MODx.combo.Visibility),MODx.combo.Permission=function(config){config=config||{},Ext.applyIf(config,{name:"permission",hiddenName:"permission",displayField:"name",valueField:"name",fields:["name","description"],editable:!0,typeAhead:!1,forceSelection:!1,enableKeyEvents:!0,autoSelect:!1,pageSize:20,tpl:new Ext.XTemplate('
{name:htmlEncode}','

{description:htmlEncode}

'),url:MODx.config.connector_url,baseParams:{action:"Security/Access/Permission/GetList"}}),MODx.combo.Permission.superclass.constructor.call(this,config)},Ext.extend(MODx.combo.Permission,MODx.combo.ComboBox),Ext.reg("modx-combo-permission",MODx.combo.Permission),Ext.namespace("MODx.grid"),MODx.grid.Grid=function(config){if(config=config||{},this.config=config,this._loadStore(),this._loadColumnModel(),Ext.applyIf(config,{store:this.store,cm:this.cm,sm:new Ext.grid.RowSelectionModel({singleSelect:!0}),paging:!!config.bbar,loadMask:!0,autoHeight:!0,collapsible:!0,stripeRows:!0,header:!1,cls:"modx-grid",preventRender:!0,preventSaveRefresh:!0,showPerPage:!0,stateful:!1,showActionsColumn:!0,disableContextMenuAction:!1,menuConfig:{defaultAlign:"tl-b?",enableScrolling:!1},viewConfig:{forceFit:!0,enableRowBody:!0,autoFill:!0,showPreview:!0,scrollOffset:0,emptyText:config.emptyText||_("ext_emptymsg")},groupingConfig:{enableGroupingMenu:!0}}),config.paging){var pgItms=config.showPerPage?[_("per_page")+":",{xtype:"textfield",cls:"x-tbar-page-size",value:config.pageSize||parseInt(MODx.config.default_per_page)||20,listeners:{change:{fn:this.onChangePerPage,scope:this},render:{fn:function(cmp){new Ext.KeyMap(cmp.getEl(),{key:Ext.EventObject.ENTER,fn:this.blur,scope:cmp})},scope:this}}}]:[];if(config.pagingItems)for(var i=0;i 1 ? "'+(config.pluralText||_("records"))+'" : "'+(config.singleText||_("record"))+'"]})'};Ext.applyIf(config.groupingConfig,groupingConfig),Ext.applyIf(config,{view:new Ext.grid.GroupingView(config.groupingConfig)})}if(config.tbar)for(var ix=0;ix1)return!1;return!0};config.columns&&Array.isArray(config.columns)&&(void 0===config.actionsColumnWidth&&isPercentage(config.columns)&&(defaultActionsColumnWidth=.1),config.columns.push({id:"modx-actions",width:config.actionsColumnWidth||defaultActionsColumnWidth,menuDisabled:!0,renderer:this.actionsColumnRenderer.bind(this)})),config.cm&&config.cm.columns&&Array.isArray(config.cm.columns)&&(void 0===config.actionsColumnWidth&&isPercentage(config.cm.columns)&&(defaultActionsColumnWidth=.1),config.cm.columns.push({id:"modx-actions",width:config.actionsColumnWidth||defaultActionsColumnWidth,menuDisabled:!0,renderer:this.actionsColumnRenderer.bind(this)}))}MODx.grid.Grid.superclass.constructor.call(this,config),this._loadMenu(config),this.addEvents("beforeRemoveRow","afterRemoveRow","afterAutoSave"),this.autosave&&this.on("afterAutoSave",this.onAfterAutoSave,this),config.preventRender||this.render(),this.on({render:{fn:function(){const topToolbar=this.getTopToolbar();topToolbar&&topToolbar.initialConfig.cls&&"has-nested-filters"==topToolbar.initialConfig.cls&&(this.hasNestedFilters=!0)},scope:this},rowcontextmenu:{fn:this._showMenu,scope:this}}),config.autosave&&this.on("afteredit",this.saveRecord,this),config.paging&&config.grouping&&this.getBottomToolbar().bind(this.store),config.paging||config.hasOwnProperty("pageSize")||(config.pageSize=0),this.getStore().load({params:{start:config.pageStart||0,limit:config.hasOwnProperty("pageSize")?config.pageSize:parseInt(MODx.config.default_per_page)||20}}),this.getStore().on("exception",this.onStoreException,this),this.config=config,this.on("click",this.onClickHandler,this)},Ext.extend(MODx.grid.Grid,Ext.grid.EditorGridPanel,{windows:{},onStoreException:function(dataProxy,type,action,options,response){const responseStatusCode=response.status||"Unknown",responseStatusText=Ext.isEmpty(response.statusText)?"":`(${response.statusText})`;let output="",msg="";if(Ext.isEmpty(response.responseText))output=200!==responseStatusCode?`
${responseStatusCode} ${responseStatusText}
`:"";else try{const responseText=Ext.decode(response.responseText);responseText&&responseText.message&&(output=responseText.message)}catch(e){output=response.responseText}output?MODx.config.debug>0?(output=MODx.util.safeHtml(output,"
","class,colspan,rowspan"),msg=_("error_grid_get_content_toscreen",{message:`
${output}
`})):(msg=_("error_grid_get_content_tolog"),output=Ext.util.Format.stripTags(output).replaceAll(">",">").replaceAll("<","<"),console.error(output)):msg=_("error_grid_get_content_no_msg"),this.getView().emptyText=`
${msg}
`,this.getView().refresh(!1)},saveRecord:function(e){e.record.data.menu=null;var p=this.config.saveParams||{};Ext.apply(e.record.data,p);var d=Ext.util.JSON.encode(e.record.data),url=this.config.saveUrl||this.config.url||this.config.connector;MODx.Ajax.request({url,params:{action:this.config.save_action||"updateFromGrid",data:d},listeners:{success:{fn:function(r){this.config.save_callback&&Ext.callback(this.config.save_callback,this.config.scope||this,[r]),e.record.commit(),this.config.preventSaveRefresh||this.refresh(),this.fireEvent("afterAutoSave",r)},scope:this},failure:{fn:function(r){e.record.reject(),this.fireEvent("afterAutoSave",r)},scope:this}}})},onAfterAutoSave:function(response){if(!response.success&&""===response.message){var msg="";response.data.length&&Ext.each(response.data,(function(data,index,list){msg+=(""!=msg?"
":"")+data.msg}),this),Ext.isEmpty(msg)&&(msg=this.autosaveErrorMsg||_("error")),MODx.msg.alert(_("error"),msg)}},onChangePerPage:function(tf,nv){if(Ext.isEmpty(nv))return!1;nv=parseInt(nv),this.getBottomToolbar().pageSize=nv,this.store.load({params:{start:0,limit:nv}})},loadWindow:function(btn,e,win,or){var r=this.menu.record;this.windows[win.xtype]&&!win.force||(Ext.applyIf(win,{record:win.blankValues?{}:r,grid:this,listeners:{success:{fn:win.success||this.refresh,scope:win.scope||this}}}),or&&Ext.apply(win,or),this.windows[win.xtype]=Ext.ComponentMgr.create(win)),this.windows[win.xtype].setValues&&!0!==win.blankValues&&null!=r&&this.windows[win.xtype].setValues(r),this.windows[win.xtype].show(e.target)},confirm:function(type,text){var p={action:type},k=this.config.primaryKey||"id";p[k]=this.menu.record[k],MODx.msg.confirm({title:_(type),text:_(text)||_("confirm_remove"),url:this.config.url,params:p,listeners:{success:{fn:this.refresh,scope:this}}})},remove:function(text,action){if(this.destroying)return MODx.grid.Grid.superclass.remove.apply(this,arguments);var r=this.menu.record;text=text||"confirm_remove";var p=this.config.saveParams||{};Ext.apply(p,{action:action||"remove"});var k=this.config.primaryKey||"id";p[k]=r[k],this.fireEvent("beforeRemoveRow",r)&&MODx.msg.confirm({title:_("warning"),text:_(text,r),url:this.config.url,params:p,listeners:{success:{fn:function(){this.removeActiveRow(r)},scope:this}}})},removeActiveRow:function(r){if(this.fireEvent("afterRemoveRow",r)){var rx=this.getSelectionModel().getSelected();this.getStore().remove(rx)}},_loadMenu:function(){this.menu=new Ext.menu.Menu(this.config.menuConfig)},_showMenu:function(g,ri,e){if(e.stopEvent(),e.preventDefault(),this.menu.record=this.getStore().getAt(ri).data,this.getSelectionModel().isSelected(ri)||this.getSelectionModel().selectRow(ri),this.menu.removeAll(),this.getMenu){var m=this.getMenu(g,ri,e);m&&m.length&&m.length>0&&this.addContextMenuItem(m)}(!m||m.length<=0)&&this.menu.record.menu&&this.addContextMenuItem(this.menu.record.menu),this.menu.items.length>0&&this.menu.showAt(e.xy)},_loadStore:function(){this.config.grouping?this.store=new Ext.data.GroupingStore({url:this.config.url,baseParams:this.config.baseParams||{action:this.config.action||"getList"},reader:new Ext.data.JsonReader({totalProperty:"total",root:"results",fields:this.config.fields}),sortInfo:{field:this.config.sortBy||"id",direction:this.config.sortDir||"ASC"},remoteSort:this.config.remoteSort||!1,remoteGroup:this.config.remoteGroup||!1,groupField:this.config.groupBy||"name",groupDir:this.config.groupDir||"ASC",storeId:this.config.storeId||Ext.id(),autoDestroy:!0,listeners:{beforeload:function(store,options){store.groupField===store.sortInfo.field&&store.groupDir!==store.sortInfo.direction&&(store.groupDir=store.sortInfo.direction,store.baseParams.groupDir=store.sortInfo.direction)},load:function(store,records,options){const cmp=Ext.getCmp("modx-content");cmp&&cmp.doLayout()},groupchange:{fn:function(store,groupField){store.groupDir=this.config.groupDir||"ASC",store.baseParams.groupDir=store.groupDir,store.sortInfo.direction=this.config.sortDir||"ASC",store.load()},scope:this}}}):this.store=new Ext.data.JsonStore({url:this.config.url,baseParams:this.config.baseParams||{action:this.config.action||"getList"},fields:this.config.fields,root:"results",totalProperty:"total",remoteSort:this.config.remoteSort||!1,storeId:this.config.storeId||Ext.id(),autoDestroy:!0,listeners:{load:function(){const cmp=Ext.getCmp("modx-content");cmp&&cmp.doLayout()}}})},_loadColumnModel:function(){if(this.config.columns){for(var c=this.config.columns,i=0;i
',{compiled:!0})},actionsColumnRenderer:function(value,metaData,record,rowIndex,colIndex,store){var actions=this.getActions.apply(this,[record,rowIndex,colIndex,store]);return!0!==this.config.disableContextMenuAction&&actions.push({text:_("context_menu"),action:"contextMenu",icon:"gear"}),this._getActionsColumnTpl().apply({actions})},renderLink:function(v,attr){var el=new Ext.Element(document.createElement("a"));for(var i in el.addClass("x-grid-link"),el.dom.title=_("edit"),attr)el.dom[i]=attr[i];return el.dom.innerHTML=Ext.util.Format.htmlEncode(v),el.dom.outerHTML},checkEditable:function(e){this.checkCellIsEditable(e)},checkCellIsEditable:function(e){if(-1===(e.record.data.perm||"").indexOf("edit"))return!1;switch(e.grid.xtype){case"modx-grid-role":{const isAuthorityField="authority"===e.field;if(e.record.json.isAssigned&&isAuthorityField)return!1;break}}return!0},setEditableCellClasses:function(record,lockConditions=[],lockedClasses="locked",conditionsRequireAll=!0){const permissions=record.data.perm.trim(),hasEditPermission=permissions.split(" ").includes("edit");let classes="",shouldLock=!1;return lockConditions.length>0&&(shouldLock=conditionsRequireAll?lockConditions.every((condition=>!0===Boolean(condition))):lockConditions.some((condition=>!0===Boolean(condition)))),Ext.isEmpty(permissions)?classes="editor-disabled":hasEditPermission&&shouldLock&&(classes=lockedClasses),classes},getLinkTemplate:function(controllerPath,displayValueIndex,options={}){Ext.applyIf(options,{linkParams:[],linkClass:"x-grid-link",linkTitle:_("edit"),linkTarget:"_blank"});let params="";return controllerPath=0===controllerPath.indexOf("?a=")?controllerPath:`?a=${controllerPath}`,options.linkParams.length>0&&(params=[],options.linkParams.forEach((param=>{params.push(`${param.key}={${param.valueIndex}}`)})),params=`&${params.join("&")}`),new Ext.Template(`{${displayValueIndex}:htmlEncode}`,{compiled:!0})},getActions:function(record,rowIndex,colIndex,store){return[]},onClickHandler:function(e){var target=e.getTarget();if(target.classList.contains("x-grid-action")&&target.dataset.action){var actionHandler="action"+target.dataset.action.charAt(0).toUpperCase()+target.dataset.action.slice(1);if(this[actionHandler]&&"function"==typeof this[actionHandler]||this[actionHandler=target.dataset.action]&&"function"==typeof this[actionHandler]){var record=this.getSelectionModel().getSelected(),recordIndex=this.store.indexOf(record);this.menu.record=record.data,this[actionHandler](record,recordIndex,e)}}},actionContextMenu:function(record,recordIndex,e){this._showMenu(this,recordIndex,e)},makeUrl:function(){if(Array.isArray(this.config.urlFilters)&&this.config.urlFilters.length>0){var s=this.getStore(),p={a:MODx.request.a};MODx.request.id&&(p.id=MODx.request.id),MODx.request.key&&(p.key=MODx.request.key);for(var i=0;i0&&window.history.replaceState(this.getStore().baseParams,document.title,this.makeUrl())},findTabPanel:function(referenceCmp){if(!referenceCmp.hasOwnProperty("ownerCt"))return console.error("MODx.grid.Grid::findTabPanel: This component must have an ownerCt to find its tab panel."),!1;const container=referenceCmp.ownerCt;return container.hasOwnProperty("xtype")&&container.xtype.includes("tabs")?container:this.findTabPanel(container)},hasNestedFilters:!1,currentLanguage:MODx.config.cultureKey||"en",applyRequestFilter:function(tabPanelIndex,requestKey="policy",tabPanelType="vtab",setEmptyToString=!1){const emptyVal=setEmptyToString?"":null;return Object.prototype.hasOwnProperty.call(MODx.request,tabPanelType)&&parseInt(MODx.request[tabPanelType],10)===tabPanelIndex&&Object.prototype.hasOwnProperty.call(MODx.request,requestKey)?MODx.util.url.getParamValue(requestKey):emptyVal},applyGridFilter:function(cmp,param="query"){const filterValue=cmp.getValue(),store=this.getStore(),urlParams={},tabPanel=this.findTabPanel(this),bottomToolbar=this.getBottomToolbar();let parentTabItems,activeParentTabIdx,hasParentTabPanel=!1;if(Ext.isEmpty(filterValue)?MODx.request[param]?urlParams[param]=MODx.request[param]:MODx.util.url.clearParam(cmp):urlParams[param]=filterValue,"ns"==param?store.baseParams.namespace=filterValue:store.baseParams[param]=filterValue,tabPanel){if("modx-vtabs"==tabPanel.xtype){const parentTabPanel=this.findTabPanel(tabPanel);if(parentTabPanel){const activeParentTab=parentTabPanel.getActiveTab();hasParentTabPanel=!0,parentTabItems=parentTabPanel.items,activeParentTabIdx=parentTabItems.indexOf(activeParentTab)}}const activeTab=tabPanel.getActiveTab(),tabItems=tabPanel.items,activeTabIdx=tabItems.indexOf(activeTab);hasParentTabPanel?(tabItems.length>1&&(urlParams.vtab=activeTabIdx),parentTabItems.length>1&&(urlParams.tab=activeParentTabIdx)):tabItems.length>1&&(urlParams.tab=activeTabIdx)}store.load(),MODx.util.url.setParams(urlParams),bottomToolbar&&bottomToolbar.changePage(1)},clearGridFilters:function(items){const store=this.getStore(),bottomToolbar=this.getBottomToolbar();(Array.isArray(items)?items:items.split(",")).forEach((item=>{const itemData=item.replace(/\s+/g,"").split(":"),itemId=itemData[0],itemDefaultVal=2==itemData.length?itemData[1]:null,cmp=this.getFilterComponent(itemId),param=MODx.util.url.getParamNameFromCmp(cmp),isCombo=cmp?.xtype?.includes("combo");if(isCombo?""===itemDefaultVal?cmp.setValue(null):cmp.setValue(itemDefaultVal):cmp.setValue(""),!Ext.isEmpty(itemDefaultVal)){Object.keys(cmp.baseParams).forEach((param=>{switch(param){case"namespace":cmp.baseParams[param]="core";break;case"topic":cmp.baseParams[param]="default"}}))}isCombo&&"local"!==cmp.mode&&cmp.getStore().load(),store.baseParams[param]=itemDefaultVal})),store.load(),MODx.util.url.clearAllParams(),bottomToolbar&&bottomToolbar.changePage(1)},hasNestedFilters:!1,getFilterComponent:function(filterId){const topToolbar=this.getTopToolbar(),cmp=this.hasNestedFilters&&"filter-query"!==filterId?topToolbar.find("itemId",`${filterId}-container`)[0].getComponent(filterId):topToolbar.getComponent(filterId);if(void 0!==cmp)return cmp;console.error(`getFilterComponent: The filter component with itemId '${filterId}' could not be retrieved.`)},refreshFilterOptions:function(filterData=[],clearDependentParams=!0){filterData.length>0&&(filterData.forEach((data=>{const filter=this.getFilterComponent(data.filterId);if(filter){const store=filter.getStore();if(filter.setValue(""),store){if(data.hasOwnProperty("dependentParams")){(Array.isArray(data.dependentParams)?data.dependentParams:data.dependentParams.split(",")).forEach((param=>{clearDependentParams&&store.baseParams.hasOwnProperty(param)&&(store.baseParams[param]="")}))}store.load()}}})),this.refresh())},updateDependentFilter:function(filterId,paramKey,paramValue,clearValue=!1){const filter=this.getFilterComponent(filterId),filterStore=filter?filter.getStore():null;filterStore&&"string"==typeof paramKey&&(clearValue&&filter.setValue(""),filterStore.baseParams[paramKey]=paramValue,filterStore.load())},getQueryFilterField:function(filterSpec="filter-query",implementation="default"){let queryValue="";const filterSpecs=filterSpec.split(":"),filterId=filterSpecs[0].trim();return queryValue=2===filterSpecs.length?filterSpecs[1]:MODx.request.query?MODx.util.url.decodeParamValue(MODx.request.query):"",{xtype:"textfield",itemId:filterId,emptyText:_("search"),value:queryValue,cls:"filter-query",listeners:{change:{fn:function(cmp,newValue,oldValue){this.applyGridFilter(cmp);const usergroupTree=Ext.getCmp("modx-tree-usergroup");if("user-group-users"===implementation&&usergroupTree){const selectedNode=usergroupTree.getSelectionModel().getSelectedNode(),groupId=MODx.util.tree.getGroupIdFromNode(selectedNode);MODx.util.url.setParams({group:groupId})}},scope:this},afterrender:{fn:function(cmp){MODx.request.query&&this.applyGridFilter(cmp)},scope:this},render:{fn:function(cmp){new Ext.KeyMap(cmp.getEl(),{key:Ext.EventObject.ENTER,fn:this.blur,scope:cmp})},scope:this}}}},getClearFiltersButton:function(filters="filter-query",dependentFilterResets=null){if(Ext.isEmpty(filters))return console.error("MODx.grid.Grid::getClearFiltersButton: There was a problem creating the Clear Filter button because the supplied filters list is invalid."),{};const config={text:_("filter_clear"),itemId:"filter-clear",listeners:{click:{fn:function(cmp){if(cmp.dependentResets){cmp.dependentResets.split(",").forEach((reset=>{const[filterId,filterDataIndex]=reset.split(":").map((item=>item.trim()));this.updateDependentFilter(filterId,filterDataIndex,"",!0)}))}this.clearGridFilters(filters)},scope:this},mouseout:{fn:function(evt){this.removeClass("x-btn-focus")}}}};return dependentFilterResets&&(config.dependentResets=dependentFilterResets),config}}),MODx.grid.LocalGrid=function(config){if((config=config||{}).grouping&&Ext.applyIf(config,{view:new Ext.grid.GroupingView({forceFit:!0,scrollOffset:0,hideGroupedColumn:!!config.hideGroupedColumn,groupTextTpl:config.groupTextTpl||'{text} ({[values.rs.length]} {[values.rs.length > 1 ? "'+(config.pluralText||_("records"))+'" : "'+(config.singleText||_("record"))+'"]})'})}),config.tbar)for(var i=0;i
',{compiled:!0})},actionsColumnRenderer:function(value,metaData,record,rowIndex,colIndex,store){var actions=this.getActions.apply(this,arguments);return!0!==this.config.disableContextMenuAction&&actions.push({text:_("context_menu"),action:"contextMenu",icon:"gear"}),this._getActionsColumnTpl().apply({actions})},renderLink:function(v,attr){var el=new Ext.Element(document.createElement("a"));for(var i in el.addClass("x-grid-link"),el.dom.title=_("edit"),attr)el.dom[i]=attr[i];return el.dom.innerHTML=Ext.util.Format.htmlEncode(v),el.dom.outerHTML},getActions:function(value,metaData,record,rowIndex,colIndex,store){return[]},onClick:function(e){var target=e.getTarget();if(target.classList.contains("x-grid-action")&&target.dataset.action){var actionHandler="action"+target.dataset.action.charAt(0).toUpperCase()+target.dataset.action.slice(1);if(this[actionHandler]&&"function"==typeof this[actionHandler]||this[actionHandler=target.dataset.action]&&"function"==typeof this[actionHandler]){var record=this.getSelectionModel().getSelected(),recordIndex=this.store.indexOf(record);this.menu.record=record.data,this[actionHandler](record,recordIndex,e)}}},actionContextMenu:function(record,recordIndex,e){this._showMenu(this,recordIndex,e)}}),Ext.reg("grid-local",MODx.grid.LocalGrid),Ext.reg("modx-grid-local",MODx.grid.LocalGrid), /*! * Ext JS Library 3.4.0 * Copyright(c) 2006-2011 Sencha Inc. diff --git a/manager/assets/modext/widgets/core/modx.grid.js b/manager/assets/modext/widgets/core/modx.grid.js index ed8daf286be..c25fce154e7 100644 --- a/manager/assets/modext/widgets/core/modx.grid.js +++ b/manager/assets/modext/widgets/core/modx.grid.js @@ -225,6 +225,7 @@ Ext.extend(MODx.grid.Grid,Ext.grid.EditorGridPanel,{ this.getView().emptyText = `
${msg}
`; this.getView().refresh(false); } + ,saveRecord: function(e) { e.record.data.menu = null; var p = this.config.saveParams || {}; @@ -407,14 +408,31 @@ Ext.extend(MODx.grid.Grid,Ext.grid.EditorGridPanel,{ ,remoteSort: this.config.remoteSort || false ,remoteGroup: this.config.remoteGroup || false ,groupField: this.config.groupBy || 'name' + ,groupDir: this.config.groupDir || 'ASC' ,storeId: this.config.storeId || Ext.id() ,autoDestroy: true - ,listeners:{ - load: function(){ + ,listeners: { + beforeload: function(store, options) { + const changedGroupDir = store.groupField === store.sortInfo.field && store.groupDir !== store.sortInfo.direction; + if (changedGroupDir) { + store.groupDir = store.sortInfo.direction; + store.baseParams.groupDir = store.sortInfo.direction; + } + }, + load: function(store, records, options) { const cmp = Ext.getCmp('modx-content'); if (cmp) { cmp.doLayout(); } + }, + groupchange: { + fn: function(store, groupField) { + store.groupDir = this.config.groupDir || 'ASC'; + store.baseParams.groupDir = store.groupDir; + store.sortInfo.direction = this.config.sortDir || 'ASC'; + store.load(); + }, + scope: this } } }); @@ -429,7 +447,7 @@ Ext.extend(MODx.grid.Grid,Ext.grid.EditorGridPanel,{ ,storeId: this.config.storeId || Ext.id() ,autoDestroy: true ,listeners:{ - load: function(){ + load: function() { const cmp = Ext.getCmp('modx-content'); if (cmp) { cmp.doLayout(); diff --git a/manager/assets/modext/widgets/security/modx.grid.user.group.base.js b/manager/assets/modext/widgets/security/modx.grid.user.group.base.js index 2ce9ea09af2..1a025ae3678 100644 --- a/manager/assets/modext/widgets/security/modx.grid.user.group.base.js +++ b/manager/assets/modext/widgets/security/modx.grid.user.group.base.js @@ -45,11 +45,11 @@ MODx.grid.UserGroupBase = function UserGroupBase(config = {}) { paging: true, hideMode: 'offsets', grouping: true, - groupBy: 'authority_name', + remoteGroup: true, + groupBy: 'role_display', singleText: _('policy'), pluralText: _('policies'), - sortBy: 'authority', - sortDir: 'ASC', + sortBy: 'name', remoteSort: true }); diff --git a/manager/assets/modext/widgets/security/modx.grid.user.group.category.js b/manager/assets/modext/widgets/security/modx.grid.user.group.category.js index 16da466e9a2..189576c9d87 100644 --- a/manager/assets/modext/widgets/security/modx.grid.user.group.category.js +++ b/manager/assets/modext/widgets/security/modx.grid.user.group.category.js @@ -16,7 +16,8 @@ MODx.grid.UserGroupCategory = function UserGroupCategory(config = {}) { action: 'Security/Access/UserGroup/Category/GetList', usergroup: config.usergroup, category: MODx.request.category || null, - policy: this.applyRequestFilter(2) + policy: this.applyRequestFilter(2), + isGroupingGrid: true }, fields: [ 'id', @@ -24,7 +25,7 @@ MODx.grid.UserGroupCategory = function UserGroupCategory(config = {}) { 'name', 'principal', 'authority', - 'authority_name', + 'role_display', 'policy', 'policy_name', 'context_key', @@ -39,14 +40,16 @@ MODx.grid.UserGroupCategory = function UserGroupCategory(config = {}) { sortable: true }, { header: _('minimum_role'), - dataIndex: 'authority_name', + dataIndex: 'role_display', width: 100, + sortable: true, xtype: 'templatecolumn', - tpl: this.getLinkTemplate('security/permission', 'authority_name') + tpl: this.getLinkTemplate('security/permission', 'role_display') }, { header: _('policy'), dataIndex: 'policy_name', width: 200, + sortable: true, xtype: 'templatecolumn', tpl: this.getLinkTemplate('security/access/policy/update', 'policy_name', { linkParams: [{ key: 'id', valueIndex: 'policy' }] @@ -76,6 +79,7 @@ MODx.grid.UserGroupCategory = function UserGroupCategory(config = {}) { emptyText: _('filter_by_category'), width: 200, allowBlank: true, + displayField: 'category', value: MODx.request.category || null, baseParams: { action: 'Element/Category/GetList', diff --git a/manager/assets/modext/widgets/security/modx.grid.user.group.context.js b/manager/assets/modext/widgets/security/modx.grid.user.group.context.js index bb61c2036a1..f977aa85172 100644 --- a/manager/assets/modext/widgets/security/modx.grid.user.group.context.js +++ b/manager/assets/modext/widgets/security/modx.grid.user.group.context.js @@ -16,19 +16,21 @@ MODx.grid.UserGroupContext = function UserGroupContext(config = {}) { action: 'Security/Access/UserGroup/Context/GetList', usergroup: config.usergroup, context: MODx.request.context || null, - policy: this.applyRequestFilter(0) + policy: this.applyRequestFilter(0), + isGroupingGrid: true }, fields: [ 'id', 'target', 'principal', 'authority', - 'authority_name', + 'role_display', 'policy', 'policy_name', 'permissions', 'cls' ], + sortBy: 'target', columns: this.getColumns([ { header: _('context'), @@ -41,10 +43,11 @@ MODx.grid.UserGroupContext = function UserGroupContext(config = {}) { }) }, { header: _('minimum_role'), - dataIndex: 'authority_name', + dataIndex: 'role_display', width: 100, + sortable: true, xtype: 'templatecolumn', - tpl: this.getLinkTemplate('security/permission', 'authority_name') + tpl: this.getLinkTemplate('security/permission', 'role_display') }, { header: _('policy'), dataIndex: 'policy_name', diff --git a/manager/assets/modext/widgets/security/modx.grid.user.group.namespace.js b/manager/assets/modext/widgets/security/modx.grid.user.group.namespace.js index aef92808e7d..3a796ab6b67 100644 --- a/manager/assets/modext/widgets/security/modx.grid.user.group.namespace.js +++ b/manager/assets/modext/widgets/security/modx.grid.user.group.namespace.js @@ -16,7 +16,8 @@ MODx.grid.UserGroupNamespace = function UserGroupNamespace(config = {}) { action: 'Security/Access/UserGroup/AccessNamespace/GetList', usergroup: config.usergroup, namespace: this.applyRequestFilter(4, 'ns'), - policy: this.applyRequestFilter(4) + policy: this.applyRequestFilter(4), + isGroupingGrid: true }, fields: [ 'id', @@ -24,7 +25,7 @@ MODx.grid.UserGroupNamespace = function UserGroupNamespace(config = {}) { 'name', 'principal', 'authority', - 'authority_name', + 'role_display', 'policy', 'policy_name', 'context_key', @@ -41,14 +42,16 @@ MODx.grid.UserGroupNamespace = function UserGroupNamespace(config = {}) { tpl: this.getLinkTemplate('workspaces/namespace', 'name') }, { header: _('minimum_role'), - dataIndex: 'authority_name', + dataIndex: 'role_display', width: 100, + sortable: true, xtype: 'templatecolumn', - tpl: this.getLinkTemplate('security/permission', 'authority_name') + tpl: this.getLinkTemplate('security/permission', 'role_display') }, { header: _('policy'), dataIndex: 'policy_name', width: 200, + sortable: true, xtype: 'templatecolumn', tpl: this.getLinkTemplate('security/access/policy/update', 'policy_name', { linkParams: [{ key: 'id', valueIndex: 'policy' }] diff --git a/manager/assets/modext/widgets/security/modx.grid.user.group.resource.js b/manager/assets/modext/widgets/security/modx.grid.user.group.resource.js index f646caa198a..2154cb852fc 100644 --- a/manager/assets/modext/widgets/security/modx.grid.user.group.resource.js +++ b/manager/assets/modext/widgets/security/modx.grid.user.group.resource.js @@ -16,7 +16,8 @@ MODx.grid.UserGroupResourceGroup = function UserGroupResourceGroup(config = {}) action: 'Security/Access/UserGroup/ResourceGroup/GetList', usergroup: config.usergroup, resourceGroup: MODx.request.resourceGroup || null, - policy: this.applyRequestFilter(1) + policy: this.applyRequestFilter(1), + isGroupingGrid: true }, fields: [ 'id', @@ -24,7 +25,7 @@ MODx.grid.UserGroupResourceGroup = function UserGroupResourceGroup(config = {}) 'name', 'principal', 'authority', - 'authority_name', + 'role_display', 'policy', 'policy_name', 'context_key', @@ -41,14 +42,16 @@ MODx.grid.UserGroupResourceGroup = function UserGroupResourceGroup(config = {}) tpl: this.getLinkTemplate('security/resourcegroup', 'name') }, { header: _('minimum_role'), - dataIndex: 'authority_name', + dataIndex: 'role_display', width: 100, + sortable: true, xtype: 'templatecolumn', - tpl: this.getLinkTemplate('security/permission', 'authority_name') + tpl: this.getLinkTemplate('security/permission', 'role_display') }, { header: _('policy'), dataIndex: 'policy_name', width: 200, + sortable: true, xtype: 'templatecolumn', tpl: this.getLinkTemplate('security/access/policy/update', 'policy_name', { linkParams: [{ key: 'id', valueIndex: 'policy' }] diff --git a/manager/assets/modext/widgets/security/modx.grid.user.group.source.js b/manager/assets/modext/widgets/security/modx.grid.user.group.source.js index c26983488e7..46ba574666a 100644 --- a/manager/assets/modext/widgets/security/modx.grid.user.group.source.js +++ b/manager/assets/modext/widgets/security/modx.grid.user.group.source.js @@ -16,7 +16,8 @@ MODx.grid.UserGroupSource = function UserGroupSource(config = {}) { action: 'Security/Access/UserGroup/Source/GetList', usergroup: config.usergroup, source: MODx.request.source || null, - policy: this.applyRequestFilter(3) + policy: this.applyRequestFilter(3), + isGroupingGrid: true }, fields: [ 'id', @@ -24,7 +25,7 @@ MODx.grid.UserGroupSource = function UserGroupSource(config = {}) { 'name', 'principal', 'authority', - 'authority_name', + 'role_display', 'policy', 'policy_name', 'context_key', @@ -43,14 +44,16 @@ MODx.grid.UserGroupSource = function UserGroupSource(config = {}) { }) }, { header: _('minimum_role'), - dataIndex: 'authority_name', + dataIndex: 'role_display', width: 100, + sortable: true, xtype: 'templatecolumn', - tpl: this.getLinkTemplate('security/permission', 'authority_name') + tpl: this.getLinkTemplate('security/permission', 'role_display') }, { header: _('policy'), dataIndex: 'policy_name', width: 200, + sortable: true, xtype: 'templatecolumn', tpl: this.getLinkTemplate('security/access/policy/update', 'policy_name', { linkParams: [{ key: 'id', valueIndex: 'policy' }]