initial implementation of UI, API and flow for importing from Galaxy user directories, introduces jstree browser into the project, includes refactoring of some library API methods into common managers

This commit is contained in:
Martin Cech
2014-09-08 14:27:49 -04:00
parent c5511cd747
commit 3bddbcf11f
22 changed files with 8959 additions and 193 deletions
+229
View File
@@ -0,0 +1,229 @@
import pickle
class DictionaryObject(object):
"""
A class that has all the functionality of a normal Python dictionary, except
for the fact it is itself immutable. It also has the added feature of
being able to lookup values by using keys as attributes.
The reason for the class being immutable by default is to help make it a
little easier to use in multiprocessing situations. Granted, the underlying
values themselves are not deeply copied, but the aim is to enforce some
ensurances of immutability on the container class.
When using positional arguments, the first argument must always be something
that would be a valid argument for a dict(). However, a second, optional
argument may be passed to create a default value when keys are not found.
Examples:
>>> d = DictionaryObject({'a':1, 'b':True, 3:'x'})
>>> print d.a, d.b, d[3]
1 True x
>>> d = DictionaryObject((('a',1),('b',2)))
>>> print d.a, d.b
1 2
>>> d = DictionaryObject(a=1, b=True)
>>> print d
DictionaryObject({'a': 1, 'b': True})
>>> d = DictionaryObject({'a':1, 'b':True}, None)
>>> print d.a, d.b, d.c, d.d
1 True None None
>>> d = DictionaryObject({'a':1}, None)
>>> m = MutableDictionaryObject(d)
>>> print d == m
True
>>> m.a = 0
>>> print d == m, d < m, d > m, d != m, d <= m, d >= m
False False True True False True
>>> import pickle
>>> m1 = MutableDictionaryObject({'a':1}, None)
>>> m2 = pickle.loads(pickle.dumps(m1))
>>> print m1 == m2
True
>>> m1.a = 3
>>> print m1 == m2
False
>>> m1.a == 3
True
>>> m1['c'] = 5
>>> m1['c']
5
"""
def __init__(self, contents=(), *args, **kwargs):
"""
Take as input a dictionary-like object and return a DictionaryObject.
It also makes sure any keys containing dictionaries are also converted
to DictionaryObjects.
"""
super(DictionaryObject, self).__init__()
if isinstance(contents, DictionaryObject):
self.__dict__.update(pickle.loads(pickle.dumps(contents.__dict__)))
return
self.__dict__['_items'] = dict(contents, **kwargs)
if len(args) > 1:
raise TypeError("too many arguments")
# If we have more than one argument passed in, use the second argument
# as a default value.
if args:
try:
default = type(self)(args[0])
except:
default = args[0]
self.__dict__['_defaultValue'] = default
else:
self.__dict__['_defaultValue'] = None
self.__dict__['_defaultIsSet'] = len(args) > 0
for k in self._items:
if isinstance(self._items[k], dict):
self._items[k] = type(self)(self._items[k])
def __setstate__(self, dict):
self.__dict__.update(dict)
def __getstate__(self):
return self.__dict__.copy()
def __getattr__(self, name):
"""
This is the method that makes all the magic happen. Search for
'name' in self._items and return the value if found. If a default
value has been set and 'name' is not found in self._items, return it.
Otherwise raise an AttributeError.
Example:
>>> d = DictionaryObject({'keys':[1,2], 'values':3, 'x':1})
>>> d.keys
<bound method DictionaryObject.keys of DictionaryObject({'keys': [1, 2], 'x': 1, 'values': 3})>
>>> d.values
<bound method DictionaryObject.values of DictionaryObject({'keys': [1, 2], 'x': 1, 'values': 3})>
>>> d.x
1
>>> d['keys']
[1, 2]
>>> d['values']
3
"""
if name in self._items:
return self._items[name]
if self._defaultIsSet:
return self._defaultValue
raise AttributeError("'%s' object has no attribute '%s'" % (type(self).__name__, name))
def __setattr__(self, name, value):
"""
This class is immutable-by-default. See MutableDictionaryObject.
"""
raise AttributeError("'%s' object does not support assignment" % type(self).__name__)
def __getitem__(self, name):
return self._items[name]
def __contains__(self, name):
return name in self._items
def __len__(self):
return len(self._items)
def __iter__(self):
return iter(self._items)
def __repr__(self):
if self._defaultIsSet:
params = "%s, %s" % (repr(self._items), self._defaultValue)
else:
params = repr(self._items)
return "%s(%s)" % (type(self).__name__, params)
def __cmp__(self, rhs):
if self < rhs:
return -1
if self > rhs:
return 1
return 0
def __eq__(self, rhs):
val = cmp(self._items, rhs._items)
if 0 == val:
return 0 == cmp(self._defaultValue, rhs._defaultValue)
return 0 == val
def __ne__(self, rhs):
return not (self == rhs)
def __lt__(self, rhs):
val = cmp(self._items, rhs._items)
if 0 == val:
return -1 == cmp(self._defaultValue, rhs._defaultValue)
return -1 == val
def __le__(self, rhs):
return self < rhs or self == rhs
def __gt__(self, rhs):
return not (self <= rhs)
def __ge__(self, rhs):
return self > rhs or self == rhs
def keys(self):
return self._items.keys()
def values(self):
return self._items.values()
def asdict(self):
"""
Copy the data back out of here and into a dict. Then return it.
Some libraries may check specifically for dict objects, such
as the json library; so, this makes it convenient to get the data
back out.
>>> import dictobj
>>> d = {'a':1, 'b':2}
>>> dictobj.DictionaryObject(d).asdict() == d
True
>>> d['c'] = {1:2, 3:4}
>>> dictobj.DictionaryObject(d).asdict() == d
True
"""
items = {}
for name in self._items:
value = self._items[name]
if isinstance(value, DictionaryObject):
items[name] = value.asdict()
else:
items[name] = value
return items
class MutableDictionaryObject(DictionaryObject):
"""
Slight enhancement of the DictionaryObject allowing one to add
attributes easily, in cases where that functionality is wanted.
Examples:
>>> d = MutableDictionaryObject({'a':1, 'b':True}, None)
>>> print d.a, d.b, d.c, d.d
1 True None None
>>> d.c = 3
>>> del d.a
>>> print d.a, d.b, d.c, d.d
None True 3 None
"""
def __setattr__(self, name, value):
self._items[name] = value
def __delattr__(self, name):
del self._items[name]
__setitem__ = __setattr__
__delitem__ = __delattr__
+173
View File
@@ -0,0 +1,173 @@
import os
import copy
from galaxy.util import dictobj
from collections import namedtuple
Path = namedtuple('Path', ('path', 'id', 'options'))
class Node(dictobj.DictionaryObject):
"""
This class exists as a helper to the JSTree. Its "jsonData" method can
generate sub-tree JSON without putting the logic directly into the JSTree.
This data structure is only semi-immutable. The JSTree uses a directly
iterative (i.e. no stack is managed) builder pattern to construct a
tree out of paths. Therefore, the children are not known in advance, and
we have to keep the children attribute mutable.
"""
def __init__(self, path, oid, **kwargs):
"""
kwargs allows users to pass arbitrary information into a Node that
will later be output in jsonData(). It allows for more advanced
configuration than the default path handling that JSTree currently allows.
For example, users may want to pass "attr" or some other valid jsTree options.
Example:
>>> import jstree
>>> node = jstree.Node('a', None)
>>> print node
Node({'text': 'a', 'children': MutableDictionaryObject({})})
>>> print node.jsonData()
{'text': 'a'}
>>> import jstree
>>> node = jstree.Node('a', 1)
>>> print node
Node({'text': 'a', 'children': MutableDictionaryObject({}), 'li_attr': DictionaryObject({'id': 1}), 'id': 1})
>>> print node.jsonData()
{'text': 'a', 'id': 1, 'li_attr': {'id': 1}}
>>> import jstree
>>> node = jstree.Node('a', 5, icon="folder", state = {'opened': True})
>>> print node
Node({'text': 'a', 'id': 5, 'state': DictionaryObject({'opened': True}), 'children': MutableDictionaryObject({}), 'li_attr': DictionaryObject({'id': 5}), 'icon': 'folder'})
>>> print node.jsonData()
{'text': 'a', 'state': {'opened': True}, 'id': 5, 'li_attr': {'id': 5}, 'icon': 'folder'}
"""
super(Node, self).__init__()
children = kwargs.get('children', {})
if len(filter(lambda key: not isinstance(children[key], Node), children)):
raise TypeError(
"One or more children were not instances of '%s'" % Node.__name__)
if 'children' in kwargs:
del kwargs['children']
self._items['children'] = dictobj.MutableDictionaryObject(children)
if oid is not None:
li_attr = kwargs.get('li_attr', {})
li_attr['id'] = oid
kwargs['li_attr'] = li_attr
self._items['id'] = oid
self._items.update(dictobj.DictionaryObject(**kwargs))
self._items['text'] = path
def jsonData(self):
children = [self.children[k].jsonData() for k in sorted(self.children)]
output = {}
for k in self._items:
if 'children' == k:
continue
if isinstance(self._items[k], dictobj.DictionaryObject):
output[k] = self._items[k].asdict()
else:
output[k] = self._items[k]
if len(children):
output['children'] = children
return output
class JSTree(dictobj.DictionaryObject):
"""
An immutable dictionary-like object that converts a list of "paths"
into a tree structure suitable for jQuery's jsTree.
"""
def __init__(self, paths, **kwargs):
"""
Take a list of paths and put them into a tree. Paths with the same prefix should
be at the same level in the tree.
kwargs may be standard jsTree options used at all levels in the tree. These will be outputted
in the JSON.
Example (basic usage):
>>> import jstree
>>> paths = [jstree.Path("editor/2012-07/31/.classpath", 1), jstree.Path("editor/2012-07/31/.project", 2)]
>>> t1 = jstree.JSTree(paths)
>>> print t1.jsonData()
[{'text': 'editor/2012-07/31/.classpath', 'id': 1, 'li_attr': {'id': 1}}, {'text': 'editor/2012-07/31/.project', 'id': 2, 'li_attr': {'id': 2}}]
"""
if len(filter(lambda p: not isinstance(p, Path), paths)):
raise TypeError(
"All paths must be instances of '%s'" % Path.__name__)
super(JSTree, self).__init__()
root = Node('', None, **kwargs)
for path in sorted(paths):
curr = root
subpaths = path.path.split(os.path.sep)
for i, subpath in enumerate(subpaths):
if subpath not in curr.children:
opt = copy.deepcopy(kwargs)
if len(subpaths) - 1 == i:
oid = path.id
opt.update(path.options) if path.options is not None else None
else:
oid = None
curr.children[subpath] = Node(subpath, oid, **opt)
# oid = path.id if len(subpaths) - 1 == i else None
# curr.children[subpath] = Node(subpath, oid, **kwargs)
curr = curr.children[subpath]
self._items['_root'] = root
def pretty(self, root=None, depth=0, spacing=2):
"""
Create a "pretty print" represenation of the tree with customized indentation at each
level of the tree.
Example:
>>> import jstree
>>> paths = [jstree.Path("editor/2012-07/31/.classpath", 1), jstree.Path("editor/2012-07/31/.project", 2)]
>>> print jstree.JSTree(paths).pretty()
/
editor/
2012-07/
31/
.classpath
.project
"""
if root is None:
root = self._root
fmt = "%s%s/" if root.children else "%s%s"
s = fmt % (" " * depth * spacing, root.text)
for child in root.children:
child = root.children[child]
s += "\n%s" % self.pretty(child, depth + 1, spacing)
return s
def jsonData(self):
"""
Returns a copy of the internal tree in a JSON-friendly format,
ready for consumption by jsTree. The data is represented as a
list of dictionaries, each of which are our internal nodes.
Examples:
>>> import jstree
>>> paths = [jstree.Path("editor/2012-07/31/.classpath", 1), jstree.Path("editor/2012-07/31/.project", 2)]
>>> t = jstree.JSTree(paths)
>>> d = t.jsonData()
>>> print d
[{'data': 'editor', 'children': [{'data': '2012-07', 'children': [{'data': '31', 'children': [{'data': '.classpath', 'metadata': {'id': 1}}, {'data': '.project', 'metadata': {'id': 2}}]}]}]}]
>>> print d[0]['children'][0]['children'][0]['children'][1]
{'data': '.project', 'metadata': {'id': 2}}
>>> print d[0]['children'][0]['children'][0]['children'][1]['data']
.project
>>> print d[0]['children'][0]['children'][0]['children'][1]['metadata']['id']
2
"""
return [self._root.children[k].jsonData() for k in sorted(self._root.children)]
@@ -4,6 +4,7 @@ API operations on the contents of a library folder.
from galaxy import web
from galaxy import util
from galaxy import exceptions
from galaxy.managers import folders
from galaxy.web import _future_expose_api as expose_api
from galaxy.web import _future_expose_api_anonymous as expose_api_anonymous
from sqlalchemy.orm.exc import MultipleResultsFound
@@ -19,6 +20,10 @@ class FolderContentsController( BaseAPIController, UsesLibraryMixin, UsesLibrary
Class controls retrieval, creation and updating of folder contents.
"""
def __init__( self, app ):
super( FolderContentsController, self ).__init__( app )
self.folder_manager = folders.FolderManager()
@expose_api_anonymous
def index( self, trans, folder_id, **kwd ):
"""
@@ -46,32 +51,17 @@ class FolderContentsController( BaseAPIController, UsesLibraryMixin, UsesLibrary
"""
is_admin = trans.user_is_admin()
deleted = kwd.get( 'include_deleted', 'missing' )
current_user_roles = trans.get_current_user_roles()
try:
deleted = util.asbool( deleted )
except ValueError:
deleted = False
if ( len( folder_id ) == 17 and folder_id.startswith( 'F' ) ):
try:
decoded_folder_id = trans.security.decode_id( folder_id[ 1: ] )
except TypeError:
raise exceptions.MalformedId( 'Malformed folder id ( %s ) specified, unable to decode.' % str( folder_id ) )
else:
raise exceptions.MalformedId( 'Malformed folder id ( %s ) specified, unable to decode.' % str( folder_id ) )
try:
folder = trans.sa_session.query( trans.app.model.LibraryFolder ).filter( trans.app.model.LibraryFolder.table.c.id == decoded_folder_id ).one()
except MultipleResultsFound:
raise exceptions.InconsistentDatabase( 'Multiple folders with same id found.' )
except NoResultFound:
raise exceptions.ObjectNotFound( 'Folder with the id provided ( %s ) was not found' % str( folder_id ) )
except Exception:
raise exceptions.InternalServerError( 'Error loading from the database.' )
current_user_roles = trans.get_current_user_roles()
decoded_folder_id = self.folder_manager.cut_and_decode( trans, folder_id )
folder = self.folder_manager.get( trans, decoded_folder_id )
# Special level of security on top of libraries.
if trans.app.security_agent.can_access_library( current_user_roles, folder.parent_library ):
if trans.app.security_agent.can_access_library( current_user_roles, folder.parent_library ) or is_admin:
pass
else:
if trans.user:
@@ -80,29 +70,6 @@ class FolderContentsController( BaseAPIController, UsesLibraryMixin, UsesLibrary
log.warning( "SECURITY: Anonymous user is trying to load restricted folder with ID of %s" % ( decoded_folder_id ) )
raise exceptions.ObjectNotFound( 'Folder with the id provided ( %s ) was not found' % str( folder_id ) )
# if not ( trans.user_is_admin() or trans.app.security_agent.can_access_library_item( current_user_roles, folder, trans.user ) ):
# log.debug('folder parent id: ' + str(folder.parent_id))
# if folder.parent_id is None:
# try:
# library = trans.sa_session.query( trans.app.model.Library ).filter( trans.app.model.Library.table.c.root_folder_id == decoded_folder_id ).one()
# except Exception:
# raise exceptions.InternalServerError( 'Error loading from the database.' )
# if trans.app.security_agent.library_is_unrestricted( library ):
# pass
# else:
# if trans.user:
# log.warning( "SECURITY: User (id: %s) without proper access rights is trying to load folder with ID of %s" % ( trans.user.id, decoded_folder_id ) )
# else:
# log.warning( "SECURITY: Anonymous user without proper access rights is trying to load folder with ID of %s" % ( decoded_folder_id ) )
# raise exceptions.ObjectNotFound( 'Folder with the id provided ( %s ) was not found' % str( folder_id ) )
# else:
# if trans.user:
# log.warning( "SECURITY: User (id: %s) without proper access rights is trying to load folder with ID of %s" % ( trans.user.id, decoded_folder_id ) )
# else:
# log.debug('PARENT ID IS NOT NONE')
# log.warning( "SECURITY: Anonymous user without proper access rights is trying to load folder with ID of %s" % ( decoded_folder_id ) )
# raise exceptions.ObjectNotFound( 'Folder with the id provided ( %s ) was not found' % str( folder_id ) )
folder_contents = []
update_time = ''
create_time = ''
@@ -161,9 +128,11 @@ class FolderContentsController( BaseAPIController, UsesLibraryMixin, UsesLibrary
# Check whether user can modify the current folder
can_modify_folder = is_admin or trans.app.security_agent.can_modify_library_item( current_user_roles, folder )
parent_library_id = None
if folder.parent_library is not None:
parent_library_id = trans.security.encode_id( folder.parent_library.id )
metadata = dict( full_path=full_path,
can_add_library_item=can_add_library_item,
can_modify_folder=can_modify_folder,
+107 -40
View File
@@ -1,60 +1,127 @@
"""
API operations on ftp files.
API operations on remote files.
"""
import logging
from galaxy.web.base.controller import BaseAPIController, url_for
from galaxy import web
import os.path
import os
import time
import hashlib
from galaxy import web
from galaxy import exceptions
from galaxy.web import _future_expose_api as expose_api
from galaxy.util import jstree
from galaxy.web.base.controller import BaseAPIController, url_for
from operator import itemgetter
import logging
log = logging.getLogger( __name__ )
class FTPFilesAPIController( BaseAPIController ):
@web.expose_api
@expose_api
def index( self, trans, **kwd ):
"""
GET /api/ftp_files/
Displays local files.
Displays remote files.
:param target: target to load available datasets from, defaults to ftp
possible values: ftp, userdir
:type target: str
:param format: requested format of data, defaults to flat
possible values: flat, jstree, ajax
:returns: list of available files
:rtype: list
"""
# look for ftp files
try:
# initialize response
response = []
# identify ftp directory
target = kwd.get( 'target', None )
format = kwd.get( 'format', None )
if target == 'userdir':
user_login = trans.user.email
user_base_dir = trans.app.config.user_library_import_dir
if user_base_dir is None:
raise exceptions.ConfigDoesNotAllowException( 'The configuration of this Galaxy instance does not allow upload from user directories.' )
full_import_dir = os.path.join( user_base_dir, user_login )
if full_import_dir is not None:
if format == 'jstree':
disable = kwd.get( 'disable', 'folders')
try:
userdir_jstree = self.__create_jstree( full_import_dir, disable )
response = userdir_jstree.jsonData()
except Exception, exception:
log.debug(str(exception))
raise exceptions.InternalServerError( 'Could not create tree representation of the given folder: ' + str( full_import_dir ) )
elif format == 'ajax':
raise exceptions.NotImplemented( 'Not implemented yet. Sorry.' )
else:
try:
response = self.__load_all_filenames( full_import_dir )
except Exception, exception:
log.error( 'Could not get user import files: %s', str( exception ), exc_info=True )
raise exceptions.InternalServerError( 'Could not get the files from your user directory folder.' )
else:
raise exceptions.InternalServerError( 'Could not get the files from your user directory folder.' )
else:
user_ftp_base_dir = trans.app.config.ftp_upload_dir
if user_ftp_base_dir is None:
return []
# identify user sub directory
user_ftp_dir = None
if user_ftp_base_dir is not None and trans is not None and trans.user is not None:
raise exceptions.ConfigDoesNotAllowException( 'The configuration of this Galaxy instance does not allow upload from FTP directories.' )
try:
user_ftp_dir = None
identifier = trans.app.config.ftp_upload_dir_identifier
user_ftp_dir = os.path.join( user_ftp_base_dir, getattr(trans.user, identifier) )
if user_ftp_dir is None:
return []
if user_ftp_dir is not None:
response = self.__load_all_filenames( user_ftp_dir )
else:
raise exceptions.ConfigDoesNotAllowException( 'You do not have an FTP directory named as your login at this Galaxy instance.' )
except Exception, exception:
log.error( 'Could not get ftp files: %s', str( exception ), exc_info=True )
raise exceptions.InternalServerError( 'Could not get the files from your FTP folder.' )
return response
# read directory
if os.path.exists( user_ftp_dir ):
for ( dirpath, dirnames, filenames ) in os.walk( user_ftp_dir ):
for filename in filenames:
path = os.path.relpath( os.path.join( dirpath, filename ), user_ftp_dir )
statinfo = os.lstat( os.path.join( dirpath, filename ) )
response.append( dict( path = path,
size = statinfo.st_size,
ctime = time.strftime( "%m/%d/%Y %I:%M:%S %p", time.localtime( statinfo.st_ctime ) ) ) )
# sort by path
response = sorted(response, key=itemgetter("path"))
def __load_all_filenames( self, directory ):
"""
Loads recursively all files within the given folder and its
subfolders and returns a flat list.
"""
response = []
if os.path.exists( directory ):
for ( dirpath, dirnames, filenames ) in os.walk( directory ):
for filename in filenames:
path = os.path.relpath( os.path.join( dirpath, filename ), directory )
statinfo = os.lstat( os.path.join( dirpath, filename ) )
response.append( dict( path = path,
size = statinfo.st_size,
ctime = time.strftime( "%m/%d/%Y %I:%M:%S %p", time.localtime( statinfo.st_ctime ) ) ) )
else:
raise exceptions.ConfigDoesNotAllowException( 'The given directory does not exist.' )
# sort by path
response = sorted(response, key=itemgetter("path"))
return response
# return
return response
except Exception, exception:
log.error( 'could not get ftp files: %s', str( exception ), exc_info=True )
trans.response.status = 500
return { 'error': str( exception ) }
def __create_jstree( self, directory, disable='folders' ):
"""
Loads recursively all files and folders within the given folder
and its subfolders and returns jstree representation
of its structure.
"""
userdir_jstree = None
jstree_paths = []
if os.path.exists( directory ):
for ( dirpath, dirnames, filenames ) in os.walk( directory ):
for dirname in dirnames:
dir_path = os.path.relpath( os.path.join( dirpath, dirname ), directory )
dir_path_hash = hashlib.sha1( dir_path ).hexdigest()
disabled = True if disable == 'folders' else False
jstree_paths.append( jstree.Path( dir_path, dir_path_hash, { 'type': 'folder', 'state': { 'disabled': disabled }, 'li_attr': { 'full_path': dir_path } } ) )
for filename in filenames:
file_path = os.path.relpath( os.path.join( dirpath, filename ), directory )
file_path_hash = hashlib.sha1( file_path ).hexdigest()
disabled = True if disable == 'files' else False
jstree_paths.append( jstree.Path( file_path, file_path_hash, { 'type': 'file', 'state': { 'disabled': disabled }, 'li_attr': { 'full_path': file_path } } ) )
else:
raise exceptions.ConfigDoesNotAllowException( 'The given directory does not exist.' )
userdir_jstree = jstree.JSTree( jstree_paths )
return userdir_jstree
+109 -3
View File
@@ -1,5 +1,5 @@
"""
API operations on the datasets from library.
API operations on the library datasets.
"""
import glob
import operator
@@ -15,6 +15,7 @@ import zipfile
from galaxy import web
from galaxy import util
from galaxy import exceptions
from galaxy.managers import folders, roles
from galaxy.exceptions import ObjectNotFound
from paste.httpexceptions import HTTPBadRequest, HTTPInternalServerError
from galaxy.web import _future_expose_api as expose_api
@@ -24,6 +25,9 @@ from galaxy.util.streamball import StreamBall
from galaxy.web.base.controller import BaseAPIController, UsesVisualizationMixin
from sqlalchemy.orm.exc import MultipleResultsFound
from sqlalchemy.orm.exc import NoResultFound
from galaxy.tools.actions import upload_common
from galaxy.util.json import to_json_string, from_json_string
import logging
log = logging.getLogger( __name__ )
@@ -31,6 +35,11 @@ log = logging.getLogger( __name__ )
class LibraryDatasetsController( BaseAPIController, UsesVisualizationMixin ):
def __init__( self, app ):
super( LibraryDatasetsController, self ).__init__( app )
self.folder_manager = folders.FolderManager()
self.role_manager = roles.RoleManager()
@expose_api_anonymous
def show( self, trans, id, **kwd ):
"""
@@ -41,8 +50,8 @@ class LibraryDatasetsController( BaseAPIController, UsesVisualizationMixin ):
:param id: the encoded id of the dataset to query
:type id: an encoded id string
:rtype: dictionary
:returns: detailed dataset information from base controller
:rtype: dictionary
.. seealso:: :attr:`galaxy.web.base.controller.UsesLibraryMixinItems.get_library_dataset`
"""
@@ -144,7 +153,6 @@ class LibraryDatasetsController( BaseAPIController, UsesVisualizationMixin ):
raise exceptions.InsufficientPermissionsException( 'You do not have proper permission to access permissions.' )
scope = kwd.get( 'scope', None )
if scope == 'current' or scope is None:
return self._get_current_roles( trans, library_dataset )
@@ -394,6 +402,104 @@ class LibraryDatasetsController( BaseAPIController, UsesVisualizationMixin ):
rval[ 'folder_id' ] = 'F' + rval[ 'folder_id' ]
return rval
@expose_api
def load( self, trans, **kwd ):
"""
Load dataset from the given source into the library.
:param encoded_folder_id: the encoded id of the folder to import dataset to
:type encoded_folder_id: an encoded id string
:param source: source of the dataset to be loaded
:type source: str
:param link_data: flag whether to link the dataset to data or copy it to Galaxy
:type link_data: bool
:param preserve_dirs: flag whether to preserver directory structure when importing dir
:type preserve_dirs: bool
"""
kwd[ 'space_to_tab' ] = 'False'
kwd[ 'to_posix_lines' ] = 'True'
kwd[ 'dbkey' ] = '?'
kwd[ 'file_type' ] = 'auto'
kwd[' link_data_only' ] = 'link_to_files' if util.string_as_bool( kwd.get( 'link_data', False ) ) else 'copy_files'
encoded_folder_id = kwd.get( 'encoded_folder_id', None )
if encoded_folder_id is not None:
folder_id = self.folder_manager.cut_and_decode( trans, encoded_folder_id )
else:
raise exceptions.RequestParameterMissingException( 'The required atribute encoded_folder_id is missing.' )
path = kwd.get( 'path', None)
if path is None:
raise exceptions.RequestParameterMissingException( 'The required atribute path is missing.' )
folder = self.folder_manager.get( trans, folder_id )
link_data = util.string_as_bool( kwd.get( 'link_data', False ) )
source = kwd.get( 'source', None )
if source not in [ 'userdir_file', 'userdir_folder' ]:
raise exceptions.RequestParameterMissingException( 'You have to specify "source" parameter. Possible values are "userdir_file" and "userdir_folder". ')
user_login = trans.user.email
user_base_dir = trans.app.config.user_library_import_dir
if user_base_dir is None:
raise exceptions.ConfigDoesNotAllowException( 'The configuration of this Galaxy instance does not allow upload from user directories.' )
full_dir = os.path.join( user_base_dir, user_login )
# path_to_root_import_folder = None
if not path.lower().startswith( full_dir.lower() ):
# path_to_root_import_folder = path
path = os.path.join( full_dir, path )
if not os.path.exists( path ):
raise exceptions.RequestParameterInvalidException( 'Given path does not exist on the host.' )
if not self.folder_manager.can_add_item( trans, folder ):
raise exceptions.InsufficientPermissionsException( 'You do not have proper permission to add items to the given folder.' )
# Set up the traditional tool state/params
tool_id = 'upload1'
tool = trans.app.toolbox.get_tool( tool_id )
state = tool.new_state( trans )
errors = tool.update_state( trans, tool.inputs_by_page[ 0 ], state.inputs, kwd )
tool_params = state.inputs
dataset_upload_inputs = []
for input_name, input in tool.inputs.iteritems():
if input.type == "upload_dataset":
dataset_upload_inputs.append( input )
library_bunch = upload_common.handle_library_params( trans, {}, trans.security.encode_id( folder.id ) )
abspath_datasets = []
kwd[ 'filesystem_paths' ] = path
params = util.Params( kwd )
# file only
if source == "userdir_file":
file = os.path.abspath( path )
abspath_datasets.append( trans.webapp.controllers[ 'library_common' ].make_library_uploaded_dataset(
trans, 'api', params, os.path.basename( file ), file, 'server_dir', library_bunch ) )
# whole folder
if source == "userdir_folder":
# import_folder_root = [next(part for part in path.split(os.path.sep) if part) for path in [os.path.splitdrive(path_to_root_import_folder)[1]]]
# new_folder = self.folder_manager.create( trans, folder_id, import_folder_root[0] )
uploaded_datasets_bunch = trans.webapp.controllers[ 'library_common' ].get_path_paste_uploaded_datasets(
trans, 'api', params, library_bunch, 200, '' )
uploaded_datasets = uploaded_datasets_bunch[0]
if uploaded_datasets is None:
# TODO no files found - only create folders
return False
for ud in uploaded_datasets:
ud.path = os.path.abspath( ud.path )
abspath_datasets.append( ud )
json_file_path = upload_common.create_paramfile( trans, abspath_datasets )
data_list = [ ud.data for ud in abspath_datasets ]
job, output = upload_common.create_job( trans, tool_params, tool, json_file_path, data_list, folder=folder )
# HACK: Prevent outputs_to_working_directory from overwriting inputs when "linking"
job.add_parameter( 'link_data_only', to_json_string( kwd.get( 'link_data_only', 'copy_files' ) ) )
job.add_parameter( 'uuid', to_json_string( kwd.get( 'uuid', None ) ) )
trans.sa_session.add( job )
trans.sa_session.flush()
job_dict = job.to_dict()
job_dict[ 'id' ] = trans.security.encode_id( job_dict[ 'id' ] )
return job_dict
@web.expose
def download( self, trans, format, **kwd ):
"""
+6
View File
@@ -258,6 +258,12 @@ def populate_api_routes( webapp, app ):
action='show',
conditions=dict( method=[ "GET" ] ) )
webapp.mapper.connect( 'load_ld',
'/api/libraries/datasets/',
controller='lda_datasets',
action='load',
conditions=dict( method=[ "POST" ] ) )
webapp.mapper.connect( 'show_version_of_ld_item',
'/api/libraries/datasets/:encoded_dataset_id/versions/:encoded_ldda_id',
controller='lda_datasets',
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

+11 -1
View File
@@ -47,7 +47,8 @@ var LibraryRouter = Backbone.Router.extend({
"folders/:folder_id/datasets/:dataset_id" : "dataset_detail",
"folders/:folder_id/datasets/:dataset_id/permissions" : "dataset_permissions",
"folders/:folder_id/datasets/:dataset_id/versions/:ldda_id" : "dataset_version",
"folders/:folder_id/download/:format" : "download"
"folders/:folder_id/download/:format" : "download",
"folders/:folder_id/import/:source" : "import_datasets"
},
back: function() {
@@ -147,6 +148,15 @@ var GalaxyLibrary = Backbone.View.extend({
}
Galaxy.libraries.folderView = new mod_library_folder_view.FolderView({id: folder_id, show_permissions: true});
});
this.library_router.on('route:import_datasets', function(folder_id, source){
if (Galaxy.libraries.folderToolbarView && Galaxy.libraries.folderListView){
Galaxy.libraries.folderToolbarView.showImportModal({source:source});
} else {
Galaxy.libraries.folderToolbarView = new mod_foldertoolbar_view.FolderToolbarView({id: folder_id});
Galaxy.libraries.folderListView = new mod_folderlist_view.FolderListView({id: folder_id});
Galaxy.libraries.folderToolbarView.showImportModal({source: source});
}
});
Backbone.history.start({pushState: false});
}
+6743
View File
File diff suppressed because it is too large Load Diff
@@ -185,11 +185,6 @@ var LibraryDatasetView = Backbone.View.extend({
// set the used history as current so user will see the last one
// that he imported into in the history panel on the 'analysis' page
//var set_current_url = '/api/histories/' + history_id + '/set_as_current';
//$.ajax({
// url: set_current_url,
// type: 'PUT'
//});
jQuery.getJSON( galaxy_config.root + 'history/set_as_current?id=' + history_id );
// save the dataset into selected history
@@ -10,9 +10,8 @@ function(mod_masthead,
mod_library_model,
mod_library_dataset_view) {
// galaxy library row view
var FolderRowView = Backbone.View.extend({
// last selected history in modal for UX
lastSelectedHistory: '',
events: {
@@ -24,6 +23,7 @@ var FolderRowView = Backbone.View.extend({
},
initialize : function(folder_item){
this.model = folder_item;
this.render(folder_item);
},
@@ -50,7 +50,7 @@ var FolderRowView = Backbone.View.extend({
},
/**
* Undeletes the dataset on server and renders it again.
* Undeletes the dataset on server and renders the row again.
*/
undelete_dataset : function(event){
$(".tooltip").hide();
@@ -63,7 +63,10 @@ var FolderRowView = Backbone.View.extend({
Galaxy.libraries.folderListView.collection.remove(dataset_id);
var updated_dataset = new mod_library_model.Item(response);
Galaxy.libraries.folderListView.collection.add(updated_dataset);
mod_toastr.success('Dataset undeleted. Click this to see it.', '', {onclick: function() {that.showDatasetDetails();}});
mod_toastr.success('Dataset undeleted. Click this to see it.', '', {onclick: function() {
var folder_id = that.model.get('folder_id');
window.location='#folders/' + folder_id + '/datasets/' + that.id;
}});
},
error : function(model, response){
if (typeof response.responseJSON !== "undefined"){
@@ -123,7 +126,7 @@ var FolderRowView = Backbone.View.extend({
templateRowDeletedFile: function(){
tmpl_array = [];
tmpl_array.push('<tr class="active deleted_dataset" id="<%- content_item.id %>">');
tmpl_array.push('<tr class="active deleted_dataset library-row" id="<%- content_item.id %>">');
tmpl_array.push(' <td>');
tmpl_array.push(' <span title="Dataset" class="fa fa-file-o"></span>');
tmpl_array.push(' </td>');
@@ -2,10 +2,12 @@ define([
"galaxy.masthead",
"utils/utils",
"libs/toastr",
"libs/jquery/jstree",
"mvc/library/library-model"],
function(mod_masthead,
mod_utils,
mod_toastr,
ignore_jstree,
mod_library_model) {
var FolderToolbarView = Backbone.View.extend({
@@ -14,7 +16,6 @@ var FolderToolbarView = Backbone.View.extend({
events: {
'click #toolbtn_create_folder' : 'createFolderFromModal',
'click #toolbtn_bulk_import' : 'modalBulkImport',
'click .toolbtn_add_files' : 'addFilesToFolderModal',
'click #include_deleted_datasets_chk' : 'checkIncludeDeleted',
'click #toolbtn_show_libinfo' : 'showLibInfo',
'click #toolbtn_bulk_delete' : 'deleteSelectedDatasets'
@@ -26,11 +27,15 @@ var FolderToolbarView = Backbone.View.extend({
'chain_call_control' : {
'total_number' : 0,
'failed_number' : 0
}
},
'disabled_jstree_element' : 'folders'
},
modal : null,
// directory browsing object
jstree: null,
// user's histories
histories : null,
@@ -41,14 +46,24 @@ var FolderToolbarView = Backbone.View.extend({
render: function(options){
this.options = _.extend(this.options, options);
var is_admin = false;
var is_anonym = true;
if (Galaxy.currUser){
is_admin = Galaxy.currUser.isAdmin();
is_anonym = Galaxy.currUser.isAnonymous();
}
var toolbar_template = this.templateToolBar();
this.$el.html(toolbar_template({id: this.options.id, admin_user: is_admin, anonym: is_anonym}));
var template_defaults = {
id: this.options.id,
is_admin: false,
is_anonym: true,
user_library_import_dir: Galaxy.config.user_library_import_dir,
allow_library_path_paste: Galaxy.config.allow_library_path_paste,
library_import_dir: Galaxy.config.library_import_dir,
mutiple_add_dataset_options: false
}
if (Galaxy.currUser){
template_defaults.is_admin = Galaxy.currUser.isAdmin();
template_defaults.is_anonym = Galaxy.currUser.isAnonymous();
if (template_defaults.user_library_import_dir !== null || template_defaults.allow_library_path_paste !== false || template_defaults.library_import_dir !== null ){
template_defaults.mutiple_add_dataset_options = true;
}
}
this.$el.html(toolbar_template(template_defaults));
},
configureElements: function(options){
@@ -150,15 +165,15 @@ var FolderToolbarView = Backbone.View.extend({
if(checkedValues.length === 0){
mod_toastr.info('You have to select some datasets first');
} else {
this.refreshUserHistoriesList(function(self){
var template = self.templateBulkImportInModal();
self.modal = Galaxy.modal;
self.modal.show({
this.refreshUserHistoriesList(function(that){
var template = that.templateBulkImportInModal();
that.modal = Galaxy.modal;
that.modal.show({
closing_events : true,
title : 'Import into History',
body : template({histories : self.histories.models}),
body : template({histories : that.histories.models}),
buttons : {
'Import' : function() {self.importAllIntoHistory();},
'Import' : function() {that.importAllIntoHistory();},
'Close' : function() {Galaxy.modal.hide();}
}
});
@@ -167,11 +182,11 @@ var FolderToolbarView = Backbone.View.extend({
},
refreshUserHistoriesList: function(callback){
var self = this;
var that = this;
this.histories = new mod_library_model.GalaxyHistories();
this.histories.fetch({
success: function (){
callback(self);
callback(that);
},
error: function(model, response){
if (typeof response.responseJSON !== "undefined"){
@@ -226,12 +241,7 @@ var FolderToolbarView = Backbone.View.extend({
// set the used history as current so user will see the last one
// that he imported into in the history panel on the 'analysis' page
//var set_current_url = '/api/histories/' + history_id + '/set_as_current';
//$.ajax({
// url: set_current_url,
// type: 'PUT'
//});
jQuery.getJSON( galaxy_config.root + 'history/set_as_current?id=' + historyId );
jQuery.getJSON( galaxy_config.root + 'history/set_as_current?id=' + history_id );
// call the recursive function to call ajax one after each other (request FIFO queue)
this.chainCall(datasets_to_import, history_name);
@@ -312,18 +322,21 @@ var FolderToolbarView = Backbone.View.extend({
}
},
addFilesToFolderModal: function(){
addFilesFromHistoryModal: function(){
this.refreshUserHistoriesList(function(self){
self.modal = Galaxy.modal;
var template_modal = self.templateAddFilesInModal();
var template_modal = self.templateAddFilesFromHistory();
var folder_name = self.options.full_path[self.options.full_path.length - 1][1]
self.modal.show({
closing_events : true,
title : 'Add datasets from history to ' + folder_name,
title : 'Adding datasets from your history to folder ' + folder_name,
body : template_modal({histories: self.histories.models}),
buttons : {
'Add' : function() {self.addAllDatasetsFromHistory();},
'Close' : function() {Galaxy.modal.hide();}
},
closing_callback: function(){
Galaxy.libraries.library_router.back();
}
});
@@ -339,6 +352,182 @@ var FolderToolbarView = Backbone.View.extend({
});
},
importFilesFromUserdirModal: function(){
var that = this;
this.modal = Galaxy.modal;
var template_modal = this.templateBrowserModal();
this.modal.show({
closing_events : true,
title : 'Select folders or files to import',
body : template_modal({}),
buttons : {
'Import' : function() {that.importFromUserdirClicked(that);},
'Close' : function() {Galaxy.modal.hide();}
},
closing_callback: function(){
// TODO: should not trigger routes outside of the router
Galaxy.libraries.library_router.navigate('folders/' + that.id, {trigger: true});
}
});
this.renderJstree({disabled_jstree_element: 'folders'});
$('input[type=radio]').change(function(event){
if (event.target.value ==='jstree-disable-folders') {
$('.jstree-folders-message').hide();
$('.jstree-preserve-structure').hide();
$('.jstree-link-files').hide();
$('.jstree-files-message').show();
that.renderJstree({disabled_jstree_element: 'folders'});
} else if (event.target.value ==='jstree-disable-files'){
that.renderJstree({disabled_jstree_element: 'files'});
$('.jstree-files-message').hide();
$('.jstree-folders-message').show();
$('.jstree-link-files').show();
$('.jstree-preserve-structure').show();
}
}
);
},
renderJstree: function(options){
var that = this;
this.options = _.extend(this.options, options);
var disabled_jstree_element = this.options.disabled_jstree_element;
this.jstree = new mod_library_model.Jstree();
this.jstree.url = this.jstree.urlRoot + '?target=userdir&format=jstree&disable=' + disabled_jstree_element;
this.jstree.fetch({
success: function(model, response){
$('#jstree_browser').jstree("destroy");
var jstreeObject = $('#jstree_browser').jstree({
'core':{
'data': model
},
'plugins': ['types', 'checkbox'],
'types': {
"folder": {
"icon": "jstree-folder"
},
"file": {
"icon": "jstree-file"
}
},
'checkbox': {
three_state: false
}
});
},
error: function(model, response){
if (typeof response.responseJSON !== "undefined"){
mod_toastr.error(response.responseJSON.err_msg);
} else {
mod_toastr.error('An error ocurred :(');
}
}
})
},
importFoldersFromUserdir: function(){
},
// add all selected datasets from user directory into current folder
importFromUserdirClicked : function (that){
var selected_nodes = $('#jstree_browser').jstree().get_selected(true);
var preserve_dirs = this.modal.$el.find('.preserve-checkbox').is(':checked');
var link_data = this.modal.$el.find('.link-checkbox').is(':checked');
var paths = [];
if (selected_nodes.length < 1){
mod_toastr.info('You have to select some items first');
} else {
// disable the button to prevent multiple submission
this.modal.disableButton('Import');
// init the control counters
this.options.chain_call_control.total_number = 0;
this.options.chain_call_control.failed_number = 0;
for (var i = selected_nodes.length - 1; i >= 0; i--){
if(selected_nodes[i].li_attr.full_path !== undefined){
paths.push(selected_nodes[i].li_attr.full_path);
}
}
var folder_name = this.options.folder_name;
var progress_bar_tmpl = this.templateAddingDatasetsProgressBar();
this.modal.$el.find('.modal-body').html(progress_bar_tmpl({ folder_name : folder_name }));
// init the progress bar
this.progressStep = 100 / paths.length;
this.progress = 0;
this.options.chain_call_control.total_number = paths.length;
var selection_type = selected_nodes[0].type;
// call the recursive function to call ajax one after each other (request FIFO queue)
if (selection_type === 'folder'){
this.chainCallImportingUserdirFolders(paths, preserve_dirs, link_data);
} else if (selection_type === 'file'){
this.chainCallImportingUserdirFiles(paths);
}
}
},
chainCallImportingUserdirFiles: function(paths){
var that = this;
var popped_item = paths.pop();
if (typeof popped_item === "undefined") {
if (this.options.chain_call_control.failed_number === 0){
mod_toastr.success('Selected files imported into the current folder');
Galaxy.modal.hide();
} else {
mod_toastr.error('Something went wrong :(');
}
return true;
}
var promise = $.when($.post('/api/libraries/datasets?encoded_folder_id=' + that.id + '&source=userdir_file&path=' + popped_item))
promise.done(function(response){
// we are fine
that.updateProgress();
that.chainCallImportingUserdirFiles(paths);
})
.fail(function(){
// we have a problem
that.options.chain_call_control.failed_number += 1;
that.updateProgress();
that.chainCallImportingUserdirFiles(paths);
});
},
chainCallImportingUserdirFolders: function(paths, preserve_dirs, link_data){
// need to check which paths to call
var that = this;
var popped_item = paths.pop();
if (typeof popped_item === "undefined") {
if (this.options.chain_call_control.failed_number === 0){
mod_toastr.success('Selected folders and their contents imported into the current folder');
Galaxy.modal.hide();
} else {
mod_toastr.error('Something went wrong :(');
}
return true;
}
var promise = $.when($.post('/api/libraries/datasets?encoded_folder_id=' + that.id +
'&source=userdir_folder' +
'&path=' + popped_item +
'&preserve_dirs=' + preserve_dirs +
'&link_data=' + link_data ))
promise.done(function(response){
// we are fine
that.updateProgress();
that.chainCallImportingUserdirFolders(paths);
})
.fail(function(){
// we have a problem
that.options.chain_call_control.failed_number += 1;
that.updateProgress();
that.chainCallImportingUserdirFolders(paths);
});
},
fetchAndDisplayHistoryContents: function(history_id){
var history_contents = new mod_library_model.HistoryContents({id:history_id});
var self = this;
@@ -360,39 +549,44 @@ var FolderToolbarView = Backbone.View.extend({
// add all selected datasets from history into current folder
addAllDatasetsFromHistory : function (){
// disable the button to prevent multiple submission
this.modal.disableButton('Add');
// init the control counters
this.options.chain_call_control.total_number = 0;
this.options.chain_call_control.failed_number = 0;
var checked_hdas = this.modal.$el.find('#selected_history_content').find(':checked');
if (checked_hdas.length < 1){
mod_toastr.info('You have to select some datasets first');
} else {
// disable the button to prevent multiple submission
this.modal.disableButton('Add');
// init the control counters
this.options.chain_call_control.total_number = 0;
this.options.chain_call_control.failed_number = 0;
var history_dataset_ids = [];
this.modal.$el.find('#selected_history_content').find(':checked').each(function(){
var hid = $(this.parentElement).data('id');
if (hid) {
history_dataset_ids.push(hid);
}
});
var folder_name = this.options.folder_name;
var progress_bar_tmpl = this.templateAddingDatasetsProgressBar();
this.modal.$el.find('.modal-body').html(progress_bar_tmpl({ folder_name : folder_name }));
var history_dataset_ids = [];
checked_hdas.each(function(){
var hid = $(this.parentElement).data('id');
if (hid) {
history_dataset_ids.push(hid);
}
});
var folder_name = this.options.folder_name;
var progress_bar_tmpl = this.templateAddingDatasetsProgressBar();
this.modal.$el.find('.modal-body').html(progress_bar_tmpl({ folder_name : folder_name }));
// init the progress bar
this.progressStep = 100 / history_dataset_ids.length;
this.progress = 0;
// init the progress bar
this.progressStep = 100 / history_dataset_ids.length;
this.progress = 0;
// prepare the dataset items to be added
var hdas_to_add = [];
for (var i = history_dataset_ids.length - 1; i >= 0; i--) {
history_dataset_id = history_dataset_ids[i];
var folder_item = new mod_library_model.Item();
folder_item.url = '/api/folders/' + this.options.id + '/contents';
folder_item.set({'from_hda_id':history_dataset_id});
hdas_to_add.push(folder_item);
// prepare the dataset items to be added
var hdas_to_add = [];
for (var i = history_dataset_ids.length - 1; i >= 0; i--) {
history_dataset_id = history_dataset_ids[i];
var folder_item = new mod_library_model.Item();
folder_item.url = '/api/folders/' + this.options.id + '/contents';
folder_item.set({'from_hda_id':history_dataset_id});
hdas_to_add.push(folder_item);
}
this.options.chain_call_control.total_number = hdas_to_add.length;
// call the recursive function to call ajax one after each other (request FIFO queue)
this.chainCallAddingHdas(hdas_to_add);
}
this.options.chain_call_control.total_number = hdas_to_add.length;
// call the recursive function to call ajax one after each other (request FIFO queue)
this.chainCallAddingHdas(hdas_to_add);
},
chainCallAddingHdas: function(hdas_set){
@@ -501,7 +695,6 @@ var FolderToolbarView = Backbone.View.extend({
promise.done(function(dataset){
// we are fine
// self.$el.find('#' + popped_item.id).remove();
Galaxy.libraries.folderListView.collection.remove(popped_item.id);
self.updateProgress();
// add the deleted dataset to collection, triggers rendering
@@ -527,20 +720,12 @@ var FolderToolbarView = Backbone.View.extend({
var that = this;
if (Galaxy.libraries.libraryListView !== null){
library = Galaxy.libraries.libraryListView.collection.get(library_id);
this.showLibInfoModal(library);
} else {
library = new mod_library_model.Library({id: library_id});
library.fetch({
success: function(){
var template = that.templateLibInfoInModal();
that.modal = Galaxy.modal;
that.modal.show({
closing_events : true,
title : 'Library Information',
body : template({library:library}),
buttons : {
'Close' : function() {Galaxy.modal.hide();}
}
});
that.showLibInfoModal(library);
},
error: function(model, response){
if (typeof response.responseJSON !== "undefined"){
@@ -551,7 +736,39 @@ var FolderToolbarView = Backbone.View.extend({
}
})
}
},
showLibInfoModal: function(library){
var template = this.templateLibInfoInModal();
this.modal = Galaxy.modal;
this.modal.show({
closing_events : true,
title : 'Library Information',
body : template({library:library}),
buttons : {
'Close' : function() {Galaxy.modal.hide();}
}
});
},
showImportModal: function(options){
switch(options.source){
case "history":
this.addFilesFromHistoryModal();
break;
case "importdir":
break;
case "path":
mod_toastr.info('Coming soon.');
break;
case "userdir":
this.importFilesFromUserdirModal();
break;
default:
Galaxy.libraries.library_router.back();
mod_toastr.error('Invalid import source.');
break;
}
},
templateToolBar: function(){
@@ -561,21 +778,47 @@ var FolderToolbarView = Backbone.View.extend({
tmpl_array.push('<div class="library_style_container">');
// TOOLBAR START
tmpl_array.push(' <div id="library_toolbar">');
tmpl_array.push(' <span><strong>DATA LIBRARIES</strong></span>');
tmpl_array.push(' <span><strong>DATA LIBRARIES</strong></span>');
tmpl_array.push(' <span data-toggle="tooltip" data-placement="top" class="logged-dataset-manipulation" title="Include deleted datasets" style="display:none;"> | <input id="include_deleted_datasets_chk" style="margin: 0;" type="checkbox"> include deleted | </input></span>');
tmpl_array.push(' <button style="display:none;" data-toggle="tooltip" data-placement="top" title="Create New Folder" id="toolbtn_create_folder" class="btn btn-default primary-button add-library-items" type="button"><span class="fa fa-plus"></span> <span class="fa fa-folder"></span></button>');
tmpl_array.push('<% if(mutiple_add_dataset_options) { %>');
tmpl_array.push(' <div class="btn-group add-library-items" style="display:none;">');
tmpl_array.push(' <button data-toggle="tooltip" data-placement="top" title="Create New Folder" id="toolbtn_create_folder" class="btn btn-default primary-button" type="button"><span class="fa fa-plus"></span> <span class="fa fa-folder"></span></button>');
tmpl_array.push(' <button data-toggle="tooltip" data-placement="top" title="Add Datasets to Current Folder" id="toolbtn_add_files" class="btn btn-default toolbtn_add_files primary-button" type="button"><span class="fa fa-plus"></span> <span class="fa fa-file"></span></span></button>');
tmpl_array.push(' <button title="Add Datasets to Current Folder" id="" type="button" class="primary-button dropdown-toggle" data-toggle="dropdown">');
tmpl_array.push(' <span class="fa fa-plus"></span> <span class="fa fa-file"></span> <span class="caret"></span>');
tmpl_array.push(' </button>');
tmpl_array.push(' <ul class="dropdown-menu" role="menu">');
tmpl_array.push(' <li><a href="#folders/<%= id %>/import/history"> from History</a></li>');
tmpl_array.push('<% if(user_library_import_dir !== null) { %>');
tmpl_array.push(' <li><a href="#folders/<%= id %>/import/userdir"> from User Directory</a></li>');
tmpl_array.push('<% } %>');
tmpl_array.push('<% if(allow_library_path_paste) { %>');
// tmpl_array.push('<% if(allow_library_path_paste || library_import_dir !== null) { %>');
tmpl_array.push(' <li class="divider"></li>');
tmpl_array.push(' <li class="dropdown-header">Admins only</li>');
// tmpl_array.push('<% if(library_import_dir !== null) { %>');
// tmpl_array.push(' <li><a href="#folders/<%= id %>/import/importdir">from Import Directory</a></li>');
// tmpl_array.push('<% } %>');
tmpl_array.push('<% if(allow_library_path_paste) { %>');
tmpl_array.push(' <li><a href="#folders/<%= id %>/import/path">from Path</a></li>');
tmpl_array.push('<% } %>');
tmpl_array.push('<% } %>');
tmpl_array.push(' </ul>');
tmpl_array.push(' </div>');
tmpl_array.push(' <button data-toggle="tooltip" data-placement="top" title="Import selected datasets into history" id="toolbtn_bulk_import" class="primary-button dataset-manipulation" style="margin-left: 0.5em; display:none;" type="button"><span class="fa fa-book"></span> to History</button>');
tmpl_array.push('<% } else { %>');
tmpl_array.push(' <button style="display:none;" data-toggle="tooltip" data-placement="top" title="Add Datasets to Current Folder" id="toolbtn_add_files" class="btn btn-default toolbtn_add_files primary-button add-library-items" type="button"><span class="fa fa-plus"></span> <span class="fa fa-file"></span></span></button>');
tmpl_array.push('<% } %>');
tmpl_array.push(' <button data-toggle="tooltip" data-placement="top" title="Import selected datasets into history" id="toolbtn_bulk_import" class="primary-button dataset-manipulation" style="margin-left: 0.5em; display:none;" type="button"><span class="fa fa-book"></span> to History</button>');
tmpl_array.push(' <div id="toolbtn_dl" class="btn-group dataset-manipulation" style="margin-left: 0.5em; display:none; ">');
tmpl_array.push(' <button title="Download selected datasets as archive" id="drop_toggle" type="button" class="primary-button dropdown-toggle" data-toggle="dropdown">');
tmpl_array.push(' <span class="fa fa-download"></span> Download <span class="caret"></span>');
tmpl_array.push(' </button>');
tmpl_array.push(' <ul class="dropdown-menu" role="menu">');
tmpl_array.push(' <li id="download_archive"><a href="#/folders/<%= id %>/download/tgz">.tar.gz</a></li>');
tmpl_array.push(' <li id="download_archive"><a href="#/folders/<%= id %>/download/tbz">.tar.bz</a></li>');
tmpl_array.push(' <li id="download_archive"><a href="#/folders/<%= id %>/download/zip">.zip</a></li>');
tmpl_array.push(' <li><a href="#/folders/<%= id %>/download/tgz">.tar.gz</a></li>');
tmpl_array.push(' <li><a href="#/folders/<%= id %>/download/tbz">.tar.bz</a></li>');
tmpl_array.push(' <li><a href="#/folders/<%= id %>/download/zip">.zip</a></li>');
tmpl_array.push(' </ul>');
tmpl_array.push(' </div>');
tmpl_array.push(' <button data-toggle="tooltip" data-placement="top" title="Mark selected datasets deleted" id="toolbtn_bulk_delete" class="primary-button logged-dataset-manipulation" style="margin-left: 0.5em; display:none; " type="button"><span class="fa fa-times"></span> Delete</button>');
@@ -653,7 +896,7 @@ var FolderToolbarView = Backbone.View.extend({
return _.template(tmpl_array.join(''));
},
templateAddingDatasetsProgressBar : function (){
templateAddingDatasetsProgressBar: function (){
var tmpl_array = [];
tmpl_array.push('<div class="import_text">');
@@ -669,13 +912,13 @@ var FolderToolbarView = Backbone.View.extend({
return _.template(tmpl_array.join(''));
},
templateDeletingDatasetsProgressBar : function (){
templateDeletingDatasetsProgressBar: function (){
var tmpl_array = [];
tmpl_array.push('<div class="import_text">');
tmpl_array.push('</div>');
tmpl_array.push('<div class="progress">');
tmpl_array.push(' <div class="progress-bar progress-bar-delete" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 00%;">');
tmpl_array.push(' <div class="progress-bar progress-bar-import" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 00%;">');
tmpl_array.push(' <span class="completion_span">0% Complete</span>');
tmpl_array.push(' </div>');
tmpl_array.push('</div>');
@@ -684,7 +927,41 @@ var FolderToolbarView = Backbone.View.extend({
return _.template(tmpl_array.join(''));
},
templateAddFilesInModal : function (){
templateBrowserModal: function(){
var tmpl_array = [];
tmpl_array.push('<div id="file_browser_modal">');
tmpl_array.push('<div style="margin-bottom:1em;">');
tmpl_array.push('<label class="radio-inline">');
tmpl_array.push(' <input title="Switch to selecting files" type="radio" name="jstree-radio" value="jstree-disable-folders" checked="checked"> Files');
tmpl_array.push('</label>');
tmpl_array.push('<label class="radio-inline">');
tmpl_array.push(' <input title="Switch to selecting folders" type="radio" name="jstree-radio" value="jstree-disable-files"> Folders');
tmpl_array.push('</label>');
tmpl_array.push('<label class="checkbox-inline jstree-preserve-structure" style="display:none;">');
tmpl_array.push(' <input class="preserve-checkbox" type="checkbox" value="preserve_directory_structure">');
tmpl_array.push('Preserve directory structure');
tmpl_array.push(' </label>');
tmpl_array.push('<label class="checkbox-inline jstree-link-files" style="display:none;">');
tmpl_array.push(' <input class="link-checkbox" type="checkbox" value="link_files">');
tmpl_array.push('Link files instead of copying');
tmpl_array.push(' </label>');
tmpl_array.push('</div>');
tmpl_array.push('<div class="alert alert-info jstree-files-message">All files you select will be imported into the current folder.</div>');
tmpl_array.push('<div class="alert alert-info jstree-folders-message" style="display:none;">All files within the selected folders and their subfolders will be imported into the current folder.</div>');
tmpl_array.push('<div id="jstree_browser">');
tmpl_array.push('</div>');
tmpl_array.push('</div>');
return _.template(tmpl_array.join(''));
},
templateAddFilesFromHistory: function (){
var tmpl_array = [];
tmpl_array.push('<div id="add_files_modal">');
@@ -696,6 +973,7 @@ var FolderToolbarView = Backbone.View.extend({
tmpl_array.push(' <% }); %>');
tmpl_array.push('</select>');
tmpl_array.push('</div>');
tmpl_array.push('<br/>');
tmpl_array.push('<div id="selected_history_content">');
tmpl_array.push('</div>');
@@ -704,10 +982,10 @@ var FolderToolbarView = Backbone.View.extend({
return _.template(tmpl_array.join(''));
},
templateHistoryContents : function (){
templateHistoryContents: function (){
var tmpl_array = [];
tmpl_array.push('Choose the datasets to import:');
tmpl_array.push('<strong>Choose the datasets to import:</strong>');
tmpl_array.push('<ul>');
tmpl_array.push(' <% _.each(history_contents, function(history_item) { %>');
tmpl_array.push(' <li data-id="<%= _.escape(history_item.get("id")) %>">');
@@ -104,7 +104,7 @@ var LibraryView = Backbone.View.extend({
_serializeRoles : function(role_list){
var selected_roles = [];
for (var i = 0; i < role_list.length; i++) {
selected_roles.push(role_list[i] + ':' + role_list[i]);
selected_roles.push(role_list[i][1] + ':' + role_list[i][0]);
}
return selected_roles;
},
@@ -165,13 +165,14 @@ var LibraryView = Backbone.View.extend({
$(element.val().split(",")).each(function() {
var item = this.split(':');
data.push({
id: item[1],
id: item[0],
name: item[1]
});
});
callback(data);
},
initialData: init_data.join(','),
// initialData: init_data.join(','),
initialData: init_data,
dropdownCssClass: "bigdrop" // apply css that makes the dropdown taller
};
@@ -14,8 +14,7 @@ var LibraryRowView = Backbone.View.extend({
'click .cancel_library_btn' : 'cancel_library_modification',
'click .save_library_btn' : 'save_library_modification',
'click .delete_library_btn' : 'delete_library',
'click .undelete_library_btn' : 'undelete_library',
'click .permission_library_btn' : 'permissions_on_library'
'click .undelete_library_btn' : 'undelete_library'
},
edit_mode: false,
@@ -103,12 +102,6 @@ var LibraryRowView = Backbone.View.extend({
this.element_visibility_config = vis_config;
},
permissions_on_library: function(options){
this.options = _.extend(this.options, options);
$(".tooltip").remove();
},
/* User clicked the 'edit' button on row so we render a new row
that allows editing */
edit_button_clicked: function(){
@@ -270,10 +263,6 @@ var LibraryRowView = Backbone.View.extend({
tmpl_array.push(' <span data-toggle="tooltip" data-placement="top" title="Unrestricted library" style="color:grey;" class="fa fa-globe fa-lg public_lib_ico"> </span>');
tmpl_array.push(' <% }%>');
tmpl_array.push(' <button data-toggle="tooltip" data-placement="top" title="Modify <%- library.get("name") %>" class="primary-button btn-xs edit_library_btn" type="button" style="<% if(button_config.edit_library_btn === false) { print("display:none;") } %>"><span class="fa fa-pencil"></span></button>');
// tmpl_array.push(' <% if (content_item.get("can_manage")) { %><a href="#folders/<%- content_item.get("folder_id") %>/datasets/<%- content_item.id %>/permissions"><button data-toggle="tooltip" data-placement="top" class="primary-button btn-xs permissions-dataset-btn show_on_hover" title="Manage permissions" style="display:none;"><span class="fa fa-group"></span></button></a><% } %>');
tmpl_array.push(' <a href="#library/<%- library.get("id") %>/permissions"> <button data-toggle="tooltip" data-placement="top" title="Modify permissions" class="primary-button btn-xs permission_library_btn" type="button" style="<% if(button_config.permission_library_btn === false) { print("display:none;") } %>"><span class="fa fa-group"></span></button></a>');
tmpl_array.push(' <button data-toggle="tooltip" data-placement="top" title="Save changes" class="primary-button btn-xs save_library_btn" type="button" style="<% if(button_config.save_library_btn === false) { print("display:none;") } %>"><span class="fa fa-floppy-o"> Save</span></button>');
tmpl_array.push(' <button data-toggle="tooltip" data-placement="top" title="Discard changes" class="primary-button btn-xs cancel_library_btn" type="button" style="<% if(button_config.cancel_library_btn === false) { print("display:none;") } %>"><span class="fa fa-times"> Cancel</span></button>');
+12 -1
View File
@@ -192,6 +192,16 @@ define([], function() {
model : GalaxyHistory
});
// ============================================================================
// JSTREE MODEL
/** Represents folder structure parsable by the jstree component.
*
*/
var Jstree = Backbone.Model.extend({
urlRoot: '/api/ftp_files'
});
return {
Library: Library,
FolderAsModel : FolderAsModel,
@@ -203,7 +213,8 @@ return {
HistoryItem : HistoryItem,
HistoryContents : HistoryContents,
GalaxyHistory : GalaxyHistory,
GalaxyHistories : GalaxyHistories
GalaxyHistories : GalaxyHistories,
Jstree: Jstree
};
});
+2 -1
View File
@@ -14,7 +14,8 @@ module.exports = function(grunt) {
'masthead',
'library',
'trackster',
'circster'
'circster',
'jstree'
];
var _ = grunt.util._;
+195 -1
View File
@@ -1371,7 +1371,201 @@ button.toast-close-button{padding:0;cursor:pointer;background:transparent;border
.toast-error{background-color:#bd362f}
.toast-info{background-color:#2f96b4}
.toast-warning{background-color:#f89406}
@media all and (max-width:240px){#toast-container>div{padding:8px 8px 8px 50px;width:11em} #toast-container .toast-close-button{right:-0.2em;top:-0.2em}}@media all and (min-width:241px) and (max-width:480px){#toast-container>div{padding:8px 8px 8px 50px;width:18em} #toast-container .toast-close-button{right:-0.2em;top:-0.2em}}@media all and (min-width:481px) and (max-width:768px){#toast-container>div{padding:15px 15px 15px 50px;width:25em}}.unselectable{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}
@media all and (max-width:240px){#toast-container>div{padding:8px 8px 8px 50px;width:11em} #toast-container .toast-close-button{right:-0.2em;top:-0.2em}}@media all and (min-width:241px) and (max-width:480px){#toast-container>div{padding:8px 8px 8px 50px;width:18em} #toast-container .toast-close-button{right:-0.2em;top:-0.2em}}@media all and (min-width:481px) and (max-width:768px){#toast-container>div{padding:15px 15px 15px 50px;width:25em}}.jstree-node,.jstree-children,.jstree-container-ul{display:block;margin:0;padding:0;list-style-type:none;list-style-image:none}
.jstree-node{white-space:nowrap}
.jstree-anchor{display:inline-block;color:black;white-space:nowrap;padding:0 4px 0 1px;margin:0;vertical-align:top}
.jstree-anchor:focus{outline:0}
.jstree-anchor,.jstree-anchor:link,.jstree-anchor:visited,.jstree-anchor:hover,.jstree-anchor:active{text-decoration:none;color:inherit}
.jstree-icon{display:inline-block;text-decoration:none;margin:0;padding:0;vertical-align:top;text-align:center}
.jstree-icon:empty{display:inline-block;text-decoration:none;margin:0;padding:0;vertical-align:top;text-align:center}
.jstree-ocl{cursor:pointer}
.jstree-leaf>.jstree-ocl{cursor:default}
.jstree .jstree-open>.jstree-children{display:block}
.jstree .jstree-closed>.jstree-children,.jstree .jstree-leaf>.jstree-children{display:none}
.jstree-anchor>.jstree-themeicon{margin-right:2px}
.jstree-no-icons .jstree-themeicon,.jstree-anchor>.jstree-themeicon-hidden{display:none}
.jstree-rtl .jstree-anchor{padding:0 1px 0 4px}
.jstree-rtl .jstree-anchor>.jstree-themeicon{margin-left:2px;margin-right:0}
.jstree-rtl .jstree-node{margin-left:0}
.jstree-rtl .jstree-container-ul>.jstree-node{margin-right:0}
.jstree-wholerow-ul{position:relative;display:inline-block;min-width:100%}
.jstree-wholerow-ul .jstree-leaf>.jstree-ocl{cursor:pointer}
.jstree-wholerow-ul .jstree-anchor,.jstree-wholerow-ul .jstree-icon{position:relative}
.jstree-wholerow-ul .jstree-wholerow{width:100%;cursor:pointer;position:absolute;left:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
.vakata-context{display:none}
.vakata-context,.vakata-context ul{margin:0;padding:2px;position:absolute;background:#f5f5f5;border:1px solid #979797;-moz-box-shadow:5px 5px 4px -4px #666;-webkit-box-shadow:2px 2px 2px #999999;box-shadow:2px 2px 2px #999999}
.vakata-context ul{list-style:none;left:100%;margin-top:-2.7em;margin-left:-4px}
.vakata-context .vakata-context-right ul{left:auto;right:100%;margin-left:auto;margin-right:-4px}
.vakata-context li{list-style:none;display:inline}
.vakata-context li>a{display:block;padding:0 2em 0 2em;text-decoration:none;width:auto;color:black;white-space:nowrap;line-height:2.4em;-moz-text-shadow:1px 1px 0 white;-webkit-text-shadow:1px 1px 0 white;text-shadow:1px 1px 0 white;-moz-border-radius:1px;-webkit-border-radius:1px;border-radius:1px}
.vakata-context li>a:hover{position:relative;background-color:#e8eff7;-moz-box-shadow:0 0 2px #0a6aa1;-webkit-box-shadow:0 0 2px #0a6aa1;box-shadow:0 0 2px #0a6aa1}
.vakata-context li>a.vakata-context-parent{background-image:url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw==");background-position:right center;background-repeat:no-repeat}
.vakata-context li>a:focus{outline:0}
.vakata-context .vakata-context-hover>a{position:relative;background-color:#e8eff7;-moz-box-shadow:0 0 2px #0a6aa1;-webkit-box-shadow:0 0 2px #0a6aa1;box-shadow:0 0 2px #0a6aa1}
.vakata-context .vakata-context-separator>a,.vakata-context .vakata-context-separator>a:hover{background:white;border:0;border-top:1px solid #e2e3e3;height:1px;min-height:1px;max-height:1px;padding:0;margin:0 0 0 2.4em;border-left:1px solid #e0e0e0;-moz-text-shadow:0 0 0 transparent;-webkit-text-shadow:0 0 0 transparent;text-shadow:0 0 0 transparent;-moz-box-shadow:0 0 0 transparent;-webkit-box-shadow:0 0 0 transparent;box-shadow:0 0 0 transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}
.vakata-context .vakata-contextmenu-disabled a,.vakata-context .vakata-contextmenu-disabled a:hover{color:silver;background-color:transparent;border:0;box-shadow:0 0 0}
.vakata-context li>a>i{text-decoration:none;display:inline-block;width:2.4em;height:2.4em;background:transparent;margin:0 0 0 -2em;vertical-align:top;text-align:center;line-height:2.4em}
.vakata-context li>a>i:empty{width:2.4em;line-height:2.4em}
.vakata-context li>a .vakata-contextmenu-sep{display:inline-block;width:1px;height:2.4em;background:white;margin:0 0.5em 0 0;border-left:1px solid #e2e3e3}
.vakata-context .vakata-contextmenu-shortcut{font-size:0.8em;color:silver;opacity:0.5;display:none}
.vakata-context-rtl ul{left:auto;right:100%;margin-left:auto;margin-right:-4px}
.vakata-context-rtl li>a.vakata-context-parent{background-image:url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7");background-position:left center;background-repeat:no-repeat}
.vakata-context-rtl .vakata-context-separator>a{margin:0 2.4em 0 0;border-left:0;border-right:1px solid #e2e3e3}
.vakata-context-rtl .vakata-context-left ul{right:auto;left:100%;margin-left:-4px;margin-right:auto}
.vakata-context-rtl li>a>i{margin:0 -2em 0 0}
.vakata-context-rtl li>a .vakata-contextmenu-sep{margin:0 0 0 0.5em;border-left-color:white;background:#e2e3e3}
#jstree-marker{position:absolute;top:0;left:0;margin:-5px 0 0 0;padding:0;border-right:0;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid;width:0;height:0;font-size:0;line-height:0}
#jstree-dnd{line-height:16px;margin:0;padding:4px}
#jstree-dnd .jstree-icon,#jstree-dnd .jstree-copy{display:inline-block;text-decoration:none;margin:0 2px 0 0;padding:0;width:16px;height:16px}
#jstree-dnd .jstree-ok{background:green}
#jstree-dnd .jstree-er{background:red}
#jstree-dnd .jstree-copy{margin:0 2px 0 2px}
.jstree-default .jstree-node,.jstree-default .jstree-icon{background-repeat:no-repeat;background-color:transparent}
.jstree-default .jstree-anchor,.jstree-default .jstree-wholerow{transition:background-color .15s,box-shadow .15s}
.jstree-default .jstree-hovered{background:#e7f4f9;border-radius:2px;box-shadow:inset 0 0 1px #ccc}
.jstree-default .jstree-clicked{background:#beebff;border-radius:2px;box-shadow:inset 0 0 1px #999}
.jstree-default .jstree-no-icons .jstree-anchor>.jstree-themeicon{display:none}
.jstree-default .jstree-disabled{background:transparent;color:#666}
.jstree-default .jstree-disabled.jstree-hovered{background:transparent;box-shadow:none}
.jstree-default .jstree-disabled.jstree-clicked{background:#efefef}
.jstree-default .jstree-disabled>.jstree-icon{opacity:0.8;filter:url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%);}
.jstree-default .jstree-search{font-style:italic;color:#8b0000;font-weight:bold}
.jstree-default .jstree-no-checkboxes .jstree-checkbox{display:none !important}
.jstree-default.jstree-checkbox-no-clicked .jstree-clicked{background:transparent;box-shadow:none}
.jstree-default.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered{background:#e7f4f9}
.jstree-default.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked{background:transparent}
.jstree-default.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered{background:#e7f4f9}
#jstree-dnd.jstree-default .jstree-ok,#jstree-dnd.jstree-default .jstree-er{background-image:url("../images/jstree/32px.png");background-repeat:no-repeat;background-color:transparent}
#jstree-dnd.jstree-default i{background:transparent;width:16px;height:16px}
#jstree-dnd.jstree-default .jstree-ok{background-position:-9px -71px}
#jstree-dnd.jstree-default .jstree-er{background-position:-39px -71px}
.jstree-default>.jstree-striped{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==") left top repeat}
.jstree-default>.jstree-wholerow-ul .jstree-hovered,.jstree-default>.jstree-wholerow-ul .jstree-clicked{background:transparent;box-shadow:none;border-radius:0}
.jstree-default .jstree-wholerow{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
.jstree-default .jstree-wholerow-hovered{background:#e7f4f9}
.jstree-default .jstree-wholerow-clicked{background:#beebff;background:-moz-linear-gradient(top, #beebff 0, #a8e4ff 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0, #beebff), color-stop(100%, #a8e4ff));background:-webkit-linear-gradient(top, #beebff 0, #a8e4ff 100%);background:-o-linear-gradient(top, #beebff 0, #a8e4ff 100%);background:-ms-linear-gradient(top, #beebff 0, #a8e4ff 100%);background:linear-gradient(to bottom, #beebff 0, #a8e4ff 100%);}
.jstree-default .jstree-node{min-height:24px;line-height:24px;margin-left:24px;min-width:24px}
.jstree-default .jstree-anchor{line-height:24px;height:24px}
.jstree-default .jstree-icon{width:24px;height:24px;line-height:24px}
.jstree-default .jstree-icon:empty{width:24px;height:24px;line-height:24px}
.jstree-default.jstree-rtl .jstree-node{margin-right:24px}
.jstree-default .jstree-wholerow{height:24px}
.jstree-default .jstree-node,.jstree-default .jstree-icon{background-image:url("../images/jstree/32px.png")}
.jstree-default .jstree-node{background-position:-292px -4px;background-repeat:repeat-y}
.jstree-default .jstree-last{background:transparent}
.jstree-default .jstree-open>.jstree-ocl{background-position:-132px -4px}
.jstree-default .jstree-closed>.jstree-ocl{background-position:-100px -4px}
.jstree-default .jstree-leaf>.jstree-ocl{background-position:-68px -4px}
.jstree-default .jstree-themeicon{background-position:-260px -4px}
.jstree-default>.jstree-no-dots .jstree-node,.jstree-default>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}
.jstree-default>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-36px -4px}
.jstree-default>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-4px -4px}
.jstree-default .jstree-disabled{background:transparent}
.jstree-default .jstree-disabled.jstree-hovered{background:transparent}
.jstree-default .jstree-disabled.jstree-clicked{background:#efefef}
.jstree-default .jstree-checkbox{background-position:-164px -4px}
.jstree-default .jstree-checkbox:hover{background-position:-164px -36px}
.jstree-default.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default .jstree-checked>.jstree-checkbox{background-position:-228px -4px}
.jstree-default.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default .jstree-checked>.jstree-checkbox:hover{background-position:-228px -36px}
.jstree-default .jstree-anchor>.jstree-undetermined{background-position:-196px -4px}
.jstree-default .jstree-anchor>.jstree-undetermined:hover{background-position:-196px -36px}
.jstree-default>.jstree-striped{background-size:auto 48px}
.jstree-default.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");background-position:100% 1px;background-repeat:repeat-y}
.jstree-default.jstree-rtl .jstree-last{background:transparent}
.jstree-default.jstree-rtl .jstree-open>.jstree-ocl{background-position:-132px -36px}
.jstree-default.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-100px -36px}
.jstree-default.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-68px -36px}
.jstree-default.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}
.jstree-default.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-36px -36px}
.jstree-default.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-4px -36px}
.jstree-default .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}
.jstree-default>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url("../images/jstree/throbber.gif") center center no-repeat}
.jstree-default .jstree-file{background:url("../images/jstree/32px.png") -100px -68px no-repeat}
.jstree-default .jstree-folder{background:url("../images/jstree/32px.png") -260px -4px no-repeat}
.jstree-default.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==")}
.jstree-default.jstree-rtl .jstree-last{background:transparent}
.jstree-default-small .jstree-node{min-height:18px;line-height:18px;margin-left:18px;min-width:18px}
.jstree-default-small .jstree-anchor{line-height:18px;height:18px}
.jstree-default-small .jstree-icon{width:18px;height:18px;line-height:18px}
.jstree-default-small .jstree-icon:empty{width:18px;height:18px;line-height:18px}
.jstree-default-small.jstree-rtl .jstree-node{margin-right:18px}
.jstree-default-small .jstree-wholerow{height:18px}
.jstree-default-small .jstree-node,.jstree-default-small .jstree-icon{background-image:url("../images/jstree/32px.png")}
.jstree-default-small .jstree-node{background-position:-295px -7px;background-repeat:repeat-y}
.jstree-default-small .jstree-last{background:transparent}
.jstree-default-small .jstree-open>.jstree-ocl{background-position:-135px -7px}
.jstree-default-small .jstree-closed>.jstree-ocl{background-position:-103px -7px}
.jstree-default-small .jstree-leaf>.jstree-ocl{background-position:-71px -7px}
.jstree-default-small .jstree-themeicon{background-position:-263px -7px}
.jstree-default-small>.jstree-no-dots .jstree-node,.jstree-default-small>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}
.jstree-default-small>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-39px -7px}
.jstree-default-small>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-7px -7px}
.jstree-default-small .jstree-disabled{background:transparent}
.jstree-default-small .jstree-disabled.jstree-hovered{background:transparent}
.jstree-default-small .jstree-disabled.jstree-clicked{background:#efefef}
.jstree-default-small .jstree-checkbox{background-position:-167px -7px}
.jstree-default-small .jstree-checkbox:hover{background-position:-167px -39px}
.jstree-default-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-small .jstree-checked>.jstree-checkbox{background-position:-231px -7px}
.jstree-default-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-small .jstree-checked>.jstree-checkbox:hover{background-position:-231px -39px}
.jstree-default-small .jstree-anchor>.jstree-undetermined{background-position:-199px -7px}
.jstree-default-small .jstree-anchor>.jstree-undetermined:hover{background-position:-199px -39px}
.jstree-default-small>.jstree-striped{background-size:auto 36px}
.jstree-default-small.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");background-position:100% 1px;background-repeat:repeat-y}
.jstree-default-small.jstree-rtl .jstree-last{background:transparent}
.jstree-default-small.jstree-rtl .jstree-open>.jstree-ocl{background-position:-135px -39px}
.jstree-default-small.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-103px -39px}
.jstree-default-small.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-71px -39px}
.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}
.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-39px -39px}
.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-7px -39px}
.jstree-default-small .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}
.jstree-default-small>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url("../images/jstree/throbber.gif") center center no-repeat}
.jstree-default-small .jstree-file{background:url("../images/jstree/32px.png") -103px -71px no-repeat}
.jstree-default-small .jstree-folder{background:url("../images/jstree/32px.png") -263px -7px no-repeat}
.jstree-default-small.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg==")}
.jstree-default-small.jstree-rtl .jstree-last{background:transparent}
.jstree-default-large .jstree-node{min-height:32px;line-height:32px;margin-left:32px;min-width:32px}
.jstree-default-large .jstree-anchor{line-height:32px;height:32px}
.jstree-default-large .jstree-icon{width:32px;height:32px;line-height:32px}
.jstree-default-large .jstree-icon:empty{width:32px;height:32px;line-height:32px}
.jstree-default-large.jstree-rtl .jstree-node{margin-right:32px}
.jstree-default-large .jstree-wholerow{height:32px}
.jstree-default-large .jstree-node,.jstree-default-large .jstree-icon{background-image:url("../images/jstree/32px.png")}
.jstree-default-large .jstree-node{background-position:-288px 0;background-repeat:repeat-y}
.jstree-default-large .jstree-last{background:transparent}
.jstree-default-large .jstree-open>.jstree-ocl{background-position:-128px 0}
.jstree-default-large .jstree-closed>.jstree-ocl{background-position:-96px 0}
.jstree-default-large .jstree-leaf>.jstree-ocl{background-position:-64px 0}
.jstree-default-large .jstree-themeicon{background-position:-256px 0}
.jstree-default-large>.jstree-no-dots .jstree-node,.jstree-default-large>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}
.jstree-default-large>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-32px 0}
.jstree-default-large>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:0px 0px}
.jstree-default-large .jstree-disabled{background:transparent}
.jstree-default-large .jstree-disabled.jstree-hovered{background:transparent}
.jstree-default-large .jstree-disabled.jstree-clicked{background:#efefef}
.jstree-default-large .jstree-checkbox{background-position:-160px 0}
.jstree-default-large .jstree-checkbox:hover{background-position:-160px -32px}
.jstree-default-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-large .jstree-checked>.jstree-checkbox{background-position:-224px 0}
.jstree-default-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-large .jstree-checked>.jstree-checkbox:hover{background-position:-224px -32px}
.jstree-default-large .jstree-anchor>.jstree-undetermined{background-position:-192px 0}
.jstree-default-large .jstree-anchor>.jstree-undetermined:hover{background-position:-192px -32px}
.jstree-default-large>.jstree-striped{background-size:auto 64px}
.jstree-default-large.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");background-position:100% 1px;background-repeat:repeat-y}
.jstree-default-large.jstree-rtl .jstree-last{background:transparent}
.jstree-default-large.jstree-rtl .jstree-open>.jstree-ocl{background-position:-128px -32px}
.jstree-default-large.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-96px -32px}
.jstree-default-large.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-64px -32px}
.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}
.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-32px -32px}
.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:0 -32px}
.jstree-default-large .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}
.jstree-default-large>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url("../images/jstree/throbber.gif") center center no-repeat}
.jstree-default-large .jstree-file{background:url("../images/jstree/32px.png") -96px -64px no-repeat}
.jstree-default-large .jstree-folder{background:url("../images/jstree/32px.png") -256px 0 no-repeat}
.jstree-default-large.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg==")}
.jstree-default-large.jstree-rtl .jstree-last{background:transparent}
@media (max-width:768px){#jstree-dnd.jstree-dnd-responsive{line-height:40px;font-weight:bold;font-size:1.1em;text-shadow:1px 1px white} #jstree-dnd.jstree-dnd-responsive>i{background:transparent;width:40px;height:40px} #jstree-dnd.jstree-dnd-responsive>.jstree-ok{background-image:url("../images/jstree/40px.png");background-position:0 -200px;background-size:120px 240px} #jstree-dnd.jstree-dnd-responsive>.jstree-er{background-image:url("../images/jstree/40px.png");background-position:-40px -200px;background-size:120px 240px} #jstree-marker.jstree-dnd-responsive{border-left-width:10px;border-top-width:10px;border-bottom-width:10px;margin-top:-10px}}@media (max-width:768px){.jstree-default-responsive{} .jstree-default-responsive .jstree-icon{background-image:url("../images/jstree/40px.png")} .jstree-default-responsive .jstree-node,.jstree-default-responsive .jstree-leaf>.jstree-ocl{background:transparent} .jstree-default-responsive .jstree-node{min-height:40px;line-height:40px;margin-left:40px;min-width:40px;white-space:nowrap} .jstree-default-responsive .jstree-anchor{line-height:40px;height:40px} .jstree-default-responsive .jstree-icon,.jstree-default-responsive .jstree-icon:empty{width:40px;height:40px;line-height:40px} .jstree-default-responsive>.jstree-container-ul>.jstree-node{margin-left:0} .jstree-default-responsive.jstree-rtl .jstree-node{margin-left:0;margin-right:40px} .jstree-default-responsive.jstree-rtl .jstree-container-ul>.jstree-node{margin-right:0} .jstree-default-responsive .jstree-ocl,.jstree-default-responsive .jstree-themeicon,.jstree-default-responsive .jstree-checkbox{background-size:120px 240px} .jstree-default-responsive .jstree-leaf>.jstree-ocl{background:transparent} .jstree-default-responsive .jstree-open>.jstree-ocl{background-position:0 0px !important} .jstree-default-responsive .jstree-closed>.jstree-ocl{background-position:0 -40px !important} .jstree-default-responsive.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-40px 0 !important} .jstree-default-responsive .jstree-themeicon{background-position:-40px -40px} .jstree-default-responsive .jstree-checkbox,.jstree-default-responsive .jstree-checkbox:hover{background-position:-40px -80px} .jstree-default-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-responsive .jstree-checked>.jstree-checkbox,.jstree-default-responsive .jstree-checked>.jstree-checkbox:hover{background-position:0 -80px} .jstree-default-responsive .jstree-anchor>.jstree-undetermined,.jstree-default-responsive .jstree-anchor>.jstree-undetermined:hover{background-position:0 -120px} .jstree-default-responsive .jstree-anchor{font-weight:bold;font-size:1.1em;text-shadow:1px 1px white} .jstree-default-responsive>.jstree-striped{background:transparent} .jstree-default-responsive .jstree-wholerow{border-top:1px solid rgba(255,255,255,0.7);border-bottom:1px solid rgba(64,64,64,0.2);background:#ebebeb;height:40px} .jstree-default-responsive .jstree-wholerow-hovered{background:#e7f4f9} .jstree-default-responsive .jstree-wholerow-clicked{background:#beebff} .jstree-default-responsive .jstree-children .jstree-last>.jstree-wholerow{box-shadow:inset 0 -6px 3px -5px #666} .jstree-default-responsive .jstree-children .jstree-open>.jstree-wholerow{box-shadow:inset 0 6px 3px -5px #666;border-top:0} .jstree-default-responsive .jstree-children .jstree-open+.jstree-open{box-shadow:none} .jstree-default-responsive .jstree-node,.jstree-default-responsive .jstree-icon,.jstree-default-responsive .jstree-node>.jstree-ocl,.jstree-default-responsive .jstree-themeicon,.jstree-default-responsive .jstree-checkbox{background-image:url("../images/jstree/40px.png");background-size:120px 240px} .jstree-default-responsive .jstree-node{background-position:-80px 0;background-repeat:repeat-y} .jstree-default-responsive .jstree-last{background:transparent} .jstree-default-responsive .jstree-leaf>.jstree-ocl{background-position:-40px -120px} .jstree-default-responsive .jstree-last>.jstree-ocl{background-position:-40px -160px} .jstree-default-responsive .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0} .jstree-default-responsive .jstree-file{background:url("../images/jstree/40px.png") 0 -160px no-repeat;background-size:120px 240px} .jstree-default-responsive .jstree-folder{background:url("../images/jstree/40px.png") -40px -40px no-repeat;background-size:120px 240px}}.jstree-default>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}
.unselectable{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}
.parent-width{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:100%;*width:90%}
.clear:before,.clear:after{content:" ";display:table;}
.clear:after{clear:both}
+1
View File
@@ -26,6 +26,7 @@
@import "ui.less";
@import "library.less";
@import "toastr.less";
@import "jstree.less";
// Mixins
+989
View File
@@ -0,0 +1,989 @@
/* jsTree default theme */
.jstree-node,
.jstree-children,
.jstree-container-ul {
display: block;
margin: 0;
padding: 0;
list-style-type: none;
list-style-image: none;
}
.jstree-node {
white-space: nowrap;
}
.jstree-anchor {
display: inline-block;
color: black;
white-space: nowrap;
padding: 0 4px 0 1px;
margin: 0;
vertical-align: top;
}
.jstree-anchor:focus {
outline: 0;
}
.jstree-anchor,
.jstree-anchor:link,
.jstree-anchor:visited,
.jstree-anchor:hover,
.jstree-anchor:active {
text-decoration: none;
color: inherit;
}
.jstree-icon {
display: inline-block;
text-decoration: none;
margin: 0;
padding: 0;
vertical-align: top;
text-align: center;
}
.jstree-icon:empty {
display: inline-block;
text-decoration: none;
margin: 0;
padding: 0;
vertical-align: top;
text-align: center;
}
.jstree-ocl {
cursor: pointer;
}
.jstree-leaf > .jstree-ocl {
cursor: default;
}
.jstree .jstree-open > .jstree-children {
display: block;
}
.jstree .jstree-closed > .jstree-children,
.jstree .jstree-leaf > .jstree-children {
display: none;
}
.jstree-anchor > .jstree-themeicon {
margin-right: 2px;
}
.jstree-no-icons .jstree-themeicon,
.jstree-anchor > .jstree-themeicon-hidden {
display: none;
}
.jstree-rtl .jstree-anchor {
padding: 0 1px 0 4px;
}
.jstree-rtl .jstree-anchor > .jstree-themeicon {
margin-left: 2px;
margin-right: 0;
}
.jstree-rtl .jstree-node {
margin-left: 0;
}
.jstree-rtl .jstree-container-ul > .jstree-node {
margin-right: 0;
}
.jstree-wholerow-ul {
position: relative;
display: inline-block;
min-width: 100%;
}
.jstree-wholerow-ul .jstree-leaf > .jstree-ocl {
cursor: pointer;
}
.jstree-wholerow-ul .jstree-anchor,
.jstree-wholerow-ul .jstree-icon {
position: relative;
}
.jstree-wholerow-ul .jstree-wholerow {
width: 100%;
cursor: pointer;
position: absolute;
left: 0;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.vakata-context {
display: none;
}
.vakata-context,
.vakata-context ul {
margin: 0;
padding: 2px;
position: absolute;
background: #f5f5f5;
border: 1px solid #979797;
-moz-box-shadow: 5px 5px 4px -4px #666666;
-webkit-box-shadow: 2px 2px 2px #999999;
box-shadow: 2px 2px 2px #999999;
}
.vakata-context ul {
list-style: none;
left: 100%;
margin-top: -2.7em;
margin-left: -4px;
}
.vakata-context .vakata-context-right ul {
left: auto;
right: 100%;
margin-left: auto;
margin-right: -4px;
}
.vakata-context li {
list-style: none;
display: inline;
}
.vakata-context li > a {
display: block;
padding: 0 2em 0 2em;
text-decoration: none;
width: auto;
color: black;
white-space: nowrap;
line-height: 2.4em;
-moz-text-shadow: 1px 1px 0 white;
-webkit-text-shadow: 1px 1px 0 white;
text-shadow: 1px 1px 0 white;
-moz-border-radius: 1px;
-webkit-border-radius: 1px;
border-radius: 1px;
}
.vakata-context li > a:hover {
position: relative;
background-color: #e8eff7;
-moz-box-shadow: 0 0 2px #0a6aa1;
-webkit-box-shadow: 0 0 2px #0a6aa1;
box-shadow: 0 0 2px #0a6aa1;
}
.vakata-context li > a.vakata-context-parent {
background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw==");
background-position: right center;
background-repeat: no-repeat;
}
.vakata-context li > a:focus {
outline: 0;
}
.vakata-context .vakata-context-hover > a {
position: relative;
background-color: #e8eff7;
-moz-box-shadow: 0 0 2px #0a6aa1;
-webkit-box-shadow: 0 0 2px #0a6aa1;
box-shadow: 0 0 2px #0a6aa1;
}
.vakata-context .vakata-context-separator > a,
.vakata-context .vakata-context-separator > a:hover {
background: white;
border: 0;
border-top: 1px solid #e2e3e3;
height: 1px;
min-height: 1px;
max-height: 1px;
padding: 0;
margin: 0 0 0 2.4em;
border-left: 1px solid #e0e0e0;
-moz-text-shadow: 0 0 0 transparent;
-webkit-text-shadow: 0 0 0 transparent;
text-shadow: 0 0 0 transparent;
-moz-box-shadow: 0 0 0 transparent;
-webkit-box-shadow: 0 0 0 transparent;
box-shadow: 0 0 0 transparent;
-moz-border-radius: 0;
-webkit-border-radius: 0;
border-radius: 0;
}
.vakata-context .vakata-contextmenu-disabled a,
.vakata-context .vakata-contextmenu-disabled a:hover {
color: silver;
background-color: transparent;
border: 0;
box-shadow: 0 0 0;
}
.vakata-context li > a > i {
text-decoration: none;
display: inline-block;
width: 2.4em;
height: 2.4em;
background: transparent;
margin: 0 0 0 -2em;
vertical-align: top;
text-align: center;
line-height: 2.4em;
}
.vakata-context li > a > i:empty {
width: 2.4em;
line-height: 2.4em;
}
.vakata-context li > a .vakata-contextmenu-sep {
display: inline-block;
width: 1px;
height: 2.4em;
background: white;
margin: 0 0.5em 0 0;
border-left: 1px solid #e2e3e3;
}
.vakata-context .vakata-contextmenu-shortcut {
font-size: 0.8em;
color: silver;
opacity: 0.5;
display: none;
}
.vakata-context-rtl ul {
left: auto;
right: 100%;
margin-left: auto;
margin-right: -4px;
}
.vakata-context-rtl li > a.vakata-context-parent {
background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7");
background-position: left center;
background-repeat: no-repeat;
}
.vakata-context-rtl .vakata-context-separator > a {
margin: 0 2.4em 0 0;
border-left: 0;
border-right: 1px solid #e2e3e3;
}
.vakata-context-rtl .vakata-context-left ul {
right: auto;
left: 100%;
margin-left: -4px;
margin-right: auto;
}
.vakata-context-rtl li > a > i {
margin: 0 -2em 0 0;
}
.vakata-context-rtl li > a .vakata-contextmenu-sep {
margin: 0 0 0 0.5em;
border-left-color: white;
background: #e2e3e3;
}
#jstree-marker {
position: absolute;
top: 0;
left: 0;
margin: -5px 0 0 0;
padding: 0;
border-right: 0;
border-top: 5px solid transparent;
border-bottom: 5px solid transparent;
border-left: 5px solid;
width: 0;
height: 0;
font-size: 0;
line-height: 0;
}
#jstree-dnd {
line-height: 16px;
margin: 0;
padding: 4px;
}
#jstree-dnd .jstree-icon,
#jstree-dnd .jstree-copy {
display: inline-block;
text-decoration: none;
margin: 0 2px 0 0;
padding: 0;
width: 16px;
height: 16px;
}
#jstree-dnd .jstree-ok {
background: green;
}
#jstree-dnd .jstree-er {
background: red;
}
#jstree-dnd .jstree-copy {
margin: 0 2px 0 2px;
}
.jstree-default .jstree-node,
.jstree-default .jstree-icon {
background-repeat: no-repeat;
background-color: transparent;
}
.jstree-default .jstree-anchor,
.jstree-default .jstree-wholerow {
transition: background-color 0.15s, box-shadow 0.15s;
}
.jstree-default .jstree-hovered {
background: #e7f4f9;
border-radius: 2px;
box-shadow: inset 0 0 1px #ccc;
}
.jstree-default .jstree-clicked {
background: #beebff;
border-radius: 2px;
box-shadow: inset 0 0 1px #999;
}
.jstree-default .jstree-no-icons .jstree-anchor > .jstree-themeicon {
display: none;
}
.jstree-default .jstree-disabled {
background: transparent;
color: #666;
}
.jstree-default .jstree-disabled.jstree-hovered {
background: transparent;
box-shadow: none;
}
.jstree-default .jstree-disabled.jstree-clicked {
background: #efefef;
}
.jstree-default .jstree-disabled > .jstree-icon {
opacity: 0.8;
filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");
/* Firefox 10+ */
filter: gray;
/* IE6-9 */
-webkit-filter: grayscale(100%);
/* Chrome 19+ & Safari 6+ */
}
.jstree-default .jstree-search {
font-style: italic;
color: #8b0000;
font-weight: bold;
}
.jstree-default .jstree-no-checkboxes .jstree-checkbox {
display: none !important;
}
.jstree-default.jstree-checkbox-no-clicked .jstree-clicked {
background: transparent;
box-shadow: none;
}
.jstree-default.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered {
background: #e7f4f9;
}
.jstree-default.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked {
background: transparent;
}
.jstree-default.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered {
background: #e7f4f9;
}
#jstree-dnd.jstree-default .jstree-ok,
#jstree-dnd.jstree-default .jstree-er {
background-image: url("../images/jstree/32px.png");
background-repeat: no-repeat;
background-color: transparent;
}
#jstree-dnd.jstree-default i {
background: transparent;
width: 16px;
height: 16px;
}
#jstree-dnd.jstree-default .jstree-ok {
background-position: -9px -71px;
}
#jstree-dnd.jstree-default .jstree-er {
background-position: -39px -71px;
}
.jstree-default > .jstree-striped {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==") left top repeat;
}
.jstree-default > .jstree-wholerow-ul .jstree-hovered,
.jstree-default > .jstree-wholerow-ul .jstree-clicked {
background: transparent;
box-shadow: none;
border-radius: 0;
}
.jstree-default .jstree-wholerow {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.jstree-default .jstree-wholerow-hovered {
background: #e7f4f9;
}
.jstree-default .jstree-wholerow-clicked {
background: #beebff;
background: -moz-linear-gradient(top, #beebff 0%, #a8e4ff 100%);
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #beebff), color-stop(100%, #a8e4ff));
background: -webkit-linear-gradient(top, #beebff 0%, #a8e4ff 100%);
background: -o-linear-gradient(top, #beebff 0%, #a8e4ff 100%);
background: -ms-linear-gradient(top, #beebff 0%, #a8e4ff 100%);
background: linear-gradient(to bottom, #beebff 0%, #a8e4ff 100%);
/*filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='@color1', endColorstr='@color2',GradientType=0 );*/
}
.jstree-default .jstree-node {
min-height: 24px;
line-height: 24px;
margin-left: 24px;
min-width: 24px;
}
.jstree-default .jstree-anchor {
line-height: 24px;
height: 24px;
}
.jstree-default .jstree-icon {
width: 24px;
height: 24px;
line-height: 24px;
}
.jstree-default .jstree-icon:empty {
width: 24px;
height: 24px;
line-height: 24px;
}
.jstree-default.jstree-rtl .jstree-node {
margin-right: 24px;
}
.jstree-default .jstree-wholerow {
height: 24px;
}
.jstree-default .jstree-node,
.jstree-default .jstree-icon {
background-image: url("../images/jstree/32px.png");
}
.jstree-default .jstree-node {
background-position: -292px -4px;
background-repeat: repeat-y;
}
.jstree-default .jstree-last {
background: transparent;
}
.jstree-default .jstree-open > .jstree-ocl {
background-position: -132px -4px;
}
.jstree-default .jstree-closed > .jstree-ocl {
background-position: -100px -4px;
}
.jstree-default .jstree-leaf > .jstree-ocl {
background-position: -68px -4px;
}
.jstree-default .jstree-themeicon {
background-position: -260px -4px;
}
.jstree-default > .jstree-no-dots .jstree-node,
.jstree-default > .jstree-no-dots .jstree-leaf > .jstree-ocl {
background: transparent;
}
.jstree-default > .jstree-no-dots .jstree-open > .jstree-ocl {
background-position: -36px -4px;
}
.jstree-default > .jstree-no-dots .jstree-closed > .jstree-ocl {
background-position: -4px -4px;
}
.jstree-default .jstree-disabled {
background: transparent;
}
.jstree-default .jstree-disabled.jstree-hovered {
background: transparent;
}
.jstree-default .jstree-disabled.jstree-clicked {
background: #efefef;
}
.jstree-default .jstree-checkbox {
background-position: -164px -4px;
}
.jstree-default .jstree-checkbox:hover {
background-position: -164px -36px;
}
.jstree-default.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox,
.jstree-default .jstree-checked > .jstree-checkbox {
background-position: -228px -4px;
}
.jstree-default.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover,
.jstree-default .jstree-checked > .jstree-checkbox:hover {
background-position: -228px -36px;
}
.jstree-default .jstree-anchor > .jstree-undetermined {
background-position: -196px -4px;
}
.jstree-default .jstree-anchor > .jstree-undetermined:hover {
background-position: -196px -36px;
}
.jstree-default > .jstree-striped {
background-size: auto 48px;
}
.jstree-default.jstree-rtl .jstree-node {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
background-position: 100% 1px;
background-repeat: repeat-y;
}
.jstree-default.jstree-rtl .jstree-last {
background: transparent;
}
.jstree-default.jstree-rtl .jstree-open > .jstree-ocl {
background-position: -132px -36px;
}
.jstree-default.jstree-rtl .jstree-closed > .jstree-ocl {
background-position: -100px -36px;
}
.jstree-default.jstree-rtl .jstree-leaf > .jstree-ocl {
background-position: -68px -36px;
}
.jstree-default.jstree-rtl > .jstree-no-dots .jstree-node,
.jstree-default.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl {
background: transparent;
}
.jstree-default.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl {
background-position: -36px -36px;
}
.jstree-default.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl {
background-position: -4px -36px;
}
.jstree-default .jstree-themeicon-custom {
background-color: transparent;
background-image: none;
background-position: 0 0;
}
.jstree-default > .jstree-container-ul .jstree-loading > .jstree-ocl {
background: url("../images/jstree/throbber.gif") center center no-repeat;
}
.jstree-default .jstree-file {
background: url("../images/jstree/32px.png") -100px -68px no-repeat;
}
.jstree-default .jstree-folder {
background: url("../images/jstree/32px.png") -260px -4px no-repeat;
}
.jstree-default.jstree-rtl .jstree-node {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
}
.jstree-default.jstree-rtl .jstree-last {
background: transparent;
}
.jstree-default-small .jstree-node {
min-height: 18px;
line-height: 18px;
margin-left: 18px;
min-width: 18px;
}
.jstree-default-small .jstree-anchor {
line-height: 18px;
height: 18px;
}
.jstree-default-small .jstree-icon {
width: 18px;
height: 18px;
line-height: 18px;
}
.jstree-default-small .jstree-icon:empty {
width: 18px;
height: 18px;
line-height: 18px;
}
.jstree-default-small.jstree-rtl .jstree-node {
margin-right: 18px;
}
.jstree-default-small .jstree-wholerow {
height: 18px;
}
.jstree-default-small .jstree-node,
.jstree-default-small .jstree-icon {
background-image: url("../images/jstree/32px.png");
}
.jstree-default-small .jstree-node {
background-position: -295px -7px;
background-repeat: repeat-y;
}
.jstree-default-small .jstree-last {
background: transparent;
}
.jstree-default-small .jstree-open > .jstree-ocl {
background-position: -135px -7px;
}
.jstree-default-small .jstree-closed > .jstree-ocl {
background-position: -103px -7px;
}
.jstree-default-small .jstree-leaf > .jstree-ocl {
background-position: -71px -7px;
}
.jstree-default-small .jstree-themeicon {
background-position: -263px -7px;
}
.jstree-default-small > .jstree-no-dots .jstree-node,
.jstree-default-small > .jstree-no-dots .jstree-leaf > .jstree-ocl {
background: transparent;
}
.jstree-default-small > .jstree-no-dots .jstree-open > .jstree-ocl {
background-position: -39px -7px;
}
.jstree-default-small > .jstree-no-dots .jstree-closed > .jstree-ocl {
background-position: -7px -7px;
}
.jstree-default-small .jstree-disabled {
background: transparent;
}
.jstree-default-small .jstree-disabled.jstree-hovered {
background: transparent;
}
.jstree-default-small .jstree-disabled.jstree-clicked {
background: #efefef;
}
.jstree-default-small .jstree-checkbox {
background-position: -167px -7px;
}
.jstree-default-small .jstree-checkbox:hover {
background-position: -167px -39px;
}
.jstree-default-small.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox,
.jstree-default-small .jstree-checked > .jstree-checkbox {
background-position: -231px -7px;
}
.jstree-default-small.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover,
.jstree-default-small .jstree-checked > .jstree-checkbox:hover {
background-position: -231px -39px;
}
.jstree-default-small .jstree-anchor > .jstree-undetermined {
background-position: -199px -7px;
}
.jstree-default-small .jstree-anchor > .jstree-undetermined:hover {
background-position: -199px -39px;
}
.jstree-default-small > .jstree-striped {
background-size: auto 36px;
}
.jstree-default-small.jstree-rtl .jstree-node {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
background-position: 100% 1px;
background-repeat: repeat-y;
}
.jstree-default-small.jstree-rtl .jstree-last {
background: transparent;
}
.jstree-default-small.jstree-rtl .jstree-open > .jstree-ocl {
background-position: -135px -39px;
}
.jstree-default-small.jstree-rtl .jstree-closed > .jstree-ocl {
background-position: -103px -39px;
}
.jstree-default-small.jstree-rtl .jstree-leaf > .jstree-ocl {
background-position: -71px -39px;
}
.jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-node,
.jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl {
background: transparent;
}
.jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl {
background-position: -39px -39px;
}
.jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl {
background-position: -7px -39px;
}
.jstree-default-small .jstree-themeicon-custom {
background-color: transparent;
background-image: none;
background-position: 0 0;
}
.jstree-default-small > .jstree-container-ul .jstree-loading > .jstree-ocl {
background: url("../images/jstree/throbber.gif") center center no-repeat;
}
.jstree-default-small .jstree-file {
background: url("../images/jstree/32px.png") -103px -71px no-repeat;
}
.jstree-default-small .jstree-folder {
background: url("../images/jstree/32px.png") -263px -7px no-repeat;
}
.jstree-default-small.jstree-rtl .jstree-node {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg==");
}
.jstree-default-small.jstree-rtl .jstree-last {
background: transparent;
}
.jstree-default-large .jstree-node {
min-height: 32px;
line-height: 32px;
margin-left: 32px;
min-width: 32px;
}
.jstree-default-large .jstree-anchor {
line-height: 32px;
height: 32px;
}
.jstree-default-large .jstree-icon {
width: 32px;
height: 32px;
line-height: 32px;
}
.jstree-default-large .jstree-icon:empty {
width: 32px;
height: 32px;
line-height: 32px;
}
.jstree-default-large.jstree-rtl .jstree-node {
margin-right: 32px;
}
.jstree-default-large .jstree-wholerow {
height: 32px;
}
.jstree-default-large .jstree-node,
.jstree-default-large .jstree-icon {
background-image: url("../images/jstree/32px.png");
}
.jstree-default-large .jstree-node {
background-position: -288px 0px;
background-repeat: repeat-y;
}
.jstree-default-large .jstree-last {
background: transparent;
}
.jstree-default-large .jstree-open > .jstree-ocl {
background-position: -128px 0px;
}
.jstree-default-large .jstree-closed > .jstree-ocl {
background-position: -96px 0px;
}
.jstree-default-large .jstree-leaf > .jstree-ocl {
background-position: -64px 0px;
}
.jstree-default-large .jstree-themeicon {
background-position: -256px 0px;
}
.jstree-default-large > .jstree-no-dots .jstree-node,
.jstree-default-large > .jstree-no-dots .jstree-leaf > .jstree-ocl {
background: transparent;
}
.jstree-default-large > .jstree-no-dots .jstree-open > .jstree-ocl {
background-position: -32px 0px;
}
.jstree-default-large > .jstree-no-dots .jstree-closed > .jstree-ocl {
background-position: 0px 0px;
}
.jstree-default-large .jstree-disabled {
background: transparent;
}
.jstree-default-large .jstree-disabled.jstree-hovered {
background: transparent;
}
.jstree-default-large .jstree-disabled.jstree-clicked {
background: #efefef;
}
.jstree-default-large .jstree-checkbox {
background-position: -160px 0px;
}
.jstree-default-large .jstree-checkbox:hover {
background-position: -160px -32px;
}
.jstree-default-large.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox,
.jstree-default-large .jstree-checked > .jstree-checkbox {
background-position: -224px 0px;
}
.jstree-default-large.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover,
.jstree-default-large .jstree-checked > .jstree-checkbox:hover {
background-position: -224px -32px;
}
.jstree-default-large .jstree-anchor > .jstree-undetermined {
background-position: -192px 0px;
}
.jstree-default-large .jstree-anchor > .jstree-undetermined:hover {
background-position: -192px -32px;
}
.jstree-default-large > .jstree-striped {
background-size: auto 64px;
}
.jstree-default-large.jstree-rtl .jstree-node {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
background-position: 100% 1px;
background-repeat: repeat-y;
}
.jstree-default-large.jstree-rtl .jstree-last {
background: transparent;
}
.jstree-default-large.jstree-rtl .jstree-open > .jstree-ocl {
background-position: -128px -32px;
}
.jstree-default-large.jstree-rtl .jstree-closed > .jstree-ocl {
background-position: -96px -32px;
}
.jstree-default-large.jstree-rtl .jstree-leaf > .jstree-ocl {
background-position: -64px -32px;
}
.jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-node,
.jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl {
background: transparent;
}
.jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl {
background-position: -32px -32px;
}
.jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl {
background-position: 0px -32px;
}
.jstree-default-large .jstree-themeicon-custom {
background-color: transparent;
background-image: none;
background-position: 0 0;
}
.jstree-default-large > .jstree-container-ul .jstree-loading > .jstree-ocl {
background: url("../images/jstree/throbber.gif") center center no-repeat;
}
.jstree-default-large .jstree-file {
background: url("../images/jstree/32px.png") -96px -64px no-repeat;
}
.jstree-default-large .jstree-folder {
background: url("../images/jstree/32px.png") -256px 0px no-repeat;
}
.jstree-default-large.jstree-rtl .jstree-node {
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg==");
}
.jstree-default-large.jstree-rtl .jstree-last {
background: transparent;
}
@media (max-width: 768px) {
#jstree-dnd.jstree-dnd-responsive {
line-height: 40px;
font-weight: bold;
font-size: 1.1em;
text-shadow: 1px 1px white;
}
#jstree-dnd.jstree-dnd-responsive > i {
background: transparent;
width: 40px;
height: 40px;
}
#jstree-dnd.jstree-dnd-responsive > .jstree-ok {
background-image: url("../images/jstree/40px.png");
background-position: 0 -200px;
background-size: 120px 240px;
}
#jstree-dnd.jstree-dnd-responsive > .jstree-er {
background-image: url("../images/jstree/40px.png");
background-position: -40px -200px;
background-size: 120px 240px;
}
#jstree-marker.jstree-dnd-responsive {
border-left-width: 10px;
border-top-width: 10px;
border-bottom-width: 10px;
margin-top: -10px;
}
}
@media (max-width: 768px) {
.jstree-default-responsive {
/*
.jstree-open > .jstree-ocl,
.jstree-closed > .jstree-ocl { border-radius:20px; background-color:white; }
*/
}
.jstree-default-responsive .jstree-icon {
background-image: url("../images/jstree/40px.png");
}
.jstree-default-responsive .jstree-node,
.jstree-default-responsive .jstree-leaf > .jstree-ocl {
background: transparent;
}
.jstree-default-responsive .jstree-node {
min-height: 40px;
line-height: 40px;
margin-left: 40px;
min-width: 40px;
white-space: nowrap;
}
.jstree-default-responsive .jstree-anchor {
line-height: 40px;
height: 40px;
}
.jstree-default-responsive .jstree-icon,
.jstree-default-responsive .jstree-icon:empty {
width: 40px;
height: 40px;
line-height: 40px;
}
.jstree-default-responsive > .jstree-container-ul > .jstree-node {
margin-left: 0;
}
.jstree-default-responsive.jstree-rtl .jstree-node {
margin-left: 0;
margin-right: 40px;
}
.jstree-default-responsive.jstree-rtl .jstree-container-ul > .jstree-node {
margin-right: 0;
}
.jstree-default-responsive .jstree-ocl,
.jstree-default-responsive .jstree-themeicon,
.jstree-default-responsive .jstree-checkbox {
background-size: 120px 240px;
}
.jstree-default-responsive .jstree-leaf > .jstree-ocl {
background: transparent;
}
.jstree-default-responsive .jstree-open > .jstree-ocl {
background-position: 0 0px !important;
}
.jstree-default-responsive .jstree-closed > .jstree-ocl {
background-position: 0 -40px !important;
}
.jstree-default-responsive.jstree-rtl .jstree-closed > .jstree-ocl {
background-position: -40px 0px !important;
}
.jstree-default-responsive .jstree-themeicon {
background-position: -40px -40px;
}
.jstree-default-responsive .jstree-checkbox,
.jstree-default-responsive .jstree-checkbox:hover {
background-position: -40px -80px;
}
.jstree-default-responsive.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox,
.jstree-default-responsive.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover,
.jstree-default-responsive .jstree-checked > .jstree-checkbox,
.jstree-default-responsive .jstree-checked > .jstree-checkbox:hover {
background-position: 0 -80px;
}
.jstree-default-responsive .jstree-anchor > .jstree-undetermined,
.jstree-default-responsive .jstree-anchor > .jstree-undetermined:hover {
background-position: 0 -120px;
}
.jstree-default-responsive .jstree-anchor {
font-weight: bold;
font-size: 1.1em;
text-shadow: 1px 1px white;
}
.jstree-default-responsive > .jstree-striped {
background: transparent;
}
.jstree-default-responsive .jstree-wholerow {
border-top: 1px solid rgba(255, 255, 255, 0.7);
border-bottom: 1px solid rgba(64, 64, 64, 0.2);
background: #ebebeb;
height: 40px;
}
.jstree-default-responsive .jstree-wholerow-hovered {
background: #e7f4f9;
}
.jstree-default-responsive .jstree-wholerow-clicked {
background: #beebff;
}
.jstree-default-responsive .jstree-children .jstree-last > .jstree-wholerow {
box-shadow: inset 0 -6px 3px -5px #666666;
}
.jstree-default-responsive .jstree-children .jstree-open > .jstree-wholerow {
box-shadow: inset 0 6px 3px -5px #666666;
border-top: 0;
}
.jstree-default-responsive .jstree-children .jstree-open + .jstree-open {
box-shadow: none;
}
.jstree-default-responsive .jstree-node,
.jstree-default-responsive .jstree-icon,
.jstree-default-responsive .jstree-node > .jstree-ocl,
.jstree-default-responsive .jstree-themeicon,
.jstree-default-responsive .jstree-checkbox {
background-image: url("../images/jstree/40px.png");
background-size: 120px 240px;
}
.jstree-default-responsive .jstree-node {
background-position: -80px 0;
background-repeat: repeat-y;
}
.jstree-default-responsive .jstree-last {
background: transparent;
}
.jstree-default-responsive .jstree-leaf > .jstree-ocl {
background-position: -40px -120px;
}
.jstree-default-responsive .jstree-last > .jstree-ocl {
background-position: -40px -160px;
}
.jstree-default-responsive .jstree-themeicon-custom {
background-color: transparent;
background-image: none;
background-position: 0 0;
}
.jstree-default-responsive .jstree-file {
background: url("../images/jstree/40px.png") 0 -160px no-repeat;
background-size: 120px 240px;
}
.jstree-default-responsive .jstree-folder {
background: url("../images/jstree/40px.png") -40px -40px no-repeat;
background-size: 120px 240px;
}
}
.jstree-default > .jstree-container-ul > .jstree-node {
margin-left: 0;
margin-right: 0;
}
@@ -32,6 +32,7 @@
'libs/jquery/jquery',
'libs/jquery/jquery-ui',
"libs/jquery/select2",
"libs/jquery/jstree",
'libs/bootstrap',
'libs/underscore',
'libs/backbone/backbone',