material_raingular 0.0.2.7.1 → 0.0.3
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/lib/assets/javascripts/directives/filteredselect.js.coffee +133 -0
- data/lib/assets/javascripts/directives/mdupdate.coffee +5 -4
- data/lib/assets/javascripts/directives/ngboolean.js.coffee +6 -1
- data/lib/assets/javascripts/directives/ngcallback.coffee +3 -2
- data/lib/assets/javascripts/extensions.coffee +15 -0
- data/lib/assets/javascripts/material_raingular.js.coffee +1 -1
- data/lib/assets/javascripts/rails_updater.coffee +14 -9
- data/lib/assets/stylesheets/material-raingular.sass +44 -0
- data/lib/material_raingular/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cbdd155f510682affee2271e8eb83df2446ad959
|
4
|
+
data.tar.gz: b1ee0aed082d80b1f9145cd3d00fdacb178bd1a9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae067161369d177749ee9767d0e490d0522c58c33eff3d94f6eb24bce45bde3ce446649b9155f5846bd852e07375bb4c04ba45452a9fc23728a9520050d80c4f
|
7
|
+
data.tar.gz: 4a15effbbd28995118f464612fcd0effab1cd5c96d126ef23edf9ec564b8f0544929c0d92bd6955be3a9dc14dcbd2aa11904e251e1ccbcc09201e6baf9d26335
|
@@ -0,0 +1,133 @@
|
|
1
|
+
REGEXP = /^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?(?:\s+disable\s+when\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/;
|
2
|
+
# 1: Model Value
|
3
|
+
# 2: Display Value
|
4
|
+
# 3: group by expression (groupByFn)
|
5
|
+
# 4: disable when expression (disableWhenFn)
|
6
|
+
# 5: Repeater
|
7
|
+
# 6: object item key variable name
|
8
|
+
# 7: object item value variable name
|
9
|
+
# 8: collection
|
10
|
+
# 9: track by expressionj
|
11
|
+
|
12
|
+
angular.module('FilteredSelect', [])
|
13
|
+
.directive 'ngFilteredSelect', ($parse,$filter,$timeout)->
|
14
|
+
require: 'ngModel'
|
15
|
+
link: (scope,element,attrs,ngModel) ->
|
16
|
+
filters = attrs.ngSelectOptions.split('|')
|
17
|
+
options = filters.shift()
|
18
|
+
match = options.match(REGEXP);
|
19
|
+
if !match
|
20
|
+
throw new Error(
|
21
|
+
"Expected expression in form of " +
|
22
|
+
"'_select_ (as _label_)? for (_key_,)?_value_ in _collection_'" +
|
23
|
+
" but got '" + attrs.ngSelectOptions + "'. Element: " + element[0].outerHTML)
|
24
|
+
collection = $parse(match[8])
|
25
|
+
modelValue = match[1].replace(match[5] + '.','')
|
26
|
+
viewValue = if match[2] then match[2].replace(match[5] + '.','') else modelValue
|
27
|
+
template = angular.element("<ul> </ul>")
|
28
|
+
search = angular.element "<input type='search' placeholder='Search'>"
|
29
|
+
tempHolder = angular.element("<div class='filtered-select' ></div>")
|
30
|
+
viewValueFn = $parse(viewValue || modelValue)
|
31
|
+
modelValueFn = $parse(modelValue || viewValue)
|
32
|
+
tempHolder.addClass('bottom') if element.hasClass('bottom')
|
33
|
+
template.bind 'mousewheel DOMMouseScroll', (event)->
|
34
|
+
delta = event.wheelDelta or event.originalEvent and event.originalEvent.wheelDelta or -event.detail
|
35
|
+
bottomOverflow = template[0].scrollTop + template.outerHeight() - template[0].scrollHeight >= 0
|
36
|
+
topOverflow = template[0].scrollTop <= 0
|
37
|
+
if delta < 0 and bottomOverflow or delta > 0 and topOverflow
|
38
|
+
event.preventDefault()
|
39
|
+
scrollStart = null
|
40
|
+
scrollTop = null
|
41
|
+
template.bind 'touchstart', (event)->
|
42
|
+
event.stopPropagation()
|
43
|
+
scrollStart = event.originalEvent.touches[0].clientY
|
44
|
+
template.bind 'touchmove', (event) ->
|
45
|
+
event.stopPropagation()
|
46
|
+
scroll = event.originalEvent.touches[0].clientY
|
47
|
+
scrollStart = scroll unless scrollStart
|
48
|
+
if scroll > scrollStart
|
49
|
+
event.preventDefault() if template.scrollTop() == 0
|
50
|
+
else if scroll < scrollStart
|
51
|
+
newScrollTop = template.scrollTop()
|
52
|
+
event.preventDefault() if scrollTop == newScrollTop
|
53
|
+
scrollTop = newScrollTop
|
54
|
+
scrollStart = scroll
|
55
|
+
return true
|
56
|
+
template.bind 'touchend', ->
|
57
|
+
event.stopPropagation()
|
58
|
+
scrollStart = null
|
59
|
+
body = angular.element('body')
|
60
|
+
body.bind 'keydown', (event) ->
|
61
|
+
tempHolder.removeClass('active') if event.keyCode == 27
|
62
|
+
tempHolder.append search
|
63
|
+
tempHolder.append template
|
64
|
+
body.append tempHolder
|
65
|
+
ulHeight = ->
|
66
|
+
full = window.innerHeight
|
67
|
+
full = full/3 if element.hasClass('bottom')
|
68
|
+
full - search[0].offsetHeight + 'px'
|
69
|
+
template.css('height',ulHeight())
|
70
|
+
scope.$watch collection, (newVal,oldVal) ->
|
71
|
+
return if newVal == oldVal
|
72
|
+
setInitialValue()
|
73
|
+
buildTemplate()
|
74
|
+
scope.$watch attrs.ngModel, (newVal,oldVal) ->
|
75
|
+
return if newVal == oldVal
|
76
|
+
setInitialValue()
|
77
|
+
search.bind 'input', ->
|
78
|
+
buildTemplate()
|
79
|
+
buildTemplate = ->
|
80
|
+
list= []
|
81
|
+
obj={}
|
82
|
+
obj[viewValue] = search.val() || ''
|
83
|
+
return unless collection(scope)
|
84
|
+
filteredList = $filter('orderBy')($filter('filter')(collection(scope), obj), viewValue)
|
85
|
+
for filter in filters
|
86
|
+
[filterType,value] = filter.replace(/\s+/,'').split(':')
|
87
|
+
filteredList = $filter(filterType)(filteredList, value)
|
88
|
+
for item in filteredList
|
89
|
+
li = angular.element '<li ng-model-value="' + modelValueFn(item) + '">' + viewValueFn(item) + '</li>'
|
90
|
+
li.bind 'mousedown', ($event)->
|
91
|
+
updateValue($event.target.attributes['ng-model-value'].value)
|
92
|
+
list.push li
|
93
|
+
template.empty()
|
94
|
+
template.append(list)
|
95
|
+
setInitialValue = ->
|
96
|
+
unless model = ngModel.$modelValue
|
97
|
+
view = attrs.placeholder
|
98
|
+
element.css('color','rgba(0,0,0,0.4)')
|
99
|
+
else
|
100
|
+
element.css('color','')
|
101
|
+
obj = {}
|
102
|
+
obj[modelValue] = model
|
103
|
+
list = $filter('filter')(collection(scope), obj)
|
104
|
+
viewScope = list[0] if list
|
105
|
+
view = if viewScope then viewValueFn(viewScope) else attrs.placeholder
|
106
|
+
element.html('')
|
107
|
+
element.html(view)
|
108
|
+
setInitialValue()
|
109
|
+
buildTemplate()
|
110
|
+
updateValue = (model) ->
|
111
|
+
ngModel.$setViewValue(model)
|
112
|
+
tempHolder.removeClass('active')
|
113
|
+
done = false
|
114
|
+
fieldset = element
|
115
|
+
until done
|
116
|
+
fieldset = fieldset.parent()
|
117
|
+
unless done = typeof fieldset[0] == 'undefined'
|
118
|
+
done = fieldset[0].tagName == 'FIELDSET'
|
119
|
+
element.parent('fieldset')
|
120
|
+
element.bind 'mousedown', (event)->
|
121
|
+
return if tempHolder.hasClass('active')
|
122
|
+
return if attrs.disabled || $parse(attrs.ngDisabled)(scope)
|
123
|
+
if fieldset
|
124
|
+
ngdis = if fieldset[0].attributes.ngDisabled then fieldset[0].attributes.ngDisabled.value else ''
|
125
|
+
return if fieldset[0].attributes.disabled || $parse(ngdis)(scope)
|
126
|
+
search.val('')
|
127
|
+
buildTemplate()
|
128
|
+
tempHolder.css('top',event.clientY)
|
129
|
+
tempHolder.css('transition','none')
|
130
|
+
$timeout ->
|
131
|
+
tempHolder.css('transition','')
|
132
|
+
tempHolder.css('top','')
|
133
|
+
tempHolder.addClass('active')
|
@@ -1,10 +1,11 @@
|
|
1
1
|
class ElementUpdate
|
2
|
-
constructor: (scope,element,attributes,controllers,RailsUpdater,timeout) ->
|
2
|
+
constructor: (scope,element,attributes,controllers,RailsUpdater,timeout,parse) ->
|
3
3
|
[@ngModelCtrl,@ngCallbackCtrl,@ngTrackByCtrl] = controllers
|
4
4
|
@updater = RailsUpdater.new(scope,controllers,attributes.ngModel,attributes.ngOverride)
|
5
5
|
@type = attributes.type
|
6
6
|
@tagName = element[0].tagName
|
7
7
|
@modelName = attributes.ngModel
|
8
|
+
@modelVal = parse(attributes.ngModel)
|
8
9
|
@isInput = @tagName == 'INPUT'
|
9
10
|
@scope = scope
|
10
11
|
@element = element
|
@@ -15,7 +16,7 @@ class ElementUpdate
|
|
15
16
|
@setPlaceholder() unless @placeholder
|
16
17
|
watcher: ->
|
17
18
|
eu = @
|
18
|
-
@scope.$watch @
|
19
|
+
@scope.$watch @modelVal, (updated,old) ->
|
19
20
|
eu.updater.update(updated) unless updated == old
|
20
21
|
bindInput: ->
|
21
22
|
eu = @
|
@@ -58,9 +59,9 @@ class ElementUpdate
|
|
58
59
|
@element.attr('placeholder',placeholder)
|
59
60
|
|
60
61
|
angular.module 'MdUpdate', ['Factories', 'FactoryName','RailsUpdater']
|
61
|
-
.directive 'mdUpdate', ($timeout, factoryName, $injector, RailsUpdater) ->
|
62
|
+
.directive 'mdUpdate', ($timeout, factoryName, $injector, RailsUpdater,$parse) ->
|
62
63
|
restrict: 'A'
|
63
64
|
require: ['ngModel','?ngCallback','?ngTrackBy']
|
64
65
|
|
65
66
|
link: (scope, element, attributes, ngControllers) ->
|
66
|
-
new ElementUpdate(scope,element,attributes,ngControllers, RailsUpdater,$timeout)
|
67
|
+
new ElementUpdate(scope,element,attributes,ngControllers, RailsUpdater,$timeout,$parse)
|
@@ -7,4 +7,9 @@ angular.module 'NgBoolean', ['Factories', 'FactoryName','RailsUpdater']
|
|
7
7
|
link: (scope, element, attributes, ngControllers) ->
|
8
8
|
updater = RailsUpdater.new(scope,ngControllers,attributes.ngModel,attributes.ngOverride)
|
9
9
|
element.bind 'click', ->
|
10
|
-
|
10
|
+
if element[0].tagName == 'INPUT'
|
11
|
+
updater.update(element.val())
|
12
|
+
else
|
13
|
+
bool = !ngControllers[0].$modelValue
|
14
|
+
updater.update(bool)
|
15
|
+
ngControllers[0].$setViewValue(bool)
|
@@ -7,8 +7,9 @@ angular.module 'NgCallback', ['Factories', 'FactoryName']
|
|
7
7
|
for callback in $element[0].attributes['ng-callback'].value.split(';')
|
8
8
|
[match,func,args] = callback.match(/(.*)\((.*)\)/)
|
9
9
|
data = []
|
10
|
-
|
11
|
-
|
10
|
+
if !!args
|
11
|
+
for arg in args.split(',')
|
12
|
+
data.push $scope.$eval(arg)
|
12
13
|
data.push returnData
|
13
14
|
if typeof $scope[func] == 'function'
|
14
15
|
$scope[func] data...
|
@@ -65,3 +65,18 @@ String.prototype.to_f = ->
|
|
65
65
|
return parseFloat(this)
|
66
66
|
String.prototype.to_i = ->
|
67
67
|
return parseInt(this)
|
68
|
+
Array.prototype.dup = ->
|
69
|
+
return @.slice(0)
|
70
|
+
Array.prototype.where = (obj) ->
|
71
|
+
equiv = (first,second) ->
|
72
|
+
return true if first == second
|
73
|
+
if !isNaN(first) && !isNaN(second)
|
74
|
+
return true if parseFloat(first) == parseFloat(second)
|
75
|
+
return false
|
76
|
+
result = []
|
77
|
+
for entry in @
|
78
|
+
addEntry = true
|
79
|
+
for key,value of obj
|
80
|
+
addEntry = addEntry && equiv(entry[key], value)
|
81
|
+
result.push(entry) if addEntry
|
82
|
+
result
|
@@ -21,4 +21,4 @@ angular.module('materialRaingular', ['AutoComplete', 'NgDownload', 'NgChangeOnBl
|
|
21
21
|
'NgUpload', 'NgDestroy', 'NgCreate', 'Video','NgAuthorize', 'TextArea', 'MdUpdate'
|
22
22
|
'NgSlide', 'NgMatches','NgFade','NgSwipe', 'NgLoad', 'NgWatchContent', 'RailsUpdater'
|
23
23
|
'ngRoute', 'ngMaterial', 'ngMessages', 'ngResource', 'materialFilters', 'NgCallback'
|
24
|
-
'NgSortable'])
|
24
|
+
'NgSortable', 'FilteredSelect'])
|
@@ -1,24 +1,29 @@
|
|
1
1
|
class RailsUpdate
|
2
|
-
constructor: ($injector,factoryName,scope,controllers,model,override)->
|
2
|
+
constructor: ($injector,$parse,factoryName,scope,controllers,model,override)->
|
3
3
|
@injector = $injector
|
4
4
|
@factoryName = factoryName
|
5
5
|
@scope = scope
|
6
|
-
|
7
|
-
|
6
|
+
modelName = (override || model)
|
7
|
+
if parts = modelName.match(/(.+)\[(.+)\]/)
|
8
|
+
@modelName = parts[1]
|
9
|
+
@atomName = $parse(parts[2])
|
10
|
+
else
|
11
|
+
[@modelName,@atomName] = modelName.split('.')
|
8
12
|
@override = !!override
|
9
13
|
@factory = @injector.get(@factoryName(@modelName))
|
10
|
-
@
|
11
|
-
@
|
14
|
+
@controllers = controllers.slice(0)
|
15
|
+
@ngModelCtrl = @controllers.shift()
|
12
16
|
return @
|
13
17
|
equiv: (left,right) ->
|
14
18
|
return true if left == right
|
15
19
|
return true if (!!left && !!right) == false
|
16
20
|
false
|
17
21
|
update: (value) ->
|
18
|
-
|
22
|
+
atomName = if typeof @atomName == 'function' then @atomName(@scope) else @atomName
|
23
|
+
@value = if @override then scope.$eval(atomName) else value
|
19
24
|
object = {id: @scope.$eval(@modelName).id}
|
20
25
|
object[@modelName] = {}
|
21
|
-
object[@modelName][
|
26
|
+
object[@modelName][atomName] = value
|
22
27
|
unless @scope[@modelName].currently_updating
|
23
28
|
@scope[@modelName].currently_updating = true
|
24
29
|
up = @
|
@@ -30,6 +35,6 @@ class RailsUpdate
|
|
30
35
|
for controller in up.controllers
|
31
36
|
controller.evaluate(returnData) if !!controller
|
32
37
|
angular.module 'RailsUpdater', ['Factories', 'FactoryName']
|
33
|
-
.factory 'RailsUpdater', ($injector,factoryName) ->
|
38
|
+
.factory 'RailsUpdater', ($injector,factoryName,$parse) ->
|
34
39
|
new: (scope,controllers,model,override)->
|
35
|
-
return new RailsUpdate($injector,factoryName,scope,controllers,model,override)
|
40
|
+
return new RailsUpdate($injector,$parse,factoryName,scope,controllers,model,override)
|
@@ -0,0 +1,44 @@
|
|
1
|
+
div.filtered-select
|
2
|
+
position: fixed
|
3
|
+
z-index: 1001
|
4
|
+
background-color: white
|
5
|
+
margin: 0
|
6
|
+
padding: 0
|
7
|
+
width: 100%
|
8
|
+
height: 0
|
9
|
+
overflow: hidden
|
10
|
+
left: 0
|
11
|
+
top: 0
|
12
|
+
transition: all 0.5s cubic-bezier(0.25, 0.8, 0.25, 1)
|
13
|
+
&.active
|
14
|
+
height: 100%
|
15
|
+
input
|
16
|
+
width: 100%
|
17
|
+
ul
|
18
|
+
overflow: hidden
|
19
|
+
overflow-y: auto
|
20
|
+
list-style: none
|
21
|
+
width: 100%
|
22
|
+
margin: 0
|
23
|
+
padding: 0
|
24
|
+
li
|
25
|
+
padding-left: 5%
|
26
|
+
padding-right: 5%
|
27
|
+
overflow: hidden
|
28
|
+
text-overflow: ellipsis
|
29
|
+
line-height: 48px
|
30
|
+
height: 48px
|
31
|
+
font-size: 14px
|
32
|
+
white-space: nowrap
|
33
|
+
cursor: pointer
|
34
|
+
box-shadow: 0 4px 2px -2px rgba(0,0,0,0.14)
|
35
|
+
&.bottom
|
36
|
+
top: 67%
|
37
|
+
z-index: 1000
|
38
|
+
&.active
|
39
|
+
height: 33%
|
40
|
+
ng-filtered-select
|
41
|
+
display: block
|
42
|
+
width: 100%
|
43
|
+
overflow: hidden
|
44
|
+
text-overflow: ellipsis
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: material_raingular
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Moody
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-10-
|
11
|
+
date: 2015-10-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -71,6 +71,7 @@ files:
|
|
71
71
|
- lib/assets/javascripts/dateconverter.coffee
|
72
72
|
- lib/assets/javascripts/dateparser.coffee
|
73
73
|
- lib/assets/javascripts/directives/acomplete.js.coffee
|
74
|
+
- lib/assets/javascripts/directives/filteredselect.js.coffee
|
74
75
|
- lib/assets/javascripts/directives/mdupdate.coffee
|
75
76
|
- lib/assets/javascripts/directives/ngauthorize.js.coffee
|
76
77
|
- lib/assets/javascripts/directives/ngautocomplete.js.coffee
|
@@ -103,6 +104,7 @@ files:
|
|
103
104
|
- lib/assets/javascripts/material_filters.coffee
|
104
105
|
- lib/assets/javascripts/material_raingular.js.coffee
|
105
106
|
- lib/assets/javascripts/rails_updater.coffee
|
107
|
+
- lib/assets/stylesheets/material-raingular.sass
|
106
108
|
- lib/material_raingular.rb
|
107
109
|
- lib/material_raingular/version.rb
|
108
110
|
- lib/tasks/material_raingular.rake
|
@@ -142,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
142
144
|
version: '0'
|
143
145
|
requirements: []
|
144
146
|
rubyforge_project:
|
145
|
-
rubygems_version: 2.
|
147
|
+
rubygems_version: 2.4.3
|
146
148
|
signing_key:
|
147
149
|
specification_version: 4
|
148
150
|
summary: Angular v1.4 for rails. Angular Material v0.9.8.
|