bastion 4.1.0 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/javascripts/bastion/components/nutupane-table.directive.js +0 -7
- data/app/assets/javascripts/bastion/components/nutupane.factory.js +11 -1
- data/app/assets/javascripts/bastion/components/table-cache.service.js +4 -0
- data/app/assets/javascripts/bastion/layouts/details-page-with-breadcrumbs.html +3 -1
- data/app/assets/javascripts/bastion/layouts/partials/page-header-with-actions.html +10 -6
- data/app/assets/javascripts/bastion/layouts/partials/table.html +49 -49
- data/app/assets/stylesheets/bastion/bastion.scss +5 -2
- data/app/assets/stylesheets/bastion/components.scss +0 -10
- data/app/assets/stylesheets/bastion/nutupane.scss +4 -4
- data/app/assets/stylesheets/bastion/overrides.scss +22 -8
- data/app/assets/stylesheets/bastion/tables.scss +46 -0
- data/lib/bastion/version.rb +1 -1
- data/test/components/nutupane.factory.test.js +23 -0
- data/test/components/table-cache.service.test.js +8 -1
- metadata +10 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b6d287c667939df014a45086236bd915114ebf8
|
4
|
+
data.tar.gz: 40d47f913d1b43f0f4c2a2240b467c6737d51ac6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7d423ce033cd373f3acb0d4416f3305cad5f04ce36591c3dc16c038dd6253112df538ced1dd1eedaa9839469f4328221dbdf86eb9b9072bbaf278a88ad31d3f0
|
7
|
+
data.tar.gz: 2d2f4506c5f5b55f83c17afb67461f0beebed6b6b93a030c1b140cc8d951b3acd1de8045ec3644f4e277669edaa8e4e80278ff57efaee95b90f17ede61461d47
|
@@ -33,7 +33,6 @@ angular.module('Bastion.components').directive('nutupaneTable', ['$compile', '$w
|
|
33
33
|
clonedTable.removeAttr("nutupane-table");
|
34
34
|
clonedTable.addClass("cloned-nutupane-table");
|
35
35
|
clonedTable.find('tbody').remove();
|
36
|
-
clonedTable.find('thead tr').append('<th class="table-header-spacer"></th>');
|
37
36
|
|
38
37
|
originalTable.find('thead').hide();
|
39
38
|
|
@@ -46,12 +45,6 @@ angular.module('Bastion.components').directive('nutupaneTable', ['$compile', '$w
|
|
46
45
|
angular.element(rowSelect).remove();
|
47
46
|
}
|
48
47
|
|
49
|
-
windowElement.bind('resize', function () {
|
50
|
-
if (element.find('[bst-container-scroll]').length > 0) {
|
51
|
-
clonedTable.find('thead tr th:last-child').width(element.width() - element.find('[bst-container-scroll]')[0].scrollWidth);
|
52
|
-
}
|
53
|
-
});
|
54
|
-
|
55
48
|
// Compile each cloned th individually with original th scope
|
56
49
|
// so sort will work.
|
57
50
|
clonedThs = element.find('.cloned-nutupane-table th');
|
@@ -36,8 +36,12 @@ angular.module('Bastion.components').factory('Nutupane',
|
|
36
36
|
var self = this,
|
37
37
|
orgSwitcherRegex = new RegExp("/(organizations|locations)/(.+/)*(select|clear)");
|
38
38
|
|
39
|
+
// TODO: remove me
|
40
|
+
// http://projects.theforeman.org/issues/18079
|
41
|
+
TableCache.setTable = function () {};
|
42
|
+
|
39
43
|
function getTableName() {
|
40
|
-
return $location.path().split('/').join('-');
|
44
|
+
return $location.path().split('/').join('-').slice(1);
|
41
45
|
}
|
42
46
|
|
43
47
|
params = params || {};
|
@@ -192,11 +196,17 @@ angular.module('Bastion.components').factory('Nutupane',
|
|
192
196
|
};
|
193
197
|
|
194
198
|
self.refresh = function () {
|
199
|
+
self.invalidate();
|
195
200
|
self.table.refreshing = true;
|
196
201
|
self.table.resource.page = 0;
|
202
|
+
self.table.numSelected = 0;
|
197
203
|
return self.load(true);
|
198
204
|
};
|
199
205
|
|
206
|
+
self.invalidate = function () {
|
207
|
+
TableCache.removeTable(getTableName());
|
208
|
+
};
|
209
|
+
|
200
210
|
self.removeRow = function (id, field) {
|
201
211
|
var foundItem, table = self.table;
|
202
212
|
|
@@ -1,9 +1,13 @@
|
|
1
|
-
<div class="row
|
2
|
-
<div class="col-sm-
|
3
|
-
<
|
1
|
+
<div class="row">
|
2
|
+
<div class="col-sm-9">
|
3
|
+
<h1>
|
4
|
+
<span data-block="header"></span>
|
5
|
+
</h1>
|
4
6
|
</div>
|
5
7
|
|
6
|
-
<div class="
|
7
|
-
<
|
8
|
+
<div class="col-sm-3">
|
9
|
+
<h1 class="fr">
|
10
|
+
<span data-block="item-actions"></span>
|
11
|
+
</h1>
|
8
12
|
</div>
|
9
|
-
</div>
|
13
|
+
</div>
|
@@ -1,21 +1,22 @@
|
|
1
|
-
<div class="row
|
2
|
-
<div class="
|
3
|
-
<
|
4
|
-
<div
|
5
|
-
|
6
|
-
|
1
|
+
<div class="row toolbar-pf table-view-pf-toolbar-external" ng-class="{'empty-table': table.rows.length === 0}">
|
2
|
+
<div class="col-sm-12">
|
3
|
+
<form class="toolbar-pf-actions">
|
4
|
+
<div class="toolbar-pf-action-right">
|
5
|
+
<div data-block="list-actions"></div>
|
6
|
+
</div>
|
7
|
+
|
8
|
+
<div class="form-group toolbar-pf-filter">
|
9
|
+
<div data-block="search">
|
10
|
+
<div class="input-group">
|
11
|
+
<input type="text"
|
12
|
+
class="form-control"
|
13
|
+
placeholder="{{ 'Filter...' | translate }}"
|
14
|
+
bst-on-enter="table.search(table.searchTerm)"
|
15
|
+
ng-model="table.searchTerm"
|
16
|
+
ng-trim="false"
|
17
|
+
uib-typeahead="item.label for item in table.autocomplete($viewValue)"
|
18
|
+
typeahead-template-url="components/views/autocomplete-scoped-search.html"/>
|
7
19
|
|
8
|
-
<div data-block="search">
|
9
|
-
<div class="col-sm-3">
|
10
|
-
<div class="input-group">
|
11
|
-
<input type="text"
|
12
|
-
class="form-control"
|
13
|
-
placeholder="{{ 'Filter...' | translate }}"
|
14
|
-
bst-on-enter="table.search(table.searchTerm)"
|
15
|
-
ng-model="table.searchTerm"
|
16
|
-
ng-trim="false"
|
17
|
-
uib-typeahead="item.label for item in table.autocomplete($viewValue)"
|
18
|
-
typeahead-template-url="components/views/autocomplete-scoped-search.html"/>
|
19
20
|
<span class="input-group-btn">
|
20
21
|
<button class="btn btn-default"
|
21
22
|
type="button"
|
@@ -31,48 +32,47 @@
|
|
31
32
|
</button>
|
32
33
|
<ul bst-bookmark controller-name="controllerName" query="table.searchTerm" class="dropdown-menu pull-right"></ul>
|
33
34
|
</span>
|
35
|
+
</div>
|
36
|
+
</div>
|
34
37
|
|
38
|
+
<span data-block="filters"></span>
|
39
|
+
<span data-block="search-filter"></span>
|
35
40
|
</div>
|
36
|
-
</
|
41
|
+
</form>
|
37
42
|
|
38
|
-
<div class="
|
39
|
-
<
|
40
|
-
|
41
|
-
|
43
|
+
<div class="row toolbar-pf-results" ng-show="table.rows.length > 0">
|
44
|
+
<div class="col-sm-9">
|
45
|
+
<span translate>Showing {{ table.rows.length }} of {{ table.resource.subtotal }} ({{ table.resource.total }} Total)</span>
|
46
|
+
</div>
|
42
47
|
|
43
|
-
|
44
|
-
|
45
|
-
|
48
|
+
<div class="col-sm-3 table-view-pf-select-results" ng-show="table.rowSelect">
|
49
|
+
<span translate>{{ table.numSelected }} Selected</span>
|
50
|
+
</div>
|
46
51
|
</div>
|
47
52
|
</div>
|
48
53
|
</div>
|
49
54
|
|
50
|
-
<div
|
51
|
-
<div class="
|
52
|
-
<
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
</div>
|
58
|
-
|
59
|
-
<div class="row nutupane" bst-table="table" nutupane-table>
|
60
|
-
<div class="loading-mask" ng-show="table.refreshing || table.working" >
|
61
|
-
<i class="fa fa-spinner fa-spin"></i>
|
62
|
-
<span>{{ "Loading..." | translate }}</span>
|
63
|
-
</div>
|
55
|
+
<div bst-table="table" nutupane-table>
|
56
|
+
<div class="row">
|
57
|
+
<div class="col-sm-12">
|
58
|
+
<div class="loading-mask" ng-show="table.refreshing || table.working" >
|
59
|
+
<i class="fa fa-spinner fa-spin"></i>
|
60
|
+
<span>{{ "Loading..." | translate }}</span>
|
61
|
+
</div>
|
64
62
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
63
|
+
<p bst-alert="info" ng-show="table.rows.length === 0 && !table.working && !table.searchTerm && !table.searchCompleted">
|
64
|
+
<span data-block="no-rows-message"></span>
|
65
|
+
</p>
|
66
|
+
<p bst-alert="info" ng-show="table.rows.length === 0 && !table.working && (table.searchTerm || table.searchCompleted)">
|
67
|
+
<span data-block="no-search-results-message"></span>
|
68
|
+
</p>
|
71
69
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
70
|
+
<div ng-show="table.rows.length > 0 && !(table.refreshing || table.working)" bst-container-scroll data="table.rows">
|
71
|
+
<div infinite-scroll="table.nextPage()" infinite-scroll-container="'.container-scroll-wrapper'"
|
72
|
+
infinite-scroll-listen-for-event="nutupane:loaded">
|
73
|
+
<div data-block="table"></div>
|
74
|
+
</div>
|
75
|
+
</div>
|
76
76
|
</div>
|
77
77
|
</div>
|
78
78
|
</div>
|
@@ -2,17 +2,20 @@
|
|
2
2
|
word-wrap: break-word;
|
3
3
|
}
|
4
4
|
|
5
|
+
@import "overrides";
|
6
|
+
@import "path-selector";
|
7
|
+
@import "tables";
|
8
|
+
|
5
9
|
.bastion {
|
6
10
|
// Bastion Components
|
11
|
+
@import "patternfly";
|
7
12
|
@import "mixins";
|
8
13
|
@import "variables";
|
9
14
|
@import "nutupane";
|
10
15
|
@import "components";
|
11
|
-
@import "overrides";
|
12
16
|
@import "helpers";
|
13
17
|
@import "./forms";
|
14
18
|
@import "animations";
|
15
|
-
@import "path-selector";
|
16
19
|
@import "typography";
|
17
20
|
|
18
21
|
body {
|
@@ -47,8 +47,8 @@ td.row-select {
|
|
47
47
|
.table {
|
48
48
|
margin-bottom: 0;
|
49
49
|
|
50
|
-
tr:hover td, tr:hover td a,
|
51
|
-
tr.focus td, tr.focus td a {
|
50
|
+
tr:hover td, tr:hover td > a,
|
51
|
+
tr.focus td, tr.focus td > a {
|
52
52
|
background-color: $listhover_color;
|
53
53
|
color: #FFF;
|
54
54
|
|
@@ -61,7 +61,7 @@ td.row-select {
|
|
61
61
|
background-color: $listhover_color;
|
62
62
|
color: #FFF;
|
63
63
|
|
64
|
-
a {
|
64
|
+
> a {
|
65
65
|
color: #FFF;
|
66
66
|
}
|
67
67
|
|
@@ -110,7 +110,7 @@ td.row-select {
|
|
110
110
|
background-color: lighten($listhover_color, 8%);
|
111
111
|
color: white;
|
112
112
|
|
113
|
-
a {
|
113
|
+
> a {
|
114
114
|
color: white;
|
115
115
|
}
|
116
116
|
}
|
@@ -1,5 +1,4 @@
|
|
1
|
-
|
2
|
-
@import "patternfly";
|
1
|
+
@import "patternfly/variables";
|
3
2
|
|
4
3
|
.filter-option label {
|
5
4
|
font-weight: normal;
|
@@ -14,7 +13,7 @@ $table-cell-padding-top: 5px;
|
|
14
13
|
$table-cell-padding-bottom: 5px;
|
15
14
|
|
16
15
|
// Foreman Core Overrides
|
17
|
-
table {
|
16
|
+
table.table {
|
18
17
|
margin-bottom: 0 !important;
|
19
18
|
}
|
20
19
|
|
@@ -44,11 +43,6 @@ ul {
|
|
44
43
|
}
|
45
44
|
}
|
46
45
|
|
47
|
-
.dropdown-menu li .disabled {
|
48
|
-
@extend .text-muted;
|
49
|
-
padding: 1px 10px;
|
50
|
-
}
|
51
|
-
|
52
46
|
.breadcrumbs .breadcrumb {
|
53
47
|
margin-bottom: 0;
|
54
48
|
}
|
@@ -60,4 +54,24 @@ ul {
|
|
60
54
|
.uib-datepicker-popup.dropdown-menu
|
61
55
|
{
|
62
56
|
display: block;
|
57
|
+
}
|
58
|
+
|
59
|
+
// Fix bad margin and border on patternfly dropdown buttons
|
60
|
+
html .toolbar-pf .toolbar-pf-filter.form-group .input-group-btn .btn {
|
61
|
+
border-bottom-left-radius: 0;
|
62
|
+
border-top-left-radius: 0;
|
63
|
+
margin-right: -1px;
|
64
|
+
margin-left: -1px;
|
65
|
+
}
|
66
|
+
|
67
|
+
// Add border to bottom of empty table
|
68
|
+
.row.toolbar-pf.table-view-pf-toolbar.empty-table{
|
69
|
+
border-bottom: 1px solid #d1d1d1;
|
70
|
+
margin-bottom: 10px;
|
71
|
+
}
|
72
|
+
|
73
|
+
// Ensure scrolling on the modal body
|
74
|
+
.modal-body {
|
75
|
+
overflow-x: hidden;
|
76
|
+
overflow-y: scroll;
|
63
77
|
}
|
@@ -0,0 +1,46 @@
|
|
1
|
+
.table {
|
2
|
+
table-layout: fixed;
|
3
|
+
|
4
|
+
.number-cell {
|
5
|
+
text-align: right;
|
6
|
+
}
|
7
|
+
|
8
|
+
.action-cell {
|
9
|
+
text-align: center;
|
10
|
+
}
|
11
|
+
|
12
|
+
tr.clickable-row,
|
13
|
+
th.sortable {
|
14
|
+
cursor: pointer;
|
15
|
+
}
|
16
|
+
|
17
|
+
th.row-select,
|
18
|
+
td.row-select {
|
19
|
+
width: 30px;
|
20
|
+
max-width: 30px;
|
21
|
+
}
|
22
|
+
|
23
|
+
tr:hover td, tr:hover td > a,
|
24
|
+
tr.focus td, tr.focus td > a {
|
25
|
+
background-color: $listhover_color;
|
26
|
+
color: #FFF;
|
27
|
+
|
28
|
+
button, select {
|
29
|
+
color: #000;
|
30
|
+
}
|
31
|
+
}
|
32
|
+
|
33
|
+
tr.active, tbody tr:hover, tr.selected-row td {
|
34
|
+
background-color: $listhover_color;
|
35
|
+
color: #FFF;
|
36
|
+
|
37
|
+
> a {
|
38
|
+
color: #FFF;
|
39
|
+
}
|
40
|
+
|
41
|
+
.bst-edit:hover {
|
42
|
+
color: #000;
|
43
|
+
}
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
data/lib/bastion/version.rb
CHANGED
@@ -3,11 +3,25 @@ describe('Factory: Nutupane', function() {
|
|
3
3
|
$location,
|
4
4
|
$rootScope,
|
5
5
|
Resource,
|
6
|
+
TableCache,
|
6
7
|
expectedResult,
|
7
8
|
Nutupane;
|
8
9
|
|
9
10
|
beforeEach(module('Bastion.components'));
|
10
11
|
|
12
|
+
beforeEach(module(function ($provide) {
|
13
|
+
TableCache = {
|
14
|
+
getTable: function () {
|
15
|
+
},
|
16
|
+
setTable: function () {
|
17
|
+
},
|
18
|
+
removeTable: function () {
|
19
|
+
}
|
20
|
+
};
|
21
|
+
|
22
|
+
$provide.value('TableCache', TableCache);
|
23
|
+
}));
|
24
|
+
|
11
25
|
beforeEach(module(function() {
|
12
26
|
expectedResult = [{id: 2, value: "value2"}, {id:3, value: "value3"}];
|
13
27
|
Resource = {
|
@@ -66,12 +80,21 @@ describe('Factory: Nutupane', function() {
|
|
66
80
|
|
67
81
|
it("providing a method to refresh the table", function() {
|
68
82
|
spyOn(Resource, 'queryPaged').and.callThrough();
|
83
|
+
spyOn(TableCache, 'removeTable');
|
84
|
+
|
69
85
|
nutupane.refresh();
|
70
86
|
|
87
|
+
expect(TableCache.removeTable).toHaveBeenCalled();
|
71
88
|
expect(Resource.queryPaged).toHaveBeenCalled();
|
72
89
|
expect(nutupane.table.rows).toBe(expectedResult);
|
73
90
|
});
|
74
91
|
|
92
|
+
it("provides a way to invalidate the table", function () {
|
93
|
+
spyOn(TableCache, 'removeTable');
|
94
|
+
nutupane.invalidate();
|
95
|
+
expect(TableCache.removeTable).toHaveBeenCalled();
|
96
|
+
});
|
97
|
+
|
75
98
|
it("providing a method to perform a search", function() {
|
76
99
|
spyOn(Resource, 'queryPaged');
|
77
100
|
nutupane.table.closeItem = function() {};
|
@@ -8,7 +8,8 @@ describe('Factory: TableCahce', function () {
|
|
8
8
|
get: function () {
|
9
9
|
return table;
|
10
10
|
},
|
11
|
-
put: function () {}
|
11
|
+
put: function () {},
|
12
|
+
remove: function () {}
|
12
13
|
};
|
13
14
|
|
14
15
|
$cacheFactory = function () {
|
@@ -29,6 +30,12 @@ describe('Factory: TableCahce', function () {
|
|
29
30
|
expect(cache.put).toHaveBeenCalledWith("table", table);
|
30
31
|
});
|
31
32
|
|
33
|
+
it("allows removing a table from the cache", function () {
|
34
|
+
spyOn(cache, 'remove').and.callThrough();
|
35
|
+
TableCache.removeTable("table");
|
36
|
+
expect(cache.remove).toHaveBeenCalledWith("table");
|
37
|
+
});
|
38
|
+
|
32
39
|
it("allows getting a table from the cache", function () {
|
33
40
|
var result;
|
34
41
|
spyOn(cache, 'get').and.callThrough();
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bastion
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric D Helms
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-01-
|
12
|
+
date: 2017-01-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: angular-rails-templates
|
@@ -29,14 +29,14 @@ dependencies:
|
|
29
29
|
name: uglifier
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- -
|
32
|
+
- - ">="
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: '0'
|
35
35
|
type: :development
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- -
|
39
|
+
- - ">="
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: '0'
|
42
42
|
description: Bastion provides a UI library of AngularJS based components designed
|
@@ -48,8 +48,8 @@ executables: []
|
|
48
48
|
extensions: []
|
49
49
|
extra_rdoc_files: []
|
50
50
|
files:
|
51
|
-
- .eslintignore
|
52
|
-
- .jshintrc
|
51
|
+
- ".eslintignore"
|
52
|
+
- ".jshintrc"
|
53
53
|
- Gruntfile.js
|
54
54
|
- LICENSE
|
55
55
|
- README.md
|
@@ -167,6 +167,7 @@ files:
|
|
167
167
|
- app/assets/stylesheets/bastion/nutupane.scss
|
168
168
|
- app/assets/stylesheets/bastion/overrides.scss
|
169
169
|
- app/assets/stylesheets/bastion/path-selector.scss
|
170
|
+
- app/assets/stylesheets/bastion/tables.scss
|
170
171
|
- app/assets/stylesheets/bastion/typography.scss
|
171
172
|
- app/assets/stylesheets/bastion/variables.scss
|
172
173
|
- app/controllers/bastion/bastion_controller.rb
|
@@ -1749,17 +1750,17 @@ require_paths:
|
|
1749
1750
|
- lib
|
1750
1751
|
required_ruby_version: !ruby/object:Gem::Requirement
|
1751
1752
|
requirements:
|
1752
|
-
- -
|
1753
|
+
- - ">="
|
1753
1754
|
- !ruby/object:Gem::Version
|
1754
1755
|
version: '0'
|
1755
1756
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
1756
1757
|
requirements:
|
1757
|
-
- -
|
1758
|
+
- - ">="
|
1758
1759
|
- !ruby/object:Gem::Version
|
1759
1760
|
version: '0'
|
1760
1761
|
requirements: []
|
1761
1762
|
rubyforge_project:
|
1762
|
-
rubygems_version: 2.4.
|
1763
|
+
rubygems_version: 2.4.6
|
1763
1764
|
signing_key:
|
1764
1765
|
specification_version: 4
|
1765
1766
|
summary: UI library of AngularJS based components for Foreman
|