You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by br...@apache.org on 2015/12/17 20:21:48 UTC

[01/50] [abbrv] allura git commit: [#7919] Make add-new-tool menu use ContextMenu component

Repository: allura
Updated Branches:
  refs/heads/db/8034 [created] 65f06ddf0


[#7919]  Make add-new-tool menu use ContextMenu component


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/8c9b371a
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/8c9b371a
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/8c9b371a

Branch: refs/heads/db/8034
Commit: 8c9b371a1d3de959662815d5021bd1dfd01898a0
Parents: 2fe6809
Author: Heith Seewald <he...@gmail.com>
Authored: Thu Dec 3 10:53:46 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:54:29 2015 -0600

----------------------------------------------------------------------
 Allura/allura/ext/admin/admin_main.py           |   1 -
 Allura/allura/model/project.py                  |   9 +-
 Allura/allura/public/nf/js/context-menu.es6.js  |  80 +++++++++
 Allura/allura/public/nf/js/navbar.es6.js        | 166 +++++++++----------
 .../allura/templates/jinja_master/top_nav.html  |  12 +-
 5 files changed, 175 insertions(+), 93 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/8c9b371a/Allura/allura/ext/admin/admin_main.py
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/admin_main.py b/Allura/allura/ext/admin/admin_main.py
index 35fc77a..d2d5854 100644
--- a/Allura/allura/ext/admin/admin_main.py
+++ b/Allura/allura/ext/admin/admin_main.py
@@ -798,7 +798,6 @@ class ProjectAdminRestController(BaseController):
     def installable_tools(self, **kw):
         """ List of installable tools and their default options.
         """
-        response.content_type = 'application/json'
         tools = []
         for tool in AdminApp.installable_tools_for(c.project):
             tools.append({

http://git-wip-us.apache.org/repos/asf/allura/blob/8c9b371a/Allura/allura/model/project.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/project.py b/Allura/allura/model/project.py
index 2391690..c07ac13 100644
--- a/Allura/allura/model/project.py
+++ b/Allura/allura/model/project.py
@@ -640,9 +640,12 @@ class Project(SearchIndexable, MappedClass, ActivityNode, ActivityObject):
                 entry['children'] = [make_entry(child, mount_point=child.url.split('/')[-2]) for child in s.children]
             children.append(entry)
 
-        return dict(grouping_threshold=grouping_threshold,
-                    menu=children,
-                    )
+        response = dict(grouping_threshold=grouping_threshold, menu=children)
+        if admin_options:
+            response['installable_tools'] =[dict(text=t['tool_label'], href='#', tooltip=t['description'])
+                                             for t in ProjectAdminRestController().installable_tools()['tools']]
+
+        return response
 
     def grouped_navbar_entries(self):
         """Return a :class:`~allura.app.SitemapEntry` list suitable for rendering

http://git-wip-us.apache.org/repos/asf/allura/blob/8c9b371a/Allura/allura/public/nf/js/context-menu.es6.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/context-menu.es6.js b/Allura/allura/public/nf/js/context-menu.es6.js
new file mode 100644
index 0000000..66f2fc6
--- /dev/null
+++ b/Allura/allura/public/nf/js/context-menu.es6.js
@@ -0,0 +1,80 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+'use strict';
+
+
+class ContextMenu extends React.Component {
+    constructor(props) {
+        super(props);
+    }
+
+    static propTypes = {
+        classes: React.PropTypes.array,
+        items: React.PropTypes.arrayOf(React.PropTypes.object).isRequired,
+        onOptionClick: React.PropTypes.func.isRequired
+    };
+
+    static defaultOptions = {
+        classes: []
+    };
+
+    componentWillMount() {
+        let _this = this;
+        var mount_point;
+        $('body').on('click.contextMenu', function (evt) {
+            /* the :not filter should've worked as a 2nd param to .on() instead of this,
+             but clicks in the page gutter were being delayed for some reason */
+            if ($(evt.target).is(':not(.contextMenu)')) {
+
+                /* if clicking directly onto another gear, set it directly.
+                 this is necessary since sometimes our jquery events seem to interfere with the react event
+                 that is supposed to handle this kind of thing */
+                if ($(evt.target).is('.config-tool')) {
+                    mount_point = $(evt.target).next().data('mount-point');
+                } else {
+                    // no current option menu
+                    mount_point = "";
+                }
+                _this.props.onOptionClick(mount_point);
+            }
+        });
+    }
+
+    componentWillUnmount() {
+        $("body").off('click.contextMenu');  // de-register our specific click handler
+    }
+
+    render() {
+        return (
+            <div className="contextMenu">
+                <ul>{
+                    this.props.items.map(function (o, i) {
+                        return (<li key={i}>
+                            <ToolTipLink
+                                href={o.href}
+                                classes={['context-link']}
+                                toolTip={o.tooltip}
+                                text={o.text}/>
+                        </li>)
+                    })}
+                </ul>
+            </div>
+        )
+    }
+}

http://git-wip-us.apache.org/repos/asf/allura/blob/8c9b371a/Allura/allura/public/nf/js/navbar.es6.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/navbar.es6.js b/Allura/allura/public/nf/js/navbar.es6.js
index 90c3998..e59d6c0 100644
--- a/Allura/allura/public/nf/js/navbar.es6.js
+++ b/Allura/allura/public/nf/js/navbar.es6.js
@@ -50,35 +50,7 @@ function slugify(text) {
         .replace(/^-+/,/^-+/,/^-+/,/^-+/, '')             // Trim - from start of text
         .replace(/-+$/,/-+$/,/-+$/,/-+$/, '');            // Trim - from end of text
 }
-/**
- * Get the color for a tool type
 
- * @constructor
- * @label string 'The default mount label for a tool.  i.e. git and hg use 'Code' which returns 'blue'.
- * @return {string}
- */
-
-function _getToolColor(defaultLabel='standard') {
-    // Replace with css... (if we even want to keep the color)
-    switch (defaultLabel) {
-    case 'Wiki':
-        return '#DDFFF0';
-    case 'Git':  // Git, svn, hg
-        return '#BBDEFB';
-    case 'Mercurial':  // Git, svn, hg
-        return '#BBDEFB';
-    case 'Tickets':
-        return '#D1C4E9';
-    case 'Discussion':
-        return '#DCEDC8';
-    case 'Blog':
-        return '#FFF9C4';
-    case 'Link':
-        return '#FFCDD2';
-    default:
-        return 'white';
-    }
-}
 /**
  * Get a mount point from a NavBarItem node.
 
@@ -157,9 +129,9 @@ var NavBarItem = React.createClass({
                     </span>
                 </a>
                 {this.props.currentOptionMenu.tool && this.props.currentOptionMenu.tool === this.props.mount_point &&
-                    <OptionsMenu
+                    <ContextMenu
                         {...this.props}
-                        options={this.props.options}
+                        items={this.props.options}
                         onOptionClick={this.props.onOptionClick}
                     />}
             </div>
@@ -171,55 +143,55 @@ var NavBarItem = React.createClass({
     }
 });
 
-/**
- * Options "context" menu
-
- * @constructor
- */
-var OptionsMenu = React.createClass({
-    propTypes: {
-        options: React.PropTypes.array.isRequired,
-        onOptionClick: React.PropTypes.func.isRequired
-    },
-
-    componentWillMount: function() {
-        var _this = this;
-        var mount_point;
-        $('body').on('click.optionMenu', function(evt) {
-            /* the :not filter should've worked as a 2nd param to .on() instead of this,
-               but clicks in the page gutter were being delayed for some reason */
-            if ($(evt.target).is(':not(.optionMenu)')) {
-
-                /* if clicking directly onto another gear, set it directly.
-                   this is necessary since sometimes our jquery events seem to interfere with the react event
-                   that is supposed to handle this kind of thing */
-                if ($(evt.target).is('.config-tool')) {
-                    mount_point = $(evt.target).next().data('mount-point');
-                } else {
-                    // no current option menu
-                    mount_point = "";
-                }
-                _this.props.onOptionClick(mount_point);
-            }
-        });
-    },
-
-    componentWillUnmount: function() {
-        $("body").off('click.optionMenu');  // de-register our specific click handler
-    },
-
-    render: function() {
-        return (<div className="optionMenu">
-            <ul>
-               {this.props.options.map((o, i) =>
-                    <li key={i}>
-                        <ToolTipLink href={o.href} classes={['context-link']} toolTip={this.props.toolTip} text={o.text}/>
-                    </li>
-                )}
-            </ul>
-        </div>)
-    }
-});
+///**
+// * Options "context" menu
+//
+// * @constructor
+// */
+//var OptionsMenu = React.createClass({
+//    propTypes: {
+//        options: React.PropTypes.array.isRequired,
+//        onOptionClick: React.PropTypes.func.isRequired
+//    },
+//
+//    componentWillMount: function() {
+//        var _this = this;
+//        var mount_point;
+//        $('body').on('click.optionMenu', function(evt) {
+//            /* the :not filter should've worked as a 2nd param to .on() instead of this,
+//               but clicks in the page gutter were being delayed for some reason */
+//            if ($(evt.target).is(':not(.optionMenu)')) {
+//
+//                /* if clicking directly onto another gear, set it directly.
+//                   this is necessary since sometimes our jquery events seem to interfere with the react event
+//                   that is supposed to handle this kind of thing */
+//                if ($(evt.target).is('.config-tool')) {
+//                    mount_point = $(evt.target).next().data('mount-point');
+//                } else {
+//                    // no current option menu
+//                    mount_point = "";
+//                }
+//                _this.props.onOptionClick(mount_point);
+//            }
+//        });
+//    },
+//
+//    componentWillUnmount: function() {
+//        $("body").off('click.optionMenu');  // de-register our specific click handler
+//    },
+//
+//    render: function() {
+//        return (<div className="optionMenu">
+//            <ul>
+//               {this.props.options.map((o, i) =>
+//                    <li key={i}>
+//                        <ToolTipLink href={o.href} classes={['context-link']} toolTip={this.props.toolTip} text={o.text}/>
+//                    </li>
+//                )}
+//            </ul>
+//        </div>)
+//    }
+//});
 
 /**
  * An input component that updates the NavBar's grouping threshold.
@@ -299,11 +271,24 @@ var ToggleAddNewTool = React.createClass({
             visible: !this.state.visible
         });
     },
-    render: function() {
-        return <AddNewToolButton
-            {...this.props}
-            showAddToolMenu={this.state.visible}
-            handleToggleAddNewTool={this.handleToggle} />;
+
+    onOptionClick: function(e) {
+        console.log("e", e);
+    },
+    render: function () {
+        return (
+            <div>
+                <a onClick={ this.handleToggle } className="add-tool-toggle">
+                    Add New...
+                </a>
+                {this.state.visible &&
+                <ContextMenu
+                    {...this.props}
+                    onOptionClick={this.onOptionClick}
+                    items={this.props.installableTools} />
+                }
+            </div>
+        )
     }
 });
 
@@ -329,6 +314,9 @@ var NormalNavBar = React.createClass({
         );
     },
 
+    onOptionClick: function(e){
+        console.log(e);
+    },
     render: function() {
         var listItems = this.props.items.map(this.buildMenu);
 
@@ -348,7 +336,12 @@ var NormalNavBar = React.createClass({
                 id="normal-nav-bar"
                 className="dropdown">
                 { listItems }
-                <li id="add-tool-container"><ToggleAddNewTool existingMounts={mount_points} /></li>
+                <li id="add-tool-container">
+                    <ToggleAddNewTool
+                        {...this.props}
+                        items={this.props.installableTools}
+                        onOptionClick={this.onOptionClick} />
+                </li>
             </ul>
         );
     }
@@ -491,6 +484,7 @@ var Main = React.createClass({
     propTypes: {
         initialData: React.PropTypes.shape({
             menu: React.PropTypes.arrayOf(ToolsPropType),
+            installableTools: React.PropTypes.array,
             grouping_threshold: React.PropTypes.number.isRequired
         }),
         installableTools: React.PropTypes.array
@@ -622,6 +616,7 @@ var Main = React.createClass({
                 return (
                     <AdminNav
                         tools={ _this.state.data.menu }
+                        installableTools={ _this.state.data.installable_tools }
                         data={ _this.state.data }
                         onToolReorder={ _this.onToolReorder }
                         onToolDragStart={ _this.onToolDragStart }
@@ -636,6 +631,7 @@ var Main = React.createClass({
                     <div>
                         <NormalNavBar
                             items={ _this.state.data.menu }
+                            installableTools={ _this.state.data.installable_tools }
                             />
                     </div>
                 );

http://git-wip-us.apache.org/repos/asf/allura/blob/8c9b371a/Allura/allura/templates/jinja_master/top_nav.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/jinja_master/top_nav.html b/Allura/allura/templates/jinja_master/top_nav.html
index a49e8c0..3dee011 100644
--- a/Allura/allura/templates/jinja_master/top_nav.html
+++ b/Allura/allura/templates/jinja_master/top_nav.html
@@ -48,15 +48,19 @@
     {% do g.register_forge_js('js/react-reorderable.min.js') %}
     {% do g.register_forge_js('js/build/transpiled.js') %} {# if we do more es6, we'll need to register this in other places, or maybe even global #}
     <script>
+    'use strict';
+    let _data = {{ h.escape_json(c.project.nav_data(admin_options=True))|safe  }};
         $(document).ready(function () {
-            $('#toggle-admin-btn').click(function() {
+            console.table({{_data }});
+            $('#toggle-admin-btn').click(function () {
                 ReactDOM.render(React.createElement(Main, {
-                    initialData: {{ h.escape_json(c.project.nav_data(admin_options=True))|safe }}
+                    initialData: _data
                 }), document.getElementById("top_nav_admin"));
             });
 
-            ReactDOM.render(React.createElement(ToggleAddNewTool),
-                            document.getElementById('add-tool-container'));
+            ReactDOM.render(React.createElement(ToggleAddNewTool, {
+                        installableTools: _data.installable_tools
+                    }), document.getElementById('add-tool-container'));
         });
     </script>
 {% endif %}


[38/50] [abbrv] allura git commit: [#7919] show Add Tool button in unlocked mode too. Its menu needs some class/style fixes

Posted by br...@apache.org.
[#7919] show Add Tool button in unlocked mode too.  Its menu needs some class/style fixes


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/152d783c
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/152d783c
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/152d783c

Branch: refs/heads/db/8034
Commit: 152d783c66f8d4531c1a6c5c14c11376a5fdbcd5
Parents: 825d820
Author: Dave Brondsema <da...@brondsema.net>
Authored: Thu Dec 10 17:47:41 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:40 2015 -0600

----------------------------------------------------------------------
 Allura/allura/public/nf/css/navbar.css   | 10 +++++++++-
 Allura/allura/public/nf/js/navbar.es6.js |  7 ++++---
 2 files changed, 13 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/152d783c/Allura/allura/public/nf/css/navbar.css
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/css/navbar.css b/Allura/allura/public/nf/css/navbar.css
index c6f07ce..4203c45 100644
--- a/Allura/allura/public/nf/css/navbar.css
+++ b/Allura/allura/public/nf/css/navbar.css
@@ -107,7 +107,6 @@
     margin: 10px 0;
 }
 
-#top_nav_admin .tb-item.anchored:last-child a,
 #top_nav_admin .tb-item-grouper a {
     border-right: 1px transparent;
 }
@@ -124,6 +123,15 @@
     background: #ccc;
 }
 
+/* .react-drag used to distinguish container used in locked vs unlocked modes */
+.react-drag #add-tool-container {
+    float: left;
+    margin-left: 10px;
+}
+.react-drag #add-tool-container .add-tool-toggle {
+    margin-top: 5px;
+}
+
 .tb-item-edit a {
     margin-left: 2px;
 }

http://git-wip-us.apache.org/repos/asf/allura/blob/152d783c/Allura/allura/public/nf/js/navbar.es6.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/navbar.es6.js b/Allura/allura/public/nf/js/navbar.es6.js
index 28f87c7..c0f9a1a 100644
--- a/Allura/allura/public/nf/js/navbar.es6.js
+++ b/Allura/allura/public/nf/js/navbar.es6.js
@@ -261,9 +261,7 @@ var NormalNavBar = React.createClass({
                 className="dropdown">
                 { listItems }
                 <li id="add-tool-container">
-                    <ToggleAddNewTool
-                        {...this.props}
-                        onOptionClick={this.onOptionClick} />
+                    <ToggleAddNewTool installableTools={this.props.installableTools}/>
                 </li>
             </ul>
         );
@@ -338,6 +336,9 @@ var AdminNav = React.createClass({
                     { tools }
                 </ReactReorderable>
                 { end_tools }
+                <div id="add-tool-container">
+                    <ToggleAddNewTool installableTools={this.props.installableTools}/>
+                </div>
             </div>
         );
     },


[02/50] [abbrv] allura git commit: [#7919] Add react tooltipster wrapper

Posted by br...@apache.org.
[#7919]  Add react tooltipster wrapper


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/2fe68097
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/2fe68097
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/2fe68097

Branch: refs/heads/db/8034
Commit: 2fe68097fb0fa64059bdf7c2a05f4568cf0a14b4
Parents: 6d9fbb2
Author: Heith Seewald <he...@gmail.com>
Authored: Thu Dec 3 10:52:35 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:54:29 2015 -0600

----------------------------------------------------------------------
 Allura/allura/public/nf/js/tooltip.es6.js | 70 +++++++++++++-------------
 1 file changed, 34 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/2fe68097/Allura/allura/public/nf/js/tooltip.es6.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/tooltip.es6.js b/Allura/allura/public/nf/js/tooltip.es6.js
index a86eac6..92ebb3c 100644
--- a/Allura/allura/public/nf/js/tooltip.es6.js
+++ b/Allura/allura/public/nf/js/tooltip.es6.js
@@ -18,7 +18,6 @@
 */
 'use strict';
 
-
 /**
  * React Tooltip (tooltipster) Base class
 
@@ -29,9 +28,39 @@ class ToolTip extends React.Component {
         super(props);
     }
 
+    static propTypes = {
+        animation: React.PropTypes.string,
+        speed: React.PropTypes.number,
+        position: React.PropTypes.string,
+        contentAsHTML: React.PropTypes.bool,
+        delay: React.PropTypes.number,
+        theme: React.PropTypes.string,
+        maxWidth: React.PropTypes.number,
+        trigger: React.PropTypes.string,
+        multiple: React.PropTypes.bool,
+        classes: React.PropTypes.array,
+        text: React.PropTypes.string.isRequired,
+        href: React.PropTypes.string.isRequired,
+        toolTip: React.PropTypes.string
+    };
+
+    static defaultProps = {
+        animation: 'fade',
+        speed: 150,
+        delay: 0,
+        maxWidth: 300,
+        multiple: true,
+        contentAsHTML: false,
+        position: 'left',
+        trigger: 'hover',
+        classes: [],
+        theme: 'tooltipster-light'
+    };
+
+
     componentDidMount() {
         var _this = this;
-        $(".tooltip-link").tooltipster({
+        $(".react-tooltip").tooltipster({
             animation: _this.props.animation,
             speed: _this.props.speed,
             delay: _this.props.delay,
@@ -41,42 +70,11 @@ class ToolTip extends React.Component {
             position: _this.props.position,
             multiple: _this.props.multiple,
             iconCloning: false,
-            maxWidth: this.props.maxWidth
-        }).focus(function () {
-            $(this).tooltipster('show');
-        }).blur(function () {
-            $(this).tooltipster('hide');
-        });
+            maxWidth: _this.props.maxWidth
+        })
     }
 
 }
-ToolTip.propTypes = {
-    animation: React.PropTypes.string,
-    speed: React.PropTypes.number,
-    position: React.PropTypes.string,
-    contentAsHTML: React.PropTypes.bool,
-    delay: React.PropTypes.number,
-    theme: React.PropTypes.string,
-    maxWidth: React.PropTypes.number,
-    trigger: React.PropTypes.string,
-    multiple: React.PropTypes.bool,
-    classes: React.PropTypes.array,
-    text: React.PropTypes.string.isRequired,
-    href: React.PropTypes.string.isRequired,
-    toolTip: React.PropTypes.string
-};
-
-ToolTip.defaultProps = {
-    animation: 'fade',
-    speed: 150,
-    delay: 0,
-    maxWidth: 300,
-    multiple: false,
-    contentAsHTML: false,
-    position: 'left',
-    trigger: 'hover',
-    theme: 'tooltipster-light'
-};
 
 /**
  * Tooltip Link
@@ -89,7 +87,7 @@ class ToolTipLink extends ToolTip {
     }
 
     render() {
-        var classes = this.props.classes.join(' ') + " tooltip-link";
+        var classes = this.props.classes.join(' ') + " react-tooltip";
         return <a href={this.props.href} className={classes} title={this.props.toolTip}>{this.props.text}</a>
     }
 }
\ No newline at end of file


[44/50] [abbrv] allura git commit: [#7919] upgrade react to 0.14.3, fixes an IE click issue

Posted by br...@apache.org.
http://git-wip-us.apache.org/repos/asf/allura/blob/9ed7d5f9/Allura/allura/public/nf/js/react-with-addons.min.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/react-with-addons.min.js b/Allura/allura/public/nf/js/react-with-addons.min.js
index db0b48e..52dce07 100644
--- a/Allura/allura/public/nf/js/react-with-addons.min.js
+++ b/Allura/allura/public/nf/js/react-with-addons.min.js
@@ -1,5 +1,5 @@
 /**
- * React (with addons) v0.14.1
+ * React (with addons) v0.14.3
  *
  * Copyright 2013-2015, Facebook, Inc.
  * All rights reserved.
@@ -9,8 +9,8 @@
  * of patent rights can be found in the PATENTS file in the same directory.
  *
  */
-!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.React=e()}}(function(){return function e(t,n,r){function o(i,u){if(!n[i]){if(!t[i]){var s="function"==typeof require&&require;if(!u&&s)return s(i,!0);if(a)return a(i,!0);var l=new Error("Cannot find module '"+i+"'");throw l.code="MODULE_NOT_FOUND",l}var c=n[i]={exports:{}};t[i][0].call(c.exports,function(e){var n=t[i][1][e];return o(n?n:e)},c,c.exports,e,t,n,r)}return n[i].exports}for(var a="function"==typeof require&&require,i=0;i<r.length;i++)o(r[i]);return o}({1:[function(e,t,n){"use strict";var r=e(22),o=e(26),a=e(37),i=e(29),u=e(62),s=e(91),l=e(93),c=e(115),p=e(137),d=e(140);e(168);o.addons={CSSTransitionGroup:i,LinkedStateMixin:r,PureRenderMixin:a,TransitionGroup:s,batchedUpdates:function(){return l.batchedUpdates.ap
 ply(this,arguments)},cloneWithProps:c,createFragment:u.create,shallowCompare:p,update:d},t.exports=o},{115:115,137:137,140:140,168:168,22:22,26:26,29:29,37:37,62:62,91:91,93:93}],2:[function(e,t,n){"use strict";var r=e(70),o=e(119),a=e(152),i={componentDidMount:function(){this.props.autoFocus&&a(o(this))}},u={Mixin:i,focusDOMComponent:function(){a(r.getNode(this._rootNodeID))}};t.exports=u},{119:119,152:152,70:70}],3:[function(e,t,n){"use strict";function r(){var e=window.opera;return"object"==typeof e&&"function"==typeof e.version&&parseInt(e.version(),10)<=12}function o(e){return(e.ctrlKey||e.altKey||e.metaKey)&&!(e.ctrlKey&&e.altKey)}function a(e){switch(e){case N.topCompositionStart:return w.compositionStart;case N.topCompositionEnd:return w.compositionEnd;case N.topCompositionUpdate:return w.compositionUpdate}}function i(e,t){return e===N.topKeyDown&&t.keyCode===E}function u(e,t){switch(e){case N.topKeyUp:return-1!==b.indexOf(t.keyCode);case N.topKeyDown:return t.keyCode!==E;ca
 se N.topKeyPress:case N.topMouseDown:case N.topBlur:return!0;default:return!1}}function s(e){var t=e.detail;return"object"==typeof t&&"data"in t?t.data:null}function l(e,t,n,r,o){var l,c;if(_?l=a(e):R?u(e,r)&&(l=w.compositionEnd):i(e,r)&&(l=w.compositionStart),!l)return null;P&&(R||l!==w.compositionStart?l===w.compositionEnd&&R&&(c=R.getData()):R=m.getPooled(t));var p=g.getPooled(l,n,r,o);if(c)p.data=c;else{var d=s(r);null!==d&&(p.data=d)}return h.accumulateTwoPhaseDispatches(p),p}function c(e,t){switch(e){case N.topCompositionEnd:return s(t);case N.topKeyPress:var n=t.which;return n!==T?null:(S=!0,M);case N.topTextInput:var r=t.data;return r===M&&S?null:r;default:return null}}function p(e,t){if(R){if(e===N.topCompositionEnd||u(e,t)){var n=R.getData();return m.release(R),R=null,n}return null}switch(e){case N.topPaste:return null;case N.topKeyPress:return t.which&&!o(t)?String.fromCharCode(t.which):null;case N.topCompositionEnd:return P?null:t.data;default:return null}}function d(e,t
 ,n,r,o){var a;if(a=D?c(e,r):p(e,r),!a)return null;var i=y.getPooled(w.beforeInput,n,r,o);return i.data=a,h.accumulateTwoPhaseDispatches(i),i}var f=e(15),h=e(19),v=e(144),m=e(20),g=e(100),y=e(104),C=e(163),b=[9,13,27,32],E=229,_=v.canUseDOM&&"CompositionEvent"in window,x=null;v.canUseDOM&&"documentMode"in document&&(x=document.documentMode);var D=v.canUseDOM&&"TextEvent"in window&&!x&&!r(),P=v.canUseDOM&&(!_||x&&x>8&&11>=x),T=32,M=String.fromCharCode(T),N=f.topLevelTypes,w={beforeInput:{phasedRegistrationNames:{bubbled:C({onBeforeInput:null}),captured:C({onBeforeInputCapture:null})},dependencies:[N.topCompositionEnd,N.topKeyPress,N.topTextInput,N.topPaste]},compositionEnd:{phasedRegistrationNames:{bubbled:C({onCompositionEnd:null}),captured:C({onCompositionEndCapture:null})},dependencies:[N.topBlur,N.topCompositionEnd,N.topKeyDown,N.topKeyPress,N.topKeyUp,N.topMouseDown]},compositionStart:{phasedRegistrationNames:{bubbled:C({onCompositionStart:null}),captured:C({onCompositionStartCap
 ture:null})},dependencies:[N.topBlur,N.topCompositionStart,N.topKeyDown,N.topKeyPress,N.topKeyUp,N.topMouseDown]},compositionUpdate:{phasedRegistrationNames:{bubbled:C({onCompositionUpdate:null}),captured:C({onCompositionUpdateCapture:null})},dependencies:[N.topBlur,N.topCompositionUpdate,N.topKeyDown,N.topKeyPress,N.topKeyUp,N.topMouseDown]}},S=!1,R=null,I={eventTypes:w,extractEvents:function(e,t,n,r,o){return[l(e,t,n,r,o),d(e,t,n,r,o)]}};t.exports=I},{100:100,104:104,144:144,15:15,163:163,19:19,20:20}],4:[function(e,t,n){"use strict";function r(e,t){return e+t.charAt(0).toUpperCase()+t.substring(1)}var o={animationIterationCount:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,stopOpacity:!0,strokeDashoffset:!0,strokeOpacity:!0,strokeWidth:!0},a=["Webkit","ms","Moz
 ","O"];Object.keys(o).forEach(function(e){a.forEach(function(t){o[r(t,e)]=o[e]})});var i={background:{backgroundAttachment:!0,backgroundColor:!0,backgroundImage:!0,backgroundPositionX:!0,backgroundPositionY:!0,backgroundRepeat:!0},backgroundPosition:{backgroundPositionX:!0,backgroundPositionY:!0},border:{borderWidth:!0,borderStyle:!0,borderColor:!0},borderBottom:{borderBottomWidth:!0,borderBottomStyle:!0,borderBottomColor:!0},borderLeft:{borderLeftWidth:!0,borderLeftStyle:!0,borderLeftColor:!0},borderRight:{borderRightWidth:!0,borderRightStyle:!0,borderRightColor:!0},borderTop:{borderTopWidth:!0,borderTopStyle:!0,borderTopColor:!0},font:{fontStyle:!0,fontVariant:!0,fontWeight:!0,fontSize:!0,lineHeight:!0,fontFamily:!0},outline:{outlineWidth:!0,outlineStyle:!0,outlineColor:!0}},u={isUnitlessNumber:o,shorthandPropertyExpansions:i};t.exports=u},{}],5:[function(e,t,n){"use strict";var r=e(4),o=e(144),a=e(76),i=(e(146),e(116)),u=e(157),s=e(165),l=(e(168),s(function(e){return u(e)})),c=!1
 ,p="cssFloat";if(o.canUseDOM){var d=document.createElement("div").style;try{d.font=""}catch(f){c=!0}void 0===document.documentElement.style.cssFloat&&(p="styleFloat")}var h={createMarkupForStyles:function(e){var t="";for(var n in e)if(e.hasOwnProperty(n)){var r=e[n];null!=r&&(t+=l(n)+":",t+=i(n,r)+";")}return t||null},setValueForStyles:function(e,t){var n=e.style;for(var o in t)if(t.hasOwnProperty(o)){var a=i(o,t[o]);if("float"===o&&(o=p),a)n[o]=a;else{var u=c&&r.shorthandPropertyExpansions[o];if(u)for(var s in u)n[s]="";else n[o]=""}}}};a.measureMethods(h,"CSSPropertyOperations",{setValueForStyles:"setValueForStyles"}),t.exports=h},{116:116,144:144,146:146,157:157,165:165,168:168,4:4,76:76}],6:[function(e,t,n){"use strict";function r(){this._callbacks=null,this._contexts=null}var o=e(25),a=e(24),i=e(158);a(r.prototype,{enqueue:function(e,t){this._callbacks=this._callbacks||[],this._contexts=this._contexts||[],this._callbacks.push(e),this._contexts.push(t)},notifyAll:function(){var 
 e=this._callbacks,t=this._contexts;if(e){e.length!==t.length?i(!1):void 0,this._callbacks=null,this._contexts=null;for(var n=0;n<e.length;n++)e[n].call(t[n]);e.length=0,t.length=0}},reset:function(){this._callbacks=null,this._contexts=null},destructor:function(){this.reset()}}),o.addPoolingTo(r),t.exports=r},{158:158,24:24,25:25}],7:[function(e,t,n){"use strict";function r(e){var t=e.nodeName&&e.nodeName.toLowerCase();return"select"===t||"input"===t&&"file"===e.type}function o(e){var t=x.getPooled(w.change,R,e,D(e));b.accumulateTwoPhaseDispatches(t),_.batchedUpdates(a,t)}function a(e){C.enqueueEvents(e),C.processEventQueue(!1)}function i(e,t){S=e,R=t,S.attachEvent("onchange",o)}function u(){S&&(S.detachEvent("onchange",o),S=null,R=null)}function s(e,t,n){return e===N.topChange?n:void 0}function l(e,t,n){e===N.topFocus?(u(),i(t,n)):e===N.topBlur&&u()}function c(e,t){S=e,R=t,I=e.value,k=Object.getOwnPropertyDescriptor(e.constructor.prototype,"value"),Object.defineProperty(S,"value",L)
 ,S.attachEvent("onpropertychange",d)}function p(){S&&(delete S.value,S.detachEvent("onpropertychange",d),S=null,R=null,I=null,k=null)}function d(e){if("value"===e.propertyName){var t=e.srcElement.value;t!==I&&(I=t,o(e))}}function f(e,t,n){return e===N.topInput?n:void 0}function h(e,t,n){e===N.topFocus?(p(),c(t,n)):e===N.topBlur&&p()}function v(e,t,n){return e!==N.topSelectionChange&&e!==N.topKeyUp&&e!==N.topKeyDown||!S||S.value===I?void 0:(I=S.value,R)}function m(e){return e.nodeName&&"input"===e.nodeName.toLowerCase()&&("checkbox"===e.type||"radio"===e.type)}function g(e,t,n){return e===N.topClick?n:void 0}var y=e(15),C=e(16),b=e(19),E=e(144),_=e(93),x=e(102),D=e(125),P=e(130),T=e(131),M=e(163),N=y.topLevelTypes,w={change:{phasedRegistrationNames:{bubbled:M({onChange:null}),captured:M({onChangeCapture:null})},dependencies:[N.topBlur,N.topChange,N.topClick,N.topFocus,N.topInput,N.topKeyDown,N.topKeyUp,N.topSelectionChange]}},S=null,R=null,I=null,k=null,O=!1;E.canUseDOM&&(O=P("change
 ")&&(!("documentMode"in document)||document.documentMode>8));var A=!1;E.canUseDOM&&(A=P("input")&&(!("documentMode"in document)||document.documentMode>9));var L={get:function(){return k.get.call(this)},set:function(e){I=""+e,k.set.call(this,e)}},U={eventTypes:w,extractEvents:function(e,t,n,o,a){var i,u;if(r(t)?O?i=s:u=l:T(t)?A?i=f:(i=v,u=h):m(t)&&(i=g),i){var c=i(e,t,n);if(c){var p=x.getPooled(w.change,c,o,a);return p.type="change",b.accumulateTwoPhaseDispatches(p),p}}u&&u(e,t,n)}};t.exports=U},{102:102,125:125,130:130,131:131,144:144,15:15,16:16,163:163,19:19,93:93}],8:[function(e,t,n){"use strict";var r=0,o={createReactRootIndex:function(){return r++}};t.exports=o},{}],9:[function(e,t,n){"use strict";function r(e,t,n){var r=n>=e.childNodes.length?null:e.childNodes.item(n);e.insertBefore(t,r)}var o=e(12),a=e(72),i=e(76),u=e(135),s=e(136),l=e(158),c={dangerouslyReplaceNodeWithMarkup:o.dangerouslyReplaceNodeWithMarkup,updateTextContent:s,processUpdates:function(e,t){for(var n,i=null,
 c=null,p=0;p<e.length;p++)if(n=e[p],n.type===a.MOVE_EXISTING||n.type===a.REMOVE_NODE){var d=n.fromIndex,f=n.parentNode.childNodes[d],h=n.parentID;f?void 0:l(!1),i=i||{},i[h]=i[h]||[],i[h][d]=f,c=c||[],c.push(f)}var v;if(v=t.length&&"string"==typeof t[0]?o.dangerouslyRenderMarkup(t):t,c)for(var m=0;m<c.length;m++)c[m].parentNode.removeChild(c[m]);for(var g=0;g<e.length;g++)switch(n=e[g],n.type){case a.INSERT_MARKUP:r(n.parentNode,v[n.markupIndex],n.toIndex);break;case a.MOVE_EXISTING:r(n.parentNode,i[n.parentID][n.fromIndex],n.toIndex);break;case a.SET_MARKUP:u(n.parentNode,n.content);break;case a.TEXT_CONTENT:s(n.parentNode,n.content);break;case a.REMOVE_NODE:}}};i.measureMethods(c,"DOMChildrenOperations",{updateTextContent:"updateTextContent"}),t.exports=c},{12:12,135:135,136:136,158:158,72:72,76:76}],10:[function(e,t,n){"use strict";function r(e,t){return(e&t)===t}var o=e(158),a={MUST_USE_ATTRIBUTE:1,MUST_USE_PROPERTY:2,HAS_SIDE_EFFECTS:4,HAS_BOOLEAN_VALUE:8,HAS_NUMERIC_VALUE:16,H
 AS_POSITIVE_NUMERIC_VALUE:48,HAS_OVERLOADED_BOOLEAN_VALUE:64,injectDOMPropertyConfig:function(e){var t=a,n=e.Properties||{},i=e.DOMAttributeNamespaces||{},s=e.DOMAttributeNames||{},l=e.DOMPropertyNames||{},c=e.DOMMutationMethods||{};e.isCustomAttribute&&u._isCustomAttributeFunctions.push(e.isCustomAttribute);for(var p in n){u.properties.hasOwnProperty(p)?o(!1):void 0;var d=p.toLowerCase(),f=n[p],h={attributeName:d,attributeNamespace:null,propertyName:p,mutationMethod:null,mustUseAttribute:r(f,t.MUST_USE_ATTRIBUTE),mustUseProperty:r(f,t.MUST_USE_PROPERTY),hasSideEffects:r(f,t.HAS_SIDE_EFFECTS),hasBooleanValue:r(f,t.HAS_BOOLEAN_VALUE),hasNumericValue:r(f,t.HAS_NUMERIC_VALUE),hasPositiveNumericValue:r(f,t.HAS_POSITIVE_NUMERIC_VALUE),hasOverloadedBooleanValue:r(f,t.HAS_OVERLOADED_BOOLEAN_VALUE)};if(h.mustUseAttribute&&h.mustUseProperty?o(!1):void 0,!h.mustUseProperty&&h.hasSideEffects?o(!1):void 0,h.hasBooleanValue+h.hasNumericValue+h.hasOverloadedBooleanValue<=1?void 0:o(!1),s.hasOwnPr
 operty(p)){var v=s[p];h.attributeName=v}i.hasOwnProperty(p)&&(h.attributeNamespace=i[p]),l.hasOwnProperty(p)&&(h.propertyName=l[p]),c.hasOwnProperty(p)&&(h.mutationMethod=c[p]),u.properties[p]=h}}},i={},u={ID_ATTRIBUTE_NAME:"data-reactid",properties:{},getPossibleStandardName:null,_isCustomAttributeFunctions:[],isCustomAttribute:function(e){for(var t=0;t<u._isCustomAttributeFunctions.length;t++){var n=u._isCustomAttributeFunctions[t];if(n(e))return!0}return!1},getDefaultValueForProperty:function(e,t){var n,r=i[e];return r||(i[e]=r={}),t in r||(n=document.createElement(e),r[t]=n[t]),r[t]},injection:a};t.exports=u},{158:158}],11:[function(e,t,n){"use strict";function r(e){return c.hasOwnProperty(e)?!0:l.hasOwnProperty(e)?!1:s.test(e)?(c[e]=!0,!0):(l[e]=!0,!1)}function o(e,t){return null==t||e.hasBooleanValue&&!t||e.hasNumericValue&&isNaN(t)||e.hasPositiveNumericValue&&1>t||e.hasOverloadedBooleanValue&&t===!1}var a=e(10),i=e(76),u=e(133),s=(e(168),/^[a-zA-Z_][\w\.\-]*$/),l={},c={},p={c
 reateMarkupForID:function(e){return a.ID_ATTRIBUTE_NAME+"="+u(e)},setAttributeForID:function(e,t){e.setAttribute(a.ID_ATTRIBUTE_NAME,t)},createMarkupForProperty:function(e,t){var n=a.properties.hasOwnProperty(e)?a.properties[e]:null;if(n){if(o(n,t))return"";var r=n.attributeName;return n.hasBooleanValue||n.hasOverloadedBooleanValue&&t===!0?r+'=""':r+"="+u(t)}return a.isCustomAttribute(e)?null==t?"":e+"="+u(t):null},createMarkupForCustomAttribute:function(e,t){return r(e)&&null!=t?e+"="+u(t):""},setValueForProperty:function(e,t,n){var r=a.properties.hasOwnProperty(t)?a.properties[t]:null;if(r){var i=r.mutationMethod;if(i)i(e,n);else if(o(r,n))this.deleteValueForProperty(e,t);else if(r.mustUseAttribute){var u=r.attributeName,s=r.attributeNamespace;s?e.setAttributeNS(s,u,""+n):r.hasBooleanValue||r.hasOverloadedBooleanValue&&n===!0?e.setAttribute(u,""):e.setAttribute(u,""+n)}else{var l=r.propertyName;r.hasSideEffects&&""+e[l]==""+n||(e[l]=n)}}else a.isCustomAttribute(t)&&p.setValueForAt
 tribute(e,t,n)},setValueForAttribute:function(e,t,n){r(t)&&(null==n?e.removeAttribute(t):e.setAttribute(t,""+n))},deleteValueForProperty:function(e,t){var n=a.properties.hasOwnProperty(t)?a.properties[t]:null;if(n){var r=n.mutationMethod;if(r)r(e,void 0);else if(n.mustUseAttribute)e.removeAttribute(n.attributeName);else{var o=n.propertyName,i=a.getDefaultValueForProperty(e.nodeName,o);n.hasSideEffects&&""+e[o]===i||(e[o]=i)}}else a.isCustomAttribute(t)&&e.removeAttribute(t)}};i.measureMethods(p,"DOMPropertyOperations",{setValueForProperty:"setValueForProperty",setValueForAttribute:"setValueForAttribute",deleteValueForProperty:"deleteValueForProperty"}),t.exports=p},{10:10,133:133,168:168,76:76}],12:[function(e,t,n){"use strict";function r(e){return e.substring(1,e.indexOf(" "))}var o=e(144),a=e(149),i=e(150),u=e(154),s=e(158),l=/^(<[^ \/>]+)/,c="data-danger-index",p={dangerouslyRenderMarkup:function(e){o.canUseDOM?void 0:s(!1);for(var t,n={},p=0;p<e.length;p++)e[p]?void 0:s(!1),t=r(
 e[p]),t=u(t)?t:"*",n[t]=n[t]||[],n[t][p]=e[p];var d=[],f=0;for(t in n)if(n.hasOwnProperty(t)){var h,v=n[t];for(h in v)if(v.hasOwnProperty(h)){var m=v[h];v[h]=m.replace(l,"$1 "+c+'="'+h+'" ')}for(var g=a(v.join(""),i),y=0;y<g.length;++y){var C=g[y];C.hasAttribute&&C.hasAttribute(c)&&(h=+C.getAttribute(c),C.removeAttribute(c),d.hasOwnProperty(h)?s(!1):void 0,d[h]=C,f+=1)}}return f!==d.length?s(!1):void 0,d.length!==e.length?s(!1):void 0,d},dangerouslyReplaceNodeWithMarkup:function(e,t){o.canUseDOM?void 0:s(!1),t?void 0:s(!1),"html"===e.tagName.toLowerCase()?s(!1):void 0;var n;n="string"==typeof t?a(t,i)[0]:t,e.parentNode.replaceChild(n,e)}};t.exports=p},{144:144,149:149,150:150,154:154,158:158}],13:[function(e,t,n){"use strict";var r=e(163),o=[r({ResponderEventPlugin:null}),r({SimpleEventPlugin:null}),r({TapEventPlugin:null}),r({EnterLeaveEventPlugin:null}),r({ChangeEventPlugin:null}),r({SelectEventPlugin:null}),r({BeforeInputEventPlugin:null})];t.exports=o},{163:163}],14:[function(e,
 t,n){"use strict";var r=e(15),o=e(19),a=e(106),i=e(70),u=e(163),s=r.topLevelTypes,l=i.getFirstReactDOM,c={mouseEnter:{registrationName:u({onMouseEnter:null}),dependencies:[s.topMouseOut,s.topMouseOver]},mouseLeave:{registrationName:u({onMouseLeave:null}),dependencies:[s.topMouseOut,s.topMouseOver]}},p=[null,null],d={eventTypes:c,extractEvents:function(e,t,n,r,u){if(e===s.topMouseOver&&(r.relatedTarget||r.fromElement))return null;if(e!==s.topMouseOut&&e!==s.topMouseOver)return null;var d;if(t.window===t)d=t;else{var f=t.ownerDocument;d=f?f.defaultView||f.parentWindow:window}var h,v,m="",g="";if(e===s.topMouseOut?(h=t,m=n,v=l(r.relatedTarget||r.toElement),v?g=i.getID(v):v=d,v=v||d):(h=d,v=t,g=n),h===v)return null;var y=a.getPooled(c.mouseLeave,m,r,u);y.type="mouseleave",y.target=h,y.relatedTarget=v;var C=a.getPooled(c.mouseEnter,g,r,u);return C.type="mouseenter",C.target=v,C.relatedTarget=h,o.accumulateEnterLeaveDispatches(y,C,m,g),p[0]=y,p[1]=C,p}};t.exports=d},{106:106,15:15,163:163
 ,19:19,70:70}],15:[function(e,t,n){"use strict";var r=e(162),o=r({bubbled:null,captured:null}),a=r({topAbort:null,topBlur:null,topCanPlay:null,topCanPlayThrough:null,topChange:null,topClick:null,topCompositionEnd:null,topCompositionStart:null,topCompositionUpdate:null,topContextMenu:null,topCopy:null,topCut:null,topDoubleClick:null,topDrag:null,topDragEnd:null,topDragEnter:null,topDragExit:null,topDragLeave:null,topDragOver:null,topDragStart:null,topDrop:null,topDurationChange:null,topEmptied:null,topEncrypted:null,topEnded:null,topError:null,topFocus:null,topInput:null,topKeyDown:null,topKeyPress:null,topKeyUp:null,topLoad:null,topLoadedData:null,topLoadedMetadata:null,topLoadStart:null,topMouseDown:null,topMouseMove:null,topMouseOut:null,topMouseOver:null,topMouseUp:null,topPaste:null,topPause:null,topPlay:null,topPlaying:null,topProgress:null,topRateChange:null,topReset:null,topScroll:null,topSeeked:null,topSeeking:null,topSelectionChange:null,topStalled:null,topSubmit:null,topSu
 spend:null,topTextInput:null,topTimeUpdate:null,topTouchCancel:null,topTouchEnd:null,topTouchMove:null,topTouchStart:null,topVolumeChange:null,topWaiting:null,topWheel:null}),i={topLevelTypes:a,PropagationPhases:o};t.exports=i},{162:162}],16:[function(e,t,n){"use strict";var r=e(17),o=e(18),a=e(59),i=e(112),u=e(121),s=e(158),l=(e(168),{}),c=null,p=function(e,t){e&&(o.executeDispatchesInOrder(e,t),e.isPersistent()||e.constructor.release(e))},d=function(e){return p(e,!0)},f=function(e){return p(e,!1)},h=null,v={injection:{injectMount:o.injection.injectMount,injectInstanceHandle:function(e){h=e},getInstanceHandle:function(){return h},injectEventPluginOrder:r.injectEventPluginOrder,injectEventPluginsByName:r.injectEventPluginsByName},eventNameDispatchConfigs:r.eventNameDispatchConfigs,registrationNameModules:r.registrationNameModules,putListener:function(e,t,n){"function"!=typeof n?s(!1):void 0;var o=l[t]||(l[t]={});o[e]=n;var a=r.registrationNameModules[t];a&&a.didPutListener&&a.didPut
 Listener(e,t,n)},getListener:function(e,t){var n=l[t];return n&&n[e]},deleteListener:function(e,t){var n=r.registrationNameModules[t];n&&n.willDeleteListener&&n.willDeleteListener(e,t);var o=l[t];o&&delete o[e]},deleteAllListeners:function(e){for(var t in l)if(l[t][e]){var n=r.registrationNameModules[t];n&&n.willDeleteListener&&n.willDeleteListener(e,t),delete l[t][e]}},extractEvents:function(e,t,n,o,a){for(var u,s=r.plugins,l=0;l<s.length;l++){var c=s[l];if(c){var p=c.extractEvents(e,t,n,o,a);p&&(u=i(u,p))}}return u},enqueueEvents:function(e){e&&(c=i(c,e))},processEventQueue:function(e){var t=c;c=null,e?u(t,d):u(t,f),c?s(!1):void 0,a.rethrowCaughtError()},__purge:function(){l={}},__getListenerBank:function(){return l}};t.exports=v},{112:112,121:121,158:158,168:168,17:17,18:18,59:59}],17:[function(e,t,n){"use strict";function r(){if(u)for(var e in s){var t=s[e],n=u.indexOf(e);if(n>-1?void 0:i(!1),!l.plugins[n]){t.extractEvents?void 0:i(!1),l.plugins[n]=t;var r=t.eventTypes;for(var a
  in r)o(r[a],t,a)?void 0:i(!1)}}}function o(e,t,n){l.eventNameDispatchConfigs.hasOwnProperty(n)?i(!1):void 0,l.eventNameDispatchConfigs[n]=e;var r=e.phasedRegistrationNames;if(r){for(var o in r)if(r.hasOwnProperty(o)){var u=r[o];a(u,t,n)}return!0}return e.registrationName?(a(e.registrationName,t,n),!0):!1}function a(e,t,n){l.registrationNameModules[e]?i(!1):void 0,l.registrationNameModules[e]=t,l.registrationNameDependencies[e]=t.eventTypes[n].dependencies}var i=e(158),u=null,s={},l={plugins:[],eventNameDispatchConfigs:{},registrationNameModules:{},registrationNameDependencies:{},injectEventPluginOrder:function(e){u?i(!1):void 0,u=Array.prototype.slice.call(e),r()},injectEventPluginsByName:function(e){var t=!1;for(var n in e)if(e.hasOwnProperty(n)){var o=e[n];s.hasOwnProperty(n)&&s[n]===o||(s[n]?i(!1):void 0,s[n]=o,t=!0)}t&&r()},getPluginModuleForEvent:function(e){var t=e.dispatchConfig;if(t.registrationName)return l.registrationNameModules[t.registrationName]||null;for(var n in t.p
 hasedRegistrationNames)if(t.phasedRegistrationNames.hasOwnProperty(n)){var r=l.registrationNameModules[t.phasedRegistrationNames[n]];if(r)return r}return null},_resetEventPlugins:function(){u=null;for(var e in s)s.hasOwnProperty(e)&&delete s[e];l.plugins.length=0;var t=l.eventNameDispatchConfigs;for(var n in t)t.hasOwnProperty(n)&&delete t[n];var r=l.registrationNameModules;for(var o in r)r.hasOwnProperty(o)&&delete r[o]}};t.exports=l},{158:158}],18:[function(e,t,n){"use strict";function r(e){return e===m.topMouseUp||e===m.topTouchEnd||e===m.topTouchCancel}function o(e){return e===m.topMouseMove||e===m.topTouchMove}function a(e){return e===m.topMouseDown||e===m.topTouchStart}function i(e,t,n,r){var o=e.type||"unknown-event";e.currentTarget=v.Mount.getNode(r),t?f.invokeGuardedCallbackWithCatch(o,n,e,r):f.invokeGuardedCallback(o,n,e,r),e.currentTarget=null}function u(e,t){var n=e._dispatchListeners,r=e._dispatchIDs;if(Array.isArray(n))for(var o=0;o<n.length&&!e.isPropagationStopped();
 o++)i(e,t,n[o],r[o]);else n&&i(e,t,n,r);e._dispatchListeners=null,e._dispatchIDs=null}function s(e){var t=e._dispatchListeners,n=e._dispatchIDs;if(Array.isArray(t)){for(var r=0;r<t.length&&!e.isPropagationStopped();r++)if(t[r](e,n[r]))return n[r]}else if(t&&t(e,n))return n;return null}function l(e){var t=s(e);return e._dispatchIDs=null,e._dispatchListeners=null,t}function c(e){var t=e._dispatchListeners,n=e._dispatchIDs;Array.isArray(t)?h(!1):void 0;var r=t?t(e,n):null;return e._dispatchListeners=null,e._dispatchIDs=null,r}function p(e){return!!e._dispatchListeners}var d=e(15),f=e(59),h=e(158),v=(e(168),{Mount:null,injectMount:function(e){v.Mount=e}}),m=d.topLevelTypes,g={isEndish:r,isMoveish:o,isStartish:a,executeDirectDispatch:c,executeDispatchesInOrder:u,executeDispatchesInOrderStopAtTrue:l,hasDispatches:p,getNode:function(e){return v.Mount.getNode(e)},getID:function(e){return v.Mount.getID(e)},injection:v};t.exports=g},{15:15,158:158,168:168,59:59}],19:[function(e,t,n){"use stri
 ct";function r(e,t,n){var r=t.dispatchConfig.phasedRegistrationNames[n];return y(e,r)}function o(e,t,n){var o=t?g.bubbled:g.captured,a=r(e,n,o);a&&(n._dispatchListeners=v(n._dispatchListeners,a),n._dispatchIDs=v(n._dispatchIDs,e))}function a(e){e&&e.dispatchConfig.phasedRegistrationNames&&h.injection.getInstanceHandle().traverseTwoPhase(e.dispatchMarker,o,e)}function i(e){e&&e.dispatchConfig.phasedRegistrationNames&&h.injection.getInstanceHandle().traverseTwoPhaseSkipTarget(e.dispatchMarker,o,e)}function u(e,t,n){if(n&&n.dispatchConfig.registrationName){var r=n.dispatchConfig.registrationName,o=y(e,r);o&&(n._dispatchListeners=v(n._dispatchListeners,o),n._dispatchIDs=v(n._dispatchIDs,e))}}function s(e){e&&e.dispatchConfig.registrationName&&u(e.dispatchMarker,null,e)}function l(e){m(e,a)}function c(e){m(e,i)}function p(e,t,n,r){h.injection.getInstanceHandle().traverseEnterLeave(n,r,u,e,t)}function d(e){m(e,s)}var f=e(15),h=e(16),v=(e(168),e(112)),m=e(121),g=f.PropagationPhases,y=h.get
 Listener,C={accumulateTwoPhaseDispatches:l,accumulateTwoPhaseDispatchesSkipTarget:c,accumulateDirectDispatches:d,accumulateEnterLeaveDispatches:p};t.exports=C},{112:112,121:121,15:15,16:16,168:168}],20:[function(e,t,n){"use strict";function r(e){this._root=e,this._startText=this.getText(),this._fallbackText=null}var o=e(25),a=e(24),i=e(128);a(r.prototype,{destructor:function(){this._root=null,this._startText=null,this._fallbackText=null},getText:function(){return"value"in this._root?this._root.value:this._root[i()]},getData:function(){if(this._fallbackText)return this._fallbackText;var e,t,n=this._startText,r=n.length,o=this.getText(),a=o.length;for(e=0;r>e&&n[e]===o[e];e++);var i=r-e;for(t=1;i>=t&&n[r-t]===o[a-t];t++);var u=t>1?1-t:void 0;return this._fallbackText=o.slice(e,u),this._fallbackText}}),o.addPoolingTo(r),t.exports=r},{128:128,24:24,25:25}],21:[function(e,t,n){"use strict";var r,o=e(10),a=e(144),i=o.injection.MUST_USE_ATTRIBUTE,u=o.injection.MUST_USE_PROPERTY,s=o.injecti
 on.HAS_BOOLEAN_VALUE,l=o.injection.HAS_SIDE_EFFECTS,c=o.injection.HAS_NUMERIC_VALUE,p=o.injection.HAS_POSITIVE_NUMERIC_VALUE,d=o.injection.HAS_OVERLOADED_BOOLEAN_VALUE;if(a.canUseDOM){var f=document.implementation;r=f&&f.hasFeature&&f.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")}var h={isCustomAttribute:RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\d_.\-]*$/),Properties:{accept:null,acceptCharset:null,accessKey:null,action:null,allowFullScreen:i|s,allowTransparency:i,alt:null,async:s,autoComplete:null,autoPlay:s,capture:i|s,cellPadding:null,cellSpacing:null,charSet:i,challenge:i,checked:u|s,classID:i,className:r?i:u,cols:i|p,colSpan:null,content:null,contentEditable:null,contextMenu:i,controls:u|s,coords:null,crossOrigin:null,data:null,dateTime:i,"default":s,defer:s,dir:null,disabled:i|s,download:d,draggable:null,encType:null,form:i,formAction:i,formEncType:i,formMethod:i,formNoValidate:s,formTarget:i,frameBorder:i,headers:null,height:i,hidden:i|s,high
 :null,href:null,hrefLang:null,htmlFor:null,httpEquiv:null,icon:null,id:u,inputMode:i,is:i,keyParams:i,keyType:i,kind:null,label:null,lang:null,list:i,loop:u|s,low:null,manifest:i,marginHeight:null,marginWidth:null,max:null,maxLength:i,media:i,mediaGroup:null,method:null,min:null,minLength:i,multiple:u|s,muted:u|s,name:null,noValidate:s,open:s,optimum:null,pattern:null,placeholder:null,poster:null,preload:null,radioGroup:null,readOnly:u|s,rel:null,required:s,role:i,rows:i|p,rowSpan:null,sandbox:null,scope:null,scoped:s,scrolling:null,seamless:i|s,selected:u|s,shape:null,size:i|p,sizes:i,span:p,spellCheck:null,src:null,srcDoc:u,srcLang:null,srcSet:i,start:c,step:null,style:null,summary:null,tabIndex:null,target:null,title:null,type:null,useMap:null,value:u|l,width:i,wmode:i,wrap:null,about:i,datatype:i,inlist:i,prefix:i,property:i,resource:i,"typeof":i,vocab:i,autoCapitalize:null,autoCorrect:null,autoSave:null,color:null,itemProp:i,itemScope:i|s,itemType:i,itemID:i,itemRef:i,results:n
 ull,security:i,unselectable:i},DOMAttributeNames:{acceptCharset:"accept-charset",className:"class",htmlFor:"for",httpEquiv:"http-equiv"},DOMPropertyNames:{autoCapitalize:"autocapitalize",autoComplete:"autocomplete",autoCorrect:"autocorrect",autoFocus:"autofocus",autoPlay:"autoplay",autoSave:"autosave",encType:"encoding",hrefLang:"hreflang",radioGroup:"radiogroup",spellCheck:"spellcheck",srcDoc:"srcdoc",srcSet:"srcset"}};t.exports=h},{10:10,144:144}],22:[function(e,t,n){"use strict";var r=e(68),o=e(88),a={linkState:function(e){return new r(this.state[e],o.createStateKeySetter(this,e))}};t.exports=a},{68:68,88:88}],23:[function(e,t,n){"use strict";function r(e){null!=e.checkedLink&&null!=e.valueLink?l(!1):void 0}function o(e){r(e),null!=e.value||null!=e.onChange?l(!1):void 0}function a(e){r(e),null!=e.checked||null!=e.onChange?l(!1):void 0}function i(e){if(e){var t=e.getName();if(t)return" Check the render method of `"+t+"`."}return""}var u=e(80),s=e(79),l=e(158),c=(e(168),{button:!0,
 checkbox:!0,image:!0,hidden:!0,radio:!0,reset:!0,submit:!0}),p={value:function(e,t,n){return!e[t]||c[e.type]||e.onChange||e.readOnly||e.disabled?null:new Error("You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.")},checked:function(e,t,n){return!e[t]||e.onChange||e.readOnly||e.disabled?null:new Error("You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`.")},onChange:u.func},d={},f={checkPropTypes:function(e,t,n){for(var r in p){if(p.hasOwnProperty(r))var o=p[r](t,r,e,s.prop);o instanceof Error&&!(o.message in d)&&(d[o.message]=!0,i(n))}},getValue:function(e){return e.valueLink?(o(e),e.valueLink.value):e.value},getChecked:function(e){return e.checkedLink?(a(e),e.checkedL
 ink.value):e.checked},executeOnChange:function(e,t){return e.valueLink?(o(e),e.valueLink.requestChange(t.target.value)):e.checkedLink?(a(e),e.checkedLink.requestChange(t.target.checked)):e.onChange?e.onChange.call(void 0,t):void 0}};t.exports=f},{158:158,168:168,79:79,80:80}],24:[function(e,t,n){"use strict";function r(e,t){if(null==e)throw new TypeError("Object.assign target cannot be null or undefined");for(var n=Object(e),r=Object.prototype.hasOwnProperty,o=1;o<arguments.length;o++){var a=arguments[o];if(null!=a){var i=Object(a);for(var u in i)r.call(i,u)&&(n[u]=i[u])}}return n}t.exports=r},{}],25:[function(e,t,n){"use strict";var r=e(158),o=function(e){var t=this;if(t.instancePool.length){var n=t.instancePool.pop();return t.call(n,e),n}return new t(e)},a=function(e,t){var n=this;if(n.instancePool.length){var r=n.instancePool.pop();return n.call(r,e,t),r}return new n(e,t)},i=function(e,t,n){var r=this;if(r.instancePool.length){var o=r.instancePool.pop();return r.call(o,e,t,n),o}r
 eturn new r(e,t,n)},u=function(e,t,n,r){var o=this;if(o.instancePool.length){var a=o.instancePool.pop();return o.call(a,e,t,n,r),a}return new o(e,t,n,r)},s=function(e,t,n,r,o){var a=this;if(a.instancePool.length){var i=a.instancePool.pop();return a.call(i,e,t,n,r,o),i}return new a(e,t,n,r,o)},l=function(e){var t=this;e instanceof t?void 0:r(!1),e.destructor(),t.instancePool.length<t.poolSize&&t.instancePool.push(e)},c=10,p=o,d=function(e,t){var n=e;return n.instancePool=[],n.getPooled=t||p,n.poolSize||(n.poolSize=c),n.release=l,n},f={addPoolingTo:d,oneArgumentPooler:o,twoArgumentPooler:a,threeArgumentPooler:i,fourArgumentPooler:u,fiveArgumentPooler:s};t.exports=f},{158:158}],26:[function(e,t,n){"use strict";var r=e(40),o=e(50),a=e(67),i=e(24),u=e(117),s={};i(s,a),i(s,{findDOMNode:u("findDOMNode","ReactDOM","react-dom",r,r.findDOMNode),render:u("render","ReactDOM","react-dom",r,r.render),unmountComponentAtNode:u("unmountComponentAtNode","ReactDOM","react-dom",r,r.unmountComponentAtNo
 de),renderToString:u("renderToString","ReactDOMServer","react-dom/server",o,o.renderToString),renderToStaticMarkup:u("renderToStaticMarkup","ReactDOMServer","react-dom/server",o,o.renderToStaticMarkup)}),s.__SECRET_DOM_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=r,t.exports=s},{117:117,24:24,40:40,50:50,67:67}],27:[function(e,t,n){"use strict";var r=(e(66),e(119)),o=(e(168),"_getDOMNodeDidWarn"),a={getDOMNode:function(){return this.constructor[o]=!0,r(this)}};t.exports=a},{119:119,168:168,66:66}],28:[function(e,t,n){"use strict";function r(e){return Object.prototype.hasOwnProperty.call(e,m)||(e[m]=h++,d[e[m]]={}),d[e[m]]}var o=e(15),a=e(16),i=e(17),u=e(60),s=e(76),l=e(111),c=e(24),p=e(130),d={},f=!1,h=0,v={topAbort:"abort",topBlur:"blur",topCanPlay:"canplay",topCanPlayThrough:"canplaythrough",topChange:"change",topClick:"click",topCompositionEnd:"compositionend",topCompositionStart:"compositionstart",topCompositionUpdate:"compositionupdate",topContextMenu:"contextmenu",topCopy:"copy",topCut:"cu
 t",topDoubleClick:"dblclick",topDrag:"drag",topDragEnd:"dragend",topDragEnter:"dragenter",topDragExit:"dragexit",
-topDragLeave:"dragleave",topDragOver:"dragover",topDragStart:"dragstart",topDrop:"drop",topDurationChange:"durationchange",topEmptied:"emptied",topEncrypted:"encrypted",topEnded:"ended",topError:"error",topFocus:"focus",topInput:"input",topKeyDown:"keydown",topKeyPress:"keypress",topKeyUp:"keyup",topLoadedData:"loadeddata",topLoadedMetadata:"loadedmetadata",topLoadStart:"loadstart",topMouseDown:"mousedown",topMouseMove:"mousemove",topMouseOut:"mouseout",topMouseOver:"mouseover",topMouseUp:"mouseup",topPaste:"paste",topPause:"pause",topPlay:"play",topPlaying:"playing",topProgress:"progress",topRateChange:"ratechange",topScroll:"scroll",topSeeked:"seeked",topSeeking:"seeking",topSelectionChange:"selectionchange",topStalled:"stalled",topSuspend:"suspend",topTextInput:"textInput",topTimeUpdate:"timeupdate",topTouchCancel:"touchcancel",topTouchEnd:"touchend",topTouchMove:"touchmove",topTouchStart:"touchstart",topVolumeChange:"volumechange",topWaiting:"waiting",topWheel:"wheel"},m="_react
 ListenersID"+String(Math.random()).slice(2),g=c({},u,{ReactEventListener:null,injection:{injectReactEventListener:function(e){e.setHandleTopLevel(g.handleTopLevel),g.ReactEventListener=e}},setEnabled:function(e){g.ReactEventListener&&g.ReactEventListener.setEnabled(e)},isEnabled:function(){return!(!g.ReactEventListener||!g.ReactEventListener.isEnabled())},listenTo:function(e,t){for(var n=t,a=r(n),u=i.registrationNameDependencies[e],s=o.topLevelTypes,l=0;l<u.length;l++){var c=u[l];a.hasOwnProperty(c)&&a[c]||(c===s.topWheel?p("wheel")?g.ReactEventListener.trapBubbledEvent(s.topWheel,"wheel",n):p("mousewheel")?g.ReactEventListener.trapBubbledEvent(s.topWheel,"mousewheel",n):g.ReactEventListener.trapBubbledEvent(s.topWheel,"DOMMouseScroll",n):c===s.topScroll?p("scroll",!0)?g.ReactEventListener.trapCapturedEvent(s.topScroll,"scroll",n):g.ReactEventListener.trapBubbledEvent(s.topScroll,"scroll",g.ReactEventListener.WINDOW_HANDLE):c===s.topFocus||c===s.topBlur?(p("focus",!0)?(g.ReactEventL
 istener.trapCapturedEvent(s.topFocus,"focus",n),g.ReactEventListener.trapCapturedEvent(s.topBlur,"blur",n)):p("focusin")&&(g.ReactEventListener.trapBubbledEvent(s.topFocus,"focusin",n),g.ReactEventListener.trapBubbledEvent(s.topBlur,"focusout",n)),a[s.topBlur]=!0,a[s.topFocus]=!0):v.hasOwnProperty(c)&&g.ReactEventListener.trapBubbledEvent(c,v[c],n),a[c]=!0)}},trapBubbledEvent:function(e,t,n){return g.ReactEventListener.trapBubbledEvent(e,t,n)},trapCapturedEvent:function(e,t,n){return g.ReactEventListener.trapCapturedEvent(e,t,n)},ensureScrollValueMonitoring:function(){if(!f){var e=l.refreshScrollValues;g.ReactEventListener.monitorScrollValue(e),f=!0}},eventNameDispatchConfigs:a.eventNameDispatchConfigs,registrationNameModules:a.registrationNameModules,putListener:a.putListener,getListener:a.getListener,deleteListener:a.deleteListener,deleteAllListeners:a.deleteAllListeners});s.measureMethods(g,"ReactBrowserEventEmitter",{putListener:"putListener",deleteListener:"deleteListener"}),t.
 exports=g},{111:111,130:130,15:15,16:16,17:17,24:24,60:60,76:76}],29:[function(e,t,n){"use strict";function r(e){var t="transition"+e+"Timeout",n="transition"+e;return function(e){if(e[n]){if(null==e[t])return new Error(t+" wasn't supplied to ReactCSSTransitionGroup: this can cause unreliable animations and won't be supported in a future version of React. See https://fb.me/react-animation-transition-group-timeout for more information.");if("number"!=typeof e[t])return new Error(t+" must be a number (in milliseconds)")}}}var o=e(26),a=e(24),i=e(91),u=e(30),s=o.createClass({displayName:"ReactCSSTransitionGroup",propTypes:{transitionName:u.propTypes.name,transitionAppear:o.PropTypes.bool,transitionEnter:o.PropTypes.bool,transitionLeave:o.PropTypes.bool,transitionAppearTimeout:r("Appear"),transitionEnterTimeout:r("Enter"),transitionLeaveTimeout:r("Leave")},getDefaultProps:function(){return{transitionAppear:!1,transitionEnter:!0,transitionLeave:!0}},_wrapChild:function(e){return o.create
 Element(u,{name:this.props.transitionName,appear:this.props.transitionAppear,enter:this.props.transitionEnter,leave:this.props.transitionLeave,appearTimeout:this.props.transitionAppearTimeout,enterTimeout:this.props.transitionEnterTimeout,leaveTimeout:this.props.transitionLeaveTimeout},e)},render:function(){return o.createElement(i,a({},this.props,{childFactory:this._wrapChild}))}});t.exports=s},{24:24,26:26,30:30,91:91}],30:[function(e,t,n){"use strict";var r=e(26),o=e(40),a=e(142),i=e(90),u=e(132),s=17,l=r.createClass({displayName:"ReactCSSTransitionGroupChild",propTypes:{name:r.PropTypes.oneOfType([r.PropTypes.string,r.PropTypes.shape({enter:r.PropTypes.string,leave:r.PropTypes.string,active:r.PropTypes.string}),r.PropTypes.shape({enter:r.PropTypes.string,enterActive:r.PropTypes.string,leave:r.PropTypes.string,leaveActive:r.PropTypes.string,appear:r.PropTypes.string,appearActive:r.PropTypes.string})]).isRequired,appear:r.PropTypes.bool,enter:r.PropTypes.bool,leave:r.PropTypes.boo
 l,appearTimeout:r.PropTypes.number,enterTimeout:r.PropTypes.number,leaveTimeout:r.PropTypes.number},transition:function(e,t,n){var r=o.findDOMNode(this);if(!r)return void(t&&t());var u=this.props.name[e]||this.props.name+"-"+e,s=this.props.name[e+"Active"]||u+"-active",l=null,c=function(e){e&&e.target!==r||(clearTimeout(l),a.removeClass(r,u),a.removeClass(r,s),i.removeEndEventListener(r,c),t&&t())};a.addClass(r,u),this.queueClass(s),n?l=setTimeout(c,n):i.addEndEventListener(r,c)},queueClass:function(e){this.classNameQueue.push(e),this.timeout||(this.timeout=setTimeout(this.flushClassNameQueue,s))},flushClassNameQueue:function(){this.isMounted()&&this.classNameQueue.forEach(a.addClass.bind(a,o.findDOMNode(this))),this.classNameQueue.length=0,this.timeout=null},componentWillMount:function(){this.classNameQueue=[]},componentWillUnmount:function(){this.timeout&&clearTimeout(this.timeout)},componentWillAppear:function(e){this.props.appear?this.transition("appear",e,this.props.appearTimeo
 ut):e()},componentWillEnter:function(e){this.props.enter?this.transition("enter",e,this.props.enterTimeout):e()},componentWillLeave:function(e){this.props.leave?this.transition("leave",e,this.props.leaveTimeout):e()},render:function(){return u(this.props.children)}});t.exports=l},{132:132,142:142,26:26,40:40,90:90}],31:[function(e,t,n){"use strict";function r(e,t,n){var r=void 0===e[n];null!=t&&r&&(e[n]=a(t,null))}var o=e(82),a=e(129),i=e(138),u=e(139),s=(e(168),{instantiateChildren:function(e,t,n){if(null==e)return null;var o={};return u(e,r,o),o},updateChildren:function(e,t,n,r){if(!t&&!e)return null;var u;for(u in t)if(t.hasOwnProperty(u)){var s=e&&e[u],l=s&&s._currentElement,c=t[u];if(null!=s&&i(l,c))o.receiveComponent(s,c,n,r),t[u]=s;else{s&&o.unmountComponent(s,u);var p=a(c,null);t[u]=p}}for(u in e)!e.hasOwnProperty(u)||t&&t.hasOwnProperty(u)||o.unmountComponent(e[u]);return t},unmountChildren:function(e){for(var t in e)if(e.hasOwnProperty(t)){var n=e[t];o.unmountComponent(n)}
 }});t.exports=s},{129:129,138:138,139:139,168:168,82:82}],32:[function(e,t,n){"use strict";function r(e){return(""+e).replace(b,"//")}function o(e,t){this.func=e,this.context=t,this.count=0}function a(e,t,n){var r=e.func,o=e.context;r.call(o,t,e.count++)}function i(e,t,n){if(null==e)return e;var r=o.getPooled(t,n);g(e,a,r),o.release(r)}function u(e,t,n,r){this.result=e,this.keyPrefix=t,this.func=n,this.context=r,this.count=0}function s(e,t,n){var o=e.result,a=e.keyPrefix,i=e.func,u=e.context,s=i.call(u,t,e.count++);Array.isArray(s)?l(s,o,n,m.thatReturnsArgument):null!=s&&(v.isValidElement(s)&&(s=v.cloneAndReplaceKey(s,a+(s!==t?r(s.key||"")+"/":"")+n)),o.push(s))}function l(e,t,n,o,a){var i="";null!=n&&(i=r(n)+"/");var l=u.getPooled(t,i,o,a);g(e,s,l),u.release(l)}function c(e,t,n){if(null==e)return e;var r=[];return l(e,r,null,t,n),r}function p(e,t,n){return null}function d(e,t){return g(e,p,null)}function f(e){var t=[];return l(e,t,null,m.thatReturnsArgument),t}var h=e(25),v=e(55),m
 =e(150),g=e(139),y=h.twoArgumentPooler,C=h.fourArgumentPooler,b=/\/(?!\/)/g;o.prototype.destructor=function(){this.func=null,this.context=null,this.count=0},h.addPoolingTo(o,y),u.prototype.destructor=function(){this.result=null,this.keyPrefix=null,this.func=null,this.context=null,this.count=0},h.addPoolingTo(u,C);var E={forEach:i,map:c,mapIntoWithKeyPrefixInternal:l,count:d,toArray:f};t.exports=E},{139:139,150:150,25:25,55:55}],33:[function(e,t,n){"use strict";function r(e,t){var n=_.hasOwnProperty(t)?_[t]:null;D.hasOwnProperty(t)&&(n!==b.OVERRIDE_BASE?m(!1):void 0),e.hasOwnProperty(t)&&(n!==b.DEFINE_MANY&&n!==b.DEFINE_MANY_MERGED?m(!1):void 0)}function o(e,t){if(t){"function"==typeof t?m(!1):void 0,d.isValidElement(t)?m(!1):void 0;var n=e.prototype;t.hasOwnProperty(C)&&x.mixins(e,t.mixins);for(var o in t)if(t.hasOwnProperty(o)&&o!==C){var a=t[o];if(r(n,o),x.hasOwnProperty(o))x[o](e,a);else{var i=_.hasOwnProperty(o),l=n.hasOwnProperty(o),c="function"==typeof a,p=c&&!i&&!l&&t.autobin
 d!==!1;if(p)n.__reactAutoBindMap||(n.__reactAutoBindMap={}),n.__reactAutoBindMap[o]=a,n[o]=a;else if(l){var f=_[o];!i||f!==b.DEFINE_MANY_MERGED&&f!==b.DEFINE_MANY?m(!1):void 0,f===b.DEFINE_MANY_MERGED?n[o]=u(n[o],a):f===b.DEFINE_MANY&&(n[o]=s(n[o],a))}else n[o]=a}}}}function a(e,t){if(t)for(var n in t){var r=t[n];if(t.hasOwnProperty(n)){var o=n in x;o?m(!1):void 0;var a=n in e;a?m(!1):void 0,e[n]=r}}}function i(e,t){e&&t&&"object"==typeof e&&"object"==typeof t?void 0:m(!1);for(var n in t)t.hasOwnProperty(n)&&(void 0!==e[n]?m(!1):void 0,e[n]=t[n]);return e}function u(e,t){return function(){var n=e.apply(this,arguments),r=t.apply(this,arguments);if(null==n)return r;if(null==r)return n;var o={};return i(o,n),i(o,r),o}}function s(e,t){return function(){e.apply(this,arguments),t.apply(this,arguments)}}function l(e,t){var n=t.bind(e);return n}function c(e){for(var t in e.__reactAutoBindMap)if(e.__reactAutoBindMap.hasOwnProperty(t)){var n=e.__reactAutoBindMap[t];e[t]=l(e,n)}}var p=e(34),d=
 e(55),f=(e(79),e(78),e(74)),h=e(24),v=e(151),m=e(158),g=e(162),y=e(163),C=(e(168),y({mixins:null})),b=g({DEFINE_ONCE:null,DEFINE_MANY:null,OVERRIDE_BASE:null,DEFINE_MANY_MERGED:null}),E=[],_={mixins:b.DEFINE_MANY,statics:b.DEFINE_MANY,propTypes:b.DEFINE_MANY,contextTypes:b.DEFINE_MANY,childContextTypes:b.DEFINE_MANY,getDefaultProps:b.DEFINE_MANY_MERGED,getInitialState:b.DEFINE_MANY_MERGED,getChildContext:b.DEFINE_MANY_MERGED,render:b.DEFINE_ONCE,componentWillMount:b.DEFINE_MANY,componentDidMount:b.DEFINE_MANY,componentWillReceiveProps:b.DEFINE_MANY,shouldComponentUpdate:b.DEFINE_ONCE,componentWillUpdate:b.DEFINE_MANY,componentDidUpdate:b.DEFINE_MANY,componentWillUnmount:b.DEFINE_MANY,updateComponent:b.OVERRIDE_BASE},x={displayName:function(e,t){e.displayName=t},mixins:function(e,t){if(t)for(var n=0;n<t.length;n++)o(e,t[n])},childContextTypes:function(e,t){e.childContextTypes=h({},e.childContextTypes,t)},contextTypes:function(e,t){e.contextTypes=h({},e.contextTypes,t)},getDefaultProp
 s:function(e,t){e.getDefaultProps?e.getDefaultProps=u(e.getDefaultProps,t):e.getDefaultProps=t},propTypes:function(e,t){e.propTypes=h({},e.propTypes,t)},statics:function(e,t){a(e,t)},autobind:function(){}},D={replaceState:function(e,t){this.updater.enqueueReplaceState(this,e),t&&this.updater.enqueueCallback(this,t)},isMounted:function(){return this.updater.isMounted(this)},setProps:function(e,t){this.updater.enqueueSetProps(this,e),t&&this.updater.enqueueCallback(this,t)},replaceProps:function(e,t){this.updater.enqueueReplaceProps(this,e),t&&this.updater.enqueueCallback(this,t)}},P=function(){};h(P.prototype,p.prototype,D);var T={createClass:function(e){var t=function(e,t,n){this.__reactAutoBindMap&&c(this),this.props=e,this.context=t,this.refs=v,this.updater=n||f,this.state=null;var r=this.getInitialState?this.getInitialState():null;"object"!=typeof r||Array.isArray(r)?m(!1):void 0,this.state=r};t.prototype=new P,t.prototype.constructor=t,E.forEach(o.bind(null,t)),o(t,e),t.getDefau
 ltProps&&(t.defaultProps=t.getDefaultProps()),t.prototype.render?void 0:m(!1);for(var n in _)t.prototype[n]||(t.prototype[n]=null);return t},injection:{injectMixin:function(e){E.push(e)}}};t.exports=T},{151:151,158:158,162:162,163:163,168:168,24:24,34:34,55:55,74:74,78:78,79:79}],34:[function(e,t,n){"use strict";function r(e,t,n){this.props=e,this.context=t,this.refs=a,this.updater=n||o}var o=e(74),a=(e(114),e(151)),i=e(158);e(168);r.prototype.isReactComponent={},r.prototype.setState=function(e,t){"object"!=typeof e&&"function"!=typeof e&&null!=e?i(!1):void 0,this.updater.enqueueSetState(this,e),t&&this.updater.enqueueCallback(this,t)},r.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this),e&&this.updater.enqueueCallback(this,e)};t.exports=r},{114:114,151:151,158:158,168:168,74:74}],35:[function(e,t,n){"use strict";var r=e(45),o=e(70),a={processChildrenUpdates:r.dangerouslyProcessChildrenUpdates,replaceNodeWithMarkupByID:r.dangerouslyReplaceNodeWithMarkupByID,unmo
 untIDFromEnvironment:function(e){o.purgeID(e)}};t.exports=a},{45:45,70:70}],36:[function(e,t,n){"use strict";var r=e(158),o=!1,a={unmountIDFromEnvironment:null,replaceNodeWithMarkupByID:null,processChildrenUpdates:null,injection:{injectEnvironment:function(e){o?r(!1):void 0,a.unmountIDFromEnvironment=e.unmountIDFromEnvironment,a.replaceNodeWithMarkupByID=e.replaceNodeWithMarkupByID,a.processChildrenUpdates=e.processChildrenUpdates,o=!0}}};t.exports=a},{158:158}],37:[function(e,t,n){"use strict";var r=e(137),o={shouldComponentUpdate:function(e,t){return r(this,e,t)}};t.exports=o},{137:137}],38:[function(e,t,n){"use strict";function r(e){var t=e._currentElement._owner||null;if(t){var n=t.getName();if(n)return" Check the render method of `"+n+"`."}return""}function o(e){}var a=e(36),i=e(39),u=e(55),s=e(66),l=e(76),c=e(79),p=(e(78),e(82)),d=e(92),f=e(24),h=e(151),v=e(158),m=e(138);e(168);o.prototype.render=function(){var e=s.get(this)._currentElement.type;return e(this.props,this.contex
 t,this.updater)};var g=1,y={construct:function(e){this._currentElement=e,this._rootNodeID=null,this._instance=null,this._pendingElement=null,this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1,this._renderedComponent=null,this._context=null,this._mountOrder=0,this._topLevelWrapper=null,this._pendingCallbacks=null},mountComponent:function(e,t,n){this._context=n,this._mountOrder=g++,this._rootNodeID=e;var r,a,i=this._processProps(this._currentElement.props),l=this._processContext(n),c=this._currentElement.type,f="prototype"in c;f&&(r=new c(i,l,d)),(!f||null===r||r===!1||u.isValidElement(r))&&(a=r,r=new o(c)),r.props=i,r.context=l,r.refs=h,r.updater=d,this._instance=r,s.set(r,this);var m=r.state;void 0===m&&(r.state=m=null),"object"!=typeof m||Array.isArray(m)?v(!1):void 0,this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1,r.componentWillMount&&(r.componentWillMount(),this._pendingStateQueue&&(r.state=this._processPen
 dingState(r.props,r.context))),void 0===a&&(a=this._renderValidatedComponent()),this._renderedComponent=this._instantiateReactComponent(a);var y=p.mountComponent(this._renderedComponent,e,t,this._processChildContext(n));return r.componentDidMount&&t.getReactMountReady().enqueue(r.componentDidMount,r),y},unmountComponent:function(){var e=this._instance;e.componentWillUnmount&&e.componentWillUnmount(),p.unmountComponent(this._renderedComponent),this._renderedComponent=null,this._instance=null,this._pendingStateQueue=null,this._pendingReplaceState=!1,this._pendingForceUpdate=!1,this._pendingCallbacks=null,this._pendingElement=null,this._context=null,this._rootNodeID=null,this._topLevelWrapper=null,s.remove(e)},_maskContext:function(e){var t=null,n=this._currentElement.type,r=n.contextTypes;if(!r)return h;t={};for(var o in r)t[o]=e[o];return t},_processContext:function(e){var t=this._maskContext(e);return t},_processChildContext:function(e){var t=this._currentElement.type,n=this._instan
 ce,r=n.getChildContext&&n.getChildContext();if(r){"object"!=typeof t.childContextTypes?v(!1):void 0;for(var o in r)o in t.childContextTypes?void 0:v(!1);return f({},e,r)}return e},_processProps:function(e){return e},_checkPropTypes:function(e,t,n){var o=this.getName();for(var a in e)if(e.hasOwnProperty(a)){var i;try{"function"!=typeof e[a]?v(!1):void 0,i=e[a](t,a,o,n)}catch(u){i=u}i instanceof Error&&(r(this),n===c.prop)}},receiveComponent:function(e,t,n){var r=this._currentElement,o=this._context;this._pendingElement=null,this.updateComponent(t,r,e,o,n)},performUpdateIfNecessary:function(e){null!=this._pendingElement&&p.receiveComponent(this,this._pendingElement||this._currentElement,e,this._context),(null!==this._pendingStateQueue||this._pendingForceUpdate)&&this.updateComponent(e,this._currentElement,this._currentElement,this._context,this._context)},updateComponent:function(e,t,n,r,o){var a,i=this._instance,u=this._context===o?i.context:this._processContext(o);t===n?a=n.props:(a
 =this._processProps(n.props),i.componentWillReceiveProps&&i.componentWillReceiveProps(a,u));var s=this._processPendingState(a,u),l=this._pendingForceUpdate||!i.shouldComponentUpdate||i.shouldComponentUpdate(a,s,u);l?(this._pendingForceUpdate=!1,this._performComponentUpdate(n,a,s,u,e,o)):(this._currentElement=n,this._context=o,i.props=a,i.state=s,i.context=u)},_processPendingState:function(e,t){var n=this._instance,r=this._pendingStateQueue,o=this._pendingReplaceState;if(this._pendingReplaceState=!1,this._pendingStateQueue=null,!r)return n.state;if(o&&1===r.length)return r[0];for(var a=f({},o?r[0]:n.state),i=o?1:0;i<r.length;i++){var u=r[i];f(a,"function"==typeof u?u.call(n,a,e,t):u)}return a},_performComponentUpdate:function(e,t,n,r,o,a){var i,u,s,l=this._instance,c=Boolean(l.componentDidUpdate);c&&(i=l.props,u=l.state,s=l.context),l.componentWillUpdate&&l.componentWillUpdate(t,n,r),this._currentElement=e,this._context=a,l.props=t,l.state=n,l.context=r,this._updateRenderedComponent(
 o,a),c&&o.getReactMountReady().enqueue(l.componentDidUpdate.bind(l,i,u,s),l)},_updateRenderedComponent:function(e,t){var n=this._renderedComponent,r=n._currentElement,o=this._renderValidatedComponent();if(m(r,o))p.receiveComponent(n,o,e,this._processChildContext(t));else{var a=this._rootNodeID,i=n._rootNodeID;p.unmountComponent(n),this._renderedComponent=this._instantiateReactComponent(o);var u=p.mountComponent(this._renderedComponent,a,e,this._processChildContext(t));this._replaceNodeWithMarkupByID(i,u)}},_replaceNodeWithMarkupByID:function(e,t){a.replaceNodeWithMarkupByID(e,t)},_renderValidatedComponentWithoutOwnerOrContext:function(){var e=this._instance,t=e.render();return t},_renderValidatedComponent:function(){var e;i.current=this;try{e=this._renderValidatedComponentWithoutOwnerOrContext()}finally{i.current=null}return null===e||e===!1||u.isValidElement(e)?void 0:v(!1),e},attachRef:function(e,t){var n=this.getPublicInstance();null==n?v(!1):void 0;var r=t.getPublicInstance(),o=
 n.refs===h?n.refs={}:n.refs;o[e]=r},detachRef:function(e){var t=this.getPublicInstance().refs;delete t[e]},getName:function(){var e=this._currentElement.type,t=this._instance&&this._instance.constructor;return e.displayName||t&&t.displayName||e.name||t&&t.name||null},getPublicInstance:function(){var e=this._instance;return e instanceof o?null:e},_instantiateReactComponent:null};l.measureMethods(y,"ReactCompositeComponent",{mountComponent:"mountComponent",updateComponent:"updateComponent",_renderValidatedComponent:"_renderValidatedComponent"});var C={Mixin:y};t.exports=C},{138:138,151:151,158:158,168:168,24:24,36:36,39:39,55:55,66:66,76:76,78:78,79:79,82:82,92:92}],39:[function(e,t,n){"use strict";var r={current:null};t.exports=r},{}],40:[function(e,t,n){"use strict";var r=e(39),o=e(51),a=e(54),i=e(65),u=e(70),s=e(76),l=e(82),c=e(93),p=e(94),d=e(119),f=e(134);e(168);a.inject();var h=s.measure("React","render",u.render),v={findDOMNode:d,render:h,unmountComponentAtNode:u.unmountCompone
 ntAtNode,version:p,unstable_batchedUpdates:c.batchedUpdates,unstable_renderSubtreeIntoContainer:f};"undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject&&__REACT_DEVTOOLS_GLOBAL_HOOK__.inject({CurrentOwner:r,InstanceHandles:i,Mount:u,Reconciler:l,TextComponent:o});t.exports=v},{119:119,134:134,168:168,39:39,51:51,54:54,65:65,70:70,76:76,82:82,93:93,94:94}],41:[function(e,t,n){"use strict";var r={onClick:!0,onDoubleClick:!0,onMouseDown:!0,onMouseMove:!0,onMouseUp:!0,onClickCapture:!0,onDoubleClickCapture:!0,onMouseDownCapture:!0,onMouseMoveCapture:!0,onMouseUpCapture:!0},o={getNativeProps:function(e,t,n){if(!t.disabled)return t;var o={};for(var a in t)t.hasOwnProperty(a)&&!r[a]&&(o[a]=t[a]);return o}};t.exports=o},{}],42:[function(e,t,n){"use strict";function r(){return this}function o(){var e=this._reactInternalComponent;return!!e}function a(){}function i(e,t){var n=this._reactInternalComponent;n&&(I.enqueueSetPropsInternal(n,e)
 ,t&&I.enqueueCallbackInternal(n,t))}function u(e,t){var n=this._reactInternalComponent;n&&(I.enqueueReplacePropsInternal(n,e),t&&I.enqueueCallbackInternal(n,t))}function s(e,t){t&&(null!=t.dangerouslySetInnerHTML&&(null!=t.children?L(!1):void 0,"object"==typeof t.dangerouslySetInnerHTML&&H in t.dangerouslySetInnerHTML?void 0:L(!1)),null!=t.style&&"object"!=typeof t.style?L(!1):void 0)}function l(e,t,n,r){var o=w.findReactContainerForID(e);if(o){var a=o.nodeType===z?o.ownerDocument:o;j(t,a)}r.getReactMountReady().enqueue(c,{id:e,registrationName:t,listener:n})}function c(){var e=this;_.putListener(e.id,e.registrationName,e.listener)}function p(){var e=this;e._rootNodeID?void 0:L(!1);var t=w.getNode(e._rootNodeID);switch(t?void 0:L(!1),e._tag){case"iframe":e._wrapperState.listeners=[_.trapBubbledEvent(E.topLevelTypes.topLoad,"load",t)];break;case"video":case"audio":e._wrapperState.listeners=[];for(var n in Y)Y.hasOwnProperty(n)&&e._wrapperState.listeners.push(_.trapBubbledEvent(E.topL
 evelTypes[n],Y[n],t));break;case"img":e._wrapperState.listeners=[_.trapBubbledEvent(E.topLevelTypes.topError,"error",t),_.trapBubbledEvent(E.topLevelTypes.topLoad,"load",t)];break;case"form":e._wrapperState.listeners=[_.trapBubbledEvent(E.topLevelTypes.topReset,"reset",t),_.trapBubbledEvent(E.topLevelTypes.topSubmit,"submit",t)]}}function d(){P.mountReadyWrapper(this)}function f(){M.postUpdateWrapper(this)}function h(e){Z.call($,e)||(X.test(e)?void 0:L(!1),$[e]=!0)}function v(e,t){return e.indexOf("-")>=0||null!=t.is}function m(e){h(e),this._tag=e.toLowerCase(),this._renderedChildren=null,this._previousStyle=null,this._previousStyleCopy=null,this._rootNodeID=null,this._wrapperState=null,this._topLevelWrapper=null,this._nodeWithLegacyProperties=null}var g=e(2),y=e(5),C=e(10),b=e(11),E=e(15),_=e(28),x=e(35),D=e(41),P=e(46),T=e(47),M=e(48),N=e(52),w=e(70),S=e(71),R=e(76),I=e(92),k=e(24),O=e(114),A=e(118),L=e(158),U=(e(130),e(163)),F=e(135),B=e(136),V=(e(166),e(141),e(168),_.deleteListe
 ner),j=_.listenTo,W=_.registrationNameModules,K={string:!0,number:!0},q=U({style:null}),H=U({__html:null}),z=1,Y={topAbort:"abort",topCanPlay:"canplay",topCanPlayThrough:"canplaythrough",topDurationChange:"durationchange",topEmptied:"emptied",topEncrypted:"encrypted",topEnded:"ended",topError:"error",topLoadedData:"loadeddata",topLoadedMetadata:"loadedmetadata",topLoadStart:"loadstart",topPause:"pause",topPlay:"play",topPlaying:"playing",topProgress:"progress",topRateChange:"ratechange",topSeeked:"seeked",topSeeking:"seeking",topStalled:"stalled",topSuspend:"suspend",topTimeUpdate:"timeupdate",topVolumeChange:"volumechange",topWaiting:"waiting"},G={area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0},Q={listing:!0,pre:!0,textarea:!0},X=(k({menuitem:!0},G),/^[a-zA-Z][a-zA-Z:_\.\-\d]*$/),$={},Z={}.hasOwnProperty;m.displayName="ReactDOMComponent",m.Mixin={construct:function(e){this._currentElement=e},mountComponent:fu
 nction(e,t,n){this._rootNodeID=e;var r=this._currentElement.props;switch(this._tag){case"iframe":case"img":case"form":case"video":case"audio":this._wrapperState={listeners:null},t.getReactMountReady().enqueue(p,this);break;case"button":r=D.getNativeProps(this,r,n);break;case"input":P.mountWrapper(this,r,n),r=P.getNativeProps(this,r,n);break;case"option":T.mountWrapper(this,r,n),r=T.getNativeProps(this,r,n);break;case"select":M.mountWrapper(this,r,n),r=M.getNativeProps(this,r,n),n=M.processChildContext(this,r,n);break;case"textarea":N.mountWrapper(this,r,n),r=N.getNativeProps(this,r,n)}s(this,r);var o;if(t.useCreateElement){var a=n[w.ownerDocumentContextKey],i=a.createElement(this._currentElement.type);b.setAttributeForID(i,this._rootNodeID),w.getID(i),this._updateDOMProperties({},r,t,i),this._createInitialChildren(t,r,n,i),o=i}else{var u=this._createOpenTagMarkupAndPutListeners(t,r),l=this._createContentMarkup(t,r,n);o=!l&&G[this._tag]?u+"/>":u+">"+l+"</"+this._currentElement.type+"
 >"}switch(this._tag){case"input":t.getReactMountReady().enqueue(d,this);case"button":case"select":case"textarea":r.autoFocus&&t.getReactMountReady().enqueue(g.focusDOMComponent,this)}return o},_createOpenTagMarkupAndPutListeners:function(e,t){var n="<"+this._currentElement.type;for(var r in t)if(t.hasOwnProperty(r)){var o=t[r];if(null!=o)if(W.hasOwnProperty(r))o&&l(this._rootNodeID,r,o,e);else{r===q&&(o&&(o=this._previousStyleCopy=k({},t.style)),o=y.createMarkupForStyles(o));var a=null;a=null!=this._tag&&v(this._tag,t)?b.createMarkupForCustomAttribute(r,o):b.createMarkupForProperty(r,o),a&&(n+=" "+a)}}if(e.renderToStaticMarkup)return n;var i=b.createMarkupForID(this._rootNodeID);return n+" "+i},_createContentMarkup:function(e,t,n){var r="",o=t.dangerouslySetInnerHTML;if(null!=o)null!=o.__html&&(r=o.__html);else{var a=K[typeof t.children]?t.children:null,i=null!=a?null:t.children;if(null!=a)r=A(a);else if(null!=i){var u=this.mountChildren(i,e,n);r=u.join("")}}return Q[this._tag]&&"\n
 "===r.charAt(0)?"\n"+r:r},_createInitialChildren:function(e,t,n,r){var o=t.dangerouslySetInnerHTML;if(null!=o)null!=o.__html&&F(r,o.__html);else{var a=K[typeof t.children]?t.children:null,i=null!=a?null:t.children;if(null!=a)B(r,a);else if(null!=i)for(var u=this.mountChildren(i,e,n),s=0;s<u.length;s++)r.appendChild(u[s])}},receiveComponent:function(e,t,n){var r=this._currentElement;this._currentElement=e,this.updateComponent(t,r,e,n)},updateComponent:function(e,t,n,r){var o=t.props,a=this._currentElement.props;switch(this._tag){case"button":o=D.getNativeProps(this,o),a=D.getNativeProps(this,a);break;case"input":P.updateWrapper(this),o=P.getNativeProps(this,o),a=P.getNativeProps(this,a);break;case"option":o=T.getNativeProps(this,o),a=T.getNativeProps(this,a);break;case"select":o=M.getNativeProps(this,o),a=M.getNativeProps(this,a);break;case"textarea":N.updateWrapper(this),o=N.getNativeProps(this,o),a=N.getNativeProps(this,a)}s(this,a),this._updateDOMProperties(o,a,e,null),this._updat
 eDOMChildren(o,a,e,r),!O&&this._nodeWithLegacyProperties&&(this._nodeWithLegacyProperties.props=a),"select"===this._tag&&e.getReactMountReady().enqueue(f,this)},_updateDOMProperties:function(e,t,n,r){var o,a,i;for(o in e)if(!t.hasOwnProperty(o)&&e.hasOwnProperty(o))if(o===q){var u=this._previousStyleCopy;for(a in u)u.hasOwnProperty(a)&&(i=i||{},i[a]="");this._previousStyleCopy=null}else W.hasOwnProperty(o)?e[o]&&V(this._rootNodeID,o):(C.properties[o]||C.isCustomAttribute(o))&&(r||(r=w.getNode(this._rootNodeID)),b.deleteValueForProperty(r,o));for(o in t){var s=t[o],c=o===q?this._previousStyleCopy:e[o];if(t.hasOwnProperty(o)&&s!==c)if(o===q)if(s?s=this._previousStyleCopy=k({},s):this._previousStyleCopy=null,c){for(a in c)!c.hasOwnProperty(a)||s&&s.hasOwnProperty(a)||(i=i||{},i[a]="");for(a in s)s.hasOwnProperty(a)&&c[a]!==s[a]&&(i=i||{},i[a]=s[a])}else i=s;else W.hasOwnProperty(o)?s?l(this._rootNodeID,o,s,n):c&&V(this._rootNodeID,o):v(this._tag,t)?(r||(r=w.getNode(this._rootNodeID)),b
 .setValueForAttribute(r,o,s)):(C.properties[o]||C.isCustomAttribute(o))&&(r||(r=w.getNode(this._rootNodeID)),null!=s?b.setValueForProperty(r,o,s):b.deleteValueForProperty(r,o))}i&&(r||(r=w.getNode(this._rootNodeID)),y.setValueForStyles(r,i))},_updateDOMChildren:function(e,t,n,r){var o=K[typeof e.children]?e.children:null,a=K[typeof t.children]?t.children:null,i=e.dangerouslySetInnerHTML&&e.dangerouslySetInnerHTML.__html,u=t.dangerouslySetInnerHTML&&t.dangerouslySetInnerHTML.__html,s=null!=o?null:e.children,l=null!=a?null:t.children,c=null!=o||null!=i,p=null!=a||null!=u;null!=s&&null==l?this.updateChildren(null,n,r):c&&!p&&this.updateTextContent(""),null!=a?o!==a&&this.updateTextContent(""+a):null!=u?i!==u&&this.updateMarkup(""+u):null!=l&&this.updateChildren(l,n,r)},unmountComponent:function(){switch(this._tag){case"iframe":case"img":case"form":case"video":case"audio":var e=this._wrapperState.listeners;if(e)for(var t=0;t<e.length;t++)e[t].remove();break;case"input":P.unmountWrapper(
 this);break;case"html":case"head":case"body":L(!1)}if(this.unmountChildren(),_.deleteAllListeners(this._rootNodeID),x.unmountIDFromEnvironment(this._rootNodeID),this._rootNodeID=null,this._wrapperState=null,this._nodeWithLegacyProperties){var n=this._nodeWithLegacyProperties;n._reactInternalComponent=null,this._nodeWithLegacyProperties=null}},getPublicInstance:function(){if(!this._nodeWithLegacyProperties){var e=w.getNode(this._rootNodeID);e._reactInternalComponent=this,e.getDOMNode=r,e.isMounted=o,e.setState=a,e.replaceState=a,e.forceUpdate=a,e.setProps=i,e.replaceProps=u,e.props=this._currentElement.props,this._nodeWithLegacyProperties=e}return this._nodeWithLegacyProperties}},R.measureMethods(m,"ReactDOMComponent",{mountComponent:"mountComponent",updateComponent:"updateComponent"}),k(m.prototype,m.Mixin,S.Mixin),t.exports=m},{10:10,11:11,114:114,118:118,130:130,135:135,136:136,141:141,15:15,158:158,163:163,166:166,168:168,2:2,24:24,28:28,35:35,41:41,46:46,47:47,48:48,5:5,52:52,70
 :70,71:71,76:76,92:92}],43:[function(e,t,n){"use strict";function r(e){return o.createFactory(e)}var o=e(55),a=(e(56),e(164)),i=a({a:"a",abbr:"abbr",address:"address",area:"area",article:"article",aside:"aside",audio:"audio",b:"b",base:"base",bdi:"bdi",bdo:"bdo",big:"big",blockquote:"blockquote",body:"body",br:"br",button:"button",canvas:"canvas",caption:"caption",cite:"cite",code:"code",col:"col",colgroup:"colgroup",data:"data",datalist:"datalist",dd:"dd",del:"del",details:"details",dfn:"dfn",dialog:"dialog",div:"div",dl:"dl",dt:"dt",em:"em",embed:"embed",fieldset:"fieldset",figcaption:"figcaption",figure:"figure",footer:"footer",form:"form",h1:"h1",h2:"h2",h3:"h3",h4:"h4",h5:"h5",h6:"h6",head:"head",header:"header",hgroup:"hgroup",hr:"hr",html:"html",i:"i",iframe:"iframe",img:"img",input:"input",ins:"ins",kbd:"kbd",keygen:"keygen",label:"label",legend:"legend",li:"li",link:"link",main:"main",map:"map",mark:"mark",menu:"menu",menuitem:"menuitem",meta:"meta",meter:"meter",nav:"nav",
 noscript:"noscript",object:"object",ol:"ol",optgroup:"optgroup",option:"option",output:"output",p:"p",param:"param",picture:"picture",pre:"pre",progress:"progress",q:"q",rp:"rp",rt:"rt",ruby:"ruby",s:"s",samp:"samp",script:"script",section:"section",select:"select",small:"small",source:"source",span:"span",strong:"strong",style:"style",sub:"sub",summary:"summary",sup:"sup",table:"table",tbody:"tbody",td:"td",textarea:"textarea",tfoot:"tfoot",th:"th",thead:"thead",time:"time",title:"title",tr:"tr",track:"track",u:"u",ul:"ul","var":"var",video:"video",wbr:"wbr",circle:"circle",clipPath:"clipPath",defs:"defs",ellipse:"ellipse",g:"g",image:"image",line:"line",linearGradient:"linearGradient",mask:"mask",path:"path",pattern:"pattern",polygon:"polygon",polyline:"polyline",radialGradient:"radialGradient",rect:"rect",stop:"stop",svg:"svg",text:"text",tspan:"tspan"},r);t.exports=i},{164:164,55:55,56:56}],44:[function(e,t,n){"use strict";var r={useCreateElement:!1};t.exports=r},{}],45:[functio
 n(e,t,n){"use strict";var r=e(9),o=e(11),a=e(70),i=e(76),u=e(158),s={dangerouslySetInnerHTML:"`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.",
-style:"`style` must be set using `updateStylesByID()`."},l={updatePropertyByID:function(e,t,n){var r=a.getNode(e);s.hasOwnProperty(t)?u(!1):void 0,null!=n?o.setValueForProperty(r,t,n):o.deleteValueForProperty(r,t)},dangerouslyReplaceNodeWithMarkupByID:function(e,t){var n=a.getNode(e);r.dangerouslyReplaceNodeWithMarkup(n,t)},dangerouslyProcessChildrenUpdates:function(e,t){for(var n=0;n<e.length;n++)e[n].parentNode=a.getNode(e[n].parentID);r.processUpdates(e,t)}};i.measureMethods(l,"ReactDOMIDOperations",{dangerouslyReplaceNodeWithMarkupByID:"dangerouslyReplaceNodeWithMarkupByID",dangerouslyProcessChildrenUpdates:"dangerouslyProcessChildrenUpdates"}),t.exports=l},{11:11,158:158,70:70,76:76,9:9}],46:[function(e,t,n){"use strict";function r(){this._rootNodeID&&d.updateWrapper(this)}function o(e){var t=this._currentElement.props,n=i.executeOnChange(t,e);s.asap(r,this);var o=t.name;if("radio"===t.type&&null!=o){for(var a=u.getNode(this._rootNodeID),l=a;l.parentNode;)l=l.parentNode;for(var
  d=l.querySelectorAll("input[name="+JSON.stringify(""+o)+'][type="radio"]'),f=0;f<d.length;f++){var h=d[f];if(h!==a&&h.form===a.form){var v=u.getID(h);v?void 0:c(!1);var m=p[v];m?void 0:c(!1),s.asap(r,m)}}}return n}var a=e(45),i=e(23),u=e(70),s=e(93),l=e(24),c=e(158),p={},d={getNativeProps:function(e,t,n){var r=i.getValue(t),o=i.getChecked(t),a=l({},t,{defaultChecked:void 0,defaultValue:void 0,value:null!=r?r:e._wrapperState.initialValue,checked:null!=o?o:e._wrapperState.initialChecked,onChange:e._wrapperState.onChange});return a},mountWrapper:function(e,t){var n=t.defaultValue;e._wrapperState={initialChecked:t.defaultChecked||!1,initialValue:null!=n?n:null,onChange:o.bind(e)}},mountReadyWrapper:function(e){p[e._rootNodeID]=e},unmountWrapper:function(e){delete p[e._rootNodeID]},updateWrapper:function(e){var t=e._currentElement.props,n=t.checked;null!=n&&a.updatePropertyByID(e._rootNodeID,"checked",n||!1);var r=i.getValue(t);null!=r&&a.updatePropertyByID(e._rootNodeID,"value",""+r)}}
 ;t.exports=d},{158:158,23:23,24:24,45:45,70:70,93:93}],47:[function(e,t,n){"use strict";var r=e(32),o=e(48),a=e(24),i=(e(168),o.valueContextKey),u={mountWrapper:function(e,t,n){var r=n[i],o=null;if(null!=r)if(o=!1,Array.isArray(r)){for(var a=0;a<r.length;a++)if(""+r[a]==""+t.value){o=!0;break}}else o=""+r==""+t.value;e._wrapperState={selected:o}},getNativeProps:function(e,t,n){var o=a({selected:void 0,children:void 0},t);null!=e._wrapperState.selected&&(o.selected=e._wrapperState.selected);var i="";return r.forEach(t.children,function(e){null!=e&&("string"==typeof e||"number"==typeof e)&&(i+=e)}),o.children=i,o}};t.exports=u},{168:168,24:24,32:32,48:48}],48:[function(e,t,n){"use strict";function r(){if(this._rootNodeID&&this._wrapperState.pendingUpdate){this._wrapperState.pendingUpdate=!1;var e=this._currentElement.props,t=i.getValue(e);null!=t&&o(this,e,t)}}function o(e,t,n){var r,o,a=u.getNode(e._rootNodeID).options;if(t){for(r={},o=0;o<n.length;o++)r[""+n[o]]=!0;for(o=0;o<a.lengt
 h;o++){var i=r.hasOwnProperty(a[o].value);a[o].selected!==i&&(a[o].selected=i)}}else{for(r=""+n,o=0;o<a.length;o++)if(a[o].value===r)return void(a[o].selected=!0);a.length&&(a[0].selected=!0)}}function a(e){var t=this._currentElement.props,n=i.executeOnChange(t,e);return this._wrapperState.pendingUpdate=!0,s.asap(r,this),n}var i=e(23),u=e(70),s=e(93),l=e(24),c=(e(168),"__ReactDOMSelect_value$"+Math.random().toString(36).slice(2)),p={valueContextKey:c,getNativeProps:function(e,t,n){return l({},t,{onChange:e._wrapperState.onChange,value:void 0})},mountWrapper:function(e,t){var n=i.getValue(t);e._wrapperState={pendingUpdate:!1,initialValue:null!=n?n:t.defaultValue,onChange:a.bind(e),wasMultiple:Boolean(t.multiple)}},processChildContext:function(e,t,n){var r=l({},n);return r[c]=e._wrapperState.initialValue,r},postUpdateWrapper:function(e){var t=e._currentElement.props;e._wrapperState.initialValue=void 0;var n=e._wrapperState.wasMultiple;e._wrapperState.wasMultiple=Boolean(t.multiple);va
 r r=i.getValue(t);null!=r?(e._wrapperState.pendingUpdate=!1,o(e,Boolean(t.multiple),r)):n!==Boolean(t.multiple)&&(null!=t.defaultValue?o(e,Boolean(t.multiple),t.defaultValue):o(e,Boolean(t.multiple),t.multiple?[]:""))}};t.exports=p},{168:168,23:23,24:24,70:70,93:93}],49:[function(e,t,n){"use strict";function r(e,t,n,r){return e===n&&t===r}function o(e){var t=document.selection,n=t.createRange(),r=n.text.length,o=n.duplicate();o.moveToElementText(e),o.setEndPoint("EndToStart",n);var a=o.text.length,i=a+r;return{start:a,end:i}}function a(e){var t=window.getSelection&&window.getSelection();if(!t||0===t.rangeCount)return null;var n=t.anchorNode,o=t.anchorOffset,a=t.focusNode,i=t.focusOffset,u=t.getRangeAt(0);try{u.startContainer.nodeType,u.endContainer.nodeType}catch(s){return null}var l=r(t.anchorNode,t.anchorOffset,t.focusNode,t.focusOffset),c=l?0:u.toString().length,p=u.cloneRange();p.selectNodeContents(e),p.setEnd(u.startContainer,u.startOffset);var d=r(p.startContainer,p.startOffse
 t,p.endContainer,p.endOffset),f=d?0:p.toString().length,h=f+c,v=document.createRange();v.setStart(n,o),v.setEnd(a,i);var m=v.collapsed;return{start:m?h:f,end:m?f:h}}function i(e,t){var n,r,o=document.selection.createRange().duplicate();"undefined"==typeof t.end?(n=t.start,r=n):t.start>t.end?(n=t.end,r=t.start):(n=t.start,r=t.end),o.moveToElementText(e),o.moveStart("character",n),o.setEndPoint("EndToStart",o),o.moveEnd("character",r-n),o.select()}function u(e,t){if(window.getSelection){var n=window.getSelection(),r=e[c()].length,o=Math.min(t.start,r),a="undefined"==typeof t.end?o:Math.min(t.end,r);if(!n.extend&&o>a){var i=a;a=o,o=i}var u=l(e,o),s=l(e,a);if(u&&s){var p=document.createRange();p.setStart(u.node,u.offset),n.removeAllRanges(),o>a?(n.addRange(p),n.extend(s.node,s.offset)):(p.setEnd(s.node,s.offset),n.addRange(p))}}}var s=e(144),l=e(127),c=e(128),p=s.canUseDOM&&"selection"in document&&!("getSelection"in window),d={getOffsets:p?o:a,setOffsets:p?i:u};t.exports=d},{127:127,128
 :128,144:144}],50:[function(e,t,n){"use strict";var r=e(54),o=e(86),a=e(94);r.inject();var i={renderToString:o.renderToString,renderToStaticMarkup:o.renderToStaticMarkup,version:a};t.exports=i},{54:54,86:86,94:94}],51:[function(e,t,n){"use strict";var r=e(9),o=e(11),a=e(35),i=e(70),u=e(24),s=e(118),l=e(136),c=(e(141),function(e){});u(c.prototype,{construct:function(e){this._currentElement=e,this._stringText=""+e,this._rootNodeID=null,this._mountIndex=0},mountComponent:function(e,t,n){if(this._rootNodeID=e,t.useCreateElement){var r=n[i.ownerDocumentContextKey],a=r.createElement("span");return o.setAttributeForID(a,e),i.getID(a),l(a,this._stringText),a}var u=s(this._stringText);return t.renderToStaticMarkup?u:"<span "+o.createMarkupForID(e)+">"+u+"</span>"},receiveComponent:function(e,t){if(e!==this._currentElement){this._currentElement=e;var n=""+e;if(n!==this._stringText){this._stringText=n;var o=i.getNode(this._rootNodeID);r.updateTextContent(o,n)}}},unmountComponent:function(){a.u
 nmountIDFromEnvironment(this._rootNodeID)}}),t.exports=c},{11:11,118:118,136:136,141:141,24:24,35:35,70:70,9:9}],52:[function(e,t,n){"use strict";function r(){this._rootNodeID&&c.updateWrapper(this)}function o(e){var t=this._currentElement.props,n=a.executeOnChange(t,e);return u.asap(r,this),n}var a=e(23),i=e(45),u=e(93),s=e(24),l=e(158),c=(e(168),{getNativeProps:function(e,t,n){null!=t.dangerouslySetInnerHTML?l(!1):void 0;var r=s({},t,{defaultValue:void 0,value:void 0,children:e._wrapperState.initialValue,onChange:e._wrapperState.onChange});return r},mountWrapper:function(e,t){var n=t.defaultValue,r=t.children;null!=r&&(null!=n?l(!1):void 0,Array.isArray(r)&&(r.length<=1?void 0:l(!1),r=r[0]),n=""+r),null==n&&(n="");var i=a.getValue(t);e._wrapperState={initialValue:""+(null!=i?i:n),onChange:o.bind(e)}},updateWrapper:function(e){var t=e._currentElement.props,n=a.getValue(t);null!=n&&i.updatePropertyByID(e._rootNodeID,"value",""+n)}});t.exports=c},{158:158,168:168,23:23,24:24,45:45,93
 :93}],53:[function(e,t,n){"use strict";function r(){this.reinitializeTransaction()}var o=e(93),a=e(110),i=e(24),u=e(150),s={initialize:u,close:function(){d.isBatchingUpdates=!1}},l={initialize:u,close:o.flushBatchedUpdates.bind(o)},c=[l,s];i(r.prototype,a.Mixin,{getTransactionWrappers:function(){return c}});var p=new r,d={isBatchingUpdates:!1,batchedUpdates:function(e,t,n,r,o,a){var i=d.isBatchingUpdates;d.isBatchingUpdates=!0,i?e(t,n,r,o,a):p.perform(e,null,t,n,r,o,a)}};t.exports=d},{110:110,150:150,24:24,93:93}],54:[function(e,t,n){"use strict";function r(){P||(P=!0,g.EventEmitter.injectReactEventListener(m),g.EventPluginHub.injectEventPluginOrder(u),g.EventPluginHub.injectInstanceHandle(y),g.EventPluginHub.injectMount(C),g.EventPluginHub.injectEventPluginsByName({SimpleEventPlugin:x,EnterLeaveEventPlugin:s,ChangeEventPlugin:a,SelectEventPlugin:E,BeforeInputEventPlugin:o}),g.NativeComponent.injectGenericComponentClass(h),g.NativeComponent.injectTextComponentClass(v),g.Class.inject
 Mixin(p),g.DOMProperty.injectDOMPropertyConfig(c),g.DOMProperty.injectDOMPropertyConfig(D),g.EmptyComponent.injectEmptyComponent("noscript"),g.Updates.injectReconcileTransaction(b),g.Updates.injectBatchingStrategy(f),g.RootIndex.injectCreateReactRootIndex(l.canUseDOM?i.createReactRootIndex:_.createReactRootIndex),g.Component.injectEnvironment(d))}var o=e(3),a=e(7),i=e(8),u=e(13),s=e(14),l=e(144),c=e(21),p=e(27),d=e(35),f=e(53),h=e(42),v=e(51),m=e(61),g=e(63),y=e(65),C=e(70),b=e(81),E=e(96),_=e(97),x=e(98),D=e(95),P=!1;t.exports={inject:r}},{13:13,14:14,144:144,21:21,27:27,3:3,35:35,42:42,51:51,53:53,61:61,63:63,65:65,7:7,70:70,8:8,81:81,95:95,96:96,97:97,98:98}],55:[function(e,t,n){"use strict";var r=e(39),o=e(24),a=(e(114),"function"==typeof Symbol&&Symbol["for"]&&Symbol["for"]("react.element")||60103),i={key:!0,ref:!0,__self:!0,__source:!0},u=function(e,t,n,r,o,i,u){var s={$$typeof:a,type:e,key:t,ref:n,props:u,_owner:i};return s};u.createElement=function(e,t,n){var o,a={},s=null,l
 =null,c=null,p=null;if(null!=t){l=void 0===t.ref?null:t.ref,s=void 0===t.key?null:""+t.key,c=void 0===t.__self?null:t.__self,p=void 0===t.__source?null:t.__source;for(o in t)t.hasOwnProperty(o)&&!i.hasOwnProperty(o)&&(a[o]=t[o])}var d=arguments.length-2;if(1===d)a.children=n;else if(d>1){for(var f=Array(d),h=0;d>h;h++)f[h]=arguments[h+2];a.children=f}if(e&&e.defaultProps){var v=e.defaultProps;for(o in v)"undefined"==typeof a[o]&&(a[o]=v[o])}return u(e,s,l,c,p,r.current,a)},u.createFactory=function(e){var t=u.createElement.bind(null,e);return t.type=e,t},u.cloneAndReplaceKey=function(e,t){var n=u(e.type,t,e.ref,e._self,e._source,e._owner,e.props);return n},u.cloneAndReplaceProps=function(e,t){var n=u(e.type,e.key,e.ref,e._self,e._source,e._owner,t);return n},u.cloneElement=function(e,t,n){var a,s=o({},e.props),l=e.key,c=e.ref,p=e._self,d=e._source,f=e._owner;if(null!=t){void 0!==t.ref&&(c=t.ref,f=r.current),void 0!==t.key&&(l=""+t.key);for(a in t)t.hasOwnProperty(a)&&!i.hasOwnPropert
 y(a)&&(s[a]=t[a])}var h=arguments.length-2;if(1===h)s.children=n;else if(h>1){for(var v=Array(h),m=0;h>m;m++)v[m]=arguments[m+2];s.children=v}return u(e.type,l,c,p,d,f,s)},u.isValidElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===a},t.exports=u},{114:114,24:24,39:39}],56:[function(e,t,n){"use strict";function r(){if(p.current){var e=p.current.getName();if(e)return" Check the render method of `"+e+"`."}return""}function o(e,t){e._store&&!e._store.validated&&null==e.key&&(e._store.validated=!0,a("uniqueKey",e,t))}function a(e,t,n){var o=r();if(!o){var a="string"==typeof n?n:n.displayName||n.name;a&&(o=" Check the top-level render call using <"+a+">.")}var i=h[e]||(h[e]={});if(i[o])return null;i[o]=!0;var u={parentOrOwner:o,url:" See https://fb.me/react-warning-keys for more information.",childOwner:null};return t&&t._owner&&t._owner!==p.current&&(u.childOwner=" It was passed a child from "+t._owner.getName()+"."),u}function i(e,t){if("object"==typeof e)if(Array.isA
 rray(e))for(var n=0;n<e.length;n++){var r=e[n];l.isValidElement(r)&&o(r,t)}else if(l.isValidElement(e))e._store&&(e._store.validated=!0);else if(e){var a=d(e);if(a&&a!==e.entries)for(var i,u=a.call(e);!(i=u.next()).done;)l.isValidElement(i.value)&&o(i.value,t)}}function u(e,t,n,o){for(var a in t)if(t.hasOwnProperty(a)){var i;try{"function"!=typeof t[a]?f(!1):void 0,i=t[a](n,a,e,o)}catch(u){i=u}i instanceof Error&&!(i.message in v)&&(v[i.message]=!0,r())}}function s(e){var t=e.type;if("function"==typeof t){var n=t.displayName||t.name;t.propTypes&&u(n,t.propTypes,e.props,c.prop),"function"==typeof t.getDefaultProps}}var l=e(55),c=e(79),p=(e(78),e(39)),d=(e(114),e(126)),f=e(158),h=(e(168),{}),v={},m={createElement:function(e,t,n){var r="string"==typeof e||"function"==typeof e,o=l.createElement.apply(this,arguments);if(null==o)return o;if(r)for(var a=2;a<arguments.length;a++)i(arguments[a],e);return s(o),o},createFactory:function(e){var t=m.createElement.bind(null,e);return t.type=e,t},
 cloneElement:function(e,t,n){for(var r=l.cloneElement.apply(this,arguments),o=2;o<arguments.length;o++)i(arguments[o],r.type);return s(r),r}};t.exports=m},{114:114,126:126,158:158,168:168,39:39,55:55,78:78,79:79}],57:[function(e,t,n){"use strict";var r,o=e(55),a=e(58),i=e(82),u=e(24),s={injectEmptyComponent:function(e){r=o.createElement(e)}},l=function(e){this._currentElement=null,this._rootNodeID=null,this._renderedComponent=e(r)};u(l.prototype,{construct:function(e){},mountComponent:function(e,t,n){return a.registerNullComponentID(e),this._rootNodeID=e,i.mountComponent(this._renderedComponent,e,t,n)},receiveComponent:function(){},unmountComponent:function(e,t,n){i.unmountComponent(this._renderedComponent),a.deregisterNullComponentID(this._rootNodeID),this._rootNodeID=null,this._renderedComponent=null}}),l.injection=s,t.exports=l},{24:24,55:55,58:58,82:82}],58:[function(e,t,n){"use strict";function r(e){return!!i[e]}function o(e){i[e]=!0}function a(e){delete i[e]}var i={},u={isNull
 ComponentID:r,registerNullComponentID:o,deregisterNullComponentID:a};t.exports=u},{}],59:[function(e,t,n){"use strict";function r(e,t,n,r){try{return t(n,r)}catch(a){return void(null===o&&(o=a))}}var o=null,a={invokeGuardedCallback:r,invokeGuardedCallbackWithCatch:r,rethrowCaughtError:function(){if(o){var e=o;throw o=null,e}}};t.exports=a},{}],60:[function(e,t,n){"use strict";function r(e){o.enqueueEvents(e),o.processEventQueue(!1)}var o=e(16),a={handleTopLevel:function(e,t,n,a,i){var u=o.extractEvents(e,t,n,a,i);r(u)}};t.exports=a},{16:16}],61:[function(e,t,n){"use strict";function r(e){var t=d.getID(e),n=p.getReactRootIDFromNodeID(t),r=d.findReactContainerForID(n),o=d.getFirstReactDOM(r);return o}function o(e,t){this.topLevelType=e,this.nativeEvent=t,this.ancestors=[]}function a(e){i(e)}function i(e){for(var t=d.getFirstReactDOM(v(e.nativeEvent))||window,n=t;n;)e.ancestors.push(n),n=r(n);for(var o=0;o<e.ancestors.length;o++){t=e.ancestors[o];var a=d.getID(t)||"";g._handleTopLevel(
 e.topLevelType,t,a,e.nativeEvent,v(e.nativeEvent))}}function u(e){var t=m(window);e(t)}var s=e(143),l=e(144),c=e(25),p=e(65),d=e(70),f=e(93),h=e(24),v=e(125),m=e(155);h(o.prototype,{destructor:function(){this.topLevelType=null,this.nativeEvent=null,this.ancestors.length=0}}),c.addPoolingTo(o,c.twoArgumentPooler);var g={_enabled:!0,_handleTopLevel:null,WINDOW_HANDLE:l.canUseDOM?window:null,setHandleTopLevel:function(e){g._handleTopLevel=e},setEnabled:function(e){g._enabled=!!e},isEnabled:function(){return g._enabled},trapBubbledEvent:function(e,t,n){var r=n;return r?s.listen(r,t,g.dispatchEvent.bind(null,e)):null},trapCapturedEvent:function(e,t,n){var r=n;return r?s.capture(r,t,g.dispatchEvent.bind(null,e)):null},monitorScrollValue:function(e){var t=u.bind(null,e);s.listen(window,"scroll",t)},dispatchEvent:function(e,t){if(g._enabled){var n=o.getPooled(e,t);try{f.batchedUpdates(a,n)}finally{o.release(n)}}}};t.exports=g},{125:125,143:143,144:144,155:155,24:24,25:25,65:65,70:70,93:93}]
 ,62:[function(e,t,n){"use strict";var r=e(32),o=e(55),a=e(150),i=e(158),u=(e(168),{create:function(e){if("object"!=typeof e||!e||Array.isArray(e))return e;if(o.isValidElement(e))return e;1===e.nodeType?i(!1):void 0;var t=[];for(var n in e)r.mapIntoWithKeyPrefixInternal(e[n],t,n,a.thatReturnsArgument);return t}});t.exports=u},{150:150,158:158,168:168,32:32,55:55}],63:[function(e,t,n){"use strict";var r=e(10),o=e(16),a=e(36),i=e(33),u=e(57),s=e(28),l=e(73),c=e(76),p=e(84),d=e(93),f={Component:a.injection,Class:i.injection,DOMProperty:r.injection,EmptyComponent:u.injection,EventPluginHub:o.injection,EventEmitter:s.injection,NativeComponent:l.injection,Perf:c.injection,RootIndex:p.injection,Updates:d.injection};t.exports=f},{10:10,16:16,28:28,33:33,36:36,57:57,73:73,76:76,84:84,93:93}],64:[function(e,t,n){"use strict";function r(e){return a(document.documentElement,e)}var o=e(49),a=e(147),i=e(152),u=e(153),s={hasSelectionCapabilities:function(e){var t=e&&e.nodeName&&e.nodeName.toLowerCa
 se();return t&&("input"===t&&"text"===e.type||"textarea"===t||"true"===e.contentEditable)},getSelectionInformation:function(){var e=u();return{focusedElem:e,selectionRange:s.hasSelectionCapabilities(e)?s.getSelection(e):null}},restoreSelection:function(e){var t=u(),n=e.focusedElem,o=e.selectionRange;t!==n&&r(n)&&(s.hasSelectionCapabilities(n)&&s.setSelection(n,o),i(n))},getSelection:function(e){var t;if("selectionStart"in e)t={start:e.selectionStart,end:e.selectionEnd};else if(document.selection&&e.nodeName&&"input"===e.nodeName.toLowerCase()){var n=document.selection.createRange();n.parentElement()===e&&(t={start:-n.moveStart("character",-e.value.length),end:-n.moveEnd("character",-e.value.length)})}else t=o.getOffsets(e);return t||{start:0,end:0}},setSelection:function(e,t){var n=t.start,r=t.end;if("undefined"==typeof r&&(r=n),"selectionStart"in e)e.selectionStart=n,e.selectionEnd=Math.min(r,e.value.length);else if(document.selection&&e.nodeName&&"input"===e.nodeName.toLowerCase()
 ){var a=e.createTextRange();a.collapse(!0),a.moveStart("character",n),a.moveEnd("character",r-n),a.select()}else o.setOffsets(e,t)}};t.exports=s},{147:147,152:152,153:153,49:49}],65:[function(e,t,n){"use strict";function r(e){return f+e.toString(36)}function o(e,t){return e.charAt(t)===f||t===e.length}function a(e){return""===e||e.charAt(0)===f&&e.charAt(e.length-1)!==f}function i(e,t){return 0===t.indexOf(e)&&o(t,e.length)}function u(e){return e?e.substr(0,e.lastIndexOf(f)):""}function s(e,t){if(a(e)&&a(t)?void 0:d(!1),i(e,t)?void 0:d(!1),e===t)return e;var n,r=e.length+h;for(n=r;n<t.length&&!o(t,n);n++);return t.substr(0,n)}function l(e,t){var n=Math.min(e.length,t.length);if(0===n)return"";for(var r=0,i=0;n>=i;i++)if(o(e,i)&&o(t,i))r=i;else if(e.charAt(i)!==t.charAt(i))break;var u=e.substr(0,r);return a(u)?void 0:d(!1),u}function c(e,t,n,r,o,a){e=e||"",t=t||"",e===t?d(!1):void 0;var l=i(t,e);l||i(e,t)?void 0:d(!1);for(var c=0,p=l?u:s,f=e;;f=p(f,t)){var h;if(o&&f===e||a&&f===t||(h
 =n(f,l,r)),h===!1||f===t)break;c++<v?void 0:d(!1)}}var p=e(84),d=e(158),f=".",h=f.length,v=1e4,m={createReactRootID:function(){return r(p.createReactRootIndex())},createReactID:function(e,t){return e+t},getReactRootIDFromNodeID:function(e){if(e&&e.charAt(0)===f&&e.length>1){var t=e.indexOf(f,1);return t>-1?e.substr(0,t):e}return null},traverseEnterLeave:function(e,t,n,r,o){var a=l(e,t);a!==e&&c(e,a,n,r,!1,!0),a!==t&&c(a,t,n,o,!0,!1)},traverseTwoPhase:function(e,t,n){e&&(c("",e,t,n,!0,!1),c(e,"",t,n,!1,!0))},traverseTwoPhaseSkipTarget:function(e,t,n){e&&(c("",e,t,n,!0,!0),c(e,"",t,n,!0,!0))},traverseAncestors:function(e,t,n){c("",e,t,n,!0,!1)},getFirstCommonAncestorID:l,_getNextDescendantID:s,isAncestorIDOf:i,SEPARATOR:f};t.exports=m},{158:158,84:84}],66:[function(e,t,n){"use strict";var r={remove:function(e){e._reactInternalInstance=void 0},get:function(e){return e._reactInternalInstance},has:function(e){return void 0!==e._reactInternalInstance},set:function(e,t){e._reactInternalIns
 tance=t}};t.exports=r},{}],67:[function(e,t,n){"use strict";var r=e(32),o=e(34),a=e(33),i=e(43),u=e(55),s=(e(56),e(80)),l=e(94),c=e(24),p=e(132),d=u.createElement,f=u.createFactory,h=u.cloneElement,v={Children:{map:r.map,forEach:r.forEach,count:r.count,toArray:r.toArray,only:p},Component:o,createElement:d,cloneElement:h,isValidElement:u.isValidElement,PropTypes:s,createClass:a.createClass,createFactory:f,createMixin:function(e){return e},DOM:i,version:l,__spread:c};t.exports=v},{132:132,24:24,32:32,33:33,34:34,43:43,55:55,56:56,80:80,94:94}],68:[function(e,t,n){"use strict";function r(e,t){this.value=e,this.requestChange=t}function o(e){var t={value:"undefined"==typeof e?a.PropTypes.any.isRequired:e.isRequired,requestChange:a.PropTypes.func.isRequired};return a.PropTypes.shape(t)}var a=e(26);r.PropTypes={link:o},t.exports=r},{26:26}],69:[function(e,t,n){"use strict";var r=e(113),o=/\/?>/,a={CHECKSUM_ATTR_NAME:"data-react-checksum",addChecksumToMarkup:function(e){var t=r(e);return e.
 replace(o," "+a.CHECKSUM_ATTR_NAME+'="'+t+'"$&')},canReuseMarkup:function(e,t){var n=t.getAttribute(a.CHECKSUM_ATTR_NAME);n=n&&parseInt(n,10);var o=r(e);return o===n}};t.exports=a},{113:113}],70:[function(e,t,n){"use strict";function r(e,t){for(var n=Math.min(e.length,t.length),r=0;n>r;r++)if(e.charAt(r)!==t.charAt(r))return r;return e.length===t.length?-1:n}function o(e){return e?e.nodeType===W?e.documentElement:e.firstChild:null}function a(e){var t=o(e);return t&&X.getID(t)}function i(e){var t=u(e);if(t)if(V.hasOwnProperty(t)){var n=V[t];n!==e&&(p(n,t)?L(!1):void 0,V[t]=e)}else V[t]=e;return t}function u(e){return e&&e.getAttribute&&e.getAttribute(B)||""}function s(e,t){var n=u(e);n!==t&&delete V[n],e.setAttribute(B,t),V[t]=e}function l(e){return V.hasOwnProperty(e)&&p(V[e],e)||(V[e]=X.findReactNodeByID(e)),V[e]}function c(e){var t=T.get(e)._rootNodeID;return D.isNullComponentID(t)?null:(V.hasOwnProperty(t)&&p(V[t],t)||(V[t]=X.findReactNodeByID(t)),V[t])}function p(e,t){if(e){u(e)
 !==t?L(!1):void 0;var n=X.findReactContainerForID(t);if(n&&O(n,e))return!0}return!1}function d(e){delete V[e]}function f(e){var t=V[e];return t&&p(t,e)?void(G=t):!1}function h(e){G=null,P.traverseAncestors(e,f);var t=G;return G=null,t}function v(e,t,n,r,o,a){_.useCreateElement&&(a=I({},a),n.nodeType===W?a[q]=n:a[q]=n.ownerDocument);var i=w.mountComponent(e,t,r,a);e._renderedComponent._topLevelWrapper=e,X._mountImageIntoNode(i,n,o,r)}function m(e,t,n,r,o){var a=R.ReactReconcileTransaction.getPooled(r);a.perform(v,null,e,t,n,a,r,o),R.ReactReconcileTransaction.release(a)}function g(e,t){for(w.unmountComponent(e),t.nodeType===W&&(t=t.documentElement);t.lastChild;)t.removeChild(t.lastChild)}function y(e){var t=a(e);return t?t!==P.getReactRootIDFromNodeID(t):!1}function C(e){for(;e&&e.parentNode!==e;e=e.parentNode)if(1===e.nodeType){var t=u(e);if(t){var n,r=P.getReactRootIDFromNodeID(t),o=e;do if(n=u(o),o=o.parentNode,null==o)return null;while(n!==r);if(o===z[r])return e}}return null}var 
 b=e(10),E=e(28),_=(e(39),e(44)),x=e(55),D=e(58),P=e(65),T=e(66),M=e(69),N=e(76),w=e(82),S=e(92),R=e(93),I=e(24),k=e(151),O=e(147),A=e(129),L=e(158),U=e(135),F=e(138),B=(e(141),e(168),b.ID_ATTRIBUTE_NAME),V={},j=1,W=9,K=11,q="__ReactMount_ownerDocument$"+Math.random().toString(36).slice(2),H={},z={},Y=[],G=null,Q=function(){};Q.prototype.isReactComponent={},Q.prototype.render=function(){return this.props};var X={TopLevelWrapper:Q,_instancesByReactRootID:H,scrollMonitor:function(e,t){t()},_updateRootComponent:function(e,t,n,r){return X.scrollMonitor(n,function(){S.enqueueElementInternal(e,t),r&&S.enqueueCallbackInternal(e,r)}),e},_registerComponent:function(e,t){!t||t.nodeType!==j&&t.nodeType!==W&&t.nodeType!==K?L(!1):void 0,E.ensureScrollValueMonitoring();var n=X.registerContainer(t);return H[n]=e,n},_renderNewRootComponent:function(e,t,n,r){var o=A(e,null),a=X._registerComponent(o,t);return R.batchedUpdates(m,o,a,t,n,r),o},renderSubtreeIntoContainer:function(e,t,n,r){return null==e|
 |null==e._reactInternalInstance?L(!1):void 0,X._renderSubtreeIntoContainer(e,t,n,r)},_renderSubtreeIntoContainer:function(e,t,n,r){x.isValidElement(t)?void 0:L(!1);var i=new x(Q,null,null,null,null,null,t),s=H[a(n)];if(s){var l=s._currentElement,c=l.props;if(F(c,t)){var p=s._renderedComponent.getPublicInstance(),d=r&&function(){r.call(p)};return X._updateRootComponent(s,i,n,d),p}X.unmountComponentAtNode(n)}var f=o(n),h=f&&!!u(f),v=y(n),m=h&&!s&&!v,g=X._renderNewRootComponent(i,n,m,null!=e?e._reactInternalInstance._processChildContext(e._reactInternalInstance._context):k)._renderedComponent.getPublicInstance();return r&&r.call(g),g},render:function(e,t,n){return X._renderSubtreeIntoContainer(null,e,t,n)},registerContainer:function(e){var t=a(e);return t&&(t

<TRUNCATED>

[14/50] [abbrv] allura git commit: [#7919] Move add-new-tool modals into the nav bar

Posted by br...@apache.org.
[#7919] Move add-new-tool modals into the nav bar


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/c0925bb1
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/c0925bb1
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/c0925bb1

Branch: refs/heads/db/8034
Commit: c0925bb1c2ad4d049a6d94b7f64a6f8a778b2cbb
Parents: 62c5f50
Author: Heith Seewald <he...@gmail.com>
Authored: Fri Dec 4 15:52:02 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:35 2015 -0600

----------------------------------------------------------------------
 Allura/allura/ext/admin/admin_main.py           | 41 +++++++----
 .../admin/templates/project_install_tool.html   | 72 ++++++++++++++++++++
 .../ext/admin/templates/project_tools.html      | 38 -----------
 Allura/allura/model/project.py                  |  6 +-
 Allura/allura/public/nf/css/navbar.css          |  7 ++
 Allura/allura/public/nf/js/navbar.es6.js        | 15 ++--
 Allura/allura/public/nf/js/project_tools.js     | 30 +-------
 .../templates/app_admin_options_on_install.html | 31 ---------
 .../allura/templates/jinja_master/top_nav.html  |  2 +-
 9 files changed, 120 insertions(+), 122 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/c0925bb1/Allura/allura/ext/admin/admin_main.py
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/admin_main.py b/Allura/allura/ext/admin/admin_main.py
index c50a71a..6bb6b46 100644
--- a/Allura/allura/ext/admin/admin_main.py
+++ b/Allura/allura/ext/admin/admin_main.py
@@ -295,15 +295,6 @@ class ProjectAdminController(BaseController):
             flash('Invalid threshold', 'error')
         redirect('tools?limit=%s&page=%s' % (limit, page))
 
-    @expose('jinja:allura:templates/app_admin_options_on_install.html')
-    def options_on_install(self, tool_name):
-        """Renders form fields for options configuration on install"""
-        tool = [t['app'] for t in AdminApp.installable_tools_for(c.project)
-                if t['name'].lower() == tool_name.lower()]
-        if len(tool) == 1:
-            return {'options': tool[0].options_on_install()}
-        raise exc.HTTPNotFound
-
     @expose()
     @require_post()
     def update_labels(self, labels=None, **kw):
@@ -342,9 +333,27 @@ class ProjectAdminController(BaseController):
         redirect('tools')
 
     @without_trailing_slash
-    @expose('jinja:allura.ext.admin:templates/project_permissions.html')
-    def groups(self, **kw):
-        return dict()
+    @expose('jinja:allura.ext.admin:templates/project_install_tool.html')
+    def install_tool(self, tool_name=None, **kw):
+        if tool_name == 'subproject':
+            return dict(
+                    tool_name=tool_name,
+                    tool={
+                        'tool_label': 'Sub Project',
+                        'default_mount_label': 'SubProject',
+                        'default_mount_point': 'subproject'
+                    },
+                    total_mounts=999,  # FIXME
+                    options=[],
+            )
+
+        tool = g.entry_points['tool'][tool_name]
+        return dict(
+                tool_name=tool_name,
+                tool=tool,
+                total_mounts=999,  # FIXME
+                options=tool.options_on_install(),
+        )
 
     @expose()
     def _lookup(self, name, *remainder):
@@ -353,6 +362,12 @@ class ProjectAdminController(BaseController):
             raise exc.HTTPNotFound, name
         return app.admin, remainder
 
+
+    @without_trailing_slash
+    @expose('jinja:allura.ext.admin:templates/project_permissions.html')
+    def groups(self, **kw):
+        return dict()
+
     @expose()
     @require_post()
     @validate(W.metadata_admin, error_handler=overview)
@@ -715,6 +730,8 @@ class ProjectAdminController(BaseController):
     @expose()
     @require_post()
     def update_mounts(self, subproject=None, tool=None, new=None, page=0, limit=200, **kw):
+        if new and new['ep_name'] == u'subproject':
+            new['ep_name'] = ""
         try:
             new_app = self._update_mounts(subproject, tool, new, **kw)
             if new_app:

http://git-wip-us.apache.org/repos/asf/allura/blob/c0925bb1/Allura/allura/ext/admin/templates/project_install_tool.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/project_install_tool.html b/Allura/allura/ext/admin/templates/project_install_tool.html
new file mode 100644
index 0000000..b4d560b
--- /dev/null
+++ b/Allura/allura/ext/admin/templates/project_install_tool.html
@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
+
+{% set full_url = h.absurl(c.project.url()) %}
+
+<h1> Installing {{ tool.tool_label }} </h1>
+
+<form method="post" action="{{ full_url }}/admin/update_mounts" id="install_form">
+    <input type="hidden" name="new.ordinal" value="{{ total_mounts }}"/>
+    <input type="hidden" name="new.ep_name" class="new_ep_name" value="{{ tool_name }}">
+    <label class="grid-13" for="new.mount_label">Label</label>
+    <div class="grid-13"><input type="text" name="new.mount_label" class="new_mount_label"
+                                title="This will be the name displayed in your project toolbar."
+                                value="{{ tool.default_mount_label }}">
+    </div>
+    <label class="grid-13" for="new.mount_point">Url Path</label>
+    <div class="grid-13">
+        <input id="id_url_input" type="text" name="new.mount_point"
+               title="The url for this tool relative to {{ full_url }} " class="new_mount_point"
+               value="{{ tool.default_mount_point }}">
+        <p><span id="full-url-preview" data-url="{{ full_url }}"></span></p>
+    </div>
+    <div id="install_options">
+        {% for o in options %}
+          <label class="grid-13" for="{{o.name}}">{{o.label}}</label>
+          <div class="grid-13">
+            {% if o.ming_type.__name__ == 'bool' %}
+              <input {{o.render_attrs()}}id="{{o.name}}" name="{{o.name}}" type="checkbox"{{ ' checked="checked"' if o.default}}>
+            {% else %}
+              <input {{o.render_attrs()}} id="{{o.name}}" name="{{o.name}}" value="{{o.default or ''}}">
+            {% endif %}
+          </div>
+          {% if o.help_text %}
+            <div class="grid-13"><small>{{o.help_text}}</small></div>
+          {% endif %}
+        {% endfor %}
+    </div>
+    <div class="grid-13">&nbsp;</div>
+    <hr>
+    <div class="grid-13">&nbsp;</div>
+    <div class="grid-13">
+        <input type="submit" value="Save" name="new.install"> <a href="#" class="close btn link">Cancel</a>
+    </div>
+    {{lib.csrf_token()}}
+</form>
+
+
+<script>
+    $('#admin_modal_title').hide();
+    var url_preview = $('#full-url-preview'); // "Preview Url Path" displayed on when creating a new tool.
+
+    var full_url = $(url_preview).data().url; // Full url path of current project.
+
+    // Update the url path preview as they type.
+    $('#id_url_input').keyup(function(){
+        url_preview.html(full_url + '<strong style="color:orange">' + $(this).val() + "</strong>");
+    }).keyup();
+
+    // Set url_preview to the Url Path Defaults when creating a new tool.
+    // Add the link tool's 'nice name'.
+{#    defaults['external link'] = defaults.link#}
+{#    var tool_name = $.trim($(this).text().toLowerCase());#}
+{##}
+{#    // If a tool has a default url path, use it for an initial preview.#}
+{#    if (defaults[tool_name]) {#}
+{#        url_preview.html(full_url + '<strong class="url-keyword">' + defaults[tool_name].default_mount + "</strong>");#}
+{#    }#}
+{#    else {#}
+{#        // No defaults for this tool, so we use the base url to ensure the url_preview is reset.#}
+{#        url_preview.html(full_url);#}
+{#    }#}
+</script>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/allura/blob/c0925bb1/Allura/allura/ext/admin/templates/project_tools.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/project_tools.html b/Allura/allura/ext/admin/templates/project_tools.html
index 4b22bbe..7b2bc20 100644
--- a/Allura/allura/ext/admin/templates/project_tools.html
+++ b/Allura/allura/ext/admin/templates/project_tools.html
@@ -124,44 +124,6 @@
 </form>
 {% endblock %}
 
-{% block extra_js %}
-<script>
-    var defaults = {
-        {% for tool in installable_tools %}
-        '{{tool.name}}':{'default_label':'{{tool.app.default_mount_label}}','default_mount':'{{tool.app.default_mount_point}}'}{% if not loop.last %},{% endif %}
-        {% endfor %}
-    };
-    var install_options_url = "{{ c.project.url().rstrip('/') }}/admin/options_on_install";
-</script>
-<script>
-/* Real-time preview of a Url Path (aka mount point). */
-
-    var url_preview = $('#full-url-preview'); // "Preview Url Path" displayed on when creating a new tool.
-    var full_url = $(url_preview).data().url; // Full url path of current project.
-
-    // Update the url path preview as they type.
-    $('#id_url_input').keyup(function(){
-        url_preview.html(full_url + '<strong class="url-keyword">' + $(this).val() + "</strong>");
-    });
-
-    // Set url_preview to the Url Path Defaults when creating a new tool.
-    $('.installable_tool').find('a').on('click', function () {
-        // Add the link tool's 'nice name'.
-        defaults['external link'] = defaults.link
-        var tool_name = $.trim($(this).text().toLowerCase());
-
-        // If a tool has a default url path, use it for an initial preview.
-        if (defaults[tool_name]) {
-            url_preview.html(full_url + '<strong class="url-keyword">' + defaults[tool_name].default_mount + "</strong>");
-        }
-        else {
-            // No defaults for this tool, so we use the base url to ensure the url_preview is reset.
-            url_preview.html(full_url);
-        }
-    });
-</script>
-{% endblock %}
-
 {% block extra_css %}
 <style type="text/css">
 .pad .fourcol .fleft {

http://git-wip-us.apache.org/repos/asf/allura/blob/c0925bb1/Allura/allura/model/project.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/project.py b/Allura/allura/model/project.py
index cafa8ad..158904a 100644
--- a/Allura/allura/model/project.py
+++ b/Allura/allura/model/project.py
@@ -643,8 +643,12 @@ class Project(SearchIndexable, MappedClass, ActivityNode, ActivityObject):
             children.append(entry)
 
         response = dict(grouping_threshold=grouping_threshold, menu=children)
+
         if admin_options:
-            response['installable_tools'] =[dict(text=t['tool_label'], href='#', tooltip=t['description'])
+            _href = '{}admin/install_tool?tool_name={}'
+            response['installable_tools'] = [dict(text=t['tool_label'],
+                                                  href=_href.format(self.url(), t['name']),
+                                                  tooltip=t['description'])
                                              for t in ProjectAdminRestController().installable_tools()['tools']]
         return response
 

http://git-wip-us.apache.org/repos/asf/allura/blob/c0925bb1/Allura/allura/public/nf/css/navbar.css
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/css/navbar.css b/Allura/allura/public/nf/css/navbar.css
index 381ea55..795bf54 100644
--- a/Allura/allura/public/nf/css/navbar.css
+++ b/Allura/allura/public/nf/css/navbar.css
@@ -291,3 +291,10 @@
 #top_nav_admin .tool_option > a {
     border-right: none !important;
 }
+
+/*.modal {*/
+    /*background-color: rgba(51, 51, 51, 0.94) !important;*/
+    /*border-radius: 12px !important;*/
+    /*background-image: none !important;*/
+    /*box-shadow: inset 0 1px 1px #aaaaaa,inset 0 -2px 20px rgba(96, 96, 96, 0.5),0 1px 5px rgba(0, 0, 0, 0.4) !important;*/
+/*}*/

http://git-wip-us.apache.org/repos/asf/allura/blob/c0925bb1/Allura/allura/public/nf/js/navbar.es6.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/navbar.es6.js b/Allura/allura/public/nf/js/navbar.es6.js
index 96ec8eb..70b7d65 100644
--- a/Allura/allura/public/nf/js/navbar.es6.js
+++ b/Allura/allura/public/nf/js/navbar.es6.js
@@ -213,10 +213,6 @@ var ToggleAddNewTool = React.createClass({
             visible: !this.state.visible
         });
     },
-        handleOptionClick: function(event) {
-            console.log('event', event);
-        //this.props.onOptionClick(this.props.mount_point);
-    },
 
     render: function () {
         return (
@@ -227,8 +223,8 @@ var ToggleAddNewTool = React.createClass({
                 {this.state.visible &&
                 <ContextMenu
                     {...this.props}
-                    classes={['alt-context']}
-                    onOptionClick={this.handleOptionClick}
+                    classes={['admin_modal']}
+                    onOptionClick={this.handleToggle}
                     items={this.props.installableTools} />
                 }
             </div>
@@ -258,9 +254,9 @@ var NormalNavBar = React.createClass({
         );
     },
 
-    onOptionClick: function(e){
-        console.log(e);
-    },
+    //onOptionClick: function(e){
+    //    console.log(e);
+    //},
     render: function() {
         var listItems = this.props.items.map(this.buildMenu);
 
@@ -274,7 +270,6 @@ var NormalNavBar = React.createClass({
                 }
             }
         }
-        console.log("mount_points", mount_points);
         return (
             <ul
                 id="normal-nav-bar"

http://git-wip-us.apache.org/repos/asf/allura/blob/c0925bb1/Allura/allura/public/nf/js/project_tools.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/project_tools.js b/Allura/allura/public/nf/js/project_tools.js
index c235f05..ce8d28b 100644
--- a/Allura/allura/public/nf/js/project_tools.js
+++ b/Allura/allura/public/nf/js/project_tools.js
@@ -18,35 +18,7 @@
 */
 
 (function() {
-    // Install popup
-    var install_popup = $('#lightbox_install_modal');
-    var install_form = $('#install_form');
-    var new_ep_name = install_form.find('input.new_ep_name');
-    var new_mount_point = install_form.find('input.new_mount_point');
-    var new_mount_label = install_form.find('input.new_mount_label');
-    var install_tool_label = $('#install_tool_label');
-    var mount_point_rule_names = $('#install_form .mount-point-rule-names');
-    var install_options = $('#install_options');
-    install_popup.append(install_form.show());
-    $('a.install_trig').click(function () {
-        var datatool = $(this).data('tool');
-        if (datatool) {
-            var tool = defaults[datatool];
-            install_options.html('Loading options...');
-            $.get(install_options_url, {tool_name: datatool}, function (data) {
-                install_options.html(data);
-            });
-            install_tool_label.html(tool.default_label);
-            new_ep_name.val(datatool);
-            new_mount_point.val(tool.default_mount);
-            new_mount_label.val(tool.default_label);
-        } else {
-            install_tool_label.html("Subproject");
-            new_ep_name.val('');
-            new_mount_point.val('');
-            new_mount_label.val('');
-        }
-    });
+
     // sorting
     $('#sortable').sortable({items: ".fleft:not(.isnt_sorted)"}).bind( "sortupdate", function (e) {
         var sortables = $('#sortable .fleft');

http://git-wip-us.apache.org/repos/asf/allura/blob/c0925bb1/Allura/allura/templates/app_admin_options_on_install.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/app_admin_options_on_install.html b/Allura/allura/templates/app_admin_options_on_install.html
deleted file mode 100644
index 16b62b6..0000000
--- a/Allura/allura/templates/app_admin_options_on_install.html
+++ /dev/null
@@ -1,31 +0,0 @@
-{#-
-       Licensed to the Apache Software Foundation (ASF) under one
-       or more contributor license agreements.  See the NOTICE file
-       distributed with this work for additional information
-       regarding copyright ownership.  The ASF licenses this file
-       to you under the Apache License, Version 2.0 (the
-       "License"); you may not use this file except in compliance
-       with the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-       Unless required by applicable law or agreed to in writing,
-       software distributed under the License is distributed on an
-       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-       KIND, either express or implied.  See the License for the
-       specific language governing permissions and limitations
-       under the License.
--#}
-{% for o in options %}
-  <label class="grid-13" for="{{o.name}}">{{o.label}}</label>
-  <div class="grid-13">
-    {% if o.ming_type.__name__ == 'bool' %}
-      <input {{o.render_attrs()}}id="{{o.name}}" name="{{o.name}}" type="checkbox"{{ ' checked="checked"' if o.default}}>
-    {% else %}
-      <input {{o.render_attrs()}} id="{{o.name}}" name="{{o.name}}" value="{{o.default or ''}}">
-    {% endif %}
-  </div>
-  {% if o.help_text %}
-    <div class="grid-13"><small>{{o.help_text}}</small></div>
-  {% endif %}
-{% endfor %}

http://git-wip-us.apache.org/repos/asf/allura/blob/c0925bb1/Allura/allura/templates/jinja_master/top_nav.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/jinja_master/top_nav.html b/Allura/allura/templates/jinja_master/top_nav.html
index 21bcb48..ce449ef 100644
--- a/Allura/allura/templates/jinja_master/top_nav.html
+++ b/Allura/allura/templates/jinja_master/top_nav.html
@@ -49,7 +49,7 @@
     {% do g.register_forge_js('js/build/transpiled.js') %} {# if we do more es6, we'll need to register this in other places, or maybe even global #}
     <script>
     'use strict';
-    let _data = {{ h.escape_json(c.project.nav_data(admin_options=True))|safe  }};
+    var _data = {{ h.escape_json(c.project.nav_data(admin_options=True))|safe  }};
         $(document).ready(function () {
             $('#toggle-admin-btn').click(function () {
                 ReactDOM.render(React.createElement(Main, {


[33/50] [abbrv] allura git commit: [#7919] new tools/subprojects to get proper last ordinal value

Posted by br...@apache.org.
[#7919] new tools/subprojects to get proper last ordinal value


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/54bc381c
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/54bc381c
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/54bc381c

Branch: refs/heads/db/8034
Commit: 54bc381c41ee71f1e35b5a5066df6285c1f10f50
Parents: 478fc33
Author: Dave Brondsema <da...@brondsema.net>
Authored: Thu Dec 10 13:35:05 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:39 2015 -0600

----------------------------------------------------------------------
 Allura/allura/ext/admin/admin_main.py           | 13 +++++-----
 .../admin/templates/project_install_tool.html   |  1 -
 Allura/allura/model/project.py                  | 27 +++++++++++++++++---
 3 files changed, 30 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/54bc381c/Allura/allura/ext/admin/admin_main.py
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/admin_main.py b/Allura/allura/ext/admin/admin_main.py
index d9f87fa..f0bc151 100644
--- a/Allura/allura/ext/admin/admin_main.py
+++ b/Allura/allura/ext/admin/admin_main.py
@@ -343,7 +343,6 @@ class ProjectAdminController(BaseController):
                         'default_mount_label': 'SubProject',
                         'default_mount_point': 'subproject'
                     },
-                    total_mounts=999,  # FIXME
                     options=[],
             )
 
@@ -351,7 +350,6 @@ class ProjectAdminController(BaseController):
         return dict(
                 tool_name=tool_name,
                 tool=tool,
-                total_mounts=999,  # FIXME
                 options=tool.options_on_install(),
         )
 
@@ -700,7 +698,10 @@ class ProjectAdminController(BaseController):
                     meta=dict(mount_point=mount_point, name=new['mount_label']))
                 sp = c.project.new_subproject(mount_point)
                 sp.name = new['mount_label']
-                sp.ordinal = int(new['ordinal'])
+                if 'ordinal' in new:
+                    sp.ordinal = int(new['ordinal'])
+                else:
+                    sp.ordinal = c.project.last_ordinal_value() + 1
             else:
                 require_access(c.project, 'admin')
                 installable_tools = AdminApp.installable_tools_for(c.project)
@@ -722,7 +723,7 @@ class ProjectAdminController(BaseController):
                     ep_name,
                     mount_point,
                     mount_label=new['mount_label'],
-                    ordinal=new['ordinal'],
+                    ordinal=int(new['ordinal']) if 'ordinal' in new else None,
                     **config_on_install)
         g.post_event('project_updated')
 
@@ -763,9 +764,10 @@ class ProjectAdminController(BaseController):
             'status': c.project.bulk_export_status()
         }
 
+
 class ProjectAdminRestController(BaseController):
     """
-    Exposes RESTful APi for project admin actions.
+    Exposes RESTful API for project admin actions.
     """
 
     def _check_security(self):
@@ -788,7 +790,6 @@ class ProjectAdminRestController(BaseController):
         M.AuditLog.log('Updated tool order')
         return {'status': 'ok'}
 
-
     @expose('json:')
     @require_post()
     def configure_tool_grouping(self, grouping_threshold='1', **kw):

http://git-wip-us.apache.org/repos/asf/allura/blob/54bc381c/Allura/allura/ext/admin/templates/project_install_tool.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/project_install_tool.html b/Allura/allura/ext/admin/templates/project_install_tool.html
index 0e6d98d..82f6f65 100644
--- a/Allura/allura/ext/admin/templates/project_install_tool.html
+++ b/Allura/allura/ext/admin/templates/project_install_tool.html
@@ -14,7 +14,6 @@
 {% endif %}
 
 <form method="post" action="{{ full_url }}admin/update_mounts" id="install_form">
-    <input type="hidden" name="new.ordinal" value="{{ total_mounts }}"/>
     <input type="hidden" name="new.ep_name" class="new_ep_name" value="{{ tool_name }}">
     <label class="grid-13" for="new.mount_label">Label</label>
     <div class="grid-13"><input type="text" name="new.mount_label" class="new_mount_label"

http://git-wip-us.apache.org/repos/asf/allura/blob/54bc381c/Allura/allura/model/project.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/project.py b/Allura/allura/model/project.py
index 158904a..6a2007d 100644
--- a/Allura/allura/model/project.py
+++ b/Allura/allura/model/project.py
@@ -776,12 +776,29 @@ class Project(SearchIndexable, MappedClass, ActivityNode, ActivityObject):
         except fe.Invalid as e:
             raise exceptions.ToolError(u'{}: {}'.format(opt.name, str(e)))
 
+    def last_ordinal_value(self):
+        last_menu_item = self.ordered_mounts(include_hidden=True)[-1]
+        if 'ac' in last_menu_item:
+            ordinal = last_menu_item['ac'].options.ordinal
+        else:
+            ordinal = last_menu_item['sub'].ordinal
+        return ordinal
+
     def install_app(self, ep_name, mount_point=None, mount_label=None, ordinal=None, **override_options):
+        '''
+        Install an app
+
+        :param str ep_name: Entry Point name, e.g. "wiki"
+        :param str mount_point: URL path, e.g. "docs"
+        :param str mount_label: Display name
+        :param int ordinal: location of tool, relative to others; None will go to the end.
+        :param override_options:
+        :return:
+        '''
         App = g.entry_points['tool'][ep_name]
         mount_point = self._mount_point_for_install(App, mount_point)
         if ordinal is None:
-            ordinal = int(self.ordered_mounts(include_hidden=True)
-                          [-1]['ordinal']) + 1
+            ordinal = self.last_ordinal_value() + 1
         options = App.default_options()
         options['mount_point'] = mount_point
         options['mount_label'] = mount_label or App.default_mount_label or mount_point
@@ -843,8 +860,10 @@ class Project(SearchIndexable, MappedClass, ActivityNode, ActivityObject):
         return provider.register_subproject(self, name, user or c.user, install_apps, project_name=project_name)
 
     def ordered_mounts(self, include_hidden=False):
-        '''Returns an array of a projects mounts (tools and sub-projects) in
-        toolbar order.'''
+        '''
+        Returns an array of a projects mounts (tools and sub-projects) in toolbar order.
+        Note that the top-level 'ordinal' field may be offset from the stored ordinal value, due to anchored tools
+        '''
         result = []
         anchored_tools = self.neighborhood.get_anchored_tools()
         i = len(anchored_tools)


[03/50] [abbrv] allura git commit: [#7919] Clean up add-new-tool components.

Posted by br...@apache.org.
[#7919]  Clean up add-new-tool components.


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/6d9fbb23
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/6d9fbb23
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/6d9fbb23

Branch: refs/heads/db/8034
Commit: 6d9fbb23f9c01e13ee2ac8b420e49ab7d2f23be1
Parents: ab53fe6
Author: Heith Seewald <he...@gmail.com>
Authored: Thu Dec 3 10:51:22 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:54:29 2015 -0600

----------------------------------------------------------------------
 Allura/allura/public/nf/css/navbar.css         | 193 +--------
 Allura/allura/public/nf/js/add-new-tool.es6.js | 408 --------------------
 2 files changed, 4 insertions(+), 597 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/6d9fbb23/Allura/allura/public/nf/css/navbar.css
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/css/navbar.css b/Allura/allura/public/nf/css/navbar.css
index 35df144..c46b513 100644
--- a/Allura/allura/public/nf/css/navbar.css
+++ b/Allura/allura/public/nf/css/navbar.css
@@ -244,155 +244,6 @@
 
 .tb-sub-menu .react-drag:hover a {
     color: white;
-
-}
-
-/*Add new tool*/
-/*////////////*/
-
-.btn-bar {
-    display: block;
-    padding: 0 10px 0 10px;
-    -moz-border-radius: 4px;
-    -webkit-border-radius: 4px;
-    -o-border-radius: 4px;
-    -ms-border-radius: 4px;
-    -khtml-border-radius: 4px;
-    border-radius: 4px;
-    text-decoration: none;
-    min-width: 1em;
-    text-align: center;
-    position: relative;
-    margin: 0 0 20px;
-}
-
-.installable-tool-box {
-    background-color: whitesmoke;
-    color: #757575;
-    border-right: 2px solid #AAAAAA;
-    /* background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(0%, #ffffff), color-stop(100%, rgba(204, 204, 204, 0.42))); */
-    background-image: -moz-linear-gradient(top, #ffffff 0%, #cccccc 100%);
-    background-image: linear-gradient(top, #ffffff 0%, #cccccc 100%);
-    /* margin: auto; */
-}
-
-.installable-tool-box div {
-    border-radius: 0 0 4px 4px;
-    /* text-align: center; */
-    font-size: 1rem;
-    /* font-weight: 700; */
-    list-style: none;
-    text-align: right;
-    cursor: pointer;
-    /* min-width: 40px; */
-    border: 1px solid rgba(77, 77, 77, 0.07);
-    -webkit-user-select: none;
-    -moz-user-select: none;
-    -ms-user-select: none;
-    -o-user-select: none;
-    user-select: none;
-    margin: 0;
-    padding: 10px;
-}
-
-.tool-card .selected-tool {
-    background: #09C !important;
-    color: white !important;
-    height: 21px;
-}
-
-.installable-tool-box div:hover {
-    background: white;
-    border: 1px solid #09C;
-}
-
-.installable-tool-box div.selected-tool:hover {
-    background: white;
-    color: rgb(85, 85, 85);
-}
-
-.tool-card {
-    width: 90%;
-    margin-left: 88px;
-    border: 1px solid #646464;
-    border-radius: 2px 2px 5px 5px;
-    margin-bottom: 41px;
-    position: relative;
-    overflow: auto;
-    top: 15px;
-    box-shadow: -2px 5px 7px #8F8F8F;
-}
-
-.box-title {
-    z-index: 60;
-    height: auto;
-    font-size: small;
-    text-align: center;
-    padding-bottom: 3px;
-    position: relative;
-    padding-top: 3px;
-    background: #4E4E4E;
-    color: #DEDEDE;
-}
-
-#tool-info {
-    float: left;
-    width: 82%;
-}
-
-#tool-info-left {
-    background: #636363;
-    width: 40%;
-    color: white;
-    float: left;
-    margin: auto;
-    height: 267px;
-}
-
-#tool-info-left p {
-    text-align: center;
-    vertical-align: text-top;
-    padding-top: 0;
-    left: 0;
-    font-size: 11pt;
-    font-weight: 700;
-    color: #F9F9F9;
-    padding-bottom: 20px;
-    margin: 20px;
-}
-
-#tool-info h1 {
-    padding: 10px;
-    font-size: xx-large;
-    margin: 0;
-    border-bottom: 1px solid #999;
-}
-
-.add-tool-error-box {
-    background: #ffc5ca;
-    border: 1px solid #888;
-    width: 135px;
-    margin-left: 17px;
-}
-
-#tool-info-right {
-    width: 60%;
-    float: left;
-    background: whitesmoke;
-}
-
-#add-tool-form {
-    padding-top: 20px;
-    /* padding: 12px; */
-    margin-left: 30px;
-}
-
-#mount_point :invalid {
-    background: #333;
-}
-
-#top_nav #add-tool-container {
-    padding-bottom: 0;
 }
 
 #top_nav .add-tool-toggle {
@@ -417,16 +268,7 @@
     text-decoration: underline;
 }
 
-/*.react-drag{*/
-/*display: block;*/
-/*max-width: 150px;*/
-/*float: left;*/
-/*!*border: 1px solid black;*!*/
-/*}*/
-
-/* Options Menu */
-
-.optionMenu {
+.contextMenu {
     background: #f0f0f0;
     border: 1px solid #999;
     box-shadow: -2px 2px 6px #555;
@@ -439,13 +281,14 @@
     clear: both;
 }
 
-.optionMenu > ul {
+.contextMenu > ul {
     list-style: none;
     border: none;
     margin-left: 2px;
+    visibility: visible !important;
 }
 
-#top_nav_admin .optionMenu > ul > li > a {
+#top_nav_admin .contextMenu > ul > li > a {
     margin: 4px;
     border-right: none;
     clear: both;
@@ -454,31 +297,3 @@
 #top_nav_admin .tool_option > a {
     border-right: none !important;
 }
-
-.wiki-tool {
-    background: #DFDFDF;
-}
-
-.git-tool {
-    background: #DFDFDF;
-}
-
-.mercurial-tool {
-    background: #DFDFDF;
-}
-
-.tickets-tool {
-    background: #DFDFDF;
-}
-
-.discussion-tool {
-    background: #DFDFDF;
-}
-
-.blog-tool {
-    background: #DFDFDF;
-}
-
-.link-tool {
-    background: #DFDFDF;
-}

http://git-wip-us.apache.org/repos/asf/allura/blob/6d9fbb23/Allura/allura/public/nf/js/add-new-tool.es6.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/add-new-tool.es6.js b/Allura/allura/public/nf/js/add-new-tool.es6.js
deleted file mode 100644
index a9dca18..0000000
--- a/Allura/allura/public/nf/js/add-new-tool.es6.js
+++ /dev/null
@@ -1,408 +0,0 @@
-/*
-       Licensed to the Apache Software Foundation (ASF) under one
-       or more contributor license agreements.  See the NOTICE file
-       distributed with this work for additional information
-       regarding copyright ownership.  The ASF licenses this file
-       to you under the Apache License, Version 2.0 (the
-       "License"); you may not use this file except in compliance
-       with the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-       Unless required by applicable law or agreed to in writing,
-       software distributed under the License is distributed on an
-       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-       KIND, either express or implied.  See the License for the
-       specific language governing permissions and limitations
-       under the License.
-*/
-'use strict';
-
-///////////////////////////////////////////////////
-// Components for adding a new tool to a project //
-///////////////////////////////////////////////////
-
-/**
- * Add new tool button.
- * @constructor
- */
-var AddNewToolButton = React.createClass({
-    render: function() {
-        return (
-            <div>
-            <a onClick={ this.props.handleToggleAddNewTool } className='add-tool-toggle'>
-                Add New...
-            </a>
-            { this.props.showAddToolMenu && <NewToolMain {...this.props} />}
-            </div>
-        );
-    }
-});
-
-/**
- * Menu for adding a new tool.
- * @constructor
- */
-var NewToolMenu = React.createClass({
-    propTypes: {
-        tools: React.PropTypes.array,
-        onPushAddButton: React.PropTypes.func,
-        onSetActive: React.PropTypes.func,
-        formData: React.PropTypes.object,
-        visible: React.PropTypes.bool
-    },
-    render: function() {
-        var _this = this;
-        var showInfo = this.props.active.name !== 'Add a tool';
-        var tools = this.props.tools.map(function(tool, i) {
-            var classes;
-            if (_this.props.active && _this.props.active.tool_label === tool.tool_label) {
-                classes = ' selected-tool';
-            }else {
-                classes = ' ';
-            }
-            return (
-                <div className={classes}
-                    id={'add-new-' + tool.name}
-                    key={`new-tool-btn-${i}`}
-                    onClick={_this.props.handleChangeTool}>
-                    {tool.tool_label}
-                </div>
-            );
-        });
-
-        return (
-            <div className='tool-card'>
-                <div id='installable-items'>
-                    <div className='installable-tool-box'>
-                        {tools}
-                    </div>
-                </div>
-                {showInfo &&
-                <NewToolInfo {...this.props}
-                    name={this.props.active.name}
-                    toolLabel={this.props.active.tool_label}
-                    description={this.props.active.description}
-                    handleAddButton={this.props.handleAddButton}/>
-                }
-            </div>
-        );
-    }
-});
-
-var FormField = React.createClass({
-    propTypes: {
-        id: React.PropTypes.string,
-        handleOnChange: React.PropTypes.func,
-        inputType: React.PropTypes.string,
-        pattern: React.PropTypes.string,
-        value: React.PropTypes.string,
-        errors: React.PropTypes.object
-    },
-    getDefaultProps: function () {
-        return {
-            inputType: "text",
-            pattern: "",
-            errors: {}
-        };
-    },
-    getErrors: function() {
-        if (!this.props.errors.hasOwnProperty(this.props.id)
-            || this.props.errors[this.props.id].length === 0) {
-            return;
-        }
-
-        let errorList = [].concat(this.props.errors[this.props.id]);
-
-        var result = errorList.map(function(error_list, i) {
-            return <span key={"error-" + i}>{error_list}</span>;
-        });
-        console.log('result', result);
-        return (
-            <div className="add-tool-error-box">
-                {result}
-            </div>
-        );
-    },
-    render: function () {
-        let errors = this.getErrors();
-        return (
-            <div className="add-new-tool-field">
-                <label className="tool-form-input" htmlFor={this.props.id}>{this.props.label}</label>
-                <input type={this.props.inputType} required
-                       id={this.props.id}
-                       pattern={this.props.pattern}
-                       onBlur={this.props.handleOnBlur}
-                       onChange={this.props.handleOnChange}
-                       value={this.props.value}/>
-
-                {errors}
-            </div>
-
-        );
-    }
-});
-
-var InstallNewToolForm = React.createClass({
-        getDefaultProps: function () {
-        return {
-            canSubmit: false
-        };
-    },
-    render: function() {
-        return (
-            <form id='add-tool-form'>
-                <FormField
-                    key="new-tool-mount-label"
-                    id="mount_label"
-                    handleOnChange={this.props.handleChangeForm}
-                    handleOnBlur={this.props.toolFormIsValid}
-                    value={this.props.formData.mount_label}
-                    label="Label"
-                    errors={this.props.validationErrors}
-                    />
-
-                <FormField
-                    key="new-tool-mount-point"
-                    id="mount_point"
-                    handleOnChange={this.props.handleChangeForm}
-                    handleOnBlur={this.props.toolFormIsValid}
-                    value={this.props.formData.mount_point}
-                    label="Url Path"
-                    errors={this.props.validationErrors}
-                />
-
-                {this.props.toolLabel ===  'External Link' &&
-                    <FormField
-                        key="external-url-field"
-                        id="options_url"
-                        handleOnChange={this.props.handleChangeForm}
-                        value={this.props.formData.options.options_url}
-                        label="External Url"
-                        pattern="https?://.+"
-                        inputType="url"
-                    />
-                }
-                    <p id="add-tool-url-preview">
-                        <small>{_getProjectUrl(false)}/</small>
-                        <strong>{this.props.formData.mount_point}</strong>
-                    </p>
-                <button disabled={!this.props.canSubmit}
-                        id='new-tool-submit'
-                        onClick={this.props.handleSubmit}
-                        className='add-tool-button'>
-                    Add Tool
-                </button>
-            </form>
-        );
-    }
-});
-
-var NewToolInfo = React.createClass({
-    propTypes: {
-        name: React.PropTypes.string,
-        description: React.PropTypes.string,
-        handleAddButton: React.PropTypes.func
-    },
-
-    render: function() {
-        return (
-            <div id='tool-info'>
-                <h1 className={this.props.toolLabel.toLowerCase() + "-tool"}>{this.props.toolLabel}</h1>
-                <div id='tool-info-left'>
-                    <p>{this.props.description}</p>
-                </div>
-                <div id="tool-info-right">
-                    <InstallNewToolForm {...this.props} />
-                </div>
-            </div>
-        );
-    }
-});
-
-var installableToolsCache = {};
-function loadTools(id, callback) {
-    if (!installableToolsCache[id]) {
-        installableToolsCache[id] = $.get(_getProjectUrl(true) + '/admin/installable_tools/').promise();
-    }
-    installableToolsCache[id].done(callback);
-}
-
-var NewToolMain = React.createClass({
-    getInitialState: function() {
-        let toolPlaceHolder = {
-            name: 'Add a tool',
-            tool_label: 'Add a tool',
-            description: 'click on one of the tools shown above to add it to your project.'
-        };
-
-        return {
-            visible: false,
-            installableTools: [toolPlaceHolder],
-            active: toolPlaceHolder,
-            canSubmit: false,
-            errors: {
-                mount_point: [],
-                mount_label: []
-            },
-            new_tool: {
-                mount_point: '',
-                tool_label: '',
-                mount_label: '',
-                options: {}
-            }
-        };
-    },
-    getDefaultProps: function () {
-        return {
-            existingMounts: []
-        };
-    },
-    componentDidMount: function() {
-        let tools = loadTools('tools', function(result) {
-            if (this.isMounted()) {
-                this.setState({
-                    installableTools: result.tools
-                });
-            }
-        }.bind(this));
-    },
-    handleChangeTool: function(e) {
-        this._setActiveByLabel(e.target.textContent);
-    },
-    _setActiveByLabel: function(tool_label) {
-        var index = this.state.installableTools.findIndex(
-            x => x.tool_label === tool_label
-        );
-        var active = this.state.installableTools[index];
-        var _new_tool = this.state.new_tool;
-
-        _new_tool.mount_label = active.defaults.default_mount_label;
-        _new_tool.mount_point = '';
-        _new_tool.options = {};
-
-        this.setState({
-            active: active,
-            new_tool: _new_tool,
-                            errors: {
-                    mount_point: [],
-                    mount_label: []
-                }
-        });
-        this.disableButton();
-    },
-
-    handleChangeForm: function(e) {
-            var _new_tool = this.state.new_tool;
-            var field_id = e.target.id;
-            _new_tool[field_id] = e.target.value;
-        if(field_id !== 'mount_point' && field_id !== 'mount_label'){
-            _new_tool.options[field_id] = e.target.value;
-        }
-            this.setState({
-                new_tool: _new_tool,
-            });
-        },
-
-    getOption: function(option_id){
-        return option_id.split('options_').slice(-1)[0];
-    },
-
-    enableButton: function () {
-      this.setState({
-        canSubmit: true
-      });
-    },
-    disableButton: function () {
-      this.setState({
-        canSubmit: false
-      });
-    },
-    handleSubmit: function(e) {
-        e.preventDefault();
-        var _this = this;
-        var data = {
-            _session_id: $.cookie('_session_id'),
-            tool: this.state.active.name,
-            mount_label: this.state.new_tool.mount_label,
-            mount_point: this.state.new_tool.mount_point,
-        };
-
-        if(this.state.active.name === 'link'){
-            let options = this.state.new_tool.options;
-            for(let k of Object.keys(options)){
-                if(k.startsWith('options_')) {
-                    data[this.getOption(k)] = options[k];
-                }
-            }
-        }
-        $.ajax({
-            type: 'POST',
-            url: _getProjectUrl() + '/admin/install_tool/',
-            data: data,
-            success: function() {
-                $('#messages')
-                    .notify('Tool created', {
-                        status: 'confirm'
-                    });
-                _this.disableButton();
-                // Redirect to new tool
-                if (_this.state.active.name !== 'link') {
-                    window.location.href = _getProjectUrl(false) + "/" + _this.state.new_tool.mount_point;
-                }
-            },
-
-            error: function() {
-                $('#messages')
-                    .notify('Error creating tool.', {
-                        status: 'error'
-                    });
-            }
-        });
-    },
-    toolFormIsValid: function(e) {
-        e.preventDefault();
-        if(!e.target.value){
-            return
-        }
-        var errors = {
-            mount_point: []
-        };
-
-        if (this.state.new_tool.mount_point.length < 3) {
-            errors.mount_point.push('Mount point must have at least 3 characters.');
-        }
-        if (this.props.existingMounts.indexOf(e.target.value) !== -1) {
-            errors.mount_point.push('Mount point already exists.');
-        }
-        if (errors.mount_point.length > 0) {
-            this.setState({errors: errors});
-            this.disableButton();
-        } else {
-            this.enableButton();
-            this.setState({errors: {}});
-        }
-
-    },
-
-    render: function() {
-        return (
-            <React.addons.CSSTransitionGroup
-                transitionName="menu"
-                transitionEnterTimeout={500}
-                transitionLeaveTimeout={300} >
-                    <NewToolMenu
-                        active={this.state.active}
-                        tools={this.state.installableTools}
-                        formData={this.state.new_tool}
-                        handleChangeTool={this.handleChangeTool}
-                        canSubmit={this.state.canSubmit}
-                        handleSubmit={this.handleSubmit}
-                        handleChangeForm={this.handleChangeForm}
-                        toolFormIsValid={this.toolFormIsValid}
-                        validationErrors={this.state.errors}
-                        handleAddButton={this.handleAddButton}/>
-            </React.addons.CSSTransitionGroup>
-    );
-    }
-});


[12/50] [abbrv] allura git commit: [#7919] reapply 4923bba and a583566, manually

Posted by br...@apache.org.
[#7919] reapply 4923bba and a583566, manually


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/d365040a
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/d365040a
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/d365040a

Branch: refs/heads/db/8034
Commit: d365040ad916a1d48e1dbccef293ed1713e50dff
Parents: 7ad54cd
Author: Dave Brondsema <da...@brondsema.net>
Authored: Thu Dec 3 16:31:26 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:34 2015 -0600

----------------------------------------------------------------------
 rat-excludes.txt | 8 ++++++++
 1 file changed, 8 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/d365040a/rat-excludes.txt
----------------------------------------------------------------------
diff --git a/rat-excludes.txt b/rat-excludes.txt
index 236cf00..6ad4a44 100644
--- a/rat-excludes.txt
+++ b/rat-excludes.txt
@@ -7,6 +7,8 @@
 **/MANIFEST.in
 **/nosetests.xml
 **/setup.cfg
+.jscsrc
+.jshintrc
 Allura/allura/etc/mime.types
 Allura/allura/lib/AsciiDammit.py
 Allura/allura/lib/widgets/resources/css/autocomplete.css
@@ -38,7 +40,13 @@ Allura/allura/public/nf/js/jquery.viewport.js
 Allura/allura/public/nf/js/modernizr.js
 Allura/allura/public/nf/js/pb.transformie.min.js
 Allura/allura/public/nf/js/react.min.js
+Allura/allura/public/nf/js/react-dom.js
+Allura/allura/public/nf/js/react-drag.min.js
+Allura/allura/public/nf/js/react-reorderable.min.js
+Allura/allura/public/nf/js/react-with-addons.js
+Allura/allura/public/nf/js/react-with-addons.min.js
 Allura/allura/public/nf/js/sylvester.js
+Allura/allura/public/nf/js/underscore-min.js
 Allura/allura/tests/data/genshi_hello_tmpl
 Allura/allura/tests/data/test_mime/text_file.txt
 Allura/docs/make.bat


[27/50] [abbrv] allura git commit: [#7919] restore drag zone background change, lost in a previous float:left fix

Posted by br...@apache.org.
[#7919] restore drag zone background change, lost in a previous float:left fix


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/69ff144a
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/69ff144a
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/69ff144a

Branch: refs/heads/db/8034
Commit: 69ff144aee64fcd348d5ce3cc5c72c035f4f62d1
Parents: f56c0b1
Author: Dave Brondsema <da...@brondsema.net>
Authored: Mon Dec 7 12:47:59 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:37 2015 -0600

----------------------------------------------------------------------
 Allura/allura/public/nf/css/navbar.css | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/69ff144a/Allura/allura/public/nf/css/navbar.css
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/css/navbar.css b/Allura/allura/public/nf/css/navbar.css
index fc0d118..8c1c877 100644
--- a/Allura/allura/public/nf/css/navbar.css
+++ b/Allura/allura/public/nf/css/navbar.css
@@ -85,7 +85,7 @@
 .react-reorderable-item-active {
     border: 3px dashed #9e9e9e;
     background: #c9c9c9;
-    width: 5rem; /* dynamic would be nice */
+    width: 7rem; /* dynamic would be nice */
     height: 30px;
 }
 
@@ -97,8 +97,10 @@
     float: left;
 }
 
-.react-reorderable-handle {
+/* this is the div that moves around with the cursor, when dragging */
+#top_nav_admin .react-reorderable-handle {
     position: absolute;
+    background: transparent;
 }
 
 #top_nav_admin .tb-item a {
@@ -120,7 +122,7 @@
     user-select: none;
 }
 
-.react-drag.dragging > div:not(.tb-item):not(.tb-item-container) {
+.react-drag.dragging .react-reorderable-item {
     background: #ccc;
 }
 


[08/50] [abbrv] allura git commit: [#7919] Remove unneeded class from context menu

Posted by br...@apache.org.
[#7919]  Remove unneeded class from context menu


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/a3446702
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/a3446702
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/a3446702

Branch: refs/heads/db/8034
Commit: a3446702076595e3e1281fe834faa08ac90f9953
Parents: 280157d
Author: Heith Seewald <he...@gmail.com>
Authored: Thu Dec 3 16:24:15 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:54:31 2015 -0600

----------------------------------------------------------------------
 Allura/allura/public/nf/js/context-menu.es6.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/a3446702/Allura/allura/public/nf/js/context-menu.es6.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/context-menu.es6.js b/Allura/allura/public/nf/js/context-menu.es6.js
index 349b522..2cd79a6 100644
--- a/Allura/allura/public/nf/js/context-menu.es6.js
+++ b/Allura/allura/public/nf/js/context-menu.es6.js
@@ -31,7 +31,7 @@ class ContextMenu extends React.Component {
     };
 
     static defaultOptions = {
-        classes: ['context-link']
+        classes: []
     };
 
     componentWillMount() {


[11/50] [abbrv] allura git commit: [#7919] fixing LICENSE: restore to master

Posted by br...@apache.org.
[#7919] fixing LICENSE: restore to master


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/7ad54cdf
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/7ad54cdf
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/7ad54cdf

Branch: refs/heads/db/8034
Commit: 7ad54cdfd3df43e16c6ffd492806994790583872
Parents: a344670
Author: Dave Brondsema <da...@brondsema.net>
Authored: Thu Dec 3 16:26:02 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:31 2015 -0600

----------------------------------------------------------------------
 rat-excludes.txt | 69 +++++++++++++++++++++++++++------------------------
 1 file changed, 37 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/7ad54cdf/rat-excludes.txt
----------------------------------------------------------------------
diff --git a/rat-excludes.txt b/rat-excludes.txt
index b6c77f1..236cf00 100644
--- a/rat-excludes.txt
+++ b/rat-excludes.txt
@@ -1,63 +1,68 @@
-rat-excludes.txt
-**/setup.cfg
-**/*.json
-**/*.git/
 **/*.egg-info/
-requirements*
-**/MANIFEST.in
+**/*.git/
+**/*.json
 **/*.log
+**/*.pyc
 **/.coverage
+**/MANIFEST.in
 **/nosetests.xml
-.jscsrc
-.jshintrc
-Allura/docs/_build/
+**/setup.cfg
 Allura/allura/etc/mime.types
 Allura/allura/lib/AsciiDammit.py
-Allura/allura/public/nf/js/jquery-base.js
-Allura/allura/public/nf/css/smoothness/jquery-ui-1.8.4.custom.css
-Allura/allura/lib/widgets/resources/css/jquery.ui.datepicker.css
-Allura/allura/public/nf/js/jquery.daterangepicker.js
-Allura/allura/public/nf/css/forge/ui.daterangepicker.css
 Allura/allura/lib/widgets/resources/css/autocomplete.css
-Allura/allura/public/nf/css/forge/accordion.css
+Allura/allura/lib/widgets/resources/css/colorPicker.css
+Allura/allura/lib/widgets/resources/css/jqfontselector.css
+Allura/allura/lib/widgets/resources/css/jquery.tagsinput.css
+Allura/allura/lib/widgets/resources/css/jquery.ui.datepicker.css
+Allura/allura/lib/widgets/resources/css/simplemde.min.css
 Allura/allura/lib/widgets/resources/js/jqfontselector.js
 Allura/allura/lib/widgets/resources/js/jquery.autosize-min.js
 Allura/allura/lib/widgets/resources/js/jquery.colorPicker.js
 Allura/allura/lib/widgets/resources/js/jquery.tagsinput.js
+Allura/allura/lib/widgets/resources/js/simplemde.min.js
+Allura/allura/public/nf/css/blueprint/
+Allura/allura/public/nf/css/font-awesome.min.css
+Allura/allura/public/nf/css/forge/accordion.css
+Allura/allura/public/nf/css/forge/tooltipster.css
+Allura/allura/public/nf/css/forge/ui.daterangepicker.css
+Allura/allura/public/nf/css/smoothness/jquery-ui-1.8.4.custom.css
+Allura/allura/public/nf/fonts/
+Allura/allura/public/nf/js/dummy.es6.js
+Allura/allura/public/nf/js/jquery-base.js
+Allura/allura/public/nf/js/jquery.daterangepicker.js
 Allura/allura/public/nf/js/jquery.flot.js
 Allura/allura/public/nf/js/jquery.maxlength.min.js
 Allura/allura/public/nf/js/jquery.tablesorter.js
-Allura/allura/public/nf/css/forge/tooltipster.css
 Allura/allura/public/nf/js/jquery.tooltipster.js
 Allura/allura/public/nf/js/jquery.viewport.js
-Allura/allura/public/nf/css/blueprint/
-Allura/allura/public/nf/js/sylvester.js
 Allura/allura/public/nf/js/modernizr.js
-Allura/allura/public/nf/js/react-dom.js
-Allura/allura/public/nf/js/react-drag.min.js
-Allura/allura/public/nf/js/react-reorderable.min.js
-Allura/allura/public/nf/js/react-with-addons.js
-Allura/allura/public/nf/js/react-with-addons.min.js
-Allura/allura/public/nf/js/underscore-min.js
-Allura/allura/public/nf/css/font-awesome.min.css
-Allura/allura/public/nf/fonts/
-Allura/allura/lib/widgets/resources/js/simplemde.min.js
-Allura/allura/lib/widgets/resources/css/simplemde.min.css
+Allura/allura/public/nf/js/pb.transformie.min.js
+Allura/allura/public/nf/js/react.min.js
+Allura/allura/public/nf/js/sylvester.js
 Allura/allura/tests/data/genshi_hello_tmpl
 Allura/allura/tests/data/test_mime/text_file.txt
+Allura/docs/make.bat
+Allura/docs/Makefile
+Allura/docs/_build/
+Allura/run/dummy.txt
 AlluraTest/jslint/
 CHANGES
-Allura/run/dummy.txt
 ForgeGit/forgegit/data/post-receive_tmpl
-ForgeSVN/forgesvn/tests/data/
+ForgeImporters/docs/make.bat
+ForgeImporters/docs/Makefile
 ForgeImporters/forgeimporters/tests/data/google/empty-issue.html
-ForgeImporters/forgeimporters/tests/data/google/test-issue.html
 ForgeImporters/forgeimporters/tests/data/google/test-issue-first-page.html
 ForgeImporters/forgeimporters/tests/data/google/test-issue-prev-page.html
+ForgeImporters/forgeimporters/tests/data/google/test-issue.html
 ForgeImporters/forgeimporters/trac/tests/data/test-list.csv
 ForgeImporters/forgeimporters/trac/tests/data/test-list.html
-ForgeTracker/forgetracker/widgets/resources/js/jquery.multiselect.min.js
+ForgeSVN/forgesvn/tests/data/
 ForgeTracker/forgetracker/widgets/resources/css/jquery.multiselect.css
+ForgeTracker/forgetracker/widgets/resources/js/jquery.multiselect.min.js
+node_modules/**
+rat-excludes.txt
+requirements*
 solr_config/allura/core.properties
 # tmp can have tons of files from the broccoli build process
 tmp/**
+


[13/50] [abbrv] allura git commit: [#7919] enable support for transform-class-properties

Posted by br...@apache.org.
[#7919] enable support for transform-class-properties


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/611b816e
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/611b816e
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/611b816e

Branch: refs/heads/db/8034
Commit: 611b816ee08cb948bfaa3f9175c5f8402a95560d
Parents: c0925bb
Author: Dave Brondsema <da...@brondsema.net>
Authored: Fri Dec 4 18:28:55 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:35 2015 -0600

----------------------------------------------------------------------
 .babelrc     | 3 +++
 package.json | 2 ++
 2 files changed, 5 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/611b816e/.babelrc
----------------------------------------------------------------------
diff --git a/.babelrc b/.babelrc
new file mode 100644
index 0000000..2ef4aa1
--- /dev/null
+++ b/.babelrc
@@ -0,0 +1,3 @@
+{
+  "plugins": ["transform-class-properties"]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/allura/blob/611b816e/package.json
----------------------------------------------------------------------
diff --git a/package.json b/package.json
index 47d384e..15bb35b 100644
--- a/package.json
+++ b/package.json
@@ -14,6 +14,8 @@
   },
   "author": "Apache Allura team",
   "license": "Apache-2.0",
+
+  "//": "When broccoli-babel-transpiler moves to babel 6, we'll need to add babel-plugin-transform-class-properties to our deps",
   "devDependencies": {
     "broccoli": "^0.16.8",
     "broccoli-babel-transpiler": "^5.4.5",


[48/50] [abbrv] allura git commit: [7919] Redirect to new tool after it is created

Posted by br...@apache.org.
[7919] Redirect to new tool after it is created


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/8b082294
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/8b082294
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/8b082294

Branch: refs/heads/db/8034
Commit: 8b082294ef0677fd17c28c118eedb3055ff08deb
Parents: d1e2b7c
Author: Heith Seewald <he...@gmail.com>
Authored: Fri Dec 11 15:53:45 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 15:50:53 2015 -0600

----------------------------------------------------------------------
 Allura/allura/ext/admin/admin_main.py | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/8b082294/Allura/allura/ext/admin/admin_main.py
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/admin_main.py b/Allura/allura/ext/admin/admin_main.py
index 3f4a1db..236bf96 100644
--- a/Allura/allura/ext/admin/admin_main.py
+++ b/Allura/allura/ext/admin/admin_main.py
@@ -735,12 +735,11 @@ class ProjectAdminController(BaseController):
         try:
             new_app = self._update_mounts(subproject, tool, new, **kw)
             if new_app:
-                # force redir to last page of tools, where new app will be
-                page = ''
+                redirect(new_app.url)
         except forge_exc.ForgeError, exc:
             flash('%s: %s' % (exc.__class__.__name__, exc.args[0]),
                   'error')
-        redirect('tools?limit=%s&page=%s' % (limit, page))
+        redirect(request.referer)
 
     @expose('jinja:allura.ext.admin:templates/export.html')
     def export(self, tools=None):


[18/50] [abbrv] allura git commit: [#7919] Add missing proptypes to navbar components

Posted by br...@apache.org.
[#7919] Add missing proptypes to navbar components


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/4917b1a4
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/4917b1a4
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/4917b1a4

Branch: refs/heads/db/8034
Commit: 4917b1a465727ba36fc0846f69fe700aa10d78fc
Parents: ce6c631
Author: Heith Seewald <he...@gmail.com>
Authored: Mon Dec 7 12:12:48 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:36 2015 -0600

----------------------------------------------------------------------
 Allura/allura/public/nf/js/navbar.es6.js | 56 ++++++++++++++++++---------
 1 file changed, 38 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/4917b1a4/Allura/allura/public/nf/js/navbar.es6.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/navbar.es6.js b/Allura/allura/public/nf/js/navbar.es6.js
index cb5a5c1..d917022 100644
--- a/Allura/allura/public/nf/js/navbar.es6.js
+++ b/Allura/allura/public/nf/js/navbar.es6.js
@@ -112,16 +112,18 @@ var NavBarItem = React.createClass({
         return (
             <div className={ divClasses }>
                 <a>
-                    {!_.isEmpty(this.props.options) && <i className='config-tool fa fa-cog' onClick={this.handleOptionClick}></i>}
+                    {!_.isEmpty(this.props.options) && <i className='config-tool fa fa-cog'
+                                                          onClick={this.handleOptionClick}> </i>}
                     <span
                         className={spanClasses}
                         data-mount-point={this.props.mount_point}>
                         {this.props.name}
                     </span>
                 </a>
-                {this.props.currentOptionMenu.tool && this.props.currentOptionMenu.tool === this.props.mount_point &&
-                    <ContextMenu
-                        {...this.props}
+                {this.props.currentOptionMenu.tool
+                && this.props.currentOptionMenu.tool === this.props.mount_point
+                && <ContextMenu
+                    {...this.props}
                         classes={['tool-options']}
                         items={this.props.options}
                         onOptionClick={this.props.onOptionClick}
@@ -182,10 +184,13 @@ var GroupingThreshold = React.createClass({
  * @constructor
  */
 var NormalNavItem = React.createClass({
+    propTypes: {
+        name: React.PropTypes.string.isRequired,
+        url: React.PropTypes.string.isRequired,
+        classes: React.PropTypes.string
+    },
   mixins: [React.addons.PureRenderMixin],
-
     render: function() {
-
         return (
             <li key={`tb-norm-${_.uniqueId()}`}>
                 <a href={ this.props.url } className={ this.props.classes }>
@@ -203,6 +208,15 @@ var NormalNavItem = React.createClass({
  * @constructor
  */
 var ToggleAddNewTool = React.createClass({
+    propTypes: {
+        installableTools: React.PropTypes.arrayOf(
+            React.PropTypes.shape({
+                text: React.PropTypes.string.isRequired,
+                href: React.PropTypes.string,
+                tooltip: React.PropTypes.string
+            })
+        ).isRequired
+    },
     getInitialState: function() {
         return {
             visible: false
@@ -213,7 +227,6 @@ var ToggleAddNewTool = React.createClass({
             visible: !this.state.visible
         });
     },
-
     render: function () {
         return (
             <div>
@@ -238,6 +251,17 @@ var ToggleAddNewTool = React.createClass({
  * @constructor
  */
 var NormalNavBar = React.createClass({
+    propTypes: {
+        items: React.PropTypes.arrayOf(ToolsPropType).isRequired,
+        installableTools: React.PropTypes.arrayOf(
+            React.PropTypes.shape({
+                text: React.PropTypes.string.isRequired,
+                href: React.PropTypes.string,
+                tooltip: React.PropTypes.string
+            })
+        ).isRequired
+    },
+
     buildMenu: function(item, i) {
         let classes = window.location.pathname.startsWith(item.url) ? 'active-nav-link' : '';
 
@@ -254,19 +278,15 @@ var NormalNavBar = React.createClass({
         );
     },
 
-    //onOptionClick: function(e){
-    //    console.log(e);
-    //},
     render: function() {
         var listItems = this.props.items.map(this.buildMenu);
-
-        var mount_points = [];
-        for(let item of this.props.items){
+        var existingTools = [];
+        for(let item of this.props.installableTools){
             if(item.hasOwnProperty('mount_point') && item.mount_point !== null){
-                mount_points.push(item.mount_point);
+                existingTools.push(item.mount_point);
             } else if(item.hasOwnProperty('children')){
                 for(let child of item.children){
-                    mount_points.push(child.mount_point)
+                    existingTools.push(child.mount_point)
                 }
             }
         }
@@ -278,7 +298,7 @@ var NormalNavBar = React.createClass({
                 <li id="add-tool-container">
                     <ToggleAddNewTool
                         {...this.props}
-                        items={this.props.installableTools}
+                        mountPointValidation={existingTools}
                         onOptionClick={this.onOptionClick} />
                 </li>
             </ul>
@@ -407,7 +427,7 @@ var ToggleAdminButton = React.createClass({
         var classes = this.props.visible ? 'fa fa-unlock' : 'fa fa-lock';
         return (
             <button id='toggle-admin-btn' onClick={ this.props.handleButtonPush } className='admin-toolbar-right'>
-                <i className={ classes }></i>
+                <i className={ classes }> </i>
             </button>
         );
     }
@@ -463,7 +483,7 @@ var Main = React.createClass({
     handleShowOptionMenu: function (mount_point) {
         this.setState({
             currentOptionMenu: {
-                tool: mount_point,
+                tool: mount_point
             }
         });
     },


[26/50] [abbrv] allura git commit: [#7919] left-align submenus in edit mode

Posted by br...@apache.org.
[#7919] left-align submenus in edit mode


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/d92db9a5
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/d92db9a5
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/d92db9a5

Branch: refs/heads/db/8034
Commit: d92db9a5a383dd355cc1dc0866380fe3833cfbdb
Parents: 39ab237
Author: Dave Brondsema <da...@brondsema.net>
Authored: Mon Dec 7 11:35:03 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:37 2015 -0600

----------------------------------------------------------------------
 Allura/allura/public/nf/css/navbar.css | 3 +++
 1 file changed, 3 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/d92db9a5/Allura/allura/public/nf/css/navbar.css
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/css/navbar.css b/Allura/allura/public/nf/css/navbar.css
index 795bf54..83ee588 100644
--- a/Allura/allura/public/nf/css/navbar.css
+++ b/Allura/allura/public/nf/css/navbar.css
@@ -230,6 +230,9 @@
     border-bottom: none;
     overflow: hidden;
 }
+#top_nav .tb-item-grouper a {
+    text-align: left;
+}
 
 .tb-sub-menu .react-drag:hover {
     background: #09c linear-gradient(#09c, #07a);


[09/50] [abbrv] allura git commit: [#7919] Fix overflow display issue for context menu

Posted by br...@apache.org.
[#7919]  Fix overflow display issue for context menu


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/280157d7
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/280157d7
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/280157d7

Branch: refs/heads/db/8034
Commit: 280157d75912cf793a4e4bc0c9d5de3ed1b29a44
Parents: 82a1b2a
Author: Heith Seewald <he...@gmail.com>
Authored: Thu Dec 3 15:22:51 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:54:31 2015 -0600

----------------------------------------------------------------------
 Allura/allura/public/nf/css/navbar.css         |  1 -
 Allura/allura/public/nf/js/context-menu.es6.js |  7 ++++---
 Allura/allura/public/nf/js/navbar.es6.js       | 11 +++++++----
 3 files changed, 11 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/280157d7/Allura/allura/public/nf/css/navbar.css
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/css/navbar.css b/Allura/allura/public/nf/css/navbar.css
index c46b513..f2f7b54 100644
--- a/Allura/allura/public/nf/css/navbar.css
+++ b/Allura/allura/public/nf/css/navbar.css
@@ -272,7 +272,6 @@
     background: #f0f0f0;
     border: 1px solid #999;
     box-shadow: -2px 2px 6px #555;
-    overflow: auto;
     position: absolute;
     margin-top: 20px;
     margin-left: 5px;

http://git-wip-us.apache.org/repos/asf/allura/blob/280157d7/Allura/allura/public/nf/js/context-menu.es6.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/context-menu.es6.js b/Allura/allura/public/nf/js/context-menu.es6.js
index d0db2e5..349b522 100644
--- a/Allura/allura/public/nf/js/context-menu.es6.js
+++ b/Allura/allura/public/nf/js/context-menu.es6.js
@@ -25,13 +25,13 @@ class ContextMenu extends React.Component {
     }
 
     static propTypes = {
-        classes: React.PropTypes.array,
+        classes: React.PropTypes.array.isRequired,
         items: React.PropTypes.arrayOf(React.PropTypes.object).isRequired,
         onOptionClick: React.PropTypes.func.isRequired
     };
 
     static defaultOptions = {
-        classes: []
+        classes: ['context-link']
     };
 
     componentWillMount() {
@@ -61,6 +61,7 @@ class ContextMenu extends React.Component {
     }
 
     render() {
+        let _this = this;
         return (
             <div className="contextMenu">
                 <ul>{
@@ -68,7 +69,7 @@ class ContextMenu extends React.Component {
                         return (<li key={i}>
                             <ToolTipLink
                                 href={o.href}
-                                classes={['context-link', o.className]}
+                                classes={_this.props.classes.concat([o.className])}
                                 toolTip={o.tooltip}
                                 text={o.text}/>
                         </li>)

http://git-wip-us.apache.org/repos/asf/allura/blob/280157d7/Allura/allura/public/nf/js/navbar.es6.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/navbar.es6.js b/Allura/allura/public/nf/js/navbar.es6.js
index 324ba60..96ec8eb 100644
--- a/Allura/allura/public/nf/js/navbar.es6.js
+++ b/Allura/allura/public/nf/js/navbar.es6.js
@@ -122,6 +122,7 @@ var NavBarItem = React.createClass({
                 {this.props.currentOptionMenu.tool && this.props.currentOptionMenu.tool === this.props.mount_point &&
                     <ContextMenu
                         {...this.props}
+                        classes={['tool-options']}
                         items={this.props.options}
                         onOptionClick={this.props.onOptionClick}
                     />}
@@ -212,10 +213,11 @@ var ToggleAddNewTool = React.createClass({
             visible: !this.state.visible
         });
     },
-
-    onOptionClick: function(e) {
-        console.log("e", e);
+        handleOptionClick: function(event) {
+            console.log('event', event);
+        //this.props.onOptionClick(this.props.mount_point);
     },
+
     render: function () {
         return (
             <div>
@@ -225,7 +227,8 @@ var ToggleAddNewTool = React.createClass({
                 {this.state.visible &&
                 <ContextMenu
                     {...this.props}
-                    onOptionClick={this.onOptionClick}
+                    classes={['alt-context']}
+                    onOptionClick={this.handleOptionClick}
                     items={this.props.installableTools} />
                 }
             </div>


[46/50] [abbrv] allura git commit: Add Tool button should only be after top-level tools, not in submenus

Posted by br...@apache.org.
Add Tool button should only be after top-level tools, not in submenus


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/8f4813d2
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/8f4813d2
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/8f4813d2

Branch: refs/heads/db/8034
Commit: 8f4813d2c3078e92c62bd14254e94e3842eff129
Parents: d20e75d
Author: Dave Brondsema <da...@brondsema.net>
Authored: Fri Dec 11 16:08:09 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 15:50:53 2015 -0600

----------------------------------------------------------------------
 Allura/allura/public/nf/js/navbar.es6.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/8f4813d2/Allura/allura/public/nf/js/navbar.es6.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/navbar.es6.js b/Allura/allura/public/nf/js/navbar.es6.js
index 63d303e..32b1fb5 100644
--- a/Allura/allura/public/nf/js/navbar.es6.js
+++ b/Allura/allura/public/nf/js/navbar.es6.js
@@ -339,9 +339,9 @@ var AdminNav = React.createClass({
                     { tools }
                 </ReactReorderable>
                 { end_tools }
-                <div id="add-tool-container">
+                { !isSubMenu && <div id="add-tool-container">
                     <ToggleAddNewTool installableTools={this.props.installableTools}/>
-                </div>
+                </div>}
             </div>
         );
     },


[20/50] [abbrv] allura git commit: [#7919] Pass mount_point validation data into the initial toolbar

Posted by br...@apache.org.
[#7919] Pass mount_point validation data into the initial toolbar


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/4389d950
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/4389d950
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/4389d950

Branch: refs/heads/db/8034
Commit: 4389d9505dddf9cde3ec6fb43716ec4003710842
Parents: 4917b1a
Author: Heith Seewald <he...@gmail.com>
Authored: Mon Dec 7 12:43:58 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:36 2015 -0600

----------------------------------------------------------------------
 Allura/allura/public/nf/js/navbar.es6.js        | 32 ++++++++++++++------
 .../allura/templates/jinja_master/top_nav.html  |  5 ++-
 2 files changed, 26 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/4389d950/Allura/allura/public/nf/js/navbar.es6.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/navbar.es6.js b/Allura/allura/public/nf/js/navbar.es6.js
index d917022..819bc2f 100644
--- a/Allura/allura/public/nf/js/navbar.es6.js
+++ b/Allura/allura/public/nf/js/navbar.es6.js
@@ -70,6 +70,27 @@ function getUrlByNode(node) {
     return node.props.children[0].props.url;
 }
 
+/**
+ * Returns all existing mount points for a given project.
+
+ * @constructor
+ * @param {array} items
+ * @returns {array}
+ */
+function getMountPoints(items) {
+    var existingTools = [];
+    for (let item of items) {
+        if (item.hasOwnProperty('mount_point') && item.mount_point !== null) {
+            existingTools.push(item.mount_point);
+        } else if (item.hasOwnProperty('children')) {
+            for (let child of item.children) {
+                existingTools.push(child.mount_point)
+            }
+        }
+    }
+    return existingTools;
+}
+
 const ToolsPropType = React.PropTypes.shape({
     mount_point: React.PropTypes.string,
     name: React.PropTypes.string.isRequired,
@@ -280,16 +301,7 @@ var NormalNavBar = React.createClass({
 
     render: function() {
         var listItems = this.props.items.map(this.buildMenu);
-        var existingTools = [];
-        for(let item of this.props.installableTools){
-            if(item.hasOwnProperty('mount_point') && item.mount_point !== null){
-                existingTools.push(item.mount_point);
-            } else if(item.hasOwnProperty('children')){
-                for(let child of item.children){
-                    existingTools.push(child.mount_point)
-                }
-            }
-        }
+        var existingTools = getMountPoints(this.props.items);
         return (
             <ul
                 id="normal-nav-bar"

http://git-wip-us.apache.org/repos/asf/allura/blob/4389d950/Allura/allura/templates/jinja_master/top_nav.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/jinja_master/top_nav.html b/Allura/allura/templates/jinja_master/top_nav.html
index ce449ef..3d14c25 100644
--- a/Allura/allura/templates/jinja_master/top_nav.html
+++ b/Allura/allura/templates/jinja_master/top_nav.html
@@ -51,6 +51,7 @@
     'use strict';
     var _data = {{ h.escape_json(c.project.nav_data(admin_options=True))|safe  }};
         $(document).ready(function () {
+            var _existingTools = getMountPoints(_data['menu']);
             $('#toggle-admin-btn').click(function () {
                 ReactDOM.render(React.createElement(Main, {
                     initialData: _data
@@ -58,7 +59,9 @@
             });
 
             ReactDOM.render(React.createElement(ToggleAddNewTool, {
-                        installableTools: _data['installable_tools']
+                        installableTools: _data['installable_tools'],
+                        mountPointValidation:_existingTools
+
                     }), document.getElementById('add-tool-container'));
         });
     </script>


[32/50] [abbrv] allura git commit: [#7919] anchored tools: remove not-allowed cursor, add tooltip

Posted by br...@apache.org.
[#7919] anchored tools: remove not-allowed cursor, add tooltip


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/f9b08a8d
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/f9b08a8d
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/f9b08a8d

Branch: refs/heads/db/8034
Commit: f9b08a8dce0dfa78e666a0091ac759ab75039990
Parents: 68b44f0
Author: Dave Brondsema <da...@brondsema.net>
Authored: Wed Dec 9 16:12:47 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:38 2015 -0600

----------------------------------------------------------------------
 Allura/allura/public/nf/css/navbar.css   |  7 +------
 Allura/allura/public/nf/js/navbar.es6.js | 17 ++++++++++-------
 2 files changed, 11 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/f9b08a8d/Allura/allura/public/nf/css/navbar.css
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/css/navbar.css b/Allura/allura/public/nf/css/navbar.css
index a29bcaf..71e625b 100644
--- a/Allura/allura/public/nf/css/navbar.css
+++ b/Allura/allura/public/nf/css/navbar.css
@@ -71,14 +71,9 @@
     cursor: move;
 }
 
-#top_nav .anchored {
-    cursor: not-allowed;
-    color: gray;
-}
-
 .anchored .draggable-handle,
 .anchored .draggable-handle-sub {
-    cursor: not-allowed;
+    cursor: default;
     color: gray;
 }
 

http://git-wip-us.apache.org/repos/asf/allura/blob/f9b08a8d/Allura/allura/public/nf/js/navbar.es6.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/navbar.es6.js b/Allura/allura/public/nf/js/navbar.es6.js
index 0f35a0c..e7262d1 100644
--- a/Allura/allura/public/nf/js/navbar.es6.js
+++ b/Allura/allura/public/nf/js/navbar.es6.js
@@ -113,11 +113,8 @@ var NavBarItem = React.createClass({
         url: React.PropTypes.string.isRequired,
         currentOptionMenu: React.PropTypes.object,
         onOptionClick: React.PropTypes.func.isRequired,
-        options: React.PropTypes.array
-    },
-
-    isAnchored: function() {
-        return this.props.is_anchored !== null;
+        options: React.PropTypes.array,
+        is_anchored: React.PropTypes.bool
     },
 
     render: function() {
@@ -127,17 +124,23 @@ var NavBarItem = React.createClass({
         }
         var spanClasses = this.props.handleType + " ordinal-item";
         if (this.props.isGrouper) {
-            spanClasses += " toolbar-grouper"
+            spanClasses += " toolbar-grouper";
         }
 
         return (
             <div className={ divClasses }>
+                <ToolTip targetSelector=".anchored .draggable-handle" position="top"
+                         theme="tooltipster-default" delay={250}/>
+                <ToolTip targetSelector=".anchored .draggable-handle-sub" position="right"
+                         theme="tooltipster-default" delay={250}/>
                 <a>
                     {!_.isEmpty(this.props.options) && <i className='config-tool fa fa-cog'
                                                           onClick={this.handleOptionClick}> </i>}
                     <span
                         className={spanClasses}
-                        data-mount-point={this.props.mount_point}>
+                        data-mount-point={this.props.mount_point}
+                        title={this.props.is_anchored ? 'This item cannot be moved.' : ''}
+                        >
                         {this.props.name}
                     </span>
                 </a>


[22/50] [abbrv] allura git commit: [#7919] safer babel 5 option

Posted by br...@apache.org.
[#7919] safer babel 5 option


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/b09f4bf2
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/b09f4bf2
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/b09f4bf2

Branch: refs/heads/db/8034
Commit: b09f4bf2ed11bf651cd7f3328a5e0ce41e842bf7
Parents: 611b816
Author: Dave Brondsema <da...@brondsema.net>
Authored: Mon Dec 7 10:18:25 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:36 2015 -0600

----------------------------------------------------------------------
 .babelrc | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/b09f4bf2/.babelrc
----------------------------------------------------------------------
diff --git a/.babelrc b/.babelrc
index 2ef4aa1..a7abcc1 100644
--- a/.babelrc
+++ b/.babelrc
@@ -1,3 +1,9 @@
 {
-  "plugins": ["transform-class-properties"]
+  /*
+  With updated broccoli / babel (see package.json), we can be more precise with:
+    "plugins": ["transform-class-properties"],
+  Instead of "stage": 1.  Even now with babel 5.x, sometimes the plugins option works, but sometimes it doesn't :/
+   */
+
+   "stage": 1
 }
\ No newline at end of file


[45/50] [abbrv] allura git commit: [#7919] upgrade react to 0.14.3, fixes an IE click issue

Posted by br...@apache.org.
[#7919] upgrade react to 0.14.3, fixes an IE click issue


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/9ed7d5f9
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/9ed7d5f9
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/9ed7d5f9

Branch: refs/heads/db/8034
Commit: 9ed7d5f91a2c37419f54e9910c5577a9d67e91b8
Parents: 8f4813d
Author: Dave Brondsema <da...@brondsema.net>
Authored: Mon Dec 14 13:33:32 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 15:50:53 2015 -0600

----------------------------------------------------------------------
 Allura/allura/public/nf/js/react-dom.js         |  2 +-
 Allura/allura/public/nf/js/react-with-addons.js | 35 +++++++++++++++-----
 .../public/nf/js/react-with-addons.min.js       | 12 +++----
 3 files changed, 34 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/9ed7d5f9/Allura/allura/public/nf/js/react-dom.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/react-dom.js b/Allura/allura/public/nf/js/react-dom.js
index cb1977f..02299f1 100644
--- a/Allura/allura/public/nf/js/react-dom.js
+++ b/Allura/allura/public/nf/js/react-dom.js
@@ -1,5 +1,5 @@
 /**
- * ReactDOM v0.14.1
+ * ReactDOM v0.14.3
  *
  * Copyright 2013-2015, Facebook, Inc.
  * All rights reserved.

http://git-wip-us.apache.org/repos/asf/allura/blob/9ed7d5f9/Allura/allura/public/nf/js/react-with-addons.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/react-with-addons.js b/Allura/allura/public/nf/js/react-with-addons.js
index 75fb558..2f705eb 100644
--- a/Allura/allura/public/nf/js/react-with-addons.js
+++ b/Allura/allura/public/nf/js/react-with-addons.js
@@ -1,5 +1,5 @@
  /**
-  * React (with addons) v0.14.1
+  * React (with addons) v0.14.3
   */
 (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.React = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
 /**
@@ -3277,6 +3277,7 @@ var HTMLDOMPropertyConfig = {
     icon: null,
     id: MUST_USE_PROPERTY,
     inputMode: MUST_USE_ATTRIBUTE,
+    integrity: null,
     is: MUST_USE_ATTRIBUTE,
     keyParams: MUST_USE_ATTRIBUTE,
     keyType: MUST_USE_ATTRIBUTE,
@@ -3299,6 +3300,7 @@ var HTMLDOMPropertyConfig = {
     multiple: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
     muted: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
     name: null,
+    nonce: MUST_USE_ATTRIBUTE,
     noValidate: HAS_BOOLEAN_VALUE,
     open: HAS_BOOLEAN_VALUE,
     optimum: null,
@@ -3310,6 +3312,7 @@ var HTMLDOMPropertyConfig = {
     readOnly: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
     rel: null,
     required: HAS_BOOLEAN_VALUE,
+    reversed: HAS_BOOLEAN_VALUE,
     role: MUST_USE_ATTRIBUTE,
     rows: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE,
     rowSpan: null,
@@ -3788,6 +3791,7 @@ assign(React, {
 });
 
 React.__SECRET_DOM_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactDOM;
+React.__SECRET_DOM_SERVER_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = ReactDOMServer;
 
 module.exports = React;
 },{"120":120,"24":24,"40":40,"50":50,"69":69}],27:[function(_dereq_,module,exports){
@@ -4335,6 +4339,7 @@ var ReactCSSTransitionGroupChild = React.createClass({
     if (userSpecifiedDelay) {
       // Clean-up the animation after the specified delay
       timeout = setTimeout(endListener, userSpecifiedDelay);
+      this.transitionTimeouts.push(timeout);
     } else {
       // DEPRECATED: this listener will be removed in a future version of react
       ReactTransitionEvents.addEndEventListener(node, endListener);
@@ -4359,12 +4364,16 @@ var ReactCSSTransitionGroupChild = React.createClass({
 
   componentWillMount: function () {
     this.classNameQueue = [];
+    this.transitionTimeouts = [];
   },
 
   componentWillUnmount: function () {
     if (this.timeout) {
       clearTimeout(this.timeout);
     }
+    this.transitionTimeouts.forEach(function (timeout) {
+      clearTimeout(timeout);
+    });
   },
 
   componentWillAppear: function (done) {
@@ -6662,6 +6671,7 @@ var registrationNameModules = ReactBrowserEventEmitter.registrationNameModules;
 // For quickly matching children type, to test if can be treated as content.
 var CONTENT_TYPES = { 'string': true, 'number': true };
 
+var CHILDREN = keyOf({ children: null });
 var STYLE = keyOf({ style: null });
 var HTML = keyOf({ __html: null });
 
@@ -7152,7 +7162,9 @@ ReactDOMComponent.Mixin = {
         }
         var markup = null;
         if (this._tag != null && isCustomComponent(this._tag, props)) {
-          markup = DOMPropertyOperations.createMarkupForCustomAttribute(propKey, propValue);
+          if (propKey !== CHILDREN) {
+            markup = DOMPropertyOperations.createMarkupForCustomAttribute(propKey, propValue);
+          }
         } else {
           markup = DOMPropertyOperations.createMarkupForProperty(propKey, propValue);
         }
@@ -7412,6 +7424,9 @@ ReactDOMComponent.Mixin = {
         if (!node) {
           node = ReactMount.getNode(this._rootNodeID);
         }
+        if (propKey === CHILDREN) {
+          nextProp = null;
+        }
         DOMPropertyOperations.setValueForAttribute(node, propKey, nextProp);
       } else if (DOMProperty.properties[propKey] || DOMProperty.isCustomAttribute(propKey)) {
         if (!node) {
@@ -10072,11 +10087,12 @@ if ("development" !== 'production') {
     var fakeNode = document.createElement('react');
     ReactErrorUtils.invokeGuardedCallback = function (name, func, a, b) {
       var boundFunc = func.bind(null, a, b);
-      fakeNode.addEventListener(name, boundFunc, false);
+      var evtType = 'react-' + name;
+      fakeNode.addEventListener(evtType, boundFunc, false);
       var evt = document.createEvent('Event');
-      evt.initEvent(name, false, false);
+      evt.initEvent(evtType, false, false);
       fakeNode.dispatchEvent(evt);
-      fakeNode.removeEventListener(name, boundFunc, false);
+      fakeNode.removeEventListener(evtType, boundFunc, false);
     };
   }
 }
@@ -14392,8 +14408,11 @@ NoopInternalComponent.prototype = {
     this._currentElement = element;
   },
 
-  unmountComponent: function () {}
+  unmountComponent: function () {},
 
+  getPublicInstance: function () {
+    return null;
+  }
 };
 
 var ShallowComponentWrapper = function () {};
@@ -15454,7 +15473,7 @@ module.exports = ReactUpdates;
 
 'use strict';
 
-module.exports = '0.14.1';
+module.exports = '0.14.3';
 },{}],98:[function(_dereq_,module,exports){
 /**
  * Copyright 2013-2015, Facebook, Inc.
@@ -17478,7 +17497,7 @@ module.exports = adler32;
 var canDefineProperty = false;
 if ("development" !== 'production') {
   try {
-    Object.defineProperty({}, 'x', {});
+    Object.defineProperty({}, 'x', { get: function () {} });
     canDefineProperty = true;
   } catch (x) {
     // IE will fail on defineProperty


[31/50] [abbrv] allura git commit: [#7919] add tooltipster to navbar.js output file; Explicitly list es6.js files needed, don't share the main broccoli output tree so future es6 files aren't needlessly included

Posted by br...@apache.org.
[#7919] add tooltipster to navbar.js output file; Explicitly list es6.js files needed, don't share the main broccoli output tree so future es6 files aren't needlessly included


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/5c218d8d
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/5c218d8d
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/5c218d8d

Branch: refs/heads/db/8034
Commit: 5c218d8d038a5bbe06226142c82e25e7dedcbdd2
Parents: 320e528
Author: Dave Brondsema <da...@brondsema.net>
Authored: Mon Dec 7 16:47:55 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:38 2015 -0600

----------------------------------------------------------------------
 Brocfile.js | 29 ++++++++++++++++++-----------
 1 file changed, 18 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/5c218d8d/Brocfile.js
----------------------------------------------------------------------
diff --git a/Brocfile.js b/Brocfile.js
index 38f82e8..72969b6 100644
--- a/Brocfile.js
+++ b/Brocfile.js
@@ -29,15 +29,18 @@ var tree = funnel('Allura/allura/public/nf/js', {
     include: ['*.es6.js'],
 });
 tree = babelTranspiler(tree, {
-    browserPolyfill: true,
     //filterExtensions:['es6.js'],
-    sourceMaps: 'inline',  // external doesn't work, have to use extract below
+    sourceMaps: 'inline',  // external doesn't work, but sourceMapConcat will extract them
     comments: false,
 });
+tree = sourceMapConcat(tree, {
+    inputFiles: ['**/*'],
+    outputFile: '/transpiled.js'
+});
 
 /* exactly what's needed for the navbar, so separate apps may use it too */
 var react_file = 'public/nf/js/react-with-addons' + (production ? '.min' : '') + '.js';
-var navbar_deps = funnel('Allura/allura', {
+var navbar = funnel('Allura/allura', {
     include: ['public/nf/js/underscore-min.js',
               react_file,
               'public/nf/js/react-dom.js',
@@ -45,22 +48,26 @@ var navbar_deps = funnel('Allura/allura', {
               'public/nf/js/react-reorderable.min.js',
               'lib/widgets/resources/js/jquery.lightbox_me.js',
               'public/nf/js/admin_modal.js',
+              'public/nf/js/jquery.tooltipster.js',
+              'public/nf/js/navbar.es6.js',
+              'public/nf/js/context-menu.es6.js',
+              'public/nf/js/tooltip.es6.js'
     ],
 });
-navbar = mergeTrees([navbar_deps, tree]);
-navbar = sourceMapConcat(navbar, {
+navbar = babelTranspiler(navbar, {
+    filterExtensions:['es6.js'],
+    sourceMaps: 'inline',  // external doesn't work, but sourceMapConcat will extract them
+    comments: false,
+});
+var navbar = sourceMapConcat(navbar, {
     // headerFiles & footerFiles used to specify some that must come before or after others
     headerFiles: [react_file],
     inputFiles: ['**/*.js'],
-    footerFiles: ['navbar.es6.js',],
+    footerFiles: ['public/nf/js/navbar.js',], // this used to be navbar.es6.js but the babel transpiler dropped the .es6
     outputFile: '/navbar.js',
 });
 
-tree = sourceMapConcat(tree, {
-    inputFiles: ['**/*'],
-    outputFile: '/transpiled.js'
-});
-
+// output both
 var output = mergeTrees([tree, navbar]);
 
 if (production) {


[21/50] [abbrv] allura git commit: [#7919] remove double-slash, which doesn't resolve with gunicorn

Posted by br...@apache.org.
[#7919] remove double-slash, which doesn't resolve with gunicorn


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/39ab2370
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/39ab2370
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/39ab2370

Branch: refs/heads/db/8034
Commit: 39ab237021323bb1e50a7b82696e1f296eddcb0a
Parents: 4389d95
Author: Dave Brondsema <da...@brondsema.net>
Authored: Mon Dec 7 11:22:17 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:36 2015 -0600

----------------------------------------------------------------------
 Allura/allura/ext/admin/templates/project_install_tool.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/39ab2370/Allura/allura/ext/admin/templates/project_install_tool.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/project_install_tool.html b/Allura/allura/ext/admin/templates/project_install_tool.html
index b4d560b..8d378d0 100644
--- a/Allura/allura/ext/admin/templates/project_install_tool.html
+++ b/Allura/allura/ext/admin/templates/project_install_tool.html
@@ -5,7 +5,7 @@
 
 <h1> Installing {{ tool.tool_label }} </h1>
 
-<form method="post" action="{{ full_url }}/admin/update_mounts" id="install_form">
+<form method="post" action="{{ full_url }}admin/update_mounts" id="install_form">
     <input type="hidden" name="new.ordinal" value="{{ total_mounts }}"/>
     <input type="hidden" name="new.ep_name" class="new_ep_name" value="{{ tool_name }}">
     <label class="grid-13" for="new.mount_label">Label</label>


[30/50] [abbrv] allura git commit: [#7919] add tooltip for grouping threshold; refactor tooltip some

Posted by br...@apache.org.
[#7919] add tooltip for grouping threshold; refactor tooltip some


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/68b44f0a
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/68b44f0a
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/68b44f0a

Branch: refs/heads/db/8034
Commit: 68b44f0a4c0b707824c166607c30814029825343
Parents: c23844f
Author: Dave Brondsema <da...@brondsema.net>
Authored: Tue Dec 8 14:49:36 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:38 2015 -0600

----------------------------------------------------------------------
 Allura/allura/public/nf/js/context-menu.es6.js |  9 ++++----
 Allura/allura/public/nf/js/navbar.es6.js       |  7 +++---
 Allura/allura/public/nf/js/tooltip.es6.js      | 25 +++++----------------
 3 files changed, 13 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/68b44f0a/Allura/allura/public/nf/js/context-menu.es6.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/context-menu.es6.js b/Allura/allura/public/nf/js/context-menu.es6.js
index 2cd79a6..3ce3c96 100644
--- a/Allura/allura/public/nf/js/context-menu.es6.js
+++ b/Allura/allura/public/nf/js/context-menu.es6.js
@@ -64,14 +64,13 @@ class ContextMenu extends React.Component {
         let _this = this;
         return (
             <div className="contextMenu">
+                <ToolTip targetSelector='#top_nav_admin .contextMenu a'/>
                 <ul>{
                     this.props.items.map(function (o, i) {
                         return (<li key={i}>
-                            <ToolTipLink
-                                href={o.href}
-                                classes={_this.props.classes.concat([o.className])}
-                                toolTip={o.tooltip}
-                                text={o.text}/>
+                            <a href={o.href}
+                               classes={_this.props.classes.concat([o.className])}
+                               title={o.tooltip}>{o.text}</a>
                         </li>)
                     })}
                 </ul>

http://git-wip-us.apache.org/repos/asf/allura/blob/68b44f0a/Allura/allura/public/nf/js/navbar.es6.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/navbar.es6.js b/Allura/allura/public/nf/js/navbar.es6.js
index 9f805fe..0f35a0c 100644
--- a/Allura/allura/public/nf/js/navbar.es6.js
+++ b/Allura/allura/public/nf/js/navbar.es6.js
@@ -187,11 +187,12 @@ var GroupingThreshold = React.createClass({
                 <div id='threshold-config'>
             <span>
               <label htmlFor='threshold-input'>Grouping Threshold</label>
-                <input type='number' name='threshold-input' className='tooltip'
-                       title='Number of tools allowed before grouping.'
+                <ToolTip targetSelector="#threshold-input" position="top" contentAsHTML={true}/>
+                <input type='number' name='threshold-input' id="threshold-input"
+                       title='When you have multiple tools of the same type, <u>this number</u> determines if they will fit in the navigation bar or be grouped into a dropdown.'
                        value={ this.state.value }
                        onChange={ this.handleChange }
-                       min='1' max='10'/>
+                       min='1' max='50'/>
               </span>
                 </div> }
             </div>

http://git-wip-us.apache.org/repos/asf/allura/blob/68b44f0a/Allura/allura/public/nf/js/tooltip.es6.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/tooltip.es6.js b/Allura/allura/public/nf/js/tooltip.es6.js
index 92ebb3c..fea6471 100644
--- a/Allura/allura/public/nf/js/tooltip.es6.js
+++ b/Allura/allura/public/nf/js/tooltip.es6.js
@@ -29,6 +29,7 @@ class ToolTip extends React.Component {
     }
 
     static propTypes = {
+        targetSelector: React.PropTypes.string.isRequired,
         animation: React.PropTypes.string,
         speed: React.PropTypes.number,
         position: React.PropTypes.string,
@@ -38,10 +39,6 @@ class ToolTip extends React.Component {
         maxWidth: React.PropTypes.number,
         trigger: React.PropTypes.string,
         multiple: React.PropTypes.bool,
-        classes: React.PropTypes.array,
-        text: React.PropTypes.string.isRequired,
-        href: React.PropTypes.string.isRequired,
-        toolTip: React.PropTypes.string
     };
 
     static defaultProps = {
@@ -60,7 +57,7 @@ class ToolTip extends React.Component {
 
     componentDidMount() {
         var _this = this;
-        $(".react-tooltip").tooltipster({
+        $(this.props.targetSelector).tooltipster({
             animation: _this.props.animation,
             speed: _this.props.speed,
             delay: _this.props.delay,
@@ -74,20 +71,8 @@ class ToolTip extends React.Component {
         })
     }
 
-}
-
-/**
- * Tooltip Link
-
- * @constructor
- */
-class ToolTipLink extends ToolTip {
-    constructor(props) {
-        super(props);
-    }
-
     render() {
-        var classes = this.props.classes.join(' ') + " react-tooltip";
-        return <a href={this.props.href} className={classes} title={this.props.toolTip}>{this.props.text}</a>
+        return null;
     }
-}
\ No newline at end of file
+}
+


[10/50] [abbrv] allura git commit: [#7919] Merge commit

Posted by br...@apache.org.
[#7919] Merge commit


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/82a1b2a3
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/82a1b2a3
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/82a1b2a3

Branch: refs/heads/db/8034
Commit: 82a1b2a3a6c54dfbcfc62be97b0809913d295733
Parents: f7d7753
Author: Heith Seewald <he...@gmail.com>
Authored: Thu Dec 3 14:16:08 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:54:31 2015 -0600

----------------------------------------------------------------------
 Allura/allura/public/nf/js/context-menu.es6.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/82a1b2a3/Allura/allura/public/nf/js/context-menu.es6.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/context-menu.es6.js b/Allura/allura/public/nf/js/context-menu.es6.js
index 66f2fc6..d0db2e5 100644
--- a/Allura/allura/public/nf/js/context-menu.es6.js
+++ b/Allura/allura/public/nf/js/context-menu.es6.js
@@ -68,7 +68,7 @@ class ContextMenu extends React.Component {
                         return (<li key={i}>
                             <ToolTipLink
                                 href={o.href}
-                                classes={['context-link']}
+                                classes={['context-link', o.className]}
                                 toolTip={o.tooltip}
                                 text={o.text}/>
                         </li>)


[15/50] [abbrv] allura git commit: [#7919] remove a float:left that's actually causing problems

Posted by br...@apache.org.
[#7919] remove a float:left that's actually causing problems


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/62c5f503
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/62c5f503
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/62c5f503

Branch: refs/heads/db/8034
Commit: 62c5f50325eae616291cf0a527b945a0fbaf2d95
Parents: ceb42fa
Author: Dave Brondsema <da...@brondsema.net>
Authored: Thu Dec 3 13:34:19 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:35 2015 -0600

----------------------------------------------------------------------
 Allura/allura/public/nf/css/navbar.css | 5 -----
 1 file changed, 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/62c5f503/Allura/allura/public/nf/css/navbar.css
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/css/navbar.css b/Allura/allura/public/nf/css/navbar.css
index f2f7b54..381ea55 100644
--- a/Allura/allura/public/nf/css/navbar.css
+++ b/Allura/allura/public/nf/css/navbar.css
@@ -120,11 +120,6 @@
     user-select: none;
 }
 
-/* selecting the top level ReactReorderable component */
-.nav_admin > div > .react-drag > div:not(.tb-item):not(.tb-item-container) {
-    float: left;
-}
-
 .react-drag.dragging > div:not(.tb-item):not(.tb-item-container) {
     background: #ccc;
 }


[17/50] [abbrv] allura git commit: [#7919] show Delete in nav bar option menus; use regular admin_modal for it

Posted by br...@apache.org.
[#7919] show Delete in nav bar option menus; use regular admin_modal for it


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/2725acad
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/2725acad
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/2725acad

Branch: refs/heads/db/8034
Commit: 2725acad546d7132ca8b9ad4bae2d0f23892eae6
Parents: d365040
Author: Dave Brondsema <da...@brondsema.net>
Authored: Wed Dec 2 17:37:26 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:35 2015 -0600

----------------------------------------------------------------------
 Allura/allura/app.py                            | 18 +++---
 Allura/allura/ext/admin/admin_main.py           |  8 +--
 .../ext/admin/templates/project_tools.html      |  2 +-
 Allura/allura/lib/widgets/admin_widgets.py      | 33 -----------
 .../resources/js/admin_tool_delete_modal.js     | 47 ----------------
 Allura/allura/templates/app_admin_delete.html   | 58 ++++++++++++++++++++
 .../templates/jinja_master/sidebar_menu.html    |  3 -
 .../widgets/admin_tool_delete_modal.html        | 34 ------------
 .../tests/functional/test_neighborhood.py       |  1 +
 9 files changed, 71 insertions(+), 133 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/2725acad/Allura/allura/app.py
----------------------------------------------------------------------
diff --git a/Allura/allura/app.py b/Allura/allura/app.py
index 381661c..5ae34e1 100644
--- a/Allura/allura/app.py
+++ b/Allura/allura/app.py
@@ -45,7 +45,6 @@ from allura import model
 from allura.controllers import BaseController
 from allura.lib.decorators import require_post, memoize
 from allura.lib.utils import permanent_redirect, ConfigProxy
-from allura.lib.widgets import admin_widgets
 from allura import model as M
 
 log = logging.getLogger(__name__)
@@ -308,11 +307,6 @@ class Application(object):
         self.admin = DefaultAdminController(self)
 
     @LazyProperty
-    def admin_tool_delete_modal(self):
-        """Returns modal dialog widget for app's delete workflow"""
-        return admin_widgets.AdminToolDeleteModal()
-
-    @LazyProperty
     def sitemap(self):
         """Return a list of :class:`SitemapEntries <allura.app.SitemapEntry>`
         describing the page hierarchy provided by this Application.
@@ -660,11 +654,9 @@ class Application(object):
         if self.uninstallable and not anchored:
             return SitemapEntry(
                 label='Delete',
-                url='#',
-                className='admin_tool_delete_modal',
-                extra_html_attrs={
-                    'data-mount-point': self.config.options.mount_point,
-                })
+                url=self.admin_url + 'delete',
+                className='admin_modal',
+            )
 
     def handle_message(self, topic, message):
         """Handle incoming email msgs addressed to this tool.
@@ -899,6 +891,10 @@ class DefaultAdminController(BaseController, AdminControllerMixin):
             app=self.app,
             allow_config=has_access(self.app, 'configure')())
 
+    @expose('jinja:allura:templates/app_admin_delete.html')
+    def delete(self):
+        return dict(app=self.app)
+
     @expose()
     @require_post()
     def configure(self, **kw):

http://git-wip-us.apache.org/repos/asf/allura/blob/2725acad/Allura/allura/ext/admin/admin_main.py
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/admin_main.py b/Allura/allura/ext/admin/admin_main.py
index b7d7685..c50a71a 100644
--- a/Allura/allura/ext/admin/admin_main.py
+++ b/Allura/allura/ext/admin/admin_main.py
@@ -44,7 +44,6 @@ from allura.controllers import BaseController
 from allura.lib.decorators import require_post
 from allura.tasks import export_tasks
 from allura.lib.widgets.project_list import ProjectScreenshots
-from allura.lib.widgets import admin_widgets
 
 from . import widgets as aw
 
@@ -55,7 +54,6 @@ log = logging.getLogger(__name__)
 class W:
     markdown_editor = ffw.MarkdownEdit()
     label_edit = ffw.LabelEdit()
-    mount_delete = admin_widgets.AdminToolDeleteModal()
     install_modal = ffw.Lightbox(
         name='install_modal', trigger='a.install_trig')
     explain_export_modal = ffw.Lightbox(
@@ -268,7 +266,6 @@ class ProjectAdminController(BaseController):
     def tools(self, page=None, limit=200, **kw):
         c.markdown_editor = W.markdown_editor
         c.label_edit = W.label_edit
-        c.mount_delete = W.mount_delete
         c.install_modal = W.install_modal
         c.page_list = W.page_list
         mounts = c.project.ordered_mounts()
@@ -900,9 +897,12 @@ class ProjectAdminRestController(BaseController):
         tool = c.project.app_instance(mount_point)
         if not mount_point or tool is None:
             raise exc.HTTPNotFound
+        admin_menu = tool.admin_menu()
+        if tool.admin_menu_delete_button:
+            admin_menu.append(tool.admin_menu_delete_button)
         return {
             'options': [dict(text=m.label, href=m.url, className=m.className)
-                        for m in tool.admin_menu()]
+                        for m in admin_menu]
         }
 
     @expose('json:')

http://git-wip-us.apache.org/repos/asf/allura/blob/2725acad/Allura/allura/ext/admin/templates/project_tools.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/project_tools.html b/Allura/allura/ext/admin/templates/project_tools.html
index 807828a..a78a916 100644
--- a/Allura/allura/ext/admin/templates/project_tools.html
+++ b/Allura/allura/ext/admin/templates/project_tools.html
@@ -104,6 +104,7 @@
                         <img src="{{ g.theme.app_icon_url('subproject', 48) }}" alt="">
                     </li>
                     <li>
+                        <!-- FIXME -->
                       <a href="#" data-mount-point="{{ mount['sub'].shortname }}"
                                   data-subproject="true"
                                   class="admin_tool_delete_modal">
@@ -119,7 +120,6 @@
 <div style="clear:both">
   {{c.page_list.display(page=page, limit=limit, count=total_mounts)}}
 </div>
-{{c.mount_delete.display()}}
 <div><!--dummy-->
 
 <h3 style="clear:left">Grouping</h3>

http://git-wip-us.apache.org/repos/asf/allura/blob/2725acad/Allura/allura/lib/widgets/admin_widgets.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/widgets/admin_widgets.py b/Allura/allura/lib/widgets/admin_widgets.py
deleted file mode 100644
index 6fe0f4f..0000000
--- a/Allura/allura/lib/widgets/admin_widgets.py
+++ /dev/null
@@ -1,33 +0,0 @@
-#       Licensed to the Apache Software Foundation (ASF) under one
-#       or more contributor license agreements.  See the NOTICE file
-#       distributed with this work for additional information
-#       regarding copyright ownership.  The ASF licenses this file
-#       to you under the Apache License, Version 2.0 (the
-#       "License"); you may not use this file except in compliance
-#       with the License.  You may obtain a copy of the License at
-#
-#         http://www.apache.org/licenses/LICENSE-2.0
-#
-#       Unless required by applicable law or agreed to in writing,
-#       software distributed under the License is distributed on an
-#       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#       KIND, either express or implied.  See the License for the
-#       specific language governing permissions and limitations
-#       under the License.
-
-import ew.jinja2_ew as ew
-
-from allura.lib.widgets import form_fields as ffw
-
-
-class AdminToolDeleteModal(ffw.Lightbox):
-    defaults = dict(
-        ffw.Lightbox.defaults,
-        name='admin_tool_delete_modal',
-        trigger='a.admin_tool_delete_modal',
-        content_template='allura:templates/widgets/admin_tool_delete_modal.html')
-
-    def resources(self):
-        for r in super(AdminToolDeleteModal, self).resources():
-            yield r
-        yield ew.JSLink('js/admin_tool_delete_modal.js')

http://git-wip-us.apache.org/repos/asf/allura/blob/2725acad/Allura/allura/lib/widgets/resources/js/admin_tool_delete_modal.js
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/widgets/resources/js/admin_tool_delete_modal.js b/Allura/allura/lib/widgets/resources/js/admin_tool_delete_modal.js
deleted file mode 100644
index 211f5ed..0000000
--- a/Allura/allura/lib/widgets/resources/js/admin_tool_delete_modal.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
-       Licensed to the Apache Software Foundation (ASF) under one
-       or more contributor license agreements.  See the NOTICE file
-       distributed with this work for additional information
-       regarding copyright ownership.  The ASF licenses this file
-       to you under the Apache License, Version 2.0 (the
-       "License"); you may not use this file except in compliance
-       with the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-       Unless required by applicable law or agreed to in writing,
-       software distributed under the License is distributed on an
-       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-       KIND, either express or implied.  See the License for the
-       specific language governing permissions and limitations
-       under the License.
-*/
-$(function() {
-  var $form = $('#admin-tool-delete-modal-form');
-  $('a.admin_tool_delete_modal').click(function() {
-    var mount_point = $(this).data('mount-point');
-    var is_sub = $(this).data('subproject');
-    var prefix = is_sub ? 'subproject-0' : 'tool-0';
-    var mount_point_name = prefix + (is_sub ? '.shortname' : '.mount_point');
-    var delete_name = prefix + '.delete';
-    $form.find('.mount_point')
-         .attr('name', mount_point_name)
-         .val(mount_point);
-    $form.find('.delete-input').attr('name', delete_name);
-    var tool_label = 'this';
-    if (mount_point) {
-      tool_label = 'the "' + mount_point + '"';
-    }
-    var msg = 'Warning: This will destroy all data in ';
-    msg += tool_label;
-    msg += ' tool and is irreversible!';
-    $form.find('.warning-msg').text(msg);
-  });
-  $form.find('.delete-tool').click(function() {
-    if ($form.find('.mount_point').val()) {
-      $form.submit();
-    } else {
-      console.log('Do not know which tool to delete!');
-    }
-  });
-});

http://git-wip-us.apache.org/repos/asf/allura/blob/2725acad/Allura/allura/templates/app_admin_delete.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/app_admin_delete.html b/Allura/allura/templates/app_admin_delete.html
new file mode 100644
index 0000000..fe71b56
--- /dev/null
+++ b/Allura/allura/templates/app_admin_delete.html
@@ -0,0 +1,58 @@
+{#-
+       Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+-#}
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
+
+<form method="POST"
+      action="{{c.project.url()}}admin/update_mounts"
+      id="admin-tool-delete-modal-form">
+<p>Warning: This will destroy all data in the '{{ app.config.options.mount_point }}' tool and is irreversible!</p>
+<hr>
+<p>
+  <input type="button" value="Delete" class="delete-tool">
+  <input type="button" value="Cancel" class="close">
+</p>
+<input type="hidden" class="mount_point">
+<input type="hidden" value="Delete" class="delete-input">
+{{lib.csrf_token()}}
+</form>
+
+
+<script type="text/javascript">
+$(function() {
+    var $form = $('#admin-tool-delete-modal-form');
+    var mount_point = '{{ app.config.options.mount_point }}';
+    var is_sub = $(this).data('subproject');
+
+    var prefix = is_sub ? 'subproject-0' : 'tool-0';
+    var mount_point_name = prefix + (is_sub ? '.shortname' : '.mount_point');
+    var delete_name = prefix + '.delete';
+    $form.find('.mount_point')
+         .attr('name', mount_point_name)
+         .val(mount_point);
+    $form.find('.delete-input').attr('name', delete_name);
+
+    $form.find('.delete-tool').click(function() {
+        if ($form.find('.mount_point').val()) {
+            $form.submit();
+        } else {
+            console.log('Do not know which tool to delete!');
+        }
+    });
+});
+</script>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/allura/blob/2725acad/Allura/allura/templates/jinja_master/sidebar_menu.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/jinja_master/sidebar_menu.html b/Allura/allura/templates/jinja_master/sidebar_menu.html
index 2cb433a..8d2831a 100644
--- a/Allura/allura/templates/jinja_master/sidebar_menu.html
+++ b/Allura/allura/templates/jinja_master/sidebar_menu.html
@@ -75,9 +75,6 @@
             {{sidebar_item(c.app.admin_menu_delete_button)}}
             {{sidebar_item(None)}}
           </div>
-          {% if c.app.admin_menu_delete_button %}
-            {{c.app.admin_tool_delete_modal.display()}}
-          {% endif %}
         {% endif %}
       {% endif %}
       {% for s in c.app.sidebar_menu() %}

http://git-wip-us.apache.org/repos/asf/allura/blob/2725acad/Allura/allura/templates/widgets/admin_tool_delete_modal.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/widgets/admin_tool_delete_modal.html b/Allura/allura/templates/widgets/admin_tool_delete_modal.html
deleted file mode 100644
index 692c582..0000000
--- a/Allura/allura/templates/widgets/admin_tool_delete_modal.html
+++ /dev/null
@@ -1,34 +0,0 @@
-{#-
-       Licensed to the Apache Software Foundation (ASF) under one
-       or more contributor license agreements.  See the NOTICE file
-       distributed with this work for additional information
-       regarding copyright ownership.  The ASF licenses this file
-       to you under the Apache License, Version 2.0 (the
-       "License"); you may not use this file except in compliance
-       with the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-       Unless required by applicable law or agreed to in writing,
-       software distributed under the License is distributed on an
-       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-       KIND, either express or implied.  See the License for the
-       specific language governing permissions and limitations
-       under the License.
--#}
-{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
-
-<h1>Confirm Delete</h1>
-<form method="POST"
-      action="{{c.project.url()}}admin/update_mounts"
-      id="admin-tool-delete-modal-form">
-<p class="warning-msg">Warning: This will destroy all data in this tool and is irreversible!</p>
-<hr>
-<p>
-  <input type="button" value="Delete" class="delete-tool">
-  <input type="button" value="Cancel" class="close">
-</p>
-<input type="hidden" class="mount_point">
-<input type="hidden" value="Delete" class="delete-input">
-{{lib.csrf_token()}}
-</form>

http://git-wip-us.apache.org/repos/asf/allura/blob/2725acad/Allura/allura/tests/functional/test_neighborhood.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_neighborhood.py b/Allura/allura/tests/functional/test_neighborhood.py
index 593a34c..a218b68 100644
--- a/Allura/allura/tests/functional/test_neighborhood.py
+++ b/Allura/allura/tests/functional/test_neighborhood.py
@@ -173,6 +173,7 @@ class TestNeighborhood(TestController):
 
         r = self.app.get('/p/test/admin/tools')
         assert '<div class="fleft isnt_sorted">' in r
+        # FIXME
         delete_tool = r.html.findAll('a', {'class': 'admin_tool_delete_modal'})
         assert_equal(len(delete_tool), 1)
 


[28/50] [abbrv] allura git commit: [#7919] remove unused bits of code

Posted by br...@apache.org.
[#7919] remove unused bits of code


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/320e5289
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/320e5289
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/320e5289

Branch: refs/heads/db/8034
Commit: 320e5289e1cb69ca99a14aaa06093a4a3e4892c3
Parents: b344a07
Author: Dave Brondsema <da...@brondsema.net>
Authored: Mon Dec 7 15:21:11 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:38 2015 -0600

----------------------------------------------------------------------
 Allura/allura/ext/admin/admin_main.py    | 27 ---------------------------
 Allura/allura/public/nf/js/navbar.es6.js |  1 -
 2 files changed, 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/320e5289/Allura/allura/ext/admin/admin_main.py
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/admin_main.py b/Allura/allura/ext/admin/admin_main.py
index 6bb6b46..d9f87fa 100644
--- a/Allura/allura/ext/admin/admin_main.py
+++ b/Allura/allura/ext/admin/admin_main.py
@@ -880,33 +880,6 @@ class ProjectAdminRestController(BaseController):
         }
 
     @expose('json:')
-    @require_post() # FIXME
-    def mount_point(self, mount_point=None, **kw):
-        """
-        Returns a tool from a given mount point
-        """
-        response.content_type = 'application/json'
-
-        tool = c.project.app_instance(mount_point)
-
-        if tool is None:
-            return {
-                'exists': False,
-                'info': 'Mount point does not exists.',
-            }
-
-        try:
-            info = json.dumps(tool)
-            # FIXME
-        except TypeError:
-            info = "Could not serialize tool."
-
-        return {
-            'exist': True,
-            'info': info
-        }
-
-    @expose('json:')
     def admin_options(self, mount_point=None, **kw):
         """
         Returns the admin options for a given mount_point

http://git-wip-us.apache.org/repos/asf/allura/blob/320e5289/Allura/allura/public/nf/js/navbar.es6.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/navbar.es6.js b/Allura/allura/public/nf/js/navbar.es6.js
index 819bc2f..9f805fe 100644
--- a/Allura/allura/public/nf/js/navbar.es6.js
+++ b/Allura/allura/public/nf/js/navbar.es6.js
@@ -464,7 +464,6 @@ var Main = React.createClass({
         return {
             data: this.props.initialData,
             visible: true,
-            _session_id: $.cookie('_session_id'),
             currentOptionMenu: {
                 tool: null
             }


[34/50] [abbrv] allura git commit: [#7919] navbar.css should come after theme CSS; make Add Tool not make the navbar too tall

Posted by br...@apache.org.
[#7919] navbar.css should come after theme CSS; make Add Tool not make the navbar too tall


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/196444fe
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/196444fe
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/196444fe

Branch: refs/heads/db/8034
Commit: 196444fef65d3f26b04018cb99cb45ab65b02d72
Parents: 54bc381
Author: Dave Brondsema <da...@brondsema.net>
Authored: Thu Dec 10 15:20:10 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:39 2015 -0600

----------------------------------------------------------------------
 Allura/allura/public/nf/css/navbar.css           | 6 +++++-
 Allura/allura/templates/jinja_master/master.html | 2 +-
 2 files changed, 6 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/196444fe/Allura/allura/public/nf/css/navbar.css
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/css/navbar.css b/Allura/allura/public/nf/css/navbar.css
index c4264aa..92ec7c9 100644
--- a/Allura/allura/public/nf/css/navbar.css
+++ b/Allura/allura/public/nf/css/navbar.css
@@ -54,7 +54,7 @@
     box-shadow: 0 1px 1px #ccc;
 }
 
-#normal-nav-bar, #top_nav_admin > ul.dropdown {
+#top_nav_admin ul.dropdown {
     border: none;
     box-shadow: none;
 }
@@ -224,6 +224,10 @@
     text-align: left;
 }
 
+#top_nav #add-tool-container {
+    padding-bottom: 0;  /* cancel out the site style for dropdown <li>s, since this is already fairly tall */
+}
+
 #top_nav .add-tool-toggle {
     border: 1px dashed #B9B9B9;
     color: #0077aa;

http://git-wip-us.apache.org/repos/asf/allura/blob/196444fe/Allura/allura/templates/jinja_master/master.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/jinja_master/master.html b/Allura/allura/templates/jinja_master/master.html
index 5ec6808..52160a8 100644
--- a/Allura/allura/templates/jinja_master/master.html
+++ b/Allura/allura/templates/jinja_master/master.html
@@ -32,6 +32,7 @@
 {% do g.register_forge_css('css/forge/hilite.css') %}
 {% do g.register_forge_css('css/forge/tooltipster.css') %}
 {% do g.register_forge_css('css/font-awesome.min.css', compress=False) %}
+{% do g.theme.require() %}
 {% if h.has_access(c.project, 'admin')() %}
     {% do g.register_forge_js('js/admin_modal.js') %}
     {% do g.register_js('js/jquery.lightbox_me.js') %}
@@ -39,7 +40,6 @@
        any css.  (Unlike other html files which are the top-level file and extend this master.html) #}
     {% do g.register_forge_css('css/navbar.css') %}
 {% endif %}
-{% do g.theme.require() %}
 {% do g.resource_manager.register_widgets(c) %}
 {# paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/ #}
 <!--[if lt IE 7 ]> <html lang="en" class="no-js ie6"> <![endif]-->


[35/50] [abbrv] allura git commit: [#7919] tooltip on initial lock icon; removing blue hover that chrome/osx puts around it after clicking

Posted by br...@apache.org.
[#7919] tooltip on initial lock icon; removing blue hover that chrome/osx puts around it after clicking


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/0bc1567f
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/0bc1567f
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/0bc1567f

Branch: refs/heads/db/8034
Commit: 0bc1567fb9cafafac72cfb2365528509c4e33ad1
Parents: f9b08a8
Author: Dave Brondsema <da...@brondsema.net>
Authored: Wed Dec 9 16:35:17 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:39 2015 -0600

----------------------------------------------------------------------
 Allura/allura/public/nf/css/navbar.css            |  3 +++
 Allura/allura/templates/jinja_master/top_nav.html | 10 +++++++++-
 2 files changed, 12 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/0bc1567f/Allura/allura/public/nf/css/navbar.css
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/css/navbar.css b/Allura/allura/public/nf/css/navbar.css
index 71e625b..c4264aa 100644
--- a/Allura/allura/public/nf/css/navbar.css
+++ b/Allura/allura/public/nf/css/navbar.css
@@ -31,6 +31,9 @@
     width: 1.8rem;
     height: 1.8rem;
 }
+#toggle-admin-btn:focus {
+    outline: none;
+}
 
 #threshold-config > span > input {
     width: 2rem;

http://git-wip-us.apache.org/repos/asf/allura/blob/0bc1567f/Allura/allura/templates/jinja_master/top_nav.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/jinja_master/top_nav.html b/Allura/allura/templates/jinja_master/top_nav.html
index 415123c..53ffc6b 100644
--- a/Allura/allura/templates/jinja_master/top_nav.html
+++ b/Allura/allura/templates/jinja_master/top_nav.html
@@ -36,7 +36,9 @@
   {% endfor %}
   {% if h.has_access(c.project, 'admin')() %}
     <li id="add-tool-container"><a href='#' class="add-tool-toggle">Add New...</a></li>
-    <button id="toggle-admin-btn"><i class="fa fa-lock"></i></button>
+    <button id="toggle-admin-btn" title="Click to unlock the toolbar and configure your project's tools.">
+        <i class="fa fa-lock"></i>
+    </button>
   {% endif %}
 </ul>
 </div>
@@ -63,6 +65,12 @@
                         installableTools: _data['installable_tools'],
                         mountPointValidation:_existingTools
                     }), document.getElementById('add-tool-container'));
+
+            $("#toggle-admin-btn").tooltipster({
+                delay: 200,
+                theme: 'tooltipster-light',
+                position: 'top'
+            })
         });
     </script>
 {% endif %}


[16/50] [abbrv] allura git commit: [#7919] don't support subproject deletion from parent project, only regular tools; provide link to subproject admin

Posted by br...@apache.org.
[#7919] don't support subproject deletion from parent project, only regular tools; provide link to subproject admin


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/ceb42fa5
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/ceb42fa5
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/ceb42fa5

Branch: refs/heads/db/8034
Commit: ceb42fa5561d2a2e54193fe4fe48d84a45c680fd
Parents: 2725aca
Author: Dave Brondsema <da...@brondsema.net>
Authored: Thu Dec 3 10:18:47 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:35 2015 -0600

----------------------------------------------------------------------
 .../ext/admin/templates/project_tools.html      |  8 -----
 Allura/allura/model/project.py                  |  2 ++
 Allura/allura/templates/app_admin_delete.html   | 35 +++-----------------
 .../tests/functional/test_neighborhood.py       |  6 ++--
 Allura/allura/tests/test_webhooks.py            |  4 +--
 5 files changed, 11 insertions(+), 44 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/ceb42fa5/Allura/allura/ext/admin/templates/project_tools.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/project_tools.html b/Allura/allura/ext/admin/templates/project_tools.html
index a78a916..4b22bbe 100644
--- a/Allura/allura/ext/admin/templates/project_tools.html
+++ b/Allura/allura/ext/admin/templates/project_tools.html
@@ -103,14 +103,6 @@
                         <span class="tool_name">{{ mount['sub'].name }}</span><br />
                         <img src="{{ g.theme.app_icon_url('subproject', 48) }}" alt="">
                     </li>
-                    <li>
-                        <!-- FIXME -->
-                      <a href="#" data-mount-point="{{ mount['sub'].shortname }}"
-                                  data-subproject="true"
-                                  class="admin_tool_delete_modal">
-                        <span>Delete</span>
-                      </a>
-                    </li>
                 </ul>
             </div>
         {% endif %}

http://git-wip-us.apache.org/repos/asf/allura/blob/ceb42fa5/Allura/allura/model/project.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/project.py b/Allura/allura/model/project.py
index 0e4a78a..cafa8ad 100644
--- a/Allura/allura/model/project.py
+++ b/Allura/allura/model/project.py
@@ -627,6 +627,8 @@ class Project(SearchIndexable, MappedClass, ActivityNode, ActivityObject):
                     entry['admin_options'] = ProjectAdminRestController().admin_options(mount_point)['options']
                 except exc.HTTPNotFound:
                     log.debug('Could not get admin_options mount_point for tool: %s', s.url)
+            if admin_options and not s.tool_name:
+                entry['admin_options'] = [dict(text='Subproject Admin', href=s.url + 'admin', className=None)]
             return entry
 
         for s in self.grouped_navbar_entries():

http://git-wip-us.apache.org/repos/asf/allura/blob/ceb42fa5/Allura/allura/templates/app_admin_delete.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/app_admin_delete.html b/Allura/allura/templates/app_admin_delete.html
index fe71b56..953a35d 100644
--- a/Allura/allura/templates/app_admin_delete.html
+++ b/Allura/allura/templates/app_admin_delete.html
@@ -18,41 +18,14 @@
 -#}
 {% import 'allura:templates/jinja_master/lib.html' as lib with context %}
 
-<form method="POST"
-      action="{{c.project.url()}}admin/update_mounts"
-      id="admin-tool-delete-modal-form">
+<form method="POST" action="{{c.project.url()}}admin/update_mounts">
 <p>Warning: This will destroy all data in the '{{ app.config.options.mount_point }}' tool and is irreversible!</p>
 <hr>
 <p>
-  <input type="button" value="Delete" class="delete-tool">
+  <input type="submit" value="Delete" class="delete-tool">
   <input type="button" value="Cancel" class="close">
 </p>
-<input type="hidden" class="mount_point">
-<input type="hidden" value="Delete" class="delete-input">
+<input type="hidden" name="tool-0.mount_point" value="{{ app.config.options.mount_point }}">
+<input type="hidden" name="tool-0.delete" value="Delete">
 {{lib.csrf_token()}}
 </form>
-
-
-<script type="text/javascript">
-$(function() {
-    var $form = $('#admin-tool-delete-modal-form');
-    var mount_point = '{{ app.config.options.mount_point }}';
-    var is_sub = $(this).data('subproject');
-
-    var prefix = is_sub ? 'subproject-0' : 'tool-0';
-    var mount_point_name = prefix + (is_sub ? '.shortname' : '.mount_point');
-    var delete_name = prefix + '.delete';
-    $form.find('.mount_point')
-         .attr('name', mount_point_name)
-         .val(mount_point);
-    $form.find('.delete-input').attr('name', delete_name);
-
-    $form.find('.delete-tool').click(function() {
-        if ($form.find('.mount_point').val()) {
-            $form.submit();
-        } else {
-            console.log('Do not know which tool to delete!');
-        }
-    });
-});
-</script>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/allura/blob/ceb42fa5/Allura/allura/tests/functional/test_neighborhood.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_neighborhood.py b/Allura/allura/tests/functional/test_neighborhood.py
index a218b68..b97a7c8 100644
--- a/Allura/allura/tests/functional/test_neighborhood.py
+++ b/Allura/allura/tests/functional/test_neighborhood.py
@@ -173,9 +173,9 @@ class TestNeighborhood(TestController):
 
         r = self.app.get('/p/test/admin/tools')
         assert '<div class="fleft isnt_sorted">' in r
-        # FIXME
-        delete_tool = r.html.findAll('a', {'class': 'admin_tool_delete_modal'})
-        assert_equal(len(delete_tool), 1)
+        delete_tool = [link for link in r.html.findAll('a', {'class': 'admin_modal'})
+                       if link['href'].endswith('/delete')]
+        assert_equal(len(delete_tool), 0)  # wiki not deletable
 
     def test_show_title(self):
         r = self.app.get('/adobe/_admin/overview',

http://git-wip-us.apache.org/repos/asf/allura/blob/ceb42fa5/Allura/allura/tests/test_webhooks.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/test_webhooks.py b/Allura/allura/tests/test_webhooks.py
index 93da118..d7fb75c 100644
--- a/Allura/allura/tests/test_webhooks.py
+++ b/Allura/allura/tests/test_webhooks.py
@@ -261,7 +261,7 @@ class TestWebhookController(TestController):
         assert_equal(M.Webhook.query.find().count(), 2)
         wh1 = M.Webhook.query.get(hook_url=data1['url'])
         r = self.app.get(self.url + '/repo-push/%s' % wh1._id)
-        form = r.forms[1]
+        form = r.forms[0]
         assert_equal(form['url'].value, data1['url'])
         assert_equal(form['secret'].value, data1['secret'])
         assert_equal(form['webhook'].value, unicode(wh1._id))
@@ -283,7 +283,7 @@ class TestWebhookController(TestController):
 
         # Duplicates
         r = self.app.get(self.url + '/repo-push/%s' % wh1._id)
-        form = r.forms[1]
+        form = r.forms[0]
         form['url'] = data2['url']
         r = form.submit()
         self.find_error(r, '_the_form',


[25/50] [abbrv] allura git commit: [#7919] remove unused tb-sub-menu class rules

Posted by br...@apache.org.
[#7919] remove unused tb-sub-menu class rules


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/f56c0b15
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/f56c0b15
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/f56c0b15

Branch: refs/heads/db/8034
Commit: f56c0b156b0cd6d0c65c50d772773ccade8fe2f3
Parents: d92db9a
Author: Dave Brondsema <da...@brondsema.net>
Authored: Mon Dec 7 11:35:37 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:37 2015 -0600

----------------------------------------------------------------------
 Allura/allura/public/nf/css/navbar.css | 20 --------------------
 1 file changed, 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/f56c0b15/Allura/allura/public/nf/css/navbar.css
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/css/navbar.css b/Allura/allura/public/nf/css/navbar.css
index 83ee588..fc0d118 100644
--- a/Allura/allura/public/nf/css/navbar.css
+++ b/Allura/allura/public/nf/css/navbar.css
@@ -201,16 +201,6 @@
     height: 24px;
 }
 
-#top_nav_admin .tb-sub-menu a {
-    border-right: none;
-    margin: 3px 20px 0 2px;
-    padding: 5px;
-}
-
-#top_nav_admin .tb-sub-menu a:hover {
-    color: white;
-}
-
 .react-reorderable-item .tb-item-grouper > div {
     position: relative;
     background: white;
@@ -234,16 +224,6 @@
     text-align: left;
 }
 
-.tb-sub-menu .react-drag:hover {
-    background: #09c linear-gradient(#09c, #07a);
-    border-bottom-style: none;
-    color: white;
-}
-
-.tb-sub-menu .react-drag:hover a {
-    color: white;
-}
-
 #top_nav .add-tool-toggle {
     border: 1px dashed #B9B9B9;
     color: #0077aa;


[43/50] [abbrv] allura git commit: [#7919] include babel's polyfill for IE

Posted by br...@apache.org.
[#7919] include babel's polyfill for IE


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/d20e75d2
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/d20e75d2
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/d20e75d2

Branch: refs/heads/db/8034
Commit: d20e75d2b38d07b5d1c10aaba7be79b5111f30dc
Parents: a4d7c45
Author: Dave Brondsema <da...@brondsema.net>
Authored: Fri Dec 11 21:02:52 2015 +0000
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 15:50:53 2015 -0600

----------------------------------------------------------------------
 Allura/LICENSE                                     | 4 ++++
 Allura/allura/public/nf/js/browser-polyfill.min.js | 2 ++
 Allura/allura/templates/jinja_master/top_nav.html  | 1 +
 Brocfile.js                                        | 1 +
 LICENSE                                            | 6 +++++-
 rat-excludes.txt                                   | 2 +-
 6 files changed, 14 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/d20e75d2/Allura/LICENSE
----------------------------------------------------------------------
diff --git a/Allura/LICENSE b/Allura/LICENSE
index 7d65c3f..c31db20 100644
--- a/Allura/LICENSE
+++ b/Allura/LICENSE
@@ -264,6 +264,10 @@ For details, see:
 Underscore, which is available under the MIT license.
 For details, see allura/public/nf/js/underscore-min.js
 
+Babel's Polyfill, which is available under the MIT license.
+See https://babeljs.io/docs/usage/polyfill/
+    allura/public/nf/js/browser-polyfill.min.js
+
 Font Awesome is available under the MIT license (for the code) and SIL OFL 1.1 (for the fonts).
 Source code available at http://fortawesome.github.io/Font-Awesome/
 For details, see:

http://git-wip-us.apache.org/repos/asf/allura/blob/d20e75d2/Allura/allura/public/nf/js/browser-polyfill.min.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/browser-polyfill.min.js b/Allura/allura/public/nf/js/browser-polyfill.min.js
new file mode 100644
index 0000000..bb9dbd1
--- /dev/null
+++ b/Allura/allura/public/nf/js/browser-polyfill.min.js
@@ -0,0 +1,2 @@
+!function t(n,r,e){function o(u,c){if(!r[u]){if(!n[u]){var a="function"==typeof require&&require;if(!c&&a)return a(u,!0);if(i)return i(u,!0);var s=new Error("Cannot find module '"+u+"'");throw s.code="MODULE_NOT_FOUND",s}var f=r[u]={exports:{}};n[u][0].call(f.exports,function(t){var r=n[u][1][t];return o(r?r:t)},f,f.exports,t,n,r,e)}return r[u].exports}for(var i="function"==typeof require&&require,u=0;u<e.length;u++)o(e[u]);return o}({1:[function(t,n,r){(function(n){"use strict";if(t(188),t(189),n._babelPolyfill)throw new Error("only one instance of babel/polyfill is allowed");n._babelPolyfill=!0}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{188:188,189:189}],2:[function(t,n,r){n.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},{}],3:[function(t,n,r){var e=t(83)("unscopables"),o=Array.prototype;void 0==o[e]&&t(31)(o,e,{}),n.exports=function(t){o[e][t]=!0}},{31:31,83:8
 3}],4:[function(t,n,r){var e=t(38);n.exports=function(t){if(!e(t))throw TypeError(t+" is not an object!");return t}},{38:38}],5:[function(t,n,r){"use strict";var e=t(80),o=t(76),i=t(79);n.exports=[].copyWithin||function(t,n){var r=e(this),u=i(r.length),c=o(t,u),a=o(n,u),s=arguments,f=s.length>2?s[2]:void 0,l=Math.min((void 0===f?u:o(f,u))-a,u-c),h=1;for(c>a&&a+l>c&&(h=-1,a+=l-1,c+=l-1);l-->0;)a in r?r[c]=r[a]:delete r[c],c+=h,a+=h;return r}},{76:76,79:79,80:80}],6:[function(t,n,r){"use strict";var e=t(80),o=t(76),i=t(79);n.exports=[].fill||function(t){for(var n=e(this),r=i(n.length),u=arguments,c=u.length,a=o(c>1?u[1]:void 0,r),s=c>2?u[2]:void 0,f=void 0===s?r:o(s,r);f>a;)n[a++]=t;return n}},{76:76,79:79,80:80}],7:[function(t,n,r){var e=t(78),o=t(79),i=t(76);n.exports=function(t){return function(n,r,u){var c,a=e(n),s=o(a.length),f=i(u,s);if(t&&r!=r){for(;s>f;)if(c=a[f++],c!=c)return!0}else for(;s>f;f++)if((t||f in a)&&a[f]===r)return t||f;return!t&&-1}}},{76:76,78:78,79:79}],8:[func
 tion(t,n,r){var e=t(17),o=t(34),i=t(80),u=t(79),c=t(9);n.exports=function(t){var n=1==t,r=2==t,a=3==t,s=4==t,f=6==t,l=5==t||f;return function(h,p,v){for(var g,y,d=i(h),m=o(d),S=e(p,v,3),b=u(m.length),w=0,x=n?c(h,b):r?c(h,0):void 0;b>w;w++)if((l||w in m)&&(g=m[w],y=S(g,w,d),t))if(n)x[w]=y;else if(y)switch(t){case 3:return!0;case 5:return g;case 6:return w;case 2:x.push(g)}else if(s)return!1;return f?-1:a||s?s:x}}},{17:17,34:34,79:79,80:80,9:9}],9:[function(t,n,r){var e=t(38),o=t(36),i=t(83)("species");n.exports=function(t,n){var r;return o(t)&&(r=t.constructor,"function"!=typeof r||r!==Array&&!o(r.prototype)||(r=void 0),e(r)&&(r=r[i],null===r&&(r=void 0))),new(void 0===r?Array:r)(n)}},{36:36,38:38,83:83}],10:[function(t,n,r){var e=t(11),o=t(83)("toStringTag"),i="Arguments"==e(function(){return arguments}());n.exports=function(t){var n,r,u;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(r=(n=Object(t))[o])?r:i?e(n):"Object"==(u=e(n))&&"function"==typeof n.callee?"Argume
 nts":u}},{11:11,83:83}],11:[function(t,n,r){var e={}.toString;n.exports=function(t){return e.call(t).slice(8,-1)}},{}],12:[function(t,n,r){"use strict";var e=t(46),o=t(31),i=t(60),u=t(17),c=t(69),a=t(18),s=t(27),f=t(42),l=t(44),h=t(82)("id"),p=t(30),v=t(38),g=t(65),y=t(19),d=Object.isExtensible||v,m=y?"_s":"size",S=0,b=function(t,n){if(!v(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!p(t,h)){if(!d(t))return"F";if(!n)return"E";o(t,h,++S)}return"O"+t[h]},w=function(t,n){var r,e=b(n);if("F"!==e)return t._i[e];for(r=t._f;r;r=r.n)if(r.k==n)return r};n.exports={getConstructor:function(t,n,r,o){var f=t(function(t,i){c(t,f,n),t._i=e.create(null),t._f=void 0,t._l=void 0,t[m]=0,void 0!=i&&s(i,r,t[o],t)});return i(f.prototype,{clear:function(){for(var t=this,n=t._i,r=t._f;r;r=r.n)r.r=!0,r.p&&(r.p=r.p.n=void 0),delete n[r.i];t._f=t._l=void 0,t[m]=0},"delete":function(t){var n=this,r=w(n,t);if(r){var e=r.n,o=r.p;delete n._i[r.i],r.r=!0,o&&(o.n=e),e&&(e.p=o),n._f==r&&(n._f=e),n
 ._l==r&&(n._l=o),n[m]--}return!!r},forEach:function(t){for(var n,r=u(t,arguments.length>1?arguments[1]:void 0,3);n=n?n.n:this._f;)for(r(n.v,n.k,this);n&&n.r;)n=n.p},has:function(t){return!!w(this,t)}}),y&&e.setDesc(f.prototype,"size",{get:function(){return a(this[m])}}),f},def:function(t,n,r){var e,o,i=w(t,n);return i?i.v=r:(t._l=i={i:o=b(n,!0),k:n,v:r,p:e=t._l,n:void 0,r:!1},t._f||(t._f=i),e&&(e.n=i),t[m]++,"F"!==o&&(t._i[o]=i)),t},getEntry:w,setStrong:function(t,n,r){f(t,n,function(t,n){this._t=t,this._k=n,this._l=void 0},function(){for(var t=this,n=t._k,r=t._l;r&&r.r;)r=r.p;return t._t&&(t._l=r=r?r.n:t._t._f)?"keys"==n?l(0,r.k):"values"==n?l(0,r.v):l(0,[r.k,r.v]):(t._t=void 0,l(1))},r?"entries":"values",!r,!0),g(n)}}},{17:17,18:18,19:19,27:27,30:30,31:31,38:38,42:42,44:44,46:46,60:60,65:65,69:69,82:82}],13:[function(t,n,r){var e=t(27),o=t(10);n.exports=function(t){return function(){if(o(this)!=t)throw TypeError(t+"#toJSON isn't generic");var n=[];return e(this,!1,n.push,n),n}}},{
 10:10,27:27}],14:[function(t,n,r){"use strict";var e=t(31),o=t(60),i=t(4),u=t(38),c=t(69),a=t(27),s=t(8),f=t(30),l=t(82)("weak"),h=Object.isExtensible||u,p=s(5),v=s(6),g=0,y=function(t){return t._l||(t._l=new d)},d=function(){this.a=[]},m=function(t,n){return p(t.a,function(t){return t[0]===n})};d.prototype={get:function(t){var n=m(this,t);return n?n[1]:void 0},has:function(t){return!!m(this,t)},set:function(t,n){var r=m(this,t);r?r[1]=n:this.a.push([t,n])},"delete":function(t){var n=v(this.a,function(n){return n[0]===t});return~n&&this.a.splice(n,1),!!~n}},n.exports={getConstructor:function(t,n,r,e){var i=t(function(t,o){c(t,i,n),t._i=g++,t._l=void 0,void 0!=o&&a(o,r,t[e],t)});return o(i.prototype,{"delete":function(t){return u(t)?h(t)?f(t,l)&&f(t[l],this._i)&&delete t[l][this._i]:y(this)["delete"](t):!1},has:function(t){return u(t)?h(t)?f(t,l)&&f(t[l],this._i):y(this).has(t):!1}}),i},def:function(t,n,r){return h(i(n))?(f(n,l)||e(n,l,{}),n[l][t._i]=r):y(t).set(n,r),t},frozenStore:y
 ,WEAK:l}},{27:27,30:30,31:31,38:38,4:4,60:60,69:69,8:8,82:82}],15:[function(t,n,r){"use strict";var e=t(29),o=t(22),i=t(61),u=t(60),c=t(27),a=t(69),s=t(38),f=t(24),l=t(43),h=t(66);n.exports=function(t,n,r,p,v,g){var y=e[t],d=y,m=v?"set":"add",S=d&&d.prototype,b={},w=function(t){var n=S[t];i(S,t,"delete"==t?function(t){return g&&!s(t)?!1:n.call(this,0===t?0:t)}:"has"==t?function(t){return g&&!s(t)?!1:n.call(this,0===t?0:t)}:"get"==t?function(t){return g&&!s(t)?void 0:n.call(this,0===t?0:t)}:"add"==t?function(t){return n.call(this,0===t?0:t),this}:function(t,r){return n.call(this,0===t?0:t,r),this})};if("function"==typeof d&&(g||S.forEach&&!f(function(){(new d).entries().next()}))){var x,_=new d,E=_[m](g?{}:-0,1)!=_,O=f(function(){_.has(1)}),M=l(function(t){new d(t)});M||(d=n(function(n,r){a(n,d,t);var e=new y;return void 0!=r&&c(r,v,e[m],e),e}),d.prototype=S,S.constructor=d),g||_.forEach(function(t,n){x=1/n===-(1/0)}),(O||x)&&(w("delete"),w("has"),v&&w("get")),(x||E)&&w(m),g&&S.clear
 &&delete S.clear}else d=p.getConstructor(n,t,v,m),u(d.prototype,r);return h(d,t),b[t]=d,o(o.G+o.W+o.F*(d!=y),b),g||p.setStrong(d,t,v),d}},{22:22,24:24,27:27,29:29,38:38,43:43,60:60,61:61,66:66,69:69}],16:[function(t,n,r){var e=n.exports={version:"1.2.6"};"number"==typeof __e&&(__e=e)},{}],17:[function(t,n,r){var e=t(2);n.exports=function(t,n,r){if(e(t),void 0===n)return t;switch(r){case 1:return function(r){return t.call(n,r)};case 2:return function(r,e){return t.call(n,r,e)};case 3:return function(r,e,o){return t.call(n,r,e,o)}}return function(){return t.apply(n,arguments)}}},{2:2}],18:[function(t,n,r){n.exports=function(t){if(void 0==t)throw TypeError("Can't call method on  "+t);return t}},{}],19:[function(t,n,r){n.exports=!t(24)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{24:24}],20:[function(t,n,r){var e=t(38),o=t(29).document,i=e(o)&&e(o.createElement);n.exports=function(t){return i?o.createElement(t):{}}},{29:29,38:38}],21:[function(t,n,
 r){var e=t(46);n.exports=function(t){var n=e.getKeys(t),r=e.getSymbols;if(r)for(var o,i=r(t),u=e.isEnum,c=0;i.length>c;)u.call(t,o=i[c++])&&n.push(o);return n}},{46:46}],22:[function(t,n,r){var e=t(29),o=t(16),i=t(31),u=t(61),c=t(17),a="prototype",s=function(t,n,r){var f,l,h,p,v=t&s.F,g=t&s.G,y=t&s.S,d=t&s.P,m=t&s.B,S=g?e:y?e[n]||(e[n]={}):(e[n]||{})[a],b=g?o:o[n]||(o[n]={}),w=b[a]||(b[a]={});g&&(r=n);for(f in r)l=!v&&S&&f in S,h=(l?S:r)[f],p=m&&l?c(h,e):d&&"function"==typeof h?c(Function.call,h):h,S&&!l&&u(S,f,h),b[f]!=h&&i(b,f,p),d&&w[f]!=h&&(w[f]=h)};e.core=o,s.F=1,s.G=2,s.S=4,s.P=8,s.B=16,s.W=32,n.exports=s},{16:16,17:17,29:29,31:31,61:61}],23:[function(t,n,r){var e=t(83)("match");n.exports=function(t){var n=/./;try{"/./"[t](n)}catch(r){try{return n[e]=!1,!"/./"[t](n)}catch(o){}}return!0}},{83:83}],24:[function(t,n,r){n.exports=function(t){try{return!!t()}catch(n){return!0}}},{}],25:[function(t,n,r){"use strict";var e=t(31),o=t(61),i=t(24),u=t(18),c=t(83);n.exports=function(t,n,
 r){var a=c(t),s=""[t];i(function(){var n={};return n[a]=function(){return 7},7!=""[t](n)})&&(o(String.prototype,t,r(u,a,s)),e(RegExp.prototype,a,2==n?function(t,n){return s.call(t,this,n)}:function(t){return s.call(t,this)}))}},{18:18,24:24,31:31,61:61,83:83}],26:[function(t,n,r){"use strict";var e=t(4);n.exports=function(){var t=e(this),n="";return t.global&&(n+="g"),t.ignoreCase&&(n+="i"),t.multiline&&(n+="m"),t.unicode&&(n+="u"),t.sticky&&(n+="y"),n}},{4:4}],27:[function(t,n,r){var e=t(17),o=t(40),i=t(35),u=t(4),c=t(79),a=t(84);n.exports=function(t,n,r,s){var f,l,h,p=a(t),v=e(r,s,n?2:1),g=0;if("function"!=typeof p)throw TypeError(t+" is not iterable!");if(i(p))for(f=c(t.length);f>g;g++)n?v(u(l=t[g])[0],l[1]):v(t[g]);else for(h=p.call(t);!(l=h.next()).done;)o(h,v,l.value,n)}},{17:17,35:35,4:4,40:40,79:79,84:84}],28:[function(t,n,r){var e=t(78),o=t(46).getNames,i={}.toString,u="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],c=function(t){tr
 y{return o(t)}catch(n){return u.slice()}};n.exports.get=function(t){return u&&"[object Window]"==i.call(t)?c(t):o(e(t))}},{46:46,78:78}],29:[function(t,n,r){var e=n.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=e)},{}],30:[function(t,n,r){var e={}.hasOwnProperty;n.exports=function(t,n){return e.call(t,n)}},{}],31:[function(t,n,r){var e=t(46),o=t(59);n.exports=t(19)?function(t,n,r){return e.setDesc(t,n,o(1,r))}:function(t,n,r){return t[n]=r,t}},{19:19,46:46,59:59}],32:[function(t,n,r){n.exports=t(29).document&&document.documentElement},{29:29}],33:[function(t,n,r){n.exports=function(t,n,r){var e=void 0===r;switch(n.length){case 0:return e?t():t.call(r);case 1:return e?t(n[0]):t.call(r,n[0]);case 2:return e?t(n[0],n[1]):t.call(r,n[0],n[1]);case 3:return e?t(n[0],n[1],n[2]):t.call(r,n[0],n[1],n[2]);case 4:return e?t(n[0],n[1],n[2],n[3]):t.call(r,n[0],n[1],n[2],n[3])}return
  t.apply(r,n)}},{}],34:[function(t,n,r){var e=t(11);n.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==e(t)?t.split(""):Object(t)}},{11:11}],35:[function(t,n,r){var e=t(45),o=t(83)("iterator"),i=Array.prototype;n.exports=function(t){return void 0!==t&&(e.Array===t||i[o]===t)}},{45:45,83:83}],36:[function(t,n,r){var e=t(11);n.exports=Array.isArray||function(t){return"Array"==e(t)}},{11:11}],37:[function(t,n,r){var e=t(38),o=Math.floor;n.exports=function(t){return!e(t)&&isFinite(t)&&o(t)===t}},{38:38}],38:[function(t,n,r){n.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],39:[function(t,n,r){var e=t(38),o=t(11),i=t(83)("match");n.exports=function(t){var n;return e(t)&&(void 0!==(n=t[i])?!!n:"RegExp"==o(t))}},{11:11,38:38,83:83}],40:[function(t,n,r){var e=t(4);n.exports=function(t,n,r,o){try{return o?n(e(r)[0],r[1]):n(r)}catch(i){var u=t["return"];throw void 0!==u&&e(u.call(t)),i}}},{4:4}],41:[function(t,n,r){"use strict";va
 r e=t(46),o=t(59),i=t(66),u={};t(31)(u,t(83)("iterator"),function(){return this}),n.exports=function(t,n,r){t.prototype=e.create(u,{next:o(1,r)}),i(t,n+" Iterator")}},{31:31,46:46,59:59,66:66,83:83}],42:[function(t,n,r){"use strict";var e=t(48),o=t(22),i=t(61),u=t(31),c=t(30),a=t(45),s=t(41),f=t(66),l=t(46).getProto,h=t(83)("iterator"),p=!([].keys&&"next"in[].keys()),v="@@iterator",g="keys",y="values",d=function(){return this};n.exports=function(t,n,r,m,S,b,w){s(r,n,m);var x,_,E=function(t){if(!p&&t in j)return j[t];switch(t){case g:return function(){return new r(this,t)};case y:return function(){return new r(this,t)}}return function(){return new r(this,t)}},O=n+" Iterator",M=S==y,P=!1,j=t.prototype,N=j[h]||j[v]||S&&j[S],F=N||E(S);if(N){var A=l(F.call(new t));f(A,O,!0),!e&&c(j,v)&&u(A,h,d),M&&N.name!==y&&(P=!0,F=function(){return N.call(this)})}if(e&&!w||!p&&!P&&j[h]||u(j,h,F),a[n]=F,a[O]=d,S)if(x={values:M?F:E(y),keys:b?F:E(g),entries:M?E("entries"):F},w)for(_ in x)_ in j||i(j,_,x[
 _]);else o(o.P+o.F*(p||P),n,x);return x}},{22:22,30:30,31:31,41:41,45:45,46:46,48:48,61:61,66:66,83:83}],43:[function(t,n,r){var e=t(83)("iterator"),o=!1;try{var i=[7][e]();i["return"]=function(){o=!0},Array.from(i,function(){throw 2})}catch(u){}n.exports=function(t,n){if(!n&&!o)return!1;var r=!1;try{var i=[7],u=i[e]();u.next=function(){r=!0},i[e]=function(){return u},t(i)}catch(c){}return r}},{83:83}],44:[function(t,n,r){n.exports=function(t,n){return{value:n,done:!!t}}},{}],45:[function(t,n,r){n.exports={}},{}],46:[function(t,n,r){var e=Object;n.exports={create:e.create,getProto:e.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:e.getOwnPropertyDescriptor,setDesc:e.defineProperty,setDescs:e.defineProperties,getKeys:e.keys,getNames:e.getOwnPropertyNames,getSymbols:e.getOwnPropertySymbols,each:[].forEach}},{}],47:[function(t,n,r){var e=t(46),o=t(78);n.exports=function(t,n){for(var r,i=o(t),u=e.getKeys(i),c=u.length,a=0;c>a;)if(i[r=u[a++]]===n)return r}},{46:46,78:78}],48:[funct
 ion(t,n,r){n.exports=!1},{}],49:[function(t,n,r){n.exports=Math.expm1||function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}},{}],50:[function(t,n,r){n.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],51:[function(t,n,r){n.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],52:[function(t,n,r){var e,o,i,u=t(29),c=t(75).set,a=u.MutationObserver||u.WebKitMutationObserver,s=u.process,f=u.Promise,l="process"==t(11)(s),h=function(){var t,n,r;for(l&&(t=s.domain)&&(s.domain=null,t.exit());e;)n=e.domain,r=e.fn,n&&n.enter(),r(),n&&n.exit(),e=e.next;o=void 0,t&&t.enter()};if(l)i=function(){s.nextTick(h)};else if(a){var p=1,v=document.createTextNode("");new a(h).observe(v,{characterData:!0}),i=function(){v.data=p=-p}}else i=f&&f.resolve?function(){f.resolve().then(h)}:function(){c.call(u,h)};n.exports=function(t){var n={fn:t,next:void 0,domain:l&&s.domain};o&&(o.next=n),e||(e=n,i()),o=n}},{11:11,29:29,75:75}],53:[function
 (t,n,r){var e=t(46),o=t(80),i=t(34);n.exports=t(24)(function(){var t=Object.assign,n={},r={},e=Symbol(),o="abcdefghijklmnopqrst";return n[e]=7,o.split("").forEach(function(t){r[t]=t}),7!=t({},n)[e]||Object.keys(t({},r)).join("")!=o})?function(t,n){for(var r=o(t),u=arguments,c=u.length,a=1,s=e.getKeys,f=e.getSymbols,l=e.isEnum;c>a;)for(var h,p=i(u[a++]),v=f?s(p).concat(f(p)):s(p),g=v.length,y=0;g>y;)l.call(p,h=v[y++])&&(r[h]=p[h]);return r}:Object.assign},{24:24,34:34,46:46,80:80}],54:[function(t,n,r){var e=t(22),o=t(16),i=t(24);n.exports=function(t,n){var r=(o.Object||{})[t]||Object[t],u={};u[t]=n(r),e(e.S+e.F*i(function(){r(1)}),"Object",u)}},{16:16,22:22,24:24}],55:[function(t,n,r){var e=t(46),o=t(78),i=e.isEnum;n.exports=function(t){return function(n){for(var r,u=o(n),c=e.getKeys(u),a=c.length,s=0,f=[];a>s;)i.call(u,r=c[s++])&&f.push(t?[r,u[r]]:u[r]);return f}}},{46:46,78:78}],56:[function(t,n,r){var e=t(46),o=t(4),i=t(29).Reflect;n.exports=i&&i.ownKeys||function(t){var n=e.getNa
 mes(o(t)),r=e.getSymbols;return r?n.concat(r(t)):n}},{29:29,4:4,46:46}],57:[function(t,n,r){"use strict";var e=t(58),o=t(33),i=t(2);n.exports=function(){for(var t=i(this),n=arguments.length,r=Array(n),u=0,c=e._,a=!1;n>u;)(r[u]=arguments[u++])===c&&(a=!0);return function(){var e,i=this,u=arguments,s=u.length,f=0,l=0;if(!a&&!s)return o(t,r,i);if(e=r.slice(),a)for(;n>f;f++)e[f]===c&&(e[f]=u[l++]);for(;s>l;)e.push(u[l++]);return o(t,e,i)}}},{2:2,33:33,58:58}],58:[function(t,n,r){n.exports=t(29)},{29:29}],59:[function(t,n,r){n.exports=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}}},{}],60:[function(t,n,r){var e=t(61);n.exports=function(t,n){for(var r in n)e(t,r,n[r]);return t}},{61:61}],61:[function(t,n,r){var e=t(29),o=t(31),i=t(82)("src"),u="toString",c=Function[u],a=(""+c).split(u);t(16).inspectSource=function(t){return c.call(t)},(n.exports=function(t,n,r,u){"function"==typeof r&&(r.hasOwnProperty(i)||o(r,i,t[n]?""+t[n]:a.join(String(n))),r.hasOw
 nProperty("name")||o(r,"name",n)),t===e?t[n]=r:(u||delete t[n],o(t,n,r))})(Function.prototype,u,function(){return"function"==typeof this&&this[i]||c.call(this)})},{16:16,29:29,31:31,82:82}],62:[function(t,n,r){n.exports=function(t,n){var r=n===Object(n)?function(t){return n[t]}:n;return function(n){return String(n).replace(t,r)}}},{}],63:[function(t,n,r){n.exports=Object.is||function(t,n){return t===n?0!==t||1/t===1/n:t!=t&&n!=n}},{}],64:[function(t,n,r){var e=t(46).getDesc,o=t(38),i=t(4),u=function(t,n){if(i(t),!o(n)&&null!==n)throw TypeError(n+": can't set as prototype!")};n.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(n,r,o){try{o=t(17)(Function.call,e(Object.prototype,"__proto__").set,2),o(n,[]),r=!(n instanceof Array)}catch(i){r=!0}return function(t,n){return u(t,n),r?t.__proto__=n:o(t,n),t}}({},!1):void 0),check:u}},{17:17,38:38,4:4,46:46}],65:[function(t,n,r){"use strict";var e=t(29),o=t(46),i=t(19),u=t(83)("species");n.exports=function(t){var n=e[t];i&&n&&!n
 [u]&&o.setDesc(n,u,{configurable:!0,get:function(){return this}})}},{19:19,29:29,46:46,83:83}],66:[function(t,n,r){var e=t(46).setDesc,o=t(30),i=t(83)("toStringTag");n.exports=function(t,n,r){t&&!o(t=r?t:t.prototype,i)&&e(t,i,{configurable:!0,value:n})}},{30:30,46:46,83:83}],67:[function(t,n,r){var e=t(29),o="__core-js_shared__",i=e[o]||(e[o]={});n.exports=function(t){return i[t]||(i[t]={})}},{29:29}],68:[function(t,n,r){var e=t(4),o=t(2),i=t(83)("species");n.exports=function(t,n){var r,u=e(t).constructor;return void 0===u||void 0==(r=e(u)[i])?n:o(r)}},{2:2,4:4,83:83}],69:[function(t,n,r){n.exports=function(t,n,r){if(!(t instanceof n))throw TypeError(r+": use the 'new' operator!");return t}},{}],70:[function(t,n,r){var e=t(77),o=t(18);n.exports=function(t){return function(n,r){var i,u,c=String(o(n)),a=e(r),s=c.length;return 0>a||a>=s?t?"":void 0:(i=c.charCodeAt(a),55296>i||i>56319||a+1===s||(u=c.charCodeAt(a+1))<56320||u>57343?t?c.charAt(a):i:t?c.slice(a,a+2):(i-55296<<10)+(u-56320)
 +65536)}}},{18:18,77:77}],71:[function(t,n,r){var e=t(39),o=t(18);n.exports=function(t,n,r){if(e(n))throw TypeError("String#"+r+" doesn't accept regex!");return String(o(t))}},{18:18,39:39}],72:[function(t,n,r){var e=t(79),o=t(73),i=t(18);n.exports=function(t,n,r,u){var c=String(i(t)),a=c.length,s=void 0===r?" ":String(r),f=e(n);if(a>=f)return c;""==s&&(s=" ");var l=f-a,h=o.call(s,Math.ceil(l/s.length));return h.length>l&&(h=h.slice(0,l)),u?h+c:c+h}},{18:18,73:73,79:79}],73:[function(t,n,r){"use strict";var e=t(77),o=t(18);n.exports=function(t){var n=String(o(this)),r="",i=e(t);if(0>i||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(n+=n))1&i&&(r+=n);return r}},{18:18,77:77}],74:[function(t,n,r){var e=t(22),o=t(18),i=t(24),u="	\n\f\r   ᠎              \u2028\u2029\ufeff",c="["+u+"]",a="​…",s=RegExp("^"+c+c+"*"),f=RegExp(c+c+"*$"),l=function(t,n){var r={};r[t]=n(h),e(e.P+e.F*i(function(){return!!u[t]()||a[t]()!=a}),"String",r
 )},h=l.trim=function(t,n){return t=String(o(t)),1&n&&(t=t.replace(s,"")),2&n&&(t=t.replace(f,"")),t};n.exports=l},{18:18,22:22,24:24}],75:[function(t,n,r){var e,o,i,u=t(17),c=t(33),a=t(32),s=t(20),f=t(29),l=f.process,h=f.setImmediate,p=f.clearImmediate,v=f.MessageChannel,g=0,y={},d="onreadystatechange",m=function(){var t=+this;if(y.hasOwnProperty(t)){var n=y[t];delete y[t],n()}},S=function(t){m.call(t.data)};h&&p||(h=function(t){for(var n=[],r=1;arguments.length>r;)n.push(arguments[r++]);return y[++g]=function(){c("function"==typeof t?t:Function(t),n)},e(g),g},p=function(t){delete y[t]},"process"==t(11)(l)?e=function(t){l.nextTick(u(m,t,1))}:v?(o=new v,i=o.port2,o.port1.onmessage=S,e=u(i.postMessage,i,1)):f.addEventListener&&"function"==typeof postMessage&&!f.importScripts?(e=function(t){f.postMessage(t+"","*")},f.addEventListener("message",S,!1)):e=d in s("script")?function(t){a.appendChild(s("script"))[d]=function(){a.removeChild(this),m.call(t)}}:function(t){setTimeout(u(m,t,1),0
 )}),n.exports={set:h,clear:p}},{11:11,17:17,20:20,29:29,32:32,33:33}],76:[function(t,n,r){var e=t(77),o=Math.max,i=Math.min;n.exports=function(t,n){return t=e(t),0>t?o(t+n,0):i(t,n)}},{77:77}],77:[function(t,n,r){var e=Math.ceil,o=Math.floor;n.exports=function(t){return isNaN(t=+t)?0:(t>0?o:e)(t)}},{}],78:[function(t,n,r){var e=t(34),o=t(18);n.exports=function(t){return e(o(t))}},{18:18,34:34}],79:[function(t,n,r){var e=t(77),o=Math.min;n.exports=function(t){return t>0?o(e(t),9007199254740991):0}},{77:77}],80:[function(t,n,r){var e=t(18);n.exports=function(t){return Object(e(t))}},{18:18}],81:[function(t,n,r){var e=t(38);n.exports=function(t,n){if(!e(t))return t;var r,o;if(n&&"function"==typeof(r=t.toString)&&!e(o=r.call(t)))return o;if("function"==typeof(r=t.valueOf)&&!e(o=r.call(t)))return o;if(!n&&"function"==typeof(r=t.toString)&&!e(o=r.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},{38:38}],82:[function(t,n,r){var e=0,o=Math.random();n.exports=fu
 nction(t){return"Symbol(".concat(void 0===t?"":t,")_",(++e+o).toString(36))}},{}],83:[function(t,n,r){var e=t(67)("wks"),o=t(82),i=t(29).Symbol;n.exports=function(t){return e[t]||(e[t]=i&&i[t]||(i||o)("Symbol."+t))}},{29:29,67:67,82:82}],84:[function(t,n,r){var e=t(10),o=t(83)("iterator"),i=t(45);n.exports=t(16).getIteratorMethod=function(t){return void 0!=t?t[o]||t["@@iterator"]||i[e(t)]:void 0}},{10:10,16:16,45:45,83:83}],85:[function(t,n,r){"use strict";var e,o=t(46),i=t(22),u=t(19),c=t(59),a=t(32),s=t(20),f=t(30),l=t(11),h=t(33),p=t(24),v=t(4),g=t(2),y=t(38),d=t(80),m=t(78),S=t(77),b=t(76),w=t(79),x=t(34),_=t(82)("__proto__"),E=t(8),O=t(7)(!1),M=Object.prototype,P=Array.prototype,j=P.slice,N=P.join,F=o.setDesc,A=o.getDesc,D=o.setDescs,I={};u||(e=!p(function(){return 7!=F(s("div"),"a",{get:function(){return 7}}).a}),o.setDesc=function(t,n,r){if(e)try{return F(t,n,r)}catch(o){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(v(t)[n]=r.value),
 t},o.getDesc=function(t,n){if(e)try{return A(t,n)}catch(r){}return f(t,n)?c(!M.propertyIsEnumerable.call(t,n),t[n]):void 0},o.setDescs=D=function(t,n){v(t);for(var r,e=o.getKeys(n),i=e.length,u=0;i>u;)o.setDesc(t,r=e[u++],n[r]);return t}),i(i.S+i.F*!u,"Object",{getOwnPropertyDescriptor:o.getDesc,defineProperty:o.setDesc,defineProperties:D});var k="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),L=k.concat("length","prototype"),T=k.length,R=function(){var t,n=s("iframe"),r=T,e=">";for(n.style.display="none",a.appendChild(n),n.src="javascript:",t=n.contentWindow.document,t.open(),t.write("<script>document.F=Object</script"+e),t.close(),R=t.F;r--;)delete R.prototype[k[r]];return R()},C=function(t,n){return function(r){var e,o=m(r),i=0,u=[];for(e in o)e!=_&&f(o,e)&&u.push(e);for(;n>i;)f(o,e=t[i++])&&(~O(u,e)||u.push(e));return u}},G=function(){};i(i.S,"Object",{getPrototypeOf:o.getProto=o.getProto||function(t){return t=d(t),f(t,_
 )?t[_]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?M:null},getOwnPropertyNames:o.getNames=o.getNames||C(L,L.length,!0),create:o.create=o.create||function(t,n){var r;return null!==t?(G.prototype=v(t),r=new G,G.prototype=null,r[_]=t):r=R(),void 0===n?r:D(r,n)},keys:o.getKeys=o.getKeys||C(k,T,!1)});var W=function(t,n,r){if(!(n in I)){for(var e=[],o=0;n>o;o++)e[o]="a["+o+"]";I[n]=Function("F,a","return new F("+e.join(",")+")")}return I[n](t,r)};i(i.P,"Function",{bind:function(t){var n=g(this),r=j.call(arguments,1),e=function(){var o=r.concat(j.call(arguments));return this instanceof e?W(n,o.length,o):h(n,o,t)};return y(n.prototype)&&(e.prototype=n.prototype),e}}),i(i.P+i.F*p(function(){a&&j.call(a)}),"Array",{slice:function(t,n){var r=w(this.length),e=l(this);if(n=void 0===n?r:n,"Array"==e)return j.call(this,t,n);for(var o=b(t,r),i=b(n,r),u=w(i-o),c=Array(u),a=0;u>a;a++)c[a]="String"==e?this.charAt(o+a):this[o+a];return c}}),i
 (i.P+i.F*(x!=Object),"Array",{join:function(t){return N.call(x(this),void 0===t?",":t)}}),i(i.S,"Array",{isArray:t(36)});var U=function(t){return function(n,r){g(n);var e=x(this),o=w(e.length),i=t?o-1:0,u=t?-1:1;if(arguments.length<2)for(;;){if(i in e){r=e[i],i+=u;break}if(i+=u,t?0>i:i>=o)throw TypeError("Reduce of empty array with no initial value")}for(;t?i>=0:o>i;i+=u)i in e&&(r=n(r,e[i],i,this));return r}},K=function(t){return function(n){return t(this,n,arguments[1])}};i(i.P,"Array",{forEach:o.each=o.each||K(E(0)),map:K(E(1)),filter:K(E(2)),some:K(E(3)),every:K(E(4)),reduce:U(!1),reduceRight:U(!0),indexOf:K(O),lastIndexOf:function(t,n){var r=m(this),e=w(r.length),o=e-1;for(arguments.length>1&&(o=Math.min(o,S(n))),0>o&&(o=w(e+o));o>=0;o--)if(o in r&&r[o]===t)return o;return-1}}),i(i.S,"Date",{now:function(){return+new Date}});var z=function(t){return t>9?t:"0"+t};i(i.P+i.F*(p(function(){return"0385-07-25T07:06:39.999Z"!=new Date(-5e13-1).toISOString()})||!p(function(){new Date(N
 aN).toISOString()})),"Date",{toISOString:function(){if(!isFinite(this))throw RangeError("Invalid time value");var t=this,n=t.getUTCFullYear(),r=t.getUTCMilliseconds(),e=0>n?"-":n>9999?"+":"";return e+("00000"+Math.abs(n)).slice(e?-6:-4)+"-"+z(t.getUTCMonth()+1)+"-"+z(t.getUTCDate())+"T"+z(t.getUTCHours())+":"+z(t.getUTCMinutes())+":"+z(t.getUTCSeconds())+"."+(r>99?r:"0"+z(r))+"Z"}})},{11:11,19:19,2:2,20:20,22:22,24:24,30:30,32:32,33:33,34:34,36:36,38:38,4:4,46:46,59:59,7:7,76:76,77:77,78:78,79:79,8:8,80:80,82:82}],86:[function(t,n,r){var e=t(22);e(e.P,"Array",{copyWithin:t(5)}),t(3)("copyWithin")},{22:22,3:3,5:5}],87:[function(t,n,r){var e=t(22);e(e.P,"Array",{fill:t(6)}),t(3)("fill")},{22:22,3:3,6:6}],88:[function(t,n,r){"use strict";var e=t(22),o=t(8)(6),i="findIndex",u=!0;i in[]&&Array(1)[i](function(){u=!1}),e(e.P+e.F*u,"Array",{findIndex:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(i)},{22:22,3:3,8:8}],89:[function(t,n,r){"use strict";var e=t(22),
 o=t(8)(5),i="find",u=!0;i in[]&&Array(1)[i](function(){u=!1}),e(e.P+e.F*u,"Array",{find:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)(i)},{22:22,3:3,8:8}],90:[function(t,n,r){"use strict";var e=t(17),o=t(22),i=t(80),u=t(40),c=t(35),a=t(79),s=t(84);o(o.S+o.F*!t(43)(function(t){Array.from(t)}),"Array",{from:function(t){var n,r,o,f,l=i(t),h="function"==typeof this?this:Array,p=arguments,v=p.length,g=v>1?p[1]:void 0,y=void 0!==g,d=0,m=s(l);if(y&&(g=e(g,v>2?p[2]:void 0,2)),void 0==m||h==Array&&c(m))for(n=a(l.length),r=new h(n);n>d;d++)r[d]=y?g(l[d],d):l[d];else for(f=m.call(l),r=new h;!(o=f.next()).done;d++)r[d]=y?u(f,g,[o.value,d],!0):o.value;return r.length=d,r}})},{17:17,22:22,35:35,40:40,43:43,79:79,80:80,84:84}],91:[function(t,n,r){"use strict";var e=t(3),o=t(44),i=t(45),u=t(78);n.exports=t(42)(Array,"Array",function(t,n){this._t=u(t),this._i=0,this._k=n},function(){var t=this._t,n=this._k,r=this._i++;return!t||r>=t.length?(this._t=void 0,o(1)):"keys"==
 n?o(0,r):"values"==n?o(0,t[r]):o(0,[r,t[r]])},"values"),i.Arguments=i.Array,e("keys"),e("values"),e("entries")},{3:3,42:42,44:44,45:45,78:78}],92:[function(t,n,r){"use strict";var e=t(22);e(e.S+e.F*t(24)(function(){function t(){}return!(Array.of.call(t)instanceof t)}),"Array",{of:function(){for(var t=0,n=arguments,r=n.length,e=new("function"==typeof this?this:Array)(r);r>t;)e[t]=n[t++];return e.length=r,e}})},{22:22,24:24}],93:[function(t,n,r){t(65)("Array")},{65:65}],94:[function(t,n,r){"use strict";var e=t(46),o=t(38),i=t(83)("hasInstance"),u=Function.prototype;i in u||e.setDesc(u,i,{value:function(t){if("function"!=typeof this||!o(t))return!1;if(!o(this.prototype))return t instanceof this;for(;t=e.getProto(t);)if(this.prototype===t)return!0;return!1}})},{38:38,46:46,83:83}],95:[function(t,n,r){var e=t(46).setDesc,o=t(59),i=t(30),u=Function.prototype,c=/^\s*function ([^ (]*)/,a="name";a in u||t(19)&&e(u,a,{configurable:!0,get:function(){var t=(""+this).match(c),n=t?t[1]:"";return 
 i(this,a)||e(this,a,o(5,n)),n}})},{19:19,30:30,46:46,59:59}],96:[function(t,n,r){"use strict";var e=t(12);t(15)("Map",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){var n=e.getEntry(this,t);return n&&n.v},set:function(t,n){return e.def(this,0===t?0:t,n)}},e,!0)},{12:12,15:15}],97:[function(t,n,r){var e=t(22),o=t(50),i=Math.sqrt,u=Math.acosh;e(e.S+e.F*!(u&&710==Math.floor(u(Number.MAX_VALUE))),"Math",{acosh:function(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:o(t-1+i(t-1)*i(t+1))}})},{22:22,50:50}],98:[function(t,n,r){function e(t){return isFinite(t=+t)&&0!=t?0>t?-e(-t):Math.log(t+Math.sqrt(t*t+1)):t}var o=t(22);o(o.S,"Math",{asinh:e})},{22:22}],99:[function(t,n,r){var e=t(22);e(e.S,"Math",{atanh:function(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},{22:22}],100:[function(t,n,r){var e=t(22),o=t(51);e(e.S,"Math",{cbrt:function(t){return o(t=+t)*Math.pow(Math.abs(t),1/3)}})},{22:22,51:51}],101:[function(t,n
 ,r){var e=t(22);e(e.S,"Math",{clz32:function(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},{22:22}],102:[function(t,n,r){var e=t(22),o=Math.exp;e(e.S,"Math",{cosh:function(t){return(o(t=+t)+o(-t))/2}})},{22:22}],103:[function(t,n,r){var e=t(22);e(e.S,"Math",{expm1:t(49)})},{22:22,49:49}],104:[function(t,n,r){var e=t(22),o=t(51),i=Math.pow,u=i(2,-52),c=i(2,-23),a=i(2,127)*(2-c),s=i(2,-126),f=function(t){return t+1/u-1/u};e(e.S,"Math",{fround:function(t){var n,r,e=Math.abs(t),i=o(t);return s>e?i*f(e/s/c)*s*c:(n=(1+c/u)*e,r=n-(n-e),r>a||r!=r?i*(1/0):i*r)}})},{22:22,51:51}],105:[function(t,n,r){var e=t(22),o=Math.abs;e(e.S,"Math",{hypot:function(t,n){for(var r,e,i=0,u=0,c=arguments,a=c.length,s=0;a>u;)r=o(c[u++]),r>s?(e=s/r,i=i*e*e+1,s=r):r>0?(e=r/s,i+=e*e):i+=r;return s===1/0?1/0:s*Math.sqrt(i)}})},{22:22}],106:[function(t,n,r){var e=t(22),o=Math.imul;e(e.S+e.F*t(24)(function(){return-5!=o(4294967295,5)||2!=o.length}),"Math",{imul:function(t,n){var r=65535,e=+t,o=+n
 ,i=r&e,u=r&o;return 0|i*u+((r&e>>>16)*u+i*(r&o>>>16)<<16>>>0)}})},{22:22,24:24}],107:[function(t,n,r){var e=t(22);e(e.S,"Math",{log10:function(t){return Math.log(t)/Math.LN10}})},{22:22}],108:[function(t,n,r){var e=t(22);e(e.S,"Math",{log1p:t(50)})},{22:22,50:50}],109:[function(t,n,r){var e=t(22);e(e.S,"Math",{log2:function(t){return Math.log(t)/Math.LN2}})},{22:22}],110:[function(t,n,r){var e=t(22);e(e.S,"Math",{sign:t(51)})},{22:22,51:51}],111:[function(t,n,r){var e=t(22),o=t(49),i=Math.exp;e(e.S+e.F*t(24)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(t){return Math.abs(t=+t)<1?(o(t)-o(-t))/2:(i(t-1)-i(-t-1))*(Math.E/2)}})},{22:22,24:24,49:49}],112:[function(t,n,r){var e=t(22),o=t(49),i=Math.exp;e(e.S,"Math",{tanh:function(t){var n=o(t=+t),r=o(-t);return n==1/0?1:r==1/0?-1:(n-r)/(i(t)+i(-t))}})},{22:22,49:49}],113:[function(t,n,r){var e=t(22);e(e.S,"Math",{trunc:function(t){return(t>0?Math.floor:Math.ceil)(t)}})},{22:22}],114:[function(t,n,r){"use strict";var
  e=t(46),o=t(29),i=t(30),u=t(11),c=t(81),a=t(24),s=t(74).trim,f="Number",l=o[f],h=l,p=l.prototype,v=u(e.create(p))==f,g="trim"in String.prototype,y=function(t){
+var n=c(t,!1);if("string"==typeof n&&n.length>2){n=g?n.trim():s(n,3);var r,e,o,i=n.charCodeAt(0);if(43===i||45===i){if(r=n.charCodeAt(2),88===r||120===r)return NaN}else if(48===i){switch(n.charCodeAt(1)){case 66:case 98:e=2,o=49;break;case 79:case 111:e=8,o=55;break;default:return+n}for(var u,a=n.slice(2),f=0,l=a.length;l>f;f++)if(u=a.charCodeAt(f),48>u||u>o)return NaN;return parseInt(a,e)}}return+n};l(" 0o1")&&l("0b1")&&!l("+0x1")||(l=function(t){var n=arguments.length<1?0:t,r=this;return r instanceof l&&(v?a(function(){p.valueOf.call(r)}):u(r)!=f)?new h(y(n)):y(n)},e.each.call(t(19)?e.getNames(h):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),function(t){i(h,t)&&!i(l,t)&&e.setDesc(l,t,e.getDesc(h,t))}),l.prototype=p,p.constructor=l,t(61)(o,f,l))},{11:11,19:19,24:24,29:29,30:30,46:46,61:61,74:74,81:81}],115:[function(t,n,r){var e=t(22);e(e.S,"Numb
 er",{EPSILON:Math.pow(2,-52)})},{22:22}],116:[function(t,n,r){var e=t(22),o=t(29).isFinite;e(e.S,"Number",{isFinite:function(t){return"number"==typeof t&&o(t)}})},{22:22,29:29}],117:[function(t,n,r){var e=t(22);e(e.S,"Number",{isInteger:t(37)})},{22:22,37:37}],118:[function(t,n,r){var e=t(22);e(e.S,"Number",{isNaN:function(t){return t!=t}})},{22:22}],119:[function(t,n,r){var e=t(22),o=t(37),i=Math.abs;e(e.S,"Number",{isSafeInteger:function(t){return o(t)&&i(t)<=9007199254740991}})},{22:22,37:37}],120:[function(t,n,r){var e=t(22);e(e.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},{22:22}],121:[function(t,n,r){var e=t(22);e(e.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},{22:22}],122:[function(t,n,r){var e=t(22);e(e.S,"Number",{parseFloat:parseFloat})},{22:22}],123:[function(t,n,r){var e=t(22);e(e.S,"Number",{parseInt:parseInt})},{22:22}],124:[function(t,n,r){var e=t(22);e(e.S+e.F,"Object",{assign:t(53)})},{22:22,53:53}],125:[function(t,n,r){var e=t(38);t(54)("freeze",function(t
 ){return function(n){return t&&e(n)?t(n):n}})},{38:38,54:54}],126:[function(t,n,r){var e=t(78);t(54)("getOwnPropertyDescriptor",function(t){return function(n,r){return t(e(n),r)}})},{54:54,78:78}],127:[function(t,n,r){t(54)("getOwnPropertyNames",function(){return t(28).get})},{28:28,54:54}],128:[function(t,n,r){var e=t(80);t(54)("getPrototypeOf",function(t){return function(n){return t(e(n))}})},{54:54,80:80}],129:[function(t,n,r){var e=t(38);t(54)("isExtensible",function(t){return function(n){return e(n)?t?t(n):!0:!1}})},{38:38,54:54}],130:[function(t,n,r){var e=t(38);t(54)("isFrozen",function(t){return function(n){return e(n)?t?t(n):!1:!0}})},{38:38,54:54}],131:[function(t,n,r){var e=t(38);t(54)("isSealed",function(t){return function(n){return e(n)?t?t(n):!1:!0}})},{38:38,54:54}],132:[function(t,n,r){var e=t(22);e(e.S,"Object",{is:t(63)})},{22:22,63:63}],133:[function(t,n,r){var e=t(80);t(54)("keys",function(t){return function(n){return t(e(n))}})},{54:54,80:80}],134:[function(t,n,
 r){var e=t(38);t(54)("preventExtensions",function(t){return function(n){return t&&e(n)?t(n):n}})},{38:38,54:54}],135:[function(t,n,r){var e=t(38);t(54)("seal",function(t){return function(n){return t&&e(n)?t(n):n}})},{38:38,54:54}],136:[function(t,n,r){var e=t(22);e(e.S,"Object",{setPrototypeOf:t(64).set})},{22:22,64:64}],137:[function(t,n,r){"use strict";var e=t(10),o={};o[t(83)("toStringTag")]="z",o+""!="[object z]"&&t(61)(Object.prototype,"toString",function(){return"[object "+e(this)+"]"},!0)},{10:10,61:61,83:83}],138:[function(t,n,r){"use strict";var e,o=t(46),i=t(48),u=t(29),c=t(17),a=t(10),s=t(22),f=t(38),l=t(4),h=t(2),p=t(69),v=t(27),g=t(64).set,y=t(63),d=t(83)("species"),m=t(68),S=t(52),b="Promise",w=u.process,x="process"==a(w),_=u[b],E=function(t){var n=new _(function(){});return t&&(n.constructor=Object),_.resolve(n)===n},O=function(){function n(t){var r=new _(t);return g(r,n.prototype),r}var r=!1;try{if(r=_&&_.resolve&&E(),g(n,_),n.prototype=o.create(_.prototype,{construc
 tor:{value:n}}),n.resolve(5).then(function(){})instanceof n||(r=!1),r&&t(19)){var e=!1;_.resolve(o.setDesc({},"then",{get:function(){e=!0}})),r=e}}catch(i){r=!1}return r}(),M=function(t,n){return i&&t===_&&n===e?!0:y(t,n)},P=function(t){var n=l(t)[d];return void 0!=n?n:t},j=function(t){var n;return f(t)&&"function"==typeof(n=t.then)?n:!1},N=function(t){var n,r;this.promise=new t(function(t,e){if(void 0!==n||void 0!==r)throw TypeError("Bad Promise constructor");n=t,r=e}),this.resolve=h(n),this.reject=h(r)},F=function(t){try{t()}catch(n){return{error:n}}},A=function(t,n){if(!t.n){t.n=!0;var r=t.c;S(function(){for(var e=t.v,o=1==t.s,i=0,c=function(n){var r,i,u=o?n.ok:n.fail,c=n.resolve,a=n.reject;try{u?(o||(t.h=!0),r=u===!0?e:u(e),r===n.promise?a(TypeError("Promise-chain cycle")):(i=j(r))?i.call(r,c,a):c(r)):a(e)}catch(s){a(s)}};r.length>i;)c(r[i++]);r.length=0,t.n=!1,n&&setTimeout(function(){var n,r,o=t.p;D(o)&&(x?w.emit("unhandledRejection",e,o):(n=u.onunhandledrejection)?n({promise:
 o,reason:e}):(r=u.console)&&r.error&&r.error("Unhandled promise rejection",e)),t.a=void 0},1)})}},D=function(t){var n,r=t._d,e=r.a||r.c,o=0;if(r.h)return!1;for(;e.length>o;)if(n=e[o++],n.fail||!D(n.promise))return!1;return!0},I=function(t){var n=this;n.d||(n.d=!0,n=n.r||n,n.v=t,n.s=2,n.a=n.c.slice(),A(n,!0))},k=function(t){var n,r=this;if(!r.d){r.d=!0,r=r.r||r;try{if(r.p===t)throw TypeError("Promise can't be resolved itself");(n=j(t))?S(function(){var e={r:r,d:!1};try{n.call(t,c(k,e,1),c(I,e,1))}catch(o){I.call(e,o)}}):(r.v=t,r.s=1,A(r,!1))}catch(e){I.call({r:r,d:!1},e)}}};O||(_=function(t){h(t);var n=this._d={p:p(this,_,b),c:[],a:void 0,s:0,d:!1,v:void 0,h:!1,n:!1};try{t(c(k,n,1),c(I,n,1))}catch(r){I.call(n,r)}},t(60)(_.prototype,{then:function(t,n){var r=new N(m(this,_)),e=r.promise,o=this._d;return r.ok="function"==typeof t?t:!0,r.fail="function"==typeof n&&n,o.c.push(r),o.a&&o.a.push(r),o.s&&A(o,!1),e},"catch":function(t){return this.then(void 0,t)}})),s(s.G+s.W+s.F*!O,{Promise:
 _}),t(66)(_,b),t(65)(b),e=t(16)[b],s(s.S+s.F*!O,b,{reject:function(t){var n=new N(this),r=n.reject;return r(t),n.promise}}),s(s.S+s.F*(!O||E(!0)),b,{resolve:function(t){if(t instanceof _&&M(t.constructor,this))return t;var n=new N(this),r=n.resolve;return r(t),n.promise}}),s(s.S+s.F*!(O&&t(43)(function(t){_.all(t)["catch"](function(){})})),b,{all:function(t){var n=P(this),r=new N(n),e=r.resolve,i=r.reject,u=[],c=F(function(){v(t,!1,u.push,u);var r=u.length,c=Array(r);r?o.each.call(u,function(t,o){var u=!1;n.resolve(t).then(function(t){u||(u=!0,c[o]=t,--r||e(c))},i)}):e(c)});return c&&i(c.error),r.promise},race:function(t){var n=P(this),r=new N(n),e=r.reject,o=F(function(){v(t,!1,function(t){n.resolve(t).then(r.resolve,e)})});return o&&e(o.error),r.promise}})},{10:10,16:16,17:17,19:19,2:2,22:22,27:27,29:29,38:38,4:4,43:43,46:46,48:48,52:52,60:60,63:63,64:64,65:65,66:66,68:68,69:69,83:83}],139:[function(t,n,r){var e=t(22),o=Function.apply;e(e.S,"Reflect",{apply:function(t,n,r){return 
 o.call(t,n,r)}})},{22:22}],140:[function(t,n,r){var e=t(46),o=t(22),i=t(2),u=t(4),c=t(38),a=Function.bind||t(16).Function.prototype.bind;o(o.S+o.F*t(24)(function(){function t(){}return!(Reflect.construct(function(){},[],t)instanceof t)}),"Reflect",{construct:function(t,n){i(t);var r=arguments.length<3?t:i(arguments[2]);if(t==r){if(void 0!=n)switch(u(n).length){case 0:return new t;case 1:return new t(n[0]);case 2:return new t(n[0],n[1]);case 3:return new t(n[0],n[1],n[2]);case 4:return new t(n[0],n[1],n[2],n[3])}var o=[null];return o.push.apply(o,n),new(a.apply(t,o))}var s=r.prototype,f=e.create(c(s)?s:Object.prototype),l=Function.apply.call(t,f,n);return c(l)?l:f}})},{16:16,2:2,22:22,24:24,38:38,4:4,46:46}],141:[function(t,n,r){var e=t(46),o=t(22),i=t(4);o(o.S+o.F*t(24)(function(){Reflect.defineProperty(e.setDesc({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function(t,n,r){i(t);try{return e.setDesc(t,n,r),!0}catch(o){return!1}}})},{22:22,24:24,4:4,46:46}],142:[function(t
 ,n,r){var e=t(22),o=t(46).getDesc,i=t(4);e(e.S,"Reflect",{deleteProperty:function(t,n){var r=o(i(t),n);return r&&!r.configurable?!1:delete t[n]}})},{22:22,4:4,46:46}],143:[function(t,n,r){"use strict";var e=t(22),o=t(4),i=function(t){this._t=o(t),this._i=0;var n,r=this._k=[];for(n in t)r.push(n)};t(41)(i,"Object",function(){var t,n=this,r=n._k;do if(n._i>=r.length)return{value:void 0,done:!0};while(!((t=r[n._i++])in n._t));return{value:t,done:!1}}),e(e.S,"Reflect",{enumerate:function(t){return new i(t)}})},{22:22,4:4,41:41}],144:[function(t,n,r){var e=t(46),o=t(22),i=t(4);o(o.S,"Reflect",{getOwnPropertyDescriptor:function(t,n){return e.getDesc(i(t),n)}})},{22:22,4:4,46:46}],145:[function(t,n,r){var e=t(22),o=t(46).getProto,i=t(4);e(e.S,"Reflect",{getPrototypeOf:function(t){return o(i(t))}})},{22:22,4:4,46:46}],146:[function(t,n,r){function e(t,n){var r,u,s=arguments.length<3?t:arguments[2];return a(t)===s?t[n]:(r=o.getDesc(t,n))?i(r,"value")?r.value:void 0!==r.get?r.get.call(s):void
  0:c(u=o.getProto(t))?e(u,n,s):void 0}var o=t(46),i=t(30),u=t(22),c=t(38),a=t(4);u(u.S,"Reflect",{get:e})},{22:22,30:30,38:38,4:4,46:46}],147:[function(t,n,r){var e=t(22);e(e.S,"Reflect",{has:function(t,n){return n in t}})},{22:22}],148:[function(t,n,r){var e=t(22),o=t(4),i=Object.isExtensible;e(e.S,"Reflect",{isExtensible:function(t){return o(t),i?i(t):!0}})},{22:22,4:4}],149:[function(t,n,r){var e=t(22);e(e.S,"Reflect",{ownKeys:t(56)})},{22:22,56:56}],150:[function(t,n,r){var e=t(22),o=t(4),i=Object.preventExtensions;e(e.S,"Reflect",{preventExtensions:function(t){o(t);try{return i&&i(t),!0}catch(n){return!1}}})},{22:22,4:4}],151:[function(t,n,r){var e=t(22),o=t(64);o&&e(e.S,"Reflect",{setPrototypeOf:function(t,n){o.check(t,n);try{return o.set(t,n),!0}catch(r){return!1}}})},{22:22,64:64}],152:[function(t,n,r){function e(t,n,r){var u,f,l=arguments.length<4?t:arguments[3],h=o.getDesc(a(t),n);if(!h){if(s(f=o.getProto(t)))return e(f,n,r,l);h=c(0)}return i(h,"value")?h.writable!==!1&&s(
 l)?(u=o.getDesc(l,n)||c(0),u.value=r,o.setDesc(l,n,u),!0):!1:void 0===h.set?!1:(h.set.call(l,r),!0)}var o=t(46),i=t(30),u=t(22),c=t(59),a=t(4),s=t(38);u(u.S,"Reflect",{set:e})},{22:22,30:30,38:38,4:4,46:46,59:59}],153:[function(t,n,r){var e=t(46),o=t(29),i=t(39),u=t(26),c=o.RegExp,a=c,s=c.prototype,f=/a/g,l=/a/g,h=new c(f)!==f;!t(19)||h&&!t(24)(function(){return l[t(83)("match")]=!1,c(f)!=f||c(l)==l||"/a/i"!=c(f,"i")})||(c=function(t,n){var r=i(t),e=void 0===n;return this instanceof c||!r||t.constructor!==c||!e?h?new a(r&&!e?t.source:t,n):a((r=t instanceof c)?t.source:t,r&&e?u.call(t):n):t},e.each.call(e.getNames(a),function(t){t in c||e.setDesc(c,t,{configurable:!0,get:function(){return a[t]},set:function(n){a[t]=n}})}),s.constructor=c,c.prototype=s,t(61)(o,"RegExp",c)),t(65)("RegExp")},{19:19,24:24,26:26,29:29,39:39,46:46,61:61,65:65,83:83}],154:[function(t,n,r){var e=t(46);t(19)&&"g"!=/./g.flags&&e.setDesc(RegExp.prototype,"flags",{configurable:!0,get:t(26)})},{19:19,26:26,46:46}
 ],155:[function(t,n,r){t(25)("match",1,function(t,n){return function(r){"use strict";var e=t(this),o=void 0==r?void 0:r[n];return void 0!==o?o.call(r,e):new RegExp(r)[n](String(e))}})},{25:25}],156:[function(t,n,r){t(25)("replace",2,function(t,n,r){return function(e,o){"use strict";var i=t(this),u=void 0==e?void 0:e[n];return void 0!==u?u.call(e,i,o):r.call(String(i),e,o)}})},{25:25}],157:[function(t,n,r){t(25)("search",1,function(t,n){return function(r){"use strict";var e=t(this),o=void 0==r?void 0:r[n];return void 0!==o?o.call(r,e):new RegExp(r)[n](String(e))}})},{25:25}],158:[function(t,n,r){t(25)("split",2,function(t,n,r){return function(e,o){"use strict";var i=t(this),u=void 0==e?void 0:e[n];return void 0!==u?u.call(e,i,o):r.call(String(i),e,o)}})},{25:25}],159:[function(t,n,r){"use strict";var e=t(12);t(15)("Set",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return e.def(this,t=0===t?0:t,t)}},e)},{12:12,15:15}],160:[func
 tion(t,n,r){"use strict";var e=t(22),o=t(70)(!1);e(e.P,"String",{codePointAt:function(t){return o(this,t)}})},{22:22,70:70}],161:[function(t,n,r){"use strict";var e=t(22),o=t(79),i=t(71),u="endsWith",c=""[u];e(e.P+e.F*t(23)(u),"String",{endsWith:function(t){var n=i(this,t,u),r=arguments,e=r.length>1?r[1]:void 0,a=o(n.length),s=void 0===e?a:Math.min(o(e),a),f=String(t);return c?c.call(n,f,s):n.slice(s-f.length,s)===f}})},{22:22,23:23,71:71,79:79}],162:[function(t,n,r){var e=t(22),o=t(76),i=String.fromCharCode,u=String.fromCodePoint;e(e.S+e.F*(!!u&&1!=u.length),"String",{fromCodePoint:function(t){for(var n,r=[],e=arguments,u=e.length,c=0;u>c;){if(n=+e[c++],o(n,1114111)!==n)throw RangeError(n+" is not a valid code point");r.push(65536>n?i(n):i(((n-=65536)>>10)+55296,n%1024+56320))}return r.join("")}})},{22:22,76:76}],163:[function(t,n,r){"use strict";var e=t(22),o=t(71),i="includes";e(e.P+e.F*t(23)(i),"String",{includes:function(t){return!!~o(this,t,i).indexOf(t,arguments.length>1?argu
 ments[1]:void 0)}})},{22:22,23:23,71:71}],164:[function(t,n,r){"use strict";var e=t(70)(!0);t(42)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,n=this._t,r=this._i;return r>=n.length?{value:void 0,done:!0}:(t=e(n,r),this._i+=t.length,{value:t,done:!1})})},{42:42,70:70}],165:[function(t,n,r){var e=t(22),o=t(78),i=t(79);e(e.S,"String",{raw:function(t){for(var n=o(t.raw),r=i(n.length),e=arguments,u=e.length,c=[],a=0;r>a;)c.push(String(n[a++])),u>a&&c.push(String(e[a]));return c.join("")}})},{22:22,78:78,79:79}],166:[function(t,n,r){var e=t(22);e(e.P,"String",{repeat:t(73)})},{22:22,73:73}],167:[function(t,n,r){"use strict";var e=t(22),o=t(79),i=t(71),u="startsWith",c=""[u];e(e.P+e.F*t(23)(u),"String",{startsWith:function(t){var n=i(this,t,u),r=arguments,e=o(Math.min(r.length>1?r[1]:void 0,n.length)),a=String(t);return c?c.call(n,a,e):n.slice(e,e+a.length)===a}})},{22:22,23:23,71:71,79:79}],168:[function(t,n,r){"use strict";t(74)("trim",function(t){return fun
 ction(){return t(this,3)}})},{74:74}],169:[function(t,n,r){"use strict";var e=t(46),o=t(29),i=t(30),u=t(19),c=t(22),a=t(61),s=t(24),f=t(67),l=t(66),h=t(82),p=t(83),v=t(47),g=t(28),y=t(21),d=t(36),m=t(4),S=t(78),b=t(59),w=e.getDesc,x=e.setDesc,_=e.create,E=g.get,O=o.Symbol,M=o.JSON,P=M&&M.stringify,j=!1,N=p("_hidden"),F=e.isEnum,A=f("symbol-registry"),D=f("symbols"),I="function"==typeof O,k=Object.prototype,L=u&&s(function(){return 7!=_(x({},"a",{get:function(){return x(this,"a",{value:7}).a}})).a})?function(t,n,r){var e=w(k,n);e&&delete k[n],x(t,n,r),e&&t!==k&&x(k,n,e)}:x,T=function(t){var n=D[t]=_(O.prototype);return n._k=t,u&&j&&L(k,t,{configurable:!0,set:function(n){i(this,N)&&i(this[N],t)&&(this[N][t]=!1),L(this,t,b(1,n))}}),n},R=function(t){return"symbol"==typeof t},C=function(t,n,r){return r&&i(D,n)?(r.enumerable?(i(t,N)&&t[N][n]&&(t[N][n]=!1),r=_(r,{enumerable:b(0,!1)})):(i(t,N)||x(t,N,b(1,{})),t[N][n]=!0),L(t,n,r)):x(t,n,r)},G=function(t,n){m(t);for(var r,e=y(n=S(n)),o=0,i=e
 .length;i>o;)C(t,r=e[o++],n[r]);return t},W=function(t,n){return void 0===n?_(t):G(_(t),n)},U=function(t){var n=F.call(this,t);return n||!i(this,t)||!i(D,t)||i(this,N)&&this[N][t]?n:!0},K=function(t,n){var r=w(t=S(t),n);return!r||!i(D,n)||i(t,N)&&t[N][n]||(r.enumerable=!0),r},z=function(t){for(var n,r=E(S(t)),e=[],o=0;r.length>o;)i(D,n=r[o++])||n==N||e.push(n);return e},q=function(t){for(var n,r=E(S(t)),e=[],o=0;r.length>o;)i(D,n=r[o++])&&e.push(D[n]);return e},J=function(t){if(void 0!==t&&!R(t)){for(var n,r,e=[t],o=1,i=arguments;i.length>o;)e.push(i[o++]);return n=e[1],"function"==typeof n&&(r=n),(r||!d(n))&&(n=function(t,n){return r&&(n=r.call(this,t,n)),R(n)?void 0:n}),e[1]=n,P.apply(M,e)}},B=s(function(){var t=O();return"[null]"!=P([t])||"{}"!=P({a:t})||"{}"!=P(Object(t))});I||(O=function(){if(R(this))throw TypeError("Symbol is not a constructor");return T(h(arguments.length>0?arguments[0]:void 0))},a(O.prototype,"toString",function(){return this._k}),R=function(t){return t inst
 anceof O},e.create=W,e.isEnum=U,e.getDesc=K,e.setDesc=C,e.setDescs=G,e.getNames=g.get=z,e.getSymbols=q,u&&!t(48)&&a(k,"propertyIsEnumerable",U,!0));var V={"for":function(t){return i(A,t+="")?A[t]:A[t]=O(t)},keyFor:function(t){return v(A,t)},useSetter:function(){j=!0},useSimple:function(){j=!1}};e.each.call("hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),function(t){var n=p(t);V[t]=I?n:T(n)}),j=!0,c(c.G+c.W,{Symbol:O}),c(c.S,"Symbol",V),c(c.S+c.F*!I,"Object",{create:W,defineProperty:C,defineProperties:G,getOwnPropertyDescriptor:K,getOwnPropertyNames:z,getOwnPropertySymbols:q}),M&&c(c.S+c.F*(!I||B),"JSON",{stringify:J}),l(O,"Symbol"),l(Math,"Math",!0),l(o.JSON,"JSON",!0)},{19:19,21:21,22:22,24:24,28:28,29:29,30:30,36:36,4:4,46:46,47:47,48:48,59:59,61:61,66:66,67:67,78:78,82:82,83:83}],170:[function(t,n,r){"use strict";var e=t(46),o=t(61),i=t(14),u=t(38),c=t(30),a=i.frozenStore,s=i.WEAK,f=Object.isExtensible||u
 ,l={},h=t(15)("WeakMap",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{get:function(t){if(u(t)){if(!f(t))return a(this).get(t);if(c(t,s))return t[s][this._i]}},set:function(t,n){return i.def(this,t,n)}},i,!0,!0);7!=(new h).set((Object.freeze||Object)(l),7).get(l)&&e.each.call(["delete","has","get","set"],function(t){var n=h.prototype,r=n[t];o(n,t,function(n,e){if(u(n)&&!f(n)){var o=a(this)[t](n,e);return"set"==t?this:o}return r.call(this,n,e)})})},{14:14,15:15,30:30,38:38,46:46,61:61}],171:[function(t,n,r){"use strict";var e=t(14);t(15)("WeakSet",function(t){return function(){return t(this,arguments.length>0?arguments[0]:void 0)}},{add:function(t){return e.def(this,t,!0)}},e,!1,!0)},{14:14,15:15}],172:[function(t,n,r){"use strict";var e=t(22),o=t(7)(!0);e(e.P,"Array",{includes:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0)}}),t(3)("includes")},{22:22,3:3,7:7}],173:[function(t,n,r){var e=t(22);e(e.P,"Map",{toJSON:t(13)("Map
 ")})},{13:13,22:22}],174:[function(t,n,r){var e=t(22),o=t(55)(!0);e(e.S,"Object",{entries:function(t){return o(t)}})},{22:22,55:55}],175:[function(t,n,r){var e=t(46),o=t(22),i=t(56),u=t(78),c=t(59);o(o.S,"Object",{getOwnPropertyDescriptors:function(t){for(var n,r,o=u(t),a=e.setDesc,s=e.getDesc,f=i(o),l={},h=0;f.length>h;)r=s(o,n=f[h++]),n in l?a(l,n,c(0,r)):l[n]=r;return l}})},{22:22,46:46,56:56,59:59,78:78}],176:[function(t,n,r){var e=t(22),o=t(55)(!1);e(e.S,"Object",{values:function(t){return o(t)}})},{22:22,55:55}],177:[function(t,n,r){var e=t(22),o=t(62)(/[\\^$*+?.()|[\]{}]/g,"\\$&");e(e.S,"RegExp",{escape:function(t){return o(t)}})},{22:22,62:62}],178:[function(t,n,r){var e=t(22);e(e.P,"Set",{toJSON:t(13)("Set")})},{13:13,22:22}],179:[function(t,n,r){"use strict";var e=t(22),o=t(70)(!0);e(e.P,"String",{at:function(t){return o(this,t)}})},{22:22,70:70}],180:[function(t,n,r){"use strict";var e=t(22),o=t(72);e(e.P,"String",{padLeft:function(t){return o(this,t,arguments.length>1?ar
 guments[1]:void 0,!0)}})},{22:22,72:72}],181:[function(t,n,r){"use strict";var e=t(22),o=t(72);e(e.P,"String",{padRight:function(t){return o(this,t,arguments.length>1?arguments[1]:void 0,!1)}})},{22:22,72:72}],182:[function(t,n,r){"use strict";t(74)("trimLeft",function(t){return function(){return t(this,1)}})},{74:74}],183:[function(t,n,r){"use strict";t(74)("trimRight",function(t){return function(){return t(this,2)}})},{74:74}],184:[function(t,n,r){var e=t(46),o=t(22),i=t(17),u=t(16).Array||Array,c={},a=function(t,n){e.each.call(t.split(","),function(t){void 0==n&&t in u?c[t]=u[t]:t in[]&&(c[t]=i(Function.call,[][t],n))})};a("pop,reverse,shift,keys,values,entries",1),a("indexOf,every,some,forEach,map,filter,find,findIndex,includes",3),a("join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill"),o(o.S,"Array",c)},{16:16,17:17,22:22,46:46}],185:[function(t,n,r){t(91);var e=t(29),o=t(31),i=t(45),u=t(83)("iterator"),c=e.NodeList,a=e.HTMLCollection,s=c&
 &c.prototype,f=a&&a.prototype,l=i.NodeList=i.HTMLCollection=i.Array;s&&!s[u]&&o(s,u,l),f&&!f[u]&&o(f,u,l)},{29:29,31:31,45:45,83:83,91:91}],186:[function(t,n,r){var e=t(22),o=t(75);e(e.G+e.B,{setImmediate:o.set,clearImmediate:o.clear})},{22:22,75:75}],187:[function(t,n,r){var e=t(29),o=t(22),i=t(33),u=t(57),c=e.navigator,a=!!c&&/MSIE .\./.test(c.userAgent),s=function(t){return a?function(n,r){return t(i(u,[].slice.call(arguments,2),"function"==typeof n?n:Function(n)),r)}:t};o(o.G+o.B+o.F*a,{setTimeout:s(e.setTimeout),setInterval:s(e.setInterval)})},{22:22,29:29,33:33,57:57}],188:[function(t,n,r){t(85),t(169),t(124),t(132),t(136),t(137),t(125),t(135),t(134),t(130),t(131),t(129),t(126),t(128),t(133),t(127),t(95),t(94),t(114),t(115),t(116),t(117),t(118),t(119),t(120),t(121),t(122),t(123),t(97),t(98),t(99),t(100),t(101),t(102),t(103),t(104),t(105),t(106),t(107),t(108),t(109),t(110),t(111),t(112),t(113),t(162),t(165),t(168),t(164),t(160),t(161),t(163),t(166),t(167),t(90),t(92),t(91),t(93
 ),t(86),t(87),t(89),t(88),t(153),t(154),t(155),t(156),t(157),t(158),t(138),t(96),t(159),t(170),t(171),t(139),t(140),t(141),t(142),t(143),t(146),t(144),t(145),t(147),t(148),t(149),t(150),t(152),t(151),t(172),t(179),t(180),t(181),t(182),t(183),t(177),t(175),t(176),t(174),t(173),t(178),t(184),t(187),t(186),t(185),n.exports=t(16)},{100:100,101:101,102:102,103:103,104:104,105:105,106:106,107:107,108:108,109:109,110:110,111:111,112:112,113:113,114:114,115:115,116:116,117:117,118:118,119:119,120:120,121:121,122:122,123:123,124:124,125:125,126:126,127:127,128:128,129:129,130:130,131:131,132:132,133:133,134:134,135:135,136:136,137:137,138:138,139:139,140:140,141:141,142:142,143:143,144:144,145:145,146:146,147:147,148:148,149:149,150:150,151:151,152:152,153:153,154:154,155:155,156:156,157:157,158:158,159:159,16:16,160:160,161:161,162:162,163:163,164:164,165:165,166:166,167:167,168:168,169:169,170:170,171:171,172:172,173:173,174:174,175:175,176:176,177:177,178:178,179:179,180:180,181:181,182:1
 82,183:183,184:184,185:185,186:186,187:187,85:85,86:86,87:87,88:88,89:89,90:90,91:91,92:92,93:93,94:94,95:95,96:96,97:97,98:98,99:99}],189:[function(t,n,r){(function(t){!function(t){"use strict";function r(t,n,r,e){var i=Object.create((n||o).prototype),u=new p(e||[]);return i._invoke=f(t,r,u),i}function e(t,n,r){try{return{type:"normal",arg:t.call(n,r)}}catch(e){return{type:"throw",arg:e}}}function o(){}function i(){}function u(){}function c(t){["next","throw","return"].forEach(function(n){t[n]=function(t){return this._invoke(n,t)}})}function a(t){this.arg=t}function s(t){function n(n,r){var e=t[n](r),u=e.value;return u instanceof a?Promise.resolve(u.arg).then(o,i):Promise.resolve(u).then(function(t){return e.value=t,e})}function r(t,r){function o(){return n(t,r)}return e=e?e.then(o,o):new Promise(function(t){t(o())})}"object"==typeof process&&process.domain&&(n=process.domain.bind(n));var e,o=n.bind(t,"next"),i=n.bind(t,"throw");n.bind(t,"return");this._invoke=r}function f(t,n,r){v
 ar o=w;return function(i,u){if(o===_)throw new Error("Generator is already running");if(o===E){if("throw"===i)throw u;return g()}for(;;){var c=r.delegate;if(c){if("return"===i||"throw"===i&&c.iterator[i]===y){r.delegate=null;var a=c.iterator["return"];if(a){var s=e(a,c.iterator,u);if("throw"===s.type){i="throw",u=s.arg;continue}}if("return"===i)continue}var s=e(c.iterator[i],c.iterator,u);if("throw"===s.type){r.delegate=null,i="throw",u=s.arg;continue}i="next",u=y;var f=s.arg;if(!f.done)return o=x,f;r[c.resultName]=f.value,r.next=c.nextLoc,r.delegate=null}if("next"===i)o===x?r.sent=u:r.sent=y;else if("throw"===i){if(o===w)throw o=E,u;r.dispatchException(u)&&(i="next",u=y)}else"return"===i&&r.abrupt("return",u);o=_;var s=e(t,n,r);if("normal"===s.type){o=r.done?E:x;var f={value:s.arg,done:r.done};if(s.arg!==O)return f;r.delegate&&"next"===i&&(u=y)}else"throw"===s.type&&(o=E,i="throw",u=s.arg)}}}function l(t){var n={tryLoc:t[0]};1 in t&&(n.catchLoc=t[1]),2 in t&&(n.finallyLoc=t[2],n.af
 terLoc=t[3]),this.tryEntries.push(n)}function h(t){var n=t.completion||{};n.type="normal",delete n.arg,t.completion=n}function p(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(l,this),this.reset(!0)}function v(t){if(t){var n=t[m];if(n)return n.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var r=-1,e=function o(){for(;++r<t.length;)if(d.call(t,r))return o.value=t[r],o.done=!1,o;return o.value=y,o.done=!0,o};return e.next=e}}return{next:g}}function g(){return{value:y,done:!0}}var y,d=Object.prototype.hasOwnProperty,m="function"==typeof Symbol&&Symbol.iterator||"@@iterator",S="object"==typeof n,b=t.regeneratorRuntime;if(b)return void(S&&(n.exports=b));b=t.regeneratorRuntime=S?n.exports:{},b.wrap=r;var w="suspendedStart",x="suspendedYield",_="executing",E="completed",O={},M=u.prototype=o.prototype;i.prototype=M.constructor=u,u.constructor=i,i.displayName="GeneratorFunction",b.isGeneratorFunction=function(t){var n="function"==typeof t&&t.constructor;return n?n===i||"
 GeneratorFunction"===(n.displayName||n.name):!1},b.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,u):t.__proto__=u,t.prototype=Object.create(M),t},b.awrap=function(t){return new a(t)},c(s.prototype),b.async=function(t,n,e,o){var i=new s(r(t,n,e,o));return b.isGeneratorFunction(n)?i:i.next().then(function(t){return t.done?t.value:i.next()})},c(M),M[m]=function(){return this},M.toString=function(){return"[object Generator]"},b.keys=function(t){var n=[];for(var r in t)n.push(r);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},b.values=v,p.prototype={constructor:p,reset:function(t){if(this.prev=0,this.next=0,this.sent=y,this.done=!1,this.delegate=null,this.tryEntries.forEach(h),!t)for(var n in this)"t"===n.charAt(0)&&d.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=y)},stop:function(){this.done=!0;var t=this.tryEntries[0],n=t.completion;if("throw"===n.type)throw n.arg;return this.rval},dispatchE
 xception:function(t){function n(n,e){return i.type="throw",i.arg=t,r.next=n,!!e}if(this.done)throw t;for(var r=this,e=this.tryEntries.length-1;e>=0;--e){var o=this.tryEntries[e],i=o.completion;if("root"===o.tryLoc)return n("end");if(o.tryLoc<=this.prev){var u=d.call(o,"catchLoc"),c=d.call(o,"finallyLoc");if(u&&c){if(this.prev<o.catchLoc)return n(o.catchLoc,!0);if(this.prev<o.finallyLoc)return n(o.finallyLoc)}else if(u){if(this.prev<o.catchLoc)return n(o.catchLoc,!0)}else{if(!c)throw new Error("try statement without catch or finally");if(this.prev<o.finallyLoc)return n(o.finallyLoc)}}}},abrupt:function(t,n){for(var r=this.tryEntries.length-1;r>=0;--r){var e=this.tryEntries[r];if(e.tryLoc<=this.prev&&d.call(e,"finallyLoc")&&this.prev<e.finallyLoc){var o=e;break}}o&&("break"===t||"continue"===t)&&o.tryLoc<=n&&n<=o.finallyLoc&&(o=null);var i=o?o.completion:{};return i.type=t,i.arg=n,o?this.next=o.finallyLoc:this.complete(i),O},complete:function(t,n){if("throw"===t.type)throw t.arg;"brea
 k"===t.type||"continue"===t.type?this.next=t.arg:"return"===t.type?(this.rval=t.arg,this.next="end"):"normal"===t.type&&n&&(this.next=n)},finish:function(t){for(var n=this.tryEntries.length-1;n>=0;--n){var r=this.tryEntries[n];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),h(r),O}},"catch":function(t){for(var n=this.tryEntries.length-1;n>=0;--n){var r=this.tryEntries[n];if(r.tryLoc===t){var e=r.completion;if("throw"===e.type){var o=e.arg;h(r)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(t,n,r){return this.delegate={iterator:v(t),resultName:n,nextLoc:r},O}}}("object"==typeof t?t:"object"==typeof window?window:"object"==typeof self?self:this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}]},{},[1]);

http://git-wip-us.apache.org/repos/asf/allura/blob/d20e75d2/Allura/allura/templates/jinja_master/top_nav.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/jinja_master/top_nav.html b/Allura/allura/templates/jinja_master/top_nav.html
index 32047be..5213340 100644
--- a/Allura/allura/templates/jinja_master/top_nav.html
+++ b/Allura/allura/templates/jinja_master/top_nav.html
@@ -44,6 +44,7 @@
 </div>
 {% if h.has_access(c.project, 'admin')() %}
     {% do g.register_forge_js('js/underscore-min.js') %}
+    {% do g.register_forge_js('js/browser-polyfill.min.js') %}
     {% do g.register_forge_js('js/react-with-addons' + ('' if h.asbool(config.get('debug')) else '.min') + '.js') %}
     {% do g.register_forge_js('js/react-dom' + ('' if h.asbool(config.get('debug')) else '.min') + '.js') %}
     {% do g.register_forge_js('js/react-drag.min.js') %}

http://git-wip-us.apache.org/repos/asf/allura/blob/d20e75d2/Brocfile.js
----------------------------------------------------------------------
diff --git a/Brocfile.js b/Brocfile.js
index 72969b6..17e373a 100644
--- a/Brocfile.js
+++ b/Brocfile.js
@@ -47,6 +47,7 @@ var navbar = funnel('Allura/allura', {
               'public/nf/js/react-drag.min.js',
               'public/nf/js/react-reorderable.min.js',
               'lib/widgets/resources/js/jquery.lightbox_me.js',
+              'public/nf/js/browser-polyfill.min.js',
               'public/nf/js/admin_modal.js',
               'public/nf/js/jquery.tooltipster.js',
               'public/nf/js/navbar.es6.js',

http://git-wip-us.apache.org/repos/asf/allura/blob/d20e75d2/LICENSE
----------------------------------------------------------------------
diff --git a/LICENSE b/LICENSE
index 979852e..0b92c2c 100644
--- a/LICENSE
+++ b/LICENSE
@@ -270,6 +270,10 @@ For details, see:
 Underscore, which is available under the MIT license.
 For details, see Allura/allura/public/nf/js/underscore-min.js
 
+Babel's Polyfill, which is available under the MIT license.
+See https://babeljs.io/docs/usage/polyfill/
+	Allura/allura/public/nf/js/browser-polyfill.min.js
+
 Font Awesome is available under the MIT license (for the code) and SIL OFL 1.1 (for the fonts).
 Source code available at http://fortawesome.github.io/Font-Awesome/
 For details, see:
@@ -285,4 +289,4 @@ Build scripts from Sphinx (http://sphinx-doc.org/):
     Allura/docs/make.bat
     Allura/docs/Makefile
     ForgeImporters/docs/make.bat
-    ForgeImporters/docs/Makefile
\ No newline at end of file
+    ForgeImporters/docs/Makefile

http://git-wip-us.apache.org/repos/asf/allura/blob/d20e75d2/rat-excludes.txt
----------------------------------------------------------------------
diff --git a/rat-excludes.txt b/rat-excludes.txt
index 6ad4a44..c653556 100644
--- a/rat-excludes.txt
+++ b/rat-excludes.txt
@@ -29,7 +29,7 @@ Allura/allura/public/nf/css/forge/tooltipster.css
 Allura/allura/public/nf/css/forge/ui.daterangepicker.css
 Allura/allura/public/nf/css/smoothness/jquery-ui-1.8.4.custom.css
 Allura/allura/public/nf/fonts/
-Allura/allura/public/nf/js/dummy.es6.js
+Allura/allura/public/nf/js/browser-polyfill.min.js
 Allura/allura/public/nf/js/jquery-base.js
 Allura/allura/public/nf/js/jquery.daterangepicker.js
 Allura/allura/public/nf/js/jquery.flot.js


[04/50] [abbrv] allura git commit: [#7919] remove AdminModal widget, change to pure JS

Posted by br...@apache.org.
[#7919] remove AdminModal widget, change to pure JS


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/f7d7753e
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/f7d7753e
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/f7d7753e

Branch: refs/heads/db/8034
Commit: f7d7753e2982e1a188900850488c3a4320f9a1a7
Parents: 2d33fe3
Author: Dave Brondsema <da...@brondsema.net>
Authored: Wed Dec 2 14:29:54 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:54:30 2015 -0600

----------------------------------------------------------------------
 Allura/allura/app.py                            |  5 ---
 Allura/allura/ext/admin/admin_main.py           |  4 ---
 .../ext/admin/templates/project_tools.html      |  1 -
 Allura/allura/lib/widgets/admin_widgets.py      | 14 --------
 Allura/allura/public/nf/js/admin_modal.js       | 34 +++++++++++++++-----
 .../allura/templates/jinja_master/master.html   |  2 ++
 .../allura/templates/jinja_master/top_nav.html  |  3 --
 Brocfile.js                                     |  2 +-
 8 files changed, 29 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/f7d7753e/Allura/allura/app.py
----------------------------------------------------------------------
diff --git a/Allura/allura/app.py b/Allura/allura/app.py
index c392eae..381661c 100644
--- a/Allura/allura/app.py
+++ b/Allura/allura/app.py
@@ -308,11 +308,6 @@ class Application(object):
         self.admin = DefaultAdminController(self)
 
     @LazyProperty
-    def admin_modal(self):
-        """Returns modal dialog widget for app's admin options"""
-        return admin_widgets.AdminModal()
-
-    @LazyProperty
     def admin_tool_delete_modal(self):
         """Returns modal dialog widget for app's delete workflow"""
         return admin_widgets.AdminToolDeleteModal()

http://git-wip-us.apache.org/repos/asf/allura/blob/f7d7753e/Allura/allura/ext/admin/admin_main.py
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/admin_main.py b/Allura/allura/ext/admin/admin_main.py
index 221b9cf..b7d7685 100644
--- a/Allura/allura/ext/admin/admin_main.py
+++ b/Allura/allura/ext/admin/admin_main.py
@@ -55,7 +55,6 @@ log = logging.getLogger(__name__)
 class W:
     markdown_editor = ffw.MarkdownEdit()
     label_edit = ffw.LabelEdit()
-    admin_modal = admin_widgets.AdminModal()
     mount_delete = admin_widgets.AdminToolDeleteModal()
     install_modal = ffw.Lightbox(
         name='install_modal', trigger='a.install_trig')
@@ -270,7 +269,6 @@ class ProjectAdminController(BaseController):
         c.markdown_editor = W.markdown_editor
         c.label_edit = W.label_edit
         c.mount_delete = W.mount_delete
-        c.admin_modal = W.admin_modal
         c.install_modal = W.install_modal
         c.page_list = W.page_list
         mounts = c.project.ordered_mounts()
@@ -809,7 +807,6 @@ class ProjectAdminRestController(BaseController):
                     'default_options': tool['app'].default_options(),
                     'default_mount_label': tool['app'].default_mount_label,
                     'default_mount_point': tool['app'].admin_menu_delete_button,
-                    'modal': tool['app'].admin_modal,
                 }
             })
 
@@ -1164,7 +1161,6 @@ class GroupsController(BaseController):
     @with_trailing_slash
     @expose('jinja:allura.ext.admin:templates/project_groups.html')
     def index(self, **kw):
-        c.admin_modal = W.admin_modal
         c.card = W.group_card
         permissions_by_role = self._map_group_permissions()
         auth_role = M.ProjectRole.authenticated()

http://git-wip-us.apache.org/repos/asf/allura/blob/f7d7753e/Allura/allura/ext/admin/templates/project_tools.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/project_tools.html b/Allura/allura/ext/admin/templates/project_tools.html
index aa825f1..807828a 100644
--- a/Allura/allura/ext/admin/templates/project_tools.html
+++ b/Allura/allura/ext/admin/templates/project_tools.html
@@ -119,7 +119,6 @@
 <div style="clear:both">
   {{c.page_list.display(page=page, limit=limit, count=total_mounts)}}
 </div>
-{{c.admin_modal.display()}}
 {{c.mount_delete.display()}}
 <div><!--dummy-->
 

http://git-wip-us.apache.org/repos/asf/allura/blob/f7d7753e/Allura/allura/lib/widgets/admin_widgets.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/widgets/admin_widgets.py b/Allura/allura/lib/widgets/admin_widgets.py
index 249962e..6fe0f4f 100644
--- a/Allura/allura/lib/widgets/admin_widgets.py
+++ b/Allura/allura/lib/widgets/admin_widgets.py
@@ -20,20 +20,6 @@ import ew.jinja2_ew as ew
 from allura.lib.widgets import form_fields as ffw
 
 
-class AdminModal(ffw.Lightbox):
-    defaults = dict(
-        ffw.Lightbox.defaults,
-        name='admin_modal',
-        trigger='a.admin_modal',
-        content='<h1 id="admin_modal_title"></h1>'
-                '<div id="admin_modal_contents"></div>')
-
-    def resources(self):
-        for r in super(AdminModal, self).resources():
-            yield r
-        yield ew.JSLink('js/admin_modal.js')
-
-
 class AdminToolDeleteModal(ffw.Lightbox):
     defaults = dict(
         ffw.Lightbox.defaults,

http://git-wip-us.apache.org/repos/asf/allura/blob/f7d7753e/Allura/allura/public/nf/js/admin_modal.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/admin_modal.js b/Allura/allura/public/nf/js/admin_modal.js
index f796bc9..36b059f 100644
--- a/Allura/allura/public/nf/js/admin_modal.js
+++ b/Allura/allura/public/nf/js/admin_modal.js
@@ -16,22 +16,40 @@
        specific language governing permissions and limitations
        under the License.
 */
+
+// This logic is the same as the inline JS from the Lightbox widget
+function startLightbox($lightbox) {
+    $lightbox.lightbox_me();
+    $lightbox.on('click', '.close', function (e) {
+        e.preventDefault();
+        $lightbox.trigger('close');
+    });
+    return $lightbox;
+}
+
 $(function() {
-    var $popup_title = $('#admin_modal_title');
-    var $popup_contents = $('#admin_modal_contents');
     $('body').on('click', 'a.admin_modal', function(e) {
         e.preventDefault();
+
+        $('#lightbox_admin_modal').remove();
+        $('body').append('<div id="lightbox_admin_modal" class="modal" style="display:none">  \
+            <a class="icon close" href="#" title="Close"><i class="fa fa-close"></i></a>  \
+            <h1 id="admin_modal_title"></h1><div id="admin_modal_contents">Loading...</div>  \
+        </div>');
+
+        startLightbox($('#lightbox_admin_modal'));
+
         var link = this;
-        $popup_title.html('');
-        $popup_contents.html('Loading...');
-        $.get(link.href, function (data) {
+        $.get(link.href, function(data) {
+            var $popup_title = $('#admin_modal_title');
+            var $popup_contents = $('#admin_modal_contents');
             $popup_title.html($(link).html());
             $popup_contents.html(data);
             var csrf_exists = $popup_contents.find('form > input[name="_session_id"]').length;
             if (!csrf_exists) {
-              var cval = $.cookie('_session_id');
-              var csrf_input = $('<input name="_session_id" type="hidden" value="'+cval+'">');
-              $popup_contents.find('form').append(csrf_input);
+                var cval = $.cookie('_session_id');
+                var csrf_input = $('<input name="_session_id" type="hidden" value="'+cval+'">');
+                $popup_contents.find('form').append(csrf_input);
             }
         });
     });

http://git-wip-us.apache.org/repos/asf/allura/blob/f7d7753e/Allura/allura/templates/jinja_master/master.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/jinja_master/master.html b/Allura/allura/templates/jinja_master/master.html
index 8453056..5ec6808 100644
--- a/Allura/allura/templates/jinja_master/master.html
+++ b/Allura/allura/templates/jinja_master/master.html
@@ -33,6 +33,8 @@
 {% do g.register_forge_css('css/forge/tooltipster.css') %}
 {% do g.register_forge_css('css/font-awesome.min.css', compress=False) %}
 {% if h.has_access(c.project, 'admin')() %}
+    {% do g.register_forge_js('js/admin_modal.js') %}
+    {% do g.register_js('js/jquery.lightbox_me.js') %}
     {# this would be better placed in top_nav.html but that file is included later so its too late for it to register
        any css.  (Unlike other html files which are the top-level file and extend this master.html) #}
     {% do g.register_forge_css('css/navbar.css') %}

http://git-wip-us.apache.org/repos/asf/allura/blob/f7d7753e/Allura/allura/templates/jinja_master/top_nav.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/jinja_master/top_nav.html b/Allura/allura/templates/jinja_master/top_nav.html
index 373c4a6..21bcb48 100644
--- a/Allura/allura/templates/jinja_master/top_nav.html
+++ b/Allura/allura/templates/jinja_master/top_nav.html
@@ -62,8 +62,5 @@
                     }), document.getElementById('add-tool-container'));
         });
     </script>
-
-    {# hidden modal, ready to be used by any admin functionality (top_nav, sidebar, admin page, etc) #}
-    {{ c.app.admin_modal.display() }}
 {% endif %}
 {% endif %}

http://git-wip-us.apache.org/repos/asf/allura/blob/f7d7753e/Brocfile.js
----------------------------------------------------------------------
diff --git a/Brocfile.js b/Brocfile.js
index 18bcbd1..38f82e8 100644
--- a/Brocfile.js
+++ b/Brocfile.js
@@ -44,7 +44,7 @@ var navbar_deps = funnel('Allura/allura', {
               'public/nf/js/react-drag.min.js',
               'public/nf/js/react-reorderable.min.js',
               'lib/widgets/resources/js/jquery.lightbox_me.js',
-              'lib/widgets/resources/js/admin_modal.js',
+              'public/nf/js/admin_modal.js',
     ],
 });
 navbar = mergeTrees([navbar_deps, tree]);


[19/50] [abbrv] allura git commit: [#7919] move getNavJson into success handler of threshold update. Cleanup unnecessary code

Posted by br...@apache.org.
[#7919] move getNavJson into success handler of threshold update.  Cleanup unnecessary code


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/ce6c6312
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/ce6c6312
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/ce6c6312

Branch: refs/heads/db/8034
Commit: ce6c6312d32d2581431230a19e234e553cc86355
Parents: b09f4bf
Author: Dave Brondsema <da...@brondsema.net>
Authored: Mon Dec 7 10:35:26 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:36 2015 -0600

----------------------------------------------------------------------
 Allura/allura/public/nf/js/navbar.es6.js | 18 +-----------------
 1 file changed, 1 insertion(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/ce6c6312/Allura/allura/public/nf/js/navbar.es6.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/navbar.es6.js b/Allura/allura/public/nf/js/navbar.es6.js
index 70b7d65..cb5a5c1 100644
--- a/Allura/allura/public/nf/js/navbar.es6.js
+++ b/Allura/allura/public/nf/js/navbar.es6.js
@@ -474,7 +474,6 @@ var Main = React.createClass({
      * @param {object} event
      */
     onUpdateThreshold: function(event) {
-        var _this = this;
         var thres = event.target.value;
         var url = `${_getProjectUrl()}/admin/configure_tool_grouping`;
         var csrf = $.cookie('_session_id');
@@ -482,22 +481,7 @@ var Main = React.createClass({
             _session_id: csrf,
             grouping_threshold: thres
         };
-        var _data = this.state.data;
-        _data.grouping_threshold = thres;
-        this.setState({
-            data: _data
-        });
-        this.setState({
-            in_progress: true
-        });
-        $.post(url, data, function() {
-        }.bind(this)).always(function() {
-            _this.setState({
-                in_progress: false
-            });
-        });
-
-        _this.getNavJson();
+        $.post(url, data, () => this.getNavJson());
         return false;
     },
 


[50/50] [abbrv] allura git commit: [#8034] send project_menu_updated events

Posted by br...@apache.org.
[#8034] send project_menu_updated events


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/65f06ddf
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/65f06ddf
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/65f06ddf

Branch: refs/heads/db/8034
Commit: 65f06ddf0964c86a976a6232cb57943cb2532cea
Parents: b7d3fb4
Author: Dave Brondsema <da...@brondsema.net>
Authored: Thu Dec 17 14:21:31 2015 -0500
Committer: Dave Brondsema <da...@brondsema.net>
Committed: Thu Dec 17 14:21:31 2015 -0500

----------------------------------------------------------------------
 Allura/allura/app.py                              |  1 +
 Allura/allura/ext/admin/admin_main.py             | 12 +++++++++---
 Allura/allura/tests/functional/test_admin.py      |  7 +++++++
 ForgeWiki/forgewiki/tests/functional/test_root.py |  4 ++++
 4 files changed, 21 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/65f06ddf/Allura/allura/app.py
----------------------------------------------------------------------
diff --git a/Allura/allura/app.py b/Allura/allura/app.py
index 5ae34e1..fbe44be 100644
--- a/Allura/allura/app.py
+++ b/Allura/allura/app.py
@@ -880,6 +880,7 @@ class DefaultAdminController(BaseController, AdminControllerMixin):
         """
         require_access(self.app, 'configure')
         self.app.config.options['mount_label'] = mount_label
+        g.post_event('project_menu_updated')
         redirect(request.referer)
 
     @expose('jinja:allura:templates/app_admin_options.html')

http://git-wip-us.apache.org/repos/asf/allura/blob/65f06ddf/Allura/allura/ext/admin/admin_main.py
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/admin_main.py b/Allura/allura/ext/admin/admin_main.py
index 9c90b58..d891e83 100644
--- a/Allura/allura/ext/admin/admin_main.py
+++ b/Allura/allura/ext/admin/admin_main.py
@@ -291,6 +291,7 @@ class ProjectAdminController(BaseController):
                 raise ValueError('Invalid threshold')
             c.project.set_tool_data(
                 'allura', grouping_threshold=grouping_threshold)
+            g.post_event('project_menu_updated')
         except ValueError:
             flash('Invalid threshold', 'error')
         redirect('tools?limit=%s&page=%s' % (limit, page))
@@ -648,8 +649,8 @@ class ProjectAdminController(BaseController):
                 p.ordinal = int(sp['ordinal'])
         if tools:
             for p in tools:
-                c.project.app_config(
-                    p['mount_point']).options.ordinal = int(p['ordinal'])
+                c.project.app_config(p['mount_point']).options.ordinal = int(p['ordinal'])
+        g.post_event('project_menu_updated')
         redirect('tools')
 
     def _update_mounts(self, subproject=None, tool=None, new=None, **kw):
@@ -657,6 +658,7 @@ class ProjectAdminController(BaseController):
             subproject = []
         if tool is None:
             tool = []
+        new_app = None
         for sp in subproject:
             p = M.Project.query.get(shortname=sp['shortname'],
                                     neighborhood_id=c.project.neighborhood_id)
@@ -718,13 +720,15 @@ class ProjectAdminController(BaseController):
                     k: v for (k, v) in kw.iteritems()
                     if k in [o.name for o in App.options_on_install()]
                 }
-                return c.project.install_app(
+                new_app = c.project.install_app(
                     ep_name,
                     mount_point,
                     mount_label=new['mount_label'],
                     ordinal=int(new['ordinal']) if 'ordinal' in new else None,
                     **config_on_install)
         g.post_event('project_updated')
+        g.post_event('project_menu_updated')
+        return new_app
 
     @h.vardec
     @expose()
@@ -785,6 +789,7 @@ class ProjectAdminRestController(BaseController):
                     if p:
                         p.ordinal = int(ordinal)
         M.AuditLog.log('Updated tool order')
+        g.post_event('project_menu_updated')
         return {'status': 'ok'}
 
     @expose('json:')
@@ -802,6 +807,7 @@ class ProjectAdminRestController(BaseController):
                 'msg': 'Invalid threshold'
             }
         M.AuditLog.log('Updated tool grouping threshold')
+        g.post_event('project_menu_updated')
         return {'status': 'ok'}
 
     @expose('json:')

http://git-wip-us.apache.org/repos/asf/allura/blob/65f06ddf/Allura/allura/tests/functional/test_admin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_admin.py b/Allura/allura/tests/functional/test_admin.py
index c602243..c5ffc86 100644
--- a/Allura/allura/tests/functional/test_admin.py
+++ b/Allura/allura/tests/functional/test_admin.py
@@ -161,6 +161,13 @@ class TestProjectAdmin(TestController):
         r = self.app.get('/admin/audit/')
         assert "uninstall tool test-tool" in r.body, r.body
 
+        # Make sure several 'project_menu_updated' events got sent
+        menu_updated_events = M.MonQTask.query.find({
+            'task_name': 'allura.tasks.event_tasks.event',
+            'args': 'project_menu_updated'
+        }).all()
+        assert_equals(len(menu_updated_events), 7)
+
     def test_features(self):
         proj = M.Project.query.get(shortname='test')
         assert_equals(proj.features, [])

http://git-wip-us.apache.org/repos/asf/allura/blob/65f06ddf/ForgeWiki/forgewiki/tests/functional/test_root.py
----------------------------------------------------------------------
diff --git a/ForgeWiki/forgewiki/tests/functional/test_root.py b/ForgeWiki/forgewiki/tests/functional/test_root.py
index 1afcfd3..ffda744 100644
--- a/ForgeWiki/forgewiki/tests/functional/test_root.py
+++ b/ForgeWiki/forgewiki/tests/functional/test_root.py
@@ -608,6 +608,10 @@ class TestRootController(TestController):
         assert r.form['mount_label'].value == 'Wiki'
         r = self.app.post('/admin/wiki/update_label', params=dict(
             mount_label='Tricky Wiki'))
+        assert M.MonQTask.query.find({
+            'task_name': 'allura.tasks.event_tasks.event',
+            'args': 'project_menu_updated'
+        }).all()
         r = self.app.get('/admin/wiki/edit_label', validate_chunk=True)
         assert r.form['mount_label'].value == 'Tricky Wiki'
 


[42/50] [abbrv] allura git commit: [#7919] Fix styling issues on Add Tool dropdown

Posted by br...@apache.org.
[#7919] Fix styling issues on Add Tool dropdown


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/a4d7c457
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/a4d7c457
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/a4d7c457

Branch: refs/heads/db/8034
Commit: a4d7c4575bd46d219336bacefbf9cbe0cc15f51b
Parents: 8b08229
Author: Heith Seewald <he...@gmail.com>
Authored: Fri Dec 11 17:08:16 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 15:50:53 2015 -0600

----------------------------------------------------------------------
 Allura/allura/public/nf/css/navbar.css   | 28 +++++++--------------------
 Allura/allura/public/nf/js/navbar.es6.js |  7 +++++--
 2 files changed, 12 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/a4d7c457/Allura/allura/public/nf/css/navbar.css
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/css/navbar.css b/Allura/allura/public/nf/css/navbar.css
index 4203c45..6d9b0e4 100644
--- a/Allura/allura/public/nf/css/navbar.css
+++ b/Allura/allura/public/nf/css/navbar.css
@@ -61,7 +61,6 @@
 
 .config-tool {
     color: #555;
-    cursor: pointer;
     cursor: context-menu;
 }
 
@@ -83,7 +82,7 @@
 .react-reorderable-item-active {
     border: 3px dashed #9e9e9e;
     background: #c9c9c9;
-    width: 7rem; /* dynamic would be nice */
+    width: 6rem; /* dynamic would be nice */
     height: 30px;
 }
 
@@ -98,7 +97,9 @@
 /* this is the div that moves around with the cursor, when dragging */
 #top_nav_admin .react-reorderable-handle {
     position: absolute;
-    background: transparent;
+    background: rgba(255, 48, 13, 0.2);
+    border: 3px dashed rgba(255, 48, 13, 0.3);
+    min-width: 4em;
 }
 
 #top_nav_admin .tb-item a {
@@ -189,7 +190,7 @@
     background: white;
     position: absolute;
     top: 32px;
-    /*z-index: 2100;*/
+    white-space: nowrap;
 }
 
 .tb-item-container {
@@ -204,7 +205,6 @@
 .tb-item-grouper .react-reorderable-item-active {
     border: 3px dashed #9e9e9e;
     background: #c9c9c9;
-    width: 100%;
     width: calc(100% - 6px);
     height: 24px;
 }
@@ -212,7 +212,6 @@
 .react-reorderable-item .tb-item-grouper > div {
     position: relative;
     background: white;
-    /*z-index: 1620;*/
 }
 
 .react-reorderable-item .tb-item-grouper > div > div {
@@ -279,6 +278,7 @@
     margin-left: 15px;
     border-radius: 4px;
     z-index: 20200;
+    white-space: nowrap;
     clear: both;
 }
 
@@ -290,7 +290,7 @@
 }
 
 #top_nav_admin .contextMenu > ul > li > a {
-    margin: 4px;
+    margin: 4px 0;
     border-right: none;
     min-width: 6em;
     clear: both;
@@ -300,20 +300,6 @@
     border-right: none !important;
 }
 
-/*.modal {*/
-    /*background: rgb(47, 47, 47) none !important;*/
-    /*box-shadow: none !important;*/
-    /*border-radius: 15px !important;*/
-    /*border: 5px solid #404040 !important;*/
-/*}*/
-
-/*.modal input{*/
-    /*margin-bottom: 3px;*/
-    /*padding-left: 2px;*/
-    /*font-weight: 700;*/
-    /*margin-top: 5px;*/
-    /*font-size: medium;*/
-/*}*/
 .options-context-menu{
     /*border: 10px solid red;*/
 }

http://git-wip-us.apache.org/repos/asf/allura/blob/a4d7c457/Allura/allura/public/nf/js/navbar.es6.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/navbar.es6.js b/Allura/allura/public/nf/js/navbar.es6.js
index c0f9a1a..63d303e 100644
--- a/Allura/allura/public/nf/js/navbar.es6.js
+++ b/Allura/allura/public/nf/js/navbar.es6.js
@@ -97,11 +97,14 @@ var NavBarItem = React.createClass({
                 </a>
                 {this.props.currentOptionMenu.tool
                 && this.props.currentOptionMenu.tool === this.props.mount_point
-                && <ContextMenu
+                &&
+                <div className="options-context-menu">
+                    <ContextMenu
                     {...this.props}
                         items={this.props.options}
                         onOptionClick={this.props.onOptionClick}
-                    />}
+                    />
+                </div>}
             </div>
         );
     },


[47/50] [abbrv] allura git commit: [#7919] API docs for new endpoints; minor fix for webhooks

Posted by br...@apache.org.
[#7919] API docs for new endpoints; minor fix for webhooks


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/1348fe3e
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/1348fe3e
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/1348fe3e

Branch: refs/heads/db/8034
Commit: 1348fe3e35e7e05817ef0e3ec6b639adf88a2f02
Parents: 9ed7d5f
Author: Dave Brondsema <da...@brondsema.net>
Authored: Mon Dec 14 18:06:21 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 15:50:53 2015 -0600

----------------------------------------------------------------------
 Allura/allura/ext/admin/admin_main.py |  3 +-
 Allura/docs/api-rest/api.raml         | 57 +++++++++++++++++++++++++-----
 2 files changed, 49 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/1348fe3e/Allura/allura/ext/admin/admin_main.py
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/admin_main.py b/Allura/allura/ext/admin/admin_main.py
index 236bf96..9c90b58 100644
--- a/Allura/allura/ext/admin/admin_main.py
+++ b/Allura/allura/ext/admin/admin_main.py
@@ -773,14 +773,13 @@ class ProjectAdminRestController(BaseController):
 
     @expose('json:')
     @require_post()
-    def mount_order(self, subs=None, tools=None, **kw):
+    def mount_order(self, **kw):
         if kw:
             for ordinal, mount_point in sorted(kw.items(), key=lambda x: int(x[0])):
                 try:
                     c.project.app_config(mount_point).options.ordinal = int(ordinal)
                 except AttributeError as e:
                     # Handle subproject
-                    # print("Handle subproject", mount_point)
                     p = M.Project.query.get(shortname="{}/{}".format(c.project.shortname, mount_point),
                                             neighborhood_id=c.project.neighborhood_id)
                     if p:

http://git-wip-us.apache.org/repos/asf/allura/blob/1348fe3e/Allura/docs/api-rest/api.raml
----------------------------------------------------------------------
diff --git a/Allura/docs/api-rest/api.raml b/Allura/docs/api-rest/api.raml
index 2f54f02..4514a2e 100755
--- a/Allura/docs/api-rest/api.raml
+++ b/Allura/docs/api-rest/api.raml
@@ -558,7 +558,7 @@ documentation:
             description: |
               Returns status: busy or ready
             is: [ bearerAuth ]
-        /{project}/webhooks:
+        /{tool}/webhooks:
             type: {
               typedCollection: {
               example: !include examples/webhooks.json,
@@ -604,7 +604,6 @@ documentation:
                     type: string
                     description: |
                       Unique identifier for a webhook.
-
                 get:
                   description: |
                     View a webhook
@@ -667,15 +666,55 @@ documentation:
                     required: false
                     description: |
                       "first", "last", or "alpha_tool" for position with respect to existing tools (or existing tools of the same type for "alpha_tool")
-        /tools:
+        /mount_order:
           description: |
-            Gets a list of installable tools for a project
-
-            returns dict with two fields:
-            success: False if error is occurred, otherwise True
-            info: success or error message
+            Save tool/subproject order for multiple tools at once.  *Authentication Required*.
+          post:
+            is: [ bearerAuth ]
+            body:
+              application/x-www-form-urlencoded:
+                formParameters:
+                  1:
+                    description: Mount point name for the first position.
+                    example: tickets
+                    type: string
+                  2:
+                    description: Mount point name for the second position.
+                    example: our-news
+                    type: string
+                  3:
+                    description: Mount point name for the third position.
+                    example: documentation
+                    type: string
+                  4...:
+                    description: Etc.
+        /configure_tool_grouping:
+          description: |
+            Set the nav bar grouping threshold. *Authentication Required*.
+          post:
+            is: [ bearerAuth ]
+            body:
+              application/x-www-form-urlencoded:
+                formParameters:
+                  grouping_threshold:
+                    description: Value for the grouping threshold.
+                    example: 1
+                    type: number
+        /installable_tools:
+          description: |
+            List of installable tools and their default options.  *Authentication Required*.
           get:
-
+            is: [ bearerAuth ]
+        /admin_options:
+          description: |
+            List of links to admin pages or modal content, for a specific tool. *Authentication Required*.
+          get:
+            is: [ bearerAuth ]
+            queryParameters:
+              mount_point:
+                type: string
+                description: |
+                  The mount point to specify which tool.
 
 /u/{username}:
     description: |


[40/50] [abbrv] allura git commit: [#7919] make subproject install defaults show up

Posted by br...@apache.org.
[#7919] make subproject install defaults show up


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/825d8209
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/825d8209
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/825d8209

Branch: refs/heads/db/8034
Commit: 825d8209d14d710b88f0b62a1ed8cda5059e15f4
Parents: 1ad421e
Author: Dave Brondsema <da...@brondsema.net>
Authored: Thu Dec 10 17:29:44 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:40 2015 -0600

----------------------------------------------------------------------
 Allura/allura/ext/admin/admin_main.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/825d8209/Allura/allura/ext/admin/admin_main.py
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/admin_main.py b/Allura/allura/ext/admin/admin_main.py
index eb7175a..3f4a1db 100644
--- a/Allura/allura/ext/admin/admin_main.py
+++ b/Allura/allura/ext/admin/admin_main.py
@@ -340,7 +340,7 @@ class ProjectAdminController(BaseController):
                 'tool_label': 'Sub Project',
                 'default_mount_label': 'SubProject',
                 'default_mount_point': 'subproject'
-            },
+            }
             options = []
         else:
             tool = g.entry_points['tool'][tool_name]


[24/50] [abbrv] allura git commit: [#7919] Make validation patterns accessible to javascript for frontend validation

Posted by br...@apache.org.
[#7919] Make validation patterns accessible to javascript for frontend validation


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/119d2300
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/119d2300
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/119d2300

Branch: refs/heads/db/8034
Commit: 119d2300b0f8cbec5fbdea2590b5d1220a58d289
Parents: 69ff144
Author: Heith Seewald <he...@gmail.com>
Authored: Tue Dec 8 14:41:15 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:37 2015 -0600

----------------------------------------------------------------------
 Allura/allura/lib/helpers.py | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/119d2300/Allura/allura/lib/helpers.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/helpers.py b/Allura/allura/lib/helpers.py
index 93c0d6f..4bf92ae 100644
--- a/Allura/allura/lib/helpers.py
+++ b/Allura/allura/lib/helpers.py
@@ -68,16 +68,21 @@ from .security import has_access
 
 log = logging.getLogger(__name__)
 
+re_mount_points = {
+    're_project_name': r'^[a-z][-a-z0-9]{2,14}$',  # validates project, subproject, and user names
+    're_tool_mount_point': r'^[a-z][-a-z0-9]{0,62}$',  # validates tool mount point names
+    're_tool_mount_point_fragment': r'[a-z][-a-z0-9]*',
+    're_relaxed_tool_mount_point': r'^[a-zA-Z0-9][-a-zA-Z0-9_\.\+]{0,62}$',
+    're_relaxed_tool_mount_point_fragment':  r'[a-zA-Z0-9][-a-zA-Z0-9_\.\+]*'
+}
 # validates project, subproject, and user names
-re_project_name = re.compile(r'^[a-z][-a-z0-9]{2,14}$')
+re_project_name = re.compile(re_mount_points['re_project_name'])
 
 # validates tool mount point names
-re_tool_mount_point = re.compile(r'^[a-z][-a-z0-9]{0,62}$')
-re_tool_mount_point_fragment = re.compile(r'[a-z][-a-z0-9]*')
-re_relaxed_tool_mount_point = re.compile(
-    r'^[a-zA-Z0-9][-a-zA-Z0-9_\.\+]{0,62}$')
-re_relaxed_tool_mount_point_fragment = re.compile(
-    r'[a-zA-Z0-9][-a-zA-Z0-9_\.\+]*')
+re_tool_mount_point = re.compile(re_mount_points['re_tool_mount_point'])
+re_tool_mount_point_fragment = re.compile(re_mount_points['re_tool_mount_point_fragment'])
+re_relaxed_tool_mount_point = re.compile(re_mount_points['re_relaxed_tool_mount_point'])
+re_relaxed_tool_mount_point_fragment = re.compile(re_mount_points['re_relaxed_tool_mount_point_fragment'])
 
 re_clean_vardec_key = re.compile(r'''\A
 ( # first part


[06/50] [abbrv] allura git commit: [#7919] move our single admin_modal to top_nav (not all pages have the sidebar), use it for projects_groups too

Posted by br...@apache.org.
[#7919] move our single admin_modal to top_nav (not all pages have the sidebar), use it for projects_groups too


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/24570321
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/24570321
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/24570321

Branch: refs/heads/db/8034
Commit: 245703212be07ea3075d489cd5a7d176f0981f21
Parents: 614c156
Author: Dave Brondsema <da...@brondsema.net>
Authored: Wed Dec 2 10:39:36 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:54:30 2015 -0600

----------------------------------------------------------------------
 .../ext/admin/templates/project_groups.html     |  1 -
 Allura/allura/public/nf/js/project_groups.js    | 20 --------------------
 .../templates/jinja_master/sidebar_menu.html    |  1 -
 .../allura/templates/jinja_master/top_nav.html  |  3 +++
 4 files changed, 3 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/24570321/Allura/allura/ext/admin/templates/project_groups.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/project_groups.html b/Allura/allura/ext/admin/templates/project_groups.html
index 765a593..c505528 100644
--- a/Allura/allura/ext/admin/templates/project_groups.html
+++ b/Allura/allura/ext/admin/templates/project_groups.html
@@ -109,7 +109,6 @@
     </tr>
   </tbody>
 </table>
-{{c.admin_modal.display(content='<h1 id="popup_title"></h1><div id="popup_contents"></div>')}}
 {% endblock %}
 
 {% block extra_js %}

http://git-wip-us.apache.org/repos/asf/allura/blob/24570321/Allura/allura/public/nf/js/project_groups.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/project_groups.js b/Allura/allura/public/nf/js/project_groups.js
index 6dc5d5c..6e3ff30 100644
--- a/Allura/allura/public/nf/js/project_groups.js
+++ b/Allura/allura/public/nf/js/project_groups.js
@@ -19,26 +19,6 @@
 
 $(function() {
   var cval = $.cookie('_session_id');
-  // add a group
-  var csrf_input = $('<input>', {name: '_session_id', 'type': 'hidden', value: cval});
-  var $popup_title = $('#popup_title');
-  var $popup_contents = $('#popup_contents');
-  $('a.admin_modal').click(function(evt){
-    evt.preventDefault();
-    evt.stopPropagation();
-    var link = this;
-    $popup_title.html('');
-    $popup_contents.html('Loading...');
-    $.get(link.href, function (data) {
-      $popup_title.html(link.title);
-      $popup_contents.html(data);
-      $popup_contents.find('form').append(csrf_input);
-      $('.btn.link.close').click(function(){
-          $(this).trigger('close');
-          return false;
-      });
-    });
-  });
   // delete a group
   $('a.delete_group').click(function(evt){
     evt.preventDefault();

http://git-wip-us.apache.org/repos/asf/allura/blob/24570321/Allura/allura/templates/jinja_master/sidebar_menu.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/jinja_master/sidebar_menu.html b/Allura/allura/templates/jinja_master/sidebar_menu.html
index f95ef86..9572cda 100644
--- a/Allura/allura/templates/jinja_master/sidebar_menu.html
+++ b/Allura/allura/templates/jinja_master/sidebar_menu.html
@@ -75,7 +75,6 @@
             {{sidebar_item(c.app.admin_menu_delete_button)}}
             {{sidebar_item(None)}}
           </div>
-          {{c.app.admin_modal.display()}}
           {% if c.app.admin_menu_delete_button %}
             {{c.app.admin_tool_delete_modal.display()}}
           {% endif %}

http://git-wip-us.apache.org/repos/asf/allura/blob/24570321/Allura/allura/templates/jinja_master/top_nav.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/jinja_master/top_nav.html b/Allura/allura/templates/jinja_master/top_nav.html
index 21bcb48..373c4a6 100644
--- a/Allura/allura/templates/jinja_master/top_nav.html
+++ b/Allura/allura/templates/jinja_master/top_nav.html
@@ -62,5 +62,8 @@
                     }), document.getElementById('add-tool-container'));
         });
     </script>
+
+    {# hidden modal, ready to be used by any admin functionality (top_nav, sidebar, admin page, etc) #}
+    {{ c.app.admin_modal.display() }}
 {% endif %}
 {% endif %}


[37/50] [abbrv] allura git commit: [#7919] Fix float issues with context menu

Posted by br...@apache.org.
[#7919] Fix float issues with context menu


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/68f31e1d
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/68f31e1d
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/68f31e1d

Branch: refs/heads/db/8034
Commit: 68f31e1de927b4571a6fc2f86e42e3b032efdab9
Parents: 196444f
Author: Heith Seewald <he...@gmail.com>
Authored: Thu Dec 10 15:41:29 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:39 2015 -0600

----------------------------------------------------------------------
 Allura/allura/public/nf/css/navbar.css | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/68f31e1d/Allura/allura/public/nf/css/navbar.css
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/css/navbar.css b/Allura/allura/public/nf/css/navbar.css
index 92ec7c9..c6f07ce 100644
--- a/Allura/allura/public/nf/css/navbar.css
+++ b/Allura/allura/public/nf/css/navbar.css
@@ -215,11 +215,23 @@
     min-width: 150px;
 }
 
+#add-tool-container .contextMenu {
+    border: none;
+    top: -20px;
+}
+#top_nav_admin .contextMenu a {
+    text-align: left;
+    padding-left: 5px !important;
+}
+
 .tb-item-grouper .tb-item {
     border: 1px solid #e5e5e5;
     border-bottom: none;
     overflow: hidden;
 }
+.anchored{
+        float: left;
+}
 #top_nav .tb-item-grouper a {
     text-align: left;
 }
@@ -256,7 +268,7 @@
     box-shadow: -2px 2px 6px #555;
     position: absolute;
     margin-top: 20px;
-    margin-left: 5px;
+    margin-left: 15px;
     border-radius: 4px;
     z-index: 20200;
     clear: both;
@@ -272,6 +284,7 @@
 #top_nav_admin .contextMenu > ul > li > a {
     margin: 4px;
     border-right: none;
+    min-width: 6em;
     clear: both;
 }
 
@@ -293,6 +306,12 @@
     /*margin-top: 5px;*/
     /*font-size: medium;*/
 /*}*/
+.options-context-menu{
+    /*border: 10px solid red;*/
+}
+.add-tool-context-menu{
+    /*background: black;*/
+}
 
 input.validate_input:valid[type='text'] {
     border: 1px solid #d8ffd5;


[05/50] [abbrv] allura git commit: [#7919] remove sidebar & admin widgets support

Posted by br...@apache.org.
[#7919] remove sidebar & admin widgets support

Only wiki used it and we want to minimize EasyWidget usage.
Create page works with regular admin_modal style, from any page.
Subscribe only really needs to be in sidebar, not admin menu.


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/2d33fe30
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/2d33fe30
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/2d33fe30

Branch: refs/heads/db/8034
Commit: 2d33fe307524d601ab04e8cf5c6bd5b78837bf86
Parents: 2457032
Author: Dave Brondsema <da...@brondsema.net>
Authored: Wed Dec 2 10:51:03 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:54:30 2015 -0600

----------------------------------------------------------------------
 Allura/allura/app.py                            | 14 ----
 .../ext/admin/templates/project_tools.html      |  3 -
 .../lib/widgets/resources/js/admin_modal.js     | 38 ---------
 Allura/allura/public/nf/js/admin_modal.js       | 38 +++++++++
 .../templates/jinja_master/sidebar_menu.html    |  5 --
 .../templates/wiki/admin_add_page.html          |  2 +-
 .../templates/wiki/create_page_widget.html      | 25 ------
 .../templates/wiki/wiki_subscribe_form.html     | 27 -------
 .../forgewiki/tests/functional/test_rest.py     |  2 +-
 .../forgewiki/tests/functional/test_root.py     | 12 +--
 ForgeWiki/forgewiki/widgets/wiki.py             | 49 ------------
 ForgeWiki/forgewiki/wiki_main.py                | 83 +++++++++-----------
 12 files changed, 85 insertions(+), 213 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/2d33fe30/Allura/allura/app.py
----------------------------------------------------------------------
diff --git a/Allura/allura/app.py b/Allura/allura/app.py
index 621ea37..c392eae 100644
--- a/Allura/allura/app.py
+++ b/Allura/allura/app.py
@@ -602,13 +602,6 @@ class Application(object):
         """
         return ""
 
-    def sidebar_menu_widgets(self):
-        """Return widgets needed by the sidebar menu of this Application.
-
-        :return: a list of widgets
-        """
-        return []
-
     @LazyProperty
     def _webhooks(self):
         """A list of webhooks that can be triggered by this app.
@@ -678,13 +671,6 @@ class Application(object):
                     'data-mount-point': self.config.options.mount_point,
                 })
 
-    def admin_menu_widgets(self):
-        """Return widgets needed by the admin menu of this Application.
-
-        :return: a list of widgets
-        """
-        return []
-
     def handle_message(self, topic, message):
         """Handle incoming email msgs addressed to this tool.
         Default is a no-op.

http://git-wip-us.apache.org/repos/asf/allura/blob/2d33fe30/Allura/allura/ext/admin/templates/project_tools.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/project_tools.html b/Allura/allura/ext/admin/templates/project_tools.html
index ec83e0a..aa825f1 100644
--- a/Allura/allura/ext/admin/templates/project_tools.html
+++ b/Allura/allura/ext/admin/templates/project_tools.html
@@ -94,9 +94,6 @@
                 </ul>
                 {# for ordering #}
                 <input type="hidden" class="mount_point" value="{{mount['ac'].options.mount_point}}"/>
-                {% for w in app.admin_menu_widgets() %}
-                  {{ w.display() }}
-                {% endfor %}
             </div>
         {% endif %}
         {% if 'sub' in mount and not mount['sub'].deleted %}

http://git-wip-us.apache.org/repos/asf/allura/blob/2d33fe30/Allura/allura/lib/widgets/resources/js/admin_modal.js
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/widgets/resources/js/admin_modal.js b/Allura/allura/lib/widgets/resources/js/admin_modal.js
deleted file mode 100644
index f796bc9..0000000
--- a/Allura/allura/lib/widgets/resources/js/admin_modal.js
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
-       Licensed to the Apache Software Foundation (ASF) under one
-       or more contributor license agreements.  See the NOTICE file
-       distributed with this work for additional information
-       regarding copyright ownership.  The ASF licenses this file
-       to you under the Apache License, Version 2.0 (the
-       "License"); you may not use this file except in compliance
-       with the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-       Unless required by applicable law or agreed to in writing,
-       software distributed under the License is distributed on an
-       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-       KIND, either express or implied.  See the License for the
-       specific language governing permissions and limitations
-       under the License.
-*/
-$(function() {
-    var $popup_title = $('#admin_modal_title');
-    var $popup_contents = $('#admin_modal_contents');
-    $('body').on('click', 'a.admin_modal', function(e) {
-        e.preventDefault();
-        var link = this;
-        $popup_title.html('');
-        $popup_contents.html('Loading...');
-        $.get(link.href, function (data) {
-            $popup_title.html($(link).html());
-            $popup_contents.html(data);
-            var csrf_exists = $popup_contents.find('form > input[name="_session_id"]').length;
-            if (!csrf_exists) {
-              var cval = $.cookie('_session_id');
-              var csrf_input = $('<input name="_session_id" type="hidden" value="'+cval+'">');
-              $popup_contents.find('form').append(csrf_input);
-            }
-        });
-    });
-});

http://git-wip-us.apache.org/repos/asf/allura/blob/2d33fe30/Allura/allura/public/nf/js/admin_modal.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/admin_modal.js b/Allura/allura/public/nf/js/admin_modal.js
new file mode 100644
index 0000000..f796bc9
--- /dev/null
+++ b/Allura/allura/public/nf/js/admin_modal.js
@@ -0,0 +1,38 @@
+/*
+       Licensed to the Apache Software Foundation (ASF) under one
+       or more contributor license agreements.  See the NOTICE file
+       distributed with this work for additional information
+       regarding copyright ownership.  The ASF licenses this file
+       to you under the Apache License, Version 2.0 (the
+       "License"); you may not use this file except in compliance
+       with the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+       Unless required by applicable law or agreed to in writing,
+       software distributed under the License is distributed on an
+       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+       KIND, either express or implied.  See the License for the
+       specific language governing permissions and limitations
+       under the License.
+*/
+$(function() {
+    var $popup_title = $('#admin_modal_title');
+    var $popup_contents = $('#admin_modal_contents');
+    $('body').on('click', 'a.admin_modal', function(e) {
+        e.preventDefault();
+        var link = this;
+        $popup_title.html('');
+        $popup_contents.html('Loading...');
+        $.get(link.href, function (data) {
+            $popup_title.html($(link).html());
+            $popup_contents.html(data);
+            var csrf_exists = $popup_contents.find('form > input[name="_session_id"]').length;
+            if (!csrf_exists) {
+              var cval = $.cookie('_session_id');
+              var csrf_input = $('<input name="_session_id" type="hidden" value="'+cval+'">');
+              $popup_contents.find('form').append(csrf_input);
+            }
+        });
+    });
+});

http://git-wip-us.apache.org/repos/asf/allura/blob/2d33fe30/Allura/allura/templates/jinja_master/sidebar_menu.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/jinja_master/sidebar_menu.html b/Allura/allura/templates/jinja_master/sidebar_menu.html
index 9572cda..2cb433a 100644
--- a/Allura/allura/templates/jinja_master/sidebar_menu.html
+++ b/Allura/allura/templates/jinja_master/sidebar_menu.html
@@ -92,11 +92,6 @@
       </ul>
       {% do ul_active.append(False) %}
     {% endif %}
-    {% if c.app and c.app.sidebar_menu_widgets() %}
-      {% for w in c.app.sidebar_menu_widgets() %}
-        {{ w.display() }}
-      {% endfor %}
-    {% endif %}
     {% if c.app and c.app.sidebar_menu_js() %}
       <script>
         {{c.app.sidebar_menu_js()|safe}}

http://git-wip-us.apache.org/repos/asf/allura/blob/2d33fe30/ForgeWiki/forgewiki/templates/wiki/admin_add_page.html
----------------------------------------------------------------------
diff --git a/ForgeWiki/forgewiki/templates/wiki/admin_add_page.html b/ForgeWiki/forgewiki/templates/wiki/admin_add_page.html
index 6055747..ae3c0aa 100644
--- a/ForgeWiki/forgewiki/templates/wiki/admin_add_page.html
+++ b/ForgeWiki/forgewiki/templates/wiki/admin_add_page.html
@@ -20,7 +20,7 @@
     $(function () {
         $("form").submit(function () {
             location.href = '{{ app.url }}' +
-                    encodeURIComponent($('input[name=name]', $(this)).val().replace('/', '-')) + '/edit';
+                    encodeURIComponent($('input[name=name]', $(this)).val().replace(new RegExp('/', 'g'), '-')) + '/edit';
             return false;
         });
     });

http://git-wip-us.apache.org/repos/asf/allura/blob/2d33fe30/ForgeWiki/forgewiki/templates/wiki/create_page_widget.html
----------------------------------------------------------------------
diff --git a/ForgeWiki/forgewiki/templates/wiki/create_page_widget.html b/ForgeWiki/forgewiki/templates/wiki/create_page_widget.html
deleted file mode 100644
index 43ab051..0000000
--- a/ForgeWiki/forgewiki/templates/wiki/create_page_widget.html
+++ /dev/null
@@ -1,25 +0,0 @@
-{#-
-       Licensed to the Apache Software Foundation (ASF) under one
-       or more contributor license agreements.  See the NOTICE file
-       distributed with this work for additional information
-       regarding copyright ownership.  The ASF licenses this file
-       to you under the Apache License, Version 2.0 (the
-       "License"); you may not use this file except in compliance
-       with the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-       Unless required by applicable law or agreed to in writing,
-       software distributed under the License is distributed on an
-       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-       KIND, either express or implied.  See the License for the
-       specific language governing permissions and limitations
-       under the License.
--#}
-<h1>Add a Wiki Page</h1>
-<form class="grid-10">
-    <label class="grid-2">Name</label>
-    <div class="grid-7"><input type="text" name="name"></div>
-    <label class="grid-2">&nbsp;</label>
-    <div class="grid-7"><input type="submit" value="Create page"></div>
-</form>

http://git-wip-us.apache.org/repos/asf/allura/blob/2d33fe30/ForgeWiki/forgewiki/templates/wiki/wiki_subscribe_form.html
----------------------------------------------------------------------
diff --git a/ForgeWiki/forgewiki/templates/wiki/wiki_subscribe_form.html b/ForgeWiki/forgewiki/templates/wiki/wiki_subscribe_form.html
deleted file mode 100644
index 9ac328e..0000000
--- a/ForgeWiki/forgewiki/templates/wiki/wiki_subscribe_form.html
+++ /dev/null
@@ -1,27 +0,0 @@
-{#-
-       Licensed to the Apache Software Foundation (ASF) under one
-       or more contributor license agreements.  See the NOTICE file
-       distributed with this work for additional information
-       regarding copyright ownership.  The ASF licenses this file
-       to you under the Apache License, Version 2.0 (the
-       "License"); you may not use this file except in compliance
-       with the License.  You may obtain a copy of the License at
-
-         http://www.apache.org/licenses/LICENSE-2.0
-
-       Unless required by applicable law or agreed to in writing,
-       software distributed under the License is distributed on an
-       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-       KIND, either express or implied.  See the License for the
-       specific language governing permissions and limitations
-       under the License.
--#}
-{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
-<form action="{{action}}" id="wiki_subscribe_form" class="hidden" method="POST">
-  {% if subscribed %}
-    <input type="hidden" name="unsubscribe" value="1">
-  {% else %}
-    <input type="hidden" name="subscribe" value="1">
-  {% endif %}
-  {{lib.csrf_token()}}
-</form>

http://git-wip-us.apache.org/repos/asf/allura/blob/2d33fe30/ForgeWiki/forgewiki/tests/functional/test_rest.py
----------------------------------------------------------------------
diff --git a/ForgeWiki/forgewiki/tests/functional/test_rest.py b/ForgeWiki/forgewiki/tests/functional/test_rest.py
index 4aba7f1..85602c7 100644
--- a/ForgeWiki/forgewiki/tests/functional/test_rest.py
+++ b/ForgeWiki/forgewiki/tests/functional/test_rest.py
@@ -42,7 +42,7 @@ class TestWikiApi(TestRestApiBase):
 
     def test_get_page(self):
         r = self.app.get('/p/test/wiki/Home/')
-        discussion_url = r.html.findAll('form')[5]['action'][:-4]
+        discussion_url = r.html.find('form', id='edit_post')['action'][:-4]
         content = file(__file__).read()
         self.app.post('/wiki/Home/attach',
                       upload_files=[('file_info', 'test_root.py', content)])

http://git-wip-us.apache.org/repos/asf/allura/blob/2d33fe30/ForgeWiki/forgewiki/tests/functional/test_root.py
----------------------------------------------------------------------
diff --git a/ForgeWiki/forgewiki/tests/functional/test_root.py b/ForgeWiki/forgewiki/tests/functional/test_root.py
index 9a88fd1..1afcfd3 100644
--- a/ForgeWiki/forgewiki/tests/functional/test_root.py
+++ b/ForgeWiki/forgewiki/tests/functional/test_root.py
@@ -756,24 +756,24 @@ class TestRootController(TestController):
         # user is not subscribed
         assert not M.Mailbox.subscribed(user_id=user._id)
         r = self.app.get('/p/test/wiki/Home/', extra_environ={'username': str(user.username)})
-        inp = r.html.find('input', {'type': 'hidden', 'name': 'subscribe'})
-        assert inp is not None
+        sidebar_menu = r.html.find('div', attrs={'id': 'sidebar'})
+        assert 'Subscribe to wiki' in str(sidebar_menu)
         # subscribe
         self.app.post('/p/test/wiki/subscribe', {'subscribe': True},
                       extra_environ={'username': str(user.username)}).follow()
         # user is subscribed
         assert M.Mailbox.subscribed(user_id=user._id)
         r = self.app.get('/p/test/wiki/Home/', extra_environ={'username': str(user.username)})
-        inp = r.html.find('input', {'type': 'hidden', 'name': 'unsubscribe'})
-        assert inp is not None
+        sidebar_menu = r.html.find('div', attrs={'id': 'sidebar'})
+        assert 'Unsubscribe' in str(sidebar_menu)
         # unsubscribe
         self.app.post('/p/test/wiki/subscribe', {'unsubscribe': True},
                       extra_environ={'username': str(user.username)}).follow()
         # user is not subscribed
         assert not M.Mailbox.subscribed(user_id=user._id)
         r = self.app.get('/p/test/wiki/Home/', extra_environ={'username': str(user.username)})
-        inp = r.html.find('input', {'type': 'hidden', 'name': 'subscribe'})
-        assert inp is not None
+        sidebar_menu = r.html.find('div', attrs={'id': 'sidebar'})
+        assert 'Subscribe to wiki' in str(sidebar_menu)
 
     def test_rate_limit_new_page(self):
         # Set rate limit to unlimit

http://git-wip-us.apache.org/repos/asf/allura/blob/2d33fe30/ForgeWiki/forgewiki/widgets/wiki.py
----------------------------------------------------------------------
diff --git a/ForgeWiki/forgewiki/widgets/wiki.py b/ForgeWiki/forgewiki/widgets/wiki.py
deleted file mode 100644
index ffd2727..0000000
--- a/ForgeWiki/forgewiki/widgets/wiki.py
+++ /dev/null
@@ -1,49 +0,0 @@
-#       Licensed to the Apache Software Foundation (ASF) under one
-#       or more contributor license agreements.  See the NOTICE file
-#       distributed with this work for additional information
-#       regarding copyright ownership.  The ASF licenses this file
-#       to you under the Apache License, Version 2.0 (the
-#       "License"); you may not use this file except in compliance
-#       with the License.  You may obtain a copy of the License at
-#
-#         http://www.apache.org/licenses/LICENSE-2.0
-#
-#       Unless required by applicable law or agreed to in writing,
-#       software distributed under the License is distributed on an
-#       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-#       KIND, either express or implied.  See the License for the
-#       specific language governing permissions and limitations
-#       under the License.
-
-import ew.jinja2_ew as ew
-from allura.lib.widgets import form_fields as ffw
-from allura.lib.widgets.forms import ForgeForm
-
-
-class CreatePageWidget(ffw.Lightbox):
-    content_template='forgewiki:templates/wiki/create_page_widget.html'
-
-    def resources(self):
-        for r in super(CreatePageWidget, self).resources():
-            yield r
-        yield ew.JSScript('''$(function () {
-            $('#lightbox_create_wiki_page form').submit(function(){
-                location.href = $('#sidebar a.add_wiki_page').attr('href') +
-                    encodeURIComponent($('input[name=name]', $(this)).val().replace('/', '-')) + '/edit';
-                return false;
-            });
-        });''')
-
-
-class WikiSubscribeForm(ForgeForm):
-    template='jinja:forgewiki:templates/wiki/wiki_subscribe_form.html'
-    defaults = dict(ForgeForm.defaults, subscribed=False)
-
-    def resources(self):
-        for r in super(WikiSubscribeForm, self).resources():
-            yield r
-        yield ew.JSScript("""
-            $('a[href$="#toggle-subscribe"]').click(function() {
-                $('#wiki_subscribe_form').submit();
-                return false;
-            })""")

http://git-wip-us.apache.org/repos/asf/allura/blob/2d33fe30/ForgeWiki/forgewiki/wiki_main.py
----------------------------------------------------------------------
diff --git a/ForgeWiki/forgewiki/wiki_main.py b/ForgeWiki/forgewiki/wiki_main.py
index b08d03e..181399b 100644
--- a/ForgeWiki/forgewiki/wiki_main.py
+++ b/ForgeWiki/forgewiki/wiki_main.py
@@ -51,7 +51,6 @@ from allura.lib.widgets.search import SearchResults, SearchHelp
 # Local imports
 from forgewiki import model as WM
 from forgewiki import version
-from forgewiki.widgets.wiki import CreatePageWidget, WikiSubscribeForm
 
 log = logging.getLogger(__name__)
 
@@ -60,8 +59,6 @@ class W:
     thread = w.Thread(
         page=None, limit=None, page_size=None, count=None,
         style='linear')
-    create_page_lightbox = CreatePageWidget(
-        name='create_wiki_page', trigger='#sidebar a.add_wiki_page')
     markdown_editor = ffw.MarkdownEdit()
     confirmation = ffw.Lightbox(name='confirm',
                                 trigger='a.post-link',
@@ -217,16 +214,12 @@ The wiki uses [Markdown](%s) syntax.
             return [
                 SitemapEntry(menu_id, '.')[SitemapEntry('Pages')[pages]]]
 
-    def create_common_wiki_menu(self,
-                                has_create_access,
-                                create_page_url,
-                                create_page_class,
-                                admin_menu=False):
+    def create_common_wiki_menu(self, has_create_access, admin_menu=False):
         links = []
         if has_create_access:
-            links += [SitemapEntry('Create Page', create_page_url,
+            links += [SitemapEntry('Create Page', self.admin_url + 'create_wiki_page',
                                    ui_icon=g.icons['add'],
-                                   className=create_page_class)]
+                                   className='admin_modal')]
         if not admin_menu:
             links += [SitemapEntry(''),
                       SitemapEntry('Wiki Home', self.url, className='wiki_home')]
@@ -243,15 +236,14 @@ The wiki uses [Markdown](%s) syntax.
                 SitemapEntry(
                     'Moderate', discussion.url() + 'moderate', ui_icon=g.icons['moderate'],
                     small=pending_mod_count))
-        if not c.user.is_anonymous():
+        if not c.user.is_anonymous() and not admin_menu:
             subscribed = M.Mailbox.subscribed(app_config_id=self.config._id)
             subscribe_action = 'unsubscribe' if subscribed else 'subscribe'
             subscribe_title = '{}{}'.format(
                 subscribe_action.capitalize(),
                 '' if subscribed else ' to wiki')
-            subscribe_url = '{}#toggle-subscribe'.format(self.url)
-            if not admin_menu:
-                links.append(SitemapEntry(None))
+            subscribe_url = '{}#toggle-{}'.format(self.url + 'subscribe', subscribe_action)
+            links.append(SitemapEntry(None))
             links.append(SitemapEntry(subscribe_title, subscribe_url, ui_icon=g.icons['mail']))
         if not admin_menu:
             links += [SitemapEntry(''),
@@ -259,46 +251,49 @@ The wiki uses [Markdown](%s) syntax.
         return links
 
     def admin_menu(self, skip_common_menu=False):
-        admin_url = c.project.url() + \
-            'admin/' + \
-            self.config.options.mount_point + '/'
         links = [SitemapEntry('Set Home',
-                              admin_url + 'home',
+                              self.admin_url + 'home',
                               className='admin_modal')]
 
         if not self.show_left_bar and not skip_common_menu:
-            links += self.create_common_wiki_menu(True,
-                                                  admin_url +
-                                                  'create_wiki_page',
-                                                  'admin_modal', admin_menu=True)
+            links += self.create_common_wiki_menu(has_create_access=True, admin_menu=True)
         links += super(ForgeWikiApp, self).admin_menu(force_options=True)
 
         return links
 
     @h.exceptionless([], log)
-    def admin_menu_widgets(self):
-        widgets = super(ForgeWikiApp, self).admin_menu_widgets()
-        if not c.user.is_anonymous():
-            form = WikiSubscribeForm(
-                action=self.url + 'subscribe',
-                subscribed=M.Mailbox.subscribed(app_config_id=self.config._id))
-            widgets.append(form)
-        return widgets
-
-    @h.exceptionless([], log)
     def sidebar_menu(self):
-        return self.create_common_wiki_menu(has_access(self, 'create'), c.app.url, 'add_wiki_page')
-
-    @h.exceptionless([], log)
-    def sidebar_menu_widgets(self):
-        widgets = super(ForgeWikiApp, self).sidebar_menu_widgets()
-        widgets.append(W.create_page_lightbox)
-        if not c.user.is_anonymous():
-            form = WikiSubscribeForm(
-                action=self.url + 'subscribe',
-                subscribed=M.Mailbox.subscribed())
-            widgets.append(form)
-        return widgets
+        return self.create_common_wiki_menu(has_create_access=has_access(self, 'create'))
+
+    def sidebar_menu_js(self):
+        return '''
+        $('#sidebar').on('click', 'a[href$="#toggle-subscribe"]', function(e) {
+            e.preventDefault();
+            var link = this;
+            var data = {
+                _session_id: $.cookie('_session_id'),
+                subscribe: '1',
+            }
+            $.post(this.href, data, function(){
+                $('#messages').notify('Subscribed to wiki.');
+                $('span', link).text('Unsubscribe');
+                $(link).attr('href', $(link).attr('href').replace('-subscribe','-unsubscribe'));
+            });
+        });
+        $('#sidebar').on('click', 'a[href$="#toggle-unsubscribe"]', function(e) {
+            e.preventDefault();
+            var link = this;
+            var data = {
+                _session_id: $.cookie('_session_id'),
+                unsubscribe: '1',
+            }
+            $.post(this.href, data, function(){
+                $('#messages').notify('Unsubscribed.');
+                $('span', link).text('Subscribe to wiki');
+                $(link).attr('href', $(link).attr('href').replace('-unsubscribe','-subscribe'));
+            });
+        });
+        '''
 
     def install(self, project):
         'Set up any default permissions and roles here'


[23/50] [abbrv] allura git commit: [#7919] Add frontend validation to the add-tool form

Posted by br...@apache.org.
[#7919] Add frontend validation to the add-tool form


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/b344a077
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/b344a077
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/b344a077

Branch: refs/heads/db/8034
Commit: b344a07734c42540caea21444b2228c3e3f01c9c
Parents: 119d230
Author: Heith Seewald <he...@gmail.com>
Authored: Tue Dec 8 15:36:23 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:37 2015 -0600

----------------------------------------------------------------------
 .../admin/templates/project_install_tool.html   | 110 +++++++++++++------
 Allura/allura/public/nf/css/navbar.css          |  38 ++++++-
 .../allura/templates/jinja_master/top_nav.html  |   2 +-
 3 files changed, 110 insertions(+), 40 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/b344a077/Allura/allura/ext/admin/templates/project_install_tool.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/project_install_tool.html b/Allura/allura/ext/admin/templates/project_install_tool.html
index 8d378d0..eb4ce21 100644
--- a/Allura/allura/ext/admin/templates/project_install_tool.html
+++ b/Allura/allura/ext/admin/templates/project_install_tool.html
@@ -1,9 +1,17 @@
 <!DOCTYPE html>
 {% import 'allura:templates/jinja_master/lib.html' as lib with context %}
-
+{#<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>#}
+{#<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>#}
 {% set full_url = h.absurl(c.project.url()) %}
 
 <h1> Installing {{ tool.tool_label }} </h1>
+{% if tool_name == 'subproject' %}
+    {% set mount_point_re = h.re_mount_points['re_project_name']|safe %}
+{% else %}
+    {% set mount_point_re = h.re_mount_points['re_relaxed_tool_mount_point']|safe
+    if g.entry_points['tool'][tool_name].relaxed_mount_points
+    else h.re_mount_points['re_tool_mount_point']|safe %}
+{% endif %}
 
 <form method="post" action="{{ full_url }}admin/update_mounts" id="install_form">
     <input type="hidden" name="new.ordinal" value="{{ total_mounts }}"/>
@@ -11,62 +19,94 @@
     <label class="grid-13" for="new.mount_label">Label</label>
     <div class="grid-13"><input type="text" name="new.mount_label" class="new_mount_label"
                                 title="This will be the name displayed in your project toolbar."
-                                value="{{ tool.default_mount_label }}">
+                                value="{{ tool.default_mount_label }}" maxlength="100">
     </div>
     <label class="grid-13" for="new.mount_point">Url Path</label>
     <div class="grid-13">
         <input id="id_url_input" type="text" name="new.mount_point"
-               title="The url for this tool relative to {{ full_url }} " class="new_mount_point"
-               value="{{ tool.default_mount_point }}">
-        <p><span id="full-url-preview" data-url="{{ full_url }}"></span></p>
+               title="The url for this tool relative to {{ full_url }} " class="new_mount_point validate_input"
+               value="{{ tool.default_mount_point }}" data-regex="{{ mount_point_re }}"
+               maxlength="{% 14 if tool_name == 'subproject' else 62 %}">
+        <span id="url_error_message" class="modal-form-error"></span>
+        <p><span id="full-url-preview">
+            {{ full_url }} <strong style="color:orange">
+            <span id="input-safe-preview"></span> </strong>
+        </span></p>
     </div>
     <div id="install_options">
         {% for o in options %}
-          <label class="grid-13" for="{{o.name}}">{{o.label}}</label>
-          <div class="grid-13">
-            {% if o.ming_type.__name__ == 'bool' %}
-              <input {{o.render_attrs()}}id="{{o.name}}" name="{{o.name}}" type="checkbox"{{ ' checked="checked"' if o.default}}>
-            {% else %}
-              <input {{o.render_attrs()}} id="{{o.name}}" name="{{o.name}}" value="{{o.default or ''}}">
+            <label class="grid-13" for="{{ o.name }}">{{ o.label }}</label>
+            <div class="grid-13">
+                {% if o.ming_type.__name__ == 'bool' %}
+                    <input {{ o.render_attrs() }}id="{{ o.name }}" name="{{ o.name }}"
+                           type="checkbox"{{ ' checked="checked"' if o.default }}>
+                {% else %}
+                    <input {{ o.render_attrs() }} id="{{ o.name }}" name="{{ o.name }}" value="{{ o.default or '' }}">
+                {% endif %}
+            </div>
+            {% if o.help_text %}
+                <div class="grid-13">
+                    <small>{{ o.help_text }}</small>
+                </div>
             {% endif %}
-          </div>
-          {% if o.help_text %}
-            <div class="grid-13"><small>{{o.help_text}}</small></div>
-          {% endif %}
         {% endfor %}
     </div>
     <div class="grid-13">&nbsp;</div>
     <hr>
     <div class="grid-13">&nbsp;</div>
     <div class="grid-13">
-        <input type="submit" value="Save" name="new.install"> <a href="#" class="close btn link">Cancel</a>
+        <input type="submit" id="id-submit-install" value="Save" name="new.install">
+        <a href="#" class="close btn link">Cancel</a>
     </div>
-    {{lib.csrf_token()}}
+    {{ lib.csrf_token() }}
 </form>
 
 
 <script>
     $('#admin_modal_title').hide();
-    var url_preview = $('#full-url-preview'); // "Preview Url Path" displayed on when creating a new tool.
-
-    var full_url = $(url_preview).data().url; // Full url path of current project.
+    var mount_point = $('#id_url_input');
+    var _re = mount_point.data('regex');
+    var url_error = $("#url_error_message");
+    var submit_button = $("#id-submit-install");
+    var url_preview = $('#input-safe-preview');
 
     // Update the url path preview as they type.
-    $('#id_url_input').keyup(function(){
-        url_preview.html(full_url + '<strong style="color:orange">' + $(this).val() + "</strong>");
+    mount_point.keyup(function () {
+        url_preview.text($(this).val());
+        validateNewToolForm();
     }).keyup();
 
-    // Set url_preview to the Url Path Defaults when creating a new tool.
-    // Add the link tool's 'nice name'.
-{#    defaults['external link'] = defaults.link#}
-{#    var tool_name = $.trim($(this).text().toLowerCase());#}
-{##}
-{#    // If a tool has a default url path, use it for an initial preview.#}
-{#    if (defaults[tool_name]) {#}
-{#        url_preview.html(full_url + '<strong class="url-keyword">' + defaults[tool_name].default_mount + "</strong>");#}
-{#    }#}
-{#    else {#}
-{#        // No defaults for this tool, so we use the base url to ensure the url_preview is reset.#}
-{#        url_preview.html(full_url);#}
-{#    }#}
+    function validateNewToolForm() {
+        var mp = document.getElementById('id_url_input');
+        var v = $(mp).val();
+        var mp_exists = _.contains(document._existingTools, $(mp).val());
+
+        if(v.length > 61){
+            submit_button.attr('disabled', true);
+            $(url_error).text("The path entered is too long");
+            mp.setCustomValidity("Must be less than 63 characters");
+        }
+        else if (!v.match(_re)) {
+            submit_button.attr('disabled', true);
+            $(url_error).text("You have entered an invalid character");
+            mp.setCustomValidity("Invalid character");
+        }
+        else if (v.length < 3) {
+            submit_button.attr('disabled', true);
+            $(url_error).text("Must be at least 3 characters");
+            mp.setCustomValidity("Must be 3 or more letters");
+        }
+        else if (mp_exists) {
+            submit_button.attr('disabled', true);
+            var exists_msg = "";
+            $(url_error).text("A tool with that path already exists");
+            mp.setCustomValidity('Mount point already exists');
+            url_error.className = "modal-form-error";
+        } else {
+            // Everything looks good -- clear any validation errors.
+            $(url_error).text("");
+            submit_button.attr('disabled', false);
+            mp.setCustomValidity("");
+        }
+    }
 </script>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/allura/blob/b344a077/Allura/allura/public/nf/css/navbar.css
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/css/navbar.css b/Allura/allura/public/nf/css/navbar.css
index 8c1c877..a29bcaf 100644
--- a/Allura/allura/public/nf/css/navbar.css
+++ b/Allura/allura/public/nf/css/navbar.css
@@ -278,8 +278,38 @@
 }
 
 /*.modal {*/
-    /*background-color: rgba(51, 51, 51, 0.94) !important;*/
-    /*border-radius: 12px !important;*/
-    /*background-image: none !important;*/
-    /*box-shadow: inset 0 1px 1px #aaaaaa,inset 0 -2px 20px rgba(96, 96, 96, 0.5),0 1px 5px rgba(0, 0, 0, 0.4) !important;*/
+    /*background: rgb(47, 47, 47) none !important;*/
+    /*box-shadow: none !important;*/
+    /*border-radius: 15px !important;*/
+    /*border: 5px solid #404040 !important;*/
 /*}*/
+
+/*.modal input{*/
+    /*margin-bottom: 3px;*/
+    /*padding-left: 2px;*/
+    /*font-weight: 700;*/
+    /*margin-top: 5px;*/
+    /*font-size: medium;*/
+/*}*/
+
+input.validate_input:valid[type='text'] {
+    border: 1px solid #d8ffd5;
+    background: #deffdc;
+}
+
+input.validate_input:invalid[type='text'] {
+    background: #fadad5;
+}
+
+input:focus:invalid {
+    outline: none;
+}
+
+.modal-form-error {
+    color: #FFFFFF;
+    padding: 2px;
+    border-radius: 2px;
+    font-size: smaller;
+    font-weight: 600;
+    margin-left: 0.6rem;
+}

http://git-wip-us.apache.org/repos/asf/allura/blob/b344a077/Allura/allura/templates/jinja_master/top_nav.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/jinja_master/top_nav.html b/Allura/allura/templates/jinja_master/top_nav.html
index 3d14c25..415123c 100644
--- a/Allura/allura/templates/jinja_master/top_nav.html
+++ b/Allura/allura/templates/jinja_master/top_nav.html
@@ -52,6 +52,7 @@
     var _data = {{ h.escape_json(c.project.nav_data(admin_options=True))|safe  }};
         $(document).ready(function () {
             var _existingTools = getMountPoints(_data['menu']);
+            document._existingTools = getMountPoints(_data['menu'])
             $('#toggle-admin-btn').click(function () {
                 ReactDOM.render(React.createElement(Main, {
                     initialData: _data
@@ -61,7 +62,6 @@
             ReactDOM.render(React.createElement(ToggleAddNewTool, {
                         installableTools: _data['installable_tools'],
                         mountPointValidation:_existingTools
-
                     }), document.getElementById('add-tool-container'));
         });
     </script>


[39/50] [abbrv] allura git commit: [#7919] clean up existingTools validation variables

Posted by br...@apache.org.
[#7919] clean up existingTools validation variables


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/1ad421ed
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/1ad421ed
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/1ad421ed

Branch: refs/heads/db/8034
Commit: 1ad421edb20bc552f8a21ef9519eb6be5a21d692
Parents: 68f31e1
Author: Dave Brondsema <da...@brondsema.net>
Authored: Thu Dec 10 16:26:58 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:40 2015 -0600

----------------------------------------------------------------------
 Allura/allura/ext/admin/admin_main.py           | 29 ++++++-----
 .../admin/templates/project_install_tool.html   |  4 +-
 Allura/allura/model/project.py                  | 10 ++++
 Allura/allura/public/nf/js/navbar.es6.js        | 51 --------------------
 .../allura/templates/jinja_master/top_nav.html  |  9 ++--
 5 files changed, 30 insertions(+), 73 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/1ad421ed/Allura/allura/ext/admin/admin_main.py
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/admin_main.py b/Allura/allura/ext/admin/admin_main.py
index f0bc151..eb7175a 100644
--- a/Allura/allura/ext/admin/admin_main.py
+++ b/Allura/allura/ext/admin/admin_main.py
@@ -336,21 +336,21 @@ class ProjectAdminController(BaseController):
     @expose('jinja:allura.ext.admin:templates/project_install_tool.html')
     def install_tool(self, tool_name=None, **kw):
         if tool_name == 'subproject':
-            return dict(
-                    tool_name=tool_name,
-                    tool={
-                        'tool_label': 'Sub Project',
-                        'default_mount_label': 'SubProject',
-                        'default_mount_point': 'subproject'
-                    },
-                    options=[],
-            )
-
-        tool = g.entry_points['tool'][tool_name]
+            tool = {
+                'tool_label': 'Sub Project',
+                'default_mount_label': 'SubProject',
+                'default_mount_point': 'subproject'
+            },
+            options = []
+        else:
+            tool = g.entry_points['tool'][tool_name]
+            options = tool.options_on_install()
+
         return dict(
-                tool_name=tool_name,
-                tool=tool,
-                options=tool.options_on_install(),
+            tool_name=tool_name,
+            tool=tool,
+            options=options,
+            existing_mount_points=c.project.mount_points()
         )
 
     @expose()
@@ -360,7 +360,6 @@ class ProjectAdminController(BaseController):
             raise exc.HTTPNotFound, name
         return app.admin, remainder
 
-
     @without_trailing_slash
     @expose('jinja:allura.ext.admin:templates/project_permissions.html')
     def groups(self, **kw):

http://git-wip-us.apache.org/repos/asf/allura/blob/1ad421ed/Allura/allura/ext/admin/templates/project_install_tool.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/project_install_tool.html b/Allura/allura/ext/admin/templates/project_install_tool.html
index 82f6f65..39fb9db 100644
--- a/Allura/allura/ext/admin/templates/project_install_tool.html
+++ b/Allura/allura/ext/admin/templates/project_install_tool.html
@@ -61,6 +61,8 @@
 
 
 <script>
+    var _existingMountPoints = {{ h.escape_json(existing_mount_points)|safe }};
+
     $('#admin_modal_title').hide();
     var mount_point = $('#id_url_input');
     var _re = mount_point.data('regex');
@@ -77,7 +79,7 @@
     function validateNewToolForm() {
         var mp = document.getElementById('id_url_input');
         var v = $(mp).val();
-        var mp_exists = _.contains(document._existingTools, $(mp).val());
+        var mp_exists = _.contains(_existingMountPoints, $(mp).val());
 
         if(v.length > 61){
             submit_button.attr('disabled', true);

http://git-wip-us.apache.org/repos/asf/allura/blob/1ad421ed/Allura/allura/model/project.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/project.py b/Allura/allura/model/project.py
index 6a2007d..eadd4d7 100644
--- a/Allura/allura/model/project.py
+++ b/Allura/allura/model/project.py
@@ -784,6 +784,16 @@ class Project(SearchIndexable, MappedClass, ActivityNode, ActivityObject):
             ordinal = last_menu_item['sub'].ordinal
         return ordinal
 
+    def mount_points_generator(self):
+        for item in self.ordered_mounts(include_hidden=True):
+            if 'ac' in item:
+                yield item['ac'].options.mount_point
+            else:
+                yield item['sub'].shortname
+
+    def mount_points(self):
+        return list(self.mount_points_generator())
+
     def install_app(self, ep_name, mount_point=None, mount_label=None, ordinal=None, **override_options):
         '''
         Install an app

http://git-wip-us.apache.org/repos/asf/allura/blob/1ad421ed/Allura/allura/public/nf/js/navbar.es6.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/navbar.es6.js b/Allura/allura/public/nf/js/navbar.es6.js
index a4cfeb3..28f87c7 100644
--- a/Allura/allura/public/nf/js/navbar.es6.js
+++ b/Allura/allura/public/nf/js/navbar.es6.js
@@ -42,55 +42,6 @@ function _getProjectUrl(rest = true) {
     return (rest ? '/rest/' : '/') + nbhd_proj;
 }
 
-/**
- * Get a mount point from a NavBarItem node.
-
- * @constructor
- * @param {NavBarItem} node
- * @returns {string}
- */
-function getMountPoint(node) {
-    if(node.hasOwnProperty('mount_point') && node['mount_point'] !== null){
-        return node['mount_point'];
-    }
-    return node.props.children[0].props.mount_point;
-}
-
-/**
- * Get a url from a NavBarItem node.
-
- * @constructor
- * @param {NavBarItem} node
- * @returns {string}
- */
-function getUrlByNode(node) {
-    if(node.hasOwnProperty('url') && node['url'] !== null){
-        return node['url'];
-    }
-    return node.props.children[0].props.url;
-}
-
-/**
- * Returns all existing mount points for a given project.
-
- * @constructor
- * @param {array} items
- * @returns {array}
- */
-function getMountPoints(items) {
-    var existingTools = [];
-    for (let item of items) {
-        if (item.hasOwnProperty('mount_point') && item.mount_point !== null) {
-            existingTools.push(item.mount_point);
-        } else if (item.hasOwnProperty('children')) {
-            for (let child of item.children) {
-                existingTools.push(child.mount_point)
-            }
-        }
-    }
-    return existingTools;
-}
-
 const ToolsPropType = React.PropTypes.shape({
     mount_point: React.PropTypes.string,
     name: React.PropTypes.string.isRequired,
@@ -304,7 +255,6 @@ var NormalNavBar = React.createClass({
 
     render: function() {
         var listItems = this.props.items.map(this.buildMenu);
-        var existingTools = getMountPoints(this.props.items);
         return (
             <ul
                 id="normal-nav-bar"
@@ -313,7 +263,6 @@ var NormalNavBar = React.createClass({
                 <li id="add-tool-container">
                     <ToggleAddNewTool
                         {...this.props}
-                        mountPointValidation={existingTools}
                         onOptionClick={this.onOptionClick} />
                 </li>
             </ul>

http://git-wip-us.apache.org/repos/asf/allura/blob/1ad421ed/Allura/allura/templates/jinja_master/top_nav.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/jinja_master/top_nav.html b/Allura/allura/templates/jinja_master/top_nav.html
index 53ffc6b..32047be 100644
--- a/Allura/allura/templates/jinja_master/top_nav.html
+++ b/Allura/allura/templates/jinja_master/top_nav.html
@@ -50,11 +50,9 @@
     {% do g.register_forge_js('js/react-reorderable.min.js') %}
     {% do g.register_forge_js('js/build/transpiled.js') %} {# if we do more es6, we'll need to register this in other places, or maybe even global #}
     <script>
-    'use strict';
-    var _data = {{ h.escape_json(c.project.nav_data(admin_options=True))|safe  }};
+        'use strict';
+        var _data = {{ h.escape_json(c.project.nav_data(admin_options=True))|safe }};
         $(document).ready(function () {
-            var _existingTools = getMountPoints(_data['menu']);
-            document._existingTools = getMountPoints(_data['menu'])
             $('#toggle-admin-btn').click(function () {
                 ReactDOM.render(React.createElement(Main, {
                     initialData: _data
@@ -62,8 +60,7 @@
             });
 
             ReactDOM.render(React.createElement(ToggleAddNewTool, {
-                        installableTools: _data['installable_tools'],
-                        mountPointValidation:_existingTools
+                        installableTools: _data['installable_tools']
                     }), document.getElementById('add-tool-container'));
 
             $("#toggle-admin-btn").tooltipster({


[36/50] [abbrv] allura git commit: [#7919] fix className in ContextMenu, so admin modals work again

Posted by br...@apache.org.
[#7919] fix className in ContextMenu, so admin modals work again


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/478fc333
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/478fc333
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/478fc333

Branch: refs/heads/db/8034
Commit: 478fc333ffa79f49fb951d8f475b501cdc0711d3
Parents: 0bc1567
Author: Dave Brondsema <da...@brondsema.net>
Authored: Wed Dec 9 18:05:41 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:39 2015 -0600

----------------------------------------------------------------------
 Allura/allura/public/nf/js/context-menu.es6.js | 6 +++---
 Allura/allura/public/nf/js/navbar.es6.js       | 1 -
 2 files changed, 3 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/478fc333/Allura/allura/public/nf/js/context-menu.es6.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/context-menu.es6.js b/Allura/allura/public/nf/js/context-menu.es6.js
index 3ce3c96..7572fb3 100644
--- a/Allura/allura/public/nf/js/context-menu.es6.js
+++ b/Allura/allura/public/nf/js/context-menu.es6.js
@@ -25,12 +25,12 @@ class ContextMenu extends React.Component {
     }
 
     static propTypes = {
-        classes: React.PropTypes.array.isRequired,
+        classes: React.PropTypes.array,
         items: React.PropTypes.arrayOf(React.PropTypes.object).isRequired,
         onOptionClick: React.PropTypes.func.isRequired
     };
 
-    static defaultOptions = {
+    static defaultProps = {
         classes: []
     };
 
@@ -69,7 +69,7 @@ class ContextMenu extends React.Component {
                     this.props.items.map(function (o, i) {
                         return (<li key={i}>
                             <a href={o.href}
-                               classes={_this.props.classes.concat([o.className])}
+                               className={_this.props.classes.concat([o.className]).join(' ')}
                                title={o.tooltip}>{o.text}</a>
                         </li>)
                     })}

http://git-wip-us.apache.org/repos/asf/allura/blob/478fc333/Allura/allura/public/nf/js/navbar.es6.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/navbar.es6.js b/Allura/allura/public/nf/js/navbar.es6.js
index e7262d1..a4cfeb3 100644
--- a/Allura/allura/public/nf/js/navbar.es6.js
+++ b/Allura/allura/public/nf/js/navbar.es6.js
@@ -148,7 +148,6 @@ var NavBarItem = React.createClass({
                 && this.props.currentOptionMenu.tool === this.props.mount_point
                 && <ContextMenu
                     {...this.props}
-                        classes={['tool-options']}
                         items={this.props.options}
                         onOptionClick={this.props.onOptionClick}
                     />}


[29/50] [abbrv] allura git commit: [#7919] Set maxlength for input fields

Posted by br...@apache.org.
[#7919] Set maxlength for input fields


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/c23844fc
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/c23844fc
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/c23844fc

Branch: refs/heads/db/8034
Commit: c23844fc543a8c59977bdb0893d10ce2cc74e854
Parents: 5c218d8
Author: Heith Seewald <he...@gmail.com>
Authored: Tue Dec 8 17:56:24 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:55:38 2015 -0600

----------------------------------------------------------------------
 Allura/allura/ext/admin/templates/project_install_tool.html | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/c23844fc/Allura/allura/ext/admin/templates/project_install_tool.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/project_install_tool.html b/Allura/allura/ext/admin/templates/project_install_tool.html
index eb4ce21..0e6d98d 100644
--- a/Allura/allura/ext/admin/templates/project_install_tool.html
+++ b/Allura/allura/ext/admin/templates/project_install_tool.html
@@ -1,16 +1,16 @@
 <!DOCTYPE html>
 {% import 'allura:templates/jinja_master/lib.html' as lib with context %}
-{#<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>#}
-{#<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>#}
 {% set full_url = h.absurl(c.project.url()) %}
 
 <h1> Installing {{ tool.tool_label }} </h1>
 {% if tool_name == 'subproject' %}
     {% set mount_point_re = h.re_mount_points['re_project_name']|safe %}
+    {% set max_length = 15 %}
 {% else %}
     {% set mount_point_re = h.re_mount_points['re_relaxed_tool_mount_point']|safe
     if g.entry_points['tool'][tool_name].relaxed_mount_points
     else h.re_mount_points['re_tool_mount_point']|safe %}
+    {% set max_length = 62 %}
 {% endif %}
 
 <form method="post" action="{{ full_url }}admin/update_mounts" id="install_form">
@@ -25,8 +25,7 @@
     <div class="grid-13">
         <input id="id_url_input" type="text" name="new.mount_point"
                title="The url for this tool relative to {{ full_url }} " class="new_mount_point validate_input"
-               value="{{ tool.default_mount_point }}" data-regex="{{ mount_point_re }}"
-               maxlength="{% 14 if tool_name == 'subproject' else 62 %}">
+               value="{{ tool.default_mount_point }}" data-regex="{{ mount_point_re }}" maxlength="{{ max_length}}">
         <span id="url_error_message" class="modal-form-error"></span>
         <p><span id="full-url-preview">
             {{ full_url }} <strong style="color:orange">
@@ -98,7 +97,6 @@
         }
         else if (mp_exists) {
             submit_button.attr('disabled', true);
-            var exists_msg = "";
             $(url_error).text("A tool with that path already exists");
             mp.setCustomValidity('Mount point already exists');
             url_error.className = "modal-form-error";


[41/50] [abbrv] allura git commit: [#7919] change tests from options_on_install page to install_tool page; remove core dep on Tracker

Posted by br...@apache.org.
[#7919] change tests from options_on_install page to install_tool page; remove core dep on Tracker


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/d1e2b7cb
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/d1e2b7cb
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/d1e2b7cb

Branch: refs/heads/db/8034
Commit: d1e2b7cb6fad5e4fd3b255c380f0ba38cfb87904
Parents: 152d783
Author: Dave Brondsema <da...@brondsema.net>
Authored: Thu Dec 10 18:14:03 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 15:50:52 2015 -0600

----------------------------------------------------------------------
 Allura/allura/tests/functional/test_admin.py | 37 ++++++++++++-----------
 1 file changed, 19 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/d1e2b7cb/Allura/allura/tests/functional/test_admin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_admin.py b/Allura/allura/tests/functional/test_admin.py
index cf5a1c0..c602243 100644
--- a/Allura/allura/tests/functional/test_admin.py
+++ b/Allura/allura/tests/functional/test_admin.py
@@ -42,7 +42,6 @@ from allura.lib.plugin import AdminExtension
 from allura.lib import helpers as h
 from allura.ext.admin.admin_main import AdminApp
 
-from forgetracker.tracker_main import ForgeTrackerApp
 from forgewiki.wiki_main import ForgeWikiApp
 
 
@@ -378,17 +377,19 @@ class TestProjectAdmin(TestController):
             assert 'error' in self.webflash(r)
             assert 'limit exceeded' in self.webflash(r)
 
-    def test_tool_options_on_install(self):
-        self.app.get('/admin/options_on_install', status=404)
-        self.app.get('/admin/options_on_install?tool_name=fake', status=404)
-        r = self.app.get('/admin/options_on_install?tool_name=tickets')
-        assert_equals(r.body, '')
-        opts = ['EnableVoting']
-        with mock.patch.object(ForgeTrackerApp, 'config_on_install', new=opts):
-            r = self.app.get('/admin/options_on_install?tool_name=tickets')
-            inp_opts = {'type': 'checkbox', 'id': 'EnableVoting', 'name': 'EnableVoting'}
-            inp = r.html.findAll('input', inp_opts)
-            assert_equals(len(inp), 1)
+    def test_install_tool_form(self):
+        r = self.app.get('/admin/install_tool?tool_name=wiki')
+        assert_in(u'Installing Wiki', r)
+
+    def test_install_tool_form_options(self):
+        opts = ['AllowEmailPosting']
+        with mock.patch.object(ForgeWikiApp, 'config_on_install', new=opts):
+            r = self.app.get('/admin/install_tool?tool_name=wiki')
+            assert_in(u'<input id="AllowEmailPosting" name="AllowEmailPosting"', r)
+
+    def test_install_tool_form_subproject(self):
+        r = self.app.get('/admin/install_tool?tool_name=subproject')
+        assert_in(u'Installing Sub Project', r)
 
     def test_grouping_threshold(self):
         r = self.app.get('/admin/tools')
@@ -1276,20 +1277,20 @@ class TestRestInstallTool(TestRestApiBase):
         assert_equals(audit_log.message, 'install tool ticketsmount1')
 
     def test_tool_exists(self):
-        with mock.patch.object(ForgeTrackerApp, 'max_instances') as mi:
+        with mock.patch.object(ForgeWikiApp, 'max_instances') as mi:
             mi.__get__ = mock.Mock(return_value=2)
             r = self.api_get('/rest/p/test/')
             tools_names = [t['name'] for t in r.json['tools']]
-            assert 'tickets' not in tools_names
+            assert 'wiki' not in tools_names
 
             data = {
-                'tool': 'tickets',
-                'mount_point': 'ticketsmount1',
-                'mount_label': 'tickets_label1'
+                'tool': 'wiki',
+                'mount_point': 'wikimount1',
+                'mount_label': 'wiki_label1'
             }
             project = M.Project.query.get(shortname='test')
             with h.push_config(c, user=M.User.query.get()):
-                project.install_app('tickets', mount_point=data['mount_point'])
+                project.install_app('wiki', mount_point=data['mount_point'])
             r = self.api_post('/rest/p/test/admin/install_tool/', **data)
             assert_equals(r.json['success'], False)
             assert_equals(r.json['info'], 'Mount point already exists.')


[07/50] [abbrv] allura git commit: [#7919] Admin modals from the top nav options menu

Posted by br...@apache.org.
[#7919] Admin modals from the top nav options menu


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/614c1568
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/614c1568
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/614c1568

Branch: refs/heads/db/8034
Commit: 614c1568092823ea75cf497d366b4cf28413d6f4
Parents: 2a5349e
Author: Dave Brondsema <da...@brondsema.net>
Authored: Mon Nov 30 15:52:11 2015 -0500
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 13:54:30 2015 -0600

----------------------------------------------------------------------
 Allura/allura/ext/admin/admin_main.py               |  2 +-
 Allura/allura/lib/widgets/form_fields.py            |  9 ++++-----
 .../allura/lib/widgets/resources/js/admin_modal.js  |  3 ++-
 Brocfile.js                                         | 16 +++++++++-------
 4 files changed, 16 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/614c1568/Allura/allura/ext/admin/admin_main.py
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/admin_main.py b/Allura/allura/ext/admin/admin_main.py
index d2d5854..221b9cf 100644
--- a/Allura/allura/ext/admin/admin_main.py
+++ b/Allura/allura/ext/admin/admin_main.py
@@ -904,7 +904,7 @@ class ProjectAdminRestController(BaseController):
         if not mount_point or tool is None:
             raise exc.HTTPNotFound
         return {
-            'options': [dict(text=m.label, href=m.url, is_modal=m.className == 'admin_modal')
+            'options': [dict(text=m.label, href=m.url, className=m.className)
                         for m in tool.admin_menu()]
         }
 

http://git-wip-us.apache.org/repos/asf/allura/blob/614c1568/Allura/allura/lib/widgets/form_fields.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/widgets/form_fields.py b/Allura/allura/lib/widgets/form_fields.py
index 1bfebcd..1b0360b 100644
--- a/Allura/allura/lib/widgets/form_fields.py
+++ b/Allura/allura/lib/widgets/form_fields.py
@@ -489,14 +489,13 @@ class Lightbox(ew_core.Widget):
         yield ew.JSLink('js/jquery.lightbox_me.js')
         yield onready('''
             var $lightbox = $('#lightbox_%s');
-            var $trigger = $('%s');
-            $trigger.bind('click', function(e) {
+            $('body').on('click', '%s', function(e) {
+                e.preventDefault();
                 $lightbox.lightbox_me(%s);
-                return false;
             });
-            $($lightbox).delegate('.close', 'click', function(e) {
+            $lightbox.on('click', '.close', function(e) {
+                e.preventDefault();
                 $lightbox.trigger('close');
-                return false;
             });
         ''' % (self.name, self.trigger, self.options))
 

http://git-wip-us.apache.org/repos/asf/allura/blob/614c1568/Allura/allura/lib/widgets/resources/js/admin_modal.js
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/widgets/resources/js/admin_modal.js b/Allura/allura/lib/widgets/resources/js/admin_modal.js
index b1a521d..f796bc9 100644
--- a/Allura/allura/lib/widgets/resources/js/admin_modal.js
+++ b/Allura/allura/lib/widgets/resources/js/admin_modal.js
@@ -19,7 +19,8 @@
 $(function() {
     var $popup_title = $('#admin_modal_title');
     var $popup_contents = $('#admin_modal_contents');
-    $('a.admin_modal').click(function () {
+    $('body').on('click', 'a.admin_modal', function(e) {
+        e.preventDefault();
         var link = this;
         $popup_title.html('');
         $popup_contents.html('Loading...');

http://git-wip-us.apache.org/repos/asf/allura/blob/614c1568/Brocfile.js
----------------------------------------------------------------------
diff --git a/Brocfile.js b/Brocfile.js
index 80432bb..18bcbd1 100644
--- a/Brocfile.js
+++ b/Brocfile.js
@@ -36,20 +36,22 @@ tree = babelTranspiler(tree, {
 });
 
 /* exactly what's needed for the navbar, so separate apps may use it too */
-var react_file = 'react-with-addons' + (production ? '.min' : '') + '.js';
-var navbar_deps = funnel('Allura/allura/public/nf/js', {
-    include: ['underscore-min.js',
+var react_file = 'public/nf/js/react-with-addons' + (production ? '.min' : '') + '.js';
+var navbar_deps = funnel('Allura/allura', {
+    include: ['public/nf/js/underscore-min.js',
               react_file,
-              'react-dom.js',
-              'react-drag.min.js',
-              'react-reorderable.min.js',
+              'public/nf/js/react-dom.js',
+              'public/nf/js/react-drag.min.js',
+              'public/nf/js/react-reorderable.min.js',
+              'lib/widgets/resources/js/jquery.lightbox_me.js',
+              'lib/widgets/resources/js/admin_modal.js',
     ],
 });
 navbar = mergeTrees([navbar_deps, tree]);
 navbar = sourceMapConcat(navbar, {
     // headerFiles & footerFiles used to specify some that must come before or after others
     headerFiles: [react_file],
-    inputFiles: ['*.js'],
+    inputFiles: ['**/*.js'],
     footerFiles: ['navbar.es6.js',],
     outputFile: '/navbar.js',
 });


[49/50] [abbrv] allura git commit: [#7919] Make the add tool context menu have a consistent style

Posted by br...@apache.org.
[#7919] Make the add tool context menu have a consistent style


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/b7d3fb43
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/b7d3fb43
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/b7d3fb43

Branch: refs/heads/db/8034
Commit: b7d3fb43a64408526e5ccfd76f8767f73a921bba
Parents: 1348fe3
Author: Heith Seewald <he...@gmail.com>
Authored: Wed Dec 16 11:45:39 2015 -0600
Committer: Heith Seewald <he...@gmail.com>
Committed: Wed Dec 16 15:50:54 2015 -0600

----------------------------------------------------------------------
 Allura/allura/public/nf/css/navbar.css   | 96 +++++++++++++++++++--------
 Allura/allura/public/nf/js/navbar.es6.js |  9 +--
 2 files changed, 73 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/b7d3fb43/Allura/allura/public/nf/css/navbar.css
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/css/navbar.css b/Allura/allura/public/nf/css/navbar.css
index 6d9b0e4..64858fd 100644
--- a/Allura/allura/public/nf/css/navbar.css
+++ b/Allura/allura/public/nf/css/navbar.css
@@ -31,6 +31,7 @@
     width: 1.8rem;
     height: 1.8rem;
 }
+
 #toggle-admin-btn:focus {
     outline: none;
 }
@@ -125,11 +126,12 @@
 }
 
 /* .react-drag used to distinguish container used in locked vs unlocked modes */
-.react-drag #add-tool-container {
+#add-tool-container {
     float: left;
     margin-left: 10px;
 }
-.react-drag #add-tool-container .add-tool-toggle {
+
+#add-tool-container .add-tool-toggle {
     margin-top: 5px;
 }
 
@@ -222,13 +224,14 @@
     min-width: 150px;
 }
 
-#add-tool-container .contextMenu {
-    border: none;
-    top: -20px;
-}
 #top_nav_admin .contextMenu a {
     text-align: left;
-    padding-left: 5px !important;
+    border-right: 0;
+    margin: 4px 0;
+    overflow: hidden !important;
+    white-space: nowrap;
+    width: auto;
+    padding: 0 1em 0 0.5em !important;
 }
 
 .tb-item-grouper .tb-item {
@@ -236,24 +239,26 @@
     border-bottom: none;
     overflow: hidden;
 }
-.anchored{
-        float: left;
+
+.anchored {
+    float: left;
 }
+
 #top_nav .tb-item-grouper a {
     text-align: left;
 }
 
-#top_nav #add-tool-container {
-    padding-bottom: 0;  /* cancel out the site style for dropdown <li>s, since this is already fairly tall */
+#add-tool-container {
+    padding-bottom: 0 !important;/* cancel out the site style for dropdown <li>s, since this is already fairly tall */
 }
 
+
 #top_nav .add-tool-toggle {
     border: 1px dashed #B9B9B9;
     color: #0077aa;
     padding: 3px 7px;
     margin-top: -4px;
-    height: 100%;
-    float: right;
+    float: left;
     border-radius: 2px;
     cursor: pointer;
     -webkit-user-select: none;
@@ -289,22 +294,65 @@
     visibility: visible !important;
 }
 
-#top_nav_admin .contextMenu > ul > li > a {
+#add-tool-container > div > div {
+    /* margin-top: 20px; */
+    margin-left: -10px;
+}
+
+#add-tool-container .contextMenu {
+    border: none;
+    background: white;
+    text-align: left;
+    top: 15px;
+}
+
+#add-tool-container .contextMenu ul {
+    position: initial !important;
+    border: none;
+    background: white;
+    text-align: left;
+    margin: 0 !important;
+    top: 0;
+}
+
+#add-tool-container li {
+    overflow: auto;
+    border: 1px solid #e5e5e5;
+    border-bottom: none;
+    min-width: 100px;
+    margin: 0;
+    display: block;
+    padding: 0.3em 0.5em 0.3em 0.3em !important;
+}
+
+#add-tool-container li:hover {
+    color: white;
+    background-color: #09c;
+    background-image: linear-gradient(#09c, #07a);
+    border-color: #07a;
+}
+
+#add-tool-container li:hover a {
+    color: white !important;
+
+}
+
+#add-tool-container li:first-child {
+    border-top: 0;
+}
+
+#add-tool-container a {
     margin: 4px 0;
     border-right: none;
-    min-width: 6em;
-    clear: both;
+    white-space: nowrap;
 }
 
 #top_nav_admin .tool_option > a {
     border-right: none !important;
 }
 
-.options-context-menu{
-    /*border: 10px solid red;*/
-}
-.add-tool-context-menu{
-    /*background: black;*/
+.unlocked-container{
+    margin-top: 10px;
 }
 
 input.validate_input:valid[type='text'] {
@@ -316,12 +364,8 @@ input.validate_input:invalid[type='text'] {
     background: #fadad5;
 }
 
-input:focus:invalid {
-    outline: none;
-}
-
 .modal-form-error {
-    color: #FFFFFF;
+    color: white;
     padding: 2px;
     border-radius: 2px;
     font-size: smaller;

http://git-wip-us.apache.org/repos/asf/allura/blob/b7d3fb43/Allura/allura/public/nf/js/navbar.es6.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/navbar.es6.js b/Allura/allura/public/nf/js/navbar.es6.js
index 32b1fb5..60d67cf 100644
--- a/Allura/allura/public/nf/js/navbar.es6.js
+++ b/Allura/allura/public/nf/js/navbar.es6.js
@@ -97,14 +97,11 @@ var NavBarItem = React.createClass({
                 </a>
                 {this.props.currentOptionMenu.tool
                 && this.props.currentOptionMenu.tool === this.props.mount_point
-                &&
-                <div className="options-context-menu">
-                    <ContextMenu
+                && <ContextMenu
                     {...this.props}
                         items={this.props.options}
                         onOptionClick={this.props.onOptionClick}
-                    />
-                </div>}
+                    /> }
             </div>
         );
     },
@@ -339,7 +336,7 @@ var AdminNav = React.createClass({
                     { tools }
                 </ReactReorderable>
                 { end_tools }
-                { !isSubMenu && <div id="add-tool-container">
+                { !isSubMenu && <div id="add-tool-container" className="unlocked-container">
                     <ToggleAddNewTool installableTools={this.props.installableTools}/>
                 </div>}
             </div>