",
+
+ options: {
+ classes: {},
+ disabled: false,
+
+ // Callbacks
+ create: null
+ },
+
+ _createWidget: function( options, element ) {
+ element = $( element || this.defaultElement || this )[ 0 ];
+ this.element = $( element );
+ this.uuid = widgetUuid++;
+ this.eventNamespace = "." + this.widgetName + this.uuid;
+
+ this.bindings = $();
+ this.hoverable = $();
+ this.focusable = $();
+ this.classesElementLookup = {};
+
+ if ( element !== this ) {
+ $.data( element, this.widgetFullName, this );
+ this._on( true, this.element, {
+ remove: function( event ) {
+ if ( event.target === element ) {
+ this.destroy();
+ }
+ }
+ } );
+ this.document = $( element.style ?
+
+ // Element within the document
+ element.ownerDocument :
+
+ // Element is window or document
+ element.document || element );
+ this.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow );
+ }
+
+ this.options = $.widget.extend( {},
+ this.options,
+ this._getCreateOptions(),
+ options );
+
+ this._create();
+
+ if ( this.options.disabled ) {
+ this._setOptionDisabled( this.options.disabled );
+ }
+
+ this._trigger( "create", null, this._getCreateEventData() );
+ this._init();
+ },
+
+ _getCreateOptions: function() {
+ return {};
+ },
+
+ _getCreateEventData: $.noop,
+
+ _create: $.noop,
+
+ _init: $.noop,
+
+ destroy: function() {
+ var that = this;
+
+ this._destroy();
+ $.each( this.classesElementLookup, function( key, value ) {
+ that._removeClass( value, key );
+ } );
+
+ // We can probably remove the unbind calls in 2.0
+ // all event bindings should go through this._on()
+ this.element
+ .off( this.eventNamespace )
+ .removeData( this.widgetFullName );
+ this.widget()
+ .off( this.eventNamespace )
+ .removeAttr( "aria-disabled" );
+
+ // Clean up events and states
+ this.bindings.off( this.eventNamespace );
+ },
+
+ _destroy: $.noop,
+
+ widget: function() {
+ return this.element;
+ },
+
+ option: function( key, value ) {
+ var options = key;
+ var parts;
+ var curOption;
+ var i;
+
+ if ( arguments.length === 0 ) {
+
+ // Don't return a reference to the internal hash
+ return $.widget.extend( {}, this.options );
+ }
+
+ if ( typeof key === "string" ) {
+
+ // Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
+ options = {};
+ parts = key.split( "." );
+ key = parts.shift();
+ if ( parts.length ) {
+ curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
+ for ( i = 0; i < parts.length - 1; i++ ) {
+ curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
+ curOption = curOption[ parts[ i ] ];
+ }
+ key = parts.pop();
+ if ( arguments.length === 1 ) {
+ return curOption[ key ] === undefined ? null : curOption[ key ];
+ }
+ curOption[ key ] = value;
+ } else {
+ if ( arguments.length === 1 ) {
+ return this.options[ key ] === undefined ? null : this.options[ key ];
+ }
+ options[ key ] = value;
+ }
+ }
+
+ this._setOptions( options );
+
+ return this;
+ },
+
+ _setOptions: function( options ) {
+ var key;
+
+ for ( key in options ) {
+ this._setOption( key, options[ key ] );
+ }
+
+ return this;
+ },
+
+ _setOption: function( key, value ) {
+ if ( key === "classes" ) {
+ this._setOptionClasses( value );
+ }
+
+ this.options[ key ] = value;
+
+ if ( key === "disabled" ) {
+ this._setOptionDisabled( value );
+ }
+
+ return this;
+ },
+
+ _setOptionClasses: function( value ) {
+ var classKey, elements, currentElements;
+
+ for ( classKey in value ) {
+ currentElements = this.classesElementLookup[ classKey ];
+ if ( value[ classKey ] === this.options.classes[ classKey ] ||
+ !currentElements ||
+ !currentElements.length ) {
+ continue;
+ }
+
+ // We are doing this to create a new jQuery object because the _removeClass() call
+ // on the next line is going to destroy the reference to the current elements being
+ // tracked. We need to save a copy of this collection so that we can add the new classes
+ // below.
+ elements = $( currentElements.get() );
+ this._removeClass( currentElements, classKey );
+
+ // We don't use _addClass() here, because that uses this.options.classes
+ // for generating the string of classes. We want to use the value passed in from
+ // _setOption(), this is the new value of the classes option which was passed to
+ // _setOption(). We pass this value directly to _classes().
+ elements.addClass( this._classes( {
+ element: elements,
+ keys: classKey,
+ classes: value,
+ add: true
+ } ) );
+ }
+ },
+
+ _setOptionDisabled: function( value ) {
+ this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null, !!value );
+
+ // If the widget is becoming disabled, then nothing is interactive
+ if ( value ) {
+ this._removeClass( this.hoverable, null, "ui-state-hover" );
+ this._removeClass( this.focusable, null, "ui-state-focus" );
+ }
+ },
+
+ enable: function() {
+ return this._setOptions( { disabled: false } );
+ },
+
+ disable: function() {
+ return this._setOptions( { disabled: true } );
+ },
+
+ _classes: function( options ) {
+ var full = [];
+ var that = this;
+
+ options = $.extend( {
+ element: this.element,
+ classes: this.options.classes || {}
+ }, options );
+
+ function bindRemoveEvent() {
+ options.element.each( function( _, element ) {
+ var isTracked = $.map( that.classesElementLookup, function( elements ) {
+ return elements;
+ } )
+ .some( function( elements ) {
+ return elements.is( element );
+ } );
+
+ if ( !isTracked ) {
+ that._on( $( element ), {
+ remove: "_untrackClassesElement"
+ } );
+ }
+ } );
+ }
+
+ function processClassString( classes, checkOption ) {
+ var current, i;
+ for ( i = 0; i < classes.length; i++ ) {
+ current = that.classesElementLookup[ classes[ i ] ] || $();
+ if ( options.add ) {
+ bindRemoveEvent();
+ current = $( $.uniqueSort( current.get().concat( options.element.get() ) ) );
+ } else {
+ current = $( current.not( options.element ).get() );
+ }
+ that.classesElementLookup[ classes[ i ] ] = current;
+ full.push( classes[ i ] );
+ if ( checkOption && options.classes[ classes[ i ] ] ) {
+ full.push( options.classes[ classes[ i ] ] );
+ }
+ }
+ }
+
+ if ( options.keys ) {
+ processClassString( options.keys.match( /\S+/g ) || [], true );
+ }
+ if ( options.extra ) {
+ processClassString( options.extra.match( /\S+/g ) || [] );
+ }
+
+ return full.join( " " );
+ },
+
+ _untrackClassesElement: function( event ) {
+ var that = this;
+ $.each( that.classesElementLookup, function( key, value ) {
+ if ( $.inArray( event.target, value ) !== -1 ) {
+ that.classesElementLookup[ key ] = $( value.not( event.target ).get() );
+ }
+ } );
+
+ this._off( $( event.target ) );
+ },
+
+ _removeClass: function( element, keys, extra ) {
+ return this._toggleClass( element, keys, extra, false );
+ },
+
+ _addClass: function( element, keys, extra ) {
+ return this._toggleClass( element, keys, extra, true );
+ },
+
+ _toggleClass: function( element, keys, extra, add ) {
+ add = ( typeof add === "boolean" ) ? add : extra;
+ var shift = ( typeof element === "string" || element === null ),
+ options = {
+ extra: shift ? keys : extra,
+ keys: shift ? element : keys,
+ element: shift ? this.element : element,
+ add: add
+ };
+ options.element.toggleClass( this._classes( options ), add );
+ return this;
+ },
+
+ _on: function( suppressDisabledCheck, element, handlers ) {
+ var delegateElement;
+ var instance = this;
+
+ // No suppressDisabledCheck flag, shuffle arguments
+ if ( typeof suppressDisabledCheck !== "boolean" ) {
+ handlers = element;
+ element = suppressDisabledCheck;
+ suppressDisabledCheck = false;
+ }
+
+ // No element argument, shuffle and use this.element
+ if ( !handlers ) {
+ handlers = element;
+ element = this.element;
+ delegateElement = this.widget();
+ } else {
+ element = delegateElement = $( element );
+ this.bindings = this.bindings.add( element );
+ }
+
+ $.each( handlers, function( event, handler ) {
+ function handlerProxy() {
+
+ // Allow widgets to customize the disabled handling
+ // - disabled as an array instead of boolean
+ // - disabled class as method for disabling individual parts
+ if ( !suppressDisabledCheck &&
+ ( instance.options.disabled === true ||
+ $( this ).hasClass( "ui-state-disabled" ) ) ) {
+ return;
+ }
+ return ( typeof handler === "string" ? instance[ handler ] : handler )
+ .apply( instance, arguments );
+ }
+
+ // Copy the guid so direct unbinding works
+ if ( typeof handler !== "string" ) {
+ handlerProxy.guid = handler.guid =
+ handler.guid || handlerProxy.guid || $.guid++;
+ }
+
+ var match = event.match( /^([\w:-]*)\s*(.*)$/ );
+ var eventName = match[ 1 ] + instance.eventNamespace;
+ var selector = match[ 2 ];
+
+ if ( selector ) {
+ delegateElement.on( eventName, selector, handlerProxy );
+ } else {
+ element.on( eventName, handlerProxy );
+ }
+ } );
+ },
+
+ _off: function( element, eventName ) {
+ eventName = ( eventName || "" ).split( " " ).join( this.eventNamespace + " " ) +
+ this.eventNamespace;
+ element.off( eventName );
+
+ // Clear the stack to avoid memory leaks (#10056)
+ this.bindings = $( this.bindings.not( element ).get() );
+ this.focusable = $( this.focusable.not( element ).get() );
+ this.hoverable = $( this.hoverable.not( element ).get() );
+ },
+
+ _delay: function( handler, delay ) {
+ function handlerProxy() {
+ return ( typeof handler === "string" ? instance[ handler ] : handler )
+ .apply( instance, arguments );
+ }
+ var instance = this;
+ return setTimeout( handlerProxy, delay || 0 );
+ },
+
+ _hoverable: function( element ) {
+ this.hoverable = this.hoverable.add( element );
+ this._on( element, {
+ mouseenter: function( event ) {
+ this._addClass( $( event.currentTarget ), null, "ui-state-hover" );
+ },
+ mouseleave: function( event ) {
+ this._removeClass( $( event.currentTarget ), null, "ui-state-hover" );
+ }
+ } );
+ },
+
+ _focusable: function( element ) {
+ this.focusable = this.focusable.add( element );
+ this._on( element, {
+ focusin: function( event ) {
+ this._addClass( $( event.currentTarget ), null, "ui-state-focus" );
+ },
+ focusout: function( event ) {
+ this._removeClass( $( event.currentTarget ), null, "ui-state-focus" );
+ }
+ } );
+ },
+
+ _trigger: function( type, event, data ) {
+ var prop, orig;
+ var callback = this.options[ type ];
+
+ data = data || {};
+ event = $.Event( event );
+ event.type = ( type === this.widgetEventPrefix ?
+ type :
+ this.widgetEventPrefix + type ).toLowerCase();
+
+ // The original event may come from any element
+ // so we need to reset the target on the new event
+ event.target = this.element[ 0 ];
+
+ // Copy original event properties over to the new event
+ orig = event.originalEvent;
+ if ( orig ) {
+ for ( prop in orig ) {
+ if ( !( prop in event ) ) {
+ event[ prop ] = orig[ prop ];
+ }
+ }
+ }
+
+ this.element.trigger( event, data );
+ return !( typeof callback === "function" &&
+ callback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false ||
+ event.isDefaultPrevented() );
+ }
+};
+
+$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
+ $.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
+ if ( typeof options === "string" ) {
+ options = { effect: options };
+ }
+
+ var hasOptions;
+ var effectName = !options ?
+ method :
+ options === true || typeof options === "number" ?
+ defaultEffect :
+ options.effect || defaultEffect;
+
+ options = options || {};
+ if ( typeof options === "number" ) {
+ options = { duration: options };
+ } else if ( options === true ) {
+ options = {};
+ }
+
+ hasOptions = !$.isEmptyObject( options );
+ options.complete = callback;
+
+ if ( options.delay ) {
+ element.delay( options.delay );
+ }
+
+ if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
+ element[ method ]( options );
+ } else if ( effectName !== method && element[ effectName ] ) {
+ element[ effectName ]( options.duration, options.easing, callback );
+ } else {
+ element.queue( function( next ) {
+ $( this )[ method ]();
+ if ( callback ) {
+ callback.call( element[ 0 ] );
+ }
+ next();
+ } );
+ }
+ };
+} );
+
+var widget = $.widget;
+
+
+/*!
+ * jQuery UI Position 1.13.0
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/position/
+ */
+
+//>>label: Position
+//>>group: Core
+//>>description: Positions elements relative to other elements.
+//>>docs: http://api.jqueryui.com/position/
+//>>demos: http://jqueryui.com/position/
+
+
+( function() {
+var cachedScrollbarWidth,
+ max = Math.max,
+ abs = Math.abs,
+ rhorizontal = /left|center|right/,
+ rvertical = /top|center|bottom/,
+ roffset = /[\+\-]\d+(\.[\d]+)?%?/,
+ rposition = /^\w+/,
+ rpercent = /%$/,
+ _position = $.fn.position;
+
+function getOffsets( offsets, width, height ) {
+ return [
+ parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),
+ parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )
+ ];
+}
+
+function parseCss( element, property ) {
+ return parseInt( $.css( element, property ), 10 ) || 0;
+}
+
+function isWindow( obj ) {
+ return obj != null && obj === obj.window;
+}
+
+function getDimensions( elem ) {
+ var raw = elem[ 0 ];
+ if ( raw.nodeType === 9 ) {
+ return {
+ width: elem.width(),
+ height: elem.height(),
+ offset: { top: 0, left: 0 }
+ };
+ }
+ if ( isWindow( raw ) ) {
+ return {
+ width: elem.width(),
+ height: elem.height(),
+ offset: { top: elem.scrollTop(), left: elem.scrollLeft() }
+ };
+ }
+ if ( raw.preventDefault ) {
+ return {
+ width: 0,
+ height: 0,
+ offset: { top: raw.pageY, left: raw.pageX }
+ };
+ }
+ return {
+ width: elem.outerWidth(),
+ height: elem.outerHeight(),
+ offset: elem.offset()
+ };
+}
+
+$.position = $.position || {
+ scrollbarWidth: function() {
+ if ( cachedScrollbarWidth !== undefined ) {
+ return cachedScrollbarWidth;
+ }
+ var w1, w2,
+ div = $( "
" ),
+ innerDiv = div.children()[ 0 ];
+
+ $( "body" ).append( div );
+ w1 = innerDiv.offsetWidth;
+ div.css( "overflow", "scroll" );
+
+ w2 = innerDiv.offsetWidth;
+
+ if ( w1 === w2 ) {
+ w2 = div[ 0 ].clientWidth;
+ }
+
+ div.remove();
+
+ return ( cachedScrollbarWidth = w1 - w2 );
+ },
+ getScrollInfo: function( within ) {
+ var overflowX = within.isWindow || within.isDocument ? "" :
+ within.element.css( "overflow-x" ),
+ overflowY = within.isWindow || within.isDocument ? "" :
+ within.element.css( "overflow-y" ),
+ hasOverflowX = overflowX === "scroll" ||
+ ( overflowX === "auto" && within.width < within.element[ 0 ].scrollWidth ),
+ hasOverflowY = overflowY === "scroll" ||
+ ( overflowY === "auto" && within.height < within.element[ 0 ].scrollHeight );
+ return {
+ width: hasOverflowY ? $.position.scrollbarWidth() : 0,
+ height: hasOverflowX ? $.position.scrollbarWidth() : 0
+ };
+ },
+ getWithinInfo: function( element ) {
+ var withinElement = $( element || window ),
+ isElemWindow = isWindow( withinElement[ 0 ] ),
+ isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9,
+ hasOffset = !isElemWindow && !isDocument;
+ return {
+ element: withinElement,
+ isWindow: isElemWindow,
+ isDocument: isDocument,
+ offset: hasOffset ? $( element ).offset() : { left: 0, top: 0 },
+ scrollLeft: withinElement.scrollLeft(),
+ scrollTop: withinElement.scrollTop(),
+ width: withinElement.outerWidth(),
+ height: withinElement.outerHeight()
+ };
+ }
+};
+
+$.fn.position = function( options ) {
+ if ( !options || !options.of ) {
+ return _position.apply( this, arguments );
+ }
+
+ // Make a copy, we don't want to modify arguments
+ options = $.extend( {}, options );
+
+ var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,
+
+ // Make sure string options are treated as CSS selectors
+ target = typeof options.of === "string" ?
+ $( document ).find( options.of ) :
+ $( options.of ),
+
+ within = $.position.getWithinInfo( options.within ),
+ scrollInfo = $.position.getScrollInfo( within ),
+ collision = ( options.collision || "flip" ).split( " " ),
+ offsets = {};
+
+ dimensions = getDimensions( target );
+ if ( target[ 0 ].preventDefault ) {
+
+ // Force left top to allow flipping
+ options.at = "left top";
+ }
+ targetWidth = dimensions.width;
+ targetHeight = dimensions.height;
+ targetOffset = dimensions.offset;
+
+ // Clone to reuse original targetOffset later
+ basePosition = $.extend( {}, targetOffset );
+
+ // Force my and at to have valid horizontal and vertical positions
+ // if a value is missing or invalid, it will be converted to center
+ $.each( [ "my", "at" ], function() {
+ var pos = ( options[ this ] || "" ).split( " " ),
+ horizontalOffset,
+ verticalOffset;
+
+ if ( pos.length === 1 ) {
+ pos = rhorizontal.test( pos[ 0 ] ) ?
+ pos.concat( [ "center" ] ) :
+ rvertical.test( pos[ 0 ] ) ?
+ [ "center" ].concat( pos ) :
+ [ "center", "center" ];
+ }
+ pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center";
+ pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center";
+
+ // Calculate offsets
+ horizontalOffset = roffset.exec( pos[ 0 ] );
+ verticalOffset = roffset.exec( pos[ 1 ] );
+ offsets[ this ] = [
+ horizontalOffset ? horizontalOffset[ 0 ] : 0,
+ verticalOffset ? verticalOffset[ 0 ] : 0
+ ];
+
+ // Reduce to just the positions without the offsets
+ options[ this ] = [
+ rposition.exec( pos[ 0 ] )[ 0 ],
+ rposition.exec( pos[ 1 ] )[ 0 ]
+ ];
+ } );
+
+ // Normalize collision option
+ if ( collision.length === 1 ) {
+ collision[ 1 ] = collision[ 0 ];
+ }
+
+ if ( options.at[ 0 ] === "right" ) {
+ basePosition.left += targetWidth;
+ } else if ( options.at[ 0 ] === "center" ) {
+ basePosition.left += targetWidth / 2;
+ }
+
+ if ( options.at[ 1 ] === "bottom" ) {
+ basePosition.top += targetHeight;
+ } else if ( options.at[ 1 ] === "center" ) {
+ basePosition.top += targetHeight / 2;
+ }
+
+ atOffset = getOffsets( offsets.at, targetWidth, targetHeight );
+ basePosition.left += atOffset[ 0 ];
+ basePosition.top += atOffset[ 1 ];
+
+ return this.each( function() {
+ var collisionPosition, using,
+ elem = $( this ),
+ elemWidth = elem.outerWidth(),
+ elemHeight = elem.outerHeight(),
+ marginLeft = parseCss( this, "marginLeft" ),
+ marginTop = parseCss( this, "marginTop" ),
+ collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) +
+ scrollInfo.width,
+ collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) +
+ scrollInfo.height,
+ position = $.extend( {}, basePosition ),
+ myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );
+
+ if ( options.my[ 0 ] === "right" ) {
+ position.left -= elemWidth;
+ } else if ( options.my[ 0 ] === "center" ) {
+ position.left -= elemWidth / 2;
+ }
+
+ if ( options.my[ 1 ] === "bottom" ) {
+ position.top -= elemHeight;
+ } else if ( options.my[ 1 ] === "center" ) {
+ position.top -= elemHeight / 2;
+ }
+
+ position.left += myOffset[ 0 ];
+ position.top += myOffset[ 1 ];
+
+ collisionPosition = {
+ marginLeft: marginLeft,
+ marginTop: marginTop
+ };
+
+ $.each( [ "left", "top" ], function( i, dir ) {
+ if ( $.ui.position[ collision[ i ] ] ) {
+ $.ui.position[ collision[ i ] ][ dir ]( position, {
+ targetWidth: targetWidth,
+ targetHeight: targetHeight,
+ elemWidth: elemWidth,
+ elemHeight: elemHeight,
+ collisionPosition: collisionPosition,
+ collisionWidth: collisionWidth,
+ collisionHeight: collisionHeight,
+ offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],
+ my: options.my,
+ at: options.at,
+ within: within,
+ elem: elem
+ } );
+ }
+ } );
+
+ if ( options.using ) {
+
+ // Adds feedback as second argument to using callback, if present
+ using = function( props ) {
+ var left = targetOffset.left - position.left,
+ right = left + targetWidth - elemWidth,
+ top = targetOffset.top - position.top,
+ bottom = top + targetHeight - elemHeight,
+ feedback = {
+ target: {
+ element: target,
+ left: targetOffset.left,
+ top: targetOffset.top,
+ width: targetWidth,
+ height: targetHeight
+ },
+ element: {
+ element: elem,
+ left: position.left,
+ top: position.top,
+ width: elemWidth,
+ height: elemHeight
+ },
+ horizontal: right < 0 ? "left" : left > 0 ? "right" : "center",
+ vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle"
+ };
+ if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {
+ feedback.horizontal = "center";
+ }
+ if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {
+ feedback.vertical = "middle";
+ }
+ if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {
+ feedback.important = "horizontal";
+ } else {
+ feedback.important = "vertical";
+ }
+ options.using.call( this, props, feedback );
+ };
+ }
+
+ elem.offset( $.extend( position, { using: using } ) );
+ } );
+};
+
+$.ui.position = {
+ fit: {
+ left: function( position, data ) {
+ var within = data.within,
+ withinOffset = within.isWindow ? within.scrollLeft : within.offset.left,
+ outerWidth = within.width,
+ collisionPosLeft = position.left - data.collisionPosition.marginLeft,
+ overLeft = withinOffset - collisionPosLeft,
+ overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,
+ newOverRight;
+
+ // Element is wider than within
+ if ( data.collisionWidth > outerWidth ) {
+
+ // Element is initially over the left side of within
+ if ( overLeft > 0 && overRight <= 0 ) {
+ newOverRight = position.left + overLeft + data.collisionWidth - outerWidth -
+ withinOffset;
+ position.left += overLeft - newOverRight;
+
+ // Element is initially over right side of within
+ } else if ( overRight > 0 && overLeft <= 0 ) {
+ position.left = withinOffset;
+
+ // Element is initially over both left and right sides of within
+ } else {
+ if ( overLeft > overRight ) {
+ position.left = withinOffset + outerWidth - data.collisionWidth;
+ } else {
+ position.left = withinOffset;
+ }
+ }
+
+ // Too far left -> align with left edge
+ } else if ( overLeft > 0 ) {
+ position.left += overLeft;
+
+ // Too far right -> align with right edge
+ } else if ( overRight > 0 ) {
+ position.left -= overRight;
+
+ // Adjust based on position and margin
+ } else {
+ position.left = max( position.left - collisionPosLeft, position.left );
+ }
+ },
+ top: function( position, data ) {
+ var within = data.within,
+ withinOffset = within.isWindow ? within.scrollTop : within.offset.top,
+ outerHeight = data.within.height,
+ collisionPosTop = position.top - data.collisionPosition.marginTop,
+ overTop = withinOffset - collisionPosTop,
+ overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,
+ newOverBottom;
+
+ // Element is taller than within
+ if ( data.collisionHeight > outerHeight ) {
+
+ // Element is initially over the top of within
+ if ( overTop > 0 && overBottom <= 0 ) {
+ newOverBottom = position.top + overTop + data.collisionHeight - outerHeight -
+ withinOffset;
+ position.top += overTop - newOverBottom;
+
+ // Element is initially over bottom of within
+ } else if ( overBottom > 0 && overTop <= 0 ) {
+ position.top = withinOffset;
+
+ // Element is initially over both top and bottom of within
+ } else {
+ if ( overTop > overBottom ) {
+ position.top = withinOffset + outerHeight - data.collisionHeight;
+ } else {
+ position.top = withinOffset;
+ }
+ }
+
+ // Too far up -> align with top
+ } else if ( overTop > 0 ) {
+ position.top += overTop;
+
+ // Too far down -> align with bottom edge
+ } else if ( overBottom > 0 ) {
+ position.top -= overBottom;
+
+ // Adjust based on position and margin
+ } else {
+ position.top = max( position.top - collisionPosTop, position.top );
+ }
+ }
+ },
+ flip: {
+ left: function( position, data ) {
+ var within = data.within,
+ withinOffset = within.offset.left + within.scrollLeft,
+ outerWidth = within.width,
+ offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,
+ collisionPosLeft = position.left - data.collisionPosition.marginLeft,
+ overLeft = collisionPosLeft - offsetLeft,
+ overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,
+ myOffset = data.my[ 0 ] === "left" ?
+ -data.elemWidth :
+ data.my[ 0 ] === "right" ?
+ data.elemWidth :
+ 0,
+ atOffset = data.at[ 0 ] === "left" ?
+ data.targetWidth :
+ data.at[ 0 ] === "right" ?
+ -data.targetWidth :
+ 0,
+ offset = -2 * data.offset[ 0 ],
+ newOverRight,
+ newOverLeft;
+
+ if ( overLeft < 0 ) {
+ newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth -
+ outerWidth - withinOffset;
+ if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {
+ position.left += myOffset + atOffset + offset;
+ }
+ } else if ( overRight > 0 ) {
+ newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset +
+ atOffset + offset - offsetLeft;
+ if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {
+ position.left += myOffset + atOffset + offset;
+ }
+ }
+ },
+ top: function( position, data ) {
+ var within = data.within,
+ withinOffset = within.offset.top + within.scrollTop,
+ outerHeight = within.height,
+ offsetTop = within.isWindow ? within.scrollTop : within.offset.top,
+ collisionPosTop = position.top - data.collisionPosition.marginTop,
+ overTop = collisionPosTop - offsetTop,
+ overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,
+ top = data.my[ 1 ] === "top",
+ myOffset = top ?
+ -data.elemHeight :
+ data.my[ 1 ] === "bottom" ?
+ data.elemHeight :
+ 0,
+ atOffset = data.at[ 1 ] === "top" ?
+ data.targetHeight :
+ data.at[ 1 ] === "bottom" ?
+ -data.targetHeight :
+ 0,
+ offset = -2 * data.offset[ 1 ],
+ newOverTop,
+ newOverBottom;
+ if ( overTop < 0 ) {
+ newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight -
+ outerHeight - withinOffset;
+ if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {
+ position.top += myOffset + atOffset + offset;
+ }
+ } else if ( overBottom > 0 ) {
+ newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset +
+ offset - offsetTop;
+ if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {
+ position.top += myOffset + atOffset + offset;
+ }
+ }
+ }
+ },
+ flipfit: {
+ left: function() {
+ $.ui.position.flip.left.apply( this, arguments );
+ $.ui.position.fit.left.apply( this, arguments );
+ },
+ top: function() {
+ $.ui.position.flip.top.apply( this, arguments );
+ $.ui.position.fit.top.apply( this, arguments );
+ }
+ }
+};
+
+} )();
+
+var position = $.ui.position;
+
+
+/*!
+ * jQuery UI Support for jQuery core 1.8.x and newer 1.13.0
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ */
+
+//>>label: jQuery 1.8+ Support
+//>>group: Core
+//>>description: Support version 1.8.x and newer of jQuery core
+
+
+// Support: jQuery 1.9.x or older
+// $.expr[ ":" ] is deprecated.
+if ( !$.expr.pseudos ) {
+ $.expr.pseudos = $.expr[ ":" ];
+}
+
+// Support: jQuery 1.11.x or older
+// $.unique has been renamed to $.uniqueSort
+if ( !$.uniqueSort ) {
+ $.uniqueSort = $.unique;
+}
+
+// Support: jQuery 2.2.x or older.
+// This method has been defined in jQuery 3.0.0.
+// Code from https://github.com/jquery/jquery/blob/e539bac79e666bba95bba86d690b4e609dca2286/src/selector/escapeSelector.js
+if ( !$.escapeSelector ) {
+
+ // CSS string/identifier serialization
+ // https://drafts.csswg.org/cssom/#common-serializing-idioms
+ var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;
+
+ var fcssescape = function( ch, asCodePoint ) {
+ if ( asCodePoint ) {
+
+ // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
+ if ( ch === "\0" ) {
+ return "\uFFFD";
+ }
+
+ // Control characters and (dependent upon position) numbers get escaped as code points
+ return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
+ }
+
+ // Other potentially-special ASCII characters get backslash-escaped
+ return "\\" + ch;
+ };
+
+ $.escapeSelector = function( sel ) {
+ return ( sel + "" ).replace( rcssescape, fcssescape );
+ };
+}
+
+// Support: jQuery 3.4.x or older
+// These methods have been defined in jQuery 3.5.0.
+if ( !$.fn.even || !$.fn.odd ) {
+ $.fn.extend( {
+ even: function() {
+ return this.filter( function( i ) {
+ return i % 2 === 0;
+ } );
+ },
+ odd: function() {
+ return this.filter( function( i ) {
+ return i % 2 === 1;
+ } );
+ }
+ } );
+}
+
+;
+/*!
+ * jQuery UI Keycode 1.13.0
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: Keycode
+//>>group: Core
+//>>description: Provide keycodes as keynames
+//>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/
+
+
+var keycode = $.ui.keyCode = {
+ BACKSPACE: 8,
+ COMMA: 188,
+ DELETE: 46,
+ DOWN: 40,
+ END: 35,
+ ENTER: 13,
+ ESCAPE: 27,
+ HOME: 36,
+ LEFT: 37,
+ PAGE_DOWN: 34,
+ PAGE_UP: 33,
+ PERIOD: 190,
+ RIGHT: 39,
+ SPACE: 32,
+ TAB: 9,
+ UP: 38
+};
+
+
+/*!
+ * jQuery UI Scroll Parent 1.13.0
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: scrollParent
+//>>group: Core
+//>>description: Get the closest ancestor element that is scrollable.
+//>>docs: http://api.jqueryui.com/scrollParent/
+
+
+var scrollParent = $.fn.scrollParent = function( includeHidden ) {
+ var position = this.css( "position" ),
+ excludeStaticParent = position === "absolute",
+ overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
+ scrollParent = this.parents().filter( function() {
+ var parent = $( this );
+ if ( excludeStaticParent && parent.css( "position" ) === "static" ) {
+ return false;
+ }
+ return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) +
+ parent.css( "overflow-x" ) );
+ } ).eq( 0 );
+
+ return position === "fixed" || !scrollParent.length ?
+ $( this[ 0 ].ownerDocument || document ) :
+ scrollParent;
+};
+
+
+/*!
+ * jQuery UI Unique ID 1.13.0
+ * http://jqueryui.com
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ */
+
+//>>label: uniqueId
+//>>group: Core
+//>>description: Functions to generate and remove uniqueId's
+//>>docs: http://api.jqueryui.com/uniqueId/
+
+
+var uniqueId = $.fn.extend( {
+ uniqueId: ( function() {
+ var uuid = 0;
+
+ return function() {
+ return this.each( function() {
+ if ( !this.id ) {
+ this.id = "ui-id-" + ( ++uuid );
+ }
+ } );
+ };
+ } )(),
+
+ removeUniqueId: function() {
+ return this.each( function() {
+ if ( /^ui-id-\d+$/.test( this.id ) ) {
+ $( this ).removeAttr( "id" );
+ }
+ } );
+ }
+} );
+
+
+
+
+} );
diff --git a/public/js/viewtree/modules/jquery.fancytree.wide.js b/public/js/viewtree/modules/jquery.fancytree.wide.js
new file mode 100644
index 0000000..c6973c2
--- /dev/null
+++ b/public/js/viewtree/modules/jquery.fancytree.wide.js
@@ -0,0 +1,257 @@
+/*!
+ * jquery.fancytree.wide.js
+ * Support for 100% wide selection bars.
+ * (Extension module for jquery.fancytree.js: https://github.com/mar10/fancytree/)
+ *
+ * Copyright (c) 2008-2021, Martin Wendt (https://wwWendt.de)
+ *
+ * Released under the MIT license
+ * https://github.com/mar10/fancytree/wiki/LicenseInfo
+ *
+ * @version 2.38.2
+ * @date 2022-06-30T18:24:06Z
+ */
+
+(function (factory) {
+ if (typeof define === "function" && define.amd) {
+ // AMD. Register as an anonymous module.
+ define(["jquery", "./jquery.fancytree"], factory);
+ } else if (typeof module === "object" && module.exports) {
+ // Node/CommonJS
+ require("./jquery.fancytree");
+ module.exports = factory(require("jquery"));
+ } else {
+ // Browser globals
+ factory(jQuery);
+ }
+})(function ($) {
+ "use strict";
+
+ var reNumUnit = /^([+-]?(?:\d+|\d*\.\d+))([a-z]*|%)$/; // split "1.5em" to ["1.5", "em"]
+
+ /*******************************************************************************
+ * Private functions and variables
+ */
+ // var _assert = $.ui.fancytree.assert;
+
+ /* Calculate inner width without scrollbar */
+ // function realInnerWidth($el) {
+ // // http://blog.jquery.com/2012/08/16/jquery-1-8-box-sizing-width-csswidth-and-outerwidth/
+ // // inst.contWidth = parseFloat(this.$container.css("width"), 10);
+ // // 'Client width without scrollbar' - 'padding'
+ // return $el[0].clientWidth - ($el.innerWidth() - parseFloat($el.css("width"), 10));
+ // }
+
+ /* Create a global embedded CSS style for the tree. */
+ function defineHeadStyleElement(id, cssText) {
+ id = "fancytree-style-" + id;
+ var $headStyle = $("#" + id);
+
+ if (!cssText) {
+ $headStyle.remove();
+ return null;
+ }
+ if (!$headStyle.length) {
+ $headStyle = $("")
+ .attr("id", id)
+ .addClass("fancytree-style")
+ .prop("type", "text/css")
+ .appendTo("head");
+ }
+ try {
+ $headStyle.html(cssText);
+ } catch (e) {
+ // fix for IE 6-8
+ $headStyle[0].styleSheet.cssText = cssText;
+ }
+ return $headStyle;
+ }
+
+ /* Calculate the CSS rules that indent title spans. */
+ function renderLevelCss(
+ containerId,
+ depth,
+ levelOfs,
+ lineOfs,
+ labelOfs,
+ measureUnit
+ ) {
+ var i,
+ prefix = "#" + containerId + " span.fancytree-level-",
+ rules = [];
+
+ for (i = 0; i < depth; i++) {
+ rules.push(
+ prefix +
+ (i + 1) +
+ " span.fancytree-title { padding-left: " +
+ (i * levelOfs + lineOfs) +
+ measureUnit +
+ "; }"
+ );
+ }
+ // Some UI animations wrap the UL inside a DIV and set position:relative on both.
+ // This breaks the left:0 and padding-left:nn settings of the title
+ rules.push(
+ "#" +
+ containerId +
+ " div.ui-effects-wrapper ul li span.fancytree-title, " +
+ "#" +
+ containerId +
+ " li.fancytree-animating span.fancytree-title " + // #716
+ "{ padding-left: " +
+ labelOfs +
+ measureUnit +
+ "; position: static; width: auto; }"
+ );
+ return rules.join("\n");
+ }
+
+ // /**
+ // * [ext-wide] Recalculate the width of the selection bar after the tree container
+ // * was resized.
+ // * May be called explicitly on container resize, since there is no resize event
+ // * for DIV tags.
+ // *
+ // * @alias Fancytree#wideUpdate
+ // * @requires jquery.fancytree.wide.js
+ // */
+ // $.ui.fancytree._FancytreeClass.prototype.wideUpdate = function(){
+ // var inst = this.ext.wide,
+ // prevCw = inst.contWidth,
+ // prevLo = inst.lineOfs;
+
+ // inst.contWidth = realInnerWidth(this.$container);
+ // // Each title is precceeded by 2 or 3 icons (16px + 3 margin)
+ // // + 1px title border and 3px title padding
+ // // TODO: use code from treeInit() below
+ // inst.lineOfs = (this.options.checkbox ? 3 : 2) * 19;
+ // if( prevCw !== inst.contWidth || prevLo !== inst.lineOfs ) {
+ // this.debug("wideUpdate: " + inst.contWidth);
+ // this.visit(function(node){
+ // node.tree._callHook("nodeRenderTitle", node);
+ // });
+ // }
+ // };
+
+ /*******************************************************************************
+ * Extension code
+ */
+ $.ui.fancytree.registerExtension({
+ name: "wide",
+ version: "2.38.2",
+ // Default options for this extension.
+ options: {
+ iconWidth: null, // Adjust this if @fancy-icon-width != "16px"
+ iconSpacing: null, // Adjust this if @fancy-icon-spacing != "3px"
+ labelSpacing: null, // Adjust this if padding between icon and label != "3px"
+ levelOfs: null, // Adjust this if ul padding != "16px"
+ },
+
+ treeCreate: function (ctx) {
+ this._superApply(arguments);
+ this.$container.addClass("fancytree-ext-wide");
+
+ var containerId,
+ cssText,
+ iconSpacingUnit,
+ labelSpacingUnit,
+ iconWidthUnit,
+ levelOfsUnit,
+ instOpts = ctx.options.wide,
+ // css sniffing
+ $dummyLI = $(
+ "
"
+ ).appendTo(ctx.tree.$container),
+ $dummyIcon = $dummyLI.find(".fancytree-icon"),
+ $dummyUL = $dummyLI.find("ul"),
+ // $dummyTitle = $dummyLI.find(".fancytree-title"),
+ iconSpacing =
+ instOpts.iconSpacing || $dummyIcon.css("margin-left"),
+ iconWidth = instOpts.iconWidth || $dummyIcon.css("width"),
+ labelSpacing = instOpts.labelSpacing || "3px",
+ levelOfs = instOpts.levelOfs || $dummyUL.css("padding-left");
+
+ $dummyLI.remove();
+
+ iconSpacingUnit = iconSpacing.match(reNumUnit)[2];
+ iconSpacing = parseFloat(iconSpacing, 10);
+ labelSpacingUnit = labelSpacing.match(reNumUnit)[2];
+ labelSpacing = parseFloat(labelSpacing, 10);
+ iconWidthUnit = iconWidth.match(reNumUnit)[2];
+ iconWidth = parseFloat(iconWidth, 10);
+ levelOfsUnit = levelOfs.match(reNumUnit)[2];
+ if (
+ iconSpacingUnit !== iconWidthUnit ||
+ levelOfsUnit !== iconWidthUnit ||
+ labelSpacingUnit !== iconWidthUnit
+ ) {
+ $.error(
+ "iconWidth, iconSpacing, and levelOfs must have the same css measure unit"
+ );
+ }
+ this._local.measureUnit = iconWidthUnit;
+ this._local.levelOfs = parseFloat(levelOfs);
+ this._local.lineOfs =
+ (1 +
+ (ctx.options.checkbox ? 1 : 0) +
+ (ctx.options.icon === false ? 0 : 1)) *
+ (iconWidth + iconSpacing) +
+ iconSpacing;
+ this._local.labelOfs = labelSpacing;
+ this._local.maxDepth = 10;
+
+ // Get/Set a unique Id on the container (if not already exists)
+ containerId = this.$container.uniqueId().attr("id");
+ // Generated css rules for some levels (extended on demand)
+ cssText = renderLevelCss(
+ containerId,
+ this._local.maxDepth,
+ this._local.levelOfs,
+ this._local.lineOfs,
+ this._local.labelOfs,
+ this._local.measureUnit
+ );
+ defineHeadStyleElement(containerId, cssText);
+ },
+ treeDestroy: function (ctx) {
+ // Remove generated css rules
+ defineHeadStyleElement(this.$container.attr("id"), null);
+ return this._superApply(arguments);
+ },
+ nodeRenderStatus: function (ctx) {
+ var containerId,
+ cssText,
+ res,
+ node = ctx.node,
+ level = node.getLevel();
+
+ res = this._super(ctx);
+ // Generate some more level-n rules if required
+ if (level > this._local.maxDepth) {
+ containerId = this.$container.attr("id");
+ this._local.maxDepth *= 2;
+ node.debug(
+ "Define global ext-wide css up to level " +
+ this._local.maxDepth
+ );
+ cssText = renderLevelCss(
+ containerId,
+ this._local.maxDepth,
+ this._local.levelOfs,
+ this._local.lineOfs,
+ this._local.labelSpacing,
+ this._local.measureUnit
+ );
+ defineHeadStyleElement(containerId, cssText);
+ }
+ // Add level-n class to apply indentation padding.
+ // (Setting element style would not work, since it cannot easily be
+ // overriden while animations run)
+ $(node.span).addClass("fancytree-level-" + level);
+ return res;
+ },
+ });
+ // Value returned by `require('jquery.fancytree..')`
+ return $.ui.fancytree;
+}); // End of closure
diff --git a/public/js/viewtree/skin-awesome/ui.fancytree.css b/public/js/viewtree/skin-awesome/ui.fancytree.css
new file mode 100644
index 0000000..bef3c1e
--- /dev/null
+++ b/public/js/viewtree/skin-awesome/ui.fancytree.css
@@ -0,0 +1,588 @@
+/*!
+ * Fancytree "awesome" skin.
+ *
+ * DON'T EDIT THE CSS FILE DIRECTLY, since it is automatically generated from
+ * the LESS templates.
+ */
+/*******************************************************************************
+ * Common Styles for Fancytree Skins.
+ *
+ * This section is automatically generated from the `skin-common.less` template.
+ *
+ * Copyright (c) 2008-2021, Martin Wendt (https://wwWendt.de)
+ * Released under the MIT license
+ * https://github.com/mar10/fancytree/wiki/LicenseInfo
+ *
+ * @version 2.38.2
+ * @date 2022-06-30T18:24:06Z
+******************************************************************************/
+/*------------------------------------------------------------------------------
+ * Helpers
+ *----------------------------------------------------------------------------*/
+.fancytree-helper-hidden {
+ display: none;
+}
+.fancytree-helper-indeterminate-cb {
+ color: #777;
+}
+.fancytree-helper-disabled {
+ color: silver;
+}
+/* Helper to allow spinning loader icon with glyph-, ligature-, and SVG-icons. */
+.fancytree-helper-spin {
+ -webkit-animation: spin 1000ms infinite linear;
+ animation: spin 1000ms infinite linear;
+}
+@-webkit-keyframes spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+@keyframes spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+/*------------------------------------------------------------------------------
+ * Container and UL / LI
+ *----------------------------------------------------------------------------*/
+ul.fancytree-container {
+ font-family: tahoma, arial, helvetica;
+ font-size: 10pt;
+ white-space: nowrap;
+ padding: 3px;
+ margin: 0;
+ background-color: white;
+ border: 1px dotted gray;
+ min-height: 0%;
+ position: relative;
+}
+ul.fancytree-container ul {
+ padding: 0 0 0 10pt;
+ margin: 0;
+}
+ul.fancytree-container ul > li:before {
+ content: none;
+}
+ul.fancytree-container li {
+ list-style-image: none;
+ list-style-position: outside;
+ list-style-type: none;
+ -moz-background-clip: border;
+ -moz-background-inline-policy: continuous;
+ -moz-background-origin: padding;
+ background-attachment: scroll;
+ background-color: transparent;
+ background-position: 0pt 0pt;
+ background-repeat: repeat-y;
+ background-image: none;
+ margin: 0;
+}
+ul.fancytree-container li.fancytree-lastsib {
+ background-image: none;
+}
+.ui-fancytree-disabled ul.fancytree-container {
+ opacity: 0.5;
+ background-color: silver;
+}
+ul.fancytree-connectors.fancytree-container li {
+ background-image: url("../skin-awesome/vline.gif");
+ background-position: 0 0;
+}
+ul.fancytree-container li.fancytree-lastsib,
+ul.fancytree-no-connector > li {
+ background-image: none;
+}
+li.fancytree-animating {
+ position: relative;
+}
+/*------------------------------------------------------------------------------
+ * Common icon definitions
+ *----------------------------------------------------------------------------*/
+span.fancytree-empty,
+span.fancytree-vline,
+span.fancytree-expander,
+span.fancytree-icon,
+span.fancytree-checkbox,
+span.fancytree-drag-helper-img,
+#fancytree-drop-marker {
+ width: 10pt;
+ height: 10pt;
+ display: inline-block;
+ vertical-align: top;
+ background-repeat: no-repeat;
+ background-position: 0pt 0pt;
+}
+span.fancytree-icon,
+span.fancytree-checkbox,
+span.fancytree-expander,
+span.fancytree-custom-icon {
+ margin-top: 0px;
+}
+/* Used by icon option: */
+span.fancytree-custom-icon {
+ width: 10pt;
+ height: 10pt;
+ display: inline-block;
+ margin-left: 3px;
+ background-position: 0pt 0pt;
+}
+/* Used by 'icon' node option: */
+img.fancytree-icon {
+ width: 10pt;
+ height: 10pt;
+ margin-left: 3px;
+ margin-top: 0px;
+ vertical-align: top;
+ border-style: none;
+}
+/*------------------------------------------------------------------------------
+ * Expander icon
+ *
+ * Note: IE6 doesn't correctly evaluate multiples class names,
+ * so we create combined class names that can be used in the CSS.
+ *
+ * Prefix: fancytree-exp-
+ * 1st character: 'e': expanded, 'c': collapsed, 'n': no children
+ * 2nd character (optional): 'd': lazy (Delayed)
+ * 3rd character (optional): 'l': Last sibling
+ *----------------------------------------------------------------------------*/
+span.fancytree-expander {
+ cursor: pointer;
+}
+.fancytree-exp-n span.fancytree-expander,
+.fancytree-exp-nl span.fancytree-expander {
+ background-image: none;
+ cursor: default;
+}
+.fancytree-connectors .fancytree-exp-n span.fancytree-expander,
+.fancytree-connectors .fancytree-exp-nl span.fancytree-expander {
+ margin-top: 0;
+}
+/* Fade out expanders, when container is not hovered or active */
+.fancytree-fade-expander span.fancytree-expander {
+ transition: opacity 1.5s;
+ opacity: 0;
+}
+.fancytree-fade-expander:hover span.fancytree-expander,
+.fancytree-fade-expander.fancytree-treefocus span.fancytree-expander,
+.fancytree-fade-expander .fancytree-treefocus span.fancytree-expander,
+.fancytree-fade-expander [class*="fancytree-statusnode-"] span.fancytree-expander {
+ transition: opacity 0.6s;
+ opacity: 1;
+}
+/*------------------------------------------------------------------------------
+ * Checkbox icon
+ *----------------------------------------------------------------------------*/
+span.fancytree-checkbox {
+ margin-left: 3px;
+}
+.fancytree-unselectable span.fancytree-checkbox {
+ opacity: 0.4;
+ filter: alpha(opacity=40);
+}
+.fancytree-container.fancytree-checkbox-auto-hide span.fancytree-checkbox {
+ visibility: hidden;
+}
+.fancytree-container.fancytree-checkbox-auto-hide .fancytree-node:hover span.fancytree-checkbox,
+.fancytree-container.fancytree-checkbox-auto-hide tr:hover td span.fancytree-checkbox,
+.fancytree-container.fancytree-checkbox-auto-hide .fancytree-node.fancytree-selected span.fancytree-checkbox,
+.fancytree-container.fancytree-checkbox-auto-hide tr.fancytree-selected td span.fancytree-checkbox {
+ visibility: unset;
+}
+.fancytree-container.fancytree-checkbox-auto-hide.fancytree-treefocus .fancytree-node.fancytree-active span.fancytree-checkbox,
+.fancytree-container.fancytree-checkbox-auto-hide.fancytree-treefocus tr.fancytree-active td span.fancytree-checkbox {
+ visibility: unset;
+}
+/*------------------------------------------------------------------------------
+ * Node type icon
+ * Note: IE6 doesn't correctly evaluate multiples class names,
+ * so we create combined class names that can be used in the CSS.
+ *
+ * Prefix: fancytree-ico-
+ * 1st character: 'e': expanded, 'c': collapsed
+ * 2nd character (optional): 'f': folder
+ *----------------------------------------------------------------------------*/
+span.fancytree-icon {
+ margin-left: 3px;
+}
+/* Documents */
+/* Folders */
+.fancytree-loading span.fancytree-expander,
+.fancytree-loading span.fancytree-expander:hover,
+.fancytree-statusnode-loading span.fancytree-icon,
+.fancytree-statusnode-loading span.fancytree-icon:hover,
+span.fancytree-icon.fancytree-icon-loading {
+ background-image: none;
+}
+/* Status node icons */
+/*------------------------------------------------------------------------------
+ * Node titles and highlighting
+ *----------------------------------------------------------------------------*/
+span.fancytree-node {
+ /* See #117 */
+ display: inherit;
+ width: 100%;
+ margin-top: 1px;
+ min-height: 10pt;
+}
+span.fancytree-title {
+ color: #000;
+ cursor: pointer;
+ display: inline-block;
+ vertical-align: top;
+ min-height: 10pt;
+ padding: 0 3px 0 3px;
+ margin: 0px 0 0 3px;
+ border: 1px solid transparent;
+ -webkit-border-radius: 0px;
+ -moz-border-radius: 0px;
+ -ms-border-radius: 0px;
+ -o-border-radius: 0px;
+ border-radius: 0px;
+}
+span.fancytree-node.fancytree-error span.fancytree-title {
+ color: red;
+}
+/*------------------------------------------------------------------------------
+ * Drag'n'drop support
+ *----------------------------------------------------------------------------*/
+/* ext-dnd5: */
+span.fancytree-childcounter {
+ color: #fff;
+ background: #337ab7;
+ border: 1px solid gray;
+ border-radius: 10px;
+ padding: 2px;
+ text-align: center;
+}
+/* ext-dnd: */
+div.fancytree-drag-helper span.fancytree-childcounter,
+div.fancytree-drag-helper span.fancytree-dnd-modifier {
+ display: inline-block;
+ color: #fff;
+ background: #337ab7;
+ border: 1px solid gray;
+ min-width: 10px;
+ height: 10px;
+ line-height: 1;
+ vertical-align: baseline;
+ border-radius: 10px;
+ padding: 2px;
+ text-align: center;
+ font-size: 9px;
+}
+div.fancytree-drag-helper span.fancytree-childcounter {
+ position: absolute;
+ top: -6px;
+ right: -6px;
+}
+div.fancytree-drag-helper span.fancytree-dnd-modifier {
+ background: #5cb85c;
+ border: none;
+ font-weight: bolder;
+}
+/*** Drop marker icon *********************************************************/
+#fancytree-drop-marker {
+ width: 20pt;
+ position: absolute;
+ margin: 0;
+}
+#fancytree-drop-marker.fancytree-drop-after,
+#fancytree-drop-marker.fancytree-drop-before {
+ width: 40pt;
+}
+/*** Source node while dragging ***********************************************/
+span.fancytree-drag-source.fancytree-drag-remove {
+ opacity: 0.15;
+}
+/*** Target node while dragging cursor is over it *****************************/
+/*------------------------------------------------------------------------------
+ * 'rtl' option
+ *----------------------------------------------------------------------------*/
+.fancytree-container.fancytree-rtl .fancytree-title {
+ /*unicode-bidi: bidi-override;*/
+ /* optional: reverse title letters */
+}
+.fancytree-container.fancytree-rtl .fancytree-exp-n span.fancytree-expander,
+.fancytree-container.fancytree-rtl .fancytree-exp-nl span.fancytree-expander {
+ background-image: none;
+}
+ul.fancytree-container.fancytree-rtl ul {
+ padding: 0 16px 0 0;
+}
+ul.fancytree-container.fancytree-rtl.fancytree-connectors li {
+ background-position: right 0;
+ background-image: url("../skin-awesome/vline-rtl.gif");
+}
+ul.fancytree-container.fancytree-rtl li.fancytree-lastsib,
+ul.fancytree-container.fancytree-rtl.fancytree-no-connector > li {
+ background-image: none;
+}
+/*------------------------------------------------------------------------------
+ * 'table' extension
+ *----------------------------------------------------------------------------*/
+table.fancytree-ext-table {
+ font-family: tahoma, arial, helvetica;
+ font-size: 10pt;
+ border-collapse: collapse;
+ /* ext-ariagrid */
+}
+table.fancytree-ext-table span.fancytree-node {
+ display: inline-block;
+ box-sizing: border-box;
+}
+table.fancytree-ext-table td.fancytree-status-merged {
+ text-align: center;
+ font-style: italic;
+ color: silver;
+}
+table.fancytree-ext-table tr.fancytree-statusnode-error td.fancytree-status-merged {
+ color: red;
+}
+table.fancytree-ext-table.fancytree-ext-ariagrid.fancytree-cell-mode > tbody > tr.fancytree-active > td {
+ background-color: #eee;
+}
+table.fancytree-ext-table.fancytree-ext-ariagrid.fancytree-cell-mode > tbody > tr > td.fancytree-active-cell {
+ background-color: #cbe8f6;
+}
+table.fancytree-ext-table.fancytree-ext-ariagrid.fancytree-cell-mode.fancytree-cell-nav-mode > tbody > tr > td.fancytree-active-cell {
+ background-color: #3875d7;
+}
+/*------------------------------------------------------------------------------
+ * 'columnview' extension
+ *----------------------------------------------------------------------------*/
+table.fancytree-ext-columnview tbody tr td {
+ position: relative;
+ border: 1px solid gray;
+ vertical-align: top;
+ overflow: auto;
+}
+table.fancytree-ext-columnview tbody tr td > ul {
+ padding: 0;
+}
+table.fancytree-ext-columnview tbody tr td > ul li {
+ list-style-image: none;
+ list-style-position: outside;
+ list-style-type: none;
+ -moz-background-clip: border;
+ -moz-background-inline-policy: continuous;
+ -moz-background-origin: padding;
+ background-attachment: scroll;
+ background-color: transparent;
+ background-position: 0pt 0pt;
+ background-repeat: repeat-y;
+ background-image: none;
+ /* no v-lines */
+ margin: 0;
+}
+table.fancytree-ext-columnview span.fancytree-node {
+ position: relative;
+ /* allow positioning of embedded spans */
+ display: inline-block;
+}
+table.fancytree-ext-columnview span.fancytree-node.fancytree-expanded {
+ background-color: #e0e0e0;
+}
+table.fancytree-ext-columnview span.fancytree-node.fancytree-active {
+ background-color: #cbe8f6;
+}
+table.fancytree-ext-columnview .fancytree-has-children span.fancytree-cv-right {
+ position: absolute;
+ right: 3px;
+}
+/*------------------------------------------------------------------------------
+ * 'filter' extension
+ *----------------------------------------------------------------------------*/
+.fancytree-ext-filter-dimm span.fancytree-node span.fancytree-title {
+ color: silver;
+ font-weight: lighter;
+}
+.fancytree-ext-filter-dimm tr.fancytree-submatch span.fancytree-title,
+.fancytree-ext-filter-dimm span.fancytree-node.fancytree-submatch span.fancytree-title {
+ color: black;
+ font-weight: normal;
+}
+.fancytree-ext-filter-dimm tr.fancytree-match span.fancytree-title,
+.fancytree-ext-filter-dimm span.fancytree-node.fancytree-match span.fancytree-title {
+ color: black;
+ font-weight: bold;
+}
+.fancytree-ext-filter-hide tr.fancytree-hide,
+.fancytree-ext-filter-hide span.fancytree-node.fancytree-hide {
+ display: none;
+}
+.fancytree-ext-filter-hide tr.fancytree-submatch span.fancytree-title,
+.fancytree-ext-filter-hide span.fancytree-node.fancytree-submatch span.fancytree-title {
+ color: silver;
+ font-weight: lighter;
+}
+.fancytree-ext-filter-hide tr.fancytree-match span.fancytree-title,
+.fancytree-ext-filter-hide span.fancytree-node.fancytree-match span.fancytree-title {
+ color: black;
+ font-weight: normal;
+}
+/* Hide expanders if all child nodes are hidden by filter */
+.fancytree-ext-filter-hide-expanders tr.fancytree-match span.fancytree-expander,
+.fancytree-ext-filter-hide-expanders span.fancytree-node.fancytree-match span.fancytree-expander {
+ visibility: hidden;
+}
+.fancytree-ext-filter-hide-expanders tr.fancytree-submatch span.fancytree-expander,
+.fancytree-ext-filter-hide-expanders span.fancytree-node.fancytree-submatch span.fancytree-expander {
+ visibility: visible;
+}
+.fancytree-ext-childcounter span.fancytree-icon,
+.fancytree-ext-filter span.fancytree-icon,
+.fancytree-ext-childcounter span.fancytree-custom-icon,
+.fancytree-ext-filter span.fancytree-custom-icon {
+ position: relative;
+}
+.fancytree-ext-childcounter span.fancytree-childcounter,
+.fancytree-ext-filter span.fancytree-childcounter {
+ color: #fff;
+ background: #777;
+ border: 1px solid gray;
+ position: absolute;
+ top: -6px;
+ right: -6px;
+ min-width: 10px;
+ height: 10px;
+ line-height: 1;
+ vertical-align: baseline;
+ border-radius: 10px;
+ padding: 2px;
+ text-align: center;
+ font-size: 9px;
+}
+/*------------------------------------------------------------------------------
+ * 'wide' extension
+ *----------------------------------------------------------------------------*/
+ul.fancytree-ext-wide {
+ position: relative;
+ min-width: 100%;
+ z-index: 2;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+ul.fancytree-ext-wide span.fancytree-node > span {
+ position: relative;
+ z-index: 2;
+}
+ul.fancytree-ext-wide span.fancytree-node span.fancytree-title {
+ position: absolute;
+ z-index: 1;
+ left: 0px;
+ min-width: 100%;
+ margin-left: 0;
+ margin-right: 0;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+/*------------------------------------------------------------------------------
+ * 'fixed' extension
+ *----------------------------------------------------------------------------*/
+.fancytree-ext-fixed-wrapper .fancytree-ext-fixed-hidden {
+ display: none;
+}
+.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-scroll-border-bottom {
+ border-bottom: 3px solid rgba(0, 0, 0, 0.75);
+}
+.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-scroll-border-right {
+ border-right: 3px solid rgba(0, 0, 0, 0.75);
+}
+.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-tl {
+ position: absolute;
+ overflow: hidden;
+ z-index: 3;
+ top: 0px;
+ left: 0px;
+}
+.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-tr {
+ position: absolute;
+ overflow: hidden;
+ z-index: 2;
+ top: 0px;
+}
+.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-bl {
+ position: absolute;
+ overflow: hidden;
+ z-index: 2;
+ left: 0px;
+}
+.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-br {
+ position: absolute;
+ overflow: scroll;
+ z-index: 1;
+}
+/*******************************************************************************
+ * Styles specific to this skin.
+ *
+ * This section is automatically generated from the `ui-fancytree.less` template.
+ ******************************************************************************/
+ul.fancytree-container ul {
+ padding: 0.3em 0 0 1em;
+ margin: 0;
+}
+.fancytree-expander,
+.fancytree-checkbox,
+.fancytree-icon {
+ min-width: 10pt;
+ text-align: center;
+}
+svg.fancytree-checkbox,
+svg.fancytree-icon {
+ padding-left: 3px;
+}
+/*******************************************************************************
+ * Node titles
+ */
+span.fancytree-title {
+ border: 1px solid transparent;
+ border-radius: 0;
+}
+span.fancytree-focused span.fancytree-title {
+ outline: 1px dotted black;
+}
+span.fancytree-active span.fancytree-title {
+ background-color: #D4D4D4;
+}
+.fancytree-treefocus span.fancytree-active span.fancytree-title {
+ color: white;
+ background-color: #3875D7;
+}
+/*******************************************************************************
+ * 'table' extension
+ */
+table.fancytree-ext-table {
+ border-collapse: collapse;
+}
+table.fancytree-ext-table tbody tr.fancytree-focused {
+ background-color: #99DEFD;
+}
+table.fancytree-ext-table tbody tr.fancytree-active {
+ background-color: royalblue;
+}
+/*******************************************************************************
+ * 'columnview' extension
+ */
+table.fancytree-ext-columnview tbody tr td {
+ border: 1px solid gray;
+}
+table.fancytree-ext-columnview span.fancytree-node.fancytree-expanded {
+ background-color: #ccc;
+}
+table.fancytree-ext-columnview span.fancytree-node.fancytree-active {
+ background-color: royalblue;
+}
diff --git a/public/js/viewtree/skin-awesome/ui.fancytree.less b/public/js/viewtree/skin-awesome/ui.fancytree.less
new file mode 100644
index 0000000..c25dade
--- /dev/null
+++ b/public/js/viewtree/skin-awesome/ui.fancytree.less
@@ -0,0 +1,128 @@
+/*!
+ * Fancytree "awesome" skin.
+ *
+ * DON'T EDIT THE CSS FILE DIRECTLY, since it is automatically generated from
+ * the LESS templates.
+ */
+
+// Import common styles
+@import "../skin-common.less";
+
+// We need to define this variable here (not in skin-common.less) to make it
+// work with grunt and webpack:
+@fancy-image-prefix: "./skin-awesome/";
+
+
+/*******************************************************************************
+ * Styles specific to this skin.
+ *
+ * This section is automatically generated from the `ui-fancytree.less` template.
+ ******************************************************************************/
+
+@fancy-use-sprites: false; // false: suppress all background images (i.e. icons)
+@fancy-loading-url: none;
+
+@fancy-cst-size: 10pt;
+
+@fancy-level-indent: @fancy-cst-size; //@fancy-cst-size;
+@fancy-line-height: @fancy-cst-size; // height of a nodes selection bar including borders
+@fancy-node-v-spacing: 1px; // gap between two node borders
+@fancy-icon-width: @fancy-cst-size;
+@fancy-icon-height: @fancy-cst-size;
+@fancy-icon-spacing: 3px; // margin between icon/icon or icon/title
+@fancy-icon-ofs-top: 0px; // extra vertical offset for expander, checkbox and icon
+@fancy-title-ofs-top: 0px; // extra vertical offset for title
+@fancy-node-border-width: 1px;
+@fancy-node-border-radius: 0px;
+@fancy-node-outline-width: 1px;
+
+// @fancy-loading-url: data-uri("@{fancy-image-prefix}loading.gif");
+
+// Set to `true` to use `data-uri(...)` instead of a `url(...)` link:
+@fancy-inline-sprites: false;
+
+@fancy-font-size: @fancy-cst-size;
+@fancy-font-family: tahoma, arial, helvetica;
+@fancy-font-color: #000;
+@fancy-font-color-dimm: silver;
+@fancy-font-error-color: red;
+
+
+ul.fancytree-container ul
+{
+ padding: 0.3em 0 0 1em;
+ margin: 0;
+}
+
+
+// The standard CSS assumes span.icon, but Fontawesome may use SVG or SPAN
+.fancytree-expander,
+.fancytree-checkbox,
+.fancytree-icon {
+ min-width: @fancy-icon-width;
+ text-align: center;
+}
+svg.fancytree-checkbox, // span... is already defined in skin-common-less
+svg.fancytree-icon {
+ padding-left: @fancy-icon-spacing;
+}
+
+/*******************************************************************************
+ * Node titles
+ */
+span.fancytree-title {
+ border: 1px solid transparent; // reserve some space for status borders
+ border-radius: 0;
+}
+span.fancytree-focused span.fancytree-title {
+ outline: 1px dotted black;
+}
+// span.fancytree-selected span.fancytree-title,
+span.fancytree-active span.fancytree-title {
+ background-color: #D4D4D4; // gray
+}
+// span.fancytree-selected span.fancytree-title {
+// font-style: italic;
+// }
+// .fancytree-treefocus span.fancytree-selected span.fancytree-title,
+.fancytree-treefocus span.fancytree-active span.fancytree-title {
+ color: white;
+ background-color: #3875D7; // blue
+}
+
+// .fancytree-treefocus span.fancytree-selected span.fancytree-title{
+// color: white;
+// background-color: #99DEFD; // blue
+// }
+
+/*******************************************************************************
+ * 'table' extension
+ */
+table.fancytree-ext-table {
+ border-collapse: collapse;
+ tbody {
+ tr.fancytree-focused {
+ background-color: #99DEFD;
+ }
+ tr.fancytree-active {
+ background-color: royalblue;
+ }
+ // tr.fancytree-selected {
+ // background-color: #99DEFD;
+ // }
+ }
+}
+
+/*******************************************************************************
+ * 'columnview' extension
+ */
+
+table.fancytree-ext-columnview tbody tr td {
+ border: 1px solid gray;
+}
+table.fancytree-ext-columnview span.fancytree-node.fancytree-expanded {
+ background-color: #ccc;
+}
+table.fancytree-ext-columnview span.fancytree-node.fancytree-active {
+ background-color: royalblue;
+}
diff --git a/public/js/viewtree/skin-awesome/ui.fancytree.min.css b/public/js/viewtree/skin-awesome/ui.fancytree.min.css
new file mode 100644
index 0000000..7fa2856
--- /dev/null
+++ b/public/js/viewtree/skin-awesome/ui.fancytree.min.css
@@ -0,0 +1,6 @@
+/*!
+ * Fancytree "awesome" skin.
+ *
+ * DON'T EDIT THE CSS FILE DIRECTLY, since it is automatically generated from
+ * the LESS templates.
+ */.fancytree-helper-hidden{display:none}.fancytree-helper-indeterminate-cb{color:#777}.fancytree-helper-disabled{color:silver}.fancytree-helper-spin{-webkit-animation:spin 1s infinite linear;animation:spin 1s infinite linear}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}ul.fancytree-container{font-family:tahoma,arial,helvetica;font-size:10pt;white-space:nowrap;padding:3px;margin:0;background-color:#fff;border:1px dotted gray;min-height:0;position:relative}ul.fancytree-container ul{padding:0 0 0 10pt;margin:0}ul.fancytree-container ul>li:before{content:none}ul.fancytree-container li{list-style-image:none;list-style-position:outside;list-style-type:none;-moz-background-clip:border;-moz-background-inline-policy:continuous;-moz-background-origin:padding;background-attachment:scroll;background-color:transparent;background-position:0 0;background-repeat:repeat-y;background-image:none;margin:0}ul.fancytree-container li.fancytree-lastsib{background-image:none}.ui-fancytree-disabled ul.fancytree-container{opacity:.5;background-color:silver}ul.fancytree-connectors.fancytree-container li{background-image:url("../skin-awesome/vline.gif");background-position:0 0}ul.fancytree-container li.fancytree-lastsib,ul.fancytree-no-connector>li{background-image:none}li.fancytree-animating{position:relative}#fancytree-drop-marker,span.fancytree-checkbox,span.fancytree-drag-helper-img,span.fancytree-empty,span.fancytree-expander,span.fancytree-icon,span.fancytree-vline{width:10pt;height:10pt;display:inline-block;vertical-align:top;background-repeat:no-repeat;background-position:0 0}span.fancytree-checkbox,span.fancytree-custom-icon,span.fancytree-expander,span.fancytree-icon{margin-top:0}span.fancytree-custom-icon{width:10pt;height:10pt;display:inline-block;margin-left:3px;background-position:0 0}img.fancytree-icon{width:10pt;height:10pt;margin-left:3px;margin-top:0;vertical-align:top;border-style:none}span.fancytree-expander{cursor:pointer}.fancytree-exp-n span.fancytree-expander,.fancytree-exp-nl span.fancytree-expander{background-image:none;cursor:default}.fancytree-connectors .fancytree-exp-n span.fancytree-expander,.fancytree-connectors .fancytree-exp-nl span.fancytree-expander{margin-top:0}.fancytree-fade-expander span.fancytree-expander{transition:opacity 1.5s;opacity:0}.fancytree-fade-expander .fancytree-treefocus span.fancytree-expander,.fancytree-fade-expander [class*=fancytree-statusnode-] span.fancytree-expander,.fancytree-fade-expander.fancytree-treefocus span.fancytree-expander,.fancytree-fade-expander:hover span.fancytree-expander{transition:opacity .6s;opacity:1}span.fancytree-checkbox{margin-left:3px}.fancytree-unselectable span.fancytree-checkbox{opacity:.4}.fancytree-container.fancytree-checkbox-auto-hide span.fancytree-checkbox{visibility:hidden}.fancytree-container.fancytree-checkbox-auto-hide .fancytree-node.fancytree-selected span.fancytree-checkbox,.fancytree-container.fancytree-checkbox-auto-hide .fancytree-node:hover span.fancytree-checkbox,.fancytree-container.fancytree-checkbox-auto-hide tr.fancytree-selected td span.fancytree-checkbox,.fancytree-container.fancytree-checkbox-auto-hide tr:hover td span.fancytree-checkbox{visibility:unset}.fancytree-container.fancytree-checkbox-auto-hide.fancytree-treefocus .fancytree-node.fancytree-active span.fancytree-checkbox,.fancytree-container.fancytree-checkbox-auto-hide.fancytree-treefocus tr.fancytree-active td span.fancytree-checkbox{visibility:unset}span.fancytree-icon{margin-left:3px}.fancytree-loading span.fancytree-expander,.fancytree-loading span.fancytree-expander:hover,.fancytree-statusnode-loading span.fancytree-icon,.fancytree-statusnode-loading span.fancytree-icon:hover,span.fancytree-icon.fancytree-icon-loading{background-image:none}span.fancytree-node{display:inherit;width:100%;margin-top:1px;min-height:10pt}span.fancytree-title{color:#000;cursor:pointer;display:inline-block;vertical-align:top;min-height:10pt;padding:0 3px 0 3px;margin:0 0 0 3px;border:1px solid transparent;-webkit-border-radius:0px;-moz-border-radius:0;-ms-border-radius:0px;-o-border-radius:0;border-radius:0}span.fancytree-node.fancytree-error span.fancytree-title{color:red}span.fancytree-childcounter{color:#fff;background:#337ab7;border:1px solid gray;border-radius:10px;padding:2px;text-align:center}div.fancytree-drag-helper span.fancytree-childcounter,div.fancytree-drag-helper span.fancytree-dnd-modifier{display:inline-block;color:#fff;background:#337ab7;border:1px solid gray;min-width:10px;height:10px;line-height:1;vertical-align:baseline;border-radius:10px;padding:2px;text-align:center;font-size:9px}div.fancytree-drag-helper span.fancytree-childcounter{position:absolute;top:-6px;right:-6px}div.fancytree-drag-helper span.fancytree-dnd-modifier{background:#5cb85c;border:none;font-weight:bolder}#fancytree-drop-marker{width:20pt;position:absolute;margin:0}#fancytree-drop-marker.fancytree-drop-after,#fancytree-drop-marker.fancytree-drop-before{width:40pt}span.fancytree-drag-source.fancytree-drag-remove{opacity:.15}.fancytree-container.fancytree-rtl .fancytree-exp-n span.fancytree-expander,.fancytree-container.fancytree-rtl .fancytree-exp-nl span.fancytree-expander{background-image:none}ul.fancytree-container.fancytree-rtl ul{padding:0 16px 0 0}ul.fancytree-container.fancytree-rtl.fancytree-connectors li{background-position:right 0;background-image:url("../skin-awesome/vline-rtl.gif")}ul.fancytree-container.fancytree-rtl li.fancytree-lastsib,ul.fancytree-container.fancytree-rtl.fancytree-no-connector>li{background-image:none}table.fancytree-ext-table{font-family:tahoma,arial,helvetica;font-size:10pt;border-collapse:collapse}table.fancytree-ext-table span.fancytree-node{display:inline-block;box-sizing:border-box}table.fancytree-ext-table td.fancytree-status-merged{text-align:center;font-style:italic;color:silver}table.fancytree-ext-table tr.fancytree-statusnode-error td.fancytree-status-merged{color:red}table.fancytree-ext-table.fancytree-ext-ariagrid.fancytree-cell-mode>tbody>tr.fancytree-active>td{background-color:#eee}table.fancytree-ext-table.fancytree-ext-ariagrid.fancytree-cell-mode>tbody>tr>td.fancytree-active-cell{background-color:#cbe8f6}table.fancytree-ext-table.fancytree-ext-ariagrid.fancytree-cell-mode.fancytree-cell-nav-mode>tbody>tr>td.fancytree-active-cell{background-color:#3875d7}table.fancytree-ext-columnview tbody tr td{position:relative;border:1px solid gray;vertical-align:top;overflow:auto}table.fancytree-ext-columnview tbody tr td>ul{padding:0}table.fancytree-ext-columnview tbody tr td>ul li{list-style-image:none;list-style-position:outside;list-style-type:none;-moz-background-clip:border;-moz-background-inline-policy:continuous;-moz-background-origin:padding;background-attachment:scroll;background-color:transparent;background-position:0 0;background-repeat:repeat-y;background-image:none;margin:0}table.fancytree-ext-columnview span.fancytree-node{position:relative;display:inline-block}table.fancytree-ext-columnview span.fancytree-node.fancytree-expanded{background-color:#e0e0e0}table.fancytree-ext-columnview span.fancytree-node.fancytree-active{background-color:#cbe8f6}table.fancytree-ext-columnview .fancytree-has-children span.fancytree-cv-right{position:absolute;right:3px}.fancytree-ext-filter-dimm span.fancytree-node span.fancytree-title{color:silver;font-weight:lighter}.fancytree-ext-filter-dimm span.fancytree-node.fancytree-submatch span.fancytree-title,.fancytree-ext-filter-dimm tr.fancytree-submatch span.fancytree-title{color:#000;font-weight:400}.fancytree-ext-filter-dimm span.fancytree-node.fancytree-match span.fancytree-title,.fancytree-ext-filter-dimm tr.fancytree-match span.fancytree-title{color:#000;font-weight:700}.fancytree-ext-filter-hide span.fancytree-node.fancytree-hide,.fancytree-ext-filter-hide tr.fancytree-hide{display:none}.fancytree-ext-filter-hide span.fancytree-node.fancytree-submatch span.fancytree-title,.fancytree-ext-filter-hide tr.fancytree-submatch span.fancytree-title{color:silver;font-weight:lighter}.fancytree-ext-filter-hide span.fancytree-node.fancytree-match span.fancytree-title,.fancytree-ext-filter-hide tr.fancytree-match span.fancytree-title{color:#000;font-weight:400}.fancytree-ext-filter-hide-expanders span.fancytree-node.fancytree-match span.fancytree-expander,.fancytree-ext-filter-hide-expanders tr.fancytree-match span.fancytree-expander{visibility:hidden}.fancytree-ext-filter-hide-expanders span.fancytree-node.fancytree-submatch span.fancytree-expander,.fancytree-ext-filter-hide-expanders tr.fancytree-submatch span.fancytree-expander{visibility:visible}.fancytree-ext-childcounter span.fancytree-custom-icon,.fancytree-ext-childcounter span.fancytree-icon,.fancytree-ext-filter span.fancytree-custom-icon,.fancytree-ext-filter span.fancytree-icon{position:relative}.fancytree-ext-childcounter span.fancytree-childcounter,.fancytree-ext-filter span.fancytree-childcounter{color:#fff;background:#777;border:1px solid gray;position:absolute;top:-6px;right:-6px;min-width:10px;height:10px;line-height:1;vertical-align:baseline;border-radius:10px;padding:2px;text-align:center;font-size:9px}ul.fancytree-ext-wide{position:relative;min-width:100%;z-index:2;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}ul.fancytree-ext-wide span.fancytree-node>span{position:relative;z-index:2}ul.fancytree-ext-wide span.fancytree-node span.fancytree-title{position:absolute;z-index:1;left:0;min-width:100%;margin-left:0;margin-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.fancytree-ext-fixed-wrapper .fancytree-ext-fixed-hidden{display:none}.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-scroll-border-bottom{border-bottom:3px solid rgba(0,0,0,.75)}.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-scroll-border-right{border-right:3px solid rgba(0,0,0,.75)}.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-tl{position:absolute;overflow:hidden;z-index:3;top:0;left:0}.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-tr{position:absolute;overflow:hidden;z-index:2;top:0}.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-bl{position:absolute;overflow:hidden;z-index:2;left:0}.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-br{position:absolute;overflow:scroll;z-index:1}ul.fancytree-container ul{padding:.3em 0 0 1em;margin:0}.fancytree-checkbox,.fancytree-expander,.fancytree-icon{min-width:10pt;text-align:center}svg.fancytree-checkbox,svg.fancytree-icon{padding-left:3px}span.fancytree-title{border:1px solid transparent;border-radius:0}span.fancytree-focused span.fancytree-title{outline:1px dotted black}span.fancytree-active span.fancytree-title{background-color:#d4d4d4}.fancytree-treefocus span.fancytree-active span.fancytree-title{color:#fff;background-color:#3875d7}table.fancytree-ext-table{border-collapse:collapse}table.fancytree-ext-table tbody tr.fancytree-focused{background-color:#99defd}table.fancytree-ext-table tbody tr.fancytree-active{background-color:#4169e1}table.fancytree-ext-columnview tbody tr td{border:1px solid gray}table.fancytree-ext-columnview span.fancytree-node.fancytree-expanded{background-color:#ccc}table.fancytree-ext-columnview span.fancytree-node.fancytree-active{background-color:#4169e1}
\ No newline at end of file
diff --git a/public/js/viewtree/skin-awesome/vline-rtl.gif b/public/js/viewtree/skin-awesome/vline-rtl.gif
new file mode 100644
index 0000000..0400cb3
Binary files /dev/null and b/public/js/viewtree/skin-awesome/vline-rtl.gif differ
diff --git a/public/js/viewtree/skin-awesome/vline.gif b/public/js/viewtree/skin-awesome/vline.gif
new file mode 100644
index 0000000..1b00ae5
Binary files /dev/null and b/public/js/viewtree/skin-awesome/vline.gif differ
diff --git a/public/js/viewtree/skin-bootstrap-n/ui.fancytree.css b/public/js/viewtree/skin-bootstrap-n/ui.fancytree.css
new file mode 100644
index 0000000..5a44c9c
--- /dev/null
+++ b/public/js/viewtree/skin-bootstrap-n/ui.fancytree.css
@@ -0,0 +1,620 @@
+/*!
+ * Fancytree "bootstrap" skin (highlighting the node span instead of title-only).
+ *
+ * DON'T EDIT THE CSS FILE DIRECTLY, since it is automatically generated from
+ * the LESS templates.
+ */
+/*******************************************************************************
+ * Common Styles for Fancytree Skins.
+ *
+ * This section is automatically generated from the `skin-common.less` template.
+ *
+ * Copyright (c) 2008-2021, Martin Wendt (https://wwWendt.de)
+ * Released under the MIT license
+ * https://github.com/mar10/fancytree/wiki/LicenseInfo
+ *
+ * @version 2.38.2
+ * @date 2022-06-30T18:24:06Z
+******************************************************************************/
+/*------------------------------------------------------------------------------
+ * Helpers
+ *----------------------------------------------------------------------------*/
+.fancytree-helper-hidden {
+ display: none;
+}
+.fancytree-helper-indeterminate-cb {
+ color: #777;
+}
+.fancytree-helper-disabled {
+ color: #c0c0c0;
+}
+/* Helper to allow spinning loader icon with glyph-, ligature-, and SVG-icons. */
+.fancytree-helper-spin {
+ -webkit-animation: spin 1000ms infinite linear;
+ animation: spin 1000ms infinite linear;
+}
+@-webkit-keyframes spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+@keyframes spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+/*------------------------------------------------------------------------------
+ * Container and UL / LI
+ *----------------------------------------------------------------------------*/
+ul.fancytree-container {
+ font-family: tahoma, arial, helvetica;
+ font-size: 10pt;
+ white-space: nowrap;
+ padding: 3px;
+ margin: 0;
+ background-color: white;
+ border: 1px dotted gray;
+ min-height: 0%;
+ position: relative;
+}
+ul.fancytree-container ul {
+ padding: 0 0 0 16px;
+ margin: 0;
+}
+ul.fancytree-container ul > li:before {
+ content: none;
+}
+ul.fancytree-container li {
+ list-style-image: none;
+ list-style-position: outside;
+ list-style-type: none;
+ -moz-background-clip: border;
+ -moz-background-inline-policy: continuous;
+ -moz-background-origin: padding;
+ background-attachment: scroll;
+ background-color: transparent;
+ background-position: 0em 0em;
+ background-repeat: repeat-y;
+ background-image: none;
+ margin: 0;
+}
+ul.fancytree-container li.fancytree-lastsib {
+ background-image: none;
+}
+.ui-fancytree-disabled ul.fancytree-container {
+ opacity: 0.5;
+ background-color: silver;
+}
+ul.fancytree-connectors.fancytree-container li {
+ background-image: url("../skin-bootstrap-n/vline.gif");
+ background-position: 0 0;
+}
+ul.fancytree-container li.fancytree-lastsib,
+ul.fancytree-no-connector > li {
+ background-image: none;
+}
+li.fancytree-animating {
+ position: relative;
+}
+/*------------------------------------------------------------------------------
+ * Common icon definitions
+ *----------------------------------------------------------------------------*/
+span.fancytree-empty,
+span.fancytree-vline,
+span.fancytree-expander,
+span.fancytree-icon,
+span.fancytree-checkbox,
+span.fancytree-drag-helper-img,
+#fancytree-drop-marker {
+ width: 1em;
+ height: 1em;
+ display: inline-block;
+ vertical-align: top;
+ background-repeat: no-repeat;
+ background-position: 0em 0em;
+}
+span.fancytree-icon,
+span.fancytree-checkbox,
+span.fancytree-expander,
+span.fancytree-custom-icon {
+ margin-top: 0px;
+}
+/* Used by icon option: */
+span.fancytree-custom-icon {
+ width: 1em;
+ height: 1em;
+ display: inline-block;
+ margin-left: 0.5em;
+ background-position: 0em 0em;
+}
+/* Used by 'icon' node option: */
+img.fancytree-icon {
+ width: 1em;
+ height: 1em;
+ margin-left: 0.5em;
+ margin-top: 0px;
+ vertical-align: top;
+ border-style: none;
+}
+/*------------------------------------------------------------------------------
+ * Expander icon
+ *
+ * Note: IE6 doesn't correctly evaluate multiples class names,
+ * so we create combined class names that can be used in the CSS.
+ *
+ * Prefix: fancytree-exp-
+ * 1st character: 'e': expanded, 'c': collapsed, 'n': no children
+ * 2nd character (optional): 'd': lazy (Delayed)
+ * 3rd character (optional): 'l': Last sibling
+ *----------------------------------------------------------------------------*/
+span.fancytree-expander {
+ cursor: pointer;
+}
+.fancytree-exp-n span.fancytree-expander,
+.fancytree-exp-nl span.fancytree-expander {
+ background-image: none;
+ cursor: default;
+}
+.fancytree-connectors .fancytree-exp-n span.fancytree-expander,
+.fancytree-connectors .fancytree-exp-nl span.fancytree-expander {
+ margin-top: 0;
+}
+/* Fade out expanders, when container is not hovered or active */
+.fancytree-fade-expander span.fancytree-expander {
+ transition: opacity 1.5s;
+ opacity: 0;
+}
+.fancytree-fade-expander:hover span.fancytree-expander,
+.fancytree-fade-expander.fancytree-treefocus span.fancytree-expander,
+.fancytree-fade-expander .fancytree-treefocus span.fancytree-expander,
+.fancytree-fade-expander [class*="fancytree-statusnode-"] span.fancytree-expander {
+ transition: opacity 0.6s;
+ opacity: 1;
+}
+/*------------------------------------------------------------------------------
+ * Checkbox icon
+ *----------------------------------------------------------------------------*/
+span.fancytree-checkbox {
+ margin-left: 0.5em;
+}
+.fancytree-unselectable span.fancytree-checkbox {
+ opacity: 0.4;
+ filter: alpha(opacity=40);
+}
+.fancytree-container.fancytree-checkbox-auto-hide span.fancytree-checkbox {
+ visibility: hidden;
+}
+.fancytree-container.fancytree-checkbox-auto-hide .fancytree-node:hover span.fancytree-checkbox,
+.fancytree-container.fancytree-checkbox-auto-hide tr:hover td span.fancytree-checkbox,
+.fancytree-container.fancytree-checkbox-auto-hide .fancytree-node.fancytree-selected span.fancytree-checkbox,
+.fancytree-container.fancytree-checkbox-auto-hide tr.fancytree-selected td span.fancytree-checkbox {
+ visibility: unset;
+}
+.fancytree-container.fancytree-checkbox-auto-hide.fancytree-treefocus .fancytree-node.fancytree-active span.fancytree-checkbox,
+.fancytree-container.fancytree-checkbox-auto-hide.fancytree-treefocus tr.fancytree-active td span.fancytree-checkbox {
+ visibility: unset;
+}
+/*------------------------------------------------------------------------------
+ * Node type icon
+ * Note: IE6 doesn't correctly evaluate multiples class names,
+ * so we create combined class names that can be used in the CSS.
+ *
+ * Prefix: fancytree-ico-
+ * 1st character: 'e': expanded, 'c': collapsed
+ * 2nd character (optional): 'f': folder
+ *----------------------------------------------------------------------------*/
+span.fancytree-icon {
+ margin-left: 0.5em;
+}
+/* Documents */
+/* Folders */
+.fancytree-loading span.fancytree-expander,
+.fancytree-loading span.fancytree-expander:hover,
+.fancytree-statusnode-loading span.fancytree-icon,
+.fancytree-statusnode-loading span.fancytree-icon:hover,
+span.fancytree-icon.fancytree-icon-loading {
+ background-image: none;
+}
+/* Status node icons */
+/*------------------------------------------------------------------------------
+ * Node titles and highlighting
+ *----------------------------------------------------------------------------*/
+span.fancytree-node {
+ /* See #117 */
+ display: inherit;
+ width: 100%;
+ margin-top: 1px;
+ min-height: 1em;
+}
+span.fancytree-title {
+ color: black;
+ cursor: pointer;
+ display: inline-block;
+ vertical-align: top;
+ min-height: 1em;
+ padding: 0 3px 0 3px;
+ margin: 0px 0 0 0.5em;
+ border: 1px solid transparent;
+ -webkit-border-radius: 0px;
+ -moz-border-radius: 0px;
+ -ms-border-radius: 0px;
+ -o-border-radius: 0px;
+ border-radius: 0px;
+}
+span.fancytree-node.fancytree-error span.fancytree-title {
+ color: red;
+}
+/*------------------------------------------------------------------------------
+ * Drag'n'drop support
+ *----------------------------------------------------------------------------*/
+/* ext-dnd5: */
+span.fancytree-childcounter {
+ color: #fff;
+ background: #337ab7;
+ border: 1px solid gray;
+ border-radius: 10px;
+ padding: 2px;
+ text-align: center;
+}
+/* ext-dnd: */
+div.fancytree-drag-helper span.fancytree-childcounter,
+div.fancytree-drag-helper span.fancytree-dnd-modifier {
+ display: inline-block;
+ color: #fff;
+ background: #337ab7;
+ border: 1px solid gray;
+ min-width: 10px;
+ height: 10px;
+ line-height: 1;
+ vertical-align: baseline;
+ border-radius: 10px;
+ padding: 2px;
+ text-align: center;
+ font-size: 9px;
+}
+div.fancytree-drag-helper span.fancytree-childcounter {
+ position: absolute;
+ top: -6px;
+ right: -6px;
+}
+div.fancytree-drag-helper span.fancytree-dnd-modifier {
+ background: #5cb85c;
+ border: none;
+ font-weight: bolder;
+}
+/*** Drop marker icon *********************************************************/
+#fancytree-drop-marker {
+ width: 2em;
+ position: absolute;
+ margin: 0;
+}
+#fancytree-drop-marker.fancytree-drop-after,
+#fancytree-drop-marker.fancytree-drop-before {
+ width: 4em;
+}
+/*** Source node while dragging ***********************************************/
+span.fancytree-drag-source.fancytree-drag-remove {
+ opacity: 0.15;
+}
+/*** Target node while dragging cursor is over it *****************************/
+/*------------------------------------------------------------------------------
+ * 'rtl' option
+ *----------------------------------------------------------------------------*/
+.fancytree-container.fancytree-rtl .fancytree-title {
+ /*unicode-bidi: bidi-override;*/
+ /* optional: reverse title letters */
+}
+.fancytree-container.fancytree-rtl .fancytree-exp-n span.fancytree-expander,
+.fancytree-container.fancytree-rtl .fancytree-exp-nl span.fancytree-expander {
+ background-image: none;
+}
+ul.fancytree-container.fancytree-rtl ul {
+ padding: 0 16px 0 0;
+}
+ul.fancytree-container.fancytree-rtl.fancytree-connectors li {
+ background-position: right 0;
+ background-image: url("../skin-bootstrap-n/vline-rtl.gif");
+}
+ul.fancytree-container.fancytree-rtl li.fancytree-lastsib,
+ul.fancytree-container.fancytree-rtl.fancytree-no-connector > li {
+ background-image: none;
+}
+/*------------------------------------------------------------------------------
+ * 'table' extension
+ *----------------------------------------------------------------------------*/
+table.fancytree-ext-table {
+ font-family: tahoma, arial, helvetica;
+ font-size: 10pt;
+ border-collapse: collapse;
+ /* ext-ariagrid */
+}
+table.fancytree-ext-table span.fancytree-node {
+ display: inline-block;
+ box-sizing: border-box;
+}
+table.fancytree-ext-table td.fancytree-status-merged {
+ text-align: center;
+ font-style: italic;
+ color: #c0c0c0;
+}
+table.fancytree-ext-table tr.fancytree-statusnode-error td.fancytree-status-merged {
+ color: red;
+}
+table.fancytree-ext-table.fancytree-ext-ariagrid.fancytree-cell-mode > tbody > tr.fancytree-active > td {
+ background-color: #eee;
+}
+table.fancytree-ext-table.fancytree-ext-ariagrid.fancytree-cell-mode > tbody > tr > td.fancytree-active-cell {
+ background-color: #cbe8f6;
+}
+table.fancytree-ext-table.fancytree-ext-ariagrid.fancytree-cell-mode.fancytree-cell-nav-mode > tbody > tr > td.fancytree-active-cell {
+ background-color: #3875d7;
+}
+/*------------------------------------------------------------------------------
+ * 'columnview' extension
+ *----------------------------------------------------------------------------*/
+table.fancytree-ext-columnview tbody tr td {
+ position: relative;
+ border: 1px solid gray;
+ vertical-align: top;
+ overflow: auto;
+}
+table.fancytree-ext-columnview tbody tr td > ul {
+ padding: 0;
+}
+table.fancytree-ext-columnview tbody tr td > ul li {
+ list-style-image: none;
+ list-style-position: outside;
+ list-style-type: none;
+ -moz-background-clip: border;
+ -moz-background-inline-policy: continuous;
+ -moz-background-origin: padding;
+ background-attachment: scroll;
+ background-color: transparent;
+ background-position: 0em 0em;
+ background-repeat: repeat-y;
+ background-image: none;
+ /* no v-lines */
+ margin: 0;
+}
+table.fancytree-ext-columnview span.fancytree-node {
+ position: relative;
+ /* allow positioning of embedded spans */
+ display: inline-block;
+}
+table.fancytree-ext-columnview span.fancytree-node.fancytree-expanded {
+ background-color: #e0e0e0;
+}
+table.fancytree-ext-columnview span.fancytree-node.fancytree-active {
+ background-color: #cbe8f6;
+}
+table.fancytree-ext-columnview .fancytree-has-children span.fancytree-cv-right {
+ position: absolute;
+ right: 3px;
+}
+/*------------------------------------------------------------------------------
+ * 'filter' extension
+ *----------------------------------------------------------------------------*/
+.fancytree-ext-filter-dimm span.fancytree-node span.fancytree-title {
+ color: #c0c0c0;
+ font-weight: lighter;
+}
+.fancytree-ext-filter-dimm tr.fancytree-submatch span.fancytree-title,
+.fancytree-ext-filter-dimm span.fancytree-node.fancytree-submatch span.fancytree-title {
+ color: black;
+ font-weight: normal;
+}
+.fancytree-ext-filter-dimm tr.fancytree-match span.fancytree-title,
+.fancytree-ext-filter-dimm span.fancytree-node.fancytree-match span.fancytree-title {
+ color: black;
+ font-weight: bold;
+}
+.fancytree-ext-filter-hide tr.fancytree-hide,
+.fancytree-ext-filter-hide span.fancytree-node.fancytree-hide {
+ display: none;
+}
+.fancytree-ext-filter-hide tr.fancytree-submatch span.fancytree-title,
+.fancytree-ext-filter-hide span.fancytree-node.fancytree-submatch span.fancytree-title {
+ color: #c0c0c0;
+ font-weight: lighter;
+}
+.fancytree-ext-filter-hide tr.fancytree-match span.fancytree-title,
+.fancytree-ext-filter-hide span.fancytree-node.fancytree-match span.fancytree-title {
+ color: black;
+ font-weight: normal;
+}
+/* Hide expanders if all child nodes are hidden by filter */
+.fancytree-ext-filter-hide-expanders tr.fancytree-match span.fancytree-expander,
+.fancytree-ext-filter-hide-expanders span.fancytree-node.fancytree-match span.fancytree-expander {
+ visibility: hidden;
+}
+.fancytree-ext-filter-hide-expanders tr.fancytree-submatch span.fancytree-expander,
+.fancytree-ext-filter-hide-expanders span.fancytree-node.fancytree-submatch span.fancytree-expander {
+ visibility: visible;
+}
+.fancytree-ext-childcounter span.fancytree-icon,
+.fancytree-ext-filter span.fancytree-icon,
+.fancytree-ext-childcounter span.fancytree-custom-icon,
+.fancytree-ext-filter span.fancytree-custom-icon {
+ position: relative;
+}
+.fancytree-ext-childcounter span.fancytree-childcounter,
+.fancytree-ext-filter span.fancytree-childcounter {
+ color: #fff;
+ background: #777;
+ border: 1px solid gray;
+ position: absolute;
+ top: -6px;
+ right: -6px;
+ min-width: 10px;
+ height: 10px;
+ line-height: 1;
+ vertical-align: baseline;
+ border-radius: 10px;
+ padding: 2px;
+ text-align: center;
+ font-size: 9px;
+}
+/*------------------------------------------------------------------------------
+ * 'wide' extension
+ *----------------------------------------------------------------------------*/
+ul.fancytree-ext-wide {
+ position: relative;
+ min-width: 100%;
+ z-index: 2;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+ul.fancytree-ext-wide span.fancytree-node > span {
+ position: relative;
+ z-index: 2;
+}
+ul.fancytree-ext-wide span.fancytree-node span.fancytree-title {
+ position: absolute;
+ z-index: 1;
+ left: 0px;
+ min-width: 100%;
+ margin-left: 0;
+ margin-right: 0;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+/*------------------------------------------------------------------------------
+ * 'fixed' extension
+ *----------------------------------------------------------------------------*/
+.fancytree-ext-fixed-wrapper .fancytree-ext-fixed-hidden {
+ display: none;
+}
+.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-scroll-border-bottom {
+ border-bottom: 3px solid rgba(0, 0, 0, 0.75);
+}
+.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-scroll-border-right {
+ border-right: 3px solid rgba(0, 0, 0, 0.75);
+}
+.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-tl {
+ position: absolute;
+ overflow: hidden;
+ z-index: 3;
+ top: 0px;
+ left: 0px;
+}
+.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-tr {
+ position: absolute;
+ overflow: hidden;
+ z-index: 2;
+ top: 0px;
+}
+.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-bl {
+ position: absolute;
+ overflow: hidden;
+ z-index: 2;
+ left: 0px;
+}
+.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-br {
+ position: absolute;
+ overflow: scroll;
+ z-index: 1;
+}
+/*******************************************************************************
+ * Styles specific to this skin.
+ *
+ * This section is automatically generated from the `ui-fancytree.less` template.
+ ******************************************************************************/
+ul.fancytree-container ul {
+ padding: 0 0 0 1.5em;
+ margin: 0;
+}
+/* Prevent focus frame */
+.fancytree-container:focus {
+ outline: none;
+}
+.fancytree-container span.fancytree-statusnode-error span.fancytree-expander {
+ color: red;
+}
+span.fancytree-node {
+ border: 1px solid transparent;
+ border-radius: 3px;
+ padding-left: 8px;
+}
+span.fancytree-title {
+ border-radius: 3px;
+}
+span.fancytree-node.fancytree-selected {
+ background-color: #80c780;
+ border-color: #80c780;
+}
+span.fancytree-node.fancytree-selected span.fancytree-title {
+ background-color: #80c780;
+}
+span.fancytree-node.fancytree-active {
+ background-color: #6aa3d5;
+}
+.fancytree-container.fancytree-treefocus span.fancytree-node:hover {
+ background-color: #e9f2f9;
+}
+.fancytree-container.fancytree-treefocus span.fancytree-node.fancytree-focused {
+ border-color: #428bca;
+}
+.fancytree-container.fancytree-treefocus span.fancytree-node.fancytree-selected {
+ background-color: #5cb85c;
+}
+.fancytree-container.fancytree-treefocus span.fancytree-node.fancytree-selected span.fancytree-title {
+ background-color: #5cb85c;
+}
+.fancytree-container.fancytree-treefocus span.fancytree-node.fancytree-active {
+ background-color: #428bca;
+ border-color: #428bca;
+}
+/*******************************************************************************
+ * 'table' extension
+ */
+table.fancytree-ext-table tbody tr td {
+ border: 1px solid #eeeeee;
+}
+table.fancytree-ext-table tbody tr.fancytree-selected {
+ background-color: #80c780;
+}
+table.fancytree-ext-table tbody tr.fancytree-selected span.fancytree-node {
+ background-color: #80c780;
+}
+table.fancytree-ext-table tbody tr.fancytree-selected span.fancytree-title {
+ background-color: #80c780;
+}
+table.fancytree-ext-table tbody tr.fancytree-active {
+ background-color: #6aa3d5;
+}
+table.fancytree-ext-table tbody tr.fancytree-active span.fancytree-node {
+ background-color: #6aa3d5;
+}
+table.fancytree-ext-table.fancytree-treefocus tbody tr:hover {
+ background-color: #e9f2f9;
+}
+table.fancytree-ext-table.fancytree-treefocus tbody tr.fancytree-focused span.fancytree-title {
+ outline: 1px dotted #428bca;
+}
+table.fancytree-ext-table.fancytree-treefocus tbody tr.fancytree-selected {
+ background-color: #5cb85c;
+}
+table.fancytree-ext-table.fancytree-treefocus tbody tr.fancytree-selected span.fancytree-node {
+ background-color: #5cb85c;
+}
+table.fancytree-ext-table.fancytree-treefocus tbody tr.fancytree-selected span.fancytree-title {
+ background-color: #5cb85c;
+}
+table.fancytree-ext-table.fancytree-treefocus tbody tr.fancytree-active {
+ background-color: #428bca;
+}
+table.fancytree-ext-table.fancytree-treefocus tbody tr.fancytree-active span.fancytree-node {
+ background-color: #428bca;
+}
diff --git a/public/js/viewtree/skin-bootstrap-n/ui.fancytree.less b/public/js/viewtree/skin-bootstrap-n/ui.fancytree.less
new file mode 100644
index 0000000..bd1bc23
--- /dev/null
+++ b/public/js/viewtree/skin-bootstrap-n/ui.fancytree.less
@@ -0,0 +1,181 @@
+/*!
+ * Fancytree "bootstrap" skin (highlighting the node span instead of title-only).
+ *
+ * DON'T EDIT THE CSS FILE DIRECTLY, since it is automatically generated from
+ * the LESS templates.
+ */
+
+// Import common styles
+@import "../skin-common.less";
+
+
+/*******************************************************************************
+ * Styles specific to this skin.
+ *
+ * This section is automatically generated from the `ui-fancytree.less` template.
+ ******************************************************************************/
+
+
+// local vars
+// @fancy-my-icon-size: 16px;
+
+// Override the variable after the import.
+// NOTE: Variables are always resolved as the last definition, even if it is
+// after where it is used.
+@fancy-use-sprites: false; // false: suppress all background images (i.e. icons)
+@fancy-loading-url: none;
+
+@fancy-icon-width: 1em;
+@fancy-icon-height: 1em;
+@fancy-line-height: 1em;
+@fancy-icon-spacing: 0.5em;
+
+// Use 'data-uri(...)' to embed the image into CSS instead of linking to 'loading.gif':
+// @fancy-loading-url: data-uri("@{fancy-image-prefix}loading.gif");
+// Set to `true` to use `data-uri(...)` which will embed icons.gif into CSS
+// instead of linking to that file:
+// @fancy-inline-sprites: true;
+
+// We need to define this variable here (not in skin-common.less) to make it
+// work with grunt and webpack:
+@fancy-image-prefix: "./skin-bootstrap-n/";
+
+ul.fancytree-container ul {
+ padding: 0 0 0 1.5em;
+ margin: 0;
+}
+/* Prevent focus frame */
+.fancytree-container:focus {
+ outline: none;
+}
+
+// Error status node
+.fancytree-container span.fancytree-statusnode-error span.fancytree-expander {
+ color: @fancy-font-error-color;
+}
+
+/////
+// Original bootstrap colors (http://getbootstrap.com/css/#responsive-utilities)
+@gray-darker: lighten(#000, 13.5%); // #222
+@gray-dark: lighten(#000, 20%); // #333
+@gray: lighten(#000, 33.5%); // #555
+@gray-light: lighten(#000, 60%); // #999
+@gray-lighter: lighten(#000, 93.5%); // #eee
+
+@brand-primary: #428bca; // blue
+@brand-success: #5cb85c; // green
+@brand-info: #5bc0de; // light blue
+@brand-warning: #f0ad4e; // orange
+@brand-danger: #d9534f; // red
+
+@border-radius-base: 4px;
+@border-radius-large: 6px;
+@border-radius-small: 3px;
+/////////////
+
+span.fancytree-node {
+ border: @fancy-node-border-width solid transparent; // avoid jumping, when a border is added on hover
+ border-radius: @border-radius-small;
+ padding-left: 8px;
+}
+span.fancytree-title {
+ border-radius: @border-radius-small;
+}
+// Inactive tree:
+span.fancytree-node.fancytree-selected { // selected nodes inside inactive tree
+ background-color: lighten(@brand-success, 10%);
+ border-color: lighten(@brand-success, 10%);
+ span.fancytree-title {
+ background-color: lighten(@brand-success, 10%); // green title, even when active
+ }
+}
+span.fancytree-node.fancytree-active { // active nodes inside inactive tree
+ background-color: lighten(@brand-primary, 10%);
+}
+// Active tree:
+.fancytree-container.fancytree-treefocus {
+ span.fancytree-node:hover {
+ background-color: lighten(@brand-primary, 42%);
+ }
+ span.fancytree-node.fancytree-focused {
+ border-color: @brand-primary;
+ }
+ span.fancytree-node.fancytree-selected {
+ background-color: @brand-success;
+ span.fancytree-title {
+ background-color: @brand-success; // green title, even when active
+ }
+ }
+ span.fancytree-node.fancytree-active {
+ background-color: @brand-primary;
+ border-color: @brand-primary;
+ }
+}
+
+/*******************************************************************************
+ * 'table' extension
+ */
+table.fancytree-ext-table tbody {
+ tr td {
+ border: 1px solid @gray-lighter;
+ }
+ // span.fancytree-node,
+ // span.fancytree-node:hover { // undo standard tree css
+ // border: none;
+ // background: none;
+ // }
+ // // Title get's a white background, when hovered. Undo standard node formatting
+ // span.fancytree-title:hover {
+ // border: none;
+ // background: inherit;
+ // background: transparent;
+ // background: none;
+ // filter: none;
+ // }
+ // dimmed, if inside inactive tree
+ tr.fancytree-selected {
+ background-color: lighten(@brand-success, 10%);
+ span.fancytree-node {
+ background-color: lighten(@brand-success, 10%);
+ }
+ span.fancytree-title {
+ background-color: lighten(@brand-success, 10%); // green title, even when active
+ }
+ }
+ tr.fancytree-active { // dimmed, if inside inactive tree
+ background-color: lighten(@brand-primary, 10%);
+ span.fancytree-node {
+ background-color: lighten(@brand-primary, 10%);
+ }
+ }
+}
+
+table.fancytree-ext-table.fancytree-treefocus tbody {
+ tr:hover {
+ background-color: lighten(@brand-primary, 42%);
+ // outline: 1px solid @brand-primary;
+ }
+ tr.fancytree-focused span.fancytree-title {
+ outline: 1px dotted @brand-primary;
+ }
+ tr.fancytree-active:hover,
+ tr.fancytree-selected:hover {
+ // background-color: #CBE8F6;
+ // outline: 1px solid #26A0DA;
+ }
+ tr.fancytree-selected {
+ background-color: @brand-success;
+ span.fancytree-node {
+ background-color: @brand-success;
+ }
+ span.fancytree-title {
+ background-color: @brand-success; // green title, even when active
+ }
+ }
+ tr.fancytree-active {
+ background-color: @brand-primary;
+ span.fancytree-node {
+ background-color: @brand-primary;
+ }
+ }
+}
diff --git a/public/js/viewtree/skin-bootstrap-n/ui.fancytree.min.css b/public/js/viewtree/skin-bootstrap-n/ui.fancytree.min.css
new file mode 100644
index 0000000..ebfd3b1
--- /dev/null
+++ b/public/js/viewtree/skin-bootstrap-n/ui.fancytree.min.css
@@ -0,0 +1,6 @@
+/*!
+ * Fancytree "bootstrap" skin (highlighting the node span instead of title-only).
+ *
+ * DON'T EDIT THE CSS FILE DIRECTLY, since it is automatically generated from
+ * the LESS templates.
+ */.fancytree-helper-hidden{display:none}.fancytree-helper-indeterminate-cb{color:#777}.fancytree-helper-disabled{color:silver}.fancytree-helper-spin{-webkit-animation:spin 1s infinite linear;animation:spin 1s infinite linear}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}ul.fancytree-container{font-family:tahoma,arial,helvetica;font-size:10pt;white-space:nowrap;padding:3px;margin:0;background-color:#fff;border:1px dotted gray;min-height:0;position:relative}ul.fancytree-container ul{padding:0 0 0 16px;margin:0}ul.fancytree-container ul>li:before{content:none}ul.fancytree-container li{list-style-image:none;list-style-position:outside;list-style-type:none;-moz-background-clip:border;-moz-background-inline-policy:continuous;-moz-background-origin:padding;background-attachment:scroll;background-color:transparent;background-position:0 0;background-repeat:repeat-y;background-image:none;margin:0}ul.fancytree-container li.fancytree-lastsib{background-image:none}.ui-fancytree-disabled ul.fancytree-container{opacity:.5;background-color:silver}ul.fancytree-connectors.fancytree-container li{background-image:url("../skin-bootstrap-n/vline.gif");background-position:0 0}ul.fancytree-container li.fancytree-lastsib,ul.fancytree-no-connector>li{background-image:none}li.fancytree-animating{position:relative}#fancytree-drop-marker,span.fancytree-checkbox,span.fancytree-drag-helper-img,span.fancytree-empty,span.fancytree-expander,span.fancytree-icon,span.fancytree-vline{width:1em;height:1em;display:inline-block;vertical-align:top;background-repeat:no-repeat;background-position:0 0}span.fancytree-checkbox,span.fancytree-custom-icon,span.fancytree-expander,span.fancytree-icon{margin-top:0}span.fancytree-custom-icon{width:1em;height:1em;display:inline-block;margin-left:.5em;background-position:0 0}img.fancytree-icon{width:1em;height:1em;margin-left:.5em;margin-top:0;vertical-align:top;border-style:none}span.fancytree-expander{cursor:pointer}.fancytree-exp-n span.fancytree-expander,.fancytree-exp-nl span.fancytree-expander{background-image:none;cursor:default}.fancytree-connectors .fancytree-exp-n span.fancytree-expander,.fancytree-connectors .fancytree-exp-nl span.fancytree-expander{margin-top:0}.fancytree-fade-expander span.fancytree-expander{transition:opacity 1.5s;opacity:0}.fancytree-fade-expander .fancytree-treefocus span.fancytree-expander,.fancytree-fade-expander [class*=fancytree-statusnode-] span.fancytree-expander,.fancytree-fade-expander.fancytree-treefocus span.fancytree-expander,.fancytree-fade-expander:hover span.fancytree-expander{transition:opacity .6s;opacity:1}span.fancytree-checkbox{margin-left:.5em}.fancytree-unselectable span.fancytree-checkbox{opacity:.4}.fancytree-container.fancytree-checkbox-auto-hide span.fancytree-checkbox{visibility:hidden}.fancytree-container.fancytree-checkbox-auto-hide .fancytree-node.fancytree-selected span.fancytree-checkbox,.fancytree-container.fancytree-checkbox-auto-hide .fancytree-node:hover span.fancytree-checkbox,.fancytree-container.fancytree-checkbox-auto-hide tr.fancytree-selected td span.fancytree-checkbox,.fancytree-container.fancytree-checkbox-auto-hide tr:hover td span.fancytree-checkbox{visibility:unset}.fancytree-container.fancytree-checkbox-auto-hide.fancytree-treefocus .fancytree-node.fancytree-active span.fancytree-checkbox,.fancytree-container.fancytree-checkbox-auto-hide.fancytree-treefocus tr.fancytree-active td span.fancytree-checkbox{visibility:unset}span.fancytree-icon{margin-left:.5em}.fancytree-loading span.fancytree-expander,.fancytree-loading span.fancytree-expander:hover,.fancytree-statusnode-loading span.fancytree-icon,.fancytree-statusnode-loading span.fancytree-icon:hover,span.fancytree-icon.fancytree-icon-loading{background-image:none}span.fancytree-node{display:inherit;width:100%;margin-top:1px;min-height:1em}span.fancytree-title{color:#000;cursor:pointer;display:inline-block;vertical-align:top;min-height:1em;padding:0 3px 0 3px;margin:0 0 0 .5em;border:1px solid transparent;-webkit-border-radius:0px;-moz-border-radius:0;-ms-border-radius:0px;-o-border-radius:0;border-radius:0}span.fancytree-node.fancytree-error span.fancytree-title{color:red}span.fancytree-childcounter{color:#fff;background:#337ab7;border:1px solid gray;border-radius:10px;padding:2px;text-align:center}div.fancytree-drag-helper span.fancytree-childcounter,div.fancytree-drag-helper span.fancytree-dnd-modifier{display:inline-block;color:#fff;background:#337ab7;border:1px solid gray;min-width:10px;height:10px;line-height:1;vertical-align:baseline;border-radius:10px;padding:2px;text-align:center;font-size:9px}div.fancytree-drag-helper span.fancytree-childcounter{position:absolute;top:-6px;right:-6px}div.fancytree-drag-helper span.fancytree-dnd-modifier{background:#5cb85c;border:none;font-weight:bolder}#fancytree-drop-marker{width:2em;position:absolute;margin:0}#fancytree-drop-marker.fancytree-drop-after,#fancytree-drop-marker.fancytree-drop-before{width:4em}span.fancytree-drag-source.fancytree-drag-remove{opacity:.15}.fancytree-container.fancytree-rtl .fancytree-exp-n span.fancytree-expander,.fancytree-container.fancytree-rtl .fancytree-exp-nl span.fancytree-expander{background-image:none}ul.fancytree-container.fancytree-rtl ul{padding:0 16px 0 0}ul.fancytree-container.fancytree-rtl.fancytree-connectors li{background-position:right 0;background-image:url("../skin-bootstrap-n/vline-rtl.gif")}ul.fancytree-container.fancytree-rtl li.fancytree-lastsib,ul.fancytree-container.fancytree-rtl.fancytree-no-connector>li{background-image:none}table.fancytree-ext-table{font-family:tahoma,arial,helvetica;font-size:10pt;border-collapse:collapse}table.fancytree-ext-table span.fancytree-node{display:inline-block;box-sizing:border-box}table.fancytree-ext-table td.fancytree-status-merged{text-align:center;font-style:italic;color:silver}table.fancytree-ext-table tr.fancytree-statusnode-error td.fancytree-status-merged{color:red}table.fancytree-ext-table.fancytree-ext-ariagrid.fancytree-cell-mode>tbody>tr.fancytree-active>td{background-color:#eee}table.fancytree-ext-table.fancytree-ext-ariagrid.fancytree-cell-mode>tbody>tr>td.fancytree-active-cell{background-color:#cbe8f6}table.fancytree-ext-table.fancytree-ext-ariagrid.fancytree-cell-mode.fancytree-cell-nav-mode>tbody>tr>td.fancytree-active-cell{background-color:#3875d7}table.fancytree-ext-columnview tbody tr td{position:relative;border:1px solid gray;vertical-align:top;overflow:auto}table.fancytree-ext-columnview tbody tr td>ul{padding:0}table.fancytree-ext-columnview tbody tr td>ul li{list-style-image:none;list-style-position:outside;list-style-type:none;-moz-background-clip:border;-moz-background-inline-policy:continuous;-moz-background-origin:padding;background-attachment:scroll;background-color:transparent;background-position:0 0;background-repeat:repeat-y;background-image:none;margin:0}table.fancytree-ext-columnview span.fancytree-node{position:relative;display:inline-block}table.fancytree-ext-columnview span.fancytree-node.fancytree-expanded{background-color:#e0e0e0}table.fancytree-ext-columnview span.fancytree-node.fancytree-active{background-color:#cbe8f6}table.fancytree-ext-columnview .fancytree-has-children span.fancytree-cv-right{position:absolute;right:3px}.fancytree-ext-filter-dimm span.fancytree-node span.fancytree-title{color:silver;font-weight:lighter}.fancytree-ext-filter-dimm span.fancytree-node.fancytree-submatch span.fancytree-title,.fancytree-ext-filter-dimm tr.fancytree-submatch span.fancytree-title{color:#000;font-weight:400}.fancytree-ext-filter-dimm span.fancytree-node.fancytree-match span.fancytree-title,.fancytree-ext-filter-dimm tr.fancytree-match span.fancytree-title{color:#000;font-weight:700}.fancytree-ext-filter-hide span.fancytree-node.fancytree-hide,.fancytree-ext-filter-hide tr.fancytree-hide{display:none}.fancytree-ext-filter-hide span.fancytree-node.fancytree-submatch span.fancytree-title,.fancytree-ext-filter-hide tr.fancytree-submatch span.fancytree-title{color:silver;font-weight:lighter}.fancytree-ext-filter-hide span.fancytree-node.fancytree-match span.fancytree-title,.fancytree-ext-filter-hide tr.fancytree-match span.fancytree-title{color:#000;font-weight:400}.fancytree-ext-filter-hide-expanders span.fancytree-node.fancytree-match span.fancytree-expander,.fancytree-ext-filter-hide-expanders tr.fancytree-match span.fancytree-expander{visibility:hidden}.fancytree-ext-filter-hide-expanders span.fancytree-node.fancytree-submatch span.fancytree-expander,.fancytree-ext-filter-hide-expanders tr.fancytree-submatch span.fancytree-expander{visibility:visible}.fancytree-ext-childcounter span.fancytree-custom-icon,.fancytree-ext-childcounter span.fancytree-icon,.fancytree-ext-filter span.fancytree-custom-icon,.fancytree-ext-filter span.fancytree-icon{position:relative}.fancytree-ext-childcounter span.fancytree-childcounter,.fancytree-ext-filter span.fancytree-childcounter{color:#fff;background:#777;border:1px solid gray;position:absolute;top:-6px;right:-6px;min-width:10px;height:10px;line-height:1;vertical-align:baseline;border-radius:10px;padding:2px;text-align:center;font-size:9px}ul.fancytree-ext-wide{position:relative;min-width:100%;z-index:2;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}ul.fancytree-ext-wide span.fancytree-node>span{position:relative;z-index:2}ul.fancytree-ext-wide span.fancytree-node span.fancytree-title{position:absolute;z-index:1;left:0;min-width:100%;margin-left:0;margin-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.fancytree-ext-fixed-wrapper .fancytree-ext-fixed-hidden{display:none}.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-scroll-border-bottom{border-bottom:3px solid rgba(0,0,0,.75)}.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-scroll-border-right{border-right:3px solid rgba(0,0,0,.75)}.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-tl{position:absolute;overflow:hidden;z-index:3;top:0;left:0}.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-tr{position:absolute;overflow:hidden;z-index:2;top:0}.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-bl{position:absolute;overflow:hidden;z-index:2;left:0}.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-br{position:absolute;overflow:scroll;z-index:1}ul.fancytree-container ul{padding:0 0 0 1.5em;margin:0}.fancytree-container:focus{outline:0}.fancytree-container span.fancytree-statusnode-error span.fancytree-expander{color:red}span.fancytree-node{border:1px solid transparent;border-radius:3px;padding-left:8px}span.fancytree-title{border-radius:3px}span.fancytree-node.fancytree-selected{background-color:#80c780;border-color:#80c780}span.fancytree-node.fancytree-selected span.fancytree-title{background-color:#80c780}span.fancytree-node.fancytree-active{background-color:#6aa3d5}.fancytree-container.fancytree-treefocus span.fancytree-node:hover{background-color:#e9f2f9}.fancytree-container.fancytree-treefocus span.fancytree-node.fancytree-focused{border-color:#428bca}.fancytree-container.fancytree-treefocus span.fancytree-node.fancytree-selected{background-color:#5cb85c}.fancytree-container.fancytree-treefocus span.fancytree-node.fancytree-selected span.fancytree-title{background-color:#5cb85c}.fancytree-container.fancytree-treefocus span.fancytree-node.fancytree-active{background-color:#428bca;border-color:#428bca}table.fancytree-ext-table tbody tr td{border:1px solid #eee}table.fancytree-ext-table tbody tr.fancytree-selected{background-color:#80c780}table.fancytree-ext-table tbody tr.fancytree-selected span.fancytree-node{background-color:#80c780}table.fancytree-ext-table tbody tr.fancytree-selected span.fancytree-title{background-color:#80c780}table.fancytree-ext-table tbody tr.fancytree-active{background-color:#6aa3d5}table.fancytree-ext-table tbody tr.fancytree-active span.fancytree-node{background-color:#6aa3d5}table.fancytree-ext-table.fancytree-treefocus tbody tr:hover{background-color:#e9f2f9}table.fancytree-ext-table.fancytree-treefocus tbody tr.fancytree-focused span.fancytree-title{outline:1px dotted #428bca}table.fancytree-ext-table.fancytree-treefocus tbody tr.fancytree-selected{background-color:#5cb85c}table.fancytree-ext-table.fancytree-treefocus tbody tr.fancytree-selected span.fancytree-node{background-color:#5cb85c}table.fancytree-ext-table.fancytree-treefocus tbody tr.fancytree-selected span.fancytree-title{background-color:#5cb85c}table.fancytree-ext-table.fancytree-treefocus tbody tr.fancytree-active{background-color:#428bca}table.fancytree-ext-table.fancytree-treefocus tbody tr.fancytree-active span.fancytree-node{background-color:#428bca}
\ No newline at end of file
diff --git a/public/js/viewtree/skin-bootstrap-n/vline-rtl.gif b/public/js/viewtree/skin-bootstrap-n/vline-rtl.gif
new file mode 100644
index 0000000..0400cb3
Binary files /dev/null and b/public/js/viewtree/skin-bootstrap-n/vline-rtl.gif differ
diff --git a/public/js/viewtree/skin-bootstrap-n/vline.gif b/public/js/viewtree/skin-bootstrap-n/vline.gif
new file mode 100644
index 0000000..1b00ae5
Binary files /dev/null and b/public/js/viewtree/skin-bootstrap-n/vline.gif differ
diff --git a/public/js/viewtree/skin-bootstrap/ui.fancytree.css b/public/js/viewtree/skin-bootstrap/ui.fancytree.css
new file mode 100644
index 0000000..9d23832
--- /dev/null
+++ b/public/js/viewtree/skin-bootstrap/ui.fancytree.css
@@ -0,0 +1,680 @@
+/*!
+ * Fancytree "bootstrap" skin.
+ *
+ * DON'T EDIT THE CSS FILE DIRECTLY, since it is automatically generated from
+ * the LESS templates.
+ */
+/*******************************************************************************
+ * Common Styles for Fancytree Skins.
+ *
+ * This section is automatically generated from the `skin-common.less` template.
+ *
+ * Copyright (c) 2008-2021, Martin Wendt (https://wwWendt.de)
+ * Released under the MIT license
+ * https://github.com/mar10/fancytree/wiki/LicenseInfo
+ *
+ * @version 2.38.2
+ * @date 2022-06-30T18:24:06Z
+******************************************************************************/
+/*------------------------------------------------------------------------------
+ * Helpers
+ *----------------------------------------------------------------------------*/
+.fancytree-helper-hidden {
+ display: none;
+}
+.fancytree-helper-indeterminate-cb {
+ color: #777;
+}
+.fancytree-helper-disabled {
+ color: #333333;
+}
+/* Helper to allow spinning loader icon with glyph-, ligature-, and SVG-icons. */
+.fancytree-helper-spin {
+ -webkit-animation: spin 1000ms infinite linear;
+ animation: spin 1000ms infinite linear;
+}
+@-webkit-keyframes spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+@keyframes spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+/*------------------------------------------------------------------------------
+ * Container and UL / LI
+ *----------------------------------------------------------------------------*/
+ul.fancytree-container {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 14px;
+ white-space: nowrap;
+ padding: 3px;
+ margin: 0;
+ background-color: white;
+ border: 1px dotted gray;
+ min-height: 0%;
+ position: relative;
+}
+ul.fancytree-container ul {
+ padding: 0 0 0 16px;
+ margin: 0;
+}
+ul.fancytree-container ul > li:before {
+ content: none;
+}
+ul.fancytree-container li {
+ list-style-image: none;
+ list-style-position: outside;
+ list-style-type: none;
+ -moz-background-clip: border;
+ -moz-background-inline-policy: continuous;
+ -moz-background-origin: padding;
+ background-attachment: scroll;
+ background-color: transparent;
+ background-position: 0em 0em;
+ background-repeat: repeat-y;
+ background-image: none;
+ margin: 0;
+}
+ul.fancytree-container li.fancytree-lastsib {
+ background-image: none;
+}
+.ui-fancytree-disabled ul.fancytree-container {
+ opacity: 0.5;
+ background-color: silver;
+}
+ul.fancytree-connectors.fancytree-container li {
+ background-image: url("../skin-bootstrap/vline.gif");
+ background-position: 0 0;
+}
+ul.fancytree-container li.fancytree-lastsib,
+ul.fancytree-no-connector > li {
+ background-image: none;
+}
+li.fancytree-animating {
+ position: relative;
+}
+/*------------------------------------------------------------------------------
+ * Common icon definitions
+ *----------------------------------------------------------------------------*/
+span.fancytree-empty,
+span.fancytree-vline,
+span.fancytree-expander,
+span.fancytree-icon,
+span.fancytree-checkbox,
+span.fancytree-drag-helper-img,
+#fancytree-drop-marker {
+ width: 1em;
+ height: 1em;
+ display: inline-block;
+ vertical-align: top;
+ background-repeat: no-repeat;
+ background-position: 0em 0em;
+}
+span.fancytree-icon,
+span.fancytree-checkbox,
+span.fancytree-expander,
+span.fancytree-custom-icon {
+ margin-top: 2px;
+}
+/* Used by icon option: */
+span.fancytree-custom-icon {
+ width: 1em;
+ height: 1em;
+ display: inline-block;
+ margin-left: 0.5em;
+ background-position: 0em 0em;
+}
+/* Used by 'icon' node option: */
+img.fancytree-icon {
+ width: 1em;
+ height: 1em;
+ margin-left: 0.5em;
+ margin-top: 2px;
+ vertical-align: top;
+ border-style: none;
+}
+/*------------------------------------------------------------------------------
+ * Expander icon
+ *
+ * Note: IE6 doesn't correctly evaluate multiples class names,
+ * so we create combined class names that can be used in the CSS.
+ *
+ * Prefix: fancytree-exp-
+ * 1st character: 'e': expanded, 'c': collapsed, 'n': no children
+ * 2nd character (optional): 'd': lazy (Delayed)
+ * 3rd character (optional): 'l': Last sibling
+ *----------------------------------------------------------------------------*/
+span.fancytree-expander {
+ cursor: pointer;
+}
+.fancytree-exp-n span.fancytree-expander,
+.fancytree-exp-nl span.fancytree-expander {
+ background-image: none;
+ cursor: default;
+}
+.fancytree-connectors .fancytree-exp-n span.fancytree-expander,
+.fancytree-connectors .fancytree-exp-nl span.fancytree-expander {
+ margin-top: 0;
+}
+/* Fade out expanders, when container is not hovered or active */
+.fancytree-fade-expander span.fancytree-expander {
+ transition: opacity 1.5s;
+ opacity: 0;
+}
+.fancytree-fade-expander:hover span.fancytree-expander,
+.fancytree-fade-expander.fancytree-treefocus span.fancytree-expander,
+.fancytree-fade-expander .fancytree-treefocus span.fancytree-expander,
+.fancytree-fade-expander [class*="fancytree-statusnode-"] span.fancytree-expander {
+ transition: opacity 0.6s;
+ opacity: 1;
+}
+/*------------------------------------------------------------------------------
+ * Checkbox icon
+ *----------------------------------------------------------------------------*/
+span.fancytree-checkbox {
+ margin-left: 0.5em;
+}
+.fancytree-unselectable span.fancytree-checkbox {
+ opacity: 0.4;
+ filter: alpha(opacity=40);
+}
+.fancytree-container.fancytree-checkbox-auto-hide span.fancytree-checkbox {
+ visibility: hidden;
+}
+.fancytree-container.fancytree-checkbox-auto-hide .fancytree-node:hover span.fancytree-checkbox,
+.fancytree-container.fancytree-checkbox-auto-hide tr:hover td span.fancytree-checkbox,
+.fancytree-container.fancytree-checkbox-auto-hide .fancytree-node.fancytree-selected span.fancytree-checkbox,
+.fancytree-container.fancytree-checkbox-auto-hide tr.fancytree-selected td span.fancytree-checkbox {
+ visibility: unset;
+}
+.fancytree-container.fancytree-checkbox-auto-hide.fancytree-treefocus .fancytree-node.fancytree-active span.fancytree-checkbox,
+.fancytree-container.fancytree-checkbox-auto-hide.fancytree-treefocus tr.fancytree-active td span.fancytree-checkbox {
+ visibility: unset;
+}
+/*------------------------------------------------------------------------------
+ * Node type icon
+ * Note: IE6 doesn't correctly evaluate multiples class names,
+ * so we create combined class names that can be used in the CSS.
+ *
+ * Prefix: fancytree-ico-
+ * 1st character: 'e': expanded, 'c': collapsed
+ * 2nd character (optional): 'f': folder
+ *----------------------------------------------------------------------------*/
+span.fancytree-icon {
+ margin-left: 0.5em;
+}
+/* Documents */
+/* Folders */
+.fancytree-loading span.fancytree-expander,
+.fancytree-loading span.fancytree-expander:hover,
+.fancytree-statusnode-loading span.fancytree-icon,
+.fancytree-statusnode-loading span.fancytree-icon:hover,
+span.fancytree-icon.fancytree-icon-loading {
+ background-image: none;
+}
+/* Status node icons */
+/*------------------------------------------------------------------------------
+ * Node titles and highlighting
+ *----------------------------------------------------------------------------*/
+span.fancytree-node {
+ /* See #117 */
+ display: inherit;
+ width: 100%;
+ margin-top: 0px;
+ min-height: 1em;
+}
+span.fancytree-title {
+ color: #333333;
+ cursor: pointer;
+ display: inline-block;
+ vertical-align: top;
+ min-height: 1em;
+ padding: 0 3px 0 3px;
+ margin: 0px 0 0 0.5em;
+ border: 1px solid transparent;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ -ms-border-radius: 3px;
+ -o-border-radius: 3px;
+ border-radius: 3px;
+}
+span.fancytree-node.fancytree-error span.fancytree-title {
+ color: #d9534f;
+}
+/*------------------------------------------------------------------------------
+ * Drag'n'drop support
+ *----------------------------------------------------------------------------*/
+/* ext-dnd5: */
+span.fancytree-childcounter {
+ color: #fff;
+ background: #337ab7;
+ border: 1px solid gray;
+ border-radius: 10px;
+ padding: 2px;
+ text-align: center;
+}
+/* ext-dnd: */
+div.fancytree-drag-helper span.fancytree-childcounter,
+div.fancytree-drag-helper span.fancytree-dnd-modifier {
+ display: inline-block;
+ color: #fff;
+ background: #337ab7;
+ border: 1px solid gray;
+ min-width: 10px;
+ height: 10px;
+ line-height: 1;
+ vertical-align: baseline;
+ border-radius: 10px;
+ padding: 2px;
+ text-align: center;
+ font-size: 9px;
+}
+div.fancytree-drag-helper span.fancytree-childcounter {
+ position: absolute;
+ top: -6px;
+ right: -6px;
+}
+div.fancytree-drag-helper span.fancytree-dnd-modifier {
+ background: #5cb85c;
+ border: none;
+ font-weight: bolder;
+}
+/*** Drop marker icon *********************************************************/
+#fancytree-drop-marker {
+ width: 2em;
+ position: absolute;
+ margin: 0;
+}
+#fancytree-drop-marker.fancytree-drop-after,
+#fancytree-drop-marker.fancytree-drop-before {
+ width: 4em;
+}
+/*** Source node while dragging ***********************************************/
+span.fancytree-drag-source.fancytree-drag-remove {
+ opacity: 0.15;
+}
+/*** Target node while dragging cursor is over it *****************************/
+/*------------------------------------------------------------------------------
+ * 'rtl' option
+ *----------------------------------------------------------------------------*/
+.fancytree-container.fancytree-rtl .fancytree-title {
+ /*unicode-bidi: bidi-override;*/
+ /* optional: reverse title letters */
+}
+.fancytree-container.fancytree-rtl .fancytree-exp-n span.fancytree-expander,
+.fancytree-container.fancytree-rtl .fancytree-exp-nl span.fancytree-expander {
+ background-image: none;
+}
+ul.fancytree-container.fancytree-rtl ul {
+ padding: 0 16px 0 0;
+}
+ul.fancytree-container.fancytree-rtl.fancytree-connectors li {
+ background-position: right 0;
+ background-image: url("../skin-bootstrap/vline-rtl.gif");
+}
+ul.fancytree-container.fancytree-rtl li.fancytree-lastsib,
+ul.fancytree-container.fancytree-rtl.fancytree-no-connector > li {
+ background-image: none;
+}
+/*------------------------------------------------------------------------------
+ * 'table' extension
+ *----------------------------------------------------------------------------*/
+table.fancytree-ext-table {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ font-size: 14px;
+ border-collapse: collapse;
+ /* ext-ariagrid */
+}
+table.fancytree-ext-table span.fancytree-node {
+ display: inline-block;
+ box-sizing: border-box;
+}
+table.fancytree-ext-table td.fancytree-status-merged {
+ text-align: center;
+ font-style: italic;
+ color: #333333;
+}
+table.fancytree-ext-table tr.fancytree-statusnode-error td.fancytree-status-merged {
+ color: #d9534f;
+}
+table.fancytree-ext-table.fancytree-ext-ariagrid.fancytree-cell-mode > tbody > tr.fancytree-active > td {
+ background-color: #eee;
+}
+table.fancytree-ext-table.fancytree-ext-ariagrid.fancytree-cell-mode > tbody > tr > td.fancytree-active-cell {
+ background-color: #cbe8f6;
+}
+table.fancytree-ext-table.fancytree-ext-ariagrid.fancytree-cell-mode.fancytree-cell-nav-mode > tbody > tr > td.fancytree-active-cell {
+ background-color: #3875d7;
+}
+/*------------------------------------------------------------------------------
+ * 'columnview' extension
+ *----------------------------------------------------------------------------*/
+table.fancytree-ext-columnview tbody tr td {
+ position: relative;
+ border: 1px solid gray;
+ vertical-align: top;
+ overflow: auto;
+}
+table.fancytree-ext-columnview tbody tr td > ul {
+ padding: 0;
+}
+table.fancytree-ext-columnview tbody tr td > ul li {
+ list-style-image: none;
+ list-style-position: outside;
+ list-style-type: none;
+ -moz-background-clip: border;
+ -moz-background-inline-policy: continuous;
+ -moz-background-origin: padding;
+ background-attachment: scroll;
+ background-color: transparent;
+ background-position: 0em 0em;
+ background-repeat: repeat-y;
+ background-image: none;
+ /* no v-lines */
+ margin: 0;
+}
+table.fancytree-ext-columnview span.fancytree-node {
+ position: relative;
+ /* allow positioning of embedded spans */
+ display: inline-block;
+}
+table.fancytree-ext-columnview span.fancytree-node.fancytree-expanded {
+ background-color: #e0e0e0;
+}
+table.fancytree-ext-columnview span.fancytree-node.fancytree-active {
+ background-color: #cbe8f6;
+}
+table.fancytree-ext-columnview .fancytree-has-children span.fancytree-cv-right {
+ position: absolute;
+ right: 3px;
+}
+/*------------------------------------------------------------------------------
+ * 'filter' extension
+ *----------------------------------------------------------------------------*/
+.fancytree-ext-filter-dimm span.fancytree-node span.fancytree-title {
+ color: #333333;
+ font-weight: lighter;
+}
+.fancytree-ext-filter-dimm tr.fancytree-submatch span.fancytree-title,
+.fancytree-ext-filter-dimm span.fancytree-node.fancytree-submatch span.fancytree-title {
+ color: black;
+ font-weight: normal;
+}
+.fancytree-ext-filter-dimm tr.fancytree-match span.fancytree-title,
+.fancytree-ext-filter-dimm span.fancytree-node.fancytree-match span.fancytree-title {
+ color: black;
+ font-weight: bold;
+}
+.fancytree-ext-filter-hide tr.fancytree-hide,
+.fancytree-ext-filter-hide span.fancytree-node.fancytree-hide {
+ display: none;
+}
+.fancytree-ext-filter-hide tr.fancytree-submatch span.fancytree-title,
+.fancytree-ext-filter-hide span.fancytree-node.fancytree-submatch span.fancytree-title {
+ color: #333333;
+ font-weight: lighter;
+}
+.fancytree-ext-filter-hide tr.fancytree-match span.fancytree-title,
+.fancytree-ext-filter-hide span.fancytree-node.fancytree-match span.fancytree-title {
+ color: black;
+ font-weight: normal;
+}
+/* Hide expanders if all child nodes are hidden by filter */
+.fancytree-ext-filter-hide-expanders tr.fancytree-match span.fancytree-expander,
+.fancytree-ext-filter-hide-expanders span.fancytree-node.fancytree-match span.fancytree-expander {
+ visibility: hidden;
+}
+.fancytree-ext-filter-hide-expanders tr.fancytree-submatch span.fancytree-expander,
+.fancytree-ext-filter-hide-expanders span.fancytree-node.fancytree-submatch span.fancytree-expander {
+ visibility: visible;
+}
+.fancytree-ext-childcounter span.fancytree-icon,
+.fancytree-ext-filter span.fancytree-icon,
+.fancytree-ext-childcounter span.fancytree-custom-icon,
+.fancytree-ext-filter span.fancytree-custom-icon {
+ position: relative;
+}
+.fancytree-ext-childcounter span.fancytree-childcounter,
+.fancytree-ext-filter span.fancytree-childcounter {
+ color: #fff;
+ background: #777;
+ border: 1px solid gray;
+ position: absolute;
+ top: -6px;
+ right: -6px;
+ min-width: 10px;
+ height: 10px;
+ line-height: 1;
+ vertical-align: baseline;
+ border-radius: 10px;
+ padding: 2px;
+ text-align: center;
+ font-size: 9px;
+}
+/*------------------------------------------------------------------------------
+ * 'wide' extension
+ *----------------------------------------------------------------------------*/
+ul.fancytree-ext-wide {
+ position: relative;
+ min-width: 100%;
+ z-index: 2;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+ul.fancytree-ext-wide span.fancytree-node > span {
+ position: relative;
+ z-index: 2;
+}
+ul.fancytree-ext-wide span.fancytree-node span.fancytree-title {
+ position: absolute;
+ z-index: 1;
+ left: 0px;
+ min-width: 100%;
+ margin-left: 0;
+ margin-right: 0;
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+/*------------------------------------------------------------------------------
+ * 'fixed' extension
+ *----------------------------------------------------------------------------*/
+.fancytree-ext-fixed-wrapper .fancytree-ext-fixed-hidden {
+ display: none;
+}
+.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-scroll-border-bottom {
+ border-bottom: 3px solid rgba(0, 0, 0, 0.75);
+}
+.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-scroll-border-right {
+ border-right: 3px solid rgba(0, 0, 0, 0.75);
+}
+.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-tl {
+ position: absolute;
+ overflow: hidden;
+ z-index: 3;
+ top: 0px;
+ left: 0px;
+}
+.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-tr {
+ position: absolute;
+ overflow: hidden;
+ z-index: 2;
+ top: 0px;
+}
+.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-bl {
+ position: absolute;
+ overflow: hidden;
+ z-index: 2;
+ left: 0px;
+}
+.fancytree-ext-fixed-wrapper div.fancytree-ext-fixed-wrapper-br {
+ position: absolute;
+ overflow: scroll;
+ z-index: 1;
+}
+/*******************************************************************************
+ * Styles specific to this skin.
+ *
+ * This section is automatically generated from the `ui-fancytree.less` template.
+ ******************************************************************************/
+/*******************************************************************************
+ * Plain tree
+ * Modifier classes on container:
+ * table-hover : Enable a light mouse hover effect
+ * fancytree-colorize-selected: Give selected (checked) rows a color
+ */
+ul.fancytree-container ul {
+ padding: 0 0 0 1.5em;
+ margin: 0;
+}
+/* Prevent focus frame */
+.fancytree-container:focus {
+ outline: none;
+}
+.fancytree-container .fancytree-active span.fancytree-title input,
+.fancytree-container.fancytree-colorize-selected .fancytree-selected span.fancytree-title input {
+ color: black;
+}
+.fancytree-container span.fancytree-statusnode-error span.fancytree-expander {
+ color: #d9534f;
+}
+div.fancytree-drag-helper.fancytree-drop-reject,
+div.fancytree-drag-helper.fancytree-drop-reject span.fancytree-title {
+ color: #d9534f;
+}
+span.fancytree-node.fancytree-drag-source {
+ background-color: #5bc0de !important;
+}
+span.fancytree-node.fancytree-drop-target.fancytree-drop-reject span.fancytree.title {
+ background-color: #d9534f !important;
+}
+span.fancytree-expander {
+ color: #999;
+}
+.fancytree-expanded span.fancytree-expander {
+ color: #333333;
+}
+span.fancytree-node span.fancytree-expander:hover {
+ color: cyan;
+}
+.fancytree-plain.fancytree-colorize-selected span.fancytree-node.fancytree-selected,
+.fancytree-plain.fancytree-colorize-selected span.fancytree-node.fancytree-selected span.fancytree-title {
+ background-color: #80c780;
+ border-color: #80c780;
+ color: #fff;
+}
+.fancytree-plain.fancytree-colorize-selected span.fancytree-node.fancytree-selected:hover span.fancytree-title {
+ background-color: #6ec06e;
+}
+.fancytree-plain.fancytree-colorize-selected span.fancytree-node.fancytree-active.fancytree-selected span.fancytree-title {
+ color: #80c780;
+}
+.fancytree-plain.fancytree-colorize-selected.fancytree-treefocus span.fancytree-title:hover {
+ background-color: #f5f5f5;
+}
+.fancytree-plain.fancytree-colorize-selected.fancytree-treefocus span.fancytree-node.fancytree-selected span.fancytree-title {
+ background-color: #5cb85c;
+}
+.fancytree-plain.fancytree-colorize-selected.fancytree-treefocus span.fancytree-node.fancytree-selected:hover span.fancytree-title {
+ background-color: #4cae4c;
+}
+.fancytree-plain.fancytree-colorize-selected.fancytree-treefocus span.fancytree-node.fancytree-active.fancytree-selected span.fancytree-title {
+ color: #5cb85c;
+}
+.fancytree-plain.fancytree-container span.fancytree-node {
+ margin-top: 2px;
+ margin-bottom: 2px;
+}
+.fancytree-plain.fancytree-container span.fancytree-title {
+ border: 1px solid transparent;
+ border-radius: 3px;
+ outline-radius: 3px;
+}
+.fancytree-plain.fancytree-container span.fancytree-title:hover {
+ background-color: #f5f5f5;
+}
+.fancytree-plain.fancytree-container span.fancytree-node.fancytree-active span.fancytree-title {
+ background-color: #5094ce;
+ color: #fff;
+}
+.fancytree-plain.fancytree-container span.fancytree-node.fancytree-active:hover span.fancytree-title {
+ background-color: #3c87c8;
+}
+.fancytree-plain.fancytree-container.fancytree-ext-wide span.fancytree-node.fancytree-active {
+ color: #fff;
+}
+.fancytree-plain.fancytree-container.fancytree-treefocus span.fancytree-node.fancytree-focused span.fancytree-title {
+ border-color: #337ab7;
+}
+.fancytree-plain.fancytree-container.fancytree-treefocus span.fancytree-node.fancytree-active span.fancytree-title {
+ background-color: #337ab7;
+ border-color: #337ab7;
+}
+.fancytree-plain.fancytree-container.fancytree-treefocus span.fancytree-node.fancytree-active:hover span.fancytree-title {
+ background-color: #2e6da4;
+}
+/*******************************************************************************
+ * 'table' extension
+ * Modifier classes on :
+ * table-hover : Enable a light mouse hover effect
+ * fancytree-colorize-selected: Give selected (checked) rows a color
+ */
+table.fancytree-ext-table > tbody > tr > td span.fancytree-title {
+ border: none;
+}
+table.fancytree-ext-table.fancytree-colorize-selected > tbody > tr.fancytree-selected > td {
+ background-color: #80c780;
+}
+table.fancytree-ext-table.fancytree-colorize-selected > tbody > tr.fancytree-selected > td,
+table.fancytree-ext-table.fancytree-colorize-selected > tbody > tr.fancytree-selected > td span.fancytree-title {
+ color: #fff;
+}
+table.fancytree-ext-table.fancytree-colorize-selected.fancytree-treefocus > tbody > tr.fancytree-selected > td {
+ background-color: #5cb85c;
+}
+table.fancytree-ext-table.fancytree-colorize-selected.table-hover > tbody > tr.fancytree-selected:hover > td {
+ background-color: #6ec06e;
+}
+table.fancytree-ext-table.fancytree-colorize-selected.fancytree-treefocus.table-hover > tbody > tr.fancytree-selected:hover > td {
+ background-color: #4cae4c;
+}
+table.fancytree-ext-table.fancytree-colorize-selected.fancytree-treefocus.table-hover > tbody > tr.fancytree-selected.fancytree-active:hover > td,
+table.fancytree-ext-table.fancytree-colorize-selected.table-hover > tbody > tr.fancytree-selected.fancytree-active:hover > td {
+ background-color: #2e6da4;
+}
+table.fancytree-ext-table.fancytree-colorize-selected > tbody > tr.fancytree-active.fancytree-selected {
+ outline-width: 2px;
+ outline-offset: -2px;
+ outline-style: solid;
+ outline-color: #80c780;
+}
+table.fancytree-ext-table.fancytree-container > tbody > tr.fancytree-active > td {
+ background-color: #5094ce;
+}
+table.fancytree-ext-table.fancytree-container > tbody > tr.fancytree-active > td,
+table.fancytree-ext-table.fancytree-container > tbody > tr.fancytree-active > td span.fancytree-title {
+ color: #fff;
+}
+table.fancytree-ext-table.fancytree-treefocus.fancytree-container > tbody > tr.fancytree-focused span.fancytree-title {
+ outline: 1px dotted #000;
+}
+table.fancytree-ext-table.fancytree-treefocus.fancytree-container > tbody > tr.fancytree-active > td {
+ background-color: #337ab7;
+}
+table.fancytree-ext-table.fancytree-treefocus.fancytree-container.table-hover > tbody > tr.fancytree-active:hover > td {
+ background-color: #2e6da4;
+}
diff --git a/public/js/viewtree/skin-bootstrap/ui.fancytree.less b/public/js/viewtree/skin-bootstrap/ui.fancytree.less
new file mode 100644
index 0000000..bfd85fb
--- /dev/null
+++ b/public/js/viewtree/skin-bootstrap/ui.fancytree.less
@@ -0,0 +1,351 @@
+/*!
+ * Fancytree "bootstrap" skin.
+ *
+ * DON'T EDIT THE CSS FILE DIRECTLY, since it is automatically generated from
+ * the LESS templates.
+ */
+
+// Import common styles
+@import "../skin-common.less";
+
+
+/*******************************************************************************
+ * Styles specific to this skin.
+ *
+ * This section is automatically generated from the `ui-fancytree.less` template.
+ ******************************************************************************/
+
+
+// local vars
+// @fancy-my-icon-size: 16px;
+
+//------------------------------------------------------------------------------
+// Original bootstrap colors
+// See http://getbootstrap.com/css/#less-variables-colors and
+// https://github.com/twbs/bootstrap/blob/master/less/variables.less
+@gray-base: #000;
+@gray-darker: lighten(@gray-base, 13.5%); // #222
+@gray-dark: lighten(@gray-base, 20%); // #333
+@gray: lighten(@gray-base, 33.5%); // #555
+@gray-light: lighten(@gray-base, 46.7%); // #777
+@gray-lighter: lighten(@gray-base, 93.5%); // #eee
+
+@brand-primary: darken(#428bca, 6.5%); // blue, #337ab7
+@brand-success: #5cb85c; // green
+@brand-info: #5bc0de; // light blue
+@brand-warning: #f0ad4e; // orange
+@brand-danger: #d9534f; // red
+
+@font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif;
+@font-family-serif: Georgia, "Times New Roman", Times, serif;
+//** Default monospace fonts for ``, ``, and ``.
+@font-family-monospace: Menlo, Monaco, Consolas, "Courier New", monospace;
+@font-family-base: @font-family-sans-serif;
+
+@font-size-base: 14px;
+@font-size-large: ceil((@font-size-base * 1.25)); // ~18px
+@font-size-small: ceil((@font-size-base * 0.85)); // ~12px
+
+@border-radius-base: 4px;
+@border-radius-large: 6px;
+@border-radius-small: 3px;
+
+@text-color: @gray-dark;
+//** Default background color used for all tables.
+@table-bg: transparent;
+//** Background color used for `.table-striped`.
+@table-bg-accent: #f9f9f9;
+//** Background color used for `.table-hover`.
+@table-bg-hover: #f5f5f5;
+@table-bg-active: @table-bg-hover;
+
+//** Border color for table and cell borders.
+@table-border-color: #ddd;
+
+//------------------------------------------------------------------------------
+
+// Override the variable after the import.
+// NOTE: Variables are always resolved as the last definition, even if it is
+// after where it is used.
+@fancy-use-sprites: false; // false: suppress all background images (i.e. icons)
+@fancy-loading-url: none;
+
+@fancy-line-height: 1em; // height of a nodes selection bar including borders
+@fancy-node-v-spacing: 0px; // gap between two node borders
+@fancy-icon-width: 1em;
+@fancy-icon-height: 1em;
+@fancy-icon-spacing: 0.5em; // margin between icon/icon or icon/title
+@fancy-icon-ofs-top: 2px; // extra vertical offset for expander, checkbox and icon
+@fancy-title-ofs-top: 0px; // extra vertical offset for title
+@fancy-node-border-width: 1px;
+@fancy-node-border-radius: @border-radius-small;
+@fancy-node-outline-width: 1px;
+
+@fancy-font-family: @font-family-base;
+@fancy-font-size: @font-size-base;
+@fancy-font-color: @text-color;
+@fancy-font-color-dimm: @gray-dark;
+@fancy-font-error-color: @brand-danger;
+
+@fancy-active-text: #fff;
+@fancy-active-color: @brand-primary;
+@fancy-select-color: @brand-success;
+@fancy-hover-color: @table-bg-hover;
+
+// We need to define this variable here (not in skin-common.less) to make it
+// work with grunt and webpack:
+@fancy-image-prefix: "./skin-bootstrap/";
+
+/*******************************************************************************
+ * Plain tree
+ * Modifier classes on