All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 000/106] Migrate configuration functionality to Boostrap 3
@ 2016-05-24 11:38 Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 001/106] toaster: Auto convert bootstrap 2 to bootstrap 3 Belen Barros Pena
                   ` (103 more replies)
  0 siblings, 104 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

This series makes the required changes to move the Toaster configuration
functionality to Boostrap 3. 

It is for review purposes only. Patches will be squashed as required after
review in preparation for merging.

The series keeps old css files that might still be useful for the
remaining work. Clean up of the static/css/ directory will happen in
the next series.

Belen (3):
  toaster: Top bar layout fixes
  toaster: Fix layout of 'All builds' page
  toaster: Fix layout of 'All projects' page

Belen Barros Pena (89):
  toaster: Layout fixes for project configuration
  toaster: Fix toaster table footer controls
  toaster: Fix layout of 'project builds' page
  toaster: small changes to 'import layer' page
  toaster: Remove hovering from disabled buttons
  toaster: Fix layout in "new custom image" page
  toaster: Fix breadcrumbs
  toaster: Fix "custom image details" layout
  toaster: remove row from base template
  toaster: Fix image recipe details layout
  toaster: Fix layer details layout
  toaster: Set correct margins for table search
  toaster: Correctly align bottom table controls
  toaster: Fix breadcrumb in build data pages
  toaster: indentation fixes
  toaster: Fix layout in build dashboard page
  toaster: Fix breadcrumb in Chrome
  toaster: Adjust width of non-toastertables search
  toaster: Alignment of table controls
  toaster: Fix pagination in non-toastertables
  toaster: Fix layout of packages installed page
  toaster: Fix layout of configuration page
  toaster: Fix layout of variable history page
  toaster: Fix layout in package details pages
  toaster: Fix layout in recipe details page
  toaster: Fix layout in task details page
  toaster: Remove the pagination-centered class
  toaster: Style typeaheads
  toaster: Fix filters
  toaster: Fix no results pages
  toaster: Edit inaccurate comment
  toaster: fix buttons in tables
  toaster: Fix popover content
  toaster: Tweaking modal dialogs
  toaster: Fix buttons in custom image details page
  toaster: More width to the "Edit columns" menu
  toaster: Adjust labels in modal dialogs
  toaster: Fix 'New project' page
  toaster: Fix the project created notification
  toaster: Fix errors and warnings info
  toaster: Fix landing page
  toaster: Fix reverse dependencies modal dialogs
  toaster: Table cell notifications style
  toaster: Update OE json file
  toaster: Fix the custom image modal dialogs
  toaster: Comment out unnecessary css
  toaster: Create new custom css file
  toaster: Base template to Bootstrap 3
  toaster: body styles for Bootstrap 3
  toaster: Move latest builds to Bootstrap 3
  toaster: Fix the recipe file download
  toaster: Table controls to Bootstrap 3
  toaster: Fix the toastertable table headings
  toaster: Remove spurious div
  toaster: Fix 'all builds' table content
  toaster: Fix bottom table controls
  toaster: Fix 'all projects' table content
  toaster: Configuration page to Bootstrap 3
  toaster: 'Project builds' page to Bootstrap 3
  toaster: Project builds empty state
  toaster: Style typeaheads
  toaster: Fix display of failed tasks
  toaster: Fix the import layer form
  toaster: Fix the toaster tables no results
  toaster: Show heading in no results page
  toaster: Fix new custom image page
  toaster: toaster tables Enable complex empty states
  toaster: Custom images to Bootstrap 3
  toaster: project builds Improve empty state
  toaster: recipes tables Tweaks for Bootstrap 3
  toaster: machines table Changes for Bootstrap 3
  toaster: layers table Changes for Bootstrap 3
  toaster: breadcrumbs Fix for Bootstrap 3
  toaster: layerdetails Fix the layer details page
  toaster: custom recipe Fix the custom recipe details page
  toaster: recipe details Fix the image recipe details page
  toaster: bb variables BitBake variables page to Bootstrap 3
  toaster: recent builds Consistent rebuild links
  toaster: filters Filter modals to Bootstrap 3
  toaster: latest builds Style cancel option
  toaster: custom image modals Move to Bootstrap 3
  toaster: modals Package dependencies modals to Bootstrap 3
  toaster: modals Layer dependencies to Bootstrap 3
  toaster: notifications Move to Boostrap 3
  toaster: new project Move to Boostrap 3
  toaster: notifications Add dismissible class
  toaster: landing Move to Bootstrap 3
  toaster: Add new image type to Bootstrap 3
  toaster: Unique project names to Boostrap 3

Elliot Smith (1):
  toaster: work-around our lack of a synchronous fetch for typeaheads

Michael Wood (13):
  toaster: Auto convert bootstrap 2 to bootstrap 3
  toaster: Add new boostrap3 files
  toaster: templates Base add bootstrap-toaster-theme overlay
  toaster: templates Add additional divs for modals in bootstrap3
  toaster: templates Use old style input appends instead of input-group
  toaster: bootstrap3-transition Remove top margin on New project button
  toaster: default.css Remove 80% width for search as this is no longer
    needed
  toaster: migrate typeahead library
  toaster: table.js Fix the edit columns drop down
  toaster: templates Use old style icon classes
  toaster: revert auto change to icon class for spinner
  toaster: importlayer Make sure we eat the default event on submit
  toaster: Remove old bootstrap files left behind

 bitbake/LICENSE                                    |    5 +-
 .../toastergui/static/css/bootstrap-theme.css      |  587 ++
 .../toastergui/static/css/bootstrap-theme.css.map  |    1 +
 .../toastergui/static/css/bootstrap-theme.min.css  |    6 +
 .../static/css/bootstrap-theme.min.css.map         |    1 +
 .../static/css/bootstrap-toaster-theme.css         | 2968 +++++++++
 .../static/css/bootstrap-toaster-theme.css.map     |    1 +
 .../static/css/bootstrap-toaster-theme.min.css     |    2 +
 .../static/css/bootstrap-toaster-theme.min.css.map |    1 +
 .../toaster/toastergui/static/css/bootstrap.css    | 6760 ++++++++++++++++++++
 .../toastergui/static/css/bootstrap.css.map        |    1 +
 .../toastergui/static/css/bootstrap.min.css        |   13 +-
 .../toastergui/static/css/bootstrap.min.css.map    |    1 +
 .../static/css/bootstrap3-transition.css           |  238 +
 .../lib/toaster/toastergui/static/css/default.css  |  573 +-
 .../static/fonts/glyphicons-halflings-regular.eot  |  Bin 20290 -> 20127 bytes
 .../static/fonts/glyphicons-halflings-regular.svg  |  487 +-
 .../static/fonts/glyphicons-halflings-regular.ttf  |  Bin 41236 -> 45404 bytes
 .../static/fonts/glyphicons-halflings-regular.woff |  Bin 23292 -> 23424 bytes
 .../fonts/glyphicons-halflings-regular.woff2       |  Bin 0 -> 18028 bytes
 .../toastergui/static/html/layer_deps_modal.html   |   38 +-
 .../static/img/glyphicons-halflings-white.png      |  Bin 8777 -> 0 bytes
 .../toastergui/static/img/glyphicons-halflings.png |  Bin 12799 -> 0 bytes
 .../lib/toaster/toastergui/static/js/bootstrap.js  | 2363 +++++++
 .../toaster/toastergui/static/js/bootstrap.min.js  |   11 +-
 .../toaster/toastergui/static/js/customrecipe.js   |    4 +-
 .../toaster/toastergui/static/js/importlayer.js    |   11 +-
 .../toaster/toastergui/static/js/layerDepsModal.js |    4 +-
 .../toaster/toastergui/static/js/layerdetails.js   |   67 +-
 .../lib/toaster/toastergui/static/js/libtoaster.js |  142 +-
 .../toastergui/static/js/newcustomimage_modal.js   |   46 +-
 .../toaster/toastergui/static/js/projectpage.js    |    8 +-
 bitbake/lib/toaster/toastergui/static/js/table.js  |   71 +-
 .../toastergui/static/js/typeahead.jquery.js       | 1551 +++++
 bitbake/lib/toaster/toastergui/tables.py           |  171 +-
 bitbake/lib/toaster/toastergui/templates/base.html |   88 +-
 .../toastergui/templates/basebuilddetailpage.html  |   45 +-
 .../toastergui/templates/basebuildpage.html        |    7 +-
 .../toastergui/templates/baseprojectpage.html      |   38 +-
 .../toastergui/templates/basetable_bottom.html     |   12 +-
 .../toastergui/templates/basetable_top.html        |    8 +-
 .../lib/toaster/toastergui/templates/bpackage.html |   18 +-
 .../toastergui/templates/builddashboard.html       |   85 +-
 .../toastergui/templates/buildrequestdetails.html  |    8 +-
 .../toastergui/templates/builds-toastertable.html  |    8 +-
 .../toastergui/templates/configuration.html        |   47 +-
 .../toaster/toastergui/templates/configvars.html   |  123 +-
 .../toastergui/templates/customise_btn.html        |    6 +-
 .../toaster/toastergui/templates/customrecipe.html |  269 +-
 .../templates/detail_pagination_bottom.html        |    6 +-
 .../toastergui/templates/detail_search_header.html |    8 +-
 .../toastergui/templates/detail_sorted_header.html |    2 +-
 .../lib/toaster/toastergui/templates/dirinfo.html  |    6 +-
 .../templates/editcustomimage_modal.html           |   71 +-
 .../toastergui/templates/filtersnippet.html        |  113 +-
 .../templates/generic-toastertable-page.html       |    2 +-
 .../toaster/toastergui/templates/importlayer.html  |  142 +-
 .../lib/toaster/toastergui/templates/landing.html  |   23 +-
 .../toastergui/templates/landing_not_managed.html  |    4 +-
 .../toaster/toastergui/templates/layer_btn.html    |   12 +-
 .../toaster/toastergui/templates/layerdetails.html |  248 +-
 .../toaster/toastergui/templates/machine_btn.html  |   10 +-
 .../toaster/toastergui/templates/mrb_section.html  |  121 +-
 .../toastergui/templates/newcustomimage.html       |   15 +-
 .../toastergui/templates/newcustomimage_modal.html |   55 +-
 .../toaster/toastergui/templates/newproject.html   |   50 +-
 .../templates/package_built_dependencies.html      |    4 +-
 .../toastergui/templates/package_detail_base.html  |   20 +-
 .../templates/package_included_dependencies.html   |    4 +-
 .../toastergui/templates/pkg_add_rm_btn.html       |   12 +-
 .../lib/toaster/toastergui/templates/project.html  |  102 +-
 .../templates/projectbuilds-toastertable.html      |   24 +-
 .../toastergui/templates/projectbuilds.html        |    4 +-
 .../toaster/toastergui/templates/projectconf.html  |  413 +-
 .../templates/projects-toastertable.html           |   58 +-
 .../toastergui/templates/projecttopbar.html        |   86 +-
 .../lib/toaster/toastergui/templates/recipe.html   |   13 +-
 .../toaster/toastergui/templates/recipe_btn.html   |   13 +-
 .../toastergui/templates/recipe_packages.html      |   15 +-
 .../toastergui/templates/recipedetails.html        |  154 +-
 .../lib/toaster/toastergui/templates/recipes.html  |   24 +-
 .../snippets/pkg_dependencies_popover.html         |    4 +-
 .../snippets/pkg_revdependencies_popover.html      |    4 +-
 .../lib/toaster/toastergui/templates/target.html   |   17 +-
 bitbake/lib/toaster/toastergui/templates/task.html |   14 +-
 .../lib/toaster/toastergui/templates/tasks.html    |   16 +-
 .../toastergui/templates/toastertable-filter.html  |   32 +-
 .../toastergui/templates/toastertable-simple.html  |  110 +-
 .../toaster/toastergui/templates/toastertable.html |  122 +-
 .../toastergui/templates/unavailable_artifact.html |    4 +-
 bitbake/lib/toaster/toastergui/widgets.py          |    3 +-
 meta/conf/toasterconf.json                         |   23 +-
 92 files changed, 16876 insertions(+), 2201 deletions(-)
 create mode 100644 bitbake/lib/toaster/toastergui/static/css/bootstrap-theme.css
 create mode 100644 bitbake/lib/toaster/toastergui/static/css/bootstrap-theme.css.map
 create mode 100644 bitbake/lib/toaster/toastergui/static/css/bootstrap-theme.min.css
 create mode 100644 bitbake/lib/toaster/toastergui/static/css/bootstrap-theme.min.css.map
 create mode 100644 bitbake/lib/toaster/toastergui/static/css/bootstrap-toaster-theme.css
 create mode 100644 bitbake/lib/toaster/toastergui/static/css/bootstrap-toaster-theme.css.map
 create mode 100644 bitbake/lib/toaster/toastergui/static/css/bootstrap-toaster-theme.min.css
 create mode 100644 bitbake/lib/toaster/toastergui/static/css/bootstrap-toaster-theme.min.css.map
 create mode 100644 bitbake/lib/toaster/toastergui/static/css/bootstrap.css
 create mode 100644 bitbake/lib/toaster/toastergui/static/css/bootstrap.css.map
 create mode 100644 bitbake/lib/toaster/toastergui/static/css/bootstrap.min.css.map
 create mode 100644 bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
 create mode 100644 bitbake/lib/toaster/toastergui/static/fonts/glyphicons-halflings-regular.woff2
 delete mode 100644 bitbake/lib/toaster/toastergui/static/img/glyphicons-halflings-white.png
 delete mode 100644 bitbake/lib/toaster/toastergui/static/img/glyphicons-halflings.png
 create mode 100644 bitbake/lib/toaster/toastergui/static/js/bootstrap.js
 create mode 100644 bitbake/lib/toaster/toastergui/static/js/typeahead.jquery.js

-- 
1.9.1



^ permalink raw reply	[flat|nested] 107+ messages in thread

* [PATCH 001/106] toaster: Auto convert bootstrap 2 to bootstrap 3
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 003/106] toaster: templates Base add bootstrap-toaster-theme overlay Belen Barros Pena
                   ` (102 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=yes, Size: 179693 bytes --]

From: Michael Wood <michael.g.wood@intel.com>

Convert existing templates and js to use bootstrap 3 classes

Signed-off-by: Michael Wood <michael.g.wood@intel.com>
---
 .../toastergui/static/html/layer_deps_modal.html   |  2 +-
 .../toaster/toastergui/static/js/bootstrap.min.js  | 11 +++--
 .../toaster/toastergui/static/js/customrecipe.js   |  4 +-
 .../toaster/toastergui/static/js/layerdetails.js   |  8 ++--
 .../lib/toaster/toastergui/static/js/libtoaster.js |  4 +-
 bitbake/lib/toaster/toastergui/static/js/table.js  |  8 ++--
 bitbake/lib/toaster/toastergui/templates/base.html | 12 ++---
 .../toastergui/templates/basebuilddetailpage.html  |  2 +-
 .../toastergui/templates/basebuildpage.html        |  7 ++-
 .../toastergui/templates/baseprojectpage.html      |  6 +--
 .../toastergui/templates/basetable_top.html        |  6 +--
 .../lib/toaster/toastergui/templates/bpackage.html | 10 ++--
 .../toastergui/templates/builddashboard.html       | 30 ++++++------
 .../toastergui/templates/buildrequestdetails.html  |  8 ++--
 .../toastergui/templates/builds-toastertable.html  |  2 +-
 .../toastergui/templates/configuration.html        |  8 ++--
 .../toaster/toastergui/templates/configvars.html   | 16 +++----
 .../toastergui/templates/customise_btn.html        |  2 +-
 .../toaster/toastergui/templates/customrecipe.html | 20 ++++----
 .../toastergui/templates/detail_search_header.html | 12 ++---
 .../toastergui/templates/detail_sorted_header.html |  2 +-
 .../lib/toaster/toastergui/templates/dirinfo.html  |  6 +--
 .../toastergui/templates/filtersnippet.html        |  4 +-
 .../toaster/toastergui/templates/importlayer.html  | 10 ++--
 .../lib/toaster/toastergui/templates/landing.html  | 18 ++++----
 .../toastergui/templates/landing_not_managed.html  |  4 +-
 .../toaster/toastergui/templates/layer_btn.html    |  4 +-
 .../toaster/toastergui/templates/layerdetails.html | 54 +++++++++++-----------
 .../toaster/toastergui/templates/machine_btn.html  |  2 +-
 .../toaster/toastergui/templates/mrb_section.html  | 26 ++++++-----
 .../toastergui/templates/newcustomimage_modal.html |  6 +--
 .../toaster/toastergui/templates/newproject.html   | 18 ++++----
 .../templates/package_built_dependencies.html      |  4 +-
 .../toastergui/templates/package_detail_base.html  | 12 ++---
 .../templates/package_included_dependencies.html   |  4 +-
 .../toastergui/templates/pkg_add_rm_btn.html       |  4 +-
 .../lib/toaster/toastergui/templates/project.html  | 18 ++++----
 .../templates/projectbuilds-toastertable.html      |  2 +-
 .../toastergui/templates/projectbuilds.html        |  6 +--
 .../toaster/toastergui/templates/projectconf.html  | 48 +++++++++----------
 .../toastergui/templates/projecttopbar.html        | 12 ++---
 .../lib/toaster/toastergui/templates/recipe.html   |  6 +--
 .../toaster/toastergui/templates/recipe_btn.html   |  2 +-
 .../toastergui/templates/recipe_packages.html      |  8 ++--
 .../toastergui/templates/recipedetails.html        | 20 ++++----
 .../lib/toaster/toastergui/templates/recipes.html  | 14 +++---
 .../snippets/pkg_dependencies_popover.html         |  2 +-
 .../snippets/pkg_revdependencies_popover.html      |  2 +-
 .../lib/toaster/toastergui/templates/target.html   | 16 +++----
 bitbake/lib/toaster/toastergui/templates/task.html | 10 ++--
 .../lib/toaster/toastergui/templates/tasks.html    |  8 ++--
 .../toastergui/templates/toastertable-simple.html  | 16 +++----
 .../toaster/toastergui/templates/toastertable.html | 14 +++---
 .../toastergui/templates/unavailable_artifact.html |  4 +-
 54 files changed, 286 insertions(+), 278 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/html/layer_deps_modal.html b/bitbake/lib/toaster/toastergui/static/html/layer_deps_modal.html
index e1dba43..f95a382 100644
--- a/bitbake/lib/toaster/toastergui/static/html/layer_deps_modal.html
+++ b/bitbake/lib/toaster/toastergui/static/html/layer_deps_modal.html
@@ -6,7 +6,7 @@
     </div>
     <div class="modal-body">
       <p id="body-text"> <strong id="layer-name"></strong> depends on some layers that are not added to your project. Select the ones you want to add:</p>
-      <ul class="unstyled" id="dependencies-list">
+      <ul class="list-unstyled" id="dependencies-list">
       </ul>
     </div>
     <div class="modal-footer">
diff --git a/bitbake/lib/toaster/toastergui/static/js/bootstrap.min.js b/bitbake/lib/toaster/toastergui/static/js/bootstrap.min.js
index 848258d..c4a9241 100644
--- a/bitbake/lib/toaster/toastergui/static/js/bootstrap.min.js
+++ b/bitbake/lib/toaster/toastergui/static/js/bootstrap.min.js
@@ -1,6 +1,7 @@
 /*!
-* Bootstrap.js by @fat & @mdo
-* Copyright 2013 Twitter, Inc.
-* http://www.apache.org/licenses/LICENSE-2.0.txt
-*/
-!function(e){"use strict";e(function(){e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()};var r=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=r,this},e(document).on("click.alert.data-api",t,n.prototype.close)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")};var n=e.fn.button;e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=n,this},e(document).on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},getActiveIndex:function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},to:function(t){var n=this.getActiveIndex(),r=this;if(t>this.$items.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){r.to(t)}):n==t?this.pause().cycle():this.slide(t>n?"next":"prev",e(this.$items[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f;this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u](),f=e.Event("slide",{relatedTarget:i[0],direction:o});if(i.hasClass("active"))return;this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var t=e(a.$indicators.children()[a.getActiveIndex()]);t&&t.addClass("active")}));if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}};var n=e.fn.carousel;e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.pause().cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=n,this},e(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=e.extend({},i.data(),n.data()),o;i.carousel(s),(o=n.attr("data-slide-to"))&&i.data("carousel").pause().to(o).cycle(),t.preventDefault()})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning||this.$element.hasClass("in"))return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning||!this.$element.hasClass("in"))return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var n=e.fn.collapse;e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=e.extend({},e.fn.collapse.defaults,r.data(),typeof n=="object"&&n);i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=n,this},e(document).on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})}(window.jQuery),!function(e){"use strict";function r(){e(".dropdown-backdrop").remove(),e(t).each(function(){i(e(this)).removeClass("open")})}function i(t){var n=t.attr("data-target"),r;n||(n=t.attr("href"),n=n&&/#/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,"")),r=n&&e(n);if(!r||!r.length)r=t.parent();return r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||("ontouchstart"in document.documentElement&&e('<div class="dropdown-backdrop"/>').insertBefore(e(this)).on("click",r),s.toggleClass("open")),n.focus(),!1},keydown:function(n){var r,s,o,u,a,f;if(!/(38|40|27)/.test(n.keyCode))return;r=e(this),n.preventDefault(),n.stopPropagation();if(r.is(".disabled, :disabled"))return;u=i(r),a=u.hasClass("open");if(!a||a&&n.keyCode==27)return n.which==27&&u.find(t).focus(),r.click();s=e("[role=menu] li:not(.divider):visible a",u);if(!s.length)return;f=s.index(s.filter(":focus")),n.keyCode==38&&f>0&&f--,n.keyCode==40&&f<s.length-1&&f++,~f||(f=0),s.eq(f).focus()}};var s=e.fn.dropdown;e.fn.dropdown=function(t){return this.each(function(){var r=e(this),i=r.data("dropdown");i||r.data("dropdown",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.dropdown.Constructor=n,e.fn.dropdown.noConflict=function(){return e.fn.dropdown=s,this},e(document).on("click.dropdown.data-api",r).on("click.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("click.dropdown.data-api",t,n.prototype.toggle).on("keydown.dropdown.data-api",t+", [role=menu]",n.prototype.keydown)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=n,this.$element=e(t).delegate('[data-dismiss="modal"]',"click.dismiss.modal",e.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};t.prototype={constructor:t,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var t=this,n=e.Event("show");this.$element.trigger(n);if(this.isShown||n.isDefaultPrevented())return;this.isShown=!0,this.escape(),this.backdrop(function(){var n=e.support.transition&&t.$element.hasClass("fade");t.$element.parent().length||t.$element.appendTo(document.body),t.$element.show(),n&&t.$element[0].offsetWidth,t.$element.addClass("in").attr("aria-hidden",!1),t.enforceFocus(),n?t.$element.one(e.support.transition.end,function(){t.$element.focus().trigger("shown")}):t.$element.focus().trigger("shown")})},hide:function(t){t&&t.preventDefault();var n=this;t=e.Event("hide"),this.$element.trigger(t);if(!this.isShown||t.isDefaultPrevented())return;this.isShown=!1,this.escape(),e(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),e.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},enforceFocus:function(){var t=this;e(document).on("focusin.modal",function(e){t.$element[0]!==e.target&&!t.$element.has(e.target).length&&t.$element.focus()})},escape:function(){var e=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(t){t.which==27&&e.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var t=this,n=setTimeout(function(){t.$element.off(e.support.transition.end),t.hideModal()},500);this.$element.one(e.support.transition.end,function(){clearTimeout(n),t.hideModal()})},hideModal:function(){var e=this;this.$element.hide(),this.backdrop(function(){e.removeBackdrop(),e.$element.trigger("hidden")})},removeBackdrop:function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},backdrop:function(t){var n=this,r=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=e.support.transition&&r;this.$backdrop=e('<div class="modal-backdrop '+r+'" />').appendTo(document.body),this.$backdrop.click(this.options.backdrop=="static"?e.proxy(this.$element[0].focus,this.$element[0]):e.proxy(this.hide,this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in");if(!t)return;i?this.$backdrop.one(e.support.transition.end,t):t()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(e.support.transition.end,t):t()):t&&t()}};var n=e.fn.modal;e.fn.modal=function(n){return this.each(function(){var r=e(this),i=r.data("modal"),s=e.extend({},e.fn.modal.defaults,r.data(),typeof n=="object"&&n);i||r.data("modal",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.modal.Constructor=t,e.fn.modal.noConflict=function(){return e.fn.modal=n,this},e(document).on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault(),i.modal(s).one("hide",function(){n.focus()})})}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s,o,u,a;this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.enabled=!0,o=this.options.trigger.split(" ");for(a=o.length;a--;)u=o[a],u=="click"?this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this)):u!="manual"&&(i=u=="hover"?"mouseenter":"focus",s=u=="hover"?"mouseleave":"blur",this.$element.on(i+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.leave,this)));this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){return t=e.extend({},e.fn[this.type].defaults,this.$element.data(),t),t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),t},enter:function(t){var n=e.fn[this.type].defaults,r={},i;this._options&&e.each(this._options,function(e,t){n[e]!=t&&(r[e]=t)},this),i=e(t.currentTarget)[this.type](r).data(this.type);if(!i.options.delay||!i.options.delay.show)return i.show();clearTimeout(this.timeout),i.hoverState="in",this.timeout=setTimeout(function(){i.hoverState=="in"&&i.show()},i.options.delay.show)},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!n.options.delay||!n.options.delay.hide)return n.hide();n.hoverState="out",this.timeout=setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)},show:function(){var t,n,r,i,s,o,u=e.Event("show");if(this.hasContent()&&this.enabled){this.$element.trigger(u);if(u.isDefaultPrevented())return;t=this.tip(),this.setContent(),this.options.animation&&t.addClass("fade"),s=typeof this.options.placement=="function"?this.options.placement.call(this,t[0],this.$element[0]):this.options.placement,t.detach().css({top:0,left:0,display:"block"}),this.options.container?t.appendTo(this.options.container):t.insertAfter(this.$element),n=this.getPosition(),r=t[0].offsetWidth,i=t[0].offsetHeight;switch(s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}this.applyPlacement(o,s),this.$element.trigger("shown")}},applyPlacement:function(e,t){var n=this.tip(),r=n[0].offsetWidth,i=n[0].offsetHeight,s,o,u,a;n.offset(e).addClass(t).addClass("in"),s=n[0].offsetWidth,o=n[0].offsetHeight,t=="top"&&o!=i&&(e.top=e.top+i-o,a=!0),t=="bottom"||t=="top"?(u=0,e.left<0&&(u=e.left*-2,e.left=0,n.offset(e),s=n[0].offsetWidth,o=n[0].offsetHeight),this.replaceArrow(u-r+s,s,"left")):this.replaceArrow(o-i,o,"top"),a&&n.offset(e)},replaceArrow:function(e,t,n){this.arrow().css(n,e?50*(1-e/t)+"%":"")},setContent:function(){var e=this.tip(),t=this.getTitle();e.find(".tooltip-inner")[this.options.html?"html":"text"](t),e.removeClass("fade in top bottom left right")},hide:function(){function i(){var t=setTimeout(function(){n.off(e.support.transition.end).detach()},500);n.one(e.support.transition.end,function(){clearTimeout(t),n.detach()})}var t=this,n=this.tip(),r=e.Event("hide");this.$element.trigger(r);if(r.isDefaultPrevented())return;return n.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?i():n.detach(),this.$element.trigger("hidden"),this},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").attr("title","")},hasContent:function(){return this.getTitle()},getPosition:function(){var t=this.$element[0];return e.extend({},typeof t.getBoundingClientRect=="function"?t.getBoundingClientRect():{width:t.offsetWidth,height:t.offsetHeight},this.$element.offset())},getTitle:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title),e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},arrow:function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(t){var n=t?e(t.currentTarget)[this.type](this._options).data(this.type):this;n.tip().hasClass("in")?n.hide():n.show()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}};var n=e.fn.tooltip;e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.tooltip.Constructor=t,e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},e.fn.tooltip.noConflict=function(){return e.fn.tooltip=n,this}}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:t,setContent:function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content")[this.options.html?"html":"text"](n),e.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var e,t=this.$element,n=this.options;return e=(typeof n.content=="function"?n.content.call(t[0]):n.content)||t.attr("data-content"),e},tip:function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}});var n=e.fn.popover;e.fn.popover=function(n){return this.each(function(){var r=e(this),i=r.data("popover"),s=typeof n=="object"&&n;i||r.data("popover",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.popover.Constructor=t,e.fn.popover.defaults=e.extend({},e.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),e.fn.popover.noConflict=function(){return e.fn.popover=n,this}}(window.jQuery),!function(e){"use strict";function t(t,n){var r=e.proxy(this.process,this),i=e(t).is("body")?e(window):e(t),s;this.options=e.extend({},e.fn.scrollspy.defaults,n),this.$scrollElement=i.on("scroll.scroll-spy.data-api",r),this.selector=(this.options.target||(s=e(t).attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=e("body"),this.refresh(),this.process()}t.prototype={constructor:t,refresh:function(){var t=this,n;this.offsets=e([]),this.targets=e([]),n=this.$body.find(this.selector).map(function(){var n=e(this),r=n.data("target")||n.attr("href"),i=/^#\w/.test(r)&&e(r);return i&&i.length&&[[i.position().top+(!e.isWindow(t.$scrollElement.get(0))&&t.$scrollElement.scrollTop()),r]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},process:function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,n=t-this.$scrollElement.height(),r=this.offsets,i=this.targets,s=this.activeTarget,o;if(e>=n)return s!=(o=i.last()[0])&&this.activate(o);for(o=r.length;o--;)s!=i[o]&&e>=r[o]&&(!r[o+1]||e<=r[o+1])&&this.activate(i[o])},activate:function(t){var n,r;this.activeTarget=t,e(this.selector).parent(".active").removeClass("active"),r=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',n=e(r).parent("li").addClass("active"),n.parent(".dropdown-menu").length&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate")}};var n=e.fn.scrollspy;e.fn.scrollspy=function(n){return this.each(function(){var r=e(this),i=r.data("scrollspy"),s=typeof n=="object"&&n;i||r.data("scrollspy",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.scrollspy.Constructor=t,e.fn.scrollspy.defaults={offset:10},e.fn.scrollspy.noConflict=function(){return e.fn.scrollspy=n,this},e(window).on("load",function(){e('[data-spy="scroll"]').each(function(){var t=e(this);t.scrollspy(t.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t){this.element=e(t)};t.prototype={constructor:t,show:function(){var t=this.element,n=t.closest("ul:not(.dropdown-menu)"),r=t.attr("data-target"),i,s,o;r||(r=t.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));if(t.parent("li").hasClass("active"))return;i=n.find(".active:last a")[0],o=e.Event("show",{relatedTarget:i}),t.trigger(o);if(o.isDefaultPrevented())return;s=e(r),this.activate(t.parent("li"),n),this.activate(s,s.parent(),function(){t.trigger({type:"shown",relatedTarget:i})})},activate:function(t,n,r){function o(){i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),t.addClass("active"),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu")&&t.closest("li.dropdown").addClass("active"),r&&r()}var i=n.find("> .active"),s=r&&e.support.transition&&i.hasClass("fade");s?i.one(e.support.transition.end,o):o(),i.removeClass("in")}};var n=e.fn.tab;e.fn.tab=function(n){return this.each(function(){var r=e(this),i=r.data("tab");i||r.data("tab",i=new t(this)),typeof n=="string"&&i[n]()})},e.fn.tab.Constructor=t,e.fn.tab.noConflict=function(){return e.fn.tab=n,this},e(document).on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(t){t.preventDefault(),e(this).tab("show")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.typeahead.defaults,n),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=e(this.options.menu),this.shown=!1,this.listen()};t.prototype={constructor:t,select:function(){var e=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(e)).change(),this.hide()},updater:function(e){return e},show:function(){var t=e.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:t.top+t.height,left:t.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(t){var n;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(n=e.isFunction(this.source)?this.source(this.query,e.proxy(this.process,this)):this.source,n?this.process(n):this)},process:function(t){var n=this;return t=e.grep(t,function(e){return n.matcher(e)}),t=this.sorter(t),t.length?this.render(t.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(e){return~e.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(e){var t=[],n=[],r=[],i;while(i=e.shift())i.toLowerCase().indexOf(this.query.toLowerCase())?~i.indexOf(this.query)?n.push(i):r.push(i):t.push(i);return t.concat(n,r)},highlighter:function(e){var t=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return e.replace(new RegExp("("+t+")","ig"),function(e,t){return"<strong>"+t+"</strong>"})},render:function(t){var n=this;return t=e(t).map(function(t,r){return t=e(n.options.item).attr("data-value",r),t.find("a").html(n.highlighter(r)),t[0]}),t.first().addClass("active"),this.$menu.html(t),this},next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("focus",e.proxy(this.focus,this)).on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this)).on("mouseleave","li",e.proxy(this.mouseleave,this))},eventSupported:function(e){var t=e in this.$element;return t||(this.$element.setAttribute(e,"return;"),t=typeof this.$element[e]=="function"),t},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},focus:function(e){this.focused=!0},blur:function(e){this.focused=!1,!this.mousedover&&this.shown&&this.hide()},click:function(e){e.stopPropagation(),e.preventDefault(),this.select(),this.$element.focus()},mouseenter:function(t){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")},mouseleave:function(e){this.mousedover=!1,!this.focused&&this.shown&&this.hide()}};var n=e.fn.typeahead;e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},e.fn.typeahead.Constructor=t,e.fn.typeahead.noConflict=function(){return e.fn.typeahead=n,this},e(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;n.typeahead(n.data())})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=e.extend({},e.fn.affix.defaults,n),this.$window=e(window).on("scroll.affix.data-api",e.proxy(this.checkPosition,this)).on("click.affix.data-api",e.proxy(function(){setTimeout(e.proxy(this.checkPosition,this),1)},this)),this.$element=e(t),this.checkPosition()};t.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var t=e(document).height(),n=this.$window.scrollTop(),r=this.$element.offset(),i=this.options.offset,s=i.bottom,o=i.top,u="affix affix-top affix-bottom",a;typeof i!="object"&&(s=o=i),typeof o=="function"&&(o=i.top()),typeof s=="function"&&(s=i.bottom()),a=this.unpin!=null&&n+this.unpin<=r.top?!1:s!=null&&r.top+this.$element.height()>=t-s?"bottom":o!=null&&n<=o?"top":!1;if(this.affixed===a)return;this.affixed=a,this.unpin=a=="bottom"?r.top-n:null,this.$element.removeClass(u).addClass("affix"+(a?"-"+a:""))};var n=e.fn.affix;e.fn.affix=function(n){return this.each(function(){var r=e(this),i=r.data("affix"),s=typeof n=="object"&&n;i||r.data("affix",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.affix.Constructor=t,e.fn.affix.defaults={offset:0},e.fn.affix.noConflict=function(){return e.fn.affix=n,this},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var t=e(this),n=t.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),t.affix(n)})})}(window.jQuery);
\ No newline at end of file
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under the MIT license
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.6",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.6",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.6",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.6",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",c).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.6",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in"),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+e).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",a,b)};c.VERSION="3.3.6",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-m<o.top?"bottom":"right"==h&&k.right+l>o.width?"left":"left"==h&&k.left-l<o.left?"right":h,f.removeClass(n).addClass(h)}var p=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(p,h);var q=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",q).emulateTransitionEnd(c.TRANSITION_DURATION):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top+=g,b.left+=h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.6",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.6",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),
+d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.6",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.6",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
\ No newline at end of file
diff --git a/bitbake/lib/toaster/toastergui/static/js/customrecipe.js b/bitbake/lib/toaster/toastergui/static/js/customrecipe.js
index 1c0ef9e..505a81c 100644
--- a/bitbake/lib/toaster/toastergui/static/js/customrecipe.js
+++ b/bitbake/lib/toaster/toastergui/static/js/customrecipe.js
@@ -158,7 +158,7 @@ function customRecipePageInit(ctx) {
           msg += " <strong>" + dep.name + "</strong>";
 
           /* Add any cells currently in view to the list of cells which get
-           * an inline notification inside them and which change add/rm state
+           * an list-inline notification inside them and which change add/rm state
            */
           depBtnCell = $("#package-btn-cell-" + dep.pk);
           btnCell = btnCell.add(depBtnCell);
@@ -208,7 +208,7 @@ function customRecipePageInit(ctx) {
           }
 
           /* Add any cells currently in view to the list of cells which get
-           * an inline notification inside them and which change add/rm state
+           * an list-inline notification inside them and which change add/rm state
            */
           depBtnCell = $("#package-btn-cell-" + dep.pk);
           btnCell = btnCell.add(depBtnCell);
diff --git a/bitbake/lib/toaster/toastergui/static/js/layerdetails.js b/bitbake/lib/toaster/toastergui/static/js/layerdetails.js
index d545406..7f4828e 100644
--- a/bitbake/lib/toaster/toastergui/static/js/layerdetails.js
+++ b/bitbake/lib/toaster/toastergui/static/js/layerdetails.js
@@ -98,7 +98,7 @@ function layerDetailsPageInit (ctx) {
     });
   });
 
-  $(".icon-pencil").click(function (){
+  $(".glyphicon glyphicon-pencil").click(function (){
     var mParent = $(this).parent("dd");
     mParent.prev().css("margin-top", "10px");
     mParent.children("form").slideDown();
@@ -134,7 +134,7 @@ function layerDetailsPageInit (ctx) {
         mParent.children(".delete-current-value").show();
       }
 
-      mParent.children(".icon-pencil").show();
+      mParent.children(".glyphicon glyphicon-pencil").show();
       mParent.prev().css("margin-top", "0px");
     });
   });
@@ -387,9 +387,9 @@ function layerDetailsPageInit (ctx) {
   });
 
 
-  layerDepsList.find(".icon-trash").click(layerDepRemoveClick);
+  layerDepsList.find(".glyphicon glyphicon-trash").click(layerDepRemoveClick);
   layerDepsList.find("a").tooltip();
-  $(".icon-trash").tooltip();
+  $(".glyphicon glyphicon-trash").tooltip();
   $(".commit").tooltip();
 
 }
diff --git a/bitbake/lib/toaster/toastergui/static/js/libtoaster.js b/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
index 0d1486b..411b0cd 100644
--- a/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
+++ b/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
@@ -571,8 +571,8 @@ $(document).ready(function() {
     // show task type and outcome in task details pages
     $(".task-info").tooltip({ container: 'body', html: true, delay: {show: 200}, placement: 'right' });
 
-    // initialise the tooltips for the icon-pencil icons
-    $(".icon-pencil").tooltip({ container: 'body', html: true, delay: {show: 400}, title: "Change" });
+    // initialise the tooltips for the glyphicon glyphicon-pencil icons
+    $(".glyphicon glyphicon-pencil").tooltip({ container: 'body', html: true, delay: {show: 400}, title: "Change" });
 
     // initialise the tooltips for the download icons
     $(".icon-download-alt").tooltip({ container: 'body', html: true, delay: { show: 200 } });
diff --git a/bitbake/lib/toaster/toastergui/static/js/table.js b/bitbake/lib/toaster/toastergui/static/js/table.js
index 7f76f55..0f0a1db 100644
--- a/bitbake/lib/toaster/toastergui/static/js/table.js
+++ b/bitbake/lib/toaster/toastergui/static/js/table.js
@@ -232,7 +232,7 @@ function tableInit(ctx){
 
       /* Setup the filter button */
       if (col.filter_name){
-        var filterBtn = $('<a href="#" role="button" data-filter-on="' + col.filter_name + '" class="pull-right btn btn-mini" data-toggle="modal"><i class="icon-filter filtered"></i></a>');
+        var filterBtn = $('<a href="#" role="button" data-filter-on="' + col.filter_name + '" class="pull-right btn btn-xs" data-toggle="modal"><i class="glyphicon glyphicon-filter filtered"></i></a>');
 
         filterBtn.data('filter-name', col.filter_name);
         filterBtn.prop('id', col.filter_name);
@@ -282,7 +282,7 @@ function tableInit(ctx){
 
       filterBtn.tooltip({
           html: true,
-          title: '<button class="btn btn-small btn-primary" onClick=\'$("#clear-filter-btn-'+ ctx.tableName +'").click();\'>Clear filter</button>',
+          title: '<button class="btn btn-sm btn-primary" onClick=\'$("#clear-filter-btn-'+ ctx.tableName +'").click();\'>Clear filter</button>',
           placement: 'bottom',
           delay: {
             hide: 1500,
@@ -455,10 +455,10 @@ function tableInit(ctx){
                    '       for="' + filterName + '">' +
                    filterActionData.title +
                    '</label>' +
-                   '<input type="text" maxlength="10" class="input-small"' +
+                   '<input type="text" maxlength="10" class="input-sm"' +
                    '       data-date-from-for="' + filterName + '">' +
                    '<span class="help-inline">to</span>' +
-                   '<input type="text" maxlength="10" class="input-small"' +
+                   '<input type="text" maxlength="10" class="input-sm"' +
                    '       data-date-to-for="' + filterName + '">' +
                    '<span class="help-inline get-help">(yyyy-mm-dd)</span>' +
                    '</div>');
diff --git a/bitbake/lib/toaster/toastergui/templates/base.html b/bitbake/lib/toaster/toastergui/templates/base.html
index 210cf33..52a5816 100644
--- a/bitbake/lib/toaster/toastergui/templates/base.html
+++ b/bitbake/lib/toaster/toastergui/templates/base.html
@@ -62,7 +62,7 @@
 
     {% csrf_token %}
     <div id="loading-notification" class="alert lead text-center" style="display:none">
-      Loading <i class="fa-pulse icon-spinner"></i>
+      Loading <i class="fa-pulse glyphicon glyphicon-spinner"></i>
     </div>
 
     <div id="change-notification" class="alert lead alert-info" style="display:none">
@@ -72,7 +72,7 @@
 
     <div class="navbar navbar-fixed-top">
       <div class="navbar-inner">
-        <div class="container-fluid">
+        <div class="container">
           <a class="brand logo" href="#"><img src="{% static 'img/logo.png' %}" class="" alt="Yocto logo project"/></a>
           <span class="brand">
             <a href="/">Toaster</a>
@@ -86,7 +86,7 @@
                 class="active"
                 {% endif %}>
               <a href="{% url 'all-builds' %}">
-                <i class="icon-tasks"></i>
+                <i class="glyphicon glyphicon-tasks"></i>
                 All builds
               </a>
             </li>
@@ -103,7 +103,7 @@
           <ul class="nav pull-right">
             <li>
               <a target="_blank" href="http://www.yoctoproject.org/docs/latest/toaster-manual/toaster-manual.html">
-                <i class="icon-book"></i>
+                <i class="glyphicon glyphicon-book"></i>
                 Manual
               </a>
             </li>
@@ -116,8 +116,8 @@
       </div>
     </div>
 
-    <div class="container-fluid top-padded">
-      <div class="row-fluid">
+    <div class="container top-padded">
+      <div class="row">
         {% block pagecontent %}
         {% endblock %}
       </div>
diff --git a/bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html b/bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html
index a62e0b1..d286abb 100644
--- a/bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html
+++ b/bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html
@@ -3,7 +3,7 @@
 {% load humanize %}
 {% block pagecontent %}
 
-<div class="row-fluid">
+<div class="row">
 <!-- Breadcrumbs -->
     <div class="section">
         <ul class="breadcrumb" id="breadcrumb">
diff --git a/bitbake/lib/toaster/toastergui/templates/basebuildpage.html b/bitbake/lib/toaster/toastergui/templates/basebuildpage.html
index 0d8c882..76a602b 100644
--- a/bitbake/lib/toaster/toastergui/templates/basebuildpage.html
+++ b/bitbake/lib/toaster/toastergui/templates/basebuildpage.html
@@ -4,6 +4,8 @@
 {% load objects_to_dictionaries_filter %}
 {% load humanize %}
 {% block pagecontent %}
+
+<div class="row">
   <!-- breadcrumbs -->
   <div class="section">
     <ul class="breadcrumb" id="breadcrumb">
@@ -28,10 +30,11 @@
       });
     </script>
   </div>
+</div>
 
-  <div class="row-fluid">
+  <div class="row">
     <!-- begin left sidebar container -->
-    <div id="nav" class="span2">
+    <div id="nav" class="col-md-2">
       <ul class="nav nav-list well">
         <li
           {% if request.resolver_match.url_name == 'builddashboard'  %}
diff --git a/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html b/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html
index 8778305..8020376 100644
--- a/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html
+++ b/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html
@@ -21,9 +21,9 @@
   });
 </script>
 
-<div class="row-fluid">
+<div class="row">
   <!-- only on config pages -->
-  <div id="config-nav" class="span2">
+  <div id="config-nav" class="col-md-2">
     <ul class="nav nav-list well">
       <li><a class="nav-parent" href="{% url 'project' project.id %}">Configuration</a></li>
       <li class="nav-header">Compatible metadata</li>
@@ -36,7 +36,7 @@
       <li><a href="{% url 'projectconf' project.id %}">BitBake variables</a></li>
     </ul>
   </div>
-  <div class="span10">
+  <div class="col-md-10">
     {% block projectinfomain %}{% endblock %}
   </div>
 </div>
diff --git a/bitbake/lib/toaster/toastergui/templates/basetable_top.html b/bitbake/lib/toaster/toastergui/templates/basetable_top.html
index 0ddd749..7ed9a93 100644
--- a/bitbake/lib/toaster/toastergui/templates/basetable_top.html
+++ b/bitbake/lib/toaster/toastergui/templates/basetable_top.html
@@ -161,8 +161,8 @@
 <!-- control header -->
 <div class="navbar">
     <div class="navbar-inner">
-        <form class="navbar-search input-append pull-left span6" id="searchform">
-            <input id="search" name="search" type="text" placeholder="Search {%if object_search_display %}{{object_search_display}}{%else%}{{objectname}}{%endif%}" value="{%if request.GET.search %}{{request.GET.search}}{% endif %}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{%endif%}
+        <form class="navbar-search input-group pull-left col-md-6" id="searchform">
+            <input id="search" name="search" type="text" placeholder="Search {%if object_search_display %}{{object_search_display}}{%else%}{{objectname}}{%endif%}" value="{%if request.GET.search %}{{request.GET.search}}{% endif %}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-group-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{%endif%}
             <input type="hidden" name="orderby" value="{{request.GET.orderby}}">
             <input type="hidden" name="page" value="1">
             <button class="btn" id="search-button" type="submit" value="Search">Search</button>
@@ -230,7 +230,7 @@
                 {%if tc.orderfield%}<a {%if tc.ordericon%} class="sorted" {%endif%}href="javascript:reload_params({'page': 1, 'orderby' : '{{tc.orderfield}}' })">{{tc.name}}</a>{%else%}<span class="muted">{{tc.name}}</span>{%endif%}
                 {%if tc.ordericon%} <i class="icon-caret-{{tc.ordericon}}"></i>{%endif%}
                 {%if tc.filter%}<div class="btn-group pull-right">
-                    <a href="#filter_{{tc.filter.class}}" role="button" class="btn btn-mini {%if request.GET.filter%}{{tc.filter.options|filtered_icon:request.GET.filter}} {%endif%}" {%if request.GET.filter and tc.filter.options|filtered_tooltip:request.GET.filter %} title="<p>{{tc.filter.options|filtered_tooltip:request.GET.filter}}</p><p><a class='btn btn-small btn-primary' href=javascript:reload_params({'filter':''})>Show all {% if filter_search_display %}{{filter_search_display}}{% else %}{{objectname}}{% endif %}</a></p>" {%endif%} data-toggle="modal"> <i class="icon-filter filtered"></i> </a>
+                    <a href="#filter_{{tc.filter.class}}" role="button" class="btn btn-xs {%if request.GET.filter%}{{tc.filter.options|filtered_icon:request.GET.filter}} {%endif%}" {%if request.GET.filter and tc.filter.options|filtered_tooltip:request.GET.filter %} title="<p>{{tc.filter.options|filtered_tooltip:request.GET.filter}}</p><p><a class='btn btn-sm btn-primary' href=javascript:reload_params({'filter':''})>Show all {% if filter_search_display %}{{filter_search_display}}{% else %}{{objectname}}{% endif %}</a></p>" {%endif%} data-toggle="modal"> <i class="glyphicon glyphicon-filter filtered"></i> </a>
                 </div>{%endif%}
             </th>{% endfor %}
         </tr>
diff --git a/bitbake/lib/toaster/toastergui/templates/bpackage.html b/bitbake/lib/toaster/toastergui/templates/bpackage.html
index 81973cb..d03760c 100644
--- a/bitbake/lib/toaster/toastergui/templates/bpackage.html
+++ b/bitbake/lib/toaster/toastergui/templates/bpackage.html
@@ -12,7 +12,7 @@
 {% endblock %}
 
 {% block buildinfomain %}
-<div class="span10">
+<div class="col-md-10">
 
 {% if not request.GET.filter and not request.GET.search and not objects.paginator.count %}
 
@@ -43,10 +43,10 @@
 </div>
 
   {% if objects.paginator.count == 0 %}
-  <div class="row-fluid">
+  <div class="row">
       <div class="alert">
-        <form class="no-results input-append" id="searchform">
-            <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %}
+        <form class="no-results input-group" id="searchform">
+            <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-group-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
             <button class="btn" type="submit" value="Search">Search</button>
             <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all packages</button>
         </form>
@@ -82,7 +82,7 @@
             <!-- Layer commit -->
             <td class="recipe__layer_version__layer__commit">
                 <a class="btn"
-                    data-content="<ul class='unstyled'>
+                    data-content="<ul class='list-unstyled'>
                       <li>{{package.recipe.layer_version.commit}}</li>
                     </ul>">
                     {{package.recipe.layer_version.commit|truncatechars:13}}
diff --git a/bitbake/lib/toaster/toastergui/templates/builddashboard.html b/bitbake/lib/toaster/toastergui/templates/builddashboard.html
index a0da71e..ca9b207 100644
--- a/bitbake/lib/toaster/toastergui/templates/builddashboard.html
+++ b/bitbake/lib/toaster/toastergui/templates/builddashboard.html
@@ -13,16 +13,16 @@
 
 {% block buildinfomain %}
 <!-- page title -->
-<div class="row-fluid span10">
+<div class="row col-md-10">
  <div class="page-header">
      <h1>{{build.target_set.all|dictsort:"target"|join:", "}} {{build.machine}}</h1>
  </div>
 </div>
 
 <!-- build result bar -->
-<div class="row-fluid span10 pull-right">
+<div class="row col-md-10 pull-right">
   <div class="alert {%if build.outcome == build.SUCCEEDED%}alert-success{%elif build.outcome == build.FAILED%}alert-error{%else%}alert-info{%endif%}">
-    <div class="row-fluid lead">
+    <div class="row lead">
             <span class="pull-left"><strong>
                 {%if build.outcome == build.SUCCEEDED%}Completed{%elif build.outcome == build.FAILED%}Failed{%else%}{%endif%}
               </strong> on
@@ -53,7 +53,7 @@
 </div>
 
 {% if build.errors.count %}
-<div class="accordion span10 pull-right" id="errors">
+<div class="accordion col-md-10 pull-right" id="errors">
   <div class="accordion-group">
     <div class="accordion-heading">
             <a class="accordion-toggle error toggle-errors">
@@ -65,7 +65,7 @@
     </div>
     <div class="accordion-body collapse in" id="collapse-errors">
       <div class="accordion-inner">
-        <div class="span10">
+        <div class="col-md-10">
           {% for error in build.errors %}
             <div class="alert alert-error" data-error="{{ error.id }}">
               <pre>{{error.message}}</pre>
@@ -81,7 +81,7 @@
 {%if build.outcome == build.SUCCEEDED%}
 <!-- built images -->
 {% if hasImages %}
-<div class="row-fluid span10 pull-right">
+<div class="row col-md-10 pull-right">
     <h2>Images</h2>
     {% for target in targets %}
         {% if target.target.is_image %}
@@ -95,8 +95,8 @@
             <dd>{{target.pkgsz|filtered_filesizeformat}}</dd>
                         {% if target.targetHasNoImages %}
                 </dl>
-                <div class="row-fluid">
-                    <div class="alert alert-info span7">
+                <div class="row">
+                    <div class="alert alert-info col-md-7">
                     <p>
                                     <b>This build did not create any image files</b>
                                   </p>
@@ -149,7 +149,7 @@
 
 <!-- other artifacts -->
 {% if build.buildartifact_set.all.count > 0 %}
-<div class="row-fluid span10 pull-right">
+<div class="row col-md-10 pull-right">
 <h2>Other artifacts</h2>
 
     <div class="well dashboard-section">
@@ -173,9 +173,9 @@
 </div>
 {% endif %}
 <!-- build summary -->
-<div class="row-fluid span10 pull-right">
+<div class="row col-md-10 pull-right">
 <h2>Build summary</h2>
-    <div class="well span4 dashboard-section" style="margin-left:0px;">
+    <div class="well col-md-4 dashboard-section" style="margin-left:0px;">
         <h4><a href="{%url 'configuration' build.pk%}">Configuration</a></h4>
             <dl>
         <dt>Machine</dt><dd>{{build.machine}}</dd>
@@ -183,7 +183,7 @@
         <dt>Layers</dt>{% for i in build.layer_version_build.all|dictsort:"layer.name" %}<dd>{{i.layer.name}}</dd>{%endfor%}
             </dl>
     </div>
-    <div class="well span4 dashboard-section">
+    <div class="well col-md-4 dashboard-section">
         <h4><a href="{%url 'tasks' build.pk%}">Tasks</a></h4>
             <dl>
             {% query build.task_build outcome=4 order__gt=0 as exectask%}
@@ -231,7 +231,7 @@
         </dd>
             </dl>
     </div>
-    <div class="well span4 dashboard-section">
+    <div class="well col-md-4 dashboard-section">
         <h4><a href="{% url 'recipes' build.pk %}">Recipes</a> & <a href="{% url 'packages' build.pk %}">Packages</a></h4>
             <dl>
         <dt>Recipes built</dt><dd><a href="{% url 'recipes' build.pk %}">{{recipecount}}</a></dd>
@@ -241,7 +241,7 @@
 </div>
 
 {% if build.warnings.count %}
-<div class="accordion span10 pull-right" id="warnings">
+<div class="accordion col-md-10 pull-right" id="warnings">
   <div class="accordion-group">
     <div class="accordion-heading">
       <a class="accordion-toggle warning toggle-warnings">
@@ -253,7 +253,7 @@
     </div>
     <div class="accordion-body collapse" id="collapse-warnings">
       <div class="accordion-inner">
-        <div class="span10">
+        <div class="col-md-10">
           {% for warning in logmessages %}{% if warning.level == 1 %}
             <div class="alert alert-warning">
               <pre>{{warning.message}}</pre>
diff --git a/bitbake/lib/toaster/toastergui/templates/buildrequestdetails.html b/bitbake/lib/toaster/toastergui/templates/buildrequestdetails.html
index 70fa1fb..c782074 100644
--- a/bitbake/lib/toaster/toastergui/templates/buildrequestdetails.html
+++ b/bitbake/lib/toaster/toastergui/templates/buildrequestdetails.html
@@ -8,11 +8,11 @@
 {% block projectinfomain %}
       <!-- begin content -->
 
-          <div class="row-fluid">
+          <div class="row">
 
             <!-- end left sidebar container -->
             <!-- Begin right container -->
-            <div class="span10">
+            <div class="col-md-10">
               <div class="page-header">
                 <h1>
  <span data-toggle="tooltip" {%if buildrequest.brtarget_set.all.count > 1%}title="Targets: {%for target in buildrequest.brtarget_set.all%}{{target.target}} {%endfor%}"{%endif%}>{{buildrequest.brtarget_set.all.0.target}} {%if buildrequest.brtarget_set.all.count > 1%}(+ {{buildrequest.brtarget_set.all.count|add:"-1"}}){%endif%} {{buildrequest.get_machine}} </span>
@@ -45,7 +45,7 @@
                   </div>
                   <div class="accordion-body collapse in" id="collapse-errors">
                     <div class="accordion-inner">
-                      <div class="span10">
+                      <div class="col-md-10">
                {% for error in buildrequest.brerror_set.all %}
                         <div class="alert alert-error">
                           ERROR: <div class="air well"><pre>{{error.errmsg}}</pre></div>
@@ -58,7 +58,7 @@
                 </div>
               </div>
             </div>
-          </div> <!-- end of row-fluid -->
+          </div> <!-- end of row -->
 
 
 {%endblock%}
diff --git a/bitbake/lib/toaster/toastergui/templates/builds-toastertable.html b/bitbake/lib/toaster/toastergui/templates/builds-toastertable.html
index bf13a66..505a568 100644
--- a/bitbake/lib/toaster/toastergui/templates/builds-toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/builds-toastertable.html
@@ -13,7 +13,7 @@
 
 {% block pagecontent %}
 
-  <div class="row-fluid">
+  <div class="row">
     {% with mru=mru mrb_type=mrb_type %}
       {% include 'mrb_section.html' %}
     {% endwith %}
diff --git a/bitbake/lib/toaster/toastergui/templates/configuration.html b/bitbake/lib/toaster/toastergui/templates/configuration.html
index 85d6a62..9e3bd64 100644
--- a/bitbake/lib/toaster/toastergui/templates/configuration.html
+++ b/bitbake/lib/toaster/toastergui/templates/configuration.html
@@ -12,14 +12,14 @@
 
 {% block buildinfomain %}
 <!-- page title -->
-<div class="row-fluid span10">
+<div class="row col-md-10">
  <div class="page-header">
      <h1>Configuration</h1>
  </div>
 </div>
 
 <!-- configuration table -->
-<div class="row-fluid pull-right span10" id="navTab">
+<div class="row pull-right col-md-10" id="navTab">
 <ul class="nav nav-pills">
     <li class="active"><a href="#">Summary</a></li>
     <li class=""><a href="{% url 'configvars' build.id %}">BitBake variables</a></li>
@@ -44,7 +44,7 @@
           {% endfor %} </ul> </dd> {% endif %}
     </dl>
     <h3>Layers</h3>
-    <div class="span9" style="margin-left:0px;">
+    <div class="col-md-9" style="margin-left:0px;">
     <table class="table table-bordered table-hover">
       <thead>
         <tr>
@@ -57,7 +57,7 @@
         <tr>
             <td>{{lv.layer.name}}</td>
             <td>{{lv.branch}}</td>
-            <td> <a class="btn" data-content="<ul class='unstyled'>
+            <td> <a class="btn" data-content="<ul class='list-unstyled'>
                 <li>{{lv.commit}}</li> </ul>">
                     {{lv.commit|truncatechars:13}}
                 </a></td>
diff --git a/bitbake/lib/toaster/toastergui/templates/configvars.html b/bitbake/lib/toaster/toastergui/templates/configvars.html
index e40c225..70e4d89 100644
--- a/bitbake/lib/toaster/toastergui/templates/configvars.html
+++ b/bitbake/lib/toaster/toastergui/templates/configvars.html
@@ -12,7 +12,7 @@
 
 {% block buildinfomain %}
 <!-- page title -->
-<div class="row-fluid span10">
+<div class="row col-md-10">
  <div class="page-header">
  <h1>
   {% if request.GET.filter and objects.paginator.count > 0 or request.GET.search and objects.paginator.count > 0 %}
@@ -27,7 +27,7 @@
 </div>
 
 <!-- configuration table -->
-<div class="row-fluid pull-right span10" id="navTab">
+<div class="row pull-right col-md-10" id="navTab">
   <ul class="nav nav-pills">
     <li class=""><a href="{% url 'configuration' build.id %}">Summary</a></li>
     <li class="active"><a href="#" >BitBake variables</a></li>
@@ -37,10 +37,10 @@
   <div id="variables" class="tab-pane">
 
   {% if objects.paginator.count == 0 %}
-  <div class="row-fluid">
+  <div class="row">
       <div class="alert">
-        <form class="no-results input-append" id="searchform">
-            <input id="search" name="search" class="input-xxlarge" type="text" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %}
+        <form class="no-results input-group" id="searchform">
+            <input id="search" name="search" class="input-xxlarge" type="text" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-group-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
             <button class="btn" type="submit" value="Search">Search</button>
             <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all variables</button>
         </form>
@@ -65,7 +65,7 @@
             {% if variable.description %}
                 {{variable.description}}
                 <a href="http://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#var-{{variable.variable_name|variable_parent_name}}" target="_blank">
-                <i class="icon-share get-info"></i></a>
+                <i class="glyphicon glyphicon-share get-info"></i></a>
             {% endif %}
         </td>
     </tr>
@@ -96,10 +96,10 @@
                     <span>{{variable.variable_value|string_slice:':570'}}
                         <span class="full"> {{variable.variable_value|string_slice:'570:'}}
                         </span>
-                        <a class="btn btn-mini full-show">...</a>
+                        <a class="btn btn-xs full-show">...</a>
                     </span>
                 </p>
-                <a class="btn btn-mini full-hide">Collapse variable value <i class="icon-caret-up"></i>
+                <a class="btn btn-xs full-hide">Collapse variable value <i class="icon-caret-up"></i>
                 </a>
               {% endif %}
             {% else %}
diff --git a/bitbake/lib/toaster/toastergui/templates/customise_btn.html b/bitbake/lib/toaster/toastergui/templates/customise_btn.html
index 2e54a9d..ee516ce 100644
--- a/bitbake/lib/toaster/toastergui/templates/customise_btn.html
+++ b/bitbake/lib/toaster/toastergui/templates/customise_btn.html
@@ -10,6 +10,6 @@
     style="display:none;"
     {% endif %}
   >
-  <i class="icon-plus"></i>
+  <i class="glyphicon glyphicon-plus"></i>
   Add layer
 </button>
diff --git a/bitbake/lib/toaster/toastergui/templates/customrecipe.html b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
index 4b1ef66..cfe6df0 100644
--- a/bitbake/lib/toaster/toastergui/templates/customrecipe.html
+++ b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
@@ -81,7 +81,7 @@
 <!-- end package dependencies modal -->
 
 
-<div class="row-fluid span11">
+<div class="row col-md-11">
   <div class="alert alert-success lead" id="image-created-notification" style="margin-top: 15px; display: none">
     <button type="button" data-dismiss="alert" class="close">x</button>
     Your custom image <strong>{{recipe.name}}</strong> has been created. You can now add or remove packages as needed.
@@ -94,10 +94,10 @@
   </div>
 </div>
 
-<div class="row-fluid span11">
-  <div class="span8">
+<div class="row col-md-11">
+  <div class="col-md-8">
     <div class="button-place btn-group" style="width: 100%">
-      <a class="btn btn-large span6 build-custom-image" href="#" style="width: 50%">
+      <a class="btn btn-lg col-md-6 build-custom-image" href="#" style="width: 50%">
         Build {{recipe.name}}
       </a>
       <a href="{% url 'customrecipedownload' project.id recipe.id %}" class="btn btn-large span6" style="width: 50%"
@@ -120,10 +120,10 @@
           <li>Build the recipe</li>
           <li>Once the build completes, come back to this page and search for the package</li>
         </ol>
-        <form class="input-append no-results">
+        <form class="input-group no-results">
           <input type="text" class="input-xlarge no-results-search-input" id="no-results-search-input-{{table_name}}" name="search" placeholder="Search {{title|lower}}" />
-          <a href="#" class="add-on btn" id="no-results-remove-search-btn" tabindex="-1">
-            <i class="icon-remove"></i>
+          <a href="#" class="input-group-addon btn" id="no-results-remove-search-btn" tabindex="-1">
+            <i class="glyphicon glyphicon-remove"></i>
           </a>
           <button class="btn search-submit-{{table_name}}">Search</button>
           <button class="btn btn-link" id="no-results-show-all-packages">Show all packages</button>
@@ -136,7 +136,7 @@
         <h2> Add | Remove packages </h2>
         <div class="alert alert-info air">
           <p class="lead">Toaster has no package information for {{recipe.name}}. To generate package information, build {{recipe.name}}</p>
-          <button class="btn btn-info btn-large build-custom-image" style="margin:20px 0 10px 0;">Build {{recipe.name}}</button>
+          <button class="btn btn-info btn-lg build-custom-image" style="margin:20px 0 10px 0;">Build {{recipe.name}}</button>
         </div>
         {% else %}
         {# ToasterTable for Adding remove packages #}
@@ -147,7 +147,7 @@
       </div>
       </div>
     </div>
-    <div class="span4 well">
+    <div class="col-md-4 well">
       <h2 style="margin-bottom:20px;">About {{recipe.name}}</h2>
 
       <dl>
@@ -224,7 +224,7 @@
           </dd>
       </dl>
       <!--
-      <i class="icon-trash no-tooltip"></i>
+      <i class="glyphicon glyphicon-trash no-tooltip"></i>
       <a href="#" class="error" id="delete">Delete custom image</a>
         -->
     </div>
diff --git a/bitbake/lib/toaster/toastergui/templates/detail_search_header.html b/bitbake/lib/toaster/toastergui/templates/detail_search_header.html
index 7bea3f4..2e5a590 100644
--- a/bitbake/lib/toaster/toastergui/templates/detail_search_header.html
+++ b/bitbake/lib/toaster/toastergui/templates/detail_search_header.html
@@ -18,22 +18,22 @@ $(document).ready(function() {
   });
 });
 </script>
-<div class="row-fluid">
+<div class="row">
 {% if objects.paginator.count > 10 or request.GET.search %}
   {% if objects.paginator.count == 0 %}
   <div class="alert">
     <h3>No {{search_what}} found</h3>
-    <form id="searchform" class="input-append">
+    <form id="searchform" class="input-group">
   {% else %}
-    <form id="searchform" class="navbar-search input-append pull-left">
+    <form id="searchform" class="navbar-search input-group pull-left">
   {% endif %}
 
       <input id="search" class="input-xlarge" type="text" placeholder="Search {{search_what}}" name="search" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}">
       <input type="hidden" value="name:+" name="orderby">
       <input type="hidden" value="l" name="page">
   {% if request.GET.search %}
-      <a class="add-on btn search-clear">
-        <i class="icon-remove"></i>
+      <a class="input-group-addon btn search-clear">
+        <i class="glyphicon glyphicon-remove"></i>
       </a>
   {% endif %}
       <button type="submit" class="btn">Search</button>
@@ -65,4 +65,4 @@ $(document).ready(function() {
   </div>
   {% endif %}
 {% endif %}
-</div> {# row-fluid #}
+</div> {# row #}
diff --git a/bitbake/lib/toaster/toastergui/templates/detail_sorted_header.html b/bitbake/lib/toaster/toastergui/templates/detail_sorted_header.html
index 6ce292e..fddb041 100644
--- a/bitbake/lib/toaster/toastergui/templates/detail_sorted_header.html
+++ b/bitbake/lib/toaster/toastergui/templates/detail_sorted_header.html
@@ -17,7 +17,7 @@
                     <span class="badge badge-info">{{objects.paginator.count}}</span>
                 {% endif %}
                 {%if tc.filter%}<div class="btn-group pull-right">
-                    <a href="#filter_{{tc.filter.class}}" role="button" class="btn btn-mini {%if request.GET.filter%}{{tc.filter.options|filtered_icon:request.GET.filter}} {%endif%}" {%if request.GET.filter and tc.filter.options|filtered_tooltip:request.GET.filter %} title="<p>{{tc.filter.options|filtered_tooltip:request.GET.filter}}</p><p><a class='btn btn-small btn-primary' href=javascript:reload_params({'filter':''})>Show all {% if filter_search_display %}{{filter_search_display}}{% else %}{{objectname}}{% endif %}</a></p>" {%endif%} data-toggle="modal"> <i class="icon-filter filtered"></i> </a>
+                    <a href="#filter_{{tc.filter.class}}" role="button" class="btn btn-xs {%if request.GET.filter%}{{tc.filter.options|filtered_icon:request.GET.filter}} {%endif%}" {%if request.GET.filter and tc.filter.options|filtered_tooltip:request.GET.filter %} title="<p>{{tc.filter.options|filtered_tooltip:request.GET.filter}}</p><p><a class='btn btn-sm btn-primary' href=javascript:reload_params({'filter':''})>Show all {% if filter_search_display %}{{filter_search_display}}{% else %}{{objectname}}{% endif %}</a></p>" {%endif%} data-toggle="modal"> <i class="glyphicon glyphicon-filter filtered"></i> </a>
                 </div>{%endif%}
             </th>{% endfor %}
         </tr>
diff --git a/bitbake/lib/toaster/toastergui/templates/dirinfo.html b/bitbake/lib/toaster/toastergui/templates/dirinfo.html
index ecb46bf..df06a94 100644
--- a/bitbake/lib/toaster/toastergui/templates/dirinfo.html
+++ b/bitbake/lib/toaster/toastergui/templates/dirinfo.html
@@ -110,7 +110,7 @@
                   namespan = 3;
                 }
                 var colspan = 'colspan="' + namespan + '"';
-                name = '<td ' + colspan + '><i class="icon-file"></i>';
+                name = '<td ' + colspan + '><i class="glyphicon glyphicon-file"></i>';
             }
             else {
                 name = '<td><i class="icon-hand-right"></i>';
@@ -184,7 +184,7 @@
     }
 </script>
 
-<div class="span10">
+<div class="col-md-10">
 
     <div class="page-header">
         <h1> {{target.target}} </h1>
@@ -235,7 +235,7 @@
             </tbody>
         </table>
     </div> <!-- directory-structure -->
-</div> <!-- span10 -->
+</div> <!-- col-md-10 -->
 
 {% endblock buildinfomain %}
 
diff --git a/bitbake/lib/toaster/toastergui/templates/filtersnippet.html b/bitbake/lib/toaster/toastergui/templates/filtersnippet.html
index 1101aa8..ea772de 100644
--- a/bitbake/lib/toaster/toastergui/templates/filtersnippet.html
+++ b/bitbake/lib/toaster/toastergui/templates/filtersnippet.html
@@ -33,8 +33,8 @@
                 {% if option.3 %}<i class="icon-question-sign get-help" data-placement="right" title="{{option.3}}"></i>{% endif %}
                   </label>
                 {% if option.1 == 'daterange' %}
-                  <input type="text" id="date_from_{{key}}" name="date_from_{{key}}" disabled class="input-small" /><label class="help-inline">to</label>
-                  <input type="text" id="date_to_{{key}}" name="date_to_{{key}}" disabled class="input-small"  />
+                  <input type="text" id="date_from_{{key}}" name="date_from_{{key}}" disabled class="input-sm" /><label class="help-inline">to</label>
+                  <input type="text" id="date_to_{{key}}" name="date_to_{{key}}" disabled class="input-sm"  />
                   <label class="help-inline get-help" >(dd/mm/yyyy)</label>
                   </div>
                 {% endif %}
diff --git a/bitbake/lib/toaster/toastergui/templates/importlayer.html b/bitbake/lib/toaster/toastergui/templates/importlayer.html
index 1848f41..fa64d53 100644
--- a/bitbake/lib/toaster/toastergui/templates/importlayer.html
+++ b/bitbake/lib/toaster/toastergui/templates/importlayer.html
@@ -26,7 +26,7 @@
                     });
                   </script>
 
-                <form class="span11">
+                <form class="col-md-11">
                    <fieldset>
                       <legend>Layer repository information</legend>
                       <span class="help-block">The layer you are importing must be compatible with <strong>{{project.release.description}}</strong>, which is the release you are using in this project.</span>
@@ -93,7 +93,7 @@
                               <span class="icon-question-sign get-help" title="You can provide a Git branch, a tag or a commit SHA as the revision"></span>
                             </label>
                             <div class="controls">
-                              <input type="text" class="span3" id="layer-git-ref" required>
+                              <input type="text" class="col-md-3" id="layer-git-ref" required>
                                 <span class="help-inline" style="diaply:none;" id="invalid-layer-revision-hint"></span>
                             </div>
                           </div>
@@ -108,9 +108,9 @@
                             <span class="muted">(optional)</span>
                             <span class="icon-question-sign get-help heading-help" title="Other layers this layer depends upon"></span>
                         </legend>
-                        <ul class="unstyled configuration-list" id="layer-deps-list">
+                        <ul class="list-unstyled configuration-list" id="layer-deps-list">
                         </ul>
-                        <div class="input-append">
+                        <div class="input-group">
                             <input type="text" autocomplete="off" data-minLength="1" data-autocomplete="off" data-provide="typeahead" placeholder="Type a layer name" id="layer-dependency" class="input-xlarge">
                             <a class="btn" id="add-layer-dependency-btn">
                                 Add layer
@@ -119,7 +119,7 @@
                         <span class="help-inline">You can only add layers Toaster knows about</span>
                     </fieldset>
                     <div class="air" id="form-actions">
-                      <button class="btn btn-primary btn-large" data-toggle="modal" id="import-and-add-btn" data-target="#dependencies-message" disabled>Import and add to project</button>
+                      <button class="btn btn-primary btn-lg" data-toggle="modal" id="import-and-add-btn" data-target="#dependencies-message" disabled>Import and add to project</button>
                         <span class="help-inline" id="import-and-add-hint" style="vertical-align: middle;">To import a layer you need to enter a layer name, a Git repository URL and a revision (branch, tag or commit)</span>
                     </div>
                   </div>
diff --git a/bitbake/lib/toaster/toastergui/templates/landing.html b/bitbake/lib/toaster/toastergui/templates/landing.html
index a1b5cdc..b19eb5f 100644
--- a/bitbake/lib/toaster/toastergui/templates/landing.html
+++ b/bitbake/lib/toaster/toastergui/templates/landing.html
@@ -6,19 +6,19 @@
 
 {% block title %} Welcome to Toaster {% endblock %}
 {% block pagecontent %}
-    <div class="container-fluid">
-      <div class="row-fluid">
-        <div class="hero-unit span12 well-transparent">
-          <div class="row-fluid">
+    <div class="container">
+      <div class="row">
+        <div class="jumbotron col-md-12 well-transparent">
+          <div class="row">
 
-            <div class="span6">
+            <div class="col-md-6">
               <h1>This is Toaster</h1>
 
               <p>A web interface to <a href="http://www.openembedded.org">OpenEmbedded</a> and <a href="http://www.yoctoproject.org/tools-resources/projects/bitbake">BitBake</a>, the <a href="http://www.yoctoproject.org">Yocto Project</a> build system.</p>
 
 		          {% if lvs_nos %}
 		            <p class="hero-actions">
-		              <a class="btn btn-primary btn-large" href="{% url 'newproject' %}">
+		              <a class="btn btn-primary btn-lg" href="{% url 'newproject' %}">
 			              To start building, create your first Toaster project
 		              </a>
 		            </p>
@@ -36,7 +36,7 @@
                 </div>
               {% endif %}
 
-              <ul class="unstyled">
+              <ul class="list-unstyled">
                 <li>
                   <a href="http://www.yoctoproject.org/docs/latest/toaster-manual/toaster-manual.html">
                     Read the Toaster manual
@@ -51,8 +51,8 @@
               </ul>
             </div>
 
-            <div class="span6">
-              <img alt="Yocto Project" class="thumbnail" src="{% static 'img/toaster_bw.png' %}"/>
+            <div class="col-md-6">
+              <img alt="Yocto Project" class="img-thumbnail" src="{% static 'img/toaster_bw.png' %}"/>
             </div>
 
           </div>
diff --git a/bitbake/lib/toaster/toastergui/templates/landing_not_managed.html b/bitbake/lib/toaster/toastergui/templates/landing_not_managed.html
index 9b37f55..baa4b72 100644
--- a/bitbake/lib/toaster/toastergui/templates/landing_not_managed.html
+++ b/bitbake/lib/toaster/toastergui/templates/landing_not_managed.html
@@ -8,8 +8,8 @@
 
 {% block pagecontent %}
 
-  <div class="container-fluid">
-   <div class="row-fluid">
+  <div class="container">
+   <div class="row">
     <!-- Empty - no build module -->
     <div class="page-header top-air">
      <h1>
diff --git a/bitbake/lib/toaster/toastergui/templates/layer_btn.html b/bitbake/lib/toaster/toastergui/templates/layer_btn.html
index 10de37d..d5ce9ff 100644
--- a/bitbake/lib/toaster/toastergui/templates/layer_btn.html
+++ b/bitbake/lib/toaster/toastergui/templates/layer_btn.html
@@ -3,7 +3,7 @@
     style="display:none;"
     {% endif %}
   >
-  <i class="icon-trash"></i>
+  <i class="glyphicon glyphicon-trash"></i>
   Remove layer
 </button>
 <button class="btn btn-block layer-add-{{data.pk}} layerbtn" data-layer='{ "id": {{data.pk}}, "name":  "{{data.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.pk%}"}' data-directive="add"
@@ -11,7 +11,7 @@
     style="display:none;"
     {% endif %}
   >
-  <i class="icon-plus"></i>
+  <i class="glyphicon glyphicon-plus"></i>
   Add layer
 </button>
 
diff --git a/bitbake/lib/toaster/toastergui/templates/layerdetails.html b/bitbake/lib/toaster/toastergui/templates/layerdetails.html
index 82be370..022226f 100644
--- a/bitbake/lib/toaster/toastergui/templates/layerdetails.html
+++ b/bitbake/lib/toaster/toastergui/templates/layerdetails.html
@@ -24,13 +24,13 @@
 {# If this is not an imported layer then hide the edit ui #}
 {% if not layerversion.layer_source_id or layerversion.layer_source.sourcetype != layerversion.layer_source.TYPE_IMPORTED %}
 <style scoped>
- .icon-pencil {
+ .glyphicon glyphicon-pencil {
    display:none;
  }
 .delete-current-value{
   display: none;
 }
- li .icon-trash {
+ li .glyphicon glyphicon-trash {
    display:none;
  }
  .add-deps {
@@ -69,7 +69,7 @@
   });
 </script>
 
-<div class="row-fluid span11">
+<div class="row col-md-11">
   <div class="page-header">
     <h1>{{layerversion.layer.name}} <small class="commit"
           {% if layerversion.get_vcs_reference|length > 13 %}
@@ -80,7 +80,7 @@
 </div>
 
 <!-- container for tabs -->
-<div class="row-fluid span7 tabbable">
+<div class="row col-md-7 tabbable">
   <div class="alert alert-info lead" id="alert-area" style="display:none">
     <button type="button" class="close" id="dismiss-alert">&times;</button>
     <span id="alert-msg"></span>
@@ -99,13 +99,13 @@
   <div class="tab-content">
     <span class="button-place">
       {% if layerversion.id not in projectlayers %}
-      <button id="add-remove-layer-btn" data-directive="add" class="btn btn-large btn-block">
-        <span class="icon-plus"></span>
+      <button id="add-remove-layer-btn" data-directive="add" class="btn btn-lg btn-block">
+        <span class="glyphicon glyphicon-plus"></span>
         Add the {{layerversion.layer.name}} layer to your project
       </button>
       {% else %}
-      <button id="add-remove-layer-btn" data-directive="remove" class="btn btn-block btn-large btn-danger">
-        <span class="icon-trash"></span>
+      <button id="add-remove-layer-btn" data-directive="remove" class="btn btn-block btn-lg btn-danger">
+        <span class="glyphicon glyphicon-trash"></span>
         Remove the {{layerversion.layer.name}} layer from your project
       </button>
       {% endif %}
@@ -121,16 +121,16 @@
         <dd>
           <span class="current-value">{{layerversion.layer.vcs_url}}</span>
           {% if layerversion.get_vcs_link_url %}
-          <a href="{{layerversion.get_vcs_link_url}}/" class="icon-share get-info" target="_blank"></a>
+          <a href="{{layerversion.get_vcs_link_url}}/" class="glyphicon glyphicon-share get-info" target="_blank"></a>
           {% endif %}
           <form id="change-repo-form" class="control-group" style="display:none">
-            <div class="input-append">
+            <div class="input-group">
               <input type="text" class="input-xlarge" value="{{layerversion.layer.vcs_url}}">
                 <button data-layer-prop="vcs_url" class="btn change-btn" type="button">Save</button>
                 <a href="#" style="display:none" class="btn btn-link cancel">Cancel</a>
               </div>
             </form>
-            <i class="icon-pencil" ></i>
+            <i class="glyphicon glyphicon-pencil" ></i>
           </dd>
           <dt>
             <i class="icon-question-sign get-help" title="Subdirectory within the repository where the layer is located, if not in the root (usually only used if the repository contains more than one layer)"></i>
@@ -140,17 +140,17 @@
             <span class="muted" style="display:none">Not set</span>
             <span class="current-value">{{layerversion.dirpath}}</span>
             {% if layerversion.get_vcs_dirpath_link_url %}
-            <a href="{{layerversion.get_vcs_dirpath_link_url}}" class="icon-share get-info" target="_blank"></a>
+            <a href="{{layerversion.get_vcs_dirpath_link_url}}" class="glyphicon glyphicon-share get-info" target="_blank"></a>
             {% endif %}
             <form id="change-subdir-form" style="display:none;">
-              <div class="input-append">
+              <div class="input-group">
                 <input type="text" value="{{layerversion.dirpath}}">
                   <button data-layer-prop="dirpath" class="btn change-btn" type="button">Save</button>
                   <a href="#" style="display:none" class="btn btn-link cancel">Cancel</a>
                 </div>
               </form>
-              <i id="change-subdir" class="icon-pencil"></i>
-              <span class="icon-trash delete-current-value" data-toggle="tooltip" title="Delete"></span>
+              <i id="change-subdir" class="glyphicon glyphicon-pencil"></i>
+              <span class="glyphicon glyphicon-trash delete-current-value" data-toggle="tooltip" title="Delete"></span>
             </dd>
             <dt>
               <i class="icon-question-sign get-help" title="The Git branch, tag or commit"></i>
@@ -159,28 +159,28 @@
             <dd>
               <span class="current-value">{{layerversion.get_vcs_reference}}</span>
               <form style="display:none;">
-                <div class="input-append">
+                <div class="input-group">
                   <input type="text" value="{{layerversion.get_vcs_reference}}">
                     <button  data-layer-prop="commit" class="btn change-btn" type="button">Save</button>
                     <a href="#" style="display:none" class="btn btn-link cancel">Cancel</a>
                   </div>
                 </form>
-                <i class="icon-pencil"></i>
+                <i class="glyphicon glyphicon-pencil"></i>
               </dd>
               <dt>
                 <i class="icon-question-sign get-help" title="Other layers this layer depends upon"></i>
                 Layer dependencies
               </dt>
               <dd>
-                <ul class="unstyled current-value" id="layer-deps-list">
+                <ul class="list-unstyled current-value" id="layer-deps-list">
                   {% for ld in layerversion.dependencies.all %}
                   <li data-layer-id="{{ld.depends_on.id}}">
                     <a data-toggle="tooltip" title="{{ld.depends_on.layer.vcs_url}} | {{ld.depends_on.get_vcs_reference}}" href="{% url 'layerdetails' project.id ld.depends_on.id %}">{{ld.depends_on.layer.name}}</a>
-                    <span class="icon-trash " data-toggle="tooltip" title="Delete"></span>
+                    <span class="glyphicon glyphicon-trash " data-toggle="tooltip" title="Delete"></span>
                   </li>
                   {% endfor %}
                 </ul>
-                <div class="input-append add-deps">
+                <div class="input-group add-deps">
                   <input type="text" autocomplete="off" data-minLength="1" data-autocomplete="off"  placeholder="Type a layer name" id="layer-dep-input">
                     <a class="btn" id="add-layer-dependency-btn" >
                       Add layer
@@ -228,7 +228,7 @@
           </div> <!-- end tab content -->
         </div> <!-- end tabable -->
 
-        <div class="row-fluid span4 well"> <!-- info side panel -->
+        <div class="row col-md-4 well"> <!-- info side panel -->
           <h2>About {{layerversion.layer.name}}</h2>
           <dl class="item-info">
 
@@ -240,12 +240,12 @@
               <span class="muted" style="display:none">Not set</span>
               <span class="current-value">{{layerversion.layer.summary|default_if_none:''}}</span>
               <form style="display:none; margin-bottom:20px">
-                <textarea class="span12" rows="2">{% if layerversion.layer.summary %}{{layerversion.layer.summary}}{% endif %}</textarea>
+                <textarea class="col-md-12" rows="2">{% if layerversion.layer.summary %}{{layerversion.layer.summary}}{% endif %}</textarea>
                 <button class="btn change-btn" data-layer-prop="summary" type="button">Save</button>
                 <a href="#" class="btn btn-link cancel">Cancel</a>
               </form>
-              <i class="icon-pencil"></i>
-              <span class="icon-trash delete-current-value" data-toggle="tooltip" title="Delete"></span>
+              <i class="glyphicon glyphicon-pencil"></i>
+              <span class="glyphicon glyphicon-trash delete-current-value" data-toggle="tooltip" title="Delete"></span>
             </dd>
             <dt>
               Description
@@ -254,12 +254,12 @@
               <span class="muted" style="display:none">Not set</span>
               <span class="current-value">{{layerversion.layer.description|default_if_none:''}}</span>
               <form style="display:none; margin-bottom:20px">
-                <textarea class="span12" rows="6">{% if layerversion.layer.description %}{{layerversion.layer.description}}{% endif %}</textarea>
+                <textarea class="col-md-12" rows="6">{% if layerversion.layer.description %}{{layerversion.layer.description}}{% endif %}</textarea>
                 <button class="btn change-btn" data-layer-prop="description" type="button" >Save</button>
                 <a href="#" class="btn btn-link cancel">Cancel</a>
               </form>
-              <i class="icon-pencil"></i>
-              <span class="icon-trash delete-current-value" data-toggle="tooltip" title="Delete"></span>
+              <i class="glyphicon glyphicon-pencil"></i>
+              <span class="glyphicon glyphicon-trash delete-current-value" data-toggle="tooltip" title="Delete"></span>
             </dd>
             {% if layerversion.layer.up_id %}
             <dt>Layer index</dt>
diff --git a/bitbake/lib/toaster/toastergui/templates/machine_btn.html b/bitbake/lib/toaster/toastergui/templates/machine_btn.html
index 7b08f6a9a6..7093a29 100644
--- a/bitbake/lib/toaster/toastergui/templates/machine_btn.html
+++ b/bitbake/lib/toaster/toastergui/templates/machine_btn.html
@@ -9,7 +9,7 @@
     style="display:none;"
     {% endif %}
 >
-  <i class="icon-plus"></i>
+  <i class="glyphicon glyphicon-plus"></i>
   Add layer
   <i title="" class="icon-question-sign get-help" data-original-title="To enable this machine, you must first add the {{data.layer_version.layer.name}} layer to your project"></i>
 </button>
diff --git a/bitbake/lib/toaster/toastergui/templates/mrb_section.html b/bitbake/lib/toaster/toastergui/templates/mrb_section.html
index 212998a..9d92010 100644
--- a/bitbake/lib/toaster/toastergui/templates/mrb_section.html
+++ b/bitbake/lib/toaster/toastergui/templates/mrb_section.html
@@ -45,8 +45,8 @@
             </a>
         </span>
       {% endif %}
-        <div class="row-fluid">
-          <div class="span3 lead">
+        <div class="row">
+          <div class="col-md-3 lead">
     {%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
               <a href="{%url 'builddashboard' build.pk%}" class="{%if build.outcome == build.SUCCEEDED %}success{%else%}error{%endif%}">
     {% endif %}
@@ -79,7 +79,7 @@
     {% endif %}
             </div>
     {% if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
-            <div class="span2 lead">
+            <div class="col-md-2 lead">
                 {% if build.completed_on|format_build_date  %}
                     {{ build.completed_on|date:'d/m/y H:i' }}
                 {% else %}
@@ -88,12 +88,12 @@
             </div>
     {% endif %}
     {%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
-            <div class="span2 lead">
+            <div class="col-md-2 lead">
       {% if  build.errors.count %}
                 <i class="icon-minus-sign red"></i> <a href="{%url 'builddashboard' build.pk%}#errors" class="error">{{build.errors.count}} error{{build.errors.count|pluralize}}</a>
       {% endif %}
             </div>
-            <div class="span2 lead">
+            <div class="col-md-2 lead">
       {% if  build.warnings.count %}
                 <i class="icon-warning-sign yellow"></i> <a href="{%url 'builddashboard' build.pk%}#warnings" class="warning">{{build.warnings.count}} warning{{build.warnings.count|pluralize}}</a>
       {% endif %}
@@ -131,15 +131,15 @@
             </div>
     {%endif%}
     {%if build.outcome == build.IN_PROGRESS %}
-    <div class="span4" style="display:none" id="cancelling-msg-{{build.buildrequest.pk}}">
+    <div class="col-md-4" style="display:none" id="cancelling-msg-{{build.buildrequest.pk}}">
       <p class="lead">Cancelling the build ...</p>
     </div>
-    <div class="span4 offset1 progress-info">
+    <div class="col-md-4 col-md-offset-1 progress-info">
       <div class="progress" id="build-pc-done-title-{{build.pk}}" style="margin-top:5px;" data-toggle="tooltip" title="{{build.completeper}}% of tasks complete">
         <div id="build-pc-done-bar-{{build.pk}}" style="width: {{build.completeper}}%;" class="bar"></div>
       </div>
     </div>
-    <div class="lead span3 progress-info"><span id="build-pc-done-{{build.pk}}">{{build.completeper}}</span>% of tasks complete</div>
+    <div class="lead col-md-3 progress-info"><span id="build-pc-done-{{build.pk}}">{{build.completeper}}</span>% of tasks complete</div>
     {# No build cancel for command line builds project #}
     {% if build.project.is_default %}
     <i class="icon-question-sign get-help get-help-blue pull-right" title="" data-original-title="Builds in this project cannot be cancelled from Toaster: they can only be cancelled from the command line"></i>
@@ -156,9 +156,13 @@
     {%endif%} {# end if in progress #}
 
     {% if build.outcome == build.CANCELLED %}
-      <div class="span4">
-        <p class="lead">Build cancelled</p>
-      </div>
+    <div class="col-md-4">
+      <p class="lead">Build cancelled</p>
+    </div>
+    <button class="btn btn-info pull-right run-again-btn"
+        data-request-url="{% url 'xhr_buildrequest' build.project.pk %}"
+        data-target='{{build.target_set.all|get_tasks|json}}'>
+      Rebuild
 
       {% if build.project.is_default %}
         <i class="icon-question-sign get-help get-help-blue pull-right" title=""
diff --git a/bitbake/lib/toaster/toastergui/templates/newcustomimage_modal.html b/bitbake/lib/toaster/toastergui/templates/newcustomimage_modal.html
index caeb302..54c5887 100644
--- a/bitbake/lib/toaster/toastergui/templates/newcustomimage_modal.html
+++ b/bitbake/lib/toaster/toastergui/templates/newcustomimage_modal.html
@@ -12,7 +12,7 @@
   });
 </script>
 
-<div class="modal hide fade in" id="new-custom-image-modal" aria-hidden="false">
+<div class="modal fade" id="new-custom-image-modal" aria-hidden="false">
   <div class="modal-header">
     <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
     <h3>New custom image</h3>
@@ -33,8 +33,8 @@
 
     <h4>Name your custom image</h4>
 
-    <div class="row-fluid">
-      <span class="help-block span8">Image names must be unique. They should not contain spaces or capital letters, and the only allowed special character is dash (-).<p></p>
+    <div class="row">
+      <span class="help-block col-md-8">Image names must be unique. They should not contain spaces or capital letters, and the only allowed special character is dash (-).<p></p>
       </span></div>
     <div class="control-group controls">
       <input type="text" class="huge" placeholder="Type the custom image name" required>
diff --git a/bitbake/lib/toaster/toastergui/templates/newproject.html b/bitbake/lib/toaster/toastergui/templates/newproject.html
index 8913057..77c36e9 100644
--- a/bitbake/lib/toaster/toastergui/templates/newproject.html
+++ b/bitbake/lib/toaster/toastergui/templates/newproject.html
@@ -5,18 +5,18 @@
 {% block title %} Create a new project - Toaster {% endblock %}
 
 {% block pagecontent %}
-<div class="row-fluid">
+<div class="row">
     <div class="page-header">
           <h1>Create a new project</h1>
         </div>
-        <div class="container-fluid">
+        <div class="container">
     {% if alert %}
-      <div class="alert alert-error row-fluid" role="alert">{{alert}}</div>
+      <div class="alert alert-error row" role="alert">{{alert}}</div>
     {% endif %}
         </div>
 
-      <div class="row-fluid">
-        <div class="span6">
+      <div class="row">
+        <div class="col-md-6">
         <form method="POST">{% csrf_token %}
 
             <fieldset id="validate-project-name">
@@ -54,8 +54,8 @@
                 {% endfor %}
               </select>
                 {% for release in releases %}
-              <div class="row-fluid helptext" id="description-{{release.id}}" style="display: none">
-                <span class="help-block span5">{{release.helptext|safe}}</span>
+              <div class="row helptext" id="description-{{release.id}}" style="display: none">
+                <span class="help-block col-md-5">{{release.helptext|safe}}</span>
               </div>
                 {% endfor %}
             {% else %}
@@ -65,13 +65,13 @@
         {% endif %}
 
             <div class="form-actions">
-              <input type="submit" id="create-project-button" class="btn btn-primary btn-large" value="Create project"/>
+              <input type="submit" id="create-project-button" class="btn btn-primary btn-lg" value="Create project"/>
               <span class="help-inline" style="vertical-align:middle;">To create a project, you need to enter a project name</span>
             </div>
         </form>
         </div>
         <!--
-        <div class="span5 well">
+        <div class="col-md-5 well">
                 <span class="help-block">
                  <h4>Toaster project types</h4>
                  <p>With a <strong>build project</strong> you configure and run your builds from Toaster.</p>
diff --git a/bitbake/lib/toaster/toastergui/templates/package_built_dependencies.html b/bitbake/lib/toaster/toastergui/templates/package_built_dependencies.html
index e6f20c3..e53eb9d 100644
--- a/bitbake/lib/toaster/toastergui/templates/package_built_dependencies.html
+++ b/bitbake/lib/toaster/toastergui/templates/package_built_dependencies.html
@@ -31,7 +31,7 @@
                         <tr>
                             <th>Package</th>
                             <th>Version</th>
-                            <th class="sizecol span2">Size</th>
+                            <th class="sizecol col-md-2">Size</th>
                         </tr>
                     </thead>
                     <tbody>
@@ -62,7 +62,7 @@
                         <tr>
                             <th>Package</th>
                             <th>Version</th>
-                            <th class="sizecol span2">Size</th>
+                            <th class="sizecol col-md-2">Size</th>
                             <th>
                                 <i class="icon-question-sign get-help" title="Five relationship types exist: recommends, suggests, provides, replaces and conflicts"></i>
                                 Relationship type
diff --git a/bitbake/lib/toaster/toastergui/templates/package_detail_base.html b/bitbake/lib/toaster/toastergui/templates/package_detail_base.html
index 9fa28a8..759f5b6 100644
--- a/bitbake/lib/toaster/toastergui/templates/package_detail_base.html
+++ b/bitbake/lib/toaster/toastergui/templates/package_detail_base.html
@@ -43,21 +43,21 @@
 {% endblock localbreadcrumb %}
 
 {% block pagedetailinfomain %}
-    <div class="row span11">
+    <div class="row col-md-11">
         <div class="page-header">
             {% block mainheading %}
             <h1>{{package.fullpackagespec}}</h1>
             {% endblock %}
         </div> <!-- page-header -->
-    </div> <!-- row span11 page-header -->
+    </div> <!-- row col-md-11 page-header -->
 
     {% block twocolumns %}
-    <div class="row span7 tabbable">
+    <div class="row col-md-7 tabbable">
         {% block tabcontent %}
         {% endblock tabcontent %}
-    </div> <!-- row span7 -->
+    </div> <!-- row col-md-7 -->
 
-    <div class="row span4 well">
+    <div class="row col-md-4 well">
         <h2>Package information</h2>
 
         <!-- info presented as definition list -->
@@ -124,7 +124,7 @@
                     # Removed per team meeting of 1/29/2014 until
                     # decision on index search algorithm
                     <a href="http://layers.openembedded.org"  target="_blank">
-                    <i class="icon-share get-info"></i>
+                    <i class="glyphicon glyphicon-share get-info"></i>
                     </a>
                     {% endcomment %}
                 {% endif %}
diff --git a/bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html b/bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html
index 8a0508e..0672ba3 100644
--- a/bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html
+++ b/bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html
@@ -20,7 +20,7 @@
                     <tr>
                         <th>Package</th>
                         <th>Version</th>
-                        <th class='sizecol span2'>Size</th>
+                        <th class='sizecol col-md-2'>Size</th>
                     </tr>
                 </thead>
                 <tbody>
@@ -57,7 +57,7 @@
                     <tr>
                         <th>Package</th>
                         <th>Version</th>
-                        <th class='sizecol span2'>Size</th>
+                        <th class='sizecol col-md-2'>Size</th>
                         <th>
                             <i class="icon-question-sign get-help" title="Five relationship types exist: recommends, suggests, provides, replaces and conflicts"></i>
                             Relationship type
diff --git a/bitbake/lib/toaster/toastergui/templates/pkg_add_rm_btn.html b/bitbake/lib/toaster/toastergui/templates/pkg_add_rm_btn.html
index 0aefc56..40eff15 100644
--- a/bitbake/lib/toaster/toastergui/templates/pkg_add_rm_btn.html
+++ b/bitbake/lib/toaster/toastergui/templates/pkg_add_rm_btn.html
@@ -18,7 +18,7 @@
       display:none
       {% endif %}
       ">
-    <i class="icon-trash no-tooltip"></i>
+    <i class="glyphicon glyphicon-trash no-tooltip"></i>
     Remove package
   </button>
   <button class="btn btn-block add-rm-package-btn" data-directive="add" data-id="{{data.pk}}" data-package-url="{% url 'xhr_customrecipe_packages' extra.recipe_id data.pk %}" data-name="{{data.name}}" style="
@@ -26,7 +26,7 @@
       display:none
       {% endif %}
       ">
-    <i class="icon-plus"></i>
+    <i class="glyphicon glyphicon-plus"></i>
     Add package
   </button>
 </div>
diff --git a/bitbake/lib/toaster/toastergui/templates/project.html b/bitbake/lib/toaster/toastergui/templates/project.html
index 1256768..ac411a3 100644
--- a/bitbake/lib/toaster/toastergui/templates/project.html
+++ b/bitbake/lib/toaster/toastergui/templates/project.html
@@ -44,19 +44,19 @@
 </div-->
 
 
-<div class="row-fluid" id="project-page" style="display:none">
-  <div class="span6">
+<div class="row" id="project-page" style="display:none">
+  <div class="col-md-6">
     <div class="well well-transparent" id="machine-section">
       <h3>Machine</h3>
 
-      <p class="lead"><span id="project-machine-name"></span> <i title="" data-original-title="" id="change-machine-toggle" class="icon-pencil"></i></p>
+      <p class="lead"><span id="project-machine-name"></span> <i title="" data-original-title="" id="change-machine-toggle" class="glyphicon glyphicon-pencil"></i></p>
 
       <form id="select-machine-form" style="display:none;">
         <div class="alert alert-info">
           <strong>Machine changes have a big impact on build outcome.</strong> You cannot really compare the builds for the new machine with the previous ones.
         </div>
 
-        <div class="input-append">
+        <div class="input-group">
           <input id="machine-change-input" autocomplete="off" value="" data-provide="typeahead" data-minlength="1" data-autocomplete="off" type="text">
             <button id="machine-change-btn" class="btn" type="button">Save</button> <a href="#" id="cancel-machine-change" class="btn btn-link">Cancel</a>
         </div>
@@ -73,7 +73,7 @@
         <p style="margin-top: 10px;"><a href="{% url 'projectimagerecipes' project.id %}">Choose a recipe to build</a></p>
       </div>
 
-      <ul class="unstyled configuration-list" id="freq-build-list">
+      <ul class="list-unstyled configuration-list" id="freq-build-list">
       </ul>
       <button class="btn btn-primary" id="freq-build-btn" disabled="disabled">Build selected recipes</button>
     </div>
@@ -85,7 +85,7 @@
 
       <!-- Comment out the ability to change the project release, until we decide what to do with this functionality -->
 
-      <!--i title="" data-original-title="" id="release-change-toggle" class="icon-pencil"></i-->
+      <!--i title="" data-original-title="" id="release-change-toggle" class="glyphicon glyphicon-pencil"></i-->
       </p>
 
       <!-- Comment out the ability to change the project release, until we decide what to do with this functionality -->
@@ -97,7 +97,7 @@
     </div>
   </div>
 
-  <div class="span6">
+  <div class="col-md-6">
     <div class="well well-transparent" id="layer-container">
       <h3>Layers <span class="muted counter">(<span id="project-layers-count"></span>)</span>
         <i data-original-title="OpenEmbedded organises metadata into modules called 'layers'. Layers allow you to isolate different types of customizations from each other. <a href='http://www.yoctoproject.org/docs/current/dev-manual/dev-manual.html#understanding-and-creating-layers' target='_blank'>More on layers</a>" class="icon-question-sign get-help heading-help" title=""></i>
@@ -116,7 +116,7 @@
       <form style="margin-top:20px">
         <!--div class="control-group error"-->
 
-        <div class="input-append">
+        <div class="input-group">
           <input id="layer-add-input" autocomplete="off" placeholder="Type a layer name" data-minlength="1" data-autocomplete="off" data-provide="typeahead" data-source="" type="text">
             <button id="add-layer-btn" class="btn" disabled>Add</button>
         </div>
@@ -132,7 +132,7 @@
         </p>
       </form>
 
-      <ul class="unstyled configuration-list" id="layers-in-project-list">
+      <ul class="list-unstyled configuration-list" id="layers-in-project-list">
       </ul>
     </div>
   </div>
diff --git a/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html b/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html
index 6d7e10b..a638967 100644
--- a/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html
@@ -16,7 +16,7 @@
 
   {% include "projecttopbar.html" %}
 
-  <div class="row-fluid">
+  <div class="row">
     {% with mru=mru mrb_type=mrb_type %}
       {% include 'mrb_section.html' %}
     {% endwith %}
diff --git a/bitbake/lib/toaster/toastergui/templates/projectbuilds.html b/bitbake/lib/toaster/toastergui/templates/projectbuilds.html
index 3402fc4..d0f9af4 100644
--- a/bitbake/lib/toaster/toastergui/templates/projectbuilds.html
+++ b/bitbake/lib/toaster/toastergui/templates/projectbuilds.html
@@ -39,10 +39,10 @@
 
  {% if objects.paginator.count == 0 %}
   {% if request.GET.filter or request.GET.search %}
-    <div class="row-fluid">
+    <div class="row">
       <div class="alert">
-        <form class="no-results input-append" id="searchform">
-            <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %}
+        <form class="no-results input-group" id="searchform">
+            <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-group-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
             <button class="btn" type="submit" value="Search">Search</button>
             <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all builds</button>
         </form>
diff --git a/bitbake/lib/toaster/toastergui/templates/projectconf.html b/bitbake/lib/toaster/toastergui/templates/projectconf.html
index dd7d30c..7ceccee 100644
--- a/bitbake/lib/toaster/toastergui/templates/projectconf.html
+++ b/bitbake/lib/toaster/toastergui/templates/projectconf.html
@@ -17,9 +17,9 @@
             </dt>
             <dd class="lead">
                 <span id="distro">{{distro}}</span>
-                <i class="icon-pencil" id="change-distro-icon"></i>
+                <i class="glyphicon glyphicon-pencil" id="change-distro-icon"></i>
                 <form id="change-distro-form" style="display:none;">
-                    <div class="input-append">
+                    <div class="input-group">
                         <span  id="edit-distro-name-div" class="control-group">
                             <input type="text" id="new-distro" value="{{distro}}">
                             <button id="apply-change-distro" class="btn" type="button">Save</button>
@@ -38,12 +38,12 @@
             </dt>
             <dd class="lead">
                 <span id="dl_dir"{% if dl_dir %}{%else%} class="muted"{%endif%}>{% if dl_dir %}{{dl_dir}}{%else%}Not set{%endif%}</span>
-                <i class="icon-pencil" id="change-dl_dir-icon"></i>
+                <i class="glyphicon glyphicon-pencil" id="change-dl_dir-icon"></i>
                 <form id="change-dl_dir-form" style="display:none;">
-                    <div class="row-fluid">
-                        <span class="help-block span4">To set DL_DIR type the absolute path of the download folder.</span>
+                    <div class="row">
+                        <span class="help-block col-md-4">To set DL_DIR type the absolute path of the download folder.</span>
                     </div>
-                    <div class="input-append" id="validate-dl_dir">
+                    <div class="input-group" id="validate-dl_dir">
                         <input type="text" class="input-xlarge" id="new-dl_dir" placeholder="Type absolute path of the DL_DIR folder">
                         <button id="apply-change-dl_dir" class="btn" type="button">Save</button>
                         <button id="cancel-change-dl_dir" type="button" class="btn btn-link">Cancel</button>
@@ -60,7 +60,7 @@
             </dt>
             <dd class="lead">
                 <span id="image_fstypes">{{fstypes}}</span>
-                <i class="icon-pencil" id="change-image_fstypes-icon"></i>
+                <i class="glyphicon glyphicon-pencil" id="change-image_fstypes-icon"></i>
                 <form id="change-image_fstypes-form" style="display:none;">
                     <label>Type the image types you want to build:</label>
                     <div class="input-append" id="validate-image_fstypes">
@@ -84,13 +84,13 @@
             </dt>
             <dd class="lead">
                 <span id="image_install"{% if image_install_append %}{%else%} class="muted"{%endif%}>{% if image_install_append %}{{image_install_append}}{%else%}Not set{%endif%}</span>
-                <i class="icon-pencil" id="change-image_install-icon"></i>
-                <i class="icon-trash" id="delete-image_install-icon" {% if image_install_append %}{%else%}style="display:none;"{%endif%}></i>
+                <i class="glyphicon glyphicon-pencil" id="change-image_install-icon"></i>
+                <i class="glyphicon glyphicon-trash" id="delete-image_install-icon" {% if image_install_append %}{%else%}style="display:none;"{%endif%}></i>
                 <form id="change-image_install-form" style="display:none;">
-                    <div class="row-fluid">
-                        <span class="help-block span4">To set IMAGE_INSTALL_append to more than one package, type the package names separated by a space.</span>
+                    <div class="row">
+                        <span class="help-block col-md-4">To set IMAGE_INSTALL_append to more than one package, type the package names separated by a space.</span>
                     </div>
-                    <div class="input-append">
+                    <div class="input-group">
                         <input type="text" class="input-xlarge" id="new-image_install" placeholder="Type one or more package names">
                         <button id="apply-change-image_install" class="btn" type="button">Save</button>
                         <button id="cancel-change-image_install" type="button" class="btn btn-link">Cancel</button>
@@ -106,7 +106,7 @@
             </dt>
             <dd class="lead">
                 <span id="package_classes">{{package_classes}}</span>
-                <i id="change-package_classes-icon" class="icon-pencil"></i>
+                <i id="change-package_classes-icon" class="glyphicon glyphicon-pencil"></i>
                 <form id="change-package_classes-form" style="display:none;">
                     <label>
                         Root file system package format
@@ -142,12 +142,12 @@
             </dt>
             <dd class="lead">
                 <span id="sstate_dir"{% if sstate_dir %}{%else%} class="muted"{%endif%}>{% if sstate_dir %}{{sstate_dir}}{%else%}Not set{%endif%}</span>
-                <i class="icon-pencil" id="change-sstate_dir-icon"></i>
+                <i class="glyphicon glyphicon-pencil" id="change-sstate_dir-icon"></i>
                 <form id="change-sstate_dir-form" style="display:none;">
-                    <div class="row-fluid">
-                        <span class="help-block span4">To set SSTATE_DIR type the absolute path of the download folder.</span>
+                    <div class="row">
+                        <span class="help-block col-md-4">To set SSTATE_DIR type the absolute path of the download folder.</span>
                     </div>
-                    <div class="input-append" id="validate-sstate_dir">
+                    <div class="input-group" id="validate-sstate_dir">
                         <input type="text" class="input-xlarge" id="new-sstate_dir" placeholder="Type absolute path of the SSTATE_DIR folder">
                         <span class="error">A valid directory name required</span>
                         <button id="apply-change-sstate_dir" class="btn" type="button">Save</button>
@@ -159,7 +159,7 @@
             {% endif %}
         </dl>
 
-        <!-- <ul class="unstyled configuration-list" id="configvar-list"> -->
+        <!-- <ul class="list-unstyled configuration-list" id="configvar-list"> -->
         <dl id="configvar-list">
             <!-- the added configuration variables are inserted here -->
         </dl>
@@ -175,11 +175,11 @@
             <input type="hidden" class="js-config-managed-name" value="{{b}}">
         {% endfor %}
 
-        <div class="row-fluid">
+        <div class="row">
           <form id="variable-form">
             <fieldset style="padding-left:0px;">
                 <legend>Add variable</legend>
-                <div class="span3" style="margin-left:0px;">
+                <div class="col-md-3" style="margin-left:0px;">
                     <span  id="add-configvar-name-div" class="control-group">
                       <label>
                         Variable
@@ -197,7 +197,7 @@
                         <button id="add-configvar-button" class="btn save" type="button" disabled>Add variable</button>
                     </div>
                 </div>
-                <div class="span5 help-block">
+                <div class="col-md-5 help-block">
                     <h5>Some variables are reserved from Toaster</h5>
                     <p>Toaster cannot set any variables that impact 1) the configuration of the build servers,
                     or 2) where artifacts produced by the build are stored. Such variables include: </p>
@@ -420,12 +420,12 @@
                     }
                 }
                 if (var_context == undefined) {
-                    orightml += '<div> <dt><span id="config_var_entry_'+configvars_sorted[i][2]+'" class="js-config-var-name"></span><i class="icon-trash js-icon-trash-config_var" id="config_var_trash_'+configvars_sorted[i][2]+'" x-data="'+configvars_sorted[i][2]+'"></i> </dt>'
+                    orightml += '<div> <dt><span id="config_var_entry_'+configvars_sorted[i][2]+'" class="js-config-var-name"></span><i class="glyphicon glyphicon-trash js-icon-trash-config_var" id="config_var_trash_'+configvars_sorted[i][2]+'" x-data="'+configvars_sorted[i][2]+'"></i> </dt>'
                     orightml += '<dd class="lead">'
                     orightml += '    <span id="config_var_value_'+configvars_sorted[i][2]+'"></span>'
-                    orightml += '    <i class="icon-pencil js-icon-pencil-config_var" x-data="'+configvars_sorted[i][2]+'"></i>'
+                    orightml += '    <i class="glyphicon glyphicon-pencil js-icon-pencil-config_var" x-data="'+configvars_sorted[i][2]+'"></i>'
                     orightml += '    <form id="change-config_var-form_'+configvars_sorted[i][2]+'" style="display:none;">'
-                    orightml += '        <div class="input-append">'
+                    orightml += '        <div class="input-group">'
                     orightml += '            <input type="text" class="input-xlarge js-new-config_var" id="new-config_var_'+configvars_sorted[i][2]+'" value="">'
                     orightml += '            <button class="btn js-apply-change-config_var" type="button" x-data="'+configvars_sorted[i][2]+':'+configvars_sorted[i][0]+'" disabled>Save</button>'
                     orightml += '            <button type="button" class="btn btn-link js-cancel-change-config_var" x-data="'+configvars_sorted[i][2]+'">Cancel</button>'
diff --git a/bitbake/lib/toaster/toastergui/templates/projecttopbar.html b/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
index e878cab..b2f41e0 100644
--- a/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
+++ b/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
@@ -26,17 +26,17 @@
   <h1 id="project-name-container">
     <span id="project-name">{{project.name}}</span>
 
-    <i class="icon-pencil" data-original-title="" id="project-change-form-toggle" title=""></i>
+    <i class="glyphicon glyphicon-pencil" data-original-title="" id="project-change-form-toggle" title=""></i>
 
     {% if project.is_default %}
         <i class="icon-question-sign get-help heading-help" title="" data-original-title="This project shows information about the builds you start from the command line while Toaster is running"></i>
     {% endif %}
   </h1>
   <form id="project-name-change-form" style="margin-bottom: 0px; display: none;">
-    <div class="input-append" id="validate-project-name">
+    <div class="input-group" id="validate-project-name">
       <input class="huge input-xxlarge" type="text" id="project-name-change-input" autocomplete="off" value="{{project.name}}">
-        <button id="project-name-change-btn" class="btn btn-large" type="button">Save</button>
-        <a href="#" id="project-name-change-cancel" class="btn btn-large btn-link">Cancel</a>
+        <button id="project-name-change-btn" class="btn btn-lg" type="button">Save</button>
+        <a href="#" id="project-name-change-cancel" class="btn btn-lg btn-link">Cancel</a>
     </div>
     <p class="help-block error" style="display: none;margin-top: 10px;" id="hint-error-project-name">A project with this name exists. Project names must be unique.</p>
   </form>
@@ -68,9 +68,9 @@
       <li class="pull-right">
         <form class="form-inline" style="margin-bottom:0px;">
           <i class="icon-question-sign get-help heading-help" data-placement="left" title="" data-original-title="Type the name of one or more recipes you want to build, separated by a space. You can also specify a task by appending a colon and a task name to the recipe name, like so: <code>busybox:clean</code>"></i>
-          <div class="input-append">
+          <div class="input-group">
             <input id="build-input" type="text" class="input-xlarge input-lg build-target-input" placeholder="Type the recipe you want to build" autocomplete="off" disabled>
-            <button id="build-button" class="btn btn-primary btn-large build-button" data-project-id="{{project.id}}" disabled>Build</button>
+            <button id="build-button" class="btn btn-primary btn-lg build-button" data-project-id="{{project.id}}" disabled>Build</button>
           </div>
         </form>
       </li>
diff --git a/bitbake/lib/toaster/toastergui/templates/recipe.html b/bitbake/lib/toaster/toastergui/templates/recipe.html
index 1d6d64e..2887288 100644
--- a/bitbake/lib/toaster/toastergui/templates/recipe.html
+++ b/bitbake/lib/toaster/toastergui/templates/recipe.html
@@ -12,13 +12,13 @@
 
 <!-- Begin container -->
 
-<div class="row span11">
+<div class="row col-md-11">
     <div class="page-header">
         <h1>{{object.name}}_{{object.version}}</h1>
     </div>
 </div>
 
-<div class="row span7 tabbable">
+<div class="row col-md-7 tabbable">
     <ul class="nav nav-pills">
         <li class="{{tab_states.1}}">
             <a href="#information" data-toggle="tab">
@@ -231,7 +231,7 @@
     </div>
 </div>
 
-<div class="row span4 well">
+<div class="row col-md-4 well">
     <h2>About {{object.name}}</h2>
     <dl class="item-info">
         {% if object.summary %}
diff --git a/bitbake/lib/toaster/toastergui/templates/recipe_btn.html b/bitbake/lib/toaster/toastergui/templates/recipe_btn.html
index baab06e..d385a14 100644
--- a/bitbake/lib/toaster/toastergui/templates/recipe_btn.html
+++ b/bitbake/lib/toaster/toastergui/templates/recipe_btn.html
@@ -10,7 +10,7 @@
      style="display:none;"
     {% endif %}
 >
-  <i class="icon-plus"></i>
+  <i class="glyphicon glyphicon-plus"></i>
   Add layer
   <i title="" class="icon-question-sign get-help" data-original-title="To build this target, you must first add the {{data.layer_version.layer.name}} layer to your project"></i>
 </button>
diff --git a/bitbake/lib/toaster/toastergui/templates/recipe_packages.html b/bitbake/lib/toaster/toastergui/templates/recipe_packages.html
index d25847b..d337421 100644
--- a/bitbake/lib/toaster/toastergui/templates/recipe_packages.html
+++ b/bitbake/lib/toaster/toastergui/templates/recipe_packages.html
@@ -11,13 +11,13 @@
 
 <!-- Begin container -->
 
-<div class="row-fluid span11">
+<div class="row col-md-11">
     <div class="page-header">
         <h1>{{recipe.name}}_{{recipe.version}}</h1>
     </div>
 </div>
 
-<div class="row-fluid span7 tabbable">
+<div class="row col-md-7 tabbable">
     <ul class="nav nav-pills">
         <li>
             <a href="{% url "recipe" build.pk recipe.id "1" %}">
@@ -86,9 +86,9 @@
             {% endif %}
         </div> {# tab-pane #}
     </div> {# tab-content #}
-</div> {# span7 #}
+</div> {# col-md-7 #}
 
-<div class="row span4 well">
+<div class="row col-md-4 well">
     <h2>About {{recipe.name}}</h2>
     <dl class="item-info">
         {% if recipe.summary %}
diff --git a/bitbake/lib/toaster/toastergui/templates/recipedetails.html b/bitbake/lib/toaster/toastergui/templates/recipedetails.html
index 23aa171..95fa611 100644
--- a/bitbake/lib/toaster/toastergui/templates/recipedetails.html
+++ b/bitbake/lib/toaster/toastergui/templates/recipedetails.html
@@ -51,7 +51,7 @@
 
 {% include 'newcustomimage_modal.html' %}
 
-<div class="row-fluid span11">
+<div class="row col-md-11">
   <div class="alert alert-success lead" id="image-created-notification" style="margin-top: 15px; display: none">
     <button type="button" data-dismiss="alert" class="close">x</button>
     Your custom image <strong>{{recipe.name}}</strong> has been created. You can now add or remove packages as needed.
@@ -64,29 +64,29 @@
   </div>
 </div>
 
-<div class="row-fluid span11">
-  <div class="span8">
+<div class="row col-md-11">
+  <div class="col-md-8">
     <div class="button-place btn-group" id="customise-build-btns"
         style="width: 100%;
       {% if not in_project %}
       display:none;
       {% endif %}">
-      <button class="btn btn-large span6 build-recipe-btn" style="width: 50%">
+      <button class="btn btn-lg col-md-6 build-recipe-btn" style="width: 50%">
         Build {{recipe.name}}
       </button>
       {% if recipe.is_image %}
-      <button class="btn btn-large span6 customise-btn" data-recipe="{{recipe.pk}}" style="width: 50%">
+      <button class="btn btn-lg col-md-6 customise-btn" data-recipe="{{recipe.pk}}" style="width: 50%">
         Customise {{recipe.name}}
       </button>
       {% endif %}
     </div>
     <div class="button-place">
-      <button class="btn btn-block btn-large" id="add-layer-btn"
+      <button class="btn btn-block btn-lg" id="add-layer-btn"
           style="width:100%;
           {% if in_project %}
           display:none;
           {% endif %}">
-        <i class="icon-plus"></i>
+        <i class="glyphicon glyphicon-plus"></i>
         Add the {{recipe.layer_version.layer.name}} layer to your project to build or customise this image recipe
       </button>
     </div>
@@ -106,7 +106,7 @@
        style="display:none"
       {% endif %} >
         <p class="lead">Toaster has no package information for {{recipe.name}}. To generate package information, build {{recipe.name}}</p>
-        <button class="btn btn-info btn-large build-recipe-btn" style="margin:20px 0 10px 0;">Build {{recipe.name}}</button>
+        <button class="btn btn-info btn-lg build-recipe-btn" style="margin:20px 0 10px 0;">Build {{recipe.name}}</button>
       </div>
 
       <div class="alert alert-info air" id="packages-alert"
@@ -119,7 +119,7 @@
       </div>
     </div>
   </div>
-  <div class="span4 well">
+  <div class="col-md-4 well">
     <h2 style="margin-bottom:20px;">About {{recipe.name}}</h2>
     <dl>
       <dt>
@@ -142,7 +142,7 @@
       <dt>Recipe file</dt>
       <dd>
         <code>{{recipe.file_path|cut_path_prefix:recipe.layer_version.local_path}}</code>
-        <a href="{{recipe.get_vcs_recipe_file_link_url}}"><i class="icon-share" title="" data-original-title="View recipe file"></i></a>
+        <a href="{{recipe.get_vcs_recipe_file_link_url}}"><i class="glyphicon glyphicon-share" title="" data-original-title="View recipe file"></i></a>
       </dd> 
       <dt>Layer</dt>
       <dd><a href="{% url 'layerdetails' project.id recipe.layer_version.pk %}">{{recipe.layer_version.layer.name}}</a></dd>
diff --git a/bitbake/lib/toaster/toastergui/templates/recipes.html b/bitbake/lib/toaster/toastergui/templates/recipes.html
index d144893..04e15f7 100644
--- a/bitbake/lib/toaster/toastergui/templates/recipes.html
+++ b/bitbake/lib/toaster/toastergui/templates/recipes.html
@@ -12,7 +12,7 @@
 {% endblock %}
 
 {% block buildinfomain %}
-<div class="span10">
+<div class="col-md-10">
 <div class="page-header">
 <h1>
   {% if request.GET.search and objects.paginator.count > 0  %}
@@ -26,10 +26,10 @@
 </div>
 
 {% if objects.paginator.count == 0 %}
-  <div class="row-fluid">
+  <div class="row">
       <div class="alert">
-        <form class="no-results input-append" id="searchform">
-            <input id="search" name="search" class="input-xxlarge" type="text" value="{%if request.GET.search%}{{request.GET.search}}{%endif%}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %}
+        <form class="no-results input-group" id="searchform">
+            <input id="search" name="search" class="input-xxlarge" type="text" value="{%if request.GET.search%}{{request.GET.search}}{%endif%}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-group-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
             <button class="btn" type="submit" value="Search">Search</button>
             <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all recipes</button>
         </form>
@@ -55,7 +55,7 @@
             {% if count %}
             <a class="btn"
                 title="<a href='{% url "recipe" build.pk recipe.pk %}#dependencies'>{{recipe.name}}</a> dependencies"
-                data-content="<ul class='unstyled'>
+                data-content="<ul class='list-unstyled'>
                   {% for i in deps|dictsort:"depends_on.name"%}
                     <li><a href='{% url "recipe" build.pk i.depends_on.pk %}'>{{i.depends_on.name}}</a></li>
                   {% endfor %}
@@ -73,7 +73,7 @@
             {% if count %}
             <a class="btn"
                 title="<a href='{% url "recipe" build.pk recipe.pk %}#brought-in-by'>{{recipe.name}}</a> reverse dependencies"
-                data-content="<ul class='unstyled'>
+                data-content="<ul class='list-unstyled'>
                   {% for i in revs|dictsort:"recipe.name" %}
                     <li><a href='{% url "recipe" build.pk i.recipe.pk %}'>{{i.recipe.name}}</a></li>
                   {% endfor %}
@@ -97,7 +97,7 @@
         <!-- Layer commit -->
         <td class="layer_version__layer__commit">
             <a class="btn"
-                data-content="<ul class='unstyled'>
+                data-content="<ul class='list-unstyled'>
                   <li>{{recipe.layer_version.commit}}</li>
                 </ul>">
                 {{recipe.layer_version.commit|truncatechars:13}}
diff --git a/bitbake/lib/toaster/toastergui/templates/snippets/pkg_dependencies_popover.html b/bitbake/lib/toaster/toastergui/templates/snippets/pkg_dependencies_popover.html
index a3fcdb0..5ffcc6c 100644
--- a/bitbake/lib/toaster/toastergui/templates/snippets/pkg_dependencies_popover.html
+++ b/bitbake/lib/toaster/toastergui/templates/snippets/pkg_dependencies_popover.html
@@ -2,7 +2,7 @@
 {% with data.package_dependencies_source.all_depends.count as dep_count %}
 {% load projecttags %}
 {% if dep_count %}
- <a data-content="<ul class='unstyled'>
+ <a data-content="<ul class='list-unstyled'>
    {% for dep in data.package_dependencies_source.all_depends %}
   <li>{{dep.depends_on.name}} {% if dep.depends_on.size > 0 %}({{dep.depends_on.size|filtered_filesizeformat}}){% endif %}</li>
     {% endfor %}
diff --git a/bitbake/lib/toaster/toastergui/templates/snippets/pkg_revdependencies_popover.html b/bitbake/lib/toaster/toastergui/templates/snippets/pkg_revdependencies_popover.html
index 453a9d0..301d154 100644
--- a/bitbake/lib/toaster/toastergui/templates/snippets/pkg_revdependencies_popover.html
+++ b/bitbake/lib/toaster/toastergui/templates/snippets/pkg_revdependencies_popover.html
@@ -2,7 +2,7 @@
 {% with data.package_dependencies_target.all_depends.count as dep_count %}
 {% load projecttags %}
 {% if dep_count %}
- <a data-content="<ul class='unstyled'>
+ <a data-content="<ul class='list-unstyled'>
    {% for dep in data.package_dependencies_target.all_depends|dictsort:'package.name' %}
   <li>{{dep.package.name}} {% if dep.package.size > 0 %}({{dep.package.size|filtered_filesizeformat}}){% endif %}</li>
     {% endfor %}
diff --git a/bitbake/lib/toaster/toastergui/templates/target.html b/bitbake/lib/toaster/toastergui/templates/target.html
index 4c33eaa..3979929 100644
--- a/bitbake/lib/toaster/toastergui/templates/target.html
+++ b/bitbake/lib/toaster/toastergui/templates/target.html
@@ -18,7 +18,7 @@
 
 {% block buildinfomain %}
 
-<div class="row-fluid span10">
+<div class="row col-md-10">
     <div class="page-header">
         <h1>
             {% if request.GET.search and objects.paginator.count > 0 %}
@@ -32,7 +32,7 @@
     </div>
 </div>
 
-<div class="row-fluid pull-right span10" id="navTab">
+<div class="row pull-right col-md-10" id="navTab">
     <ul class="nav nav-pills">
         <li class="active">
             <a href="#target">
@@ -51,10 +51,10 @@
     <div id="image-packages" class="tab-pane">
 
     {% if objects.paginator.count == 0 %}
-    <div class="row-fluid">
+    <div class="row">
         <div class="alert">
-            <form class="no-results input-append" id="searchform">
-                <input id="search" name="search" class="input-xxlarge" type="text" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %}
+            <form class="no-results input-group" id="searchform">
+                <input id="search" name="search" class="input-xxlarge" type="text" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-group-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
                 <button class="btn" type="submit" value="Search">Search</button>
                 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all packages</button>
             </form>
@@ -97,7 +97,7 @@
             {% if deps_count > 0 %}
             <a class="btn"
                 title="<a href='{% url "package_included_dependencies" build.id target.id package.id %}'>{{package.name}}</a> dependencies"
-                data-content="<ul class='unstyled'>
+                data-content="<ul class='list-unstyled'>
                   {% for i in deps|dictsort:'depends_on.name' %}
                     <li><a href='{% url "package_included_detail" build.pk target.id i.depends_on.pk %}'>{{i.depends_on.name}}</a></li>
                   {% endfor %}
@@ -114,7 +114,7 @@
             {% if rdeps_count > 0 %}
             <a class="btn"
                 title="<a href='{% url "package_included_reverse_dependencies" build.id target.id package.id %}'>{{package.name}}</a> reverse dependencies"
-                data-content="<ul class='unstyled'>
+                data-content="<ul class='list-unstyled'>
                   {% for i in rdeps|dictsort:'package.name' %}
                     <li><a href='{% url "package_included_detail" build.id target.id i.package.id %}'>{{i.package.name}}</a></li>
                   {% endfor %}
@@ -147,7 +147,7 @@
         </td>
         <td class="layer_commit">
             <a class="btn"
-                data-content="<ul class='unstyled'>
+                data-content="<ul class='list-unstyled'>
                   <li>{{package.recipe.layer_version.commit}}</li>
                 </ul>">
                 {{package.recipe.layer_version.commit|truncatechars:13}}
diff --git a/bitbake/lib/toaster/toastergui/templates/task.html b/bitbake/lib/toaster/toastergui/templates/task.html
index 5768262..9250ff5 100644
--- a/bitbake/lib/toaster/toastergui/templates/task.html
+++ b/bitbake/lib/toaster/toastergui/templates/task.html
@@ -11,7 +11,7 @@
 
 {% block pagedetailinfomain %}
 
-<div class="row span11">
+<div class="row col-md-11">
     <div class="page-header">
         <h1><a href="{%url 'recipe' build.pk task.recipe.pk %}">{{task.recipe.name}}_{{task.recipe.version}}</a> {{task.task_name}}</h1>
     </div>
@@ -24,16 +24,16 @@
 {%if task.task_executed %}
     {# executed tasks outcome #}
     {% if task.logfile %}
-            <a class="btn btn-large" href="{% url 'build_artifact' build.id "tasklogfile" task.pk %}" style="margin:15px;">Download task log</a>
+            <a class="btn btn-lg" href="{% url 'build_artifact' build.id "tasklogfile" task.pk %}" style="margin:15px;">Download task log</a>
     {% endif %}
         {# show stack trace for failed task #}
         {% if task.outcome == task.OUTCOME_FAILED and log_head %}
             <h3>Python stack trace</h3>
             <div>
                 <pre style="min-height:160px;">
-                    <code>{{log_head}}</code><a id="full-trace-show" data-target="#fulltrace" data-toggle="collapse" class="btn btn-mini">...</a>
+                    <code>{{log_head}}</code><a id="full-trace-show" data-target="#fulltrace" data-toggle="collapse" class="btn btn-xs">...</a>
                     <div id="fulltrace" class="collapse" style="margin-top: -20px; height: 0px;">
-                        <code>{{log_body}}</code><br><a id="full-trace-hide" class="btn btn-mini collapsed" style="font-family:Helvetica Neue" data-target="#fulltrace" data-toggle="collapse">Collapse stack trace<i class="icon-caret-up"></i></a></div></pre>
+                        <code>{{log_body}}</code><br><a id="full-trace-hide" class="btn btn-xs collapsed" style="font-family:Helvetica Neue" data-target="#fulltrace" data-toggle="collapse">Collapse stack trace<i class="icon-caret-up"></i></a></div></pre>
             </div>
         {% endif %}
 {% else %}
@@ -122,7 +122,7 @@
     {%elif task.outcome == task.OUTCOME_CACHED%}
             {% for t in task.get_related_setscene %}
                 {% if forloop.last %}
-                    <a class="btn btn-large" href="{% url 'build_artifact' build.id "tasklogfile" t.pk %}" style="margin:15px;">Download task log</a>
+                    <a class="btn btn-lg" href="{% url 'build_artifact' build.id "tasklogfile" t.pk %}" style="margin:15px;">Download task log</a>
                 {% endif %}
             {% endfor %}
 
diff --git a/bitbake/lib/toaster/toastergui/templates/tasks.html b/bitbake/lib/toaster/toastergui/templates/tasks.html
index 84bc103..4c71d9a 100644
--- a/bitbake/lib/toaster/toastergui/templates/tasks.html
+++ b/bitbake/lib/toaster/toastergui/templates/tasks.html
@@ -39,7 +39,7 @@
 {% endblock %}
 
 {% block buildinfomain %}
-<div class="span10">
+<div class="col-md-10">
 {% if not request.GET.filter and not request.GET.search and not objects.paginator.count %}
   <!-- Empty - no data in database -->
   <div class="page-header">
@@ -64,10 +64,10 @@
   </div>
 
   {% if objects.paginator.count == 0 %}
-  <div class="row-fluid">
+  <div class="row">
       <div class="alert">
-        <form class="no-results input-append" id="searchform">
-            <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="add-on btn" tabindex="-1"><i class="icon-remove"></i></a>{% endif %}
+        <form class="no-results input-group" id="searchform">
+            <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-group-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
             <button class="btn" type="submit" value="Search">Search</button>
             <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all tasks</button>
         </form>
diff --git a/bitbake/lib/toaster/toastergui/templates/toastertable-simple.html b/bitbake/lib/toaster/toastergui/templates/toastertable-simple.html
index 212318b..1e30cae 100644
--- a/bitbake/lib/toaster/toastergui/templates/toastertable-simple.html
+++ b/bitbake/lib/toaster/toastergui/templates/toastertable-simple.html
@@ -26,12 +26,12 @@
 
 {% include 'toastertable-filter.html' %}
 
-<div class="row-fluid" id="no-results-{{table_name}}" style="display:none">
+<div class="row" id="no-results-{{table_name}}" style="display:none">
   <div class="alert">
-    <form class="no-results input-append">
+    <form class="no-results input-group">
       <input class="input-xlarge" id="new-search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>
-      <a href="#" class="add-on btn remove-search-btn-{{table_name}}" tabindex="-1">
-        <i class="icon-remove"></i>
+      <a href="#" class="input-group-addon btn remove-search-btn-{{table_name}}" tabindex="-1">
+        <i class="glyphicon glyphicon-remove"></i>
       </a>
       <button class="btn search-submit-{{table_name}}" >Search</button>
       <button class="btn btn-link remove-search-btn-{{table_name}}">Show {{title|lower}}
@@ -41,12 +41,12 @@
 </div>
 <div id="table-container-{{table_name}}" style="visibility: hidden">
   <!-- control header -->
-  <div class="row-fluid" id="table-chrome-{{table_name}}">
-      <div class="navbar-search input-append pull-left">
+  <div class="row" id="table-chrome-{{table_name}}">
+      <div class="navbar-search input-group pull-left">
 
         <input class="input-xlarge" id="search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>
-        <a href="#" style="display:none" class="add-on btn remove-search-btn-{{table_name}}" tabindex="-1">
-          <i class="icon-remove"></i>
+        <a href="#" style="display:none" class="input-group-addon btn remove-search-btn-{{table_name}}" tabindex="-1">
+          <i class="glyphicon glyphicon-remove"></i>
         </a>
         <button class="btn" id="search-submit-{{table_name}}" >Search</button>
       </div>
diff --git a/bitbake/lib/toaster/toastergui/templates/toastertable.html b/bitbake/lib/toaster/toastergui/templates/toastertable.html
index 21c3d36..52c4e6d 100644
--- a/bitbake/lib/toaster/toastergui/templates/toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/toastertable.html
@@ -25,12 +25,12 @@
 
 {% include 'toastertable-filter.html' %}
 
-<div class="row-fluid" id="no-results-{{table_name}}" style="display:none">
+<div class="row" id="no-results-{{table_name}}" style="display:none">
   <div class="alert">
-    <form class="no-results input-append">
+    <form class="no-results input-group">
       <input class="input-xxlarge" id="new-search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{%if request.GET.search %}{{request.GET.search}}{%endif%}"/>
-      <a href="#" class="add-on btn remove-search-btn-{{table_name}}" tabindex="-1">
-        <i class="icon-remove"></i>
+      <a href="#" class="input-group-addon btn remove-search-btn-{{table_name}}" tabindex="-1">
+        <i class="glyphicon glyphicon-remove"></i>
       </a>
       <button class="btn search-submit-{{table_name}}">
         Search
@@ -46,11 +46,11 @@
   <!-- control header -->
   <div class="navbar" id="table-chrome-{{table_name}}">
     <div class="navbar-inner">
-      <div class="navbar-search input-append pull-left span6">
+      <div class="navbar-search input-group pull-left col-md-6">
 
         <input id="search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{%if request.GET.search%}{{request.GET.search}}{%endif%}"/>
-        <a href="#" style="display:none" class="add-on btn remove-search-btn-{{table_name}}" tabindex="-1">
-          <i class="icon-remove"></i>
+        <a href="#" style="display:none" class="input-group-addon btn remove-search-btn-{{table_name}}" tabindex="-1">
+          <i class="glyphicon glyphicon-remove"></i>
         </a>
         <button class="btn" id="search-submit-{{table_name}}" >Search</button>
       </div>
diff --git a/bitbake/lib/toaster/toastergui/templates/unavailable_artifact.html b/bitbake/lib/toaster/toastergui/templates/unavailable_artifact.html
index 2d3d02c..331a484 100644
--- a/bitbake/lib/toaster/toastergui/templates/unavailable_artifact.html
+++ b/bitbake/lib/toaster/toastergui/templates/unavailable_artifact.html
@@ -6,8 +6,8 @@
 {% block title %} Build artifact does not exist - Toaster {% endblock %}
 
 {% block pagecontent %}
-    <div class="row-fluid air">
-        <div class="alert alert-info span8 lead">
+    <div class="row air">
+        <div class="alert alert-info col-md-8 lead">
             <p>The build artifact you are trying to download does not exist.</p>
             <p><a href="javascript:window.history.back()">Back to previous page</a></p>
         </div>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 003/106] toaster: templates Base add bootstrap-toaster-theme overlay
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 001/106] toaster: Auto convert bootstrap 2 to bootstrap 3 Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 004/106] toaster: Top bar layout fixes Belen Barros Pena
                   ` (101 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

From: Michael Wood <michael.g.wood@intel.com>

This adds the theme for Toaster which is based on the bootstrap2 style

Signed-off-by: Michael Wood <michael.g.wood@intel.com>
---
 bitbake/lib/toaster/toastergui/templates/base.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/base.html b/bitbake/lib/toaster/toastergui/templates/base.html
index 52a5816..c770668 100644
--- a/bitbake/lib/toaster/toastergui/templates/base.html
+++ b/bitbake/lib/toaster/toastergui/templates/base.html
@@ -8,7 +8,7 @@
       {% block title %} Toaster {% endblock %}
     </title>
     <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}" type="text/css"/>
-    <link rel="stylesheet" href="{% static 'css/bootstrap-responsive.min.css' %}" type='text/css'/>
+    <link rel="stylesheet" href="{% static 'css/bootstrap-toaster-theme.min.css' %}" type='text/css'/>
     <link rel="stylesheet" href="{% static 'css/font-awesome.min.css' %}" type='text/css'/>
     <link rel="stylesheet" href="{% static 'css/prettify.css' %}" type='text/css'/>
     <link rel="stylesheet" href="{% static 'css/default.css' %}" type='text/css'/>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 004/106] toaster: Top bar layout fixes
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 001/106] toaster: Auto convert bootstrap 2 to bootstrap 3 Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 003/106] toaster: templates Base add bootstrap-toaster-theme overlay Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 005/106] toaster: Fix layout of 'All builds' page Belen Barros Pena
                   ` (100 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

From: Belen <belen@icarus.isw.intel.com>

This commit creates a bootstrap3-transition.css file to store the
changes needed for the Boostrap 3 migration.

The first addition to that css file is some adjustments to the top bar
layout.

Also change the .container classes to .container-fluid, since we will be
using the Boostrap responsive layout.

Signed-off-by: Belen <belen@icarus.isw.intel.com>
---
 .../toaster/toastergui/static/css/bootstrap3-transition.css | 13 +++++++++++++
 bitbake/lib/toaster/toastergui/templates/base.html          |  5 +++--
 2 files changed, 16 insertions(+), 2 deletions(-)
 create mode 100644 bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
new file mode 100644
index 0000000..d3297e3
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -0,0 +1,13 @@
+/* Changes to the top bar. Template: base.html */
+
+.navbar .brand {
+  padding: 5px 20px;
+}
+
+.logo {
+  padding-top: 2px !important;
+}
+
+.navbar .btn-group .btn#new-project-button {
+  margin-top: 5px;
+}
diff --git a/bitbake/lib/toaster/toastergui/templates/base.html b/bitbake/lib/toaster/toastergui/templates/base.html
index c770668..60ab68e 100644
--- a/bitbake/lib/toaster/toastergui/templates/base.html
+++ b/bitbake/lib/toaster/toastergui/templates/base.html
@@ -12,6 +12,7 @@
     <link rel="stylesheet" href="{% static 'css/font-awesome.min.css' %}" type='text/css'/>
     <link rel="stylesheet" href="{% static 'css/prettify.css' %}" type='text/css'/>
     <link rel="stylesheet" href="{% static 'css/default.css' %}" type='text/css'/>
+    <link rel="stylesheet" href="{% static 'css/bootstrap3-transition.css' %}" type='text/css' />
 
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
@@ -72,7 +73,7 @@
 
     <div class="navbar navbar-fixed-top">
       <div class="navbar-inner">
-        <div class="container">
+        <div class="container-fluid">
           <a class="brand logo" href="#"><img src="{% static 'img/logo.png' %}" class="" alt="Yocto logo project"/></a>
           <span class="brand">
             <a href="/">Toaster</a>
@@ -116,7 +117,7 @@
       </div>
     </div>
 
-    <div class="container top-padded">
+    <div class="container-fluid top-padded">
       <div class="row">
         {% block pagecontent %}
         {% endblock %}
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 005/106] toaster: Fix layout of 'All builds' page
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (2 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 004/106] toaster: Top bar layout fixes Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 006/106] toaster: Fix layout of 'All projects' page Belen Barros Pena
                   ` (99 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

From: Belen <belen@icarus.isw.intel.com>

Adapt the layout to the Bootstrap 3 grid rules.

Signed-off-by: Belen <belen@icarus.isw.intel.com>
---
 .../toaster/toastergui/static/css/bootstrap3-transition.css    | 10 ++++++++++
 .../lib/toaster/toastergui/templates/builds-toastertable.html  |  6 ++++--
 bitbake/lib/toaster/toastergui/templates/mrb_section.html      |  2 +-
 bitbake/lib/toaster/toastergui/templates/toastertable.html     |  8 ++++----
 4 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index d3297e3..6f5b1f0 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -11,3 +11,13 @@
 .navbar .btn-group .btn#new-project-button {
   margin-top: 5px;
 }
+
+/* Changes to the tables pagination */
+
+.pagination {
+  margin: 0 0 40px 0;
+}
+
+.pagination-centered {
+  margin-left: 50%;
+}
diff --git a/bitbake/lib/toaster/toastergui/templates/builds-toastertable.html b/bitbake/lib/toaster/toastergui/templates/builds-toastertable.html
index 505a568..9b4f3fe 100644
--- a/bitbake/lib/toaster/toastergui/templates/builds-toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/builds-toastertable.html
@@ -13,12 +13,14 @@
 
 {% block pagecontent %}
 
-  <div class="row">
+  <div class="col-md-12">
     {% with mru=mru mrb_type=mrb_type %}
       {% include 'mrb_section.html' %}
     {% endwith %}
 
-    <h1 class="page-header top-air" data-role="page-title"></h1>
+    <div class="page-header">
+      <h1 class="top-air" data-role="page-title"></h1>
+    </div>
 
     {% url 'builds' as xhr_table_url %}
     {% include 'toastertable.html' %}
diff --git a/bitbake/lib/toaster/toastergui/templates/mrb_section.html b/bitbake/lib/toaster/toastergui/templates/mrb_section.html
index 9d92010..4ec5885 100644
--- a/bitbake/lib/toaster/toastergui/templates/mrb_section.html
+++ b/bitbake/lib/toaster/toastergui/templates/mrb_section.html
@@ -29,7 +29,7 @@
       {% endif %}
       </h2>
   {% else %}
-    <div class="page-header top-air">
+    <div class="page-header">
       <h1>
       Latest builds
       </h1>
diff --git a/bitbake/lib/toaster/toastergui/templates/toastertable.html b/bitbake/lib/toaster/toastergui/templates/toastertable.html
index 52c4e6d..f7b4dfc 100644
--- a/bitbake/lib/toaster/toastergui/templates/toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/toastertable.html
@@ -87,13 +87,13 @@
   </table>
 
   <!-- Pagination controls -->
-  <div class="pagination pagination-centered" id="pagination-{{table_name}}">
-    <ul class="pagination" style="display: block-inline">
+  <div id="pagination-{{table_name}}">
+    <ul class="pagination pagination-centered">
     </ul>
 
     <div class="pull-right">
-      <span class="help-inline" style="padding-top:5px;">Show rows:</span>
-      <select style="margin-top:5px;margin-bottom:0px;" class="pagesize-{{table_name}}">
+      <span class="help-inline">Show rows:</span>
+      <select class="pagesize-{{table_name}}">
         {% with "10 25 50 100 150" as list%}
         {% for i in list.split %}
         <option value="{{i}}">{{i}}</option>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 006/106] toaster: Fix layout of 'All projects' page
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (3 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 005/106] toaster: Fix layout of 'All builds' page Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 007/106] toaster: templates Add additional divs for modals in bootstrap3 Belen Barros Pena
                   ` (98 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

From: Belen <belen@icarus.isw.intel.com>

Adapt the layout to the Bootstrap 3 grid rules.

Signed-off-by: Belen <belen@icarus.isw.intel.com>
---
 bitbake/lib/toaster/toastergui/templates/projects-toastertable.html | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/projects-toastertable.html b/bitbake/lib/toaster/toastergui/templates/projects-toastertable.html
index 5814f32..cfbe3ae 100644
--- a/bitbake/lib/toaster/toastergui/templates/projects-toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/projects-toastertable.html
@@ -4,7 +4,9 @@
 
 {% block pagecontent %}
 
-  <div class="page-header top-air">
+<div class="col-md-12">
+
+  <div class="page-header">
     <h1 data-role="page-title"></h1>
   </div>
 
@@ -33,4 +35,6 @@
     });
   </script>
 
+</div>
+
 {% endblock %}
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 007/106] toaster: templates Add additional divs for modals in bootstrap3
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (4 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 006/106] toaster: Fix layout of 'All projects' page Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 008/106] toaster: templates Use old style input appends instead of input-group Belen Barros Pena
                   ` (97 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

From: Michael Wood <michael.g.wood@intel.com>

- Adds the modal-dialog  modal-content divs as per bootstrap 3
- Update modal close handler in table.js after dom tree change
- Remove redundant default.css hack for positioning
- Restore grey footer for modals

Signed-off-by: Michael Wood <michael.g.wood@intel.com>
---
 .../static/css/bootstrap3-transition.css           |   5 +
 .../lib/toaster/toastergui/static/css/default.css  |   6 +-
 .../toastergui/static/html/layer_deps_modal.html   |  38 +++----
 bitbake/lib/toaster/toastergui/static/js/table.js  |   5 +-
 .../toaster/toastergui/templates/configvars.html   |  96 ++++++++---------
 .../toaster/toastergui/templates/customrecipe.html |  73 +++++++------
 .../toastergui/templates/filtersnippet.html        | 113 +++++++++++----------
 .../lib/toaster/toastergui/templates/project.html  |  39 +++----
 .../toastergui/templates/toastertable-filter.html  |  32 +++---
 9 files changed, 224 insertions(+), 183 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index 6f5b1f0..832f681 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -21,3 +21,8 @@
 .pagination-centered {
   margin-left: 50%;
 }
+
+/* Modal dialog */
+.modal-footer {
+  background-color: #f5f5f5;
+}
diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index b024d96..87da629 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -48,8 +48,10 @@ dd li { line-height: 25px; }
 .item-info dd { line-height: 20px; margin-bottom: 10px; }
 
 /* Style the filter modal dialogs */
-.modal { width: 800px; margin-left: -400px; }
-.modal-footer .btn { float: left; }
+.modal-footer .btn {
+  float: left;
+ }
+
 .modal-body { max-height: 300px; }
 
 /* Hover style for the clear search icon */
diff --git a/bitbake/lib/toaster/toastergui/static/html/layer_deps_modal.html b/bitbake/lib/toaster/toastergui/static/html/layer_deps_modal.html
index f95a382..7826fb5 100644
--- a/bitbake/lib/toaster/toastergui/static/html/layer_deps_modal.html
+++ b/bitbake/lib/toaster/toastergui/static/html/layer_deps_modal.html
@@ -1,17 +1,21 @@
-<div id="dependencies-modal" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="false">
-  <form id="dependencies-modal-form">
-    <div class="modal-header">
-      <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
-      <h3><span id="title"></span> dependencies</h3>
-    </div>
-    <div class="modal-body">
-      <p id="body-text"> <strong id="layer-name"></strong> depends on some layers that are not added to your project. Select the ones you want to add:</p>
-      <ul class="list-unstyled" id="dependencies-list">
-      </ul>
-    </div>
-    <div class="modal-footer">
-      <button class="btn btn-primary" type="submit">Add layers</button>
-      <button class="btn" type="reset" data-dismiss="modal">Cancel</button>
-    </div>
-  </form>
-</div>
+<div id="dependencies-modal" class="modal fade" tabindex="-1" role="dialog" aria-hidden="false">
+  <div class="modal-dialog">
+    <div class="modal-content">
+      <form id="dependencies-modal-form">
+	<div class="modal-header">
+	  <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
+	  <h3><span id="title"></span> dependencies</h3>
+	</div>
+	<div class="modal-body">
+	  <p id="body-text"> <strong id="layer-name"></strong> depends on some layers that are not added to your project. Select the ones you want to add:</p>
+	  <ul class="list-unstyled" id="dependencies-list">
+	  </ul>
+	</div>
+	<div class="modal-footer">
+	  <button class="btn btn-primary" type="submit">Add layers</button>
+	  <button class="btn" type="reset" data-dismiss="modal">Cancel</button>
+	</div>
+      </form>
+    </div><!-- /.modal-content -->
+  </div><!-- /.modal-dialog -->
+</div><!-- /.modal -->
diff --git a/bitbake/lib/toaster/toastergui/static/js/table.js b/bitbake/lib/toaster/toastergui/static/js/table.js
index 0f0a1db..fbf0f07 100644
--- a/bitbake/lib/toaster/toastergui/static/js/table.js
+++ b/bitbake/lib/toaster/toastergui/static/js/table.js
@@ -602,7 +602,7 @@ function tableInit(ctx){
             queryset on the table
           */
           var filterActionRadios = $('#filter-actions-' + ctx.tableName);
-          var filterApplyBtn = $('[data-role="filter-apply"]');
+          var filterApplyBtn = $('[data-cat="filter-apply"]');
 
           var setApplyButtonState = function (e, filterActionValue) {
             if (filterActionValue !== undefined) {
@@ -769,6 +769,7 @@ function tableInit(ctx){
 
     loadData(tableParams);
 
-    $(this).parent().modal('hide');
+
+    $('#filter-modal-'+ctx.tableName).modal('hide');
   });
 }
diff --git a/bitbake/lib/toaster/toastergui/templates/configvars.html b/bitbake/lib/toaster/toastergui/templates/configvars.html
index 70e4d89..b959b56 100644
--- a/bitbake/lib/toaster/toastergui/templates/configvars.html
+++ b/bitbake/lib/toaster/toastergui/templates/configvars.html
@@ -79,52 +79,56 @@
 {% for variable in objects %}
     {% if variable.vhistory.count %}
     <div id="variable-{{variable.pk}}" class="modal hide fade" tabindex="-1" role="dialog">
-        <div class="modal-header">
-            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
-            <h3>History of {{variable.variable_name}}</h3>
-        </div>
-        <div class="modal-body">
-            {% if variable.variable_value %}
-              {% if variable.variable_value|length < 570 %}
-                <h4>{{variable.variable_name}} value is:</h4>
-                <p>
-                    {{variable.variable_value}}
-                </p>
-              {% else %}
-                <h4>{{variable.variable_name}} value is:</h4>
-                <p>
-                    <span>{{variable.variable_value|string_slice:':570'}}
-                        <span class="full"> {{variable.variable_value|string_slice:'570:'}}
-                        </span>
-                        <a class="btn btn-xs full-show">...</a>
-                    </span>
-                </p>
-                <a class="btn btn-xs full-hide">Collapse variable value <i class="icon-caret-up"></i>
-                </a>
-              {% endif %}
-            {% else %}
-                <div class="alert alert-info">The value of <strong>{{variable.variable_name}}</strong> is an empty string</div>
-            {% endif %}
-            <h4>The value was set in the following configuration files:</h4>
-            <table class="table table-bordered table-hover">
-                <thead>
-                    <tr>
-                        <th>Order</th>
-                        <th>Configuration file</th>
-                        <th>Operation</th>
-                        <th>Line number</th>
-                    </tr>
-                </thead>
-                <tbody>
-                    {% for vh in variable.vhistory.all %}
-                    <tr>
-                        <td>{{forloop.counter}}</td><td>{{vh.file_name}}</td><td>{{vh.operation}}</td><td>{{vh.line_number}}</td>
-                    </tr>
-                    {%endfor%}
-                </tbody>
-            </table>
-        </div>
-    </div>
+      <div class="modal-dialog">
+	<div class="modal-content">
+	  <div class="modal-header">
+	    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
+	    <h3>History of {{variable.variable_name}}</h3>
+	  </div>
+	  <div class="modal-body">
+	    {% if variable.variable_value %}
+	    {% if variable.variable_value|length < 570 %}
+	    <h4>{{variable.variable_name}} value is:</h4>
+	    <p>
+	    {{variable.variable_value}}
+	    </p>
+	    {% else %}
+	    <h4>{{variable.variable_name}} value is:</h4>
+	    <p>
+	    <span>{{variable.variable_value|string_slice:':570'}}
+	      <span class="full"> {{variable.variable_value|string_slice:'570:'}}
+	      </span>
+	      <a class="btn btn-xs full-show">...</a>
+	    </span>
+	    </p>
+	    <a class="btn btn-xs full-hide">Collapse variable value <i class="icon-caret-up"></i>
+	    </a>
+	    {% endif %}
+	    {% else %}
+	    <div class="alert alert-info">The value of <strong>{{variable.variable_name}}</strong> is an empty string</div>
+	    {% endif %}
+	    <h4>The value was set in the following configuration files:</h4>
+	    <table class="table table-bordered table-hover">
+	      <thead>
+		<tr>
+		  <th>Order</th>
+		  <th>Configuration file</th>
+		  <th>Operation</th>
+		  <th>Line number</th>
+		</tr>
+	      </thead>
+	      <tbody>
+		{% for vh in variable.vhistory.all %}
+		<tr>
+		  <td>{{forloop.counter}}</td><td>{{vh.file_name}}</td><td>{{vh.operation}}</td><td>{{vh.line_number}}</td>
+		</tr>
+		{%endfor%}
+	      </tbody>
+	    </table>
+	  </div>
+	</div><!-- /.modal-content -->
+      </div><!-- /.modal-dialog -->
+    </div><!-- /.modal -->
     {% endif %}
 {% endfor %}
 
diff --git a/bitbake/lib/toaster/toastergui/templates/customrecipe.html b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
index cfe6df0..ee41c68 100644
--- a/bitbake/lib/toaster/toastergui/templates/customrecipe.html
+++ b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
@@ -42,42 +42,51 @@
   });
 </script>
 <!-- package dependencies modal -->
-<div style="display:none" id="package-deps-modal" class="modal hide fade in" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="false">
-  <div class="modal-header">
-    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
-    <h3><span class="package-to-add-name"></span> dependencies</h3>
-  </div>
-  <div class="modal-body">
-    <p>Based on information from a previous build it is likely that adding <strong class="package-to-add-name"></strong> will also add the following packages to your custom image:</p>
-    <ul id="package-add-dep-list">
-    </ul>
-  </div>
-  <div class="modal-footer">
-    <p class="help-block text-left">Total package size: <strong id="package-deps-total-size"></strong></p>
-    <button id="add-package-deps-modal-btn" type="submit" class="btn btn-primary" data-dismiss="modal">Add package</button>
-    <button class="btn" data-dismiss="modal">Cancel</button>
-  </div>
-</div>
+<div id="package-deps-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="false">
+  <div class="modal-dialog">
+    <div class="modal-content">
+      <div class="modal-header">
+	<button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
+	<h3><span class="package-to-add-name"></span> dependencies</h3>
+      </div>
+      <div class="modal-body">
+	<p>Based on information from a previous build it is likely that adding <strong class="package-to-add-name"></strong> will also add the following packages to your custom image:
+	</p>
+	<ul id="package-add-dep-list">
+	</ul>
+      </div>
+      <div class="modal-footer">
+	<p class="help-block text-left">Total package size: <strong id="package-deps-total-size"></strong></p>
+	<button id="add-package-deps-modal-btn" type="submit" class="btn btn-primary" data-dismiss="modal">Add package</button>
+	<button class="btn" data-dismiss="modal">Cancel</button>
+      </div>
+    </div><!-- /.modal-content -->
+  </div><!-- /.modal-dialog -->
+</div><!-- /.modal -->
 <!-- end package dependencies modal -->
 
 <!-- package reverse dependencies modal -->
 <div style="display:none" id="package-reverse-deps-modal" class="modal hide fade in" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="false">
-  <div class="modal-header">
-    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
-    <h3><span class="package-to-rm-name"></span> reverse dependencies</h3>
-  </div>
-  <div class="modal-body">
-    <p> <strong class="reverse-deps-count"></strong> <span class="reverse-deps-package"></span> in your image <span class="reverse-deps-depends"></span> on <strong class="package-to-rm-name"></strong>:</p>
-    <ul id="package-reverse-dep-list">
-    </ul>
-    <p>In order to remove <strong class="package-to-rm-name"></strong>, you must remove <span class="reverse-deps-this"></span> <strong class="reverse-deps-count"></strong> <span class="reverse-deps-package"></span> as well.</p>
-  </div>
-  <div class="modal-footer">
-    <p class="help-block text-left">Total package size: <strong id="package-reverse-deps-total-size"></strong></p>
-    <button id="rm-package-reverse-deps-modal-btn" type="submit" class="btn btn-primary" data-dismiss="modal">Remove all <span class="reverse-deps-count-plus1"></button>
-    <button class="btn" data-dismiss="modal">Cancel</button>
-  </div>
-</div>
+  <div class="modal-dialog">
+    <div class="modal-content">
+      <div class="modal-header">
+	<button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
+	<h3><span class="package-to-rm-name"></span> reverse dependencies</h3>
+      </div>
+      <div class="modal-body">
+	<p> <strong class="reverse-deps-count"></strong> <span class="reverse-deps-package"></span> in your image <span class="reverse-deps-depends"></span> on <strong class="package-to-rm-name"></strong>:</p>
+	<ul id="package-reverse-dep-list">
+	</ul>
+	<p>In order to remove <strong class="package-to-rm-name"></strong>, you must remove <span class="reverse-deps-this"></span> <strong class="reverse-deps-count"></strong> <span class="reverse-deps-package"></span> as well.</p>
+      </div>
+      <div class="modal-footer">
+	<p class="help-block text-left">Total package size: <strong id="package-reverse-deps-total-size"></strong></p>
+	<button id="rm-package-reverse-deps-modal-btn" type="submit" class="btn btn-primary" data-dismiss="modal">Remove all <span class="reverse-deps-count-plus1"></button>
+	<button class="btn" data-dismiss="modal">Cancel</button>
+      </div>
+    </div><!-- /.modal-content -->
+  </div><!-- /.modal-dialog -->
+</div><!-- /.modal -->
 <!-- end package dependencies modal -->
 
 
diff --git a/bitbake/lib/toaster/toastergui/templates/filtersnippet.html b/bitbake/lib/toaster/toastergui/templates/filtersnippet.html
index ea772de..4c2c53e 100644
--- a/bitbake/lib/toaster/toastergui/templates/filtersnippet.html
+++ b/bitbake/lib/toaster/toastergui/templates/filtersnippet.html
@@ -1,57 +1,64 @@
 {% load projecttags %}
 <!-- '{{f.class}}' filter -->
 {% with f.class as  key %}
-<form id="filter_{{f.class}}" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="true">
-        <input type="hidden" name="search" value="{%if request.GET.search %}{{request.GET.search}}{%endif%}"/>
-        <div class="modal-header">
-            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
-            {% if search_term %}
-                 <h3>Filter {{total_count}} {%if filter_search_display%}{{filter_search_display|title}}{%else%}{{objectname|title}}{%endif%} matching '{{search_term}}' by '{{tc.name}}'</h3>
-            {% else %}
-                <h3>Filter {%if filter_search_display%}{{filter_search_display|title}}{%else%}{{objectname|title}}{%endif%} by '{{tc.name}}'</h3>
-            {% endif %}
-        </div>
-        <div class="modal-body">
-            <p>{{f.label}}</p>
-            <label class="radio">
-                <input type="radio" name="filter" {%if request.GET.filter%}{{f.options|check_filter_status:request.GET.filter}} {%else%} checked {%endif%} value="" data-key="{{key}}">  All {%if filter_search_display%}{{filter_search_display|title}}{%else%}{{objectname|title}}{%endif%}
-            </label>
-            {% for option in f.options %}
-                {% if option.1 == 'daterange' %}
-                  <div class="form-inline">
-                      <label class="radio">
-                          <input type="radio" name="filter" id="filter_value_{{key}}" {%if key == daterange_selected %}checked{%endif%} value="{{option.1}}" data-key="{{key}}"> {{option.0}}
-                {% else %}
-                  {% if 1 %}
-                      <label class="radio">
-                          <input type="radio" name="filter" {%if request.GET.filter == option.1 %}checked{%endif%}  value="{{option.1}}" data-key="{{key}}"> {{option.0}}
-                  {% comment "do not disable radio selections by count for now" %}{% else %}
-                      <label class="radio muted">
-                          <input type="radio" name="filter" disabled {%if request.GET.filter == option.1 %}checked{%endif%}  value="{{option.1}}" data-key="{{key}}"> {{option.0}}
-                  {% endcomment %}{% endif %}
-                {% endif %}
-                {% if option.3 %}<i class="icon-question-sign get-help" data-placement="right" title="{{option.3}}"></i>{% endif %}
-                  </label>
-                {% if option.1 == 'daterange' %}
-                  <input type="text" id="date_from_{{key}}" name="date_from_{{key}}" disabled class="input-sm" /><label class="help-inline">to</label>
-                  <input type="text" id="date_to_{{key}}" name="date_to_{{key}}" disabled class="input-sm"  />
-                  <label class="help-inline get-help" >(dd/mm/yyyy)</label>
-                  </div>
-                {% endif %}
-            {% endfor %}
-        <!-- daterange persistence -->
-        {% if last_date_from and last_date_to %}
-        <input type="hidden" id="last_date_from_{{key}}" name="last_date_from" value="{{last_date_from}}"/>
-        <input type="hidden" id="last_date_to_{{key}}" name="last_date_to"   value="{{last_date_to}}"/>
-        {% endif %}
-        </div>
-        <div class="modal-footer">
-            <button type="submit" class="btn btn-primary" data-key="{{key}}">Apply</button>
-            {% if request.GET.filter %}
-                {% if request.GET.filter|string_remove_regex:':.*' != f.options.0.1|string_remove_regex:':.*' %}
-                <span class="help-inline pull-left">You can only apply one filter to the table. This filter will override the current filter.</span>
-                {% endif %}
-            {% endif %}
-        </div>
-</form>
+
+<div id="filter_{{f.class}}" class="modal fade"  tabindex="-1" role="dialog" aria-hidden="true">
+  <div class="modal-dialog">
+    <div class="modal-content">
+      <form>
+	<input type="hidden" name="search" value="{%if request.GET.search %}{{request.GET.search}}{%endif%}"/>
+	<div class="modal-header">
+	  <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
+	  {% if search_term %}
+	  <h3>Filter {{total_count}} {%if filter_search_display%}{{filter_search_display|title}}{%else%}{{objectname|title}}{%endif%} matching '{{search_term}}' by '{{tc.name}}'</h3>
+	  {% else %}
+	  <h3>Filter {%if filter_search_display%}{{filter_search_display|title}}{%else%}{{objectname|title}}{%endif%} by '{{tc.name}}'</h3>
+	  {% endif %}
+	</div>
+	<div class="modal-body">
+	  <p>{{f.label}}</p>
+	  <label class="radio">
+	    <input type="radio" name="filter" {%if request.GET.filter%}{{f.options|check_filter_status:request.GET.filter}} {%else%} checked {%endif%} value="" data-key="{{key}}">  All {%if filter_search_display%}{{filter_search_display|title}}{%else%}{{objectname|title}}{%endif%}
+	  </label>
+	  {% for option in f.options %}
+	  {% if option.1 == 'daterange' %}
+	  <div class="form-inline">
+	    <label class="radio">
+	      <input type="radio" name="filter" id="filter_value_{{key}}" {%if key == daterange_selected %}checked{%endif%} value="{{option.1}}" data-key="{{key}}"> {{option.0}}
+	      {% else %}
+	      {% if 1 %}
+	      <label class="radio">
+		<input type="radio" name="filter" {%if request.GET.filter == option.1 %}checked{%endif%}  value="{{option.1}}" data-key="{{key}}"> {{option.0}}
+		{% comment "do not disable radio selections by count for now" %}{% else %}
+		<label class="radio muted">
+		  <input type="radio" name="filter" disabled {%if request.GET.filter == option.1 %}checked{%endif%}  value="{{option.1}}" data-key="{{key}}"> {{option.0}}
+		  {% endcomment %}{% endif %}
+		  {% endif %}
+		  {% if option.3 %}<i class="icon-question-sign get-help" data-placement="right" title="{{option.3}}"></i>{% endif %}
+		</label>
+		{% if option.1 == 'daterange' %}
+		<input type="text" id="date_from_{{key}}" name="date_from_{{key}}" disabled class="input-sm" /><label class="help-inline">to</label>
+		<input type="text" id="date_to_{{key}}" name="date_to_{{key}}" disabled class="input-sm"  />
+		<label class="help-inline get-help" >(dd/mm/yyyy)</label>
+	  </div>
+	  {% endif %}
+	  {% endfor %}
+	  <!-- daterange persistence -->
+	  {% if last_date_from and last_date_to %}
+	  <input type="hidden" id="last_date_from_{{key}}" name="last_date_from" value="{{last_date_from}}"/>
+	  <input type="hidden" id="last_date_to_{{key}}" name="last_date_to"   value="{{last_date_to}}"/>
+	  {% endif %}
+	</div>
+	<div class="modal-footer">
+	  <button type="submit" class="btn btn-primary" data-key="{{key}}">Apply</button>
+	  {% if request.GET.filter %}
+	  {% if request.GET.filter|string_remove_regex:':.*' != f.options.0.1|string_remove_regex:':.*' %}
+	  <span class="help-inline pull-left">You can only apply one filter to the table. This filter will override the current filter.</span>
+	  {% endif %}
+	  {% endif %}
+	</div>
+      </form>
+    </div><!-- /.modal-content -->
+  </div><!-- /.modal-dialog -->
+</div> <!--/.modal -->
 {% endwith %}
diff --git a/bitbake/lib/toaster/toastergui/templates/project.html b/bitbake/lib/toaster/toastergui/templates/project.html
index ac411a3..3096ad2 100644
--- a/bitbake/lib/toaster/toastergui/templates/project.html
+++ b/bitbake/lib/toaster/toastergui/templates/project.html
@@ -24,25 +24,30 @@
   });
 </script>
 
+{% comment %}
 <!-- Comment out the ability to change the project release, until we decide what to do this functionality -->
+<div id="change-release-modal" class="modal hide fade in" tabindex="-1" role="dialog" aria-labelledby="change-release-modal" aria-hidden="false">
+  <div class="modal-dialog">
+    <div class="modal-content">
 
-<!--div id="change-release-modal" class="modal hide fade in" tabindex="-1" role="dialog" aria-labelledby="change-release-modal" aria-hidden="false">
-  <div class="modal-header">
-    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
-    <h3>Changing Yocto Project release to <span class="proposed-release-change-name"></span></h3>
-  </div>
-  <div class="modal-body">
-    <p>The following added layers do not exist for <span class="proposed-release-change-name"></span>: </p>
-    <ul id="layers-to-remove-list">
-    </ul>
-    <p>If you change the Yocto Project release to <span class="proposed-release-change-name"></span>, the above layers will be deleted from your added layers.</p>
-  </div>
-  <div class="modal-footer">
-    <button id="change-release-and-rm-layers" data-dismiss="modal" type="submit" class="btn btn-primary">Change release and delete layers</button>
-    <button class="btn" data-dismiss="modal" aria-hidden="true">Cancel</button>
-  </div>
-</div-->
-
+      <div class="modal-header">
+	<button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
+	<h3>Changing Yocto Project release to <span class="proposed-release-change-name"></span></h3>
+      </div>
+      <div class="modal-body">
+	<p>The following added layers do not exist for <span class="proposed-release-change-name"></span>: </p>
+	<ul id="layers-to-remove-list">
+	</ul>
+	<p>If you change the Yocto Project release to <span class="proposed-release-change-name"></span>, the above layers will be deleted from your added layers.</p>
+      </div>
+      <div class="modal-footer">
+	<button id="change-release-and-rm-layers" data-dismiss="modal" type="submit" class="btn btn-primary">Change release and delete layers</button>
+	<button class="btn" data-dismiss="modal" aria-hidden="true">Cancel</button>
+      </div>
+    </div><!-- /.modal-content -->
+  </div><!-- /.modal-dialog -->
+</div><!-- /.modal -->
+{% endcomment %}
 
 <div class="row" id="project-page" style="display:none">
   <div class="col-md-6">
diff --git a/bitbake/lib/toaster/toastergui/templates/toastertable-filter.html b/bitbake/lib/toaster/toastergui/templates/toastertable-filter.html
index 4d28793..25eef52 100644
--- a/bitbake/lib/toaster/toastergui/templates/toastertable-filter.html
+++ b/bitbake/lib/toaster/toastergui/templates/toastertable-filter.html
@@ -1,20 +1,24 @@
 <!-- filter modal -->
-<div id="filter-modal-{{table_name}}" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="false">
-  <form id="filter-modal-form-{{table_name}}" style="margin-bottom: 0px">
-    <div class="modal-header">
-      <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
-      <h3 id="filter-modal-title-{{table_name}}">&nbsp;</h3>
-    </div>
-    <div class="modal-body">
-      <p>Show:</p>
-      <span id="filter-actions-{{table_name}}"></span>
-    </div>
-    <div class="modal-footer">
-      <button class="btn btn-primary" type="submit" data-role="filter-apply">
+<div id="filter-modal-{{table_name}}" class="modal fade" tabindex="-1" role="dialog" aria-hidden="false">
+  <div class="modal-dialog">
+    <div class="modal-content">
+        <div class="modal-header">
+          <button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
+          <h3 id="filter-modal-title-{{table_name}}">&nbsp;</h3>
+	</div>
+	<div class="modal-body">
+	  <form id="filter-modal-form-{{table_name}}" style="margin-bottom: 0px">
+	  <p>Show:</p>
+	  <span id="filter-actions-{{table_name}}"></span>
+	</div>
+	<div class="modal-footer">
+          <button class="btn btn-primary" type="submit" data-role="filter-apply">
         Apply
-      </button>
+	  </button>
+	</div>
+      </form>
     </div>
-  </form>
+  </div>
 </div>
 <button id="clear-filter-btn-{{table_name}}" style="display:none"></button>
 <!-- end filter modal -->
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 008/106] toaster: templates Use old style input appends instead of input-group
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (5 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 007/106] toaster: templates Add additional divs for modals in bootstrap3 Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 009/106] toaster: bootstrap3-transition Remove top margin on New project button Belen Barros Pena
                   ` (96 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

From: Michael Wood <michael.g.wood@intel.com>

The new input-group in bootstrap3 is not analogous to input-append so
revert back to using input-append and co.

Signed-off-by: Michael Wood <michael.g.wood@intel.com>
---
 .../lib/toaster/toastergui/templates/basetable_top.html |  4 ++--
 bitbake/lib/toaster/toastergui/templates/bpackage.html  |  4 ++--
 .../lib/toaster/toastergui/templates/configvars.html    |  4 ++--
 .../lib/toaster/toastergui/templates/customrecipe.html  |  8 ++++----
 .../toastergui/templates/detail_search_header.html      |  6 +++---
 .../lib/toaster/toastergui/templates/importlayer.html   |  2 +-
 .../lib/toaster/toastergui/templates/layerdetails.html  |  8 ++++----
 bitbake/lib/toaster/toastergui/templates/project.html   | 12 +++++++-----
 .../lib/toaster/toastergui/templates/projectbuilds.html |  4 ++--
 .../lib/toaster/toastergui/templates/projectconf.html   | 10 +++++-----
 .../lib/toaster/toastergui/templates/projecttopbar.html |  8 ++++----
 bitbake/lib/toaster/toastergui/templates/recipes.html   |  4 ++--
 bitbake/lib/toaster/toastergui/templates/target.html    |  4 ++--
 bitbake/lib/toaster/toastergui/templates/tasks.html     |  4 ++--
 .../toastergui/templates/toastertable-simple.html       |  8 ++++----
 .../lib/toaster/toastergui/templates/toastertable.html  | 17 ++++++++++-------
 16 files changed, 56 insertions(+), 51 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/basetable_top.html b/bitbake/lib/toaster/toastergui/templates/basetable_top.html
index 7ed9a93..e64be2d 100644
--- a/bitbake/lib/toaster/toastergui/templates/basetable_top.html
+++ b/bitbake/lib/toaster/toastergui/templates/basetable_top.html
@@ -161,8 +161,8 @@
 <!-- control header -->
 <div class="navbar">
     <div class="navbar-inner">
-        <form class="navbar-search input-group pull-left col-md-6" id="searchform">
-            <input id="search" name="search" type="text" placeholder="Search {%if object_search_display %}{{object_search_display}}{%else%}{{objectname}}{%endif%}" value="{%if request.GET.search %}{{request.GET.search}}{% endif %}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-group-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{%endif%}
+        <form class="navbar-search input-append pull-left col-md-6" id="searchform">
+            <input id="search" name="search" type="text" placeholder="Search {%if object_search_display %}{{object_search_display}}{%else%}{{objectname}}{%endif%}" value="{%if request.GET.search %}{{request.GET.search}}{% endif %}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{%endif%}
             <input type="hidden" name="orderby" value="{{request.GET.orderby}}">
             <input type="hidden" name="page" value="1">
             <button class="btn" id="search-button" type="submit" value="Search">Search</button>
diff --git a/bitbake/lib/toaster/toastergui/templates/bpackage.html b/bitbake/lib/toaster/toastergui/templates/bpackage.html
index d03760c..8e40932 100644
--- a/bitbake/lib/toaster/toastergui/templates/bpackage.html
+++ b/bitbake/lib/toaster/toastergui/templates/bpackage.html
@@ -45,8 +45,8 @@
   {% if objects.paginator.count == 0 %}
   <div class="row">
       <div class="alert">
-        <form class="no-results input-group" id="searchform">
-            <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-group-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
+        <form class="no-results input-append" id="searchform">
+            <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
             <button class="btn" type="submit" value="Search">Search</button>
             <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all packages</button>
         </form>
diff --git a/bitbake/lib/toaster/toastergui/templates/configvars.html b/bitbake/lib/toaster/toastergui/templates/configvars.html
index b959b56..fa6ed0f 100644
--- a/bitbake/lib/toaster/toastergui/templates/configvars.html
+++ b/bitbake/lib/toaster/toastergui/templates/configvars.html
@@ -39,8 +39,8 @@
   {% if objects.paginator.count == 0 %}
   <div class="row">
       <div class="alert">
-        <form class="no-results input-group" id="searchform">
-            <input id="search" name="search" class="input-xxlarge" type="text" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-group-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
+        <form class="no-results input-append" id="searchform">
+            <input id="search" name="search" class="input-xxlarge" type="text" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
             <button class="btn" type="submit" value="Search">Search</button>
             <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all variables</button>
         </form>
diff --git a/bitbake/lib/toaster/toastergui/templates/customrecipe.html b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
index ee41c68..ebf2fd2 100644
--- a/bitbake/lib/toaster/toastergui/templates/customrecipe.html
+++ b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
@@ -106,7 +106,7 @@
 <div class="row col-md-11">
   <div class="col-md-8">
     <div class="button-place btn-group" style="width: 100%">
-      <a class="btn btn-lg col-md-6 build-custom-image" href="#" style="width: 50%">
+      <a class="btn btn-large col-md-6 build-custom-image" href="#" style="width: 50%">
         Build {{recipe.name}}
       </a>
       <a href="{% url 'customrecipedownload' project.id recipe.id %}" class="btn btn-large span6" style="width: 50%"
@@ -129,9 +129,9 @@
           <li>Build the recipe</li>
           <li>Once the build completes, come back to this page and search for the package</li>
         </ol>
-        <form class="input-group no-results">
+        <form class="input-append no-results">
           <input type="text" class="input-xlarge no-results-search-input" id="no-results-search-input-{{table_name}}" name="search" placeholder="Search {{title|lower}}" />
-          <a href="#" class="input-group-addon btn" id="no-results-remove-search-btn" tabindex="-1">
+          <a href="#" class="input-append-addon btn" id="no-results-remove-search-btn" tabindex="-1">
             <i class="glyphicon glyphicon-remove"></i>
           </a>
           <button class="btn search-submit-{{table_name}}">Search</button>
@@ -145,7 +145,7 @@
         <h2> Add | Remove packages </h2>
         <div class="alert alert-info air">
           <p class="lead">Toaster has no package information for {{recipe.name}}. To generate package information, build {{recipe.name}}</p>
-          <button class="btn btn-info btn-lg build-custom-image" style="margin:20px 0 10px 0;">Build {{recipe.name}}</button>
+          <button class="btn btn-info btn-large build-custom-image" style="margin:20px 0 10px 0;">Build {{recipe.name}}</button>
         </div>
         {% else %}
         {# ToasterTable for Adding remove packages #}
diff --git a/bitbake/lib/toaster/toastergui/templates/detail_search_header.html b/bitbake/lib/toaster/toastergui/templates/detail_search_header.html
index 2e5a590..ec01fe5 100644
--- a/bitbake/lib/toaster/toastergui/templates/detail_search_header.html
+++ b/bitbake/lib/toaster/toastergui/templates/detail_search_header.html
@@ -23,16 +23,16 @@ $(document).ready(function() {
   {% if objects.paginator.count == 0 %}
   <div class="alert">
     <h3>No {{search_what}} found</h3>
-    <form id="searchform" class="input-group">
+    <form id="searchform" class="input-append">
   {% else %}
-    <form id="searchform" class="navbar-search input-group pull-left">
+    <form id="searchform" class="navbar-search input-append pull-left">
   {% endif %}
 
       <input id="search" class="input-xlarge" type="text" placeholder="Search {{search_what}}" name="search" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}">
       <input type="hidden" value="name:+" name="orderby">
       <input type="hidden" value="l" name="page">
   {% if request.GET.search %}
-      <a class="input-group-addon btn search-clear">
+      <a class="input-append-addon btn search-clear">
         <i class="glyphicon glyphicon-remove"></i>
       </a>
   {% endif %}
diff --git a/bitbake/lib/toaster/toastergui/templates/importlayer.html b/bitbake/lib/toaster/toastergui/templates/importlayer.html
index fa64d53..798591e 100644
--- a/bitbake/lib/toaster/toastergui/templates/importlayer.html
+++ b/bitbake/lib/toaster/toastergui/templates/importlayer.html
@@ -110,7 +110,7 @@
                         </legend>
                         <ul class="list-unstyled configuration-list" id="layer-deps-list">
                         </ul>
-                        <div class="input-group">
+                        <div class="input-append">
                             <input type="text" autocomplete="off" data-minLength="1" data-autocomplete="off" data-provide="typeahead" placeholder="Type a layer name" id="layer-dependency" class="input-xlarge">
                             <a class="btn" id="add-layer-dependency-btn">
                                 Add layer
diff --git a/bitbake/lib/toaster/toastergui/templates/layerdetails.html b/bitbake/lib/toaster/toastergui/templates/layerdetails.html
index 022226f..b4601ed 100644
--- a/bitbake/lib/toaster/toastergui/templates/layerdetails.html
+++ b/bitbake/lib/toaster/toastergui/templates/layerdetails.html
@@ -124,7 +124,7 @@
           <a href="{{layerversion.get_vcs_link_url}}/" class="glyphicon glyphicon-share get-info" target="_blank"></a>
           {% endif %}
           <form id="change-repo-form" class="control-group" style="display:none">
-            <div class="input-group">
+            <div class="input-append">
               <input type="text" class="input-xlarge" value="{{layerversion.layer.vcs_url}}">
                 <button data-layer-prop="vcs_url" class="btn change-btn" type="button">Save</button>
                 <a href="#" style="display:none" class="btn btn-link cancel">Cancel</a>
@@ -143,7 +143,7 @@
             <a href="{{layerversion.get_vcs_dirpath_link_url}}" class="glyphicon glyphicon-share get-info" target="_blank"></a>
             {% endif %}
             <form id="change-subdir-form" style="display:none;">
-              <div class="input-group">
+              <div class="input-append">
                 <input type="text" value="{{layerversion.dirpath}}">
                   <button data-layer-prop="dirpath" class="btn change-btn" type="button">Save</button>
                   <a href="#" style="display:none" class="btn btn-link cancel">Cancel</a>
@@ -159,7 +159,7 @@
             <dd>
               <span class="current-value">{{layerversion.get_vcs_reference}}</span>
               <form style="display:none;">
-                <div class="input-group">
+                <div class="input-append">
                   <input type="text" value="{{layerversion.get_vcs_reference}}">
                     <button  data-layer-prop="commit" class="btn change-btn" type="button">Save</button>
                     <a href="#" style="display:none" class="btn btn-link cancel">Cancel</a>
@@ -180,7 +180,7 @@
                   </li>
                   {% endfor %}
                 </ul>
-                <div class="input-group add-deps">
+                <div class="input-append add-deps">
                   <input type="text" autocomplete="off" data-minLength="1" data-autocomplete="off"  placeholder="Type a layer name" id="layer-dep-input">
                     <a class="btn" id="add-layer-dependency-btn" >
                       Add layer
diff --git a/bitbake/lib/toaster/toastergui/templates/project.html b/bitbake/lib/toaster/toastergui/templates/project.html
index 3096ad2..cdcc83b 100644
--- a/bitbake/lib/toaster/toastergui/templates/project.html
+++ b/bitbake/lib/toaster/toastergui/templates/project.html
@@ -61,7 +61,7 @@
           <strong>Machine changes have a big impact on build outcome.</strong> You cannot really compare the builds for the new machine with the previous ones.
         </div>
 
-        <div class="input-group">
+        <div class="input-append">
           <input id="machine-change-input" autocomplete="off" value="" data-provide="typeahead" data-minlength="1" data-autocomplete="off" type="text">
             <button id="machine-change-btn" class="btn" type="button">Save</button> <a href="#" id="cancel-machine-change" class="btn btn-link">Cancel</a>
         </div>
@@ -121,10 +121,12 @@
       <form style="margin-top:20px">
         <!--div class="control-group error"-->
 
-        <div class="input-group">
-          <input id="layer-add-input" autocomplete="off" placeholder="Type a layer name" data-minlength="1" data-autocomplete="off" data-provide="typeahead" data-source="" type="text">
-            <button id="add-layer-btn" class="btn" disabled>Add</button>
-        </div>
+	<div class="col-lg-ff6">
+	  <div class="input-append">
+	    <input id="layer-add-input" autocomplete="off" placeholder="Type a layer name" data-minlength="1" data-autocomplete="off" data-provide="typeahead" data-source="" type="text">
+	      <button id="add-layer-btn" class="btn" disabled>Add</button>
+	  </div>
+	</div>
 
         <div id="import-alert" class="alert alert-info" style="display:none;">
           Toaster does not know about this layer. Please <a href="#">import it</a>
diff --git a/bitbake/lib/toaster/toastergui/templates/projectbuilds.html b/bitbake/lib/toaster/toastergui/templates/projectbuilds.html
index d0f9af4..50697a1 100644
--- a/bitbake/lib/toaster/toastergui/templates/projectbuilds.html
+++ b/bitbake/lib/toaster/toastergui/templates/projectbuilds.html
@@ -41,8 +41,8 @@
   {% if request.GET.filter or request.GET.search %}
     <div class="row">
       <div class="alert">
-        <form class="no-results input-group" id="searchform">
-            <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-group-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
+        <form class="no-results input-append" id="searchform">
+            <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
             <button class="btn" type="submit" value="Search">Search</button>
             <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all builds</button>
         </form>
diff --git a/bitbake/lib/toaster/toastergui/templates/projectconf.html b/bitbake/lib/toaster/toastergui/templates/projectconf.html
index 7ceccee..6f1a141 100644
--- a/bitbake/lib/toaster/toastergui/templates/projectconf.html
+++ b/bitbake/lib/toaster/toastergui/templates/projectconf.html
@@ -19,7 +19,7 @@
                 <span id="distro">{{distro}}</span>
                 <i class="glyphicon glyphicon-pencil" id="change-distro-icon"></i>
                 <form id="change-distro-form" style="display:none;">
-                    <div class="input-group">
+                    <div class="input-append">
                         <span  id="edit-distro-name-div" class="control-group">
                             <input type="text" id="new-distro" value="{{distro}}">
                             <button id="apply-change-distro" class="btn" type="button">Save</button>
@@ -43,7 +43,7 @@
                     <div class="row">
                         <span class="help-block col-md-4">To set DL_DIR type the absolute path of the download folder.</span>
                     </div>
-                    <div class="input-group" id="validate-dl_dir">
+                    <div class="input-append" id="validate-dl_dir">
                         <input type="text" class="input-xlarge" id="new-dl_dir" placeholder="Type absolute path of the DL_DIR folder">
                         <button id="apply-change-dl_dir" class="btn" type="button">Save</button>
                         <button id="cancel-change-dl_dir" type="button" class="btn btn-link">Cancel</button>
@@ -90,7 +90,7 @@
                     <div class="row">
                         <span class="help-block col-md-4">To set IMAGE_INSTALL_append to more than one package, type the package names separated by a space.</span>
                     </div>
-                    <div class="input-group">
+                    <div class="input-append">
                         <input type="text" class="input-xlarge" id="new-image_install" placeholder="Type one or more package names">
                         <button id="apply-change-image_install" class="btn" type="button">Save</button>
                         <button id="cancel-change-image_install" type="button" class="btn btn-link">Cancel</button>
@@ -147,7 +147,7 @@
                     <div class="row">
                         <span class="help-block col-md-4">To set SSTATE_DIR type the absolute path of the download folder.</span>
                     </div>
-                    <div class="input-group" id="validate-sstate_dir">
+                    <div class="input-append" id="validate-sstate_dir">
                         <input type="text" class="input-xlarge" id="new-sstate_dir" placeholder="Type absolute path of the SSTATE_DIR folder">
                         <span class="error">A valid directory name required</span>
                         <button id="apply-change-sstate_dir" class="btn" type="button">Save</button>
@@ -425,7 +425,7 @@
                     orightml += '    <span id="config_var_value_'+configvars_sorted[i][2]+'"></span>'
                     orightml += '    <i class="glyphicon glyphicon-pencil js-icon-pencil-config_var" x-data="'+configvars_sorted[i][2]+'"></i>'
                     orightml += '    <form id="change-config_var-form_'+configvars_sorted[i][2]+'" style="display:none;">'
-                    orightml += '        <div class="input-group">'
+                    orightml += '        <div class="input-append">'
                     orightml += '            <input type="text" class="input-xlarge js-new-config_var" id="new-config_var_'+configvars_sorted[i][2]+'" value="">'
                     orightml += '            <button class="btn js-apply-change-config_var" type="button" x-data="'+configvars_sorted[i][2]+':'+configvars_sorted[i][0]+'" disabled>Save</button>'
                     orightml += '            <button type="button" class="btn btn-link js-cancel-change-config_var" x-data="'+configvars_sorted[i][2]+'">Cancel</button>'
diff --git a/bitbake/lib/toaster/toastergui/templates/projecttopbar.html b/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
index b2f41e0..426ded0 100644
--- a/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
+++ b/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
@@ -35,7 +35,7 @@
   <form id="project-name-change-form" style="margin-bottom: 0px; display: none;">
     <div class="input-group" id="validate-project-name">
       <input class="huge input-xxlarge" type="text" id="project-name-change-input" autocomplete="off" value="{{project.name}}">
-        <button id="project-name-change-btn" class="btn btn-lg" type="button">Save</button>
+        <button id="project-name-change-btn" class="btn btn-large" type="button">Save</button>
         <a href="#" id="project-name-change-cancel" class="btn btn-lg btn-link">Cancel</a>
     </div>
     <p class="help-block error" style="display: none;margin-top: 10px;" id="hint-error-project-name">A project with this name exists. Project names must be unique.</p>
@@ -68,9 +68,9 @@
       <li class="pull-right">
         <form class="form-inline" style="margin-bottom:0px;">
           <i class="icon-question-sign get-help heading-help" data-placement="left" title="" data-original-title="Type the name of one or more recipes you want to build, separated by a space. You can also specify a task by appending a colon and a task name to the recipe name, like so: <code>busybox:clean</code>"></i>
-          <div class="input-group">
-            <input id="build-input" type="text" class="input-xlarge input-lg build-target-input" placeholder="Type the recipe you want to build" autocomplete="off" disabled>
-            <button id="build-button" class="btn btn-primary btn-lg build-button" data-project-id="{{project.id}}" disabled>Build</button>
+          <div class="input-append">
+            <input id="build-input" type="text" class="huge input-xlarge build-target-input" placeholder="Type the recipe you want to build" autocomplete="off" disabled>
+            <button id="build-button" class="btn btn-primary btn-large build-button" data-project-id="{{project.id}}" disabled>Build</button>
           </div>
         </form>
       </li>
diff --git a/bitbake/lib/toaster/toastergui/templates/recipes.html b/bitbake/lib/toaster/toastergui/templates/recipes.html
index 04e15f7..e879f00 100644
--- a/bitbake/lib/toaster/toastergui/templates/recipes.html
+++ b/bitbake/lib/toaster/toastergui/templates/recipes.html
@@ -28,8 +28,8 @@
 {% if objects.paginator.count == 0 %}
   <div class="row">
       <div class="alert">
-        <form class="no-results input-group" id="searchform">
-            <input id="search" name="search" class="input-xxlarge" type="text" value="{%if request.GET.search%}{{request.GET.search}}{%endif%}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-group-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
+        <form class="no-results input-append" id="searchform">
+            <input id="search" name="search" class="input-xxlarge" type="text" value="{%if request.GET.search%}{{request.GET.search}}{%endif%}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
             <button class="btn" type="submit" value="Search">Search</button>
             <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all recipes</button>
         </form>
diff --git a/bitbake/lib/toaster/toastergui/templates/target.html b/bitbake/lib/toaster/toastergui/templates/target.html
index 3979929..5740cdc 100644
--- a/bitbake/lib/toaster/toastergui/templates/target.html
+++ b/bitbake/lib/toaster/toastergui/templates/target.html
@@ -53,8 +53,8 @@
     {% if objects.paginator.count == 0 %}
     <div class="row">
         <div class="alert">
-            <form class="no-results input-group" id="searchform">
-                <input id="search" name="search" class="input-xxlarge" type="text" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-group-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
+            <form class="no-results input-append" id="searchform">
+                <input id="search" name="search" class="input-xxlarge" type="text" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
                 <button class="btn" type="submit" value="Search">Search</button>
                 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all packages</button>
             </form>
diff --git a/bitbake/lib/toaster/toastergui/templates/tasks.html b/bitbake/lib/toaster/toastergui/templates/tasks.html
index 4c71d9a..c45cf15 100644
--- a/bitbake/lib/toaster/toastergui/templates/tasks.html
+++ b/bitbake/lib/toaster/toastergui/templates/tasks.html
@@ -66,8 +66,8 @@
   {% if objects.paginator.count == 0 %}
   <div class="row">
       <div class="alert">
-        <form class="no-results input-group" id="searchform">
-            <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-group-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
+        <form class="no-results input-append" id="searchform">
+            <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
             <button class="btn" type="submit" value="Search">Search</button>
             <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all tasks</button>
         </form>
diff --git a/bitbake/lib/toaster/toastergui/templates/toastertable-simple.html b/bitbake/lib/toaster/toastergui/templates/toastertable-simple.html
index 1e30cae..6ef220b 100644
--- a/bitbake/lib/toaster/toastergui/templates/toastertable-simple.html
+++ b/bitbake/lib/toaster/toastergui/templates/toastertable-simple.html
@@ -28,9 +28,9 @@
 
 <div class="row" id="no-results-{{table_name}}" style="display:none">
   <div class="alert">
-    <form class="no-results input-group">
+    <form class="no-results input-append">
       <input class="input-xlarge" id="new-search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>
-      <a href="#" class="input-group-addon btn remove-search-btn-{{table_name}}" tabindex="-1">
+      <a href="#" class="input-append-addon btn remove-search-btn-{{table_name}}" tabindex="-1">
         <i class="glyphicon glyphicon-remove"></i>
       </a>
       <button class="btn search-submit-{{table_name}}" >Search</button>
@@ -42,10 +42,10 @@
 <div id="table-container-{{table_name}}" style="visibility: hidden">
   <!-- control header -->
   <div class="row" id="table-chrome-{{table_name}}">
-      <div class="navbar-search input-group pull-left">
+      <div class="navbar-search input-append pull-left">
 
         <input class="input-xlarge" id="search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>
-        <a href="#" style="display:none" class="input-group-addon btn remove-search-btn-{{table_name}}" tabindex="-1">
+        <a href="#" style="display:none" class="input-append-addon btn remove-search-btn-{{table_name}}" tabindex="-1">
           <i class="glyphicon glyphicon-remove"></i>
         </a>
         <button class="btn" id="search-submit-{{table_name}}" >Search</button>
diff --git a/bitbake/lib/toaster/toastergui/templates/toastertable.html b/bitbake/lib/toaster/toastergui/templates/toastertable.html
index f7b4dfc..f046277 100644
--- a/bitbake/lib/toaster/toastergui/templates/toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/toastertable.html
@@ -27,9 +27,9 @@
 
 <div class="row" id="no-results-{{table_name}}" style="display:none">
   <div class="alert">
-    <form class="no-results input-group">
+    <form class="no-results input-append">
       <input class="input-xxlarge" id="new-search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{%if request.GET.search %}{{request.GET.search}}{%endif%}"/>
-      <a href="#" class="input-group-addon btn remove-search-btn-{{table_name}}" tabindex="-1">
+      <a href="#" class="input-append-addon btn remove-search-btn-{{table_name}}" tabindex="-1">
         <i class="glyphicon glyphicon-remove"></i>
       </a>
       <button class="btn search-submit-{{table_name}}">
@@ -46,13 +46,16 @@
   <!-- control header -->
   <div class="navbar" id="table-chrome-{{table_name}}">
     <div class="navbar-inner">
-      <div class="navbar-search input-group pull-left col-md-6">
-
-        <input id="search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{%if request.GET.search%}{{request.GET.search}}{%endif%}"/>
-        <a href="#" style="display:none" class="input-group-addon btn remove-search-btn-{{table_name}}" tabindex="-1">
+      <div class="navbar-search pull-left">
+	<div class="input-append">
+        <input id="search-input-{{table_name}}" class="input-xxlarge"  name="search" type="text" placeholder="Search {{title|lower}}" value="{%if request.GET.search%}{{request.GET.search}}{%endif%}"/>
+        <a href="#" style="display:none" class="input-append-addon btn remove-search-btn-{{table_name}}" tabindex="-1">
           <i class="glyphicon glyphicon-remove"></i>
         </a>
+	<span class="input-append-btn">
         <button class="btn" id="search-submit-{{table_name}}" >Search</button>
+	</span>
+	</div>
       </div>
 
       <div class="pull-right">
@@ -88,7 +91,7 @@
 
   <!-- Pagination controls -->
   <div id="pagination-{{table_name}}">
-    <ul class="pagination pagination-centered">
+    <ul class="pagination">
     </ul>
 
     <div class="pull-right">
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 009/106] toaster: bootstrap3-transition Remove top margin on New project button
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (6 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 008/106] toaster: templates Use old style input appends instead of input-group Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 010/106] toaster: default.css Remove 80% width for search as this is no longer needed Belen Barros Pena
                   ` (95 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

From: Michael Wood <michael.g.wood@intel.com>

Signed-off-by: Michael Wood <michael.g.wood@intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index 832f681..2fd7caf 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -8,10 +8,6 @@
   padding-top: 2px !important;
 }
 
-.navbar .btn-group .btn#new-project-button {
-  margin-top: 5px;
-}
-
 /* Changes to the tables pagination */
 
 .pagination {
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 010/106] toaster: default.css Remove 80% width for search as this is no longer needed
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (7 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 009/106] toaster: bootstrap3-transition Remove top margin on New project button Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 011/106] toaster: migrate typeahead library Belen Barros Pena
                   ` (94 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

From: Michael Wood <michael.g.wood@intel.com>

Deprecated by the bootstrap theme.

Signed-off-by: Michael Wood <michael.g.wood@intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/default.css | 1 -
 1 file changed, 1 deletion(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index 87da629..2bba46f 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -116,7 +116,6 @@ th > a, th > span { font-weight: normal; }
 /* Styles for the navbar actions */
 .btn-group + .btn-group { margin-right: 10px; }
 .navbar-inner > .btn-group { margin-top: 6px; }
-[id^="search-input-"], #search { width: 80%; }
 
 /* Styles for the parent item in the left navigation */
 
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 011/106] toaster: migrate typeahead library
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (8 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 010/106] toaster: default.css Remove 80% width for search as this is no longer needed Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 012/106] toaster: Layout fixes for project configuration Belen Barros Pena
                   ` (93 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

From: Michael Wood <michael.g.wood@intel.com>

Migrate from Bootstrap 2's built-in typeahead to Twitter's
typeahead library.

This is to facilitate moving to Bootstrap 3, which doesn't have
a typeahead.

Signed-off-by: Elliot Smith <elliot.smith@intel.com>
---
 bitbake/LICENSE                                    |   2 +
 .../lib/toaster/toastergui/static/css/default.css  |  19 ++++
 .../lib/toaster/toastergui/static/js/libtoaster.js | 124 +++++++++------------
 .../toastergui/static/js/typeahead.jquery.min.js   |   7 ++
 bitbake/lib/toaster/toastergui/templates/base.html |   2 +
 5 files changed, 85 insertions(+), 69 deletions(-)
 create mode 100644 bitbake/lib/toaster/toastergui/static/js/typeahead.jquery.min.js

diff --git a/bitbake/LICENSE b/bitbake/LICENSE
index 8792f1b..447e2bb 100644
--- a/bitbake/LICENSE
+++ b/bitbake/LICENSE
@@ -8,4 +8,6 @@ Foundation and individual contributors.
 * Twitter Bootstrap (including Glyphicons), redistributed under the MIT license
 * jQuery is redistributed under the MIT license.
 
+* Twitter typeahead.js redistributed under the MIT license.
+
 * QUnit is redistributed under the MIT license.
diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index 2bba46f..1284de3 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -342,3 +342,22 @@ input.input-lg {
   line-height: 1.33333;
   padding: 10px 16px;
 }
+
+/* styling for standalone typeahead library */
+.tt-menu {
+  margin-top: 2px;
+  border-radius: 4px;
+  width: 100%;
+}
+
+.tt-suggestion {
+  cursor: pointer;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+
+.tt-suggestion.active {
+  background-color: #0081c2;
+  color: white;
+}
diff --git a/bitbake/lib/toaster/toastergui/static/js/libtoaster.js b/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
index 411b0cd..50d9c8f 100644
--- a/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
+++ b/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
@@ -3,96 +3,82 @@
  * This object really just helps readability since we can then have
  * a traceable namespace.
  */
-var libtoaster = (function (){
-
-  /* makeTypeahead parameters
-   * elementSelector: JQuery elementSelector string
-   * xhrUrl: the url to get the JSON from expects JSON in the form:
-   *  { "list": [ { "name": "test", "detail" : "a test thing"  }, .... ] }
+var libtoaster = (function () {
+  // prevent conflicts with Bootstrap 2's typeahead (required during
+  // transition from v2 to v3)
+  var typeahead = jQuery.fn.typeahead.noConflict();
+  jQuery.fn._typeahead = typeahead;
+
+  /* Make a typeahead from an input element
+   *
+   * _makeTypeahead parameters
+   * jQElement: input element as selected by $('selector')
+   * xhrUrl: the url to get the JSON from; this URL should return JSON in the
+   * format:
+   *   { "results": [ { "name": "test", "detail" : "a test thing"  }, ... ] }
    * xhrParams: the data/parameters to pass to the getJSON url e.g.
-   *  { 'type' : 'projects' } the text typed will be passed as 'search'.
-   *  selectedCB: function to call once an item has been selected one
-   *  arg of the item.
+   *   { 'type' : 'projects' }; the text typed will be passed as 'search'.
+   * selectedCB: function to call once an item has been selected; has
+   * signature selectedCB(item), where item is an item in the format shown
+   * in the JSON list above, i.e.
+   *   { "name": "name", "detail": "detail" }.
    */
-  function _makeTypeahead (jQElement, xhrUrl, xhrParams, selectedCB) {
-    if (!xhrUrl || xhrUrl.length === 0)
-      throw("No url to typeahead supplied");
+  function _makeTypeahead(jQElement, xhrUrl, xhrParams, selectedCB) {
+    if (!xhrUrl || xhrUrl.length === 0) {
+      throw("No url supplied for typeahead");
+    }
 
     var xhrReq;
 
-    jQElement.typeahead({
-        // each time the typeahead's choices change, a
-        // "typeahead-choices-change" event is fired with an object
-        // containing the available choices in a "choices" property
-        source: function(query, process){
+    jQElement._typeahead(
+      {
+        highlight: true,
+        classNames: {
+          open: "dropdown-menu",
+          cursor: "active"
+        }
+      },
+      {
+        source: function (query, syncResults, asyncResults) {
           xhrParams.search = query;
 
-          /* If we have a request in progress don't fire off another one*/
-          if (xhrReq)
+          // if we have a request in progress, cancel it and start another
+          if (xhrReq) {
             xhrReq.abort();
+          }
 
-          xhrReq = $.getJSON(xhrUrl, this.options.xhrParams, function(data){
+          xhrReq = $.getJSON(xhrUrl, xhrParams, function (data) {
             if (data.error !== "ok") {
-              console.log("Error getting data from server "+data.error);
+              console.error("Error getting data from server: " + data.error);
               return;
             }
 
             xhrReq = null;
 
-            jQElement.trigger("typeahead-choices-change", {choices: data.results});
-
-            return process(data.results);
+            asyncResults(data.results);
           });
         },
-        updater: function(item) {
-          var itemObj = this.$menu.find('.active').data('itemObject');
-          selectedCB(itemObj);
-          return item;
-        },
-        matcher: function(item) {
-          if (!item.hasOwnProperty('name')) {
-            console.log("Name property missing in data");
-            return 0;
-          }
 
-          if (this.$element.val().length === 0)
-            return 0;
-
-          return 1;
-        },
-        highlighter: function (item) {
-          /* Use jquery to escape the item name and detail */
-          var current = $("<span></span>").text(item.name + ' '+item.detail);
-          current = current.html();
-
-          var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
-          return current.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
-            return '<strong>' + match + '</strong>'
-          })
+        // how the selected item is shown in the input
+        display: function (item) {
+          return item.name;
         },
-        sorter: function (items) { return items; },
-        xhrUrl: xhrUrl,
-        xhrParams: xhrParams,
-        xhrReq: xhrReq,
-    });
-
-
-    /* Copy of bootstrap's render func but sets selectedObject value */
-    function customRenderFunc (items) {
-      var that = this;
-
-      items = $(items).map(function (i, item) {
-        i = $(that.options.item).attr('data-value', item.name).data('itemObject', item);
-        i.find('a').html(that.highlighter(item));
-        return i[0];
-      });
 
-      items.first().addClass('active');
-      this.$menu.html(items);
-      return this;
-    }
+        templates: {
+          // how the item is displayed in the dropdown
+          suggestion: function (item) {
+            var elt = document.createElement("div");
+            elt.innerHTML = item.name + " " + item.detail;
+            return elt;
+          }
+        }
+      }
+    );
 
-    jQElement.data('typeahead').render = customRenderFunc;
+    // when an item is selected using the typeahead, invoke the callback
+    jQElement.on("typeahead:select", function (event, item) {
+      selectedCB(item);
+    });
   }
 
   /* startABuild:
diff --git a/bitbake/lib/toaster/toastergui/static/js/typeahead.jquery.min.js b/bitbake/lib/toaster/toastergui/static/js/typeahead.jquery.min.js
new file mode 100644
index 0000000..962133a
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/js/typeahead.jquery.min.js
@@ -0,0 +1,7 @@
+/*!
+ * typeahead.js 0.11.1
+ * https://github.com/twitter/typeahead.js
+ * Copyright 2013-2015 Twitter, Inc. and other contributors; Licensed MIT
+ */
+
+!function(a,b){"function"==typeof define&&define.amd?define("typeahead.js",["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(a){var b=function(){"use strict";return{isMsie:function(){return/(msie|trident)/i.test(navigator.userAgent)?navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2]:!1},isBlankString:function(a){return!a||/^\s*$/.test(a)},escapeRegExChars:function(a){return a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isString:function(a){return"string"==typeof a},isNumber:function(a){return"number"==typeof a},isArray:a.isArray,isFunction:a.isFunction,isObject:a.isPlainObject,isUndefined:function(a){return"undefined"==typeof a},isElement:function(a){return!(!a||1!==a.nodeType)},isJQuery:function(b){return b instanceof a},toStr:function(a){return b.isUndefined(a)||null===a?"":a+""},bind:a.proxy,each:function(b,c){function d(a,b){return c(b,a)}a.each(b,d)},map:a.map,filter:a.grep,every:function(b,c){var d=!0;return b?(a.each(b,function(a,e){return(d=c.call(null,e,a,b))?void 0:!1}),!!d):d},some:function(b,c){var d=!1;return b?(a.each(b,function(a,e){return(d=c.call(null,e,a,b))?!1:void 0}),!!d):d},mixin:a.extend,identity:function(a){return a},clone:function(b){return a.extend(!0,{},b)},getIdGenerator:function(){var a=0;return function(){return a++}},templatify:function(b){function c(){return String(b)}return a.isFunction(b)?b:c},defer:function(a){setTimeout(a,0)},debounce:function(a,b,c){var d,e;return function(){var f,g,h=this,i=arguments;return f=function(){d=null,c||(e=a.apply(h,i))},g=c&&!d,clearTimeout(d),d=setTimeout(f,b),g&&(e=a.apply(h,i)),e}},throttle:function(a,b){var c,d,e,f,g,h;return g=0,h=function(){g=new Date,e=null,f=a.apply(c,d)},function(){var i=new Date,j=b-(i-g);return c=this,d=arguments,0>=j?(clearTimeout(e),e=null,g=i,f=a.apply(c,d)):e||(e=setTimeout(h,j)),f}},stringify:function(a){return b.isString(a)?a:JSON.stringify(a)},noop:function(){}}}(),c=function(){"use strict";function a(a){var g,h;return h=b.mixin({},f,a),g={css:e(),classes:h,html:c(h),selectors:d(h)},{css:g.css,html:g.html,classes:g.classes,selectors:g.selectors,mixin:function(a){b.mixin(a,g)}}}function c(a){return{wrapper:'<span class="'+a.wrapper+'"></span>',menu:'<div class="'+a.menu+'"></div>'}}function d(a){var c={};return b.each(a,function(a,b){c[b]="."+a}),c}function e(){var a={wrapper:{position:"relative",display:"inline-block"},hint:{position:"absolute",top:"0",left:"0",borderColor:"transparent",boxShadow:"none",opacity:"1"},input:{position:"relative",verticalAlign:"top",backgroundColor:"transparent"},inputWithNoHint:{position:"relative",verticalAlign:"top"},menu:{position:"absolute",top:"100%",left:"0",zIndex:"100",display:"none"},ltr:{left:"0",right:"auto"},rtl:{left:"auto",right:" 0"}};return b.isMsie()&&b.mixin(a.input,{backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"}),a}var f={wrapper:"twitter-typeahead",input:"tt-input",hint:"tt-hint",menu:"tt-menu",dataset:"tt-dataset",suggestion:"tt-suggestion",selectable:"tt-selectable",empty:"tt-empty",open:"tt-open",cursor:"tt-cursor",highlight:"tt-highlight"};return a}(),d=function(){"use strict";function c(b){b&&b.el||a.error("EventBus initialized without el"),this.$el=a(b.el)}var d,e;return d="typeahead:",e={render:"rendered",cursorchange:"cursorchanged",select:"selected",autocomplete:"autocompleted"},b.mixin(c.prototype,{_trigger:function(b,c){var e;return e=a.Event(d+b),(c=c||[]).unshift(e),this.$el.trigger.apply(this.$el,c),e},before:function(a){var b,c;return b=[].slice.call(arguments,1),c=this._trigger("before"+a,b),c.isDefaultPrevented()},trigger:function(a){var b;this._trigger(a,[].slice.call(arguments,1)),(b=e[a])&&this._trigger(b,[].slice.call(arguments,1))}}),c}(),e=function(){"use strict";function a(a,b,c,d){var e;if(!c)return this;for(b=b.split(i),c=d?h(c,d):c,this._callbacks=this._callbacks||{};e=b.shift();)this._callbacks[e]=this._callbacks[e]||{sync:[],async:[]},this._callbacks[e][a].push(c);return this}function b(b,c,d){return a.call(this,"async",b,c,d)}function c(b,c,d){return a.call(this,"sync",b,c,d)}function d(a){var b;if(!this._callbacks)return this;for(a=a.split(i);b=a.shift();)delete this._callbacks[b];return this}function e(a){var b,c,d,e,g;if(!this._callbacks)return this;for(a=a.split(i),d=[].slice.call(arguments,1);(b=a.shift())&&(c=this._callbacks[b]);)e=f(c.sync,this,[b].concat(d)),g=f(c.async,this,[b].concat(d)),e()&&j(g);return this}function f(a,b,c){function d(){for(var d,e=0,f=a.length;!d&&f>e;e+=1)d=a[e].apply(b,c)===!1;return!d}return d}function g(){var a;return a=window.setImmediate?function(a){setImmediate(function(){a()})}:function(a){setTimeout(function(){a()},0)}}function h(a,b){return a.bind?a.bind(b):function(){a.apply(b,[].slice.call(arguments,0))}}var i=/\s+/,j=g();return{onSync:c,onAsync:b,off:d,trigger:e}}(),f=function(a){"use strict";function c(a,c,d){for(var e,f=[],g=0,h=a.length;h>g;g++)f.push(b.escapeRegExChars(a[g]));return e=d?"\\b("+f.join("|")+")\\b":"("+f.join("|")+")",c?new RegExp(e):new RegExp(e,"i")}var d={node:null,pattern:null,tagName:"strong",className:null,wordsOnly:!1,caseSensitive:!1};return function(e){function f(b){var c,d,f;return(c=h.exec(b.data))&&(f=a.createElement(e.tagName),e.className&&(f.className=e.className),d=b.splitText(c.index),d.splitText(c[0].length),f.appendChild(d.cloneNode(!0)),b.parentNode.replaceChild(f,d)),!!c}function g(a,b){for(var c,d=3,e=0;e<a.childNodes.length;e++)c=a.childNodes[e],c.nodeType===d?e+=b(c)?1:0:g(c,b)}var h;e=b.mixin({},d,e),e.node&&e.pattern&&(e.pattern=b.isArray(e.pattern)?e.pattern:[e.pattern],h=c(e.pattern,e.caseSensitive,e.wordsOnly),g(e.node,f))}}(window.document),g=function(){"use strict";function c(c,e){c=c||{},c.input||a.error("input is missing"),e.mixin(this),this.$hint=a(c.hint),this.$input=a(c.input),this.query=this.$input.val(),this.queryWhenFocused=this.hasFocus()?this.query:null,this.$overflowHelper=d(this.$input),this._checkLanguageDirection(),0===this.$hint.length&&(this.setHint=this.getHint=this.clearHint=this.clearHintIfInvalid=b.noop)}function d(b){return a('<pre aria-hidden="true"></pre>').css({position:"absolute",visibility:"hidden",whiteSpace:"pre",fontFamily:b.css("font-family"),fontSize:b.css("font-size"),fontStyle:b.css("font-style"),fontVariant:b.css("font-variant"),fontWeight:b.css("font-weight"),wordSpacing:b.css("word-spacing"),letterSpacing:b.css("letter-spacing"),textIndent:b.css("text-indent"),textRendering:b.css("text-rendering"),textTransform:b.css("text-transform")}).insertAfter(b)}function f(a,b){return c.normalizeQuery(a)===c.normalizeQuery(b)}function g(a){return a.altKey||a.ctrlKey||a.metaKey||a.shiftKey}var h;return h={9:"tab",27:"esc",37:"left",39:"right",13:"enter",38:"up",40:"down"},c.normalizeQuery=function(a){return b.toStr(a).replace(/^\s*/g,"").replace(/\s{2,}/g," ")},b.mixin(c.prototype,e,{_onBlur:function(){this.resetInputValue(),this.trigger("blurred")},_onFocus:function(){this.queryWhenFocused=this.query,this.trigger("focused")},_onKeydown:function(a){var b=h[a.which||a.keyCode];this._managePreventDefault(b,a),b&&this._shouldTrigger(b,a)&&this.trigger(b+"Keyed",a)},_onInput:function(){this._setQuery(this.getInputValue()),this.clearHintIfInvalid(),this._checkLanguageDirection()},_managePreventDefault:function(a,b){var c;switch(a){case"up":case"down":c=!g(b);break;default:c=!1}c&&b.preventDefault()},_shouldTrigger:function(a,b){var c;switch(a){case"tab":c=!g(b);break;default:c=!0}return c},_checkLanguageDirection:function(){var a=(this.$input.css("direction")||"ltr").toLowerCase();this.dir!==a&&(this.dir=a,this.$hint.attr("dir",a),this.trigger("langDirChanged",a))},_setQuery:function(a,b){var c,d;c=f(a,this.query),d=c?this.query.length!==a.length:!1,this.query=a,b||c?!b&&d&&this.trigger("whitespaceChanged",this.query):this.trigger("queryChanged",this.query)},bind:function(){var a,c,d,e,f=this;return a=b.bind(this._onBlur,this),c=b.bind(this._onFocus,this),d=b.bind(this._onKeydown,this),e=b.bind(this._onInput,this),this.$input.on("blur.tt",a).on("focus.tt",c).on("keydown.tt",d),!b.isMsie()||b.isMsie()>9?this.$input.on("input.tt",e):this.$input.on("keydown.tt keypress.tt cut.tt paste.tt",function(a){h[a.which||a.keyCode]||b.defer(b.bind(f._onInput,f,a))}),this},focus:function(){this.$input.focus()},blur:function(){this.$input.blur()},getLangDir:function(){return this.dir},getQuery:function(){return this.query||""},setQuery:function(a,b){this.setInputValue(a),this._setQuery(a,b)},hasQueryChangedSinceLastFocus:function(){return this.query!==this.queryWhenFocused},getInputValue:function(){return this.$input.val()},setInputValue:function(a){this.$input.val(a),this.clearHintIfInvalid(),this._checkLanguageDirection()},resetInputValue:function(){this.setInputValue(this.query)},getHint:function(){return this.$hint.val()},setHint:function(a){this.$hint.val(a)},clearHint:function(){this.setHint("")},clearHintIfInvalid:function(){var a,b,c,d;a=this.getInputValue(),b=this.getHint(),c=a!==b&&0===b.indexOf(a),d=""!==a&&c&&!this.hasOverflow(),!d&&this.clearHint()},hasFocus:function(){return this.$input.is(":focus")},hasOverflow:function(){var a=this.$input.width()-2;return this.$overflowHelper.text(this.getInputValue()),this.$overflowHelper.width()>=a},isCursorAtEnd:function(){var a,c,d;return a=this.$input.val().length,c=this.$input[0].selectionStart,b.isNumber(c)?c===a:document.selection?(d=document.selection.createRange(),d.moveStart("character",-a),a===d.text.length):!0},destroy:function(){this.$hint.off(".tt"),this.$input.off(".tt"),this.$overflowHelper.remove(),this.$hint=this.$input=this.$overflowHelper=a("<div>")}}),c}(),h=function(){"use strict";function c(c,e){c=c||{},c.templates=c.templates||{},c.templates.notFound=c.templates.notFound||c.templates.empty,c.source||a.error("missing source"),c.node||a.error("missing node"),c.name&&!h(c.name)&&a.error("invalid dataset name: "+c.name),e.mixin(this),this.highlight=!!c.highlight,this.name=c.name||j(),this.limit=c.limit||5,this.displayFn=d(c.display||c.displayKey),this.templates=g(c.templates,this.displayFn),this.source=c.source.__ttAdapter?c.source.__ttAdapter():c.source,this.async=b.isUndefined(c.async)?this.source.length>2:!!c.async,this._resetLastSuggestion(),this.$el=a(c.node).addClass(this.classes.dataset).addClass(this.classes.dataset+"-"+this.name)}function d(a){function c(b){return b[a]}return a=a||b.stringify,b.isFunction(a)?a:c}function g(c,d){function e(b){return a("<div>").text(d(b))}return{notFound:c.notFound&&b.templatify(c.notFound),pending:c.pending&&b.templatify(c.pending),header:c.header&&b.templatify(c.header),footer:c.footer&&b.templatify(c.footer),suggestion:c.suggestion||e}}function h(a){return/^[_a-zA-Z0-9-]+$/.test(a)}var i,j;return i={val:"tt-selectable-display",obj:"tt-selectable-object"},j=b.getIdGenerator(),c.extractData=function(b){var c=a(b);return c.data(i.obj)?{val:c.data(i.val)||"",obj:c.data(i.obj)||null}:null},b.mixin(c.prototype,e,{_overwrite:function(a,b){b=b||[],b.length?this._renderSuggestions(a,b):this.async&&this.templates.pending?this._renderPending(a):!this.async&&this.templates.notFound?this._renderNotFound(a):this._empty(),this.trigger("rendered",this.name,b,!1)},_append:function(a,b){b=b||[],b.length&&this.$lastSuggestion.length?this._appendSuggestions(a,b):b.length?this._renderSuggestions(a,b):!this.$lastSuggestion.length&&this.templates.notFound&&this._renderNotFound(a),this.trigger("rendered",this.name,b,!0)},_renderSuggestions:function(a,b){var c;c=this._getSuggestionsFragment(a,b),this.$lastSuggestion=c.children().last(),this.$el.html(c).prepend(this._getHeader(a,b)).append(this._getFooter(a,b))},_appendSuggestions:function(a,b){var c,d;c=this._getSuggestionsFragment(a,b),d=c.children().last(),this.$lastSuggestion.after(c),this.$lastSuggestion=d},_renderPending:function(a){var b=this.templates.pending;this._resetLastSuggestion(),b&&this.$el.html(b({query:a,dataset:this.name}))},_renderNotFound:function(a){var b=this.templates.notFound;this._resetLastSuggestion(),b&&this.$el.html(b({query:a,dataset:this.name}))},_empty:function(){this.$el.empty(),this._resetLastSuggestion()},_getSuggestionsFragment:function(c,d){var e,g=this;return e=document.createDocumentFragment(),b.each(d,function(b){var d,f;f=g._injectQuery(c,b),d=a(g.templates.suggestion(f)).data(i.obj,b).data(i.val,g.displayFn(b)).addClass(g.classes.suggestion+" "+g.classes.selectable),e.appendChild(d[0])}),this.highlight&&f({className:this.classes.highlight,node:e,pattern:c}),a(e)},_getFooter:function(a,b){return this.templates.footer?this.templates.footer({query:a,suggestions:b,dataset:this.name}):null},_getHeader:function(a,b){return this.templates.header?this.templates.header({query:a,suggestions:b,dataset:this.name}):null},_resetLastSuggestion:function(){this.$lastSuggestion=a()},_injectQuery:function(a,c){return b.isObject(c)?b.mixin({_query:a},c):c},update:function(b){function c(a){g||(g=!0,a=(a||[]).slice(0,e.limit),h=a.length,e._overwrite(b,a),h<e.limit&&e.async&&e.trigger("asyncRequested",b))}function d(c){c=c||[],!f&&h<e.limit&&(e.cancel=a.noop,h+=c.length,e._append(b,c.slice(0,e.limit-h)),e.async&&e.trigger("asyncReceived",b))}var e=this,f=!1,g=!1,h=0;this.cancel(),this.cancel=function(){f=!0,e.cancel=a.noop,e.async&&e.trigger("asyncCanceled",b)},this.source(b,c,d),!g&&c([])},cancel:a.noop,clear:function(){this._empty(),this.cancel(),this.trigger("cleared")},isEmpty:function(){return this.$el.is(":empty")},destroy:function(){this.$el=a("<div>")}}),c}(),i=function(){"use strict";function c(c,d){function e(b){var c=f.$node.find(b.node).first();return b.node=c.length?c:a("<div>").appendTo(f.$node),new h(b,d)}var f=this;c=c||{},c.node||a.error("node is required"),d.mixin(this),this.$node=a(c.node),this.query=null,this.datasets=b.map(c.datasets,e)}return b.mixin(c.prototype,e,{_onSelectableClick:function(b){this.trigger("selectableClicked",a(b.currentTarget))},_onRendered:function(a,b,c,d){this.$node.toggleClass(this.classes.empty,this._allDatasetsEmpty()),this.trigger("datasetRendered",b,c,d)},_onCleared:function(){this.$node.toggleClass(this.classes.empty,this._allDatasetsEmpty()),this.trigger("datasetCleared")},_propagate:function(){this.trigger.apply(this,arguments)},_allDatasetsEmpty:function(){function a(a){return a.isEmpty()}return b.every(this.datasets,a)},_getSelectables:function(){return this.$node.find(this.selectors.selectable)},_removeCursor:function(){var a=this.getActiveSelectable();a&&a.removeClass(this.classes.cursor)},_ensureVisible:function(a){var b,c,d,e;b=a.position().top,c=b+a.outerHeight(!0),d=this.$node.scrollTop(),e=this.$node.height()+parseInt(this.$node.css("paddingTop"),10)+parseInt(this.$node.css("paddingBottom"),10),0>b?this.$node.scrollTop(d+b):c>e&&this.$node.scrollTop(d+(c-e))},bind:function(){var a,c=this;return a=b.bind(this._onSelectableClick,this),this.$node.on("click.tt",this.selectors.selectable,a),b.each(this.datasets,function(a){a.onSync("asyncRequested",c._propagate,c).onSync("asyncCanceled",c._propagate,c).onSync("asyncReceived",c._propagate,c).onSync("rendered",c._onRendered,c).onSync("cleared",c._onCleared,c)}),this},isOpen:function(){return this.$node.hasClass(this.classes.open)},open:function(){this.$node.addClass(this.classes.open)},close:function(){this.$node.removeClass(this.classes.open),this._removeCursor()},setLanguageDirection:function(a){this.$node.attr("dir",a)},selectableRelativeToCursor:function(a){var b,c,d,e;return c=this.getActiveSelectable(),b=this._getSelectables(),d=c?b.index(c):-1,e=d+a,e=(e+1)%(b.length+1)-1,e=-1>e?b.length-1:e,-1===e?null:b.eq(e)},setCursor:function(a){this._removeCursor(),(a=a&&a.first())&&(a.addClass(this.classes.cursor),this._ensureVisible(a))},getSelectableData:function(a){return a&&a.length?h.extractData(a):null},getActiveSelectable:function(){var a=this._getSelectables().filter(this.selectors.cursor).first();return a.length?a:null},getTopSelectable:function(){var a=this._getSelectables().first();return a.length?a:null},update:function(a){function c(b){b.update(a)}var d=a!==this.query;return d&&(this.query=a,b.each(this.datasets,c)),d},empty:function(){function a(a){a.clear()}b.each(this.datasets,a),this.query=null,this.$node.addClass(this.classes.empty)},destroy:function(){function c(a){a.destroy()}this.$node.off(".tt"),this.$node=a("<div>"),b.each(this.datasets,c)}}),c}(),j=function(){"use strict";function a(){i.apply(this,[].slice.call(arguments,0))}var c=i.prototype;return b.mixin(a.prototype,i.prototype,{open:function(){return!this._allDatasetsEmpty()&&this._show(),c.open.apply(this,[].slice.call(arguments,0))},close:function(){return this._hide(),c.close.apply(this,[].slice.call(arguments,0))},_onRendered:function(){return this._allDatasetsEmpty()?this._hide():this.isOpen()&&this._show(),c._onRendered.apply(this,[].slice.call(arguments,0))},_onCleared:function(){return this._allDatasetsEmpty()?this._hide():this.isOpen()&&this._show(),c._onCleared.apply(this,[].slice.call(arguments,0))},setLanguageDirection:function(a){return this.$node.css("ltr"===a?this.css.ltr:this.css.rtl),c.setLanguageDirection.apply(this,[].slice.call(arguments,0))},_hide:function(){this.$node.hide()},_show:function(){this.$node.css("display","block")}}),a}(),k=function(){"use strict";function c(c,e){var f,g,h,i,j,k,l,m,n,o,p;c=c||{},c.input||a.error("missing input"),c.menu||a.error("missing menu"),c.eventBus||a.error("missing event bus"),e.mixin(this),this.eventBus=c.eventBus,this.minLength=b.isNumber(c.minLength)?c.minLength:1,this.input=c.input,this.menu=c.menu,this.enabled=!0,this.active=!1,this.input.hasFocus()&&this.activate(),this.dir=this.input.getLangDir(),this._hacks(),this.menu.bind().onSync("selectableClicked",this._onSelectableClicked,this).onSync("asyncRequested",this._onAsyncRequested,this).onSync("asyncCanceled",this._onAsyncCanceled,this).onSync("asyncReceived",this._onAsyncReceived,this).onSync("datasetRendered",this._onDatasetRendered,this).onSync("datasetCleared",this._onDatasetCleared,this),f=d(this,"activate","open","_onFocused"),g=d(this,"deactivate","_onBlurred"),h=d(this,"isActive","isOpen","_onEnterKeyed"),i=d(this,"isActive","isOpen","_onTabKeyed"),j=d(this,"isActive","_onEscKeyed"),k=d(this,"isActive","open","_onUpKeyed"),l=d(this,"isActive","open","_onDownKeyed"),m=d(this,"isActive","isOpen","_onLeftKeyed"),n=d(this,"isActive","isOpen","_onRightKeyed"),o=d(this,"_openIfActive","_onQueryChanged"),p=d(this,"_openIfActive","_onWhitespaceChanged"),this.input.bind().onSync("focused",f,this).onSync("blurred",g,this).onSync("enterKeyed",h,this).onSync("tabKeyed",i,this).onSync("escKeyed",j,this).onSync("upKeyed",k,this).onSync("downKeyed",l,this).onSync("leftKeyed",m,this).onSync("rightKeyed",n,this).onSync("queryChanged",o,this).onSync("whitespaceChanged",p,this).onSync("langDirChanged",this._onLangDirChanged,this)}function d(a){var c=[].slice.call(arguments,1);return function(){var d=[].slice.call(arguments);b.each(c,function(b){return a[b].apply(a,d)})}}return b.mixin(c.prototype,{_hacks:function(){var c,d;c=this.input.$input||a("<div>"),d=this.menu.$node||a("<div>"),c.on("blur.tt",function(a){var e,f,g;e=document.activeElement,f=d.is(e),g=d.has(e).length>0,b.isMsie()&&(f||g)&&(a.preventDefault(),a.stopImmediatePropagation(),b.defer(function(){c.focus()}))}),d.on("mousedown.tt",function(a){a.preventDefault()})},_onSelectableClicked:function(a,b){this.select(b)},_onDatasetCleared:function(){this._updateHint()},_onDatasetRendered:function(a,b,c,d){this._updateHint(),this.eventBus.trigger("render",c,d,b)},_onAsyncRequested:function(a,b,c){this.eventBus.trigger("asyncrequest",c,b)},_onAsyncCanceled:function(a,b,c){this.eventBus.trigger("asynccancel",c,b)},_onAsyncReceived:function(a,b,c){this.eventBus.trigger("asyncreceive",c,b)},_onFocused:function(){this._minLengthMet()&&this.menu.update(this.input.getQuery())},_onBlurred:function(){this.input.hasQueryChangedSinceLastFocus()&&this.eventBus.trigger("change",this.input.getQuery())},_onEnterKeyed:function(a,b){var c;(c=this.menu.getActiveSelectable())&&this.select(c)&&b.preventDefault()},_onTabKeyed:function(a,b){var c;(c=this.menu.getActiveSelectable())?this.select(c)&&b.preventDefault():(c=this.menu.getTopSelectable())&&this.autocomplete(c)&&b.preventDefault()},_onEscKeyed:function(){this.close()},_onUpKeyed:function(){this.moveCursor(-1)},_onDownKeyed:function(){this.moveCursor(1)},_onLeftKeyed:function(){"rtl"===this.dir&&this.input.isCursorAtEnd()&&this.autocomplete(this.menu.getTopSelectable())},_onRightKeyed:function(){"ltr"===this.dir&&this.input.isCursorAtEnd()&&this.autocomplete(this.menu.getTopSelectable())},_onQueryChanged:function(a,b){this._minLengthMet(b)?this.menu.update(b):this.menu.empty()},_onWhitespaceChanged:function(){this._updateHint()},_onLangDirChanged:function(a,b){this.dir!==b&&(this.dir=b,this.menu.setLanguageDirection(b))},_openIfActive:function(){this.isActive()&&this.open()},_minLengthMet:function(a){return a=b.isString(a)?a:this.input.getQuery()||"",a.length>=this.minLength},_updateHint:function(){var a,c,d,e,f,h,i;a=this.menu.getTopSelectable(),c=this.menu.getSelectableData(a),d=this.input.getInputValue(),!c||b.isBlankString(d)||this.input.hasOverflow()?this.input.clearHint():(e=g.normalizeQuery(d),f=b.escapeRegExChars(e),h=new RegExp("^(?:"+f+")(.+$)","i"),i=h.exec(c.val),i&&this.input.setHint(d+i[1]))},isEnabled:function(){return this.enabled},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},isActive:function(){return this.active},activate:function(){return this.isActive()?!0:!this.isEnabled()||this.eventBus.before("active")?!1:(this.active=!0,this.eventBus.trigger("active"),!0)},deactivate:function(){return this.isActive()?this.eventBus.before("idle")?!1:(this.active=!1,this.close(),this.eventBus.trigger("idle"),!0):!0},isOpen:function(){return this.menu.isOpen()},open:function(){return this.isOpen()||this.eventBus.before("open")||(this.menu.open(),this._updateHint(),this.eventBus.trigger("open")),this.isOpen()},close:function(){return this.isOpen()&&!this.eventBus.before("close")&&(this.menu.close(),this.input.clearHint(),this.input.resetInputValue(),this.eventBus.trigger("close")),!this.isOpen()},setVal:function(a){this.input.setQuery(b.toStr(a))},getVal:function(){return this.input.getQuery()},select:function(a){var b=this.menu.getSelectableData(a);return b&&!this.eventBus.before("select",b.obj)?(this.input.setQuery(b.val,!0),this.eventBus.trigger("select",b.obj),this.close(),!0):!1},autocomplete:function(a){var b,c,d;return b=this.input.getQuery(),c=this.menu.getSelectableData(a),d=c&&b!==c.val,d&&!this.eventBus.before("autocomplete",c.obj)?(this.input.setQuery(c.val),this.eventBus.trigger("autocomplete",c.obj),!0):!1},moveCursor:function(a){var b,c,d,e,f;return b=this.input.getQuery(),c=this.menu.selectableRelativeToCursor(a),d=this.menu.getSelectableData(c),e=d?d.obj:null,f=this._minLengthMet()&&this.menu.update(b),f||this.eventBus.before("cursorchange",e)?!1:(this.menu.setCursor(c),d?this.input.setInputValue(d.val):(this.input.resetInputValue(),this._updateHint()),this.eventBus.trigger("cursorchange",e),!0)},destroy:function(){this.input.destroy(),this.menu.destroy()}}),c}();!function(){"use strict";function e(b,c){b.each(function(){var b,d=a(this);(b=d.data(p.typeahead))&&c(b,d)})}function f(a,b){return a.clone().addClass(b.classes.hint).removeData().css(b.css.hint).css(l(a)).prop("readonly",!0).removeAttr("id name placeholder required").attr({autocomplete:"off",spellcheck:"false",tabindex:-1})}function h(a,b){a.data(p.attrs,{dir:a.attr("dir"),autocomplete:a.attr("autocomplete"),spellcheck:a.attr("spellcheck"),style:a.attr("style")}),a.addClass(b.classes.input).attr({autocomplete:"off",spellcheck:!1});try{!a.attr("dir")&&a.attr("dir","auto")}catch(c){}return a}function l(a){return{backgroundAttachment:a.css("background-attachment"),backgroundClip:a.css("background-clip"),backgroundColor:a.css("background-color"),backgroundImage:a.css("background-image"),backgroundOrigin:a.css("background-origin"),backgroundPosition:a.css("background-position"),backgroundRepeat:a.css("background-repeat"),backgroundSize:a.css("background-size")}}function m(a){var c,d;c=a.data(p.www),d=a.parent().filter(c.selectors.wrapper),b.each(a.data(p.attrs),function(c,d){b.isUndefined(c)?a.removeAttr(d):a.attr(d,c)}),a.removeData(p.typeahead).removeData(p.www).removeData(p.attr).removeClass(c.classes.input),d.length&&(a.detach().insertAfter(d),d.remove())}function n(c){var d,e;return d=b.isJQuery(c)||b.isElement(c),e=d?a(c).first():[],e.length?e:null}var o,p,q;o=a.fn.typeahead,p={www:"tt-www",attrs:"tt-attrs",typeahead:"tt-typeahead"},q={initialize:function(e,l){function m(){var c,m,q,r,s,t,u,v,w,x,y;b.each(l,function(a){a.highlight=!!e.highlight}),c=a(this),m=a(o.html.wrapper),q=n(e.hint),r=n(e.menu),s=e.hint!==!1&&!q,t=e.menu!==!1&&!r,s&&(q=f(c,o)),t&&(r=a(o.html.menu).css(o.css.menu)),q&&q.val(""),c=h(c,o),(s||t)&&(m.css(o.css.wrapper),c.css(s?o.css.input:o.css.inputWithNoHint),c.wrap(m).parent().prepend(s?q:null).append(t?r:null)),y=t?j:i,u=new d({el:c}),v=new g({hint:q,input:c},o),w=new y({node:r,datasets:l},o),x=new k({input:v,menu:w,eventBus:u,minLength:e.minLength},o),c.data(p.www,o),c.data(p.typeahead,x)}var o;return l=b.isArray(l)?l:[].slice.call(arguments,1),e=e||{},o=c(e.classNames),this.each(m)},isEnabled:function(){var a;return e(this.first(),function(b){a=b.isEnabled()}),a},enable:function(){return e(this,function(a){a.enable()}),this},disable:function(){return e(this,function(a){a.disable()}),this},isActive:function(){var a;return e(this.first(),function(b){a=b.isActive()}),a},activate:function(){return e(this,function(a){a.activate()}),this},deactivate:function(){return e(this,function(a){a.deactivate()}),this},isOpen:function(){var a;return e(this.first(),function(b){a=b.isOpen()}),a},open:function(){return e(this,function(a){a.open()}),this},close:function(){return e(this,function(a){a.close()}),this},select:function(b){var c=!1,d=a(b);return e(this.first(),function(a){c=a.select(d)}),c},autocomplete:function(b){var c=!1,d=a(b);return e(this.first(),function(a){c=a.autocomplete(d)}),c},moveCursor:function(a){var b=!1;return e(this.first(),function(c){b=c.moveCursor(a)}),b},val:function(a){var b;return arguments.length?(e(this,function(b){b.setVal(a)}),this):(e(this.first(),function(a){b=a.getVal()}),b)},destroy:function(){return e(this,function(a,b){m(b),a.destroy()}),this}},a.fn.typeahead=function(a){return q[a]?q[a].apply(this,[].slice.call(arguments,1)):q.initialize.apply(this,arguments)},a.fn.typeahead.noConflict=function(){return a.fn.typeahead=o,this}}()});
\ No newline at end of file
diff --git a/bitbake/lib/toaster/toastergui/templates/base.html b/bitbake/lib/toaster/toastergui/templates/base.html
index 60ab68e..62f3699 100644
--- a/bitbake/lib/toaster/toastergui/templates/base.html
+++ b/bitbake/lib/toaster/toastergui/templates/base.html
@@ -22,6 +22,8 @@
     </script>
     <script src="{% static 'js/bootstrap.min.js' %}">
     </script>
+    <script src="{% static 'js/typeahead.jquery.min.js' %}">
+    </script>
     <script src="{% static 'js/prettify.js' %}">
     </script>
     <script src="{% static 'js/libtoaster.js' %}">
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 012/106] toaster: Layout fixes for project configuration
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (9 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 011/106] toaster: migrate typeahead library Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 013/106] toaster: Fix toaster table footer controls Belen Barros Pena
                   ` (92 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

Fix the layout and the lists of layers and targets in the project
configuration page.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../static/css/bootstrap3-transition.css           | 10 +++++
 .../toastergui/templates/baseprojectpage.html      | 34 +++++++-------
 .../toastergui/templates/projecttopbar.html        | 52 +++++++++++-----------
 3 files changed, 53 insertions(+), 43 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index 2fd7caf..0be56bf 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -22,3 +22,13 @@
 .modal-footer {
   background-color: #f5f5f5;
 }
+
+/* Project configuration page */
+
+ul.configuration-list {
+  margin-left: 0px;
+}
+
+.configuration-list .checkbox {
+  margin-top: 0;
+}
diff --git a/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html b/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html
index 8020376..0d12a36 100644
--- a/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html
+++ b/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html
@@ -21,24 +21,22 @@
   });
 </script>
 
-<div class="row">
-  <!-- only on config pages -->
-  <div id="config-nav" class="col-md-2">
-    <ul class="nav nav-list well">
-      <li><a class="nav-parent" href="{% url 'project' project.id %}">Configuration</a></li>
-      <li class="nav-header">Compatible metadata</li>
-      <li><a href="{% url 'projectcustomimages' project.id %}">Custom images</a></li>
-      <li><a href="{% url 'projectimagerecipes' project.id %}">Image recipes</a></li>
-      <li><a href="{% url 'projectsoftwarerecipes' project.id %}">Software recipes</a></li>
-      <li><a href="{% url 'projectmachines' project.id %}">Machines</a></li>
-      <li><a href="{% url 'projectlayers' project.id %}">Layers</a></li>
-      <li class="nav-header">Extra configuration</li>
-      <li><a href="{% url 'projectconf' project.id %}">BitBake variables</a></li>
-    </ul>
-  </div>
-  <div class="col-md-10">
-    {% block projectinfomain %}{% endblock %}
-  </div>
+<!-- only on config pages -->
+<div id="config-nav" class="col-md-2">
+  <ul class="nav nav-list well">
+    <li><a class="nav-parent" href="{% url 'project' project.id %}">Configuration</a></li>
+    <li class="nav-header">Compatible metadata</li>
+    <li><a href="{% url 'projectcustomimages' project.id %}">Custom images</a></li>
+    <li><a href="{% url 'projectimagerecipes' project.id %}">Image recipes</a></li>
+    <li><a href="{% url 'projectsoftwarerecipes' project.id %}">Software recipes</a></li>
+    <li><a href="{% url 'projectmachines' project.id %}">Machines</a></li>
+    <li><a href="{% url 'projectlayers' project.id %}">Layers</a></li>
+    <li class="nav-header">Extra configuration</li>
+    <li><a href="{% url 'projectconf' project.id %}">BitBake variables</a></li>
+  </ul>
+</div>
+<div class="col-md-10">
+  {% block projectinfomain %}{% endblock %}
 </div>
 
 {% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/projecttopbar.html b/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
index 426ded0..042599d 100644
--- a/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
+++ b/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
@@ -22,11 +22,12 @@
 </div>
 
 <!-- project name -->
-<div class="page-header">
-  <h1 id="project-name-container">
-    <span id="project-name">{{project.name}}</span>
+<div class="col-md-12">
+  <div class="page-header">
+    <h1 id="project-name-container">
+      <span id="project-name">{{project.name}}</span>
 
-    <i class="glyphicon glyphicon-pencil" data-original-title="" id="project-change-form-toggle" title=""></i>
+      <i class="glyphicon glyphicon-pencil" data-original-title="" id="project-change-form-toggle" title=""></i>
 
     {% if project.is_default %}
         <i class="icon-question-sign get-help heading-help" title="" data-original-title="This project shows information about the builds you start from the command line while Toaster is running"></i>
@@ -42,38 +43,39 @@
   </form>
 </div>
 
-{% if not project.is_default %}
+  {% if not project.is_default %}
   <div id="project-topbar">
     <ul class="nav nav-pills">
       <li id="topbar-configuration-tab">
-        <a href="{% url 'project' project.id %}">
-          Configuration
-        </a>
+      <a href="{% url 'project' project.id %}">
+        Configuration
+      </a>
       </li>
       <li>
-        <a href="{% url 'projectbuilds' project.id %}">
-          Builds ({{project.get_number_of_builds}})
-        </a>
+      <a href="{% url 'projectbuilds' project.id %}">
+        Builds ({{project.get_number_of_builds}})
+      </a>
       </li>
       <li>
-        <a href="{% url 'importlayer' project.id %}">
-          Import layer
-        </a>
+      <a href="{% url 'importlayer' project.id %}">
+        Import layer
+      </a>
       </li>
       <li>
-        <a href="{% url 'newcustomimage' project.id %}">
-          New custom image
-        </a>
+      <a href="{% url 'newcustomimage' project.id %}">
+        New custom image
+      </a>
       </li>
       <li class="pull-right">
-        <form class="form-inline" style="margin-bottom:0px;">
-          <i class="icon-question-sign get-help heading-help" data-placement="left" title="" data-original-title="Type the name of one or more recipes you want to build, separated by a space. You can also specify a task by appending a colon and a task name to the recipe name, like so: <code>busybox:clean</code>"></i>
-          <div class="input-append">
-            <input id="build-input" type="text" class="huge input-xlarge build-target-input" placeholder="Type the recipe you want to build" autocomplete="off" disabled>
-            <button id="build-button" class="btn btn-primary btn-large build-button" data-project-id="{{project.id}}" disabled>Build</button>
-          </div>
-        </form>
+      <form class="form-inline" style="margin-bottom:0px;">
+        <i class="icon-question-sign get-help heading-help" data-placement="left" title="" data-original-title="Type the name of one or more recipes you want to build, separated by a space. You can also specify a task by appending a colon and a task name to the recipe name, like so: <code>busybox:clean</code>"></i>
+        <div class="input-append">
+          <input id="build-input" type="text" class="huge input-xlarge build-target-input" placeholder="Type the recipe you want to build" autocomplete="off" disabled>
+          <button id="build-button" class="btn btn-primary btn-large build-button" data-project-id="{{project.id}}" disabled>Build</button>
+        </div>
+      </form>
       </li>
     </ul>
   </div>
-{% endif %}
+  {% endif %}
+</div>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 013/106] toaster: Fix toaster table footer controls
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (10 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 012/106] toaster: Layout fixes for project configuration Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 014/106] toaster: Fix layout of 'project builds' page Belen Barros Pena
                   ` (91 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

Center the pagination controls, and align vertically the label and select
controls of the "Show rows" menu.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css | 4 ++++
 bitbake/lib/toaster/toastergui/templates/toastertable.html          | 2 +-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index 0be56bf..e7f037d 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -18,6 +18,10 @@
   margin-left: 50%;
 }
 
+select[class^="pagesize-"]{
+  margin-bottom: 0;
+}
+
 /* Modal dialog */
 .modal-footer {
   background-color: #f5f5f5;
diff --git a/bitbake/lib/toaster/toastergui/templates/toastertable.html b/bitbake/lib/toaster/toastergui/templates/toastertable.html
index f046277..c022425 100644
--- a/bitbake/lib/toaster/toastergui/templates/toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/toastertable.html
@@ -91,7 +91,7 @@
 
   <!-- Pagination controls -->
   <div id="pagination-{{table_name}}">
-    <ul class="pagination">
+    <ul class="pagination pagination-centered">
     </ul>
 
     <div class="pull-right">
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 014/106] toaster: Fix layout of 'project builds' page
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (11 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 013/106] toaster: Fix toaster table footer controls Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 015/106] toaster: small changes to 'import layer' page Belen Barros Pena
                   ` (90 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

Set the content within a 12-column row.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../lib/toaster/toastergui/templates/projectbuilds-toastertable.html    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html b/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html
index a638967..9ad2ac1 100644
--- a/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html
@@ -16,7 +16,7 @@
 
   {% include "projecttopbar.html" %}
 
-  <div class="row">
+  <div class="col-md-12">
     {% with mru=mru mrb_type=mrb_type %}
       {% include 'mrb_section.html' %}
     {% endwith %}
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 015/106] toaster: small changes to 'import layer' page
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (12 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 014/106] toaster: Fix layout of 'project builds' page Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 016/106] toaster: Remove hovering from disabled buttons Belen Barros Pena
                   ` (89 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

Make the import button big, and match the content of the help text to
the labeling in the page.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/templates/importlayer.html | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/importlayer.html b/bitbake/lib/toaster/toastergui/templates/importlayer.html
index 798591e..321527c 100644
--- a/bitbake/lib/toaster/toastergui/templates/importlayer.html
+++ b/bitbake/lib/toaster/toastergui/templates/importlayer.html
@@ -119,8 +119,8 @@
                         <span class="help-inline">You can only add layers Toaster knows about</span>
                     </fieldset>
                     <div class="air" id="form-actions">
-                      <button class="btn btn-primary btn-lg" data-toggle="modal" id="import-and-add-btn" data-target="#dependencies-message" disabled>Import and add to project</button>
-                        <span class="help-inline" id="import-and-add-hint" style="vertical-align: middle;">To import a layer you need to enter a layer name, a Git repository URL and a revision (branch, tag or commit)</span>
+                      <button class="btn btn-primary btn-large" data-toggle="modal" id="import-and-add-btn" data-target="#dependencies-message" disabled>Import and add to project</button>
+                        <span class="help-inline" id="import-and-add-hint" style="vertical-align: middle;">To import a layer you need to enter a layer name, a Git repository URL and a Git revision (branch, tag or commit)</span>
                     </div>
                   </div>
                   </form>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 016/106] toaster: Remove hovering from disabled buttons
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (13 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 015/106] toaster: small changes to 'import layer' page Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 017/106] toaster: Fix layout in "new custom image" page Belen Barros Pena
                   ` (88 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

Our primary buttons colour was changing when you hovered over them,
creating a hovering effect. Remove the colour change, since disabled
components should not hover.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../toastergui/static/css/bootstrap3-transition.css       | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index e7f037d..2cddbc4 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -36,3 +36,18 @@ ul.configuration-list {
 .configuration-list .checkbox {
   margin-top: 0;
 }
+
+/* Remove the hovering from the .btn-primary buttons when they are disabled */
+
+.btn-primary.disabled.focus,
+.btn-primary.disabled:focus,
+.btn-primary.disabled:hover,
+.btn-primary.focus[disabled],
+.btn-primary[disabled]:focus,
+.btn-primary[disabled]:hover,
+fieldset[disabled] .btn-primary.focus,
+fieldset[disabled] .btn-primary:focus,
+fieldset[disabled] .btn-primary:hover {
+  background-color: #04c;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+}
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 017/106] toaster: Fix layout in "new custom image" page
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (14 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 016/106] toaster: Remove hovering from disabled buttons Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 018/106] toaster: table.js Fix the edit columns drop down Belen Barros Pena
                   ` (87 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

Wrap the table in a div with the correct class to provide appropriate
side whitespace to the content.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/templates/newcustomimage.html | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/newcustomimage.html b/bitbake/lib/toaster/toastergui/templates/newcustomimage.html
index 46aed90..f8a00d3 100644
--- a/bitbake/lib/toaster/toastergui/templates/newcustomimage.html
+++ b/bitbake/lib/toaster/toastergui/templates/newcustomimage.html
@@ -7,8 +7,10 @@
 {% include "newcustomimage_modal.html" %}
 {% include "projecttopbar.html" %}
 
-{% url table_name project.id as xhr_table_url %}
-<h2>{{title}} (<span class="table-count-{{table_name}}">0</span>)</h2>
-{% include "toastertable.html" %}
+<div class="col-md-12">
+  {% url table_name project.id as xhr_table_url %}
+  <h2>{{title}} (<span class="table-count-{{table_name}}">0</span>)</h2>
+  {% include "toastertable.html" %}
+</div>
 
 {% endblock %}
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 018/106] toaster: table.js Fix the edit columns drop down
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (15 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 017/106] toaster: Fix layout in "new custom image" page Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 019/106] toaster: templates Use old style icon classes Belen Barros Pena
                   ` (86 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

From: Michael Wood <michael.g.wood@intel.com>

The input checkbox needed to be before the label text.

Signed-off-by: Michael Wood <michael.g.wood@intel.com>
---
 bitbake/lib/toaster/toastergui/static/js/table.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/bitbake/lib/toaster/toastergui/static/js/table.js b/bitbake/lib/toaster/toastergui/static/js/table.js
index fbf0f07..9fda21b 100644
--- a/bitbake/lib/toaster/toastergui/static/js/table.js
+++ b/bitbake/lib/toaster/toastergui/static/js/table.js
@@ -251,7 +251,7 @@ function tableInit(ctx){
       tableHeadRow.append(header);
 
       /* Now setup the checkbox state and click handler */
-      var toggler = $('<li><label class="checkbox">'+col.title+'<input type="checkbox" id="checkbox-'+ col.field_name +'" class="col-toggle" value="'+col.field_name+'" /></label></li>');
+      var toggler = $('<li><label class="checkbox"><input type="checkbox" id="checkbox-'+ col.field_name +'" class="col-toggle" value="'+col.field_name+'" />'+col.title+'</label></li>');
 
       var togglerInput = toggler.find("input");
 
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 019/106] toaster: templates Use old style icon classes
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (16 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 018/106] toaster: table.js Fix the edit columns drop down Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 020/106] toaster: Fix breadcrumbs Belen Barros Pena
                   ` (85 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

From: Michael Wood <michael.g.wood@intel.com>

Stick with the old style icons as we customise these with font-awesome.

Signed-off-by: Michael Wood <michael.g.wood@intel.com>
---
 .../toaster/toastergui/static/js/layerdetails.js   |  8 ++++----
 .../lib/toaster/toastergui/static/js/libtoaster.js |  4 ++--
 .../toaster/toastergui/templates/customrecipe.html |  2 +-
 .../toaster/toastergui/templates/layer_btn.html    |  2 +-
 .../toaster/toastergui/templates/layerdetails.html | 24 +++++++++++-----------
 .../toastergui/templates/pkg_add_rm_btn.html       |  2 +-
 .../lib/toaster/toastergui/templates/project.html  |  4 ++--
 .../toaster/toastergui/templates/projectconf.html  | 18 ++++++++--------
 .../toastergui/templates/projecttopbar.html        |  2 +-
 9 files changed, 33 insertions(+), 33 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/js/layerdetails.js b/bitbake/lib/toaster/toastergui/static/js/layerdetails.js
index 7f4828e..d545406 100644
--- a/bitbake/lib/toaster/toastergui/static/js/layerdetails.js
+++ b/bitbake/lib/toaster/toastergui/static/js/layerdetails.js
@@ -98,7 +98,7 @@ function layerDetailsPageInit (ctx) {
     });
   });
 
-  $(".glyphicon glyphicon-pencil").click(function (){
+  $(".icon-pencil").click(function (){
     var mParent = $(this).parent("dd");
     mParent.prev().css("margin-top", "10px");
     mParent.children("form").slideDown();
@@ -134,7 +134,7 @@ function layerDetailsPageInit (ctx) {
         mParent.children(".delete-current-value").show();
       }
 
-      mParent.children(".glyphicon glyphicon-pencil").show();
+      mParent.children(".icon-pencil").show();
       mParent.prev().css("margin-top", "0px");
     });
   });
@@ -387,9 +387,9 @@ function layerDetailsPageInit (ctx) {
   });
 
 
-  layerDepsList.find(".glyphicon glyphicon-trash").click(layerDepRemoveClick);
+  layerDepsList.find(".icon-trash").click(layerDepRemoveClick);
   layerDepsList.find("a").tooltip();
-  $(".glyphicon glyphicon-trash").tooltip();
+  $(".icon-trash").tooltip();
   $(".commit").tooltip();
 
 }
diff --git a/bitbake/lib/toaster/toastergui/static/js/libtoaster.js b/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
index 50d9c8f..d48c7f7 100644
--- a/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
+++ b/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
@@ -557,8 +557,8 @@ $(document).ready(function() {
     // show task type and outcome in task details pages
     $(".task-info").tooltip({ container: 'body', html: true, delay: {show: 200}, placement: 'right' });
 
-    // initialise the tooltips for the glyphicon glyphicon-pencil icons
-    $(".glyphicon glyphicon-pencil").tooltip({ container: 'body', html: true, delay: {show: 400}, title: "Change" });
+    // initialise the tooltips for the icon-pencil icons
+    $(".icon-pencil").tooltip({ container: 'body', html: true, delay: {show: 400}, title: "Change" });
 
     // initialise the tooltips for the download icons
     $(".icon-download-alt").tooltip({ container: 'body', html: true, delay: { show: 200 } });
diff --git a/bitbake/lib/toaster/toastergui/templates/customrecipe.html b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
index ebf2fd2..6dbdf47 100644
--- a/bitbake/lib/toaster/toastergui/templates/customrecipe.html
+++ b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
@@ -233,7 +233,7 @@
           </dd>
       </dl>
       <!--
-      <i class="glyphicon glyphicon-trash no-tooltip"></i>
+      <i class="icon-trash no-tooltip"></i>
       <a href="#" class="error" id="delete">Delete custom image</a>
         -->
     </div>
diff --git a/bitbake/lib/toaster/toastergui/templates/layer_btn.html b/bitbake/lib/toaster/toastergui/templates/layer_btn.html
index d5ce9ff..1be29fe 100644
--- a/bitbake/lib/toaster/toastergui/templates/layer_btn.html
+++ b/bitbake/lib/toaster/toastergui/templates/layer_btn.html
@@ -3,7 +3,7 @@
     style="display:none;"
     {% endif %}
   >
-  <i class="glyphicon glyphicon-trash"></i>
+  <i class="icon-trash"></i>
   Remove layer
 </button>
 <button class="btn btn-block layer-add-{{data.pk}} layerbtn" data-layer='{ "id": {{data.pk}}, "name":  "{{data.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.pk%}"}' data-directive="add"
diff --git a/bitbake/lib/toaster/toastergui/templates/layerdetails.html b/bitbake/lib/toaster/toastergui/templates/layerdetails.html
index b4601ed..2f254da 100644
--- a/bitbake/lib/toaster/toastergui/templates/layerdetails.html
+++ b/bitbake/lib/toaster/toastergui/templates/layerdetails.html
@@ -24,13 +24,13 @@
 {# If this is not an imported layer then hide the edit ui #}
 {% if not layerversion.layer_source_id or layerversion.layer_source.sourcetype != layerversion.layer_source.TYPE_IMPORTED %}
 <style scoped>
- .glyphicon glyphicon-pencil {
+ .icon-pencil {
    display:none;
  }
 .delete-current-value{
   display: none;
 }
- li .glyphicon glyphicon-trash {
+ li .icon-trash {
    display:none;
  }
  .add-deps {
@@ -105,7 +105,7 @@
       </button>
       {% else %}
       <button id="add-remove-layer-btn" data-directive="remove" class="btn btn-block btn-lg btn-danger">
-        <span class="glyphicon glyphicon-trash"></span>
+        <span class="icon-trash"></span>
         Remove the {{layerversion.layer.name}} layer from your project
       </button>
       {% endif %}
@@ -130,7 +130,7 @@
                 <a href="#" style="display:none" class="btn btn-link cancel">Cancel</a>
               </div>
             </form>
-            <i class="glyphicon glyphicon-pencil" ></i>
+            <i class="icon-pencil" ></i>
           </dd>
           <dt>
             <i class="icon-question-sign get-help" title="Subdirectory within the repository where the layer is located, if not in the root (usually only used if the repository contains more than one layer)"></i>
@@ -149,8 +149,8 @@
                   <a href="#" style="display:none" class="btn btn-link cancel">Cancel</a>
                 </div>
               </form>
-              <i id="change-subdir" class="glyphicon glyphicon-pencil"></i>
-              <span class="glyphicon glyphicon-trash delete-current-value" data-toggle="tooltip" title="Delete"></span>
+              <i id="change-subdir" class="icon-pencil"></i>
+              <span class="icon-trash delete-current-value" data-toggle="tooltip" title="Delete"></span>
             </dd>
             <dt>
               <i class="icon-question-sign get-help" title="The Git branch, tag or commit"></i>
@@ -165,7 +165,7 @@
                     <a href="#" style="display:none" class="btn btn-link cancel">Cancel</a>
                   </div>
                 </form>
-                <i class="glyphicon glyphicon-pencil"></i>
+                <i class="icon-pencil"></i>
               </dd>
               <dt>
                 <i class="icon-question-sign get-help" title="Other layers this layer depends upon"></i>
@@ -176,7 +176,7 @@
                   {% for ld in layerversion.dependencies.all %}
                   <li data-layer-id="{{ld.depends_on.id}}">
                     <a data-toggle="tooltip" title="{{ld.depends_on.layer.vcs_url}} | {{ld.depends_on.get_vcs_reference}}" href="{% url 'layerdetails' project.id ld.depends_on.id %}">{{ld.depends_on.layer.name}}</a>
-                    <span class="glyphicon glyphicon-trash " data-toggle="tooltip" title="Delete"></span>
+                    <span class="icon-trash " data-toggle="tooltip" title="Delete"></span>
                   </li>
                   {% endfor %}
                 </ul>
@@ -244,8 +244,8 @@
                 <button class="btn change-btn" data-layer-prop="summary" type="button">Save</button>
                 <a href="#" class="btn btn-link cancel">Cancel</a>
               </form>
-              <i class="glyphicon glyphicon-pencil"></i>
-              <span class="glyphicon glyphicon-trash delete-current-value" data-toggle="tooltip" title="Delete"></span>
+              <i class="icon-pencil"></i>
+              <span class="icon-trash delete-current-value" data-toggle="tooltip" title="Delete"></span>
             </dd>
             <dt>
               Description
@@ -258,8 +258,8 @@
                 <button class="btn change-btn" data-layer-prop="description" type="button" >Save</button>
                 <a href="#" class="btn btn-link cancel">Cancel</a>
               </form>
-              <i class="glyphicon glyphicon-pencil"></i>
-              <span class="glyphicon glyphicon-trash delete-current-value" data-toggle="tooltip" title="Delete"></span>
+              <i class="icon-pencil"></i>
+              <span class="icon-trash delete-current-value" data-toggle="tooltip" title="Delete"></span>
             </dd>
             {% if layerversion.layer.up_id %}
             <dt>Layer index</dt>
diff --git a/bitbake/lib/toaster/toastergui/templates/pkg_add_rm_btn.html b/bitbake/lib/toaster/toastergui/templates/pkg_add_rm_btn.html
index 40eff15..0c71c8a 100644
--- a/bitbake/lib/toaster/toastergui/templates/pkg_add_rm_btn.html
+++ b/bitbake/lib/toaster/toastergui/templates/pkg_add_rm_btn.html
@@ -18,7 +18,7 @@
       display:none
       {% endif %}
       ">
-    <i class="glyphicon glyphicon-trash no-tooltip"></i>
+    <i class="icon-trash no-tooltip"></i>
     Remove package
   </button>
   <button class="btn btn-block add-rm-package-btn" data-directive="add" data-id="{{data.pk}}" data-package-url="{% url 'xhr_customrecipe_packages' extra.recipe_id data.pk %}" data-name="{{data.name}}" style="
diff --git a/bitbake/lib/toaster/toastergui/templates/project.html b/bitbake/lib/toaster/toastergui/templates/project.html
index cdcc83b..94c5a47 100644
--- a/bitbake/lib/toaster/toastergui/templates/project.html
+++ b/bitbake/lib/toaster/toastergui/templates/project.html
@@ -54,7 +54,7 @@
     <div class="well well-transparent" id="machine-section">
       <h3>Machine</h3>
 
-      <p class="lead"><span id="project-machine-name"></span> <i title="" data-original-title="" id="change-machine-toggle" class="glyphicon glyphicon-pencil"></i></p>
+      <p class="lead"><span id="project-machine-name"></span> <i title="" data-original-title="" id="change-machine-toggle" class="icon-pencil"></i></p>
 
       <form id="select-machine-form" style="display:none;">
         <div class="alert alert-info">
@@ -90,7 +90,7 @@
 
       <!-- Comment out the ability to change the project release, until we decide what to do with this functionality -->
 
-      <!--i title="" data-original-title="" id="release-change-toggle" class="glyphicon glyphicon-pencil"></i-->
+      <!--i title="" data-original-title="" id="release-change-toggle" class="icon-pencil"></i-->
       </p>
 
       <!-- Comment out the ability to change the project release, until we decide what to do with this functionality -->
diff --git a/bitbake/lib/toaster/toastergui/templates/projectconf.html b/bitbake/lib/toaster/toastergui/templates/projectconf.html
index 6f1a141..56d5c1f 100644
--- a/bitbake/lib/toaster/toastergui/templates/projectconf.html
+++ b/bitbake/lib/toaster/toastergui/templates/projectconf.html
@@ -17,7 +17,7 @@
             </dt>
             <dd class="lead">
                 <span id="distro">{{distro}}</span>
-                <i class="glyphicon glyphicon-pencil" id="change-distro-icon"></i>
+                <i class="icon-pencil" id="change-distro-icon"></i>
                 <form id="change-distro-form" style="display:none;">
                     <div class="input-append">
                         <span  id="edit-distro-name-div" class="control-group">
@@ -38,7 +38,7 @@
             </dt>
             <dd class="lead">
                 <span id="dl_dir"{% if dl_dir %}{%else%} class="muted"{%endif%}>{% if dl_dir %}{{dl_dir}}{%else%}Not set{%endif%}</span>
-                <i class="glyphicon glyphicon-pencil" id="change-dl_dir-icon"></i>
+                <i class="icon-pencil" id="change-dl_dir-icon"></i>
                 <form id="change-dl_dir-form" style="display:none;">
                     <div class="row">
                         <span class="help-block col-md-4">To set DL_DIR type the absolute path of the download folder.</span>
@@ -60,7 +60,7 @@
             </dt>
             <dd class="lead">
                 <span id="image_fstypes">{{fstypes}}</span>
-                <i class="glyphicon glyphicon-pencil" id="change-image_fstypes-icon"></i>
+                <i class="icon-pencil" id="change-image_fstypes-icon"></i>
                 <form id="change-image_fstypes-form" style="display:none;">
                     <label>Type the image types you want to build:</label>
                     <div class="input-append" id="validate-image_fstypes">
@@ -84,8 +84,8 @@
             </dt>
             <dd class="lead">
                 <span id="image_install"{% if image_install_append %}{%else%} class="muted"{%endif%}>{% if image_install_append %}{{image_install_append}}{%else%}Not set{%endif%}</span>
-                <i class="glyphicon glyphicon-pencil" id="change-image_install-icon"></i>
-                <i class="glyphicon glyphicon-trash" id="delete-image_install-icon" {% if image_install_append %}{%else%}style="display:none;"{%endif%}></i>
+                <i class="icon-pencil" id="change-image_install-icon"></i>
+                <i class="icon-trash" id="delete-image_install-icon" {% if image_install_append %}{%else%}style="display:none;"{%endif%}></i>
                 <form id="change-image_install-form" style="display:none;">
                     <div class="row">
                         <span class="help-block col-md-4">To set IMAGE_INSTALL_append to more than one package, type the package names separated by a space.</span>
@@ -106,7 +106,7 @@
             </dt>
             <dd class="lead">
                 <span id="package_classes">{{package_classes}}</span>
-                <i id="change-package_classes-icon" class="glyphicon glyphicon-pencil"></i>
+                <i id="change-package_classes-icon" class="icon-pencil"></i>
                 <form id="change-package_classes-form" style="display:none;">
                     <label>
                         Root file system package format
@@ -142,7 +142,7 @@
             </dt>
             <dd class="lead">
                 <span id="sstate_dir"{% if sstate_dir %}{%else%} class="muted"{%endif%}>{% if sstate_dir %}{{sstate_dir}}{%else%}Not set{%endif%}</span>
-                <i class="glyphicon glyphicon-pencil" id="change-sstate_dir-icon"></i>
+                <i class="icon-pencil" id="change-sstate_dir-icon"></i>
                 <form id="change-sstate_dir-form" style="display:none;">
                     <div class="row">
                         <span class="help-block col-md-4">To set SSTATE_DIR type the absolute path of the download folder.</span>
@@ -420,10 +420,10 @@
                     }
                 }
                 if (var_context == undefined) {
-                    orightml += '<div> <dt><span id="config_var_entry_'+configvars_sorted[i][2]+'" class="js-config-var-name"></span><i class="glyphicon glyphicon-trash js-icon-trash-config_var" id="config_var_trash_'+configvars_sorted[i][2]+'" x-data="'+configvars_sorted[i][2]+'"></i> </dt>'
+                    orightml += '<div> <dt><span id="config_var_entry_'+configvars_sorted[i][2]+'" class="js-config-var-name"></span><i class="icon-trash js-icon-trash-config_var" id="config_var_trash_'+configvars_sorted[i][2]+'" x-data="'+configvars_sorted[i][2]+'"></i> </dt>'
                     orightml += '<dd class="lead">'
                     orightml += '    <span id="config_var_value_'+configvars_sorted[i][2]+'"></span>'
-                    orightml += '    <i class="glyphicon glyphicon-pencil js-icon-pencil-config_var" x-data="'+configvars_sorted[i][2]+'"></i>'
+                    orightml += '    <i class="icon-pencil js-icon-pencil-config_var" x-data="'+configvars_sorted[i][2]+'"></i>'
                     orightml += '    <form id="change-config_var-form_'+configvars_sorted[i][2]+'" style="display:none;">'
                     orightml += '        <div class="input-append">'
                     orightml += '            <input type="text" class="input-xlarge js-new-config_var" id="new-config_var_'+configvars_sorted[i][2]+'" value="">'
diff --git a/bitbake/lib/toaster/toastergui/templates/projecttopbar.html b/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
index 042599d..1cf59a5 100644
--- a/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
+++ b/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
@@ -27,7 +27,7 @@
     <h1 id="project-name-container">
       <span id="project-name">{{project.name}}</span>
 
-      <i class="glyphicon glyphicon-pencil" data-original-title="" id="project-change-form-toggle" title=""></i>
+      <i class="icon-pencil" data-original-title="" id="project-change-form-toggle" title=""></i>
 
     {% if project.is_default %}
         <i class="icon-question-sign get-help heading-help" title="" data-original-title="This project shows information about the builds you start from the command line while Toaster is running"></i>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 020/106] toaster: Fix breadcrumbs
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (17 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 019/106] toaster: templates Use old style icon classes Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 021/106] toaster: Fix "custom image details" layout Belen Barros Pena
                   ` (84 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

Remove the "/" between list items and set the same white space between
list items and separators.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../toaster/toastergui/static/css/bootstrap3-transition.css   | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index 2cddbc4..497163b 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -33,6 +33,17 @@ ul.configuration-list {
   margin-left: 0px;
 }
 
+/* Breadcrumbs */
+
+.breadcrumb > li + li::before {
+  content: "";
+}
+
+.breadcrumb .divider {
+  color: #999;
+  padding-left: 10px;
+}
+
 .configuration-list .checkbox {
   margin-top: 0;
 }
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 021/106] toaster: Fix "custom image details" layout
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (18 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 020/106] toaster: Fix breadcrumbs Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 022/106] toaster: remove row from base template Belen Barros Pena
                   ` (83 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

Set the right grid markup for the page content, and correctly align
content and breadcrumb.

The patch also sets a sane length for the table search input field.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../static/css/bootstrap3-transition.css           |  18 +++
 .../toaster/toastergui/templates/customrecipe.html | 124 +++++++++++----------
 .../toaster/toastergui/templates/toastertable.html |   2 +-
 3 files changed, 82 insertions(+), 62 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index 497163b..ae861a7 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -35,6 +35,10 @@ ul.configuration-list {
 
 /* Breadcrumbs */
 
+.breadcrumb {
+  padding: 8px 0;
+}
+
 .breadcrumb > li + li::before {
   content: "";
 }
@@ -62,3 +66,17 @@ fieldset[disabled] .btn-primary:hover {
   background-color: #04c;
   border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
 }
+
+/* Table search input field */
+
+.navbar-search {
+  width: 60%;
+}
+
+.navbar-search .input-append {
+  width: 90%;
+}
+
+.navbar-search .input-append input[type="text"] {
+  width: 80%;
+}
diff --git a/bitbake/lib/toaster/toastergui/templates/customrecipe.html b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
index 6dbdf47..0cac42f 100644
--- a/bitbake/lib/toaster/toastergui/templates/customrecipe.html
+++ b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
@@ -5,7 +5,7 @@
 {% block pagecontent %}
 
 {% with recipe.get_base_recipe_file as base_recipe_file %}
-<div class="section">
+<div class="row">
   <ul class="breadcrumb">
     <li>
       <a href="{% url 'project' project.id %}">{{project.name}}</a>
@@ -89,21 +89,22 @@
 </div><!-- /.modal -->
 <!-- end package dependencies modal -->
 
-
-<div class="row col-md-11">
-  <div class="alert alert-success lead" id="image-created-notification" style="margin-top: 15px; display: none">
-    <button type="button" data-dismiss="alert" class="close">x</button>
-    Your custom image <strong>{{recipe.name}}</strong> has been created. You can now add or remove packages as needed.
-  </div>
-  <div class="page-header air">
-    <h1>
-      {{recipe.name}}
-      <small>({{recipe.layer_version.layer.name}})</small>
-    </h1>
+<div class="row">
+  <div class="col-md-12">
+    <div class="alert alert-success lead" id="image-created-notification" style="margin-top: 15px; display: none">
+      <button type="button" data-dismiss="alert" class="close">x</button>
+      Your custom image <strong>{{recipe.name}}</strong> has been created. You can now add or remove packages as needed.
+    </div>
+    <div class="page-header">
+      <h1>
+        {{recipe.name}}
+        <small>({{recipe.layer_version.layer.name}})</small>
+      </h1>
+    </div>
   </div>
 </div>
 
-<div class="row col-md-11">
+<div class="row">
   <div class="col-md-8">
     <div class="button-place btn-group" style="width: 100%">
       <a class="btn btn-large col-md-6 build-custom-image" href="#" style="width: 50%">
@@ -156,44 +157,44 @@
       </div>
       </div>
     </div>
-    <div class="col-md-4 well">
-      <h2 style="margin-bottom:20px;">About {{recipe.name}}</h2>
+    <div class="col-md-4">
+      <div class="well">
+        <h2 style="margin-bottom:20px;">About {{recipe.name}}</h2>
 
-      <dl>
-        <dt>
+        <dl>
+          <dt>
           Approx. packages included
           <i class="icon-question-sign get-help" title="" data-original-title="The number of packages included is based on information from previous builds and from parsing layers, so we can never be sure it is 100% accurate"></i>
-        </dt>
-        <dd id="total-num-packages">{{recipe.get_all_packages.count}}</dd>
-        <dt>
+          </dt>
+          <dd id="total-num-packages">{{recipe.get_all_packages.count}}</dd>
+          <dt>
           Approx. package size
           <i class="icon-question-sign get-help" title="" data-original-title="Package size is based on information from previous builds, so we can never be sure it is 100% accurate"></i>
-        </dt>
-        <dd id="total-size-packages">{{approx_pkg_size.size__sum|filtered_filesizeformat}}</dd>
-        {% if last_build %}
-        <dt>Last build</dt>
-        <dd>
+          </dt>
+          <dd id="total-size-packages">{{approx_pkg_size.size__sum|filtered_filesizeformat}}</dd>
+          {% if last_build %}
+          <dt>Last build</dt>
+          <dd>
           <i class="icon-ok-sign success"></i>
           <a href="{% url 'projectbuilds' project.id%}">{{last_build.completed_on|date:"d/m/y H:i"}}</a>
-        </dd>
-        {% endif %}
-        <dt>Layer</dt>
-        <dd><a href="{% url 'layerdetails' project.id recipe.layer_version.pk %}">{{recipe.layer_version.layer.name}}</a></dd>
-        <dt>Based on</dt>
-        <dd><a href="{% url 'recipedetails' project.id recipe.base_recipe.pk %}">{{recipe.base_recipe.name}}</a></dd>
-        {% if recipe.get_last_successful_built_target %}
-        {% with recipe.get_last_successful_built_target as last_build_target %}
-        <dt>Last build</dt>
-        <dd>
+          </dd>
+          {% endif %}
+          <dt>Layer</dt>
+          <dd><a href="{% url 'layerdetails' project.id recipe.layer_version.pk %}">{{recipe.layer_version.layer.name}}</a></dd>
+          <dt>Based on</dt>
+          <dd><a href="{% url 'recipedetails' project.id recipe.base_recipe.pk %}">{{recipe.base_recipe.name}}</a></dd>
+          {% if recipe.get_last_successful_built_target %}
+          {% with recipe.get_last_successful_built_target as last_build_target %}
+          <dt>Last build</dt>
+          <dd>
           <i class="icon-ok-sign success"></i>
           <a href="{% url 'builddashboard' last_build_target.build.pk %}">
             {{last_build_target.build.completed_on|date:"d/m/y H:i"}}</a>
-        </dd>
-        {% endwith %}
-        {% endif %}
-        {% if base_recipe_file %}
-        <dt>Recipe file</dt>
-        <dd>
+          </dd>
+          {% endwith %}
+          {% endif %}
+          <dt>Recipe file</dt>
+          <dd>
           <code>{{recipe.name}}_{{recipe.version}}.bb</code>
           <a href="{% url 'customrecipedownload' project.pk recipe.pk %}"><i class="icon-download-alt" title="Download recipe file"></i></a>
         </dd>
@@ -203,31 +204,31 @@
         {% if recipe.summary %}
         <dt>
           Summary
-        </dt>
-        <dd>
+          </dt>
+          <dd>
           {{recipe.summary}}
-        </dd>
-        {% endif %}
-        {% if recipe.description %}
-        <dt>
+          </dd>
+          {% endif %}
+          {% if recipe.description %}
+          <dt>
           Description
-        </dt>
-        <dd>
+          </dt>
+          <dd>
           {{recipe.description}}
-        </dd>
-        {% endif %}
-        <dt>Version</dt>
-        <dd>
+          </dd>
+          {% endif %}
+          <dt>Version</dt>
+          <dd>
           {{recipe.version}}
-        </dd>
-        {% if recipe.section %}
-        <dt>Section</dt>
-        <dd>
+          </dd>
+          {% if recipe.section %}
+          <dt>Section</dt>
+          <dd>
           {{recipe.section}}
-        </dd>
-        {% endif %}
-        <dt>License</dt>
-        <dd>
+          </dd>
+          {% endif %}
+          <dt>License</dt>
+          <dd>
           {{recipe.license}}
           <i class="icon-question-sign get-help" title="" data-original-title="All custom images have their license set to MIT. This is because the license applies only to the recipe (.bb) file, and not to the image itself. To see which licenses apply to the image you must check the license manifest generated with each build"></i>
           </dd>
@@ -236,6 +237,7 @@
       <i class="icon-trash no-tooltip"></i>
       <a href="#" class="error" id="delete">Delete custom image</a>
         -->
+      </div>
     </div>
   </div>
 
diff --git a/bitbake/lib/toaster/toastergui/templates/toastertable.html b/bitbake/lib/toaster/toastergui/templates/toastertable.html
index c022425..73724b5 100644
--- a/bitbake/lib/toaster/toastergui/templates/toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/toastertable.html
@@ -28,7 +28,7 @@
 <div class="row" id="no-results-{{table_name}}" style="display:none">
   <div class="alert">
     <form class="no-results input-append">
-      <input class="input-xxlarge" id="new-search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{%if request.GET.search %}{{request.GET.search}}{%endif%}"/>
+      <input id="new-search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{%if request.GET.search %}{{request.GET.search}}{%endif%}"/>
       <a href="#" class="input-append-addon btn remove-search-btn-{{table_name}}" tabindex="-1">
         <i class="glyphicon glyphicon-remove"></i>
       </a>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 022/106] toaster: remove row from base template
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (19 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 021/106] toaster: Fix "custom image details" layout Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 023/106] toaster: Fix image recipe details layout Belen Barros Pena
                   ` (82 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

A row in the base template caused duplicated row divs and issues with
the most complex layouts we use in the details pages. Remove the row from
the base template and set the rows in each template as needed instead.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/templates/base.html |  6 +-
 .../toastergui/templates/baseprojectpage.html      | 64 +++++++++++-----------
 .../toastergui/templates/builds-toastertable.html  |  2 +
 .../toaster/toastergui/templates/importlayer.html  |  2 +
 .../toastergui/templates/newcustomimage.html       | 15 +++--
 .../templates/projectbuilds-toastertable.html      |  2 +
 .../templates/projects-toastertable.html           | 58 ++++++++++----------
 7 files changed, 81 insertions(+), 68 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/base.html b/bitbake/lib/toaster/toastergui/templates/base.html
index 62f3699..0c305a2 100644
--- a/bitbake/lib/toaster/toastergui/templates/base.html
+++ b/bitbake/lib/toaster/toastergui/templates/base.html
@@ -120,10 +120,8 @@
     </div>
 
     <div class="container-fluid top-padded">
-      <div class="row">
-        {% block pagecontent %}
-        {% endblock %}
-      </div>
+      {% block pagecontent %}
+      {% endblock %}
     </div>
   </body>
 </html>
diff --git a/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html b/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html
index 0d12a36..483a485 100644
--- a/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html
+++ b/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html
@@ -7,37 +7,39 @@
 
 {% block pagecontent %}
 
-{% include "projecttopbar.html" %}
-<script type="text/javascript">
-  $(document).ready(function(){
-     $("#config-nav .nav li a").each(function(){
-       if (window.location.pathname === $(this).attr('href'))
-         $(this).parent().addClass('active');
-       else
-         $(this).parent().removeClass('active');
-     });
-
-     $("#topbar-configuration-tab").addClass("active")
-  });
-</script>
-
-<!-- only on config pages -->
-<div id="config-nav" class="col-md-2">
-  <ul class="nav nav-list well">
-    <li><a class="nav-parent" href="{% url 'project' project.id %}">Configuration</a></li>
-    <li class="nav-header">Compatible metadata</li>
-    <li><a href="{% url 'projectcustomimages' project.id %}">Custom images</a></li>
-    <li><a href="{% url 'projectimagerecipes' project.id %}">Image recipes</a></li>
-    <li><a href="{% url 'projectsoftwarerecipes' project.id %}">Software recipes</a></li>
-    <li><a href="{% url 'projectmachines' project.id %}">Machines</a></li>
-    <li><a href="{% url 'projectlayers' project.id %}">Layers</a></li>
-    <li class="nav-header">Extra configuration</li>
-    <li><a href="{% url 'projectconf' project.id %}">BitBake variables</a></li>
-  </ul>
-</div>
-<div class="col-md-10">
-  {% block projectinfomain %}{% endblock %}
-</div>
+<div class="row">
+  {% include "projecttopbar.html" %}
+  <script type="text/javascript">
+$(document).ready(function(){
+    $("#config-nav .nav li a").each(function(){
+      if (window.location.pathname === $(this).attr('href'))
+      $(this).parent().addClass('active');
+      else
+      $(this).parent().removeClass('active');
+      });
+
+    $("#topbar-configuration-tab").addClass("active")
+    });
+  </script>
+
+  <!-- only on config pages -->
+  <div id="config-nav" class="col-md-2">
+    <ul class="nav nav-list well">
+      <li><a class="nav-parent" href="{% url 'project' project.id %}">Configuration</a></li>
+      <li class="nav-header">Compatible metadata</li>
+      <li><a href="{% url 'projectcustomimages' project.id %}">Custom images</a></li>
+      <li><a href="{% url 'projectimagerecipes' project.id %}">Image recipes</a></li>
+      <li><a href="{% url 'projectsoftwarerecipes' project.id %}">Software recipes</a></li>
+      <li><a href="{% url 'projectmachines' project.id %}">Machines</a></li>
+      <li><a href="{% url 'projectlayers' project.id %}">Layers</a></li>
+      <li class="nav-header">Extra configuration</li>
+      <li><a href="{% url 'projectconf' project.id %}">BitBake variables</a></li>
+    </ul>
+  </div>
+  <div class="col-md-10">
+    {% block projectinfomain %}{% endblock %}
+  </div>
 
+</div>
 {% endblock %}
 
diff --git a/bitbake/lib/toaster/toastergui/templates/builds-toastertable.html b/bitbake/lib/toaster/toastergui/templates/builds-toastertable.html
index 9b4f3fe..0afe0a3 100644
--- a/bitbake/lib/toaster/toastergui/templates/builds-toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/builds-toastertable.html
@@ -13,6 +13,7 @@
 
 {% block pagecontent %}
 
+<div class="row">
   <div class="col-md-12">
     {% with mru=mru mrb_type=mrb_type %}
       {% include 'mrb_section.html' %}
@@ -25,6 +26,7 @@
     {% url 'builds' as xhr_table_url %}
     {% include 'toastertable.html' %}
   </div>
+</div>
 
   <script>
     $(document).ready(function () {
diff --git a/bitbake/lib/toaster/toastergui/templates/importlayer.html b/bitbake/lib/toaster/toastergui/templates/importlayer.html
index 321527c..765106c 100644
--- a/bitbake/lib/toaster/toastergui/templates/importlayer.html
+++ b/bitbake/lib/toaster/toastergui/templates/importlayer.html
@@ -5,6 +5,7 @@
 {% block title %} Import layer - {{project.name}} - Toaster {% endblock %}
 {% block pagecontent %}
 
+<div class="row">
 {% include "projecttopbar.html" %}
 
 
@@ -136,4 +137,5 @@
                       </div>
 
           {% endif %}
+</div>
 {% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/newcustomimage.html b/bitbake/lib/toaster/toastergui/templates/newcustomimage.html
index f8a00d3..980179a 100644
--- a/bitbake/lib/toaster/toastergui/templates/newcustomimage.html
+++ b/bitbake/lib/toaster/toastergui/templates/newcustomimage.html
@@ -5,12 +5,17 @@
 {% block pagecontent %}
 
 {% include "newcustomimage_modal.html" %}
-{% include "projecttopbar.html" %}
 
-<div class="col-md-12">
-  {% url table_name project.id as xhr_table_url %}
-  <h2>{{title}} (<span class="table-count-{{table_name}}">0</span>)</h2>
-  {% include "toastertable.html" %}
+<div class="row">
+
+  {% include "projecttopbar.html" %}
+
+  <div class="col-md-12">
+    {% url table_name project.id as xhr_table_url %}
+    <h2>{{title}} (<span class="table-count-{{table_name}}">0</span>)</h2>
+    {% include "toastertable.html" %}
+  </div>
+
 </div>
 
 {% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html b/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html
index 9ad2ac1..4118ebc 100644
--- a/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html
@@ -13,6 +13,7 @@
 {% block title %} {{title}} - {{project.name}} - Toaster {% endblock %}
 
 {% block pagecontent %}
+<div class="row">
 
   {% include "projecttopbar.html" %}
 
@@ -53,4 +54,5 @@
     });
   </script>
 
+</div>
 {% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/projects-toastertable.html b/bitbake/lib/toaster/toastergui/templates/projects-toastertable.html
index cfbe3ae..d8020a9 100644
--- a/bitbake/lib/toaster/toastergui/templates/projects-toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/projects-toastertable.html
@@ -4,37 +4,39 @@
 
 {% block pagecontent %}
 
-<div class="col-md-12">
-
-  <div class="page-header">
-    <h1 data-role="page-title"></h1>
-  </div>
-
-  {% url 'projects' as xhr_table_url %}
-  {% include 'toastertable.html' %}
-
-  <script>
-    $(document).ready(function () {
-      var tableElt = $("#{{table_name}}");
-      var titleElt = $("[data-role='page-title']");
-
-      tableElt.on("table-done", function (e, total, tableParams) {
-        var title = "All projects";
-
-        if (tableParams.search || tableParams.filter) {
-          if (total === 0) {
-            title = "No projects found";
-          }
-          else if (total > 0) {
-            title = total + " project" + (total > 1 ? 's' : '') + " found";
-          }
-        }
-
-        titleElt.text(title);
+<div class="row">
+  <div class="col-md-12">
+
+    <div class="page-header">
+      <h1 data-role="page-title"></h1>
+    </div>
+
+    {% url 'projects' as xhr_table_url %}
+    {% include 'toastertable.html' %}
+
+    <script>
+$(document).ready(function () {
+    var tableElt = $("#{{table_name}}");
+    var titleElt = $("[data-role='page-title']");
+
+    tableElt.on("table-done", function (e, total, tableParams) {
+      var title = "All projects";
+
+      if (tableParams.search || tableParams.filter) {
+      if (total === 0) {
+      title = "No projects found";
+      }
+      else if (total > 0) {
+      title = total + " project" + (total > 1 ? 's' : '') + " found";
+      }
+      }
+
+      titleElt.text(title);
       });
     });
-  </script>
+    </script>
 
+  </div>
 </div>
 
 {% endblock %}
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 023/106] toaster: Fix image recipe details layout
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (20 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 022/106] toaster: remove row from base template Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 024/106] toaster: Fix layer " Belen Barros Pena
                   ` (81 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

Adapt the layout to fit the Boostrap 3 grid.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../toastergui/templates/recipedetails.html        | 110 +++++++++++----------
 1 file changed, 57 insertions(+), 53 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/recipedetails.html b/bitbake/lib/toaster/toastergui/templates/recipedetails.html
index 95fa611..4dc88fa 100644
--- a/bitbake/lib/toaster/toastergui/templates/recipedetails.html
+++ b/bitbake/lib/toaster/toastergui/templates/recipedetails.html
@@ -4,7 +4,7 @@
 {% load static %}
 {% block pagecontent %}
 
-<div class="section">
+<div class="row">
   <ul class="breadcrumb">
     <li>
       <a href="{% url 'project' project.id %}">{{project.name}}</a>
@@ -51,37 +51,39 @@
 
 {% include 'newcustomimage_modal.html' %}
 
-<div class="row col-md-11">
-  <div class="alert alert-success lead" id="image-created-notification" style="margin-top: 15px; display: none">
-    <button type="button" data-dismiss="alert" class="close">x</button>
-    Your custom image <strong>{{recipe.name}}</strong> has been created. You can now add or remove packages as needed.
-  </div>
-  <div class="page-header air">
-    <h1>
-      {{recipe.name}}
-      <small>({{recipe.layer_version.layer.name}})</small>
-    </h1>
+<div class="row">
+  <div class="col-md-12">
+    <div class="alert alert-success lead" id="image-created-notification" style="margin-top: 15px; display: none">
+      <button type="button" data-dismiss="alert" class="close">x</button>
+      Your custom image <strong>{{recipe.name}}</strong> has been created. You can now add or remove packages as needed.
+    </div>
+    <div class="page-header">
+      <h1>
+        {{recipe.name}}
+        <small>({{recipe.layer_version.layer.name}})</small>
+      </h1>
+    </div>
   </div>
 </div>
 
-<div class="row col-md-11">
+<div class="row">
   <div class="col-md-8">
     <div class="button-place btn-group" id="customise-build-btns"
         style="width: 100%;
       {% if not in_project %}
       display:none;
       {% endif %}">
-      <button class="btn btn-lg col-md-6 build-recipe-btn" style="width: 50%">
+      <button class="btn btn-large col-md-6 build-recipe-btn" style="width: 50%">
         Build {{recipe.name}}
       </button>
       {% if recipe.is_image %}
-      <button class="btn btn-lg col-md-6 customise-btn" data-recipe="{{recipe.pk}}" style="width: 50%">
+      <button class="btn btn-large col-md-6 customise-btn" data-recipe="{{recipe.pk}}" style="width: 50%">
         Customise {{recipe.name}}
       </button>
       {% endif %}
     </div>
     <div class="button-place">
-      <button class="btn btn-block btn-lg" id="add-layer-btn"
+      <button class="btn btn-block btn-large" id="add-layer-btn"
           style="width:100%;
           {% if in_project %}
           display:none;
@@ -106,7 +108,7 @@
        style="display:none"
       {% endif %} >
         <p class="lead">Toaster has no package information for {{recipe.name}}. To generate package information, build {{recipe.name}}</p>
-        <button class="btn btn-info btn-lg build-recipe-btn" style="margin:20px 0 10px 0;">Build {{recipe.name}}</button>
+        <button class="btn btn-info btn-large build-recipe-btn" style="margin:20px 0 10px 0;">Build {{recipe.name}}</button>
       </div>
 
       <div class="alert alert-info air" id="packages-alert"
@@ -119,58 +121,60 @@
       </div>
     </div>
   </div>
-  <div class="col-md-4 well">
-    <h2 style="margin-bottom:20px;">About {{recipe.name}}</h2>
-    <dl>
-      <dt>
+  <div class="col-md-4">
+    <div class="well">
+      <h2 style="margin-bottom:20px;">About {{recipe.name}}</h2>
+      <dl>
+        <dt>
         Approx. packages included
         <i class="icon-question-sign get-help" title="" data-original-title="The number of packages included is based on information from previous builds and from parsing layers, so we can never be sure it is 100% accurate"></i>
-      </dt>
-      <dd class="no-packages">{{packages.count}}</dd>
-      <dt>
+        </dt>
+        <dd class="no-packages">{{packages.count}}</dd>
+        <dt>
         Approx. package size
         <i class="icon-question-sign get-help" title="" data-original-title="Package size is based on information from previous builds, so we can never be sure it is 100% accurate"></i>
-      </dt>
-      <dd>{{approx_pkg_size.size__sum|filtered_filesizeformat}}</dd>
-      {% if last_build %}
-      <dt>Last build</dt>
-      <dd>
+        </dt>
+        <dd>{{approx_pkg_size.size__sum|filtered_filesizeformat}}</dd>
+        {% if last_build %}
+        <dt>Last build</dt>
+        <dd>
         <i class="icon-ok-sign success"></i>
         <a href="{% url 'projectbuilds' project.id%}">{{last_build.completed_on|date:"d/m/y H:i"}}</a>
-      </dd>
-      {% endif %}
-      <dt>Recipe file</dt>
-      <dd>
+        </dd>
+        {% endif %}
+        <dt>Recipe file</dt>
+        <dd>
         <code>{{recipe.file_path|cut_path_prefix:recipe.layer_version.local_path}}</code>
         <a href="{{recipe.get_vcs_recipe_file_link_url}}"><i class="glyphicon glyphicon-share" title="" data-original-title="View recipe file"></i></a>
-      </dd> 
-      <dt>Layer</dt>
-      <dd><a href="{% url 'layerdetails' project.id recipe.layer_version.pk %}">{{recipe.layer_version.layer.name}}</a></dd>
-      <dt>
+        </dd> 
+        <dt>Layer</dt>
+        <dd><a href="{% url 'layerdetails' project.id recipe.layer_version.pk %}">{{recipe.layer_version.layer.name}}</a></dd>
+        <dt>
         Summary
-      </dt>
-      <dd>
+        </dt>
+        <dd>
         {{recipe.summary}}
-      </dd>
-      <dt>
+        </dd>
+        <dt>
         Description
-      </dt>
-      <dd>
+        </dt>
+        <dd>
         {{recipe.description}}
-      </dd>
-      <dt>Version</dt>
-      <dd>
+        </dd>
+        <dt>Version</dt>
+        <dd>
         {{recipe.version}}
-      </dd>
-      <dt>Section</dt>
-      <dd>
+        </dd>
+        <dt>Section</dt>
+        <dd>
         {{recipe.section}}
-      </dd>
-      <dt>License</dt>
-      <dd>
+        </dd>
+        <dt>License</dt>
+        <dd>
         {{recipe.license}}
-      </dd>
-    </dl>
+        </dd>
+      </dl>
+    </div>
   </div>
 </div>
 
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 024/106] toaster: Fix layer details layout
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (21 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 023/106] toaster: Fix image recipe details layout Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 025/106] toaster: Set correct margins for table search Belen Barros Pena
                   ` (80 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

Adapt layout to Bootstrap 3 grid.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../static/css/bootstrap3-transition.css           | 17 ++++++++
 .../toaster/toastergui/templates/layerdetails.html | 48 ++++++++++++----------
 .../toastergui/templates/toastertable-simple.html  |  4 +-
 3 files changed, 46 insertions(+), 23 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index ae861a7..714c30a 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -18,6 +18,7 @@
   margin-left: 50%;
 }
 
+
 select[class^="pagesize-"]{
   margin-bottom: 0;
 }
@@ -80,3 +81,19 @@ fieldset[disabled] .btn-primary:hover {
 .navbar-search .input-append input[type="text"] {
   width: 80%;
 }
+
+/* Definition lists in the layer details page */
+
+#information .dl-horizontal dd {
+  margin-left: 220px;
+}
+
+#information .dl-horizontal dt {
+  width: 200px;
+}
+
+/* Table controls in layer details pages */
+
+div[id^="table-chrome-"] .navbar-search {
+  margin-bottom: 20px;
+}
diff --git a/bitbake/lib/toaster/toastergui/templates/layerdetails.html b/bitbake/lib/toaster/toastergui/templates/layerdetails.html
index 2f254da..dc6018b 100644
--- a/bitbake/lib/toaster/toastergui/templates/layerdetails.html
+++ b/bitbake/lib/toaster/toastergui/templates/layerdetails.html
@@ -6,7 +6,7 @@
 {% block title %} {{layerversion.layer.name}} - {{project.name}} - Toaster {% endblock %}
 {% block pagecontent %}
 
-<div class="section">
+<div class="row">
   <ul class="breadcrumb">
     <li>
       <a href="{% url 'project' project.id %}">{{project.name}}</a>
@@ -69,18 +69,21 @@
   });
 </script>
 
-<div class="row col-md-11">
-  <div class="page-header">
-    <h1>{{layerversion.layer.name}} <small class="commit"
+<div class="row">
+  <div class="col-md-12">
+    <div class="page-header">
+      <h1>{{layerversion.layer.name}} <small class="commit"
           {% if layerversion.get_vcs_reference|length > 13 %}
-        data-toggle="tooltip" title="{{layerversion.get_vcs_reference}}"
-        {% endif %}>
-        ({{layerversion.get_vcs_reference|truncatechars:13}})</small></h1>
+          data-toggle="tooltip" title="{{layerversion.get_vcs_reference}}"
+          {% endif %}>
+          ({{layerversion.get_vcs_reference|truncatechars:13}})</small></h1>
+    </div>
   </div>
 </div>
 
+<div class="row">
 <!-- container for tabs -->
-<div class="row col-md-7 tabbable">
+<div class="col-md-8 tabbable">
   <div class="alert alert-info lead" id="alert-area" style="display:none">
     <button type="button" class="close" id="dismiss-alert">&times;</button>
     <span id="alert-msg"></span>
@@ -99,12 +102,12 @@
   <div class="tab-content">
     <span class="button-place">
       {% if layerversion.id not in projectlayers %}
-      <button id="add-remove-layer-btn" data-directive="add" class="btn btn-lg btn-block">
+      <button id="add-remove-layer-btn" data-directive="add" class="btn btn-large btn-block">
         <span class="glyphicon glyphicon-plus"></span>
         Add the {{layerversion.layer.name}} layer to your project
       </button>
       {% else %}
-      <button id="add-remove-layer-btn" data-directive="remove" class="btn btn-block btn-lg btn-danger">
+      <button id="add-remove-layer-btn" data-directive="remove" class="btn btn-block btn-large btn-danger">
         <span class="icon-trash"></span>
         Remove the {{layerversion.layer.name}} layer from your project
       </button>
@@ -228,15 +231,16 @@
           </div> <!-- end tab content -->
         </div> <!-- end tabable -->
 
-        <div class="row col-md-4 well"> <!-- info side panel -->
-          <h2>About {{layerversion.layer.name}}</h2>
-          <dl class="item-info">
+        <div class="col-md-4"> <!-- info side panel -->
+          <div class="well">
+            <h2>About {{layerversion.layer.name}}</h2>
+            <dl class="item-info">
 
-            <dt>
+              <dt>
               Summary
               <i class="icon-question-sign get-help" title="One-line description of the layer"></i>
-            </dt>
-            <dd>
+              </dt>
+              <dd>
               <span class="muted" style="display:none">Not set</span>
               <span class="current-value">{{layerversion.layer.summary|default_if_none:''}}</span>
               <form style="display:none; margin-bottom:20px">
@@ -249,8 +253,8 @@
             </dd>
             <dt>
               Description
-            </dt>
-            <dd>
+              </dt>
+              <dd>
               <span class="muted" style="display:none">Not set</span>
               <span class="current-value">{{layerversion.layer.description|default_if_none:''}}</span>
               <form style="display:none; margin-bottom:20px">
@@ -266,10 +270,12 @@
             <dd>
               <a href="http://layers.openembedded.org/layerindex/branch/{{layerversion.up_branch.name}}/layer/{{layerversion.layer.name}}">layer index link</a>
 
-          </dd>
-          {% endif %}
+              </dd>
+              {% endif %}
 
-        </dl>
+            </dl>
+        </div>
       </div>
+</div>
 
       {% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/toastertable-simple.html b/bitbake/lib/toaster/toastergui/templates/toastertable-simple.html
index 6ef220b..4357872 100644
--- a/bitbake/lib/toaster/toastergui/templates/toastertable-simple.html
+++ b/bitbake/lib/toaster/toastergui/templates/toastertable-simple.html
@@ -26,7 +26,7 @@
 
 {% include 'toastertable-filter.html' %}
 
-<div class="row" id="no-results-{{table_name}}" style="display:none">
+<div id="no-results-{{table_name}}" style="display:none">
   <div class="alert">
     <form class="no-results input-append">
       <input class="input-xlarge" id="new-search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>
@@ -41,7 +41,7 @@
 </div>
 <div id="table-container-{{table_name}}" style="visibility: hidden">
   <!-- control header -->
-  <div class="row" id="table-chrome-{{table_name}}">
+  <div id="table-chrome-{{table_name}}">
       <div class="navbar-search input-append pull-left">
 
         <input class="input-xlarge" id="search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 025/106] toaster: Set correct margins for table search
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (22 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 024/106] toaster: Fix layer " Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 027/106] toaster: Fix breadcrumb in build data pages Belen Barros Pena
                   ` (79 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

We need 2 versions: one for main tables and another one for tables in
details pages (like the recipes and machines tables in the layer details
page). For the first, we need 0 bottom margin. For the second, we need
20px of bottom margin.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index 714c30a..6031e2b 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -97,3 +97,7 @@ fieldset[disabled] .btn-primary:hover {
 div[id^="table-chrome-"] .navbar-search {
   margin-bottom: 20px;
 }
+
+div[id^="table-chrome-"] .navbar-inner > .navbar-search {
+  margin-bottom: 0px;
+}
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 027/106] toaster: Fix breadcrumb in build data pages
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (23 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 025/106] toaster: Set correct margins for table search Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 028/106] toaster: indentation fixes Belen Barros Pena
                   ` (78 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

The breadcrumb needs to be in its own row, to avoid the nested rows that
so badly upset the Bootstrap 3 grid system.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html b/bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html
index d286abb..5826d90 100644
--- a/bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html
+++ b/bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html
@@ -5,7 +5,6 @@
 
 <div class="row">
 <!-- Breadcrumbs -->
-    <div class="section">
         <ul class="breadcrumb" id="breadcrumb">
             <li><a href="{% project_url build.project %}">{{build.project.name}}</a></li>
             {% if not build.project.is_default %}
@@ -21,12 +20,10 @@
             $('#breadcrumb > li:last > span').remove();
         });
         </script>
-    </div> <!--section-->
+</div>
 
         <!-- Begin container -->
         {% block pagedetailinfomain %}{% endblock %}
         <!-- End container -->
 
-</div>
-
 {% endblock %}
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 028/106] toaster: indentation fixes
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (24 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 027/106] toaster: Fix breadcrumb in build data pages Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 029/106] toaster: Fix layout in build dashboard page Belen Barros Pena
                   ` (77 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

Just tidying up the indentation.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../toastergui/templates/basebuilddetailpage.html  | 38 +++++++++++-----------
 1 file changed, 19 insertions(+), 19 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html b/bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html
index 5826d90..3a4c383 100644
--- a/bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html
+++ b/bitbake/lib/toaster/toastergui/templates/basebuilddetailpage.html
@@ -4,26 +4,26 @@
 {% block pagecontent %}
 
 <div class="row">
-<!-- Breadcrumbs -->
-        <ul class="breadcrumb" id="breadcrumb">
-            <li><a href="{% project_url build.project %}">{{build.project.name}}</a></li>
-            {% if not build.project.is_default %}
-                <li><a href="{% url 'projectbuilds' build.project.id %}">Builds</a></li>
-            {% endif %}
-            <li><a href="{%url 'builddashboard' build.pk%}">{{build.get_sorted_target_list.0.target}} {%if build.target_set.all.count > 1%}(+{{build.target_set.all.count|add:"-1"}}){%endif%} {{build.machine}} ({{build.completed_on|date:"d/m/y H:i"}})</a></li>
-            {% block localbreadcrumb %}{% endblock %}
-        </ul>
-        <script>
-        $( function () {
-            $('#breadcrumb > li').append('<span class="divider">&rarr;</span>');
-            $('#breadcrumb > li:last').addClass("active");
-            $('#breadcrumb > li:last > span').remove();
-        });
-        </script>
+  <!-- Breadcrumbs -->
+  <ul class="breadcrumb" id="breadcrumb">
+    <li><a href="{% project_url build.project %}">{{build.project.name}}</a></li>
+    {% if not build.project.is_default %}
+    <li><a href="{% url 'projectbuilds' build.project.id %}">Builds</a></li>
+    {% endif %}
+    <li><a href="{%url 'builddashboard' build.pk%}">{{build.get_sorted_target_list.0.target}} {%if build.target_set.all.count > 1%}(+{{build.target_set.all.count|add:"-1"}}){%endif%} {{build.machine}} ({{build.completed_on|date:"d/m/y H:i"}})</a></li>
+    {% block localbreadcrumb %}{% endblock %}
+  </ul>
+  <script>
+$( function () {
+    $('#breadcrumb > li').append('<span class="divider">&rarr;</span>');
+    $('#breadcrumb > li:last').addClass("active");
+    $('#breadcrumb > li:last > span').remove();
+    });
+  </script>
 </div>
 
-        <!-- Begin container -->
-        {% block pagedetailinfomain %}{% endblock %}
-        <!-- End container -->
+<!-- Begin container -->
+{% block pagedetailinfomain %}{% endblock %}
+<!-- End container -->
 
 {% endblock %}
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 029/106] toaster: Fix layout in build dashboard page
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (25 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 028/106] toaster: indentation fixes Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 030/106] toaster: Fix breadcrumb in Chrome Belen Barros Pena
                   ` (76 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

Set the layout as per the Bootstrap 3 grid rules.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../toastergui/templates/builddashboard.html       | 60 +++++++++++-----------
 1 file changed, 31 insertions(+), 29 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/builddashboard.html b/bitbake/lib/toaster/toastergui/templates/builddashboard.html
index ca9b207..4482892 100644
--- a/bitbake/lib/toaster/toastergui/templates/builddashboard.html
+++ b/bitbake/lib/toaster/toastergui/templates/builddashboard.html
@@ -13,17 +13,15 @@
 
 {% block buildinfomain %}
 <!-- page title -->
-<div class="row col-md-10">
+<div class="col-md-10">
  <div class="page-header">
      <h1>{{build.target_set.all|dictsort:"target"|join:", "}} {{build.machine}}</h1>
  </div>
-</div>
 
 <!-- build result bar -->
-<div class="row col-md-10 pull-right">
   <div class="alert {%if build.outcome == build.SUCCEEDED%}alert-success{%elif build.outcome == build.FAILED%}alert-error{%else%}alert-info{%endif%}">
-    <div class="row lead">
-            <span class="pull-left"><strong>
+    <div class="lead">
+            <span><strong>
                 {%if build.outcome == build.SUCCEEDED%}Completed{%elif build.outcome == build.FAILED%}Failed{%else%}{%endif%}
               </strong> on
             {{build.completed_on|date:"d/m/y H:i"}}
@@ -50,10 +48,9 @@
 {%endif%}
     </div>
   </div>
-</div>
 
 {% if build.errors.count %}
-<div class="accordion col-md-10 pull-right" id="errors">
+<div class="accordion" id="errors">
   <div class="accordion-group">
     <div class="accordion-heading">
             <a class="accordion-toggle error toggle-errors">
@@ -81,7 +78,6 @@
 {%if build.outcome == build.SUCCEEDED%}
 <!-- built images -->
 {% if hasImages %}
-<div class="row col-md-10 pull-right">
     <h2>Images</h2>
     {% for target in targets %}
         {% if target.target.is_image %}
@@ -96,19 +92,21 @@
                         {% if target.targetHasNoImages %}
                 </dl>
                 <div class="row">
-                    <div class="alert alert-info col-md-7">
-                    <p>
-                                    <b>This build did not create any image files</b>
-                                  </p>
-                                  <p>
-                                    This is probably because valid image and license manifest
-                                    files from a previous build already exist in your
-                                    <code>.../poky/build/tmp/deploy</code>
-                                    directory. You can
-                                    also <a href="{% url 'targetpkg' build.pk target.target.pk %}">view the
-                                      license manifest information</a> in Toaster.
-                                  </p>
+                  <div class="col-md-7">
+                    <div class="alert alert-info">
+                      <p>
+                      <strong>This build did not create any image files</strong>
+                      </p>
+                      <p>
+                      This is probably because valid image and license manifest
+                      files from a previous build already exist in your
+                      <code>.../poky/build/tmp/deploy</code>
+                      directory. You can
+                      also <a href="{% url 'targetpkg' build.pk target.target.pk %}">view the
+                        license manifest information</a> in Toaster.
+                      </p>
                     </div>
+                  </div>
                 </div>
         {% else %}
             <dt>
@@ -140,7 +138,6 @@
     </div>
         {% endif %}
     {% endfor %}
-</div>
 {% endif %}
 
 {%else%}
@@ -149,7 +146,6 @@
 
 <!-- other artifacts -->
 {% if build.buildartifact_set.all.count > 0 %}
-<div class="row col-md-10 pull-right">
 <h2>Other artifacts</h2>
 
     <div class="well dashboard-section">
@@ -170,20 +166,22 @@
 	</dl>
     </div>
 
-</div>
 {% endif %}
 <!-- build summary -->
-<div class="row col-md-10 pull-right">
 <h2>Build summary</h2>
-    <div class="well col-md-4 dashboard-section" style="margin-left:0px;">
+  <div class="row">
+    <div class="col-md-4 dashboard-section">
+      <div class="well well-transparent">
         <h4><a href="{%url 'configuration' build.pk%}">Configuration</a></h4>
             <dl>
         <dt>Machine</dt><dd>{{build.machine}}</dd>
         <dt>Distro</dt><dd>{{build.distro}}</dd>
         <dt>Layers</dt>{% for i in build.layer_version_build.all|dictsort:"layer.name" %}<dd>{{i.layer.name}}</dd>{%endfor%}
             </dl>
+      </div>
     </div>
-    <div class="well col-md-4 dashboard-section">
+    <div class="col-md-4 dashboard-section">
+      <div class="well well-transparent">
         <h4><a href="{%url 'tasks' build.pk%}">Tasks</a></h4>
             <dl>
             {% query build.task_build outcome=4 order__gt=0 as exectask%}
@@ -230,18 +228,20 @@
 %
         </dd>
             </dl>
+      </div>
     </div>
-    <div class="well col-md-4 dashboard-section">
+    <div class="col-md-4 dashboard-section">
+      <div class="well well-transparent">
         <h4><a href="{% url 'recipes' build.pk %}">Recipes</a> & <a href="{% url 'packages' build.pk %}">Packages</a></h4>
             <dl>
         <dt>Recipes built</dt><dd><a href="{% url 'recipes' build.pk %}">{{recipecount}}</a></dd>
         <dt>Packages built</dt><dd><a href="{% url 'packages' build.pk %}">{{packagecount}}</a></dd>
             </dl>
     </div>
-</div>
+  </div>
 
 {% if build.warnings.count %}
-<div class="accordion col-md-10 pull-right" id="warnings">
+<div class="accordion" id="warnings">
   <div class="accordion-group">
     <div class="accordion-heading">
       <a class="accordion-toggle warning toggle-warnings">
@@ -266,6 +266,8 @@
 </div>
 {% endif %}
 
+</div> <!-- end 10 column row -->
+
 <script type="text/javascript">
     $(document).ready(function() {
         //show warnings section when requested from the previous page
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 030/106] toaster: Fix breadcrumb in Chrome
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (26 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 029/106] toaster: Fix layout in build dashboard page Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 031/106] toaster: Adjust width of non-toastertables search Belen Barros Pena
                   ` (75 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

Breadcrumb list items were wrapping because the content attribute was set
to an empty string that added a space. The correct way to override the
content property is setting it to 'none'. Removing the extra space
required adjustments to the breadcrumb padding.

The commit also does a bit of reorg in the css declarations.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../toaster/toastergui/static/css/bootstrap3-transition.css  | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index 6031e2b..250ac00 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -34,6 +34,10 @@ ul.configuration-list {
   margin-left: 0px;
 }
 
+.configuration-list .checkbox {
+  margin-top: 0;
+}
+
 /* Breadcrumbs */
 
 .breadcrumb {
@@ -41,16 +45,12 @@ ul.configuration-list {
 }
 
 .breadcrumb > li + li::before {
-  content: "";
+  content: none;
 }
 
 .breadcrumb .divider {
   color: #999;
-  padding-left: 10px;
-}
-
-.configuration-list .checkbox {
-  margin-top: 0;
+  padding: 0 5px;
 }
 
 /* Remove the hovering from the .btn-primary buttons when they are disabled */
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 031/106] toaster: Adjust width of non-toastertables search
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (27 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 030/106] toaster: Fix breadcrumb in Chrome Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 032/106] toaster: Alignment of table controls Belen Barros Pena
                   ` (74 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

In tables not using toaster tables (i.e. the ones in the build
information pages), the search text field was too long. This patch
reduces its width.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css | 4 ++++
 bitbake/lib/toaster/toastergui/templates/basetable_top.html         | 2 +-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index 250ac00..24f6b63 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -82,6 +82,10 @@ fieldset[disabled] .btn-primary:hover {
   width: 80%;
 }
 
+#search {
+  width: 60%;
+}
+
 /* Definition lists in the layer details page */
 
 #information .dl-horizontal dd {
diff --git a/bitbake/lib/toaster/toastergui/templates/basetable_top.html b/bitbake/lib/toaster/toastergui/templates/basetable_top.html
index e64be2d..afd6aad 100644
--- a/bitbake/lib/toaster/toastergui/templates/basetable_top.html
+++ b/bitbake/lib/toaster/toastergui/templates/basetable_top.html
@@ -161,7 +161,7 @@
 <!-- control header -->
 <div class="navbar">
     <div class="navbar-inner">
-        <form class="navbar-search input-append pull-left col-md-6" id="searchform">
+        <form class="navbar-search input-append" id="searchform">
             <input id="search" name="search" type="text" placeholder="Search {%if object_search_display %}{{object_search_display}}{%else%}{{objectname}}{%endif%}" value="{%if request.GET.search %}{{request.GET.search}}{% endif %}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{%endif%}
             <input type="hidden" name="orderby" value="{{request.GET.orderby}}">
             <input type="hidden" name="page" value="1">
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 032/106] toaster: Alignment of table controls
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (28 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 031/106] toaster: Adjust width of non-toastertables search Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 033/106] toaster: Fix pagination in non-toastertables Belen Barros Pena
                   ` (73 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

Because we have 3 different types of tables (toastertable,
toastertable-simple and non-toastertable), making all the controls look
the same required some fiddling with the mark up and the css rules.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../toaster/toastergui/static/css/bootstrap3-transition.css    | 10 +++++-----
 bitbake/lib/toaster/toastergui/templates/basetable_top.html    |  4 +++-
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index 24f6b63..c5e400e 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -96,12 +96,12 @@ fieldset[disabled] .btn-primary:hover {
   width: 200px;
 }
 
-/* Table controls in layer details pages */
+/* Table controls */
 
-div[id^="table-chrome-"] .navbar-search {
-  margin-bottom: 20px;
+.navbar-inner > .navbar-search .input-append {
+  margin-bottom: 5px;
 }
 
-div[id^="table-chrome-"] .navbar-inner > .navbar-search {
-  margin-bottom: 0px;
+.navbar-search.input-append {
+  margin-bottom: 20px;
 }
diff --git a/bitbake/lib/toaster/toastergui/templates/basetable_top.html b/bitbake/lib/toaster/toastergui/templates/basetable_top.html
index afd6aad..65ee17f 100644
--- a/bitbake/lib/toaster/toastergui/templates/basetable_top.html
+++ b/bitbake/lib/toaster/toastergui/templates/basetable_top.html
@@ -161,11 +161,13 @@
 <!-- control header -->
 <div class="navbar">
     <div class="navbar-inner">
-        <form class="navbar-search input-append" id="searchform">
+        <form class="navbar-search" id="searchform">
+          <div class="input-append">
             <input id="search" name="search" type="text" placeholder="Search {%if object_search_display %}{{object_search_display}}{%else%}{{objectname}}{%endif%}" value="{%if request.GET.search %}{{request.GET.search}}{% endif %}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{%endif%}
             <input type="hidden" name="orderby" value="{{request.GET.orderby}}">
             <input type="hidden" name="page" value="1">
             <button class="btn" id="search-button" type="submit" value="Search">Search</button>
+          </div>
         </form>
         <div class="pull-right">
 {% if tablecols %}
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 033/106] toaster: Fix pagination in non-toastertables
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (29 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 032/106] toaster: Alignment of table controls Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 034/106] toaster: Fix layout of packages installed page Belen Barros Pena
                   ` (72 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

Match the pagination controls in the non-toastertables tables to the
pagination controls in the toastertables tables.

We really need to kill those non-toastertables tables.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../toaster/toastergui/static/css/bootstrap3-transition.css  |  2 +-
 .../lib/toaster/toastergui/templates/basetable_bottom.html   | 12 +++++-------
 2 files changed, 6 insertions(+), 8 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index c5e400e..ebc0561 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -19,7 +19,7 @@
 }
 
 
-select[class^="pagesize-"]{
+select[class^="pagesize"] {
   margin-bottom: 0;
 }
 
diff --git a/bitbake/lib/toaster/toastergui/templates/basetable_bottom.html b/bitbake/lib/toaster/toastergui/templates/basetable_bottom.html
index ce023f5..80d5e11 100644
--- a/bitbake/lib/toaster/toastergui/templates/basetable_bottom.html
+++ b/bitbake/lib/toaster/toastergui/templates/basetable_bottom.html
@@ -2,12 +2,10 @@
     </table>
 
 <!-- Show pagination controls -->
-<div class="pagination pagination-centered">
-   <div class="pull-left">
-   Showing {{objects.start_index}} to {{objects.end_index}} out of {{objects.paginator.count}} entries.
-   </div>
+<div>
+   <!--span class="help-inline">Showing {{objects.start_index}} to {{objects.end_index}} out of {{objects.paginator.count}} entries.</span-->
 
-   <ul class="pagination" style="display: block-inline">
+   <ul class="pagination pagination-centered">
 {%if objects.has_previous %}
   <li><a href="javascript:reload_params({'page':{{objects.previous_page_number}}})">&laquo;</a></li>
 {%else%}
@@ -23,8 +21,8 @@
 {%endif%}
   </ul>
   <div class="pull-right">
-    <span class="help-inline" style="padding-top:5px;">Show rows:</span>
-    <select style="margin-top:5px;margin-bottom:0px;" class="pagesize">
+    <span class="help-inline">Show rows:</span>
+    <select class="pagesize">
       {% with "10 25 50 100 150" as list%}
         {% for i in list.split %}
             <option value="{{i}}">{{i}}</option>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 034/106] toaster: Fix layout of packages installed page
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (30 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 033/106] toaster: Fix pagination in non-toastertables Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 035/106] toaster: Fix layout of configuration page Belen Barros Pena
                   ` (71 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

Set the layout as per the Bootstrap 3 grid rules.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/templates/target.html | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/target.html b/bitbake/lib/toaster/toastergui/templates/target.html
index 5740cdc..9f31239 100644
--- a/bitbake/lib/toaster/toastergui/templates/target.html
+++ b/bitbake/lib/toaster/toastergui/templates/target.html
@@ -18,7 +18,8 @@
 
 {% block buildinfomain %}
 
-<div class="row col-md-10">
+<div class="col-md-10">
+
     <div class="page-header">
         <h1>
             {% if request.GET.search and objects.paginator.count > 0 %}
@@ -30,9 +31,9 @@
             {% endif %}
         </h1>
     </div>
-</div>
 
-<div class="row pull-right col-md-10" id="navTab">
+
+<div id="navTab">
     <ul class="nav nav-pills">
         <li class="active">
             <a href="#target">
@@ -51,7 +52,6 @@
     <div id="image-packages" class="tab-pane">
 
     {% if objects.paginator.count == 0 %}
-    <div class="row">
         <div class="alert">
             <form class="no-results input-append" id="searchform">
                 <input id="search" name="search" class="input-xxlarge" type="text" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
@@ -59,7 +59,6 @@
                 <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all packages</button>
             </form>
         </div>
-    </div>
 
 
     {% else %}
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 035/106] toaster: Fix layout of configuration page
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (31 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 034/106] toaster: Fix layout of packages installed page Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 036/106] toaster: Fix layout of variable history page Belen Barros Pena
                   ` (70 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

Set the layout as per the Bootstrap 3 grid rules.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../toastergui/templates/configuration.html        | 45 ++++++++++++----------
 1 file changed, 24 insertions(+), 21 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/configuration.html b/bitbake/lib/toaster/toastergui/templates/configuration.html
index 9e3bd64..83bc5b2 100644
--- a/bitbake/lib/toaster/toastergui/templates/configuration.html
+++ b/bitbake/lib/toaster/toastergui/templates/configuration.html
@@ -12,14 +12,14 @@
 
 {% block buildinfomain %}
 <!-- page title -->
-<div class="row col-md-10">
+<div class="col-md-10">
+
  <div class="page-header">
      <h1>Configuration</h1>
  </div>
-</div>
 
 <!-- configuration table -->
-<div class="row pull-right col-md-10" id="navTab">
+<div id="navTab">
 <ul class="nav nav-pills">
     <li class="active"><a href="#">Summary</a></li>
     <li class=""><a href="{% url 'configvars' build.id %}">BitBake variables</a></li>
@@ -44,29 +44,32 @@
           {% endfor %} </ul> </dd> {% endif %}
     </dl>
     <h3>Layers</h3>
-    <div class="col-md-9" style="margin-left:0px;">
-    <table class="table table-bordered table-hover">
-      <thead>
-        <tr>
-          <th>Layer</th>
-          <th>Layer branch</th>
-          <th>Layer commit</th>
-        </tr>
-      </thead>
-      <tbody>{% for lv in build.layer_version_build.all|dictsort:"layer.name" %}
-        <tr>
+    <div class="row">
+      <div class="col-md-9">
+        <table class="table table-bordered table-hover">
+          <thead>
+            <tr>
+              <th>Layer</th>
+              <th>Layer branch</th>
+              <th>Layer commit</th>
+            </tr>
+          </thead>
+          <tbody>{% for lv in build.layer_version_build.all|dictsort:"layer.name" %}
+          <tr>
             <td>{{lv.layer.name}}</td>
             <td>{{lv.branch}}</td>
             <td> <a class="btn" data-content="<ul class='list-unstyled'>
-                <li>{{lv.commit}}</li> </ul>">
-                    {{lv.commit|truncatechars:13}}
-                </a></td>
-        </tr>{% endfor %}
-      </tbody>
-    </table>
+                  <li>{{lv.commit}}</li> </ul>">
+                {{lv.commit|truncatechars:13}}
+            </a></td>
+          </tr>{% endfor %}
+          </tbody>
+        </table>
+      </div>
     </div>
   </div>
 
-
 </div>
+
+</div> <!-- end of 10-column section -->
 {% endblock %}
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 036/106] toaster: Fix layout of variable history page
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (32 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 035/106] toaster: Fix layout of configuration page Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 037/106] toaster: Fix layout in package details pages Belen Barros Pena
                   ` (69 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

Including the modal dialogs. Setting everything as per the Bootstrap 3
grid rules.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../toaster/toastergui/static/css/bootstrap3-transition.css | 11 +++++++++++
 bitbake/lib/toaster/toastergui/templates/configvars.html    | 13 +++++++------
 2 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index ebc0561..cbd9b75 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -105,3 +105,14 @@ fieldset[disabled] .btn-primary:hover {
 .navbar-search.input-append {
   margin-bottom: 20px;
 }
+
+/* Modal dialogs */
+
+.modal-dialog {
+  width: 700px;
+}
+
+.modal-body {
+  overflow-y: scroll;
+  max-height: 350px;
+}
diff --git a/bitbake/lib/toaster/toastergui/templates/configvars.html b/bitbake/lib/toaster/toastergui/templates/configvars.html
index fa6ed0f..aeb3cb8 100644
--- a/bitbake/lib/toaster/toastergui/templates/configvars.html
+++ b/bitbake/lib/toaster/toastergui/templates/configvars.html
@@ -12,7 +12,7 @@
 
 {% block buildinfomain %}
 <!-- page title -->
-<div class="row col-md-10">
+<div class="col-md-10">
  <div class="page-header">
  <h1>
   {% if request.GET.filter and objects.paginator.count > 0 or request.GET.search and objects.paginator.count > 0 %}
@@ -24,10 +24,9 @@
   {%endif%}
  </h1>
  </div>
-</div>
 
 <!-- configuration table -->
-<div class="row pull-right col-md-10" id="navTab">
+<div id="navTab">
   <ul class="nav nav-pills">
     <li class=""><a href="{% url 'configuration' build.id %}">Summary</a></li>
     <li class="active"><a href="#" >BitBake variables</a></li>
@@ -78,7 +77,7 @@
 <!-- file list popups -->
 {% for variable in objects %}
     {% if variable.vhistory.count %}
-    <div id="variable-{{variable.pk}}" class="modal hide fade" tabindex="-1" role="dialog">
+    <div id="variable-{{variable.pk}}" class="modal in fade" tabindex="-1" role="dialog">
       <div class="modal-dialog">
 	<div class="modal-content">
 	  <div class="modal-header">
@@ -98,10 +97,10 @@
 	    <span>{{variable.variable_value|string_slice:':570'}}
 	      <span class="full"> {{variable.variable_value|string_slice:'570:'}}
 	      </span>
-	      <a class="btn btn-xs full-show">...</a>
+	      <a class="btn btn-mini full-show">...</a>
 	    </span>
 	    </p>
-	    <a class="btn btn-xs full-hide">Collapse variable value <i class="icon-caret-up"></i>
+	    <a class="btn btn-mini full-hide">Collapse variable value <i class="icon-caret-up"></i>
 	    </a>
 	    {% endif %}
 	    {% else %}
@@ -134,4 +133,6 @@
 
 </div> <!-- buildinfomain -->
 
+</div> <!-- end 10-column section -->
+
 {% endblock %}
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 037/106] toaster: Fix layout in package details pages
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (33 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 036/106] toaster: Fix layout of variable history page Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 038/106] toaster: Fix layout in recipe details page Belen Barros Pena
                   ` (68 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

Set the layout as per Bootstrap 3 grid rules.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../toastergui/templates/package_detail_base.html      | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/package_detail_base.html b/bitbake/lib/toaster/toastergui/templates/package_detail_base.html
index 759f5b6..17562a8 100644
--- a/bitbake/lib/toaster/toastergui/templates/package_detail_base.html
+++ b/bitbake/lib/toaster/toastergui/templates/package_detail_base.html
@@ -43,21 +43,25 @@
 {% endblock localbreadcrumb %}
 
 {% block pagedetailinfomain %}
-    <div class="row col-md-11">
+    <div class="row">
+      <div class="col-md-12">
         <div class="page-header">
             {% block mainheading %}
             <h1>{{package.fullpackagespec}}</h1>
             {% endblock %}
         </div> <!-- page-header -->
-    </div> <!-- row col-md-11 page-header -->
+      </div> <!-- col-md-12 page-header -->
+    </div> <!-- end row -->
 
     {% block twocolumns %}
-    <div class="row col-md-7 tabbable">
+    <div class="row">
+    <div class="col-md-8 tabbable">
         {% block tabcontent %}
         {% endblock tabcontent %}
-    </div> <!-- row col-md-7 -->
+    </div> <!-- row col-md-8 -->
 
-    <div class="row col-md-4 well">
+    <div class="col-md-4">
+      <div class="well">
         <h2>Package information</h2>
 
         <!-- info presented as definition list -->
@@ -144,6 +148,8 @@
             <dd class="iscommit">{{package.recipe.layer_version.commit}}</dd>
 
         </dl>
-    </div> <!-- row4 well -->
+      <div> <!-- end well -->
+    </div> <!-- end 4-column section -->
     {% endblock twocolumns %}
+  </div> <!-- end row -->
 {% endblock pagedetailinfomain %}
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 038/106] toaster: Fix layout in recipe details page
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (34 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 037/106] toaster: Fix layout in package details pages Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 039/106] toaster: Fix layout in task " Belen Barros Pena
                   ` (67 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

Set the layout as per the Bootstrap 3 grid rules.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/default.css     |  2 +-
 .../toastergui/templates/detail_pagination_bottom.html    |  6 +++---
 .../toastergui/templates/detail_search_header.html        |  4 ++--
 bitbake/lib/toaster/toastergui/templates/recipe.html      | 13 ++++++++++---
 .../lib/toaster/toastergui/templates/recipe_packages.html | 15 +++++++++++----
 5 files changed, 27 insertions(+), 13 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index 1284de3..47603a7 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -100,7 +100,7 @@ td > .success:hover { text-decoration: underline; }
 th > a, th > span { font-weight: normal; }
 
 /* Force long strings like commit hashes to wrap */
-.iscommit { white-space: pre-wrap; word-break: break-all; word-wrap: break-word;}
+.iscommit { word-break: break-all; word-wrap: break-word;}
 
 /* Make the popovers scrollable if they are too long */
 .popover-content { max-height: 30em; overflow-y: scroll; }
diff --git a/bitbake/lib/toaster/toastergui/templates/detail_pagination_bottom.html b/bitbake/lib/toaster/toastergui/templates/detail_pagination_bottom.html
index f40c21d..a2ee6b2 100644
--- a/bitbake/lib/toaster/toastergui/templates/detail_pagination_bottom.html
+++ b/bitbake/lib/toaster/toastergui/templates/detail_pagination_bottom.html
@@ -6,8 +6,8 @@
 
 {# only paginate if 10 or more rows unfiltered, all pages #}
 {% if object_count >= 10 %}
-<div class="pagination">
-  <ul>
+<div>
+  <ul class="pagination pagination-centered">
 {%if objects.has_previous %}
     <li><a href="javascript:reload_params({'page':{{objects.previous_page_number}}})">&laquo;</a></li>
 {%else%}
@@ -24,7 +24,7 @@
   </ul>
 
   <div class="pull-right">
-    <span class="help-inline" style="padding-bottom:10px;">Show rows:</span>
+    <span class="help-inline">Show rows:</span>
     <select class="pagesize">
       {% with "10 25 50 100 150" as list%}
         {% for i in list.split %}
diff --git a/bitbake/lib/toaster/toastergui/templates/detail_search_header.html b/bitbake/lib/toaster/toastergui/templates/detail_search_header.html
index ec01fe5..996b617 100644
--- a/bitbake/lib/toaster/toastergui/templates/detail_search_header.html
+++ b/bitbake/lib/toaster/toastergui/templates/detail_search_header.html
@@ -18,7 +18,7 @@ $(document).ready(function() {
   });
 });
 </script>
-<div class="row">
+
 {% if objects.paginator.count > 10 or request.GET.search %}
   {% if objects.paginator.count == 0 %}
   <div class="alert">
@@ -65,4 +65,4 @@ $(document).ready(function() {
   </div>
   {% endif %}
 {% endif %}
-</div> {# row #}
+
diff --git a/bitbake/lib/toaster/toastergui/templates/recipe.html b/bitbake/lib/toaster/toastergui/templates/recipe.html
index 2887288..2aaff6b 100644
--- a/bitbake/lib/toaster/toastergui/templates/recipe.html
+++ b/bitbake/lib/toaster/toastergui/templates/recipe.html
@@ -12,13 +12,16 @@
 
 <!-- Begin container -->
 
-<div class="row col-md-11">
+<div class="row">
+  <div class="col-md-12">
     <div class="page-header">
         <h1>{{object.name}}_{{object.version}}</h1>
     </div>
+  </div>
 </div>
 
-<div class="row col-md-7 tabbable">
+<div class="row">
+  <div class="col-md-8 tabbable">
     <ul class="nav nav-pills">
         <li class="{{tab_states.1}}">
             <a href="#information" data-toggle="tab">
@@ -231,7 +234,8 @@
     </div>
 </div>
 
-<div class="row col-md-4 well">
+<div class="col-md-4">
+  <div class="well">
     <h2>About {{object.name}}</h2>
     <dl class="item-info">
         {% if object.summary %}
@@ -262,6 +266,9 @@
             <dd>{{object.license}}</dd>
         {% endif %}
     </dl>
+  </div>
 </div>
 
+</div> <!-- end row -->
+
 {% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/recipe_packages.html b/bitbake/lib/toaster/toastergui/templates/recipe_packages.html
index d337421..2c2efd8 100644
--- a/bitbake/lib/toaster/toastergui/templates/recipe_packages.html
+++ b/bitbake/lib/toaster/toastergui/templates/recipe_packages.html
@@ -11,13 +11,16 @@
 
 <!-- Begin container -->
 
-<div class="row col-md-11">
+<div class="row">
+  <div class="col-md-12">
     <div class="page-header">
         <h1>{{recipe.name}}_{{recipe.version}}</h1>
     </div>
+  </div>
 </div>
 
-<div class="row col-md-7 tabbable">
+<div class="row">
+  <div class="col-md-8 tabbable">
     <ul class="nav nav-pills">
         <li>
             <a href="{% url "recipe" build.pk recipe.id "1" %}">
@@ -86,9 +89,10 @@
             {% endif %}
         </div> {# tab-pane #}
     </div> {# tab-content #}
-</div> {# col-md-7 #}
+</div> {# col-md-8 #}
 
-<div class="row col-md-4 well">
+<div class="col-md-4">
+  <div class="well">
     <h2>About {{recipe.name}}</h2>
     <dl class="item-info">
         {% if recipe.summary %}
@@ -119,5 +123,8 @@
             <dd>{{recipe.license}}</dd>
         {% endif %}
     </dl>
+  </div>
 </div>
+
+</div> <!-- end row -->
 {% endblock pagedetailinfomain %}
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 039/106] toaster: Fix layout in task details page
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (35 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 038/106] toaster: Fix layout in recipe details page Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 040/106] toaster: revert auto change to icon class for spinner Belen Barros Pena
                   ` (66 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

Set the layout as per the Bootstrap 3 grid rules and apply new
definition list styles to this page as well.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css | 4 ++--
 bitbake/lib/toaster/toastergui/templates/task.html                  | 6 ++++--
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index cbd9b75..26e468f 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -88,11 +88,11 @@ fieldset[disabled] .btn-primary:hover {
 
 /* Definition lists in the layer details page */
 
-#information .dl-horizontal dd {
+.dl-horizontal dd {
   margin-left: 220px;
 }
 
-#information .dl-horizontal dt {
+.dl-horizontal dt {
   width: 200px;
 }
 
diff --git a/bitbake/lib/toaster/toastergui/templates/task.html b/bitbake/lib/toaster/toastergui/templates/task.html
index 9250ff5..8773351 100644
--- a/bitbake/lib/toaster/toastergui/templates/task.html
+++ b/bitbake/lib/toaster/toastergui/templates/task.html
@@ -11,7 +11,8 @@
 
 {% block pagedetailinfomain %}
 
-<div class="row col-md-11">
+<div class="row">
+  <div class="col-md-12">
     <div class="page-header">
         <h1><a href="{%url 'recipe' build.pk task.recipe.pk %}">{{task.recipe.name}}_{{task.recipe.version}}</a> {{task.task_name}}</h1>
     </div>
@@ -153,8 +154,8 @@
     <dd>
         {{task.sstate_checksum}}
     </dd>
-</dl>
     {% if task.sstate_result != task.SSTATE_NA %}
+  </dl>
         <div class="alert alert-info">Attempting to restore output from sstate cache
             <i class="icon-question-sign get-help get-help-blue" title="The build system is searching for the task output in your <code>sstate-cache</code> directory and mirrors. If the build system finds the task output, it will reuse it instead of building it from scratch by running the real task. Reusing the task output makes the build faster"></i>
         </div>
@@ -273,5 +274,6 @@
     </dl>
 
 </div>
+
 {% endblock %}
 
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 040/106] toaster: revert auto change to icon class for spinner
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (36 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 039/106] toaster: Fix layout in task " Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 041/106] toaster: Remove the pagination-centered class Belen Barros Pena
                   ` (65 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

From: Michael Wood <michael.g.wood@intel.com>

Revert the change to the spinner class that was done by the auto convert
tool for bootstrap as this was a falsely matched.

Signed-off-by: Michael Wood <michael.g.wood@intel.com>
---
 bitbake/lib/toaster/toastergui/templates/base.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/base.html b/bitbake/lib/toaster/toastergui/templates/base.html
index 0c305a2..1c0f88c 100644
--- a/bitbake/lib/toaster/toastergui/templates/base.html
+++ b/bitbake/lib/toaster/toastergui/templates/base.html
@@ -65,7 +65,7 @@
 
     {% csrf_token %}
     <div id="loading-notification" class="alert lead text-center" style="display:none">
-      Loading <i class="fa-pulse glyphicon glyphicon-spinner"></i>
+      Loading <i class="fa-pulse icon-spinner"></i>
     </div>
 
     <div id="change-notification" class="alert lead alert-info" style="display:none">
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 041/106] toaster: Remove the pagination-centered class
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (37 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 040/106] toaster: revert auto change to icon class for spinner Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:38 ` [PATCH 042/106] toaster: Style typeaheads Belen Barros Pena
                   ` (64 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

It didn't do a very good job in centering the pagination controls across
our different types of tables. Removing this class left-aligns the
pagination to the table. It should still work fine, and makes things
easier.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css  | 5 -----
 bitbake/lib/toaster/toastergui/templates/basetable_bottom.html       | 2 +-
 .../lib/toaster/toastergui/templates/detail_pagination_bottom.html   | 2 +-
 bitbake/lib/toaster/toastergui/templates/toastertable-simple.html    | 2 +-
 bitbake/lib/toaster/toastergui/templates/toastertable.html           | 2 +-
 5 files changed, 4 insertions(+), 9 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index 26e468f..f8a5f9d 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -14,11 +14,6 @@
   margin: 0 0 40px 0;
 }
 
-.pagination-centered {
-  margin-left: 50%;
-}
-
-
 select[class^="pagesize"] {
   margin-bottom: 0;
 }
diff --git a/bitbake/lib/toaster/toastergui/templates/basetable_bottom.html b/bitbake/lib/toaster/toastergui/templates/basetable_bottom.html
index 80d5e11..96f405c 100644
--- a/bitbake/lib/toaster/toastergui/templates/basetable_bottom.html
+++ b/bitbake/lib/toaster/toastergui/templates/basetable_bottom.html
@@ -5,7 +5,7 @@
 <div>
    <!--span class="help-inline">Showing {{objects.start_index}} to {{objects.end_index}} out of {{objects.paginator.count}} entries.</span-->
 
-   <ul class="pagination pagination-centered">
+   <ul class="pagination">
 {%if objects.has_previous %}
   <li><a href="javascript:reload_params({'page':{{objects.previous_page_number}}})">&laquo;</a></li>
 {%else%}
diff --git a/bitbake/lib/toaster/toastergui/templates/detail_pagination_bottom.html b/bitbake/lib/toaster/toastergui/templates/detail_pagination_bottom.html
index a2ee6b2..211548b 100644
--- a/bitbake/lib/toaster/toastergui/templates/detail_pagination_bottom.html
+++ b/bitbake/lib/toaster/toastergui/templates/detail_pagination_bottom.html
@@ -7,7 +7,7 @@
 {# only paginate if 10 or more rows unfiltered, all pages #}
 {% if object_count >= 10 %}
 <div>
-  <ul class="pagination pagination-centered">
+  <ul class="pagination">
 {%if objects.has_previous %}
     <li><a href="javascript:reload_params({'page':{{objects.previous_page_number}}})">&laquo;</a></li>
 {%else%}
diff --git a/bitbake/lib/toaster/toastergui/templates/toastertable-simple.html b/bitbake/lib/toaster/toastergui/templates/toastertable-simple.html
index c713524..e0a203d 100644
--- a/bitbake/lib/toaster/toastergui/templates/toastertable-simple.html
+++ b/bitbake/lib/toaster/toastergui/templates/toastertable-simple.html
@@ -77,7 +77,7 @@
 
   <!-- Pagination controls -->
   <div id="pagination-{{table_name}}">
-    <ul class="pagination pagination-centered">
+    <ul class="pagination">
     </ul>
 
     <div class="pull-right">
diff --git a/bitbake/lib/toaster/toastergui/templates/toastertable.html b/bitbake/lib/toaster/toastergui/templates/toastertable.html
index 73724b5..4f79632 100644
--- a/bitbake/lib/toaster/toastergui/templates/toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/toastertable.html
@@ -91,7 +91,7 @@
 
   <!-- Pagination controls -->
   <div id="pagination-{{table_name}}">
-    <ul class="pagination pagination-centered">
+    <ul class="pagination">
     </ul>
 
     <div class="pull-right">
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 042/106] toaster: Style typeaheads
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (38 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 041/106] toaster: Remove the pagination-centered class Belen Barros Pena
@ 2016-05-24 11:38 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 043/106] toaster: Fix filters Belen Barros Pena
                   ` (63 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:38 UTC (permalink / raw)
  To: toaster

Our suggestions needed some padding, hovering states and a bit more
space to display.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../static/css/bootstrap3-transition.css           | 27 ++++++++++++++++++++++
 .../lib/toaster/toastergui/templates/project.html  |  2 +-
 .../toastergui/templates/projecttopbar.html        |  2 +-
 3 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index f8a5f9d..f3ddbe2 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -111,3 +111,30 @@ fieldset[disabled] .btn-primary:hover {
   overflow-y: scroll;
   max-height: 350px;
 }
+
+/* Typeahead */
+
+.tt-menu {
+  width: 120%;
+  padding: 10px 8px;
+}
+
+.tt-suggestion {
+  padding: 3px 8px;
+  cursor: pointer;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+
+.tt-suggestion.active,
+.tt-suggestion:hover {
+  background-color: #0081c2;
+  color: white;
+}
+
+/* Build form */
+
+#build-input {
+  width: 20em;
+}
diff --git a/bitbake/lib/toaster/toastergui/templates/project.html b/bitbake/lib/toaster/toastergui/templates/project.html
index 94c5a47..045a89f 100644
--- a/bitbake/lib/toaster/toastergui/templates/project.html
+++ b/bitbake/lib/toaster/toastergui/templates/project.html
@@ -123,7 +123,7 @@
 
 	<div class="col-lg-ff6">
 	  <div class="input-append">
-	    <input id="layer-add-input" autocomplete="off" placeholder="Type a layer name" data-minlength="1" data-autocomplete="off" data-provide="typeahead" data-source="" type="text">
+	    <input id="layer-add-input" class="input-xlarge" autocomplete="off" placeholder="Type a layer name" data-minlength="1" data-autocomplete="off" data-provide="typeahead" data-source="" type="text">
 	      <button id="add-layer-btn" class="btn" disabled>Add</button>
 	  </div>
 	</div>
diff --git a/bitbake/lib/toaster/toastergui/templates/projecttopbar.html b/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
index 1cf59a5..d619516 100644
--- a/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
+++ b/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
@@ -70,7 +70,7 @@
       <form class="form-inline" style="margin-bottom:0px;">
         <i class="icon-question-sign get-help heading-help" data-placement="left" title="" data-original-title="Type the name of one or more recipes you want to build, separated by a space. You can also specify a task by appending a colon and a task name to the recipe name, like so: <code>busybox:clean</code>"></i>
         <div class="input-append">
-          <input id="build-input" type="text" class="huge input-xlarge build-target-input" placeholder="Type the recipe you want to build" autocomplete="off" disabled>
+          <input id="build-input" type="text" class="huge build-target-input" placeholder="Type the recipe you want to build" autocomplete="off" disabled>
           <button id="build-button" class="btn btn-primary btn-large build-button" data-project-id="{{project.id}}" disabled>Build</button>
         </div>
       </form>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 043/106] toaster: Fix filters
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (39 preceding siblings ...)
  2016-05-24 11:38 ` [PATCH 042/106] toaster: Style typeaheads Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 044/106] toaster: Fix no results pages Belen Barros Pena
                   ` (62 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Set the correct size for the filter buttons, and give some white space
to the 'clear filter' buttons in the toastertables.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css | 6 ++++++
 bitbake/lib/toaster/toastergui/static/js/table.js                   | 4 ++--
 bitbake/lib/toaster/toastergui/templates/basetable_top.html         | 2 +-
 bitbake/lib/toaster/toastergui/templates/detail_sorted_header.html  | 2 +-
 4 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index f3ddbe2..cf4abc6 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -138,3 +138,9 @@ fieldset[disabled] .btn-primary:hover {
 #build-input {
   width: 20em;
 }
+
+/* Clear filter tooltips in toastertables */
+
+.tooltip .btn-small {
+  margin: 10px;
+}
diff --git a/bitbake/lib/toaster/toastergui/static/js/table.js b/bitbake/lib/toaster/toastergui/static/js/table.js
index 9fda21b..85ed188 100644
--- a/bitbake/lib/toaster/toastergui/static/js/table.js
+++ b/bitbake/lib/toaster/toastergui/static/js/table.js
@@ -232,7 +232,7 @@ function tableInit(ctx){
 
       /* Setup the filter button */
       if (col.filter_name){
-        var filterBtn = $('<a href="#" role="button" data-filter-on="' + col.filter_name + '" class="pull-right btn btn-xs" data-toggle="modal"><i class="glyphicon glyphicon-filter filtered"></i></a>');
+        var filterBtn = $('<a href="#" role="button" data-filter-on="' + col.filter_name + '" class="pull-right btn btn-mini" data-toggle="modal"><i class="glyphicon glyphicon-filter filtered"></i></a>');
 
         filterBtn.data('filter-name', col.filter_name);
         filterBtn.prop('id', col.filter_name);
@@ -282,7 +282,7 @@ function tableInit(ctx){
 
       filterBtn.tooltip({
           html: true,
-          title: '<button class="btn btn-sm btn-primary" onClick=\'$("#clear-filter-btn-'+ ctx.tableName +'").click();\'>Clear filter</button>',
+          title: '<button class="btn btn-small btn-primary" onClick=\'$("#clear-filter-btn-'+ ctx.tableName +'").click();\'>Clear filter</button>',
           placement: 'bottom',
           delay: {
             hide: 1500,
diff --git a/bitbake/lib/toaster/toastergui/templates/basetable_top.html b/bitbake/lib/toaster/toastergui/templates/basetable_top.html
index 65ee17f..6731ff2 100644
--- a/bitbake/lib/toaster/toastergui/templates/basetable_top.html
+++ b/bitbake/lib/toaster/toastergui/templates/basetable_top.html
@@ -232,7 +232,7 @@
                 {%if tc.orderfield%}<a {%if tc.ordericon%} class="sorted" {%endif%}href="javascript:reload_params({'page': 1, 'orderby' : '{{tc.orderfield}}' })">{{tc.name}}</a>{%else%}<span class="muted">{{tc.name}}</span>{%endif%}
                 {%if tc.ordericon%} <i class="icon-caret-{{tc.ordericon}}"></i>{%endif%}
                 {%if tc.filter%}<div class="btn-group pull-right">
-                    <a href="#filter_{{tc.filter.class}}" role="button" class="btn btn-xs {%if request.GET.filter%}{{tc.filter.options|filtered_icon:request.GET.filter}} {%endif%}" {%if request.GET.filter and tc.filter.options|filtered_tooltip:request.GET.filter %} title="<p>{{tc.filter.options|filtered_tooltip:request.GET.filter}}</p><p><a class='btn btn-sm btn-primary' href=javascript:reload_params({'filter':''})>Show all {% if filter_search_display %}{{filter_search_display}}{% else %}{{objectname}}{% endif %}</a></p>" {%endif%} data-toggle="modal"> <i class="glyphicon glyphicon-filter filtered"></i> </a>
+                    <a href="#filter_{{tc.filter.class}}" role="button" class="btn btn-mini {%if request.GET.filter%}{{tc.filter.options|filtered_icon:request.GET.filter}} {%endif%}" {%if request.GET.filter and tc.filter.options|filtered_tooltip:request.GET.filter %} title="<p>{{tc.filter.options|filtered_tooltip:request.GET.filter}}</p><p><a class='btn btn-sm btn-primary' href=javascript:reload_params({'filter':''})>Show all {% if filter_search_display %}{{filter_search_display}}{% else %}{{objectname}}{% endif %}</a></p>" {%endif%} data-toggle="modal"> <i class="glyphicon glyphicon-filter filtered"></i> </a>
                 </div>{%endif%}
             </th>{% endfor %}
         </tr>
diff --git a/bitbake/lib/toaster/toastergui/templates/detail_sorted_header.html b/bitbake/lib/toaster/toastergui/templates/detail_sorted_header.html
index fddb041..6589b0a 100644
--- a/bitbake/lib/toaster/toastergui/templates/detail_sorted_header.html
+++ b/bitbake/lib/toaster/toastergui/templates/detail_sorted_header.html
@@ -17,7 +17,7 @@
                     <span class="badge badge-info">{{objects.paginator.count}}</span>
                 {% endif %}
                 {%if tc.filter%}<div class="btn-group pull-right">
-                    <a href="#filter_{{tc.filter.class}}" role="button" class="btn btn-xs {%if request.GET.filter%}{{tc.filter.options|filtered_icon:request.GET.filter}} {%endif%}" {%if request.GET.filter and tc.filter.options|filtered_tooltip:request.GET.filter %} title="<p>{{tc.filter.options|filtered_tooltip:request.GET.filter}}</p><p><a class='btn btn-sm btn-primary' href=javascript:reload_params({'filter':''})>Show all {% if filter_search_display %}{{filter_search_display}}{% else %}{{objectname}}{% endif %}</a></p>" {%endif%} data-toggle="modal"> <i class="glyphicon glyphicon-filter filtered"></i> </a>
+                    <a href="#filter_{{tc.filter.class}}" role="button" class="btn btn-mini {%if request.GET.filter%}{{tc.filter.options|filtered_icon:request.GET.filter}} {%endif%}" {%if request.GET.filter and tc.filter.options|filtered_tooltip:request.GET.filter %} title="<p>{{tc.filter.options|filtered_tooltip:request.GET.filter}}</p><p><a class='btn btn-sm btn-primary' href=javascript:reload_params({'filter':''})>Show all {% if filter_search_display %}{{filter_search_display}}{% else %}{{objectname}}{% endif %}</a></p>" {%endif%} data-toggle="modal"> <i class="glyphicon glyphicon-filter filtered"></i> </a>
                 </div>{%endif%}
             </th>{% endfor %}
         </tr>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 044/106] toaster: Fix no results pages
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (40 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 043/106] toaster: Fix filters Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 045/106] toaster: Edit inaccurate comment Belen Barros Pena
                   ` (61 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

The alerts we display when your search query returns no results were
incorrectly aligned because of nested 'row' divs. Remove the additional
rows to tidy up.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/templates/bpackage.html   | 14 ++++++--------
 bitbake/lib/toaster/toastergui/templates/configvars.html | 16 +++++++---------
 bitbake/lib/toaster/toastergui/templates/recipes.html    | 16 +++++++---------
 bitbake/lib/toaster/toastergui/templates/tasks.html      | 14 ++++++--------
 .../lib/toaster/toastergui/templates/toastertable.html   |  4 ++--
 5 files changed, 28 insertions(+), 36 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/bpackage.html b/bitbake/lib/toaster/toastergui/templates/bpackage.html
index 8e40932..575c27b 100644
--- a/bitbake/lib/toaster/toastergui/templates/bpackage.html
+++ b/bitbake/lib/toaster/toastergui/templates/bpackage.html
@@ -43,14 +43,12 @@
 </div>
 
   {% if objects.paginator.count == 0 %}
-  <div class="row">
-      <div class="alert">
-        <form class="no-results input-append" id="searchform">
-            <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
-            <button class="btn" type="submit" value="Search">Search</button>
-            <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all packages</button>
-        </form>
-      </div>
+  <div class="alert">
+    <form class="no-results input-append" id="searchform">
+      <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
+      <button class="btn" type="submit" value="Search">Search</button>
+      <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all packages</button>
+    </form>
   </div>
 
   {% else %}
diff --git a/bitbake/lib/toaster/toastergui/templates/configvars.html b/bitbake/lib/toaster/toastergui/templates/configvars.html
index aeb3cb8..f100b24 100644
--- a/bitbake/lib/toaster/toastergui/templates/configvars.html
+++ b/bitbake/lib/toaster/toastergui/templates/configvars.html
@@ -36,15 +36,13 @@
   <div id="variables" class="tab-pane">
 
   {% if objects.paginator.count == 0 %}
-  <div class="row">
-      <div class="alert">
-        <form class="no-results input-append" id="searchform">
-            <input id="search" name="search" class="input-xxlarge" type="text" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
-            <button class="btn" type="submit" value="Search">Search</button>
-            <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all variables</button>
-        </form>
-      </div>
-  </div>
+    <div class="alert">
+      <form class="no-results input-append" id="searchform">
+          <input id="search" name="search" class="input-xxlarge" type="text" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
+          <button class="btn" type="submit" value="Search">Search</button>
+          <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all variables</button>
+      </form>
+    </div>
 
   {% else %}
   {% include "basetable_top.html" %}
diff --git a/bitbake/lib/toaster/toastergui/templates/recipes.html b/bitbake/lib/toaster/toastergui/templates/recipes.html
index e879f00..fe06f8b 100644
--- a/bitbake/lib/toaster/toastergui/templates/recipes.html
+++ b/bitbake/lib/toaster/toastergui/templates/recipes.html
@@ -26,15 +26,13 @@
 </div>
 
 {% if objects.paginator.count == 0 %}
-  <div class="row">
-      <div class="alert">
-        <form class="no-results input-append" id="searchform">
-            <input id="search" name="search" class="input-xxlarge" type="text" value="{%if request.GET.search%}{{request.GET.search}}{%endif%}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
-            <button class="btn" type="submit" value="Search">Search</button>
-            <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all recipes</button>
-        </form>
-      </div>
-  </div>
+<div class="alert">
+  <form class="no-results input-append" id="searchform">
+    <input id="search" name="search" class="input-xxlarge" type="text" value="{%if request.GET.search%}{{request.GET.search}}{%endif%}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
+    <button class="btn" type="submit" value="Search">Search</button>
+    <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all recipes</button>
+  </form>
+</div>
 
 {% else %}
 {% include "basetable_top.html" %}
diff --git a/bitbake/lib/toaster/toastergui/templates/tasks.html b/bitbake/lib/toaster/toastergui/templates/tasks.html
index c45cf15..b3b7621 100644
--- a/bitbake/lib/toaster/toastergui/templates/tasks.html
+++ b/bitbake/lib/toaster/toastergui/templates/tasks.html
@@ -64,14 +64,12 @@
   </div>
 
   {% if objects.paginator.count == 0 %}
-  <div class="row">
-      <div class="alert">
-        <form class="no-results input-append" id="searchform">
-            <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
-            <button class="btn" type="submit" value="Search">Search</button>
-            <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all tasks</button>
-        </form>
-      </div>
+  <div class="alert">
+    <form class="no-results input-append" id="searchform">
+      <input id="search" name="search" class="input-xxlarge" type="text" value="{{request.GET.search}}"/>{% if request.GET.search %}<a href="javascript:$('#search').val('');searchform.submit()" class="input-append-addon btn" tabindex="-1"><i class="glyphicon glyphicon-remove"></i></a>{% endif %}
+      <button class="btn" type="submit" value="Search">Search</button>
+      <button class="btn btn-link" onclick="javascript:$('#search').val('');searchform.submit()">Show all tasks</button>
+    </form>
   </div>
 
 
diff --git a/bitbake/lib/toaster/toastergui/templates/toastertable.html b/bitbake/lib/toaster/toastergui/templates/toastertable.html
index 4f79632..ed179b2 100644
--- a/bitbake/lib/toaster/toastergui/templates/toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/toastertable.html
@@ -25,10 +25,10 @@
 
 {% include 'toastertable-filter.html' %}
 
-<div class="row" id="no-results-{{table_name}}" style="display:none">
+<div id="no-results-{{table_name}}" style="display:none">
   <div class="alert">
     <form class="no-results input-append">
-      <input id="new-search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{%if request.GET.search %}{{request.GET.search}}{%endif%}"/>
+      <input class="input-xlarge" id="new-search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{%if request.GET.search %}{{request.GET.search}}{%endif%}"/>
       <a href="#" class="input-append-addon btn remove-search-btn-{{table_name}}" tabindex="-1">
         <i class="glyphicon glyphicon-remove"></i>
       </a>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 045/106] toaster: Edit inaccurate comment
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (41 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 044/106] toaster: Fix no results pages Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 046/106] toaster: fix buttons in tables Belen Barros Pena
                   ` (60 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

The changes to the definition lists applies to all pages in Toaster, and
not just to the layer details page.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index cf4abc6..4a9dd88 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -81,7 +81,7 @@ fieldset[disabled] .btn-primary:hover {
   width: 60%;
 }
 
-/* Definition lists in the layer details page */
+/* Definition lists */
 
 .dl-horizontal dd {
   margin-left: 220px;
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 046/106] toaster: fix buttons in tables
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (42 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 045/106] toaster: Edit inaccurate comment Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 047/106] toaster: Fix popover content Belen Barros Pena
                   ` (59 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Bootstrap sets the white-space property in buttons to nowrap, and that
made our 'remove' buttons inside table cells look funny, with the label
shooting out of the button frame.

Set the white-space property for such buttons to normal, so that labels
wrap when there is no sufficient horizontal space available. Also, give
the button column a bit more width to minimise button wrapping, which
looks rather ugly.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../toaster/toastergui/static/css/bootstrap3-transition.css    | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index 4a9dd88..062e222 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -144,3 +144,13 @@ fieldset[disabled] .btn-primary:hover {
 .tooltip .btn-small {
   margin: 10px;
 }
+
+/* Table buttons */
+
+td > .btn {
+  white-space: normal;
+}
+
+th.add-del-layers {
+  width: 18%;
+}
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 047/106] toaster: Fix popover content
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (43 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 046/106] toaster: fix buttons in tables Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 048/106] toaster: Tweaking modal dialogs Belen Barros Pena
                   ` (58 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Lists had the wrong margins, and popovers were too narrow to fit commit
hashes.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../toastergui/static/css/bootstrap3-transition.css        | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index 062e222..f514182 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -154,3 +154,17 @@ td > .btn {
 th.add-del-layers {
   width: 18%;
 }
+
+/* Popover content */
+
+.popover-content > ul {
+  margin-left: 0;
+}
+
+h3.popover-title {
+  line-height: 20px;
+}
+
+.popover {
+  max-width: 400px;
+}
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 048/106] toaster: Tweaking modal dialogs
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (44 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 047/106] toaster: Fix popover content Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 049/106] toaster: Fix buttons in custom image details page Belen Barros Pena
                   ` (57 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Give them a nice, consistent look across pages.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../toastergui/static/css/bootstrap3-transition.css     | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index f514182..8855914 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -18,11 +18,6 @@ select[class^="pagesize"] {
   margin-bottom: 0;
 }
 
-/* Modal dialog */
-.modal-footer {
-  background-color: #f5f5f5;
-}
-
 /* Project configuration page */
 
 ul.configuration-list {
@@ -112,6 +107,18 @@ fieldset[disabled] .btn-primary:hover {
   max-height: 350px;
 }
 
+.modal-body ul.list-unstyled {
+  margin-left: 0;
+}
+
+.modal-footer {
+  background-color: #f5f5f5;
+}
+
+.modal-content form {
+  margin-bottom: 0;
+}
+
 /* Typeahead */
 
 .tt-menu {
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 049/106] toaster: Fix buttons in custom image details page
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (45 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 048/106] toaster: Tweaking modal dialogs Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 050/106] toaster: More width to the "Edit columns" menu Belen Barros Pena
                   ` (56 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Make sure the button labels in the table of packages we show in the
custom image details page wrap when there is not enough space.

Also, give the add | remove packages column a bit more room.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index 8855914..8b5192f 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -154,7 +154,7 @@ fieldset[disabled] .btn-primary:hover {
 
 /* Table buttons */
 
-td > .btn {
+td .btn {
   white-space: normal;
 }
 
@@ -162,6 +162,10 @@ th.add-del-layers {
   width: 18%;
 }
 
+th.add_rm_pkg_btn {
+  width: 20%;
+}
+
 /* Popover content */
 
 .popover-content > ul {
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 050/106] toaster: More width to the "Edit columns" menu
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (46 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 049/106] toaster: Fix buttons in custom image details page Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 051/106] toaster: Adjust labels in modal dialogs Belen Barros Pena
                   ` (55 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Increase the minimum width to give more space to show the menu options.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index 8b5192f..8b8d002 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -166,6 +166,12 @@ th.add_rm_pkg_btn {
   width: 20%;
 }
 
+/* Edit columsn menu */
+
+.dropdown-menu {
+  min-width: 200px;
+}
+
 /* Popover content */
 
 .popover-content > ul {
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 051/106] toaster: Adjust labels in modal dialogs
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (47 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 050/106] toaster: More width to the "Edit columns" menu Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 052/106] toaster: Fix 'New project' page Belen Barros Pena
                   ` (54 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

They had a bit too much padding.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index 8b8d002..661aa10 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -119,6 +119,11 @@ fieldset[disabled] .btn-primary:hover {
   margin-bottom: 0;
 }
 
+.modal-dialog .checkbox label,
+.modal-dialog .radio label {
+  padding-left: 0;
+}
+
 /* Typeahead */
 
 .tt-menu {
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 052/106] toaster: Fix 'New project' page
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (48 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 051/106] toaster: Adjust labels in modal dialogs Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 053/106] toaster: Fix the project created notification Belen Barros Pena
                   ` (53 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Apply Bootstrap 3 grid.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../toaster/toastergui/templates/newproject.html   | 26 +++++++++++-----------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/newproject.html b/bitbake/lib/toaster/toastergui/templates/newproject.html
index 77c36e9..e9e07cf 100644
--- a/bitbake/lib/toaster/toastergui/templates/newproject.html
+++ b/bitbake/lib/toaster/toastergui/templates/newproject.html
@@ -6,17 +6,14 @@
 
 {% block pagecontent %}
 <div class="row">
+  <div class="col-md-12">
     <div class="page-header">
           <h1>Create a new project</h1>
         </div>
-        <div class="container">
     {% if alert %}
-      <div class="alert alert-error row" role="alert">{{alert}}</div>
+      <div class="alert alert-error" role="alert">{{alert}}</div>
     {% endif %}
-        </div>
 
-      <div class="row">
-        <div class="col-md-6">
         <form method="POST">{% csrf_token %}
 
             <fieldset id="validate-project-name">
@@ -53,23 +50,26 @@
                      >{{release.description}}</option>
                 {% endfor %}
               </select>
+              <div class="row">
+                <div class="col-md-4">
                 {% for release in releases %}
-              <div class="row helptext" id="description-{{release.id}}" style="display: none">
-                <span class="help-block col-md-5">{{release.helptext|safe}}</span>
-              </div>
+                  <div class="helptext" id="description-{{release.id}}" style="display: none">
+                    <span class="help-block">{{release.helptext|safe}}</span>
+                  </div>
                 {% endfor %}
             {% else %}
               <input type="hidden" name="projectversion" value="{{releases.0.id}}"/>
             {% endif %}
+                </div>
+              </div>
             </fieldset>
         {% endif %}
-
-            <div class="form-actions">
-              <input type="submit" id="create-project-button" class="btn btn-primary btn-lg" value="Create project"/>
+            <div class="air">
+              <input type="submit" id="create-project-button" class="btn btn-primary btn-large" value="Create project"/>
               <span class="help-inline" style="vertical-align:middle;">To create a project, you need to enter a project name</span>
             </div>
+
         </form>
-        </div>
         <!--
         <div class="col-md-5 well">
                 <span class="help-block">
@@ -84,7 +84,7 @@
                  <p>If you create a <strong>build project</strong>, you will need to select a <strong>release</strong>,
                  which is the version of the build system you want to use to run your builds.</p>
              </div> -->
-        </div>
+      </div>
     </div>
 
     <script type="text/javascript">
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 053/106] toaster: Fix the project created notification
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (49 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 052/106] toaster: Fix 'New project' page Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 054/106] toaster: Fix errors and warnings info Belen Barros Pena
                   ` (52 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=yes, Size: 1713 bytes --]

It was outside the page main column.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/templates/projecttopbar.html | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/projecttopbar.html b/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
index d619516..b662a6e 100644
--- a/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
+++ b/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
@@ -16,13 +16,12 @@
   });
 </script>
 
-<div class="alert alert-success lead" id="project-created-notification" style="margin-top:15px; display:none">
-  <button type="button" class="close" data-dismiss="alert">×</button>
-  Your project <strong>{{project.name}}</strong> has been created. You can now <a href="{% url 'projectmachines' project.id %}">select your target machine</a> and <a href="{% url 'projectimagerecipes' project.id %}">choose image recipes</a> to build.
-</div>
-
-<!-- project name -->
 <div class="col-md-12">
+  <div class="alert alert-success lead" id="project-created-notification" style="margin-top:15px; display:none">
+    <button type="button" class="close" data-dismiss="alert">×</button>
+  Your project <strong>{{project.name}}</strong> has been created. You can now <a href="{% url 'projectmachines' project.id %}">select your target machine</a> and <a href="{% url 'projectimagerecipes' project.id %}">choose image recipes</a> to build.
+  </div>
+  <!-- project name -->
   <div class="page-header">
     <h1 id="project-name-container">
       <span id="project-name">{{project.name}}</span>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 054/106] toaster: Fix errors and warnings info
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (50 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 053/106] toaster: Fix the project created notification Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 055/106] toaster: Fix landing page Belen Barros Pena
                   ` (51 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Bootstrap 3 changed all classes used for the accordions, which broke our
presentation of errors and warnings.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../static/css/bootstrap3-transition.css           | 18 ++++++++++++++++
 .../toastergui/templates/builddashboard.html       | 25 +++++++++++-----------
 2 files changed, 31 insertions(+), 12 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index 661aa10..a832b4d 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -190,3 +190,21 @@ h3.popover-title {
 .popover {
   max-width: 400px;
 }
+
+/* Errors and warnings accordions */
+
+#errors .panel-heading,
+#warnings .panel-heading {
+  background-color: transparent;
+}
+
+a.toggle-errors:hover,
+a.toggle-warnings:hover,
+a.warning:focus {
+  text-decoration: none;
+}
+
+a.toggle-errors:focus,
+a.toggle-warnings:focus {
+  outline: none;
+}
diff --git a/bitbake/lib/toaster/toastergui/templates/builddashboard.html b/bitbake/lib/toaster/toastergui/templates/builddashboard.html
index 4482892..5425dfe 100644
--- a/bitbake/lib/toaster/toastergui/templates/builddashboard.html
+++ b/bitbake/lib/toaster/toastergui/templates/builddashboard.html
@@ -50,18 +50,18 @@
   </div>
 
 {% if build.errors.count %}
-<div class="accordion" id="errors">
-  <div class="accordion-group">
-    <div class="accordion-heading">
-            <a class="accordion-toggle error toggle-errors">
+<div class="panel-group" id="errors">
+  <div class="panel panel-default">
+    <div class="panel-heading">
+      <a class="panel-title error toggle-errors" href="#">
          <h2 id="error-toggle">
            <i class="icon-minus-sign"></i>
            {{build.errors.count}} error{{build.errors.count|pluralize}}
          </h2>
       </a>
     </div>
-    <div class="accordion-body collapse in" id="collapse-errors">
-      <div class="accordion-inner">
+    <div class="panel-collapse collapse in" id="collapse-errors">
+      <div class="panel-body">
         <div class="col-md-10">
           {% for error in build.errors %}
             <div class="alert alert-error" data-error="{{ error.id }}">
@@ -239,20 +239,21 @@
             </dl>
     </div>
   </div>
+</div>
 
 {% if build.warnings.count %}
-<div class="accordion" id="warnings">
-  <div class="accordion-group">
-    <div class="accordion-heading">
-      <a class="accordion-toggle warning toggle-warnings">
+<div class="panel-group" id="warnings">
+  <div class="panel panel-default">
+    <div class="panel-heading">
+      <a class="panel-title warning toggle-warnings" href="#">
         <h2 id="warning-toggle">
           <i class="icon-warning-sign"></i>
           {{build.warnings.count}} warning{{build.warnings.count|pluralize}}
         </h2>
       </a>
     </div>
-    <div class="accordion-body collapse" id="collapse-warnings">
-      <div class="accordion-inner">
+    <div class="panel-collapse collapse" id="collapse-warnings">
+      <div class="panel-body">
         <div class="col-md-10">
           {% for warning in logmessages %}{% if warning.level == 1 %}
             <div class="alert alert-warning">
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 055/106] toaster: Fix landing page
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (51 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 054/106] toaster: Fix errors and warnings info Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 056/106] toaster: Fix reverse dependencies modal dialogs Belen Barros Pena
                   ` (50 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Layout was messed up due to changes in Bootstrap 3.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../toastergui/static/css/bootstrap3-transition.css | 21 +++++++++++++++++++++
 .../lib/toaster/toastergui/templates/landing.html   | 11 ++++-------
 2 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index a832b4d..1f4f7d0 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -208,3 +208,24 @@ a.toggle-errors:focus,
 a.toggle-warnings:focus {
   outline: none;
 }
+
+/* Landing page */
+
+.jumbotron p {
+  margin-top: 20px;
+  margin-bottom: 30px;
+}
+
+.jumbotron ul {
+  margin-left: 10px;
+  font-size: 21px;
+  font-weight: 200;
+}
+
+.jumbotron ul > li {
+  line-height: 30px;
+}
+
+.jumbotron .img-thumbnail {
+  padding: 0;
+}
diff --git a/bitbake/lib/toaster/toastergui/templates/landing.html b/bitbake/lib/toaster/toastergui/templates/landing.html
index b19eb5f..0fdf033 100644
--- a/bitbake/lib/toaster/toastergui/templates/landing.html
+++ b/bitbake/lib/toaster/toastergui/templates/landing.html
@@ -6,10 +6,8 @@
 
 {% block title %} Welcome to Toaster {% endblock %}
 {% block pagecontent %}
-    <div class="container">
       <div class="row">
-        <div class="jumbotron col-md-12 well-transparent">
-          <div class="row">
+        <div class="jumbotron well-transparent">
 
             <div class="col-md-6">
               <h1>This is Toaster</h1>
@@ -17,8 +15,8 @@
               <p>A web interface to <a href="http://www.openembedded.org">OpenEmbedded</a> and <a href="http://www.yoctoproject.org/tools-resources/projects/bitbake">BitBake</a>, the <a href="http://www.yoctoproject.org">Yocto Project</a> build system.</p>
 
 		          {% if lvs_nos %}
-		            <p class="hero-actions">
-		              <a class="btn btn-primary btn-lg" href="{% url 'newproject' %}">
+		            <p>
+		              <a class="btn btn-primary btn-large" href="{% url 'newproject' %}">
 			              To start building, create your first Toaster project
 		              </a>
 		            </p>
@@ -55,8 +53,7 @@
               <img alt="Yocto Project" class="img-thumbnail" src="{% static 'img/toaster_bw.png' %}"/>
             </div>
 
-          </div>
         </div>
       </div>
-    </div>
+
 {% endblock %}
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 056/106] toaster: Fix reverse dependencies modal dialogs
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (52 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 055/106] toaster: Fix landing page Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 057/106] toaster: Table cell notifications style Belen Barros Pena
                   ` (49 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

In the custom image details page, the modal dialogs we show you when you
remove a package with reverse dependencies were not displaying. This
patch removes the class causing the problem.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/templates/customrecipe.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/customrecipe.html b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
index 0cac42f..b0f3278 100644
--- a/bitbake/lib/toaster/toastergui/templates/customrecipe.html
+++ b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
@@ -66,7 +66,7 @@
 <!-- end package dependencies modal -->
 
 <!-- package reverse dependencies modal -->
-<div style="display:none" id="package-reverse-deps-modal" class="modal hide fade in" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="false">
+<div style="display:none" id="package-reverse-deps-modal" class="modal fade in" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="false">
   <div class="modal-dialog">
     <div class="modal-content">
       <div class="modal-header">
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 057/106] toaster: Table cell notifications style
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (53 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 056/106] toaster: Fix reverse dependencies modal dialogs Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 058/106] toaster: importlayer Make sure we eat the default event on submit Belen Barros Pena
                   ` (48 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Make sure they all look the same across Toaster.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../lib/toaster/toastergui/static/css/bootstrap3-transition.css    | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
index 1f4f7d0..9644485 100644
--- a/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
+++ b/bitbake/lib/toaster/toastergui/static/css/bootstrap3-transition.css
@@ -157,6 +157,13 @@ fieldset[disabled] .btn-primary:hover {
   margin: 10px;
 }
 
+/* Table cell notifications */
+
+.inline-notification,
+#temp-inline-notify {
+  padding: 10px;
+}
+
 /* Table buttons */
 
 td .btn {
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 058/106] toaster: importlayer Make sure we eat the default event on submit
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (54 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 057/106] toaster: Table cell notifications style Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 059/106] toaster: Update OE json file Belen Barros Pena
                   ` (47 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

From: Michael Wood <michael.g.wood@intel.com>

Make sure the default event is consumed to stop the event being further
processed and breaking out of the function to import layer.

Signed-off-by: Michael Wood <michael.g.wood@intel.com>
---
 bitbake/lib/toaster/toastergui/static/js/importlayer.js | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/bitbake/lib/toaster/toastergui/static/js/importlayer.js b/bitbake/lib/toaster/toastergui/static/js/importlayer.js
index 5a59799..e193557 100644
--- a/bitbake/lib/toaster/toastergui/static/js/importlayer.js
+++ b/bitbake/lib/toaster/toastergui/static/js/importlayer.js
@@ -105,7 +105,8 @@ function importLayerPageInit (ctx) {
       }, null);
   });
 
-  importAndAddBtn.click(function(){
+  importAndAddBtn.click(function(e){
+    e.preventDefault();
     /* This is a list of the names from layerDeps for the layer deps
      * modal dialog body
      */
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 059/106] toaster: Update OE json file
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (55 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 058/106] toaster: importlayer Make sure we eat the default event on submit Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 14:57   ` Michael Wood
  2016-05-24 11:39 ` [PATCH 060/106] toaster: work-around our lack of a synchronous fetch for typeaheads Belen Barros Pena
                   ` (46 subsequent siblings)
  103 siblings, 1 reply; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Update the OpenEmbedded Toaster configuration file to include the
krogoth branch. Also, make sure the DISTRO default value is set to
"nodistro".

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 meta/conf/toasterconf.json | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/meta/conf/toasterconf.json b/meta/conf/toasterconf.json
index a05734f..ffa2346 100644
--- a/meta/conf/toasterconf.json
+++ b/meta/conf/toasterconf.json
@@ -1,7 +1,7 @@
 {
     "config": {
         "MACHINE"      : "qemux86",
-        "DISTRO"       : "poky",
+        "DISTRO"       : "nodistro",
         "DL_DIR"       : "${TOPDIR}/../downloads",
         "IMAGE_FSTYPES": "ext3 jffs2 tar.bz2",
         "IMAGE_INSTALL_append": "",
@@ -13,7 +13,7 @@
             "name": "Local OpenEmbedded",
             "sourcetype": "local",
             "apiurl": "../../",
-            "branches": ["HEAD", "master", "jethro"],
+            "branches": ["HEAD", "master", "jethro", "krogoth"],
             "layers": [
                 {
                     "name": "openembedded-core",
@@ -27,13 +27,13 @@
             "name": "OpenEmbedded",
             "sourcetype": "layerindex",
             "apiurl": "http://layers.openembedded.org/layerindex/api/",
-            "branches": ["master", "jethro"]
+            "branches": ["master", "jethro", "krogoth"]
         },
         {
             "name": "Imported layers",
             "sourcetype": "imported",
             "apiurl": "",
-            "branches": ["master", "jethro", "HEAD"]
+            "branches": ["master", "jethro", "krogoth", "HEAD"]
 
         }
     ],
@@ -51,6 +51,12 @@
             "dirpath": ""
         },
         {
+            "name": "krogoth",
+            "giturl": "git://git.openembedded.org/bitbake",
+            "branch": "1.30",
+            "dirpath": ""
+        },
+        {
             "name": "HEAD",
             "giturl": "git://git.openembedded.org/bitbake",
             "branch": "HEAD",
@@ -80,6 +86,15 @@
             "helptext": "Toaster will run your builds with the tip of the <a href=\"http://cgit.openembedded.org/openembedded-core/log/?h=jethro\">OpenEmbedded \"Jethro\"</a> branch"
         },
         {
+            "name": "krogoth",
+            "description": "OpenEmbedded Krogoth",
+            "bitbake": "krogoth",
+            "branch": "krogoth",
+            "defaultlayers": [ "openembedded-core" ],
+            "layersourcepriority": { "Imported layers": 99, "Local OpenEmbedded" : 10, "OpenEmbedded" :  0 },
+            "helptext": "Toaster will run your builds with the tip of the <a href=\"http://cgit.openembedded.org/openembedded-core/log/?h=krogoth\">OpenEmbedded \"Krogoth\"</a> branch"
+        },
+        {
             "name": "local",
             "description": "Local OpenEmbedded",
             "bitbake": "HEAD",
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 060/106] toaster: work-around our lack of a synchronous fetch for typeaheads
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (56 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 059/106] toaster: Update OE json file Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 061/106] toaster: Remove old bootstrap files left behind Belen Barros Pena
                   ` (45 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

From: Elliot Smith <elliot.smith@intel.com>

The Twitter typeahead.js library expects the developer to use
a source which does a local search for matching suggestions, then
falls back to a remote search if that doesn't return enough
results.

However, in Toaster, we don't do any caching of the suggestions
for a typeahead, so our source only works in asynchronous mode.

Consequently, we see fewer than the expected number of suggestions
if the typeahead has already shown suggestions matching a query.
For example, searching for "meta-n" in the layers typeahead will
show the results for this query; but when the query changes to
"meta-ne", a new set of results is fetched, which mostly overlaps
with the results for "meta-n". The typeahead assumes that the
overlapping items are locally cached and have been delivered
synchronously, and just appends the new results which don't
overlap with the previous query. But because we don't provide any
results synchronously, we just end up with the single
non-overlapping result in the drop-down.

This can be fixed by hacking typeahead.js so that instead of
appending asynchronous results, we always overwrite and redraw
the whole typeahead menu.

This is a temporary fix, and should be properly fixed (when we
have time), perhaps by using typeahead.js's associated Bloodhound
library.

Added a note about the hack to the license file as an explanation
of why the unminified JS file is included in Toaster.

Signed-off-by: Elliot Smith <elliot.smith@intel.com>
---
 bitbake/LICENSE                                    |    2 +-
 .../toastergui/static/js/typeahead.jquery.js       | 1551 ++++++++++++++++++++
 .../toastergui/static/js/typeahead.jquery.min.js   |    7 -
 bitbake/lib/toaster/toastergui/templates/base.html |    2 +-
 4 files changed, 1553 insertions(+), 9 deletions(-)
 create mode 100644 bitbake/lib/toaster/toastergui/static/js/typeahead.jquery.js
 delete mode 100644 bitbake/lib/toaster/toastergui/static/js/typeahead.jquery.min.js

diff --git a/bitbake/LICENSE b/bitbake/LICENSE
index 447e2bb..7a0c272 100644
--- a/bitbake/LICENSE
+++ b/bitbake/LICENSE
@@ -8,6 +8,6 @@ Foundation and individual contributors.
 * Twitter Bootstrap (including Glyphicons), redistributed under the MIT license
 * jQuery is redistributed under the MIT license.
 
-* Twitter typeahead.js redistributed under the MIT license.
+* Twitter typeahead.js redistributed under the MIT license. Note that the JS source has one small modification, so the full unminified file is currently included to make it obvious where this is.
 
 * QUnit is redistributed under the MIT license.
diff --git a/bitbake/lib/toaster/toastergui/static/js/typeahead.jquery.js b/bitbake/lib/toaster/toastergui/static/js/typeahead.jquery.js
new file mode 100644
index 0000000..f3efd80
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/js/typeahead.jquery.js
@@ -0,0 +1,1551 @@
+/*!
+ * typeahead.js 0.11.1
+ * https://github.com/twitter/typeahead.js
+ * Copyright 2013-2015 Twitter, Inc. and other contributors; Licensed MIT
+ */
+
+(function(root, factory) {
+    if (typeof define === "function" && define.amd) {
+        define("typeahead.js", [ "jquery" ], function(a0) {
+            return factory(a0);
+        });
+    } else if (typeof exports === "object") {
+        module.exports = factory(require("jquery"));
+    } else {
+        factory(jQuery);
+    }
+})(this, function($) {
+    var _ = function() {
+        "use strict";
+        return {
+            isMsie: function() {
+                return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false;
+            },
+            isBlankString: function(str) {
+                return !str || /^\s*$/.test(str);
+            },
+            escapeRegExChars: function(str) {
+                return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
+            },
+            isString: function(obj) {
+                return typeof obj === "string";
+            },
+            isNumber: function(obj) {
+                return typeof obj === "number";
+            },
+            isArray: $.isArray,
+            isFunction: $.isFunction,
+            isObject: $.isPlainObject,
+            isUndefined: function(obj) {
+                return typeof obj === "undefined";
+            },
+            isElement: function(obj) {
+                return !!(obj && obj.nodeType === 1);
+            },
+            isJQuery: function(obj) {
+                return obj instanceof $;
+            },
+            toStr: function toStr(s) {
+                return _.isUndefined(s) || s === null ? "" : s + "";
+            },
+            bind: $.proxy,
+            each: function(collection, cb) {
+                $.each(collection, reverseArgs);
+                function reverseArgs(index, value) {
+                    return cb(value, index);
+                }
+            },
+            map: $.map,
+            filter: $.grep,
+            every: function(obj, test) {
+                var result = true;
+                if (!obj) {
+                    return result;
+                }
+                $.each(obj, function(key, val) {
+                    if (!(result = test.call(null, val, key, obj))) {
+                        return false;
+                    }
+                });
+                return !!result;
+            },
+            some: function(obj, test) {
+                var result = false;
+                if (!obj) {
+                    return result;
+                }
+                $.each(obj, function(key, val) {
+                    if (result = test.call(null, val, key, obj)) {
+                        return false;
+                    }
+                });
+                return !!result;
+            },
+            mixin: $.extend,
+            identity: function(x) {
+                return x;
+            },
+            clone: function(obj) {
+                return $.extend(true, {}, obj);
+            },
+            getIdGenerator: function() {
+                var counter = 0;
+                return function() {
+                    return counter++;
+                };
+            },
+            templatify: function templatify(obj) {
+                return $.isFunction(obj) ? obj : template;
+                function template() {
+                    return String(obj);
+                }
+            },
+            defer: function(fn) {
+                setTimeout(fn, 0);
+            },
+            debounce: function(func, wait, immediate) {
+                var timeout, result;
+                return function() {
+                    var context = this, args = arguments, later, callNow;
+                    later = function() {
+                        timeout = null;
+                        if (!immediate) {
+                            result = func.apply(context, args);
+                        }
+                    };
+                    callNow = immediate && !timeout;
+                    clearTimeout(timeout);
+                    timeout = setTimeout(later, wait);
+                    if (callNow) {
+                        result = func.apply(context, args);
+                    }
+                    return result;
+                };
+            },
+            throttle: function(func, wait) {
+                var context, args, timeout, result, previous, later;
+                previous = 0;
+                later = function() {
+                    previous = new Date();
+                    timeout = null;
+                    result = func.apply(context, args);
+                };
+                return function() {
+                    var now = new Date(), remaining = wait - (now - previous);
+                    context = this;
+                    args = arguments;
+                    if (remaining <= 0) {
+                        clearTimeout(timeout);
+                        timeout = null;
+                        previous = now;
+                        result = func.apply(context, args);
+                    } else if (!timeout) {
+                        timeout = setTimeout(later, remaining);
+                    }
+                    return result;
+                };
+            },
+            stringify: function(val) {
+                return _.isString(val) ? val : JSON.stringify(val);
+            },
+            noop: function() {}
+        };
+    }();
+    var WWW = function() {
+        "use strict";
+        var defaultClassNames = {
+            wrapper: "twitter-typeahead",
+            input: "tt-input",
+            hint: "tt-hint",
+            menu: "tt-menu",
+            dataset: "tt-dataset",
+            suggestion: "tt-suggestion",
+            selectable: "tt-selectable",
+            empty: "tt-empty",
+            open: "tt-open",
+            cursor: "tt-cursor",
+            highlight: "tt-highlight"
+        };
+        return build;
+        function build(o) {
+            var www, classes;
+            classes = _.mixin({}, defaultClassNames, o);
+            www = {
+                css: buildCss(),
+                classes: classes,
+                html: buildHtml(classes),
+                selectors: buildSelectors(classes)
+            };
+            return {
+                css: www.css,
+                html: www.html,
+                classes: www.classes,
+                selectors: www.selectors,
+                mixin: function(o) {
+                    _.mixin(o, www);
+                }
+            };
+        }
+        function buildHtml(c) {
+            return {
+                wrapper: '<span class="' + c.wrapper + '"></span>',
+                menu: '<div class="' + c.menu + '"></div>'
+            };
+        }
+        function buildSelectors(classes) {
+            var selectors = {};
+            _.each(classes, function(v, k) {
+                selectors[k] = "." + v;
+            });
+            return selectors;
+        }
+        function buildCss() {
+            var css = {
+                wrapper: {
+                    position: "relative",
+                    display: "inline-block"
+                },
+                hint: {
+                    position: "absolute",
+                    top: "0",
+                    left: "0",
+                    borderColor: "transparent",
+                    boxShadow: "none",
+                    opacity: "1"
+                },
+                input: {
+                    position: "relative",
+                    verticalAlign: "top",
+                    backgroundColor: "transparent"
+                },
+                inputWithNoHint: {
+                    position: "relative",
+                    verticalAlign: "top"
+                },
+                menu: {
+                    position: "absolute",
+                    top: "100%",
+                    left: "0",
+                    zIndex: "100",
+                    display: "none"
+                },
+                ltr: {
+                    left: "0",
+                    right: "auto"
+                },
+                rtl: {
+                    left: "auto",
+                    right: " 0"
+                }
+            };
+            if (_.isMsie()) {
+                _.mixin(css.input, {
+                    backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"
+                });
+            }
+            return css;
+        }
+    }();
+    var EventBus = function() {
+        "use strict";
+        var namespace, deprecationMap;
+        namespace = "typeahead:";
+        deprecationMap = {
+            render: "rendered",
+            cursorchange: "cursorchanged",
+            select: "selected",
+            autocomplete: "autocompleted"
+        };
+        function EventBus(o) {
+            if (!o || !o.el) {
+                $.error("EventBus initialized without el");
+            }
+            this.$el = $(o.el);
+        }
+        _.mixin(EventBus.prototype, {
+            _trigger: function(type, args) {
+                var $e;
+                $e = $.Event(namespace + type);
+                (args = args || []).unshift($e);
+                this.$el.trigger.apply(this.$el, args);
+                return $e;
+            },
+            before: function(type) {
+                var args, $e;
+                args = [].slice.call(arguments, 1);
+                $e = this._trigger("before" + type, args);
+                return $e.isDefaultPrevented();
+            },
+            trigger: function(type) {
+                var deprecatedType;
+                this._trigger(type, [].slice.call(arguments, 1));
+                if (deprecatedType = deprecationMap[type]) {
+                    this._trigger(deprecatedType, [].slice.call(arguments, 1));
+                }
+            }
+        });
+        return EventBus;
+    }();
+    var EventEmitter = function() {
+        "use strict";
+        var splitter = /\s+/, nextTick = getNextTick();
+        return {
+            onSync: onSync,
+            onAsync: onAsync,
+            off: off,
+            trigger: trigger
+        };
+        function on(method, types, cb, context) {
+            var type;
+            if (!cb) {
+                return this;
+            }
+            types = types.split(splitter);
+            cb = context ? bindContext(cb, context) : cb;
+            this._callbacks = this._callbacks || {};
+            while (type = types.shift()) {
+                this._callbacks[type] = this._callbacks[type] || {
+                    sync: [],
+                    async: []
+                };
+                this._callbacks[type][method].push(cb);
+            }
+            return this;
+        }
+        function onAsync(types, cb, context) {
+            return on.call(this, "async", types, cb, context);
+        }
+        function onSync(types, cb, context) {
+            return on.call(this, "sync", types, cb, context);
+        }
+        function off(types) {
+            var type;
+            if (!this._callbacks) {
+                return this;
+            }
+            types = types.split(splitter);
+            while (type = types.shift()) {
+                delete this._callbacks[type];
+            }
+            return this;
+        }
+        function trigger(types) {
+            var type, callbacks, args, syncFlush, asyncFlush;
+            if (!this._callbacks) {
+                return this;
+            }
+            types = types.split(splitter);
+            args = [].slice.call(arguments, 1);
+            while ((type = types.shift()) && (callbacks = this._callbacks[type])) {
+                syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args));
+                asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args));
+                syncFlush() && nextTick(asyncFlush);
+            }
+            return this;
+        }
+        function getFlush(callbacks, context, args) {
+            return flush;
+            function flush() {
+                var cancelled;
+                for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) {
+                    cancelled = callbacks[i].apply(context, args) === false;
+                }
+                return !cancelled;
+            }
+        }
+        function getNextTick() {
+            var nextTickFn;
+            if (window.setImmediate) {
+                nextTickFn = function nextTickSetImmediate(fn) {
+                    setImmediate(function() {
+                        fn();
+                    });
+                };
+            } else {
+                nextTickFn = function nextTickSetTimeout(fn) {
+                    setTimeout(function() {
+                        fn();
+                    }, 0);
+                };
+            }
+            return nextTickFn;
+        }
+        function bindContext(fn, context) {
+            return fn.bind ? fn.bind(context) : function() {
+                fn.apply(context, [].slice.call(arguments, 0));
+            };
+        }
+    }();
+    var highlight = function(doc) {
+        "use strict";
+        var defaults = {
+            node: null,
+            pattern: null,
+            tagName: "strong",
+            className: null,
+            wordsOnly: false,
+            caseSensitive: false
+        };
+        return function hightlight(o) {
+            var regex;
+            o = _.mixin({}, defaults, o);
+            if (!o.node || !o.pattern) {
+                return;
+            }
+            o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ];
+            regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly);
+            traverse(o.node, hightlightTextNode);
+            function hightlightTextNode(textNode) {
+                var match, patternNode, wrapperNode;
+                if (match = regex.exec(textNode.data)) {
+                    wrapperNode = doc.createElement(o.tagName);
+                    o.className && (wrapperNode.className = o.className);
+                    patternNode = textNode.splitText(match.index);
+                    patternNode.splitText(match[0].length);
+                    wrapperNode.appendChild(patternNode.cloneNode(true));
+                    textNode.parentNode.replaceChild(wrapperNode, patternNode);
+                }
+                return !!match;
+            }
+            function traverse(el, hightlightTextNode) {
+                var childNode, TEXT_NODE_TYPE = 3;
+                for (var i = 0; i < el.childNodes.length; i++) {
+                    childNode = el.childNodes[i];
+                    if (childNode.nodeType === TEXT_NODE_TYPE) {
+                        i += hightlightTextNode(childNode) ? 1 : 0;
+                    } else {
+                        traverse(childNode, hightlightTextNode);
+                    }
+                }
+            }
+        };
+        function getRegex(patterns, caseSensitive, wordsOnly) {
+            var escapedPatterns = [], regexStr;
+            for (var i = 0, len = patterns.length; i < len; i++) {
+                escapedPatterns.push(_.escapeRegExChars(patterns[i]));
+            }
+            regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")";
+            return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i");
+        }
+    }(window.document);
+    var Input = function() {
+        "use strict";
+        var specialKeyCodeMap;
+        specialKeyCodeMap = {
+            9: "tab",
+            27: "esc",
+            37: "left",
+            39: "right",
+            13: "enter",
+            38: "up",
+            40: "down"
+        };
+        function Input(o, www) {
+            o = o || {};
+            if (!o.input) {
+                $.error("input is missing");
+            }
+            www.mixin(this);
+            this.$hint = $(o.hint);
+            this.$input = $(o.input);
+            this.query = this.$input.val();
+            this.queryWhenFocused = this.hasFocus() ? this.query : null;
+            this.$overflowHelper = buildOverflowHelper(this.$input);
+            this._checkLanguageDirection();
+            if (this.$hint.length === 0) {
+                this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop;
+            }
+        }
+        Input.normalizeQuery = function(str) {
+            return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, " ");
+        };
+        _.mixin(Input.prototype, EventEmitter, {
+            _onBlur: function onBlur() {
+                this.resetInputValue();
+                this.trigger("blurred");
+            },
+            _onFocus: function onFocus() {
+                this.queryWhenFocused = this.query;
+                this.trigger("focused");
+            },
+            _onKeydown: function onKeydown($e) {
+                var keyName = specialKeyCodeMap[$e.which || $e.keyCode];
+                this._managePreventDefault(keyName, $e);
+                if (keyName && this._shouldTrigger(keyName, $e)) {
+                    this.trigger(keyName + "Keyed", $e);
+                }
+            },
+            _onInput: function onInput() {
+                this._setQuery(this.getInputValue());
+                this.clearHintIfInvalid();
+                this._checkLanguageDirection();
+            },
+            _managePreventDefault: function managePreventDefault(keyName, $e) {
+                var preventDefault;
+                switch (keyName) {
+                  case "up":
+                  case "down":
+                    preventDefault = !withModifier($e);
+                    break;
+
+                  default:
+                    preventDefault = false;
+                }
+                preventDefault && $e.preventDefault();
+            },
+            _shouldTrigger: function shouldTrigger(keyName, $e) {
+                var trigger;
+                switch (keyName) {
+                  case "tab":
+                    trigger = !withModifier($e);
+                    break;
+
+                  default:
+                    trigger = true;
+                }
+                return trigger;
+            },
+            _checkLanguageDirection: function checkLanguageDirection() {
+                var dir = (this.$input.css("direction") || "ltr").toLowerCase();
+                if (this.dir !== dir) {
+                    this.dir = dir;
+                    this.$hint.attr("dir", dir);
+                    this.trigger("langDirChanged", dir);
+                }
+            },
+            _setQuery: function setQuery(val, silent) {
+                var areEquivalent, hasDifferentWhitespace;
+                areEquivalent = areQueriesEquivalent(val, this.query);
+                hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false;
+                this.query = val;
+                if (!silent && !areEquivalent) {
+                    this.trigger("queryChanged", this.query);
+                } else if (!silent && hasDifferentWhitespace) {
+                    this.trigger("whitespaceChanged", this.query);
+                }
+            },
+            bind: function() {
+                var that = this, onBlur, onFocus, onKeydown, onInput;
+                onBlur = _.bind(this._onBlur, this);
+                onFocus = _.bind(this._onFocus, this);
+                onKeydown = _.bind(this._onKeydown, this);
+                onInput = _.bind(this._onInput, this);
+                this.$input.on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown);
+                if (!_.isMsie() || _.isMsie() > 9) {
+                    this.$input.on("input.tt", onInput);
+                } else {
+                    this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) {
+                        if (specialKeyCodeMap[$e.which || $e.keyCode]) {
+                            return;
+                        }
+                        _.defer(_.bind(that._onInput, that, $e));
+                    });
+                }
+                return this;
+            },
+            focus: function focus() {
+                this.$input.focus();
+            },
+            blur: function blur() {
+                this.$input.blur();
+            },
+            getLangDir: function getLangDir() {
+                return this.dir;
+            },
+            getQuery: function getQuery() {
+                return this.query || "";
+            },
+            setQuery: function setQuery(val, silent) {
+                this.setInputValue(val);
+                this._setQuery(val, silent);
+            },
+            hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() {
+                return this.query !== this.queryWhenFocused;
+            },
+            getInputValue: function getInputValue() {
+                return this.$input.val();
+            },
+            setInputValue: function setInputValue(value) {
+                this.$input.val(value);
+                this.clearHintIfInvalid();
+                this._checkLanguageDirection();
+            },
+            resetInputValue: function resetInputValue() {
+                this.setInputValue(this.query);
+            },
+            getHint: function getHint() {
+                return this.$hint.val();
+            },
+            setHint: function setHint(value) {
+                this.$hint.val(value);
+            },
+            clearHint: function clearHint() {
+                this.setHint("");
+            },
+            clearHintIfInvalid: function clearHintIfInvalid() {
+                var val, hint, valIsPrefixOfHint, isValid;
+                val = this.getInputValue();
+                hint = this.getHint();
+                valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0;
+                isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow();
+                !isValid && this.clearHint();
+            },
+            hasFocus: function hasFocus() {
+                return this.$input.is(":focus");
+            },
+            hasOverflow: function hasOverflow() {
+                var constraint = this.$input.width() - 2;
+                this.$overflowHelper.text(this.getInputValue());
+                return this.$overflowHelper.width() >= constraint;
+            },
+            isCursorAtEnd: function() {
+                var valueLength, selectionStart, range;
+                valueLength = this.$input.val().length;
+                selectionStart = this.$input[0].selectionStart;
+                if (_.isNumber(selectionStart)) {
+                    return selectionStart === valueLength;
+                } else if (document.selection) {
+                    range = document.selection.createRange();
+                    range.moveStart("character", -valueLength);
+                    return valueLength === range.text.length;
+                }
+                return true;
+            },
+            destroy: function destroy() {
+                this.$hint.off(".tt");
+                this.$input.off(".tt");
+                this.$overflowHelper.remove();
+                this.$hint = this.$input = this.$overflowHelper = $("<div>");
+            }
+        });
+        return Input;
+        function buildOverflowHelper($input) {
+            return $('<pre aria-hidden="true"></pre>').css({
+                position: "absolute",
+                visibility: "hidden",
+                whiteSpace: "pre",
+                fontFamily: $input.css("font-family"),
+                fontSize: $input.css("font-size"),
+                fontStyle: $input.css("font-style"),
+                fontVariant: $input.css("font-variant"),
+                fontWeight: $input.css("font-weight"),
+                wordSpacing: $input.css("word-spacing"),
+                letterSpacing: $input.css("letter-spacing"),
+                textIndent: $input.css("text-indent"),
+                textRendering: $input.css("text-rendering"),
+                textTransform: $input.css("text-transform")
+            }).insertAfter($input);
+        }
+        function areQueriesEquivalent(a, b) {
+            return Input.normalizeQuery(a) === Input.normalizeQuery(b);
+        }
+        function withModifier($e) {
+            return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey;
+        }
+    }();
+    var Dataset = function() {
+        "use strict";
+        var keys, nameGenerator;
+        keys = {
+            val: "tt-selectable-display",
+            obj: "tt-selectable-object"
+        };
+        nameGenerator = _.getIdGenerator();
+        function Dataset(o, www) {
+            o = o || {};
+            o.templates = o.templates || {};
+            o.templates.notFound = o.templates.notFound || o.templates.empty;
+            if (!o.source) {
+                $.error("missing source");
+            }
+            if (!o.node) {
+                $.error("missing node");
+            }
+            if (o.name && !isValidName(o.name)) {
+                $.error("invalid dataset name: " + o.name);
+            }
+            www.mixin(this);
+            this.highlight = !!o.highlight;
+            this.name = o.name || nameGenerator();
+            this.limit = o.limit || 5;
+            this.displayFn = getDisplayFn(o.display || o.displayKey);
+            this.templates = getTemplates(o.templates, this.displayFn);
+            this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source;
+            this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async;
+            this._resetLastSuggestion();
+            this.$el = $(o.node).addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name);
+        }
+        Dataset.extractData = function extractData(el) {
+            var $el = $(el);
+            if ($el.data(keys.obj)) {
+                return {
+                    val: $el.data(keys.val) || "",
+                    obj: $el.data(keys.obj) || null
+                };
+            }
+            return null;
+        };
+        _.mixin(Dataset.prototype, EventEmitter, {
+            _overwrite: function overwrite(query, suggestions) {
+                suggestions = suggestions || [];
+                if (suggestions.length) {
+                    this._renderSuggestions(query, suggestions);
+                } else if (this.async && this.templates.pending) {
+                    this._renderPending(query);
+                } else if (!this.async && this.templates.notFound) {
+                    this._renderNotFound(query);
+                } else {
+                    this._empty();
+                }
+                this.trigger("rendered", this.name, suggestions, false);
+            },
+            _append: function append(query, suggestions) {
+                suggestions = suggestions || [];
+                if (suggestions.length && this.$lastSuggestion.length) {
+                    this._appendSuggestions(query, suggestions);
+                } else if (suggestions.length) {
+                    this._renderSuggestions(query, suggestions);
+                } else if (!this.$lastSuggestion.length && this.templates.notFound) {
+                    this._renderNotFound(query);
+                }
+                this.trigger("rendered", this.name, suggestions, true);
+            },
+            _renderSuggestions: function renderSuggestions(query, suggestions) {
+                var $fragment;
+                $fragment = this._getSuggestionsFragment(query, suggestions);
+                this.$lastSuggestion = $fragment.children().last();
+                this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions));
+            },
+            _appendSuggestions: function appendSuggestions(query, suggestions) {
+                var $fragment, $lastSuggestion;
+                $fragment = this._getSuggestionsFragment(query, suggestions);
+                $lastSuggestion = $fragment.children().last();
+                this.$lastSuggestion.after($fragment);
+                this.$lastSuggestion = $lastSuggestion;
+            },
+            _renderPending: function renderPending(query) {
+                var template = this.templates.pending;
+                this._resetLastSuggestion();
+                template && this.$el.html(template({
+                    query: query,
+                    dataset: this.name
+                }));
+            },
+            _renderNotFound: function renderNotFound(query) {
+                var template = this.templates.notFound;
+                this._resetLastSuggestion();
+                template && this.$el.html(template({
+                    query: query,
+                    dataset: this.name
+                }));
+            },
+            _empty: function empty() {
+                this.$el.empty();
+                this._resetLastSuggestion();
+            },
+            _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) {
+                var that = this, fragment;
+                fragment = document.createDocumentFragment();
+                _.each(suggestions, function getSuggestionNode(suggestion) {
+                    var $el, context;
+                    context = that._injectQuery(query, suggestion);
+                    $el = $(that.templates.suggestion(context)).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable);
+                    fragment.appendChild($el[0]);
+                });
+                this.highlight && highlight({
+                    className: this.classes.highlight,
+                    node: fragment,
+                    pattern: query
+                });
+                return $(fragment);
+            },
+            _getFooter: function getFooter(query, suggestions) {
+                return this.templates.footer ? this.templates.footer({
+                    query: query,
+                    suggestions: suggestions,
+                    dataset: this.name
+                }) : null;
+            },
+            _getHeader: function getHeader(query, suggestions) {
+                return this.templates.header ? this.templates.header({
+                    query: query,
+                    suggestions: suggestions,
+                    dataset: this.name
+                }) : null;
+            },
+            _resetLastSuggestion: function resetLastSuggestion() {
+                this.$lastSuggestion = $();
+            },
+            _injectQuery: function injectQuery(query, obj) {
+                return _.isObject(obj) ? _.mixin({
+                    _query: query
+                }, obj) : obj;
+            },
+            update: function update(query) {
+                var that = this, canceled = false, syncCalled = false, rendered = 0;
+                this.cancel();
+                this.cancel = function cancel() {
+                    canceled = true;
+                    that.cancel = $.noop;
+                    that.async && that.trigger("asyncCanceled", query);
+                };
+                this.source(query, sync, async);
+                !syncCalled && sync([]);
+                function sync(suggestions) {
+                    if (syncCalled) {
+                        return;
+                    }
+                    syncCalled = true;
+                    suggestions = (suggestions || []).slice(0, that.limit);
+                    rendered = suggestions.length;
+                    that._overwrite(query, suggestions);
+                    if (rendered < that.limit && that.async) {
+                        that.trigger("asyncRequested", query);
+                    }
+                }
+                function async(suggestions) {
+                    suggestions = suggestions || [];
+                    if (!canceled && rendered < that.limit) {
+                        that.cancel = $.noop;
+                        rendered += suggestions.length;
+
+                        // HACK: because we don't have a synchronous way of
+                        // retrieving results, we use the async function every
+                        // time we update the drop-down; however, the typeahead
+                        // does some internal book-keeping which means that we
+                        // only get the additional items in the drop-down when
+                        // the next set of results is fetched, instead of all
+                        // of them (it appears to implicitly track which
+                        // results have already been shown in the drop-down); by
+                        // forcing an overwrite, we see all of the new results
+                        // every time we fetch a set of suggestions
+                        //that._append(query, suggestions.slice(0, that.limit - rendered));
+                        that._overwrite(query, suggestions);
+
+                        that.async && that.trigger("asyncReceived", query);
+                    }
+                }
+            },
+            cancel: $.noop,
+            clear: function clear() {
+                this._empty();
+                this.cancel();
+                this.trigger("cleared");
+            },
+            isEmpty: function isEmpty() {
+                return this.$el.is(":empty");
+            },
+            destroy: function destroy() {
+                this.$el = $("<div>");
+            }
+        });
+        return Dataset;
+        function getDisplayFn(display) {
+            display = display || _.stringify;
+            return _.isFunction(display) ? display : displayFn;
+            function displayFn(obj) {
+                return obj[display];
+            }
+        }
+        function getTemplates(templates, displayFn) {
+            return {
+                notFound: templates.notFound && _.templatify(templates.notFound),
+                pending: templates.pending && _.templatify(templates.pending),
+                header: templates.header && _.templatify(templates.header),
+                footer: templates.footer && _.templatify(templates.footer),
+                suggestion: templates.suggestion || suggestionTemplate
+            };
+            function suggestionTemplate(context) {
+                return $("<div>").text(displayFn(context));
+            }
+        }
+        function isValidName(str) {
+            return /^[_a-zA-Z0-9-]+$/.test(str);
+        }
+    }();
+    var Menu = function() {
+        "use strict";
+        function Menu(o, www) {
+            var that = this;
+            o = o || {};
+            if (!o.node) {
+                $.error("node is required");
+            }
+            www.mixin(this);
+            this.$node = $(o.node);
+            this.query = null;
+            this.datasets = _.map(o.datasets, initializeDataset);
+            function initializeDataset(oDataset) {
+                var node = that.$node.find(oDataset.node).first();
+                oDataset.node = node.length ? node : $("<div>").appendTo(that.$node);
+                return new Dataset(oDataset, www);
+            }
+        }
+        _.mixin(Menu.prototype, EventEmitter, {
+            _onSelectableClick: function onSelectableClick($e) {
+                this.trigger("selectableClicked", $($e.currentTarget));
+            },
+            _onRendered: function onRendered(type, dataset, suggestions, async) {
+                this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());
+                this.trigger("datasetRendered", dataset, suggestions, async);
+            },
+            _onCleared: function onCleared() {
+                this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());
+                this.trigger("datasetCleared");
+            },
+            _propagate: function propagate() {
+                this.trigger.apply(this, arguments);
+            },
+            _allDatasetsEmpty: function allDatasetsEmpty() {
+                return _.every(this.datasets, isDatasetEmpty);
+                function isDatasetEmpty(dataset) {
+                    return dataset.isEmpty();
+                }
+            },
+            _getSelectables: function getSelectables() {
+                return this.$node.find(this.selectors.selectable);
+            },
+            _removeCursor: function _removeCursor() {
+                var $selectable = this.getActiveSelectable();
+                $selectable && $selectable.removeClass(this.classes.cursor);
+            },
+            _ensureVisible: function ensureVisible($el) {
+                var elTop, elBottom, nodeScrollTop, nodeHeight;
+                elTop = $el.position().top;
+                elBottom = elTop + $el.outerHeight(true);
+                nodeScrollTop = this.$node.scrollTop();
+                nodeHeight = this.$node.height() + parseInt(this.$node.css("paddingTop"), 10) + parseInt(this.$node.css("paddingBottom"), 10);
+                if (elTop < 0) {
+                    this.$node.scrollTop(nodeScrollTop + elTop);
+                } else if (nodeHeight < elBottom) {
+                    this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight));
+                }
+            },
+            bind: function() {
+                var that = this, onSelectableClick;
+                onSelectableClick = _.bind(this._onSelectableClick, this);
+                this.$node.on("click.tt", this.selectors.selectable, onSelectableClick);
+                _.each(this.datasets, function(dataset) {
+                    dataset.onSync("asyncRequested", that._propagate, that).onSync("asyncCanceled", that._propagate, that).onSync("asyncReceived", that._propagate, that).onSync("rendered", that._onRendered, that).onSync("cleared", that._onCleared, that);
+                });
+                return this;
+            },
+            isOpen: function isOpen() {
+                return this.$node.hasClass(this.classes.open);
+            },
+            open: function open() {
+                this.$node.addClass(this.classes.open);
+            },
+            close: function close() {
+                this.$node.removeClass(this.classes.open);
+                this._removeCursor();
+            },
+            setLanguageDirection: function setLanguageDirection(dir) {
+                this.$node.attr("dir", dir);
+            },
+            selectableRelativeToCursor: function selectableRelativeToCursor(delta) {
+                var $selectables, $oldCursor, oldIndex, newIndex;
+                $oldCursor = this.getActiveSelectable();
+                $selectables = this._getSelectables();
+                oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1;
+                newIndex = oldIndex + delta;
+                newIndex = (newIndex + 1) % ($selectables.length + 1) - 1;
+                newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex;
+                return newIndex === -1 ? null : $selectables.eq(newIndex);
+            },
+            setCursor: function setCursor($selectable) {
+                this._removeCursor();
+                if ($selectable = $selectable && $selectable.first()) {
+                    $selectable.addClass(this.classes.cursor);
+                    this._ensureVisible($selectable);
+                }
+            },
+            getSelectableData: function getSelectableData($el) {
+                return $el && $el.length ? Dataset.extractData($el) : null;
+            },
+            getActiveSelectable: function getActiveSelectable() {
+                var $selectable = this._getSelectables().filter(this.selectors.cursor).first();
+                return $selectable.length ? $selectable : null;
+            },
+            getTopSelectable: function getTopSelectable() {
+                var $selectable = this._getSelectables().first();
+                return $selectable.length ? $selectable : null;
+            },
+            update: function update(query) {
+                var isValidUpdate = query !== this.query;
+                if (isValidUpdate) {
+                    this.query = query;
+                    _.each(this.datasets, updateDataset);
+                }
+                return isValidUpdate;
+                function updateDataset(dataset) {
+                    dataset.update(query);
+                }
+            },
+            empty: function empty() {
+                _.each(this.datasets, clearDataset);
+                this.query = null;
+                this.$node.addClass(this.classes.empty);
+                function clearDataset(dataset) {
+                    dataset.clear();
+                }
+            },
+            destroy: function destroy() {
+                this.$node.off(".tt");
+                this.$node = $("<div>");
+                _.each(this.datasets, destroyDataset);
+                function destroyDataset(dataset) {
+                    dataset.destroy();
+                }
+            }
+        });
+        return Menu;
+    }();
+    var DefaultMenu = function() {
+        "use strict";
+        var s = Menu.prototype;
+        function DefaultMenu() {
+            Menu.apply(this, [].slice.call(arguments, 0));
+        }
+        _.mixin(DefaultMenu.prototype, Menu.prototype, {
+            open: function open() {
+                !this._allDatasetsEmpty() && this._show();
+                return s.open.apply(this, [].slice.call(arguments, 0));
+            },
+            close: function close() {
+                this._hide();
+                return s.close.apply(this, [].slice.call(arguments, 0));
+            },
+            _onRendered: function onRendered() {
+                if (this._allDatasetsEmpty()) {
+                    this._hide();
+                } else {
+                    this.isOpen() && this._show();
+                }
+                return s._onRendered.apply(this, [].slice.call(arguments, 0));
+            },
+            _onCleared: function onCleared() {
+                if (this._allDatasetsEmpty()) {
+                    this._hide();
+                } else {
+                    this.isOpen() && this._show();
+                }
+                return s._onCleared.apply(this, [].slice.call(arguments, 0));
+            },
+            setLanguageDirection: function setLanguageDirection(dir) {
+                this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl);
+                return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0));
+            },
+            _hide: function hide() {
+                this.$node.hide();
+            },
+            _show: function show() {
+                this.$node.css("display", "block");
+            }
+        });
+        return DefaultMenu;
+    }();
+    var Typeahead = function() {
+        "use strict";
+        function Typeahead(o, www) {
+            var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged;
+            o = o || {};
+            if (!o.input) {
+                $.error("missing input");
+            }
+            if (!o.menu) {
+                $.error("missing menu");
+            }
+            if (!o.eventBus) {
+                $.error("missing event bus");
+            }
+            www.mixin(this);
+            this.eventBus = o.eventBus;
+            this.minLength = _.isNumber(o.minLength) ? o.minLength : 1;
+            this.input = o.input;
+            this.menu = o.menu;
+            this.enabled = true;
+            this.active = false;
+            this.input.hasFocus() && this.activate();
+            this.dir = this.input.getLangDir();
+            this._hacks();
+            this.menu.bind().onSync("selectableClicked", this._onSelectableClicked, this).onSync("asyncRequested", this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled, this).onSync("asyncReceived", this._onAsyncReceived, this).onSync("datasetRendered", this._onDatasetRendered, this).onSync("datasetCleared", this._onDatasetCleared, this);
+            onFocused = c(this, "activate", "open", "_onFocused");
+            onBlurred = c(this, "deactivate", "_onBlurred");
+            onEnterKeyed = c(this, "isActive", "isOpen", "_onEnterKeyed");
+            onTabKeyed = c(this, "isActive", "isOpen", "_onTabKeyed");
+            onEscKeyed = c(this, "isActive", "_onEscKeyed");
+            onUpKeyed = c(this, "isActive", "open", "_onUpKeyed");
+            onDownKeyed = c(this, "isActive", "open", "_onDownKeyed");
+            onLeftKeyed = c(this, "isActive", "isOpen", "_onLeftKeyed");
+            onRightKeyed = c(this, "isActive", "isOpen", "_onRightKeyed");
+            onQueryChanged = c(this, "_openIfActive", "_onQueryChanged");
+            onWhitespaceChanged = c(this, "_openIfActive", "_onWhitespaceChanged");
+            this.input.bind().onSync("focused", onFocused, this).onSync("blurred", onBlurred, this).onSync("enterKeyed", onEnterKeyed, this).onSync("tabKeyed", onTabKeyed, this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed", onUpKeyed, this).onSync("downKeyed", onDownKeyed, this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed", onRightKeyed, this).onSync("queryChanged", onQueryChanged, this).onSync("whitespaceChanged", onWhitespaceChanged, this).onSync("langDirChanged", this._onLangDirChanged, this);
+        }
+        _.mixin(Typeahead.prototype, {
+            _hacks: function hacks() {
+                var $input, $menu;
+                $input = this.input.$input || $("<div>");
+                $menu = this.menu.$node || $("<div>");
+                $input.on("blur.tt", function($e) {
+                    var active, isActive, hasActive;
+                    active = document.activeElement;
+                    isActive = $menu.is(active);
+                    hasActive = $menu.has(active).length > 0;
+                    if (_.isMsie() && (isActive || hasActive)) {
+                        $e.preventDefault();
+                        $e.stopImmediatePropagation();
+                        _.defer(function() {
+                            $input.focus();
+                        });
+                    }
+                });
+                $menu.on("mousedown.tt", function($e) {
+                    $e.preventDefault();
+                });
+            },
+            _onSelectableClicked: function onSelectableClicked(type, $el) {
+                this.select($el);
+            },
+            _onDatasetCleared: function onDatasetCleared() {
+                this._updateHint();
+            },
+            _onDatasetRendered: function onDatasetRendered(type, dataset, suggestions, async) {
+                this._updateHint();
+                this.eventBus.trigger("render", suggestions, async, dataset);
+            },
+            _onAsyncRequested: function onAsyncRequested(type, dataset, query) {
+                this.eventBus.trigger("asyncrequest", query, dataset);
+            },
+            _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) {
+                this.eventBus.trigger("asynccancel", query, dataset);
+            },
+            _onAsyncReceived: function onAsyncReceived(type, dataset, query) {
+                this.eventBus.trigger("asyncreceive", query, dataset);
+            },
+            _onFocused: function onFocused() {
+                this._minLengthMet() && this.menu.update(this.input.getQuery());
+            },
+            _onBlurred: function onBlurred() {
+                if (this.input.hasQueryChangedSinceLastFocus()) {
+                    this.eventBus.trigger("change", this.input.getQuery());
+                }
+            },
+            _onEnterKeyed: function onEnterKeyed(type, $e) {
+                var $selectable;
+                if ($selectable = this.menu.getActiveSelectable()) {
+                    this.select($selectable) && $e.preventDefault();
+                }
+            },
+            _onTabKeyed: function onTabKeyed(type, $e) {
+                var $selectable;
+                if ($selectable = this.menu.getActiveSelectable()) {
+                    this.select($selectable) && $e.preventDefault();
+                } else if ($selectable = this.menu.getTopSelectable()) {
+                    this.autocomplete($selectable) && $e.preventDefault();
+                }
+            },
+            _onEscKeyed: function onEscKeyed() {
+                this.close();
+            },
+            _onUpKeyed: function onUpKeyed() {
+                this.moveCursor(-1);
+            },
+            _onDownKeyed: function onDownKeyed() {
+                this.moveCursor(+1);
+            },
+            _onLeftKeyed: function onLeftKeyed() {
+                if (this.dir === "rtl" && this.input.isCursorAtEnd()) {
+                    this.autocomplete(this.menu.getTopSelectable());
+                }
+            },
+            _onRightKeyed: function onRightKeyed() {
+                if (this.dir === "ltr" && this.input.isCursorAtEnd()) {
+                    this.autocomplete(this.menu.getTopSelectable());
+                }
+            },
+            _onQueryChanged: function onQueryChanged(e, query) {
+                this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty();
+            },
+            _onWhitespaceChanged: function onWhitespaceChanged() {
+                this._updateHint();
+            },
+            _onLangDirChanged: function onLangDirChanged(e, dir) {
+                if (this.dir !== dir) {
+                    this.dir = dir;
+                    this.menu.setLanguageDirection(dir);
+                }
+            },
+            _openIfActive: function openIfActive() {
+                this.isActive() && this.open();
+            },
+            _minLengthMet: function minLengthMet(query) {
+                query = _.isString(query) ? query : this.input.getQuery() || "";
+                return query.length >= this.minLength;
+            },
+            _updateHint: function updateHint() {
+                var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match;
+                $selectable = this.menu.getTopSelectable();
+                data = this.menu.getSelectableData($selectable);
+                val = this.input.getInputValue();
+                if (data && !_.isBlankString(val) && !this.input.hasOverflow()) {
+                    query = Input.normalizeQuery(val);
+                    escapedQuery = _.escapeRegExChars(query);
+                    frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i");
+                    match = frontMatchRegEx.exec(data.val);
+                    match && this.input.setHint(val + match[1]);
+                } else {
+                    this.input.clearHint();
+                }
+            },
+            isEnabled: function isEnabled() {
+                return this.enabled;
+            },
+            enable: function enable() {
+                this.enabled = true;
+            },
+            disable: function disable() {
+                this.enabled = false;
+            },
+            isActive: function isActive() {
+                return this.active;
+            },
+            activate: function activate() {
+                if (this.isActive()) {
+                    return true;
+                } else if (!this.isEnabled() || this.eventBus.before("active")) {
+                    return false;
+                } else {
+                    this.active = true;
+                    this.eventBus.trigger("active");
+                    return true;
+                }
+            },
+            deactivate: function deactivate() {
+                if (!this.isActive()) {
+                    return true;
+                } else if (this.eventBus.before("idle")) {
+                    return false;
+                } else {
+                    this.active = false;
+                    this.close();
+                    this.eventBus.trigger("idle");
+                    return true;
+                }
+            },
+            isOpen: function isOpen() {
+                return this.menu.isOpen();
+            },
+            open: function open() {
+                if (!this.isOpen() && !this.eventBus.before("open")) {
+                    this.menu.open();
+                    this._updateHint();
+                    this.eventBus.trigger("open");
+                }
+                return this.isOpen();
+            },
+            close: function close() {
+                if (this.isOpen() && !this.eventBus.before("close")) {
+                    this.menu.close();
+                    this.input.clearHint();
+                    this.input.resetInputValue();
+                    this.eventBus.trigger("close");
+                }
+                return !this.isOpen();
+            },
+            setVal: function setVal(val) {
+                this.input.setQuery(_.toStr(val));
+            },
+            getVal: function getVal() {
+                return this.input.getQuery();
+            },
+            select: function select($selectable) {
+                var data = this.menu.getSelectableData($selectable);
+                if (data && !this.eventBus.before("select", data.obj)) {
+                    this.input.setQuery(data.val, true);
+                    this.eventBus.trigger("select", data.obj);
+                    this.close();
+                    return true;
+                }
+                return false;
+            },
+            autocomplete: function autocomplete($selectable) {
+                var query, data, isValid;
+                query = this.input.getQuery();
+                data = this.menu.getSelectableData($selectable);
+                isValid = data && query !== data.val;
+                if (isValid && !this.eventBus.before("autocomplete", data.obj)) {
+                    this.input.setQuery(data.val);
+                    this.eventBus.trigger("autocomplete", data.obj);
+                    return true;
+                }
+                return false;
+            },
+            moveCursor: function moveCursor(delta) {
+                var query, $candidate, data, payload, cancelMove;
+                query = this.input.getQuery();
+                $candidate = this.menu.selectableRelativeToCursor(delta);
+                data = this.menu.getSelectableData($candidate);
+                payload = data ? data.obj : null;
+                cancelMove = this._minLengthMet() && this.menu.update(query);
+                if (!cancelMove && !this.eventBus.before("cursorchange", payload)) {
+                    this.menu.setCursor($candidate);
+                    if (data) {
+                        this.input.setInputValue(data.val);
+                    } else {
+                        this.input.resetInputValue();
+                        this._updateHint();
+                    }
+                    this.eventBus.trigger("cursorchange", payload);
+                    return true;
+                }
+                return false;
+            },
+            destroy: function destroy() {
+                this.input.destroy();
+                this.menu.destroy();
+            }
+        });
+        return Typeahead;
+        function c(ctx) {
+            var methods = [].slice.call(arguments, 1);
+            return function() {
+                var args = [].slice.call(arguments);
+                _.each(methods, function(method) {
+                    return ctx[method].apply(ctx, args);
+                });
+            };
+        }
+    }();
+    (function() {
+        "use strict";
+        var old, keys, methods;
+        old = $.fn.typeahead;
+        keys = {
+            www: "tt-www",
+            attrs: "tt-attrs",
+            typeahead: "tt-typeahead"
+        };
+        methods = {
+            initialize: function initialize(o, datasets) {
+                var www;
+                datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1);
+                o = o || {};
+                www = WWW(o.classNames);
+                return this.each(attach);
+                function attach() {
+                    var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, typeahead, MenuConstructor;
+                    _.each(datasets, function(d) {
+                        d.highlight = !!o.highlight;
+                    });
+                    $input = $(this);
+                    $wrapper = $(www.html.wrapper);
+                    $hint = $elOrNull(o.hint);
+                    $menu = $elOrNull(o.menu);
+                    defaultHint = o.hint !== false && !$hint;
+                    defaultMenu = o.menu !== false && !$menu;
+                    defaultHint && ($hint = buildHintFromInput($input, www));
+                    defaultMenu && ($menu = $(www.html.menu).css(www.css.menu));
+                    $hint && $hint.val("");
+                    $input = prepInput($input, www);
+                    if (defaultHint || defaultMenu) {
+                        $wrapper.css(www.css.wrapper);
+                        $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint);
+                        $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null);
+                    }
+                    MenuConstructor = defaultMenu ? DefaultMenu : Menu;
+                    eventBus = new EventBus({
+                        el: $input
+                    });
+                    input = new Input({
+                        hint: $hint,
+                        input: $input
+                    }, www);
+                    menu = new MenuConstructor({
+                        node: $menu,
+                        datasets: datasets
+                    }, www);
+                    typeahead = new Typeahead({
+                        input: input,
+                        menu: menu,
+                        eventBus: eventBus,
+                        minLength: o.minLength
+                    }, www);
+                    $input.data(keys.www, www);
+                    $input.data(keys.typeahead, typeahead);
+                }
+            },
+            isEnabled: function isEnabled() {
+                var enabled;
+                ttEach(this.first(), function(t) {
+                    enabled = t.isEnabled();
+                });
+                return enabled;
+            },
+            enable: function enable() {
+                ttEach(this, function(t) {
+                    t.enable();
+                });
+                return this;
+            },
+            disable: function disable() {
+                ttEach(this, function(t) {
+                    t.disable();
+                });
+                return this;
+            },
+            isActive: function isActive() {
+                var active;
+                ttEach(this.first(), function(t) {
+                    active = t.isActive();
+                });
+                return active;
+            },
+            activate: function activate() {
+                ttEach(this, function(t) {
+                    t.activate();
+                });
+                return this;
+            },
+            deactivate: function deactivate() {
+                ttEach(this, function(t) {
+                    t.deactivate();
+                });
+                return this;
+            },
+            isOpen: function isOpen() {
+                var open;
+                ttEach(this.first(), function(t) {
+                    open = t.isOpen();
+                });
+                return open;
+            },
+            open: function open() {
+                ttEach(this, function(t) {
+                    t.open();
+                });
+                return this;
+            },
+            close: function close() {
+                ttEach(this, function(t) {
+                    t.close();
+                });
+                return this;
+            },
+            select: function select(el) {
+                var success = false, $el = $(el);
+                ttEach(this.first(), function(t) {
+                    success = t.select($el);
+                });
+                return success;
+            },
+            autocomplete: function autocomplete(el) {
+                var success = false, $el = $(el);
+                ttEach(this.first(), function(t) {
+                    success = t.autocomplete($el);
+                });
+                return success;
+            },
+            moveCursor: function moveCursoe(delta) {
+                var success = false;
+                ttEach(this.first(), function(t) {
+                    success = t.moveCursor(delta);
+                });
+                return success;
+            },
+            val: function val(newVal) {
+                var query;
+                if (!arguments.length) {
+                    ttEach(this.first(), function(t) {
+                        query = t.getVal();
+                    });
+                    return query;
+                } else {
+                    ttEach(this, function(t) {
+                        t.setVal(newVal);
+                    });
+                    return this;
+                }
+            },
+            destroy: function destroy() {
+                ttEach(this, function(typeahead, $input) {
+                    revert($input);
+                    typeahead.destroy();
+                });
+                return this;
+            }
+        };
+        $.fn.typeahead = function(method) {
+            if (methods[method]) {
+                return methods[method].apply(this, [].slice.call(arguments, 1));
+            } else {
+                return methods.initialize.apply(this, arguments);
+            }
+        };
+        $.fn.typeahead.noConflict = function noConflict() {
+            $.fn.typeahead = old;
+            return this;
+        };
+        function ttEach($els, fn) {
+            $els.each(function() {
+                var $input = $(this), typeahead;
+                (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input);
+            });
+        }
+        function buildHintFromInput($input, www) {
+            return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop("readonly", true).removeAttr("id name placeholder required").attr({
+                autocomplete: "off",
+                spellcheck: "false",
+                tabindex: -1
+            });
+        }
+        function prepInput($input, www) {
+            $input.data(keys.attrs, {
+                dir: $input.attr("dir"),
+                autocomplete: $input.attr("autocomplete"),
+                spellcheck: $input.attr("spellcheck"),
+                style: $input.attr("style")
+            });
+            $input.addClass(www.classes.input).attr({
+                autocomplete: "off",
+                spellcheck: false
+            });
+            try {
+                !$input.attr("dir") && $input.attr("dir", "auto");
+            } catch (e) {}
+            return $input;
+        }
+        function getBackgroundStyles($el) {
+            return {
+                backgroundAttachment: $el.css("background-attachment"),
+                backgroundClip: $el.css("background-clip"),
+                backgroundColor: $el.css("background-color"),
+                backgroundImage: $el.css("background-image"),
+                backgroundOrigin: $el.css("background-origin"),
+                backgroundPosition: $el.css("background-position"),
+                backgroundRepeat: $el.css("background-repeat"),
+                backgroundSize: $el.css("background-size")
+            };
+        }
+        function revert($input) {
+            var www, $wrapper;
+            www = $input.data(keys.www);
+            $wrapper = $input.parent().filter(www.selectors.wrapper);
+            _.each($input.data(keys.attrs), function(val, key) {
+                _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val);
+            });
+            $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input);
+            if ($wrapper.length) {
+                $input.detach().insertAfter($wrapper);
+                $wrapper.remove();
+            }
+        }
+        function $elOrNull(obj) {
+            var isValid, $el;
+            isValid = _.isJQuery(obj) || _.isElement(obj);
+            $el = isValid ? $(obj).first() : [];
+            return $el.length ? $el : null;
+        }
+    })();
+});
\ No newline at end of file
diff --git a/bitbake/lib/toaster/toastergui/static/js/typeahead.jquery.min.js b/bitbake/lib/toaster/toastergui/static/js/typeahead.jquery.min.js
deleted file mode 100644
index 962133a..0000000
--- a/bitbake/lib/toaster/toastergui/static/js/typeahead.jquery.min.js
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * typeahead.js 0.11.1
- * https://github.com/twitter/typeahead.js
- * Copyright 2013-2015 Twitter, Inc. and other contributors; Licensed MIT
- */
-
-!function(a,b){"function"==typeof define&&define.amd?define("typeahead.js",["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(a){var b=function(){"use strict";return{isMsie:function(){return/(msie|trident)/i.test(navigator.userAgent)?navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2]:!1},isBlankString:function(a){return!a||/^\s*$/.test(a)},escapeRegExChars:function(a){return a.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")},isString:function(a){return"string"==typeof a},isNumber:function(a){return"number"==typeof a},isArray:a.isArray,isFunction:a.isFunction,isObject:a.isPlainObject,isUndefined:function(a){return"undefined"==typeof a},isElement:function(a){return!(!a||1!==a.nodeType)},isJQuery:function(b){return b instanceof a},toStr:function(a){return b.isUndefined(a)||null===a?"":a+""},bind:a.proxy,each:function(b,c){function d(a,b){return c(b,a)}a.each(b,d)},map:a.map,filter:a.grep,every:function(b,c){var d=!0;return b?(a.each(b,function(a,e){return(d=c.call(null,e,a,b))?void 0:!1}),!!d):d},some:function(b,c){var d=!1;return b?(a.each(b,function(a,e){return(d=c.call(null,e,a,b))?!1:void 0}),!!d):d},mixin:a.extend,identity:function(a){return a},clone:function(b){return a.extend(!0,{},b)},getIdGenerator:function(){var a=0;return function(){return a++}},templatify:function(b){function c(){return String(b)}return a.isFunction(b)?b:c},defer:function(a){setTimeout(a,0)},debounce:function(a,b,c){var d,e;return function(){var f,g,h=this,i=arguments;return f=function(){d=null,c||(e=a.apply(h,i))},g=c&&!d,clearTimeout(d),d=setTimeout(f,b),g&&(e=a.apply(h,i)),e}},throttle:function(a,b){var c,d,e,f,g,h;return g=0,h=function(){g=new Date,e=null,f=a.apply(c,d)},function(){var i=new Date,j=b-(i-g);return c=this,d=arguments,0>=j?(clearTimeout(e),e=null,g=i,f=a.apply(c,d)):e||(e=setTimeout(h,j)),f}},stringify:function(a){return b.isString(a)?a:JSON.stringify(a)},noop:function(){}}}(),c=function(){"use strict";function a(a){var g,h;return h=b.mixin({},f,a),g={css:e(),classes:h,html:c(h),selectors:d(h)},{css:g.css,html:g.html,classes:g.classes,selectors:g.selectors,mixin:function(a){b.mixin(a,g)}}}function c(a){return{wrapper:'<span class="'+a.wrapper+'"></span>',menu:'<div class="'+a.menu+'"></div>'}}function d(a){var c={};return b.each(a,function(a,b){c[b]="."+a}),c}function e(){var a={wrapper:{position:"relative",display:"inline-block"},hint:{position:"absolute",top:"0",left:"0",borderColor:"transparent",boxShadow:"none",opacity:"1"},input:{position:"relative",verticalAlign:"top",backgroundColor:"transparent"},inputWithNoHint:{position:"relative",verticalAlign:"top"},menu:{position:"absolute",top:"100%",left:"0",zIndex:"100",display:"none"},ltr:{left:"0",right:"auto"},rtl:{left:"auto",right:" 0"}};return b.isMsie()&&b.mixin(a.input,{backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"}),a}var f={wrapper:"twitter-typeahead",input:"tt-input",hint:"tt-hint",menu:"tt-menu",dataset:"tt-dataset",suggestion:"tt-suggestion",selectable:"tt-selectable",empty:"tt-empty",open:"tt-open",cursor:"tt-cursor",highlight:"tt-highlight"};return a}(),d=function(){"use strict";function c(b){b&&b.el||a.error("EventBus initialized without el"),this.$el=a(b.el)}var d,e;return d="typeahead:",e={render:"rendered",cursorchange:"cursorchanged",select:"selected",autocomplete:"autocompleted"},b.mixin(c.prototype,{_trigger:function(b,c){var e;return e=a.Event(d+b),(c=c||[]).unshift(e),this.$el.trigger.apply(this.$el,c),e},before:function(a){var b,c;return b=[].slice.call(arguments,1),c=this._trigger("before"+a,b),c.isDefaultPrevented()},trigger:function(a){var b;this._trigger(a,[].slice.call(arguments,1)),(b=e[a])&&this._trigger(b,[].slice.call(arguments,1))}}),c}(),e=function(){"use strict";function a(a,b,c,d){var e;if(!c)return this;for(b=b.split(i),c=d?h(c,d):c,this._callbacks=this._callbacks||{};e=b.shift();)this._callbacks[e]=this._callbacks[e]||{sync:[],async:[]},this._callbacks[e][a].push(c);return this}function b(b,c,d){return a.call(this,"async",b,c,d)}function c(b,c,d){return a.call(this,"sync",b,c,d)}function d(a){var b;if(!this._callbacks)return this;for(a=a.split(i);b=a.shift();)delete this._callbacks[b];return this}function e(a){var b,c,d,e,g;if(!this._callbacks)return this;for(a=a.split(i),d=[].slice.call(arguments,1);(b=a.shift())&&(c=this._callbacks[b]);)e=f(c.sync,this,[b].concat(d)),g=f(c.async,this,[b].concat(d)),e()&&j(g);return this}function f(a,b,c){function d(){for(var d,e=0,f=a.length;!d&&f>e;e+=1)d=a[e].apply(b,c)===!1;return!d}return d}function g(){var a;return a=window.setImmediate?function(a){setImmediate(function(){a()})}:function(a){setTimeout(function(){a()},0)}}function h(a,b){return a.bind?a.bind(b):function(){a.apply(b,[].slice.call(arguments,0))}}var i=/\s+/,j=g();return{onSync:c,onAsync:b,off:d,trigger:e}}(),f=function(a){"use strict";function c(a,c,d){for(var e,f=[],g=0,h=a.length;h>g;g++)f.push(b.escapeRegExChars(a[g]));return e=d?"\\b("+f.join("|")+")\\b":"("+f.join("|")+")",c?new RegExp(e):new RegExp(e,"i")}var d={node:null,pattern:null,tagName:"strong",className:null,wordsOnly:!1,caseSensitive:!1};return function(e){function f(b){var c,d,f;return(c=h.exec(b.data))&&(f=a.createElement(e.tagName),e.className&&(f.className=e.className),d=b.splitText(c.index),d.splitText(c[0].length),f.appendChild(d.cloneNode(!0)),b.parentNode.replaceChild(f,d)),!!c}function g(a,b){for(var c,d=3,e=0;e<a.childNodes.length;e++)c=a.childNodes[e],c.nodeType===d?e+=b(c)?1:0:g(c,b)}var h;e=b.mixin({},d,e),e.node&&e.pattern&&(e.pattern=b.isArray(e.pattern)?e.pattern:[e.pattern],h=c(e.pattern,e.caseSensitive,e.wordsOnly),g(e.node,f))}}(window.document),g=function(){"use strict";function c(c,e){c=c||{},c.input||a.error("input is missing"),e.mixin(this),this.$hint=a(c.hint),this.$input=a(c.input),this.query=this.$input.val(),this.queryWhenFocused=this.hasFocus()?this.query:null,this.$overflowHelper=d(this.$input),this._checkLanguageDirection(),0===this.$hint.length&&(this.setHint=this.getHint=this.clearHint=this.clearHintIfInvalid=b.noop)}function d(b){return a('<pre aria-hidden="true"></pre>').css({position:"absolute",visibility:"hidden",whiteSpace:"pre",fontFamily:b.css("font-family"),fontSize:b.css("font-size"),fontStyle:b.css("font-style"),fontVariant:b.css("font-variant"),fontWeight:b.css("font-weight"),wordSpacing:b.css("word-spacing"),letterSpacing:b.css("letter-spacing"),textIndent:b.css("text-indent"),textRendering:b.css("text-rendering"),textTransform:b.css("text-transform")}).insertAfter(b)}function f(a,b){return c.normalizeQuery(a)===c.normalizeQuery(b)}function g(a){return a.altKey||a.ctrlKey||a.metaKey||a.shiftKey}var h;return h={9:"tab",27:"esc",37:"left",39:"right",13:"enter",38:"up",40:"down"},c.normalizeQuery=function(a){return b.toStr(a).replace(/^\s*/g,"").replace(/\s{2,}/g," ")},b.mixin(c.prototype,e,{_onBlur:function(){this.resetInputValue(),this.trigger("blurred")},_onFocus:function(){this.queryWhenFocused=this.query,this.trigger("focused")},_onKeydown:function(a){var b=h[a.which||a.keyCode];this._managePreventDefault(b,a),b&&this._shouldTrigger(b,a)&&this.trigger(b+"Keyed",a)},_onInput:function(){this._setQuery(this.getInputValue()),this.clearHintIfInvalid(),this._checkLanguageDirection()},_managePreventDefault:function(a,b){var c;switch(a){case"up":case"down":c=!g(b);break;default:c=!1}c&&b.preventDefault()},_shouldTrigger:function(a,b){var c;switch(a){case"tab":c=!g(b);break;default:c=!0}return c},_checkLanguageDirection:function(){var a=(this.$input.css("direction")||"ltr").toLowerCase();this.dir!==a&&(this.dir=a,this.$hint.attr("dir",a),this.trigger("langDirChanged",a))},_setQuery:function(a,b){var c,d;c=f(a,this.query),d=c?this.query.length!==a.length:!1,this.query=a,b||c?!b&&d&&this.trigger("whitespaceChanged",this.query):this.trigger("queryChanged",this.query)},bind:function(){var a,c,d,e,f=this;return a=b.bind(this._onBlur,this),c=b.bind(this._onFocus,this),d=b.bind(this._onKeydown,this),e=b.bind(this._onInput,this),this.$input.on("blur.tt",a).on("focus.tt",c).on("keydown.tt",d),!b.isMsie()||b.isMsie()>9?this.$input.on("input.tt",e):this.$input.on("keydown.tt keypress.tt cut.tt paste.tt",function(a){h[a.which||a.keyCode]||b.defer(b.bind(f._onInput,f,a))}),this},focus:function(){this.$input.focus()},blur:function(){this.$input.blur()},getLangDir:function(){return this.dir},getQuery:function(){return this.query||""},setQuery:function(a,b){this.setInputValue(a),this._setQuery(a,b)},hasQueryChangedSinceLastFocus:function(){return this.query!==this.queryWhenFocused},getInputValue:function(){return this.$input.val()},setInputValue:function(a){this.$input.val(a),this.clearHintIfInvalid(),this._checkLanguageDirection()},resetInputValue:function(){this.setInputValue(this.query)},getHint:function(){return this.$hint.val()},setHint:function(a){this.$hint.val(a)},clearHint:function(){this.setHint("")},clearHintIfInvalid:function(){var a,b,c,d;a=this.getInputValue(),b=this.getHint(),c=a!==b&&0===b.indexOf(a),d=""!==a&&c&&!this.hasOverflow(),!d&&this.clearHint()},hasFocus:function(){return this.$input.is(":focus")},hasOverflow:function(){var a=this.$input.width()-2;return this.$overflowHelper.text(this.getInputValue()),this.$overflowHelper.width()>=a},isCursorAtEnd:function(){var a,c,d;return a=this.$input.val().length,c=this.$input[0].selectionStart,b.isNumber(c)?c===a:document.selection?(d=document.selection.createRange(),d.moveStart("character",-a),a===d.text.length):!0},destroy:function(){this.$hint.off(".tt"),this.$input.off(".tt"),this.$overflowHelper.remove(),this.$hint=this.$input=this.$overflowHelper=a("<div>")}}),c}(),h=function(){"use strict";function c(c,e){c=c||{},c.templates=c.templates||{},c.templates.notFound=c.templates.notFound||c.templates.empty,c.source||a.error("missing source"),c.node||a.error("missing node"),c.name&&!h(c.name)&&a.error("invalid dataset name: "+c.name),e.mixin(this),this.highlight=!!c.highlight,this.name=c.name||j(),this.limit=c.limit||5,this.displayFn=d(c.display||c.displayKey),this.templates=g(c.templates,this.displayFn),this.source=c.source.__ttAdapter?c.source.__ttAdapter():c.source,this.async=b.isUndefined(c.async)?this.source.length>2:!!c.async,this._resetLastSuggestion(),this.$el=a(c.node).addClass(this.classes.dataset).addClass(this.classes.dataset+"-"+this.name)}function d(a){function c(b){return b[a]}return a=a||b.stringify,b.isFunction(a)?a:c}function g(c,d){function e(b){return a("<div>").text(d(b))}return{notFound:c.notFound&&b.templatify(c.notFound),pending:c.pending&&b.templatify(c.pending),header:c.header&&b.templatify(c.header),footer:c.footer&&b.templatify(c.footer),suggestion:c.suggestion||e}}function h(a){return/^[_a-zA-Z0-9-]+$/.test(a)}var i,j;return i={val:"tt-selectable-display",obj:"tt-selectable-object"},j=b.getIdGenerator(),c.extractData=function(b){var c=a(b);return c.data(i.obj)?{val:c.data(i.val)||"",obj:c.data(i.obj)||null}:null},b.mixin(c.prototype,e,{_overwrite:function(a,b){b=b||[],b.length?this._renderSuggestions(a,b):this.async&&this.templates.pending?this._renderPending(a):!this.async&&this.templates.notFound?this._renderNotFound(a):this._empty(),this.trigger("rendered",this.name,b,!1)},_append:function(a,b){b=b||[],b.length&&this.$lastSuggestion.length?this._appendSuggestions(a,b):b.length?this._renderSuggestions(a,b):!this.$lastSuggestion.length&&this.templates.notFound&&this._renderNotFound(a),this.trigger("rendered",this.name,b,!0)},_renderSuggestions:function(a,b){var c;c=this._getSuggestionsFragment(a,b),this.$lastSuggestion=c.children().last(),this.$el.html(c).prepend(this._getHeader(a,b)).append(this._getFooter(a,b))},_appendSuggestions:function(a,b){var c,d;c=this._getSuggestionsFragment(a,b),d=c.children().last(),this.$lastSuggestion.after(c),this.$lastSuggestion=d},_renderPending:function(a){var b=this.templates.pending;this._resetLastSuggestion(),b&&this.$el.html(b({query:a,dataset:this.name}))},_renderNotFound:function(a){var b=this.templates.notFound;this._resetLastSuggestion(),b&&this.$el.html(b({query:a,dataset:this.name}))},_empty:function(){this.$el.empty(),this._resetLastSuggestion()},_getSuggestionsFragment:function(c,d){var e,g=this;return e=document.createDocumentFragment(),b.each(d,function(b){var d,f;f=g._injectQuery(c,b),d=a(g.templates.suggestion(f)).data(i.obj,b).data(i.val,g.displayFn(b)).addClass(g.classes.suggestion+" "+g.classes.selectable),e.appendChild(d[0])}),this.highlight&&f({className:this.classes.highlight,node:e,pattern:c}),a(e)},_getFooter:function(a,b){return this.templates.footer?this.templates.footer({query:a,suggestions:b,dataset:this.name}):null},_getHeader:function(a,b){return this.templates.header?this.templates.header({query:a,suggestions:b,dataset:this.name}):null},_resetLastSuggestion:function(){this.$lastSuggestion=a()},_injectQuery:function(a,c){return b.isObject(c)?b.mixin({_query:a},c):c},update:function(b){function c(a){g||(g=!0,a=(a||[]).slice(0,e.limit),h=a.length,e._overwrite(b,a),h<e.limit&&e.async&&e.trigger("asyncRequested",b))}function d(c){c=c||[],!f&&h<e.limit&&(e.cancel=a.noop,h+=c.length,e._append(b,c.slice(0,e.limit-h)),e.async&&e.trigger("asyncReceived",b))}var e=this,f=!1,g=!1,h=0;this.cancel(),this.cancel=function(){f=!0,e.cancel=a.noop,e.async&&e.trigger("asyncCanceled",b)},this.source(b,c,d),!g&&c([])},cancel:a.noop,clear:function(){this._empty(),this.cancel(),this.trigger("cleared")},isEmpty:function(){return this.$el.is(":empty")},destroy:function(){this.$el=a("<div>")}}),c}(),i=function(){"use strict";function c(c,d){function e(b){var c=f.$node.find(b.node).first();return b.node=c.length?c:a("<div>").appendTo(f.$node),new h(b,d)}var f=this;c=c||{},c.node||a.error("node is required"),d.mixin(this),this.$node=a(c.node),this.query=null,this.datasets=b.map(c.datasets,e)}return b.mixin(c.prototype,e,{_onSelectableClick:function(b){this.trigger("selectableClicked",a(b.currentTarget))},_onRendered:function(a,b,c,d){this.$node.toggleClass(this.classes.empty,this._allDatasetsEmpty()),this.trigger("datasetRendered",b,c,d)},_onCleared:function(){this.$node.toggleClass(this.classes.empty,this._allDatasetsEmpty()),this.trigger("datasetCleared")},_propagate:function(){this.trigger.apply(this,arguments)},_allDatasetsEmpty:function(){function a(a){return a.isEmpty()}return b.every(this.datasets,a)},_getSelectables:function(){return this.$node.find(this.selectors.selectable)},_removeCursor:function(){var a=this.getActiveSelectable();a&&a.removeClass(this.classes.cursor)},_ensureVisible:function(a){var b,c,d,e;b=a.position().top,c=b+a.outerHeight(!0),d=this.$node.scrollTop(),e=this.$node.height()+parseInt(this.$node.css("paddingTop"),10)+parseInt(this.$node.css("paddingBottom"),10),0>b?this.$node.scrollTop(d+b):c>e&&this.$node.scrollTop(d+(c-e))},bind:function(){var a,c=this;return a=b.bind(this._onSelectableClick,this),this.$node.on("click.tt",this.selectors.selectable,a),b.each(this.datasets,function(a){a.onSync("asyncRequested",c._propagate,c).onSync("asyncCanceled",c._propagate,c).onSync("asyncReceived",c._propagate,c).onSync("rendered",c._onRendered,c).onSync("cleared",c._onCleared,c)}),this},isOpen:function(){return this.$node.hasClass(this.classes.open)},open:function(){this.$node.addClass(this.classes.open)},close:function(){this.$node.removeClass(this.classes.open),this._removeCursor()},setLanguageDirection:function(a){this.$node.attr("dir",a)},selectableRelativeToCursor:function(a){var b,c,d,e;return c=this.getActiveSelectable(),b=this._getSelectables(),d=c?b.index(c):-1,e=d+a,e=(e+1)%(b.length+1)-1,e=-1>e?b.length-1:e,-1===e?null:b.eq(e)},setCursor:function(a){this._removeCursor(),(a=a&&a.first())&&(a.addClass(this.classes.cursor),this._ensureVisible(a))},getSelectableData:function(a){return a&&a.length?h.extractData(a):null},getActiveSelectable:function(){var a=this._getSelectables().filter(this.selectors.cursor).first();return a.length?a:null},getTopSelectable:function(){var a=this._getSelectables().first();return a.length?a:null},update:function(a){function c(b){b.update(a)}var d=a!==this.query;return d&&(this.query=a,b.each(this.datasets,c)),d},empty:function(){function a(a){a.clear()}b.each(this.datasets,a),this.query=null,this.$node.addClass(this.classes.empty)},destroy:function(){function c(a){a.destroy()}this.$node.off(".tt"),this.$node=a("<div>"),b.each(this.datasets,c)}}),c}(),j=function(){"use strict";function a(){i.apply(this,[].slice.call(arguments,0))}var c=i.prototype;return b.mixin(a.prototype,i.prototype,{open:function(){return!this._allDatasetsEmpty()&&this._show(),c.open.apply(this,[].slice.call(arguments,0))},close:function(){return this._hide(),c.close.apply(this,[].slice.call(arguments,0))},_onRendered:function(){return this._allDatasetsEmpty()?this._hide():this.isOpen()&&this._show(),c._onRendered.apply(this,[].slice.call(arguments,0))},_onCleared:function(){return this._allDatasetsEmpty()?this._hide():this.isOpen()&&this._show(),c._onCleared.apply(this,[].slice.call(arguments,0))},setLanguageDirection:function(a){return this.$node.css("ltr"===a?this.css.ltr:this.css.rtl),c.setLanguageDirection.apply(this,[].slice.call(arguments,0))},_hide:function(){this.$node.hide()},_show:function(){this.$node.css("display","block")}}),a}(),k=function(){"use strict";function c(c,e){var f,g,h,i,j,k,l,m,n,o,p;c=c||{},c.input||a.error("missing input"),c.menu||a.error("missing menu"),c.eventBus||a.error("missing event bus"),e.mixin(this),this.eventBus=c.eventBus,this.minLength=b.isNumber(c.minLength)?c.minLength:1,this.input=c.input,this.menu=c.menu,this.enabled=!0,this.active=!1,this.input.hasFocus()&&this.activate(),this.dir=this.input.getLangDir(),this._hacks(),this.menu.bind().onSync("selectableClicked",this._onSelectableClicked,this).onSync("asyncRequested",this._onAsyncRequested,this).onSync("asyncCanceled",this._onAsyncCanceled,this).onSync("asyncReceived",this._onAsyncReceived,this).onSync("datasetRendered",this._onDatasetRendered,this).onSync("datasetCleared",this._onDatasetCleared,this),f=d(this,"activate","open","_onFocused"),g=d(this,"deactivate","_onBlurred"),h=d(this,"isActive","isOpen","_onEnterKeyed"),i=d(this,"isActive","isOpen","_onTabKeyed"),j=d(this,"isActive","_onEscKeyed"),k=d(this,"isActive","open","_onUpKeyed"),l=d(this,"isActive","open","_onDownKeyed"),m=d(this,"isActive","isOpen","_onLeftKeyed"),n=d(this,"isActive","isOpen","_onRightKeyed"),o=d(this,"_openIfActive","_onQueryChanged"),p=d(this,"_openIfActive","_onWhitespaceChanged"),this.input.bind().onSync("focused",f,this).onSync("blurred",g,this).onSync("enterKeyed",h,this).onSync("tabKeyed",i,this).onSync("escKeyed",j,this).onSync("upKeyed",k,this).onSync("downKeyed",l,this).onSync("leftKeyed",m,this).onSync("rightKeyed",n,this).onSync("queryChanged",o,this).onSync("whitespaceChanged",p,this).onSync("langDirChanged",this._onLangDirChanged,this)}function d(a){var c=[].slice.call(arguments,1);return function(){var d=[].slice.call(arguments);b.each(c,function(b){return a[b].apply(a,d)})}}return b.mixin(c.prototype,{_hacks:function(){var c,d;c=this.input.$input||a("<div>"),d=this.menu.$node||a("<div>"),c.on("blur.tt",function(a){var e,f,g;e=document.activeElement,f=d.is(e),g=d.has(e).length>0,b.isMsie()&&(f||g)&&(a.preventDefault(),a.stopImmediatePropagation(),b.defer(function(){c.focus()}))}),d.on("mousedown.tt",function(a){a.preventDefault()})},_onSelectableClicked:function(a,b){this.select(b)},_onDatasetCleared:function(){this._updateHint()},_onDatasetRendered:function(a,b,c,d){this._updateHint(),this.eventBus.trigger("render",c,d,b)},_onAsyncRequested:function(a,b,c){this.eventBus.trigger("asyncrequest",c,b)},_onAsyncCanceled:function(a,b,c){this.eventBus.trigger("asynccancel",c,b)},_onAsyncReceived:function(a,b,c){this.eventBus.trigger("asyncreceive",c,b)},_onFocused:function(){this._minLengthMet()&&this.menu.update(this.input.getQuery())},_onBlurred:function(){this.input.hasQueryChangedSinceLastFocus()&&this.eventBus.trigger("change",this.input.getQuery())},_onEnterKeyed:function(a,b){var c;(c=this.menu.getActiveSelectable())&&this.select(c)&&b.preventDefault()},_onTabKeyed:function(a,b){var c;(c=this.menu.getActiveSelectable())?this.select(c)&&b.preventDefault():(c=this.menu.getTopSelectable())&&this.autocomplete(c)&&b.preventDefault()},_onEscKeyed:function(){this.close()},_onUpKeyed:function(){this.moveCursor(-1)},_onDownKeyed:function(){this.moveCursor(1)},_onLeftKeyed:function(){"rtl"===this.dir&&this.input.isCursorAtEnd()&&this.autocomplete(this.menu.getTopSelectable())},_onRightKeyed:function(){"ltr"===this.dir&&this.input.isCursorAtEnd()&&this.autocomplete(this.menu.getTopSelectable())},_onQueryChanged:function(a,b){this._minLengthMet(b)?this.menu.update(b):this.menu.empty()},_onWhitespaceChanged:function(){this._updateHint()},_onLangDirChanged:function(a,b){this.dir!==b&&(this.dir=b,this.menu.setLanguageDirection(b))},_openIfActive:function(){this.isActive()&&this.open()},_minLengthMet:function(a){return a=b.isString(a)?a:this.input.getQuery()||"",a.length>=this.minLength},_updateHint:function(){var a,c,d,e,f,h,i;a=this.menu.getTopSelectable(),c=this.menu.getSelectableData(a),d=this.input.getInputValue(),!c||b.isBlankString(d)||this.input.hasOverflow()?this.input.clearHint():(e=g.normalizeQuery(d),f=b.escapeRegExChars(e),h=new RegExp("^(?:"+f+")(.+$)","i"),i=h.exec(c.val),i&&this.input.setHint(d+i[1]))},isEnabled:function(){return this.enabled},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},isActive:function(){return this.active},activate:function(){return this.isActive()?!0:!this.isEnabled()||this.eventBus.before("active")?!1:(this.active=!0,this.eventBus.trigger("active"),!0)},deactivate:function(){return this.isActive()?this.eventBus.before("idle")?!1:(this.active=!1,this.close(),this.eventBus.trigger("idle"),!0):!0},isOpen:function(){return this.menu.isOpen()},open:function(){return this.isOpen()||this.eventBus.before("open")||(this.menu.open(),this._updateHint(),this.eventBus.trigger("open")),this.isOpen()},close:function(){return this.isOpen()&&!this.eventBus.before("close")&&(this.menu.close(),this.input.clearHint(),this.input.resetInputValue(),this.eventBus.trigger("close")),!this.isOpen()},setVal:function(a){this.input.setQuery(b.toStr(a))},getVal:function(){return this.input.getQuery()},select:function(a){var b=this.menu.getSelectableData(a);return b&&!this.eventBus.before("select",b.obj)?(this.input.setQuery(b.val,!0),this.eventBus.trigger("select",b.obj),this.close(),!0):!1},autocomplete:function(a){var b,c,d;return b=this.input.getQuery(),c=this.menu.getSelectableData(a),d=c&&b!==c.val,d&&!this.eventBus.before("autocomplete",c.obj)?(this.input.setQuery(c.val),this.eventBus.trigger("autocomplete",c.obj),!0):!1},moveCursor:function(a){var b,c,d,e,f;return b=this.input.getQuery(),c=this.menu.selectableRelativeToCursor(a),d=this.menu.getSelectableData(c),e=d?d.obj:null,f=this._minLengthMet()&&this.menu.update(b),f||this.eventBus.before("cursorchange",e)?!1:(this.menu.setCursor(c),d?this.input.setInputValue(d.val):(this.input.resetInputValue(),this._updateHint()),this.eventBus.trigger("cursorchange",e),!0)},destroy:function(){this.input.destroy(),this.menu.destroy()}}),c}();!function(){"use strict";function e(b,c){b.each(function(){var b,d=a(this);(b=d.data(p.typeahead))&&c(b,d)})}function f(a,b){return a.clone().addClass(b.classes.hint).removeData().css(b.css.hint).css(l(a)).prop("readonly",!0).removeAttr("id name placeholder required").attr({autocomplete:"off",spellcheck:"false",tabindex:-1})}function h(a,b){a.data(p.attrs,{dir:a.attr("dir"),autocomplete:a.attr("autocomplete"),spellcheck:a.attr("spellcheck"),style:a.attr("style")}),a.addClass(b.classes.input).attr({autocomplete:"off",spellcheck:!1});try{!a.attr("dir")&&a.attr("dir","auto")}catch(c){}return a}function l(a){return{backgroundAttachment:a.css("background-attachment"),backgroundClip:a.css("background-clip"),backgroundColor:a.css("background-color"),backgroundImage:a.css("background-image"),backgroundOrigin:a.css("background-origin"),backgroundPosition:a.css("background-position"),backgroundRepeat:a.css("background-repeat"),backgroundSize:a.css("background-size")}}function m(a){var c,d;c=a.data(p.www),d=a.parent().filter(c.selectors.wrapper),b.each(a.data(p.attrs),function(c,d){b.isUndefined(c)?a.removeAttr(d):a.attr(d,c)}),a.removeData(p.typeahead).removeData(p.www).removeData(p.attr).removeClass(c.classes.input),d.length&&(a.detach().insertAfter(d),d.remove())}function n(c){var d,e;return d=b.isJQuery(c)||b.isElement(c),e=d?a(c).first():[],e.length?e:null}var o,p,q;o=a.fn.typeahead,p={www:"tt-www",attrs:"tt-attrs",typeahead:"tt-typeahead"},q={initialize:function(e,l){function m(){var c,m,q,r,s,t,u,v,w,x,y;b.each(l,function(a){a.highlight=!!e.highlight}),c=a(this),m=a(o.html.wrapper),q=n(e.hint),r=n(e.menu),s=e.hint!==!1&&!q,t=e.menu!==!1&&!r,s&&(q=f(c,o)),t&&(r=a(o.html.menu).css(o.css.menu)),q&&q.val(""),c=h(c,o),(s||t)&&(m.css(o.css.wrapper),c.css(s?o.css.input:o.css.inputWithNoHint),c.wrap(m).parent().prepend(s?q:null).append(t?r:null)),y=t?j:i,u=new d({el:c}),v=new g({hint:q,input:c},o),w=new y({node:r,datasets:l},o),x=new k({input:v,menu:w,eventBus:u,minLength:e.minLength},o),c.data(p.www,o),c.data(p.typeahead,x)}var o;return l=b.isArray(l)?l:[].slice.call(arguments,1),e=e||{},o=c(e.classNames),this.each(m)},isEnabled:function(){var a;return e(this.first(),function(b){a=b.isEnabled()}),a},enable:function(){return e(this,function(a){a.enable()}),this},disable:function(){return e(this,function(a){a.disable()}),this},isActive:function(){var a;return e(this.first(),function(b){a=b.isActive()}),a},activate:function(){return e(this,function(a){a.activate()}),this},deactivate:function(){return e(this,function(a){a.deactivate()}),this},isOpen:function(){var a;return e(this.first(),function(b){a=b.isOpen()}),a},open:function(){return e(this,function(a){a.open()}),this},close:function(){return e(this,function(a){a.close()}),this},select:function(b){var c=!1,d=a(b);return e(this.first(),function(a){c=a.select(d)}),c},autocomplete:function(b){var c=!1,d=a(b);return e(this.first(),function(a){c=a.autocomplete(d)}),c},moveCursor:function(a){var b=!1;return e(this.first(),function(c){b=c.moveCursor(a)}),b},val:function(a){var b;return arguments.length?(e(this,function(b){b.setVal(a)}),this):(e(this.first(),function(a){b=a.getVal()}),b)},destroy:function(){return e(this,function(a,b){m(b),a.destroy()}),this}},a.fn.typeahead=function(a){return q[a]?q[a].apply(this,[].slice.call(arguments,1)):q.initialize.apply(this,arguments)},a.fn.typeahead.noConflict=function(){return a.fn.typeahead=o,this}}()});
\ No newline at end of file
diff --git a/bitbake/lib/toaster/toastergui/templates/base.html b/bitbake/lib/toaster/toastergui/templates/base.html
index 1c0f88c..e930f43 100644
--- a/bitbake/lib/toaster/toastergui/templates/base.html
+++ b/bitbake/lib/toaster/toastergui/templates/base.html
@@ -22,7 +22,7 @@
     </script>
     <script src="{% static 'js/bootstrap.min.js' %}">
     </script>
-    <script src="{% static 'js/typeahead.jquery.min.js' %}">
+    <script src="{% static 'js/typeahead.jquery.js' %}">
     </script>
     <script src="{% static 'js/prettify.js' %}">
     </script>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 061/106] toaster: Remove old bootstrap files left behind
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (57 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 060/106] toaster: work-around our lack of a synchronous fetch for typeaheads Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 062/106] toaster: Fix the custom image modal dialogs Belen Barros Pena
                   ` (44 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

From: Michael Wood <michael.g.wood@intel.com>

Signed-off-by: Michael Wood <michael.g.wood@intel.com>
---
 .../static/img/glyphicons-halflings-white.png           | Bin 8777 -> 0 bytes
 .../toastergui/static/img/glyphicons-halflings.png      | Bin 12799 -> 0 bytes
 2 files changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 bitbake/lib/toaster/toastergui/static/img/glyphicons-halflings-white.png
 delete mode 100644 bitbake/lib/toaster/toastergui/static/img/glyphicons-halflings.png

diff --git a/bitbake/lib/toaster/toastergui/static/img/glyphicons-halflings-white.png b/bitbake/lib/toaster/toastergui/static/img/glyphicons-halflings-white.png
deleted file mode 100644
index 3bf6484a29d8da269f9bc874b25493a45fae3bae..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8777
zcmZvC1yGz#v+m*$LXcp=A$ZWB0fL7wNbp_U*$~{_gL`my3oP#L!5tQYy99Ta`+g_q
zKlj|KJ2f@c)ARJx{q*b<Rc{fZDE|-E3z8Qg5C}{9v!pTzga8NZOmrk*O`5892Z0dh
z6y;PuJwHDK9$?(w-u|_L_3`o1($W%e0`}kWUyy&dCnqOQPfu4@SAgf?;o*P$z|s8t
zJh1KR>bkhN_!|Wn*Vos8{TEhUT@5e;_WJsIMMcG5%>DiS&dv_N`4@J0cnAQ-#>RjZ
z00W5t&tJ^l-QC*ST1-p~00u^9XJ=AUl7oW-;2a+x2k__T=grN{+1c4XK0ZL~^z^i$
zp&>vEhr@4fZWb380S18T&!0cQ3IKpHF)?v=b_NIm0Q>v<fKgXh*W25>wY7D0baZ)n
z31Fa5sELUQARIVaU0nqf0XzT+fB_63aA;@<$l~wse|mcA;^G1TmX?-)e)jkGPfkuA
z92@|!<>h5S_4f8QP-JRq>d&7)^Yin8l7K8gED$&_FaV?gY+wLjpoW%~7NDe=nHfMG
z5DO3j{R9kv5GbssrUpO)<pElNvVjx;Inad7%}rnn)BtoiIXM{s0C>Oyv<s*i2m!7M
zNCXUk1jq|?5|99_k&%%AIlu-a0ty3=KxY8j%*;&S3IIajE_Qc!f%*X_5DScgf&xH0
zumu>Vrlx>u0UKD0i;Dpm5S5dY16(DL5l{ixz|mhJU@&-OWCTb7_%}8-fE(P~+XIRO
zJU|wp1|S>|J3KrLcz^+v1f&BDpd>&MAaibR4#5A_4(MucZwG9E1h4@u0P@C8;oo+g
zIVj7kfJi{oV~E(NZ*h(@^<JQ`7oGGHtP>-(Q(C`Psb3KZ{N;^GB(a8NE*Vwc715!9
zr-H4Ao|T_c6+VT_JH9H+P3>iXSt!a$F`>s`jn`w9GZ_~B!{<w2b}Uz=xRP0Noee!5
zHGxHKH;uZjouChSB9)ldcOm@{14~ct04{b8>0soaiV|O_c^R2aWa%}O3jUE)WO=pa
zs~_Wz08z|ieY5A%$@FcBF9^!1a}m5ks@7gjn;67N>}S~Hrm`4sM5Hh`q7&5-N{|31
z6x1{ol7Bn<k_m&K*9NkB7ANp6;_WSmra!UL^eY+pz_w5LlB(g$UY9|-AP@zsw4|7-
zi|#>skoViZ<brlX21G1wL@^v%v2P&MSTZc8SKT&&Tq!~%Uw%k^(D<O<S;ewoH)@(b
zb2Z<#wBV6y-?HHFVJFRg^me&@Reg!dys6F1>0GqbLa#kW`Z<Hy>)VCjt1MysKg|rT
zi!?s#<KsBd5lg=VLu4^|xo0%enAx0mMXMSpk0KF_*gOS;jx!zP=@5TPN+S>#Ck>8c
zpi|>$lGlw#@yMNi&V4`6OBGJ(H&7lqLlcTQ&1zWriG_fL>BnFcr~?;E93{M-xIozQ
zO=EHQ#+?<}%@wbWWv23#!V70h9MOuUVaU>3kpTvYfc|LBw?&b*89~Gc9i&8tlT#kF
ztpbZoAzkdB+UTy=tx%L3Z4)I{zY(Kb)eg{InobSJmNwPZt$14aS-uc4eKuY<?xyi!
z`TeGpun(kP^7#~<fX0r^ExRQwveWDF;DOQbL}?LBzt>8h$dtfyxu^a%zA)<y|4;I#
zFU8x7%0eT|Hd@3!T6Anh3IoHrN%@H8e6ge;3u)_$N2H&Rv2`ml6;kL~xS07C5Nzt<
z>>fYI&)@ZXky?^{5>xSC?;w4r&td6vBdi%vHm4=XJH!3yL3?Ep+T5aU_>i;yr_XGq
zxZfCzUU@GvnoIk+_Nd`aky>S&H!b*{A%L>?*XPAgWL(Vf(k7qUS}>Zn=U(ZfcOc{B
z3*tOHH@t5Ub5D~#N7!Fxx}P2)sy{vE_l(R7$aW&CX>c|&HY+7};vUIietK%}!ph<X
z*_6&Ee=)&D@nDa!y{$f<(Q`UdM+|H2ksGEhG7utFYl`Y6pD#+4LC8Hw@6|1H-x{D`
zE$uaNS!i^Rx(%B(My5}1#H73>rCuh+;C@1usp;XLU<8Gq8P!rEI3<U)y>ieg#W$!=
zQcZr{hp>8sF?k&Yl0?B84OneiQxef-4TEFrq3O~JAZR}yEJHA|Xkqd49tR&8oq{zP
zY@>J^HBV*(gJvJZc_0VFN7Sx?H7#75E3#?N8<p*btH>Z!C+_f53YU}py<FUNWgSuj
zi^M}p>ggxx1?wQi5Yb-_`I`_V*SMx5+*P^b=ec5RON-k1cIlsBLk}(HiaJyab0`CI
zo0{<v3Q5P3@oM!6@v&t6RJy0OS}M??mGqk1x;(pa`FWA#n+2z37<uPHl{#HvB!^?r
zm9?WOv;Tt(gt*?Pw;;%nF3|I0gDBXPM>=1_LO$~oE2%Tl_}KURuX<`+mQN_sTdM&*
zkFf!Xtl^e^gTy6ON=&gTn6)$JHQq2)33R@_!#9?BLNq-Wi{U|rVX7Vny$l6#+S<va
z%-r+y8D)Cm{5=IM8|<{prj)kZfIZ$NiW0)fE9{-SR)@-;NBJtHk@DI_v*mK(N0#s#
z?S8~jyotdcJJAAUt_;Tr)fa|*cT)~*JZ!c_7yVpSb{r2MllfJDbfI~-7n_#K6lw4G
z^Eyhsh^z8eZs2;adrfk9ip%h;IP|>Z@KvQt@VYb%<9JfapI^b9j=wa+Tqb4ei;8c5
z&1>Uz@lVFv6T4Z*YU$r4G`g=91lSeA<=GRZ!*KTWKDPR}NPUW%peCUj`Ix_LDq!8|
zMH-V`Pv!a~QkTL||L@cqiTz)*G-0=ytr1KqTuFPan9y4gYD5>PleK`NZB$ev@W%t=
zkp)_=lBUTLZJpAtZg;pjI;7r2y|26-N7&a(h<zryrg`J^oeC|8V|qszB+|*eQ-(Dy
zbn*nJ1W|b4-1y?dTI6}3IPMw+-O0;Q@eMMtjjQ+G6QfN3ae61Yd9LfQx_UREWecK4
zMn7A~fOz)be1)Yg{2Ysl9G%s8-h-~@C;ALAL0r=<JP2uCe!T|wAywH1r;F|f_q8N(
zYp^0FkyL9uj<8bK@fyTtgo+DT)14B^<SigcSJotgDV02O!M(CS6_B&^bILwyV?Ng4
zm7WQp?{l<Obhuy=22?5<oQDiM22&u4rZrRVG|L9ABfY{=95aTyd~@a$o~1P#ji`=w
zBKmQqX}r3Nlk9Q|gR7)~#n6AzYk`#!R*d5x`A)hU(!1R1%^zXxNJ(kPCw4htU9^(O
zP4cYV^F(I>X|`1YNM9N8{>8JAu<en5+94bD>v}hp1v`3JHT-=5lbXpbMq7X~2J5Kl
zh7tyU`_AusMFZ{ej9D;Uyy;SQ!4nwgSnngsYBwdS&EO3NS*o04)*j<g2BLf;iAZ2(
z7Key$cc6ey>uAYl;57c2Ly0(DEZ8IY?zSph-kyxu+D`tt@oU{32J#I{vmy=#0ySPK
zA+i(A3yl)qmTz*$dZi#y9FS;$;h%bY+;StNx{_R56Otq+?pGe^T^{5d7Gs&?`_r`8
zD&dzOA|j8@3<oPyCd}SOX6AZj_;pT>A&FR5U3*eQNBf<4^4W_iS_()*8b4aaUzfk2
zzIcMWSEjm;EPZPk{j{1>oXd}pXAj!NaRm8{Sjz!D=~q3WJ@vmt6ND_?HI~|wUS1j5
z9!S1MKr7%nxoJ3k`GB^7yV~*{n~O~n6($~x5Bu{7s|JyXbAyKI4+tO(zZYMslK;Zc
zzeHGVl{`iP@jfSKq>R;{+djJ9n%$%EL()Uw+sykjNQdflkJZSjqV_QDWivbZS~S{K
zkE@T^Jcv)Dfm93!mf$XYnCT--_A$zo9MOkPB6&diM8MwOfV?+ApNv`moV@nqn>&lv
zYbN1-M|jc~sG|yLN^1R2=`+1ih3jCshg`iP&mY$GMTcY^W^T`WOCX!{-KHmZ#GiRH
zYl{|+KLn5!PCLtBy~9i}`#d^gCDDx$+GQb~uc;V#K3OgbbOG0j5{BRG-si%Bo{@lB
zGIt+Ain8^C`!*S0d0OSWVO+Z8<kqm;qPrHIJ!qB8;9h5*>9}}O8aFTZ>p&k}2gGCV
zh#<$gswePFxWGT$4DC^8@84_e*^KT74?7n8!$8cg=sL$OlKr&HMh@Rr5%*Wr!xoOl
zo7jItnj-xYgVTX)H1=A2bD(tle<tL7^Z!nJ*fwgn&QUe>EH57#V{xAeW_ezISg5OC
zg=k>hOLA^urTH_e6*vSYRqCm$J{xo}-x3@HH;bsHD1Z`Pzvsn}%cvfw%Q(}h`Dgtb
z0_J^niUmoCM5$*f)6}}qi(u;cPgxfyeV<wtcQgsqG?QDyA@6XXM7siU#+0#mP~AnX
z9f=bMes~9>aaVmOsG<)5`6tzU4wyhF;k|~|x>7-2hXpVBpc5k{L4M`Wbe6Q?tr^*B
z`Y*>6*&R#~%JlBIitlZ^qGe3s21~h3U|&k%%jeMM;6!~UH|+0+<5V-_zDqZQN7<fD
zM2vP&&BMr(%$M51tLpycNES^{gnGn-o~t&>9?n?!Aj!Nj`YMO9?j>uqI9-Tex+nJD
z%e0#Yca6(zqGUR|KITa?9x-#C0!JKJHO(+fy@1!B$%ZwJwncQW7vGYv?~!^`#L~Um
zOL++>4qmqW`0Chc0T23G8|vO)tK=Z2`gvS4*qpqhIJCEv9i&&$09VO8YOz|oZ+ubd
zNXVdLc&p=KsSgtmIPLN69P7xYkYQ1vJ?u1g)T!6Ru`k2wkdj*wDC)VryGu2=yb0?F
z>q~~e>KZ0d<sP$M^)hrN7IC)eGuv*?pAk#*4fxII<8rIx545@9E}-};{IJdo*}!V1
zkUgWQp<TD%7(QQhWkf*vd;SiT1P@}N?jaoKEV?lzqfa1pG1Y^}ikjNMM*Kb?m5(n&
zOz8{+G2z7JatI<J95R%#%#ATAzlwPl$?6)w6WH~ku?(FhO)k1eRlF4I5UqR?T`Iy=
z_bVtkxqs3lQGny-BS%nkzwrXhI_M|P4l_VNVoMjVRoZ*0(JkMQ#AdJLFBj%$oTBx9
z_5|g_ll0@cfLf<j;&lJ>_#7f3UgV%9MY1}vMgF{B8yfE{HL*pMyhYF)WDZ^^3vS8F
zGlOhs%g_~pS3=WQ#494@jAXwOtr^Y|TnQ5zki>qRG)(oPY*f}U_=ip_{qB0!%w7~G
zWE!P4p3khyW-JJnE>eECuYfI?^d366Shq!Wm#x&jA<tFBO~aWRutYg|6S!-V%dvXb
zjpm3-7^fYCzbWmx*ts$8ECu=f{D#|=T{2_Q?C-SVQTSi8ey{G^D$8U&*bY{vQ$kGG
zq$8)>o>=HdCllE$>DPO0N;y#4G)D2y#B@5=N=+F%Xo2n{gKcPcK2!hP*^WSXl+ut;
zyLvVoY>VL{H%Kd9^i~lsb8j4>$EllrparEOJNT?Ym>vJa$(P^tOG)5aVb_5w^*&M0
zYOJ`I`}<NkH4X@iCc57jNSqY3D>9}UoSnYg#E(&yyK(tqr^@n}qU2H2DhkK-`2He%
zgXr_4kpXoQHxAO9S`wEdmqGU4j=1JdG!OixdqB4PPP6<nq;ZS)73s_@N{54U_<mt#
zR{@UUroZJ1=lVB~3y%RbLLE=9Mh=pj4wNruVxXLk8pKH)JVr{Hbx`P1XQ>RXA}>GM
zumruUUH|ZG2$bBj)Qluj&uB=dRb)?^qomw?Z$X%#D+Q*O97eHrgVB2*mR$bFBU`*}
zIem?dM)i}raTFDn@5^caxE^XFXVhBePmH9fqcTi`TLaXiueH=@06sl}>F%}h9H_e9
z>^O?LxM1EjX}NVppaO@NNQr=AtHcH-BU{yBT_vejJ#J)l^cl69Z7$sk`82Zyw7Wxt
z=~J?hZm{f@W}|96FUJfy65Gk8?^{^yjhOahUMCNNpt5DJw}ZKH7b!bGiFY9y6OY&T
z_N)?Jj(MuLTN36ZCJ6<obtKS{VOOSzs>I5Xy7uVlrb$o*Z%=-)kPo9s?<^Yqz~!Z*
z_mP<Y8YDC3(vm~>8(unFq65XSi!$@YtieSQ!<7IEOaA9VkKI?lA`*(nURv<D`3vIl
zzk?RMHDq|}aqs!Q7n{<V(L>fKL8cX}-+~uw9|_5)uC2`ZHca<BJSyCJ7L7R3^ezpJ
zixdU%^Arizo-zh;Lga89_J>eX7L8aG6Ghleg@F9aG%X$#g6^yP5apnB>YTz&EfS{q
z9UVfSyEIczebC)qlVu5cOoMzS_jrC|)rQlAzK7sfiW0`M8mVIohazPE9Jzn*qPt%6
zZL8RELY@L09B83@Be;x5V-IHnn$}{RAT#<2JA%ttlk#^(%u}CGze|1JY5MPhbfnYG
zIw%$XfBmA-<_pKLpGKwbRF$#P;@_)ech#>vj25sv25VM$ouo)?BXdRcO{)*OwTw)G
zv43W~T6ekBMtUD%5Bm>`<n0ehww;K9t*_z=^iZoM2Gjm6Wx6QTWDzOX28g|i7p-G(
znPo(pGb2-Hja^(5g>^Ltv!w4~65N!Ut5twl!Agrzyq4O2Fi3pUMtCU~>9gt_=h-f%
z;1&OuSu?A_sJvIvQ+dZNo3?m1%b1+s&UAx?8sUHEe_sB7zkm4R%6)<@oYB_i5>3Ip
zIA+?jVdX|zL{)?TGpx+=Ta>G80}0}Ax+722$XFNJsC1gcH56{8B)*)eU#r~HrC&}`
z|EWW92&;6y;3}!L5zXa385@?-D%>dSvyK;?jqU2t_R3wvBW;$!j45uQ7tyEIQv<v(
zw)qBpyRhiKBMR9HV)v2ZJdk>a;Db}r&bR3kqNSh)Q_$MJ#Uj3Gj1F;)sO|%6z#@<+
zi{pbYsYS#u`X$Nf($OS+lhw>xgjos1OnF^$-I$u;qhJswhH~p|ab*nO>zBrtb0ndn
zxV0uh!LN`&xckTP+JW}gznSpU492)u+`f{9Yr)js`NmfYH#Wdtradc0TnKNz@Su!e
zu$9}G_=ku;%4xk}eXl>)KgpuT>_<`Ud(A^a++K&pm3LbN;gI}ku@YVrA%FJBZ5$;m
zobR8}OLtW4-i+qPPLS-(7<>M{)rhiPoi@?&vDeVq5%fmZk=mDdRV>Pb-l7pP1y6|J
z8I>sF+TypKV=_<SBxSgNFy@5`t70+_4F<*(g54PNEt&4u%OoVR^n+$TL)qKdP6c)n
z-CoP*_kXZ4vBsj8M^2Y0nDq-^4r-wgu2Y-3fmi6ooPIXTI%UdJhw@7KgR=N+Vl3NO
zcl8-&i~^e%3E1G+u&^#M&5!sI)la$uQ2y&KsaZjx^r8D68BTZd^NrAV{0u$=#SH#4
zLE2)q%<UADH&I$um|>^NwBU^>4JJq<*14GLfM2*XQzYdlqqjnE)gZsPW^E@mp&ww*
zW9i>XL=uwLVZ9pO*8K>t>vdL~Ek_NUL$?LQi5sc#1Q-f6-ywKcIT8Kw?C<o*=Aa~-
z*eA0Mgmu5-j8rTh^;={1$#X=Ck5Gk;@KK#haYa^sXr0^_^Q84%+WOl3?#Mc#{{d}B
z>(_3pbR`e|)%9S-({if|E+hR2W!&qfQ&UiF^I!|M#xhdWsen<tq75@@WHX{+T3S~F
znoMw2v{^ia4`fkd=3p<6XkL)!lsI%8iq@>v^wpKCBiuxXbnp85`{i|;BM?Ba`lqTA
zyRm=UWJl&E{8JzYDHFu>*Z10-?#A8D|5jW9Ho0*CAs0fAy~MqbwYuOq9jjt9*nuHI
zbDwKvh)5Ir$r!fS5|;?Dt>V+@F*v8=TJJF)TdnC#Mk>+tGDGCw;A~^PC`gUt*<(|i
zB{{g{`uFehu`$fm4)&k7`u{xIV)yvA(%5SxX9MS80p2EKnL<HSdiWFiAy=3UmV-rj
zc%^|o`X!t!vuYErrUzbG?ostY(qs7GE^=Z33k*P+F6r($h_?W-bHJ|GUK@Wlv9++M
zG}?Z?8{_X${_c9aOXw4qfk0vTaVRH6FMOnFD?w|zo{zKKg$8wzW&yufWk&idB=+9!
z^dTI@g=>t<HJ%Cd%{u~X`lRpMFg&X{m?Nw#T4cg*?z{+rC($M4z9RHV@8KoueD7_)
z8T@i-6RG$5%_Y`lSjj|?wSvITK5c4g0!Uq49VAn-H<9~;vn7~hBdYuDOt2$gtNuBm
zo8$Y{2lwMxZNbfb$Hm0T528Og7Jfl!35edSr>CZ>tlX>*Z6nd&6-<c}7z{sZ9V^Ux
zMNgR3$iH97>Mv$5rHD*<Fmux@1NkgiA%VmyOAwal{&*L*?*@Cl?&!jtcf3KL{{|8z
z_($$R;SoAei#gUO@=7)M7s~2aAxJ>db;&IBK3KH&M<+ArlGXDRdX1VVO4)&R$f4<g
z`M~bg9+=(|cc^a3vB10?3GZiq$o|Zromh?lE2%m!alG4CIrvmRZHZVSM>NxXI>GBh
zSv|h>5GDAI(4E`@F?En<q4iBUtn-fux#Jt=qU6#PBE4-GhP)}OK!CI;i(sJ6^VIJF
zwJMEAeGKMb_^`VbA1hFYio)roSCrLG-NL5Yqhb{sh3_zt(Zg93UP*;!m?}k&V`1AB
zNYPri&yVkXW8uO1geXM3Oj&$G%~#Jd%h;?JDKwrq;P+!t&4W1Z^1?Ikguvk#bK?Bx
z$w5M*LxgRe=jz?UiDBbfC1I3!cjeMD*ueh4W0S*z6=TAf+ZYkG$}FGti`ipjpIK>W
zS>#c&Gw6~_XL`qQG4bK`W*>hek4LX*efn6|_MY+rXkNyAuu?NxS%L7~9tD3cn7&p(
zCtfqe6sjB&Q-Vs7BP5+%;#Gk};4xtwU!KY0XXbmkUy$kR9)!~?*v)qw00!+Yg^#H>
zc#8*z6zZo>+(bud?K<*!QO<vKd$8TBt^HLIw%iB>4ehiTCK&PD4G&n)Tr9X_3r-we
z?fI+}-G~Yn93gI6F{}Dw_SC*FLZ)5(85zp4%uubtD)J)UELLkvGk4#tw&Tuss<g@J
zd3(n+h;=s-joD7pea}*kl|?T5<3W!rK}V)#HpvFL3uRc{oe_mV<z1l~^m1_TkJDu3
z;JtNs6#g&&@E09TG{#Z`zh|EKwRTiJr)s50$5?Nrhn68HAr=rV#m>a)mTD$R2&O~{
zCI3>fr-!-b@EGRI%g0L8UU%%u_<;e9439JNV;4KSxd|78v+I+8^rmM<g+mx0&Si$a
zgf1uYC03KcCN)Lz!>f3f40Jb}wEszROD?xBZu>Ll3;sUIoNxDK3|j3*sam2tC@@e$
z^!;+AK>efeBJB%ALsQ{uFui)oD<x}JL&L^@dTz{b&_?*nsS;lNnoJ@(k9d5xVq$|w
z<ejC>oq()2USi?n=6C3#eetz?wPswc={I<8x=(8lE4EIsUfyGNZ{|KYn1IR|=E==f
z(;!A5(-2y^2xRFCSPqzHAZn5RCN_bp22T(KEtjA(rFZ%>a4@STrHZflxKoqe9Z4@^
zM*scx_y73<sFS1_?6+u!sT9fvjld*kU~edMy>?Q{<Kw(x)TAd1JfBpLz7(Nk)Jsdz
zj7#eyM{0^=a(C#N_pwZ(&^&zZP@5Qw`oUBRW0i<S2ql<0tEs~>vt6?~WEl?2q*;@8
z3M*&@%l)SQmXkcUm)d@GT2#JdzhfSAP9|n#C;$E8X|pwD!r#X?0P>0ZisQ~TNqupW
z*lUY~+ikD`vQb?@SAWX#r*Y+;=_|oacL$2CL$^(mV}aKO77pg}O+-=T1oLBT5sL2i
z42Qth<Jh0Ysw=K%u7GarF`3bIM1>2+0@C`c+*D0*5!qy26sis<9a7>LN2{z%Qj49t
z=L@x`4$ALHb*3COHoT?5S_c(Hs}g!V>W^=6Q0}zaubkDn)(lTax0+!+%B}9Vqw6{H
zvL|BRM`O<@;eVi1DzM!tXtBrA20Ce@^Jz|>%X-t`vi-%WweXCh_LhI#bUg2*pcP~R
z*RuTUzBKLXO~~uMd&o$v3@d0shHfUjC6c539PE6rF&;Ufa(Rw@K1*m7?f5)t`MjH0
z)_V(cajV5Am>f!kWcI@5rE8t6$S>5M=k=aRZROH6fA^jJp~2NlR4;Q2>L$7F#RT#9
z>4@1RhWG`Khy>P2j1Yx^BBL{S`niMaxlSWV-JBU0-T9zZ%>7mR3l$~QV$({o0;jTI
ze5=cN^!Bc2bT|BcojXp~K#2cM>OTe*cM{Kg-j*CkiW)EGQot^}s;cy8_1_@JA0Whq
zlrNr+R;Efa+`6N)s5rH*|E)nYZ3uqkk2C(E7@A|3YI`ozP~9Lexx#*1(r8luq+YPk
z{J}c$<WQa$CfVIhsE>s`<i2`cEPYHzF!ZIy?L$}MhAPFqQe@_8Lh#cQAH~-zZ5p$u
zZauEKr<oluR2T6z2A|B^#roi2jr3F<X4&!ZjiXo?9nIbJ4iAii=A_@&#n$TqH^#R&
z{$qMQO7u^&7KEB6l{H~A;ylPsJw2kA4#E2@7dO%lsi+3{VJ4?~e4(Bz-tw&^YR9P1
zTlpCH(W_%+@#|?%RN0HM=U?pU5$E2f<RPK1fw%3KLs--hd|lj})1h|Y<6CA3NsuSI
zl=<<g*vcJW=6yZY`aXe5QUB~awgg5fxlu%7u#A8=UXt61U-7wGtR{L&XvKbUf-}PL
z<eXA6<<r^;=`XwtFN1~2J^$Y${#Q0Tyev?j!*Z4q^mjQ4ah)uW_s=JkrRS%l*Ut`>
zPM35Fx(YWB3Z5IYnN+L_4|jaR(5iWJi2~l&xy}aU7kW?o-V*6Av2wyZTG!E2KSW2*
zGRLQkQU;Oz##ie-Z4fI)WSRxn$(ZcD;TL+;^r=a4(G~H3ZhK$lSXZj?cvyY8%d9JM
zzc3#pD^W_QnWy#rx#;<pgDoauRid_B6w$J6XKKeAcZHU9rH9=s!y`%~e@hGc<c#A7
zRRTR`&dt`*;~VYcVGk-~aNB!?q#4B&%52?dI@=%LQ>c&N@sqHhrnHRmj<I9Tx4aSD
zVUQ}9lh=Kd&QIx0uCqYm3pFs_*L;b|$xyZks(AAwgYsH85PAL~ndH7DNUoZKBHCWu
z_<;@&ed^tpoO=DG4Hem|2>#i;s%zLm6SE(n&BWpd&f7>XnjV}OlZntI70fq%8~9<7
zMYaw`E-rp49-oC1N_uZTo)Cu%RR2QWdHpzQIcNsoDp`3xfP+`gI?tVQZ4X={qU?(n
zV>0ASES^Xuc;9JBji{)RnFL(Lez;8XbB1uWaMp@p?7xhXk6V#!6B@aP4Rz7-K%a>i
z?fvf}va_DGUXlI#4--`A3qK7J?-HwnG7O~H2;zR~RLW)_^#La!=}+>KW#anZ{|^D3
B7G?kd

diff --git a/bitbake/lib/toaster/toastergui/static/img/glyphicons-halflings.png b/bitbake/lib/toaster/toastergui/static/img/glyphicons-halflings.png
deleted file mode 100644
index a9969993201f9cee63cf9f49217646347297b643..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 12799
zcma*OWmH^Ivn@*S;K3nSf_t!#;0f+&pm7Po8`nk}2q8f5;M%x$<L>SdAkd9FAvlc$
zx660V9e3Ox@4WZ^?7jZ%QFGU-T~%||Ug4iK6bbQY@zBuF2$hxOw9wF=A)nUSxR_5@
zEX>HBryGrjyuOFFv$Y4<+|3H@gQfEqD<)+}a~mryD|1U9*I_FOG&F%+Ww{SJ-V2BR
zjt<81Ek$}Yb*95D4RS0HCps|uLyovt;P05hchQb-u2bzLtmog&f2}1VlNhxXV);S9
zM2buBg~!q9PtF)&KGRgf3#z7B(hm5WlNClaCWFs!-P!4-u*u5+=+D|ZE9e`KvhTHT
zJBnLwGM%!u&vlE%1ytJ=!xt~y_YkFLQb6bS!E+s8l7PiPGSt9xrmg?LV&&SL?J~cI
zS(e9TF1?SGyh+M_p@o1dyWu7o7_6p;N6hO!;4~<t3w3SV570<|$VWNPP~TbX3|=X>
z2B`I;y`;$ZdtBpvK5%oQ^p4eR2L)BH>B$FQeC*t)c`L71gXHPUa|vyu`Bnz)H$Z<N
z7UVAHFsR+HLO+(tK~=M@pM7ZMPj5gkz>cXGve(}XvR!+*8a>BLV;+ryG1kt0=)ytl
zNJxFUN{V7P?#|Cp85QTa@(*Q3%K-R(Pkv1N8YU*(d(Y}9?PQ(j<e|z%-Bnrh*J1R%
z%JAF*cdp#Zk#h09fv12$TuGUsX=V-wgNcEGe0hhp%mK8EVPi6@!a;xi$k!wcIO|bJ
zPx8DZ*0Y(ggKhnp2=Ax#f<wKp{=pA29>;NzWoEVWRD-~H$=f>j<LsfOZ;WLF*F0cm
z9PSRSlSFQE>9~PN^BM2okI(gY-&_&BCV6RP&I$FnSEM3d=0fCxbxA6~l>54-upTrw
zYgX@%m>jsSGi`0cQt6b8cX~+02IghVlNblR7eI;0ps}mpWUcxty1yG56C5rh%ep(X
z?)#2d?C<4t-KLc*EAn>>M8%HvC1TyBSoPNg(4id~H8JwO#I)Bf;N*y6ai6K9_bA`4
z_g9(-R;qyH&6I$`b<fg~;S@}+8_8-ItZ!TS<!|pei*+CWiVH?M1CEFM{ij_eP4dL+
zsn%eDn^Kp7vLEn|Dq0`Wt&GpZ?eq^%pqXVR^PA!ZyoGLI7ihDaWiNi$M6h)PNwvHR
zEcA82H5fM6RnpZ!R872>42v|0V3Z8IXN*p*8g$gE98+JpXNY+jXxU0zsR^W$#V=KP
z3AEFp@OL}WqwOfsV<)A^UTF4&HF1vQecz?LWE@p^Z2){=KEC_3Iopx_eS42>DeiDG
zWMXGbYfG~W7C8s@@m<_?#Gqk;!&)_Key@^0xJxrJahv{B&{^!>TV7TEDZlP|$=ZCz
zmX=ZWtt4QZK<Y>x**)lQQoW8y-XLiOQy#T`2t}p6l*S`68ojyH@UXJ-b~@tN`WpjF
z%7%Yzv807gsO!v=!(2uR)16!&U5~VPrPHtGzUU?2w(b1Xchq}(5<TwC<%h0ow%K}h
zTlz}37c^dc?7rEmt7Zy9#q|V+5bE1c06?X{e~%TDZ!@uG_uU!n6VJy=odWKS?p#j?
zn;v){i#`+1X;Ls^(9p!?42vli(fu1D-%nf?-3VKCs1JT^-;{Pg82EGZ&|T}A#wtP(
zR^df|3P4JZ0|weuCV=JopL6MLvYycbd;-Xx_r)Hm1~(2>Ed^G|SD7IG+kvgyVksU)
z(0R)SW1V(>&q2nM%Z!C9=;pTg!(8pPSc%H01urXmQI6Gi^dkYCYfu6b4^tW))b^U+
z$2K&iOgN_OU7n#GC2jgiXU{caO5hZt0(>k+c^(r><#m|#J^s?zA6pi;^#*rp&;aqL
zRcZi0Q4HhVX3$ybclxo4FFJW*`IV`)Bj_L3rQe?5{wLJh168Ve1jZv+f1D}f0S$N=
zm4i|9cEWz&C9~ZI3q*gwWH^<6sBWuphgy@S3Qy?MJiL>gwd|E<2h9-$3;gT9V~S6r
z)cAcmE0KXOwDA5eJ02-75d~f?3;n7a9d_xPBJaO;Z)#@s7gk5$Qn(Fc^w@9c5W0zY
z59is0?Mt^@Rolcn{4%)Ioat(kxQH6}hIykSA)zht=9F_W*D#<}N(k&&;k;&gKkWIL
z0Of*sP=X(Uyu$Pw;?F@?j{}=>{aSHFcii#78FC^6JGrg-)!)MV4AKz>pXnhVgTgx8
z1&5Y=>|8RGA6++FrSy=__k_imx|z-EI@foKi>tK0Hq2LetjUotCgk2QFXaej!BWYL
zJc{fv(&qA7UUJ|AXL<Te#svgLe$GRVt~C0`%AZ+-=S0D^On=i42k@^tJ-LZGdLpRi
zdrV5?>c5z*_NW#yWzKtl(c8mEW{A>5Hj^gfZ^HC9lQNQ?RowXjmuCj4!!54Us1=hY
z0{@-phvC}yls!PmA~_z>Y&n&IW9FQcj}9(OLO-t^NN$c0o}YksCUWt|DV(MJB%%Sr
zdf}8!9ylU2TW!=T{?)g-ojAMKc>3pW;KiZ7f0;&g)k}K^#HBhE5ot)%oxq$*$W@b#
zg4p<<e2}@}ZtI091*fR6EHmhc2JFT&S+9NWaDJ!A80$GFF7R`A%xl6?3MWwFH)kiY
zKkO7P(Y}AIYl!b@wU{Hfoy`qG`h+F#SJJ{&-s<{+@b9bRRm+2<>Ou`ME|Kd1WHK@8
zzLD+0(NHWa`B{em3Ye?@aVsEi>y#0XVZfaFuq#;X5C3{*ikRx7UY4FF{ZtNHNO?A_
z#Q?hwRv~D8fPEc%B5E-ZMI&TAmikl||EERumQCRh7p;)>fdZMxvKq;ky0}7IjhJph
zW*uuu*<F&)uV|73Nr>(Y6)S;Od--8uR^R#sb$cmFCnPcj9PPCWhPN;n`i1Q#Qn>ii
z{WR|0>8F`vf&#E(c2NsoH=I7Cd-FV|%(7a`i}gZw4N~QFFG2WtS^H%@c?%9UZ+kez
z;PwGgg_r6V>Kn5n(nZ40P4qMyrCP3bDkJp@hp6&X3>gzC>=f@Hsen<%I~7W+x@}b>
z0}Et*vx_50-q@PIV=(3&Tbm}}QRo*FP2@)A#XX-8jYspIhah`9ukPBr)$8>Tmtg&R
z?JBoH17?+1@Y@r>anoKPQ}F8o9?vhcG79Cjv^V6ct709VOQwg{c0Q#rBSsSmK3Q;O
zBpNihl3S0_IGVE)^`#94#j~$;<ISbQ+zLM8Q_sWpD4<&Sicl|!a~&A@PH`UFRr4^t
zSjAA>7+u870yWiV$@={|GrBmuz4b)*bCOPkaN0{6$MvazOEBxFdKZDlbVvv{8_*kJ
zfE6C`4&Kkz<5u%dEdStd85-5UHG5IOWbo8i9azgg#zw-(P1AA049hddAB*UdG3Vn0
zX`OgM+EM|<+KhJ<=k?z~WA5waVj?T9eBdfJGebVifBKS1u<$#vl^<Wg*!!OoyJ@GG
z%+_%2Ex-A(=Z(Bs6q~agBwBL+Pcns5yTYUCI_zEv3JOnOB;7f=h8xGf|IQl+Qw37#
z{BhR?wjaFo)FpPNNRkn616I`fE=rl+<Vv=sXw)oTB*nsxZd}^hq|lwuLq2tPYK9Ch
zP~rW|kx{-S+q;ojdznAWu9)x>BvSg)xsnT5Aw_ZY#}v*LXO#htB>f}x3qDdDHoFeb
zAq7;0CW;XJ`d&G*9V)@H&739DpfWYzdQt+Kx_E1K#Cg1EMtFa8eQRk_JuUdHD*2;W
zR~XFnl!L2A?48O;_iqCVr1oxEXvOIiN_9CUVTZs3C~P+11}ebyTRLACiJuMIG#`xP
zKlC|E(S@QvN+%pBc6vPiQS8KgQAUh75C0<L{Rx=;M-*LCs2Bp<jfOoZepIeH1&E9@
zECcRp6~TSaxo9}VYr%Om){SqtW<MPRfw2-K1_c9&KORpSyh3Z*9=_y`d-Pn0_zAw+
z=kYI%Xg`=LN{&qw<HTtk2MKE0r;WoX$l}>a2xcPQDD$}*bM&z~g8+=9ltmkT$;c;s
z5_=8%i0H^fEAOQbHXf0;?D<BP;<HVQI1JZt*v)6RAq&gagO^!F$spXEh)>N5z-5+1
zDxj50yYkz4ox9p$HbZ|H?8ukAbLE^P$@h}L%i6QVcY>)i!w=hkv2zvrduut%!8>6b
zcus3bh1w~L804EZ*s96?GB&<V5y;va8bgv&LhJ<YYLxjoJ6PJ;r2T$n2GZZ+&blBq
zN@;fP%v^kz^?uH{Kpq(Ih{eCW5OnE5%HakzY6sMl!wfw!(lBl{oyDuNM|bEKU#YtR
zTTK?n-{?&5Szx)y^~WKl(fG>F7c5?m?|t$-tp2rKMy>F*=4;w*jW}^;8v`st&8)c;
z2Ct2{)?S(Z;@_mjAEjb8x=qAQvx=}S6l9?~H?PmP`-xu;ME*B8sm|!h@BX4>u(xg_
zIHmQzp4Tgf*J}Y=8STR5_s)GKcmgV!<zLBv<JCu*R*$7_b_L{9GvwPbpvkT@1&MS$
zijYfuLM?Pa-BA2}iX9A(2K)AF@cP6QkvvCLyswdDf?LI~tZ|qKPtWR#^oamFBRcUk
zs5b$Sc+=%VrL*7Ba(pp>$JKTg@LO402{{Wrg>#D4-L%vjmtJ4r?p&$F!o-BOf7ej~
z6)BuK^^g1b#(E>$s`t3i13{6-mmSp7{;QkeG5v}GAN&lM2lQT$@(aQCcFP(%UyZbF
z#$HLTqGT^@F#A29b0HqiJ<ZOKS1P#S0IU6AksffR*wx4ca5r>sRJAlh8kngU`BDI6
zJUE~&!cQ*&f95Ot$#mxU5+*^$qg_DWNdfu+1irglB7yDglzH()2!@#rpu)^3S8weW
z_FE$=j^GTY*|5SH95O8o8W9FluYwB=2PwtbW|JG6kcV^dMVmX(wG+Otj;E$%gfu^K
z!t~<3??8=()WQSycsBKy24>NjRtuZ>zxJIED;YXaU<x|u=Vd7uuZ|>z$@0z4rl+TW
zWxmvM$%4jYIpO>j5k1t1&}1VKM~s!<EQ6q8U;EP6<gFYZ!m%POxUBC$P89e*7OnrM
zdWQA)CjX#LYDI-i*mnQZr;sN<6@SPOXNM}9Rp_hcE;y>eLsCVQ`TTjn3JRXZD~>GM
z$-IT~(Y)flNqDkC%DfbxaV9?QuWCV&-U1yzrV@0jRhE;)ZO0=r-{s@W?HOFbRHDDV
zq;eLo+wOW;nI|#mNf(J?RImB9{YSO2Y`9825Lz#u4(nk3)RGv3X8B(A$TsontJ8L!
z9JP^eWxtKC?G8^xAZa1HECx*rp35s!^%;&@Jyk)NexVc)@U4$^<D$wmm?XpH-Sg4*
z8B^w;<H>X1Dag6`WKs|(HhZ#rzO2KEw3xh~-0<;|zcs0L>OcO#YYX{S<TTw)*(lZC
zIx888OkDY0a@=pFP3fhTGE0#kua@EqJ8hp4VSNt-Xfx&Iq8mr)#UbJIBdW*?_9fdi
z7f!0)Iy{xeM7LDi+*QJ?BdGeD5e0(0aSm&GvjQ!V6CD0we*R)~MbsZ|>N8m6`9pp+
zQG@q$I)T?aoe#AoR@%om_#z=c@ych!bj~lV13Qi-xg$i$hXEAB#l=t7QWENGbma4L
zbBf*X*4oNYZUd_;1{Ln_ZeAwQv4z?n9$eoxJeI?lU9^!AB2Y~AwOSq67dT9ADZ)s@
zCRYS7W$Zpkdx$3T>7$I%3EI2ik~m!f7&$Djpt6kZqDWZJ-G{*_eXs*B8$1R4+I}Kf
zqniwCI64r;>h2Lu{0c(#Atn)%E8&)=0S4BMhq9$`vu|Ct;^ur~gL`bD>J@l)P$q_A
zO7b3HGOUG`vgH{}&&Agr<FnKy|IF(G1iR*`GW247VX<aAlJ2F?Q<={Aib+`}_HyE*
zujP5~Z9@I2PBhiOY}cNA6jXAuIimavj#$XIs@HezE!U24{*GtAdHFvr(O>Fy%K^>?
z>wf**coZ2vdSDcNYSm~dZ(vk6&m6bVKmVgrx-X<>{QzA!)2*L+HLTQz$e8UcB&Djq
zl)-%s$ZtUN-R!4ZiG=L0#_P=BbUyH+YPmFl_ogkkQ$=s@T1v}rNnZ^eMaqJ|quc+6
z*ygceDOrldsL30w`H;rNu+I<VKUrjL=bDy~WtS;;K#ThRGVRMNFq&Gco*pd+ChOJI
zqAbbk-&kSt%3!MCpue~I%|gblH{=P#-)jqQC%xCp|J^jUO>jlS+G~p&0SawXCA1+D
zC%cZtjUkLNq%FadtHE?O(yQTP486A{1x<{krq#rpauNQaeyhM3*i0%tBpQHQo-u)x
z{0{&KS`>}vf2_}b160XZO2$b)cyrHq7ZSeiSbRvaxnKUH{Q`-P(nL&^fcF2){vhN-
zbX&WEjP7?b4A%0y6n_=m%l00uZ+}mCYO(!x?j$+O$*TqoD_Q5EoyDJ?w?^UIa491H
zE}87(bR`X;@u#3Qy~9wWdWQIg1`cXrk$x9=ccR|RY1~%{fAJ@uq@J3e872x0v$hmv
ze_KcL(wM|n0EOp;t{hKoohYyDmYO;!`7^Lx;0k=PWPGZpI>V5qYlzjSL_(%|mud50
z7#{p97s`U|Sn$WYF>-i{i4`kzlrV6a<}=72q2sAT7Zh{>P%*6B;Zl;~0xWymt10Mo
zl5{bmR(wJefJpNGK=fSRP|mpCI-)Nf6?Pv==FcFmpSwF1%CTOucV{yqxSyx4Zws3O
z8hr5Uyd%ezIO7?PnEO0T%af#KOiXD$e?V&OX-B|ZX-YsgSs%sv-6U+sLPuz{D4bq|
zpd&|o5tNCmpT>(uIbRf?8c}d3IpOb3sn6>_dr*26R#ev<_~vi)wleW$P<Wyn_7n0-
zl)LIgF0z;$xTz(0JgW0t|K0{|pl+d7{+{fAW)lB*Qg({z1~qrplnmDSP!2>X|5)$_
z+_|=pi(0D(AB_sjQ;sQQSM&AWqzDO1@NHw;C9cPdXRKRI#@nUW)CgFxzQ1nyd!+h&
zcjU!U=&u|>@}R(9D$%lu2TlV>@I2-n@fCr5Pr<dtPlfA<Z*`%$WS?W!M7-X@Sw}lf
zu7sLkI`BK6gTBwv0nqdk^SqiGBO}U16-Ky}DlzfpVxxnEAc|MG(;#A7b;H&MP*riE
zHr?l)sap(Q`P6U_@Ov18QJwI7yr|=6Y+TbD2PUEPfsh&V{s?8AA2dT>ZNVyKWR7hm
zWjoy^<!R*J%IXEk=E5cj6b=;i9u3uQuMH4{qOT^=OGnt_=n2>p7v8m#$qN0K#8jT-
zq`mSirDZDa1Jxm;Rg3<Jf$!Bj9`<kE;Sz+T_M)m3-f__2l^&CsYnIwV?+%t2FG{Ta
zI-67-X7Fu-xbrdN@cn6z3_k9VZ?2i{<ie%nx)UUiUTLNtHEK)0HD_qUYpV0X30}z?
zM!*@omRu>rAPhC)LcI4@-RvKT+@9&KsR3b0_0zuM!Fg7u>oF>3bzOxZPU&$ab$Z9@
zY)f7<va9`_LvY6!5H@PMYi?(=yM97@*rbrsB=oh`t5ydnN2A;15DysI3n?zsE3{ZX
zq+yK*u5H1rVq8mwv!|dvE&PWazz!0^LY7dozu5qaS3Q5~q}uAQUJN5WW+A&wvpho?
z=!z1Q9;>pKh22I7ZykL{YsdjcqeN++=0a}elQM-4;Q)(`Ep3|VFHqnXOh14`!Bus&
z9w%*EWK6AiAM{s$6~SEQS;A>ey$#`7)khZvamem{P?>k)5&7Sl&&NXKk}o!%vd;-!
zpo2p-_h^b$D<fdz<@`H3n|HeSVR76K@6|_9&-VHAVO=;`v1rN8I|9P)PS7vp83efu
z`yTr9OVLz|?h*IHce7sdT@Ktb#!>NBO>{h4JdGB=D>fvGIYN8v&XsfxU~VaefL?q}
z3ekM?<wNDtI4J<DC6XBgM26Nv#0iut=ZwA#^>iOKkCzQHkBkhg=hD!@&(L}FcHKoa
zbZ7)H1C|lHjwEb@tu=n^OvdHOo7o+W`0-y3KdP#bb~wM=Vr_gyoEq|#B?$&d$tals
ziIs-&7isBpvS|CjC|7C&3I0SE?~`a%g~$PI%;au^cUp@ER3?mn-|vyu!$7MV6(uvt
z+CcGuM(Ku2&G0tcRCo7#D$Dirfqef2qPOE5I)oCGzmR5G!o#Q~(k~)c=LpIfrhHQk
zeAva6MilEifE7rgP1M7AyWmLOXK}i8?=z<j)TsCg#MI>2;N=no)`IGm#y%aGE>-FN
zyXCp0Sln{IsfOBuCdE*#@CQof%jzuU*jkR*Su3?5t}F(#g0BD0Zzu|1MDes8U7f9;
z$JBg|mqTXt`muZ8=Z`3wx$uizZG_7>GI7tcfOHW`C2bKxNOR)XAwRkLOaHS4xwlH4
zDpU29#6wLXI;H?0Se`SRa&I_QmI{zo7p%uveBZ0KZKd9H6@U?YGArbfm)D*^5=&Rp
z`k{35?Z5GbZnv>z@NmJ%+sx=1WanWg)8r}C_>EGR8mk(NR$pW<-l8OTU^_u3M@gwS
z7}GGa1)`z5G|DZirw;FB@VhH7Dq*0qc=|9lLe{w2#`g+_nt<uBB~iQoK%j+BR{KW$
zxUoEE;u<56rl_>>_%o<~9(VZe=zI*SSz4w43-_o>4E4`M@NPKTWZuQJs)?KXbWp1M
zimd5F;?AP(LWcaI-^Sl{`~>tmxsQB9Y$Xi*{Zr#py_+I$vx7@NY`S?HFfS!hUiz$a
z{>!&e1(16T!Om)m)&k1W#*d#GslD^4!TwiF2WjFBvi=Ms!ADT)ArEW6zfVuIXcXVk
z>AHjPADW+mJzY`_Ieq(s?jbk4iD2Rb8*V3t6?I+E06(K8H!!xnDzO%GB;Z$N-{M|B
zeT`jo%9)s%op*XZKDd6*)-^lWO{#RaIGFdBH+;XXjI(8RxpBc~azG1H^2v7c^bkFE
zZ<!d@6;Xr=zrz^$h_Zbcf~Z$lrrBw0nL?BbB`hkkx&01qcs_@(`dj5M$3rI2JKgsr
zS^x~?G~LTF&PL>CVPE+E*Q=FSe8Vm&6|^3ki{9~qafiMAf7i4APZg>b%&5>nT@pHH
z%O*pOv(77<h_P}M1fVl@bA%;8!%G$2v2^1K;a|J|258iaFK<JsY+PvseEryJp$5<!
z9lXGNp5qrv`T=s~_@3Ry-B6o<m;T-lQtjLZ)m`X2mKrN#6`?5SI5G#qCc`>?ZiT{W
zBibx}Q12tRc7Py1NcZTp`Q4ey%T_nj@<r4RLoFiQ1cOG!U!@-f&DrHzjFreg6r@E|
zvE{2Q=kFJS$gwo*FVtl=epg~LzgZ(&E7V*y3ct|~AGvI-3JcYr{%DF#=;?cH6~ge-
zxOld^6>1WKg5Fz_Rjl4wlJQj)rtp8yL3r!S<K<bid;Q+mY&EMZN}!KaieT~EVI>hy
zvZvnmh!tH4T6Js-?vI0<-rzzl{mgT*S0d_7^AU_8gBg^03o-J=p(1o6kww2hx|!%T
z-jqp}m^G*W?$!R#M%Ef?&2jYxmx+lXWZszpI4d$p<r;|3!?@3AW<2Zgi0<hN9ff)N
z(zo6I+-$9Bx*(c$-bk0EGqBsb91nmH7yrN`CVj(QCaD{RJgvV-JPkoBQAwGD;nyzn
z*I;L?L=(3oeAQ<rjW4NvWy!bHdLOHMjezGb#Hb+lSX`#>UN`(S)|*c^CgdwY>Fa>>
zgGBJhwe8y#Xd*q0=@SLEgPF>+Qe4?%E*v{a`||luZ~&dqMBrRfJ{SDMaJ!s_;cSJp
zSqZHXIdc@@XteNySUZs^9SG7xK`8=NBN<V=E)OCgg+S0s%X@m8dOqs;y*2U#C_D)u
z81;Mt5p^uC3PVJP@9PH9!<3b5IE^n;kwm}NvP7!(7^P%;1DOYVJumd1Eg9zSvb@M<
z=8_n~reVNX{Rwy18un@y&;emesWi1XQooSmDu!<kFo)-HRP5pn?;0r-+4i~5mY$28
z(;>M)fRVOjw)D^)w%L2OPkTQ$Tel-J)GD3=YXy+F4in(ILy*A3m@3o73uv?JC}Q>f
zr<Ie&tGbM^0N<roTuDj*?S_O(I}B&He=e8Pl8`tjGg-O~5%TUI<1yQ05r*$Oc2#s#
z8%FWrdDtn79-cwa2pX4M_-JFx9zK7mChDM?zK(~_K9>Y&8SWmesiba0|3X-jmlMT3
z*ST|_U@O=i*sM_*48G)dgXqlwoFp5G6qSM3&%_f_*<qxyINw1$We6It<0I>n!P<uj
z?87vdPOI3mk{cGX^R<>iT>?cNI)fAUkA{qWnqdMi+aNK_yVQ&lx4UZknAc9FIzVk%
zo6JmFH~c{_tK!gt4+o2>)zoP{sR}!!vfRjI=13!z<fc;{t9y2@_q+%poab^!jwREr
z2+#Zf9d~36snX-iZ(5U>5}ijMFQ4a4?QIg-BE4T6!#%?d&L;`j5=a`4is>U;%@Rd~
zXC<xcC%fK=hCSNPW&)8o$8W+KO-SU#5LbV{{RyL+099LpC;6!uxU&{MmE<Y{b<h52
z$81YnCmIWu(0dlOntRk)&>~H7eGQhhYWhMPWf9znDbYIgwud(6$W3e>$W4$~d%qoJ
z+JE`1g$qJ%>b|z*xCKenmpV$0pM=Gl-Y*LT8K+P)2X#;XYEFF4mRb<YTI|Oo*wqC5
z0h9Vcyd1-aYw_k;tVodW95W2hdEX}FLSrp|R+GE56fkm-P)-t$V)|A=l7x|mefFZC
zXMAilrJt8o)%dz@>c~jj?DM@(1e`nL=F4Syv)TKIePQUz)bZ<lVCgA$*!Fmgxl6o%
zjdFR@&JKgonL5u$SS;U)hR2JO%(X!<3`;2ma}g7i__wVr1m~_yKAfNhm3c!NlBG8F
zi*)rX!5cY!j#B&Bh5F)#rbPS@4QDD~@ulB?(x|5|p4JWn*dAG|<;_kq<4J3{W|V%$
zFux+io?Ym>?Bi3@G@HO$Aps1DvDGkYF50O$_welu^cL7;vPiMGho74$;4fDqKbE{U
zd1h{;LfM#Fb|Z&uH~Rm_J)R~Vy4b;1?tW_A)Iz#S_=F|~pISaVkCnQ0&u%Yz%o#|!
zS-TSg87LUfFSs{tTuM3$!06ZzH&MFtG)X-l7>3)V?Txuj2HyG*5u;EY2_5vU0ujA?
zHXh5G%6e3y7v?AjhyX79pnRBVr}RmPmtrxoB7lkxEzChX^(vKd+sLh?SBic=Q)5nA
zdz7Mw3_iA>;T^_Kl~?1|5t%GZ;ki_+i>Q~Q1EVdKZ)$Sh3LM@ea&D~{2HOG++7*wF
zAC6jW4>fa~!Vp5+$Z{<)Qxb|<doy+ePfu6oC(7$`&WuO0q0$+a9a%yz_{5phPWBz7
zW*;>{unMgCv2)@%3j=7)Zc%U<^i|SAF88s!A^+Xs!OASYT%7;Jx?olg_6NFP1475N
z#0s<@E~FI}#LNQ{?B1;t+N$2k*`K$Hxb%#8tRQi*Z#No0J}Pl;HWb){l7{A8(pu#@
zfE<FZzTROa?{|??!(1M&=4t#qdoS<^Na+oYIxC;QnUK0am@X-v$)ut<3yca1@z&t9
zM)d{X_R6>-OTvEreoz1+p`9sUI%<waswQ*s(MUS7r-ADfL?@KW0)mbJ;|S&qT$0vX
z+3A>Y{e5L-oTP_^NkgpYhZjp&ykinnW;(fu1;ttpSsgYM8ABX4dHe_HxU+%M(D=~)
zYM}XUJ5guZ;=_ZcOsC`_{CiU$zN3$+x&5C`vX-V3`8&RjlBs^rf00MNYZW+jCd~7N
z%{jJuUUwY(M`8$`B>K&_48!Li682ZaRknMgQ3~dnlp8C?__!P2z@=Auv;T^$yrsNy
zCARmaA@^Yo2sS%2$`031-+h9K<HTVTe5)EQvp!MW(iadmCJS1wSbK_@ufo=dlOY}z
zCO9zVYKg|I&o<%8Sb*|F!S|!19op-p&g=TZ%N9@L#(UmyHRFj))9t+gQpBfbTesf-
za`2nVU~8Sd4Kd<Xb>MZsIHfB>s@}>Y(z988e!`%4=EDoAQ0kbk>+lCoK60Mx9P!~I
zlq~wf7kcm_NFImt3ZYlE(b3O1K^QWiFb$V^a2Jlwvm(!XYx<`i@ZMS3UwFt{;x+-v
zhx{m=m;4dgvkKp5{*lfSN3o^keSpp9{hlXj%=}e_7Ou{Yiw(J@NXuh*;pL6@$HsfB
zh?v+r^cp@jQ4E<vE>spC#RqpwPY(}_SS$wZ{S959`C25777&sgtNh%XTCo9VHJC-G
z;;wi9{-iv+ETiY;K9qvlEc04f;ZnUP>cUL_T*ms``EtGoP^B#Q>n2dSrbAg8a>*Lg
zd0EJ^=tdW~7fbcLFsqryFEcy*-<UjNQKPSE=_Pn2>8!?;n%;F+8i{eZyCDaiYxghr
z$8k>L|2&-!lhvuVdk!r-kpSFl`5F5d4DJr%M4-qOy3<bq6e{+%w<EWihn1$%KzFfu
z`LKHky~)zdoi4^H8U?2zL}?l1u6MD%jgB7&*;Qf>gdmQb<G$UVN?JmKSKB~L!OR=i
zI@^y#3#{3i>qF1=aBtRM<!CT741&i5jO+s2lsMXtwRPLCm;Sn!-GpQ>7)c_Ae?$b8
zQg4c8*KQ{XJmL)1c7#0Yn0#PTMEs4-IH<W7>Pjkn0!=;JdhMXqzMLeh`yOylXROP-
zl#z3+fwM9l3%VN(6R77ua*uI9%hO7l7{+Hcbr(peh;afUK?B4EC09J{-u{mv)+u#?
zdKVBCPt`eU@IzL)OXA`E<o1(5;mC6=k@-!Ol2~E}J9hOE??)KsP;2EQ2{Z(0gwv}f
z!It<n&*dKHQo4x|g+0u^h~lZ5Ov4IC#Tfq*CptilVN;HXz`iK4{1F;tZh8So5XLY*
zXxgB;G7CZ#<Iv1X4e=NIfHyT;2#ek12;Y}7qA*ja41jVbduyrB$HRMX3i4#!N49oM
z=DRz&*@5P2{)@K+w!!IcW58;P<<)I=(H60m7Iz@T{w1f<%~zS?f9pR^Y*#fpT<Noz
z19vhe>bu`Xp?u0m%h&X41}FNfnJ*g1!1wcbbpo%F4x!-#R9ft!8{5`Ho}04?FI#Kg
zL|k`tF1t_`ywdy8(wnTut>HND(qNnq%Sq=AvvZbXnLx|mJhi!*&lwG2g|edBdVgLy
zjvVTKHAx(+&P;P#2Xobo7_RttUi)Nllc}}hX>|N?-u5g7VJ-NNdwYcaOG?NK=5)}`
zMtOL;o|i0mSKm(UI_7BL_^6HnVOTkuPI6y@ZLR(H?c1cr-_ouSLp{5!bx^DiKd*Yb
z{K78Ci<l%%epWQ$#NR9uIf5|S3KV`ZTJ$&qJ6`ry!VhqBuPs(j#jC&+5r^-xzR6fB
zK27~T)ZekimVRRz-lpCAJu2yR?1~gIvHR5a1NYj$*q3Netl55}ts!oix2<m^q4oKA
zx&s$GFeBD?)7%@b7gCQPQkbzcY-#e<IqbmH&`NOUj{m_7zrJE%0%MGK`P$ftHCCyA
z#QEOkdexcb5q+aRNqFbL{IkS#hFvjjH9v~WbirfMFFJD$DOv0$f8V^PmC)h@B?4Tt
zm|Lni^t};e&92Z{h%k-#j#z#sF&$u2EIp%nX3YhhH9Z@UzRMIVYuCt&$V#l>&Twup
zTKm)ioN|wcYy%Qnwb)Izb<b#d)i{+1p{kvKer6Fm8jK>H>W!;Ah5Zdm_jRY`+VRJ2
zhkspZ9hbK3iQD91A$d!0*-1i#%x81|s+SPRmD}d~<1p6!A13(!vABP<Z{iwC7e4%~
z_Ln8-%lvcLY32-Y@1SO1*q92_(j#+rhCS=CLMntrY3Mry$(OvuZNSYRrU>2kNgqEG
z?AMgl^P+iRoIY(9@_I?n1829lGvAsRnHwS~|5vD2+Zi53j<5N4wNn0{q>>jF9*bI)
zL$kMXM-awNOElF>{?Jr^tOz1glbwaD-<Z?hQEA3Pbch{-zrz(GmD@~J*ag^+fZsaw
zY>M0OKOlTeW3C!1ZyxRbB>8JDof(O&R1bh%3x#>y2~<>OXO#IIedH0Q`(&&?eo-c~
z>*Ah#3~09unym~UC-UFqqI>{dmUD$Y4@evG#ORLI*{ZM)J<p{vwhmRDEF0r$s4y_e
z=sJVWn|ZM-lg`hKmi%p5C*Kde*o`ZFJEf1Ej+^5AxXqpoV)MlQbue7)^k_qkb+e;`
zWde0R#5(=H5cM$dK9LAsdS=Yk0oGNTPVR(|j6Ls{ih2+`6_F=VxMEkqB<u_yrMn-7
zem-jG!zg{VfBK=QGIg$ZuYze9uWx?aDxho7OdK|L{6b`Vwt6C>l=e1it!XzY($S3V
zLG!Y6fCjE>x6r@5FG1n|8ompSZaJ>9)q6jqU;XxCQk9zV(?C9<V#w?Lf%1Im<}?28
z%fv0sO4GSZ%zfKH*&?O&xk<I#mt_{KWN@l7yB^%JPt=7^LfPgcr~mEkBmfFP7Db0M
zd#E!M<3epZs@^{m3?RG}!71NRBMkEamf~hxD%`6taJAN-7_P+KIU~cqcmswNPF@u0
zBEd?J2tVMNdm+C_OO1xnDaP<CvO06_?;7EsCcbdr{cefhRUYuKyPaC&4Q})>+i*>w
z21+KYt1gXX&0`x3E)hS7I5}snbBzox9C@Xzcr|{B8Hw;SY1$}&BoYKXH^hpjW-RgJ
z-Fb}tannKCv>y~^`r|(1Q9;+sZlYf3XPSX|^gR01UFtu$B*R;$sPZdIZShRr>|b@J
z;#G{EdoY+O;REEjQ}X7_YzWL<b@Mth=4xckE^wJmIQPsUfw>O+Ey3>a_KDe1CjSe|
z6arqcEZ)CX!8r(si`dqbF$uu&pnf^Np{1f*TdJ<q2__L6D@tfPK*~rzVm(OhYZi{~
zO7D1Cy0z3WdT1AOu^h7D1_(%nFOYSW(8K@CEF1cpVqIf7{ZixjH(=6Z%>`r2;@SaZ
z#hb4xlaCA@Pwqj#LlUEe5L{I$k(Zj$d3(~)u(F%&xb8={N9hKxlZIO1ABsM{Mt|)2
zJ^t9Id;?%4PfR4&Ph9B9cFK~@tG3wlFW-0<w~5R`uK#F{bA6_apO|PKuT2G1V=wh!
zZWPJWbbu)nGiWn?;_;mE<K|T11{jR4I#*v{H=AUuEc3+UXA@7uIuDpTy`jcYhUz%o
zBA}z0OR6}0Iqx8Rc?*~((>fXZS_L4U*EiAA%+`h%q2^6BCC;t0iO<j7`ENmUd8a;m
zq?b}^r<Irhn?t82<3YNwQO;C@tCYRR<pR}s5&giTT+nc?H}mtH3ZX|EFpV#H_g4in
z8Tbrg7JdfQvFh#<ovHft;`1YsxU2!leoc~Y)qNFc1mAL8P2+9584$1X7q1nBToy)y
z$s4}XIl~zQ7=m5m-cT@n8wijJJ$|#uxO(nL+IWs9qk?i9%s#W2ZxqfW`jt6{wIS^q
z*iUq6jHCeqca?Re1w*!C)k-nH(eV#(PnPU`?~ov%Y+nj9)j3~WBrKHnC<W0QlTNC*
z<u_q0O?_PoEKdE%)ty@V5F=^-=y+E`(D|T`;&Jjf?_7CST84~oRyM!RwLEZ{ZM@iY
zIB{U~Ge+IK^?H|Bpj8js3(0P2EU%fWNhAH!9B5rA(2TXL071s~i2t!VlQfp=S*6A2
zkt-CN_z|1uc9QB1_^Gpz5);n_@pEbj*T#DvuqJuuKb_PutQhcu6?7{m7g7o;mzZA9
zf{W$DK$@&k565^Y7M*vmK#vF0i(Zb4TM%~5g7C?du<oAbjjU>4V=s4Qug{M|iDV@s
zC7|ef-dxiR7T&Mpre!%hiUhHM%3Qxi$Lzw6&(Tvlx9QA_7LhYq<(o~=Y>3ka-zrQa
zhGpfFK@)#)rtfz61w35^sN1=IFw&Oc!Nah+8@qhJ0UEGr;JplaxOGI82OVqZHsqfX
ze1}r{jy;G?&}Da}a7>S<aX|!tNbjGLu?E#M_FQ+tx7QwU!f|T#|0pGw8beze%W}X8
zTh%o9Dbrk*KF8LN?^<3buL7%?KbkRMr_jMII=xY`U$vl5f0r@#H-|^ToExGU<wfLd
zXr+GANZ(jz6qI7<1HwuGyQ7H^naJ1E$XxZfl>CDsFDuzusee<BvkaOnN;I1*%q9kj
z^#m2ll1tq&oMv5g`}?0u!-DOva7&B0@Z!bH=K`f(k?GfNkG{%)>CKof|Dz2BPsP8?
zY;a)Tkr2P~0^2BeO?wnzF_<l4Nvqf<W`7QjWtJDSw)B?FOMa{8DG?kxHAQnVhPF5z
zxnU_-^up4Prel^ed-PkB1+y((Pnm`A;p#0KHiAU@r9|EKB!f~*!CI?=fpguhu1lxJ
zNfwd#_vJ<v;}^GGOcxE|6OXh~-#_DXMEuzGXcF>Ul-ekY=-w26VnU%U3f19Z-pj&2
z4J_a|o4Dci+MO)mPQIM>kdPG1<w<ic`+WErB>xydiR9@#<n}&^Z@zb@F^w%zU4>8m
zh27D7GF{p|a{8({Q-Pr-;#jV{2zHR><r}G)UYxpAdB=!PS*(C~*1H#i#3#T1$j2)t
z81k%ZC~^7K<oMng7XOD4<}b)aGe_1j<vxx~;=~OWNZThvqsq&|9D#PlGC$L88fM!1
ziqq3RXQ^4C*>lGoFtIfIpoMo?exuQyX_A;;l0AP4!)JEM$EwMInZkj+8*IHP4vKRd
zKx_l-i*>A*C@{u%ct`y~s6MWAfO{@FPIX&sg8H{GMDc{4M3%$@c8&RAlw0-R<4DO3
trJqdc$mBpWeznn?E0M$F`|3v=`3%T2A17h;rxP7$%JLd=6(2u;`(N3pt&so#

-- 
1.9.1



^ permalink raw reply	[flat|nested] 107+ messages in thread

* [PATCH 062/106] toaster: Fix the custom image modal dialogs
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (58 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 061/106] toaster: Remove old bootstrap files left behind Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 063/106] toaster: Comment out unnecessary css Belen Barros Pena
                   ` (43 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=yes, Size: 3657 bytes --]

The markup for modal dialogs has changed in Bootstrap 3, so had to be
changed accordingly in the custom image modal dialogs.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../toastergui/templates/newcustomimage_modal.html | 50 ++++++++++++----------
 1 file changed, 27 insertions(+), 23 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/newcustomimage_modal.html b/bitbake/lib/toaster/toastergui/templates/newcustomimage_modal.html
index 54c5887..2fb5396 100644
--- a/bitbake/lib/toaster/toastergui/templates/newcustomimage_modal.html
+++ b/bitbake/lib/toaster/toastergui/templates/newcustomimage_modal.html
@@ -13,36 +13,40 @@
 </script>
 
 <div class="modal fade" id="new-custom-image-modal" aria-hidden="false">
-  <div class="modal-header">
-    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
-    <h3>New custom image</h3>
-  </div>
+  <div class="modal-dialog">
+    <div class="modal-content">
+      <div class="modal-header">
+        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+        <h3>New custom image</h3>
+      </div>
 
-  <div class="modal-body">
-    <!--
+      <div class="modal-body">
+        <!--
     this container is visible if there are multiple image recipes which could
     be used as a basis for the new custom image; radio buttons are added to it
     via newCustomImageModalSetRecipes() as required
     -->
-    <div data-role="image-selector" style="display:none;">
-      <h4>Which image do you want to customise?</h4>
-      <div data-role="image-selector-radios"></div>
-      <span class="help-block error" id="invalid-recipe-help" style="display:none"></span>
-      <div class="air"></div>
-    </div>
+        <div data-role="image-selector" style="display:none;">
+          <h4>Which image do you want to customise?</h4>
+          <div data-role="image-selector-radios"></div>
+          <span class="help-block error" id="invalid-recipe-help" style="display:none"></span>
+          <div class="air"></div>
+        </div>
 
-    <h4>Name your custom image</h4>
+        <h4>Name your custom image</h4>
 
-    <div class="row">
-      <span class="help-block col-md-8">Image names must be unique. They should not contain spaces or capital letters, and the only allowed special character is dash (-).<p></p>
-      </span></div>
-    <div class="control-group controls">
-      <input type="text" class="huge" placeholder="Type the custom image name" required>
-      <span class="help-block error" id="invalid-name-help" style="display:none"></span>
-    </div>
-  </div>
+        <div class="row">
+          <span class="help-block col-md-8">Image names must be unique. They should not contain spaces or capital letters, and the only allowed special character is dash (-).<p></p>
+        </span></div>
+        <div class="control-group controls">
+          <input type="text" class="huge" placeholder="Type the custom image name" required>
+          <span class="help-block error" id="invalid-name-help" style="display:none"></span>
+        </div>
+      </div>
 
-  <div class="modal-footer">
-    <button id="create-new-custom-image-btn" class="btn btn-primary btn-large" data-original-title="" title="" disabled>Create custom image</button>
+      <div class="modal-footer">
+        <button id="create-new-custom-image-btn" class="btn btn-primary btn-large" data-original-title="" title="" disabled>Create custom image</button>
+      </div>
+    </div>
   </div>
 </div>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 063/106] toaster: Comment out unnecessary css
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (59 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 062/106] toaster: Fix the custom image modal dialogs Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 064/106] toaster: Create new custom css file Belen Barros Pena
                   ` (42 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Comment out the Bootstrap 2 theme, the prettify file (I don't think we
need this), the css customisations made in preparation for the migration
to Boostrap 3, and our current default.css. The idea is to start from
the default Bootstrap 3 theme.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/templates/base.html | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/base.html b/bitbake/lib/toaster/toastergui/templates/base.html
index e930f43..0e92f6d 100644
--- a/bitbake/lib/toaster/toastergui/templates/base.html
+++ b/bitbake/lib/toaster/toastergui/templates/base.html
@@ -8,11 +8,11 @@
       {% block title %} Toaster {% endblock %}
     </title>
     <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}" type="text/css"/>
-    <link rel="stylesheet" href="{% static 'css/bootstrap-toaster-theme.min.css' %}" type='text/css'/>
+    <!--link rel="stylesheet" href="{% static 'css/bootstrap-toaster-theme.min.css' %}" type='text/css'/-->
     <link rel="stylesheet" href="{% static 'css/font-awesome.min.css' %}" type='text/css'/>
-    <link rel="stylesheet" href="{% static 'css/prettify.css' %}" type='text/css'/>
-    <link rel="stylesheet" href="{% static 'css/default.css' %}" type='text/css'/>
-    <link rel="stylesheet" href="{% static 'css/bootstrap3-transition.css' %}" type='text/css' />
+    <!--link rel="stylesheet" href="{% static 'css/prettify.css' %}" type='text/css'/-->
+    <!--link rel="stylesheet" href="{% static 'css/default.css' %}" type='text/css'/-->
+    <!--link rel="stylesheet" href="{% static 'css/bootstrap3-transition.css' %}" type='text/css' /-->
 
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 064/106] toaster: Create new custom css file
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (60 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 063/106] toaster: Comment out unnecessary css Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 065/106] toaster: Base template to Bootstrap 3 Belen Barros Pena
                   ` (41 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Most of our old default.css file will no longer apply to the Bootstrap 3
theme, so create a new one with the initial styles for our fixed top
navigation bar.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../lib/toaster/toastergui/static/css/default.css  | 368 +--------------------
 1 file changed, 8 insertions(+), 360 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index 47603a7..3765be6 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -1,363 +1,11 @@
-/* Style the Yocto Project logo */
-.logo img { height: 30px; width: auto !important; }
-.logo { padding-top: 4px !important; padding-bottom:0px !important; }
-
-/* style the version information */
-.brand > a { color: #777; }
-.brand > a:hover { color: #999; text-decoration: none; }
-.icon-info-sign { color: #777; font-size: 16px; margin-left: 5px;}
-.icon-info-sign:hover { color: #999; cursor: pointer; }
-
-/* Style the breadcrumb */
-.breadcrumb { display: inline-block; background-color: transparent; }
-
-/* Styles for the help information */
-.get-help { color: #CCCCCC; }
-.get-help:hover, .icon-plus-sign:hover { color: #999999; cursor: pointer; }
-.get-help-green { color: #468847; }
-.get-help-green:hover { color: #347132; cursor: pointer; }
-.get-help-blue { color: #3A87AD; }
-.get-help-blue:hover { color: #005580; cursor: pointer; }
-.get-help-yellow { color: #C09853; }
-.get-help-yellow:hover { color: #B38942; cursor: pointer; }
-.get-help-red { color: #B94A48; font-size: 16px; padding-left: 2px; }
-.get-help-red:hover { color: #943A38; cursor: pointer; }
-.build-form>i:first-of-type { margin-left: 5px; }
-.manual { margin: 11px 15px 0 11px;}
-.heading-help { font-size: 14px; }
-
-/* Styles for the external link */
-.get-info { color: #0088CC; }
-.get-info:hover { color: #005580; cursor: pointer; text-decoration: none; }
-
-/* Styles for code and pre tags */
-code { background-color: transparent; border: none; color: #333333; }
-dd code, .alert code { white-space: pre-wrap; word-break: break-all; word-wrap: break-word; }
-.alert-warning code, .alert-warning pre { background-color: transparent; border: none; color: #C09853; margin-bottom: 0px; }
-.alert-error code { background-color: transparent; border: none; color: #B94A48; margin-bottom:0px; }
-.alert-error pre { background-color: transparent; border: none; color: #B94A48; word-break: normal; margin-bottom: 0px; }
-.alert-warning pre { word-break: normal; }
-.alert-info a { font-weight: 300; }
-.alert-info code { color: #3A87AD; }
-.tooltip code { background-color: transparent; color: #FFFFFF; font-weight: normal; border: none; font-size: 1em; }
-
-/* Style for definition lists */
-dd ul { list-style-type: none; margin: 0px; }
-dt, dd  {line-height: 25px; }
-dd li { line-height: 25px; }
-.item-info dd { line-height: 20px; margin-bottom: 10px; }
-
-/* Style the filter modal dialogs */
-.modal-footer .btn {
-  float: left;
- }
-
-.modal-body { max-height: 300px; }
-
-/* Hover style for the clear search icon */
-.icon-remove-sign:hover { color: #999999; cursor: pointer; }
-
-/* Some extra space before headings when needed */
-.details { margin-top: 30px; }
-.air { margin-top: 30px; }
-
-/* Required classes for the highlight behaviour in tables */
-.highlight { -webkit-animation: target-fade 10s 1; -moz-animation: target-fade 10s 1; animation: target-fade 10s 1; }
-@-webkit-keyframes target-fade { 0% { background-color: #D9EDF7; } 25% { background-color: #D9EDF7; } 100% { background-color: white; } }
-@-moz-keyframes target-fade { 0% { background-color: #D9EDF7; } 25% { background-color: #D9EDF7; } 100% { background-color: white; } }
-@keyframes target-fade { 0% { background-color: #D9EDF7; } 25% { background-color: #D9EDF7; } 100% { background-color: white; } }
-
-/* This makes tooltips work inside modal dialogs */
-.tooltip { z-index: 2000 !important; }
-
-/* Override default Twitter Boostrap styles for anchor tags inside tables */
-td a, td a > code { color: #333333; }
-td code { white-space: normal; }
-td a:hover, td a > code:hover { color: #000000; text-decoration: underline; }
-
-/* Override default Twitter Bootstrap styles for tr.error */
-.table tbody tr.error > td { background-color: transparent; } /* override default Bootstrap behaviour */
-.table-hover tbody tr.error:hover > td { background-color: #F5F5F5;} /* override default Bootstrap behaviour */
-
-/* Right justify Bootstrap table columns for size fields */
-.table .sizecol { text-align: right; }
-
-/* Set error, warning, success and muted styles */
-.error, .red, td.error a, tr.error a { color: #b94a48; }
-a.error:hover, a.error:focus, tr.error a:hover { color: #943A38; text-decoration: underline; }
-.warning, .yellow { color: #c09853;}
-a.warning { background-color: transparent; }
-a.warning:hover, a.warning:focus { color: #B38942; text-decoration: underline; }
-.success, .green { color: #468847;}
-.success:hover { color: #347132; text-decoration: underline; }
-td > .success:hover { text-decoration: underline; }
-.muted a { color:#999999; }
-.muted a:hover { color:#999999; }
-
-/* Sorting functionality styles for table headings */
-.sorted { color: #333333; font-weight: bold; }
-.sorted:hover { color: #000000; text-decoration: underline; }
-th > a, th > span { font-weight: normal; }
-
-/* Force long strings like commit hashes to wrap */
-.iscommit { word-break: break-all; word-wrap: break-word;}
-
-/* Make the popovers scrollable if they are too long */
-.popover-content { max-height: 30em; overflow-y: scroll; }
-
-/* Styles for the directory structure table. We'll probably won't use those in production */
-.one { padding-left: 18px !important; }
-.two { padding-left: 36px !important; }
-.three { padding-left: 54px !important; }
-.content-directory a { color: #0088CC; }
-.content-directory a:hover { color: #005580; text-decoration: underline; }
-.symlink { color: #CCCCCC; }
-
-/* Styles for the navbar actions */
-.btn-group + .btn-group { margin-right: 10px; }
-.navbar-inner > .btn-group { margin-top: 6px; }
-
-/* Styles for the parent item in the left navigation */
-
-.nav > li > a.nav-parent { font-size: 18px; line-height: 25px;  }
-
-/* Other styles */
-.dropdown-menu { padding: 10px; }
-select { width: auto; }
-.page-header { color: #5A5A5A; }
-.top-air { margin-top: 40px;}
-.progress { margin-bottom: 0px; }
-.lead .badge { font-size: 18px; font-weight: normal; border-radius: 15px; padding: 9px; }
-.lead ol, .lead ul { padding: 10px 0 0 20px; }
-.lead ol > li, .lead ul > li {
-    line-height: 35px;
-}
-.well > .lead, .alert .lead { margin-bottom: 0px; }
-.well-transparent { background-color: transparent; }
-.no-results { margin: 10px 0; }
-.task-name { margin-left: 7px; }
-.icon-hand-right {color: #CCCCCC; }
-.help-inline { margin: 5px; }
-.dashboard-section { background-color: transparent; }
+/* New Toaster custom css file for Bootstrap 3 */
 
-/* styles for landing page - analysis mode */
-.hero-unit { margin: 20px 0 30px; }
-.hero-unit > .close { font-size:40px; }
-.hero-actions { margin-top: 30px; }
-
-/* styles for landing page - build mode */
-.hero-unit p { line-height: 25px; }
-.hero-unit p, .hero-unit .btn-large { margin-top: 15px; }
-.hero-unit ul { margin-top: 20px; }
-.hero-unit li { line-height: 30px; }
-.hero-unit img { background-color: #eee; margin-top: 15px; }
-
-/* make tables Chrome-happy (me, not so much) */
-table { table-layout: fixed; word-wrap: break-word; }
-
-table p { margin-bottom: 0 }
-.table td { vertical-align: middle; }
-
-/* styles for the new build button */
-.new-build .btn-primary { padding: 4px 30px; }
-.new-build .alert { margin-top: 10px; }
-.new-build .alert p { margin-top: 10px; }
-
-/* styles for showing the project name in build mode */
-.project-name { padding-top: 0; }
-.project-name .label { font-weight: normal; margin-bottom: 5px; margin-left: -15px; padding: 5px; }
-.project-name .label > a { color: #fff; font-weight: normal; }
-
-/* styles for showing help icons next to command-line builds */
-.build-result .get-help-green, .build-result .get-help-red, .build-result .get-help-blue { margin-right: 35px; margin-top: 8px; font-size: 16px; }
-
-/* Remove bottom margin for forms inside modal dialogs */
-#dependencies-modal-form { margin-bottom: 0px; }
-
-/* Custom column widths */
-.narrow-col { width: 8%; }
-.medium-col { width: 12%; }
-
-/* Configuration styles */
-.icon-trash { color: #B94A48; font-size: 16px; padding-left: 5px; }
-.icon-trash:hover { color: #943A38; text-decoration: none; cursor: pointer; }
-.icon-pencil, .icon-download-alt, .icon-refresh, .icon-star-empty, .icon-star  { font-size: 16px; color: #0088CC; padding-left: 2px; }
-.icon-pencil:hover, .icon-download-alt:hover, .icon-refresh:hover, .icon-star-empty:hover, .icon-star:hover, .icon-tasks:hover { color: #005580; text-decoration: none; cursor: pointer; }
-.icon-share { padding-left: 2px; }
-.alert-success .icon-refresh, .alert-success .icon-tasks { color: #468847; }
-.alert-success .icon-refresh:hover, .alert-success .icon-tasks:hover { color: #347132; }
-.alert-error .icon-refresh, .alert-error .icon-tasks { color: #b94a48; }
-.alert-error .icon-refresh:hover, .alert-error .icon-tasks:hover { color: #943A38; }
-.configuration-list li, .configuration-list label { line-height: 35px; font-size: 21px; font-weight: 200; margin-bottom: 0px;}
-.configuration-list { font-size: 16px; margin-bottom: 1.5em; }
-.configuration-list i { font-size: 16px; }
-/*.configuration-layers { height: 135px; overflow: scroll; }*/
-.counter { font-weight: normal; }
-.well-alert { background-color: #FCF8E3; border: 1px solid #FBEED5; border-radius: 4px; }
-.well-alert > .lead { color: #C09853; padding-bottom: .75em; }
-.configuration-alert { margin-bottom: 0px; padding: 8px 14px; }
-.configuration-alert p { margin-bottom: 0px; }
-.project-form { margin-top: 10px; }
-.add-layers .btn-block + .btn-block, .build .btn-block + .btn-block { margin-top: 0px; }
-input.huge { font-size: 17.5px; padding: 11px; min-width: 60%; }
-.build-form { margin-bottom: 0px; }
-.build-form .input-append { margin-bottom: 0px; }
-.build-form .btn-large { padding: 11px 35px; }
-.build-form p { font-size:17.5px ;margin:12px 0 0 10px;}
-#layer-container form, #target-container form { margin-bottom: 0px; }
-.btn-primary .icon-question-sign, .btn-danger .icon-question-sign { color: #fff; }
-.btn-primary .icon-question-sign:hover, .btn-danger .icon-question-sign:hover { color: #999; }
-a code { color: #0088CC; }
-a code:hover { color: #005580; }
-.localconf { font-size: 17.5px; margin-top: 40px; }
-.localconf code { font-size: 17.5px; }
-#add-layer-dependencies {  margin-top: 5px; }
-.link-action { font-size: 17.5px; margin-top: 40px; }
-.link-action code { font-size: 17.5px; }
-.artifact { width: 9em; }
-.control-group { margin-bottom: 0px; }
-#project-details form { margin: 0px; }
-dd form { margin: 10px 0 0 0; }
-dl textarea { resize: vertical; }
-.navbar-fixed-top {  z-index: 1; }
-.popover { z-index: 2; }
-.btn-danger .icon-trash { color: #fff; }
-.bbappends { list-style-type: none; margin-left: 0; }
-.bbappends li { line-height: 25px; }
-.configuration-list input[type="checkbox"] { margin-top:13px;margin-right:10px; }
-.alert input[type="checkbox"] { margin-top: 0px; margin-right: 3px; }
-.alert ol { padding: 10px 0px 0px 20px; }
-.alert ol > li { line-height: 35px; }
-.dl-vertical form { margin-top: 10px; }
-.scrolling { border: 1px solid #dddddd; height: 154px; overflow: auto; padding: 8px; width: 27.5%; margin-bottom: 10px; }
-.lead .help-block { font-size: 14px; line-height: 20px; font-weight: normal; }
-.button-place  .btn { margin: 0 0 20px 0; }
-.tooltip-inner { max-width: 250px; }
-.new-build { padding: 20px; }
-.new-build li { line-height: 30px; }
-.new-build li .alert { line-height: 20px; width: 200px; white-space: normal; }
-.new-build h6 { margin: 10px 0 0 0; color: #5a5a5a; }
-.new-build h3 { margin: 0; color: #5a5a5a; }
-.new-build form { margin: 5px 0 0; }
-.new-build .input-append { margin-bottom: 0; }
-#build-selected { margin-top: 15px; }
-div.add-deps { margin-top: 15px; }
-.btn.log { margin-left: 20px; }
-
-
-.animate-repeat {
-  list-style:none;
-  box-sizing:border-box;
-}
-
-.animate-repeat.ng-move,
-.animate-repeat.ng-enter,
-.animate-repeat.ng-leave {
-  -webkit-transition:all linear 0.5s;
-  transition:all linear 0.5s;
-}
-
-.animate-repeat.ng-leave.ng-leave-active,
-.animate-repeat.ng-move,
-.animate-repeat.ng-enter {
-  opacity:0;
-}
-
-.animate-repeat.ng-leave,
-.animate-repeat.ng-enter.ng-enter-active {
-  opacity:1;
-}
-
-.tab-pane table { margin-top: 10px; }
-
-thead .description, .get_description_or_summary { width: 364px; }
-thead .add-del-layers { width: 124px; }
-
-#loading-notification {
-  position: fixed;
-  z-index: 101;
-  top: 3%;
-  left: 40%;
-  right: 40%;
-  -webkit-box-shadow: 0 0 10px #c09853;
-  -moz-box-shadow: 0 0 10px #c09853;
-  box-shadow: 0 0 10px #c09853;
-}
-
-#change-notification {
-  position: fixed;
-  z-index: 101;
-  top: 3%;
-  left: 20%;
-  right: 20%;
-  -webkit-box-shadow: 0 0 10px #3a87ad;
-  -moz-box-shadow: 0 0 10px #3a87ad;
-  box-shadow: 0 0 10px #3a87ad;
-}
-
-/* Copied in from newer version of Font-Awesome 4.3.0 */
-.fa-spin {
-  -webkit-animation: fa-spin 2s infinite linear;
-  animation: fa-spin 2s infinite linear;
-  display: inline-block;
-}
-.fa-pulse {
-  -webkit-animation: fa-spin 1s infinite steps(8);
-  animation: fa-spin 1s infinite steps(8);
-  display: inline-block;
-}
-
-@-webkit-keyframes fa-spin {
-  0% {
-    -webkit-transform: rotate(0deg);
-    transform: rotate(0deg);
-  }
-  100% {
-    -webkit-transform: rotate(359deg);
-    transform: rotate(359deg);
-  }
-}
-
-@keyframes fa-spin {
-  0% {
-    -webkit-transform: rotate(0deg);
-    -moz-transform: rotate(0deg);
-    transform: rotate(0deg);
-  }
-  100% {
-    -webkit-transform: rotate(359deg);
-    -moz-transform: rotate(359deg);
-    transform: rotate(359deg);
-  }
-}
-/* End copied in from newer version of Font-Awesome 4.3.0 */
-
-.top-padded {
-  padding-top: 60px;
-}
-
-input.input-lg {
-  font-size: 18px;
-  height: 22px;
-  line-height: 1.33333;
-  padding: 10px 16px;
-}
-
-/* styling for standalone typeahead library */
-.tt-menu {
-  margin-top: 2px;
-  border-radius: 4px;
-  width: 100%;
-}
+/* Style the Yocto Project logo */
+img.logo { height: 30px; vertical-align: bottom; }
 
-.tt-suggestion {
-  cursor: pointer;
-  overflow: hidden;
-  white-space: nowrap;
-  text-overflow: ellipsis;
-}
+/* Style the Toaster name in the top navbar */
+.navbar-brand { float: initial; }
 
-.tt-suggestion.active {
-  background-color: #0081c2;
-  color: white;
-}
+/* Style the debugging information in the top navbar */
+.glyphicon-info-sign { color: #777; font-size: 16px; margin-top: 18px; margin-left: -5px; }
+.glyphicon-info-sign:hover { color: #999; cursor: pointer; }
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 065/106] toaster: Base template to Bootstrap 3
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (61 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 064/106] toaster: Create new custom css file Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 066/106] toaster: body styles for " Belen Barros Pena
                   ` (40 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Fix the base.html template to look proper with Bootstrap 3. The patch
makes a few changes and improvements in the process:

* Renames the 'Manual' link to 'Documentation' and displays it together
with the other navigation items.

* Implements the responsive layout for navbars, which collapses the
navigation into a menu to better fit narrow viewports.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../lib/toaster/toastergui/static/css/default.css  | 18 +++++-
 .../lib/toaster/toastergui/static/js/libtoaster.js |  2 +-
 bitbake/lib/toaster/toastergui/templates/base.html | 71 +++++++++++-----------
 3 files changed, 53 insertions(+), 38 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index 3765be6..151fd1b 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -3,9 +3,21 @@
 /* Style the Yocto Project logo */
 img.logo { height: 30px; vertical-align: bottom; }
 
-/* Style the Toaster name in the top navbar */
-.navbar-brand { float: initial; }
+/* Style the Yocto Project logo and the Toaster name in the top navbar */
+.toaster-navbar-brand { float: left; margin: 7px 25px 0 0; }
+.toaster-navbar-brand a.brand { color: #777; height: 50px; padding: 15px 5px 15px 15px; font-size: 20px; line-height: 25px; display: inline; }
+.toaster-navbar-brand > a { text-decoration: none; }
+.toaster-navbar-brand > a.brand:hover { color: #5e5e5e; }
 
 /* Style the debugging information in the top navbar */
-.glyphicon-info-sign { color: #777; font-size: 16px; margin-top: 18px; margin-left: -5px; }
+.glyphicon-info-sign { color: #777; font-size: 16px; }
 .glyphicon-info-sign:hover { color: #999; cursor: pointer; }
+
+/* Override the negative right margin for the navbar-right class */
+#new-project-button { margin-right: 0; }
+
+/* Increase popovers width to fit commit SHAs */
+.popover { min-width: 350px; }
+
+/* Increase bottom margin of definition lists inside popovers for the Toaster version information in the top navbar */
+.popover-content dd { margin-bottom: 15px; }
diff --git a/bitbake/lib/toaster/toastergui/static/js/libtoaster.js b/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
index d48c7f7..fad1429 100644
--- a/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
+++ b/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
@@ -564,7 +564,7 @@ $(document).ready(function() {
     $(".icon-download-alt").tooltip({ container: 'body', html: true, delay: { show: 200 } });
 
     // initialise popover for debug information
-    $(".icon-info-sign").popover( { placement: 'bottom', html: true, container: 'body' });
+    $(".glyphicon-info-sign").popover( { placement: 'bottom', html: true, container: 'body' });
 
     // linking directly to tabs
     $(function(){
diff --git a/bitbake/lib/toaster/toastergui/templates/base.html b/bitbake/lib/toaster/toastergui/templates/base.html
index 0e92f6d..63a920e 100644
--- a/bitbake/lib/toaster/toastergui/templates/base.html
+++ b/bitbake/lib/toaster/toastergui/templates/base.html
@@ -8,11 +8,9 @@
       {% block title %} Toaster {% endblock %}
     </title>
     <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}" type="text/css"/>
-    <!--link rel="stylesheet" href="{% static 'css/bootstrap-toaster-theme.min.css' %}" type='text/css'/-->
+    <!--link rel="stylesheet" href="{% static 'css/bootstrap-theme.css' %}" type="text/css"/-->
     <link rel="stylesheet" href="{% static 'css/font-awesome.min.css' %}" type='text/css'/>
-    <!--link rel="stylesheet" href="{% static 'css/prettify.css' %}" type='text/css'/-->
-    <!--link rel="stylesheet" href="{% static 'css/default.css' %}" type='text/css'/-->
-    <!--link rel="stylesheet" href="{% static 'css/bootstrap3-transition.css' %}" type='text/css' /-->
+    <link rel="stylesheet" href="{% static 'css/default.css' %}" type='text/css'/>
 
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
@@ -73,51 +71,56 @@
       <span id="change-notification-msg"></span>
     </div>
 
-    <div class="navbar navbar-fixed-top">
-      <div class="navbar-inner">
-        <div class="container-fluid">
-          <a class="brand logo" href="#"><img src="{% static 'img/logo.png' %}" class="" alt="Yocto logo project"/></a>
-          <span class="brand">
-            <a href="/">Toaster</a>
+    <nav class="navbar navbar-default navbar-fixed-top">
+      <div class="container-fluid">
+        <div class="navbar-header">
+          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#global-nav" aria-expanded="false">
+            <span class="sr-only">Toggle navigation</span>
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+          </button>
+          <div class="toaster-navbar-brand">
+            <a href="/">
+              <img class="logo" src="{% static 'img/logo.png' %}" class="" alt="Yocto logo project"/>
+            </a>
+            <a class="brand" href="/">Toaster</a>
             {% if DEBUG %}
-            <i class="icon-info-sign" title="<strong>Toaster version information</strong>" data-content="<dl><dt>Git branch</dt><dd>{{TOASTER_BRANCH}}</dd><dt>Git revision</dt><dd>{{TOASTER_REVISION}}</dd></dl>"></i>
+            <span class="glyphicon glyphicon-info-sign" title="<strong>Toaster version information</strong>" data-content="<dl><dt>Git branch</dt><dd>{{TOASTER_BRANCH}}</dd><dt>Git revision</dt><dd>{{TOASTER_REVISION}}</dd></dl>"></i>
             {% endif %}
-          </span>
-          {% if request.resolver_match.url_name != 'landing' and request.resolver_match.url_name != 'newproject' %}
-          <ul class="nav">
-            <li {% if request.resolver_match.url_name == 'all-builds' %}
-                class="active"
-                {% endif %}>
+          </div>
+        </div>
+        <div class="collapse navbar-collapse" id="global-nav">
+            <ul class="nav navbar-nav">
+            {% if request.resolver_match.url_name != 'landing' and request.resolver_match.url_name != 'newproject' %}
+              <li {% if request.resolver_match.url_name == 'all-builds' %}
+              class="active"
+              {% endif %}>
               <a href="{% url 'all-builds' %}">
                 <i class="glyphicon glyphicon-tasks"></i>
                 All builds
               </a>
-            </li>
-            <li {% if request.resolver_match.url_name == 'all-projects'  %}
-                class="active"
-                {% endif %}>
+              </li>
+              <li {% if request.resolver_match.url_name == 'all-projects'  %}
+              class="active"
+              {% endif %}>
               <a href="{% url 'all-projects' %}">
                 <i class="icon-folder-open"></i>
                 All projects
               </a>
-            </li>
-          </ul>
-          {% endif %}
-          <ul class="nav pull-right">
-            <li>
+              </li>
+            {% endif %}
+              <li>
               <a target="_blank" href="http://www.yoctoproject.org/docs/latest/toaster-manual/toaster-manual.html">
                 <i class="glyphicon glyphicon-book"></i>
-                Manual
+                Documentation
               </a>
-            </li>
-          </ul>
-          <span class="pull-right divider-vertical"></span>
-          <div class="btn-group pull-right">
-            <a class="btn" id="new-project-button" href="{% url 'newproject' %}">New project</a>
+              </li>
+            </ul>
+            <a class="btn btn-default navbar-btn navbar-right" id="new-project-button" href="{% url 'newproject' %}">New project</a>
           </div>
-        </div>
       </div>
-    </div>
+    </nav>
 
     <div class="container-fluid top-padded">
       {% block pagecontent %}
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 066/106] toaster: body styles for Bootstrap 3
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (62 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 065/106] toaster: Base template to Bootstrap 3 Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 067/106] toaster: Move latest builds to " Belen Barros Pena
                   ` (39 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Set body top padding for correct layout when using the fixed top navbar,
and remove unnecessary classes and inline css declarations.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/default.css | 3 +++
 bitbake/lib/toaster/toastergui/templates/base.html    | 4 ++--
 2 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index 151fd1b..21eb1d4 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -1,5 +1,8 @@
 /* New Toaster custom css file for Bootstrap 3 */
 
+/* Set required top body padding for the fixed top navbard */
+body { padding-top: 50px; }
+
 /* Style the Yocto Project logo */
 img.logo { height: 30px; vertical-align: bottom; }
 
diff --git a/bitbake/lib/toaster/toastergui/templates/base.html b/bitbake/lib/toaster/toastergui/templates/base.html
index 63a920e..43a3cbd 100644
--- a/bitbake/lib/toaster/toastergui/templates/base.html
+++ b/bitbake/lib/toaster/toastergui/templates/base.html
@@ -59,7 +59,7 @@
     {% endblock %}
   </head>
 
-  <body style="height: 100%">
+  <body>
 
     {% csrf_token %}
     <div id="loading-notification" class="alert lead text-center" style="display:none">
@@ -122,7 +122,7 @@
       </div>
     </nav>
 
-    <div class="container-fluid top-padded">
+    <div class="container-fluid">
       {% block pagecontent %}
       {% endblock %}
     </div>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 067/106] toaster: Move latest builds to Bootstrap 3
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (63 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 066/106] toaster: body styles for " Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 068/106] toaster: Fix the recipe file download Belen Barros Pena
                   ` (38 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Changes to the "Latest builds" section in both the "All builds" and
"Project builds" pages so that they display nicely with Bootstrap 3.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../lib/toaster/toastergui/static/css/default.css  |  15 +++
 .../toaster/toastergui/templates/mrb_section.html  | 111 ++++++++++-----------
 2 files changed, 70 insertions(+), 56 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index 21eb1d4..5090dec 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -24,3 +24,18 @@ img.logo { height: 30px; vertical-align: bottom; }
 
 /* Increase bottom margin of definition lists inside popovers for the Toaster version information in the top navbar */
 .popover-content dd { margin-bottom: 15px; }
+
+/* Style our build results */
+.build-result .progress { margin-bottom: 0; }
+.alert-link.build-warnings,
+.glyphicon-warning-sign.build-warnings { color: #8a6d3b; }
+.build-result .project-name { margin-top: -10px; margin-bottom: 5px; }
+
+/* Styles for the help information */
+.get-help-green { color: #468847; }
+.get-help-green:hover { color: #347132; cursor: pointer; }
+.get-help-blue { color: #3A87AD; }
+.get-help-blue:hover { color: #005580; cursor: pointer; }
+.get-help-red { color: #B94A48; }
+.get-help-red:hover { color: #943A38; cursor: pointer; }
+
diff --git a/bitbake/lib/toaster/toastergui/templates/mrb_section.html b/bitbake/lib/toaster/toastergui/templates/mrb_section.html
index 4ec5885..4fb660b 100644
--- a/bitbake/lib/toaster/toastergui/templates/mrb_section.html
+++ b/bitbake/lib/toaster/toastergui/templates/mrb_section.html
@@ -21,13 +21,15 @@
 {%if mru and mru.count > 0%}
 
   {%if mrb_type == 'project' %}
-      <h2 class="page-header">
-      Latest project builds
+      <div class="page-header">
+        <h2>
+          Latest project builds
 
       {% if project.is_default %}
-          <i class="icon-question-sign get-help heading-help" title="" data-original-title="Builds in this project cannot be started from Toaster: they are started from the command line"></i>
+          <span class="glyphicon glyphicon-question-sign get-help heading-help" title="" data-original-title="Builds in this project cannot be started from Toaster: they are started from the command line"></span>
       {% endif %}
-      </h2>
+        </h2>
+      </div>
   {% else %}
     <div class="page-header">
       <h1>
@@ -37,18 +39,20 @@
   {% endif %}
   <div id="latest-builds">
   {% for build in mru %}
-  <div data-latest-build-result="{{ build.id }}" class="alert build-result {%if build.outcome == build.SUCCEEDED%}alert-success{%elif build.outcome == build.FAILED%}alert-error{%else%}alert-info{%endif%}{% if mrb_type != 'project' %} project-name{% endif %}">
-      {% if mrb_type != 'project' %}
-        <span class="label {%if build.outcome == build.SUCCEEDED%}label-success{%elif build.outcome == build.FAILED%}label-important{%else%}label-info{%endif%}">
-            <a href={% project_url build.project %}>
-                {{build.project.name}}
-            </a>
-        </span>
-      {% endif %}
+  <div data-latest-build-result="{{ build.id }}" class="alert build-result {%if build.outcome == build.SUCCEEDED%}alert-success{%elif build.outcome == build.FAILED%}alert-danger{%else%}alert-info{%endif%}">
+        {% if mrb_type != 'project' %}
+        <div class="row project-name">
+          <div class="col-md-12">
+            <small>
+              <a class="alert-link text-uppercase" href={% project_url build.project %}>{{build.project.name}}</a>
+            </small>
+          </div>
+        </div>
+        {% endif %}
         <div class="row">
-          <div class="col-md-3 lead">
+          <div class="col-md-3">
     {%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
-              <a href="{%url 'builddashboard' build.pk%}" class="{%if build.outcome == build.SUCCEEDED %}success{%else%}error{%endif%}">
+              <a href="{%url 'builddashboard' build.pk%}" class="alert-link">
     {% endif %}
             {% if build.target_set.all.count > 0 %}
                 <span data-toggle="tooltip"
@@ -79,7 +83,7 @@
     {% endif %}
             </div>
     {% if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
-            <div class="col-md-2 lead">
+            <div class="col-md-2">
                 {% if build.completed_on|format_build_date  %}
                     {{ build.completed_on|date:'d/m/y H:i' }}
                 {% else %}
@@ -88,22 +92,23 @@
             </div>
     {% endif %}
     {%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
-            <div class="col-md-2 lead">
+            <div class="col-md-2">
       {% if  build.errors.count %}
-                <i class="icon-minus-sign red"></i> <a href="{%url 'builddashboard' build.pk%}#errors" class="error">{{build.errors.count}} error{{build.errors.count|pluralize}}</a>
+                <span class="glyphicon glyphicon-minus-sign"></span>
+                <a href="{%url 'builddashboard' build.pk%}#errors" class="alert-link">{{build.errors.count}} error{{build.errors.count|pluralize}}</a>
       {% endif %}
             </div>
-            <div class="col-md-2 lead">
+            <div class="col-md-2">
       {% if  build.warnings.count %}
-                <i class="icon-warning-sign yellow"></i> <a href="{%url 'builddashboard' build.pk%}#warnings" class="warning">{{build.warnings.count}} warning{{build.warnings.count|pluralize}}</a>
+                <span class="glyphicon glyphicon-warning-sign build-warnings"></span>
+                <a href="{%url 'builddashboard' build.pk%}#warnings" class="alert-link build-warnings">{{build.warnings.count}} warning{{build.warnings.count|pluralize}}</a>
       {% endif %}
             </div>
-            <div class="lead ">
-              <span class="lead">
-                  Build time: <a href="{% url 'buildtime' build.pk %}">{{ build.timespent_seconds|sectohms }}</a>
-              </span>
+            <div class="col-md-3">
+              Build time: <a class="alert-link" href="{% url 'buildtime' build.pk %}">{{ build.timespent_seconds|sectohms }}
+              </a>
               {% if build.project.is_default %}
-                  <i class="pull-right icon-question-sign get-help
+                  <span class="pull-right glyphicon glyphicon-question-sign get-help
                   {% if build.outcome == build.SUCCEEDED %}
                       get-help-green
                   {% elif build.outcome == build.FAILED %}
@@ -112,72 +117,66 @@
                       get-help-blue
                   {% endif %}
                   " title="Builds in this project cannot be started from Toaster: they are started from the command line">
-                  </i>
+                  </span>
               {% else %}
-                  <button class="run-again-btn btn
+                  <a href="#" class="run-again-btn
                       {% if build.outcome == build.SUCCEEDED %}
-                          btn-success
+                          success
                       {% elif build.outcome == build.FAILED %}
-                          btn-danger
+                          danger
                       {% else %}
-                          btn-info
+                          info
                       {%endif%}
                       pull-right"
                       data-request-url="{% url 'xhr_buildrequest' build.project.pk %}"
                       data-target='{{build.target_set.all|get_tasks|json}}'>
-                        Rebuild
-                  </button>
+                      <span class="glyphicon glyphicon-repeat"></span>
+                      Rebuild
+                  </a>
               {% endif %}
             </div>
     {%endif%}
+
     {%if build.outcome == build.IN_PROGRESS %}
     <div class="col-md-4" style="display:none" id="cancelling-msg-{{build.buildrequest.pk}}">
-      <p class="lead">Cancelling the build ...</p>
+      Cancelling the build ...
     </div>
     <div class="col-md-4 col-md-offset-1 progress-info">
-      <div class="progress" id="build-pc-done-title-{{build.pk}}" style="margin-top:5px;" data-toggle="tooltip" title="{{build.completeper}}% of tasks complete">
-        <div id="build-pc-done-bar-{{build.pk}}" style="width: {{build.completeper}}%;" class="bar"></div>
+      <div class="progress" id="build-pc-done-title-{{build.pk}}">
+        <div id="build-pc-done-bar-{{build.pk}}" style="width: {{build.completeper}}%;" class="progress-bar"></div>
       </div>
     </div>
-    <div class="lead col-md-3 progress-info"><span id="build-pc-done-{{build.pk}}">{{build.completeper}}</span>% of tasks complete</div>
+    <div class="col-md-4 progress-info"><span id="build-pc-done-{{build.pk}}">{{build.completeper}}</span>% of tasks complete
     {# No build cancel for command line builds project #}
     {% if build.project.is_default %}
-    <i class="icon-question-sign get-help get-help-blue pull-right" title="" data-original-title="Builds in this project cannot be cancelled from Toaster: they can only be cancelled from the command line"></i>
+    <span class="glyphicon glyphicon-question-sign get-help get-help-blue pull-right" title="Builds in this project cannot be cancelled from Toaster: they can only be cancelled from the command line"></span>
     {% else %}
-    <div class="lead pull-right progress-info">
-      <button class="cancel-build-btn btn btn-info pull-right"
+      <a href="#" class="cancel-build-btn pull-right"
           data-buildrequest-id={{build.buildrequest.pk}}
           data-request-url="{% url 'xhr_buildrequest' build.project.pk %}" >
+        <span class="glyphicon glyphicon-remove-circle"></span>
         Cancel
-      </button>
+      </a>
     </div>
     {% endif %}
-
+  </div>
     {%endif%} {# end if in progress #}
 
     {% if build.outcome == build.CANCELLED %}
-    <div class="col-md-4">
-      <p class="lead">Build cancelled</p>
+    <div class="col-md-6">
+      Build cancelled
     </div>
-    <button class="btn btn-info pull-right run-again-btn"
+    <div class="col-md-3">
+      <a href="#" class="info pull-right run-again-btn"
         data-request-url="{% url 'xhr_buildrequest' build.project.pk %}"
         data-target='{{build.target_set.all|get_tasks|json}}'>
-      Rebuild
-
-      {% if build.project.is_default %}
-        <i class="icon-question-sign get-help get-help-blue pull-right" title=""
-          data-original-title="Builds in this project cannot be rebuilt from Toaster: they can only be rebuilt from the command line"></i>
-      {% else %}
-        <button class="btn btn-info pull-right run-again-btn"
-                data-request-url="{% url 'xhr_buildrequest' build.project.pk %}"
-                data-target='{{build.target_set.all|get_tasks|json}}'>
-          Rebuild
-        </button>
-      {% endif %}
+        <span class="glyphicon glyphicon-repeat"></span>
+        Rebuild
+      </a>
+    </div>
     {% endif %}
   </div>
 </div>
-
   {% endfor %}
   </div>
 
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 068/106] toaster: Fix the recipe file download
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (64 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 067/106] toaster: Move latest builds to " Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 069/106] toaster: Table controls to Bootstrap 3 Belen Barros Pena
                   ` (37 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

In the custom recipe details page, add the missing if statement in the
right hand column so that recipe files are only shown if they exist.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/templates/customrecipe.html | 1 +
 1 file changed, 1 insertion(+)

diff --git a/bitbake/lib/toaster/toastergui/templates/customrecipe.html b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
index b0f3278..fa76c8a 100644
--- a/bitbake/lib/toaster/toastergui/templates/customrecipe.html
+++ b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
@@ -193,6 +193,7 @@
           </dd>
           {% endwith %}
           {% endif %}
+          {% if base_recipe_file %}
           <dt>Recipe file</dt>
           <dd>
           <code>{{recipe.name}}_{{recipe.version}}.bb</code>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 069/106] toaster: Table controls to Bootstrap 3
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (65 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 068/106] toaster: Fix the recipe file download Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 070/106] toaster: Fix the toastertable table headings Belen Barros Pena
                   ` (36 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Changes to the controls above our tables to make them look nice with
Bootstrap 3. This patch applies only to tables using toaster tables.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../lib/toaster/toastergui/static/css/default.css  | 11 ++++
 bitbake/lib/toaster/toastergui/static/js/table.js  |  5 +-
 .../toaster/toastergui/templates/toastertable.html | 60 ++++++++++++----------
 3 files changed, 47 insertions(+), 29 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index 5090dec..1485337 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -39,3 +39,14 @@ img.logo { height: 30px; vertical-align: bottom; }
 .get-help-red { color: #B94A48; }
 .get-help-red:hover { color: #943A38; cursor: pointer; }
 
+/* Styles for our table controls */
+.form-control[id^="search-input-"] { width: 30em; }
+#edit-columns-button { margin-right: 30px; }
+.navbar-default[id^="table-chrome-"] { background-color: transparent; }
+[id^="table-chrome-collapse-"] .navbar-form { margin-left: -15px; }
+.dropdown-menu.editcol { padding-left: 10px; min-width: 180px; }
+span[class^="remove-search-btn-"] { position: absolute; right: 5px; top: 0; bottom: 0; height: 14px; margin: auto; font-size: 14px; cursor: pointer; color: #777;}
+span[class^="remove-search-btn-"]:hover { color: #333; }
+
+/* Override the default font-weight for labels: it's a bit too much */
+label { font-weight: normal; }
diff --git a/bitbake/lib/toaster/toastergui/static/js/table.js b/bitbake/lib/toaster/toastergui/static/js/table.js
index 85ed188..be32bb3 100644
--- a/bitbake/lib/toaster/toastergui/static/js/table.js
+++ b/bitbake/lib/toaster/toastergui/static/js/table.js
@@ -251,7 +251,7 @@ function tableInit(ctx){
       tableHeadRow.append(header);
 
       /* Now setup the checkbox state and click handler */
-      var toggler = $('<li><label class="checkbox"><input type="checkbox" id="checkbox-'+ col.field_name +'" class="col-toggle" value="'+col.field_name+'" />'+col.title+'</label></li>');
+      var toggler = $('<li><div class="checkbox"><label><input type="checkbox" id="checkbox-'+ col.field_name +'" class="col-toggle" value="'+col.field_name+'" />'+col.title+'</label></div></li>');
 
       var togglerInput = toggler.find("input");
 
@@ -261,7 +261,8 @@ function tableInit(ctx){
       if (col.hideable){
         togglerInput.click(colToggleClicked);
       } else {
-        toggler.find("label").addClass("muted");
+        toggler.find("label").addClass("text-muted");
+        toggler.find("label").parent().addClass("disabled");
         togglerInput.attr("disabled", "disabled");
       }
 
diff --git a/bitbake/lib/toaster/toastergui/templates/toastertable.html b/bitbake/lib/toaster/toastergui/templates/toastertable.html
index ed179b2..debf6e6 100644
--- a/bitbake/lib/toaster/toastergui/templates/toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/toastertable.html
@@ -44,39 +44,45 @@
 
 <div id="table-container-{{table_name}}" style="visibility: hidden">
   <!-- control header -->
-  <div class="navbar" id="table-chrome-{{table_name}}">
-    <div class="navbar-inner">
-      <div class="navbar-search pull-left">
-	<div class="input-append">
-        <input id="search-input-{{table_name}}" class="input-xxlarge"  name="search" type="text" placeholder="Search {{title|lower}}" value="{%if request.GET.search%}{{request.GET.search}}{%endif%}"/>
-        <a href="#" style="display:none" class="input-append-addon btn remove-search-btn-{{table_name}}" tabindex="-1">
-          <i class="glyphicon glyphicon-remove"></i>
-        </a>
-	<span class="input-append-btn">
-        <button class="btn" id="search-submit-{{table_name}}" >Search</button>
-	</span>
-	</div>
+  <div class="navbar navbar-default" id="table-chrome-{{table_name}}">
+    <div class="container-fluid">
+      <div class="navbar-header">
+        <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#table-chrome-collapse-{{table_name}}" aria-expanded="false">
+          <span class="sr-only">Toggle navigation</span>
+          <span class="icon-bar"></span>
+          <span class="icon-bar"></span>
+          <span class="icon-bar"></span>
+        </button>
       </div>
-
-      <div class="pull-right">
-        <div class="btn-group">
-          <button id="edit-columns-button" class="btn dropdown-toggle" data-toggle="dropdown">Edit columns
+      <div class="collapse navbar-collapse" id="table-chrome-collapse-{{table_name}}">
+        <form class="navbar-form navbar-left">
+          <div class="form-group">
+            <div class="btn-group">
+              <input id="search-input-{{table_name}}" class="form-control" name="search" type="text" placeholder="Search {{title|lower}}" value="{%if request.GET.search%}{{request.GET.search}}{%endif%}"/>
+              <span class="remove-search-btn-{{table_name}} glyphicon glyphicon-remove-circle" tabindex="-1" style="display:none;">
+            </div>
+          </div>
+          <button class="btn btn-default" id="search-submit-{{table_name}}" >Search</button>
+        </form>
+        <form class="navbar-form navbar-right">
+          <div clas="form-group">
+            <label>Show rows:</label>
+            <select class="form-control pagesize-{{table_name}}">
+              {% with "10 25 50 100 150" as list%}
+              {% for i in list.split %}
+              <option value="{{i}}">{{i}}</option>
+              {% endfor %}
+              {% endwith %}
+            </select>
+          </div>
+        </form>
+        <div class="btn-group navbar-right">
+          <button id="edit-columns-button" class="btn btn-default navbar-btn dropdown-toggle" data-toggle="dropdown">Edit columns
             <span class="caret"></span>
           </button>
           <ul class="dropdown-menu editcol">
           </ul>
         </div>
-        <div style="display:inline">
-          <span class="divider-vertical"></span>
-          <span class="help-inline" style="padding-top:5px;">Show rows:</span>
-          <select style="margin-top:5px;margin-bottom:0px;" class="pagesize-{{table_name}}">
-            {% with "10 25 50 100 150" as list%}
-            {% for i in list.split %}
-            <option value="{{i}}">{{i}}</option>
-            {% endfor %}
-            {% endwith %}
-          </select>
-        </div>
       </div>
     </div>
   </div>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 070/106] toaster: Fix the toastertable table headings
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (66 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 069/106] toaster: Table controls to Bootstrap 3 Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 071/106] toaster: Remove spurious div Belen Barros Pena
                   ` (35 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

For tables implemented with toaster tables, make sure the table heading
shows:

* Proper borders
* Different states for sortable, not sortable and sorted column
headings
* Lighter help bubbles using the correct icon
* Correct selected / not selected states for filters

Also use the new responsive tables provided by Bootstrap 3.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/default.css     | 15 +++++++++++++++
 bitbake/lib/toaster/toastergui/static/js/table.js         | 12 +++++++-----
 .../lib/toaster/toastergui/templates/toastertable.html    | 14 ++++++++------
 3 files changed, 30 insertions(+), 11 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index 1485337..137e6f5 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -32,6 +32,8 @@ img.logo { height: 30px; vertical-align: bottom; }
 .build-result .project-name { margin-top: -10px; margin-bottom: 5px; }
 
 /* Styles for the help information */
+.get-help { color: #CCCCCC; }
+.get-help:hover { color: #999999; cursor: pointer; }
 .get-help-green { color: #468847; }
 .get-help-green:hover { color: #347132; cursor: pointer; }
 .get-help-blue { color: #3A87AD; }
@@ -50,3 +52,16 @@ span[class^="remove-search-btn-"]:hover { color: #333; }
 
 /* Override the default font-weight for labels: it's a bit too much */
 label { font-weight: normal; }
+
+/* Firefox workaround for awkward fieldset styling. See http://getbootstrap.com/css/#tables-responsive */
+@-moz-document url-prefix() { fieldset { display: table-cell; } }
+
+/* Table heading sortable / not sortable states */
+thead > tr > th > a { font-weight: normal; }
+thead > tr > th > a.sorted { font-weight: bold; color: #333; }
+
+/* Give some extra space to the 'clear filter' buttons */
+.tooltip .btn { margin: 5px; }
+
+/* In table headings, separate the help bubble from the column heading */
+thead > tr > th > .glyphicon-question-sign { margin-right: 5px; }
diff --git a/bitbake/lib/toaster/toastergui/static/js/table.js b/bitbake/lib/toaster/toastergui/static/js/table.js
index be32bb3..5e3171f 100644
--- a/bitbake/lib/toaster/toastergui/static/js/table.js
+++ b/bitbake/lib/toaster/toastergui/static/js/table.js
@@ -169,7 +169,7 @@ function tableInit(ctx){
     if (tableChromeDone === true)
       return;
 
-    var tableHeadRow = table.find("thead");
+    var tableHeadRow = table.find("thead > tr");
     var editColMenu = $("#table-chrome-"+ctx.tableName).find(".editcol");
 
     tableHeadRow.html("");
@@ -190,7 +190,7 @@ function tableInit(ctx){
 
       /* Setup the help text */
       if (col.help_text.length > 0) {
-        var help_text = $('<i class="icon-question-sign get-help"> </i>');
+        var help_text = $('<span class="glyphicon glyphicon-question-sign get-help"> </span>');
         help_text.tooltip({title: col.help_text});
         header.append(help_text);
       }
@@ -227,12 +227,12 @@ function tableInit(ctx){
       } else {
         /* Not orderable */
         header.css("font-weight", "normal");
-        header.append('<span class="muted">' + col.title + '</span> ');
+        header.append('<span class="text-muted">' + col.title + '</span> ');
       }
 
       /* Setup the filter button */
       if (col.filter_name){
-        var filterBtn = $('<a href="#" role="button" data-filter-on="' + col.filter_name + '" class="pull-right btn btn-mini" data-toggle="modal"><i class="glyphicon glyphicon-filter filtered"></i></a>');
+        var filterBtn = $('<a href="#" role="button" data-filter-on="' + col.filter_name + '" class="pull-right btn btn-link btn-xs" data-toggle="modal"><i class="glyphicon glyphicon-filter filtered"></i></a>');
 
         filterBtn.data('filter-name', col.filter_name);
         filterBtn.prop('id', col.filter_name);
@@ -279,11 +279,12 @@ function tableInit(ctx){
   /* Toggles the active state of the filter button */
   function filterBtnActive(filterBtn, active){
     if (active) {
+      filterBtn.removeClass("btn-link");
       filterBtn.addClass("btn-primary");
 
       filterBtn.tooltip({
           html: true,
-          title: '<button class="btn btn-small btn-primary" onClick=\'$("#clear-filter-btn-'+ ctx.tableName +'").click();\'>Clear filter</button>',
+          title: '<button class="btn btn-sm btn-primary" onClick=\'$("#clear-filter-btn-'+ ctx.tableName +'").click();\'>Clear filter</button>',
           placement: 'bottom',
           delay: {
             hide: 1500,
@@ -292,6 +293,7 @@ function tableInit(ctx){
       });
     } else {
       filterBtn.removeClass("btn-primary");
+      filterBtn.addClass("btn-link");
       filterBtn.tooltip('destroy');
     }
   }
diff --git a/bitbake/lib/toaster/toastergui/templates/toastertable.html b/bitbake/lib/toaster/toastergui/templates/toastertable.html
index debf6e6..3419862 100644
--- a/bitbake/lib/toaster/toastergui/templates/toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/toastertable.html
@@ -88,12 +88,14 @@
   </div>
 
   <!-- The actual table -->
-  <table class="table table-bordered table-hover tablesorter" id="{{table_name}}">
-    <thead>
-      <tr><th></th></tr>
-    </thead>
-    <tbody></tbody>
-  </table>
+  <div class="table-responsive">
+    <table class="table table-bordered table-hover" id="{{table_name}}">
+      <thead>
+        <tr><th></th></tr>
+      </thead>
+      <tbody></tbody>
+    </table>
+  </div>
 
   <!-- Pagination controls -->
   <div id="pagination-{{table_name}}">
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 071/106] toaster: Remove spurious div
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (67 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 070/106] toaster: Fix the toastertable table headings Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 072/106] toaster: Fix 'all builds' table content Belen Barros Pena
                   ` (34 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

An extra closing div was causing layout troubles in the all builds and
project builds pages.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/templates/mrb_section.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/mrb_section.html b/bitbake/lib/toaster/toastergui/templates/mrb_section.html
index 4fb660b..ffb268d 100644
--- a/bitbake/lib/toaster/toastergui/templates/mrb_section.html
+++ b/bitbake/lib/toaster/toastergui/templates/mrb_section.html
@@ -159,7 +159,7 @@
       </a>
     </div>
     {% endif %}
-  </div>
+
     {%endif%} {# end if in progress #}
 
     {% if build.outcome == build.CANCELLED %}
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 072/106] toaster: Fix 'all builds' table content
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (68 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 071/106] toaster: Remove spurious div Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 073/106] toaster: Fix bottom table controls Belen Barros Pena
                   ` (33 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Setting the Bootstrap 3 icons and colours, and removing some links from
the table data so that we can make clickable items look clickable.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../lib/toaster/toastergui/static/css/default.css  | 14 +++++---
 bitbake/lib/toaster/toastergui/tables.py           | 42 +++++++++-------------
 2 files changed, 26 insertions(+), 30 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index 137e6f5..b6a584b 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -34,12 +34,12 @@ img.logo { height: 30px; vertical-align: bottom; }
 /* Styles for the help information */
 .get-help { color: #CCCCCC; }
 .get-help:hover { color: #999999; cursor: pointer; }
-.get-help-green { color: #468847; }
-.get-help-green:hover { color: #347132; cursor: pointer; }
+.get-help-green { color: #3c763d; }
+.get-help-green:hover { color: #2b542c; cursor: pointer; }
 .get-help-blue { color: #3A87AD; }
 .get-help-blue:hover { color: #005580; cursor: pointer; }
-.get-help-red { color: #B94A48; }
-.get-help-red:hover { color: #943A38; cursor: pointer; }
+.get-help-red { color: #a94442; }
+.get-help-red:hover { color: #843534; cursor: pointer; }
 
 /* Styles for our table controls */
 .form-control[id^="search-input-"] { width: 30em; }
@@ -65,3 +65,9 @@ thead > tr > th > a.sorted { font-weight: bold; color: #333; }
 
 /* In table headings, separate the help bubble from the column heading */
 thead > tr > th > .glyphicon-question-sign { margin-right: 5px; }
+
+/* Style build outcome and download icons */
+tbody > tr > td > .glyphicon-ok-circle { color: #3c763d; }
+tbody > tr > td > .glyphicon-minus-sign { color: #a94442; }
+.glyphicon-download-alt { color: #337ab7; }
+.glyphicon-download-alt:hover { color: #23527c; }
diff --git a/bitbake/lib/toaster/toastergui/tables.py b/bitbake/lib/toaster/toastergui/tables.py
index 29b68de..a5acdb6 100644
--- a/bitbake/lib/toaster/toastergui/tables.py
+++ b/bitbake/lib/toaster/toastergui/tables.py
@@ -1109,19 +1109,17 @@ class BuildsTable(ToasterTable):
 
     def setup_columns(self, *args, **kwargs):
         outcome_template = '''
-        <a href="{% url "builddashboard" data.id %}">
-            {% if data.outcome == data.SUCCEEDED %}
-                <i class="icon-ok-sign success"></i>
-            {% elif data.outcome == data.FAILED %}
-                <i class="icon-minus-sign error"></i>
-            {% endif %}
-        </a>
+        {% if data.outcome == data.SUCCEEDED %}
+            <span class="glyphicon glyphicon-ok-circle"></span>
+        {% elif data.outcome == data.FAILED %}
+            <span class="glyphicon glyphicon-minus-sign"></span>
+        {% endif %}
 
         {% if data.cooker_log_path %}
             &nbsp;
             <a href="{% url "build_artifact" data.id "cookerlog" data.id %}">
-               <i class="icon-download-alt get-help"
-               data-original-title="Download build log"></i>
+               <span class="glyphicon glyphicon-download-alt get-help"
+               data-original-title="Download build log"></span>
             </a>
         {% endif %}
         '''
@@ -1136,27 +1134,21 @@ class BuildsTable(ToasterTable):
         '''
 
         machine_template = '''
-        <a href="{% url "builddashboard" data.id %}">
-            {{data.machine}}
-        </a>
+        {{data.machine}}
         '''
 
         started_on_template = '''
-        <a href="{% url "builddashboard" data.id %}">
-            {{data.started_on | date:"d/m/y H:i"}}
-        </a>
+        {{data.started_on | date:"d/m/y H:i"}}
         '''
 
         completed_on_template = '''
-        <a href="{% url "builddashboard" data.id %}">
-            {{data.completed_on | date:"d/m/y H:i"}}
-        </a>
+        {{data.completed_on | date:"d/m/y H:i"}}
         '''
 
         failed_tasks_template = '''
         {% if data.failed_tasks.count == 1 %}
             <a href="{% url "task" data.id data.failed_tasks.0.id %}">
-                <span class="error">
+                <span class="text-danger">
                     {{data.failed_tasks.0.recipe.name}}.{{data.failed_tasks.0.task_name}}
                 </span>
             </a>
@@ -1167,14 +1159,14 @@ class BuildsTable(ToasterTable):
             </a>
         {% elif data.failed_tasks.count > 1 %}
             <a href="{% url "tasks" data.id %}?filter=outcome%3A{{extra.Task.OUTCOME_FAILED}}">
-                <span class="error">{{data.failed_tasks.count}} tasks</span>
+                <span class="text-danger">{{data.failed_tasks.count}} tasks</span>
             </a>
         {% endif %}
         '''
 
         errors_template = '''
         {% if data.errors_no %}
-            <a class="errors.count error" href="{% url "builddashboard" data.id %}#errors">
+            <a class="errors.count text-danger" href="{% url "builddashboard" data.id %}#errors">
                 {{data.errors_no}} error{{data.errors_no|pluralize}}
             </a>
         {% endif %}
@@ -1182,7 +1174,7 @@ class BuildsTable(ToasterTable):
 
         warnings_template = '''
         {% if data.warnings_no %}
-            <a class="warnings.count warning" href="{% url "builddashboard" data.id %}#warnings">
+            <a class="warnings.count text-warning" href="{% url "builddashboard" data.id %}#warnings">
                 {{data.warnings_no}} warning{{data.warnings_no|pluralize}}
             </a>
         {% endif %}
@@ -1197,9 +1189,7 @@ class BuildsTable(ToasterTable):
 
         image_files_template = '''
         {% if data.outcome == extra.Build.SUCCEEDED %}
-          <a href="{% url "builddashboard" data.id %}#images">
             {{data.get_image_file_extensions}}
-          </a>
         {% endif %}
         '''
 
@@ -1417,10 +1407,10 @@ class AllBuildsTable(BuildsTable):
             {{data.project.name}}
         </a>
         {% if data.project.is_default %}
-            <i class="icon-question-sign get-help hover-help" title=""
+            <span class="glyphicon glyphicon-question-sign get-help hover-help" title=""
                data-original-title="This project shows information about
                the builds you start from the command line while Toaster is
-               running" style="visibility: hidden;"></i>
+               running" style="visibility: hidden;"></span>
         {% endif %}
         '''
 
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 073/106] toaster: Fix bottom table controls
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (69 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 072/106] toaster: Fix 'all builds' table content Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 074/106] toaster: Fix 'all projects' table content Belen Barros Pena
                   ` (32 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

For tables using toaster tables, make the bottom pagination and 'show
rows' controls play nice with Bootstrap 3.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../lib/toaster/toastergui/static/css/default.css  |  2 ++
 .../toaster/toastergui/templates/toastertable.html | 23 +++++++++++-----------
 2 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index b6a584b..3790f9c 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -49,6 +49,8 @@ img.logo { height: 30px; vertical-align: bottom; }
 .dropdown-menu.editcol { padding-left: 10px; min-width: 180px; }
 span[class^="remove-search-btn-"] { position: absolute; right: 5px; top: 0; bottom: 0; height: 14px; margin: auto; font-size: 14px; cursor: pointer; color: #777;}
 span[class^="remove-search-btn-"]:hover { color: #333; }
+[id^="pagination-"] .pagination,
+[id^="pagination-"] .navbar-form { margin-top: 0; }
 
 /* Override the default font-weight for labels: it's a bit too much */
 label { font-weight: normal; }
diff --git a/bitbake/lib/toaster/toastergui/templates/toastertable.html b/bitbake/lib/toaster/toastergui/templates/toastertable.html
index 3419862..131b0b8 100644
--- a/bitbake/lib/toaster/toastergui/templates/toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/toastertable.html
@@ -102,15 +102,16 @@
     <ul class="pagination">
     </ul>
 
-    <div class="pull-right">
-      <span class="help-inline">Show rows:</span>
-      <select class="pagesize-{{table_name}}">
-        {% with "10 25 50 100 150" as list%}
-        {% for i in list.split %}
-        <option value="{{i}}">{{i}}</option>
-        {% endfor %}
-        {% endwith %}
-      </select>
-    </div>
+    <form class="navbar-form navbar-right">
+      <div class="form-group">
+        <label>Show rows:</label>
+        <select class="form-control pagesize-{{table_name}}">
+          {% with "10 25 50 100 150" as list%}
+          {% for i in list.split %}
+          <option value="{{i}}">{{i}}</option>
+          {% endfor %}
+          {% endwith %}
+        </select>
+      </div>
+    </form>
   </div>
-</div>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 074/106] toaster: Fix 'all projects' table content
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (70 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 073/106] toaster: Fix bottom table controls Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 075/106] toaster: Configuration page to Bootstrap 3 Belen Barros Pena
                   ` (31 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Apply the correct classes and remove unnecessary content links.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/tables.py | 50 ++++++++++++--------------------
 1 file changed, 19 insertions(+), 31 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/tables.py b/bitbake/lib/toaster/toastergui/tables.py
index a5acdb6..bbdd258 100644
--- a/bitbake/lib/toaster/toastergui/tables.py
+++ b/bitbake/lib/toaster/toastergui/tables.py
@@ -848,26 +848,22 @@ class ProjectsTable(ToasterTable):
         last_activity_on_template = '''
         {% load project_url_tag %}
         <span data-project-field="updated">
-          <a href="{% project_url data %}">
             {{data.updated | date:"d/m/y H:i"}}
-          </a>
         </span>
         '''
 
         release_template = '''
         <span data-project-field="release">
           {% if data.release %}
-            <a href="{% url 'project' data.id %}#project-details">
-                {{data.release.name}}
-            </a>
+            {{data.release.name}}
           {% elif data.is_default %}
-            <span class="muted">Not applicable</span>
-            <i class="icon-question-sign get-help hover-help"
-               data-original-title="This project does not have a release set.
+            <span class="text-muted">Not applicable</span>
+            <span class="glyphicon glyphicon-question-sign get-help hover-help"
+               title="This project does not have a release set.
                It simply collects information about the builds you start from
                the command line while Toaster is running"
                style="visibility: hidden;">
-            </i>
+            </span>
           {% else %}
             No release available
           {% endif %}
@@ -877,16 +873,14 @@ class ProjectsTable(ToasterTable):
         machine_template = '''
         <span data-project-field="machine">
           {% if data.is_default %}
-            <span class="muted">Not applicable</span>
-            <i class="icon-question-sign get-help hover-help"
-               data-original-title="This project does not have a machine
+            <span class="text-muted">Not applicable</span>
+            <span class="glyphicon glyphicon-question-sign get-help hover-help"
+               title="This project does not have a machine
                set. It simply collects information about the builds you
                start from the command line while Toaster is running"
-               style="visibility: hidden;"></i>
+               style="visibility: hidden;"></span>
           {% else %}
-            <a href="{% url 'project' data.id %}#machine-distro">
-              {{data.get_current_machine_name}}
-            </a>
+            {{data.get_current_machine_name}}
           {% endif %}
         </span>
         '''
@@ -896,20 +890,16 @@ class ProjectsTable(ToasterTable):
           <a href="{% url 'projectbuilds' data.id %}">
             {{data.get_number_of_builds}}
           </a>
-        {% else %}
-          <span class="muted">0</span>
         {% endif %}
         '''
 
         last_build_outcome_template = '''
         {% if data.get_number_of_builds > 0 %}
-          <a href="{% url 'builddashboard' data.get_last_build_id %}">
-            {% if data.get_last_outcome == extra.Build.SUCCEEDED %}
-              <i class="icon-ok-sign success"></i>
-            {% elif data.get_last_outcome == extra.Build.FAILED %}
-              <i class="icon-minus-sign error"></i>
-            {% endif %}
-          </a>
+          {% if data.get_last_outcome == extra.Build.SUCCEEDED %}
+            <span class="glyphicon glyphicon-ok-circle"></span>
+          {% elif data.get_last_outcome == extra.Build.FAILED %}
+            <span class="glyphicon glyphicon-minus-sign"></span>
+          {% endif %}
         {% endif %}
         '''
 
@@ -923,7 +913,7 @@ class ProjectsTable(ToasterTable):
 
         errors_template = '''
         {% if data.get_number_of_builds > 0 and data.get_last_errors > 0 %}
-          <a class="errors.count error"
+          <a class="errors.count text-danger"
              href="{% url "builddashboard" data.get_last_build_id %}#errors">
             {{data.get_last_errors}} error{{data.get_last_errors | pluralize}}
           </a>
@@ -932,7 +922,7 @@ class ProjectsTable(ToasterTable):
 
         warnings_template = '''
         {% if data.get_number_of_builds > 0 and data.get_last_warnings > 0 %}
-          <a class="warnings.count warning"
+          <a class="warnings.count text-warning"
              href="{% url "builddashboard" data.get_last_build_id %}#warnings">
             {{data.get_last_warnings}} warning{{data.get_last_warnings | pluralize}}
           </a>
@@ -941,9 +931,7 @@ class ProjectsTable(ToasterTable):
 
         image_files_template = '''
         {% if data.get_number_of_builds > 0 and data.get_last_outcome == extra.Build.SUCCEEDED %}
-          <a href="{% url "builddashboard" data.get_last_build_id %}#images">
-            {{data.get_last_build_extensions}}
-          </a>
+          {{data.get_last_build_extensions}}
         {% endif %}
         '''
 
@@ -979,7 +967,7 @@ class ProjectsTable(ToasterTable):
                         static_data_name='machine',
                         static_data_template=machine_template)
 
-        self.add_column(title='Number of builds',
+        self.add_column(title='Builds',
                         help_text='The number of builds which have been run \
                                    for the project',
                         hideable=False,
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 075/106] toaster: Configuration page to Bootstrap 3
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (71 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 074/106] toaster: Fix 'all projects' table content Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 076/106] toaster: 'Project builds' " Belen Barros Pena
                   ` (30 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Make sure the project configuration page looks nice with Bootstrap 3.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../lib/toaster/toastergui/static/css/default.css  | 54 ++++++++++++++++++--
 .../lib/toaster/toastergui/static/js/libtoaster.js |  4 +-
 .../toaster/toastergui/static/js/projectpage.js    |  4 +-
 .../toastergui/templates/baseprojectpage.html      |  2 +-
 .../lib/toaster/toastergui/templates/project.html  | 59 +++++++++-------------
 .../toastergui/templates/projecttopbar.html        | 43 ++++++++--------
 6 files changed, 102 insertions(+), 64 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index 3790f9c..795fe41 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -68,8 +68,56 @@ thead > tr > th > a.sorted { font-weight: bold; color: #333; }
 /* In table headings, separate the help bubble from the column heading */
 thead > tr > th > .glyphicon-question-sign { margin-right: 5px; }
 
-/* Style build outcome and download icons */
+/* Style build outcome in tables, download, remove and change icons */
 tbody > tr > td > .glyphicon-ok-circle { color: #3c763d; }
 tbody > tr > td > .glyphicon-minus-sign { color: #a94442; }
-.glyphicon-download-alt { color: #337ab7; }
-.glyphicon-download-alt:hover { color: #23527c; }
+.glyphicon-download-alt,
+.glyphicon-edit { color: #337ab7; }
+.glyphicon-download-alt:hover,
+.glyphicon-edit:hover { color: #23527c; cursor: pointer }
+.glyphicon-trash { color: #a94442; }
+.glyphicon-trash:hover { color: #843534; cursor: pointer; }
+
+/* Set the font size for icons inside headings and lead paragraphs */
+h1 > .glyphicon-edit,
+p.lead .glyphicon { font-size: 16px; }
+
+h3 > .glyphicon-question-sign { font-size: 14px; }
+
+/* Create a class for wells without background colour */
+.well-transparent { background-color: transparent; }
+
+/* Create a class for the left navigation headers */
+.nav-header { display: block; font-size: 12px; font-weight: bold; line-height: 20px; color: #999; text-transform: uppercase; margin-top: 20px !important; margin-bottom: 15px; padding-left: 15px; }
+
+/* Increase the tabs padding and margin in the project pages to fit the build form and the main content */
+#project-topbar .nav-tabs > li > a { padding: 15px; }
+#project-topbar { margin-bottom: 20px; }
+
+/* Style the project name change form in the project pages */
+#project-name-change-input { width: 20em; }
+
+/* Style the build form in the project pages */
+#project-topbar .input-lg { width: 18em; }
+#project-topbar form .glyphicon { top: 15px; right: 4px; }
+#build-button { padding: 10px 30px; }
+
+/* Style the form links in the project page (all machines, all layers, etc) */
+.form-link { margin-top: 10px; }
+
+/* Style the most built recipes list in the project page */
+#freq-build-list .checkbox input[type="checkbox"] { position: relative; margin: 0 10px 0 0; vertical-align: middle; }
+#freq-build-list { margin-top: 20px; }
+#freq-build-list label { padding-left: 0; }
+#freq-build-btn { margin-top: 10px; }
+#no-most-built { margin-top: 20px; }
+
+/* Style the layers section in the project page */
+#layer-container .form-inline { margin-top: 20px; }
+#layer-add-input { width: 17em; }
+#layers-in-project-list { margin-top: 20px; }
+#layers-in-project-list > li { line-height: 38px; }
+#layers-in-project-list .glyphicon-trash { font-size: 16px; margin-left: 7px; }
+#layers-in-project-list .tooltip-inner  { max-width: 600px; }
+#no-layers-in-project { margin-top: 20px; }
+#no-layers-in-project ul { margin-top: 10px; }
diff --git a/bitbake/lib/toaster/toastergui/static/js/libtoaster.js b/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
index fad1429..c00c5ab 100644
--- a/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
+++ b/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
@@ -557,8 +557,8 @@ $(document).ready(function() {
     // show task type and outcome in task details pages
     $(".task-info").tooltip({ container: 'body', html: true, delay: {show: 200}, placement: 'right' });
 
-    // initialise the tooltips for the icon-pencil icons
-    $(".icon-pencil").tooltip({ container: 'body', html: true, delay: {show: 400}, title: "Change" });
+    // initialise the tooltips for the edit icons
+    $(".glyphicon-edit").tooltip({ container: 'body', html: true, delay: {show: 400}, title: "Change" });
 
     // initialise the tooltips for the download icons
     $(".icon-download-alt").tooltip({ container: 'body', html: true, delay: { show: 200 } });
diff --git a/bitbake/lib/toaster/toastergui/static/js/projectpage.js b/bitbake/lib/toaster/toastergui/static/js/projectpage.js
index 3013416..9cbed2b 100644
--- a/bitbake/lib/toaster/toastergui/static/js/projectpage.js
+++ b/bitbake/lib/toaster/toastergui/static/js/projectpage.js
@@ -145,7 +145,7 @@ function projectPageInit(ctx) {
     for (var i in layers){
       var layerObj = layers[i];
 
-      var projectLayer = $("<li><a></a><span class=\"icon-trash\" data-toggle=\"tooltip\" title=\"Remove\"></span></li>");
+      var projectLayer = $("<li><a></a><span class=\"glyphicon glyphicon-trash\" data-toggle=\"tooltip\" title=\"Remove\"></span></li>");
 
       projectLayer.data('layer', layerObj);
       projectLayer.children("span").tooltip();
@@ -208,7 +208,7 @@ function projectPageInit(ctx) {
     }
 
     for (var i in recipes){
-      var freqTargetCheck = $('<li><label class="checkbox"><input type="checkbox" /><span class="freq-target-name"></span></label></li>');
+      var freqTargetCheck = $('<li><div class="checkbox"><label><input type="checkbox" /><span class="freq-target-name"></span></label></li>');
       freqTargetCheck.find(".freq-target-name").text(recipes[i]);
       freqTargetCheck.find("input").val(recipes[i]);
       freqTargetCheck.click(function(){
diff --git a/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html b/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html
index 483a485..b3b6f1c 100644
--- a/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html
+++ b/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html
@@ -24,7 +24,7 @@ $(document).ready(function(){
 
   <!-- only on config pages -->
   <div id="config-nav" class="col-md-2">
-    <ul class="nav nav-list well">
+    <ul class="nav nav-pills nav-stacked">
       <li><a class="nav-parent" href="{% url 'project' project.id %}">Configuration</a></li>
       <li class="nav-header">Compatible metadata</li>
       <li><a href="{% url 'projectcustomimages' project.id %}">Custom images</a></li>
diff --git a/bitbake/lib/toaster/toastergui/templates/project.html b/bitbake/lib/toaster/toastergui/templates/project.html
index 045a89f..ff9eab7 100644
--- a/bitbake/lib/toaster/toastergui/templates/project.html
+++ b/bitbake/lib/toaster/toastergui/templates/project.html
@@ -54,19 +54,19 @@
     <div class="well well-transparent" id="machine-section">
       <h3>Machine</h3>
 
-      <p class="lead"><span id="project-machine-name"></span> <i title="" data-original-title="" id="change-machine-toggle" class="icon-pencil"></i></p>
+      <p class="lead"><span id="project-machine-name"></span> <span class="glyphicon glyphicon-edit" id="change-machine-toggle"></span></p>
 
-      <form id="select-machine-form" style="display:none;">
+      <form id="select-machine-form" style="display:none;" class="form-inline">
         <div class="alert alert-info">
           <strong>Machine changes have a big impact on build outcome.</strong> You cannot really compare the builds for the new machine with the previous ones.
         </div>
 
-        <div class="input-append">
-          <input id="machine-change-input" autocomplete="off" value="" data-provide="typeahead" data-minlength="1" data-autocomplete="off" type="text">
-            <button id="machine-change-btn" class="btn" type="button">Save</button> <a href="#" id="cancel-machine-change" class="btn btn-link">Cancel</a>
+        <div class="form-group">
+          <input class="form-control" id="machine-change-input" autocomplete="off" value="" data-provide="typeahead" data-minlength="1" data-autocomplete="off" type="text">
         </div>
-
-        <p><a href="{% url 'projectmachines' project.id %}" class="link">View compatible machines</a></p>
+        <button id="machine-change-btn" class="btn btn-default" type="button">Save</button>
+        <a href="#" id="cancel-machine-change" class="btn btn-link">Cancel</a>
+        <p class="form-link"><a href="{% url 'projectmachines' project.id %}">View compatible machines</a></p>
       </form>
     </div>
 
@@ -74,11 +74,11 @@
       <h3>Most built recipes</h3>
 
       <div class="alert alert-info" style="display:none" id="no-most-built">
-        <span class="lead">You haven't built any recipes yet</span>
-        <p style="margin-top: 10px;"><a href="{% url 'projectimagerecipes' project.id %}">Choose a recipe to build</a></p>
+        <h4>You haven't built any recipes yet</h4>
+        <p class="form-link"><a href="{% url 'projectimagerecipes' project.id %}">Choose a recipe to build</a></p>
       </div>
 
-      <ul class="list-unstyled configuration-list" id="freq-build-list">
+      <ul class="list-unstyled lead" id="freq-build-list">
       </ul>
       <button class="btn btn-primary" id="freq-build-btn" disabled="disabled">Build selected recipes</button>
     </div>
@@ -104,44 +104,35 @@
 
   <div class="col-md-6">
     <div class="well well-transparent" id="layer-container">
-      <h3>Layers <span class="muted counter">(<span id="project-layers-count"></span>)</span>
-        <i data-original-title="OpenEmbedded organises metadata into modules called 'layers'. Layers allow you to isolate different types of customizations from each other. <a href='http://www.yoctoproject.org/docs/current/dev-manual/dev-manual.html#understanding-and-creating-layers' target='_blank'>More on layers</a>" class="icon-question-sign get-help heading-help" title=""></i>
+      <h3>Layers <span class="counter">(<span id="project-layers-count"></span>)</span>
+        <span title="OpenEmbedded organises recipes and machines into thematic groups called <strong>layers</strong>. Click on a layer name to see the recipes and machines it includes." class="glyphicon glyphicon-question-sign get-help"></span>
       </h3>
 
-      <div class="alert lead" id="no-layers-in-project" style="display:none">
-        You need to add some layers. For that you can:
+      <div class="alert alert-warning" id="no-layers-in-project" style="display:none">
+        <h4>This project has no layers</h4>
+        In order to build this project you need to add some layers first. For that you can:
         <ul>
-          <li><a href="{% url 'projectlayers' project.id %}">View all layers compatible with this project</a></li>
+          <li><a href="{% url 'projectlayers' project.id %}">Choose from the layers compatible with this project</a></li>
           <li><a href="{% url 'importlayer' project.id %}">Import a layer</a></li>
           <li><a href="http://www.yoctoproject.org/docs/current/dev-manual/dev-manual.html#understanding-and-creating-layers" target="_blank">Read about layers in the documentation</a></li>
+          <li>Or type a layer name below</li>
         </ul>
-        <p>Or type a layer name below.</p>
       </div>
 
-      <form style="margin-top:20px">
-        <!--div class="control-group error"-->
-
-	<div class="col-lg-ff6">
-	  <div class="input-append">
-	    <input id="layer-add-input" class="input-xlarge" autocomplete="off" placeholder="Type a layer name" data-minlength="1" data-autocomplete="off" data-provide="typeahead" data-source="" type="text">
-	      <button id="add-layer-btn" class="btn" disabled>Add</button>
-	  </div>
-	</div>
-
-        <div id="import-alert" class="alert alert-info" style="display:none;">
-          Toaster does not know about this layer. Please <a href="#">import it</a>
+      <form class="form-inline">
+        <div class="form-group">
+          <input id="layer-add-input" class="form-control" autocomplete="off" placeholder="Type a layer name" data-minlength="1" data-autocomplete="off" data-provide="typeahead" data-source="" type="text">
         </div>
-
-        <p>
+        <button id="add-layer-btn" class="btn btn-default" disabled>Add layer</button>
+        <p class="form-link">
           <a href="{% url 'projectlayers' project.id %}" id="view-compatible-layers">View compatible layers</a>
-          <i data-original-title="View all the layers you can build with the release selected for this project, which is Yocto Project master" class="icon-question-sign get-help" title=""></i>
-          | <a href="{% url 'importlayer' project.id %}">Import layer</a>
+          <span class="text-muted">|</span>
+          <a href="{% url 'importlayer' project.id %}">Import layer</a>
         </p>
       </form>
 
-      <ul class="list-unstyled configuration-list" id="layers-in-project-list">
+      <ul class="list-unstyled lead" id="layers-in-project-list">
       </ul>
-    </div>
   </div>
 </div>
 {% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/projecttopbar.html b/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
index b662a6e..f8ee2d8 100644
--- a/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
+++ b/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
@@ -26,25 +26,24 @@
     <h1 id="project-name-container">
       <span id="project-name">{{project.name}}</span>
 
-      <i class="icon-pencil" data-original-title="" id="project-change-form-toggle" title=""></i>
+      <span class="glyphicon glyphicon-edit" id="project-change-form-toggle"></i>
 
-    {% if project.is_default %}
-        <i class="icon-question-sign get-help heading-help" title="" data-original-title="This project shows information about the builds you start from the command line while Toaster is running"></i>
-    {% endif %}
-  </h1>
-  <form id="project-name-change-form" style="margin-bottom: 0px; display: none;">
-    <div class="input-group" id="validate-project-name">
-      <input class="huge input-xxlarge" type="text" id="project-name-change-input" autocomplete="off" value="{{project.name}}">
-        <button id="project-name-change-btn" class="btn btn-large" type="button">Save</button>
-        <a href="#" id="project-name-change-cancel" class="btn btn-lg btn-link">Cancel</a>
-    </div>
-    <p class="help-block error" style="display: none;margin-top: 10px;" id="hint-error-project-name">A project with this name exists. Project names must be unique.</p>
-  </form>
-</div>
+      {% if project.is_default %}
+      <span class="glyphicon glyphicon-question-sign get-help" title="This project shows information about the builds you start from the command line while Toaster is running"></span>
+      {% endif %}
+    </h1>
+    <form id="project-name-change-form" class="form-inline" style="display: none;">
+      <div class="form-group">
+        <input class="form-control input-lg" type="text" id="project-name-change-input" autocomplete="off" value="{{project.name}}">
+      </div>
+      <button id="project-name-change-btn" class="btn btn-default btn-lg" type="button">Save</button>
+      <a href="#" id="project-name-change-cancel" class="btn btn-lg btn-link">Cancel</a>
+    </form>
+  </div>
 
   {% if not project.is_default %}
   <div id="project-topbar">
-    <ul class="nav nav-pills">
+    <ul class="nav nav-tabs">
       <li id="topbar-configuration-tab">
       <a href="{% url 'project' project.id %}">
         Configuration
@@ -66,13 +65,13 @@
       </a>
       </li>
       <li class="pull-right">
-      <form class="form-inline" style="margin-bottom:0px;">
-        <i class="icon-question-sign get-help heading-help" data-placement="left" title="" data-original-title="Type the name of one or more recipes you want to build, separated by a space. You can also specify a task by appending a colon and a task name to the recipe name, like so: <code>busybox:clean</code>"></i>
-        <div class="input-append">
-          <input id="build-input" type="text" class="huge build-target-input" placeholder="Type the recipe you want to build" autocomplete="off" disabled>
-          <button id="build-button" class="btn btn-primary btn-large build-button" data-project-id="{{project.id}}" disabled>Build</button>
-        </div>
-      </form>
+        <form class="form-inline">
+          <div class="form-group">
+            <span class="glyphicon glyphicon-question-sign get-help" data-placement="left" title="Type the name of one or more recipes you want to build, separated by a space. You can also specify a task by appending a colon and a task name to the recipe name, like so: <code>busybox:clean</code>"></span>
+            <input id="build-input" type="text" class="form-control input-lg" placeholder="Type the recipe you want to build" autocomplete="off" disabled>
+          </div>
+          <button id="build-button" class="btn btn-primary btn-lg" data-project-id="{{project.id}}" disabled>Build</button>
+        </form>
       </li>
     </ul>
   </div>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 076/106] toaster: 'Project builds' page to Bootstrap 3
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (72 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 075/106] toaster: Configuration page to Bootstrap 3 Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 077/106] toaster: Project builds empty state Belen Barros Pena
                   ` (29 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Some small changes to make sure the page displays properly with
Bootstrap 3.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/default.css      |  6 ++++++
 bitbake/lib/toaster/toastergui/templates/mrb_section.html  | 14 ++++++--------
 .../toastergui/templates/projectbuilds-toastertable.html   |  2 +-
 3 files changed, 13 insertions(+), 9 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index 795fe41..676f39a 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -121,3 +121,9 @@ h3 > .glyphicon-question-sign { font-size: 14px; }
 #layers-in-project-list .tooltip-inner  { max-width: 600px; }
 #no-layers-in-project { margin-top: 20px; }
 #no-layers-in-project ul { margin-top: 10px; }
+
+/* Create a class for additional top margin that we can use in headings */
+.top-air { margin-top: 40px; }
+
+/* Add some bottom margin to our h2's */
+h2 { margin-bottom: 25px; }
diff --git a/bitbake/lib/toaster/toastergui/templates/mrb_section.html b/bitbake/lib/toaster/toastergui/templates/mrb_section.html
index ffb268d..100f680 100644
--- a/bitbake/lib/toaster/toastergui/templates/mrb_section.html
+++ b/bitbake/lib/toaster/toastergui/templates/mrb_section.html
@@ -21,15 +21,13 @@
 {%if mru and mru.count > 0%}
 
   {%if mrb_type == 'project' %}
-      <div class="page-header">
-        <h2>
-          Latest project builds
+  <h2>
+    Latest project builds
 
-      {% if project.is_default %}
-          <span class="glyphicon glyphicon-question-sign get-help heading-help" title="" data-original-title="Builds in this project cannot be started from Toaster: they are started from the command line"></span>
-      {% endif %}
-        </h2>
-      </div>
+    {% if project.is_default %}
+    <span class="glyphicon glyphicon-question-sign get-help heading-help" title="" data-original-title="Builds in this project cannot be started from Toaster: they are started from the command line"></span>
+    {% endif %}
+  </h2>
   {% else %}
     <div class="page-header">
       <h1>
diff --git a/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html b/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html
index 4118ebc..b9348eb 100644
--- a/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html
@@ -22,7 +22,7 @@
       {% include 'mrb_section.html' %}
     {% endwith %}
 
-    <h2 class="page-header top-air" data-role="page-title"></h2>
+    <h2 class="top-air" data-role="page-title"></h2>
 
     {% url 'projectbuilds' project.id as xhr_table_url %}
     {% include 'toastertable.html' %}
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 077/106] toaster: Project builds empty state
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (73 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 076/106] toaster: 'Project builds' " Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 078/106] toaster: Style typeaheads Belen Barros Pena
                   ` (28 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Create an empty state for the "Project builds" page.

Signed-off-by: Michael Wood <michael.g.wood@intel.com>
Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/js/table.js  | 24 ++++++++++++++--------
 bitbake/lib/toaster/toastergui/tables.py           |  8 ++++++++
 .../templates/projectbuilds-toastertable.html      | 15 +++++++++++---
 .../toaster/toastergui/templates/toastertable.html |  4 ++++
 bitbake/lib/toaster/toastergui/widgets.py          |  3 ++-
 5 files changed, 42 insertions(+), 12 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/js/table.js b/bitbake/lib/toaster/toastergui/static/js/table.js
index 5e3171f..6888c71 100644
--- a/bitbake/lib/toaster/toastergui/static/js/table.js
+++ b/bitbake/lib/toaster/toastergui/static/js/table.js
@@ -75,14 +75,21 @@ function tableInit(ctx){
 
     if (tableData.total === 0){
       tableContainer.hide();
-      if ($("#no-results-special-"+ctx.tableName).length > 0) {
-        /* use this page's special no-results form instead of the default */
-        $("#no-results-search-input-"+ctx.tableName).val(tableParams.search);
-        $("#no-results-special-"+ctx.tableName).show();
-        $("#results-found-"+ctx.tableName).hide();
-      } else {
-        $("#new-search-input-"+ctx.tableName).val(tableParams.search);
-        $("#no-results-"+ctx.tableName).show();
+      /* No results caused by a search returning nothing */
+      if (tableParams.search) {
+        if ($("#no-results-special-"+ctx.tableName).length > 0) {
+          /* use this page's special no-results form instead of the default */
+          $("#no-results-search-input-"+ctx.tableName).val(tableParams.search);
+          $("#no-results-special-"+ctx.tableName).show();
+          $("#results-found-"+ctx.tableName).hide();
+        } else {
+          $("#new-search-input-"+ctx.tableName).val(tableParams.search);
+          $("#no-results-"+ctx.tableName).show();
+        }
+      }
+      else {
+        /* No results caused by there being no data */
+        $("#empty-state-"+ctx.tableName).show();
       }
       table.trigger("table-done", [tableData.total, tableParams]);
 
@@ -90,6 +97,7 @@ function tableInit(ctx){
     } else {
       tableContainer.show();
       $("#no-results-"+ctx.tableName).hide();
+      $("#empty-state-"+ctx.tableName).hide();
     }
 
     setupTableChrome(tableData);
diff --git a/bitbake/lib/toaster/toastergui/tables.py b/bitbake/lib/toaster/toastergui/tables.py
index bbdd258..d1906c1 100644
--- a/bitbake/lib/toaster/toastergui/tables.py
+++ b/bitbake/lib/toaster/toastergui/tables.py
@@ -1424,6 +1424,7 @@ class ProjectBuildsTable(BuildsTable):
         super(ProjectBuildsTable, self).__init__(*args, **kwargs)
         self.title = 'All project builds'
         self.mrb_type = 'project'
+        self.empty_state = "This project has no builds"
 
         # set from the querystring
         self.project_id = None
@@ -1466,4 +1467,11 @@ class ProjectBuildsTable(BuildsTable):
         context['mru'] = Build.get_recent(project)
         context['project'] = project
 
+        self.setup_queryset(**kwargs)
+        if self.queryset.count() == 0 and \
+           project.build_set.filter(outcome=Build.IN_PROGRESS).count() > 0:
+            context['build_in_progress_none_completed'] = True
+        else:
+            context['build_in_progress_none_completed'] = False
+
         return context
diff --git a/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html b/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html
index b9348eb..6d27668 100644
--- a/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html
@@ -24,8 +24,10 @@
 
     <h2 class="top-air" data-role="page-title"></h2>
 
-    {% url 'projectbuilds' project.id as xhr_table_url %}
-    {% include 'toastertable.html' %}
+    {% if not build_in_progress_none_completed %} 
+      {% url 'projectbuilds' project.id as xhr_table_url %}
+      {% include 'toastertable.html' %}
+    {% endif %}
   </div>
 
   <script>
@@ -46,7 +48,14 @@
           }
         }
 
-        titleElt.text(title);
+				if (total === 0) {
+					titleElt.hide();
+				} 
+				else {
+					titleElt.show()
+					titleElt.text(title);
+				}
+
       });
 
       // highlight builds tab
diff --git a/bitbake/lib/toaster/toastergui/templates/toastertable.html b/bitbake/lib/toaster/toastergui/templates/toastertable.html
index 131b0b8..350dff3 100644
--- a/bitbake/lib/toaster/toastergui/templates/toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/toastertable.html
@@ -25,6 +25,10 @@
 
 {% include 'toastertable-filter.html' %}
 
+<div class="row-fluid" id="empty-state-{{table_name}}" style="display:none">
+  <div class="alert alert-info">{{empty_state}}</div>
+</div>
+
 <div id="no-results-{{table_name}}" style="display:none">
   <div class="alert">
     <form class="no-results input-append">
diff --git a/bitbake/lib/toaster/toastergui/widgets.py b/bitbake/lib/toaster/toastergui/widgets.py
index 4117031..c968830 100644
--- a/bitbake/lib/toaster/toastergui/widgets.py
+++ b/bitbake/lib/toaster/toastergui/widgets.py
@@ -75,7 +75,8 @@ class ToasterTable(TemplateView):
     def get_context_data(self, **kwargs):
         context = super(ToasterTable, self).get_context_data(**kwargs)
         context['title'] = self.title
-        context['table_name'] = type(self).__name__.lower()
+        context['table_name'] =  type(self).__name__.lower()
+        context['empty_state'] = self.empty_state
 
         return context
 
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 078/106] toaster: Style typeaheads
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (74 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 077/106] toaster: Project builds empty state Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 079/106] toaster: Fix display of failed tasks Belen Barros Pena
                   ` (27 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Make them look proper with Bootstrap 3

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/default.css | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index 676f39a..69fbab9 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -127,3 +127,10 @@ h3 > .glyphicon-question-sign { font-size: 14px; }
 
 /* Add some bottom margin to our h2's */
 h2 { margin-bottom: 25px; }
+
+/* Style the typeahead */
+.tt-menu { min-width: 400px; padding-bottom: 10px; }
+.tt-suggestion { padding: 5px 10px; }
+.tt-suggestion:hover,
+.tt-suggestion:active { background-color: #f5f5f5; cursor: pointer; }
+	
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 079/106] toaster: Fix display of failed tasks
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (75 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 078/106] toaster: Style typeaheads Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 080/106] toaster: Fix the import layer form Belen Barros Pena
                   ` (26 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

In the builds tables, apply the correct styles to the failed tasks and
their download log icon.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/default.css |  1 +
 bitbake/lib/toaster/toastergui/tables.py              | 12 ++++++------
 2 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index 69fbab9..363e3ce 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -73,6 +73,7 @@ tbody > tr > td > .glyphicon-ok-circle { color: #3c763d; }
 tbody > tr > td > .glyphicon-minus-sign { color: #a94442; }
 .glyphicon-download-alt,
 .glyphicon-edit { color: #337ab7; }
+.failed_tasks .glyphicon-download-alt { margin-left: 5px; } 
 .glyphicon-download-alt:hover,
 .glyphicon-edit:hover { color: #23527c; cursor: pointer }
 .glyphicon-trash { color: #a94442; }
diff --git a/bitbake/lib/toaster/toastergui/tables.py b/bitbake/lib/toaster/toastergui/tables.py
index d1906c1..479ba1e 100644
--- a/bitbake/lib/toaster/toastergui/tables.py
+++ b/bitbake/lib/toaster/toastergui/tables.py
@@ -1135,15 +1135,15 @@ class BuildsTable(ToasterTable):
 
         failed_tasks_template = '''
         {% if data.failed_tasks.count == 1 %}
-            <a href="{% url "task" data.id data.failed_tasks.0.id %}">
-                <span class="text-danger">
-                    {{data.failed_tasks.0.recipe.name}}.{{data.failed_tasks.0.task_name}}
+            <a class="text-danger" href="{% url "task" data.id data.failed_tasks.0.id %}">
+                <span>
+                    {{data.failed_tasks.0.recipe.name}} {{data.failed_tasks.0.task_name}}
                 </span>
             </a>
             <a href="{% url "build_artifact" data.id "tasklogfile" data.failed_tasks.0.id %}">
-                <i class="icon-download-alt"
-                   data-original-title="Download task log file">
-                </i>
+                <span class="glyphicon glyphicon-download-alt get-help"
+                   title="Download task log file">
+                </span>
             </a>
         {% elif data.failed_tasks.count > 1 %}
             <a href="{% url "tasks" data.id %}?filter=outcome%3A{{extra.Task.OUTCOME_FAILED}}">
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 080/106] toaster: Fix the import layer form
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (76 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 079/106] toaster: Fix display of failed tasks Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 081/106] toaster: Fix the toaster tables no results Belen Barros Pena
                   ` (25 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Style it for Bootstrap 3.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../lib/toaster/toastergui/static/css/default.css  |  27 +++-
 .../toaster/toastergui/static/js/importlayer.js    |   8 +-
 .../toaster/toastergui/templates/importlayer.html  | 136 ++++++++++-----------
 3 files changed, 92 insertions(+), 79 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index 363e3ce..f9116e9 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -82,7 +82,7 @@ tbody > tr > td > .glyphicon-minus-sign { color: #a94442; }
 /* Set the font size for icons inside headings and lead paragraphs */
 h1 > .glyphicon-edit,
 p.lead .glyphicon { font-size: 16px; }
-
+h2 > .glyphicon-question-sign,
 h3 > .glyphicon-question-sign { font-size: 14px; }
 
 /* Create a class for wells without background colour */
@@ -113,12 +113,15 @@ h3 > .glyphicon-question-sign { font-size: 14px; }
 #freq-build-btn { margin-top: 10px; }
 #no-most-built { margin-top: 20px; }
 
-/* Style the layers section in the project page */
+/* Style the layers section in the project page and the layer dependencies in the import layer form */
 #layer-container .form-inline { margin-top: 20px; }
 #layer-add-input { width: 17em; }
-#layers-in-project-list { margin-top: 20px; }
-#layers-in-project-list > li { line-height: 38px; }
-#layers-in-project-list .glyphicon-trash { font-size: 16px; margin-left: 7px; }
+#layers-in-project-list,
+#layer-deps-list { margin-top: 20px; }
+#layers-in-project-list > li,
+#layer-deps-list > li { line-height: 38px; }
+#layers-in-project-list .glyphicon-trash,
+#layer-deps-list .glyphicon-trash { font-size: 16px; margin-left: 7px; }
 #layers-in-project-list .tooltip-inner  { max-width: 600px; }
 #no-layers-in-project { margin-top: 20px; }
 #no-layers-in-project ul { margin-top: 10px; }
@@ -134,4 +137,16 @@ h2 { margin-bottom: 25px; }
 .tt-suggestion { padding: 5px 10px; }
 .tt-suggestion:hover,
 .tt-suggestion:active { background-color: #f5f5f5; cursor: pointer; }
-	
+
+/* Style the import layer form controls*/
+legend { border: none; }
+#layer-name-ctrl { margin-top: 20px; }
+#import-layer-name,
+#layer-subdir { width: 20%; }
+#layer-git-repo-url { width: 40%; }
+#layer-git-ref { width: 32%; }
+#layer-dependency { width: 16em; }
+#form-actions { margin-bottom: 30px; }
+#duplicate-layer-info dl { margin-top: 10px; }
+#duplicate-layer-info dd { margin-bottom: 10px; }
+.help-inline { color: #737373; margin-left: 10px; }
diff --git a/bitbake/lib/toaster/toastergui/static/js/importlayer.js b/bitbake/lib/toaster/toastergui/static/js/importlayer.js
index e193557..2f59567 100644
--- a/bitbake/lib/toaster/toastergui/static/js/importlayer.js
+++ b/bitbake/lib/toaster/toastergui/static/js/importlayer.js
@@ -46,7 +46,7 @@ function importLayerPageInit (ctx) {
       currentLayerDepSelection = choice;
     }
     else {
-      layerDepBtn.attr("disabled", "disabled");
+      layerDepBtn.attr("disabled","disabled");
       currentLayerDepSelection = undefined;
     }
   });
@@ -70,7 +70,7 @@ function importLayerPageInit (ctx) {
     layerDeps[currentLayerDepSelection.id] = currentLayerDepSelection;
 
     /* Make a list item for the new layer dependency */
-    var newLayerDep = $("<li><a></a><span class=\"icon-trash\" data-toggle=\"tooltip\" title=\"Delete\"></span></li>");
+    var newLayerDep = $("<li><a></a><span class=\"glyphicon glyphicon-trash\" data-toggle=\"tooltip\" title=\"Remove\"></span></li>");
 
     newLayerDep.data('layer-id', currentLayerDepSelection.id);
     newLayerDep.children("span").tooltip();
@@ -263,7 +263,7 @@ function importLayerPageInit (ctx) {
 
   layerNameInput.on('input', function() {
     if ($(this).val() && !validLayerName.test($(this).val())){
-      layerNameCtrl.addClass("error")
+      layerNameCtrl.addClass("has-error")
       $("#invalid-layer-name-hint").show();
       enable_import_btn(false);
       return;
@@ -280,7 +280,7 @@ function importLayerPageInit (ctx) {
      * reason.
      */
     if (!duplicatedLayerName.is(":visible"))
-      layerNameCtrl.removeClass("error")
+      layerNameCtrl.removeClass("has-error")
 
     $("#invalid-layer-name-hint").hide();
     check_form();
diff --git a/bitbake/lib/toaster/toastergui/templates/importlayer.html b/bitbake/lib/toaster/toastergui/templates/importlayer.html
index 765106c..e7522d7 100644
--- a/bitbake/lib/toaster/toastergui/templates/importlayer.html
+++ b/bitbake/lib/toaster/toastergui/templates/importlayer.html
@@ -29,7 +29,7 @@
 
                 <form class="col-md-11">
                    <fieldset>
-                      <legend>Layer repository information</legend>
+                      <h2>Layer repository information</h2>
                       <span class="help-block">The layer you are importing must be compatible with <strong>{{project.release.description}}</strong>, which is the release you are using in this project.</span>
                       <div class="alert alert-error" id="import-error" style="display:none">
                         <button type="button" class="close" data-dismiss="alert">&times;</button>
@@ -38,89 +38,87 @@
                         <ul></ul>
                       </div>
 
-                      <div class="control-group" id="layer-name-ctrl">
-                        <label class="control-label air" for="import-layer-name">
+                      <div class="form-group" id="layer-name-ctrl">
+                        <label class="control-label" for="import-layer-name">
                             Layer name
-                            <span class="icon-question-sign get-help" title="Something like 'meta-mylayer'. Your layer name must be unique and can only include letters, numbers and dashes"></span>
+                            <span class="glyphicon glyphicon-question-sign get-help" title="Something like 'meta-mylayer'. Your layer name must be unique and can only include letters, numbers and dashes"></span>
                         </label>
-                        <div class="controls">
-                          <input id="import-layer-name" type="text" required autofocus data-autocomplete="off" data-provide="typeahead">
-                          <span class="help-inline" style="display: none;" id="invalid-layer-name-hint">A valid layer name can only include letters, numbers and dashes</span>
-                          <span class="help-inline" style="display: none;" id="duplicated-layer-name-hint"></span>
-                        </div>
-
+                        <input class="form-control" id="import-layer-name" type="text" required autofocus data-autocomplete="off" data-provide="typeahead">
+                        <span class="help-block" style="display: none;" id="invalid-layer-name-hint">A valid layer name can only include letters, numbers and dashes</span>
+                        <span class="help-inline" style="display: none;" id="duplicated-layer-name-hint"></span>
                       </div>
-                      <div id="duplicate-layer-info" style="display:none">
-                        <div class="alert warning">
-                          <h3>A layer called <a href="" class="dup-layer-link"><span class="dup-layer-name"></span></a> already exists</h3>
-                          <p>Layer names must be unqiue. Please use a different layer name.</p>
-                        </div>
-                        <dl>
-                          <dt>
-                            The <span class="dup-layer-name"></span> repository url is
-                          </dt>
-                          <dd>
-                            <span id="dup-layer-vcs-url"></span>
-                          </dd>
-
-                          <dt>
-                            The <span class="dup-layer-name"></span> revision is
-                          </dt>
-                          <dd>
-                            <span id="dup-layer-revision"></span>
-                          </dd>
-                        </dl>
-
-                        <p><a href="" class="dup-layer-link">View the <span class="dup-layer-name"></span> layer information</a></p>
 
+                      <div id="duplicate-layer-info" style="display:none">
+                        <div class="alert alert-warning">
+													<h3>A layer called <a href="" class="dup-layer-link"><span class="dup-layer-name"></span></a> already exists</h3>
+													<p>Layer names must be unqiue. Please use a different layer name.</p>
+													<dl>
+														<dt>
+															The <span class="dup-layer-name"></span> repository url is
+														</dt>
+														<dd>
+															<span id="dup-layer-vcs-url"></span>
+														</dd>
+														<dt>
+															The <span class="dup-layer-name"></span> revision is
+														</dt>
+														<dd>
+														<span id="dup-layer-revision"></span>
+														</dd>
+													</dl>
+													<p><a href="" class="dup-layer-link">View the <span class="dup-layer-name"></span> layer information</a></p>
+												</div>
                       </div>
 
                       <div class="fields-apart-from-layer-name">
-                        <label for="layer-git-repo-url" class="project-form">
-                            Git repository URL
-                            <span class="icon-question-sign get-help" title="Fetch/clone URL of the repository. Currently, Toaster only supports Git repositories." ></span>
-                        </label>
-
-                        <input type="text" id="layer-git-repo-url" class="input-xxlarge" required>
-                        <label class="project-form" for="layer-subdir">
-                            Repository subdirectory
-                            <span class="muted">(optional)</span>
-                            <span class="icon-question-sign get-help" title="Subdirectory within the repository where the layer is located, if not in the root (usually only used if the repository contains more than one layer)"></span>
-                        </label>
-                        <input type="text"  id="layer-subdir">
-
-                          <div class="control-group" id="layer-revision-ctrl">
-                            <label class="control-label project-form" for="layer-git-ref">Git revision
-                              <span class="icon-question-sign get-help" title="You can provide a Git branch, a tag or a commit SHA as the revision"></span>
-                            </label>
-                            <div class="controls">
-                              <input type="text" class="col-md-3" id="layer-git-ref" required>
-                                <span class="help-inline" style="diaply:none;" id="invalid-layer-revision-hint"></span>
-                            </div>
-                          </div>
+												<div class="form-group">
+													<label for="layer-git-repo-url">
+														Git repository URL
+														<span class="glyphicon glyphicon-question-sign get-help" title="Fetch/clone URL of the repository. Currently, Toaster only supports Git repositories." ></span>
+													</label>
+
+													<input type="text" id="layer-git-repo-url" class="form-control" required>
+												</div>
+												<div class="form-group">
+													<label for="layer-subdir">
+														Repository subdirectory
+														<span class="text-muted">(optional)</span>
+														<span class="glyphicon glyphicon-question-sign get-help" title="Subdirectory within the repository where the layer is located, if not in the root (usually only used if the repository contains more than one layer)"></span>
+													</label>
+													<input type="text" class="form-control" id="layer-subdir">
+												</div>
+												<div class="form-group" id="layer-revision-ctrl">
+                          <label for="layer-git-ref">Git revision
+														<span class="glyphicon glyphicon-question-sign get-help" title="You can provide a Git branch, a tag or a commit SHA as the revision"></span>
+                          </label>
+                          <input type="text" class="form-control" id="layer-git-ref" required>
+                          <span class="help-inline" style="diaply:none;" id="invalid-layer-revision-hint"></span>
+                        </div>
                        </div>
 
                     </fieldset>
 
                     <div class="fields-apart-from-layer-name">
-                    <fieldset class="air">
-                        <legend>
+                    <fieldset>
+                        <h2>
                             Layer dependencies
-                            <span class="muted">(optional)</span>
-                            <span class="icon-question-sign get-help heading-help" title="Other layers this layer depends upon"></span>
-                        </legend>
-                        <ul class="list-unstyled configuration-list" id="layer-deps-list">
+                            <small class="text-muted">(optional)</small>
+                            <span class="glyphicon glyphicon-question-sign get-help heading-help" title="Other layers this layer depends upon"></span>
+                        </h2>
+                        <ul class="list-unstyled lead" id="layer-deps-list">
                         </ul>
-                        <div class="input-append">
-                            <input type="text" autocomplete="off" data-minLength="1" data-autocomplete="off" data-provide="typeahead" placeholder="Type a layer name" id="layer-dependency" class="input-xlarge">
-                            <a class="btn" id="add-layer-dependency-btn">
-                                Add layer
-                            </a>
-                        </div>
-                        <span class="help-inline">You can only add layers Toaster knows about</span>
+                        <div class="form-inline">
+													<div class="form-group">
+														<input type="text" autocomplete="off" data-minLength="1" data-autocomplete="off" data-provide="typeahead" placeholder="Type a layer name" id="layer-dependency" class="form-control">
+													</div>
+													<button class="btn btn-default" id="add-layer-dependency-btn">
+														Add layer
+													</button>
+													<span class="help-inline">You can only add layers Toaster knows about</span>
+											</div>
                     </fieldset>
-                    <div class="air" id="form-actions">
-                      <button class="btn btn-primary btn-large" data-toggle="modal" id="import-and-add-btn" data-target="#dependencies-message" disabled>Import and add to project</button>
+                    <div class="top-air" id="form-actions">
+                      <button class="btn btn-primary btn-lg" data-toggle="modal" id="import-and-add-btn" data-target="#dependencies-message" disabled>Import and add to project</button>
                         <span class="help-inline" id="import-and-add-hint" style="vertical-align: middle;">To import a layer you need to enter a layer name, a Git repository URL and a Git revision (branch, tag or commit)</span>
                     </div>
                   </div>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 081/106] toaster: Fix the toaster tables no results
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (77 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 080/106] toaster: Fix the import layer form Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 082/106] toaster: Show heading in no results page Belen Barros Pena
                   ` (24 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Fix the alert we show when you search for something and your search
returns no results. This patch only applies to tables using toaster
tables.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/default.css    |  3 ++-
 .../lib/toaster/toastergui/templates/toastertable.html   | 16 +++++++++-------
 2 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index f9116e9..eaa4311 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -42,7 +42,8 @@ img.logo { height: 30px; vertical-align: bottom; }
 .get-help-red:hover { color: #843534; cursor: pointer; }
 
 /* Styles for our table controls */
-.form-control[id^="search-input-"] { width: 30em; }
+.form-control[id^="search-input-"],
+.form-control[id^="new-search-input-"] { width: 30em; }
 #edit-columns-button { margin-right: 30px; }
 .navbar-default[id^="table-chrome-"] { background-color: transparent; }
 [id^="table-chrome-collapse-"] .navbar-form { margin-left: -15px; }
diff --git a/bitbake/lib/toaster/toastergui/templates/toastertable.html b/bitbake/lib/toaster/toastergui/templates/toastertable.html
index 350dff3..f391c12 100644
--- a/bitbake/lib/toaster/toastergui/templates/toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/toastertable.html
@@ -30,13 +30,15 @@
 </div>
 
 <div id="no-results-{{table_name}}" style="display:none">
-  <div class="alert">
-    <form class="no-results input-append">
-      <input class="input-xlarge" id="new-search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{%if request.GET.search %}{{request.GET.search}}{%endif%}"/>
-      <a href="#" class="input-append-addon btn remove-search-btn-{{table_name}}" tabindex="-1">
-        <i class="glyphicon glyphicon-remove"></i>
-      </a>
-      <button class="btn search-submit-{{table_name}}">
+  <div class="alert alert-warning">
+    <form class="form-inline">
+			<div class="form-group">
+				<div class="btn-group">
+					<input class="form-control" id="new-search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{%if request.GET.search %}{{request.GET.search}}{%endif%}"/>
+					<span class="remove-search-btn-{{table_name}} glyphicon glyphicon-remove-circle" tabindex="-1"></a>
+				</div>
+			</div>
+      <button class="btn btn-default search-submit-{{table_name}}">
         Search
       </button>
       <button class="btn btn-link show-all-{{table_name}} remove-search-btn-{{table_name}}">
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 082/106] toaster: Show heading in no results page
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (78 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 081/106] toaster: Fix the toaster tables no results Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 083/106] toaster: Fix new custom image page Belen Barros Pena
                   ` (23 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

In the project builds table, make sure the table heading displays when a
search query returns no results.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../templates/projectbuilds-toastertable.html           | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html b/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html
index 6d27668..416fb8a 100644
--- a/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/projectbuilds-toastertable.html
@@ -38,6 +38,14 @@
 
       tableElt.on("table-done", function (e, total, tableParams) {
         var title = "All project builds";
+				
+				if (total === 0) {
+					titleElt.hide();
+				} 
+				else {
+					titleElt.show()
+					titleElt.text(title);
+				}
 
         if (tableParams.search || tableParams.filter) {
           if (total === 0) {
@@ -46,15 +54,10 @@
           else if (total > 0) {
             title = total + " project build" + (total > 1 ? 's' : '') + " found";
           }
-        }
 
-				if (total === 0) {
-					titleElt.hide();
-				} 
-				else {
-					titleElt.show()
+					titleElt.show();
 					titleElt.text(title);
-				}
+        }
 
       });
 
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 083/106] toaster: Fix new custom image page
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (79 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 082/106] toaster: Show heading in no results page Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 084/106] toaster: toaster tables Enable complex empty states Belen Barros Pena
                   ` (22 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Make display properly with Bootstrap 3

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/default.css       | 6 ++++++
 bitbake/lib/toaster/toastergui/templates/customise_btn.html | 4 ++--
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index eaa4311..2e13fb0 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -151,3 +151,9 @@ legend { border: none; }
 #duplicate-layer-info dl { margin-top: 10px; }
 #duplicate-layer-info dd { margin-bottom: 10px; }
 .help-inline { color: #737373; margin-left: 10px; }
+
+/* Give some padding to the in-cell tooltips we use for notifications in tables */
+td > .tooltip-inner { padding: 10px; }
+
+/* Set sane widths for table columns */
+#newcustomimagestable .get_description_or_summary { width: 30%; }
diff --git a/bitbake/lib/toaster/toastergui/templates/customise_btn.html b/bitbake/lib/toaster/toastergui/templates/customise_btn.html
index ee516ce..38c258a 100644
--- a/bitbake/lib/toaster/toastergui/templates/customise_btn.html
+++ b/bitbake/lib/toaster/toastergui/templates/customise_btn.html
@@ -1,11 +1,11 @@
-<button class="btn btn-block layer-exists-{{data.layer_version.pk}} customise-btn"  data-recipe="{{data.pk}}"
+<button class="btn btn-default btn-block layer-exists-{{data.layer_version.pk}} customise-btn"  data-recipe="{{data.pk}}"
     {% if data.layer_version.pk not in extra.current_layers %}
     style="display:none;"
     {% endif %}
   >
   Customise
 </button>
-<button class="btn btn-block layer-add-{{data.layer_version.pk}} layerbtn" data-layer='{ "id": {{data.layer_version.pk}}, "name":  "{{data.layer_version.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.layer_version.pk%}"}' data-directive="add"
+<button class="btn btn-default btn-block layer-add-{{data.layer_version.pk}} layerbtn" data-layer='{ "id": {{data.layer_version.pk}}, "name":  "{{data.layer_version.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.layer_version.pk%}"}' data-directive="add"
     {% if data.layer_version.pk in extra.current_layers %}
     style="display:none;"
     {% endif %}
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 084/106] toaster: toaster tables Enable complex empty states
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (80 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 083/106] toaster: Fix new custom image page Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 085/106] toaster: Custom images to Bootstrap 3 Belen Barros Pena
                   ` (21 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Make sure we can create empty states for toaster tables that include
actions for users to get out of the empty state. Allows a template to be
used as an empty state.

Signed-off-by: Michael Wood <michael.g.wood@intel.com>
Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/tables.py                   | 9 +++++++++
 bitbake/lib/toaster/toastergui/templates/toastertable.html | 2 +-
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/bitbake/lib/toaster/toastergui/tables.py b/bitbake/lib/toaster/toastergui/tables.py
index 479ba1e..d163e15 100644
--- a/bitbake/lib/toaster/toastergui/tables.py
+++ b/bitbake/lib/toaster/toastergui/tables.py
@@ -470,7 +470,16 @@ class CustomImagesTable(ToasterTable):
 
     def get_context_data(self, **kwargs):
         context = super(CustomImagesTable, self).get_context_data(**kwargs)
+
+        empty_state_template = '''
+        You have not created any custom images yet.
+        <a href="{% url 'newcustomimage' data.pid %}">
+        Create your first custom image</a>
+        '''
+        context['empty_state'] = self.render_static_data(empty_state_template,
+                                                         kwargs)
         project = Project.objects.get(pk=kwargs['pid'])
+
         # TODO put project into the ToasterTable base class
         context['project'] = project
         return context
diff --git a/bitbake/lib/toaster/toastergui/templates/toastertable.html b/bitbake/lib/toaster/toastergui/templates/toastertable.html
index f391c12..6634c20 100644
--- a/bitbake/lib/toaster/toastergui/templates/toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/toastertable.html
@@ -26,7 +26,7 @@
 {% include 'toastertable-filter.html' %}
 
 <div class="row-fluid" id="empty-state-{{table_name}}" style="display:none">
-  <div class="alert alert-info">{{empty_state}}</div>
+  <div class="alert alert-info">{{empty_state|safe}}</div>
 </div>
 
 <div id="no-results-{{table_name}}" style="display:none">
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 085/106] toaster: Custom images to Bootstrap 3
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (81 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 084/106] toaster: toaster tables Enable complex empty states Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 086/106] toaster: project builds Improve empty state Belen Barros Pena
                   ` (20 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Make sure the custom images page displays properly with Bootstrap 3.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/default.css         |  5 ++++-
 bitbake/lib/toaster/toastergui/tables.py                      | 11 +++++++----
 .../toastergui/templates/generic-toastertable-page.html       |  2 +-
 3 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index 2e13fb0..e83a67b 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -76,7 +76,7 @@ tbody > tr > td > .glyphicon-minus-sign { color: #a94442; }
 .glyphicon-edit { color: #337ab7; }
 .failed_tasks .glyphicon-download-alt { margin-left: 5px; } 
 .glyphicon-download-alt:hover,
-.glyphicon-edit:hover { color: #23527c; cursor: pointer }
+.glyphicon-edit:hover { color: #23527c; cursor: pointer; text-decoration: none; }
 .glyphicon-trash { color: #a94442; }
 .glyphicon-trash:hover { color: #843534; cursor: pointer; }
 
@@ -157,3 +157,6 @@ td > .tooltip-inner { padding: 10px; }
 
 /* Set sane widths for table columns */
 #newcustomimagestable .get_description_or_summary { width: 30%; }
+
+/* Override the rather ugly default code styles */
+code { color: #333; background-color: transparent; }
diff --git a/bitbake/lib/toaster/toastergui/tables.py b/bitbake/lib/toaster/toastergui/tables.py
index d163e15..dd1748d 100644
--- a/bitbake/lib/toaster/toastergui/tables.py
+++ b/bitbake/lib/toaster/toastergui/tables.py
@@ -507,7 +507,8 @@ class CustomImagesTable(ToasterTable):
         recipe_file_template = '''
         {% if data.get_base_recipe_file %}
         <code>{{data.name}}_{{data.version}}.bb</code>
-        <a href="{% url 'customrecipedownload' extra.pid data.pk %}" class="icon-download-alt get-help" title="Download recipe file"></a>
+        <a href="{% url 'customrecipedownload' extra.pid data.pk %}"
+        class="glyphicon glyphicon-download-alt get-help" title="Download recipe file"></a>
         {% endif %}'''
 
         self.add_column(title="Recipe file",
@@ -515,18 +516,20 @@ class CustomImagesTable(ToasterTable):
                         static_data_template=recipe_file_template)
 
         approx_packages_template = '''
+        {% if data.get_all_packages.count > 0 %}
         <a href="{% url 'customrecipe' extra.pid data.id %}">
           {{data.get_all_packages.count}}
-        </a>'''
+        </a>
+        {% endif %}'''
 
-        self.add_column(title="Approx packages",
+        self.add_column(title="Packages",
                         static_data_name='approx_packages',
                         static_data_template=approx_packages_template)
 
 
         build_btn_template = '''
         <button data-recipe-name="{{data.name}}"
-        class="btn btn-block build-recipe-btn" style="margin-top: 5px;" >
+        class="btn btn-default btn-block build-recipe-btn">
         Build
         </button>'''
 
diff --git a/bitbake/lib/toaster/toastergui/templates/generic-toastertable-page.html b/bitbake/lib/toaster/toastergui/templates/generic-toastertable-page.html
index 33aa8ce..b3eabe1 100644
--- a/bitbake/lib/toaster/toastergui/templates/generic-toastertable-page.html
+++ b/bitbake/lib/toaster/toastergui/templates/generic-toastertable-page.html
@@ -7,7 +7,7 @@
 
 <h2>{{title}} (<span class="table-count-{{table_name}}"></span>)
   {% if project.release %}
-  <i class="icon-question-sign get-help heading-help" title="This page lists {{title}} compatible with the release selected for this project, which is {{project.release.description}}"></i>
+  <i class="glyphicon glyphicon-question-sign get-help" title="This page lists {{title|lower}} compatible with the release selected for this project, which is {{project.release.description}}"></i>
   {% endif %}
 </h2>
 
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 086/106] toaster: project builds Improve empty state
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (82 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 085/106] toaster: Custom images to Bootstrap 3 Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 087/106] toaster: recipes tables Tweaks for Bootstrap 3 Belen Barros Pena
                   ` (19 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Include an action in the 'Project builds' empty state, so that users
have a explicit next step.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/tables.py | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/tables.py b/bitbake/lib/toaster/toastergui/tables.py
index dd1748d..7e146a6 100644
--- a/bitbake/lib/toaster/toastergui/tables.py
+++ b/bitbake/lib/toaster/toastergui/tables.py
@@ -1436,7 +1436,6 @@ class ProjectBuildsTable(BuildsTable):
         super(ProjectBuildsTable, self).__init__(*args, **kwargs)
         self.title = 'All project builds'
         self.mrb_type = 'project'
-        self.empty_state = "This project has no builds"
 
         # set from the querystring
         self.project_id = None
@@ -1461,7 +1460,6 @@ class ProjectBuildsTable(BuildsTable):
         """
         self.project_id = kwargs['pid']
         super(ProjectBuildsTable, self).setup_queryset(*args, **kwargs)
-
         project = Project.objects.get(pk=self.project_id)
         self.queryset = self.queryset.filter(project=project)
 
@@ -1475,6 +1473,14 @@ class ProjectBuildsTable(BuildsTable):
         self.project_id = kwargs['pid']
         context = super(ProjectBuildsTable, self).get_context_data(**kwargs)
 
+        empty_state_template = '''
+        This project has no builds.
+        <a href="{% url 'projectimagerecipes' data.pid %}">
+        Choose a recipe to build</a>
+        '''
+        context['empty_state'] = self.render_static_data(empty_state_template,
+                                                         kwargs)
+
         project = Project.objects.get(pk=self.project_id)
         context['mru'] = Build.get_recent(project)
         context['project'] = project
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 087/106] toaster: recipes tables Tweaks for Bootstrap 3
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (83 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 086/106] toaster: project builds Improve empty state Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 088/106] toaster: machines table Changes " Belen Barros Pena
                   ` (18 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Changes to the image recipes and software recipes tables to make sure
they display properly with Bootstrap 3.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/default.css    |  4 +++-
 bitbake/lib/toaster/toastergui/tables.py                 |  6 +++---
 bitbake/lib/toaster/toastergui/templates/recipe_btn.html | 13 +++++++------
 3 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index e83a67b..da5f54b 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -156,7 +156,9 @@ legend { border: none; }
 td > .tooltip-inner { padding: 10px; }
 
 /* Set sane widths for table columns */
-#newcustomimagestable .get_description_or_summary { width: 30%; }
+#newcustomimagestable .get_description_or_summary,
+#imagerecipestable .get_description_or_summary,
+#softwarerecipestable .get_description_or_summary { width: 30%; }
 
 /* Override the rather ugly default code styles */
 code { color: #333; background-color: transparent; }
diff --git a/bitbake/lib/toaster/toastergui/tables.py b/bitbake/lib/toaster/toastergui/tables.py
index 7e146a6..1825124 100644
--- a/bitbake/lib/toaster/toastergui/tables.py
+++ b/bitbake/lib/toaster/toastergui/tables.py
@@ -319,10 +319,10 @@ class RecipesTable(ToasterTable):
 
     def __init__(self, *args, **kwargs):
         super(RecipesTable, self).__init__(*args, **kwargs)
-        self.empty_state = "Toaster has no recipe information. To generate recipe information you can configure a layer source then run a build."
+        self.empty_state = "Toaster has no recipe information. To generate recipe information you need to run a build."
 
     build_col = { 'title' : "Build",
-            'help_text' : "Add or delete recipes to and from your project",
+            'help_text' : "Before building a recipe, you might need to add the corresponding layer to your project",
             'hideable' : False,
             'filter_name' : "in_current_project",
             'static_data_name' : "add-del-layers",
@@ -384,7 +384,7 @@ class RecipesTable(ToasterTable):
         recipe_file_template = '''
         <code>{{data.file_path}}</code>
         <a href="{{data.get_vcs_recipe_file_link_url}}" target="_blank">
-          <i class="icon-share get-info"></i>
+          <span class="glyphicon glyphicon-new-window"></i>
         </a>
          '''
 
diff --git a/bitbake/lib/toaster/toastergui/templates/recipe_btn.html b/bitbake/lib/toaster/toastergui/templates/recipe_btn.html
index d385a14..e372964 100644
--- a/bitbake/lib/toaster/toastergui/templates/recipe_btn.html
+++ b/bitbake/lib/toaster/toastergui/templates/recipe_btn.html
@@ -1,16 +1,17 @@
-<button data-recipe-name="{{data.name}}" class="btn btn-block layer-exists-{{data.layer_version.pk}} build-recipe-btn" style="margin-top: 5px;
+<a data-recipe-name="{{data.name}}" class="btn btn-default btn-block layer-exists-{{data.layer_version.pk}} build-recipe-btn" style="margin-top: 5px;
   {% if data.layer_version.pk not in extra.current_layers %}
     display:none;
   {% endif %}"
  >
   Build recipe
-</button>
-<button class="btn btn-block layerbtn layer-add-{{data.layer_version.pk}}" data-layer='{ "id": {{data.layer_version.pk}}, "name":  "{{data.layer_version.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.layer_version.pk%}"}' data-directive="add"
+</a>
+<a class="btn btn-default btn-block layerbtn layer-add-{{data.layer_version.pk}}" data-layer='{ "id": {{data.layer_version.pk}}, "name":  "{{data.layer_version.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.layer_version.pk%}"}' data-directive="add"
     {% if data.layer_version.pk in extra.current_layers %}
      style="display:none;"
     {% endif %}
 >
-  <i class="glyphicon glyphicon-plus"></i>
+  <span class="glyphicon glyphicon-plus"></span>
   Add layer
-  <i title="" class="icon-question-sign get-help" data-original-title="To build this target, you must first add the {{data.layer_version.layer.name}} layer to your project"></i>
-</button>
+  <span class="glyphicon glyphicon-question-sign get-help" title="To build this
+      recipe you must first add the {{data.layer_version.layer.name}} layer to your project"></i>
+</a>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 088/106] toaster: machines table Changes for Bootstrap 3
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (84 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 087/106] toaster: recipes tables Tweaks for Bootstrap 3 Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 089/106] toaster: layers " Belen Barros Pena
                   ` (17 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Make sure the machines table displays properly with Bootstrap 3.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/tables.py                  |  4 ++--
 bitbake/lib/toaster/toastergui/templates/machine_btn.html | 10 +++++-----
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/tables.py b/bitbake/lib/toaster/toastergui/tables.py
index 1825124..337a335 100644
--- a/bitbake/lib/toaster/toastergui/tables.py
+++ b/bitbake/lib/toaster/toastergui/tables.py
@@ -196,7 +196,7 @@ class MachinesTable(ToasterTable):
 
     def __init__(self, *args, **kwargs):
         super(MachinesTable, self).__init__(*args, **kwargs)
-        self.empty_state = "No machines maybe you need to do a build?"
+        self.empty_state = "Toaster has no machine information for this project. Sadly, 			   machine information cannot be obtained from builds, so this 				  page will remain empty."
         self.title = "Compatible machines"
         self.default_orderby = "name"
 
@@ -264,7 +264,7 @@ class MachinesTable(ToasterTable):
                         field_name="layer_version__get_vcs_reference")
 
         machine_file_template = '''<code>conf/machine/{{data.name}}.conf</code>
-        <a href="{{data.get_vcs_machine_file_link_url}}" target="_blank"><i class="icon-share get-info"></i></a>'''
+        <a href="{{data.get_vcs_machine_file_link_url}}" target="_blank"><span class="glyphicon glyphicon-new-window"></i></a>'''
 
         self.add_column(title="Machine file",
                         hidden=True,
diff --git a/bitbake/lib/toaster/toastergui/templates/machine_btn.html b/bitbake/lib/toaster/toastergui/templates/machine_btn.html
index 7093a29..5d93d7a 100644
--- a/bitbake/lib/toaster/toastergui/templates/machine_btn.html
+++ b/bitbake/lib/toaster/toastergui/templates/machine_btn.html
@@ -1,16 +1,16 @@
-<a href="{% url 'project' extra.pid %}?setMachine={{data.name}}" class="btn btn-block layer-exists-{{data.layer_version.id}}"
+<a href="{% url 'project' extra.pid %}?setMachine={{data.name}}" class="btn btn-default btn-block layer-exists-{{data.layer_version.id}}"
     {% if data.layer_version.pk not in extra.current_layers %}
     style="display:none;"
     {% endif %}
 >
   Select machine</a>
-<button class="btn btn-block layerbtn layer-add-{{data.layer_version.id}}" data-layer='{ "id": {{data.layer_version.id}}, "name":  "{{data.layer_version.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.layer_version.id %}"}' data-directive="add"
+<a class="btn btn-default btn-block layerbtn layer-add-{{data.layer_version.id}}" data-layer='{ "id": {{data.layer_version.id}}, "name":  "{{data.layer_version.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.layer_version.id %}"}' data-directive="add"
     {% if data.layer_version.pk in extra.current_layers %}
     style="display:none;"
     {% endif %}
 >
-  <i class="glyphicon glyphicon-plus"></i>
+  <span class="glyphicon glyphicon-plus"></span>
   Add layer
-  <i title="" class="icon-question-sign get-help" data-original-title="To enable this machine, you must first add the {{data.layer_version.layer.name}} layer to your project"></i>
-</button>
+  <span class="glyphicon glyphicon-question-sign get-help" title="To select this machine, you must first add the {{data.layer_version.layer.name}} layer to your project"></i>
+</a>
 
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 089/106] toaster: layers table Changes for Bootstrap 3
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (85 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 088/106] toaster: machines table Changes " Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 090/106] toaster: breadcrumbs Fix " Belen Barros Pena
                   ` (16 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Make sure the layers table displays properly with Bootstrap 3.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/default.css   |  8 ++++++--
 bitbake/lib/toaster/toastergui/tables.py                |  8 ++++----
 bitbake/lib/toaster/toastergui/templates/layer_btn.html | 12 ++++++------
 3 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index da5f54b..bb71074 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -20,7 +20,7 @@ img.logo { height: 30px; vertical-align: bottom; }
 #new-project-button { margin-right: 0; }
 
 /* Increase popovers width to fit commit SHAs */
-.popover { min-width: 350px; }
+.popover { max-width: 350px; }
 
 /* Increase bottom margin of definition lists inside popovers for the Toaster version information in the top navbar */
 .popover-content dd { margin-bottom: 15px; }
@@ -78,6 +78,8 @@ tbody > tr > td > .glyphicon-minus-sign { color: #a94442; }
 .glyphicon-download-alt:hover,
 .glyphicon-edit:hover { color: #23527c; cursor: pointer; text-decoration: none; }
 .glyphicon-trash { color: #a94442; }
+.btn-danger > .glyphicon-trash,
+.btn-danger > .glyphicon-trash:hover { color: #fff; }
 .glyphicon-trash:hover { color: #843534; cursor: pointer; }
 
 /* Set the font size for icons inside headings and lead paragraphs */
@@ -158,7 +160,9 @@ td > .tooltip-inner { padding: 10px; }
 /* Set sane widths for table columns */
 #newcustomimagestable .get_description_or_summary,
 #imagerecipestable .get_description_or_summary,
-#softwarerecipestable .get_description_or_summary { width: 30%; }
+#softwarerecipestable .get_description_or_summary,
+#machinestable .description,
+#layerstable .layer__summary { width: 30%; }
 
 /* Override the rather ugly default code styles */
 code { color: #333; background-color: transparent; }
diff --git a/bitbake/lib/toaster/toastergui/tables.py b/bitbake/lib/toaster/toastergui/tables.py
index 337a335..dead0d7 100644
--- a/bitbake/lib/toaster/toastergui/tables.py
+++ b/bitbake/lib/toaster/toastergui/tables.py
@@ -118,7 +118,7 @@ class LayersTable(ToasterTable):
         </a>
         {% if data.get_vcs_link_url %}
         <a target="_blank" href="{{ data.get_vcs_link_url }}">
-           <i class="icon-share get-info"></i>
+           <span class="glyphicon glyphicon-new-window"></span>
         </a>
         {% endif %}
         '''
@@ -135,7 +135,7 @@ class LayersTable(ToasterTable):
         </a>
         {% if data.dirpath and data.get_vcs_dirpath_link_url %}
         <a target="_blank" href="{{ data.get_vcs_dirpath_link_url }}">
-          <i class="icon-share get-info"></i>
+          <span class="glyphicon glyphicon-new-window"></span>
         </a>
         {% endif %}'''
 
@@ -166,8 +166,8 @@ class LayersTable(ToasterTable):
         deps_template = '''
         {% with ods=data.dependencies.all%}
         {% if ods.count %}
-            <a class="btn" title="<a href='{% url "layerdetails" extra.pid data.id %}'>{{data.layer.name}}</a> dependencies"
-        data-content="<ul class='unstyled'>
+            <a class="btn btn-default" title="<a href='{% url "layerdetails" extra.pid data.id %}'>{{data.layer.name}}</a> dependencies"
+        data-content="<ul class='list-unstyled'>
         {% for i in ods%}
         <li><a href='{% url "layerdetails" extra.pid i.depends_on.pk %}'>{{i.depends_on.layer.name}}</a></li>
         {% endfor %}
diff --git a/bitbake/lib/toaster/toastergui/templates/layer_btn.html b/bitbake/lib/toaster/toastergui/templates/layer_btn.html
index 1be29fe..b2f73eb 100644
--- a/bitbake/lib/toaster/toastergui/templates/layer_btn.html
+++ b/bitbake/lib/toaster/toastergui/templates/layer_btn.html
@@ -1,17 +1,17 @@
-<button class="btn btn-danger btn-block layer-exists-{{data.pk}} layerbtn"  data-layer='{ "id": {{data.pk}}, "name":  "{{data.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.pk%}"}' data-directive="remove"
+<a class="btn btn-danger btn-block layer-exists-{{data.pk}} layerbtn"  data-layer='{ "id": {{data.pk}}, "name":  "{{data.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.pk%}"}' data-directive="remove"
     {% if data.pk not in extra.current_layers %}
     style="display:none;"
     {% endif %}
   >
-  <i class="icon-trash"></i>
+  <span class="glyphicon glyphicon-trash"></span>
   Remove layer
-</button>
-<button class="btn btn-block layer-add-{{data.pk}} layerbtn" data-layer='{ "id": {{data.pk}}, "name":  "{{data.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.pk%}"}' data-directive="add"
+</a>
+<a class="btn btn-default btn-block layer-add-{{data.pk}} layerbtn" data-layer='{ "id": {{data.pk}}, "name":  "{{data.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.pk%}"}' data-directive="add"
     {% if data.pk in extra.current_layers %}
     style="display:none;"
     {% endif %}
   >
-  <i class="glyphicon glyphicon-plus"></i>
+  <span class="glyphicon glyphicon-plus"></span>
   Add layer
-</button>
+</a>
 
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 090/106] toaster: breadcrumbs Fix for Bootstrap 3
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (86 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 089/106] toaster: layers " Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 091/106] toaster: layerdetails Fix the layer details page Belen Barros Pena
                   ` (15 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Style our navigation breadcrumbs so that they display properly with
Bootstrap 3.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/default.css | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index bb71074..ddea5ee 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -166,3 +166,8 @@ td > .tooltip-inner { padding: 10px; }
 
 /* Override the rather ugly default code styles */
 code { color: #333; background-color: transparent; }
+
+/* Style our breadcrumbs */
+.breadcrumb > li + li::before { content: none; }
+.breadcrumb { background-color: transparent; padding-left: 0; padding-top: 15px; }
+.breadcrumb .divider { color: #777; margin: 0 5px; }
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 091/106] toaster: layerdetails Fix the layer details page
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (87 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 090/106] toaster: breadcrumbs Fix " Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 092/106] toaster: custom recipe Fix the custom recipe " Belen Barros Pena
                   ` (14 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Make sure that all information displays correctly, and all controls
interact as designed, with Bootstrap 3.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../lib/toaster/toastergui/static/css/default.css  |  45 ++++-
 .../toaster/toastergui/static/js/layerdetails.js   |  65 ++++---
 bitbake/lib/toaster/toastergui/tables.py           |  12 +-
 .../toaster/toastergui/templates/layerdetails.html | 204 +++++++++++----------
 .../toastergui/templates/toastertable-simple.html  | 104 ++++++-----
 5 files changed, 243 insertions(+), 187 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index ddea5ee..43c7c54 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -22,8 +22,13 @@ img.logo { height: 30px; vertical-align: bottom; }
 /* Increase popovers width to fit commit SHAs */
 .popover { max-width: 350px; }
 
-/* Increase bottom margin of definition lists inside popovers for the Toaster version information in the top navbar */
-.popover-content dd { margin-bottom: 15px; }
+/* Increase bottom margin of definition lists inside popovers for the Toaster version information in the top navbar, and also inside the right hand columns of our details pages */
+.popover-content dd,
+.well dd { margin-bottom: 15px; }
+
+/* Style the horizonal definition lists */
+.dl-horizontal dt { width: 200px; line-height: 25px; }
+.dl-horizontal dd { margin-left: 220px; line-height: 25px; }
 
 /* Style our build results */
 .build-result .progress { margin-bottom: 0; }
@@ -52,6 +57,8 @@ span[class^="remove-search-btn-"] { position: absolute; right: 5px; top: 0; bott
 span[class^="remove-search-btn-"]:hover { color: #333; }
 [id^="pagination-"] .pagination,
 [id^="pagination-"] .navbar-form { margin-top: 0; }
+[id^="table-chrome-"] .navbar-form { margin-left: -15px; margin-right: -15px; }
+[id^="table-chrome-"] .detail-page-contols { padding-left: 0; padding-right: 0; }
 
 /* Override the default font-weight for labels: it's a bit too much */
 label { font-weight: normal; }
@@ -111,6 +118,7 @@ h3 > .glyphicon-question-sign { font-size: 14px; }
 
 /* Style the most built recipes list in the project page */
 #freq-build-list .checkbox input[type="checkbox"] { position: relative; margin: 0 10px 0 0; vertical-align: middle; }
+#freq-build-list.lead > li { line-height: 25px; }
 #freq-build-list { margin-top: 20px; }
 #freq-build-list label { padding-left: 0; }
 #freq-build-btn { margin-top: 10px; }
@@ -119,16 +127,22 @@ h3 > .glyphicon-question-sign { font-size: 14px; }
 /* Style the layers section in the project page and the layer dependencies in the import layer form */
 #layer-container .form-inline { margin-top: 20px; }
 #layer-add-input { width: 17em; }
-#layers-in-project-list,
-#layer-deps-list { margin-top: 20px; }
-#layers-in-project-list > li,
-#layer-deps-list > li { line-height: 38px; }
-#layers-in-project-list .glyphicon-trash,
-#layer-deps-list .glyphicon-trash { font-size: 16px; margin-left: 7px; }
+ul.lead { margin-top: 20px; }
+ul.lead > li { line-height: 38px; }
+ul.lead .glyphicon-trash,
+ul.lead .glyphicon-trash { font-size: 16px; margin-left: 7px; }
 #layers-in-project-list .tooltip-inner  { max-width: 600px; }
 #no-layers-in-project { margin-top: 20px; }
 #no-layers-in-project ul { margin-top: 10px; }
 
+/* Style the layer information icons in the layer details pages */
+dd .glyphicon-trash,
+dd .glyphicon-edit { margin-left: 5px; }
+
+/* Style the forms and definition lists in the layer details pages */
+#change-repo-form .form-control { width: 17em; }
+#information dd > form { margin-bottom: 5px; margin-top: 5px; }
+
 /* Create a class for additional top margin that we can use in headings */
 .top-air { margin-top: 40px; }
 
@@ -161,8 +175,10 @@ td > .tooltip-inner { padding: 10px; }
 #newcustomimagestable .get_description_or_summary,
 #imagerecipestable .get_description_or_summary,
 #softwarerecipestable .get_description_or_summary,
-#machinestable .description,
 #layerstable .layer__summary { width: 30%; }
+#recipestable .get_description_or_summary { width: 40%; }
+#machinestable .name { white-space: nowrap; }
+#machinestable .description { width: 45%; }
 
 /* Override the rather ugly default code styles */
 code { color: #333; background-color: transparent; }
@@ -171,3 +187,14 @@ code { color: #333; background-color: transparent; }
 .breadcrumb > li + li::before { content: none; }
 .breadcrumb { background-color: transparent; padding-left: 0; padding-top: 15px; }
 .breadcrumb .divider { color: #777; margin: 0 5px; }
+
+/* Reduce top margin for the page-header class */
+.page-header { margin-top: 30px; }
+
+/* Set some space around the layer button in the layer details pages */
+.tab-content { margin-top: 20px; }
+.tab-pane { margin-top: 20px; }
+
+/* Style the new window icons */
+.glyphicon-new-window:hover { text-decoration: none; }
+.dl-horizontal > dd > .glyphicon-new-window { margin-left: 5px; }
diff --git a/bitbake/lib/toaster/toastergui/static/js/layerdetails.js b/bitbake/lib/toaster/toastergui/static/js/layerdetails.js
index d545406..dbc6ba6 100644
--- a/bitbake/lib/toaster/toastergui/static/js/layerdetails.js
+++ b/bitbake/lib/toaster/toastergui/static/js/layerdetails.js
@@ -18,6 +18,13 @@ function layerDetailsPageInit (ctx) {
     layerDepBtn.removeAttr("disabled");
   });
 
+	/* disable the add layer button if its input field is empty */
+	layerDepInput.on("keyup",function(){
+		if ( $(this).val().length == 0 ) {
+			layerDepBtn.attr("disabled", "disabled");
+		}
+	});
+
   $(window).on('hashchange', function(e){
     switch(window.location.hash){
       case '#machines':
@@ -76,7 +83,7 @@ function layerDetailsPageInit (ctx) {
 
     addRemoveDep(currentLayerDepSelection.id, true, function(){
       /* Make a list item for the new layer dependency */
-      var newLayerDep = $("<li><a></a><span class=\"icon-trash\" data-toggle=\"tooltip\" title=\"Delete\"></span></li>");
+      var newLayerDep = $("<li><a></a><span class=\"glyphicon glyphicon-trash\" data-toggle=\"tooltip\" title=\"Delete\"></span></li>");
 
       newLayerDep.data('layer-id', currentLayerDepSelection.id);
       newLayerDep.children("span").tooltip();
@@ -94,11 +101,11 @@ function layerDetailsPageInit (ctx) {
       /* Clear the current selection */
       layerDepInput.val("");
       currentLayerDepSelection = undefined;
-      layerDepBtn.attr("disabled","disabled");
+      layerDepBtn.attr("disabled", "disabled");
     });
   });
 
-  $(".icon-pencil").click(function (){
+  $(".glyphicon-edit").click(function (){
     var mParent = $(this).parent("dd");
     mParent.prev().css("margin-top", "10px");
     mParent.children("form").slideDown();
@@ -106,8 +113,12 @@ function layerDetailsPageInit (ctx) {
     currentVal.hide();
     /* Set the current value to the input field */
     mParent.find("textarea,input").val(currentVal.text());
+		/* If the input field is empty, disable the submit button */
+		if ( mParent.find("textarea,input").val().length == 0 ) {
+			mParent.find(".change-btn").attr("disabled", "disabled");
+		}
     /* Hides the "Not set" text */
-    mParent.children(".muted").hide();
+    mParent.children(".text-muted").hide();
     /* We're editing so hide the delete icon */
     mParent.children(".delete-current-value").hide();
     mParent.find(".cancel").show();
@@ -128,21 +139,21 @@ function layerDetailsPageInit (ctx) {
       mParent.children(".current-value").show();
       /* Show the "Not set" text if we ended up with no value */
       if (!mParent.children(".current-value").html()){
-        mParent.children(".muted").fadeIn();
+        mParent.children(".text-muted").fadeIn();
         mParent.children(".delete-current-value").hide();
       } else {
         mParent.children(".delete-current-value").show();
       }
 
-      mParent.children(".icon-pencil").show();
-      mParent.prev().css("margin-top", "0px");
+      mParent.children(".glyphicon-edit").show();
+      mParent.prev().css("margin-top", "0");
     });
   });
 
   function defaultAddBtnText(){
       var text = " Add the "+ctx.layerVersion.name+" layer to your project";
       addRmLayerBtn.text(text);
-      addRmLayerBtn.prepend("<span class=\"icon-plus\"></span>");
+      addRmLayerBtn.prepend("<span class=\"glyphicon glyphicon-plus\"></span>");
       addRmLayerBtn.removeClass("btn-danger");
   }
 
@@ -159,7 +170,7 @@ function layerDetailsPageInit (ctx) {
         var text = " Add the "+ctx.layerVersion.name+" layer to your project "+
           "to enable these recipes";
         addRmLayerBtn.text(text);
-        addRmLayerBtn.prepend("<span class=\"icon-plus\"></span>");
+        addRmLayerBtn.prepend("<span class=\"glyphicon glyphicon-plus\"></span>");
       } else {
         defaultAddBtnText();
       }
@@ -177,7 +188,7 @@ function layerDetailsPageInit (ctx) {
       $("#no-recipes-yet").hide();
     }
 
-    targetTab.removeClass("muted");
+    targetTab.removeClass("text-muted");
     if (window.location.hash === "#recipes"){
       /* re run the machinesTabShow to update the text */
       targetsTabShow();
@@ -192,20 +203,20 @@ function layerDetailsPageInit (ctx) {
     else
       $("#no-machines-yet").hide();
 
-    machineTab.removeClass("muted");
+    machineTab.removeClass("text-muted");
     if (window.location.hash === "#machines"){
       /* re run the machinesTabShow to update the text */
       machinesTabShow();
     }
 
     $(".select-machine-btn").click(function(e){
-      if ($(this).attr("disabled") === "disabled")
+      if ($(this).hasClass("disabled"))
         e.preventDefault();
     });
 
   });
 
-  targetTab.on('show', targetsTabShow);
+  targetTab.on('show.bs.tab', targetsTabShow);
 
   function machinesTabShow(){
     if (!ctx.layerVersion.inCurrentPrj) {
@@ -213,7 +224,7 @@ function layerDetailsPageInit (ctx) {
         var text = " Add the "+ctx.layerVersion.name+" layer to your project " +
           "to enable these machines";
         addRmLayerBtn.text(text);
-        addRmLayerBtn.prepend("<span class=\"icon-plus\"></span>");
+        addRmLayerBtn.prepend("<span class=\"glyphicon glyphicon-plus\"></span>");
       } else {
         defaultAddBtnText();
       }
@@ -222,7 +233,7 @@ function layerDetailsPageInit (ctx) {
     window.location.hash = "machines";
   }
 
-  machineTab.on('show', machinesTabShow);
+  machineTab.on('show.bs.tab', machinesTabShow);
 
   $(".pagesize").change(function(){
     var search = libtoaster.parseUrlParams();
@@ -239,17 +250,17 @@ function layerDetailsPageInit (ctx) {
 
     if (added){
       /* enable and switch all the button states */
-      $(".build-recipe-btn").removeAttr("disabled");
-      $(".select-machine-btn").removeAttr("disabled");
+      $(".build-recipe-btn").removeClass("disabled");
+      $(".select-machine-btn").removeClass("disabled");
       addRmLayerBtn.addClass("btn-danger");
       addRmLayerBtn.data('directive', "remove");
       addRmLayerBtn.text(" Remove the "+ctx.layerVersion.name+" layer from your project");
-      addRmLayerBtn.prepend("<span class=\"icon-trash\"></span>");
+      addRmLayerBtn.prepend("<span class=\"glyphicon glyphicon-trash\"></span>");
 
     } else {
       /* disable and switch all the button states */
-      $(".build-recipe-btn").attr("disabled","disabled");
-      $(".select-machine-btn").attr("disabled", "disabled");
+      $(".build-recipe-btn").addClass("disabled");
+      $(".select-machine-btn").addClass("disabled");
       addRmLayerBtn.removeClass("btn-danger");
       addRmLayerBtn.data('directive', "add");
 
@@ -257,7 +268,7 @@ function layerDetailsPageInit (ctx) {
        * on which tab is currently visible. Unfortunately we can't just call
        * tab('show') as if it's already visible it doesn't run the event.
        */
-      switch ($(".nav-pills .active a").prop('id')){
+      switch ($(".nav-tabs .active a").prop('id')){
         case 'machines-tab':
           machinesTabShow();
           break;
@@ -325,7 +336,7 @@ function layerDetailsPageInit (ctx) {
             text = entryElement.val();
 
             /* Hide the "Not set" text if it's visible */
-            inputArea.find(".muted").hide();
+            inputArea.find(".text-muted").hide();
             inputArea.find(".current-value").text(text);
             /* Same behaviour as cancel in that we hide the form/show current
              * value.
@@ -343,9 +354,9 @@ function layerDetailsPageInit (ctx) {
   /* Disable the change button when we have no data in the input */
   $("dl input, dl textarea").on("input",function() {
     if ($(this).val().length === 0)
-      $(this).parent().children(".change-btn").attr("disabled", "disabled");
+      $(this).parent().next(".change-btn").attr("disabled", "disabled");
     else
-      $(this).parent().children(".change-btn").removeAttr("disabled");
+      $(this).parent().next(".change-btn").removeAttr("disabled");
   });
 
   /* This checks to see if the dt's dd has data in it or if the change data
@@ -359,7 +370,7 @@ function layerDetailsPageInit (ctx) {
         /* There's no current value and the layer is editable
          * so show the "Not set" and hide the delete icon
          */
-        dd.find(".muted").show();
+        dd.find(".text-muted").show();
         dd.find(".delete-current-value").hide();
         } else {
           /* We're not viewing an editable layer so hide the empty dd/dl pair */
@@ -387,9 +398,9 @@ function layerDetailsPageInit (ctx) {
   });
 
 
-  layerDepsList.find(".icon-trash").click(layerDepRemoveClick);
+  layerDepsList.find(".glyphicon-trash").click(layerDepRemoveClick);
   layerDepsList.find("a").tooltip();
-  $(".icon-trash").tooltip();
+  $(".glyphicon-trash").tooltip();
   $(".commit").tooltip();
 
 }
diff --git a/bitbake/lib/toaster/toastergui/tables.py b/bitbake/lib/toaster/toastergui/tables.py
index dead0d7..efc9c7b 100644
--- a/bitbake/lib/toaster/toastergui/tables.py
+++ b/bitbake/lib/toaster/toastergui/tables.py
@@ -307,7 +307,11 @@ class LayerMachinesTable(MachinesTable):
         self.add_column(title="Description",
                         field_name="description")
 
-        select_btn_template = '<a href="{% url "project" extra.pid %}?setMachine={{data.name}}" class="btn btn-block select-machine-btn" {% if extra.in_prj == 0%}disabled="disabled"{%endif%}>Select machine</a>'
+        select_btn_template = '''
+        <a href="{% url "project" extra.pid %}?setMachine={{data.name}}"
+        class="btn btn-default btn-block select-machine-btn
+        {% if extra.in_prj == 0%}disabled{%endif%}">Select machine</a>
+        '''
 
         self.add_column(title="Select machine",
                         static_data_name="add-del-layers",
@@ -455,7 +459,11 @@ class LayerRecipesTable(RecipesTable):
         self.add_column(title="Description",
                         field_name="get_description_or_summary")
 
-        build_recipe_template ='<button class="btn btn-block build-recipe-btn" data-recipe-name="{{data.name}}" {%if extra.in_prj == 0 %}disabled="disabled"{%endif%}>Build recipe</button>'
+        build_recipe_template = '''
+        <a class="btn btn-default btn-block build-recipe-btn
+        {%if extra.in_prj == 0 %}disabled{%endif%}" 
+        data-recipe-name="{{data.name}}">Build recipe</a>
+        '''
 
         self.add_column(title="Build recipe",
                         static_data_name="add-del-layers",
diff --git a/bitbake/lib/toaster/toastergui/templates/layerdetails.html b/bitbake/lib/toaster/toastergui/templates/layerdetails.html
index dc6018b..781f281 100644
--- a/bitbake/lib/toaster/toastergui/templates/layerdetails.html
+++ b/bitbake/lib/toaster/toastergui/templates/layerdetails.html
@@ -7,30 +7,30 @@
 {% block pagecontent %}
 
 <div class="row">
-  <ul class="breadcrumb">
-    <li>
-      <a href="{% url 'project' project.id %}">{{project.name}}</a>
-      <span class="divider">&rarr;</span>
-    </li>
-    <li><a href="{% url 'projectlayers' project.id %}">Compatible layers</a>
-      <span class="divider">&rarr;</span>
-    </li>
-    <li class="active">
-      {{layerversion.layer.name}} ({{layerversion.get_vcs_reference|truncatechars:13}})
-    </li>
-  </ul>
-</div>
+  <div class="col-md-12">
+    <ul class="breadcrumb">
+      <li>
+        <a href="{% url 'project' project.id %}">{{project.name}}</a>
+        <span class="divider">&rarr;</span>
+      </li>
+      <li><a href="{% url 'projectlayers' project.id %}">Compatible layers</a>
+        <span class="divider">&rarr;</span>
+      </li>
+      <li class="active">
+	{{layerversion.layer.name}} ({{layerversion.get_vcs_reference|truncatechars:13}})
+      </li>
+    </ul>
 
 {# If this is not an imported layer then hide the edit ui #}
 {% if not layerversion.layer_source_id or layerversion.layer_source.sourcetype != layerversion.layer_source.TYPE_IMPORTED %}
 <style scoped>
- .icon-pencil {
+ .glyphicon-edit {
    display:none;
  }
 .delete-current-value{
   display: none;
 }
- li .icon-trash {
+ li .glyphicon-trash {
    display:none;
  }
  .add-deps {
@@ -69,8 +69,6 @@
   });
 </script>
 
-<div class="row">
-  <div class="col-md-12">
     <div class="page-header">
       <h1>{{layerversion.layer.name}} <small class="commit"
           {% if layerversion.get_vcs_reference|length > 13 %}
@@ -78,8 +76,6 @@
           {% endif %}>
           ({{layerversion.get_vcs_reference|truncatechars:13}})</small></h1>
     </div>
-  </div>
-</div>
 
 <div class="row">
 <!-- container for tabs -->
@@ -88,27 +84,27 @@
     <button type="button" class="close" id="dismiss-alert">&times;</button>
     <span id="alert-msg"></span>
   </div>
-  <ul class="nav nav-pills">
+  <ul class="nav nav-tabs">
     <li class="active">
       <a data-toggle="tab" href="#information" id="details-tab">Layer details</a>
     </li>
     <li>
-      <a data-toggle="tab" href="#recipes" class="muted" id="targets-tab">Recipes (<span class="table-count-recipestable"></span>)</a>
+      <a data-toggle="tab" href="#recipes" class="text-muted" id="targets-tab">Recipes (<span class="table-count-recipestable"></span>)</a>
     </li>
     <li>
-      <a data-toggle="tab" href="#machines" class="muted" id="machines-tab">Machines (<span class="table-count-machinestable"></span>)</a>
+      <a data-toggle="tab" href="#machines" class="text-muted" id="machines-tab">Machines (<span class="table-count-machinestable"></span>)</a>
     </li>
   </ul>
   <div class="tab-content">
     <span class="button-place">
       {% if layerversion.id not in projectlayers %}
-      <button id="add-remove-layer-btn" data-directive="add" class="btn btn-large btn-block">
+      <button id="add-remove-layer-btn" data-directive="add" class="btn btn-default btn-lg btn-block">
         <span class="glyphicon glyphicon-plus"></span>
         Add the {{layerversion.layer.name}} layer to your project
       </button>
       {% else %}
-      <button id="add-remove-layer-btn" data-directive="remove" class="btn btn-block btn-large btn-danger">
-        <span class="icon-trash"></span>
+      <button id="add-remove-layer-btn" data-directive="remove" class="btn btn-default btn-block btn-lg btn-danger">
+        <span class="glyphicon glyphicon-trash"></span>
         Remove the {{layerversion.layer.name}} layer from your project
       </button>
       {% endif %}
@@ -118,60 +114,60 @@
     <div id="information" class="tab-pane active">
       <dl class="dl-horizontal">
         <dt class="">
-          <i class="icon-question-sign get-help" title="Fetch/clone URL of the repository"></i>
+          <span class="glyphicon glyphicon-question-sign get-help" title="Fetch/clone URL of the repository"></span>
           Repository URL
         </dt>
         <dd>
           <span class="current-value">{{layerversion.layer.vcs_url}}</span>
           {% if layerversion.get_vcs_link_url %}
-          <a href="{{layerversion.get_vcs_link_url}}/" class="glyphicon glyphicon-share get-info" target="_blank"></a>
+          <a href="{{layerversion.get_vcs_link_url}}/" class="glyphicon glyphicon-new-window" target="_blank"></a>
           {% endif %}
-          <form id="change-repo-form" class="control-group" style="display:none">
-            <div class="input-append">
-              <input type="text" class="input-xlarge" value="{{layerversion.layer.vcs_url}}">
-                <button data-layer-prop="vcs_url" class="btn change-btn" type="button">Save</button>
-                <a href="#" style="display:none" class="btn btn-link cancel">Cancel</a>
-              </div>
-            </form>
-            <i class="icon-pencil" ></i>
-          </dd>
-          <dt>
-            <i class="icon-question-sign get-help" title="Subdirectory within the repository where the layer is located, if not in the root (usually only used if the repository contains more than one layer)"></i>
-            Repository subdirectory
-          </dt>
-          <dd>
-            <span class="muted" style="display:none">Not set</span>
-            <span class="current-value">{{layerversion.dirpath}}</span>
-            {% if layerversion.get_vcs_dirpath_link_url %}
-            <a href="{{layerversion.get_vcs_dirpath_link_url}}" class="glyphicon glyphicon-share get-info" target="_blank"></a>
-            {% endif %}
-            <form id="change-subdir-form" style="display:none;">
-              <div class="input-append">
-                <input type="text" value="{{layerversion.dirpath}}">
-                  <button data-layer-prop="dirpath" class="btn change-btn" type="button">Save</button>
-                  <a href="#" style="display:none" class="btn btn-link cancel">Cancel</a>
-                </div>
-              </form>
-              <i id="change-subdir" class="icon-pencil"></i>
-              <span class="icon-trash delete-current-value" data-toggle="tooltip" title="Delete"></span>
-            </dd>
-            <dt>
-              <i class="icon-question-sign get-help" title="The Git branch, tag or commit"></i>
-              Git revision
-            </dt>
-            <dd>
-              <span class="current-value">{{layerversion.get_vcs_reference}}</span>
-              <form style="display:none;">
-                <div class="input-append">
-                  <input type="text" value="{{layerversion.get_vcs_reference}}">
-                    <button  data-layer-prop="commit" class="btn change-btn" type="button">Save</button>
-                    <a href="#" style="display:none" class="btn btn-link cancel">Cancel</a>
-                  </div>
-                </form>
-                <i class="icon-pencil"></i>
-              </dd>
-              <dt>
-                <i class="icon-question-sign get-help" title="Other layers this layer depends upon"></i>
+          <form id="change-repo-form" class="form-inline" style="display:none">
+            <div class="form-group">
+              <input type="text" class="form-control" value="{{layerversion.layer.vcs_url}}">
+            </div>
+            <button data-layer-prop="vcs_url" class="btn btn-default change-btn" type="button">Save</button>
+            <a href="#" style="display:none" class="btn btn-link cancel">Cancel</a>
+          </form>
+          <span class="glyphicon glyphicon-edit"></span>
+        </dd>
+        <dt>
+          <span class="glyphicon glyphicon-question-sign get-help" title="Subdirectory within the repository where the layer is located, if not in the root (usually only used if the repository contains more than one layer)"></span>
+					Repository subdirectory
+        </dt>
+        <dd>
+          <span class="text-muted" style="display:none">Not set</span>
+          <span class="current-value">{{layerversion.dirpath}}</span>
+          {% if layerversion.get_vcs_dirpath_link_url %}
+          <a href="{{layerversion.get_vcs_dirpath_link_url}}" class="glyphicon glyphicon-new-window" target="_blank"></a>
+          {% endif %}
+          <form id="change-subdir-form" class="form-inline" style="display:none;">
+            <div class="form-group">
+              <input type="text" class="form-control" value="{{layerversion.dirpath}}">
+            </div>
+            <button data-layer-prop="dirpath" class="btn btn-default change-btn" type="button">Save</button>
+            <a href="#" style="display:none" class="btn btn-link cancel">Cancel</a>
+          </form>
+          <span id="change-subdir" class="glyphicon glyphicon-edit"></span>
+          <span class="glyphicon glyphicon-trash delete-current-value" data-toggle="tooltip" title="Delete"></span>
+        </dd>
+        <dt>
+					<span class="glyphicon glyphicon-question-sign get-help" title="The Git branch, tag or commit"></span>
+          Git revision
+        </dt>
+        <dd>
+					<span class="current-value">{{layerversion.get_vcs_reference}}</span>
+					<form style="display:none;" class="form-inline">
+						<div class="form-group">
+							<input type="text" class="form-control" value="{{layerversion.get_vcs_reference}}">
+						</div>
+						<button  data-layer-prop="commit" class="btn btn-default change-btn" type="button">Save</button>
+						<a href="#" style="display:none" class="btn btn-link cancel">Cancel</a>
+					</form>
+					<span class="glyphicon glyphicon-edit"></i>
+        </dd>
+				<dt>
+                <span class="glyphicon glyphicon-question-sign get-help" title="Other layers this layer depends upon"></span>
                 Layer dependencies
               </dt>
               <dd>
@@ -179,21 +175,23 @@
                   {% for ld in layerversion.dependencies.all %}
                   <li data-layer-id="{{ld.depends_on.id}}">
                     <a data-toggle="tooltip" title="{{ld.depends_on.layer.vcs_url}} | {{ld.depends_on.get_vcs_reference}}" href="{% url 'layerdetails' project.id ld.depends_on.id %}">{{ld.depends_on.layer.name}}</a>
-                    <span class="icon-trash " data-toggle="tooltip" title="Delete"></span>
+                    <span class="glyphicon glyphicon-trash " data-toggle="tooltip" title="Delete"></span>
                   </li>
                   {% endfor %}
                 </ul>
-                <div class="input-append add-deps">
-                  <input type="text" autocomplete="off" data-minLength="1" data-autocomplete="off"  placeholder="Type a layer name" id="layer-dep-input">
-                    <a class="btn" id="add-layer-dependency-btn" >
-                      Add layer
-                    </a>
-                  </div>
-                  <span class="help-block add-deps">You can only add layers Toaster knows about</span>
-                </dd>
-              </dl>
-            </div>
-            <!-- end layerdetails tab -->
+								<form class="form-inline add-deps">
+									<div class="form-group">
+										<input class="form-control" type="text" autocomplete="off" data-minLength="1" data-autocomplete="off"  placeholder="Type a layer name" id="layer-dep-input">
+									</div>
+									<a class="btn btn-default" id="add-layer-dependency-btn" disabled="disabled">
+										Add layer
+									</a>
+									<span class="help-block add-deps">You can only add layers Toaster knows about</span>
+								</form>
+              </dd>
+            </dl>
+          </div>
+          <!-- end layerdetails tab -->
             <!-- targets tab -->
             <div id="recipes" class="tab-pane">
               <!-- Recipe table -->
@@ -216,7 +214,7 @@
 
               <div id="no-machines-yet" class="alert alert-info" style="display:none">
                 <p>Toaster does not have machine information for the <strong> {{layerversion.layer.name}} </strong> layer.</p>
-                <p>Toaster learns about layers when you build them. If this layer provides any machines, they will be listed here after you build the <strong> {{layerversion.layer.name}} </strong> layer.</p>
+								<p>Sadly, machine information cannot be obtained from builds, so this page will remain empty.</p>
               </div>
 
 
@@ -238,32 +236,36 @@
 
               <dt>
               Summary
-              <i class="icon-question-sign get-help" title="One-line description of the layer"></i>
+              <span class="glyphicon glyphicon-question-sign get-help" title="One-line description of the layer"></span>
               </dt>
               <dd>
-              <span class="muted" style="display:none">Not set</span>
+              <span class="text-muted" style="display:none">Not set</span>
               <span class="current-value">{{layerversion.layer.summary|default_if_none:''}}</span>
-              <form style="display:none; margin-bottom:20px">
-                <textarea class="col-md-12" rows="2">{% if layerversion.layer.summary %}{{layerversion.layer.summary}}{% endif %}</textarea>
-                <button class="btn change-btn" data-layer-prop="summary" type="button">Save</button>
-                <a href="#" class="btn btn-link cancel">Cancel</a>
+              <form style="display:none; margin-bottom:20px; margin-top:5px;">
+								<div class="form-group">
+									<textarea class="form-control" rows="2">{% if layerversion.layer.summary %}{{layerversion.layer.summary}}{% endif %}</textarea>
+								</div>
+								<button class="btn btn-default change-btn" data-layer-prop="summary" type="button">Save</button>
+								<a href="#" class="btn btn-link cancel">Cancel</a>
               </form>
-              <i class="icon-pencil"></i>
-              <span class="icon-trash delete-current-value" data-toggle="tooltip" title="Delete"></span>
+              <span class="glyphicon glyphicon-edit"></span>
+              <span class="glyphicon glyphicon-trash delete-current-value" data-toggle="tooltip" title="Delete"></span>
             </dd>
             <dt>
               Description
               </dt>
               <dd>
-              <span class="muted" style="display:none">Not set</span>
+              <span class="text-muted" style="display:none">Not set</span>
               <span class="current-value">{{layerversion.layer.description|default_if_none:''}}</span>
-              <form style="display:none; margin-bottom:20px">
-                <textarea class="col-md-12" rows="6">{% if layerversion.layer.description %}{{layerversion.layer.description}}{% endif %}</textarea>
-                <button class="btn change-btn" data-layer-prop="description" type="button" >Save</button>
+              <form style="display:none; margin-bottom:20px; margin-top:5px;">
+								<div class="form-group">
+									<textarea class="form-control" rows="6">{% if layerversion.layer.description %}{{layerversion.layer.description}}{% endif %}</textarea>
+								</div>
+                <button class="btn btn-default change-btn" data-layer-prop="description" type="button" >Save</button>
                 <a href="#" class="btn btn-link cancel">Cancel</a>
               </form>
-              <i class="icon-pencil"></i>
-              <span class="icon-trash delete-current-value" data-toggle="tooltip" title="Delete"></span>
+              <span class="glyphicon glyphicon-edit"></span>
+              <span class="glyphicon glyphicon-trash delete-current-value" data-toggle="tooltip" title="Delete"></span>
             </dd>
             {% if layerversion.layer.up_id %}
             <dt>Layer index</dt>
@@ -277,5 +279,7 @@
         </div>
       </div>
 </div>
+</div> <!-- close column 12 div -->
+</div> <!-- close top row div -->
 
       {% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/toastertable-simple.html b/bitbake/lib/toaster/toastergui/templates/toastertable-simple.html
index e0a203d..26445c3 100644
--- a/bitbake/lib/toaster/toastergui/templates/toastertable-simple.html
+++ b/bitbake/lib/toaster/toastergui/templates/toastertable-simple.html
@@ -27,68 +27,74 @@
 {% include 'toastertable-filter.html' %}
 
 <div id="no-results-{{table_name}}" style="display:none">
-  <div class="alert">
-    <form class="no-results input-append">
-      <input class="input-xlarge" id="new-search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>
-      <a href="#" class="input-append-addon btn remove-search-btn-{{table_name}}" tabindex="-1">
-        <i class="glyphicon glyphicon-remove"></i>
-      </a>
-      <button class="btn search-submit-{{table_name}}" >Search</button>
-      <button class="btn btn-link remove-search-btn-{{table_name}}">Show {{title|lower}}
-      </button>
+  <div class="alert alert-warning">
+    <form class="no-results form-inline">
+			<div class="form-group">
+				<div class="btn-group">
+					<input class="form-control" id="new-search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>
+					<span class="remove-search-btn-{{table_name}} glyphicon glyphicon-remove-circle" tabindex="-1"></span>
+				</div>
+			</div>
+      <button class="btn btn-default search-submit-{{table_name}}">Search</button>
+      <button class="btn btn-link remove-search-btn-{{table_name}}">Show all {{title|lower}}</button>
     </form>
   </div>
 </div>
 <div id="table-container-{{table_name}}" style="visibility: hidden">
   <!-- control header -->
   <div id="table-chrome-{{table_name}}">
-      <div class="navbar-search input-append pull-left">
+		<div class="container-fluid detail-page-contols">
+			<form class="navbar-form navbar-left">
+				<div class="form-group">
+					<div class="btn-group">
+						<input class="form-control" id="search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>
+						<span href="#" style="display:none" class="remove-search-btn-{{table_name}} glyphicon glyphicon-remove-circle" tabindex="-1"></span>
+					</div>
+				</div>
+				<button class="btn btn-default" id="search-submit-{{table_name}}" >Search</button>
+			</form>
 
-        <input class="input-xlarge" id="search-input-{{table_name}}" name="search" type="text" placeholder="Search {{title|lower}}" value="{% if request.GET.search %}{{request.GET.search}}{% endif %}"/>
-        <a href="#" style="display:none" class="input-append-addon btn remove-search-btn-{{table_name}}" tabindex="-1">
-          <i class="glyphicon glyphicon-remove"></i>
-        </a>
-        <button class="btn" id="search-submit-{{table_name}}" >Search</button>
-      </div>
-
-      <div class="pull-right">
-
-        <div style="display:inline">
-          <span class="divider-vertical"></span>
-          <span class="help-inline" style="padding-top:5px;">Show rows:</span>
-          <select style="margin-top:5px;margin-bottom:0px;" class="pagesize-{{table_name}}">
-            {% with "10 25 50 100 150" as list%}
-            {% for i in list.split %}
-            <option value="{{i}}">{{i}}</option>
-            {% endfor %}
-            {% endwith %}
-          </select>
-        </div>
-      </div>
+			<form class="navbar-form navbar-right">
+				<div class="form-group">
+					<label>Show rows:</label>
+					<select class="form-control pagesize-{{table_name}}">
+						{% with "10 25 50 100 150" as list%}
+						{% for i in list.split %}
+						<option value="{{i}}">{{i}}</option>
+						{% endfor %}
+						{% endwith %}
+					</select>
+				</div>
+			</form>
+		</div>
   </div>
 
   <!-- The actual table -->
-  <table class="table table-bordered table-hover tablesorter" id="{{table_name}}">
-    <thead>
-      <tr><th></th></tr>
-    </thead>
-    <tbody></tbody>
-  </table>
+	<div class="table-responsive">
+		<table class="table table-bordered table-hover" id="{{table_name}}">
+			<thead>
+				<tr><th></th></tr>
+			</thead>
+			<tbody></tbody>
+		</table>
+	</div>
 
   <!-- Pagination controls -->
   <div id="pagination-{{table_name}}">
-    <ul class="pagination">
-    </ul>
+		<ul class="pagination">
+		</ul>
 
-    <div class="pull-right">
-      <span class="help-inline">Show rows:</span>
-      <select class="pagesize-{{table_name}}">
-        {% with "10 25 50 100 150" as list%}
-        {% for i in list.split %}
-        <option value="{{i}}">{{i}}</option>
-        {% endfor %}
-        {% endwith %}
-      </select>
-    </div>
+		<form class="navbar-form navbar-right">
+			<div class="form-group">
+				<label>Show rows:</label>
+				<select class="form-control pagesize-{{table_name}}">
+					{% with "10 25 50 100 150" as list%}
+					{% for i in list.split %}
+					<option value="{{i}}">{{i}}</option>
+					{% endfor %}
+					{% endwith %}
+				</select>
+			</div>
+		</form>
   </div>
 </div>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 092/106] toaster: custom recipe Fix the custom recipe details page
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (88 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 091/106] toaster: layerdetails Fix the layer details page Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 093/106] toaster: recipe details Fix the image " Belen Barros Pena
                   ` (13 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Make sure the page displays correctly with Bootstrap 3, but when showing
the table of packages and when showing no packages.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../lib/toaster/toastergui/static/css/default.css  | 12 ++-
 bitbake/lib/toaster/toastergui/tables.py           |  3 +-
 .../toaster/toastergui/templates/customrecipe.html | 95 +++++++++++-----------
 .../toastergui/templates/pkg_add_rm_btn.html       | 10 +--
 .../snippets/pkg_dependencies_popover.html         |  2 +-
 .../snippets/pkg_revdependencies_popover.html      |  2 +-
 .../toaster/toastergui/templates/toastertable.html |  2 +
 7 files changed, 67 insertions(+), 59 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index 43c7c54..20bf498 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -49,12 +49,15 @@ img.logo { height: 30px; vertical-align: bottom; }
 /* Styles for our table controls */
 .form-control[id^="search-input-"],
 .form-control[id^="new-search-input-"] { width: 30em; }
+#search-input-selectpackagestable,
+.form-control[id^="no-results-search-input-"]{ width: 20em; }
 #edit-columns-button { margin-right: 30px; }
 .navbar-default[id^="table-chrome-"] { background-color: transparent; }
 [id^="table-chrome-collapse-"] .navbar-form { margin-left: -15px; }
 .dropdown-menu.editcol { padding-left: 10px; min-width: 180px; }
 span[class^="remove-search-btn-"] { position: absolute; right: 5px; top: 0; bottom: 0; height: 14px; margin: auto; font-size: 14px; cursor: pointer; color: #777;}
 span[class^="remove-search-btn-"]:hover { color: #333; }
+#no-results-special-selectpackagestable .form-inline { margin-top: 20px; }
 [id^="pagination-"] .pagination,
 [id^="pagination-"] .navbar-form { margin-top: 0; }
 [id^="table-chrome-"] .navbar-form { margin-left: -15px; margin-right: -15px; }
@@ -77,7 +80,8 @@ thead > tr > th > a.sorted { font-weight: bold; color: #333; }
 thead > tr > th > .glyphicon-question-sign { margin-right: 5px; }
 
 /* Style build outcome in tables, download, remove and change icons */
-tbody > tr > td > .glyphicon-ok-circle { color: #3c763d; }
+tbody > tr > td > .glyphicon-ok-circle,
+dd > .glyphicon-ok-circle { color: #3c763d; }
 tbody > tr > td > .glyphicon-minus-sign { color: #a94442; }
 .glyphicon-download-alt,
 .glyphicon-edit { color: #337ab7; }
@@ -169,7 +173,8 @@ legend { border: none; }
 .help-inline { color: #737373; margin-left: 10px; }
 
 /* Give some padding to the in-cell tooltips we use for notifications in tables */
-td > .tooltip-inner { padding: 10px; }
+td > .tooltip-inner,
+.inline-notification { padding: 10px; }
 
 /* Set sane widths for table columns */
 #newcustomimagestable .get_description_or_summary,
@@ -198,3 +203,6 @@ code { color: #333; background-color: transparent; }
 /* Style the new window icons */
 .glyphicon-new-window:hover { text-decoration: none; }
 .dl-horizontal > dd > .glyphicon-new-window { margin-left: 5px; }
+
+/* Style the special no results message in the custom image details page */
+[id^="no-results-special-"] > .alert-warning > ol { margin-top: 10px; }
diff --git a/bitbake/lib/toaster/toastergui/tables.py b/bitbake/lib/toaster/toastergui/tables.py
index efc9c7b..f9940db 100644
--- a/bitbake/lib/toaster/toastergui/tables.py
+++ b/bitbake/lib/toaster/toastergui/tables.py
@@ -725,7 +725,8 @@ class PackagesTable(ToasterTable):
 
         self.add_column(title="License",
                         field_name="license",
-                        orderable=True)
+                        orderable=True,
+                        hidden=True)
 
 
         self.add_column(title="Dependencies",
diff --git a/bitbake/lib/toaster/toastergui/templates/customrecipe.html b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
index fa76c8a..1a7f576 100644
--- a/bitbake/lib/toaster/toastergui/templates/customrecipe.html
+++ b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
@@ -5,7 +5,6 @@
 {% block pagecontent %}
 
 {% with recipe.get_base_recipe_file as base_recipe_file %}
-<div class="row">
   <ul class="breadcrumb">
     <li>
       <a href="{% url 'project' project.id %}">{{project.name}}</a>
@@ -18,7 +17,6 @@
       {{recipe.name}} ({{recipe.layer_version.layer.name}})
     </li>
   </ul>
-</div>
 
 <script src="{% static 'js/customrecipe.js' %}"></script>
 <script>
@@ -89,28 +87,24 @@
 </div><!-- /.modal -->
 <!-- end package dependencies modal -->
 
-<div class="row">
-  <div class="col-md-12">
-    <div class="alert alert-success lead" id="image-created-notification" style="margin-top: 15px; display: none">
-      <button type="button" data-dismiss="alert" class="close">x</button>
-      Your custom image <strong>{{recipe.name}}</strong> has been created. You can now add or remove packages as needed.
-    </div>
-    <div class="page-header">
-      <h1>
-        {{recipe.name}}
-        <small>({{recipe.layer_version.layer.name}})</small>
-      </h1>
-    </div>
-  </div>
+<div class="alert alert-success lead" id="image-created-notification" style="margin-top: 15px; display: none">
+	<button type="button" data-dismiss="alert" class="close">x</button>
+	Your custom image <strong>{{recipe.name}}</strong> has been created. You can now add or remove packages as needed.
+</div>
+<div class="page-header">
+	<h1>
+		{{recipe.name}}
+		<small>({{recipe.layer_version.layer.name}})</small>
+	</h1>
 </div>
 
 <div class="row">
   <div class="col-md-8">
     <div class="button-place btn-group" style="width: 100%">
-      <a class="btn btn-large col-md-6 build-custom-image" href="#" style="width: 50%">
+      <a class="btn btn-default btn-lg build-custom-image" href="#" style="width: 50%">
         Build {{recipe.name}}
       </a>
-      <a href="{% url 'customrecipedownload' project.id recipe.id %}" class="btn btn-large span6" style="width: 50%"
+      <a href="{% url 'customrecipedownload' project.id recipe.id %}" class="btn btn-default btn-lg" style="width: 50%"
         {% if not base_recipe_file %}
         disabled="disabled"
         {% endif %}>
@@ -121,61 +115,64 @@
         {% endif %}
       </a>
     </div>
-    <div id="no-results-special-{{table_name}}" class="air" style="display:none;">
-      <div class="alert">
+    <div id="no-results-special-{{table_name}}" class="top-air" style="display:none;">
+      <div class="alert alert-warning">
         <h3>No packages found</h3>
-        <p>You might consider <a href={% url 'projectsoftwarerecipes' project.id %}>searching the list of recipes</a> instead. If you find a recipe that matches the name of the package you want:</p>
+				<p>You might consider <a href={% url 'projectsoftwarerecipes' project.id %}>searching the list of recipes</a> instead.</p> 
+				<p>If you find a recipe that matches the name of the package you want:</p>
         <ol>
           <li>Add the layer providing the recipe to your project</li>
           <li>Build the recipe</li>
           <li>Once the build completes, come back to this page and search for the package</li>
         </ol>
-        <form class="input-append no-results">
-          <input type="text" class="input-xlarge no-results-search-input" id="no-results-search-input-{{table_name}}" name="search" placeholder="Search {{title|lower}}" />
-          <a href="#" class="input-append-addon btn" id="no-results-remove-search-btn" tabindex="-1">
-            <i class="glyphicon glyphicon-remove"></i>
-          </a>
-          <button class="btn search-submit-{{table_name}}">Search</button>
+        <form class="form-inline no-results">
+					<div class="form-group">
+						<div class="btn-group">
+							<input type="text" class="form-control no-results-search-input" id="no-results-search-input-{{table_name}}" name="search" placeholder="Search {{title|lower}}" />
+							<span class="remove-search-btn-{{table_name}} glyphicon glyphicon-remove-circle" id="no-results-remove-search-btn" tabindex="-1"></span>
+						</div>
+					</div>
+          <button class="btn btn-default search-submit-{{table_name}}">Search</button>
           <button class="btn btn-link" id="no-results-show-all-packages">Show all packages</button>
         </form>
-      </div>
-      </div>
+			</div>
+    </div>
       <div id="results-found-{{table_name}}">
-      <div id="packages-table">
-        {% if recipe.get_all_packages.count == 0 and last_build == None %}
-        <h2> Add | Remove packages </h2>
-        <div class="alert alert-info air">
-          <p class="lead">Toaster has no package information for {{recipe.name}}. To generate package information, build {{recipe.name}}</p>
-          <button class="btn btn-info btn-large build-custom-image" style="margin:20px 0 10px 0;">Build {{recipe.name}}</button>
-        </div>
-        {% else %}
-        {# ToasterTable for Adding remove packages #}
-        {% url 'recipeselectpackages' project.id recipe.id as xhr_table_url %}
-        <h2>{{title}} (<span class="table-count-{{table_name}}">0</span>) </h2>
-        {% include "toastertable.html" %}
-        {% endif %}
-      </div>
+				<div id="packages-table">
+					{% if recipe.get_all_packages.count == 0 and last_build == None %}
+					<h2> Add | Remove packages </h2>
+					<div class="alert alert-info">
+						<p class="lead">Toaster has no package information for {{recipe.name}}. To generate package information, build {{recipe.name}}</p>
+						<button class="btn btn-info btn-lg build-custom-image" style="margin:20px 0 10px 0;">Build {{recipe.name}}</button>
+					</div>
+					{% else %}
+					{# ToasterTable for Adding remove packages #}
+					{% url 'recipeselectpackages' project.id recipe.id as xhr_table_url %}
+					<h2>{{title}} (<span class="table-count-{{table_name}}">0</span>) </h2>
+					{% include "toastertable.html" %}
+					{% endif %}
+				</div>
       </div>
     </div>
     <div class="col-md-4">
       <div class="well">
-        <h2 style="margin-bottom:20px;">About {{recipe.name}}</h2>
+        <h2>About {{recipe.name}}</h2>
 
         <dl>
           <dt>
           Approx. packages included
-          <i class="icon-question-sign get-help" title="" data-original-title="The number of packages included is based on information from previous builds and from parsing layers, so we can never be sure it is 100% accurate"></i>
+          <span class="glyphicon glyphicon-question-sign get-help" title="" data-original-title="The number of packages included is based on information from previous builds and from parsing layers, so we can never be sure it is 100% accurate"></span>
           </dt>
           <dd id="total-num-packages">{{recipe.get_all_packages.count}}</dd>
           <dt>
           Approx. package size
-          <i class="icon-question-sign get-help" title="" data-original-title="Package size is based on information from previous builds, so we can never be sure it is 100% accurate"></i>
+          <span class="glyphicon glyphicon-question-sign get-help" title="Package size is based on information from previous builds, so we can never be sure it is 100% accurate"></span>
           </dt>
           <dd id="total-size-packages">{{approx_pkg_size.size__sum|filtered_filesizeformat}}</dd>
           {% if last_build %}
           <dt>Last build</dt>
           <dd>
-          <i class="icon-ok-sign success"></i>
+          <span class="glyphicon glyphicon-ok-circle"></span>
           <a href="{% url 'projectbuilds' project.id%}">{{last_build.completed_on|date:"d/m/y H:i"}}</a>
           </dd>
           {% endif %}
@@ -187,7 +184,7 @@
           {% with recipe.get_last_successful_built_target as last_build_target %}
           <dt>Last build</dt>
           <dd>
-          <i class="icon-ok-sign success"></i>
+          <span class="glyphicon glyphicon-ok-circle"></span>
           <a href="{% url 'builddashboard' last_build_target.build.pk %}">
             {{last_build_target.build.completed_on|date:"d/m/y H:i"}}</a>
           </dd>
@@ -197,7 +194,7 @@
           <dt>Recipe file</dt>
           <dd>
           <code>{{recipe.name}}_{{recipe.version}}.bb</code>
-          <a href="{% url 'customrecipedownload' project.pk recipe.pk %}"><i class="icon-download-alt" title="Download recipe file"></i></a>
+          <a href="{% url 'customrecipedownload' project.pk recipe.pk %}"><span class="glyphicon glyphicon-download-alt" data-toggle="tooltip" title="Download recipe file"></span></a>
         </dd>
         {% endif %}
         <dt>Layer</dt>
@@ -231,7 +228,7 @@
           <dt>License</dt>
           <dd>
           {{recipe.license}}
-          <i class="icon-question-sign get-help" title="" data-original-title="All custom images have their license set to MIT. This is because the license applies only to the recipe (.bb) file, and not to the image itself. To see which licenses apply to the image you must check the license manifest generated with each build"></i>
+          <span class="glyphicon glyphicon-question-sign get-help" title="All custom images have their license set to MIT. This is because the license applies only to the recipe (.bb) file, and not to the image itself. To see which licenses apply to the image you must check the license manifest generated with each build"></i>
           </dd>
       </dl>
       <!--
diff --git a/bitbake/lib/toaster/toastergui/templates/pkg_add_rm_btn.html b/bitbake/lib/toaster/toastergui/templates/pkg_add_rm_btn.html
index 0c71c8a..303faec 100644
--- a/bitbake/lib/toaster/toastergui/templates/pkg_add_rm_btn.html
+++ b/bitbake/lib/toaster/toastergui/templates/pkg_add_rm_btn.html
@@ -1,12 +1,12 @@
 {# TODO move to snippets dir #}
 {% if data.is_locale_package %}
 <p class="text-center">
-  <span class="muted">Locale package</span>
-  <i class="icon-question-sign get-help hover-help" title=""
-      data-original-title="This package is included in your image
+  <span class="text-muted">Locale package</span>
+  <span class="glyphicon glyphicon-question-sign get-help hover-help"
+      title="This package is included in your image
       based on the locale specified in the IMAGE_LINGUAS variable"
       style="visibility: hidden;">
-  </i>
+  </span>
 </p>
 
 {% else %}
@@ -21,7 +21,7 @@
     <i class="icon-trash no-tooltip"></i>
     Remove package
   </button>
-  <button class="btn btn-block add-rm-package-btn" data-directive="add" data-id="{{data.pk}}" data-package-url="{% url 'xhr_customrecipe_packages' extra.recipe_id data.pk %}" data-name="{{data.name}}" style="
+  <button class="btn btn-default btn-block add-rm-package-btn" data-directive="add" data-id="{{data.pk}}" data-package-url="{% url 'xhr_customrecipe_packages' extra.recipe_id data.pk %}" data-name="{{data.name}}" style="
       {% if data.pk in extra.current_packages %}
       display:none
       {% endif %}
diff --git a/bitbake/lib/toaster/toastergui/templates/snippets/pkg_dependencies_popover.html b/bitbake/lib/toaster/toastergui/templates/snippets/pkg_dependencies_popover.html
index 5ffcc6c..0a24e92 100644
--- a/bitbake/lib/toaster/toastergui/templates/snippets/pkg_dependencies_popover.html
+++ b/bitbake/lib/toaster/toastergui/templates/snippets/pkg_dependencies_popover.html
@@ -6,7 +6,7 @@
    {% for dep in data.package_dependencies_source.all_depends %}
   <li>{{dep.depends_on.name}} {% if dep.depends_on.size > 0 %}({{dep.depends_on.size|filtered_filesizeformat}}){% endif %}</li>
     {% endfor %}
-  </ul>" title="" class="btn" data-original-title="
+  </ul>" class="btn btn-default" title="
   <strong>{{data.name}}</strong> dependencies - <strong>{{data.package_dependencies_source.get_total_source_deps_size.depends_on__size__sum|filtered_filesizeformat}}</strong>">
     {{dep_count}}
 </a>
diff --git a/bitbake/lib/toaster/toastergui/templates/snippets/pkg_revdependencies_popover.html b/bitbake/lib/toaster/toastergui/templates/snippets/pkg_revdependencies_popover.html
index 301d154..d470712 100644
--- a/bitbake/lib/toaster/toastergui/templates/snippets/pkg_revdependencies_popover.html
+++ b/bitbake/lib/toaster/toastergui/templates/snippets/pkg_revdependencies_popover.html
@@ -6,7 +6,7 @@
    {% for dep in data.package_dependencies_target.all_depends|dictsort:'package.name' %}
   <li>{{dep.package.name}} {% if dep.package.size > 0 %}({{dep.package.size|filtered_filesizeformat}}){% endif %}</li>
     {% endfor %}
-  </ul>" title="" class="btn" data-original-title="
+  </ul>" class="btn btn-default" title="
   <strong>{{data.name}}</strong> reverse dependencies - <strong>{{data.package_dependencies_target.get_total_revdeps_size.package_id__size__sum|filtered_filesizeformat}}</strong>">
     {{dep_count}}
 </a>
diff --git a/bitbake/lib/toaster/toastergui/templates/toastertable.html b/bitbake/lib/toaster/toastergui/templates/toastertable.html
index 6634c20..e30acb5 100644
--- a/bitbake/lib/toaster/toastergui/templates/toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/toastertable.html
@@ -121,3 +121,5 @@
       </div>
     </form>
   </div>
+
+</div> <!--end table container -->
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 093/106] toaster: recipe details Fix the image recipe details page
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (89 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 092/106] toaster: custom recipe Fix the custom recipe " Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 094/106] toaster: bb variables BitBake variables page to Bootstrap 3 Belen Barros Pena
                   ` (12 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Make sure it displays correctly with Bootstrap 3, both when showing the
list of packages installed, and when showing not packages.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../lib/toaster/toastergui/static/css/default.css  |  1 +
 .../toastergui/templates/recipedetails.html        | 76 ++++++++++------------
 2 files changed, 36 insertions(+), 41 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index 20bf498..c343645 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -50,6 +50,7 @@ img.logo { height: 30px; vertical-align: bottom; }
 .form-control[id^="search-input-"],
 .form-control[id^="new-search-input-"] { width: 30em; }
 #search-input-selectpackagestable,
+#search-input-packagestable,
 .form-control[id^="no-results-search-input-"]{ width: 20em; }
 #edit-columns-button { margin-right: 30px; }
 .navbar-default[id^="table-chrome-"] { background-color: transparent; }
diff --git a/bitbake/lib/toaster/toastergui/templates/recipedetails.html b/bitbake/lib/toaster/toastergui/templates/recipedetails.html
index 4dc88fa..64e0c21 100644
--- a/bitbake/lib/toaster/toastergui/templates/recipedetails.html
+++ b/bitbake/lib/toaster/toastergui/templates/recipedetails.html
@@ -4,25 +4,23 @@
 {% load static %}
 {% block pagecontent %}
 
-<div class="row">
-  <ul class="breadcrumb">
-    <li>
-      <a href="{% url 'project' project.id %}">{{project.name}}</a>
-      <span class="divider">&rarr;</span>
-    </li>
-    <li>
-      {% if recipe.is_image %}
-      <a href="{% url 'projectimagerecipes' project.id %}">Image recipes</a>
-      {% else %}
-      <a href="{% url 'projectsoftwarerecipes' project.id %}">Software recipes</a>
-      {% endif %}
-      <span class="divider">&rarr;</span>
-    </li>
-    <li class="active">
-      {{recipe.name}} ({{recipe.layer_version.layer.name}})
-    </li>
-  </ul>
-</div>
+<ul class="breadcrumb">
+	<li>
+		<a href="{% url 'project' project.id %}">{{project.name}}</a>
+		<span class="divider">&rarr;</span>
+	</li>
+	<li>
+	{% if recipe.is_image %}
+		<a href="{% url 'projectimagerecipes' project.id %}">Image recipes</a>
+	{% else %}
+		<a href="{% url 'projectsoftwarerecipes' project.id %}">Software recipes</a>
+	{% endif %}
+		<span class="divider">&rarr;</span>
+	</li>
+	<li class="active">
+		{{recipe.name}} ({{recipe.layer_version.layer.name}})
+	</li>
+</ul>
 
 <script src="{% static 'js/recipedetails.js' %}"></script>
 <script>
@@ -51,19 +49,15 @@
 
 {% include 'newcustomimage_modal.html' %}
 
-<div class="row">
-  <div class="col-md-12">
-    <div class="alert alert-success lead" id="image-created-notification" style="margin-top: 15px; display: none">
-      <button type="button" data-dismiss="alert" class="close">x</button>
-      Your custom image <strong>{{recipe.name}}</strong> has been created. You can now add or remove packages as needed.
-    </div>
-    <div class="page-header">
-      <h1>
-        {{recipe.name}}
-        <small>({{recipe.layer_version.layer.name}})</small>
-      </h1>
-    </div>
-  </div>
+<div class="alert alert-success lead" id="image-created-notification" style="margin-top: 15px; display: none">
+	<button type="button" data-dismiss="alert" class="close">x</button>
+	Your custom image <strong>{{recipe.name}}</strong> has been created. You can now add or remove packages as needed.
+</div>
+<div class="page-header">
+	<h1>
+		{{recipe.name}}
+		<small>({{recipe.layer_version.layer.name}})</small>
+	</h1>
 </div>
 
 <div class="row">
@@ -73,17 +67,17 @@
       {% if not in_project %}
       display:none;
       {% endif %}">
-      <button class="btn btn-large col-md-6 build-recipe-btn" style="width: 50%">
+      <button class="btn btn-default btn-lg build-recipe-btn" style="width: 50%">
         Build {{recipe.name}}
       </button>
       {% if recipe.is_image %}
-      <button class="btn btn-large col-md-6 customise-btn" data-recipe="{{recipe.pk}}" style="width: 50%">
+      <button class="btn btn-default btn-lg customise-btn" data-recipe="{{recipe.pk}}" style="width: 50%">
         Customise {{recipe.name}}
       </button>
       {% endif %}
     </div>
     <div class="button-place">
-      <button class="btn btn-block btn-large" id="add-layer-btn"
+      <button class="btn btn-default btn-block btn-lg" id="add-layer-btn"
           style="width:100%;
           {% if in_project %}
           display:none;
@@ -108,7 +102,7 @@
        style="display:none"
       {% endif %} >
         <p class="lead">Toaster has no package information for {{recipe.name}}. To generate package information, build {{recipe.name}}</p>
-        <button class="btn btn-info btn-large build-recipe-btn" style="margin:20px 0 10px 0;">Build {{recipe.name}}</button>
+        <button class="btn btn-info btn-lg build-recipe-btn" style="margin:20px 0 10px 0;">Build {{recipe.name}}</button>
       </div>
 
       <div class="alert alert-info air" id="packages-alert"
@@ -123,29 +117,29 @@
   </div>
   <div class="col-md-4">
     <div class="well">
-      <h2 style="margin-bottom:20px;">About {{recipe.name}}</h2>
+      <h2>About {{recipe.name}}</h2>
       <dl>
         <dt>
         Approx. packages included
-        <i class="icon-question-sign get-help" title="" data-original-title="The number of packages included is based on information from previous builds and from parsing layers, so we can never be sure it is 100% accurate"></i>
+        <span class="glyphicon glyphicon-question-sign get-help" title="The number of packages included is based on information from previous builds and from parsing layers, so we can never be sure it is 100% accurate"></span>
         </dt>
         <dd class="no-packages">{{packages.count}}</dd>
         <dt>
         Approx. package size
-        <i class="icon-question-sign get-help" title="" data-original-title="Package size is based on information from previous builds, so we can never be sure it is 100% accurate"></i>
+        <span class="glyphicon glyphicon-question-sign get-help" title="Package size is based on information from previous builds, so we can never be sure it is 100% accurate"></span>
         </dt>
         <dd>{{approx_pkg_size.size__sum|filtered_filesizeformat}}</dd>
         {% if last_build %}
         <dt>Last build</dt>
         <dd>
-        <i class="icon-ok-sign success"></i>
+        <span class="glyphicon glyphicon-ok-circle"></span>
         <a href="{% url 'projectbuilds' project.id%}">{{last_build.completed_on|date:"d/m/y H:i"}}</a>
         </dd>
         {% endif %}
         <dt>Recipe file</dt>
         <dd>
         <code>{{recipe.file_path|cut_path_prefix:recipe.layer_version.local_path}}</code>
-        <a href="{{recipe.get_vcs_recipe_file_link_url}}"><i class="glyphicon glyphicon-share" title="" data-original-title="View recipe file"></i></a>
+        <a href="{{recipe.get_vcs_recipe_file_link_url}}"><span class="glyphicon glyphicon-new-window" title="View recipe file" data-toggle="tooltip"></span></a>
         </dd> 
         <dt>Layer</dt>
         <dd><a href="{% url 'layerdetails' project.id recipe.layer_version.pk %}">{{recipe.layer_version.layer.name}}</a></dd>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 094/106] toaster: bb variables BitBake variables page to Bootstrap 3
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (90 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 093/106] toaster: recipe details Fix the image " Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 095/106] toaster: recent builds Consistent rebuild links Belen Barros Pena
                   ` (11 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Make changes to make sure all variables and their forms work with
Bootstrap 3.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../lib/toaster/toastergui/static/css/default.css  |  21 +-
 .../toaster/toastergui/templates/projectconf.html  | 407 +++++++++++----------
 2 files changed, 241 insertions(+), 187 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index c343645..37aec66 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -94,7 +94,7 @@ tbody > tr > td > .glyphicon-minus-sign { color: #a94442; }
 .btn-danger > .glyphicon-trash:hover { color: #fff; }
 .glyphicon-trash:hover { color: #843534; cursor: pointer; }
 
-/* Set the font size for icons inside headings and lead paragraphs */
+/* Set the font size for icons inside headings, lead paragraphs and definition lists */
 h1 > .glyphicon-edit,
 p.lead .glyphicon { font-size: 16px; }
 h2 > .glyphicon-question-sign,
@@ -148,6 +148,25 @@ dd .glyphicon-edit { margin-left: 5px; }
 #change-repo-form .form-control { width: 17em; }
 #information dd > form { margin-bottom: 5px; margin-top: 5px; }
 
+/* Style the forms and definition lists in the BitBake variables page */
+.variable-list { margin-bottom: 20px; }
+dd.variable-list form { margin-top: 10px; }
+#new-dl_dir,
+#filter-image_fstypes,
+#new-image_install,
+#new-sstate_dir { width: 20em; }
+#package_classes-select { width: 10em; }
+.scrolling { border: 1px solid #dddddd; height: 154px; overflow: auto; padding: 0 10px; width: 27.5%; margin-bottom: 10px; margin-top: 10px; }
+.scrolling.has-error { border-color: #a94442; }
+.help-block.text-danger { color: #a94442; }
+.tooltip-inner code { color: #fff; }
+dd.variable-list .glyphicon-question-sign { font-size: 14px; }
+dd.variable-list .glyphicon-edit { font-size: 16px; }
+dt .glyphicon-trash { margin-left: 5px; font-size: 16px; }
+#change-package_classes-form .checkbox { margin-top: 5px; }
+#variable-form h5 { margin-top: 0; }
+#variable-form .col-md-5 { padding-left: 45px; }
+
 /* Create a class for additional top margin that we can use in headings */
 .top-air { margin-top: 40px; }
 
diff --git a/bitbake/lib/toaster/toastergui/templates/projectconf.html b/bitbake/lib/toaster/toastergui/templates/projectconf.html
index 56d5c1f..a7eaafb 100644
--- a/bitbake/lib/toaster/toastergui/templates/projectconf.html
+++ b/bitbake/lib/toaster/toastergui/templates/projectconf.html
@@ -7,72 +7,66 @@
 
 <h2>Bitbake variables</h2>
 
-    <div style="padding-left:19px;">
+    <div>
 
-        <dl class="dl-vertical">
+        <dl>
             {% if distro_defined %}
             <dt>
                 <span class="js-config-var-name js-config-var-managed-name">DISTRO</span>
-                <i class="icon-question-sign get-help" title="The short name of the distribution. If the variable is blank, meta/conf/distro/defaultsetup.conf will be used. <br /><a href='http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-DISTRO' target='_blank'>Read more in the manual</a>"></i>
+                <span class="glyphicon glyphicon-question-sign get-help" title="The short name of the distribution. If the variable is blank, meta/conf/distro/defaultsetup.conf will be used"></span>
             </dt>
-            <dd class="lead">
-                <span id="distro">{{distro}}</span>
-                <i class="icon-pencil" id="change-distro-icon"></i>
-                <form id="change-distro-form" style="display:none;">
-                    <div class="input-append">
-                        <span  id="edit-distro-name-div" class="control-group">
-                            <input type="text" id="new-distro" value="{{distro}}">
-                            <button id="apply-change-distro" class="btn" type="button">Save</button>
-                            <button id="cancel-change-distro" type="button" class="btn btn-link">Cancel</button>
-                        </span>
-                        <span class="help-block error" id="distro-error-message"></span>
-                    </div>
-                </form>
+            <dd class="variable-list">
+							<span class="lead" id="distro">{{distro}}</span>
+							<span class="glyphicon glyphicon-edit" id="change-distro-icon"></span>
+							<form id="change-distro-form" class="form-inline" style="display:none;">
+								<div id="edit-distro-name-div" class="form-group">
+									<input type="text" class="form-control" id="new-distro" value="{{distro}}">
+								</div>
+								<button id="apply-change-distro" class="btn btn-default" type="button">Save</button>
+								<button id="cancel-change-distro" type="button" class="btn btn-link">Cancel</button>
+								<span class="help-block" id="distro-error-message"></span>
+							</form>
             </dd>
             {% endif %}
 
             {% if dl_dir_defined %}
             <dt>
                 <span class="js-config-var-name js-config-var-managed-name">DL_DIR</span>
-                <i class="icon-question-sign get-help" title="Absolute path to the directory used to store downloads required for your builds. By default, Toaster projects share the same downloads directory.<br /><a href='http://www.yoctoproject.org/docs/2.1/ref-manual/ref-manual.html#var-DL_DIR' target='_blank'>Read more in the manual</a>"></i>
+                <span class="glyphicon glyphicon-question-sign get-help" title="Absolute path to the directory used to store downloads required for your builds. By default, Toaster projects share the same downloads directory"></span>
             </dt>
-            <dd class="lead">
-                <span id="dl_dir"{% if dl_dir %}{%else%} class="muted"{%endif%}>{% if dl_dir %}{{dl_dir}}{%else%}Not set{%endif%}</span>
-                <i class="icon-pencil" id="change-dl_dir-icon"></i>
-                <form id="change-dl_dir-form" style="display:none;">
-                    <div class="row">
-                        <span class="help-block col-md-4">To set DL_DIR type the absolute path of the download folder.</span>
-                    </div>
-                    <div class="input-append" id="validate-dl_dir">
-                        <input type="text" class="input-xlarge" id="new-dl_dir" placeholder="Type absolute path of the DL_DIR folder">
-                        <button id="apply-change-dl_dir" class="btn" type="button">Save</button>
-                        <button id="cancel-change-dl_dir" type="button" class="btn btn-link">Cancel</button>
-			</br><span class="help-block error" id="hintError-dl_dir">A valid directory cannot include spaces or any of these characters: . \ ? % * : | " " < ></span>
-                    </div>
-                </form>
+            <dd class="variable-list">
+							<span id="dl_dir" class="lead {% if not dl_dir %} text-muted {% endif %}">{% if dl_dir %}{{dl_dir}}{%else%}Not set{%endif%}</span>
+              <span class="glyphicon glyphicon-edit" id="change-dl_dir-icon"></span>
+              <form id="change-dl_dir-form" class="form-inline" style="display:none;">
+                <div class="form-group" id="validate-dl_dir">
+									<input type="text" class="form-control" id="new-dl_dir" placeholder="Type an absolute path">
+								</div>
+                <button id="apply-change-dl_dir" class="btn btn-default" type="button">Save</button>
+                <button id="cancel-change-dl_dir" type="button" class="btn btn-link">Cancel</button>
+								<p class="help-block" id="hintError-dl_dir">A valid directory cannot include spaces or any of these characters: . \ ? % * : | " " < ></p>
+              </form>
             </dd>
             {% endif %}
 
             {% if fstypes_defined %}
             <dt>
                 <span class="js-config-var-name js-config-var-managed-name">IMAGE_FSTYPES</span>
-                <i class="icon-question-sign get-help" title="Formats of root file system images that you want to have created <br /><a href='http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-IMAGE_FSTYPES' target='_blank'>Read more in the manual</a>"></i>
+                <span class="glyphicon glyphicon-question-sign get-help" title="Formats of root file system images that you want to create"></span>
             </dt>
-            <dd class="lead">
-                <span id="image_fstypes">{{fstypes}}</span>
-                <i class="icon-pencil" id="change-image_fstypes-icon"></i>
+            <dd class="variable-list">
+                <span class="lead" id="image_fstypes">{{fstypes}}</span>
+                <span class="glyphicon glyphicon-edit" id="change-image_fstypes-icon"></span>
                 <form id="change-image_fstypes-form" style="display:none;">
                     <label>Type the image types you want to build:</label>
-                    <div class="input-append" id="validate-image_fstypes">
-                        <input type="text" class="input-xlarge" id="new-imagefs_types">
-                        <button id="apply-change-image_fstypes" type="button" class="btn">Save</button>
+                    <div class="form-group" id="validate-image_fstypes">
+                        <input type="text" class="form-control "id="new-imagefs_types">
+                        <button id="apply-change-image_fstypes" type="button" class="btn btn-default">Save</button>
                         <button id="cancel-change-image_fstypes" type="button" class="btn btn-link">Cancel</button>
                     </div>
-                    <p class="help-block error" style="display:none;margin-top:10px;" id="hintError-image-fs_type">A valid image type cannot include underscores</p>
+                    <p class="help-block text-danger" id="hintError-image-fs_type">A valid image type cannot include underscores</p>
                     <label>Or choose from known image types:</label>
-                    <input id="filter-image_fstypes" type="text" placeholder="Search image types" class="span4">
-                    <div id="all-image_fstypes" class="scrolling">
-                    </div>
+                    <input id="filter-image_fstypes" type="text" placeholder="Search image types" class="form-control">
+                    <div id="all-image_fstypes" class="scrolling"></div>
                 </form>
             </dd>
             {% endif %}
@@ -80,21 +74,23 @@
             {% if image_install_append_defined %}
             <dt>
                 <span class="js-config-var-name js-config-var-managed-name">IMAGE_INSTALL_append</span>
-                <i class="icon-question-sign get-help" title="Specifies additional packages to install into an image. If your build creates more than one image, the packages will be installed in <strong>all of them</strong> <br /><a href='http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-IMAGE_INSTALL' target='_blank'>Read more in the manual</a>"></i>
+                <span class="glyphicon glyphicon-question-sign get-help" title="Specifies additional packages to install into an image. If your build creates more than one image, the packages will be installed in all of them"></span>
             </dt>
-            <dd class="lead">
-                <span id="image_install"{% if image_install_append %}{%else%} class="muted"{%endif%}>{% if image_install_append %}{{image_install_append}}{%else%}Not set{%endif%}</span>
-                <i class="icon-pencil" id="change-image_install-icon"></i>
-                <i class="icon-trash" id="delete-image_install-icon" {% if image_install_append %}{%else%}style="display:none;"{%endif%}></i>
-                <form id="change-image_install-form" style="display:none;">
-                    <div class="row">
-                        <span class="help-block col-md-4">To set IMAGE_INSTALL_append to more than one package, type the package names separated by a space.</span>
-                    </div>
-                    <div class="input-append">
-                        <input type="text" class="input-xlarge" id="new-image_install" placeholder="Type one or more package names">
-                        <button id="apply-change-image_install" class="btn" type="button">Save</button>
-                        <button id="cancel-change-image_install" type="button" class="btn btn-link">Cancel</button>
-                    </div>
+            <dd class="variable-list">
+						<span id="image_install" class="lead {% if not image_install_append %} text-muted {%endif%}">{% if image_install_append %}{{image_install_append}}{%else%}Not set{%endif%}</span>
+                <span class="glyphicon glyphicon-edit" id="change-image_install-icon"></span>
+                <span class="glyphicon glyphicon-trash" id="delete-image_install-icon" {% if image_install_append %}{%else%}style="display:none;"{%endif%}></span>
+                <form id="change-image_install-form" class="form-inline" style="display:none;">
+									<div class="row">
+										<div class="col-md-4">
+											<span class="help-block">To set IMAGE_INSTALL_append to more than one package, type the package names separated by a space.</span>
+										</div>
+									</div>
+                  <div class="form-group">
+										<input type="text" class="form-control" id="new-image_install" placeholder="Type one or more package names">
+									</div>
+									<button id="apply-change-image_install" class="btn btn-default" type="button">Save</button>
+                  <button id="cancel-change-image_install" type="button" class="btn btn-link">Cancel</button>  
                 </form>
             </dd>
             {% endif %}
@@ -102,35 +98,41 @@
             {% if package_classes_defined %}
             <dt>
                 <span class="js-config-var-name js-config-var-managed-name">PACKAGE_CLASSES</span>
-                <i class="icon-question-sign get-help" title="Specifies the package manager to use when packaging data <br /><a href='http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-PACKAGE_CLASSES' target='_blank'>Read more in the manual</a>"></i>
+                <span class="glyphicon glyphicon-question-sign get-help" title="Specifies the package manager to use when packaging data"></span>
             </dt>
-            <dd class="lead">
-                <span id="package_classes">{{package_classes}}</span>
-                <i id="change-package_classes-icon" class="icon-pencil"></i>
+            <dd class="variable-list">
+                <span class="lead" id="package_classes">{{package_classes}}</span>
+                <span id="change-package_classes-icon" class="glyphicon glyphicon-edit"></span>
                 <form id="change-package_classes-form" style="display:none;">
-                    <label>
+									<div class="form-group">
+										<label class="control-label">
                         Root file system package format
-                        <i class="icon-question-sign get-help" title="The package format used to generate the root file system. Options are <code>dev</code>, <code>ipk</code> and <code>rpm</code>"></i>
+                        <span class="glyphicon glyphicon-question-sign get-help" title="The package format used to generate the root file system. Options are <code>deb</code>, <code>ipk</code> and <code>rpm</code>"></i>
                     </label>
-                    <select id="package_classes-select">
+                    <select id="package_classes-select" class="form-control">
                         <option>package_deb</option>
                         <option>package_ipk</option>
                         <option>package_rpm</option>
                     </select>
-                    <label>
+									</div>
+									<div class="form-group">
+										<label class="control-label">
                         Additional package formats
-                        <i class="icon-question-sign get-help" title="Extra package formats to build"></i>
+                        <span class="glyphicon glyphicon-question-sign get-help" title="Extra package formats to build"></span>
                     </label>
-                    <label class="checkbox" id="package_class_1">
+										<div class="checkbox">
+											<label id="package_class_1">
                         <input type="checkbox" id="package_class_1_input"> package_deb
-                    </label>
-                    <label class="checkbox" id="package_class_2">
+											</label>
+										</div>
+										<div class="checkbox">
+											<label id="package_class_2">
                         <input type="checkbox" id="package_class_2_input"> package_ipk
-                    </label>
-                    <div style="padding-top:10px;">
-                        <button id="apply-change-package_classes" type="button" class="btn">Save</button>
-                        <button id="cancel-change-package_classes" type="button" class="btn btn-link">Cancel</button>
-                    </div>
+											</label>
+										</div>
+									</div>
+									<button id="apply-change-package_classes" type="button" class="btn btn-default">Save</button>
+                  <button id="cancel-change-package_classes" type="button" class="btn btn-link">Cancel</button>
                 </form>
             </dd>
             {% endif %}
@@ -138,22 +140,18 @@
             {% if sstate_dir_defined %}
             <dt>
                 <span class="js-config-var-name js-config-var-managed-name">SSTATE_DIR</span>
-                <i class="icon-question-sign get-help" title="Absolute path to the directory used to store shared state cache files. These files are reused across the builds, which makes the builds faster. By default, Toaster projects share the same cache directory.<br /><a href='http://www.yoctoproject.org/docs/2.1/ref-manual/ref-manual.html#var-SSTATE_DIR' target='_blank'>Read more in the manual</a>"></i>
+                <span class="glyphicon glyphicon-question-sign get-help" title="Absolute path to the directory used to store shared state cache files. These files are reused across the builds, which makes the builds faster. By default, Toaster projects share the same cache directory"></span>
             </dt>
-            <dd class="lead">
-                <span id="sstate_dir"{% if sstate_dir %}{%else%} class="muted"{%endif%}>{% if sstate_dir %}{{sstate_dir}}{%else%}Not set{%endif%}</span>
-                <i class="icon-pencil" id="change-sstate_dir-icon"></i>
-                <form id="change-sstate_dir-form" style="display:none;">
-                    <div class="row">
-                        <span class="help-block col-md-4">To set SSTATE_DIR type the absolute path of the download folder.</span>
-                    </div>
-                    <div class="input-append" id="validate-sstate_dir">
-                        <input type="text" class="input-xlarge" id="new-sstate_dir" placeholder="Type absolute path of the SSTATE_DIR folder">
-                        <span class="error">A valid directory name required</span>
-                        <button id="apply-change-sstate_dir" class="btn" type="button">Save</button>
-                        <button id="cancel-change-sstate_dir" type="button" class="btn btn-link">Cancel</button>
-			</br><p class="help-block error" id="hintError-sstate_dir">A valid directory cannot include spaces or any of these characters: . \ ? % * : | " " < ></span>
-                    </div>
+            <dd class="variable-list">
+                <span id="sstate_dir" class="lead {% if not sstate_dir %} text-muted {% endif %}">{% if sstate_dir %}{{sstate_dir}}{%else%}Not set{%endif%}</span>
+                <span class="glyphicon glyphicon-edit" id="change-sstate_dir-icon"></span>
+                <form class="form-inline" id="change-sstate_dir-form" style="display:none;">
+                    <div class="form-group" id="validate-sstate_dir">
+                      <input type="text" class="form-control" id="new-sstate_dir" placeholder="Type an absolute path">
+										</div>
+                    <button id="apply-change-sstate_dir" class="btn btn-default" type="button">Save</button>
+                    <button id="cancel-change-sstate_dir" type="button" class="btn btn-link">Cancel</button>
+										<p class="help-block" id="hintError-sstate_dir">A valid directory cannot include spaces or any of these characters: . \ ? % * : | " " < ></p>
                 </form>
             </dd>
             {% endif %}
@@ -175,46 +173,47 @@
             <input type="hidden" class="js-config-managed-name" value="{{b}}">
         {% endfor %}
 
-        <div class="row">
-          <form id="variable-form">
-            <fieldset style="padding-left:0px;">
-                <legend>Add variable</legend>
-                <div class="col-md-3" style="margin-left:0px;">
-                    <span  id="add-configvar-name-div" class="control-group">
-                      <label>
-                        Variable
-                        <i title="" class="icon-question-sign get-help"
-                           data-original-title="Variable names are case sensitive,
-                           cannot have spaces, and can only include letters, numbers, underscores
-                           and dashes"></i>
-                      </label>
-                      <input type="text" placeholder="Type variable name" id="variable">
-                      <span class="help-block error" id="new-variable-error-message"></span>
-                    </span>
-                    <label>Value</label>
-                    <input id="value" type="text" placeholder="Type variable value"><p>
-                    <div>
-                        <button id="add-configvar-button" class="btn save" type="button" disabled>Add variable</button>
-                    </div>
-                </div>
-                <div class="col-md-5 help-block">
-                    <h5>Some variables are reserved from Toaster</h5>
-                    <p>Toaster cannot set any variables that impact 1) the configuration of the build servers,
-                    or 2) where artifacts produced by the build are stored. Such variables include: </p>
-                    <p>
-                    <code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-BB_DISKMON_DIRS" target="_blank">BB_DISKMON_DIRS</a></code>
-                    <code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-BB_NUMBER_THREADS" target="_blank">BB_NUMBER_THREADS</a></code>
-                    <code>CVS_PROXY_HOST</code>
-                    <code>CVS_PROXY_PORT</code>
-                    <code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-PARALLEL_MAKE" target="_blank">PARALLEL_MAKE</a></code>
-                    <code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-SSTATE_MIRRORS" target="_blank">SSTATE_MIRRORS</a></code>
-                    <code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-TMPDIR" target="_blank">TMPDIR</a></code></p>
-                    <p>Plus the following standard shell environment variables:</p>
-                    <p><code>http_proxy</code> <code>ftp_proxy</code> <code>https_proxy</code> <code>all_proxy</code></p>
-                </div>
-            </fieldset>
-          </form>
-        </div>
+				<form id="variable-form">
+					<fieldset>
+						<legend>Add variable</legend>
+						<div class="row">
+							<div class="col-md-3">
+								<div id="add-configvar-name-div" class="form-group">
+									<label class="control-label">
+										Variable
+										<span class="glyphicon glyphicon-question-sign get-help"
+											title="Variable names are case sensitive,
+											cannot have spaces, and can only include letters, numbers, underscores
+											and dashes"></span>
+									</label>
+									<input type="text" class="form-control" placeholder="Type the variable name" id="variable">
+								</div>
+								<p class="help-block" id="new-variable-error-message"></p>
+								<div class="form-group">
+									<label clas="control-label">Value</label>
+									<input id="value" type="text" class="form-control" placeholder="Type the variable value">
+								</div>
+								<button id="add-configvar-button" class="btn btn-default save" type="button" disabled>Add variable</button>
+							</div>
+							<div class="col-md-5 help-block">
+								<h5>Some variables cannot be set from Toaster</h5>
+								<p>Toaster cannot set any variables that impact 1) the configuration of the build servers,
+								or 2) where artifacts produced by the build are stored. Such variables include: </p>
+								<p>
+								<code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-BB_DISKMON_DIRS" target="_blank">BB_DISKMON_DIRS</a></code>
+								<code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-BB_NUMBER_THREADS" target="_blank">BB_NUMBER_THREADS</a></code>
+								<code>CVS_PROXY_HOST</code>
+								<code>CVS_PROXY_PORT</code>
+								<code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-PARALLEL_MAKE" target="_blank">PARALLEL_MAKE</a></code>
+								<code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-SSTATE_MIRRORS" target="_blank">SSTATE_MIRRORS</a></code>
+								<code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-TMPDIR" target="_blank">TMPDIR</a></code></p>
+								<p>Plus the following standard shell environment variables:</p>
+								<p><code>http_proxy</code> <code>ftp_proxy</code> <code>https_proxy</code> <code>all_proxy</code></p>
+							</div>
+						</div>
+					</fieldset>
+				</form>
+      </div>
 
     </div>
 
@@ -235,7 +234,7 @@
             var existing_configvars = document.getElementsByClassName('js-config-var-name');
             for (var i = 0, length = existing_configvars.length; i < length; i++) {
                 if (existing_configvars[i].innerHTML.toUpperCase() == variable.toUpperCase()) {
-                    error_msg = "This variable is already set in this page, edit its value instead";
+                    error_msg = "This variable is already set in this page. Edit its value instead";
                 }
             }
 
@@ -270,9 +269,8 @@
                 $(".save").attr("disabled","disabled");
 
                 // add one (and only one) error class append
-                var d = document.getElementById("add-configvar-name-div");
-                d.className = d.className.replace(" error","");
-                d.className = d.className + " error";
+								$("#add-configvar-name-div").addClass("has-error");
+								$("#new-variable-error-message").addClass("text-danger");
 
                 return false;
             } else if (0 == variable.length) {
@@ -280,8 +278,7 @@
                 return false;
             }
 
-            var d = document.getElementById("add-configvar-name-div");
-            d.className = d.className.replace(" error","");
+						$("#add-configvar-name-div").removeClass("has-error");
 
             // now set the "Save" enablement if 'value' also passes
             if (value.trim().length > 0) {
@@ -314,19 +311,34 @@
                 $("#apply-change-distro").attr("disabled","disabled");
 
                 // add one (and only one) error class append
-                var d = document.getElementById("edit-distro-name-div");
-                d.className = d.className.replace(" error","");
-                d.className = d.className + " error";
+                $("#change-distro-form").addClass("has-error");
 
                 return false;
             }
 
-            var d = document.getElementById("edit-distro-name-div");
-            d.className = d.className.replace(" error","");
+						$("#change-distro-form").removeClass("has-error");
             $("#apply-change-distro").removeAttr("disabled");
             return true;
         }
 
+        // Test to insure at least one FS Type is checked
+        function enableFsTypesSave() {
+            var any_checked = 0;
+            $(".fs-checkbox-fstypes:checked").each(function(){
+                any_checked = 1;
+            });
+            if ( 0 == any_checked ) {
+                $("#apply-change-image_fstypes").attr("disabled","disabled");
+								$('.scrolling').addClass('has-error');
+                $('#fstypes-error-message').show();
+            }
+            else {
+                $("#apply-change-image_fstypes").removeAttr("disabled");
+								$('.scrolling').removeClass('has-error');
+                $('#fstypes-error-message').hide();
+            }
+        }
+
         // Preset or reset the Package Class checkbox labels
         function updatePackageClassCheckboxes() {
             $('#package_class_1, #package_class_2').hide();
@@ -350,26 +362,36 @@
 
             // change variable value
             $('.js-icon-pencil-config_var').click(function (evt) {
-                var pk = evt.target.attributes["x-data"].value;
-                var current_val = $("span#config_var_value_"+pk).text();
-                $('.js-icon-pencil-config_var, .js-icon-trash-config_var, #config_var_value_'+pk).hide();
-                $("#change-config_var-form_"+pk).slideDown();
-                $("input#new-config_var_"+pk).val(current_val);
+                var pk = $(this).attr("x-data");
+                var current_val = $("#config_var_value_"+pk).text();
+                $("#config_var_value_"+pk).hide();
+								$("#config_var_trash_"+pk).hide();
+								$(".js-icon-pencil-config_var[x-data="+pk+"]").hide();
+								$("#change-config_var-form_"+pk).slideDown();
+                $("#new-config_var_"+pk).val(current_val);
+								if ( $("#new-config_var_"+pk).val().length ) {
+									$("#apply-change-config_var_"+pk).removeAttr("disabled");
+								} 
+								else { 
+									$("#apply-change-config_var_"+pk).attr("disabled");
+								}
             });
 
             $('.js-cancel-change-config_var').click(function (evt) {
                 var pk = evt.target.attributes["x-data"].value;
                 $("#change-config_var-form_"+pk).slideUp(function() {
-                    $('.js-icon-pencil-config_var, .js-icon-trash-config_var, #config_var_value_'+pk).show();
+										$("#config_var_trash_"+pk).show();
+                    $('#config_var_value_'+pk).show();
+										$(".js-icon-pencil-config_var[x-data="+pk+"]").show();
                 });
             });
 
             $(".js-new-config_var").on('input', function(){
                 if ($(this).val().length == 0) {
-                    $(".js-apply-change-config_var").attr("disabled","disabled");
+                    $(this).parent("div").next(".btn-default").attr("disabled","disabled");
                 }
                 else {
-                    $(".js-apply-change-config_var").removeAttr("disabled");
+                    $(this).parent("div").next(".btn-default").removeAttr("disabled");
                 }
             });
 
@@ -379,25 +401,22 @@
                 var variable = xdata[1];
                 var val      = $('#new-config_var_'+pk).val();
                 postEditAjaxRequest({"configvarChange" : variable+':'+val});
-                $('#config_var_value_'+pk).parent().removeClass('muted');
-                $("#change-config_var-form_"+pk).slideUp(function() {
-                    $('.js-icon-pencil-config_var, .js-icon-trash-config_var, #config_var_value_'+pk).show();
-                });
+                $("#change-config_var-form_"+pk).slideUp();
+								$("#config_var_trash_"+pk).fadeIn();
+                $('#config_var_value_'+pk).fadeIn();
+								$(".js-icon-pencil-config_var[x-data="+pk+"]").fadeIn();
             });
 
             // delete variable
             $(".js-icon-trash-config_var").click(function (evt) {
-                var xdata    = evt.target.attributes["x-data"].value.split(":");
-                var pk       = xdata[0];
-
-                // hide the dangling trash tooltip
-                $('#config_var_trash_'+pk).hide();
-
+								var pk = $(this).attr("x-data");
+                
                 // fade out the variable+value div, then refresh the variable list
-                $('#config_var_entry_'+pk).parent().parent().fadeOut(1000, function(){
-                     postEditAjaxRequest({"configvarDel": evt.target.attributes["x-data"].value});
-                });
-
+								$(this).fadeOut(); 
+								$(this).tooltip("hide");
+								$("config_var_entry_"+pk).fadeOut();
+								$('#config_var_value_'+pk).parent("dd").fadeOut();
+								postEditAjaxRequest({"configvarDel": evt.target.attributes["x-data"].value});
             });
 
         }
@@ -420,18 +439,17 @@
                     }
                 }
                 if (var_context == undefined) {
-                    orightml += '<div> <dt><span id="config_var_entry_'+configvars_sorted[i][2]+'" class="js-config-var-name"></span><i class="icon-trash js-icon-trash-config_var" id="config_var_trash_'+configvars_sorted[i][2]+'" x-data="'+configvars_sorted[i][2]+'"></i> </dt>'
-                    orightml += '<dd class="lead">'
-                    orightml += '    <span id="config_var_value_'+configvars_sorted[i][2]+'"></span>'
-                    orightml += '    <i class="icon-pencil js-icon-pencil-config_var" x-data="'+configvars_sorted[i][2]+'"></i>'
-                    orightml += '    <form id="change-config_var-form_'+configvars_sorted[i][2]+'" style="display:none;">'
-                    orightml += '        <div class="input-append">'
-                    orightml += '            <input type="text" class="input-xlarge js-new-config_var" id="new-config_var_'+configvars_sorted[i][2]+'" value="">'
-                    orightml += '            <button class="btn js-apply-change-config_var" type="button" x-data="'+configvars_sorted[i][2]+':'+configvars_sorted[i][0]+'" disabled>Save</button>'
+                    orightml += '<dt><span id="config_var_entry_'+configvars_sorted[i][2]+'" class="js-config-var-name"></span><span class="glyphicon glyphicon-trash js-icon-trash-config_var" id="config_var_trash_'+configvars_sorted[i][2]+'" x-data="'+configvars_sorted[i][2]+'"></span> </dt>'
+                    orightml += '<dd class="variable-list">'
+                    orightml += '    <span class="lead" id="config_var_value_'+configvars_sorted[i][2]+'"></span>'
+										orightml += '    <span class="glyphicon glyphicon-edit js-icon-pencil-config_var" x-data="'+configvars_sorted[i][2]+'"></span>'
+                    orightml += '    <form class="form-inline" id="change-config_var-form_'+configvars_sorted[i][2]+'" style="display:none;">'
+                    orightml += '        <div class="form-group">'
+										orightml += '            <input type="text" class="form-control js-new-config_var" id="new-config_var_'+configvars_sorted[i][2]+'" value=""></div>'
+                    orightml += '            <button id="apply-change-config_var_'+configvars_sorted[i][2]+'" class="btn btn-default js-apply-change-config_var" type="button" x-data="'+configvars_sorted[i][2]+':'+configvars_sorted[i][0]+'" disabled>Save</button>'
                     orightml += '            <button type="button" class="btn btn-link js-cancel-change-config_var" x-data="'+configvars_sorted[i][2]+'">Cancel</button>'
-                    orightml += '        </div>'
                     orightml += '    </form>'
-                    orightml += '</dd> </div>'
+                    orightml += '</dd>'
                 }
             }
 
@@ -453,7 +471,7 @@
         }
 
         function onEditAjaxSuccess(data, textstatus) {
-            // console.log("XHR returned:", data, "(" + textstatus + ")");
+            console.log("XHR returned:", data, "(" + textstatus + ")");
             if (data.error != "ok") {
                 alert("error on request:\n" + data.error);
                 return;
@@ -504,6 +522,7 @@
                 $('#change-distro-icon, #distro').hide();
                 $("#change-distro-form").slideDown();
                 $("#new-distro").val( $('#distro').text() );
+								$("#apply-change-distro").removeAttr("disabled");
             });
 
             $('#cancel-change-distro').click(function(){
@@ -512,8 +531,7 @@
 
                     // reset any dangling error state
                     $('#distro-error-message').text("");
-                    var d = document.getElementById("edit-distro-name-div");
-                    d.className = d.className.replace(" error","");
+										$("#change-distro-form").removeClass("has-error");
                 });
             });
 
@@ -538,13 +556,21 @@
             // change DL_DIR variable
             $('#change-dl_dir-icon').click(function() {
                 $('#hintError-dl_dir').hide();
-	        // preset the edit value
-                var current_val = $("span#dl_dir").text().trim();
+								$('#change-dl_dir-form').removeClass('has-error');
+								// preset the edit value
+                var current_val = $("#dl_dir").text().trim();
                 if (current_val == "Not set") {
                     current_val="";
                     $("#apply-change-dl_dir").attr("disabled","disabled");
                 }
                 $("input#new-dl_dir").val(current_val);
+								// enable / disable the save button based on the input value
+								if ( current_val.length ) {
+									$("#apply-change-dl_dir").removeAttr("disabled");
+								}
+								else {
+									$("#apply-change-dl_dir").attr("disabled","disabled");
+								}
 
                 $('#change-dl_dir-icon, #dl_dir').hide();
                 $("#change-dl_dir-form").slideDown();
@@ -566,11 +592,11 @@
 	            var invalidDir = re.test(input.val());
 		    console.log(invalidDir);
                     if ( invalidDir ) {
-                        $('#validate-dl_dir').removeClass('control-group error');
+                        $('#change-dl_dir-form').removeClass('has-error');
 			$("#apply-change-dl_dir").removeAttr("disabled");
                         $('#hintError-dl_dir').hide();
                     } else {
-                        $('#validate-dl_dir').addClass('control-group error');
+                        $('#change-dl_dir-form').addClass('has-error');
 			$("#apply-change-dl_dir").attr("disabled","disabled");
                         $('#hintError-dl_dir').show();
                     }
@@ -643,18 +669,18 @@
                 if ("  " != fstypes) {
                     for (var i = 0, length = fstypes_list.length; i < length; i++) {
                         if (0 <= fstypes.indexOf(" "+fstypes_list[i].value+" ")) {
-                             html += '<label class="checkbox"><input type="checkbox" class="fs-checkbox-fstypes" value="'+fstypes_list[i].value+'" checked="checked">'+fstypes_list[i].value+'</label>\n';
+												html += '<div class="checkbox"><label><input type="checkbox" class="fs-checkbox-fstypes" value="'+fstypes_list[i].value+'" checked="checked">'+fstypes_list[i].value+'</label></div>';
                         }
                     }
                 }
                 // Add the un-checked boxes second
                 for (var i = 0, length = fstypes_list.length; i < length; i++) {
                     if (0  > fstypes.indexOf(" "+fstypes_list[i].value+" ")) {
-                        html += '<label class="checkbox"><input type="checkbox" class="fs-checkbox-fstypes" value="'+fstypes_list[i].value+'">'+fstypes_list[i].value+'</label>\n';
+										html += '<div class="checkbox"><label><input type="checkbox" class="fs-checkbox-fstypes" value="'+fstypes_list[i].value+'">'+fstypes_list[i].value+'</label></div>';
                     }
                 }
                 // Add the 'no search matches' line last
-                html += '<label id="no-match-fstypes">No image types found</label>\n';
+                html += '<label id="no-match-fstypes" class="text-muted">No image types found</label>\n';
                 // Display the list
                 document.getElementById("all-image_fstypes").innerHTML = html;
                 $('#no-match-fstypes').hide();
@@ -741,6 +767,7 @@
                 } else {
                     // insure these non-empty values have single space prefix
                     current_val=" " + current_val;
+										$("#apply-change-image_install").removeAttr("disabled");
                 }
                 $("input#new-image_install").val(current_val);
 
@@ -772,7 +799,7 @@
                 var value = " " + $('#new-image_install').val().trim();
                 postEditAjaxRequest({"configvarChange" : 'IMAGE_INSTALL_append:'+value});
                 $('#image_install').text(value);
-                $('#image_install').removeClass('muted');
+                $('#image_install').removeClass('text-muted');
                 $("#change-image_install-form").slideUp(function () {
                     $('#image_install, #change-image_install-icon').show();
                     if (value.length > -1) {
@@ -787,7 +814,7 @@
                 $(this).tooltip('hide');
                 postEditAjaxRequest({"configvarChange" : 'IMAGE_INSTALL_append:'+''});
                 $('#image_install').parent().fadeOut(1000, function(){
-                    $('#image_install').addClass('muted');
+                    $('#image_install').addClass('text-muted');
                     $('#image_install').text('Not set');
                     $('#delete-image_install-icon').hide();
                     $('#image_install').parent().fadeIn(1000);
@@ -888,6 +915,14 @@
                     $("#apply-change-sstate_dir").attr("disabled","disabled");
                 }
                 $("input#new-sstate_dir").val(current_val);
+								
+								// enable / disable the save button based on the input value
+								if ( current_val.length ) {
+									$("#apply-change-sstate_dir").removeAttr("disabled");
+								}
+								else {
+									$("#apply-change-sstate_dir").attr("disabled","disabled");
+								}
 
                 $('#change-sstate_dir-icon, #sstate_dir').hide();
                 $("#change-sstate_dir-form").slideDown();
@@ -909,11 +944,11 @@
 	            var invalidDir = re.test(input.val());
 		    console.log(invalidDir);
                     if ( invalidDir ) {
-                        $('#validate-sstate_dir').removeClass('control-group error');
+                        $('#change-sstate_dir-form').removeClass('has-error');
 			$("#apply-change-sstate_dir").removeAttr("disabled");
                         $('#hintError-sstate_dir').hide();
                     } else {
-                        $('#validate-sstate_dir').addClass('control-group error');
+                        $('#change-sstate_dir-form').addClass('has-error');
 			$("#apply-change-sstate_dir").attr("disabled","disabled");
                         $('#hintError-sstate_dir').show();
                     }
@@ -924,7 +959,7 @@
                 var value = $('#new-sstate_dir').val().trim();
                 postEditAjaxRequest({"configvarChange" : 'SSTATE_DIR:'+value});
                 $('#sstate_dir').text(value);
-                $('#sstate_dir').removeClass('muted');
+                $('#sstate_dir').removeClass('text-muted');
                 $("#change-sstate_dir-form").slideUp(function () {
                     $('#sstate_dir, #change-sstate_dir-icon').show();
                });
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 095/106] toaster: recent builds Consistent rebuild links
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (91 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 094/106] toaster: bb variables BitBake variables page to Bootstrap 3 Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 096/106] toaster: filters Filter modals to Bootstrap 3 Belen Barros Pena
                   ` (10 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Make sure the 'rebuild' option looks like all other clickable options
inside the build outcome alerts.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/templates/mrb_section.html | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/mrb_section.html b/bitbake/lib/toaster/toastergui/templates/mrb_section.html
index 100f680..b1252a1 100644
--- a/bitbake/lib/toaster/toastergui/templates/mrb_section.html
+++ b/bitbake/lib/toaster/toastergui/templates/mrb_section.html
@@ -117,7 +117,7 @@
                   " title="Builds in this project cannot be started from Toaster: they are started from the command line">
                   </span>
               {% else %}
-                  <a href="#" class="run-again-btn
+                  <a href="#" class="run-again-btn alert-link
                       {% if build.outcome == build.SUCCEEDED %}
                           success
                       {% elif build.outcome == build.FAILED %}
@@ -165,7 +165,7 @@
       Build cancelled
     </div>
     <div class="col-md-3">
-      <a href="#" class="info pull-right run-again-btn"
+      <a href="#" class="info pull-right run-again-btn alert-link"
         data-request-url="{% url 'xhr_buildrequest' build.project.pk %}"
         data-target='{{build.target_set.all|get_tasks|json}}'>
         <span class="glyphicon glyphicon-repeat"></span>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 096/106] toaster: filters Filter modals to Bootstrap 3
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (92 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 095/106] toaster: recent builds Consistent rebuild links Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 097/106] toaster: latest builds Style cancel option Belen Barros Pena
                   ` (9 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Style the content of the filter modal dialogs so that is displays
properly with Bootstrap 3.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../lib/toaster/toastergui/static/css/default.css  |  5 +++++
 bitbake/lib/toaster/toastergui/static/js/table.js  | 25 +++++++++++-----------
 2 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index 37aec66..981abb1 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -226,3 +226,8 @@ code { color: #333; background-color: transparent; }
 
 /* Style the special no results message in the custom image details page */
 [id^="no-results-special-"] > .alert-warning > ol { margin-top: 10px; }
+
+/* Style the content of modal dialogs */
+.modal-footer { text-align: left; }
+.date-filter-controls { margin-top: 10px; }
+.date-filter-controls span { margin: 0 10px; }
diff --git a/bitbake/lib/toaster/toastergui/static/js/table.js b/bitbake/lib/toaster/toastergui/static/js/table.js
index 6888c71..163746e 100644
--- a/bitbake/lib/toaster/toastergui/static/js/table.js
+++ b/bitbake/lib/toaster/toastergui/static/js/table.js
@@ -407,6 +407,9 @@ function tableInit(ctx){
     var hasNoRecords = (Number(filterActionData.count) == 0);
 
     var actionStr = '<div class="radio">' +
+										'<label class="filter-title' +
+										(hasNoRecords ? ' text-muted' : '') + '"' +
+										'       for="' + filterName + '">' +
                     '<input type="radio" name="filter"' +
                     '       value="' + filterName + '"';
 
@@ -417,11 +420,8 @@ function tableInit(ctx){
     actionStr += ' id="' + filterName + '">' +
                  '<input type="hidden" name="filter_value" value="on"' +
                  '       data-value-for="' + filterName + '">' +
-                 '<label class="filter-title' +
-                 (hasNoRecords ? ' muted' : '') + '"' +
-                 '       for="' + filterName + '">' +
-                 filterActionData.title +
-                 ' (' + filterActionData.count + ')' +
+								 filterActionData.title +
+								 ' (' + filterActionData.count + ')' +
                  '</label>' +
                  '</div>';
 
@@ -457,22 +457,23 @@ function tableInit(ctx){
    */
   function createActionDateRange(filterName, filterValue, filterActionData) {
     var action = $('<div class="radio">' +
+                   '<label class="filter-title"' +
+                   '       for="' + filterName + '">' +
                    '<input type="radio" name="filter"' +
                    '       value="' + filterName + '" ' +
                    '       id="' + filterName + '">' +
                    '<input type="hidden" name="filter_value" value=""' +
                    '       data-value-for="' + filterName + '">' +
-                   '<label class="filter-title"' +
-                   '       for="' + filterName + '">' +
                    filterActionData.title +
                    '</label>' +
-                   '<input type="text" maxlength="10" class="input-sm"' +
+									 '<div class="form-inline form-group date-filter-controls">' +
+                   '<input type="text" maxlength="10" class="form-control"' +
                    '       data-date-from-for="' + filterName + '">' +
-                   '<span class="help-inline">to</span>' +
-                   '<input type="text" maxlength="10" class="input-sm"' +
+                   '<span>to</span>' +
+                   '<input type="text" maxlength="10" class="form-control"' +
                    '       data-date-to-for="' + filterName + '">' +
                    '<span class="help-inline get-help">(yyyy-mm-dd)</span>' +
-                   '</div>');
+                   '</div></div>');
 
     var radio = action.find('[type="radio"]');
     var value = action.find('[data-value-for]');
@@ -654,7 +655,7 @@ function tableInit(ctx){
             if (action) {
               // Setup the current selected filter; default to 'all' if
               // no current filter selected
-              var radioInput = action.children('input[name="filter"]');
+              var radioInput = action.find('input[name="filter"]');
               if ((tableParams.filter &&
                   tableParams.filter === radioInput.val()) ||
                   filterActionData.action_name == 'all') {
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 097/106] toaster: latest builds Style cancel option
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (93 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 096/106] toaster: filters Filter modals to Bootstrap 3 Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 098/106] toaster: custom image modals Move to Bootstrap 3 Belen Barros Pena
                   ` (8 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Make sure the 'cancel' option for builds in progress looks like all
other clickable elements in the build notification alerts.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/templates/mrb_section.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/mrb_section.html b/bitbake/lib/toaster/toastergui/templates/mrb_section.html
index b1252a1..fd4da64 100644
--- a/bitbake/lib/toaster/toastergui/templates/mrb_section.html
+++ b/bitbake/lib/toaster/toastergui/templates/mrb_section.html
@@ -149,7 +149,7 @@
     {% if build.project.is_default %}
     <span class="glyphicon glyphicon-question-sign get-help get-help-blue pull-right" title="Builds in this project cannot be cancelled from Toaster: they can only be cancelled from the command line"></span>
     {% else %}
-      <a href="#" class="cancel-build-btn pull-right"
+      <a href="#" class="cancel-build-btn pull-right alert-link"
           data-buildrequest-id={{build.buildrequest.pk}}
           data-request-url="{% url 'xhr_buildrequest' build.project.pk %}" >
         <span class="glyphicon glyphicon-remove-circle"></span>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 098/106] toaster: custom image modals Move to Bootstrap 3
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (94 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 097/106] toaster: latest builds Style cancel option Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 099/106] toaster: modals Package dependencies modals " Belen Barros Pena
                   ` (7 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=yes, Size: 10016 bytes --]

Move the modals we use to create new image recipes and edit existing
ones to Bootstrap 3.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../toastergui/static/js/newcustomimage_modal.js   | 46 ++++++++++----
 .../templates/editcustomimage_modal.html           | 71 ++++++++++++++--------
 .../toastergui/templates/newcustomimage_modal.html | 21 ++++---
 3 files changed, 89 insertions(+), 49 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/js/newcustomimage_modal.js b/bitbake/lib/toaster/toastergui/static/js/newcustomimage_modal.js
index cb9ed4d..18f85c9 100644
--- a/bitbake/lib/toaster/toastergui/static/js/newcustomimage_modal.js
+++ b/bitbake/lib/toaster/toastergui/static/js/newcustomimage_modal.js
@@ -22,14 +22,17 @@ function newCustomImageModalInit(){
   var nameInput = imgCustomModal.find('input');
 
   var invalidNameMsg = "Image names cannot contain spaces or capital letters. The only allowed special character is dash (-).";
-  var duplicateNameMsg = "A recipe with this name already exists. Image names must be unique.";
+  var duplicateNameMsg = "An image with this name already exists. Image names must be unique.";
   var duplicateImageInProjectMsg = "An image with this name already exists in this project."
   var invalidBaseRecipeIdMsg = "Please select an image to customise.";
-
-  // capture clicks on radio buttons inside the modal; when one is selected,
-  // set the recipe on the modal
+	
+	// capture clicks on radio buttons inside the modal; when one is selected,
+	// set the recipe on the modal
   imgCustomModal.on("click", "[name='select-image']", function (e) {
     clearRecipeError();
+		$(".radio").each(function(){
+			$(this).removeClass("has-error");
+		});
 
     var recipeId = $(e.target).attr('data-recipe');
     imgCustomModal.data('recipe', recipeId);
@@ -42,6 +45,9 @@ function newCustomImageModalInit(){
 
     if (!baseRecipeId) {
       showRecipeError(invalidBaseRecipeIdMsg);
+			$(".radio").each(function(){
+				$(this).addClass("has-error");
+			});
       return;
     }
 
@@ -71,7 +77,7 @@ function newCustomImageModalInit(){
   function showNameError(text){
     invalidNameHelp.text(text);
     invalidNameHelp.show();
-    nameInput.parent().addClass('error');
+    nameInput.parent().addClass('has-error');
   }
 
   function showRecipeError(text){
@@ -92,11 +98,11 @@ function newCustomImageModalInit(){
     if (nameInput.val().search(/[^a-z|0-9|-]/) != -1){
       showNameError(invalidNameMsg);
       newCustomImgBtn.prop("disabled", true);
-      nameInput.parent().addClass('error');
+      nameInput.parent().addClass('has-error');
     } else {
       invalidNameHelp.hide();
       newCustomImgBtn.prop("disabled", false);
-      nameInput.parent().removeClass('error');
+      nameInput.parent().removeClass('has-error');
     }
   });
 }
@@ -134,15 +140,29 @@ function newCustomImageModalSetRecipes(baseRecipes) {
     for (var i = 0; i < baseRecipes.length; i++) {
       var recipe = baseRecipes[i];
       imageSelectRadiosContainer.append(
-        '<label class="radio" data-role="image-radio">' +
-        recipe.name +
-        '<input type="radio" class="form-control" name="select-image" ' +
+        '<div class="radio"><label data-role="image-radio">' +
+        '<input type="radio" name="select-image" ' +
         'data-recipe="' + recipe.id + '">' +
-        '</label>'
+        recipe.name +
+        '</label></div>'
       );
     }
 
-    // show the radio button container
+		// select the first radio button as default selection. Radio button
+		// groups should always display with an option checked		
+		imageSelectRadiosContainer.find("input:radio:first").attr("checked", "checked");
+
+		// check which radio button is selected by default inside the modal,
+		// and set the recipe on the modal accordingly
+		imageSelectRadiosContainer.find("input:radio").each(function(){
+			if ( $(this).is(":checked") ) {
+				var recipeId = $(this).attr("data-recipe");
+				imgCustomModal.data("recipe", recipeId);
+			}
+		}); 
+    
+		// show the radio button container
     imageSelector.show();
-  }
+	 
+  }	
 }
diff --git a/bitbake/lib/toaster/toastergui/templates/editcustomimage_modal.html b/bitbake/lib/toaster/toastergui/templates/editcustomimage_modal.html
index 8046c08..0f53fb3 100644
--- a/bitbake/lib/toaster/toastergui/templates/editcustomimage_modal.html
+++ b/bitbake/lib/toaster/toastergui/templates/editcustomimage_modal.html
@@ -6,33 +6,37 @@ choose which one to edit
 required context:
   build - a Build object
 -->
-<div class="modal hide fade in" aria-hidden="false" id="edit-custom-image-modal">
-  <div class="modal-header">
-    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
-    <h3>Which image do you want to edit?</h3>
-  </div>
+<div class="modal fade" aria-hidden="false" id="edit-custom-image-modal">
+	<div class="modal-dialog">
+		<div class="modal-content">
+			<div class="modal-header">
+				<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+				<h3>Which image do you want to edit?</h3>
+			</div>
 
-  <div class="modal-body">
-    <div class="row-fluid">
-      {% for recipe in build.get_custom_image_recipes %}
-        <label class="radio">
-          {{recipe.name}}
-          <input type="radio" class="form-control" name="select-custom-image"
-                 data-url="{% url 'customrecipe' build.project.id recipe.id %}">
-        </label>
-      {% endfor %}
-    </div>
-    <span class="help-block error" id="invalid-custom-image-help" style="display:none">
-      Please select a custom image to edit.
-    </span>
-  </div>
+			<div class="modal-body">
+				{% for recipe in build.get_custom_image_recipes %}
+				<div class="radio">
+					<label>
+						<input type="radio" name="select-custom-image"
+						data-url="{% url 'customrecipe' build.project.id recipe.id %}">
+						{{recipe.name}}
+					</label>
+				</div>
+				{% endfor %}
+				<span class="help-block text-danger" id="invalid-custom-image-help" style="display:none">
+					Please select a custom image to edit.
+				</span>
+			</div>
 
-  <div class="modal-footer">
-    <button class="btn btn-primary btn-large" data-url="#"
-       data-action="edit-custom-image" disabled>
-      Edit custom image
-    </button>
-  </div>
+			<div class="modal-footer">
+				<button class="btn btn-primary btn-lg" data-url="#"
+					data-action="edit-custom-image" disabled>
+					Edit custom image
+				</button>
+			</div>
+		</div>	
+	</div>
 </div>
 
 <script>
@@ -46,7 +50,7 @@ $(document).ready(function () {
     return $('[name="select-custom-image"]:checked');
   };
 
-  radios.change(function () {
+  function enableSubmit() {
     if (getSelectedRadios().length === 1) {
       editCustomImageButton.removeAttr('disabled');
       error.hide();
@@ -55,7 +59,15 @@ $(document).ready(function () {
       editCustomImageButton.attr('disabled', 'disabled');
       error.show();
     }
-  });
+  };
+
+	$("#edit-custom-image-modal").on("shown.bs.modal", function() {
+		enableSubmit();
+	});
+  
+	radios.change(function () {
+		enableSubmit();
+	});
 
   editCustomImageButton.click(function () {
     var selectedRadios = getSelectedRadios();
@@ -67,5 +79,10 @@ $(document).ready(function () {
       error.show();
     }
   });
+
+	// Select the first custom image listed. Radio button groups
+	// should always have an option selected by default
+	$("input:radio:first").attr("checked", "checked");
+
 });
 </script>
diff --git a/bitbake/lib/toaster/toastergui/templates/newcustomimage_modal.html b/bitbake/lib/toaster/toastergui/templates/newcustomimage_modal.html
index 2fb5396..334f36d 100644
--- a/bitbake/lib/toaster/toastergui/templates/newcustomimage_modal.html
+++ b/bitbake/lib/toaster/toastergui/templates/newcustomimage_modal.html
@@ -28,24 +28,27 @@
     -->
         <div data-role="image-selector" style="display:none;">
           <h4>Which image do you want to customise?</h4>
+          <span class="help-block text-danger" id="invalid-recipe-help" style="display:none"></span>
           <div data-role="image-selector-radios"></div>
-          <span class="help-block error" id="invalid-recipe-help" style="display:none"></span>
           <div class="air"></div>
         </div>
 
         <h4>Name your custom image</h4>
 
         <div class="row">
-          <span class="help-block col-md-8">Image names must be unique. They should not contain spaces or capital letters, and the only allowed special character is dash (-).<p></p>
-        </span></div>
-        <div class="control-group controls">
-          <input type="text" class="huge" placeholder="Type the custom image name" required>
-          <span class="help-block error" id="invalid-name-help" style="display:none"></span>
-        </div>
-      </div>
+					<div class="col-md-10">
+						<p class="help-block">Image names must be unique. They should not contain spaces or capital letters, and the only allowed special character is dash (-).
+						</p>
+						<div class="form-group">
+						<input type="text" class="form-control input-lg" placeholder="Type the custom image name" required>
+					</div>
+						<span class="help-block text-danger" id="invalid-name-help" style="display:none"></span>
+					</div>
+				</div>
+			</div>
 
       <div class="modal-footer">
-        <button id="create-new-custom-image-btn" class="btn btn-primary btn-large" data-original-title="" title="" disabled>Create custom image</button>
+        <button id="create-new-custom-image-btn" class="btn btn-primary btn-lg" data-original-title="" title="" disabled>Create custom image</button>
       </div>
     </div>
   </div>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 099/106] toaster: modals Package dependencies modals to Bootstrap 3
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (95 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 098/106] toaster: custom image modals Move to Bootstrap 3 Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 100/106] toaster: modals Layer dependencies " Belen Barros Pena
                   ` (6 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

A couple of small changes to the modal dialogs that show you
dependencies and reverse dependencies when you add or remove packages to
/ from custom images.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/templates/customrecipe.html | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/customrecipe.html b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
index 1a7f576..be63c56 100644
--- a/bitbake/lib/toaster/toastergui/templates/customrecipe.html
+++ b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
@@ -55,8 +55,8 @@
       </div>
       <div class="modal-footer">
 	<p class="help-block text-left">Total package size: <strong id="package-deps-total-size"></strong></p>
-	<button id="add-package-deps-modal-btn" type="submit" class="btn btn-primary" data-dismiss="modal">Add package</button>
-	<button class="btn" data-dismiss="modal">Cancel</button>
+	<button id="add-package-deps-modal-btn" type="submit" class="btn btn-primary" data-dismiss="modal">Add packages</button>
+	<button class="btn btn-link" data-dismiss="modal">Cancel</button>
       </div>
     </div><!-- /.modal-content -->
   </div><!-- /.modal-dialog -->
@@ -80,7 +80,7 @@
       <div class="modal-footer">
 	<p class="help-block text-left">Total package size: <strong id="package-reverse-deps-total-size"></strong></p>
 	<button id="rm-package-reverse-deps-modal-btn" type="submit" class="btn btn-primary" data-dismiss="modal">Remove all <span class="reverse-deps-count-plus1"></button>
-	<button class="btn" data-dismiss="modal">Cancel</button>
+	<button class="btn btn-link" data-dismiss="modal">Cancel</button>
       </div>
     </div><!-- /.modal-content -->
   </div><!-- /.modal-dialog -->
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 100/106] toaster: modals Layer dependencies to Bootstrap 3
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (96 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 099/106] toaster: modals Package dependencies modals " Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 101/106] toaster: notifications Move to Boostrap 3 Belen Barros Pena
                   ` (5 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Fix the modal dialog that shows layer dependencies to make sure it
displays correctly with Bootstrap 3.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/html/layer_deps_modal.html | 2 +-
 bitbake/lib/toaster/toastergui/static/js/layerDepsModal.js       | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/html/layer_deps_modal.html b/bitbake/lib/toaster/toastergui/static/html/layer_deps_modal.html
index 7826fb5..e843d8d 100644
--- a/bitbake/lib/toaster/toastergui/static/html/layer_deps_modal.html
+++ b/bitbake/lib/toaster/toastergui/static/html/layer_deps_modal.html
@@ -13,7 +13,7 @@
 	</div>
 	<div class="modal-footer">
 	  <button class="btn btn-primary" type="submit">Add layers</button>
-	  <button class="btn" type="reset" data-dismiss="modal">Cancel</button>
+	  <button class="btn btn-link" type="reset" data-dismiss="modal">Cancel</button>
 	</div>
       </form>
     </div><!-- /.modal-content -->
diff --git a/bitbake/lib/toaster/toastergui/static/js/layerDepsModal.js b/bitbake/lib/toaster/toastergui/static/js/layerDepsModal.js
index 825f9dc..b79049e 100644
--- a/bitbake/lib/toaster/toastergui/static/js/layerDepsModal.js
+++ b/bitbake/lib/toaster/toastergui/static/js/layerDepsModal.js
@@ -33,11 +33,11 @@ function showLayerDepsModal(layer, dependencies, title, body, addToProject, succ
 
     var deplistHtml = "";
     for (var i = 0; i < dependencies.length; i++) {
-      deplistHtml += "<li><label class=\"checkbox\"><input name=\"dependencies\" value=\"";
+      deplistHtml += "<li><div class=\"checkbox\"><label><input name=\"dependencies\" value=\"";
       deplistHtml += dependencies[i].id;
       deplistHtml +="\" type=\"checkbox\" checked=\"checked\"/>";
       deplistHtml += dependencies[i].name;
-      deplistHtml += "</label></li>";
+      deplistHtml += "</label></div></li>";
     }
     $('#dependencies-list').html(deplistHtml);
 
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 101/106] toaster: notifications Move to Boostrap 3
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (97 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 100/106] toaster: modals Layer dependencies " Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:39 ` [PATCH 102/106] toaster: new project " Belen Barros Pena
                   ` (4 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=yes, Size: 8845 bytes --]

Make sure notifications for changes and creation of new projects and
custom images display correctly with Boostrap 3. It also changes the
notifications shown in the layer details pages, so that they use the
same fixed positioned notifications we use everywhere else.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/default.css       | 9 +++++++++
 bitbake/lib/toaster/toastergui/static/js/layerdetails.js    | 2 +-
 bitbake/lib/toaster/toastergui/static/js/libtoaster.js      | 8 ++++----
 bitbake/lib/toaster/toastergui/static/js/projectpage.js     | 4 ++--
 bitbake/lib/toaster/toastergui/templates/base.html          | 2 +-
 bitbake/lib/toaster/toastergui/templates/customrecipe.html  | 4 ++--
 bitbake/lib/toaster/toastergui/templates/projecttopbar.html | 4 ++--
 7 files changed, 21 insertions(+), 12 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index 981abb1..7da8ce9 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -231,3 +231,12 @@ code { color: #333; background-color: transparent; }
 .modal-footer { text-align: left; }
 .date-filter-controls { margin-top: 10px; }
 .date-filter-controls span { margin: 0 10px; }
+
+/* Style the fixed positioned notifications */
+.loading-notification { position: fixed; z-index: 101; top: 3%; left: 40%; right: 40%; -webkit-box-shadow: 0 0 10px #c09853; -moz-box-shadow: 0 0 10px #c09853; box-shadow: 0 0 10px #c09853; } 
+
+.change-notification { position: fixed; z-index: 1101; top: 4%; left: 30%; right: 30%; -webkit-box-shadow: 0 0 10px #3a87ad; -moz-box-shadow: 0 0 10px #3a87ad; box-shadow: 0 0 10px #3a87ad; }
+
+.alert-success.change-notification { -webkit-box-shadow: 0 0 10px #3c763d; -moz-box-shadow: 0 0 10px #3c763d; box-shadow: 0 0 10px #3c763d; }
+
+
diff --git a/bitbake/lib/toaster/toastergui/static/js/layerdetails.js b/bitbake/lib/toaster/toastergui/static/js/layerdetails.js
index dbc6ba6..bf50477 100644
--- a/bitbake/lib/toaster/toastergui/static/js/layerdetails.js
+++ b/bitbake/lib/toaster/toastergui/static/js/layerdetails.js
@@ -297,7 +297,7 @@ function layerDetailsPageInit (ctx) {
 
       setLayerInCurrentPrj(add);
 
-      $("#alert-area").show();
+      libtoaster.showChangeNotification(alertMsg);
     });
   });
 
diff --git a/bitbake/lib/toaster/toastergui/static/js/libtoaster.js b/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
index c00c5ab..a56e84a 100644
--- a/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
+++ b/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
@@ -300,11 +300,11 @@ var libtoaster = (function () {
     var alertMsg;
 
     if (layerDepsList.length > 0 && add === true) {
-      alertMsg = $("<span>You have added <strong>"+(layerDepsList.length+1)+"</strong> layers to your project: <a id=\"layer-affected-name\"></a> and its dependencies </span>");
+      alertMsg = $("<span>You have added <strong>"+(layerDepsList.length+1)+"</strong> layers to your project: <a class=\"alert-link\" id=\"layer-affected-name\"></a> and its dependencies </span>");
 
       /* Build the layer deps list */
       layerDepsList.map(function(layer, i){
-        var link = $("<a></a>");
+        var link = $("<a class=\"alert-link\"></a>");
 
         link.attr("href", layer.layerdetailurl);
         link.text(layer.name);
@@ -316,9 +316,9 @@ var libtoaster = (function () {
         alertMsg.append(link);
       });
     } else if (layerDepsList.length === 0 && add === true) {
-      alertMsg = $("<span>You have added <strong>1</strong> layer to your project: <a id=\"layer-affected-name\"></a></span></span>");
+      alertMsg = $("<span>You have added <strong>1</strong> layer to your project: <a class=\"alert-link\" id=\"layer-affected-name\"></a></span></span>");
     } else if (add === false) {
-      alertMsg = $("<span>You have removed <strong>1</strong> layer from your project: <a id=\"layer-affected-name\"></a></span>");
+      alertMsg = $("<span>You have removed <strong>1</strong> layer from your project: <a class=\"alert-link\" id=\"layer-affected-name\"></a></span>");
     }
 
     alertMsg.children("#layer-affected-name").text(layer.name);
diff --git a/bitbake/lib/toaster/toastergui/static/js/projectpage.js b/bitbake/lib/toaster/toastergui/static/js/projectpage.js
index 9cbed2b..6d92490 100644
--- a/bitbake/lib/toaster/toastergui/static/js/projectpage.js
+++ b/bitbake/lib/toaster/toastergui/static/js/projectpage.js
@@ -75,7 +75,7 @@ function projectPageInit(ctx) {
       imported = JSON.parse(imported);
 
     if (imported.deps_added.length === 0) {
-      message = "You have imported <strong><a href=\""+imported.imported_layer.layerdetailurl+"\">"+imported.imported_layer.name+"</a></strong> and added it to your project.";
+      message = "You have imported <strong><a class=\"alert-link\" href=\""+imported.imported_layer.layerdetailurl+"\">"+imported.imported_layer.name+"</a></strong> and added it to your project.";
     } else {
 
       var links = "<a href=\""+imported.imported_layer.layerdetailurl+"\">"+imported.imported_layer.name+"</a>, ";
@@ -285,7 +285,7 @@ function projectPageInit(ctx) {
         machineChangeCancel.click();
 
         /* Show the alert message */
-        var message = $('<span class="lead">You have changed the machine to: <strong><span id="notify-machine-name"></span></strong></span>');
+        var message = $('<span>You have changed the machine to: <strong><span id="notify-machine-name"></span></strong></span>');
         message.find("#notify-machine-name").text(currentMachineAddSelection);
         libtoaster.showChangeNotification(message);
     },
diff --git a/bitbake/lib/toaster/toastergui/templates/base.html b/bitbake/lib/toaster/toastergui/templates/base.html
index 43a3cbd..f62b7db 100644
--- a/bitbake/lib/toaster/toastergui/templates/base.html
+++ b/bitbake/lib/toaster/toastergui/templates/base.html
@@ -66,7 +66,7 @@
       Loading <i class="fa-pulse icon-spinner"></i>
     </div>
 
-    <div id="change-notification" class="alert lead alert-info" style="display:none">
+    <div id="change-notification" class="alert alert-info change-notification" style="display:none">
       <button type="button" class="close" id="hide-alert">&times;</button>
       <span id="change-notification-msg"></span>
     </div>
diff --git a/bitbake/lib/toaster/toastergui/templates/customrecipe.html b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
index be63c56..3f034a2 100644
--- a/bitbake/lib/toaster/toastergui/templates/customrecipe.html
+++ b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
@@ -87,9 +87,9 @@
 </div><!-- /.modal -->
 <!-- end package dependencies modal -->
 
-<div class="alert alert-success lead" id="image-created-notification" style="margin-top: 15px; display: none">
+<div class="alert alert-success change-notification" id="image-created-notification" style="display: none">
 	<button type="button" data-dismiss="alert" class="close">x</button>
-	Your custom image <strong>{{recipe.name}}</strong> has been created. You can now add or remove packages as needed.
+	<p>Your custom image <strong>{{recipe.name}}</strong> has been created. You can now add or remove packages as needed.</p>
 </div>
 <div class="page-header">
 	<h1>
diff --git a/bitbake/lib/toaster/toastergui/templates/projecttopbar.html b/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
index f8ee2d8..78d124a 100644
--- a/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
+++ b/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
@@ -17,9 +17,9 @@
 </script>
 
 <div class="col-md-12">
-  <div class="alert alert-success lead" id="project-created-notification" style="margin-top:15px; display:none">
+  <div class="alert alert-success change-notification" id="project-created-notification" style="display:none">
     <button type="button" class="close" data-dismiss="alert">×</button>
-  Your project <strong>{{project.name}}</strong> has been created. You can now <a href="{% url 'projectmachines' project.id %}">select your target machine</a> and <a href="{% url 'projectimagerecipes' project.id %}">choose image recipes</a> to build.
+		<p>Your project <strong>{{project.name}}</strong> has been created. You can now <a class="alert-link" href="{% url 'projectmachines' project.id %}">select your target machine</a> and <a class="alert-link" href="{% url 'projectimagerecipes' project.id %}">choose image recipes</a> to build.</p>
   </div>
   <!-- project name -->
   <div class="page-header">
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 102/106] toaster: new project Move to Boostrap 3
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (98 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 101/106] toaster: notifications Move to Boostrap 3 Belen Barros Pena
@ 2016-05-24 11:39 ` Belen Barros Pena
  2016-05-24 11:40 ` [PATCH 103/106] toaster: notifications Add dismissible class Belen Barros Pena
                   ` (3 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:39 UTC (permalink / raw)
  To: toaster

Make the necessary changes to the "new project" form so that is displays
correctly with Bootstrap 3.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 .../lib/toaster/toastergui/static/css/default.css  |  4 +++-
 .../toaster/toastergui/templates/newproject.html   | 26 ++++++++++------------
 2 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index 7da8ce9..efcb9f8 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -239,4 +239,6 @@ code { color: #333; background-color: transparent; }
 
 .alert-success.change-notification { -webkit-box-shadow: 0 0 10px #3c763d; -moz-box-shadow: 0 0 10px #3c763d; box-shadow: 0 0 10px #3c763d; }
 
-
+/* Style the new project form */
+#new-project-name { width: 33%; }
+#projectversion { width: 20%; margin-bottom: 10px; }
diff --git a/bitbake/lib/toaster/toastergui/templates/newproject.html b/bitbake/lib/toaster/toastergui/templates/newproject.html
index e9e07cf..2cfecf8 100644
--- a/bitbake/lib/toaster/toastergui/templates/newproject.html
+++ b/bitbake/lib/toaster/toastergui/templates/newproject.html
@@ -11,18 +11,16 @@
           <h1>Create a new project</h1>
         </div>
     {% if alert %}
-      <div class="alert alert-error" role="alert">{{alert}}</div>
+      <div class="alert alert-danger" role="alert">{{alert}}</div>
     {% endif %}
 
         <form method="POST">{% csrf_token %}
 
-            <fieldset id="validate-project-name">
-              <label>Project name <span class="muted">(required)</span></label>
-              <div>
-                <input type="text" class="input-xlarge" required id="new-project-name" name="projectname">
-                <p class="help-block error" style="display: none;" id="hint-error-project-name">A project with this name exists. Project names must be unique.</p>
-              </div>
-            </fieldset>
+					<div class="form-group" id="validate-project-name">
+						<label class="control-label">Project name <span class="text-muted">(required)</span></label>
+            <input type="text" class="form-control" required id="new-project-name" name="projectname">
+          </div>
+          <p class="help-block text-danger" style="display: none;" id="hint-error-project-name">A project with this name exists. Project names must be unique.</p>
 <!--
             <fieldset>
                 <label class="project-form">Project type</label>
@@ -35,13 +33,13 @@
         <input type="hidden" name="ptype" value="build" />
 
         {% if releases.count > 0 %}
-            <fieldset class="release">
+				<div class="release form-group">
             {% if releases.count > 1 %}
-              <label class="project-form">
+              <label class="control-label">
                 Release
-                <i class="icon-question-sign get-help" title="The version of the build system you want to use"></i>
+                <span class="glyphicon glyphicon-question-sign get-help" title="The version of the build system you want to use"></span>
               </label>
-              <select name="projectversion" id="projectversion">
+              <select name="projectversion" id="projectversion" class="form-control">
                 {% for release in releases %}
                     <option value="{{release.id}}"
                         {%if defaultbranch == release.name %}
@@ -64,8 +62,8 @@
               </div>
             </fieldset>
         {% endif %}
-            <div class="air">
-              <input type="submit" id="create-project-button" class="btn btn-primary btn-large" value="Create project"/>
+            <div class="top-air">
+              <input type="submit" id="create-project-button" class="btn btn-primary btn-lg" value="Create project"/>
               <span class="help-inline" style="vertical-align:middle;">To create a project, you need to enter a project name</span>
             </div>
 
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 103/106] toaster: notifications Add dismissible class
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (99 preceding siblings ...)
  2016-05-24 11:39 ` [PATCH 102/106] toaster: new project " Belen Barros Pena
@ 2016-05-24 11:40 ` Belen Barros Pena
  2016-05-24 11:40 ` [PATCH 104/106] toaster: landing Move to Bootstrap 3 Belen Barros Pena
                   ` (2 subsequent siblings)
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:40 UTC (permalink / raw)
  To: toaster

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=yes, Size: 3413 bytes --]

Boostrap 3 provides a new class for notifications that can be closed by
users (alert-dismissible). Add the class and the correct markup for the
close button to the Toaster alerts that can be dismissed.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/templates/base.html          | 4 ++--
 bitbake/lib/toaster/toastergui/templates/customrecipe.html  | 4 ++--
 bitbake/lib/toaster/toastergui/templates/projecttopbar.html | 4 ++--
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/templates/base.html b/bitbake/lib/toaster/toastergui/templates/base.html
index f62b7db..73e4cd8 100644
--- a/bitbake/lib/toaster/toastergui/templates/base.html
+++ b/bitbake/lib/toaster/toastergui/templates/base.html
@@ -66,8 +66,8 @@
       Loading <i class="fa-pulse icon-spinner"></i>
     </div>
 
-    <div id="change-notification" class="alert alert-info change-notification" style="display:none">
-      <button type="button" class="close" id="hide-alert">&times;</button>
+    <div id="change-notification" class="alert alert-info alert-dismissible change-notification" style="display:none">
+      <button type="button" class="close" id="hide-alert" data-dismiss="alert">&times;</button>
       <span id="change-notification-msg"></span>
     </div>
 
diff --git a/bitbake/lib/toaster/toastergui/templates/customrecipe.html b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
index 3f034a2..bc77d57 100644
--- a/bitbake/lib/toaster/toastergui/templates/customrecipe.html
+++ b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
@@ -87,8 +87,8 @@
 </div><!-- /.modal -->
 <!-- end package dependencies modal -->
 
-<div class="alert alert-success change-notification" id="image-created-notification" style="display: none">
-	<button type="button" data-dismiss="alert" class="close">x</button>
+<div class="alert alert-success alert-dismissible change-notification" id="image-created-notification" style="display: none">
+	<button type="button" data-dismiss="alert" class="close">&times;</button>
 	<p>Your custom image <strong>{{recipe.name}}</strong> has been created. You can now add or remove packages as needed.</p>
 </div>
 <div class="page-header">
diff --git a/bitbake/lib/toaster/toastergui/templates/projecttopbar.html b/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
index 78d124a..2734af0 100644
--- a/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
+++ b/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
@@ -17,8 +17,8 @@
 </script>
 
 <div class="col-md-12">
-  <div class="alert alert-success change-notification" id="project-created-notification" style="display:none">
-    <button type="button" class="close" data-dismiss="alert">×</button>
+  <div class="alert alert-success alert-dismissible change-notification" id="project-created-notification" style="display:none">
+    <button type="button" class="close" data-dismiss="alert">&times;</button>
 		<p>Your project <strong>{{project.name}}</strong> has been created. You can now <a class="alert-link" href="{% url 'projectmachines' project.id %}">select your target machine</a> and <a class="alert-link" href="{% url 'projectimagerecipes' project.id %}">choose image recipes</a> to build.</p>
   </div>
   <!-- project name -->
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 104/106] toaster: landing Move to Bootstrap 3
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (100 preceding siblings ...)
  2016-05-24 11:40 ` [PATCH 103/106] toaster: notifications Add dismissible class Belen Barros Pena
@ 2016-05-24 11:40 ` Belen Barros Pena
  2016-05-24 11:40 ` [PATCH 105/106] toaster: Add new image type " Belen Barros Pena
  2016-05-24 11:40 ` [PATCH 106/106] toaster: Unique project names to Boostrap 3 Belen Barros Pena
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:40 UTC (permalink / raw)
  To: toaster

Move the Toaster landing page to Bootstrap 3.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/default.css |  3 +++
 bitbake/lib/toaster/toastergui/templates/landing.html | 10 +++++-----
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index efcb9f8..a8d86e9 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -242,3 +242,6 @@ code { color: #333; background-color: transparent; }
 /* Style the new project form */
 #new-project-name { width: 33%; }
 #projectversion { width: 20%; margin-bottom: 10px; }
+
+/* Style the Toaster screenshot in the landing page */
+.img-thumbnail { padding: 0; }
diff --git a/bitbake/lib/toaster/toastergui/templates/landing.html b/bitbake/lib/toaster/toastergui/templates/landing.html
index 0fdf033..4986632 100644
--- a/bitbake/lib/toaster/toastergui/templates/landing.html
+++ b/bitbake/lib/toaster/toastergui/templates/landing.html
@@ -15,13 +15,13 @@
               <p>A web interface to <a href="http://www.openembedded.org">OpenEmbedded</a> and <a href="http://www.yoctoproject.org/tools-resources/projects/bitbake">BitBake</a>, the <a href="http://www.yoctoproject.org">Yocto Project</a> build system.</p>
 
 		          {% if lvs_nos %}
-		            <p>
-		              <a class="btn btn-primary btn-large" href="{% url 'newproject' %}">
+		            <p class="top-air">
+		              <a class="btn btn-primary btn-lg" href="{% url 'newproject' %}">
 			              To start building, create your first Toaster project
 		              </a>
 		            </p>
 		          {% else %}
-                <div class="alert alert-info lead air">
+                <div class="alert alert-info lead top-air">
                   Toaster has no layer information. Without layer information, you cannot run builds. To generate layer information you can:
                   <ul>
                     <li>
@@ -34,7 +34,7 @@
                 </div>
               {% endif %}
 
-              <ul class="list-unstyled">
+              <ul class="list-unstyled lead">
                 <li>
                   <a href="http://www.yoctoproject.org/docs/latest/toaster-manual/toaster-manual.html">
                     Read the Toaster manual
@@ -50,7 +50,7 @@
             </div>
 
             <div class="col-md-6">
-              <img alt="Yocto Project" class="img-thumbnail" src="{% static 'img/toaster_bw.png' %}"/>
+              <img alt="Yocto Project Toaster" class="img-thumbnail" src="{% static 'img/toaster_bw.png' %}"/>
             </div>
 
         </div>
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 105/106] toaster: Add new image type to Bootstrap 3
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (101 preceding siblings ...)
  2016-05-24 11:40 ` [PATCH 104/106] toaster: landing Move to Bootstrap 3 Belen Barros Pena
@ 2016-05-24 11:40 ` Belen Barros Pena
  2016-05-24 11:40 ` [PATCH 106/106] toaster: Unique project names to Boostrap 3 Belen Barros Pena
  103 siblings, 0 replies; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:40 UTC (permalink / raw)
  To: toaster

We recently added the ability to add new image types when setting the
IMAGE_FSTYPES variable from the "BitBake variables" page. The changes were
made for Bootstrap 2, and a few modifications to the mark up are
required to make sure they work properly with Bootstrap 3.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/css/default.css     | 3 ++-
 bitbake/lib/toaster/toastergui/templates/projectconf.html | 8 ++++----
 2 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index a8d86e9..30328fd 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -154,7 +154,8 @@ dd.variable-list form { margin-top: 10px; }
 #new-dl_dir,
 #filter-image_fstypes,
 #new-image_install,
-#new-sstate_dir { width: 20em; }
+#new-sstate_dir,
+#new-imagefs_types { width: 20em; }
 #package_classes-select { width: 10em; }
 .scrolling { border: 1px solid #dddddd; height: 154px; overflow: auto; padding: 0 10px; width: 27.5%; margin-bottom: 10px; margin-top: 10px; }
 .scrolling.has-error { border-color: #a94442; }
diff --git a/bitbake/lib/toaster/toastergui/templates/projectconf.html b/bitbake/lib/toaster/toastergui/templates/projectconf.html
index a7eaafb..af75c9d 100644
--- a/bitbake/lib/toaster/toastergui/templates/projectconf.html
+++ b/bitbake/lib/toaster/toastergui/templates/projectconf.html
@@ -58,12 +58,12 @@
                 <span class="glyphicon glyphicon-edit" id="change-image_fstypes-icon"></span>
                 <form id="change-image_fstypes-form" style="display:none;">
                     <label>Type the image types you want to build:</label>
-                    <div class="form-group" id="validate-image_fstypes">
+                    <div class="form-group form-inline" id="validate-image_fstypes">
                         <input type="text" class="form-control "id="new-imagefs_types">
                         <button id="apply-change-image_fstypes" type="button" class="btn btn-default">Save</button>
                         <button id="cancel-change-image_fstypes" type="button" class="btn btn-link">Cancel</button>
                     </div>
-                    <p class="help-block text-danger" id="hintError-image-fs_type">A valid image type cannot include underscores</p>
+                    <p class="help-block text-danger" style="display:none;" id="hintError-image-fs_type">A valid image type cannot include underscores</p>
                     <label>Or choose from known image types:</label>
                     <input id="filter-image_fstypes" type="text" placeholder="Search image types" class="form-control">
                     <div id="all-image_fstypes" class="scrolling"></div>
@@ -649,11 +649,11 @@
 
               // Validate underscore in image fs types
               if ($(this).val().indexOf('_') > -1) {
-                $('#validate-image_fstypes').addClass('control-group error');
+                $('#validate-image_fstypes').addClass('has-error');
                 $('#hintError-image-fs_type').show();
                 $("#apply-change-image_fstypes").prop("disabled", true);
               } else {
-                $('#validate-image_fstypes').removeClass('control-group error');
+                $('#validate-image_fstypes').removeClass('has-error');
                 $('#hintError-image-fs_type').hide();
               }
             });
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* [PATCH 106/106] toaster: Unique project names to Boostrap 3
  2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
                   ` (102 preceding siblings ...)
  2016-05-24 11:40 ` [PATCH 105/106] toaster: Add new image type " Belen Barros Pena
@ 2016-05-24 11:40 ` Belen Barros Pena
  2016-05-24 15:34   ` Michael Wood
  103 siblings, 1 reply; 107+ messages in thread
From: Belen Barros Pena @ 2016-05-24 11:40 UTC (permalink / raw)
  To: toaster

We recently added functionality to enforce unique project names. Such
functionality was marked up for Boostrap 2, and some changes are
required to ensure it works with Bootstrap 3.

Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
---
 bitbake/lib/toaster/toastergui/static/js/libtoaster.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/bitbake/lib/toaster/toastergui/static/js/libtoaster.js b/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
index a56e84a..e4e4f6c 100644
--- a/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
+++ b/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
@@ -393,11 +393,11 @@ var libtoaster = (function () {
                   data.results[0].name === projectName) {
                 // This project name exists hence show the error and disable
                 // the save button
-                ctrlGrpValidateProjectName.addClass('control-group error');
+                ctrlGrpValidateProjectName.addClass('has-error');
                 hintError.show();
                 enableOrDisableBtn.attr('disabled', 'disabled');
               } else {
-                ctrlGrpValidateProjectName.removeClass('control-group error');
+                ctrlGrpValidateProjectName.removeClass('has-error');
                 hintError.hide();
                 enableOrDisableBtn.removeAttr('disabled');
               }
-- 
1.9.1



^ permalink raw reply related	[flat|nested] 107+ messages in thread

* Re: [PATCH 059/106] toaster: Update OE json file
  2016-05-24 11:39 ` [PATCH 059/106] toaster: Update OE json file Belen Barros Pena
@ 2016-05-24 14:57   ` Michael Wood
  0 siblings, 0 replies; 107+ messages in thread
From: Michael Wood @ 2016-05-24 14:57 UTC (permalink / raw)
  To: Belen Barros Pena, toaster

Should be able to drop this one as it appears upstream already

Michael

On 24/05/16 12:39, Belen Barros Pena wrote:
> Update the OpenEmbedded Toaster configuration file to include the
> krogoth branch. Also, make sure the DISTRO default value is set to
> "nodistro".
>
> Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
> ---
>   meta/conf/toasterconf.json | 23 +++++++++++++++++++----
>   1 file changed, 19 insertions(+), 4 deletions(-)
>
> diff --git a/meta/conf/toasterconf.json b/meta/conf/toasterconf.json
> index a05734f..ffa2346 100644
> --- a/meta/conf/toasterconf.json
> +++ b/meta/conf/toasterconf.json
> @@ -1,7 +1,7 @@
>   {
>       "config": {
>           "MACHINE"      : "qemux86",
> -        "DISTRO"       : "poky",
> +        "DISTRO"       : "nodistro",
>           "DL_DIR"       : "${TOPDIR}/../downloads",
>           "IMAGE_FSTYPES": "ext3 jffs2 tar.bz2",
>           "IMAGE_INSTALL_append": "",
> @@ -13,7 +13,7 @@
>               "name": "Local OpenEmbedded",
>               "sourcetype": "local",
>               "apiurl": "../../",
> -            "branches": ["HEAD", "master", "jethro"],
> +            "branches": ["HEAD", "master", "jethro", "krogoth"],
>               "layers": [
>                   {
>                       "name": "openembedded-core",
> @@ -27,13 +27,13 @@
>               "name": "OpenEmbedded",
>               "sourcetype": "layerindex",
>               "apiurl": "http://layers.openembedded.org/layerindex/api/",
> -            "branches": ["master", "jethro"]
> +            "branches": ["master", "jethro", "krogoth"]
>           },
>           {
>               "name": "Imported layers",
>               "sourcetype": "imported",
>               "apiurl": "",
> -            "branches": ["master", "jethro", "HEAD"]
> +            "branches": ["master", "jethro", "krogoth", "HEAD"]
>   
>           }
>       ],
> @@ -51,6 +51,12 @@
>               "dirpath": ""
>           },
>           {
> +            "name": "krogoth",
> +            "giturl": "git://git.openembedded.org/bitbake",
> +            "branch": "1.30",
> +            "dirpath": ""
> +        },
> +        {
>               "name": "HEAD",
>               "giturl": "git://git.openembedded.org/bitbake",
>               "branch": "HEAD",
> @@ -80,6 +86,15 @@
>               "helptext": "Toaster will run your builds with the tip of the <a href=\"http://cgit.openembedded.org/openembedded-core/log/?h=jethro\">OpenEmbedded \"Jethro\"</a> branch"
>           },
>           {
> +            "name": "krogoth",
> +            "description": "OpenEmbedded Krogoth",
> +            "bitbake": "krogoth",
> +            "branch": "krogoth",
> +            "defaultlayers": [ "openembedded-core" ],
> +            "layersourcepriority": { "Imported layers": 99, "Local OpenEmbedded" : 10, "OpenEmbedded" :  0 },
> +            "helptext": "Toaster will run your builds with the tip of the <a href=\"http://cgit.openembedded.org/openembedded-core/log/?h=krogoth\">OpenEmbedded \"Krogoth\"</a> branch"
> +        },
> +        {
>               "name": "local",
>               "description": "Local OpenEmbedded",
>               "bitbake": "HEAD",



^ permalink raw reply	[flat|nested] 107+ messages in thread

* Re: [PATCH 106/106] toaster: Unique project names to Boostrap 3
  2016-05-24 11:40 ` [PATCH 106/106] toaster: Unique project names to Boostrap 3 Belen Barros Pena
@ 2016-05-24 15:34   ` Michael Wood
  0 siblings, 0 replies; 107+ messages in thread
From: Michael Wood @ 2016-05-24 15:34 UTC (permalink / raw)
  To: toaster

Phew! great work, thank you!!

So on my TODO list the next steps are

- Fix the indentation of patches #77, #80 , #81, 82, #91. #92, #93, #94, 
#96, #98, #102
- Drop #59
- Fixup/squash patches which rewrite the same parts.
- Fix the authorship of the typeahead patch - somehow it's been 
attributed to me
- Revert the bootstrap-toaster theme related stuff
- Fix the tests which probably will have broken

Then we'll merge it into toaster-next, get the build analysis stuff 
done, let it settle for a bit and then submit it upstream.

Michael

On 24/05/16 12:40, Belen Barros Pena wrote:
> We recently added functionality to enforce unique project names. Such
> functionality was marked up for Boostrap 2, and some changes are
> required to ensure it works with Bootstrap 3.
>
> Signed-off-by: Belen Barros Pena <belen.barros.pena@linux.intel.com>
> ---
>   bitbake/lib/toaster/toastergui/static/js/libtoaster.js | 4 ++--
>   1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/bitbake/lib/toaster/toastergui/static/js/libtoaster.js b/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
> index a56e84a..e4e4f6c 100644
> --- a/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
> +++ b/bitbake/lib/toaster/toastergui/static/js/libtoaster.js
> @@ -393,11 +393,11 @@ var libtoaster = (function () {
>                     data.results[0].name === projectName) {
>                   // This project name exists hence show the error and disable
>                   // the save button
> -                ctrlGrpValidateProjectName.addClass('control-group error');
> +                ctrlGrpValidateProjectName.addClass('has-error');
>                   hintError.show();
>                   enableOrDisableBtn.attr('disabled', 'disabled');
>                 } else {
> -                ctrlGrpValidateProjectName.removeClass('control-group error');
> +                ctrlGrpValidateProjectName.removeClass('has-error');
>                   hintError.hide();
>                   enableOrDisableBtn.removeAttr('disabled');
>                 }



^ permalink raw reply	[flat|nested] 107+ messages in thread

end of thread, other threads:[~2016-05-24 15:34 UTC | newest]

Thread overview: 107+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-05-24 11:38 [PATCH 000/106] Migrate configuration functionality to Boostrap 3 Belen Barros Pena
2016-05-24 11:38 ` [PATCH 001/106] toaster: Auto convert bootstrap 2 to bootstrap 3 Belen Barros Pena
2016-05-24 11:38 ` [PATCH 003/106] toaster: templates Base add bootstrap-toaster-theme overlay Belen Barros Pena
2016-05-24 11:38 ` [PATCH 004/106] toaster: Top bar layout fixes Belen Barros Pena
2016-05-24 11:38 ` [PATCH 005/106] toaster: Fix layout of 'All builds' page Belen Barros Pena
2016-05-24 11:38 ` [PATCH 006/106] toaster: Fix layout of 'All projects' page Belen Barros Pena
2016-05-24 11:38 ` [PATCH 007/106] toaster: templates Add additional divs for modals in bootstrap3 Belen Barros Pena
2016-05-24 11:38 ` [PATCH 008/106] toaster: templates Use old style input appends instead of input-group Belen Barros Pena
2016-05-24 11:38 ` [PATCH 009/106] toaster: bootstrap3-transition Remove top margin on New project button Belen Barros Pena
2016-05-24 11:38 ` [PATCH 010/106] toaster: default.css Remove 80% width for search as this is no longer needed Belen Barros Pena
2016-05-24 11:38 ` [PATCH 011/106] toaster: migrate typeahead library Belen Barros Pena
2016-05-24 11:38 ` [PATCH 012/106] toaster: Layout fixes for project configuration Belen Barros Pena
2016-05-24 11:38 ` [PATCH 013/106] toaster: Fix toaster table footer controls Belen Barros Pena
2016-05-24 11:38 ` [PATCH 014/106] toaster: Fix layout of 'project builds' page Belen Barros Pena
2016-05-24 11:38 ` [PATCH 015/106] toaster: small changes to 'import layer' page Belen Barros Pena
2016-05-24 11:38 ` [PATCH 016/106] toaster: Remove hovering from disabled buttons Belen Barros Pena
2016-05-24 11:38 ` [PATCH 017/106] toaster: Fix layout in "new custom image" page Belen Barros Pena
2016-05-24 11:38 ` [PATCH 018/106] toaster: table.js Fix the edit columns drop down Belen Barros Pena
2016-05-24 11:38 ` [PATCH 019/106] toaster: templates Use old style icon classes Belen Barros Pena
2016-05-24 11:38 ` [PATCH 020/106] toaster: Fix breadcrumbs Belen Barros Pena
2016-05-24 11:38 ` [PATCH 021/106] toaster: Fix "custom image details" layout Belen Barros Pena
2016-05-24 11:38 ` [PATCH 022/106] toaster: remove row from base template Belen Barros Pena
2016-05-24 11:38 ` [PATCH 023/106] toaster: Fix image recipe details layout Belen Barros Pena
2016-05-24 11:38 ` [PATCH 024/106] toaster: Fix layer " Belen Barros Pena
2016-05-24 11:38 ` [PATCH 025/106] toaster: Set correct margins for table search Belen Barros Pena
2016-05-24 11:38 ` [PATCH 027/106] toaster: Fix breadcrumb in build data pages Belen Barros Pena
2016-05-24 11:38 ` [PATCH 028/106] toaster: indentation fixes Belen Barros Pena
2016-05-24 11:38 ` [PATCH 029/106] toaster: Fix layout in build dashboard page Belen Barros Pena
2016-05-24 11:38 ` [PATCH 030/106] toaster: Fix breadcrumb in Chrome Belen Barros Pena
2016-05-24 11:38 ` [PATCH 031/106] toaster: Adjust width of non-toastertables search Belen Barros Pena
2016-05-24 11:38 ` [PATCH 032/106] toaster: Alignment of table controls Belen Barros Pena
2016-05-24 11:38 ` [PATCH 033/106] toaster: Fix pagination in non-toastertables Belen Barros Pena
2016-05-24 11:38 ` [PATCH 034/106] toaster: Fix layout of packages installed page Belen Barros Pena
2016-05-24 11:38 ` [PATCH 035/106] toaster: Fix layout of configuration page Belen Barros Pena
2016-05-24 11:38 ` [PATCH 036/106] toaster: Fix layout of variable history page Belen Barros Pena
2016-05-24 11:38 ` [PATCH 037/106] toaster: Fix layout in package details pages Belen Barros Pena
2016-05-24 11:38 ` [PATCH 038/106] toaster: Fix layout in recipe details page Belen Barros Pena
2016-05-24 11:38 ` [PATCH 039/106] toaster: Fix layout in task " Belen Barros Pena
2016-05-24 11:38 ` [PATCH 040/106] toaster: revert auto change to icon class for spinner Belen Barros Pena
2016-05-24 11:38 ` [PATCH 041/106] toaster: Remove the pagination-centered class Belen Barros Pena
2016-05-24 11:38 ` [PATCH 042/106] toaster: Style typeaheads Belen Barros Pena
2016-05-24 11:39 ` [PATCH 043/106] toaster: Fix filters Belen Barros Pena
2016-05-24 11:39 ` [PATCH 044/106] toaster: Fix no results pages Belen Barros Pena
2016-05-24 11:39 ` [PATCH 045/106] toaster: Edit inaccurate comment Belen Barros Pena
2016-05-24 11:39 ` [PATCH 046/106] toaster: fix buttons in tables Belen Barros Pena
2016-05-24 11:39 ` [PATCH 047/106] toaster: Fix popover content Belen Barros Pena
2016-05-24 11:39 ` [PATCH 048/106] toaster: Tweaking modal dialogs Belen Barros Pena
2016-05-24 11:39 ` [PATCH 049/106] toaster: Fix buttons in custom image details page Belen Barros Pena
2016-05-24 11:39 ` [PATCH 050/106] toaster: More width to the "Edit columns" menu Belen Barros Pena
2016-05-24 11:39 ` [PATCH 051/106] toaster: Adjust labels in modal dialogs Belen Barros Pena
2016-05-24 11:39 ` [PATCH 052/106] toaster: Fix 'New project' page Belen Barros Pena
2016-05-24 11:39 ` [PATCH 053/106] toaster: Fix the project created notification Belen Barros Pena
2016-05-24 11:39 ` [PATCH 054/106] toaster: Fix errors and warnings info Belen Barros Pena
2016-05-24 11:39 ` [PATCH 055/106] toaster: Fix landing page Belen Barros Pena
2016-05-24 11:39 ` [PATCH 056/106] toaster: Fix reverse dependencies modal dialogs Belen Barros Pena
2016-05-24 11:39 ` [PATCH 057/106] toaster: Table cell notifications style Belen Barros Pena
2016-05-24 11:39 ` [PATCH 058/106] toaster: importlayer Make sure we eat the default event on submit Belen Barros Pena
2016-05-24 11:39 ` [PATCH 059/106] toaster: Update OE json file Belen Barros Pena
2016-05-24 14:57   ` Michael Wood
2016-05-24 11:39 ` [PATCH 060/106] toaster: work-around our lack of a synchronous fetch for typeaheads Belen Barros Pena
2016-05-24 11:39 ` [PATCH 061/106] toaster: Remove old bootstrap files left behind Belen Barros Pena
2016-05-24 11:39 ` [PATCH 062/106] toaster: Fix the custom image modal dialogs Belen Barros Pena
2016-05-24 11:39 ` [PATCH 063/106] toaster: Comment out unnecessary css Belen Barros Pena
2016-05-24 11:39 ` [PATCH 064/106] toaster: Create new custom css file Belen Barros Pena
2016-05-24 11:39 ` [PATCH 065/106] toaster: Base template to Bootstrap 3 Belen Barros Pena
2016-05-24 11:39 ` [PATCH 066/106] toaster: body styles for " Belen Barros Pena
2016-05-24 11:39 ` [PATCH 067/106] toaster: Move latest builds to " Belen Barros Pena
2016-05-24 11:39 ` [PATCH 068/106] toaster: Fix the recipe file download Belen Barros Pena
2016-05-24 11:39 ` [PATCH 069/106] toaster: Table controls to Bootstrap 3 Belen Barros Pena
2016-05-24 11:39 ` [PATCH 070/106] toaster: Fix the toastertable table headings Belen Barros Pena
2016-05-24 11:39 ` [PATCH 071/106] toaster: Remove spurious div Belen Barros Pena
2016-05-24 11:39 ` [PATCH 072/106] toaster: Fix 'all builds' table content Belen Barros Pena
2016-05-24 11:39 ` [PATCH 073/106] toaster: Fix bottom table controls Belen Barros Pena
2016-05-24 11:39 ` [PATCH 074/106] toaster: Fix 'all projects' table content Belen Barros Pena
2016-05-24 11:39 ` [PATCH 075/106] toaster: Configuration page to Bootstrap 3 Belen Barros Pena
2016-05-24 11:39 ` [PATCH 076/106] toaster: 'Project builds' " Belen Barros Pena
2016-05-24 11:39 ` [PATCH 077/106] toaster: Project builds empty state Belen Barros Pena
2016-05-24 11:39 ` [PATCH 078/106] toaster: Style typeaheads Belen Barros Pena
2016-05-24 11:39 ` [PATCH 079/106] toaster: Fix display of failed tasks Belen Barros Pena
2016-05-24 11:39 ` [PATCH 080/106] toaster: Fix the import layer form Belen Barros Pena
2016-05-24 11:39 ` [PATCH 081/106] toaster: Fix the toaster tables no results Belen Barros Pena
2016-05-24 11:39 ` [PATCH 082/106] toaster: Show heading in no results page Belen Barros Pena
2016-05-24 11:39 ` [PATCH 083/106] toaster: Fix new custom image page Belen Barros Pena
2016-05-24 11:39 ` [PATCH 084/106] toaster: toaster tables Enable complex empty states Belen Barros Pena
2016-05-24 11:39 ` [PATCH 085/106] toaster: Custom images to Bootstrap 3 Belen Barros Pena
2016-05-24 11:39 ` [PATCH 086/106] toaster: project builds Improve empty state Belen Barros Pena
2016-05-24 11:39 ` [PATCH 087/106] toaster: recipes tables Tweaks for Bootstrap 3 Belen Barros Pena
2016-05-24 11:39 ` [PATCH 088/106] toaster: machines table Changes " Belen Barros Pena
2016-05-24 11:39 ` [PATCH 089/106] toaster: layers " Belen Barros Pena
2016-05-24 11:39 ` [PATCH 090/106] toaster: breadcrumbs Fix " Belen Barros Pena
2016-05-24 11:39 ` [PATCH 091/106] toaster: layerdetails Fix the layer details page Belen Barros Pena
2016-05-24 11:39 ` [PATCH 092/106] toaster: custom recipe Fix the custom recipe " Belen Barros Pena
2016-05-24 11:39 ` [PATCH 093/106] toaster: recipe details Fix the image " Belen Barros Pena
2016-05-24 11:39 ` [PATCH 094/106] toaster: bb variables BitBake variables page to Bootstrap 3 Belen Barros Pena
2016-05-24 11:39 ` [PATCH 095/106] toaster: recent builds Consistent rebuild links Belen Barros Pena
2016-05-24 11:39 ` [PATCH 096/106] toaster: filters Filter modals to Bootstrap 3 Belen Barros Pena
2016-05-24 11:39 ` [PATCH 097/106] toaster: latest builds Style cancel option Belen Barros Pena
2016-05-24 11:39 ` [PATCH 098/106] toaster: custom image modals Move to Bootstrap 3 Belen Barros Pena
2016-05-24 11:39 ` [PATCH 099/106] toaster: modals Package dependencies modals " Belen Barros Pena
2016-05-24 11:39 ` [PATCH 100/106] toaster: modals Layer dependencies " Belen Barros Pena
2016-05-24 11:39 ` [PATCH 101/106] toaster: notifications Move to Boostrap 3 Belen Barros Pena
2016-05-24 11:39 ` [PATCH 102/106] toaster: new project " Belen Barros Pena
2016-05-24 11:40 ` [PATCH 103/106] toaster: notifications Add dismissible class Belen Barros Pena
2016-05-24 11:40 ` [PATCH 104/106] toaster: landing Move to Bootstrap 3 Belen Barros Pena
2016-05-24 11:40 ` [PATCH 105/106] toaster: Add new image type " Belen Barros Pena
2016-05-24 11:40 ` [PATCH 106/106] toaster: Unique project names to Boostrap 3 Belen Barros Pena
2016-05-24 15:34   ` Michael Wood

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.