bastion 3.3.6 → 3.4.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/bastion.js +1 -0
- data/app/assets/javascripts/bastion/bastion.module.js +1 -1
- data/app/assets/javascripts/bastion/components/bst-edit.directive.js +0 -8
- data/app/assets/javascripts/bastion/components/bst-table.directive.js +1 -1
- data/app/assets/javascripts/bastion/components/views/bst-edit.html +3 -3
- data/app/assets/javascripts/bastion/layouts/page-with-breadcrumbs.html +28 -0
- data/app/assets/javascripts/bastion/layouts/table.html +94 -0
- data/app/assets/javascripts/bastion/layouts/two-column.html +10 -0
- data/app/assets/stylesheets/bastion/bastion.scss +1 -7
- data/app/assets/stylesheets/bastion/components.scss +28 -0
- data/app/assets/stylesheets/bastion/forms.scss +1 -1
- data/app/assets/stylesheets/bastion/overrides.scss +4 -3
- data/app/assets/stylesheets/bastion/typography.scss +1 -0
- data/app/views/bastion/layouts/application.html.erb +1 -1
- data/bower.json +4 -1
- data/lib/bastion/version.rb +1 -1
- data/vendor/assets/javascripts/bastion/angular-breadcrumb/angular-breadcrumb.js +369 -0
- metadata +7 -3
- data/app/assets/stylesheets/bastion/details-page.scss +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 03081e476151e165781aa38ec6557ff0d088b39d
|
4
|
+
data.tar.gz: 65e2a101239aef579da8e3e88f67109662b1f5da
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a336997f67ca28421ce01f352e5dfbf81cc1fce36d48fc4429aea9af34b027ff0491d1fac9ae5130617d523a7b549958913eed2a829e57fa09976311e3ed7bf7
|
7
|
+
data.tar.gz: 85151185287ab0908b7b7ccbc5a1ece638f7084e15271d448a832dda377a210f13e0c2aaba8405960183b46136cacd5bbfe69aa5518a8c81547b99bd9e86b367
|
@@ -9,6 +9,7 @@
|
|
9
9
|
//= require "bastion/ngInfiniteScroll/ng-infinite-scroll.js"
|
10
10
|
//= require "bastion/angular-gettext/angular-gettext"
|
11
11
|
//= require "bastion/angular-blocks/angular-blocks"
|
12
|
+
//= require "bastion/angular-breadcrumb/angular-breadcrumb"
|
12
13
|
//= require_tree "../../../../vendor/assets/javascripts/bastion/angular-bootstrap"
|
13
14
|
//= require "bastion/angular-animate/angular-animate"
|
14
15
|
//= require "angular-rails-templates"
|
@@ -16,7 +16,6 @@
|
|
16
16
|
angular.module('Bastion.components')
|
17
17
|
.directive('bstEdit', function () {
|
18
18
|
return {
|
19
|
-
replace: true,
|
20
19
|
controller: 'BstEditController',
|
21
20
|
templateUrl: 'components/views/bst-edit.html'
|
22
21
|
};
|
@@ -169,7 +168,6 @@ angular.module('Bastion.components')
|
|
169
168
|
}])
|
170
169
|
.directive('bstEditText', function () {
|
171
170
|
return {
|
172
|
-
replace: true,
|
173
171
|
scope: {
|
174
172
|
model: '=bstEditText',
|
175
173
|
readonly: '=',
|
@@ -183,7 +181,6 @@ angular.module('Bastion.components')
|
|
183
181
|
})
|
184
182
|
.directive('bstEditTextarea', function () {
|
185
183
|
return {
|
186
|
-
replace: true,
|
187
184
|
scope: {
|
188
185
|
model: '=bstEditTextarea',
|
189
186
|
readonly: '=',
|
@@ -195,7 +192,6 @@ angular.module('Bastion.components')
|
|
195
192
|
})
|
196
193
|
.directive('bstEditNumber', function () {
|
197
194
|
return {
|
198
|
-
replace: true,
|
199
195
|
scope: {
|
200
196
|
model: '=bstEditNumber',
|
201
197
|
readonly: '=',
|
@@ -211,7 +207,6 @@ angular.module('Bastion.components')
|
|
211
207
|
})
|
212
208
|
.directive('bstEditCheckbox', function () {
|
213
209
|
return {
|
214
|
-
replace: true,
|
215
210
|
scope: {
|
216
211
|
model: '=bstEditCheckbox',
|
217
212
|
readonly: '=',
|
@@ -225,7 +220,6 @@ angular.module('Bastion.components')
|
|
225
220
|
})
|
226
221
|
.directive('bstEditCustom', function () {
|
227
222
|
return {
|
228
|
-
replace: true,
|
229
223
|
transclude: true,
|
230
224
|
templateUrl: 'components/views/bst-edit-custom.html',
|
231
225
|
scope: {
|
@@ -242,7 +236,6 @@ angular.module('Bastion.components')
|
|
242
236
|
})
|
243
237
|
.directive('bstEditSelect', function () {
|
244
238
|
return {
|
245
|
-
replace: true,
|
246
239
|
scope: {
|
247
240
|
model: '=bstEditSelect',
|
248
241
|
displayValueDefault: '=displayValueDefault',
|
@@ -267,7 +260,6 @@ angular.module('Bastion.components')
|
|
267
260
|
})
|
268
261
|
.directive('bstEditMultiselect', function () {
|
269
262
|
return {
|
270
|
-
replace: true,
|
271
263
|
templateUrl: 'components/views/bst-edit-multiselect.html',
|
272
264
|
scope: {
|
273
265
|
model: '=bstEditMultiselect',
|
@@ -139,7 +139,7 @@ angular.module('Bastion.components')
|
|
139
139
|
}
|
140
140
|
|
141
141
|
return function (scope, element, attrs, bstTableController) {
|
142
|
-
if (angular.isDefined(tAttrs.rowSelect)) {
|
142
|
+
if (angular.isDefined(tAttrs.rowSelect) && angular.isDefined(scope.table)) {
|
143
143
|
scope.table.rowSelect = true;
|
144
144
|
} else if (angular.isDefined(tAttrs.rowChoice)) {
|
145
145
|
scope.table.rowChoice = true;
|
@@ -1,8 +1,8 @@
|
|
1
1
|
<div class="bst-edit">
|
2
2
|
<div class="value" ng-class="{ 'editable' : !readonly }" ng-click="edit()" ng-hide="editMode || workingMode">
|
3
|
-
<span class="fr">
|
4
|
-
<i class="fa fa-edit inline-icon"
|
5
|
-
<i class="fa fa-remove inline-icon" ng-click="delete($event)" ng-show="deletable
|
3
|
+
<span class="fr" ng-hide="editMode || readonly">
|
4
|
+
<i class="fa fa-edit inline-icon"></i>
|
5
|
+
<i class="fa fa-remove inline-icon" ng-click="delete($event)" ng-show="deletable"></i>
|
6
6
|
</span>
|
7
7
|
<span class="editable-value">{{ displayValue }}</span>
|
8
8
|
</div>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<div class="loading-mask fa-3x" ng-show="page.loading">
|
2
|
+
<i class="fa fa-spinner fa-spin"></i>
|
3
|
+
{{ "Loading..." | translate }}
|
4
|
+
</div>
|
5
|
+
|
6
|
+
<div class="row header-bar">
|
7
|
+
<div class="col-sm-10">
|
8
|
+
<span data-block="header"></span>
|
9
|
+
</div>
|
10
|
+
|
11
|
+
<div class="fr">
|
12
|
+
<span data-block="item-actions"></span>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
|
16
|
+
<div class="row">
|
17
|
+
<div class="col-sm-12">
|
18
|
+
<div ncy-breadcrumb></div>
|
19
|
+
</div>
|
20
|
+
</div>
|
21
|
+
|
22
|
+
<div class="row">
|
23
|
+
<div class="col-sm-12">
|
24
|
+
<div ng-hide="page && (page.loading || page.error)">
|
25
|
+
<span data-block="content"></span>
|
26
|
+
</div>
|
27
|
+
</div>
|
28
|
+
</div>
|
@@ -0,0 +1,94 @@
|
|
1
|
+
<section>
|
2
|
+
|
3
|
+
<div bst-global-notification></div>
|
4
|
+
|
5
|
+
<div class="row header-bar">
|
6
|
+
<h2 class="col-sm-10">
|
7
|
+
<span data-block="header">
|
8
|
+
REPLACE ME
|
9
|
+
</span>
|
10
|
+
</h2>
|
11
|
+
<div class="fr">
|
12
|
+
<span data-block="item-actions"></span>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
|
16
|
+
<div class="row header-bar">
|
17
|
+
<div class="row">
|
18
|
+
<div class="col-sm-12">
|
19
|
+
<div data-block="search-filter"></div>
|
20
|
+
</div>
|
21
|
+
</div>
|
22
|
+
|
23
|
+
<div class="col-sm-3">
|
24
|
+
<div class="input-group input-group">
|
25
|
+
<input type="text"
|
26
|
+
class="form-control"
|
27
|
+
placeholder="{{ 'Filter...' | translate }}"
|
28
|
+
bst-on-enter="table.search(table.searchTerm)"
|
29
|
+
ng-model="table.searchTerm"
|
30
|
+
ng-trim="false"
|
31
|
+
typeahead="item.label for item in table.autocomplete($viewValue)"
|
32
|
+
typeahead-empty
|
33
|
+
typeahead-template-url="components/views/autocomplete-scoped-search.html"/>
|
34
|
+
<span class="input-group-btn">
|
35
|
+
<button class="btn btn-default"
|
36
|
+
type="button"
|
37
|
+
ng-click='table.search("") && (table.searchCompleted = false)'
|
38
|
+
ng-show="table.searchCompleted && table.searchTerm">
|
39
|
+
<i class="fa fa-times"></i>
|
40
|
+
</button>
|
41
|
+
<button ng-click="table.search(table.searchTerm)" class="btn btn-default" type="button">
|
42
|
+
<i class="fa fa-search"></i>
|
43
|
+
<span translate>Search</span>
|
44
|
+
</button>
|
45
|
+
<button class="btn btn-default dropdown-toggle" data-toggle="dropdown">
|
46
|
+
<i class="fa fa-caret-down"></i>
|
47
|
+
</button>
|
48
|
+
<ul bst-bookmark controller-name="controllerName" query="table.searchTerm" class="dropdown-menu pull-right"></ul>
|
49
|
+
</span>
|
50
|
+
</div>
|
51
|
+
</div>
|
52
|
+
|
53
|
+
<div class="col-sm-3">
|
54
|
+
<span translate>Showing {{ table.rows.length }} of {{ table.resource.subtotal }} ({{ table.resource.total }} Total)</span>
|
55
|
+
</div>
|
56
|
+
|
57
|
+
<div class="fr">
|
58
|
+
<div class="fl">
|
59
|
+
<div data-block="list-actions"></div>
|
60
|
+
</div>
|
61
|
+
</div>
|
62
|
+
</div>
|
63
|
+
|
64
|
+
<div class="row header-bar">
|
65
|
+
<div class="fr">
|
66
|
+
<span translate>{{ table.numSelected }} Selected</span>
|
67
|
+
</div>
|
68
|
+
<div class="col-sm-5">
|
69
|
+
<span data-block="filters"></span>
|
70
|
+
</div>
|
71
|
+
</div>
|
72
|
+
|
73
|
+
<div class="row nutupane" bst-table="table" nutupane-table>
|
74
|
+
<div class="loading-mask" ng-show="table.refreshing" >
|
75
|
+
<i class="fa fa-spinner fa-spin"></i>
|
76
|
+
<span>{{ "Loading..." | translate }}</span>
|
77
|
+
</div>
|
78
|
+
|
79
|
+
<p bst-alert="info" ng-show="table.rows.length === 0 && !table.working && !table.searchTerm && !table.searchCompleted">
|
80
|
+
<span data-block="no-rows-message"></span>
|
81
|
+
</p>
|
82
|
+
<p bst-alert="info" ng-show="table.rows.length === 0 && !table.working && (table.searchTerm || table.searchCompleted)">
|
83
|
+
<span data-block="no-search-results-message"></span>
|
84
|
+
</p>
|
85
|
+
|
86
|
+
<div ng-show="table.rows.length > 0" bst-container-scroll data="table.rows">
|
87
|
+
<div infinite-scroll="table.nextPage()" infinite-scroll-container="'.container-scroll-wrapper'"
|
88
|
+
infinite-scroll-listen-for-event="nutupane:loaded">
|
89
|
+
<div data-block="table"></div>
|
90
|
+
</div>
|
91
|
+
</div>
|
92
|
+
</div>
|
93
|
+
|
94
|
+
</section>
|
@@ -7,6 +7,7 @@
|
|
7
7
|
@import "mixins";
|
8
8
|
@import "variables";
|
9
9
|
@import "nutupane";
|
10
|
+
@import "components";
|
10
11
|
@import "overrides";
|
11
12
|
@import "helpers";
|
12
13
|
@import "./forms";
|
@@ -20,13 +21,6 @@
|
|
20
21
|
overflow: hidden;
|
21
22
|
}
|
22
23
|
|
23
|
-
.container-fluid {
|
24
|
-
margin-right: auto;
|
25
|
-
margin-left: auto;
|
26
|
-
padding-left: 15px;
|
27
|
-
padding-right: 15px;
|
28
|
-
}
|
29
|
-
|
30
24
|
a {
|
31
25
|
cursor: pointer;
|
32
26
|
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
.header-bar {
|
2
|
+
background: rgb(250, 250, 250);
|
3
|
+
padding: 10px 15px 10px 0;
|
4
|
+
border-bottom: 1px solid rgb(230, 230, 230);
|
5
|
+
|
6
|
+
h2 {
|
7
|
+
margin: 5px 0 0 0;
|
8
|
+
}
|
9
|
+
}
|
10
|
+
|
11
|
+
.dl-horizontal.dl-horizontal-left {
|
12
|
+
dt {
|
13
|
+
overflow: visible;
|
14
|
+
text-align: left;
|
15
|
+
text-overflow: clip;
|
16
|
+
white-space: pre-wrap;
|
17
|
+
width: 125px;
|
18
|
+
}
|
19
|
+
|
20
|
+
dt:after {
|
21
|
+
content: ':';
|
22
|
+
}
|
23
|
+
|
24
|
+
dd {
|
25
|
+
margin-left: 200px;
|
26
|
+
word-wrap: break-word;
|
27
|
+
}
|
28
|
+
}
|
data/bower.json
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
"es5-shim": "~2.0.8",
|
8
8
|
"angular": "=1.5.5",
|
9
9
|
"angular-bootstrap": "0.10.0",
|
10
|
-
"angular": "=
|
10
|
+
"angular-breadcrumb": "=0.4.1",
|
11
11
|
"angular-sanitize": "=1.5.5",
|
12
12
|
"angular-resource": "=1.5.5",
|
13
13
|
"angular-route": "=1.5.5",
|
@@ -61,6 +61,9 @@
|
|
61
61
|
"ui-bootstrap-tpls.js"
|
62
62
|
]
|
63
63
|
},
|
64
|
+
"angular-breadcrumb": {
|
65
|
+
"javascripts/bastion/angular-breadcrumb": "dist/angular-breadcrumb.js"
|
66
|
+
},
|
64
67
|
"angular-animate": {
|
65
68
|
"javascripts/bastion/angular-animate": "angular-animate.js"
|
66
69
|
},
|
data/lib/bastion/version.rb
CHANGED
@@ -0,0 +1,369 @@
|
|
1
|
+
/*! angular-breadcrumb - v0.4.0-dev-2015-08-07
|
2
|
+
* http://ncuillery.github.io/angular-breadcrumb
|
3
|
+
* Copyright (c) 2015 Nicolas Cuillery; Licensed MIT */
|
4
|
+
|
5
|
+
(function (window, angular, undefined) {
|
6
|
+
'use strict';
|
7
|
+
|
8
|
+
function isAOlderThanB(scopeA, scopeB) {
|
9
|
+
if(angular.equals(scopeA.length, scopeB.length)) {
|
10
|
+
return scopeA > scopeB;
|
11
|
+
} else {
|
12
|
+
return scopeA.length > scopeB.length;
|
13
|
+
}
|
14
|
+
}
|
15
|
+
|
16
|
+
function parseStateRef(ref) {
|
17
|
+
var parsed = ref.replace(/\n/g, " ").match(/^([^(]+?)\s*(\((.*)\))?$/);
|
18
|
+
if (!parsed || parsed.length !== 4) { throw new Error("Invalid state ref '" + ref + "'"); }
|
19
|
+
return { state: parsed[1], paramExpr: parsed[3] || null };
|
20
|
+
}
|
21
|
+
|
22
|
+
function $Breadcrumb() {
|
23
|
+
|
24
|
+
var $$options = {
|
25
|
+
prefixStateName: null,
|
26
|
+
template: 'bootstrap3',
|
27
|
+
templateUrl: null,
|
28
|
+
includeAbstract : false
|
29
|
+
};
|
30
|
+
|
31
|
+
this.setOptions = function(options) {
|
32
|
+
angular.extend($$options, options);
|
33
|
+
};
|
34
|
+
|
35
|
+
this.$get = ['$state', '$stateParams', '$rootScope', function($state, $stateParams, $rootScope) {
|
36
|
+
|
37
|
+
var $lastViewScope = $rootScope;
|
38
|
+
|
39
|
+
// Early catch of $viewContentLoaded event
|
40
|
+
$rootScope.$on('$viewContentLoaded', function (event) {
|
41
|
+
// With nested views, the event occur several times, in "wrong" order
|
42
|
+
if(!event.targetScope.ncyBreadcrumbIgnore &&
|
43
|
+
isAOlderThanB(event.targetScope.$id, $lastViewScope.$id)) {
|
44
|
+
$lastViewScope = event.targetScope;
|
45
|
+
}
|
46
|
+
});
|
47
|
+
|
48
|
+
// Get the parent state
|
49
|
+
var $$parentState = function(state) {
|
50
|
+
// Check if state has explicit parent OR we try guess parent from its name
|
51
|
+
var parent = state.parent || (/^(.+)\.[^.]+$/.exec(state.name) || [])[1];
|
52
|
+
var isObjectParent = typeof parent === "object";
|
53
|
+
// if parent is a object reference, then extract the name
|
54
|
+
return isObjectParent ? parent.name : parent;
|
55
|
+
};
|
56
|
+
|
57
|
+
// Add the state in the chain if not already in and if not abstract
|
58
|
+
var $$addStateInChain = function(chain, stateRef) {
|
59
|
+
var conf,
|
60
|
+
parentParams,
|
61
|
+
ref = parseStateRef(stateRef),
|
62
|
+
force = false,
|
63
|
+
skip = false;
|
64
|
+
|
65
|
+
for(var i=0, l=chain.length; i<l; i+=1) {
|
66
|
+
if (chain[i].name === ref.state) {
|
67
|
+
return;
|
68
|
+
}
|
69
|
+
}
|
70
|
+
|
71
|
+
conf = $state.get(ref.state);
|
72
|
+
// Get breadcrumb options
|
73
|
+
if(conf.ncyBreadcrumb) {
|
74
|
+
if(conf.ncyBreadcrumb.force){ force = true; }
|
75
|
+
if(conf.ncyBreadcrumb.skip){ skip = true; }
|
76
|
+
}
|
77
|
+
if((!conf.abstract || $$options.includeAbstract || force) && !skip) {
|
78
|
+
if(ref.paramExpr) {
|
79
|
+
parentParams = $lastViewScope.$eval(ref.paramExpr);
|
80
|
+
}
|
81
|
+
|
82
|
+
conf.ncyBreadcrumbLink = $state.href(ref.state, parentParams || $stateParams || {});
|
83
|
+
chain.unshift(conf);
|
84
|
+
}
|
85
|
+
};
|
86
|
+
|
87
|
+
// Get the state for the parent step in the breadcrumb
|
88
|
+
var $$breadcrumbParentState = function(stateRef) {
|
89
|
+
var ref = parseStateRef(stateRef),
|
90
|
+
conf = $state.get(ref.state);
|
91
|
+
|
92
|
+
if(conf.ncyBreadcrumb && conf.ncyBreadcrumb.parent) {
|
93
|
+
// Handle the "parent" property of the breadcrumb, override the parent/child relation of the state
|
94
|
+
var isFunction = typeof conf.ncyBreadcrumb.parent === 'function';
|
95
|
+
var parentStateRef = isFunction ? conf.ncyBreadcrumb.parent($lastViewScope) : conf.ncyBreadcrumb.parent;
|
96
|
+
if(parentStateRef) {
|
97
|
+
return parentStateRef;
|
98
|
+
}
|
99
|
+
}
|
100
|
+
|
101
|
+
return $$parentState(conf);
|
102
|
+
};
|
103
|
+
|
104
|
+
return {
|
105
|
+
|
106
|
+
getTemplate: function(templates) {
|
107
|
+
if($$options.templateUrl) {
|
108
|
+
// templateUrl takes precedence over template
|
109
|
+
return null;
|
110
|
+
} else if(templates[$$options.template]) {
|
111
|
+
// Predefined templates (bootstrap, ...)
|
112
|
+
return templates[$$options.template];
|
113
|
+
} else {
|
114
|
+
return $$options.template;
|
115
|
+
}
|
116
|
+
},
|
117
|
+
|
118
|
+
getTemplateUrl: function() {
|
119
|
+
return $$options.templateUrl;
|
120
|
+
},
|
121
|
+
|
122
|
+
getStatesChain: function(exitOnFirst) { // Deliberately undocumented param, see getLastStep
|
123
|
+
var chain = [];
|
124
|
+
|
125
|
+
// From current state to the root
|
126
|
+
for(var stateRef = $state.$current.self.name; stateRef; stateRef=$$breadcrumbParentState(stateRef)) {
|
127
|
+
$$addStateInChain(chain, stateRef);
|
128
|
+
if(exitOnFirst && chain.length) {
|
129
|
+
return chain;
|
130
|
+
}
|
131
|
+
}
|
132
|
+
|
133
|
+
// Prefix state treatment
|
134
|
+
if($$options.prefixStateName) {
|
135
|
+
$$addStateInChain(chain, $$options.prefixStateName);
|
136
|
+
}
|
137
|
+
|
138
|
+
return chain;
|
139
|
+
},
|
140
|
+
|
141
|
+
getLastStep: function() {
|
142
|
+
var chain = this.getStatesChain(true);
|
143
|
+
return chain.length ? chain[0] : undefined;
|
144
|
+
},
|
145
|
+
|
146
|
+
$getLastViewScope: function() {
|
147
|
+
return $lastViewScope;
|
148
|
+
}
|
149
|
+
};
|
150
|
+
}];
|
151
|
+
}
|
152
|
+
|
153
|
+
var getExpression = function(interpolationFunction) {
|
154
|
+
if(interpolationFunction.expressions) {
|
155
|
+
return interpolationFunction.expressions;
|
156
|
+
} else {
|
157
|
+
var expressions = [];
|
158
|
+
angular.forEach(interpolationFunction.parts, function(part) {
|
159
|
+
if(angular.isFunction(part)) {
|
160
|
+
expressions.push(part.exp);
|
161
|
+
}
|
162
|
+
});
|
163
|
+
return expressions;
|
164
|
+
}
|
165
|
+
};
|
166
|
+
|
167
|
+
var registerWatchers = function(labelWatcherArray, interpolationFunction, viewScope, step) {
|
168
|
+
angular.forEach(getExpression(interpolationFunction), function(expression) {
|
169
|
+
var watcher = viewScope.$watch(expression, function() {
|
170
|
+
step.ncyBreadcrumbLabel = interpolationFunction(viewScope);
|
171
|
+
});
|
172
|
+
labelWatcherArray.push(watcher);
|
173
|
+
});
|
174
|
+
|
175
|
+
};
|
176
|
+
|
177
|
+
var deregisterWatchers = function(labelWatcherArray) {
|
178
|
+
angular.forEach(labelWatcherArray, function(deregisterWatch) {
|
179
|
+
deregisterWatch();
|
180
|
+
});
|
181
|
+
};
|
182
|
+
|
183
|
+
function BreadcrumbDirective($interpolate, $breadcrumb, $rootScope) {
|
184
|
+
var $$templates = {
|
185
|
+
bootstrap2: '<ul class="breadcrumb">' +
|
186
|
+
'<li ng-repeat="step in steps" ng-switch="$last || !!step.abstract" ng-class="{active: $last}">' +
|
187
|
+
'<a ng-switch-when="false" href="{{step.ncyBreadcrumbLink}}">{{step.ncyBreadcrumbLabel}}</a>' +
|
188
|
+
'<span ng-switch-when="true">{{step.ncyBreadcrumbLabel}}</span>' +
|
189
|
+
'<span class="divider" ng-hide="$last">/</span>' +
|
190
|
+
'</li>' +
|
191
|
+
'</ul>',
|
192
|
+
bootstrap3: '<ol class="breadcrumb">' +
|
193
|
+
'<li ng-repeat="step in steps" ng-class="{active: $last}" ng-switch="$last || !!step.abstract">' +
|
194
|
+
'<a ng-switch-when="false" href="{{step.ncyBreadcrumbLink}}">{{step.ncyBreadcrumbLabel}}</a>' +
|
195
|
+
'<span ng-switch-when="true">{{step.ncyBreadcrumbLabel}}</span>' +
|
196
|
+
'</li>' +
|
197
|
+
'</ol>'
|
198
|
+
};
|
199
|
+
|
200
|
+
return {
|
201
|
+
restrict: 'AE',
|
202
|
+
replace: true,
|
203
|
+
scope: {},
|
204
|
+
template: $breadcrumb.getTemplate($$templates),
|
205
|
+
templateUrl: $breadcrumb.getTemplateUrl(),
|
206
|
+
link: {
|
207
|
+
post: function postLink(scope) {
|
208
|
+
var labelWatchers = [];
|
209
|
+
|
210
|
+
var renderBreadcrumb = function() {
|
211
|
+
deregisterWatchers(labelWatchers);
|
212
|
+
labelWatchers = [];
|
213
|
+
|
214
|
+
var viewScope = $breadcrumb.$getLastViewScope();
|
215
|
+
scope.steps = $breadcrumb.getStatesChain();
|
216
|
+
angular.forEach(scope.steps, function (step) {
|
217
|
+
if (step.ncyBreadcrumb && step.ncyBreadcrumb.label) {
|
218
|
+
var parseLabel = $interpolate(step.ncyBreadcrumb.label);
|
219
|
+
step.ncyBreadcrumbLabel = parseLabel(viewScope);
|
220
|
+
// Watcher for further viewScope updates
|
221
|
+
registerWatchers(labelWatchers, parseLabel, viewScope, step);
|
222
|
+
} else {
|
223
|
+
step.ncyBreadcrumbLabel = step.name;
|
224
|
+
}
|
225
|
+
});
|
226
|
+
};
|
227
|
+
|
228
|
+
$rootScope.$on('$viewContentLoaded', function (event) {
|
229
|
+
if(!event.targetScope.ncyBreadcrumbIgnore) {
|
230
|
+
renderBreadcrumb();
|
231
|
+
}
|
232
|
+
});
|
233
|
+
|
234
|
+
// View(s) may be already loaded while the directive's linking
|
235
|
+
renderBreadcrumb();
|
236
|
+
}
|
237
|
+
}
|
238
|
+
};
|
239
|
+
}
|
240
|
+
BreadcrumbDirective.$inject = ['$interpolate', '$breadcrumb', '$rootScope'];
|
241
|
+
|
242
|
+
function BreadcrumbLastDirective($interpolate, $breadcrumb, $rootScope) {
|
243
|
+
|
244
|
+
return {
|
245
|
+
restrict: 'A',
|
246
|
+
scope: {},
|
247
|
+
template: '{{ncyBreadcrumbLabel}}',
|
248
|
+
compile: function(cElement, cAttrs) {
|
249
|
+
|
250
|
+
// Override the default template if ncyBreadcrumbLast has a value
|
251
|
+
var template = cElement.attr(cAttrs.$attr.ncyBreadcrumbLast);
|
252
|
+
if(template) {
|
253
|
+
cElement.html(template);
|
254
|
+
}
|
255
|
+
|
256
|
+
return {
|
257
|
+
post: function postLink(scope) {
|
258
|
+
var labelWatchers = [];
|
259
|
+
|
260
|
+
var renderLabel = function() {
|
261
|
+
deregisterWatchers(labelWatchers);
|
262
|
+
labelWatchers = [];
|
263
|
+
|
264
|
+
var viewScope = $breadcrumb.$getLastViewScope();
|
265
|
+
var lastStep = $breadcrumb.getLastStep();
|
266
|
+
if(lastStep) {
|
267
|
+
scope.ncyBreadcrumbLink = lastStep.ncyBreadcrumbLink;
|
268
|
+
if (lastStep.ncyBreadcrumb && lastStep.ncyBreadcrumb.label) {
|
269
|
+
var parseLabel = $interpolate(lastStep.ncyBreadcrumb.label);
|
270
|
+
scope.ncyBreadcrumbLabel = parseLabel(viewScope);
|
271
|
+
// Watcher for further viewScope updates
|
272
|
+
// Tricky last arg: the last step is the entire scope of the directive !
|
273
|
+
registerWatchers(labelWatchers, parseLabel, viewScope, scope);
|
274
|
+
} else {
|
275
|
+
scope.ncyBreadcrumbLabel = lastStep.name;
|
276
|
+
}
|
277
|
+
}
|
278
|
+
};
|
279
|
+
|
280
|
+
$rootScope.$on('$viewContentLoaded', function (event) {
|
281
|
+
if(!event.targetScope.ncyBreadcrumbIgnore) {
|
282
|
+
renderLabel();
|
283
|
+
}
|
284
|
+
});
|
285
|
+
|
286
|
+
// View(s) may be already loaded while the directive's linking
|
287
|
+
renderLabel();
|
288
|
+
}
|
289
|
+
};
|
290
|
+
|
291
|
+
}
|
292
|
+
};
|
293
|
+
}
|
294
|
+
BreadcrumbLastDirective.$inject = ['$interpolate', '$breadcrumb', '$rootScope'];
|
295
|
+
|
296
|
+
function BreadcrumbTextDirective($interpolate, $breadcrumb, $rootScope) {
|
297
|
+
|
298
|
+
return {
|
299
|
+
restrict: 'A',
|
300
|
+
scope: {},
|
301
|
+
template: '{{ncyBreadcrumbChain}}',
|
302
|
+
|
303
|
+
compile: function(cElement, cAttrs) {
|
304
|
+
// Override the default template if ncyBreadcrumbText has a value
|
305
|
+
var template = cElement.attr(cAttrs.$attr.ncyBreadcrumbText);
|
306
|
+
if(template) {
|
307
|
+
cElement.html(template);
|
308
|
+
}
|
309
|
+
|
310
|
+
var separator = cElement.attr(cAttrs.$attr.ncyBreadcrumbTextSeparator) || ' / ';
|
311
|
+
|
312
|
+
return {
|
313
|
+
post: function postLink(scope) {
|
314
|
+
var labelWatchers = [];
|
315
|
+
|
316
|
+
var registerWatchersText = function(labelWatcherArray, interpolationFunction, viewScope) {
|
317
|
+
angular.forEach(getExpression(interpolationFunction), function(expression) {
|
318
|
+
var watcher = viewScope.$watch(expression, function(newValue, oldValue) {
|
319
|
+
if (newValue !== oldValue) {
|
320
|
+
renderLabel();
|
321
|
+
}
|
322
|
+
});
|
323
|
+
labelWatcherArray.push(watcher);
|
324
|
+
});
|
325
|
+
};
|
326
|
+
|
327
|
+
var renderLabel = function() {
|
328
|
+
deregisterWatchers(labelWatchers);
|
329
|
+
labelWatchers = [];
|
330
|
+
|
331
|
+
var viewScope = $breadcrumb.$getLastViewScope();
|
332
|
+
var steps = $breadcrumb.getStatesChain();
|
333
|
+
var combinedLabels = [];
|
334
|
+
angular.forEach(steps, function (step) {
|
335
|
+
if (step.ncyBreadcrumb && step.ncyBreadcrumb.label) {
|
336
|
+
var parseLabel = $interpolate(step.ncyBreadcrumb.label);
|
337
|
+
combinedLabels.push(parseLabel(viewScope));
|
338
|
+
// Watcher for further viewScope updates
|
339
|
+
registerWatchersText(labelWatchers, parseLabel, viewScope);
|
340
|
+
} else {
|
341
|
+
combinedLabels.push(step.name);
|
342
|
+
}
|
343
|
+
});
|
344
|
+
|
345
|
+
scope.ncyBreadcrumbChain = combinedLabels.join(separator);
|
346
|
+
};
|
347
|
+
|
348
|
+
$rootScope.$on('$viewContentLoaded', function (event) {
|
349
|
+
if(!event.targetScope.ncyBreadcrumbIgnore) {
|
350
|
+
renderLabel();
|
351
|
+
}
|
352
|
+
});
|
353
|
+
|
354
|
+
// View(s) may be already loaded while the directive's linking
|
355
|
+
renderLabel();
|
356
|
+
}
|
357
|
+
};
|
358
|
+
|
359
|
+
}
|
360
|
+
};
|
361
|
+
}
|
362
|
+
BreadcrumbTextDirective.$inject = ['$interpolate', '$breadcrumb', '$rootScope'];
|
363
|
+
|
364
|
+
angular.module('ncy-angular-breadcrumb', ['ui.router.state'])
|
365
|
+
.provider('$breadcrumb', $Breadcrumb)
|
366
|
+
.directive('ncyBreadcrumb', BreadcrumbDirective)
|
367
|
+
.directive('ncyBreadcrumbLast', BreadcrumbLastDirective)
|
368
|
+
.directive('ncyBreadcrumbText', BreadcrumbTextDirective);
|
369
|
+
})(window, window.angular);
|
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: 3.
|
4
|
+
version: 3.4.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: 2016-10-
|
12
|
+
date: 2016-10-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: angular-rails-templates
|
@@ -140,8 +140,11 @@ files:
|
|
140
140
|
- app/assets/javascripts/bastion/layouts/404.html
|
141
141
|
- app/assets/javascripts/bastion/layouts/details-nutupane.html
|
142
142
|
- app/assets/javascripts/bastion/layouts/nutupane.html
|
143
|
+
- app/assets/javascripts/bastion/layouts/page-with-breadcrumbs.html
|
143
144
|
- app/assets/javascripts/bastion/layouts/panel.html
|
144
145
|
- app/assets/javascripts/bastion/layouts/select-all-results.html
|
146
|
+
- app/assets/javascripts/bastion/layouts/table.html
|
147
|
+
- app/assets/javascripts/bastion/layouts/two-column.html
|
145
148
|
- app/assets/javascripts/bastion/menu/menu-expander.service.js
|
146
149
|
- app/assets/javascripts/bastion/menu/menu.module.js
|
147
150
|
- app/assets/javascripts/bastion/routing.module.js
|
@@ -151,7 +154,7 @@ files:
|
|
151
154
|
- app/assets/javascripts/bastion/utils/utils.module.js
|
152
155
|
- app/assets/stylesheets/bastion/animations.scss
|
153
156
|
- app/assets/stylesheets/bastion/bastion.scss
|
154
|
-
- app/assets/stylesheets/bastion/
|
157
|
+
- app/assets/stylesheets/bastion/components.scss
|
155
158
|
- app/assets/stylesheets/bastion/forms.scss
|
156
159
|
- app/assets/stylesheets/bastion/helpers.scss
|
157
160
|
- app/assets/stylesheets/bastion/mixins.scss
|
@@ -220,6 +223,7 @@ files:
|
|
220
223
|
- vendor/assets/javascripts/bastion/angular-blocks/angular-blocks.js
|
221
224
|
- vendor/assets/javascripts/bastion/angular-bootstrap/ui-bootstrap-tpls.js
|
222
225
|
- vendor/assets/javascripts/bastion/angular-bootstrap/ui-bootstrap.js
|
226
|
+
- vendor/assets/javascripts/bastion/angular-breadcrumb/angular-breadcrumb.js
|
223
227
|
- vendor/assets/javascripts/bastion/angular-gettext/angular-gettext.js
|
224
228
|
- vendor/assets/javascripts/bastion/angular-i18n/angular-locale_aa-dj.js
|
225
229
|
- vendor/assets/javascripts/bastion/angular-i18n/angular-locale_aa-er.js
|
File without changes
|