` was removed.
+ This class was used on the *container* to turn all checkbox items into
+ radio buttons.
+ Instead, this class is now added to ``.
+ Use the `tree.checkox: "radio"` option to activate this for the whole tree.
+ * The callback signature for the `tree.tooltip` option has changed to
+ `tooltip(event, data)`
+
+ * [Improved] `aria` option is now on by default
+ * Use the new dynamic options pattern for
+ `checkbox`, `icon`, `tooltip`, `unselectable`, `unselectableIgnore`,
+ `unselectableStatus`.
+ See also dynamic options.
+ * [Added] New method `node.visitSiblings()`
+ * [Added] #730 ext-persist option `expandOpts` is passed to setExpanded()
+ Allows to suppress animation or event generation.
+
+# 2.22.5 / 2017-05-11
+ * [Improved] #709 experimental ext-ariagrid
+
+# 2.22.4 / 2017-05-06
+ * [Improved] #709 experimental ext-ariagrid
+
+# 2.22.3 / 2017-05-05
+ * [Improved] #709 experimental ext-ariagrid
+
+# 2.22.2 / 2017-04-29
+ * [Fixed] #729 Fix regression with addChild performance improvements (#708)
+
+# 2.22.1 / 2017-04-21
+ * [Fixed] #722 Fix regression with addChild performance improvements (#708)
+
+# 2.22.0 / 2017-04-11
+ * [Added] ext-dnd5 now part of standard distribution
+ * [Added] #693 ext-dnd/dnd5: configurable drop marker offset
+ * [Added] #616 ext-wide: configurable left padding
+ * [Added] New method $.ui.fancytree.evalOption()
+ * [Improved] #601 ext-filter: improve performance (don't render hidden nodes)
+ * [Improved] ext-contextMenu: disable keyboard while popup is open and restore focus
+ * [Improved] #701 ext-hotkeys: Prevent default behavior on hot key combination
+ * [Improved] #708 speedup improvement for addChildren
+ * [Fixed] #680 ext-dnd5: top level nodes not draggable
+ * [Fixed] #681 ext-table: exception when a lazy node has `children: []`
+ * [Fixed] #699 ext-dnd5: Icon remains after dnd is cancelled
+ * [Fixed] #702 $.ui.fancytree.getNode(jQuery)' for jQuery v3.x
+ * [Fixed] #706 Fix DND where fancytree-title span is not a direct child due to custom layouts
+ * [Fixed] #712 When clicking in a scrolled tree for the first time, focus is not set properly
+ * [Fixed] #716 ext-wide: animation 'jumps' (jQuery UI 1.12)
+ * [Fixed] #717, #719 expand/collapse shows displaced child nodes when scrolled (jQuery UI 1.12)
+ * Update demos to jQuery 3.2.1 / jQuery UI 1.12.1
+
+# 2.21.0 / 2017-01-15
+ * [Added] New extension 'ext-dnd5' (beta) for native HTML5 drag'n'drop support
+ * [Added] `rtl` option for right-to-left script support
+ * [Added] Add $.ui.fancytree.overrideMethod()
+ * [Added] hook `treeSetOption` allows extensions to update on option changes
+ * [Changed] standard CSS no longer defines `overflow: auto` for the container.
+ If the tree container has a fixed height, `overflow: auto` or `overflow: scroll`
+ should be added to make it scrollable.
+ (Otherwise this always would be the scroll parent for ext-dnd5.)
+ * [Improved] better support for initializing from embedded JSON using the
+ `data-type="json"` attribute
+ * [Fixed] corner case of #658 when ext-edit is loaded, but inactive
+ * [Fixed] #396 Don't load 'loading.gif' for glyph skins
+ * [Fixed] #675 ext-table: node.render(false) puts first node at end
+
+# 2.20.0 / 2016-11-13
+ * [Added] #419 `modifyChild` event. This event is also a good place to
+ implement auto sorting (#559)
+ * [Added] #419 node.triggerModifyChild() and node.triggerModify()
+ * [Added] #595 add custom node filter to `generateFormElements()`
+ * [Added] #610 `tree.tooltip` option allows automatic or custom tooltips
+ * [Added] #620 improved tooltip escaping to allow newlines
+ * [DEPRECATED] `removeNode` event. Listen for `modifyChild` with operation
+ 'remove' instead (which is fired on the parent)
+ * [Improved] ThemeRoller theme
+ * [Improved] ext-filter
+ - #297 add filter option 'hideExpanders' to remove expanders if all child
+ nodes are hidden by filter
+ - Filter options and the `opts` argument of `filterNodes()` / `filterBranches()`
+ have been unified
+ - [Fixed] #230 themeroller theme compatible with ext-filter
+ - [Fixed] #528 autoCollapse option blocks filter's autoExpand option
+ - [Fixed] #529 Filter: Mark matching nodes even if parent was matched in branch mode
+ - [Fixed] #643 Exceptions in ext-filter if expression contains special chars
+ - [Fixed] #658 ext-filter does not work with ext-edit `editCreateNode()`
+ * [Improved] #656 WAI-ARIA support
+ - Set focus to first node on first tab-in
+ - Support [home] and [end] keys
+ - Set aria-activedescendant on container to active ID
+ - Set aria-multiselectable on container if selectMode != 1
+ - Set aria-treeitem, -selected, -expanded, on title span instead `
`
+ * [Fixed] #576 `loadKeyPath()` sometimes gets the root wrong
+ * [Fixed] #615 Drag & drop helper icons lose indentation with table extension
+ * [Fixed] #632 Tabbing is not working if there is an anchor tag in treeview
+ * [Fixed] #644 New nodes created with ext-edit, are hidden in filtered trees
+ * [Fixed] #647 ext-table: tree.render(true) does not discard existing markup
+ * [Fixed] #659 handling of function keys, when quicksearch is on
+ * Use QUnit 2.0
+
+# 2.19.0 / 2016-08-11
+ * [Added] #607 tree.enableUpdate() to temporarily disable rendering to improve
+ performance on bulk updates
+ * [Added] modifier class `.fancytree-connectors` to be set on container
+ Note: Experimental! Not required for skin-xp and not compatible with ext-table
+ * [Added] #623 ext-edit: `data.originalEvent` is now passed to `beforeClose`
+ * [Fixed] #604 Set `source` option does not update tree
+ * [Fixed] #609 node.load(true); doesn't maintain expanded
+ * [Fixed] #621 Cannot focus embedded input controls
+ * [Improved] #611 Keyboard navigation honors autoScroll option
+ * Extensions inherit main version number
+
+# 2.18.0 / 2016-05-02
+ * [Added] #586 node.discardMarkup() (useful in the `collapsed` event)
+ * [Added] #171 new option `.escapeTitles`
+ * [Added] new callback `.enhanceTitle()`
+ * [Fixed] #515 Html tags included in filter results
+ * [Fixed] #593 ext-dnd revert position fails for tables
+
+# 2.17.0 / 2016-04-11
+ * [Added] `node.addClass()`, `.removeClass()`, and `.toggleClass()`
+ * [Added] ext-filter: matcher-callback for `tree.filterNodes()` may now return
+ `"branch"` and `"skip"`
+ * [Added] ext-filter: new option`nodata` allows to configure a status node for
+ empty results
+ * [Added] `digits` argument to `node.getIndexHier(separator, digits)`
+ * [Added] tree option `.tabindex`, default is "0". Pass "" to resolve #577
+ * [DEPRECATED] tree option `.tabbable`. Use `.tabindex` instead
+ * [Added] New option `mode='firstChild'` for `node.moveTo()`
+ * [Added] New option `digits=` for `node.getIndexHier()`
+ * [Fixed] ext-filter: branch mode honors `autoExpand: true`
+ * [Fixed] #584: aria-labelledby ids not unique
+ * Update to jQuery UI 1.11.4
+
+# 2.16.1 / 2016-03-18
+ * [Added] ext-glyph: new icon for 'nodata' status nodes
+ * [Fixed] #575 missing loading icon in non-bootstrap themes.
+ Glyph themes now display status images in icon span (was expander span before)
+
+# 2.16.0 / 2016-03-16
+ * [Added] ext-clones: new method node.setRefKey(refKey)
+ * [Added] modifier class `.fancytree-fade-expander` to be set on container
+ * [Added] ext-dnd: `.dragExpand()` callback to prevent auto-expand
+ * [Improved] load error reporting
+ * [Improved] bootstrap theme icons and style (samples use bootstrap 3.3)
+ * [Improved] status nodes don't have icons
+ * [Improved] pass data argument to `source` callback
+ * [Improved] Handle exceptions inside `postProcess`
+ * [Improved] #568 ext-dnd: Auto-expanding of collapsed nodes should also work
+ when dropping is not allowed
+ * [Improved] #567 ext-dnd: fix revert position
+ * [Improved] #565 ext-dnd: fix intermediate display of wrong icon (sending 'over' after 'enter')
+ * [Fixed] #569 node.navigate does not return a Promise object
+ * [Fixed] #563 `tree.reactivate(false)` sets fancytree-treefocus and `tree.reactivate(true)`
+ doesn't set keyboard focus
+ * [Fixed] #562 Node span tag leaks outside table cell
+ * [Fixed] #526 tree.setFocus() does not set keyboard focus
+ * Updated to jQuery 1.12.1
+ * Updated grunt devDependencies
+ * Add jQuery 3.0 beta to test suite
+ * Added LICENSE.txt to dist
+
+# 2.15.0 / 2016-01-11
+ * [Changed] Renamed class `fancytree-statusnode-wait` to `fancytree-statusnode-loading`
+ * [Added] new event `renderStatusColumns`
+ * [DEPRECATED] ext-table option `customStatus`. Use `renderStatusColumns` instead
+ * [Added] new event `clickPaging`
+ * [Added] new mode `nodata` for use with node.setStatus()
+ * [Added] new method `node.addPagingNode()`
+ * [Added] new method `node.replaceWith()`
+ * [Added] new type 'paging' for `node.statusNodeType`
+ * [Added] #542 new method `node.getSelectedNodes()`
+ * [Added] Helper class `glyphicon-spin` to allow rotating loading icon with bootstrap3
+ * [Improved] #356: serialize load requests
+ * [Improved] #538: Be more robust if site css defines custom li:before
+ * [Improved] ext-table: Define table row templates in ``
+ * [Improved] ext-table: `` is now optional if `` contains `
`s
+
+# 2.14.0 / 2015-12-19
+ * [CHANGED] #519 Refactored custom icon configuration:
+ (see also the [theming tutorial](https://github.com/mar10/fancytree/wiki/TutorialTheming))
+ * [Added] `options.icon` option/callback.
+ Valid values are true, false, a string containing a class name or image
+ url, or a callback returning that.
+ * [Changed] `node.icon` option. Valid values are true, false, or a string
+ containing a class name or image url.
+ This option existed before, but was stored in the `node.data.icon` namespace,
+ and did not accept class names.
+ * [DEPRECATED] `options.iconClass` callback: use `options.icon` instead
+ * [DEPRECATED] `options.icons`: use `options.icon` instead
+ * [DEPRECATED] `node.data.iconclass` option: use `node.icon` instead
+ * [DEPRECATED] `node.data.icon` option: use `node.icon` instead
+ * [Added] `tree.clear()` method.
+ * [Added] #520 ext-persist: new event `beforeRestore`
+ * [Fixed] #533 table-ext: nodeSetExpanded triggers redundant events
+
+# 2.13.0 / 2015-11-16
+ * [Changed] If a node is initalized as `lazy: true`, and `children: []`,
+ treat it as 'loaded leaf node'.
+ This is consistent with a lazy node that has no children property at all (i.e.
+ `undefined`). This would issue a lazyLoad event and a resopnse of `[]` would
+ mark the node as leaf node.
+ * [Added] new function $.ui.fancytree.getTree()
+ * [Added] ext-filter methods node.isMatched() and tree.isFilterActive()
+ * [Added] CSS for ext-childcounter badges is now part of the standard themes
+ * [Added] ext-childcounter method node.updateCounter()`
+ * [Fixed] #507 data-hideCheckbox="true"
+ * [Fixed] #513 activeVisible option does not work on init
+ * [Fixed] #516 ExtPersist requires cookie.js even when not using cookies
+
+# 2.12.0 / 2015-09-10
+ * [Changed] Documented `iconClass` callback and changed signature from
+ `iconClass(node)` to `iconClass(event, data)`
+ * [Added] ext-dnd events `initHelper` and `updateHelper`
+ * [Added] ext-dnd option `smartRevert`
+ * [Added] #146 sample for multi-node drag'n'drop
+ * [Added] Sample for modifier keys to control copy/move behavior while dragging
+ * [Added] `highlight` and `fuzzy` options to ext-filter
+ * [Added] `fireActivate` option to ext-persist (default: true)
+ * [Added] #496 new methods tree.findFirst() / .findAll()
+ * [Improved] clearFilter() performance #491
+ * [Improved] dnd registers global handlers to cancel on ESC and mousedown
+ * [Fixed] #475 Font color while editing node title with bootstrap skin
+ * [Fixed] #484 Glyph plugin: Missing margin-left for span.fancytree-custom-icon
+ * [Fixed] #486 node.render(true) moves the node to the end of the list
+ * [Fixed] #489 `focusOnClick` option is ignored for tables if 'dnd' is listed after 'table' extension
+ * [Fixed] #495 Double clicking on expander with lazy-load causes assertion error
+
+# 2.11.0 / 2015-07-26
+ * [Changed] Adding `fancytree-plain` class to container (if not table), allowing for more efficient css
+ * [Changed] #434: Use data-uris to inline loading.gif image
+ * [Changed] #460: Use padding-left instead of margin-left for table indent
+ * [Changed] #465: Add `node` argument to the `toDict()` callback
+ * [Improved] Nicer bootstrap theme and added table to the example
+ * [Improved] #464: ext-dnd supports ext-glyph
+ * [Improved] #466: Add counter badges to ext-filter
+ * [Fixed] Win8 theme jumpy hover effects
+ * [Fixed] #411: ext-edit fails with ext-table, when edit was cancelled
+ * [Fixed] #463: ext-table: render(deep) does not work
+ * [Fixed] #470: Wide plugin not present in jquery.fancytree-all.min.js
+
+# 2.10.2 / 2015-07-02
+ * [Fixed] Add `dist/skin-custom-1` sample (again)
+ * [Fixed] #459 Don't collapse root folder when last node is removed
+
+# 2.10.1 / 2015-06-27
+ * [Changed] Undo #340: Revert dist folder layout to v2.9.0, but add
+ dist/skin-common.less
+
+# 2.10.0 / 2015-06-26 [YANKED]
+ * [Changed] #340: New dist folder layout: moved skin-* folders into src/ folder
+ (**Note:** this change was reverted in v2.10.1)
+ * [Improved] Update to jQuery UI 1.11.4, jQuery 1.11.3
+ * [Improved] #340: add `dist/skin-common.less` to fix theme imports
+ * [Improved] #443 Support js-cookie (still compatible with jquery-cookie)
+ * [Fixed] #415 selected and unselectable shows unchecked checkbox
+ * [Fixed] #427 table + themeroller: apply color to TR
+ * [Fixed] #442 filterBranches shall use opts to allow autoExpand
+ * [Fixed] #445 enter key not handled correctly
+ * [Fixed] #449 After deleting last child, parent node remains expanded
+ * [Fixed] #452 destroy not removing nodes with ext-table
+ * [Fixed] #457 Autoscroll fails with lazyloading returning empty list
+
+# 2.9.0 / 2015-04-19
+ * [Changed] ext-filter: `tree.filterNodes(filter, opts)` now accept an `opts`
+ object instead of `leavesOnly`
+ * [Improved] #417 only raise exception about data being a string if dataType is "json"
+ * [Added] #394 New option `autoExpand` for [ext-filter]
+ * [Fixed] #402, #405 rare exception in dnd events
+ * [Fixed] #420 nodeSetActive not returning promise
+ * [Fixed] #270 Keyboard focus not working when using dnd extension
+
+# 2.8.1 / 2015-03-01
+ * [Improved] generateFormElements() new argument `opts`, default: `{stopOnParents: true}`
+ * [Fixed] #393 ext-table: checkboxColumnIdx not working
+ * [Fixed] #397 ext-edit: Creating sub category fails
+ * [Fixed] #403 generateFormElements() doesn't work with string args
+
+# 2.8.0 / 2015-02-08
+ * [Changed] Deprecated ext-menu (was never officially supported, see http://localhost:8080/demo/index.html#sample-ext-menu.html)
+ * [Improved] Bluring the widget will now blur the focused node too.
+ * [Improved] Persistence will only set node focus if widget had focus (otherwise only activate the node).
+ * [Improved] Set default focus on first keypress to active node (first node otherwise)
+ * [Improved] #383 Accept [ECMAScript 6 Promise](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise) as source
+ * [Added] `_superApply()` for hook handlers.
+ * [Added] eventToString() supports mouse events
+ * [Fixed] persistence for focus (when using non-cookie storage)
+ * [Fixed] #391 Exception on autoscrolling filtered trees
+
+# 2.7.0 / 2014-12-21
+ * [CHANGED] Dropped `fx` option. Use `toggleEffect` instead.
+ * [CHANGED] 'win8' and 'bootstrap' skins where modified to highlight the
+ title span instead of the node span, in order to be compatible with
+ [ext-wide]. The original skins are available as 'skin-win8-n' and
+ 'skin-bootstrap-n' respectively.
+ * [Added] ext-wide extension (experimental)
+ * [Added] LESS files to distribution
+ * [Added] Publish on [cdnjs](https://cdnjs.com/libraries/jquery.fancytree)
+ * [Improved] tree.reactivate() returns a promise
+ * [Fixed] #246 Gaps when filtering in hide mode (patch by @lefunque)
+ * [Fixed] #287 wrong image on hovers
+ * [Fixed] #368 Standard browser behavior prevented (e.g. zoom with Ctrl+'+'/'-')
+ * [Fixed] #369 Suppress warning, when dropping top- on top-node
+
+# 2.6.0 / 2014-11-29
+ * [Added] Option `focusOnSelect` to set focus when node is checked by a mouse
+ click (default: false)
+ * [Added] `restore` event, sent after ext-persist has restored the tree state
+ * [Improved] #359 Better navigation performance when skipping hidden nodes
+ * Publish on npm Registry
+
+# 2.5.0 / 2014-11-23
+ * [CHANGED] [ext-persist] overrideSource option now defaults to true
+ * [Added] [ext-filter] Option `autoApply` re-applies filter on lazy loading
+ (on by default)
+ * [Added] quicksearch: navigate to next node by typing the first letters
+ * [Improved] [ext-dnd] Make draggable helper and parent configurable
+ * [Improved] #153 Add class `fancytree-unselectable` to respective nodes and
+ dim unselectable checkboxes
+ * [Improved] Update to jQuery 1.1.11, jQuery UI 1.11.2
+ * [Improved] New mode 'firstChild' for node.addNode()
+ * [Fixed] #324 Fix problem where minExpandLevel was not expanding root node
+ * [Fixed] #300 dnd.focusOnClick for jQuery UI 1.11
+ * [Fixed] #354 [ext-persist] with selectMode 3
+
+# 2.4.1 / 2014-09-23
+ * [Fixed] Regression #323
+
+# 2.4.0 / 2014-09-21
+ * [CHANGED] Renamed dist/jquery.fancytree-custom.min.js to jquery.fancytree-all.min.js
+ * [CHANGED] ext-edit callbacks no longer pass `data.value` (use `data.input.val()` instead).
+ * [Added] CDN support (http://www.jsdelivr.com/#!jquery.fancytree)
+ * [Added] New method `node.visitAndLoad()`
+ * [Added] New method `node.editCreateNode()` (ext-edit)
+ * [Added] New method `node.isRootNode()`
+ * [Added] New method `node.isTopLevel()`
+ * [Added] New option `id` to override default tree id
+ * [Added] New argument `stopOnParents` for tree.generateFormElements()
+ * [Improved] #294 node.load() should resolve 'ok', if node is already loaded
+ * [Improved] #293 minExpandLevel does not auto-expand
+ * [Improved] #313 Allow HTML in tooltips
+ * [Fixed] crash in scrollIntoView() when parent is `window`
+ * [Fixed] #305 Checkbox doesn't show with Glyph + Table
+ * [Fixed] #316 Fix hasChildren() when children = []
+ * [Fixed] #237 Ajax LoadError not updated in StatusNode with Table ext
+ * [Fixed] #295 loadKeyPath with multiple paths
+ * [DEPRECATED] node.isRoot(). Use node.isRootNode() instead
+
+# 2.3.0 / 2014-08-17
+ * [CHANGED] renamed (undocumented) event 'loaderror' to 'loadError'
+ * [Added] postProcess now allows to signal error conditions (so it becomes easy to handle custom Ajax response formats)
+ * [Added] node.setStatus()
+ * [Added] ext-clones to the standard distribution.
+ * [Improved] loadError allows to return `false` to prevent default handling
+ * [Fixed] #258 Fix moveTo when moving a node to same parent
+ * [Fixed] #257 Glyph expander sometimes disappears
+
+# 2.2.0 / 2014-06-28
+ * [Added] Option dnd.focusOnClick sets focus to tree widget, even when dragging
+ is enabled
+ * [Added] node.info()
+ * [Improved] #245 tree.generateInput() now returns data using PHPs array
+ convention, i.e. by appending brackets to the name: 'ft_1[]'.
+ * [Fixed] #250: Children lazy empty nodes remain checked when parent is
+ unchecked with hierarchical multi-selection
+ * [Fixed] #272 Navigation in filtered trees
+
+# 2.1.0 / 2014-05-29
+ * [Added] #210: [ext-persist] optionally store information in sessionStorage or localStorage
+ * [Added] #64 [ext-filter] filterBranches() will restrict display to sub-trees
+ * [Added] New options 'scrollParent' and 'scrollOfs' are evaluated by node.scrollIntoView()
+ (which is also called on expand). This allows autoScroll to work with
+ [ext-table]: set scrollParent to `window` or a wrapper DIV with overflow: auto
+ * [Added] [ext-wide] use 100% wide selection bar (experimental)
+ * [Added] $.ui.fancytree.debounce()
+ * [Improved] [ext-columnview] css
+ * [Improved] skin-win8 now includes the loading.gif as inline CSS for faster response
+ * [Improved] Add 'fancytree-icon' class to icon IMG
+ * [Improved] css v-align for checkboxes and icons
+ * [Fixed] #217: persistence when node keys are numeric
+ * [Fixed] #228: html in node title prevents click
+ * [Fixed] #235: D'n'd helper is displaced, when window is scrolled
+ * [Fixed] #241: fromDict() does not update node title
+ * [Fixed] relative custom imagePath option
+ * [DEPRECATED] [ext-filter] Use filterNodes() instead of applyFilter()
+ * [DEPRECATED] [ext-filter] 'leavesOnly' option removed (see filterNodes())
+
+# 2.0.0 / 2014-05-01
+ * Released 2.0.0
+
+# 1.x
+
+ * See [Dynatree](https://code.google.com/p/dynatree/)
diff --git a/admin/src/admin/static/vendor/fancytree/Gruntfile.coffee b/admin/src/admin/static/vendor/fancytree/Gruntfile.coffee
new file mode 100644
index 0000000..7f53d04
--- /dev/null
+++ b/admin/src/admin/static/vendor/fancytree/Gruntfile.coffee
@@ -0,0 +1,629 @@
+###
+Build scripts for Fancytree
+###
+
+"use strict"
+
+module.exports = (grunt) ->
+
+ grunt.initConfig
+
+ pkg:
+ grunt.file.readJSON("package.json")
+
+ # Project metadata, used by the directive.
+ meta:
+ banner: "/*! <%= pkg.title || pkg.name %> - @VERSION - @DATE\n" +
+ # "<%= grunt.template.today('yyyy-mm-dd HH:mm') %>\n" +
+ "<%= pkg.homepage ? ' * ' + pkg.homepage + '\\n' : '' %>" +
+ " * Copyright (c) <%= grunt.template.today('yyyy') %> <%= pkg.author.name %>;" +
+ " Licensed <%= _.map(pkg.licenses, 'type').join(', ') %>\n" +
+ " */\n"
+ # separator: "\n/*! --- Fancytree Plugin --- */\n"
+
+ clean:
+ build:
+ src: [ "build" ]
+ dist:
+ src: [ "dist" ]
+ post_build: # Remove unwanted files from build folder
+ src: [
+ "build/jquery.fancytree.*.min.js"
+ "build/jquery.fancytree.js"
+ "build/jquery-ui-dependencies/"
+ ]
+
+ concat:
+ core_to_build:
+ options:
+ stripBanners: true
+ src: [""
+ "src/jquery.fancytree.js"
+ ]
+ dest: "build/jquery.fancytree.js"
+ bundle_to_build:
+ options:
+ stripBanners: true
+ src: [
+ "<%= meta.banner %>"
+ "src/jquery.fancytree.js"
+ # "src/jquery.fancytree.ariagrid.js"
+ "src/jquery.fancytree.childcounter.js"
+ "src/jquery.fancytree.clones.js"
+ # "src/jquery.fancytree.columnview.js"
+ "src/jquery.fancytree.dnd.js"
+ "src/jquery.fancytree.dnd5.js"
+ "src/jquery.fancytree.edit.js"
+ "src/jquery.fancytree.filter.js"
+ # "src/jquery.fancytree.fixed.js"
+ "src/jquery.fancytree.glyph.js"
+ # "src/jquery.fancytree.grid.js"
+ "src/jquery.fancytree.gridnav.js"
+ "src/jquery.fancytree.multi.js"
+ "src/jquery.fancytree.persist.js"
+ "src/jquery.fancytree.table.js"
+ "src/jquery.fancytree.themeroller.js"
+ "src/jquery.fancytree.wide.js"
+ ]
+ dest: "build/jquery.fancytree-all.js"
+
+ amd_bundle_min:
+ options:
+ banner: "<%= meta.banner %>"
+ stripBanners: true
+ process: (src, fspec) ->
+ # Remove all comments, including /*! ... */
+ src = src.replace(/\/\*(.|\n)*\*\//g, "")
+ if /fancytree..+.min.js/.test(fspec)
+ # If it is an extension:
+ # Prepend a one-liner instead
+ fspec = fspec.substr(6) # strip 'build/'
+ src = "\n/*! Extension '" + fspec + "' */" + src
+ return src
+ src: [
+ "lib/amd-intro-require-native-ui.js"
+ "build/jquery.fancytree.min.js"
+ # "build/jquery.fancytree.ariagrid.min.js"
+ "build/jquery.fancytree.childcounter.min.js"
+ "build/jquery.fancytree.clones.min.js"
+ # "build/jquery.fancytree.columnview.min.js"
+ "build/jquery.fancytree.dnd.min.js"
+ "build/jquery.fancytree.dnd5.min.js"
+ "build/jquery.fancytree.edit.min.js"
+ "build/jquery.fancytree.filter.min.js"
+ # "build/jquery.fancytree.fixed.min.js"
+ "build/jquery.fancytree.glyph.min.js"
+ # "build/jquery.fancytree.grid.min.js"
+ "build/jquery.fancytree.gridnav.min.js"
+ "build/jquery.fancytree.multi.min.js"
+ "build/jquery.fancytree.persist.min.js"
+ "build/jquery.fancytree.table.min.js"
+ "build/jquery.fancytree.themeroller.min.js"
+ "build/jquery.fancytree.wide.min.js"
+ "lib/amd-outro.js"
+ ]
+ dest: "build/jquery.fancytree-all.min.js"
+
+ all_deps: # un-minified, so we can generate a map file
+ options:
+ banner: "<%= meta.banner %>"
+ stripBanners: true
+ process: (src, fspec) ->
+ # Remove all comments, including /*! ... */
+ # (but keep disclaimer for jQuery-UI)
+ # if not /jquery-ui..+.js/.test(fspec)
+ # # if not /jquery-ui..+.min.js/.test(fspec)
+ # src = src.replace(/\/\*(.|\n)*\*\//g, "")
+ # # strip out AMD related code from jQuery-UI and make it an IIFE
+ # if /jquery-ui..+.min.js/.test(fspec)
+ # src = src.replace(/\(function.+jQuery\)}\)\((.+\)}\)})\);/, "!$1(jQuery);")
+ if /jquery.fancytree.js/.test(fspec)
+ src = "\n/*! Fancytree Core */" + src
+ if /fancytree..+.js/.test(fspec)
+ # If it is an extension:
+ # Prepend a one-liner instead
+ fspec = fspec.substr(4) # strip 'src/'
+ src = "\n/*! Extension '" + fspec + "' */" + src
+ return src
+ src: [
+ "<%= meta.banner %>"
+ # Inline jQuery UI custom (AMD header removed: IIFE only)
+ "src/jquery-ui-dependencies/jquery-ui-iife.js"
+ # Fancytree core and extensions, wrapped in UMD pattern
+ "lib/amd-intro-require-jquery.js"
+ "src/jquery.fancytree.js"
+ # "src/jquery.fancytree.ariagrid.js"
+ "src/jquery.fancytree.childcounter.js"
+ "src/jquery.fancytree.clones.js"
+ # "src/jquery.fancytree.columnview.js"
+ # "src/jquery.fancytree.dnd.js" # Draggable widget is not part of our custom jQuery UI dependencies
+ "src/jquery.fancytree.dnd5.js"
+ "src/jquery.fancytree.edit.js"
+ "src/jquery.fancytree.filter.js"
+ # "src/jquery.fancytree.fixed.js"
+ "src/jquery.fancytree.glyph.js"
+ # "src/jquery.fancytree.grid.js"
+ "src/jquery.fancytree.gridnav.js"
+ "src/jquery.fancytree.multi.js"
+ "src/jquery.fancytree.persist.js"
+ "src/jquery.fancytree.table.js"
+ "src/jquery.fancytree.themeroller.js"
+ "src/jquery.fancytree.wide.js"
+ "lib/amd-outro.js"
+ ]
+ dest: "build/jquery.fancytree-all-deps.js"
+
+ connect:
+ forever:
+ options:
+ port: 8080
+ base: "./"
+ keepalive: true
+ dev: # pass on, so subsequent tasks (like watch) can start
+ options:
+ port: 8080
+ base: "./"
+ keepalive: false
+ # middleware: (connect) ->
+ # return [
+ # (req, res, next) ->
+ # res.setHeader('Access-Control-Allow-Origin', '*')
+ # res.setHeader('Access-Control-Allow-Methods', '*')
+ # next()
+ # ]
+ sauce: # Used by sauce tasks, see https://wiki.saucelabs.com/display/DOCS/Grunt-Saucelabs+Set+Up%2C+Configuration%2C+and+Usage
+ options:
+ # hostname: "localhost"
+ # hostname: "127.0.0.1"
+ # port: 8080
+ port: 9999
+ base: ""
+ keepalive: false
+ localhost_9999: # Start web server for Sauce live testing w/ manuallly run bin/sc.exe
+ options:
+ # hostname: "localhost"
+ port: 9999
+ base: ""
+ keepalive: true
+
+ copy:
+ build: # Copy development files to build folder
+ files: [{ # src/ => build/
+ expand: true # required for cwd
+ cwd: "src/"
+ src: [
+ "skin-**/*.{css,gif,md,png,less}"
+ "skin-common.less"
+ "*.txt"
+ ]
+ dest: "build/"
+ }, { # src/ => build/modules/
+ expand: true
+ cwd: "src/"
+ src: [ "jquery.*.js" ]
+ dest: "build/modules/"
+ }, { # Top-level => build/
+ src: ["LICENSE.txt"]
+ dest: "build/"
+ }]
+ ui_deps: #
+ files: [{
+ src: "src/jquery-ui-dependencies/jquery.fancytree.ui-deps.js"
+ dest: "build/modules/jquery.fancytree.ui-deps.js"
+ }]
+ dist: # Copy build folder to dist/ (recursive)
+ files: [
+ {expand: true, cwd: "build/", src: ["**"], dest: "dist/"}
+ ]
+
+ cssmin:
+ options:
+ report: "min"
+ build:
+ expand: true
+ cwd: "build/"
+ src: ["**/*.fancytree.css", "!*.min.css"]
+ dest: "build/"
+ ext: ".fancytree.min.css"
+
+ devUpdate:
+ main:
+ options:
+ reportUpdated: true
+ updateType: 'prompt' # 'report'
+
+ docco:
+ docs:
+ src: ["src/jquery.fancytree.childcounter.js"]
+ options:
+ output: "doc/annotated-src"
+
+ eslint:
+ options:
+ maxWarnings: 100
+ # format: "stylish"
+ # options:
+ # # See https://github.com/sindresorhus/grunt-eslint/issues/119
+ # quiet: true
+ # We have to explicitly declare "src" property otherwise "newer"
+ # task wouldn't work properly :/
+ build:
+ options:
+ ignore: false
+ src: [
+ "build/jquery.fancytree.js"
+ "build/jquery.fancytree-all.js"
+ "build/modules/*.js"
+ ]
+ dev:
+ src: [
+ "src/*.js"
+ "3rd-party/**/jquery.fancytree.*.js"
+ # "test/**/test-*.js"
+ "demo/**/*.js"
+ ]
+ fix:
+ options:
+ fix: true
+ src: [
+ "src/*.js"
+ "3rd-party/**/jquery.fancytree.*.js"
+ # "test/**/test-*.js"
+ "demo/**/*.js"
+ ]
+
+ exec:
+ upload:
+ # FTP upload the demo files (requires https://github.com/mar10/pyftpsync)
+ stdin: true # Allow interactive console
+ cmd: "pyftpsync upload . ftp://www.wwwendt.de/tech/fancytree --progress --exclude build,node_modules,.*,_* --delete-unmatched"
+ upload_force:
+ # FTP upload the demo files (requires https://github.com/mar10/pyftpsync)
+ cmd: "pyftpsync upload . ftp://www.wwwendt.de/tech/fancytree --progress --exclude build,node_modules,.*,_* --delete-unmatched --resolve=local --force"
+
+ jsdoc:
+ build:
+ src: ["src/*.js", "doc/README.md"]
+ options:
+ destination: "doc/jsdoc"
+ template: "bin/jsdoc3-moogle",
+ configure: "doc/jsdoc.conf.json"
+ verbose: true
+
+ less:
+ development:
+ options:
+# paths: ["src/"]
+# report: "min"
+ compress: false
+ yuicompress: false
+# optimization: 10
+
+ # webpack uses /dist/skin-common.less as root path
+ # grunt-less uses /dist/skin-Xxx/ui.fancyree.less as root path
+ # So we define our theme LESS files for webpack compatibility
+ # and fix it for grunt-less here:
+ rootpath: ".."
+ files: [
+ {expand: true, cwd: "src/", src: "**/ui.fancytree.less", dest: "src/", ext: ".fancytree.css"}
+ ]
+
+ qunit:
+ options:
+ httpBase: "http://localhost:8080"
+ # httpBase: "http://127.0.0.1:8080"
+ build: [
+ "test/unit/test-core-build.html"
+ ]
+ develop: [
+ "test/unit/test-core.html"
+ "test/unit/test-ext-filter.html"
+ "test/unit/test-ext-table.html"
+ "test/unit/test-ext-misc.html"
+ ]
+ dist: [
+ "test/unit/test-core-dist.html"
+ ]
+
+ replace: # grunt-text-replace
+ production:
+ src: ["build/**/*.{js,less,css}"]
+ overwrite : true
+ replacements: [ {
+ from : /@DATE/g
+ # https://github.com/felixge/node-dateformat
+ to : "<%= grunt.template.today('isoUtcDateTime') %>"
+ },{
+ from : /buildType:\s*\"[a-zA-Z]+\"/g
+ to : "buildType: \"production\""
+ },{
+ from : /debugLevel:\s*[0-9]/g
+ to : "debugLevel: 3"
+ } ]
+ release:
+ src: ["dist/**/*.{js,less,css}"]
+ overwrite : true
+ replacements: [ {
+ from : /@VERSION/g
+ to : "<%= pkg.version %>"
+ } ]
+
+ "saucelabs-qunit":
+ options:
+ build: process.env.TRAVIS_JOB_ID
+ throttled: 5
+ framework: "qunit"
+ # Map of extra parameters to be passed to sauce labs. example:
+ # {'video-upload-on-pass': false, 'idle-timeout': 60}
+ sauceConfig:
+ "video-upload-on-pass": false
+ recordVideo: true
+ # Needed for Edge/Windows (as of 2019-06-02) and Firefox(?)
+ iedriverVersion: "3.141.59"
+ seleniumVersion: "3.141.59"
+ # Array of optional arguments to be passed to the Sauce Connect tunnel.
+ # See https://saucelabs.com/docs/additional-config
+ tunnelArgs: [
+ '-v',
+ '--logfile', 'saucelabs-tunnel.log',
+ '--tunnel-domains', 'localhost,travis.dev'
+ # '--direct-domains', 'google.com'
+ ]
+
+ triage:
+ options:
+ testname: "Triage"
+ build: "triage"
+ # urls: ["http://wwwendt.de/tech/fancytree/test/unit/test-core.html"]
+ # urls: ["http://127.0.0.1:9999/test/unit/test-jQuery19-ui19.html"]
+ # urls: ["http://127.0.0.1:9999/test/unit/test-jQuery1x-mig-ui1x.html"]
+ urls: ["http://localhost:9999/test/unit/test-core.html"]
+ # urls: ["http://127.0.0.1:9999/test/unit/test-core.html"]
+ # tunneled: false # Use bin/sc manually
+ browsers: [
+ # Issue #825
+ # { browserName: "chrome", version: "dev", platform: "Windows 10" }
+ # { browserName: "internet explorer", version: "9", platform: "Windows 7" }
+ # { browserName: "internet explorer", version: "8", platform: "Windows 7" }
+ # { browserName: "chrome", version: "latest", platform: "Windows 10" }
+ # { browserName: "microsoftedge", version: "latest", platform: "Windows 10" }
+ # { browserName: "safari", version: "12", platform: "macOS 10.14" }
+ { browserName: "firefox", version: "latest", platform: "Windows 10" }
+ ]
+
+ ui_112:
+ options:
+ testname: "Fancytree qunit tests (jQuery 3, jQuery UI 1.12)"
+ # urls: ["http://wwwendt.de/tech/fancytree/test/unit/test-core.html"]
+ urls: ["http://localhost:9999/test/unit/test-core.html"]
+ # urls: ["http://127.0.0.1:9999/test/unit/test-core.html"]
+ # jQuery 3 supports IE 9+ and latest Chrome/Edge/Firefox/Safari (-1)
+ # jQuery UI 1.12 supports IE 11 and latest Chrome/Edge/Firefox/Safari (-1)
+ browsers: [
+ { browserName: "chrome", version: "latest", platform: "Windows 10" }
+ { browserName: "chrome", version: "latest-1", platform: "Windows 10" }
+ { browserName: "firefox", version: "latest", platform: "Windows 10" }
+ { browserName: "firefox", version: "latest-1", platform: "Windows 10" }
+ { browserName: "firefox", version: "latest", platform: "Linux" }
+ { browserName: "microsoftedge", version: "latest", platform: "Windows 10" }
+ { browserName: "microsoftedge", version: "latest-1", platform: "Windows 10" }
+ { browserName: "internet explorer", version: "11", platform: "Windows 8.1" }
+ { browserName: "internet explorer", version: "10", platform: "Windows 8" }
+ { browserName: "internet explorer", version: "9", platform: "Windows 7" }
+ # Test Saucelabs:
+ # { browserName: "chrome", version: "latest", platform: "macOS 10.14" }
+ # { browserName: "firefox", version: "latest", platform: "macOS 10.14" }
+
+ ]
+ # ui_111:
+ # options:
+ # testname: "Fancytree qunit tests (jQuery 1.11, jQuery UI 1.11)"
+ # # urls: ["http://wwwendt.de/tech/fancytree/test/unit/test-jQuery111-ui111.html"]
+ # urls: ["http://127.0.0.1:9999/test/unit/test-jQuery111-ui111.html"]
+ # # jQuery 1.11 supports IE + and latest Chrome/Edge/Firefox/Safari (-1)
+ # # jQuery UI 1.11 supports IE 7+ and ?
+ # browsers: [
+ # { browserName: "internet explorer", version: "10", platform: "Windows 8" }
+ # # Issue #842:
+ # # { browserName: "safari", version: "7", platform: "OS X 10.9" }
+ # { browserName: "safari", version: "8", platform: "OS X 10.10" }
+ # ]
+ # ui_110:
+ # options:
+ # testname: "Fancytree qunit tests (jQuery 1.10, jQuery UI 1.10)"
+ # # urls: ["http://wwwendt.de/tech/fancytree/test/unit/test-jQuery110-ui110.html"]
+ # urls: ["http://127.0.0.1:9999/test/unit/test-jQuery110-ui110.html"]
+ # # jQuery 1.10 dropped support for IE 6
+ # # jQuery UI 1.10 supports IE 7+ and ?
+ # browsers: [
+ # # { browserName: "internet explorer", version: "8", platform: "Windows 7" }
+ # { browserName: "internet explorer", version: "9", platform: "Windows 7" }
+ # ]
+ beta: # This tests are allowed to fail in the travis matrix
+ options:
+ testname: "Fancytree qunit tests ('dev' browser versions)"
+ # urls: ["http://wwwendt.de/tech/fancytree/test/unit/test-core.html"]
+ urls: ["http://localhost:9999/test/unit/test-core.html"]
+ # urls: ["http://127.0.0.1:9999/test/unit/test-core.html"]
+ browsers: [
+ # Issue #825
+ { browserName: "chrome", version: "dev", platform: "Windows 10" } #, chromedriverVersion: "2.46.0" }
+ # FF.dev is problematic: https://support.saucelabs.com/hc/en-us/articles/225253808-Firefox-Dev-Beta-Browser-Won-t-Start
+ { browserName: "firefox", version: "dev", platform: "Windows 10" }
+ # 2019-06-02: known problem with Saucelabs using localhost on macOS:
+ { browserName: "safari", version: "12", platform: "macOS 10.14" }
+ { browserName: "safari", version: "11", platform: "macOS 10.13" }
+ { browserName: "safari", version: "10", platform: "macOS 10.12" }
+ { browserName: "safari", version: "9", platform: "OS X 10.11" }
+ # { browserName: "safari", version: "8", platform: "OS X 10.10" }
+ ]
+
+ uglify:
+ src_to_build:
+ options: # see https://github.com/gruntjs/grunt-contrib-uglify/issues/366
+ report: "min"
+ # preserveComments: "some"
+ preserveComments: /(?:^!|@(?:license|preserve|cc_on))/
+ output:
+ ascii_only: true # #815
+ files: [
+ {
+ src: ["**/jquery.fancytree*.js", "!*.min.js"]
+ cwd: "src/"
+ dest: "build/"
+ expand: true
+ rename: (dest, src) ->
+ folder = src.substring(0, src.lastIndexOf("/"))
+ filename = src.substring(src.lastIndexOf("/"), src.length)
+ filename = filename.substring(0, filename.lastIndexOf("."))
+ return dest + folder + filename + ".min.js"
+ }
+ ]
+
+ all_deps:
+ options: # see https://github.com/gruntjs/grunt-contrib-uglify/issues/366
+ report: "min"
+ sourceMap: true
+ # preserveComments: "some"
+ preserveComments: /(?:^!|@(?:license|preserve|cc_on))/
+ output:
+ ascii_only: true # #815
+ files: [
+ {
+ src: ["jquery.fancytree-all-deps.js"]
+ cwd: "build/"
+ dest: "build/"
+ expand: true
+ rename: (dest, src) ->
+ folder = src.substring(0, src.lastIndexOf("/"))
+ filename = src.substring(src.lastIndexOf("/"), src.length)
+ filename = filename.substring(0, filename.lastIndexOf("."))
+ return dest + folder + filename + ".min.js"
+ }
+ ]
+
+ watch:
+ less:
+ files: "src/**/*.less"
+ tasks: ["less:development"]
+ eslint:
+ options:
+ atBegin: true
+ files: ["src/*.js", "test/unit/*.js", "demo/**/*.js"]
+ tasks: ["eslint:dev"]
+
+ yabs:
+ release:
+ common: # defaults for all tools
+ manifests: ['package.json', 'bower.json']
+ # The following tools are run in order:
+ run_test: { tasks: ['test'] }
+ check: { branch: ['master'], canPush: true, clean: true, cmpVersion: 'gte' }
+ bump: {} # 'bump' also uses the increment mode `yabs:release:MODE`
+ run_build: { tasks: ['make_dist'] }
+ commit: { add: '.' }
+ tag: {}
+ push: { tags: true, useFollowTags: true },
+ githubRelease:
+ repo: 'mar10/fancytree'
+ draft: false
+ npmPublish: {}
+ bump_develop: { inc: 'prepatch' }
+ commit_develop: { message: 'Bump prerelease ({%= version %}) [ci skip]' }
+ push_develop: {}
+
+ # ----------------------------------------------------------------------------
+
+
+ # Load "grunt*" dependencies
+
+ for key of grunt.file.readJSON("package.json").devDependencies
+ grunt.loadNpmTasks key if key isnt "grunt" and key.indexOf("grunt") is 0
+
+ # Register tasks
+
+ grunt.registerTask "server", ["connect:forever"]
+ grunt.registerTask "dev", ["connect:dev", "watch"]
+ # grunt.registerTask "prettier", ["eslint:fix"]
+ grunt.registerTask "format", ["eslint:fix"]
+ grunt.registerTask "test", [
+ "eslint:dev",
+ # "csslint",
+ # "htmllint",
+ "connect:dev" # start server
+ "qunit:develop"
+ ]
+
+ grunt.registerTask "sauce", [
+ "connect:sauce",
+ "saucelabs-qunit:ui_112",
+ # "saucelabs-qunit:ui_111",
+ # "saucelabs-qunit:ui_110",
+ ]
+ grunt.registerTask "sauce-optional", [
+ "connect:sauce",
+ "saucelabs-qunit:beta",
+ ]
+ grunt.registerTask "sauce-triage", ["connect:sauce", "saucelabs-qunit:triage"]
+
+ # 2020-01-26 Saucelabs tests don't work.
+ # Disable them in travis for now:
+ grunt.registerTask "travis", ["test"]
+ grunt.registerTask "travis-optional", []
+ # if parseInt(process.env.TRAVIS_PULL_REQUEST, 10) > 0
+ # # saucelab keys do not work on forks
+ # # http://support.saucelabs.com/entries/25614798
+ # grunt.registerTask "travis", ["test"]
+ # grunt.registerTask "travis-optional", []
+ # else
+ # grunt.registerTask "travis", ["test", "sauce"]
+ # grunt.registerTask "travis-optional", ["sauce-optional"]
+
+ grunt.registerTask "default", ["test"]
+ grunt.registerTask "ci", ["test"] # Called by 'npm test'
+ # Update package.json to latest versions (interactive)
+ grunt.registerTask "dev-update", ["devUpdate"]
+
+ grunt.registerTask "build", [
+ "less:development"
+ "format"
+ # `test` also starts the connect:dev server
+ "test"
+ "jsdoc:build"
+ "docco:docs"
+ "clean:build"
+ "copy:build"
+ "cssmin:build"
+ "concat:core_to_build"
+ "concat:bundle_to_build"
+ "uglify:src_to_build"
+ "concat:amd_bundle_min"
+ "concat:all_deps"
+ "uglify:all_deps"
+ "clean:post_build"
+ "replace:production"
+ "eslint:build"
+ "copy:ui_deps"
+ "qunit:build"
+ ]
+
+ grunt.registerTask "make_dist", [
+ # `build` also starts the connect:dev server
+ "build"
+ "clean:dist"
+ "copy:dist"
+ "clean:build"
+ "replace:release"
+ # "eslint:dist" # should rather use grunt-jsvalidate for minified output
+ "qunit:dist"
+ ]
+
+ grunt.registerTask "upload", [
+ "build"
+ "exec:upload"
+ ]
+
+ grunt.registerTask "upload_force", [
+ "build"
+ "exec:upload_force"
+ ]
diff --git a/admin/src/admin/static/vendor/fancytree/LICENSE.txt b/admin/src/admin/static/vendor/fancytree/LICENSE.txt
new file mode 100644
index 0000000..a991889
--- /dev/null
+++ b/admin/src/admin/static/vendor/fancytree/LICENSE.txt
@@ -0,0 +1,21 @@
+Copyright 2008-2020 Martin Wendt,
+https://wwWendt.de/
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/admin/src/admin/static/vendor/fancytree/README.md b/admin/src/admin/static/vendor/fancytree/README.md
new file mode 100644
index 0000000..9d4041a
--- /dev/null
+++ b/admin/src/admin/static/vendor/fancytree/README.md
@@ -0,0 +1,71 @@
+#  Fancytree
+[](https://github.com/mar10/fancytree/releases/latest)
+[](https://travis-ci.org/mar10/fancytree)
+[](https://www.npmjs.com/package/jquery.fancytree)
+[](https://www.jsdelivr.com/package/npm/jquery.fancytree)
+[](https://github.com/prettier/prettier)
+[](https://stackoverflow.com/questions/tagged/fancytree)
+
+
+
+Fancytree (sequel of [DynaTree 1.x](https://code.google.com/p/dynatree/)) is a
+JavaScript tree view / tree grid plugin with support for keyboard, inline editing,
+filtering, checkboxes, drag'n'drop, and lazy loading.
+
+[  ](https://wwWendt.de/tech/fancytree/demo "Live demo")
+
+
+### Status
+
+[](https://github.com/mar10/fancytree/releases/latest)
+See the [change log](https://github.com/mar10/fancytree/blob/master/CHANGELOG.md)
+for details.
+
+
+### Get Started
+
+ * [Try the live demo](https://wwWendt.de/tech/fancytree/demo).
+ * [Read the documentation](https://github.com/mar10/fancytree/wiki).
+ * [Check the Q&A forum](https://groups.google.com/forum/#!forum/fancytree) or
+ [Stackoverflow](http://stackoverflow.com/questions/tagged/fancytree) if you have questions.
+ * Play with [jsFiddle](http://jsfiddle.net/mar10/KcxRd/),
+ [CodePen](https://codepen.io/mar10/pen/WMWrbq),
+ or [Plunker](http://plnkr.co/edit/8sdy3r?p=preview).
+ * [Contribute](https://github.com/mar10/fancytree/wiki/HowtoContribute)
+
+
+### ES6 Quickstart
+
+```js
+import $ from "jquery";
+
+import 'jquery.fancytree/dist/skin-lion/ui.fancytree.less'; // CSS or LESS
+
+import {createTree} from 'jquery.fancytree';
+
+import 'jquery.fancytree/dist/modules/jquery.fancytree.edit';
+import 'jquery.fancytree/dist/modules/jquery.fancytree.filter';
+
+const tree = createTree('#tree', {
+ extensions: ['edit', 'filter'],
+ source: {...},
+ ...
+});
+// Note: Loading and initialization may be asynchronous, so the nodes may not be accessible yet.
+```
+
+See [module loader support](https://github.com/mar10/fancytree/wiki#use-a-module-loader) and
+[API docs](https://wwWendt.de/tech/fancytree/doc/jsdoc/Fancytree_Static.html#createTree).
+
+
+### Credits
+
+Thanks to all [contributors](https://github.com/mar10/fancytree/contributors).
+
+
diff --git a/admin/src/admin/static/vendor/fancytree/bin/jsdoc3-moogle/README.md b/admin/src/admin/static/vendor/fancytree/bin/jsdoc3-moogle/README.md
new file mode 100755
index 0000000..278f4c5
--- /dev/null
+++ b/admin/src/admin/static/vendor/fancytree/bin/jsdoc3-moogle/README.md
@@ -0,0 +1,22 @@
+The default template for JSDoc 3 uses: [the Taffy Database library](http://taffydb.com/) and the [Underscore Template library](http://underscorejs.org/).
+
+## Customized
+
+Modified by Martin Wendt in 2017-08.
+
+Changes are marked with `` or `// --- Start MOOGLE Changes`
+
+* Add a 'Methods:' section for class views, between 'Properties:' and 'Methods details'
+* Add google analytics hooks
+* Add a 'Fork me on Github'
+
+
+## Generating Typeface Fonts
+
+The default template uses the [OpenSans](https://www.google.com/fonts/specimen/Open+Sans) typeface. The font files can be regenerated as follows:
+
+1. Open the [OpenSans page at Font Squirrel]().
+2. Click on the 'Webfont Kit' tab.
+3. Either leave the subset drop-down as 'Western Latin (Default)', or, if we decide we need more glyphs, than change it to 'No Subsetting'.
+4. Click the 'DOWNLOAD @FONT-FACE KIT' button.
+5. For each typeface variant we plan to use, copy the 'eot', 'svg' and 'woff' files into the 'templates/default/static/fonts' directory.
diff --git a/admin/src/admin/static/vendor/fancytree/bin/jsdoc3-moogle/publish.js b/admin/src/admin/static/vendor/fancytree/bin/jsdoc3-moogle/publish.js
new file mode 100644
index 0000000..3913ff3
--- /dev/null
+++ b/admin/src/admin/static/vendor/fancytree/bin/jsdoc3-moogle/publish.js
@@ -0,0 +1,701 @@
+'use strict';
+
+var doop = require('jsdoc/util/doop');
+var env = require('jsdoc/env');
+var fs = require('jsdoc/fs');
+var helper = require('jsdoc/util/templateHelper');
+var logger = require('jsdoc/util/logger');
+var path = require('jsdoc/path');
+var taffy = require('taffydb').taffy;
+var template = require('jsdoc/template');
+var util = require('util');
+
+var htmlsafe = helper.htmlsafe;
+var linkto = helper.linkto;
+var resolveAuthorLinks = helper.resolveAuthorLinks;
+var hasOwnProp = Object.prototype.hasOwnProperty;
+
+var data;
+var view;
+
+var outdir = path.normalize(env.opts.destination);
+
+function find(spec) {
+ return helper.find(data, spec);
+}
+
+function tutoriallink(tutorial) {
+ return helper.toTutorial(tutorial, null, {
+ tag: 'em',
+ classname: 'disabled',
+ prefix: 'Tutorial: '
+ });
+}
+
+function getAncestorLinks(doclet) {
+ return helper.getAncestorLinks(data, doclet);
+}
+
+function hashToLink(doclet, hash) {
+ var url;
+
+ if ( !/^(#.+)/.test(hash) ) {
+ return hash;
+ }
+
+ url = helper.createLink(doclet);
+ url = url.replace(/(#.+|$)/, hash);
+
+ return '' + hash + '';
+}
+
+function needsSignature(doclet) {
+ var needsSig = false;
+
+ // function and class definitions always get a signature
+ if (doclet.kind === 'function' || doclet.kind === 'class') {
+ needsSig = true;
+ }
+ // typedefs that contain functions get a signature, too
+ else if (doclet.kind === 'typedef' && doclet.type && doclet.type.names &&
+ doclet.type.names.length) {
+ for (var i = 0, l = doclet.type.names.length; i < l; i++) {
+ if (doclet.type.names[i].toLowerCase() === 'function') {
+ needsSig = true;
+ break;
+ }
+ }
+ }
+ // and namespaces that are functions get a signature (but finding them is a
+ // bit messy)
+ else if (doclet.kind === 'namespace' && doclet.meta && doclet.meta.code &&
+ doclet.meta.code.type && doclet.meta.code.type.match(/[Ff]unction/)) {
+ needsSig = true;
+ }
+
+ return needsSig;
+}
+
+function getSignatureAttributes(item) {
+ var attributes = [];
+
+ if (item.optional) {
+ attributes.push('opt');
+ }
+
+ if (item.nullable === true) {
+ attributes.push('nullable');
+ }
+ else if (item.nullable === false) {
+ attributes.push('non-null');
+ }
+
+ return attributes;
+}
+
+function updateItemName(item) {
+ var attributes = getSignatureAttributes(item);
+ var itemName = item.name || '';
+
+ if (item.variable) {
+ itemName = '…' + itemName;
+ }
+
+ if (attributes && attributes.length) {
+ itemName = util.format( '%s%s', itemName,
+ attributes.join(', ') );
+ }
+
+ return itemName;
+}
+
+function addParamAttributes(params) {
+ return params.filter(function(param) {
+ return param.name && param.name.indexOf('.') === -1;
+ }).map(updateItemName);
+}
+
+function buildItemTypeStrings(item) {
+ var types = [];
+
+ if (item && item.type && item.type.names) {
+ item.type.names.forEach(function(name) {
+ types.push( linkto(name, htmlsafe(name)) );
+ });
+ }
+
+ return types;
+}
+
+function buildAttribsString(attribs) {
+ var attribsString = '';
+
+ if (attribs && attribs.length) {
+ attribsString = htmlsafe( util.format('(%s) ', attribs.join(', ')) );
+ }
+
+ return attribsString;
+}
+
+function addNonParamAttributes(items) {
+ var types = [];
+
+ items.forEach(function(item) {
+ types = types.concat( buildItemTypeStrings(item) );
+ });
+
+ return types;
+}
+
+function addSignatureParams(f) {
+ var params = f.params ? addParamAttributes(f.params) : [];
+
+ f.signature = util.format( '%s(%s)', (f.signature || ''), params.join(', ') );
+}
+
+function addSignatureReturns(f) {
+ var attribs = [];
+ var attribsString = '';
+ var returnTypes = [];
+ var returnTypesString = '';
+ var source = f.yields || f.returns;
+
+ // jam all the return-type attributes into an array. this could create odd results (for example,
+ // if there are both nullable and non-nullable return types), but let's assume that most people
+ // who use multiple @return tags aren't using Closure Compiler type annotations, and vice-versa.
+ if (source) {
+ source.forEach(function(item) {
+ helper.getAttribs(item).forEach(function(attrib) {
+ if (attribs.indexOf(attrib) === -1) {
+ attribs.push(attrib);
+ }
+ });
+ });
+
+ attribsString = buildAttribsString(attribs);
+ }
+
+ if (source) {
+ returnTypes = addNonParamAttributes(source);
+ }
+ if (returnTypes.length) {
+ returnTypesString = util.format( ' → %s{%s}', attribsString, returnTypes.join('|') );
+ }
+
+ f.signature = '' + (f.signature || '') + '' +
+ '' + returnTypesString + '';
+}
+
+function addSignatureTypes(f) {
+ var types = f.type ? buildItemTypeStrings(f) : [];
+
+ f.signature = (f.signature || '') + '' +
+ (types.length ? ' :' + types.join('|') : '') + '';
+}
+
+function addAttribs(f) {
+ var attribs = helper.getAttribs(f);
+ var attribsString = buildAttribsString(attribs);
+
+ f.attribs = util.format('%s', attribsString);
+}
+
+function shortenPaths(files, commonPrefix) {
+ Object.keys(files).forEach(function(file) {
+ files[file].shortened = files[file].resolved.replace(commonPrefix, '')
+ // always use forward slashes
+ .replace(/\\/g, '/');
+ });
+
+ return files;
+}
+
+function getPathFromDoclet(doclet) {
+ if (!doclet.meta) {
+ return null;
+ }
+
+ return doclet.meta.path && doclet.meta.path !== 'null' ?
+ path.join(doclet.meta.path, doclet.meta.filename) :
+ doclet.meta.filename;
+}
+
+function generate(title, docs, filename, resolveLinks) {
+ var docData;
+ var html;
+ var outpath;
+
+ resolveLinks = resolveLinks !== false;
+
+ docData = {
+ env: env,
+ title: title,
+ docs: docs
+ };
+
+ outpath = path.join(outdir, filename);
+ html = view.render('container.tmpl', docData);
+
+ if (resolveLinks) {
+ html = helper.resolveLinks(html); // turn {@link foo} into foo
+ }
+
+ fs.writeFileSync(outpath, html, 'utf8');
+}
+
+function generateSourceFiles(sourceFiles, encoding) {
+ encoding = encoding || 'utf8';
+ Object.keys(sourceFiles).forEach(function(file) {
+ var source;
+ // links are keyed to the shortened path in each doclet's `meta.shortpath` property
+ var sourceOutfile = helper.getUniqueFilename(sourceFiles[file].shortened);
+
+ helper.registerLink(sourceFiles[file].shortened, sourceOutfile);
+
+ try {
+ source = {
+ kind: 'source',
+ code: helper.htmlsafe( fs.readFileSync(sourceFiles[file].resolved, encoding) )
+ };
+ }
+ catch (e) {
+ logger.error('Error while generating source file %s: %s', file, e.message);
+ }
+
+ generate('Source: ' + sourceFiles[file].shortened, [source], sourceOutfile,
+ false);
+ });
+}
+
+/**
+ * Look for classes or functions with the same name as modules (which indicates that the module
+ * exports only that class or function), then attach the classes or functions to the `module`
+ * property of the appropriate module doclets. The name of each class or function is also updated
+ * for display purposes. This function mutates the original arrays.
+ *
+ * @private
+ * @param {Array.} doclets - The array of classes and functions to
+ * check.
+ * @param {Array.} modules - The array of module doclets to search.
+ */
+function attachModuleSymbols(doclets, modules) {
+ var symbols = {};
+
+ // build a lookup table
+ doclets.forEach(function(symbol) {
+ symbols[symbol.longname] = symbols[symbol.longname] || [];
+ symbols[symbol.longname].push(symbol);
+ });
+
+ modules.forEach(function(module) {
+ if (symbols[module.longname]) {
+ module.modules = symbols[module.longname]
+ // Only show symbols that have a description. Make an exception for classes, because
+ // we want to show the constructor-signature heading no matter what.
+ .filter(function(symbol) {
+ return symbol.description || symbol.kind === 'class';
+ })
+ .map(function(symbol) {
+ symbol = doop(symbol);
+
+ if (symbol.kind === 'class' || symbol.kind === 'function') {
+ symbol.name = symbol.name.replace('module:', '(require("') + '"))';
+ }
+
+ return symbol;
+ });
+ }
+ });
+}
+
+function buildMemberNav(items, itemHeading, itemsSeen, linktoFn) {
+ var nav = '';
+
+ if (items.length) {
+ var itemsNav = '';
+
+ items.forEach(function(item) {
+ var displayName;
+
+ if ( !hasOwnProp.call(item, 'longname') ) {
+ itemsNav += '