mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-24 16:30:27 +08:00
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:
@@ -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__
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ):
|
||||
"""
|
||||
|
||||
@@ -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',
|
||||
|
||||
Executable
BIN
Binary file not shown.
|
After Width: | Height: | Size: 3.0 KiB |
Executable
BIN
Binary file not shown.
|
After Width: | Height: | Size: 1.8 KiB |
Executable
BIN
Binary file not shown.
|
After Width: | Height: | Size: 1.7 KiB |
@@ -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
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>');
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
});
|
||||
|
||||
@@ -14,7 +14,8 @@ module.exports = function(grunt) {
|
||||
'masthead',
|
||||
'library',
|
||||
'trackster',
|
||||
'circster'
|
||||
'circster',
|
||||
'jstree'
|
||||
];
|
||||
|
||||
var _ = grunt.util._;
|
||||
|
||||
+195
-1
@@ -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}
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
@import "ui.less";
|
||||
@import "library.less";
|
||||
@import "toastr.less";
|
||||
@import "jstree.less";
|
||||
|
||||
|
||||
// Mixins
|
||||
|
||||
Executable
+989
@@ -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',
|
||||
|
||||
Reference in New Issue
Block a user