diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8e6af3f --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +composer.lock +vendor + diff --git a/CHANGE.md b/CHANGE.md index 7384a9c..fd81439 100755 --- a/CHANGE.md +++ b/CHANGE.md @@ -4,7 +4,7 @@ Change Log: `yii2-tree-manager` ## Version 1.1.3 **Date:** _under development_ - +- (enh #260): Separate User Mode and Admin Mode Views - (bug #259): Correct icons list display based on `iconEditSettings['show']`. - (enh #258): Enhanced BS4 custom checkbox and radio styling for toggle inputs. - (enh #257): Enhance search close icon styling. @@ -211,4 +211,4 @@ Change Log: `yii2-tree-manager` - (enh #4): Error trapping enhancements to `Tree::activateNode` and `Tree::removeNode` - (enh #3): Set dependencies for Asset Bundles. - (bug #2): Empty node validation on tree init. -- Initial release \ No newline at end of file +- Initial release diff --git a/src/Module.php b/src/Module.php index d848c46..7ff12ab 100644 --- a/src/Module.php +++ b/src/Module.php @@ -39,6 +39,11 @@ class Module extends \kartik\base\Module * Save node action */ const NODE_SAVE = 'save'; + /** + * Flip node action + */ + const NODE_FLIP = 'flip'; + /** * Tree details form view - Section Part 1 */ @@ -80,6 +85,8 @@ class Module extends \kartik\base\Module */ public $treeViewSettings = [ 'nodeView' => '@kvtree/views/_form', + 'nodeUser' => '@kvtree/views/_user', + 'modeView' => 0, 'nodeAddlViews' => [ self::VIEW_PART_1 => '', self::VIEW_PART_2 => '', @@ -129,6 +136,7 @@ public function init() self::NODE_SAVE => Url::to(['/treemanager/node/save']), self::NODE_REMOVE => Url::to(['/treemanager/node/remove']), self::NODE_MOVE => Url::to(['/treemanager/node/move']), + self::NODE_FLIP => Url::to(['/treemanager/node/flip']), ]; $this->treeViewSettings['nodeActions'] = $nodeActions; } diff --git a/src/TreeSecurity.php b/src/TreeSecurity.php index 0f2b0cd..f3a5a26 100644 --- a/src/TreeSecurity.php +++ b/src/TreeSecurity.php @@ -16,6 +16,7 @@ use yii\helpers\ArrayHelper; use yii\helpers\Html; use yii\helpers\Json; +use yii\helpers\VarDumper; use yii\console\Application; /** @@ -41,7 +42,9 @@ public static function parseManageData($data = []) 'defaultBtnCss' => '', 'formAction' => '', 'currUrl' => '', - 'nodeView' => '', + 'nodeView' => '@kvtree/views/_form', + 'nodeUser' => '@kvtree/views/_user', + 'modeView' => 0, 'nodeSelected' => '', 'nodeTitle' => $nodeTitles['node'], 'nodeTitlePlural' => $nodeTitles['nodes'], @@ -61,6 +64,9 @@ public static function parseManageData($data = []) 'iconsList' => [], 'breadcrumbs' => [], ]; + +// yii::debug( 'data: ' . VarDumper::dumpAsString($data)); + $out = static::getParsedData($defaults, $data, function ($type, $key, $value) { if ($type === 'array' && $key === 'iconsList' && is_array($value)) { $new = []; diff --git a/src/TreeView.php b/src/TreeView.php index 1c1f308..63e4ad1 100644 --- a/src/TreeView.php +++ b/src/TreeView.php @@ -42,6 +42,10 @@ class TreeView extends Widget * Create tree node button */ const BTN_CREATE = 'create'; + /** + * Flip View Mode button + */ + const BTN_FLIPVIEW = 'flipview'; /** * Remove tree node button */ @@ -136,6 +140,16 @@ class TreeView extends Widget */ public $nodeView; + /** + * @var string the view file that will render the form for displaying the node data. + */ + public $nodeUser; + + /** + * @var int The view mode when in isAdmin mode. 0=admin, 1=user. + */ + public $modeView = 0; + /** * @var array the markup for the submit and reset button labels in the node view form */ @@ -921,11 +935,19 @@ public function initOptions() 'options' => ['title' => Yii::t('kvtree', 'Refresh')], 'url' => Yii::$app->request->url, ], + self::BTN_FLIPVIEW => [ + 'icon' => 'user', + 'options' => ['title' => 'Flip View'], + ], + ]; + $this->toolbar = array_replace_recursive($defaultToolbar, $this->toolbar); + if (!$this->allowNewRoots) { - unset($this->toolbar[self::BTN_CREATE_ROOT]); - } + unset($this->toolbar[self::BTN_CREATE_ROOT]); + } + $this->sortToolbar(); $this->_nodeIconsList = $this->getIconsList(); } @@ -978,6 +1000,8 @@ public function renderWrapper() */ public function renderToolbar() { + if (!$this->isAdmin ) return; + $out = Html::beginTag('div', $this->toolbarOptions) . "\n" . Html::beginTag('div', $this->buttonGroupOptions); foreach ($this->toolbar as $btn => $settings) { @@ -1049,6 +1073,7 @@ public function renderHeader() */ public function renderFooter() { + if (!$this->isAdmin ) return (""); return Html::tag('div', $this->footerTemplate, $this->footerOptions); } @@ -1217,6 +1242,9 @@ public function renderDetail() $node->$iconTypeAttribute = ArrayHelper::getValue($this->iconEditSettings, 'type', self::ICON_CSS); } $url = Yii::$app->request->url; + + $this->initViewMode(); + $manageData = TreeSecurity::parseManageData([ 'formOptions' => $this->nodeFormOptions, 'hideCssClass' => $this->hideCssClass, @@ -1232,6 +1260,8 @@ public function renderDetail() 'showIDAttribute' => $this->showIDAttribute, 'showNameAttribute' => $this->showNameAttribute, 'nodeView' => $this->nodeView, + 'nodeUser' => $this->nodeUser, + 'modeView' => $this->modeView, 'nodeAddlViews' => $this->nodeAddlViews, 'nodeViewButtonLabels' => $this->nodeViewButtonLabels, 'nodeViewParams' => serialize($this->nodeViewParams), @@ -1252,11 +1282,18 @@ public function renderDetail() ]); $params = $this->_module->treeStructure + $this->_module->dataStructure + [ 'node' => $node, + 'modeView' => $this->modeView, 'treeManageHash' => $manageData['newHash'], 'treeRemoveHash' => $removeData['newHash'], 'treeMoveHash' => $moveData['newHash'], ] + $manageData['out'] + $this->nodeViewParams; - $content = $this->render($this->nodeView, ['params' => $params]); + + $view = $this->nodeUser; + if ($this->isAdmin and $this->modeView ) { + $view =$this->nodeView; + } + + $content = $this->render($view,['params' => $params]); return Html::tag('div', $content, $this->detailOptions); } @@ -1298,6 +1335,7 @@ public function registerAssets() 'showIDAttribute' => $this->showIDAttribute, 'showNameAttribute' => $this->showNameAttribute, 'nodeView' => $this->nodeView, + 'nodeUser' => $this->nodeUser, 'nodeAddlViews' => $this->nodeAddlViews, 'nodeViewParams' => serialize($this->nodeViewParams), 'nodeViewButtonLabels' => $this->nodeViewButtonLabels, @@ -1339,7 +1377,7 @@ protected function initTreeView() if (empty($this->emptyNodeMsg)) { $this->emptyNodeMsg = Yii::t( 'kvtree', - 'No valid {nodes} are available for display. Use toolbar buttons to add {nodes}.', + 'No valid {nodes} are available for display.', ['node' => $this->nodeTitle, 'nodes' => $this->nodeTitlePlural] ); } @@ -1383,6 +1421,22 @@ protected function initSelectedNode() $session->set($id, null); } + /** + * Initializes the view mode + * + * @return void + */ + protected function initViewMode() + { + if (Yii::$app->has('session')) { + $session = Yii::$app->session; + yii::debug( 'modeView = ' . $this->modeView . ' isAdmin = ' . $this->isAdmin ); + $this->modeView = $session->get('modeView', $this->isAdmin ); + yii::debug( 'modeView = ' . $this->modeView . ' isAdmin = ' . $this->isAdmin ); + } +// $session->set('modeView', 0); + } + /** * Validation of source query data * diff --git a/src/assets/js/kv-tree.js b/src/assets/js/kv-tree.js index f583396..dcb55b3 100644 --- a/src/assets/js/kv-tree.js +++ b/src/assets/js/kv-tree.js @@ -1,8 +1,8 @@ -/*! +/** * @copyright Copyright © Kartik Visweswaran, Krajee.com, 2015 - 2019 * @package yii2-tree-manager * @version 1.1.3 - * + * * Tree View Validation Module. * * Author: Kartik Visweswaran @@ -16,7 +16,9 @@ var $h, TreeView; - // internal helper methods and constants + /** + * internal helper methods and constants + */ $h = { QUERY_PARAM: 'kvtree', DEFAULT_BUTTONS: { @@ -29,22 +31,37 @@ 'moveR': 'move-right', 'refresh': 'refresh' }, + /** + * + */ isEmpty: function (value, trim) { return value === null || value === undefined || value.length === 0 || (trim && $.trim(value) === ''); }, + /** + * + */ escapeRegExp: function (str) { // noinspection RegExpRedundantEscape return str.replace(/[\-\[\]\/\{}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); }, + /** + * + */ addCss: function ($el, css) { $el.removeClass(css).addClass(css); }, + /** + * + */ hashString: function (s) { return s.split('').reduce(function (a, b) { a = ((a << 5) - a) + b.charCodeAt(0); return a & a; }, 0); }, + /** + * + */ delay: (function () { var timer = 0; return function (callback, ms) { @@ -53,13 +70,18 @@ }; })() }; - // TreeView constructor + /** + * TreeView construcor + */ TreeView = function (element, options) { var self = this; self.$element = $(element); self.init(options); self.listen(); }; + /** + * TreeView prototypes + */ TreeView.prototype = { constructor: TreeView, init: function (options) { @@ -79,6 +101,7 @@ self.$search = self.$wrapper.find('.kv-search-input'); self.$clear = self.$wrapper.find('.kv-search-clear'); $form = self.$detail.find('form'); + self.modeView = $form.find('input[name="modeView"]').val(); self.treeManageHash = $form.find('input[name="treeManageHash"]').val(); self.treeRemoveHash = $form.find('input[name="treeRemoveHash"]').val(); self.treeMoveHash = $form.find('input[name="treeMoveHash"]').val(); @@ -88,6 +111,9 @@ self.selectNodes(); self.validateTooltips(); }, + /** + * + */ initCache: function () { var self = this; self.treeCache = { @@ -115,6 +141,9 @@ } }; }, + /** + * + */ getAjaxData: function (data) { var objCsrf = {}, msg = this.messages, nodeTitles = {nodeTitle: msg.nodeTitle, nodeTitlePlural: msg.nodeTitlePlural}; @@ -122,6 +151,9 @@ objCsrf[yii.getCsrfParam() || '_csrf'] = yii.getCsrfToken(); // jshint ignore:line return $.extend(true, {}, data, objCsrf, nodeTitles); }, + /** + * + */ validateTooltips: function () { var self = this; if (self.showTooltips) { @@ -129,6 +161,9 @@ self.$detail.find('.btn').tooltip(); } }, + /** + * + */ trigAlert: function ($alert, callback) { var dur = this.alertFadeDuration; if (!callback || !$.isFunction(callback)) { @@ -139,6 +174,9 @@ $alert.fadeOut(dur, callback()); }, dur * 2); }, + /** + * + */ selectNodes: function () { var self = this, selected = self.$element.val(); if (selected.length === 0 || $h.isEmpty(selected)) { @@ -151,6 +189,9 @@ $h.addCss(self.$tree.find('li[data-key="' + key + '"]'), 'kv-selected'); }); }, + /** + * + */ raise: function (event, params) { var self = this, e = $.Event(event); if (params !== undefined) { @@ -160,23 +201,38 @@ } return !e.isDefaultPrevented() && e.result !== false; }, + /** + * + */ enableToolbar: function () { var self = this; self.$toolbar.find('button:not([data-always-disabled])').removeAttr('disabled'); }, + /** + * + */ disableToolbar: function () { var self = this; self.$toolbar.find('button').attr('disabled', true); self.$toolbar.find('.kv-' + self.btns.createR + ':not([data-always-disabled])').removeAttr('disabled'); }, + /** + * + */ enable: function (action) { var self = this; self.$toolbar.find('.kv-' + self.btns[action]).removeAttr('disabled'); }, + /** + * + */ disable: function (action) { var self = this; self.$toolbar.find('.kv-' + self.btns[action]).attr('disabled', true); }, + /** + * + */ showAlert: function (msg, type, callback) { var self = this, $detail = self.$detail, $alert = $detail.find('.alert-' + type); $detail.find('.kv-select-node-msg').remove(); @@ -185,14 +241,20 @@ self.trigAlert($alert, callback); }); }, + /** + * + */ removeAlert: function () { var self = this; self.$detail.find('.alert').addClass(self.hideCssClass); }, - renderForm: function (key, par, mesg) { + /** + * + */ + renderForm: function (key, par, mesg, act=this.actions.manage) { var self = this, $detail = self.$detail, parent = par || '', msg = mesg || false, params = $h.hashString(key + self.modelClass + self.isAdmin + parent), $form = $detail.find('form'), - vUrl = self.actions.manage, sep = vUrl && vUrl.indexOf('?') !== -1 ? '&' : '?'; + vUrl = act, sep = vUrl && vUrl.indexOf('?') !== -1 ? '&' : '?'; vUrl += encodeURI(sep + $h.QUERY_PARAM + '=' + params); self.formViewBegin = true; self.parseCache(); @@ -218,6 +280,8 @@ 'showNameAttribute': self.showNameAttribute, 'multiple': self.multiple, 'nodeView': self.nodeView, + 'nodeUser': self.nodeUser, + 'modeView': self.modeView, 'nodeAddlViews': self.nodeAddlViews, 'nodeViewButtonLabels': self.nodeViewButtonLabels, 'nodeViewParams': self.nodeViewParams, @@ -266,12 +330,39 @@ self.raise('treeview:selectajaxerror', [key, jqXHR, textStatus, errorThrown]); }, complete: function (jqXHR) { + self.enableflip(); if (self.raise('treeview:selectajaxcomplete', [key, jqXHR])) { self.validateTooltips(); } } }); }, + /** + * + */ + enableflip: function(){ + var self = this; + $(".kv-flipview").on('click', function () { + self.flipview(); + }); + + }, + /** + * flipview() - Flip the view mode and refresh the detail view. + * + * Note: self.key can be out of date with the detail is being showed + * so we find the key that has the focus. + */ + flipview: function() { + var self = this, $nodeText = self.$tree.find('li .kv-node-detail.kv-focussed'), + $node = $nodeText.closest('li'), key = $node.data('key'); + + self.modeView = (self.modeView == '0') ? '1' : '0'; + self.renderForm( key, '', '', this.actions.flip); + }, + /** + * + */ select: function (key, init, mesg) { if ($h.isEmpty(key)) { return; @@ -320,6 +411,9 @@ } self.parseParentFlag(key); }, + /** + * + */ parseParentFlag: function (key) { var self = this, $flags = self.$detail.find('input[class="kv-parent-flag"]'), $div, $node = self.$tree.find('li[data-key="' + key + '"]'); @@ -335,6 +429,9 @@ } }); }, + /** + * + */ remove: function () { var self = this, $nodeText = self.$tree.find('li .kv-node-detail.kv-focussed'), $node = $nodeText.closest('li'), msg = self.messages, $detail = self.$detail, @@ -380,6 +477,8 @@ data: self.getAjaxData({ 'id': key, 'modelClass': self.modelClass, + 'modeView': self.modeView, + 'modeView': self.modeView, 'softDelete': self.softDelete, 'treeRemoveHash': self.treeRemoveHash }), @@ -433,6 +532,9 @@ }); }); }, + /** + * + */ move: function (dir) { var self = this, $nodeText = self.$tree.find('li .kv-node-detail.kv-focussed'), $nodeFrom = $nodeText.closest('li'), msg = self.messages, $detail = self.$detail, @@ -512,6 +614,7 @@ 'idFrom': keyFrom, 'idTo': keyTo, 'modelClass': self.modelClass, + 'modeView': self.modeView, 'dir': dir, 'allowNewRoots': self.allowNewRoots, 'treeMoveHash': self.treeMoveHash @@ -574,6 +677,9 @@ } }); }, + /** + * + */ setSelected: function () { var self = this, keys = '', desc = ''; self.$tree.find('.kv-selected').each(function () { @@ -587,6 +693,9 @@ self.$element.val(keys); self.raise('change'); }, + /** + * + */ getNewNode: function () { var self = this; return '
\n' + @@ -596,6 +705,9 @@ '
\n' + ''; }, + /** + * + */ create: function () { var self = this, $nodeText = self.$tree.find('li .kv-node-detail.kv-focussed'), $n, key, $node = $nodeText.closest('li'), msg = self.messages, content, $nodeDetail, $newNode; @@ -651,6 +763,9 @@ self.$toolbar.find('.kv-' + self.btns.trash).removeAttr('disabled'); }); }, + /** + * + */ createRoot: function () { var self = this, $treeRoot = self.$tree.find('.kv-tree'), $root = $treeRoot.children('li.kv-empty'); @@ -678,6 +793,9 @@ self.$toolbar.find('.kv-' + self.btns.trash).removeAttr('disabled'); }); }, + /** + * + */ toggle: function ($tog) { var self = this, $node = $tog.closest('li.kv-parent'), nodeKey = $node.data('key'); if ($node.hasClass('kv-collapsed')) { @@ -690,6 +808,9 @@ } } }, + /** + * + */ toggleAll: function (action, trig) { var self = this; if (action === 'expand') { @@ -706,6 +827,9 @@ $h.addCss(self.$treeContainer.find('li.kv-parent'), 'kv-collapsed'); $h.addCss(self.$treeContainer, 'kv-collapsed'); }, + /** + * + */ check: function ($chk) { // noinspection EqualityComparisonWithCoercionJS var self = this, isRoot = ($chk === true), desc, $node = isRoot ? self.$tree : $chk.closest('li'), @@ -753,12 +877,18 @@ self.setSelected(); } }, + /** + * + */ clear: function () { var self = this; self.$treeContainer.removeClass('kv-loading-search'); self.$tree.find('.kv-highlight').removeClass('kv-highlight'); self.blurFilter(); }, + /** + * + */ parseCache: function () { var self = this; if (!self.enableCache) { @@ -785,6 +915,9 @@ } }); }, + /** + * + */ focusFilter: function () { var self = this; if (!self.hideUnmatchedSearchItems) { @@ -797,6 +930,9 @@ $h.addCss(self.$treeContainer, 'kv-active-filter'); } }, + /** + * + */ blurFilter: function () { var self = this; self.clearSearchResults(); @@ -810,6 +946,9 @@ self.$treeContainer.find('.kv-highlight').removeClass('kv-highlight'); self.$treeContainer.find('.kv-tree-container li.kv-filter-match').removeClass('kv-filter-match'); }, + /** + * + */ clearSearchResults: function () { var self = this; self.$tree.find('.kv-node-label .kv-search-found').each(function () { @@ -817,6 +956,9 @@ $tmp.unwrap().remove(); }); }, + /** + * + */ listen: function () { var self = this; // node toggle actions @@ -917,6 +1059,8 @@ self.removeAlert(); }); }); + // flipview button + self.enableflip(); // create node self.$toolbar.find('.kv-' + self.btns.create).on('click', function () { self.create(); @@ -953,22 +1097,37 @@ } }); }, + /** + * + */ expandAll: function () { this.toggleAll('expand'); }, + /** + * + */ collapseAll: function () { this.toggleAll('collapse'); }, + /** + * + */ checkAll: function () { var self = this; self.$tree.removeClass('kv-selected'); self.check(true); }, + /** + * + */ uncheckAll: function () { var self = this; $h.addCss(self.$tree, 'kv-selected'); self.check(true); }, + /** + * + */ checkNode: function (key) { var self = this, $node = self.$tree.find('li[data-key="' + key + '"]'); if ($node.length) { @@ -976,6 +1135,9 @@ self.check($node); } }, + /** + * + */ uncheckNode: function (key) { var self = this, $node = self.$tree.find('li[data-key="' + key + '"]'); if ($node.length) { @@ -984,6 +1146,9 @@ } } }; + /** + * + */ $.fn.treeview = function (option) { var args = Array.apply(null, arguments), $this, data, options; args.shift(); @@ -1000,6 +1165,9 @@ } }); }; + /** + * + */ $.fn.treeview.defaults = { btns: {}, treeId: '', @@ -1010,7 +1178,7 @@ alertFadeDuration: 1000, cacheTimeout: 300000, showInactive: false, - actions: {'manage': '', 'move': '', 'delete': ''}, + actions: {'manage': '', 'move': '', 'delete': '', 'flip':''}, messages: { emptyNode: '', nodeDisabled: '', @@ -1032,4 +1200,4 @@ hideUnmatchedSearchItems: true }; $.fn.treeview.Constructor = TreeView; -})(window.jQuery); \ No newline at end of file +})(window.jQuery); diff --git a/src/assets/js/kv-tree.min.js b/src/assets/js/kv-tree.min.js index 60e6a57..3128756 100644 --- a/src/assets/js/kv-tree.min.js +++ b/src/assets/js/kv-tree.min.js @@ -2,7 +2,7 @@ * @copyright Copyright © Kartik Visweswaran, Krajee.com, 2015 - 2019 * @package yii2-tree-manager * @version 1.1.3 - * + * * Tree View Validation Module. * * Author: Kartik Visweswaran @@ -10,4 +10,4 @@ * For more JQuery plugins visit http://plugins.krajee.com * For more Yii related demos visit http://demos.krajee.com */ -!function(e){"use strict";var t,a;t={QUERY_PARAM:"kvtree",DEFAULT_BUTTONS:{create:"create",createR:"create-root",trash:"remove",moveU:"move-up",moveD:"move-down",moveL:"move-left",moveR:"move-right",refresh:"refresh"},isEmpty:function(t,a){return null===t||void 0===t||0===t.length||a&&""===e.trim(t)},escapeRegExp:function(e){return e.replace(/[\-\[\]\/\{}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},addCss:function(e,t){e.removeClass(t).addClass(t)},hashString:function(e){return e.split("").reduce(function(e,t){return e=(e<<5)-e+t.charCodeAt(0),e&e},0)},delay:function(){var e=0;return function(t,a){clearTimeout(e),e=setTimeout(t,a)}}()},a=function(t,a){var i=this;i.$element=e(t),i.init(a),i.listen()},a.prototype={constructor:a,init:function(a){var i,s=this;s.initCache(),e.each(a,function(e,t){s[e]=t}),s.dialogLib=window[s.dialogLib]||"",s.btns=e.extend({},t.DEFAULT_BUTTONS,s.btns),s.$tree=e("#"+s.treeId),s.$treeContainer=s.$tree.closest(".kv-tree-wrapper"),s.$detail=e("#"+s.detailId),s.$toolbar=e("#"+s.toolbarId),s.$wrapper=e("#"+s.wrapperId),s.$searchContainer=s.$wrapper.find(".kv-search-container"),s.$search=s.$wrapper.find(".kv-search-input"),s.$clear=s.$wrapper.find(".kv-search-clear"),i=s.$detail.find("form"),s.treeManageHash=i.find('input[name="treeManageHash"]').val(),s.treeRemoveHash=i.find('input[name="treeRemoveHash"]').val(),s.treeMoveHash=i.find('input[name="treeMoveHash"]').val(),s.select(s.$element.data("key"),!0),s.treeCache.timeout=s.cacheTimeout,s.hasActiveFilter=!1,s.selectNodes(),s.validateTooltips()},initCache:function(){var t=this;t.treeCache={timeout:3e5,data:{},remove:function(e){delete t.treeCache.data[e]},exist:function(e){var a=t.treeCache;return!!a.data[e]&&(new Date).getTime()-a.data[e]._"+e+"").fadeIn(i.alertFadeDuration,function(){i.trigAlert(r,a)})},removeAlert:function(){var e=this;e.$detail.find(".alert").addClass(e.hideCssClass)},renderForm:function(a,i,s){var r=this,n=r.$detail,o=i||"",l=s||!1,d=t.hashString(a+r.modelClass+r.isAdmin+o),c=n.find("form"),v=r.actions.manage,f=v&&-1!==v.indexOf("?")?"&":"?";v+=encodeURI(f+t.QUERY_PARAM+"="+d),r.formViewBegin=!0,r.parseCache(),r.removeAlert(),e.ajax({type:"post",dataType:"json",data:r.getAjaxData({id:a,modelClass:r.modelClass,hideCssClass:r.hideCssClass,defaultBtnCss:r.defaultBtnCss,isAdmin:r.isAdmin,formAction:r.formAction,formOptions:r.formOptions,parentKey:o,iconsListShow:r.iconsListShow,iconsList:r.iconsList,currUrl:r.currUrl,softDelete:r.softDelete,showFormButtons:r.showFormButtons,showIDAttribute:r.showIDAttribute,showNameAttribute:r.showNameAttribute,multiple:r.multiple,nodeView:r.nodeView,nodeAddlViews:r.nodeAddlViews,nodeViewButtonLabels:r.nodeViewButtonLabels,nodeViewParams:r.nodeViewParams,nodeSelected:r.nodeSelected,noNodesMessage:r.noNodesMessage,breadcrumbs:r.breadcrumbs,allowNewRoots:r.allowNewRoots,treeManageHash:r.treeManageHash,treeRemoveHash:r.treeRemoveHash,treeMoveHash:r.treeMoveHash}),url:v,cache:!0,beforeSend:function(e,i){r.raise("treeview:beforeselect",[a,e,i])&&(c.length&&c.off().yiiActiveForm("destroy").remove(),n.html(""),t.addCss(n,"kv-loading"))},success:function(e,i,s){if(n.removeClass("kv-loading"),r.raise("treeview:selected",[a,e,i,s])){if("error"===e.status)return void(r.raise("treeview:selecterror",[a,e,i,s])&&n.html('
'+e.out+"
"));n.html(e.out),n.find('button[type="reset"]').on("click",function(){r.removeAlert()}),r.removeAlert(),l===!1||t.isEmpty(l.out)||r.showAlert(l.out,l.type)}},error:function(e,t,i){r.raise("treeview:selectajaxerror",[a,e,t,i])},complete:function(e){r.raise("treeview:selectajaxcomplete",[a,e])&&r.validateTooltips()}})},select:function(a,i,s){if(!t.isEmpty(a)){var r,n=this,o=i||!1,l=s||!1,d=n.$tree.find('li[data-key="'+a+'"]>.kv-tree-list .kv-node-detail');0!==d.length&&(n.$tree.find(".kv-node-detail").removeClass("kv-focussed"),t.addCss(d,"kv-focussed"),o?n.$tree.find("li.kv-parent").each(function(){var t=e(this);t.has(d).length>0&&t.removeClass("kv-collapsed")}):n.renderForm(a,null,l),r=d.closest("li"),r.data("disabled")?n.disableToolbar():n.enableToolbar(),(!r.data("removable")||r.hasClass("kv-inactive")&&n.softDelete||!r.data("removableAll")&&r.hasClass("kv-parent"))&&n.disable("trash"),r.data("movable-u")||n.disable("moveU"),r.data("movable-d")||n.disable("moveD"),r.data("movable-l")||n.disable("moveL"),r.data("movable-r")||n.disable("moveR"),r.data("child-allowed")||n.disable("create"),n.parseParentFlag(a))}},parseParentFlag:function(t){var a,i=this,s=i.$detail.find('input[class="kv-parent-flag"]'),r=i.$tree.find('li[data-key="'+t+'"]');s.each(function(){var t=e(this);a=t.closest("div.checkbox"),a.removeClass("disabled"),r.hasClass("kv-parent")?t.removeAttr("disabled"):(t.attr("disabled","disabled"),a.addClass("disabled"))})},remove:function(){var a,i,s=this,r=s.$tree.find("li .kv-node-detail.kv-focussed"),n=r.closest("li"),o=s.messages,l=s.$detail,d=l.find("form");0===r.length&&!n.hasClass("kv-empty")||n.hasClass("kv-disabled")||(i=function(e){var t=e?o.emptyNodeRemoved:o.nodeRemoved,i=n.closest("li.kv-parent");n.remove(),a=l.find(".alert"),s.formViewBegin=!1,l.find(".kv-select-node-msg").remove(),a.length&&l.before(a).html("").append(a),i.find("li").length||i.removeClass("kv-parent"),s.showAlert(t,"info",function(){l.append('"),setTimeout(function(){s.formViewBegin||l.find(".kv-select-node-msg").fadeIn(s.alertFadeDuration)},s.alertFadeDuration)})},s.dialogLib.confirm(o.removeNode,function(a){if(a){if(n.hasClass("kv-empty"))return void i(!0);var r=n.data("key");e.ajax({type:"post",dataType:"json",data:s.getAjaxData({id:r,modelClass:s.modelClass,softDelete:s.softDelete,treeRemoveHash:s.treeRemoveHash}),url:s.actions.remove,beforeSend:function(e,a){s.raise("treeview:beforeremove",[r,e,a])&&(d.hide(),s.removeAlert(),t.addCss(l,"kv-loading"))},success:function(e,a,o){if(l.removeClass("kv-loading"),"success"===e.status){if(!s.raise("treeview:remove",[r,e,a,o]))return;if((s.isAdmin||s.showInactive)&&s.softDelete){s.showAlert(e.out,"info"),d.show();var c=s.modelClass.split("\\").pop(),v=d.find('input[name="'+c+'[active]"]');v.val(!1),v.prop("checked",!1),t.addCss(n,"kv-inactive"),n.data("removableAll")&&t.addCss(n.find("li"),"kv-inactive"),t.addCss(n,"kv-inactive")}else i();s.softDelete||s.disableToolbar()}else{if(!s.raise("treeview:removeerror",[r,e,a,o]))return;s.showAlert(e.out,"danger"),d.show()}},error:function(e,t,a){s.raise("treeview:removeajaxerror",[r,e,t,a])},complete:function(e){s.raise("treeview:removeajaxcomplete",[e])}})}}))},move:function(a){var i,s,r,n,o=this,l=o.$tree.find("li .kv-node-detail.kv-focussed"),d=l.closest("li"),c=o.messages,v=o.$detail,f=null,h=!1,u=function(){};if(0!==l.length&&!d.hasClass("kv-disabled")){if(d.hasClass("kv-empty"))return void o.dialogLib.alert(c.nodeNewMove);switch(a){case"u":if(f=d.prev(),0===f.length)return void o.dialogLib.alert(c.nodeTop);u=function(){f.before(d)};break;case"d":if(f=d.next(),0===f.length)return void o.dialogLib.alert(c.nodeBottom);u=function(){f.after(d)};break;case"l":if(f=d.parent("ul").closest("li.kv-parent"),0===f.length)return void o.dialogLib.alert(c.nodeLeft);n=f.parent("ul"),h=n.hasClass("kv-tree"),h&&(f=n.children("li:last-child")),u=function(){f.after(d),0===f.find("li").length&&(f.removeClass("kv-parent"),f.find("ul").remove())};break;case"r":if(f=d.prev(),0===f.length)return void o.dialogLib.alert(c.nodeRight);u=function(){f.find("li").length>0?f.children("ul").append(d):(t.addCss(f,"kv-parent"),e(document.createElement("ul")).appendTo(f).append(d))};break;default:throw"Invalid move direction '"+a+"'"}i=d.data("key"),s=f.data("key"),e.ajax({type:"post",dataType:"json",data:o.getAjaxData({idFrom:i,idTo:s,modelClass:o.modelClass,dir:a,allowNewRoots:o.allowNewRoots,treeMoveHash:o.treeMoveHash}),url:o.actions.move,beforeSend:function(e,r){o.raise("treeview:beforemove",[a,i,s,e,r])&&t.addCss(o.$treeContainer,"kv-loading-search")},success:function(t,n,l){if(v.length>0&&o.removeAlert(),o.$treeContainer.removeClass("kv-loading-search"),"success"===t.status){if(!o.raise("treeview:move",[a,i,s,t,n,l]))return;u(),"l"===a||"r"===a?(o.treeCache.timeout=0,r=v.length>0?{out:t.out,type:"success"}:!1,o.select(i,!1,r),o.treeCache.timeout=o.cacheTimeout):v.length>0&&o.showAlert(t.out,"success"),o.$tree.find("li.kv-collapsed").each(function(){e(this).has(d).length>0&&e(this).removeClass("kv-collapsed")})}else v.length>0&&o.raise("treeview:moveerror",[a,i,s,t,n,l])&&o.showAlert(t.out,"danger")},error:function(e,t,r){o.$treeContainer.removeClass("kv-loading-search"),o.raise("treeview:moveajaxerror",[a,i,s,e,t,r])&&v.length>0&&(o.removeAlert(),o.showAlert(r,"danger"))},complete:function(e){o.raise("treeview:moveajaxcomplete",[e])}})}},setSelected:function(){var a=this,i="",s="";a.$tree.find(".kv-selected").each(function(){var a=e(this),r=t.isEmpty(i)?"":",";i+=r+a.data("key"),s+=r+a.find(">.kv-tree-list .kv-node-label").text()}),a.raise("treeview:change",[i,s])&&(a.$element.val(i),a.raise("change"))},getNewNode:function(){var e=this;return'
\n
 
\n
\n '+e.messages.emptyNode+"\n
\n
"},create:function(){var a,i,s,r,n,o=this,l=o.$tree.find("li .kv-node-detail.kv-focussed"),d=l.closest("li"),c=o.messages;return d.hasClass("kv-disabled")?void o.dialogLib.alert(c.nodeDisabled):0===l.length||d.hasClass("kv-empty")?void o.dialogLib.alert(c.invalidCreateNode):d.attr("data-child-allowed")?(o.$toolbar.find(".kv-"+o.btns.trash).removeAttr("disabled"),n=d.find("> ul > li.kv-empty"),n.length>0?(i=n.data("key").replace("empty-",""),o.renderForm(null,i),l.removeClass("kv-focussed"),void t.addCss(n.find(".kv-node-detail"),"kv-focussed")):void(o.raise("treeview:create",[i])&&(n=e(document.createElement("li")).attr({"data-key":"empty-"+d.data("key"),"class":"kv-empty"}),s=o.getNewNode(),l.removeClass("kv-focussed"),n.append(s),d.hasClass("kv-parent")?d.children("ul").append(n):(t.addCss(d,"kv-parent"),a=e(document.createElement("ul")).append(n),d.append(a)),o.renderForm(null,d.data("key")),r=n.find(".kv-node-detail"),d.removeClass("kv-collapsed"),n.children(".kv-tree-list").focus(),r.on("click",function(){o.$tree.find(".kv-node-detail").removeClass("kv-focussed"),t.addCss(r,"kv-focussed"),i=n.data("key").replace("empty-",""),o.renderForm(null,i),o.$toolbar.find(".kv-"+o.btns.trash).removeAttr("disabled")})))):void o.dialogLib.alert(c.noChildAllowed)},createRoot:function(){var a=this,i=a.$tree.find(".kv-tree"),s=i.children("li.kv-empty");if(a.raise("treeview:createroot")){if(a.$tree.find(".kv-node-detail").removeClass("kv-focussed"),s.length>0)return t.addCss(s.find(".kv-node-detail"),"kv-focussed"),void a.renderForm(null,a.rootKey);var r=a.getNewNode(),n=e(document.createElement("li")).attr({"data-key":"empty-root","class":"kv-empty"});n.html(r),i.append(n),a.renderForm(null,a.rootKey);var o=n.find(".kv-node-detail");t.addCss(o,"kv-focussed"),a.$toolbar.find(".kv-"+a.btns.trash).removeAttr("disabled"),o.on("click",function(){a.$tree.find(".kv-node-detail").removeClass("kv-focussed"),t.addCss(o,"kv-focussed"),a.renderForm(null,a.rootKey),a.$toolbar.find(".kv-"+a.btns.trash).removeAttr("disabled")})}},toggle:function(e){var a=this,i=e.closest("li.kv-parent"),s=i.data("key");i.hasClass("kv-collapsed")?a.raise("treeview:expand",[s])&&i.removeClass("kv-collapsed"):a.raise("treeview:collapse",[s])&&t.addCss(i,"kv-collapsed")},toggleAll:function(e,a){var i=this;if("expand"===e){if(a&&!i.raise("treeview:expandall"))return;return i.$treeContainer.removeClass("kv-collapsed"),void i.$treeContainer.find(".kv-collapsed").removeClass("kv-collapsed")}a&&!i.raise("treeview:collapseall")||(t.addCss(i.$treeContainer.find("li.kv-parent"),"kv-collapsed"),t.addCss(i.$treeContainer,"kv-collapsed"))},check:function(e){var a,i=this,s=e===!0,r=s?i.$tree:e.closest("li"),n=s?"":r.data("key"),o=i.multiple&&0!=i.multiple;if(!(r.hasClass("kv-disabled")||s&&!o)){if(r.hasClass("kv-selected")){if(!i.raise("treeview:unchecked",[n]))return;if(r.removeClass("kv-selected"),o)i.cascadeSelectChildren&&r.find("li:not(.kv-disabled)").removeClass("kv-selected");else{if(!i.raise("treeview:change",["",""]))return;i.$tree.find("li:not(.kv-disabled)").removeClass("kv-selected"),i.$element.val(""),i.raise("change")}}else{if(!i.raise("treeview:checked",[n]))return;if(o)i.cascadeSelectChildren&&t.addCss(r.find("li:not(.kv-disabled)"),"kv-selected");else{if(a=r.find(">.kv-tree-list .kv-node-label").text(),!i.raise("treeview:change",[n,a]))return;i.$tree.find("li:not(.kv-disabled)").removeClass("kv-selected"),i.$element.val(n),i.raise("change")}t.addCss(r,"kv-selected")}o&&i.setSelected()}},clear:function(){var e=this;e.$treeContainer.removeClass("kv-loading-search"),e.$tree.find(".kv-highlight").removeClass("kv-highlight"),e.blurFilter()},parseCache:function(){var t=this;return t.enableCache?void e.ajaxPrefilter(function(a,i){if(a.cache){var s=i.beforeSend||e.noop,r=i.success||e.noop,n=i.url;a.cache=!1,a.beforeSend=function(){return s(),t.treeCache.exist(n)?(r(t.treeCache.get(n)),!1):!0},a.success=function(e){t.treeCache.set(n,e,r)}}}):!1},focusFilter:function(){var e=this;e.hideUnmatchedSearchItems&&(e.hasActiveFilter||(e.hasActiveFilter=!0),e.$search.val().length>0&&t.addCss(e.$treeContainer,"kv-active-filter"))},blurFilter:function(){var e=this;e.clearSearchResults(),e.hideUnmatchedSearchItems&&(e.hasActiveFilter&&(e.hasActiveFilter=!1),e.$treeContainer.removeClass("kv-active-filter"),e.$treeContainer.find(".kv-highlight").removeClass("kv-highlight"),e.$treeContainer.find(".kv-tree-container li.kv-filter-match").removeClass("kv-filter-match"))},clearSearchResults:function(){var t=this;t.$tree.find(".kv-node-label .kv-search-found").each(function(){var t=e(this),a=e(document.createElement("span")).appendTo(t);a.unwrap().remove()})},listen:function(){var a=this;a.$tree.find(".kv-node-toggle").each(function(){var t=e(this);t.on("click",function(){a.toggle(t)})}),a.$tree.find(".kv-node-checkbox:not(.kv-disabled)").each(function(){var t=e(this);t.on("click",function(){a.check(t)})}),a.$treeContainer.find(".kv-root-node-toggle").on("click",function(){a.$treeContainer.hasClass("kv-collapsed")?a.toggleAll("expand",!0):a.toggleAll("collapse",!0)}),a.$treeContainer.find(".kv-root-node-checkbox").on("click",function(){a.check(!0)}),a.$search.on("keyup",function(){var i=e(this).val();a.clear(),a.clearSearchResults(),t.addCss(a.$treeContainer,"kv-loading-search"),t.delay(function(){a.focusFilter(),a.$tree.find("li.kv-filter-match").removeClass("kv-filter-match"),a.toggleAll("collapse",!1),i=t.escapeRegExp(i),a.$tree.find(".kv-node-label").each(function(){var s,r,n=e(this),o=n.text(),l=o.search(new RegExp(i,"i"));0>l?n.removeClass("kv-highlight"):(t.addCss(n,"kv-highlight"),s=new RegExp(i,"ig"),r=o.replace(s,function(e){return''+e+""}),n.html(r),a.$tree.find("li.kv-parent").each(function(){var t=e(this);t.has(n).length>0&&t.removeClass("kv-collapsed")}))}),a.$tree.find(".kv-highlight").parentsUntil(a.$tree.selector,"li").each(function(){t.addCss(e(this),"kv-filter-match")}),a.$treeContainer.removeClass("kv-loading-search"),a.$treeContainer.find(".kv-tree-container").removeClass("kv-collapsed"),a.raise("treeview:search"),0===i.length&&a.blurFilter()},250)}).on("focus",function(){a.focusFilter()}).on("blur",function(){var t=e(this).val();null!==t&&""!==t||a.blurFilter()}),a.$clear.on("click",function(){a.$search.val(""),a.clear()}),a.$tree.find(".kv-node-detail").each(function(){e(this).on("click",function(){var t=e(this),i=t.closest("li"),s=i.data("key");if(a.raise("treeview:select",[s]))return a.$tree.hasClass("kv-tree-input-widget")?(t.removeClass("kv-focussed"),void a.check(i)):void(t.hasClass("kv-focussed")||(a.select(s),a.removeAlert()))})}),a.$toolbar.find(".kv-"+a.btns.create).on("click",function(){a.create()}),a.$toolbar.find(".kv-"+a.btns.createR).on("click",function(){a.createRoot()}),a.$toolbar.find(".kv-"+a.btns.trash).on("click",function(){a.remove()}),a.$toolbar.find(".kv-"+a.btns.moveU).on("click",function(){a.move("u")}),a.$toolbar.find(".kv-"+a.btns.moveD).on("click",function(){a.move("d")}),a.$toolbar.find(".kv-"+a.btns.moveL).on("click",function(){a.move("l")}),a.$toolbar.find(".kv-"+a.btns.moveR).on("click",function(){a.move("r")}),a.$detail.find(".alert").each(function(){var t=e(this);t.hasClass(a.hideCssClass)||(t.hide().fadeIn(1500),a.trigAlert(t))})},expandAll:function(){this.toggleAll("expand")},collapseAll:function(){this.toggleAll("collapse")},checkAll:function(){var e=this;e.$tree.removeClass("kv-selected"),e.check(!0)},uncheckAll:function(){var e=this;t.addCss(e.$tree,"kv-selected"),e.check(!0)},checkNode:function(e){var t=this,a=t.$tree.find('li[data-key="'+e+'"]');a.length&&(a.removeClass("kv-selected"),t.check(a))},uncheckNode:function(e){var a=this,i=a.$tree.find('li[data-key="'+e+'"]');i.length&&(t.addCss(i,"kv-selected"),a.check(i))}},e.fn.treeview=function(t){var i,s,r,n=Array.apply(null,arguments);return n.shift(),this.each(function(){i=e(this),s=i.data("treeview"),r="object"==typeof t&&t,s||(s=new a(this,e.extend({},e.fn.treeview.defaults,r,e(this).data())),i.data("treeview",s)),"string"==typeof t&&s[t].apply(s,n)})},e.fn.treeview.defaults={btns:{},treeId:"",detailId:"",toolbarId:"",wrapperId:"",showTooltips:!0,alertFadeDuration:1e3,cacheTimeout:3e5,showInactive:!1,actions:{manage:"",move:"","delete":""},messages:{emptyNode:"",nodeDisabled:"",invalidCreateNode:"",removeNode:"",nodeRemoved:"",emptyNodeRemoved:"",nodeNewMove:"",nodeTop:"",nodeBottom:"",nodeLeft:"",nodeRight:"",nodeTitle:"",nodeTitlePlural:""},breadcrumbs:{},cascadeSelectChildren:!0,rootKey:"",hideUnmatchedSearchItems:!0},e.fn.treeview.Constructor=a}(window.jQuery); \ No newline at end of file +!function(e){"use strict";var t,a;t={QUERY_PARAM:"kvtree",DEFAULT_BUTTONS:{create:"create",createR:"create-root",trash:"remove",moveU:"move-up",moveD:"move-down",moveL:"move-left",moveR:"move-right",refresh:"refresh"},isEmpty:function(t,a){return null===t||void 0===t||0===t.length||a&&""===e.trim(t)},escapeRegExp:function(e){return e.replace(/[\-\[\]\/\{}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},addCss:function(e,t){e.removeClass(t).addClass(t)},hashString:function(e){return e.split("").reduce(function(e,t){return e=(e<<5)-e+t.charCodeAt(0),e&e},0)},delay:function(){var e=0;return function(t,a){clearTimeout(e),e=setTimeout(t,a)}}()},a=function(t,a){var i=this;i.$element=e(t),i.init(a),i.listen()},a.prototype={constructor:a,init:function(a){var i,s=this;s.initCache(),e.each(a,function(e,t){s[e]=t}),s.dialogLib=window[s.dialogLib]||"",s.btns=e.extend({},t.DEFAULT_BUTTONS,s.btns),s.$tree=e("#"+s.treeId),s.$treeContainer=s.$tree.closest(".kv-tree-wrapper"),s.$detail=e("#"+s.detailId),s.$toolbar=e("#"+s.toolbarId),s.$wrapper=e("#"+s.wrapperId),s.$searchContainer=s.$wrapper.find(".kv-search-container"),s.$search=s.$wrapper.find(".kv-search-input"),s.$clear=s.$wrapper.find(".kv-search-clear"),i=s.$detail.find("form"),s.treeManageHash=i.find('input[name="treeManageHash"]').val(),s.treeRemoveHash=i.find('input[name="treeRemoveHash"]').val(),s.treeMoveHash=i.find('input[name="treeMoveHash"]').val(),s.select(s.$element.data("key"),!0),s.treeCache.timeout=s.cacheTimeout,s.hasActiveFilter=!1,s.selectNodes(),s.validateTooltips()},initCache:function(){var t=this;t.treeCache={timeout:3e5,data:{},remove:function(e){delete t.treeCache.data[e]},exist:function(e){var a=t.treeCache;return!!a.data[e]&&(new Date).getTime()-a.data[e]._"+e+"").fadeIn(i.alertFadeDuration,function(){i.trigAlert(r,a)})},removeAlert:function(){var e=this;e.$detail.find(".alert").addClass(e.hideCssClass)},renderForm:function(a,i,s){var r=this,n=r.$detail,o=i||"",l=s||!1,d=t.hashString(a+r.modelClass+r.isAdmin+o),c=n.find("form"),v=r.actions.manage,f=v&&-1!==v.indexOf("?")?"&":"?";v+=encodeURI(f+t.QUERY_PARAM+"="+d),r.formViewBegin=!0,r.parseCache(),r.removeAlert(),e.ajax({type:"post",dataType:"json",data:r.getAjaxData({id:a,modelClass:r.modelClass,hideCssClass:r.hideCssClass,defaultBtnCss:r.defaultBtnCss,isAdmin:r.isAdmin,formAction:r.formAction,formOptions:r.formOptions,parentKey:o,iconsListShow:r.iconsListShow,iconsList:r.iconsList,currUrl:r.currUrl,softDelete:r.softDelete,showFormButtons:r.showFormButtons,showIDAttribute:r.showIDAttribute,showNameAttribute:r.showNameAttribute,multiple:r.multiple,nodeView:r.nodeView,nodeUser:r.nodeUser,nodeAddlViews:r.nodeAddlViews,nodeViewButtonLabels:r.nodeViewButtonLabels,nodeViewParams:r.nodeViewParams,nodeSelected:r.nodeSelected,noNodesMessage:r.noNodesMessage,breadcrumbs:r.breadcrumbs,allowNewRoots:r.allowNewRoots,treeManageHash:r.treeManageHash,treeRemoveHash:r.treeRemoveHash,treeMoveHash:r.treeMoveHash}),url:v,cache:!0,beforeSend:function(e,i){r.raise("treeview:beforeselect",[a,e,i])&&(c.length&&c.off().yiiActiveForm("destroy").remove(),n.html(""),t.addCss(n,"kv-loading"))},success:function(e,i,s){if(n.removeClass("kv-loading"),r.raise("treeview:selected",[a,e,i,s])){if("error"===e.status)return void(r.raise("treeview:selecterror",[a,e,i,s])&&n.html('
'+e.out+"
"));n.html(e.out),n.find('button[type="reset"]').on("click",function(){r.removeAlert()}),r.removeAlert(),l===!1||t.isEmpty(l.out)||r.showAlert(l.out,l.type)}},error:function(e,t,i){r.raise("treeview:selectajaxerror",[a,e,t,i])},complete:function(e){r.raise("treeview:selectajaxcomplete",[a,e])&&r.validateTooltips()}})},select:function(a,i,s){if(!t.isEmpty(a)){var r,n=this,o=i||!1,l=s||!1,d=n.$tree.find('li[data-key="'+a+'"]>.kv-tree-list .kv-node-detail');0!==d.length&&(n.$tree.find(".kv-node-detail").removeClass("kv-focussed"),t.addCss(d,"kv-focussed"),o?n.$tree.find("li.kv-parent").each(function(){var t=e(this);t.has(d).length>0&&t.removeClass("kv-collapsed")}):n.renderForm(a,null,l),r=d.closest("li"),r.data("disabled")?n.disableToolbar():n.enableToolbar(),(!r.data("removable")||r.hasClass("kv-inactive")&&n.softDelete||!r.data("removableAll")&&r.hasClass("kv-parent"))&&n.disable("trash"),r.data("movable-u")||n.disable("moveU"),r.data("movable-d")||n.disable("moveD"),r.data("movable-l")||n.disable("moveL"),r.data("movable-r")||n.disable("moveR"),r.data("child-allowed")||n.disable("create"),n.parseParentFlag(a))}},parseParentFlag:function(t){var a,i=this,s=i.$detail.find('input[class="kv-parent-flag"]'),r=i.$tree.find('li[data-key="'+t+'"]');s.each(function(){var t=e(this);a=t.closest("div.checkbox"),a.removeClass("disabled"),r.hasClass("kv-parent")?t.removeAttr("disabled"):(t.attr("disabled","disabled"),a.addClass("disabled"))})},remove:function(){var a,i,s=this,r=s.$tree.find("li .kv-node-detail.kv-focussed"),n=r.closest("li"),o=s.messages,l=s.$detail,d=l.find("form");0===r.length&&!n.hasClass("kv-empty")||n.hasClass("kv-disabled")||(i=function(e){var t=e?o.emptyNodeRemoved:o.nodeRemoved,i=n.closest("li.kv-parent");n.remove(),a=l.find(".alert"),s.formViewBegin=!1,l.find(".kv-select-node-msg").remove(),a.length&&l.before(a).html("").append(a),i.find("li").length||i.removeClass("kv-parent"),s.showAlert(t,"info",function(){l.append('"),setTimeout(function(){s.formViewBegin||l.find(".kv-select-node-msg").fadeIn(s.alertFadeDuration)},s.alertFadeDuration)})},s.dialogLib.confirm(o.removeNode,function(a){if(a){if(n.hasClass("kv-empty"))return void i(!0);var r=n.data("key");e.ajax({type:"post",dataType:"json",data:s.getAjaxData({id:r,modelClass:s.modelClass,softDelete:s.softDelete,treeRemoveHash:s.treeRemoveHash}),url:s.actions.remove,beforeSend:function(e,a){s.raise("treeview:beforeremove",[r,e,a])&&(d.hide(),s.removeAlert(),t.addCss(l,"kv-loading"))},success:function(e,a,o){if(l.removeClass("kv-loading"),"success"===e.status){if(!s.raise("treeview:remove",[r,e,a,o]))return;if((s.isAdmin||s.showInactive)&&s.softDelete){s.showAlert(e.out,"info"),d.show();var c=s.modelClass.split("\\").pop(),v=d.find('input[name="'+c+'[active]"]');v.val(!1),v.prop("checked",!1),t.addCss(n,"kv-inactive"),n.data("removableAll")&&t.addCss(n.find("li"),"kv-inactive"),t.addCss(n,"kv-inactive")}else i();s.softDelete||s.disableToolbar()}else{if(!s.raise("treeview:removeerror",[r,e,a,o]))return;s.showAlert(e.out,"danger"),d.show()}},error:function(e,t,a){s.raise("treeview:removeajaxerror",[r,e,t,a])},complete:function(e){s.raise("treeview:removeajaxcomplete",[e])}})}}))},move:function(a){var i,s,r,n,o=this,l=o.$tree.find("li .kv-node-detail.kv-focussed"),d=l.closest("li"),c=o.messages,v=o.$detail,f=null,h=!1,u=function(){};if(0!==l.length&&!d.hasClass("kv-disabled")){if(d.hasClass("kv-empty"))return void o.dialogLib.alert(c.nodeNewMove);switch(a){case"u":if(f=d.prev(),0===f.length)return void o.dialogLib.alert(c.nodeTop);u=function(){f.before(d)};break;case"d":if(f=d.next(),0===f.length)return void o.dialogLib.alert(c.nodeBottom);u=function(){f.after(d)};break;case"l":if(f=d.parent("ul").closest("li.kv-parent"),0===f.length)return void o.dialogLib.alert(c.nodeLeft);n=f.parent("ul"),h=n.hasClass("kv-tree"),h&&(f=n.children("li:last-child")),u=function(){f.after(d),0===f.find("li").length&&(f.removeClass("kv-parent"),f.find("ul").remove())};break;case"r":if(f=d.prev(),0===f.length)return void o.dialogLib.alert(c.nodeRight);u=function(){f.find("li").length>0?f.children("ul").append(d):(t.addCss(f,"kv-parent"),e(document.createElement("ul")).appendTo(f).append(d))};break;default:throw"Invalid move direction '"+a+"'"}i=d.data("key"),s=f.data("key"),e.ajax({type:"post",dataType:"json",data:o.getAjaxData({idFrom:i,idTo:s,modelClass:o.modelClass,dir:a,allowNewRoots:o.allowNewRoots,treeMoveHash:o.treeMoveHash}),url:o.actions.move,beforeSend:function(e,r){o.raise("treeview:beforemove",[a,i,s,e,r])&&t.addCss(o.$treeContainer,"kv-loading-search")},success:function(t,n,l){if(v.length>0&&o.removeAlert(),o.$treeContainer.removeClass("kv-loading-search"),"success"===t.status){if(!o.raise("treeview:move",[a,i,s,t,n,l]))return;u(),"l"===a||"r"===a?(o.treeCache.timeout=0,r=v.length>0?{out:t.out,type:"success"}:!1,o.select(i,!1,r),o.treeCache.timeout=o.cacheTimeout):v.length>0&&o.showAlert(t.out,"success"),o.$tree.find("li.kv-collapsed").each(function(){e(this).has(d).length>0&&e(this).removeClass("kv-collapsed")})}else v.length>0&&o.raise("treeview:moveerror",[a,i,s,t,n,l])&&o.showAlert(t.out,"danger")},error:function(e,t,r){o.$treeContainer.removeClass("kv-loading-search"),o.raise("treeview:moveajaxerror",[a,i,s,e,t,r])&&v.length>0&&(o.removeAlert(),o.showAlert(r,"danger"))},complete:function(e){o.raise("treeview:moveajaxcomplete",[e])}})}},setSelected:function(){var a=this,i="",s="";a.$tree.find(".kv-selected").each(function(){var a=e(this),r=t.isEmpty(i)?"":",";i+=r+a.data("key"),s+=r+a.find(">.kv-tree-list .kv-node-label").text()}),a.raise("treeview:change",[i,s])&&(a.$element.val(i),a.raise("change"))},getNewNode:function(){var e=this;return'
\n
 
\n
\n '+e.messages.emptyNode+"\n
\n
"},create:function(){var a,i,s,r,n,o=this,l=o.$tree.find("li .kv-node-detail.kv-focussed"),d=l.closest("li"),c=o.messages;return d.hasClass("kv-disabled")?void o.dialogLib.alert(c.nodeDisabled):0===l.length||d.hasClass("kv-empty")?void o.dialogLib.alert(c.invalidCreateNode):d.attr("data-child-allowed")?(o.$toolbar.find(".kv-"+o.btns.trash).removeAttr("disabled"),n=d.find("> ul > li.kv-empty"),n.length>0?(i=n.data("key").replace("empty-",""),o.renderForm(null,i),l.removeClass("kv-focussed"),void t.addCss(n.find(".kv-node-detail"),"kv-focussed")):void(o.raise("treeview:create",[i])&&(n=e(document.createElement("li")).attr({"data-key":"empty-"+d.data("key"),"class":"kv-empty"}),s=o.getNewNode(),l.removeClass("kv-focussed"),n.append(s),d.hasClass("kv-parent")?d.children("ul").append(n):(t.addCss(d,"kv-parent"),a=e(document.createElement("ul")).append(n),d.append(a)),o.renderForm(null,d.data("key")),r=n.find(".kv-node-detail"),d.removeClass("kv-collapsed"),n.children(".kv-tree-list").focus(),r.on("click",function(){o.$tree.find(".kv-node-detail").removeClass("kv-focussed"),t.addCss(r,"kv-focussed"),i=n.data("key").replace("empty-",""),o.renderForm(null,i),o.$toolbar.find(".kv-"+o.btns.trash).removeAttr("disabled")})))):void o.dialogLib.alert(c.noChildAllowed)},createRoot:function(){var a=this,i=a.$tree.find(".kv-tree"),s=i.children("li.kv-empty");if(a.raise("treeview:createroot")){if(a.$tree.find(".kv-node-detail").removeClass("kv-focussed"),s.length>0)return t.addCss(s.find(".kv-node-detail"),"kv-focussed"),void a.renderForm(null,a.rootKey);var r=a.getNewNode(),n=e(document.createElement("li")).attr({"data-key":"empty-root","class":"kv-empty"});n.html(r),i.append(n),a.renderForm(null,a.rootKey);var o=n.find(".kv-node-detail");t.addCss(o,"kv-focussed"),a.$toolbar.find(".kv-"+a.btns.trash).removeAttr("disabled"),o.on("click",function(){a.$tree.find(".kv-node-detail").removeClass("kv-focussed"),t.addCss(o,"kv-focussed"),a.renderForm(null,a.rootKey),a.$toolbar.find(".kv-"+a.btns.trash).removeAttr("disabled")})}},toggle:function(e){var a=this,i=e.closest("li.kv-parent"),s=i.data("key");i.hasClass("kv-collapsed")?a.raise("treeview:expand",[s])&&i.removeClass("kv-collapsed"):a.raise("treeview:collapse",[s])&&t.addCss(i,"kv-collapsed")},toggleAll:function(e,a){var i=this;if("expand"===e){if(a&&!i.raise("treeview:expandall"))return;return i.$treeContainer.removeClass("kv-collapsed"),void i.$treeContainer.find(".kv-collapsed").removeClass("kv-collapsed")}a&&!i.raise("treeview:collapseall")||(t.addCss(i.$treeContainer.find("li.kv-parent"),"kv-collapsed"),t.addCss(i.$treeContainer,"kv-collapsed"))},check:function(e){var a,i=this,s=e===!0,r=s?i.$tree:e.closest("li"),n=s?"":r.data("key"),o=i.multiple&&0!=i.multiple;if(!(r.hasClass("kv-disabled")||s&&!o)){if(r.hasClass("kv-selected")){if(!i.raise("treeview:unchecked",[n]))return;if(r.removeClass("kv-selected"),o)i.cascadeSelectChildren&&r.find("li:not(.kv-disabled)").removeClass("kv-selected");else{if(!i.raise("treeview:change",["",""]))return;i.$tree.find("li:not(.kv-disabled)").removeClass("kv-selected"),i.$element.val(""),i.raise("change")}}else{if(!i.raise("treeview:checked",[n]))return;if(o)i.cascadeSelectChildren&&t.addCss(r.find("li:not(.kv-disabled)"),"kv-selected");else{if(a=r.find(">.kv-tree-list .kv-node-label").text(),!i.raise("treeview:change",[n,a]))return;i.$tree.find("li:not(.kv-disabled)").removeClass("kv-selected"),i.$element.val(n),i.raise("change")}t.addCss(r,"kv-selected")}o&&i.setSelected()}},clear:function(){var e=this;e.$treeContainer.removeClass("kv-loading-search"),e.$tree.find(".kv-highlight").removeClass("kv-highlight"),e.blurFilter()},parseCache:function(){var t=this;return t.enableCache?void e.ajaxPrefilter(function(a,i){if(a.cache){var s=i.beforeSend||e.noop,r=i.success||e.noop,n=i.url;a.cache=!1,a.beforeSend=function(){return s(),t.treeCache.exist(n)?(r(t.treeCache.get(n)),!1):!0},a.success=function(e){t.treeCache.set(n,e,r)}}}):!1},focusFilter:function(){var e=this;e.hideUnmatchedSearchItems&&(e.hasActiveFilter||(e.hasActiveFilter=!0),e.$search.val().length>0&&t.addCss(e.$treeContainer,"kv-active-filter"))},blurFilter:function(){var e=this;e.clearSearchResults(),e.hideUnmatchedSearchItems&&(e.hasActiveFilter&&(e.hasActiveFilter=!1),e.$treeContainer.removeClass("kv-active-filter"),e.$treeContainer.find(".kv-highlight").removeClass("kv-highlight"),e.$treeContainer.find(".kv-tree-container li.kv-filter-match").removeClass("kv-filter-match"))},clearSearchResults:function(){var t=this;t.$tree.find(".kv-node-label .kv-search-found").each(function(){var t=e(this),a=e(document.createElement("span")).appendTo(t);a.unwrap().remove()})},listen:function(){var a=this;a.$tree.find(".kv-node-toggle").each(function(){var t=e(this);t.on("click",function(){a.toggle(t)})}),a.$tree.find(".kv-node-checkbox:not(.kv-disabled)").each(function(){var t=e(this);t.on("click",function(){a.check(t)})}),a.$treeContainer.find(".kv-root-node-toggle").on("click",function(){a.$treeContainer.hasClass("kv-collapsed")?a.toggleAll("expand",!0):a.toggleAll("collapse",!0)}),a.$treeContainer.find(".kv-root-node-checkbox").on("click",function(){a.check(!0)}),a.$search.on("keyup",function(){var i=e(this).val();a.clear(),a.clearSearchResults(),t.addCss(a.$treeContainer,"kv-loading-search"),t.delay(function(){a.focusFilter(),a.$tree.find("li.kv-filter-match").removeClass("kv-filter-match"),a.toggleAll("collapse",!1),i=t.escapeRegExp(i),a.$tree.find(".kv-node-label").each(function(){var s,r,n=e(this),o=n.text(),l=o.search(new RegExp(i,"i"));0>l?n.removeClass("kv-highlight"):(t.addCss(n,"kv-highlight"),s=new RegExp(i,"ig"),r=o.replace(s,function(e){return''+e+""}),n.html(r),a.$tree.find("li.kv-parent").each(function(){var t=e(this);t.has(n).length>0&&t.removeClass("kv-collapsed")}))}),a.$tree.find(".kv-highlight").parentsUntil(a.$tree.selector,"li").each(function(){t.addCss(e(this),"kv-filter-match")}),a.$treeContainer.removeClass("kv-loading-search"),a.$treeContainer.find(".kv-tree-container").removeClass("kv-collapsed"),a.raise("treeview:search"),0===i.length&&a.blurFilter()},250)}).on("focus",function(){a.focusFilter()}).on("blur",function(){var t=e(this).val();null!==t&&""!==t||a.blurFilter()}),a.$clear.on("click",function(){a.$search.val(""),a.clear()}),a.$tree.find(".kv-node-detail").each(function(){e(this).on("click",function(){var t=e(this),i=t.closest("li"),s=i.data("key");if(a.raise("treeview:select",[s]))return a.$tree.hasClass("kv-tree-input-widget")?(t.removeClass("kv-focussed"),void a.check(i)):void(t.hasClass("kv-focussed")||(a.select(s),a.removeAlert()))})}),a.$toolbar.find(".kv-"+a.btns.create).on("click",function(){a.create()}),a.$toolbar.find(".kv-"+a.btns.createR).on("click",function(){a.createRoot()}),a.$toolbar.find(".kv-"+a.btns.trash).on("click",function(){a.remove()}),a.$toolbar.find(".kv-"+a.btns.moveU).on("click",function(){a.move("u")}),a.$toolbar.find(".kv-"+a.btns.moveD).on("click",function(){a.move("d")}),a.$toolbar.find(".kv-"+a.btns.moveL).on("click",function(){a.move("l")}),a.$toolbar.find(".kv-"+a.btns.moveR).on("click",function(){a.move("r")}),a.$detail.find(".alert").each(function(){var t=e(this);t.hasClass(a.hideCssClass)||(t.hide().fadeIn(1500),a.trigAlert(t))})},expandAll:function(){this.toggleAll("expand")},collapseAll:function(){this.toggleAll("collapse")},checkAll:function(){var e=this;e.$tree.removeClass("kv-selected"),e.check(!0)},uncheckAll:function(){var e=this;t.addCss(e.$tree,"kv-selected"),e.check(!0)},checkNode:function(e){var t=this,a=t.$tree.find('li[data-key="'+e+'"]');a.length&&(a.removeClass("kv-selected"),t.check(a))},uncheckNode:function(e){var a=this,i=a.$tree.find('li[data-key="'+e+'"]');i.length&&(t.addCss(i,"kv-selected"),a.check(i))}},e.fn.treeview=function(t){var i,s,r,n=Array.apply(null,arguments);return n.shift(),this.each(function(){i=e(this),s=i.data("treeview"),r="object"==typeof t&&t,s||(s=new a(this,e.extend({},e.fn.treeview.defaults,r,e(this).data())),i.data("treeview",s)),"string"==typeof t&&s[t].apply(s,n)})},e.fn.treeview.defaults={btns:{},treeId:"",detailId:"",toolbarId:"",wrapperId:"",showTooltips:!0,alertFadeDuration:1e3,cacheTimeout:3e5,showInactive:!1,actions:{manage:"",move:"","delete":""},messages:{emptyNode:"",nodeDisabled:"",invalidCreateNode:"",removeNode:"",nodeRemoved:"",emptyNodeRemoved:"",nodeNewMove:"",nodeTop:"",nodeBottom:"",nodeLeft:"",nodeRight:"",nodeTitle:"",nodeTitlePlural:""},breadcrumbs:{},cascadeSelectChildren:!0,rootKey:"",hideUnmatchedSearchItems:!0},e.fn.treeview.Constructor=a}(window.jQuery); diff --git a/src/controllers/NodeController.php b/src/controllers/NodeController.php index ca8e2de..153718e 100644 --- a/src/controllers/NodeController.php +++ b/src/controllers/NodeController.php @@ -22,8 +22,10 @@ use yii\base\NotSupportedException; use yii\db\Exception as DbException; use yii\helpers\ArrayHelper; +use yii\helpers\VarDumper; use yii\web\Controller; use yii\web\Response; +use yii\web\Session; use yii\web\View; /** @@ -126,6 +128,45 @@ protected static function checkValidRequest($isJsonResponse = true, $isInvalid = } } + /** + * returns the view to render + * + * @paramter out The output array information + * @returns the view to use + */ + private function selectView($out, $modeView=0) + { + $view = $out['nodeUser']; + if ($out['isAdmin']) { + $view = ($modeView == 0) ? $out['nodeView'] : $out['nodeUser']; + } + Yii::debug('return '.$view,__METHOD__); + return $view; + } + + /** + * Flip the detail view between User mode and Admin Mode + * + */ + public function actionFlip() + { + $post = Yii::$app->request->post(); + $data = static::getPostData(); + + $module = TreeView::module(); + $keyAttr = $module->dataStructure['keyAttribute']; + $id = ArrayHelper::getValue($data,$keyAttr);; + + $session = Yii::$app->session; + $name = ArrayHelper::getValue($data, 'nodeSelected', 'kvNodeId'); + $session->set($name, $id); + + $mode = ArrayHelper::getValue($data, 'modeView', 0); + $session->set('modeView', $mode); + + $currUrl = ArrayHelper::getValue($data, 'currUrl', ''); + return $this->redirect($currUrl); + } /** * Saves a node once form is submitted @@ -233,11 +274,13 @@ public function actionSave() */ public function actionManage() { - static::checkValidRequest(); + Yii::debug('actionManage()',__METHOD__); + static::checkValidRequest(); $data = static::getPostData(); $nodeTitles = TreeSecurity::getNodeTitles($data); $callback = function () use ($data, $nodeTitles) { $id = ArrayHelper::getValue($data, 'id', null); + $modeView = ArrayHelper::getValue($data, 'modeView', 0); $parentKey = ArrayHelper::getValue($data, 'parentKey', ''); $parsedData = TreeSecurity::parseManageData($data); $out = $parsedData['out']; @@ -259,6 +302,7 @@ public function actionManage() $params = $module->treeStructure + $module->dataStructure + [ 'node' => $node, 'parentKey' => $parentKey, + 'modeView' => $modeView, 'treeManageHash' => $newHash, 'treeRemoveHash' => ArrayHelper::getValue($data, 'treeRemoveHash', ''), 'treeMoveHash' => ArrayHelper::getValue($data, 'treeMoveHash', ''), @@ -275,7 +319,9 @@ public function actionManage() Event::on(View::class, View::EVENT_AFTER_RENDER, $cb); } TreeSecurity::checkSignature('manage', $oldHash, $newHash); - return $this->renderAjax($out['nodeView'], ['params' => $params]); + return $this->renderAjax( + $this->selectView($out, $modeView), + ['params' => $params]); }; return self::process( $callback, diff --git a/src/views/_form.php b/src/views/_form.php index 00410de..56f6b64 100644 --- a/src/views/_form.php +++ b/src/views/_form.php @@ -39,6 +39,8 @@ * @var array $params * @var string $keyField * @var string $nodeView + * @var string $nodeUser + * @var int $modeUser * @var string $nodeAddlViews * @var array $nodeViewButtonLabels * @var string $noNodesMessage @@ -122,6 +124,7 @@ +
+
- 'btn ' . $defaultBtnCss, 'title' => $resetTitle] - ) ?> - 'btn btn-primary', 'title' => $submitTitle] - ) ?> + ", + // ['class'=>'btn btn-outline-secondary kv-flipview', 'title'=>'Flip Display Mode'] ) + ?> + 'btn ' . $defaultBtnCss, 'title' => $resetTitle] + ) ?> + + 'btn btn-primary', 'title' => $submitTitle] + ) ?>
@@ -364,4 +373,4 @@ * END VALID NODE DISPLAY */ ?> - \ No newline at end of file + diff --git a/src/views/_user.php b/src/views/_user.php new file mode 100755 index 0000000..bbdcaff --- /dev/null +++ b/src/views/_user.php @@ -0,0 +1,257 @@ + + + +has('session') ? Yii::$app->session : null; + +// parse parent key +if ($node->isNewRecord) { + $parentKey = empty($parentKey) ? '' : $parentKey; +} elseif (empty($parentKey)) { + $parent = $node->parents(1)->one(); + $parentKey = empty($parent) ? '' : Html::getAttributeValue($parent, $keyAttribute); +} + +/** @var Module $module */ +$module = TreeView::module(); + +// active form instance +$form = ActiveForm::begin(['action' => $formAction, 'options' => $formOptions]); + +// helper function to show alert +$showAlert = function ($type, $body = '', $hide = true) use($hideCssClass) { + $class = "alert alert-{$type}"; + if ($hide) { $class .= ' ' . $hideCssClass; } + return Html::tag('div', '
' . $body . '
', ['class' => $class]); +}; + +// node identifier +$id = $node->isNewRecord ? null : $node->$keyAttribute; +// breadcrumbs +if (array_key_exists('depth', $breadcrumbs) && $breadcrumbs['depth'] === null) { + $breadcrumbs['depth'] = ''; +} elseif (!empty($breadcrumbs['depth'])) { + $breadcrumbs['depth'] = (string)$breadcrumbs['depth']; +} +?> + + + + +isNewRecord) ?> + + + + + + + + + + +isNewRecord || !empty($parentKey)): ?> + true]; // default checkbox/ radio options (useful for BS4) + $isAdmin = ($isAdmin == true || $isAdmin === "true"); // admin mode flag + $inputOpts = []; // readonly/disabled input options for node + $flagOptions = $cbxOptions + ['class' => 'kv-parent-flag']; // node options for parent/child + + /** + * initialize for create or update + */ + $depth = ArrayHelper::getValue($breadcrumbs, 'depth', ''); + $glue = ArrayHelper::getValue($breadcrumbs, 'glue', ''); + $activeCss = ArrayHelper::getValue($breadcrumbs, 'activeCss', ''); + $untitled = ArrayHelper::getValue($breadcrumbs, 'untitled', ''); + $name = $node->getBreadcrumbs($depth, $glue, $activeCss, $untitled); + if ($node->isNewRecord && !empty($parentKey) && $parentKey !== TreeView::ROOT_KEY) { + /** + * @var Tree $modelClass + * @var Tree $parent + */ + if (empty($depth)) { + $depth = null; + } + if ($depth === null || $depth > 0) { + $parent = $modelClass::findOne($parentKey); + $name = $parent->getBreadcrumbs($depth, $glue, null) . $glue . $name; + } + } + if ($node->isReadonly()) { $inputOpts['readonly'] = true; } + if ($node->isDisabled()) { $inputOpts['disabled'] = true; } + if ($node->isLeaf()) { $flagOptions['disabled'] = true; } + ?> + + +
+ + +
View: 
+
$keyAttribute .')' ?>
+
+
+ + +
+ hasFlash('success')) { + echo $showAlert('success', $session->getFlash('success'), false); + } else { echo $showAlert('success'); } + + if ($session && $session->hasFlash('error')) { + echo $showAlert('danger', $session->getFlash('error'), false); + } else { echo $showAlert('danger'); } + + echo $showAlert('warning'); + echo $showAlert('info'); + ?> +
+ + +
+ $iconTypeAttribute ) { + case TreeView::ICON_CSS: $type = "ICON_CSS"; break; + case TreeView::ICON_RAW: $type = "ICON_RAW"; break; + default: $type = 'Unknown (' . $node->$iconTypeAttribute . ')'; break; + } + + $attribute = empty($node->$iconAttribute) ? 'Default' : $node->$iconAttribute; + ?> +
+

+ Type: ' . $type . '   Show: ' . $iconsListShow . ' – ' . $attribute . '

' ?> +
+
+ + +

+ + +
+
+ isActive() ? 'fa-check-circle' : 'fa-circle') . '"> isActive()
' ?> + isActive() ? 'fa-check-circle' : 'fa-circle') . '"> isVisible()
' ?> + isReadonly() ? 'fa-check-circle' : 'fa-circle') . '"> isReadonly()
' ?> + isDisabled() ? 'fa-check-circle' : 'fa-circle') . '"> isDisabled()
' ?> + isChildAllowed() ? 'fa-check-circle' : 'fa-circle') . '"> isChildAllowed()
' ?> +
+
+ isSelected() ? 'fa-check-circle' : 'fa-circle') . '"> isSelected()
' ?> + isCollapsed() ? 'fa-check-circle' : 'fa-circle') . '"> isCollapsed()
' ?> + isRemovable() ? 'fa-check-circle' : 'fa-circle') . '"> isRemovable()
' ?> + isRemovableAll() ? 'fa-check-circle' : 'fa-circle') . '"> isRemovableAll()
' ?> +
+
+ isMovable('u') ? 'fa-check-circle' : 'fa-circle') . '"> isMovable(\'u\')
' ?> + isMovable('d') ? 'fa-check-circle' : 'fa-circle') . '"> isMovable(\'d\')
' ?> + isMovable('l') ? 'fa-check-circle' : 'fa-circle') . '"> isMovable(\'l\')
' ?> + isMovable('r') ? 'fa-check-circle' : 'fa-circle') . '"> isMovable(\'r\')
' ?> +
+
+ + + + + + +