ember-bootstrap-rails 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +35 -0
- data/Rakefile +27 -0
- data/app/assets/javascripts/ember-bootstrap/all.js +6 -0
- data/app/assets/javascripts/ember-bootstrap/core.js +1 -0
- data/app/assets/javascripts/ember-bootstrap/forms.js +15 -0
- data/app/assets/javascripts/ember-bootstrap/forms/checkbox.js +13 -0
- data/app/assets/javascripts/ember-bootstrap/forms/field.js +114 -0
- data/app/assets/javascripts/ember-bootstrap/forms/select.js +19 -0
- data/app/assets/javascripts/ember-bootstrap/forms/text_area.js +8 -0
- data/app/assets/javascripts/ember-bootstrap/forms/text_field.js +9 -0
- data/app/assets/javascripts/ember-bootstrap/forms/uneditable_input.js +16 -0
- data/app/assets/javascripts/ember-bootstrap/mixins.js +3 -0
- data/app/assets/javascripts/ember-bootstrap/mixins/first_last_view_support.js +17 -0
- data/app/assets/javascripts/ember-bootstrap/mixins/item_selection_support.js +28 -0
- data/app/assets/javascripts/ember-bootstrap/mixins/item_view_href_support.js +15 -0
- data/app/assets/javascripts/ember-bootstrap/mixins/item_view_title_support.js +15 -0
- data/app/assets/javascripts/ember-bootstrap/mixins/item_view_value_support.js +13 -0
- data/app/assets/javascripts/ember-bootstrap/mixins/size_support.js +13 -0
- data/app/assets/javascripts/ember-bootstrap/mixins/text_support.js +14 -0
- data/app/assets/javascripts/ember-bootstrap/mixins/type_support.js +13 -0
- data/app/assets/javascripts/ember-bootstrap/views/alert_message.js +27 -0
- data/app/assets/javascripts/ember-bootstrap/views/badge.js +8 -0
- data/app/assets/javascripts/ember-bootstrap/views/block_alert_message.js +5 -0
- data/app/assets/javascripts/ember-bootstrap/views/breadcrumb.js +15 -0
- data/app/assets/javascripts/ember-bootstrap/views/label.js +8 -0
- data/app/assets/javascripts/ember-bootstrap/views/modal_pane.js +106 -0
- data/app/assets/javascripts/ember-bootstrap/views/nav_list.js +18 -0
- data/app/assets/javascripts/ember-bootstrap/views/pager.js +26 -0
- data/app/assets/javascripts/ember-bootstrap/views/pagination.js +19 -0
- data/app/assets/javascripts/ember-bootstrap/views/pill_item.js +4 -0
- data/app/assets/javascripts/ember-bootstrap/views/pills.js +8 -0
- data/app/assets/javascripts/ember-bootstrap/views/progress_bar.js +16 -0
- data/app/assets/javascripts/ember-bootstrap/views/tabs.js +11 -0
- data/app/assets/javascripts/ember-bootstrap/views/well.js +8 -0
- data/lib/ember-bootstrap-rails.rb +4 -0
- data/lib/ember-bootstrap-rails/engine.rb +4 -0
- data/lib/ember-bootstrap-rails/version.rb +3 -0
- metadata +96 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6a3edcb0eac4fcda3d14f612735949daa5024f05
|
4
|
+
data.tar.gz: dee90e39a068cfffa11affadbbe31843da00843f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3723e5885d82fee9cc7aec727646cbb4a085f9594376a7502e0341be776149e4dd06910541b0c281769a7fe68b79eed6d2e523a8adaa2087ad200ef8c7742b2d
|
7
|
+
data.tar.gz: f7464906657439dc500e14252515bf85b0a41a788ee9f8b69b727f717ff790aa235b55baad3f012936db48ef4d900cf613235db3f8fc87858286c159aa2250dd
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2013 YOURNAME
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# Ember Bootstrap Rails
|
2
|
+
|
3
|
+
Add ember-boostrap to your rails/ember project :)
|
4
|
+
|
5
|
+
## Install
|
6
|
+
|
7
|
+
Gemfile
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'ember-bootstrap-rails'
|
11
|
+
```
|
12
|
+
|
13
|
+
And then `bundle` :)
|
14
|
+
|
15
|
+
In your js mainfest file:
|
16
|
+
|
17
|
+
```javascript
|
18
|
+
//= require ember-bootstrap/all
|
19
|
+
````
|
20
|
+
|
21
|
+
Enjoy!
|
22
|
+
|
23
|
+
## Version
|
24
|
+
|
25
|
+
Current version based on https://github.com/emberjs-addons/ember-bootstrap/commit/90ebf13c87dbd6ec3046b73bcca2fd195557714a
|
26
|
+
|
27
|
+
Please send pull request to update to a later version ;)
|
28
|
+
|
29
|
+
## Notice
|
30
|
+
|
31
|
+
Has not been tested yet :P Please be brave and be the first!
|
32
|
+
|
33
|
+
## Copyright
|
34
|
+
|
35
|
+
This project rocks and uses MIT-LICENSE.
|
data/Rakefile
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
begin
|
3
|
+
require 'bundler/setup'
|
4
|
+
rescue LoadError
|
5
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
6
|
+
end
|
7
|
+
begin
|
8
|
+
require 'rdoc/task'
|
9
|
+
rescue LoadError
|
10
|
+
require 'rdoc/rdoc'
|
11
|
+
require 'rake/rdoctask'
|
12
|
+
RDoc::Task = Rake::RDocTask
|
13
|
+
end
|
14
|
+
|
15
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
16
|
+
rdoc.rdoc_dir = 'rdoc'
|
17
|
+
rdoc.title = 'EmberBootstrapRails'
|
18
|
+
rdoc.options << '--line-numbers'
|
19
|
+
rdoc.rdoc_files.include('README.rdoc')
|
20
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
Bundler::GemHelper.install_tasks
|
27
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
var Bootstrap = window.Bootstrap = Ember.Namespace.create();
|
@@ -0,0 +1,15 @@
|
|
1
|
+
window.Bootstrap.Forms = Ember.Namespace.create({
|
2
|
+
|
3
|
+
human: function(value) {
|
4
|
+
if (value === undefined || value === false)
|
5
|
+
return;
|
6
|
+
|
7
|
+
// Underscore string
|
8
|
+
value = Ember.String.decamelize(value);
|
9
|
+
// Replace all _ with spaces
|
10
|
+
value = value.replace(/_/g, " ");
|
11
|
+
// Capitalize the first letter of every word
|
12
|
+
value = value.replace(/(^|\s)([a-z])/g, function(m,p1,p2){ return p1+p2.toUpperCase(); });
|
13
|
+
return value;
|
14
|
+
}
|
15
|
+
});
|
@@ -0,0 +1,13 @@
|
|
1
|
+
var Bootstrap = window.Bootstrap;
|
2
|
+
Bootstrap.Forms.Checkbox = Bootstrap.Forms.Field.extend({
|
3
|
+
|
4
|
+
inputField: Ember.Checkbox.extend({
|
5
|
+
attributeBindings: ['name'],
|
6
|
+
checkedBinding: 'parentView.checked',
|
7
|
+
disabledBinding: 'parentView.disabled',
|
8
|
+
classNameBindings: 'parentView.inputClassNames',
|
9
|
+
name: Ember.computed(function() {
|
10
|
+
return this.get('parentView.name') || this.get('parentView.label');
|
11
|
+
}).property('parentView.name', 'parentView.label')
|
12
|
+
})
|
13
|
+
});
|
@@ -0,0 +1,114 @@
|
|
1
|
+
var Bootstrap = window.Bootstrap;
|
2
|
+
Bootstrap.Forms.Field = Ember.View.extend({
|
3
|
+
tagName: 'div',
|
4
|
+
classNames: ['control-group'],
|
5
|
+
labelCache: undefined,
|
6
|
+
help: undefined,
|
7
|
+
template: Ember.Handlebars.compile([
|
8
|
+
'{{view view.labelView viewName="labelView"}}',
|
9
|
+
'<div class="controls">',
|
10
|
+
' {{view view.inputField viewName="inputField"}}',
|
11
|
+
' {{view view.errorsView}}',
|
12
|
+
' {{view view.helpView}}',
|
13
|
+
'</div>'].join("\n")),
|
14
|
+
|
15
|
+
label: Ember.computed(function(key, value) {
|
16
|
+
if(arguments.length === 1){
|
17
|
+
if(this.get('labelCache') === undefined){
|
18
|
+
var path = this.get('valueBinding._from');
|
19
|
+
if (path) {
|
20
|
+
path = path.split(".");
|
21
|
+
return path[path.length - 1];
|
22
|
+
}
|
23
|
+
} else {
|
24
|
+
return this.get('labelCache');
|
25
|
+
}
|
26
|
+
} else {
|
27
|
+
this.set('labelCache', value);
|
28
|
+
return value;
|
29
|
+
}
|
30
|
+
}).property(),
|
31
|
+
|
32
|
+
labelView: Ember.View.extend({
|
33
|
+
tagName: 'label',
|
34
|
+
classNames: ['control-label'],
|
35
|
+
template: Ember.Handlebars.compile('{{view.value}}'),
|
36
|
+
|
37
|
+
value: Ember.computed(function(key, value) {
|
38
|
+
var parent = this.get('parentView');
|
39
|
+
|
40
|
+
if (value && value !== parent.get('label')) {
|
41
|
+
parent.set('label', value);
|
42
|
+
} else {
|
43
|
+
value = parent.get('label');
|
44
|
+
}
|
45
|
+
|
46
|
+
// If the labelCache property is present on parent, then the
|
47
|
+
// label was set manually, and there's no need to humanise it.
|
48
|
+
// Otherwise, it comes from the binding and needs to be
|
49
|
+
// humanised.
|
50
|
+
return parent.get('labelCache') === undefined || parent.get('labelCache') === false ?
|
51
|
+
Bootstrap.Forms.human(value) : value;
|
52
|
+
}).property('parentView.label'),
|
53
|
+
|
54
|
+
inputElementId: 'for',
|
55
|
+
forBinding: 'inputElementId',
|
56
|
+
attributeBindings: ['for']
|
57
|
+
}),
|
58
|
+
|
59
|
+
inputField: Ember.View.extend({
|
60
|
+
classNames: ['ember-bootstrap-extend'],
|
61
|
+
tagName: 'div',
|
62
|
+
template: Ember.Handlebars.compile('This class is not meant to be used directly, but extended.')
|
63
|
+
}),
|
64
|
+
|
65
|
+
errorsView: Ember.View.extend({
|
66
|
+
tagName: 'div',
|
67
|
+
classNames: ['errors', 'help-inline'],
|
68
|
+
|
69
|
+
_updateContent: Ember.observer(function() {
|
70
|
+
var parent = this.get('parentView');
|
71
|
+
|
72
|
+
if (parent !== null) {
|
73
|
+
var binding = parent.get('valueBinding._from');
|
74
|
+
var fieldName = null;
|
75
|
+
var object = null;
|
76
|
+
|
77
|
+
if (binding) {
|
78
|
+
binding = binding.replace("_parentView.", "").split(".");
|
79
|
+
fieldName = binding[binding.length - 1];
|
80
|
+
object = parent.get(binding.slice(0, binding.length-1).join('.'));
|
81
|
+
} else {
|
82
|
+
fieldName = parent.get('label');
|
83
|
+
object = parent.get('context');
|
84
|
+
}
|
85
|
+
|
86
|
+
if (object && !object.get('isValid')) {
|
87
|
+
var errors = object.get('errors');
|
88
|
+
|
89
|
+
if (errors && fieldName in errors && !Ember.isEmpty(errors[fieldName])) {
|
90
|
+
parent.$().addClass('error');
|
91
|
+
this.$().html(errors[fieldName].join(', '));
|
92
|
+
} else {
|
93
|
+
parent.$().removeClass('error');
|
94
|
+
this.$().html('');
|
95
|
+
}
|
96
|
+
} else {
|
97
|
+
parent.$().removeClass('error');
|
98
|
+
this.$().html('');
|
99
|
+
}
|
100
|
+
}
|
101
|
+
}, 'parentView.context.isValid', 'parentView.label')
|
102
|
+
}),
|
103
|
+
|
104
|
+
helpView: Ember.View.extend({
|
105
|
+
tagName: 'div',
|
106
|
+
classNames: ['help-block'],
|
107
|
+
template: Ember.Handlebars.compile('{{view.content}}'),
|
108
|
+
contentBinding: 'parentView.help'
|
109
|
+
}),
|
110
|
+
|
111
|
+
didInsertElement: function() {
|
112
|
+
this.set('labelView.inputElementId', this.get('inputField.elementId'));
|
113
|
+
}
|
114
|
+
});
|
@@ -0,0 +1,19 @@
|
|
1
|
+
var Bootstrap = window.Bootstrap;
|
2
|
+
|
3
|
+
Bootstrap.Forms.Select = Bootstrap.Forms.Field.extend({
|
4
|
+
optionLabelPath: 'content',
|
5
|
+
optionValuePath: 'content',
|
6
|
+
|
7
|
+
inputField: Ember.Select.extend({
|
8
|
+
contentBinding: 'parentView.content',
|
9
|
+
|
10
|
+
optionLabelPathBinding: 'parentView.optionLabelPath',
|
11
|
+
optionValuePathBinding: 'parentView.optionValuePath',
|
12
|
+
|
13
|
+
valueBinding: 'parentView.value',
|
14
|
+
selectionBinding: 'parentView.selection',
|
15
|
+
promptBinding: 'parentView.prompt',
|
16
|
+
multipleBinding: 'parentView.multiple',
|
17
|
+
disabledBinding: 'parentView.disabled'
|
18
|
+
})
|
19
|
+
});
|
@@ -0,0 +1,16 @@
|
|
1
|
+
var Bootstrap = window.Bootstrap;
|
2
|
+
Bootstrap.Forms.UneditableInput = Bootstrap.Forms.Field.extend({
|
3
|
+
|
4
|
+
inputField: Ember.View.extend({
|
5
|
+
tagName: 'span',
|
6
|
+
classNames: ['uneditable-input'],
|
7
|
+
attributeBindings: ['name'],
|
8
|
+
template: Ember.Handlebars.compile('{{view.value}}'),
|
9
|
+
|
10
|
+
valueBinding: 'parentView.value',
|
11
|
+
classNameBindings: 'parentView.inputClassNames',
|
12
|
+
name: Ember.computed(function() {
|
13
|
+
return this.get('parentView.name') || this.get('parentView.label');
|
14
|
+
}).property('parentView.name', 'parentView.label')
|
15
|
+
})
|
16
|
+
});
|
@@ -0,0 +1,17 @@
|
|
1
|
+
var get = Ember.get;
|
2
|
+
var Bootstrap = window.Bootstrap;
|
3
|
+
|
4
|
+
Bootstrap.FirstLastViewSupport = Ember.Mixin.create({
|
5
|
+
createChildView: function(view, attrs) {
|
6
|
+
if (attrs) {
|
7
|
+
var content = get(this, "content");
|
8
|
+
if (attrs.contentIndex === 0) {
|
9
|
+
view = get(this, "firstItemViewClass") || view;
|
10
|
+
}
|
11
|
+
if (attrs.contentIndex === (content.get("length") - 1)) {
|
12
|
+
view = get(this, "lastItemViewClass") || view;
|
13
|
+
}
|
14
|
+
}
|
15
|
+
return this._super(view, attrs);
|
16
|
+
}
|
17
|
+
});
|
@@ -0,0 +1,28 @@
|
|
1
|
+
var get = Ember.get, set = Ember.set;
|
2
|
+
var Bootstrap = window.Bootstrap;
|
3
|
+
|
4
|
+
Bootstrap.ItemSelectionSupport = Ember.Mixin.create(Bootstrap.ItemViewValueSupport, Bootstrap.ItemViewTitleSupport, {
|
5
|
+
classNameBindings: ["isActive:active"],
|
6
|
+
allowsEmptySelection: false,
|
7
|
+
|
8
|
+
isActive: Ember.computed(function() {
|
9
|
+
var parentView = get(this, 'parentView'),
|
10
|
+
selection, value;
|
11
|
+
if (!parentView) return false;
|
12
|
+
selection = get(parentView, 'selection');
|
13
|
+
value = get(this, 'value');
|
14
|
+
return selection === value;
|
15
|
+
}).property('parentView.selection', 'value').cacheable(),
|
16
|
+
|
17
|
+
click: function(event) {
|
18
|
+
var value = get(this, 'value'),
|
19
|
+
parentView = get(this, 'parentView'),
|
20
|
+
allowsEmptySelection = get(parentView, 'allowsEmptySelection'),
|
21
|
+
selection = get(parentView, 'selection');
|
22
|
+
if (allowsEmptySelection === true && selection === value) {
|
23
|
+
value = null;
|
24
|
+
}
|
25
|
+
set(parentView, 'selection', value);
|
26
|
+
return true;
|
27
|
+
}
|
28
|
+
});
|
@@ -0,0 +1,15 @@
|
|
1
|
+
var get = Ember.get;
|
2
|
+
var Bootstrap = window.Bootstrap;
|
3
|
+
|
4
|
+
Bootstrap.ItemViewHrefSupport = Ember.Mixin.create({
|
5
|
+
href: Ember.computed(function() {
|
6
|
+
var parentView = get(this, 'parentView'),
|
7
|
+
content, hrefKey;
|
8
|
+
content = get(this, 'content');
|
9
|
+
if (parentView) {
|
10
|
+
hrefKey = get(parentView, 'itemHrefKey') || 'link';
|
11
|
+
return get(content, hrefKey) || "#";
|
12
|
+
}
|
13
|
+
return content;
|
14
|
+
}).property('content').cacheable()
|
15
|
+
});
|
@@ -0,0 +1,15 @@
|
|
1
|
+
var get = Ember.get;
|
2
|
+
var Bootstrap = window.Bootstrap;
|
3
|
+
|
4
|
+
Bootstrap.ItemViewTitleSupport = Ember.Mixin.create({
|
5
|
+
title: Ember.computed(function() {
|
6
|
+
var parentView = get(this, 'parentView'),
|
7
|
+
content, titleKey;
|
8
|
+
content = get(this, 'content');
|
9
|
+
if (parentView) {
|
10
|
+
titleKey = get(parentView, 'itemTitleKey') || 'title';
|
11
|
+
return get(content, titleKey) || content;
|
12
|
+
}
|
13
|
+
return content;
|
14
|
+
}).property('content').cacheable()
|
15
|
+
});
|
@@ -0,0 +1,13 @@
|
|
1
|
+
var get = Ember.get;
|
2
|
+
var Bootstrap = window.Bootstrap;
|
3
|
+
|
4
|
+
Bootstrap.ItemViewValueSupport = Ember.Mixin.create({
|
5
|
+
value: Ember.computed(function() {
|
6
|
+
var parentView = get(this, 'parentView'),
|
7
|
+
content, valueKey;
|
8
|
+
if (!parentView) return null;
|
9
|
+
content = get(this, 'content');
|
10
|
+
valueKey = get(parentView, 'itemValueKey') || 'value';
|
11
|
+
return get(content, valueKey) || content;
|
12
|
+
}).property('content').cacheable()
|
13
|
+
});
|
@@ -0,0 +1,13 @@
|
|
1
|
+
var get = Ember.get;
|
2
|
+
var Bootstrap = window.Bootstrap;
|
3
|
+
|
4
|
+
Bootstrap.SizeSupport = Ember.Mixin.create({
|
5
|
+
baseClassName: Ember.required(String),
|
6
|
+
classNameBindings: "sizeClass",
|
7
|
+
size: null, // mini, small || large
|
8
|
+
sizeClass: Ember.computed(function() {
|
9
|
+
var size = get(this, "size"),
|
10
|
+
baseClassName = get(this, "baseClassName");
|
11
|
+
return size ? baseClassName + "-" + size : null;
|
12
|
+
}).property("size").cacheable()
|
13
|
+
});
|
@@ -0,0 +1,14 @@
|
|
1
|
+
var get = Ember.get;
|
2
|
+
var Bootstrap = window.Bootstrap;
|
3
|
+
|
4
|
+
Bootstrap.TextSupport = Ember.Mixin.create({
|
5
|
+
valueBinding: 'parentView.value',
|
6
|
+
placeholderBinding: 'parentView.placeholder',
|
7
|
+
disabledBinding: 'parentView.disabled',
|
8
|
+
maxlengthBinding: 'parentView.maxlength',
|
9
|
+
classNameBindings: 'parentView.inputClassNames',
|
10
|
+
attributeBindings: ['name'],
|
11
|
+
name: Ember.computed(function() {
|
12
|
+
return get(this, 'parentView.name') || get(this, 'parentView.label');
|
13
|
+
}).property('parentView.name', 'parentView.label').cacheable()
|
14
|
+
});
|
@@ -0,0 +1,13 @@
|
|
1
|
+
var get = Ember.get, set = Ember.set;
|
2
|
+
var Bootstrap = window.Bootstrap;
|
3
|
+
|
4
|
+
Bootstrap.TypeSupport = Ember.Mixin.create({
|
5
|
+
baseClassName: Ember.required(String),
|
6
|
+
classNameBindings: "typeClass",
|
7
|
+
type: null, // success, warning, error, info || inverse
|
8
|
+
typeClass: Ember.computed(function() {
|
9
|
+
var type = get(this, "type"),
|
10
|
+
baseClassName = get(this, "baseClassName");
|
11
|
+
return type ? baseClassName + "-" + type : null;
|
12
|
+
}).property("type").cacheable()
|
13
|
+
});
|
@@ -0,0 +1,27 @@
|
|
1
|
+
var get = Ember.get;
|
2
|
+
var Bootstrap = window.Bootstrap;
|
3
|
+
|
4
|
+
Bootstrap.AlertMessage = Ember.View.extend(Bootstrap.TypeSupport, {
|
5
|
+
classNames: ['alert', 'alert-message'],
|
6
|
+
baseClassName: 'alert',
|
7
|
+
template: Ember.Handlebars.compile('<a class="close" rel="close" href="#">×</a>{{{view.message}}}'),
|
8
|
+
message: null,
|
9
|
+
removeAfter: null,
|
10
|
+
|
11
|
+
didInsertElement: function() {
|
12
|
+
var removeAfter = get(this, 'removeAfter');
|
13
|
+
if (removeAfter > 0) {
|
14
|
+
Ember.run.later(this, 'destroy', removeAfter);
|
15
|
+
}
|
16
|
+
},
|
17
|
+
|
18
|
+
click: function(event) {
|
19
|
+
var target = event.target,
|
20
|
+
targetRel = target.getAttribute('rel');
|
21
|
+
|
22
|
+
if (targetRel === 'close') {
|
23
|
+
this.destroy();
|
24
|
+
return false;
|
25
|
+
}
|
26
|
+
}
|
27
|
+
});
|
@@ -0,0 +1,15 @@
|
|
1
|
+
var get = Ember.get;
|
2
|
+
var Bootstrap = window.Bootstrap;
|
3
|
+
|
4
|
+
Bootstrap.Breadcrumb = Ember.CollectionView.extend(Bootstrap.FirstLastViewSupport, {
|
5
|
+
tagName: "ul",
|
6
|
+
classNames: "breadcrumb",
|
7
|
+
divider: "/",
|
8
|
+
itemViewClass: Ember.View.extend(Bootstrap.ItemViewTitleSupport, {
|
9
|
+
template: Ember.Handlebars.compile('<a href="#">{{title}}</a><span class="divider">{{view.parentView.divider}}</span>')
|
10
|
+
}),
|
11
|
+
lastItemViewClass: Ember.View.extend(Bootstrap.ItemViewTitleSupport, {
|
12
|
+
classNames: "active",
|
13
|
+
template: Ember.Handlebars.compile("{{title}}")
|
14
|
+
})
|
15
|
+
});
|
@@ -0,0 +1,106 @@
|
|
1
|
+
var get = Ember.get;
|
2
|
+
var Bootstrap = window.Bootstrap;
|
3
|
+
var jQuery = window.jQuery;
|
4
|
+
|
5
|
+
var modalPaneTemplate = [
|
6
|
+
'<div class="modal-header">',
|
7
|
+
' <a href="#" class="close" rel="close">×</a>',
|
8
|
+
' {{view view.headerViewClass}}',
|
9
|
+
'</div>',
|
10
|
+
'<div class="modal-body">{{view view.bodyViewClass}}</div>',
|
11
|
+
'<div class="modal-footer">',
|
12
|
+
' {{#if view.secondary}}<a href="#" class="btn btn-secondary" rel="secondary">{{view.secondary}}</a>{{/if}}',
|
13
|
+
' {{#if view.primary}}<a href="#" class="btn btn-primary" rel="primary">{{view.primary}}</a>{{/if}}',
|
14
|
+
'</div>'].join("\n");
|
15
|
+
var modalPaneBackdrop = '<div class="modal-backdrop"></div>';
|
16
|
+
|
17
|
+
Bootstrap.ModalPane = Ember.View.extend({
|
18
|
+
classNames: 'modal',
|
19
|
+
defaultTemplate: Ember.Handlebars.compile(modalPaneTemplate),
|
20
|
+
heading: null,
|
21
|
+
message: null,
|
22
|
+
primary: null,
|
23
|
+
secondary: null,
|
24
|
+
showBackdrop: true,
|
25
|
+
headerViewClass: Ember.View.extend({
|
26
|
+
tagName: 'h3',
|
27
|
+
template: Ember.Handlebars.compile('{{view.parentView.heading}}')
|
28
|
+
}),
|
29
|
+
bodyViewClass: Ember.View.extend({
|
30
|
+
tagName: 'p',
|
31
|
+
template: Ember.Handlebars.compile('{{{view.parentView.message}}}')
|
32
|
+
}),
|
33
|
+
|
34
|
+
didInsertElement: function() {
|
35
|
+
if (get(this, 'showBackdrop')) this._appendBackdrop();
|
36
|
+
this._setupDocumentKeyHandler();
|
37
|
+
},
|
38
|
+
|
39
|
+
willDestroyElement: function() {
|
40
|
+
if (this._backdrop) this._backdrop.remove();
|
41
|
+
this._removeDocumentKeyHandler();
|
42
|
+
},
|
43
|
+
|
44
|
+
keyPress: function(event) {
|
45
|
+
if (event.keyCode === 27) {
|
46
|
+
this._triggerCallbackAndDestroy({ close: true }, event);
|
47
|
+
}
|
48
|
+
},
|
49
|
+
|
50
|
+
click: function(event) {
|
51
|
+
var target = event.target,
|
52
|
+
targetRel = target.getAttribute('rel');
|
53
|
+
|
54
|
+
if (targetRel === 'close') {
|
55
|
+
this._triggerCallbackAndDestroy({ close: true }, event);
|
56
|
+
return false;
|
57
|
+
|
58
|
+
} else if (targetRel === 'primary') {
|
59
|
+
this._triggerCallbackAndDestroy({ primary: true }, event);
|
60
|
+
return false;
|
61
|
+
|
62
|
+
} else if (targetRel === 'secondary') {
|
63
|
+
this._triggerCallbackAndDestroy({ secondary: true }, event);
|
64
|
+
return false;
|
65
|
+
}
|
66
|
+
},
|
67
|
+
|
68
|
+
_appendBackdrop: function() {
|
69
|
+
var parentLayer = this.$().parent();
|
70
|
+
this._backdrop = jQuery(modalPaneBackdrop).appendTo(parentLayer);
|
71
|
+
},
|
72
|
+
|
73
|
+
_setupDocumentKeyHandler: function() {
|
74
|
+
var cc = this,
|
75
|
+
handler = function(event) {
|
76
|
+
cc.keyPress(event);
|
77
|
+
};
|
78
|
+
jQuery(window.document).bind('keyup', handler);
|
79
|
+
this._keyUpHandler = handler;
|
80
|
+
},
|
81
|
+
|
82
|
+
_removeDocumentKeyHandler: function() {
|
83
|
+
jQuery(window.document).unbind('keyup', this._keyUpHandler);
|
84
|
+
},
|
85
|
+
|
86
|
+
_triggerCallbackAndDestroy: function(options, event) {
|
87
|
+
var destroy;
|
88
|
+
if (this.callback) {
|
89
|
+
destroy = this.callback(options, event);
|
90
|
+
}
|
91
|
+
if (destroy === undefined || destroy) this.destroy();
|
92
|
+
}
|
93
|
+
});
|
94
|
+
|
95
|
+
Bootstrap.ModalPane.reopenClass({
|
96
|
+
rootElement: ".ember-application",
|
97
|
+
popup: function(options) {
|
98
|
+
var modalPane, rootElement;
|
99
|
+
if (!options) options = {};
|
100
|
+
modalPane = this.create(options);
|
101
|
+
rootElement = get(this, 'rootElement');
|
102
|
+
modalPane.appendTo(rootElement);
|
103
|
+
return modalPane;
|
104
|
+
}
|
105
|
+
});
|
106
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
var get = Ember.get, set = Ember.set;
|
2
|
+
var Bootstrap = window.Bootstrap;
|
3
|
+
|
4
|
+
Bootstrap.NavList = Ember.CollectionView.extend({
|
5
|
+
classNames: ['nav', 'nav-list'],
|
6
|
+
tagName: 'ul',
|
7
|
+
|
8
|
+
itemViewClass: Ember.View.extend(Bootstrap.ItemSelectionSupport, Bootstrap.ItemViewHrefSupport, {
|
9
|
+
template: Ember.Handlebars.compile('{{view view.item}}'),
|
10
|
+
|
11
|
+
item: Ember.View.extend({
|
12
|
+
tagName: 'a',
|
13
|
+
template: Ember.Handlebars.compile('{{view.parentView.title}}'),
|
14
|
+
attributeBindings: ['href'],
|
15
|
+
hrefBinding: 'parentView.href'
|
16
|
+
})
|
17
|
+
})
|
18
|
+
});
|
@@ -0,0 +1,26 @@
|
|
1
|
+
var Bootstrap = window.Bootstrap;
|
2
|
+
Bootstrap.Pager = Ember.CollectionView.extend({
|
3
|
+
tagName: "ul",
|
4
|
+
classNames: "pager",
|
5
|
+
itemTitleKey: "title",
|
6
|
+
itemHrefKey: "href",
|
7
|
+
init: function() {
|
8
|
+
this._super();
|
9
|
+
if (!this.get("content")) {
|
10
|
+
this.set("content", Ember.A([
|
11
|
+
Ember.Object.create({ title: "←" }),
|
12
|
+
Ember.Object.create({ title: "→" })
|
13
|
+
]));
|
14
|
+
}
|
15
|
+
},
|
16
|
+
itemViewClass: Ember.View.extend(Bootstrap.ItemViewTitleSupport, Bootstrap.ItemViewHrefSupport, {
|
17
|
+
classNameBindings: ["content.next", "content.previous", "content.disabled"],
|
18
|
+
template: Ember.Handlebars.compile('<a {{bindAttr href="view.href"}}>{{view.title}}</a>')
|
19
|
+
}),
|
20
|
+
arrayDidChange: function(content, start, removed, added) {
|
21
|
+
if (content) {
|
22
|
+
Ember.assert("content must always has at the most 2 elements", content.get("length") <= 2);
|
23
|
+
}
|
24
|
+
return this._super(content, start, removed, added);
|
25
|
+
}
|
26
|
+
});
|
@@ -0,0 +1,19 @@
|
|
1
|
+
var get = Ember.get, set = Ember.set, A = Ember.A;
|
2
|
+
var Bootstrap = window.Bootstrap;
|
3
|
+
|
4
|
+
Bootstrap.Pagination = Ember.CollectionView.extend({
|
5
|
+
tagName: "ul",
|
6
|
+
classNames: "pagination",
|
7
|
+
itemTitleKey: "title",
|
8
|
+
itemHrefKey: "href",
|
9
|
+
init: function() {
|
10
|
+
this._super();
|
11
|
+
if (!this.get("content")) {
|
12
|
+
this.set("content", new A([]));
|
13
|
+
}
|
14
|
+
},
|
15
|
+
itemViewClass: Ember.View.extend(Bootstrap.ItemSelectionSupport, Bootstrap.ItemViewHrefSupport, {
|
16
|
+
classNameBindings: ["content.disabled"],
|
17
|
+
template: Ember.Handlebars.compile('<a {{bindAttr href="view.href"}}>{{view.title}}</a>')
|
18
|
+
})
|
19
|
+
});
|
@@ -0,0 +1,16 @@
|
|
1
|
+
var get = Ember.get;
|
2
|
+
var Bootstrap = window.Bootstrap;
|
3
|
+
|
4
|
+
Bootstrap.ProgressBar = Ember.View.extend({
|
5
|
+
classNames: ['progress'],
|
6
|
+
classNameBindings: ['isStriped:progress-striped', 'isAnimated:active'],
|
7
|
+
template: Ember.Handlebars.compile('<div class="bar" {{bindAttr style="view.style"}}></div>'),
|
8
|
+
isAnimated: false,
|
9
|
+
isStriped: false,
|
10
|
+
progress: 0,
|
11
|
+
|
12
|
+
style: Ember.computed(function() {
|
13
|
+
var progress = get(this, 'progress');
|
14
|
+
return "width:" + progress + "%;";
|
15
|
+
}).property('progress').cacheable()
|
16
|
+
});
|
metadata
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ember-bootstrap-rails
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Kristian Mandrup
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-04-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.1.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.1.0
|
27
|
+
description: Add ember-boostrap to your rails/ember project :)
|
28
|
+
email:
|
29
|
+
- kmandrup@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- app/assets/javascripts/ember-bootstrap/all.js
|
35
|
+
- app/assets/javascripts/ember-bootstrap/core.js
|
36
|
+
- app/assets/javascripts/ember-bootstrap/forms/checkbox.js
|
37
|
+
- app/assets/javascripts/ember-bootstrap/forms/field.js
|
38
|
+
- app/assets/javascripts/ember-bootstrap/forms/select.js
|
39
|
+
- app/assets/javascripts/ember-bootstrap/forms/text_area.js
|
40
|
+
- app/assets/javascripts/ember-bootstrap/forms/text_field.js
|
41
|
+
- app/assets/javascripts/ember-bootstrap/forms/uneditable_input.js
|
42
|
+
- app/assets/javascripts/ember-bootstrap/forms.js
|
43
|
+
- app/assets/javascripts/ember-bootstrap/mixins/first_last_view_support.js
|
44
|
+
- app/assets/javascripts/ember-bootstrap/mixins/item_selection_support.js
|
45
|
+
- app/assets/javascripts/ember-bootstrap/mixins/item_view_href_support.js
|
46
|
+
- app/assets/javascripts/ember-bootstrap/mixins/item_view_title_support.js
|
47
|
+
- app/assets/javascripts/ember-bootstrap/mixins/item_view_value_support.js
|
48
|
+
- app/assets/javascripts/ember-bootstrap/mixins/size_support.js
|
49
|
+
- app/assets/javascripts/ember-bootstrap/mixins/text_support.js
|
50
|
+
- app/assets/javascripts/ember-bootstrap/mixins/type_support.js
|
51
|
+
- app/assets/javascripts/ember-bootstrap/mixins.js
|
52
|
+
- app/assets/javascripts/ember-bootstrap/views/alert_message.js
|
53
|
+
- app/assets/javascripts/ember-bootstrap/views/badge.js
|
54
|
+
- app/assets/javascripts/ember-bootstrap/views/block_alert_message.js
|
55
|
+
- app/assets/javascripts/ember-bootstrap/views/breadcrumb.js
|
56
|
+
- app/assets/javascripts/ember-bootstrap/views/label.js
|
57
|
+
- app/assets/javascripts/ember-bootstrap/views/modal_pane.js
|
58
|
+
- app/assets/javascripts/ember-bootstrap/views/nav_list.js
|
59
|
+
- app/assets/javascripts/ember-bootstrap/views/pager.js
|
60
|
+
- app/assets/javascripts/ember-bootstrap/views/pagination.js
|
61
|
+
- app/assets/javascripts/ember-bootstrap/views/pill_item.js
|
62
|
+
- app/assets/javascripts/ember-bootstrap/views/pills.js
|
63
|
+
- app/assets/javascripts/ember-bootstrap/views/progress_bar.js
|
64
|
+
- app/assets/javascripts/ember-bootstrap/views/tabs.js
|
65
|
+
- app/assets/javascripts/ember-bootstrap/views/well.js
|
66
|
+
- lib/ember-bootstrap-rails/engine.rb
|
67
|
+
- lib/ember-bootstrap-rails/version.rb
|
68
|
+
- lib/ember-bootstrap-rails.rb
|
69
|
+
- MIT-LICENSE
|
70
|
+
- Rakefile
|
71
|
+
- README.md
|
72
|
+
homepage: https://github.com/kristianmandrup/ember-bootstrap-rails
|
73
|
+
licenses: []
|
74
|
+
metadata: {}
|
75
|
+
post_install_message:
|
76
|
+
rdoc_options: []
|
77
|
+
require_paths:
|
78
|
+
- lib
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - '>='
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
requirements: []
|
90
|
+
rubyforge_project:
|
91
|
+
rubygems_version: 2.0.0
|
92
|
+
signing_key:
|
93
|
+
specification_version: 4
|
94
|
+
summary: Rails 3.1+ Asset pipeline integration for ember-bootstrap js assets
|
95
|
+
test_files: []
|
96
|
+
has_rdoc:
|