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(''+o.selectNode+"
"),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(''+o.selectNode+"
"),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 @@
= Html::hiddenInput('currUrl', $currUrl) ?>
= Html::hiddenInput('modelClass', $modelClass) ?>
= Html::hiddenInput('nodeSelected', $nodeSelected) ?>
+= Html::hiddenInput('modeView', $modeView) ?>
+
- = Html::resetButton(
- ArrayHelper::getValue($nodeViewButtonLabels, 'reset', $resetTitle),
- ['class' => 'btn ' . $defaultBtnCss, 'title' => $resetTitle]
- ) ?>
- = Html::submitButton(
- ArrayHelper::getValue($nodeViewButtonLabels, 'submit', $submitTitle),
- ['class' => 'btn btn-primary', 'title' => $submitTitle]
- ) ?>
+ ",
+ // ['class'=>'btn btn-outline-secondary kv-flipview', 'title'=>'Flip Display Mode'] )
+ ?>
+ = Html::resetButton(
+ ArrayHelper::getValue($nodeViewButtonLabels, 'reset', $resetTitle),
+ ['class' => 'btn ' . $defaultBtnCss, 'title' => $resetTitle]
+ ) ?>
+
+ = Html::submitButton(
+ ArrayHelper::getValue($nodeViewButtonLabels, 'submit', $submitTitle),
+ ['class' => 'btn btn-primary', 'title' => $submitTitle]
+ ) ?>
= $name ?>
@@ -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'];
+}
+?>
+
+
+= Html::hiddenInput('nodeTitle', $nodeTitle) ?>
+= Html::hiddenInput('nodeTitlePlural', $nodeTitlePlural) ?>
+= Html::hiddenInput('treeNodeModify', $node->isNewRecord) ?>
+= Html::hiddenInput('parentKey', $parentKey) ?>
+= Html::hiddenInput('currUrl', $currUrl) ?>
+= Html::hiddenInput('modelClass', $modelClass) ?>
+= Html::hiddenInput('nodeSelected', $nodeSelected) ?>
+= Html::hiddenInput('modeView', $modeView) ?>
+= Html::hiddenInput('treeManageHash', $treeManageHash) ?>
+= Html::hiddenInput('treeRemoveHash', $treeRemoveHash) ?>
+= Html::hiddenInput('treeMoveHash', $treeMoveHash) ?>
+
+
+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:
+
= $name . ' (' . $node->$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;
+ ?>
+
+
= 'Icon Settings' ?>
+ = '
Type: ' . $type . ' Show: ' . $iconsListShow . ' – ' . $attribute . '
' ?>
+
+
+
+
+
= Yii::t('kvtree', 'Admin Settings') ?>
+
+
+
+
+ = ' isActive()
' ?>
+ = ' isVisible()
' ?>
+ = ' isReadonly()
' ?>
+ = ' isDisabled()
' ?>
+ = ' isChildAllowed()
' ?>
+
+
+ = ' isSelected()
' ?>
+ = ' isCollapsed()
' ?>
+ = ' isRemovable()
' ?>
+ = ' isRemovableAll()
' ?>
+
+
+ = ' isMovable(\'u\')
' ?>
+ = ' isMovable(\'d\')
' ?>
+ = ' isMovable(\'l\')
' ?>
+ = ' isMovable(\'r\')
' ?>
+
+
+
+
+ = $noNodesMessage ?>
+
+
+
+