From: kimchi-devel-bounces@ovirt.org [mailto:kimchi-devel-bounces@ovirt.org] On Behalf Of Aline Manera
Sent: quarta-feira, 27 de abril de 2016 22:46
To: sguimaraes943@gmail.com; Kimchi Devel <kimchi-devel@ovirt.org>
Subject: Re: [Kimchi-devel] [PATCH v2] [Wok] Changes in wok.list.js widget to allow multiple selection

 


Hi Samuel,

I applied this patch and the Ginger Base patch to be able to really test it and I got the following when generating a new debug report:



As you can see the loading icon is not aligned with the report name and is overloading a little bit the check box area.

Fixed in v3.


Should this issue be fixed by this patch or by the Ginger Base patch?

No, just this one.


Regards,
Aline Manera

On 04/27/2016 04:03 PM, sguimaraes943@gmail.com wrote:

From: Samuel GuimarĂ£es <sguimaraes943@gmail.com>
 
This commit enables multiple selection with wok.list.js widget. It also features some enhancements for mobile and keyboard navigation.
 
Signed-off-by: Samuel GuimarĂ£es <sguimaraes943@gmail.com>
---
 ui/css/bootstrap.custom.css            |   8 +-
 ui/css/src/modules/_buttons.scss       |   8 ++
 ui/css/src/modules/_wok-forms.scss     |   1 +
 ui/css/src/modules/_wok-grid.scss      | 250 +++++++++++++++++++++++++++-----
 ui/css/src/modules/_wok-variables.scss |   4 +-
 ui/css/wok.css                         | 254 ++++++++++++++++++++++++++++-----
 ui/js/src/wok.list.js                  | 174 +++++++++++-----------
 7 files changed, 531 insertions(+), 168 deletions(-)
 
diff --git a/ui/css/bootstrap.custom.css b/ui/css/bootstrap.custom.css
index 13869da..c69939c 100644
--- a/ui/css/bootstrap.custom.css
+++ b/ui/css/bootstrap.custom.css
@@ -2996,7 +2996,7 @@ fieldset[disabled] .btn-link:focus {
 }
 
 .btn-xs, .btn-group-xs > .btn {
-  padding: 1px 5px;
+  padding: 2px 10px;
   font-size: 12px;
   line-height: 1.5;
   border-radius: 3px;
@@ -3460,9 +3460,9 @@ tbody.collapse.in {
   display: table-cell;
 }
 
-.input-group-addon:not(:first-child):not(:last-child),
-.input-group-btn:not(:first-child):not(:last-child),
-.input-group .form-control:not(:first-child):not(:last-child) {
+.input-group-addon:not(:first-child, :first-child, :first-child):not(:last-child, :last-child, :last-child),
+.input-group-btn:not(:first-child, :first-child, :first-child):not(:last-child, :last-child, :last-child),
+.input-group .form-control:not(:first-child, :first-child, :first-child):not(:last-child, :last-child, :last-child) {
   border-radius: 0;
 }
 
diff --git a/ui/css/src/modules/_buttons.scss b/ui/css/src/modules/_buttons.scss
index 85d9531..077a21f 100644
--- a/ui/css/src/modules/_buttons.scss
+++ b/ui/css/src/modules/_buttons.scss
@@ -23,6 +23,14 @@
     font-size: 13pt;
 }
 
+.btn-xs, .btn-group-xs > .btn {
+    font-size: 10.5pt;
+}
+
+.btn-sm, .btn-group-sm > .btn  {
+    font-size: 11.5pt;
+}
+
 .btn-login {
   @include button-variant($btn-login-color, $btn-login-bg, $btn-login-border);
 }
\ No newline at end of file
diff --git a/ui/css/src/modules/_wok-forms.scss b/ui/css/src/modules/_wok-forms.scss
index d426a60..c3f722a 100644
--- a/ui/css/src/modules/_wok-forms.scss
+++ b/ui/css/src/modules/_wok-forms.scss
@@ -75,6 +75,7 @@ input[type=checkbox].wok-checkbox + label:before {
 input[type=checkbox].wok-checkbox:checked + label:before {
     content: "\f14a";
     letter-spacing: 8px;
+    margin-right: 0.9px // Sub-pixel unit for Chrome and Firefox anti-alias
 }
 
 input[type=radio].wok-radio + label:before {
diff --git a/ui/css/src/modules/_wok-grid.scss b/ui/css/src/modules/_wok-grid.scss
index 730d224..152811d 100644
--- a/ui/css/src/modules/_wok-grid.scss
+++ b/ui/css/src/modules/_wok-grid.scss
@@ -36,23 +36,17 @@
     top: 37px !important;
 }
 
-.wok-list-cell {
-    position: relative;
-    padding-left: 45px;
+.wok-list-content {
+    border-top: 1px solid $table-first-row-border-color;
 }
 
-.wok-repository-status {
-    position: absolute;
-    left: 6px;
-    top: 0;
-}
-
-.wok-repository-status .fa {
-    font-size: 23px;
-    color: $fa-green;
+.wok-list-cell {
+    position: relative;
+    padding-left: 10px;
 }
 
-.wok-list-name, .wok-list-description {
+.wok-list-name,
+.wok-list-description {
     display: block;
 }
 
@@ -67,47 +61,231 @@
     overflow: hidden;
 }
 
-.wok-list-content tbody tr,  .wok-list-content tbody tr * {
+.wok-list-item-status {
+    float: left;
+    margin-top: 12px;
+    margin-right: 8px;
+    margin-bottom: 6px;
+    height: 25px;
+}
+
+.wok-list-item-status > .fa {
+    font-size: 23px;
+    color: $fa-green;
+}
+
+.wok-list-item-status.disabled > .fa:before {
+    display: block;
+    width: 19px;
+    height: 23px;
+    padding: 0;
+    border: 0;
+    content: "";
+}
+
+.wok-list-cell.disabled span {
+    color: $gray-light;
+}
+
+.wok-list-action-button-container {
+    padding-bottom: 16px;
+}
+
+.wok-list-loading-icon-inline {
+    background: transparent url('#{$wok-icon-path}/spin5.svg') no-repeat 50% 50%;
+    @include animation(spin 3s infinite linear);
+    height: 16px;
+    width: 16px;
+    background-size: 100%;
+    display: none;
+    position: absolute;
+}
+
+.generating .wok-list-description {
+    padding-left: 24px;
+}
+
+.generating .wok-list-loading-icon-inline {
+    display: block;
+    position: absolute;
+    top: 27px;
+    left: 14px;
+}
+
+.wok-list > ul {
+    list-style: none;
+    padding: 0;
+}
+
+.wok-list > ul > li,
+.wok-list > ul > li * {
     @include user-select(none);
 }
 
-.wok-list-content tbody tr:hover {
+.wok-list > ul > li,
+.wok-list > ul > li > label {
+    width: 100%;
+}
+
+.wok-list > ul > li {
+    border-top: 1px solid $table-border-color;
+    background: $table-bg;
+    position: relative;
+    @include transition(background .1s ease-in-out);
+}
+
+.wok-list > ul > li:first-child {
+    border: 0;
+}
+
+.wok-list > ul > li:nth-of-type(even) {
+    background: $table-bg-accent;
+}
+
+.wok-list  > ul > li.selected {
+    background: $table-bg-hover;
+}
+
+.wok-list > ul > li > label {
+    cursor: pointer !important;
+    text-decoration: none;
+    margin-bottom: 0;
+    padding-bottom: 5px;
+}
+
+.wok-list > ul > li > label:hover {
     text-decoration: underline;
-    cursor: pointer;
 }
 
-.wok-list-content tbody tr.generating:hover {
+.wok-list > ul > li.generating > label:hover {
     text-decoration: none;
     cursor: default;
 }
 
-.wok-list-content tbody tr.selected {
-    background: #ddd;
+.wok-list > ul > li > input[type=checkbox] {
+    left: -15px;
 }
 
-span.wok-repository-status.disabled {
-    display: none;
+.wok-list > ul > li > input[type=checkbox].wok-checkbox + label:before {
+    float: left;
+    height: 30px;
+    margin-top: 13px;
 }
 
-.wok-list-cell.disabled span {
-    color: #999;
+// Mobile first
+
+.wok-list-action-button-container {
+    background: $body-bg;
+    z-index: 1;
+    position: relative;
+    @include box-shadow(0 20px 20px -20px rgba(0,0,0,.4));
 }
 
-.wok-single-button {
-    padding-bottom: 16px;
-    margin-top: -11px;
+.mobile-action {
+    width: 100%;
 }
 
-.generating .wok-list-description {
-    padding-left: 24px;
+.mobile-action .btn {
+    width: 100%;
+    height: 40px;
+    border-radius: 0;
 }
 
-.generating .wok-list-loading-icon-inline {
-    background: transparent url('#{$wok-icon-path}/spin5.svg') no-repeat 50% 50%;
-    @include animation(spin 3s infinite linear);
-    height: 16px;
-    width: 16px;
-    background-size: 100%;
-    display: block;
-    position: absolute;
+.mobile-action > .btn {
+    border-radius: $border-radius-base;
 }
+
+.mobile-action.open > .btn {
+    border-radius: $border-radius-base $border-radius-base 0 0;
+}
+
+.mobile-action .btn span.mobile-action-label {
+    font-weight: 600;
+}
+
+.mobile-action .btn span.mobile-action-count {
+    font-weight: 300;
+}
+
+.mobile-action .btn span.mobile-action-count strong {
+    font-weight: 600;
+    font-size: 11pt;
+}
+
+.mobile-action .dropdown-menu {
+    width: 100%;
+    border: 0;
+    box-shadow: none;
+    background: transparent;
+    padding: 0;
+    margin: 0;
+    border-radius: 0;
+}
+
+.mobile-action.open .dropdown-menu .btn {
+    border-radius: 0;
+}
+
+.mobile-action.open .dropdown-menu li:last-child .btn {
+    border-radius: 0 0 $border-radius-base $border-radius-base;
+}
+
+.mobile-action .dropdown-menu li > .btn.disabled,
+.mobile-action .dropdown-menu li > .btn[disabled] {
+    opacity: 1;
+    background: #585758;
+    border-color: #585758;
+    color: #ddd;
+}
+
+// Reset Mobile styles to mimic desktop when min-width is bigger than 768px wide
+
+@media (min-width: $screen-md-min) {
+
+    .wok-list-action-button-container {
+        @include box-shadow(none);
+    }
+
+    .wok-list-action-button-container .dropdown-toggle {
+        display: none;
+    }
+
+    .wok-list-action-button-container .mobile-action {
+        position: static;
+        height: 40px;
+    }
+
+    .wok-list-action-button-container .mobile-action .btn {
+        width: auto;
+    }
+
+    .wok-list-action-button-container .mobile-action li:first-child .btn {
+        border-top-left-radius: 4px;
+        border-bottom-left-radius: 4px;
+    }
+
+
+    .wok-list-action-button-container .mobile-action li:last-child .btn {
+        border-top-left-radius: 0;
+        border-bottom-left-radius: 0 !important;
+        border-top-right-radius: $border-radius-base !important;
+        border-bottom-right-radius: $border-radius-base;
+    }
+
+    .wok-list-action-button-container > .dropdown.mobile-action > .dropdown-menu {
+        display: block;
+        vertical-align: middle;
+        position: absolute;
+        top: 0;
+    }
+
+    .wok-list-action-button-container > .dropdown.mobile-action > .dropdown-menu > li {
+        display: inline-block;
+    }
+
+    .wok-list > ul > li > input[type=checkbox].wok-checkbox:focus + label {
+        outline: auto 5px $input-border-focus; // Accessibility
+        outline: auto 5px -webkit-focus-ring-color; // Set default webkit focus ring color for webkit browsers
+    }
+
+}
\ No newline at end of file
diff --git a/ui/css/src/modules/_wok-variables.scss b/ui/css/src/modules/_wok-variables.scss
index 9f53cb2..c58feba 100644
--- a/ui/css/src/modules/_wok-variables.scss
+++ b/ui/css/src/modules/_wok-variables.scss
@@ -164,8 +164,8 @@ $padding-large-horizontal:  16px !default;
 $padding-small-vertical:    5px !default;
 $padding-small-horizontal:  10px !default;
 
-$padding-xs-vertical:       1px !default;
-$padding-xs-horizontal:     5px !default;
+$padding-xs-vertical:       2px !default;
+$padding-xs-horizontal:     10px !default;
 
 $line-height-large:         1.3333333 !default; // extra decimals for Win 8.1 Chrome
 $line-height-small:         1.5 !default;
diff --git a/ui/css/wok.css b/ui/css/wok.css
index 615cdea..d296167 100644
--- a/ui/css/wok.css
+++ b/ui/css/wok.css
@@ -336,6 +336,14 @@ body {
   font-size: 13pt;
 }
 
+.btn-xs, .btn-group-xs > .btn {
+  font-size: 10.5pt;
+}
+
+.btn-sm, .btn-group-sm > .btn {
+  font-size: 11.5pt;
+}
+
 .btn-login {
   color: #fff;
   background-color: #008abf;
@@ -676,23 +684,17 @@ fieldset[disabled] .btn-login.active {
   top: 37px !important;
 }
 
-.wok-list-cell {
-  position: relative;
-  padding-left: 45px;
+.wok-list-content {
+  border-top: 1px solid #e3e3e3;
 }
 
-.wok-repository-status {
-  position: absolute;
-  left: 6px;
-  top: 0;
-}
-
-.wok-repository-status .fa {
-  font-size: 23px;
-  color: #a8d46f;
+.wok-list-cell {
+  position: relative;
+  padding-left: 10px;
 }
 
-.wok-list-name, .wok-list-description {
+.wok-list-name,
+.wok-list-description {
   display: block;
 }
 
@@ -707,54 +709,227 @@ fieldset[disabled] .btn-login.active {
   overflow: hidden;
 }
 
-.wok-list-content tbody tr, .wok-list-content tbody tr * {
+.wok-list-item-status {
+  float: left;
+  margin-top: 12px;
+  margin-right: 8px;
+  margin-bottom: 6px;
+  height: 25px;
+}
+
+.wok-list-item-status > .fa {
+  font-size: 23px;
+  color: #a8d46f;
+}
+
+.wok-list-item-status.disabled > .fa:before {
+  display: block;
+  width: 19px;
+  height: 23px;
+  padding: 0;
+  border: 0;
+  content: "";
+}
+
+.wok-list-cell.disabled span {
+  color: #999;
+}
+
+.wok-list-action-button-container {
+  padding-bottom: 16px;
+}
+
+.wok-list-loading-icon-inline {
+  background: transparent url("/images/theme-default/spin5.svg") no-repeat 50% 50%;
+  -webkit-animation: spin 3s infinite linear;
+  -o-animation: spin 3s infinite linear;
+  animation: spin 3s infinite linear;
+  height: 16px;
+  width: 16px;
+  background-size: 100%;
+  display: none;
+  position: absolute;
+}
+
+.generating .wok-list-description {
+  padding-left: 24px;
+}
+
+.generating .wok-list-loading-icon-inline {
+  display: block;
+  position: absolute;
+  top: 27px;
+  left: 14px;
+}
+
+.wok-list > ul {
+  list-style: none;
+  padding: 0;
+}
+
+.wok-list > ul > li,
+.wok-list > ul > li * {
   -webkit-user-select: none;
   -moz-user-select: none;
   -ms-user-select: none;
   user-select: none;
 }
 
-.wok-list-content tbody tr:hover {
+.wok-list > ul > li,
+.wok-list > ul > li > label {
+  width: 100%;
+}
+
+.wok-list > ul > li {
+  border-top: 1px solid #eee;
+  background: #fff;
+  position: relative;
+  -webkit-transition: background 0.1s ease-in-out;
+  -o-transition: background 0.1s ease-in-out;
+  transition: background 0.1s ease-in-out;
+}
+
+.wok-list > ul > li:first-child {
+  border: 0;
+}
+
+.wok-list > ul > li:nth-of-type(even) {
+  background: #fcfcfc;
+}
+
+.wok-list > ul > li.selected {
+  background: #ddd;
+}
+
+.wok-list > ul > li > label {
+  cursor: pointer !important;
+  text-decoration: none;
+  margin-bottom: 0;
+  padding-bottom: 5px;
+}
+
+.wok-list > ul > li > label:hover {
   text-decoration: underline;
-  cursor: pointer;
 }
 
-.wok-list-content tbody tr.generating:hover {
+.wok-list > ul > li.generating > label:hover {
   text-decoration: none;
   cursor: default;
 }
 
-.wok-list-content tbody tr.selected {
-  background: #ddd;
+.wok-list > ul > li > input[type=checkbox] {
+  left: -15px;
 }
 
-span.wok-repository-status.disabled {
-  display: none;
+.wok-list > ul > li > input[type=checkbox].wok-checkbox + label:before {
+  float: left;
+  height: 30px;
+  margin-top: 13px;
 }
 
-.wok-list-cell.disabled span {
-  color: #999;
+.wok-list-action-button-container {
+  background: #fff;
+  z-index: 1;
+  position: relative;
+  -webkit-box-shadow: 0 20px 20px -20px rgba(0, 0, 0, 0.4);
+  box-shadow: 0 20px 20px -20px rgba(0, 0, 0, 0.4);
 }
 
-.wok-single-button {
-  padding-bottom: 16px;
-  margin-top: -11px;
+.mobile-action {
+  width: 100%;
 }
 
-.generating .wok-list-description {
-  padding-left: 24px;
+.mobile-action .btn {
+  width: 100%;
+  height: 40px;
+  border-radius: 0;
 }
 
-.generating .wok-list-loading-icon-inline {
-  background: transparent url("/images/theme-default/spin5.svg") no-repeat 50% 50%;
-  -webkit-animation: spin 3s infinite linear;
-  -o-animation: spin 3s infinite linear;
-  animation: spin 3s infinite linear;
-  height: 16px;
-  width: 16px;
-  background-size: 100%;
-  display: block;
-  position: absolute;
+.mobile-action > .btn {
+  border-radius: 3px;
+}
+
+.mobile-action.open > .btn {
+  border-radius: 3px 3px 0 0;
+}
+
+.mobile-action .btn span.mobile-action-label {
+  font-weight: 600;
+}
+
+.mobile-action .btn span.mobile-action-count {
+  font-weight: 300;
+}
+
+.mobile-action .btn span.mobile-action-count strong {
+  font-weight: 600;
+  font-size: 11pt;
+}
+
+.mobile-action .dropdown-menu {
+  width: 100%;
+  border: 0;
+  box-shadow: none;
+  background: transparent;
+  padding: 0;
+  margin: 0;
+  border-radius: 0;
+}
+
+.mobile-action.open .dropdown-menu .btn {
+  border-radius: 0;
+}
+
+.mobile-action.open .dropdown-menu li:last-child .btn {
+  border-radius: 0 0 3px 3px;
+}
+
+.mobile-action .dropdown-menu li > .btn.disabled,
+.mobile-action .dropdown-menu li > .btn[disabled] {
+  opacity: 1;
+  background: #585758;
+  border-color: #585758;
+  color: #ddd;
+}
+
+@media (min-width: 992px) {
+  .wok-list-action-button-container {
+    -webkit-box-shadow: none;
+    box-shadow: none;
+  }
+  .wok-list-action-button-container .dropdown-toggle {
+    display: none;
+  }
+  .wok-list-action-button-container .mobile-action {
+    position: static;
+    height: 40px;
+  }
+  .wok-list-action-button-container .mobile-action .btn {
+    width: auto;
+  }
+  .wok-list-action-button-container .mobile-action li:first-child .btn {
+    border-top-left-radius: 4px;
+    border-bottom-left-radius: 4px;
+  }
+  .wok-list-action-button-container .mobile-action li:last-child .btn {
+    border-top-left-radius: 0;
+    border-bottom-left-radius: 0 !important;
+    border-top-right-radius: 3px !important;
+    border-bottom-right-radius: 3px;
+  }
+  .wok-list-action-button-container > .dropdown.mobile-action > .dropdown-menu {
+    display: block;
+    vertical-align: middle;
+    position: absolute;
+    top: 0;
+  }
+  .wok-list-action-button-container > .dropdown.mobile-action > .dropdown-menu > li {
+    display: inline-block;
+  }
+  .wok-list > ul > li > input[type=checkbox].wok-checkbox:focus + label {
+    outline: auto 5px #66afe9;
+    outline: auto 5px -webkit-focus-ring-color;
+  }
 }
 
 .grid-control {
@@ -948,6 +1123,7 @@ input[type=checkbox].wok-checkbox + label:before {
 input[type=checkbox].wok-checkbox:checked + label:before {
   content: "\f14a";
   letter-spacing: 8px;
+  margin-right: 0.9px;
 }
 
 input[type=radio].wok-radio + label:before {
@@ -1105,7 +1281,7 @@ input[type=radio].wok-radio + label {
 /*
 * Project Wok
 *
-* Copyright IBM Corp, 2015-2016
+* Copyright IBM Corp, 2016
 *
 * Code derived from Project Kimchi
 *
diff --git a/ui/js/src/wok.list.js b/ui/js/src/wok.list.js
index 7d8e27c..f40b2e2 100644
--- a/ui/js/src/wok.list.js
+++ b/ui/js/src/wok.list.js
@@ -24,6 +24,7 @@ wok.widget.List = function(opts) {
 
 wok.widget.List.prototype = (function() {
     "use strict";
+
     var htmlStr = [
         '<div id="{id}-section" class="panel panel-default">',
             '<div class="panel-heading">',
@@ -39,13 +40,19 @@ wok.widget.List.prototype = (function() {
                             '</button></p>',
                         '</div>',
                     '</div>',
-                    '<div id="{id}-btn-group" class="btn-group wok-single-button hidden">',
-
+                    '<div id="{id}-action-group" class="wok-list-action-button-container">',
+                        '<div class="dropdown mobile-action">',
+                            '<button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown" aria-expanded="false">',
+                                '<span class="mobile-action-label">Actions</span>', // TODO: Replace with i18n string
+                            '</button>',
+                            '<ul class="dropdown-menu" role="menu">',
+                            '</ul>',
+                        '</div>',
                     '</div>',
                     '<div id="{id}" class="row clearfix">',
                         '<div class="wok-list-content">',
-                            '<table class="wok-list-table table table-striped" id="list">',
-                            '</table>',
+                            '<div class="wok-list" id="list">',
+                            '</div>',
                         '</div>',
                     '</div>',
                     '<div class="wok-list-mask hidden">',
@@ -80,112 +87,95 @@ wok.widget.List.prototype = (function() {
         return (result);
     };
 
-
-    var fillButton = function(btnContainer){
-        var addOrGenerateBtn = this.opts.toolbarButtons[0];
-        var singleBtnHTML = [
-                '<a class="btn btn-primary" href="#"', (addOrGenerateBtn.id ? (' id="' + addOrGenerateBtn.id + '"') : ''),' role="button">',
-                    addOrGenerateBtn.class ? ('<i class="' + addOrGenerateBtn.class) + '"></i> ' : '',
-                    addOrGenerateBtn.label,
-                '</a>'
-            ].join('');
-            var singleBtn = $(singleBtnHTML).appendTo(btnContainer);
-            $(singleBtn).click(function(e) {
-              e.preventDefault();
-            });
-            addOrGenerateBtn.onClick && singleBtn.on('click', addOrGenerateBtn.onClick);
+    var fillButtons = function(btnContainer){
+        var toolbarButtons = this.opts.toolbarButtons;
+        $.each(toolbarButtons, function(i, button) {
+                var btnHTML = [
+                    '<li class="',
+                    (button.critical === true ? 'critical' : ''),
+                    ,'">',
+                        '<btn data-dismiss="modal"',
+                        (button.id ? (' id="' + button.id + '"') : ''),
+                        ' class="btn btn-primary"',
+                        (button.disabled === true ? ' disabled="disabled"' : ''),
+                        '">',
+                            button.class ? ('<i class="' + button.class) + '"></i> ' : ' ',
+                            button.label,
+                        '</btn>',
+                    '</li>'
+                ].join('');
+                var btnNode = $(btnHTML).appendTo(btnContainer);
+                button.onClick && btnNode.on('click', button.onClick);
+        });
     };
 
     var fillBody = function(container, fields) {
-
-        var toolbarButtons = this.opts.toolbarButtons;
-        var actionDropdownHtml;
         var data = this.data;
-        var tbody = ($('tbody', container).length && $('tbody', container)) || $('<tbody></tbody>').appendTo(container);
+        var tbody = ($('ul', container).length && $('ul', container)) || $('<ul></ul>').appendTo(container);
         tbody.empty();
         if (typeof data !== 'undefined' && data.length > 0) {
             $.each(data, function(i, row) {
-                var rowNode = $('<tr></tr>').appendTo(tbody);
+                var rowNode = $('<li></li>').appendTo(tbody);
                 var columnNodeHTML;
                 var columnData = '';
                 var state = '';
                 var styleClass = '';
-                if (toolbarButtons) {
-                    actionDropdownHtml = [
-                        '<td>',
-                            '<div class="dropdown menu-flat">',
-                                '<button id="wok-dropdown-button-', i, '" class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown">',
-                                    '<span class="edit-alt"></span>Actions<span class="caret"></span>',
-                                '</button>',
-                                '<ul class="dropdown-menu" role="menu" aria-labelledby="action-dropdown-menu-', i, '">',
-                                '</ul>',
-                            '</div>',
-                        '</td>'
-                    ].join('');
-                }
+                var checkboxName = $('ul', container).parent().parent().parent().attr('id') + '-check' || $(container).parent().parent().parent().attr('id') + '-check';
                 $.each(fields, function(fi, field) {
                     var value = getValue(field.name, row);
                     if (field.type === 'status' && field.name === 'enabled') {
                         styleClass = (value === true ? '' : ' disabled');
                         state = [
-                            '<span class="wok-repository-status ',
+                            '<span class="wok-list-item-status ',
                             value === true ? 'enabled' : 'disabled',
-                            '"><i class="fa fa-power-off"></i></span>'
+                            '"><i class="fa fa-power-off"></i><span class="sr-only">',
+                            value === true ? 'Enabled' : 'Disabled',
+                            '</span></span>'
                         ].join('');
                     }
-                    columnData += (field.type === 'name') ? ('<span class="wok-list-name">' + value.toString() + '</span>') : (field.type !== 'status' ? '<span class="wok-list-loading-icon-inline"></span><span class="wok-list-description">' + value.toString() + '</span>' : '');
-
-                });
-                columnNodeHTML = [
-                    '<td>',
-                        '<div class="wok-list-cell', styleClass, '">', state,
-                            columnData,
-                        '</div>',
-                    '</td>'
-                ].join('');
-                $(columnNodeHTML).appendTo(rowNode);
-
-                var actionMenuNode = $(actionDropdownHtml).appendTo(rowNode);
-
-                $.each(toolbarButtons, function(i, button) {
-                    var btnHTML = [
-                        '<li role="presentation"', button.critical === true ? ' class="critical"' : '', '>',
-                        '<a role="menuitem" tabindex="-1" data-dismiss="modal"', (button.id ? (' id="' + button.id + '"') : ''), (button.disabled === true ? ' class="disabled"' : ''),
-                        '>',
-                        button.class ? ('<i class="' + button.class) + '"></i>' : '',
-                        button.label,
-                        '</a></li>'
+                    columnData += (field.type === 'name') ? ('<span role="status" class="wok-list-loading-icon-inline"></span><span class="wok-list-name '+field.cssClass+'" title="'+field.label+'">'+value.toString()+'</span>') : (field.type !== 'status' ? '<span class="wok-list-description '+field.cssClass+'" title="'+field.label+'">' + value.toString() + '</span>' : '');
+                    columnNodeHTML = [
+                        '<input class="wok-checkbox" type="checkbox" name="'+checkboxName+'" id="wok-list-',i+1,'-check" />',
+                            '<label for="wok-list-',i+1,'-check" class="wok-list-cell', styleClass, '">',
+                                state,
+                                columnData,
+                            '</div>',
+                        '</label>'
                     ].join('');
-                    var btnNode = $(btnHTML).appendTo($('.dropdown-menu', rowNode));
-                    button.onClick && btnNode.on('click', button.onClick);
                 });
+                $(columnNodeHTML).appendTo(rowNode);
             });
         }
     };
 
-    var stylingRow = function(row, className, add) {
-        var index = $(row).index() + 1;
-        $('tr', this.bodyContainer)
-            .removeClass(className);
-        if (add === false) {
-            return;
-        }
-        $('tr:nth-child(' + index + ')', this.bodyContainer)
-            .addClass(className);
+    var stylingRow = function(grid, className) {
+        $('li',grid.bodyContainer).removeClass(className);
+        $.each(grid.selectedIndex, function(){
+            var nth = this + 1;
+            $('li:nth-child('+nth+')',grid.bodyContainer).addClass(className);
+        });
     };
 
     var setBodyListeners = function() {
-        if (this['opts']['rowSelection'] != 'disabled') {
-
-            $('tr', this.bodyContainer).on('click', {
+        if (this['opts']['rowSelection'] !== 'disabled') {
+            $('li:not(.generating) input[type="checkbox"]', this.bodyContainer).on('change', {
                 grid: this
-            }, function(event) {
+            },function(event) {
                 var grid = event.data.grid;
-                if (!$(this).hasClass('generating')) {
-                    grid.selectedIndex = $(this).index();
-                    stylingRow.call(grid, this, 'selected');
-                    grid['opts']['onRowSelected'] && grid['opts']['onRowSelected']();
+                grid.selectedIndex = [];
+                $("li :checkbox:checked", this.bodyContainer).map(function() {
+                    return $(this).parent().index();
+                }).each(function() {
+                    grid.selectedIndex.push(this);
+                });
+                if ($('.mobile-action-count',grid.buttonActionContainer).length) {
+                    $('.mobile-action-count',grid.buttonActionContainer).remove();
                 }
+                if(grid.selectedIndex.length){
+                    $(grid.buttonActionContainer).append('<span class="mobile-action-count"> ( <strong>'+grid.selectedIndex.length+' item(s)</strong> selected )</span>');
+                }
+                stylingRow.call(grid, grid, 'selected');
+                grid['opts']['onRowSelected'] && grid['opts']['onRowSelected']();
             });
         }
     };
@@ -197,7 +187,13 @@ wok.widget.List.prototype = (function() {
     };
 
     var getSelected = function() {
-        return this.selectedIndex >= 0 ? this.data[this.selectedIndex] : null;
+        var selectedItems = [];
+        for (var i = 0; i < this.selectedIndex.length; i++ ){
+            var value = this.selectedIndex[i];
+            selectedItems.push(this.data[value]);
+        }
+        // return this.selectedIndex >= 0 ? this.data[this.selectedIndex] : null;
+        return selectedItems;
     };
 
     var showMessage = function(msg) {
@@ -255,11 +251,17 @@ wok.widget.List.prototype = (function() {
             titleNode = $('<h3 class="panel-title">' + title + '</h3>').appendTo(titleContainer);
         }
 
-        var bodyContainer = $('.wok-list-table.table.table-striped', domNode);
+        var bodyContainer = $('.wok-list', domNode);
         this.bodyContainer = bodyContainer;
 
-        var singleButtonContainer = $('.wok-single-button', domNode);
-        this.singleButtonContainer = singleButtonContainer;
+        var selectButtonContainer = $('.wok-list-action-button-container', domNode);
+        this.selectButtonContainer = selectButtonContainer;
+
+        var buttonActionGroupContainer = $('.wok-list-action-button-container .dropdown-menu', domNode);
+        this.buttonActionGroupContainer = buttonActionGroupContainer;
+
+        var buttonActionContainer = $('.mobile-action .dropdown-toggle.btn', domNode);
+        this.buttonActionContainer = buttonActionContainer;
 
         var gridBody = $('.wok-list-content', domNode);
         this.gridBody = gridBody;
@@ -270,8 +272,7 @@ wok.widget.List.prototype = (function() {
         var messageNode = $('.wok-list-message', domNode);
         this.messageNode = messageNode;
 
-
-        fillButton.call(this,this.singleButtonContainer);
+        fillButtons.call(this,this.buttonActionGroupContainer);
 
         $('.retry-button', domNode).on('click', {
             grid: this
@@ -279,7 +280,6 @@ wok.widget.List.prototype = (function() {
             event.data.grid.reload();
         });
 
-
     };
 
     return {
@@ -299,4 +299,4 @@ wok.widget.List.prototype = (function() {
         reload: reload,
         showMessage: showMessage
     };
-})();
+})();
\ No newline at end of file