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 2016/07/12 14:04:26 UTC

[01/12] allura git commit: Changed usage permission to read instead of write for refresh button [Forced Update!]

Repository: allura
Updated Branches:
  refs/heads/db/3593 8045d648d -> b8a0b1b8d (forced update)


Changed usage permission to read instead of write for refresh button


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

Branch: refs/heads/db/3593
Commit: 2dac879ffbc50e8614143d32adb096f1ad19550b
Parents: 190a1cb
Author: Rohan Verma <ro...@gmail.com>
Authored: Thu Jun 30 14:32:21 2016 +0530
Committer: Dave Brondsema <da...@brondsema.net>
Committed: Mon Jul 11 11:05:39 2016 -0400

----------------------------------------------------------------------
 Allura/allura/controllers/repository.py | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/2dac879f/Allura/allura/controllers/repository.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/repository.py b/Allura/allura/controllers/repository.py
index 4d8abd5..14745bf 100644
--- a/Allura/allura/controllers/repository.py
+++ b/Allura/allura/controllers/repository.py
@@ -468,9 +468,8 @@ class MergeRequestController(object):
 
     @expose()
     @require_post()
-    @validate(mr_dispose_form)
     def refresh(self, **kw):
-        require_access(self.req, 'write')
+        require_access(self.req, 'read')
         with self.req.push_downstream_context():
             self.req.downstream['commit_id'] = c.app.repo.commit(self.req.source_branch)._id
         redirect(self.req.url())


[10/12] allura git commit: [#3593] add tour to Admin Welcome page

Posted by br...@apache.org.
[#3593] add tour to Admin Welcome page


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

Branch: refs/heads/db/3593
Commit: 3ac1102067a70fdb7355bb3f97423672792d3397
Parents: a76915d
Author: Dave Brondsema <da...@brondsema.net>
Authored: Wed Jul 6 18:40:31 2016 -0400
Committer: Dave Brondsema <da...@brondsema.net>
Committed: Tue Jul 12 10:02:57 2016 -0400

----------------------------------------------------------------------
 Allura/allura/config/app_cfg.py                 |   1 -
 Allura/allura/ext/admin/admin_main.py           |  11 +-
 .../ext/admin/templates/project_admin.html      | 184 ++++++++++---------
 Allura/allura/lib/helpers.py                    |  10 -
 Allura/allura/nf/allura/css/site_style.css      |  13 ++
 5 files changed, 112 insertions(+), 107 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/3ac11020/Allura/allura/config/app_cfg.py
----------------------------------------------------------------------
diff --git a/Allura/allura/config/app_cfg.py b/Allura/allura/config/app_cfg.py
index b21979b..f340a63 100644
--- a/Allura/allura/config/app_cfg.py
+++ b/Allura/allura/config/app_cfg.py
@@ -104,7 +104,6 @@ class ForgeConfig(AppConfig):
         jinja2_env.filters['filesizeformat'] = helpers.do_filesizeformat
         jinja2_env.filters['datetimeformat'] = helpers.datetimeformat
         jinja2_env.filters['filter'] = lambda s,t=None: filter(t and jinja2_env.tests[t], s)
-        jinja2_env.filters['map'] = helpers.map_jinja_filter
         jinja2_env.filters['nl2br'] = helpers.nl2br_jinja_filter
         jinja2_env.globals.update({'hasattr': hasattr})
         config['pylons.app_globals'].jinja2_env = jinja2_env

http://git-wip-us.apache.org/repos/asf/allura/blob/3ac11020/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 e751dc8..a9c5daf 100644
--- a/Allura/allura/ext/admin/admin_main.py
+++ b/Allura/allura/ext/admin/admin_main.py
@@ -141,7 +141,7 @@ class AdminApp(Application):
         else:
             links += [
                 SitemapEntry('Welcome', admin_url),
-                SitemapEntry('Metadata', admin_url + 'overview'),
+                SitemapEntry('Metadata', admin_url + 'overview', className="admin-nav-metadata"),
             ]
             if c.project.neighborhood.name != "Users":
                 links += [
@@ -153,7 +153,7 @@ class AdminApp(Application):
             links.append(SitemapEntry('Export', admin_url + 'export'))
         if c.project.is_root and has_access(c.project, 'admin')():
             links.append(
-                SitemapEntry('User Permissions', admin_url + 'groups/'))
+                SitemapEntry('User Permissions', admin_url + 'groups/', className="admin-nav-user-perms"))
         if not c.project.is_root and has_access(c.project, 'admin')():
             links.append(
                 SitemapEntry('Permissions', admin_url + 'permissions/'))
@@ -206,12 +206,7 @@ class ProjectAdminController(BaseController):
     @with_trailing_slash
     @expose('jinja:allura.ext.admin:templates/project_admin.html')
     def index(self, **kw):
-        scm_tools = []
-        for tool in c.project.app_configs:
-            app = g.entry_points["tool"].get(tool.tool_name)
-            if app and issubclass(app, RepositoryApp):
-                scm_tools.append(tool)
-        return dict(scm_tools=scm_tools)
+        return dict()
 
     @without_trailing_slash
     @expose('jinja:allura.ext.admin:templates/project_invitations.html')

http://git-wip-us.apache.org/repos/asf/allura/blob/3ac11020/Allura/allura/ext/admin/templates/project_admin.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/project_admin.html b/Allura/allura/ext/admin/templates/project_admin.html
index 6920236..2d42a68 100644
--- a/Allura/allura/ext/admin/templates/project_admin.html
+++ b/Allura/allura/ext/admin/templates/project_admin.html
@@ -17,105 +17,113 @@
        under the License.
 -#}
 {% extends g.theme.master %}
-{% set wiki_found = False %}
-{% set tracker_found = False %}
-{% set forum_found = False %}
 
-{% block title %}{{c.project.name}} / Admin{% endblock %}
+{% do g.register_forge_js('js/hopscotch.min.js') %} {# location='body_js_tail' #}
+{% do g.register_forge_css('css/hopscotch.min.css') %} {# location='body_js_tail' #}
 
-{% block header %}Project Admin{% endblock %}
+{% block title %}{{c.project.name}} / Admin Welcome{% endblock %}
 
-{% block content %}
-  <p>{{config.site_name}} projects come with a number of Tools, which can be configured and adjusted to your needs.</p>
+{% block header %}Welcome to your {{config.site_name}} project!{% endblock %}
 
-  <div class="grid-1">
-    &nbsp;
-  </div>
-  <div class="grid-13">
-    <h3>Project Setup</h3>
-    <p>The first thing to do to setup your project is to create a solid description, so folks coming to your page can figure out what the project is all about. You'll then want to input information about the project, and we'll make sure all this relevant information gets added to the {{config.site_name}} project directory.</p>
-  </div>
-  <div class="grid-4">
-    <a href="overview">Update MetaData</a>
-  </div>
-  <div style="clear:both"></div>
+{% set tour = {
+    "id": "admin-welcome",
+    "showPrevButton": false,
+    "steps": [
+        {
+            "title": "Describe your project",
+            "content": "Enter your project description, then upload screenshots if you've got them, and categorize your project.  This helps people know what your project is all about.",
+            "target": ".admin-nav-metadata",
+            "placement": "right",
+            "yOffset": -17,
+        },
+        {
+            "title": "Add tools",
+            "content": "Add more code repositories, ticket trackers, wikis, links, whatever your project needs!",
+            "target": 'add-tool-container',
+            "__comment": "if many tools are installed, this target could be on the second row, but should be rare, particularly with brand new projects",
+            "placement": "bottom",
+            "xOffset": -180,
+            "arrowOffset": 200,
+        },
+        {
+            "title": "Customize",
+            "content": "Rename and change settings for your tools.  Remove any you don't need.",
+            "target": "toggle-admin-btn",
+            "placement": "top",
+            "xOffset": -275,
+            "arrowOffset": 270,
+        },
+        {
+            "title": "Add users",
+            "content": "Add other developers to your project.",
+            "target": ".admin-nav-user-perms",
+            "placement": "right",
+            "yOffset": -17,
+        },
+        {
+            "title": "Start coding",
+            "content": "Commit your code to your repo.  Or, if you have code somewhere else, <a href='ext/import/'>import it</a> or add link to it (add an 'External Link' tool).",
+            "target": ".tool-git-32,.tool-hg-32,.tool-svn-32",
+            "placement": "bottom",
+            "xOffset": -17,
+        },
+    ]
+} %}
 
-  <div class="grid-1">
-    &nbsp;
-  </div>
-  <div class="grid-13">
-    <h3>Wikis</h3>
-    <p>You can create documentation, post proposed feature descriptions, and discuss these shared documents.</p>
-  </div>
-  <div class="grid-4">
-    {% for tool in c.project.app_configs %}
-      {% if tool.tool_name.lower() == 'wiki' and not wiki_found %}
-        <a href="{{c.project.url()}}{{tool.options.mount_point}}/add">Add Page</a><br>
-        <a href="{{c.project.url()}}{{tool.options.mount_point}}/">View Wiki</a>
-        {% set wiki_found = True %}
-      {% endif %}
-    {% endfor %}
-  </div>
-  <div style="clear:both"></div>
-  {% if scm_tools %}
-    {% set tool = scm_tools[0] %}
-      <div class="grid-1">
-        &nbsp;
-      </div>
-    <div class="grid-13">
-      <h3>Code</h3>
-      <p>Source Control Management will help you keep track of code changes over time. A repository has already been created, checkout, add files and upload code.</p>
-    </div>
-    <div class="grid-4">
-      <a href="{{c.project.url()}}{{tool.options.mount_point}}/fork">Checkout repo</a><br>
-      <a href="{{c.project.url()}}{{tool.options.mount_point}}/">View source</a>
-    </div>
-  {% endif %}
-  <div style="clear:both"></div>
 
-  <div class="grid-1">
-    &nbsp;
-  </div>
-  <div class="grid-13">
-  <h3>Tickets</h3>
-    <p>With the {{config.site_name}} tracker you can keep track of items of work that need to be done. You can create one or more trackers for bugs, enhancements, tasks, that will help you plan and manage your development process.</p>
-  </div>
-  <div class="grid-4">
-    {% for tool in c.project.app_configs %}
-      {% if tool.tool_name.lower() == 'tickets' and not tracker_found %}
-        <a href="{{c.project.url()}}{{tool.options.mount_point}}/new">Create Ticket</a><br>
-        <a href="{{c.project.url()}}{{tool.options.mount_point}}/milestones">Edit Milestones</a><br>
-        <a href="{{c.project.url()}}{{tool.options.mount_point}}/">View Tickets</a>
-        {% set tracker_found = True %}
-      {% endif %}
-    {% endfor %}
-  </div>
-  <div style="clear:both"></div>
+{% block content %}
+    <p>This is the Admin area of your project, where you can set your project details, permissions, options and more.
+        Your project has many tools available in the top menu, each with its own customization and settings.</p>
+    <p>Here's a quick tour of a few important things to get started:</p>
 
-  <div class="grid-1">
-    &nbsp;
-  </div>
-  <div class="grid-13">
-    <h3>Forums</h3>
-    <p>To use the forums, create a couple of forums, post introductory messages, and check out the spam controll/post moderation options.</p>
-  </div>
-  <div class="grid-4">
-    {% for tool in c.project.app_configs %}
-      {% if tool.tool_name == 'Discussion' and not forum_found %}
-          <a href="{{c.project.url()}}{{tool.options.mount_point}}/?new_forum=True">Create Forum</a><br>
-          <a href="{{c.project.url()}}{{tool.options.mount_point}}/">View Forums</a>
-        {% set forum_found = True %}
-      {% endif %}
+    {% for step in tour.steps %}
+    <div class="tour-step-info">
+        <h2>{{ step.title }}</h2>
+        <p>{{ step.content|safe }}
+        </p>
+        <div class="hopscotch-bubble not-really-hopscotch-bubble">
+            <button class="tour-show hopscotch-nav-button next" data-tour-id="{{ loop.index0 }}">Show Me</button>
+        </div>
+    </div>
     {% endfor %}
-  </div>
 {% endblock %}
 
 {% block extra_css %}
-<style>
-    .grid-20.pad .grid-1,
-    .grid-20.pad .grid-13,
-    .grid-20.pad .grid-4 {
-        margin-top: 2em;
+<style type="text/css">
+    div.hopscotch-bubble.not-really-hopscotch-bubble {
+        border: none;
+        position: initial;
+    }
+    .tour-step-info {
+        margin-bottom: 20px;
+    }
+    .tour-step-info h2 {
+        padding-bottom: 0;
+    }
+    .tour-step-info p {
+        padding-bottom: 8px;
+    }
+    .tour-step-info button {
+        float: none;
     }
 </style>
+{% endblock %}
+
+{% block extra_js %}
+<script>
+$(function() {
+    var tour = {{ h.escape_json(tour)|safe }};
+    tour.onError = function() {
+        var step = hopscotch.getCurrStepNum();
+        console.warn('Error on tour step #', step, tour.steps[step]);
+    };
+    $('.tour-show').click(function(){
+        var step = $(this).data('tour-id');
+        hopscotch.startTour(tour, step);
+    });
+    {% if 'first-visit' in request.params %}
+        hopscotch.startTour(tour);
+    {% endif %}
+});
+</script>
 {% endblock %}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/allura/blob/3ac11020/Allura/allura/lib/helpers.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/helpers.py b/Allura/allura/lib/helpers.py
index c85e1e1..6e10208 100644
--- a/Allura/allura/lib/helpers.py
+++ b/Allura/allura/lib/helpers.py
@@ -1225,16 +1225,6 @@ def get_filter(ctx, filter_name):
         return partial(filter_, ctx.environment)
 
 
-@contextfilter
-def map_jinja_filter(ctx, seq, filter_name, *a, **kw):
-    """
-    A Jinja2 filter that applies the named filter with the
-    given args to the sequence this filter is applied to.
-    """
-    filter_ = get_filter(ctx, filter_name)
-    return [filter_(value, *a, **kw) for value in seq]
-
-
 def unidiff(old, new):
     """Returns unified diff between `one` and `two`."""
     return '\n'.join(difflib.unified_diff(

http://git-wip-us.apache.org/repos/asf/allura/blob/3ac11020/Allura/allura/nf/allura/css/site_style.css
----------------------------------------------------------------------
diff --git a/Allura/allura/nf/allura/css/site_style.css b/Allura/allura/nf/allura/css/site_style.css
index 8cb3805..006db0f 100644
--- a/Allura/allura/nf/allura/css/site_style.css
+++ b/Allura/allura/nf/allura/css/site_style.css
@@ -948,6 +948,9 @@ thead th{
   height: auto;
   float: left;
 }
+.hopscotch-bubble button {
+  float: initial;
+}
 
 button, input[type="submit"], input[type="reset"], input[type="button"] {
   padding-bottom: 4px;
@@ -1077,6 +1080,12 @@ a.btn:active {
   background-image: -moz-linear-gradient(top, #ffffff 0%, #eeeeee 100%);
   background-image: linear-gradient(top, #ffffff 0%, #eeeeee 100%);
 }
+.hopscotch-bubble button:hover {
+  border-color: transparent !important;
+}
+.hopscotch-bubble button.hopscotch-bubble-close:hover {
+  border-width: 0 !important;
+}
 
 button[disabled]:hover, input[type=submit][disabled]:hover, input[type=reset][disabled]:hover, input[type=button][disabled]:hover {
   cursor: auto;
@@ -1095,6 +1104,10 @@ li.active, .btn.active, .btn:active:hover, button:active:hover, .btn-set .btn.ic
   -o-box-shadow: rgba(0, 0, 0, 0.1) 0 -2px 5px inset,rgba(0, 0, 0, 0.2) 0 1px 3px inset;
   box-shadow: rgba(0, 0, 0, 0.1) 0 -2px 5px inset,rgba(0, 0, 0, 0.2) 0 1px 3px inset;
 }
+.hopscotch-bubble button:active:hover {
+  box-shadow: none;
+  background: transparent url(../../../allura/images/sprite-green.png) -192px -92px no-repeat; // reset to hopscotch.min.css value
+}
 
 button[disabled]:active:hover, input[type=submit][disabled]:active:hover, input[type=reset][disabled]:active:hover, input[type=button][disabled]:active:hover {
   text-shadow: #fff 0 1px;


[08/12] allura git commit: [#3593] add hopscotch files (with CSS tweak to slightly different images path)

Posted by br...@apache.org.
[#3593] add hopscotch files (with CSS tweak to slightly different images path)


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

Branch: refs/heads/db/3593
Commit: a76915d02d28b1787f4464a75ce9a754a351df96
Parents: 62ceed5
Author: Dave Brondsema <da...@brondsema.net>
Authored: Wed Jul 6 18:39:50 2016 -0400
Committer: Dave Brondsema <da...@brondsema.net>
Committed: Tue Jul 12 10:00:18 2016 -0400

----------------------------------------------------------------------
 Allura/allura/public/nf/css/hopscotch.min.css   |  17 +++++++++++++++++
 Allura/allura/public/nf/images/sprite-green.png | Bin 0 -> 5405 bytes
 Allura/allura/public/nf/js/hopscotch.min.js     |  17 +++++++++++++++++
 3 files changed, 34 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/a76915d0/Allura/allura/public/nf/css/hopscotch.min.css
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/css/hopscotch.min.css b/Allura/allura/public/nf/css/hopscotch.min.css
new file mode 100644
index 0000000..5df4c7d
--- /dev/null
+++ b/Allura/allura/public/nf/css/hopscotch.min.css
@@ -0,0 +1,17 @@
+/**! hopscotch - v0.2.6
+*
+* Copyright 2016 LinkedIn Corp. All rights reserved.
+*
+* Licensed 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.
+*/
+.animated{-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-ms-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:1s;-moz-animation-duration:1s;-ms-animation-duration:1s;-o-animation-duration:1s;animation-duration:1s}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(20px)}100%{opacity:1;-webkit-transform:translateY(0)}}@-moz-keyframes fadeInUp{0%{opacity:0;-moz-transform:translateY(20px)}100%{opacity:1;-moz-transform:translateY(0)}}@-o-keyframes fadeInUp{0%{opacity:0;-o-transform:translateY(20px)}100%{opacity:1;-o-transform:translateY(0)}}@keyframes fadeInUp{0%{opacity:0;transform:translateY(20px)}100%{opacity:1;transform:translateY(0)}}.fade-in-up{-webkit-animation-name:fadeInUp;-moz-animation-name:fadeInUp;-o-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-20px)}100%{opacity:1;-webkit-transform:translateY(0)}}@-moz-keyfram
 es fadeInDown{0%{opacity:0;-moz-transform:translateY(-20px)}100%{opacity:1;-moz-transform:translateY(0)}}@-o-keyframes fadeInDown{0%{opacity:0;-ms-transform:translateY(-20px)}100%{opacity:1;-ms-transform:translateY(0)}}@keyframes fadeInDown{0%{opacity:0;transform:translateY(-20px)}100%{opacity:1;transform:translateY(0)}}.fade-in-down{-webkit-animation-name:fadeInDown;-moz-animation-name:fadeInDown;-o-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(-20px)}100%{opacity:1;-webkit-transform:translateX(0)}}@-moz-keyframes fadeInRight{0%{opacity:0;-moz-transform:translateX(-20px)}100%{opacity:1;-moz-transform:translateX(0)}}@-o-keyframes fadeInRight{0%{opacity:0;-o-transform:translateX(-20px)}100%{opacity:1;-o-transform:translateX(0)}}@keyframes fadeInRight{0%{opacity:0;transform:translateX(-20px)}100%{opacity:1;transform:translateX(0)}}.fade-in-right{-webkit-animation-name:fadeInRight;-moz-animation-name:fadeInR
 ight;-o-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(20px)}100%{opacity:1;-webkit-transform:translateX(0)}}@-moz-keyframes fadeInLeft{0%{opacity:0;-moz-transform:translateX(20px)}100%{opacity:1;-moz-transform:translateX(0)}}@-o-keyframes fadeInLeft{0%{opacity:0;-o-transform:translateX(20px)}100%{opacity:1;-o-transform:translateX(0)}}@keyframes fadeInLeft{0%{opacity:0;transform:translateX(20px)}100%{opacity:1;transform:translateX(0)}}.fade-in-left{-webkit-animation-name:fadeInLeft;-moz-animation-name:fadeInLeft;-o-animation-name:fadeInLeft;animation-name:fadeInLeft}div.hopscotch-bubble .hopscotch-nav-button{font-weight:700;border-width:1px;border-style:solid;cursor:pointer;margin:0;overflow:visible;text-decoration:none!important;width:auto;padding:0 10px;height:26px;line-height:24px;font-size:12px;*zoom:1;white-space:nowrap;display:-moz-inline-stack;display:inline-block;*vertical-align:auto;zoom:1;*displ
 ay:inline;vertical-align:middle;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}div.hopscotch-bubble .hopscotch-nav-button:hover{*zoom:1;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.25);-moz-box-shadow:0 1px 3px rgba(0,0,0,.25);box-shadow:0 1px 3px rgba(0,0,0,.25)}div.hopscotch-bubble .hopscotch-nav-button:active{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.25) inset;-moz-box-shadow:0 1px 2px rgba(0,0,0,.25) inset;box-shadow:0 1px 2px rgba(0,0,0,.25) inset}div.hopscotch-bubble .hopscotch-nav-button.next{border-color:#1b5480;color:#fff;margin:0 0 0 10px;text-shadow:0 1px 1px rgba(0,0,0,.35);background-color:#287bbc;filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#287bbc', endColorstr='#23639a');background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#287bbc),color-stop(100%,#23639a));background-image:-webki
 t-linear-gradient(top,#287bbc 0,#23639a 100%);background-image:-moz-linear-gradient(top,#287bbc 0,#23639a 100%);background-image:-o-linear-gradient(top,#287bbc 0,#23639a 100%);background-image:linear-gradient(top,#287bbc 0,#23639a 100%)}div.hopscotch-bubble .hopscotch-nav-button.next:hover{background-color:#2672ae;filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#2672ae', endColorstr='#1e4f7e');background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#2672ae),color-stop(100%,#1e4f7e));background-image:-webkit-linear-gradient(top,#2672ae 0,#1e4f7e 100%);background-image:-moz-linear-gradient(top,#2672ae 0,#1e4f7e 100%);background-image:-o-linear-gradient(top,#2672ae 0,#1e4f7e 100%);background-image:linear-gradient(top,#2672ae 0,#1e4f7e 100%)}div.hopscotch-bubble .hopscotch-nav-button.prev{border-color:#a7a7a7;color:#444;text-shadow:0 1px 1px rgba(255,255,255,.75);background-color:#f2f2f2;filter:progid:DXImageTransform.Microsoft.gradient(gra
 dientType=0, startColorstr='#f2f2f2', endColorstr='#e9e9e9');background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#f2f2f2),color-stop(100%,#e9e9e9));background-image:-webkit-linear-gradient(top,#f2f2f2 0,#e9e9e9 100%);background-image:-moz-linear-gradient(top,#f2f2f2 0,#e9e9e9 100%);background-image:-o-linear-gradient(top,#f2f2f2 0,#e9e9e9 100%);background-image:linear-gradient(top,#f2f2f2 0,#e9e9e9 100%)}div.hopscotch-bubble .hopscotch-nav-button.prev:hover{background-color:#e8e8e8;filter:progid:DXImageTransform.Microsoft.gradient(gradientType=0, startColorstr='#FFE8E8E8', endColorstr='#FFA9A9A9');background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#e8e8e8),color-stop(13%,#e3e3e3),color-stop(32%,#d7d7d7),color-stop(71%,#b9b9b9),color-stop(100%,#a9a9a9));background-image:-webkit-linear-gradient(top,#e8e8e8 0,#e3e3e3 13%,#d7d7d7 32%,#b9b9b9 71%,#a9a9a9 100%);background-image:-moz-linear-gradient(top,#e8e8e8 0,#e3e3e3 13%,#d7d7d7 32%,#b9b9b9 71%,#a9a
 9a9 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#e3e3e3 13%,#d7d7d7 32%,#b9b9b9 71%,#a9a9a9 100%);background-image:linear-gradient(top,#e8e8e8 0,#e3e3e3 13%,#d7d7d7 32%,#b9b9b9 71%,#a9a9a9 100%)}div.hopscotch-bubble{background-color:#fff;border:5px solid #000;border:5px solid rgba(0,0,0,.5);color:#333;font-family:Helvetica,Arial;font-size:13px;position:absolute;z-index:999999;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-moz-background-clip:padding;-webkit-background-clip:padding;background-clip:padding-box}div.hopscotch-bubble *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}div.hopscotch-bubble.animate{-moz-transition-property:top,left;-moz-transition-duration:1s;-moz-transition-timing-function:ease-in-out;-ms-transition-property:top,left;-ms-transition-duration:1s;-ms-transition-timing-function:ease-in-out;-o-transition-property:top,left;-o-transition-duration:1s;-o-transition-timing-function:ease
 -in-out;-webkit-transition-property:top,left;-webkit-transition-duration:1s;-webkit-transition-timing-function:ease-in-out;transition-property:top,left;transition-duration:1s;transition-timing-function:ease-in-out}div.hopscotch-bubble.invisible{opacity:0}div.hopscotch-bubble.hide,div.hopscotch-bubble .hide,div.hopscotch-bubble .hide-all{display:none}div.hopscotch-bubble h3{color:#000;font-family:Helvetica,Arial;font-size:16px;font-weight:700;line-height:19px;margin:-1px 15px 0 0;padding:0}div.hopscotch-bubble .hopscotch-bubble-container{padding:15px;position:relative;text-align:left;-webkit-font-smoothing:antialiased}div.hopscotch-bubble .hopscotch-content{font-family:Helvetica,Arial;font-weight:400;line-height:17px;margin:-5px 0 11px;padding-top:8px}div.hopscotch-bubble .hopscotch-bubble-content{margin:0 0 0 40px}div.hopscotch-bubble.no-number .hopscotch-bubble-content{margin:0}div.hopscotch-bubble .hopscotch-bubble-close{-webkit-appearance:none;-moz-appearance:none;appearance:none
 ;border:0;color:#000;background:transparent url(../images/sprite-green.png) -192px -92px no-repeat;display:block;padding:8px;position:absolute;text-decoration:none;text-indent:-9999px;width:8px;height:8px;top:0;right:0}div.hopscotch-bubble .hopscotch-bubble-close.hide,div.hopscotch-bubble .hopscotch-bubble-close.hide-all{display:none}div.hopscotch-bubble .hopscotch-bubble-number{background:transparent url(../images/sprite-green.png) 0 0 no-repeat;color:#fff;display:block;float:left;font-size:17px;font-weight:700;line-height:31px;padding:0 10px 0 0;text-align:center;width:30px;height:30px}div.hopscotch-bubble .hopscotch-bubble-arrow-container{position:absolute;width:34px;height:34px}div.hopscotch-bubble .hopscotch-bubble-arrow-container .hopscotch-bubble-arrow,div.hopscotch-bubble .hopscotch-bubble-arrow-container .hopscotch-bubble-arrow-border{width:0;height:0}div.hopscotch-bubble .hopscotch-bubble-arrow-container.up{top:-22px;left:10px}div.hopscotch-bubble .hopscotch-bubble-arrow-c
 ontainer.up .hopscotch-bubble-arrow{border-bottom:17px solid #fff;border-left:17px solid transparent;border-right:17px solid transparent;position:relative;top:-10px}div.hopscotch-bubble .hopscotch-bubble-arrow-container.up .hopscotch-bubble-arrow-border{border-bottom:17px solid #000;border-bottom:17px solid rgba(0,0,0,.5);border-left:17px solid transparent;border-right:17px solid transparent}div.hopscotch-bubble .hopscotch-bubble-arrow-container.down{bottom:-39px;left:10px}div.hopscotch-bubble .hopscotch-bubble-arrow-container.down .hopscotch-bubble-arrow{border-top:17px solid #fff;border-left:17px solid transparent;border-right:17px solid transparent;position:relative;top:-24px}div.hopscotch-bubble .hopscotch-bubble-arrow-container.down .hopscotch-bubble-arrow-border{border-top:17px solid #000;border-top:17px solid rgba(0,0,0,.5);border-left:17px solid transparent;border-right:17px solid transparent}div.hopscotch-bubble .hopscotch-bubble-arrow-container.left{top:10px;left:-22px}div
 .hopscotch-bubble .hopscotch-bubble-arrow-container.left .hopscotch-bubble-arrow{border-bottom:17px solid transparent;border-right:17px solid #fff;border-top:17px solid transparent;position:relative;left:7px;top:-34px}div.hopscotch-bubble .hopscotch-bubble-arrow-container.left .hopscotch-bubble-arrow-border{border-right:17px solid #000;border-right:17px solid rgba(0,0,0,.5);border-bottom:17px solid transparent;border-top:17px solid transparent}div.hopscotch-bubble .hopscotch-bubble-arrow-container.right{top:10px;right:-39px}div.hopscotch-bubble .hopscotch-bubble-arrow-container.right .hopscotch-bubble-arrow{border-bottom:17px solid transparent;border-left:17px solid #fff;border-top:17px solid transparent;position:relative;left:-7px;top:-34px}div.hopscotch-bubble .hopscotch-bubble-arrow-container.right .hopscotch-bubble-arrow-border{border-left:17px solid #000;border-left:17px solid rgba(0,0,0,.5);border-bottom:17px solid transparent;border-top:17px solid transparent}div.hopscotch-bu
 bble .hopscotch-actions{margin:10px 0 0;text-align:right}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/allura/blob/a76915d0/Allura/allura/public/nf/images/sprite-green.png
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/images/sprite-green.png b/Allura/allura/public/nf/images/sprite-green.png
new file mode 100644
index 0000000..89fc8f2
Binary files /dev/null and b/Allura/allura/public/nf/images/sprite-green.png differ

http://git-wip-us.apache.org/repos/asf/allura/blob/a76915d0/Allura/allura/public/nf/js/hopscotch.min.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/hopscotch.min.js b/Allura/allura/public/nf/js/hopscotch.min.js
new file mode 100644
index 0000000..0b677ee
--- /dev/null
+++ b/Allura/allura/public/nf/js/hopscotch.min.js
@@ -0,0 +1,17 @@
+/**! hopscotch - v0.2.6
+*
+* Copyright 2016 LinkedIn Corp. All rights reserved.
+*
+* Licensed 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(a,b){"use strict";if("function"==typeof define&&define.amd)define([],b);else if("object"==typeof exports)module.exports=b();else{var c="hopscotch";if(a[c])return;a[c]=b()}}(this,function(){var Hopscotch,HopscotchBubble,HopscotchCalloutManager,HopscotchI18N,customI18N,customRenderer,customEscape,utils,callbacks,helpers,winLoadHandler,defaultOpts,winHopscotch,templateToUse="bubble_default",Sizzle=window.Sizzle||null,undefinedStr="undefined",waitingToStart=!1,hasJquery=typeof jQuery!==undefinedStr,hasSessionStorage=!1,isStorageWritable=!1,document=window.document,validIdRegEx=/^[a-zA-Z]+[a-zA-Z0-9_-]*$/,rtlMatches={left:"right",right:"left"};try{typeof window.sessionStorage!==undefinedStr&&(hasSessionStorage=!0,sessionStorage.setItem("hopscotch.test.storage","ok"),sessionStorage.removeItem("hopscotch.test.storage"),isStorageWritable=!0)}catch(err){}return defaultOpts={smoothScroll:!0,scrollDuration:1e3,scrollTopMargin:200,showCloseButton:!0,showPrevButton:!1,showNextButton:!0
 ,bubbleWidth:280,bubblePadding:15,arrowWidth:20,skipIfNoElement:!0,isRtl:!1,cookieName:"hopscotch.tour.state"},Array.isArray||(Array.isArray=function(a){return"[object Array]"===Object.prototype.toString.call(a)}),winLoadHandler=function(){waitingToStart&&winHopscotch.startTour()},utils={addClass:function(a,b){var c,d,e,f;if(a.className){for(d=b.split(/\s+/),c=" "+a.className+" ",e=0,f=d.length;f>e;++e)c.indexOf(" "+d[e]+" ")<0&&(c+=d[e]+" ");a.className=c.replace(/^\s+|\s+$/g,"")}else a.className=b},removeClass:function(a,b){var c,d,e,f;for(d=b.split(/\s+/),c=" "+a.className+" ",e=0,f=d.length;f>e;++e)c=c.replace(" "+d[e]+" "," ");a.className=c.replace(/^\s+|\s+$/g,"")},hasClass:function(a,b){var c;return a.className?(c=" "+a.className+" ",-1!==c.indexOf(" "+b+" ")):!1},getPixelValue:function(a){var b=typeof a;return"number"===b?a:"string"===b?parseInt(a,10):0},valOrDefault:function(a,b){return typeof a!==undefinedStr?a:b},invokeCallbackArrayHelper:function(a){var b;return Array.is
 Array(a)&&(b=helpers[a[0]],"function"==typeof b)?b.apply(this,a.slice(1)):void 0},invokeCallbackArray:function(a){var b,c;if(Array.isArray(a)){if("string"==typeof a[0])return utils.invokeCallbackArrayHelper(a);for(b=0,c=a.length;c>b;++b)utils.invokeCallback(a[b])}},invokeCallback:function(a){return"function"==typeof a?a():"string"==typeof a&&helpers[a]?helpers[a]():utils.invokeCallbackArray(a)},invokeEventCallbacks:function(a,b){var c,d,e=callbacks[a];if(b)return this.invokeCallback(b);for(c=0,d=e.length;d>c;++c)this.invokeCallback(e[c].cb)},getScrollTop:function(){var a;return a=typeof window.pageYOffset!==undefinedStr?window.pageYOffset:document.documentElement.scrollTop},getScrollLeft:function(){var a;return a=typeof window.pageXOffset!==undefinedStr?window.pageXOffset:document.documentElement.scrollLeft},getWindowHeight:function(){return window.innerHeight||document.documentElement.clientHeight},addEvtListener:function(a,b,c){return a?a.addEventListener?a.addEventListener(b,c,!1
 ):a.attachEvent("on"+b,c):void 0},removeEvtListener:function(a,b,c){return a?a.removeEventListener?a.removeEventListener(b,c,!1):a.detachEvent("on"+b,c):void 0},documentIsReady:function(){return"complete"===document.readyState},evtPreventDefault:function(a){a.preventDefault?a.preventDefault():event&&(event.returnValue=!1)},extend:function(a,b){var c;for(c in b)b.hasOwnProperty(c)&&(a[c]=b[c])},getStepTargetHelper:function(a){var b=document.getElementById(a);if(b)return b;if(hasJquery)return b=jQuery(a),b.length?b[0]:null;if(Sizzle)return b=new Sizzle(a),b.length?b[0]:null;if(document.querySelector)try{return document.querySelector(a)}catch(c){}return/^#[a-zA-Z][\w-_:.]*$/.test(a)?document.getElementById(a.substring(1)):null},getStepTarget:function(a){var b;if(!a||!a.target)return null;if("string"==typeof a.target)return utils.getStepTargetHelper(a.target);if(Array.isArray(a.target)){var c,d;for(c=0,d=a.target.length;d>c;c++)if("string"==typeof a.target[c]&&(b=utils.getStepTargetHelp
 er(a.target[c])))return b;return null}return a.target},getI18NString:function(a){return customI18N[a]||HopscotchI18N[a]},setState:function(a,b,c){var d,e="";if(hasSessionStorage&&isStorageWritable)try{sessionStorage.setItem(a,b)}catch(f){isStorageWritable=!1,this.setState(a,b,c)}else hasSessionStorage&&sessionStorage.removeItem(a),c&&(d=new Date,d.setTime(d.getTime()+24*c*60*60*1e3),e="; expires="+d.toGMTString()),document.cookie=a+"="+b+e+"; path=/"},getState:function(a){var b,c,d,e=a+"=",f=document.cookie.split(";");if(hasSessionStorage&&(d=sessionStorage.getItem(a)))return d;for(b=0;b<f.length;b++){for(c=f[b];" "===c.charAt(0);)c=c.substring(1,c.length);if(0===c.indexOf(e)){d=c.substring(e.length,c.length);break}}return d},clearState:function(a){hasSessionStorage?sessionStorage.removeItem(a):this.setState(a,"",-1)},normalizePlacement:function(a){!a.placement&&a.orientation&&(a.placement=a.orientation)},flipPlacement:function(a){if(a.isRtl&&!a._isFlipped){var b,c,d=["orientation",
 "placement"];a.xOffset&&(a.xOffset=-1*this.getPixelValue(a.xOffset));for(c in d)b=d[c],a.hasOwnProperty(b)&&rtlMatches.hasOwnProperty(a[b])&&(a[b]=rtlMatches[a[b]]);a._isFlipped=!0}}},utils.addEvtListener(window,"load",winLoadHandler),callbacks={next:[],prev:[],start:[],end:[],show:[],error:[],close:[]},helpers={},HopscotchI18N={stepNums:null,nextBtn:"Next",prevBtn:"Back",doneBtn:"Done",skipBtn:"Skip",closeTooltip:"Close"},customI18N={},HopscotchBubble=function(a){this.init(a)},HopscotchBubble.prototype={isShowing:!1,currStep:void 0,setPosition:function(a){var b,c,d,e,f,g,h,i=utils.getStepTarget(a),j=this.element,k=this.arrowEl,l=a.isRtl?"right":"left";if(utils.flipPlacement(a),utils.normalizePlacement(a),c=j.offsetWidth,b=j.offsetHeight,utils.removeClass(j,"fade-in-down fade-in-up fade-in-left fade-in-right"),d=i.getBoundingClientRect(),h=a.isRtl?d.right-c:d.left,"top"===a.placement)e=d.top-b-this.opt.arrowWidth,f=h;else if("bottom"===a.placement)e=d.bottom+this.opt.arrowWidth,f=h;
 else if("left"===a.placement)e=d.top,f=d.left-c-this.opt.arrowWidth;else{if("right"!==a.placement)throw new Error("Bubble placement failed because step.placement is invalid or undefined!");e=d.top,f=d.right+this.opt.arrowWidth}g="center"!==a.arrowOffset?utils.getPixelValue(a.arrowOffset):a.arrowOffset,g?"top"===a.placement||"bottom"===a.placement?(k.style.top="","center"===g?k.style[l]=Math.floor(c/2-k.offsetWidth/2)+"px":k.style[l]=g+"px"):("left"===a.placement||"right"===a.placement)&&(k.style[l]="","center"===g?k.style.top=Math.floor(b/2-k.offsetHeight/2)+"px":k.style.top=g+"px"):(k.style.top="",k.style[l]=""),"center"===a.xOffset?f=d.left+i.offsetWidth/2-c/2:f+=utils.getPixelValue(a.xOffset),"center"===a.yOffset?e=d.top+i.offsetHeight/2-b/2:e+=utils.getPixelValue(a.yOffset),a.fixedElement||(e+=utils.getScrollTop(),f+=utils.getScrollLeft()),j.style.position=a.fixedElement?"fixed":"absolute",j.style.top=e+"px",j.style.left=f+"px"},render:function(a,b,c){var d,e,f,g,h,i,j,k,l,m,n=t
 his.element;if(a?this.currStep=a:this.currStep&&(a=this.currStep),this.opt.isTourBubble?(g=winHopscotch.getCurrTour(),g&&(e=g.customData,d=g.customRenderer,a.isRtl=a.hasOwnProperty("isRtl")?a.isRtl:g.hasOwnProperty("isRtl")?g.isRtl:this.opt.isRtl,f=g.unsafe,Array.isArray(g.steps)&&(h=g.steps.length,i=this._getStepI18nNum(this._getStepNum(h-1)),k=this._getStepNum(b)===this._getStepNum(h-1)))):(e=a.customData,d=a.customRenderer,f=a.unsafe,a.isRtl=a.hasOwnProperty("isRtl")?a.isRtl:this.opt.isRtl),j=k?utils.getI18NString("doneBtn"):a.showSkip?utils.getI18NString("skipBtn"):utils.getI18NString("nextBtn"),utils.flipPlacement(a),utils.normalizePlacement(a),this.placement=a.placement,m={i18n:{prevBtn:utils.getI18NString("prevBtn"),nextBtn:j,closeTooltip:utils.getI18NString("closeTooltip"),stepNum:this._getStepI18nNum(this._getStepNum(b)),numSteps:i},buttons:{showPrev:utils.valOrDefault(a.showPrevButton,this.opt.showPrevButton)&&this._getStepNum(b)>0,showNext:utils.valOrDefault(a.showNextBut
 ton,this.opt.showNextButton),showCTA:utils.valOrDefault(a.showCTAButton&&a.ctaLabel,!1),ctaLabel:a.ctaLabel,showClose:utils.valOrDefault(this.opt.showCloseButton,!0)},step:{num:b,isLast:utils.valOrDefault(k,!1),title:a.title||"",content:a.content||"",isRtl:a.isRtl,placement:a.placement,padding:utils.valOrDefault(a.padding,this.opt.bubblePadding),width:utils.getPixelValue(a.width)||this.opt.bubbleWidth,customData:a.customData||{}},tour:{isTour:this.opt.isTourBubble,numSteps:h,unsafe:utils.valOrDefault(f,!1),customData:e||{}}},"function"==typeof d)n.innerHTML=d(m);else if("string"==typeof d){if(!winHopscotch.templates||"function"!=typeof winHopscotch.templates[d])throw new Error('Bubble rendering failed - template "'+d+'" is not a function.');n.innerHTML=winHopscotch.templates[d](m)}else if(customRenderer)n.innerHTML=customRenderer(m);else{if(!winHopscotch.templates||"function"!=typeof winHopscotch.templates[templateToUse])throw new Error('Bubble rendering failed - template "'+templat
 eToUse+'" is not a function.');n.innerHTML=winHopscotch.templates[templateToUse](m)}for(children=n.children,numChildren=children.length,l=0;l<numChildren;l++)node=children[l],utils.hasClass(node,"hopscotch-arrow")&&(this.arrowEl=node);return n.style.zIndex="number"==typeof a.zindex?a.zindex:"",this._setArrow(a.placement),this.hide(!1),this.setPosition(a),c&&c(!a.fixedElement),this},_getStepNum:function(a){var b,c,d=0,e=winHopscotch.getSkippedStepsIndexes(),f=e.length;for(c=0;f>c;c++)b=e[c],a>b&&d++;return a-d},_getStepI18nNum:function(a){var b=utils.getI18NString("stepNums");return b&&a<b.length?a=b[a]:a+=1,a},_setArrow:function(a){utils.removeClass(this.arrowEl,"down up right left"),"top"===a?utils.addClass(this.arrowEl,"down"):"bottom"===a?utils.addClass(this.arrowEl,"up"):"left"===a?utils.addClass(this.arrowEl,"right"):"right"===a&&utils.addClass(this.arrowEl,"left")},_getArrowDirection:function(){return"top"===this.placement?"down":"bottom"===this.placement?"up":"left"===this.pl
 acement?"right":"right"===this.placement?"left":void 0},show:function(){var a=this,b="fade-in-"+this._getArrowDirection(),c=1e3;return utils.removeClass(this.element,"hide"),utils.addClass(this.element,b),setTimeout(function(){utils.removeClass(a.element,"invisible")},50),setTimeout(function(){utils.removeClass(a.element,b)},c),this.isShowing=!0,this},hide:function(a){var b=this.element;return a=utils.valOrDefault(a,!0),b.style.top="",b.style.left="",a?(utils.addClass(b,"hide"),utils.removeClass(b,"invisible")):(utils.removeClass(b,"hide"),utils.addClass(b,"invisible")),utils.removeClass(b,"animate fade-in-up fade-in-down fade-in-right fade-in-left"),this.isShowing=!1,this},destroy:function(){var a=this.element;a&&a.parentNode.removeChild(a),utils.removeEvtListener(a,"click",this.clickCb)},_handleBubbleClick:function(a){function b(c){return c===a.currentTarget?null:utils.hasClass(c,"hopscotch-cta")?"cta":utils.hasClass(c,"hopscotch-next")?"next":utils.hasClass(c,"hopscotch-prev")?"p
 rev":utils.hasClass(c,"hopscotch-close")?"close":b(c.parentElement)}var c;a=a||window.event;var d=a.target||a.srcElement;if(c=b(d),"cta"===c)this.opt.isTourBubble||winHopscotch.getCalloutManager().removeCallout(this.currStep.id),this.currStep.onCTA&&utils.invokeCallback(this.currStep.onCTA);else if("next"===c)winHopscotch.nextStep(!0);else if("prev"===c)winHopscotch.prevStep(!0);else if("close"===c){if(this.opt.isTourBubble){var e=winHopscotch.getCurrStepNum(),f=winHopscotch.getCurrTour(),g=e===f.steps.length-1;utils.invokeEventCallbacks("close"),winHopscotch.endTour(!0,g)}else this.opt.onClose&&utils.invokeCallback(this.opt.onClose),this.opt.id&&!this.opt.isTourBubble?winHopscotch.getCalloutManager().removeCallout(this.opt.id):this.destroy();utils.evtPreventDefault(a)}},init:function(a){var b,c,d,e,f=document.createElement("div"),g=this,h=!1;this.element=f,e={showPrevButton:defaultOpts.showPrevButton,showNextButton:defaultOpts.showNextButton,bubbleWidth:defaultOpts.bubbleWidth,bubb
 lePadding:defaultOpts.bubblePadding,arrowWidth:defaultOpts.arrowWidth,isRtl:defaultOpts.isRtl,showNumber:!0,isTourBubble:!0},a=typeof a===undefinedStr?{}:a,utils.extend(e,a),this.opt=e,f.className="hopscotch-bubble animated",e.isTourBubble?(d=winHopscotch.getCurrTour(),d&&utils.addClass(f,"tour-"+d.id)):utils.addClass(f,"hopscotch-callout no-number"),b=function(){!h&&g.isShowing&&(h=!0,setTimeout(function(){g.setPosition(g.currStep),h=!1},100))},utils.addEvtListener(window,"resize",b),this.clickCb=function(a){g._handleBubbleClick(a)},utils.addEvtListener(f,"click",this.clickCb),this.hide(),utils.documentIsReady()?document.body.appendChild(f):(document.addEventListener?(c=function(){document.removeEventListener("DOMContentLoaded",c),window.removeEventListener("load",c),document.body.appendChild(f)},document.addEventListener("DOMContentLoaded",c,!1)):(c=function(){"complete"===document.readyState&&(document.detachEvent("onreadystatechange",c),window.detachEvent("onload",c),document.bo
 dy.appendChild(f))},document.attachEvent("onreadystatechange",c)),utils.addEvtListener(window,"load",c))}},HopscotchCalloutManager=function(){var a={},b={};this.createCallout=function(c){var d;if(!c.id)throw new Error("Must specify a callout id.");if(!validIdRegEx.test(c.id))throw new Error("Callout ID is using an invalid format. Use alphanumeric, underscores, and/or hyphens only. First character must be a letter.");if(a[c.id])throw new Error("Callout by that id already exists. Please choose a unique id.");if(!utils.getStepTarget(c))throw new Error("Must specify existing target element via 'target' option.");return c.showNextButton=c.showPrevButton=!1,c.isTourBubble=!1,d=new HopscotchBubble(c),a[c.id]=d,b[c.id]=c,d.render(c,null,function(){d.show(),c.onShow&&utils.invokeCallback(c.onShow)}),d},this.getCallout=function(b){return a[b]},this.removeAllCallouts=function(){var b;for(b in a)a.hasOwnProperty(b)&&this.removeCallout(b)},this.removeCallout=function(c){var d=a[c];a[c]=null,b[c]
 =null,d&&d.destroy()},this.refreshCalloutPositions=function(){var c,d,e;for(c in a)a.hasOwnProperty(c)&&b.hasOwnProperty(c)&&(d=a[c],e=b[c],d&&e&&d.setPosition(e))}},Hopscotch=function(a){var b,c,d,e,f,g,h,i,j=this,k={},l=[],m=function(a){return b&&b.element&&b.element.parentNode||(b=new HopscotchBubble(d)),a&&utils.extend(b.opt,{bubblePadding:o("bubblePadding"),bubbleWidth:o("bubbleWidth"),showNextButton:o("showNextButton"),showPrevButton:o("showPrevButton"),showCloseButton:o("showCloseButton"),arrowWidth:o("arrowWidth"),isRtl:o("isRtl")}),b},n=function(){b&&(b.destroy(),b=null)},o=function(a){return"undefined"==typeof d?defaultOpts[a]:utils.valOrDefault(d[a],defaultOpts[a])},p=function(){var a;return a=!e||0>f||f>=e.steps.length?null:e.steps[f]},q=function(){j.nextStep()},r=function(a){var b,c,d,e,f,g,h=m(),i=h.element,j=utils.getPixelValue(i.style.top),k=j+utils.getPixelValue(i.offsetHeight),l=utils.getStepTarget(p()),n=l.getBoundingClientRect(),q=n.top+utils.getScrollTop(),r=n.b
 ottom+utils.getScrollTop(),s=q>j?j:q,t=k>r?k:r,u=utils.getScrollTop(),v=u+utils.getWindowHeight(),w=s-o("scrollTopMargin");s>=u&&(s<=u+o("scrollTopMargin")||v>=t)?a&&a():o("smoothScroll")?typeof YAHOO!==undefinedStr&&typeof YAHOO.env!==undefinedStr&&typeof YAHOO.env.ua!==undefinedStr&&typeof YAHOO.util!==undefinedStr&&typeof YAHOO.util.Scroll!==undefinedStr?(b=YAHOO.env.ua.webkit?document.body:document.documentElement,d=YAHOO.util.Easing?YAHOO.util.Easing.easeOut:void 0,c=new YAHOO.util.Scroll(b,{scroll:{to:[0,w]}},o("scrollDuration")/1e3,d),c.onComplete.subscribe(a),c.animate()):hasJquery?jQuery("body, html").animate({scrollTop:w},o("scrollDuration"),a):(0>w&&(w=0),e=u>s?-1:1,f=Math.abs(u-w)/(o("scrollDuration")/10),(g=function(){var b=utils.getScrollTop(),c=b+e*f;return e>0&&c>=w||0>e&&w>=c?(c=w,a&&a(),void window.scrollTo(0,c)):(window.scrollTo(0,c),utils.getScrollTop()===b?void(a&&a()):void setTimeout(g,10))})()):(window.scrollTo(0,w),a&&a())},s=function(a,b){var c,d,g;f+a>=0&&f
 +a<e.steps.length?(f+=a,d=p(),g=function(){c=utils.getStepTarget(d),c?(k[f]&&delete k[f],b(f)):(k[f]=!0,utils.invokeEventCallbacks("error"),s(a,b))},d.delay?setTimeout(g,d.delay):g()):b(-1)},t=function(a,b){var c,d,g,h,i=m(),j=this;if(i.hide(),a=utils.valOrDefault(a,!0),c=p(),c.nextOnTargetClick&&utils.removeEvtListener(utils.getStepTarget(c),"click",q),d=c,g=b>0?d.multipage:f>0&&e.steps[f-1].multipage,h=function(c){var e;if(-1===c)return this.endTour(!0);if(a&&(e=b>0?utils.invokeEventCallbacks("next",d.onNext):utils.invokeEventCallbacks("prev",d.onPrev)),c===f){if(g)return void x();e=utils.valOrDefault(e,!0),e?this.showStep(c):this.endTour(!1)}},!g&&o("skipIfNoElement"))s(b,function(a){h.call(j,a)});else if(f+b>=0&&f+b<e.steps.length){if(f+=b,c=p(),!utils.getStepTarget(c)&&!g)return utils.invokeEventCallbacks("error"),this.endTour(!0,!1);h.call(this,f)}else if(f+b===e.steps.length)return this.endTour();return this},u=function(a){var b,c,d,e={};for(b in a)a.hasOwnProperty(b)&&"id"!=
 =b&&"steps"!==b&&(e[b]=a[b]);return i.call(this,e,!0),c=utils.getState(o("cookieName")),c&&(d=c.split(":"),g=d[0],h=d[1],d.length>2&&(l=d[2].split(",")),h=parseInt(h,10)),this},v=function(a,b,c){var d,e;if(f=a||0,k=b||{},d=p(),e=utils.getStepTarget(d))return void c(f);if(!e){if(utils.invokeEventCallbacks("error"),k[f]=!0,o("skipIfNoElement"))return void s(1,c);f=-1,c(f)}},w=function(a){function b(){d.show(),utils.invokeEventCallbacks("show",c.onShow)}var c=e.steps[a],d=m(),g=utils.getStepTarget(c);f!==a&&p().nextOnTargetClick&&utils.removeEvtListener(utils.getStepTarget(p()),"click",q),f=a,d.hide(!1),d.render(c,a,function(a){a?r(b):b(),c.nextOnTargetClick&&utils.addEvtListener(g,"click",q)}),x()},x=function(){var a=e.id+":"+f,b=winHopscotch.getSkippedStepsIndexes();b&&b.length>0&&(a+=":"+b.join(",")),utils.setState(o("cookieName"),a,1)},y=function(a){a&&this.configure(a)};this.getCalloutManager=function(){return typeof c===undefinedStr&&(c=new HopscotchCalloutManager),c},this.startT
 our=function(a,b){var c,d,f={},i=this;if(!e){if(!a)throw new Error("Tour data is required for startTour.");if(!a.id||!validIdRegEx.test(a.id))throw new Error("Tour ID is using an invalid format. Use alphanumeric, underscores, and/or hyphens only. First character must be a letter.");e=a,u.call(this,a)}if(typeof b!==undefinedStr){if(b>=e.steps.length)throw new Error("Specified step number out of bounds.");d=b}if(!utils.documentIsReady())return waitingToStart=!0,this;if("undefined"==typeof d&&e.id===g&&typeof h!==undefinedStr){if(d=h,l.length>0)for(var j=0,k=l.length;k>j;j++)f[l[j]]=!0}else d||(d=0);return v(d,f,function(a){var b=-1!==a&&utils.getStepTarget(e.steps[a]);return b?(utils.invokeEventCallbacks("start"),c=m(),c.hide(!1),i.isActive=!0,void(utils.getStepTarget(p())?i.showStep(a):(utils.invokeEventCallbacks("error"),o("skipIfNoElement")&&i.nextStep(!1)))):void i.endTour(!1,!1)}),this},this.showStep=function(a){var b=e.steps[a],c=f;return utils.getStepTarget(b)?(b.delay?setTimeo
 ut(function(){w(a)},b.delay):w(a),this):(f=a,utils.invokeEventCallbacks("error"),void(f=c))},this.prevStep=function(a){return t.call(this,a,-1),this},this.nextStep=function(a){return t.call(this,a,1),this},this.endTour=function(a,b){var c,d=m();return a=utils.valOrDefault(a,!0),b=utils.valOrDefault(b,!0),e&&(c=p(),c&&c.nextOnTargetClick&&utils.removeEvtListener(utils.getStepTarget(c),"click",q)),f=0,h=void 0,d.hide(),a&&utils.clearState(o("cookieName")),this.isActive&&(this.isActive=!1,e&&b&&utils.invokeEventCallbacks("end")),this.removeCallbacks(null,!0),this.resetDefaultOptions(),n(),e=null,this},this.getCurrTour=function(){return e},this.getCurrTarget=function(){return utils.getStepTarget(p())},this.getCurrStepNum=function(){return f},this.getSkippedStepsIndexes=function(){var a,b=[];for(a in k)b.push(a);return b},this.refreshBubblePosition=function(){var a=p();return a&&m().setPosition(a),this.getCalloutManager().refreshCalloutPositions(),this},this.listen=function(a,b,c){return
  a&&callbacks[a].push({cb:b,fromTour:c}),this},this.unlisten=function(a,b){var c,d,e=callbacks[a];for(c=0,d=e.length;d>c;++c)e[c].cb===b&&e.splice(c,1);return this},this.removeCallbacks=function(a,b){var c,d,e,f;for(f in callbacks)if(!a||a===f)if(b)for(c=callbacks[f],d=0,e=c.length;e>d;++d)c[d].fromTour&&(c.splice(d--,1),--e);else callbacks[f]=[];return this},this.registerHelper=function(a,b){"string"==typeof a&&"function"==typeof b&&(helpers[a]=b)},this.unregisterHelper=function(a){helpers[a]=null},this.invokeHelper=function(a){var b,c,d=[];for(b=1,c=arguments.length;c>b;++b)d.push(arguments[b]);helpers[a]&&helpers[a].call(null,d)},this.setCookieName=function(a){return d.cookieName=a,this},this.resetDefaultOptions=function(){return d={},this},this.resetDefaultI18N=function(){return customI18N={},this},this.getState=function(){return utils.getState(o("cookieName"))},i=function(a,b){var c,e,f,g,h=["next","prev","start","end","show","error","close"];for(d||this.resetDefaultOptions(),u
 tils.extend(d,a),a&&utils.extend(customI18N,a.i18n),f=0,g=h.length;g>f;++f)e="on"+h[f].charAt(0).toUpperCase()+h[f].substring(1),a[e]&&this.listen(h[f],a[e],b);return c=m(!0),this},this.configure=function(a){return i.call(this,a,!1)},this.setRenderer=function(a){var b=typeof a;return"string"===b?(templateToUse=a,customRenderer=void 0):"function"===b&&(customRenderer=a),this},this.setEscaper=function(a){return"function"==typeof a&&(customEscape=a),this},y.call(this,a)},winHopscotch=new Hopscotch,function(){var _={};_.escape=function(a){return customEscape?customEscape(a):null==a?"":(""+a).replace(new RegExp("[&<>\"']","g"),function(a){return"&"==a?"&amp;":"<"==a?"&lt;":">"==a?"&gt;":'"'==a?"&quot;":"'"==a?"&#x27;":void 0})},this.templates=this.templates||{},this.templates.bubble_default=function(obj){function optEscape(a,b){return b?_.escape(a):a}obj||(obj={});var __t,__p="";_.escape,Array.prototype.join;with(obj)__p+='\n<div class="hopscotch-bubble-container" style="width: '+(null==
 (__t=step.width)?"":__t)+"px; padding: "+(null==(__t=step.padding)?"":__t)+'px;">\n  ',tour.isTour&&(__p+='<span class="hopscotch-bubble-number">'+(null==(__t=i18n.stepNum)?"":__t)+"</span>"),__p+='\n  <div class="hopscotch-bubble-content">\n    ',""!==step.title&&(__p+='<h3 class="hopscotch-title">'+(null==(__t=optEscape(step.title,tour.unsafe))?"":__t)+"</h3>"),__p+="\n    ",""!==step.content&&(__p+='<div class="hopscotch-content">'+(null==(__t=optEscape(step.content,tour.unsafe))?"":__t)+"</div>"),__p+='\n  </div>\n  <div class="hopscotch-actions">\n    ',buttons.showPrev&&(__p+='<button class="hopscotch-nav-button prev hopscotch-prev">'+(null==(__t=i18n.prevBtn)?"":__t)+"</button>"),__p+="\n    ",buttons.showCTA&&(__p+='<button class="hopscotch-nav-button next hopscotch-cta">'+(null==(__t=buttons.ctaLabel)?"":__t)+"</button>"),__p+="\n    ",buttons.showNext&&(__p+='<button class="hopscotch-nav-button next hopscotch-next">'+(null==(__t=i18n.nextBtn)?"":__t)+"</button>"),__p+="\n 
  </div>\n  ",buttons.showClose&&(__p+='<button class="hopscotch-bubble-close hopscotch-close">'+(null==(__t=i18n.closeTooltip)?"":__t)+"</button>"),__p+='\n</div>\n<div class="hopscotch-bubble-arrow-container hopscotch-arrow">\n  <div class="hopscotch-bubble-arrow-border"></div>\n  <div class="hopscotch-bubble-arrow"></div>\n</div>';return __p}}.call(winHopscotch),winHopscotch});
\ No newline at end of file


[05/12] allura git commit: Added test to see if user api is working

Posted by br...@apache.org.
Added test to see if user api is working


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

Branch: refs/heads/db/3593
Commit: ac793fecaa31287dbd7fbb615800a930c0eab901
Parents: 4192e2d
Author: Rohan Verma <ro...@gmail.com>
Authored: Fri Jul 1 00:12:32 2016 +0530
Committer: Dave Brondsema <da...@brondsema.net>
Committed: Mon Jul 11 11:08:51 2016 -0400

----------------------------------------------------------------------
 ForgeActivity/forgeactivity/tests/functional/test_rest.py | 5 +++++
 1 file changed, 5 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/ac793fec/ForgeActivity/forgeactivity/tests/functional/test_rest.py
----------------------------------------------------------------------
diff --git a/ForgeActivity/forgeactivity/tests/functional/test_rest.py b/ForgeActivity/forgeactivity/tests/functional/test_rest.py
index 8c9e0f5..1c99d5f 100644
--- a/ForgeActivity/forgeactivity/tests/functional/test_rest.py
+++ b/ForgeActivity/forgeactivity/tests/functional/test_rest.py
@@ -71,3 +71,8 @@ class TestActivityHasAccessAPI(TestRestApiBase):
             user='root')
         assert_equal(r.status_int, 200)
         assert_equal(r.json['result'], False)
+
+
+    def test_user_api(self):
+        r = self.api_get('/rest/u/test-user/activity')
+        assert_equal(r.status_int, 200)
\ No newline at end of file


[09/12] allura git commit: [#3593] no delayed flash message about brand new repos, its weird especially when starting a new project

Posted by br...@apache.org.
[#3593] no delayed flash message about brand new repos, its weird especially when starting a new project


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

Branch: refs/heads/db/3593
Commit: 62ceed58f17968a12933cb447a52371cbf80fbf2
Parents: 6215ab3
Author: Dave Brondsema <da...@brondsema.net>
Authored: Wed Jul 6 15:19:54 2016 -0400
Committer: Dave Brondsema <da...@brondsema.net>
Committed: Tue Jul 12 10:00:18 2016 -0400

----------------------------------------------------------------------
 Allura/allura/tasks/repo_tasks.py | 5 -----
 1 file changed, 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/62ceed58/Allura/allura/tasks/repo_tasks.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tasks/repo_tasks.py b/Allura/allura/tasks/repo_tasks.py
index 7b39a8a..a9a89d7 100644
--- a/Allura/allura/tasks/repo_tasks.py
+++ b/Allura/allura/tasks/repo_tasks.py
@@ -29,12 +29,7 @@ from allura.lib.utils import skip_mod_date
 
 @task
 def init(**kwargs):
-    from allura import model as M
     c.app.repo.init()
-    M.Notification.post_user(
-        c.user, c.app.repo, 'created',
-        text='Repository %s/%s created' % (
-            c.project.shortname, c.app.config.options.mount_point))
 
 
 @task


[11/12] allura git commit: [#3593] insert pre-step

Posted by br...@apache.org.
[#3593] insert pre-step


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

Branch: refs/heads/db/3593
Commit: 12bfd1ef403f6819c75a7ac27e7adb39eee58856
Parents: 3ac1102
Author: Dave Brondsema <da...@brondsema.net>
Authored: Mon Jul 11 17:15:25 2016 -0400
Committer: Dave Brondsema <da...@brondsema.net>
Committed: Tue Jul 12 10:03:12 2016 -0400

----------------------------------------------------------------------
 Allura/allura/controllers/project.py                 |  4 +---
 Allura/allura/ext/admin/templates/project_admin.html | 11 ++++++++++-
 2 files changed, 11 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/12bfd1ef/Allura/allura/controllers/project.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/project.py b/Allura/allura/controllers/project.py
index 9d24dac..5e9a510 100644
--- a/Allura/allura/controllers/project.py
+++ b/Allura/allura/controllers/project.py
@@ -236,9 +236,7 @@ class NeighborhoodController(object):
                 if (tool.lower() not in anchored_tools.keys()) and (c.project.app_instance(tool) is None):
                     install_params.append(dict(ep_name=tool, ordinal=i + offset))
             c.project.install_apps(install_params)
-        flash('Welcome to your new project on %s!'
-              'To get started, fill out some information about your project.' % config['site_name'])
-        redirect(c.project.script_name + 'admin/')
+        redirect(c.project.script_name + 'admin/?first-visit')
 
     @expose()
     def icon(self, **kw):

http://git-wip-us.apache.org/repos/asf/allura/blob/12bfd1ef/Allura/allura/ext/admin/templates/project_admin.html
----------------------------------------------------------------------
diff --git a/Allura/allura/ext/admin/templates/project_admin.html b/Allura/allura/ext/admin/templates/project_admin.html
index 2d42a68..1a55c48 100644
--- a/Allura/allura/ext/admin/templates/project_admin.html
+++ b/Allura/allura/ext/admin/templates/project_admin.html
@@ -23,7 +23,7 @@
 
 {% block title %}{{c.project.name}} / Admin Welcome{% endblock %}
 
-{% block header %}Welcome to your {{config.site_name}} project!{% endblock %}
+{% block header %}Welcome to your {{config.site_name}} project!<span class="title-end"></span>{% endblock %}
 
 {% set tour = {
     "id": "admin-welcome",
@@ -69,6 +69,15 @@
         },
     ]
 } %}
+{% if 'first-visit' in request.params %}
+    {% do tour['steps'].insert(0, {
+        "title": "Welcome to your new project!",
+        "content": "Here's a quick tour to show you around.",
+        "target": "h2.title .title-end",
+        "placement": "right",
+        "yOffset": -26,
+    }) %}
+{% endif %}
 
 
 {% block content %}


[06/12] allura git commit: [#8092] Fixed rest api failing for users

Posted by br...@apache.org.
[#8092] Fixed rest api failing for users


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

Branch: refs/heads/db/3593
Commit: 4192e2d623fa05746bb84fbb60957e19522d8f09
Parents: 2dac879
Author: Rohan Verma <ro...@gmail.com>
Authored: Tue Jun 21 22:52:02 2016 +0530
Committer: Dave Brondsema <da...@brondsema.net>
Committed: Mon Jul 11 11:08:51 2016 -0400

----------------------------------------------------------------------
 ForgeActivity/forgeactivity/main.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/4192e2d6/ForgeActivity/forgeactivity/main.py
----------------------------------------------------------------------
diff --git a/ForgeActivity/forgeactivity/main.py b/ForgeActivity/forgeactivity/main.py
index 6049fd0..6875d8b 100644
--- a/ForgeActivity/forgeactivity/main.py
+++ b/ForgeActivity/forgeactivity/main.py
@@ -224,7 +224,7 @@ class ForgeActivityRestController(BaseController, AppRestControllerMixin):
         return {
             'following': data['following'],
             'followee': {
-                'activity_name': data['followee'].shortname,
+                'activity_name': data['followee'].activity_name,
                 'activity_url': data['followee'].url(),
                 'activity_extras': {},
             },


[03/12] allura git commit: Updated tests

Posted by br...@apache.org.
Updated tests


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

Branch: refs/heads/db/3593
Commit: 190a1cbc8e8e3c9368061bd886845d20a7406c3a
Parents: 620c995
Author: Rohan Verma <ro...@gmail.com>
Authored: Fri Jun 24 19:36:13 2016 +0530
Committer: Dave Brondsema <da...@brondsema.net>
Committed: Mon Jul 11 11:05:39 2016 -0400

----------------------------------------------------------------------
 ForgeGit/forgegit/tests/functional/test_controllers.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/190a1cbc/ForgeGit/forgegit/tests/functional/test_controllers.py
----------------------------------------------------------------------
diff --git a/ForgeGit/forgegit/tests/functional/test_controllers.py b/ForgeGit/forgegit/tests/functional/test_controllers.py
index 8e09047..fc0b755 100644
--- a/ForgeGit/forgegit/tests/functional/test_controllers.py
+++ b/ForgeGit/forgegit/tests/functional/test_controllers.py
@@ -648,7 +648,7 @@ class TestFork(_TestCase):
         assert 'git merge {}'.format(c_id) in merge_instructions
         assert_in('less than 1 minute ago', r)
 
-        merge_form = r.html.find('form', action='merge')
+        merge_form = r.html.find('div', {'class': 'merge-help-text merge-ok'})
         assert merge_form
         assert_in('Merge request has no conflicts. You can merge automatically.', merge_form.getText())
 


[04/12] allura git commit: Added fontawesome fonts

Posted by br...@apache.org.
Added fontawesome fonts


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

Branch: refs/heads/db/3593
Commit: 620c9956c9d65306b03575bdb07ca3b831d5bfe4
Parents: f71b1f2
Author: Rohan Verma <ro...@gmail.com>
Authored: Fri Jun 24 19:01:37 2016 +0530
Committer: Dave Brondsema <da...@brondsema.net>
Committed: Mon Jul 11 11:05:39 2016 -0400

----------------------------------------------------------------------
 Allura/allura/templates/repo/merge_request.html | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/620c9956/Allura/allura/templates/repo/merge_request.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/repo/merge_request.html b/Allura/allura/templates/repo/merge_request.html
index d3b3081..543eaf8 100644
--- a/Allura/allura/templates/repo/merge_request.html
+++ b/Allura/allura/templates/repo/merge_request.html
@@ -90,7 +90,9 @@ Merge Request #{{req.request_number}}: {{req.summary}} ({{req.status}})
     {% if req.merge_allowed(c.user) %}
         <form action="merge" method="POST">
           {{ lib.csrf_token() }}
-          <input id="merge-btn" type="submit" value="Merge"{% if not can_merge or merge_status in ('ready', 'busy') %}disabled="disabled"{% endif %}>
+          <button type="submit" id="merge-btn">
+            <i class="fa fa-code-fork fa-flip-vertical" aria-hidden="true" {% if not can_merge or merge_status in ('ready', 'busy') %}disabled="disabled"{% endif %}></i> Merge
+          </button>
         </form>
     {% endif %}
 
@@ -98,12 +100,16 @@ Merge Request #{{req.request_number}}: {{req.summary}} ({{req.status}})
         <form action="save" method="POST">
             {{ lib.csrf_token() }}
             <input type="hidden" value="rejected" name="status">
-            <input id="reject-btn" type="submit" value="Reject">
+            <button type="submit" id="reject-btn" type="submit" >
+                <i class="fa fa-ban" aria-hidden="true"></i> Reject
+            </button>
         </form>
 
         <form action="refresh" method="POST">
             {{ lib.csrf_token() }}
-            <input id="refresh-btn" type="submit" value="Refresh Commits">
+            <button type="submit" id="refresh-btn" type="submit" >
+                <i class="fa fa-refresh" aria-hidden="true"></i> Refresh Commits
+            </button>
             <input type="hidden" value="{{req.source_branch}}" name="source_branch">
         </form>
     {% endif %}


[12/12] allura git commit: [#3593] further deprecate Tools link in admin menu

Posted by br...@apache.org.
[#3593] further deprecate Tools link in admin menu


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

Branch: refs/heads/db/3593
Commit: b8a0b1b8dedb8a7e7993d442c5025e4239ffa9d0
Parents: 12bfd1e
Author: Dave Brondsema <da...@brondsema.net>
Authored: Wed Jul 6 18:41:22 2016 -0400
Committer: Dave Brondsema <da...@brondsema.net>
Committed: Tue Jul 12 10:03:12 2016 -0400

----------------------------------------------------------------------
 Allura/allura/ext/admin/admin_main.py | 5 ++++-
 Allura/allura/lib/plugin.py           | 3 ++-
 Allura/allura/model/artifact.py       | 2 --
 3 files changed, 6 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/b8a0b1b8/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 a9c5daf..3759098 100644
--- a/Allura/allura/ext/admin/admin_main.py
+++ b/Allura/allura/ext/admin/admin_main.py
@@ -148,7 +148,10 @@ class AdminApp(Application):
                     SitemapEntry('Screenshots', admin_url + 'screenshots'),
                     SitemapEntry('Categorization', admin_url + 'trove')
                 ]
-        links.append(SitemapEntry('Tools', admin_url + 'tools_moved'))
+        if plugin.ProjectRegistrationProvider.get().registration_date(c.project) < datetime(2016, 6, 1):
+            # only show transitional Tools page to older projects that may be used to it
+            # no point is showing it to new projects
+            links.append(SitemapEntry('Tools', admin_url + 'tools_moved'))
         if asbool(config.get('bulk_export_enabled', True)):
             links.append(SitemapEntry('Export', admin_url + 'export'))
         if c.project.is_root and has_access(c.project, 'admin')():

http://git-wip-us.apache.org/repos/asf/allura/blob/b8a0b1b8/Allura/allura/lib/plugin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/lib/plugin.py b/Allura/allura/lib/plugin.py
index 06242c4..f449887 100644
--- a/Allura/allura/lib/plugin.py
+++ b/Allura/allura/lib/plugin.py
@@ -1026,7 +1026,8 @@ class ProjectRegistrationProvider(object):
         '''
         Return the datetime the project was created.
         '''
-        return project._id.generation_time
+        # generation_time is offset-aware UTC, but everything else is offset-naive
+        return project._id.generation_time.replace(tzinfo=None)
 
     def details_links(self, project):
         '''Return list of pairs (url, label) with details

http://git-wip-us.apache.org/repos/asf/allura/blob/b8a0b1b8/Allura/allura/model/artifact.py
----------------------------------------------------------------------
diff --git a/Allura/allura/model/artifact.py b/Allura/allura/model/artifact.py
index 0d177ce..a98394e 100644
--- a/Allura/allura/model/artifact.py
+++ b/Allura/allura/model/artifact.py
@@ -441,8 +441,6 @@ class Artifact(MappedClass, SearchIndexable):
         count_in_app = lambda: cls.query.find(dict(app_config_id=app_config._id)).count()
         provider = plugin.ProjectRegistrationProvider.get()
         start = provider.registration_date(app_config.project)
-        # need the replace because the generation_time is offset-aware UTC and h.rate_limit uses offset-naive UTC dates
-        start = start.replace(tzinfo=None)
 
         try:
             h.rate_limit(opt, count_in_app, start)


[07/12] allura git commit: [#3593] make Welcome admin page easy to get to; nicer notifications

Posted by br...@apache.org.
[#3593] make Welcome admin page easy to get to; nicer notifications


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

Branch: refs/heads/db/3593
Commit: 6215ab3ec101850f3ff2b73fcb8cba17b1b829b7
Parents: ac793fe
Author: Dave Brondsema <da...@brondsema.net>
Authored: Wed Jul 6 14:47:59 2016 -0400
Committer: Dave Brondsema <da...@brondsema.net>
Committed: Tue Jul 12 10:00:17 2016 -0400

----------------------------------------------------------------------
 Allura/allura/controllers/project.py        | 4 ++--
 Allura/allura/ext/admin/admin_main.py       | 5 ++++-
 Allura/allura/public/nf/js/jquery.notify.js | 4 ++++
 ForgeImporters/forgeimporters/base.py       | 2 +-
 4 files changed, 11 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/6215ab3e/Allura/allura/controllers/project.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/project.py b/Allura/allura/controllers/project.py
index ee0927b..9d24dac 100644
--- a/Allura/allura/controllers/project.py
+++ b/Allura/allura/controllers/project.py
@@ -236,9 +236,9 @@ class NeighborhoodController(object):
                 if (tool.lower() not in anchored_tools.keys()) and (c.project.app_instance(tool) is None):
                     install_params.append(dict(ep_name=tool, ordinal=i + offset))
             c.project.install_apps(install_params)
-        flash('Welcome to the %s Project System! '
+        flash('Welcome to your new project on %s!'
               'To get started, fill out some information about your project.' % config['site_name'])
-        redirect(c.project.script_name + 'admin/overview')
+        redirect(c.project.script_name + 'admin/')
 
     @expose()
     def icon(self, **kw):

http://git-wip-us.apache.org/repos/asf/allura/blob/6215ab3e/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 322fb15..e751dc8 100644
--- a/Allura/allura/ext/admin/admin_main.py
+++ b/Allura/allura/ext/admin/admin_main.py
@@ -139,7 +139,10 @@ class AdminApp(Application):
                 SitemapEntry('Overview', nbhd_admin_url + 'overview'),
                 SitemapEntry('Awards', nbhd_admin_url + 'accolades')]
         else:
-            links += [SitemapEntry('Metadata', admin_url + 'overview'), ]
+            links += [
+                SitemapEntry('Welcome', admin_url),
+                SitemapEntry('Metadata', admin_url + 'overview'),
+            ]
             if c.project.neighborhood.name != "Users":
                 links += [
                     SitemapEntry('Screenshots', admin_url + 'screenshots'),

http://git-wip-us.apache.org/repos/asf/allura/blob/6215ab3e/Allura/allura/public/nf/js/jquery.notify.js
----------------------------------------------------------------------
diff --git a/Allura/allura/public/nf/js/jquery.notify.js b/Allura/allura/public/nf/js/jquery.notify.js
index 52a2484..8478dc0 100644
--- a/Allura/allura/public/nf/js/jquery.notify.js
+++ b/Allura/allura/public/nf/js/jquery.notify.js
@@ -123,6 +123,10 @@
         if (opts.status === 'success') {
             opts.status = 'confirm';
         }
+        // For compatibility with the TG default of "ok"
+        if (opts.status === 'ok') {
+            opts.status = 'info';
+        }
         return $(this).each(function() {
             if (opts.message) {
                 var o = $.metadata ? $.extend(opts, $(this).metadata()) : opts;

http://git-wip-us.apache.org/repos/asf/allura/blob/6215ab3e/ForgeImporters/forgeimporters/base.py
----------------------------------------------------------------------
diff --git a/ForgeImporters/forgeimporters/base.py b/ForgeImporters/forgeimporters/base.py
index 32be2bd..22bd27c 100644
--- a/ForgeImporters/forgeimporters/base.py
+++ b/ForgeImporters/forgeimporters/base.py
@@ -310,7 +310,7 @@ class ProjectImporter(BaseController):
             ToolImporter.by_name(importer_name).post(**kw)
         M.AuditLog.log('import project from %s' % self.source)
 
-        flash('Welcome to the %s Project System! '
+        flash('Welcome to your new project on %s! '
               'Your project data will be imported and should show up here shortly.' % config['site_name'])
         redirect(c.project.script_name + 'admin/overview')
 


[02/12] allura git commit: Added refresh commits button. Changed template to show buttons in merge request buttons one row

Posted by br...@apache.org.
Added refresh commits button. Changed template to show buttons in merge request buttons one row


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

Branch: refs/heads/db/3593
Commit: f71b1f23d679d92c04f345509aa92b5228c78a58
Parents: 11886e8
Author: Rohan Verma <ro...@gmail.com>
Authored: Fri Jun 24 18:48:25 2016 +0530
Committer: Dave Brondsema <da...@brondsema.net>
Committed: Mon Jul 11 11:05:39 2016 -0400

----------------------------------------------------------------------
 Allura/allura/controllers/repository.py         |  9 +++++
 Allura/allura/templates/repo/merge_request.html | 39 ++++++++++++--------
 .../templates/repo/merge_request_edit.html      |  4 +-
 3 files changed, 35 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/f71b1f23/Allura/allura/controllers/repository.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/repository.py b/Allura/allura/controllers/repository.py
index 39e3516..4d8abd5 100644
--- a/Allura/allura/controllers/repository.py
+++ b/Allura/allura/controllers/repository.py
@@ -468,6 +468,15 @@ class MergeRequestController(object):
 
     @expose()
     @require_post()
+    @validate(mr_dispose_form)
+    def refresh(self, **kw):
+        require_access(self.req, 'write')
+        with self.req.push_downstream_context():
+            self.req.downstream['commit_id'] = c.app.repo.commit(self.req.source_branch)._id
+        redirect(self.req.url())
+
+    @expose()
+    @require_post()
     def merge(self):
         if not self.req.merge_allowed(c.user) or not self.req.can_merge():
             raise exc.HTTPNotFound

http://git-wip-us.apache.org/repos/asf/allura/blob/f71b1f23/Allura/allura/templates/repo/merge_request.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/repo/merge_request.html b/Allura/allura/templates/repo/merge_request.html
index cccd92f..d3b3081 100644
--- a/Allura/allura/templates/repo/merge_request.html
+++ b/Allura/allura/templates/repo/merge_request.html
@@ -73,34 +73,43 @@ Merge Request #{{req.request_number}}: {{req.summary}} ({{req.status}})
     {% endif %}
 
     {% if req.merge_allowed(c.user) %}
-      <div class="grid-19">
-        <form action="merge" method="POST">
-          {{ lib.csrf_token() }}
-          <input id="merge-btn" type="submit" value="Merge"{% if not can_merge or merge_status in ('ready', 'busy') %}disabled="disabled"{% endif %}>
-          <div class="merge-help-text can-merge-in-progress" {% if can_merge == None %}style="display: block;"{% endif %}>
+    <div class='grid-19 merge-help'>
+        <div class="merge-help-text can-merge-in-progress" {% if can_merge == None %}style="display: block;"{% endif %}>
             Checking if merge is possible...
-          </div>
-          <div class="merge-help-text merge-ok" {% if can_merge == True %}style="display: block;"{% endif %}>
+        </div>
+        <div class="merge-help-text merge-ok" {% if can_merge == True %}style="display: block;"{% endif %}>
             Merge request has no conflicts. You can merge automatically.
-          </div>
-          <div class="merge-help-text merge-conflicts" {% if can_merge == False %}style="display: block;"{% endif %}>
+        </div>
+        <div class="merge-help-text merge-conflicts" {% if can_merge == False %}style="display: block;"{% endif %}>
             Merge request has conflicts. Follow manual instructions below to merge.
-          </div>
+        </div>
+    </div>
+    {% endif %}
+
+    <div class="grid-19 merge-toolbar">
+    {% if req.merge_allowed(c.user) %}
+        <form action="merge" method="POST">
+          {{ lib.csrf_token() }}
+          <input id="merge-btn" type="submit" value="Merge"{% if not can_merge or merge_status in ('ready', 'busy') %}disabled="disabled"{% endif %}>
         </form>
-      </div>
     {% endif %}
 
     {% if req.creator == c.user and req.status == "open" %}
-    <div class="grid-19">
         <form action="save" method="POST">
             {{ lib.csrf_token() }}
-            <input type="hidden" value="rejected" name="status"></input>
+            <input type="hidden" value="rejected" name="status">
             <input id="reject-btn" type="submit" value="Reject">
-            <p style="color:red;">Click to reject the merge request.</p>
         </form>
-    </div>
+
+        <form action="refresh" method="POST">
+            {{ lib.csrf_token() }}
+            <input id="refresh-btn" type="submit" value="Refresh Commits">
+            <input type="hidden" value="{{req.source_branch}}" name="source_branch">
+        </form>
     {% endif %}
 
+    </div>
+
     {{ c.log_widget.display(value=commits, app=downstream_app) }}
 
     <div class="grid-19"><a href="#discussion_holder">Discuss</a></div>

http://git-wip-us.apache.org/repos/asf/allura/blob/f71b1f23/Allura/allura/templates/repo/merge_request_edit.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/repo/merge_request_edit.html b/Allura/allura/templates/repo/merge_request_edit.html
index 28346d9..57ad083 100644
--- a/Allura/allura/templates/repo/merge_request_edit.html
+++ b/Allura/allura/templates/repo/merge_request_edit.html
@@ -19,10 +19,10 @@
 {% extends 'allura:templates/repo/repo_master.html' %}
 
 {% block title %}
-  {{c.project.name}} / {{c.app.config.options.mount_label}} / Request merge
+  {{c.project.name}} / {{c.app.config.options.mount_label}} / Request Merge
 {% endblock %}
 
-{% block header %}Update merge request{% endblock %}
+{% block header %}Update Merge Request{% endblock %}
 
 {% block content %}
   {{ c.form.display(action='do_request_merge_edit', value=dict(source_branch=source_branch, target_branch=target_branch, description=description, summary=summary))}}