material_raingular 0.0.1.alpha

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +17 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +32 -0
  7. data/Rakefile +2 -0
  8. data/lib/assets/javascripts/ajax_errors.js.coffee +13 -0
  9. data/lib/assets/javascripts/dateconverter.coffee +23 -0
  10. data/lib/assets/javascripts/directives/ngauthorize.js.coffee +8 -0
  11. data/lib/assets/javascripts/directives/ngautocomplete.js.coffee +135 -0
  12. data/lib/assets/javascripts/directives/ngboolean.js.coffee +34 -0
  13. data/lib/assets/javascripts/directives/ngchangeonblur.js.coffee +19 -0
  14. data/lib/assets/javascripts/directives/ngcreate.js.coffee +27 -0
  15. data/lib/assets/javascripts/directives/ngdestroy.js.coffee +24 -0
  16. data/lib/assets/javascripts/directives/ngdownload.js.coffee +8 -0
  17. data/lib/assets/javascripts/directives/ngdrag.js.coffee +122 -0
  18. data/lib/assets/javascripts/directives/ngfade.js.coffee +21 -0
  19. data/lib/assets/javascripts/directives/ngload.js.coffee +16 -0
  20. data/lib/assets/javascripts/directives/ngmatches.js.coffee +14 -0
  21. data/lib/assets/javascripts/directives/ngpopup.js.coffee +37 -0
  22. data/lib/assets/javascripts/directives/ngrepeatlist.js.coffee +52 -0
  23. data/lib/assets/javascripts/directives/ngslide.js.coffee +82 -0
  24. data/lib/assets/javascripts/directives/ngswipe.js.coffee +60 -0
  25. data/lib/assets/javascripts/directives/ngupdate.js.coffee +62 -0
  26. data/lib/assets/javascripts/directives/ngupload.js.coffee +127 -0
  27. data/lib/assets/javascripts/directives/ngwatchcontent.js.coffee +13 -0
  28. data/lib/assets/javascripts/directives/ngwatchshow.js.coffee +15 -0
  29. data/lib/assets/javascripts/directives/table.js.coffee +43 -0
  30. data/lib/assets/javascripts/directives/textarea.coffee +11 -0
  31. data/lib/assets/javascripts/directives/video.js.coffee +10 -0
  32. data/lib/assets/javascripts/factory_name.js.coffee +9 -0
  33. data/lib/assets/javascripts/material_raingular.js.coffee +17 -0
  34. data/lib/material_raingular/version.rb +3 -0
  35. data/lib/material_raingular.rb +8 -0
  36. data/lib/tasks/material_raingular.rake +42 -0
  37. data/material_raingular.gemspec +25 -0
  38. data/vendor/assets/angular/.jshintrc +181 -0
  39. data/vendor/assets/angular/angular-animate.js +3708 -0
  40. data/vendor/assets/angular/angular-aria.js +378 -0
  41. data/vendor/assets/angular/angular-cookies.js +320 -0
  42. data/vendor/assets/angular/angular-loader.js +429 -0
  43. data/vendor/assets/angular/angular-material.min.css +6 -0
  44. data/vendor/assets/angular/angular-material.min.js +14 -0
  45. data/vendor/assets/angular/angular-message-format.js +980 -0
  46. data/vendor/assets/angular/angular-messages.js +678 -0
  47. data/vendor/assets/angular/angular-resource.js +668 -0
  48. data/vendor/assets/angular/angular-route.js +991 -0
  49. data/vendor/assets/angular/angular-sanitize.js +683 -0
  50. data/vendor/assets/angular/angular-touch.js +627 -0
  51. data/vendor/assets/angular/angular.js +28133 -0
  52. metadata +139 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fc8b3fde9153d728b103515e331213214f7d8869
4
+ data.tar.gz: be9370ebe8c6d33b766c9ecb3d8fe46186948a58
5
+ SHA512:
6
+ metadata.gz: bbbc21e4a0d5d4b1888844258afeb510eecad05f7e6e37c3495b496ca8414dc6fcef56cfae64f5649c9126d0be6bc5a9bea345b50efe50873d4841a9d049c970
7
+ data.tar.gz: 9762463d29da0434cfa4790e1a9bf9e8e41893890e66e2059849ca94d1096d89ab2a1ec033cce48a0d6677b03cfc7d7a821e4064763b2b01a53b705361e89255
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in material_raingular.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,17 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ material_raingular (0.0.1)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ rake (10.4.2)
10
+
11
+ PLATFORMS
12
+ ruby
13
+
14
+ DEPENDENCIES
15
+ bundler (~> 1.7)
16
+ material_raingular!
17
+ rake (~> 10.0)
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Chris Moody
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,32 @@
1
+ # MaterialRaingular
2
+
3
+ Simple convention over configuration rails angular tie in.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'material_raingular', github: 'transcon/material_raingular'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install material_raingular
20
+
21
+ ## Usage
22
+ The factories will be auto-generated when you run migrations to manually create the factories:
23
+
24
+ $ rake material_raingular:factories
25
+
26
+ ## Contributing
27
+
28
+ 1. Fork it ( https://github.com/transcon/material_raingular/fork )
29
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
30
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
31
+ 4. Push to the branch (`git push origin my-new-feature`)
32
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
@@ -0,0 +1,13 @@
1
+ angular.factories
2
+ .factory 'AjaxErrorsInterceptor', ($q, $rootScope) ->
3
+ request: (config) ->
4
+ $rootScope.xhr_errors = []
5
+ config
6
+ requestError: (rejection) -> rejection
7
+ response: (response) -> response
8
+ responseError: (rejection) ->
9
+ $rootScope.xhr_errors = []
10
+ for k,v of rejection.data
11
+ for description in v
12
+ $rootScope.xhr_errors.push(k + ' ' + ' ' + description)
13
+ rejection
@@ -0,0 +1,23 @@
1
+ class DateParser
2
+ constructor: (object)->
3
+ @object = object
4
+ evaluate: ->
5
+ for i of @object
6
+ if @object[i] != null and typeof @object[i] == 'object'
7
+ new DateParser(@object[i]).evaluate()
8
+ else if @object[i] != null and typeof @object[i] == 'string'
9
+ if !!@object[i].match(/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/)
10
+ time = new Date(@object[i])
11
+ time.setTime( time.getTime() + time.getTimezoneOffset()*60*1000 ) #offset timezone
12
+ @object[i] = time
13
+ else if !!@object[i].match(/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])T[0-9]{2}\:[0-9]{2}\:[0-9]{2}\.[0-9]{3}[A-Z]$/)
14
+ @object[i] = new Date(@object[i])
15
+ return
16
+ angular.factories
17
+ .factory 'DateConverterInterceptor', ($q, $rootScope) ->
18
+ request: (config) -> config
19
+ requestError: (rejection) -> rejection
20
+ response: (response) ->
21
+ new DateParser(response.data).evaluate()
22
+ response
23
+ responseError: (rejection) -> rejection
@@ -0,0 +1,8 @@
1
+ angular.module('NgAuthorize', [])
2
+ .directive 'ngAuthorize', ($http) ->
3
+ controller: ($scope, $element) ->
4
+ params = $element[0].attributes['ng-authorize'].value.split(',')
5
+ object = {action: params[0], object: params[1]}
6
+ $http url: '/authorize.json', method: "GET", params: object
7
+ .success (data) ->
8
+ $scope.authorized = data.authorized
@@ -0,0 +1,135 @@
1
+ class Autocomplete
2
+ constructor: (scope,factory_name, element,$filter)->
3
+ @element = element
4
+ @attributes = element[0].attributes
5
+ @scope = scope
6
+ @model_name = @attributes['ng-model'].value
7
+ @list_model = @attributes['ng-list-model'].value.split('.')
8
+ @options = if @attributes['ng-list-options'] then eval("(" + @attributes['ng-list-options'].value + ")") else {}
9
+ @context = if @attributes['ng-context'] then @attributes['ng-context'].value
10
+ @sort_by = if @attributes['ng-sort-by'] then @attributes['ng-sort-by'].value else @list_attr
11
+ @list_attr = @list_model[1]
12
+ @factory = factory_name(@list_model[0])
13
+ @scopes = @context.split('.') if @context
14
+ @parent_name = @scopes.pop() if @scopes
15
+ @list = angular.element("<div class='autocomplete menu'></div>")
16
+ @filter = $filter
17
+ @existing_factory = @scope[@factory] || @scope.$parent[@factory]
18
+ @listFactory = @element.injector().get(@factory) unless @existing_factory
19
+ @list.insertAfter(@element[0])
20
+
21
+ if @parent_name
22
+ @parent_id = @parent_name + if @parent_name.indexOf('_id') < 0 then '_id' else ''
23
+
24
+ @load()
25
+
26
+ parent_context: =>
27
+ hash = {}
28
+ hash[@parent_id] = @parent() if @context
29
+ return hash
30
+ serialize: =>
31
+ hash = {}
32
+ for key,val of @options
33
+ hash[key] = val
34
+ for key,val of @parent_context()
35
+ hash[key] = val
36
+ hash
37
+ model: (val)=>
38
+ return @scope.$eval(@model_name + '="' + val + '"') if val
39
+ return @scope.$eval(@model_name)
40
+ parent: =>
41
+ return null unless @context
42
+ return @scope.$eval(@context)
43
+ load: ->
44
+ scope = @scope
45
+ factory = @factory
46
+ model = @model
47
+ updateView = @updateView
48
+ if @context
49
+ return unless @parent()
50
+ if @existing_factory
51
+ scope[factory] = @existing_factory
52
+ scope.$watchCollection factory, (newVal) ->
53
+ updateView(model())
54
+ updateView(model())
55
+ else
56
+ @listFactory.index @serialize(), (data) ->
57
+ scope[factory] = data
58
+ updateView(model())
59
+ updateView: (value) =>
60
+ object = {}
61
+ object[@list_attr] = value || ''
62
+ scope = @scope
63
+ model = @model
64
+ model_name = @model_name
65
+ filtered = @filter('filter')((scope[@factory] || []), object )
66
+ filtered = @filter('orderBy')(filtered, @sort_by)
67
+ items = []
68
+ for item in filtered
69
+ item = angular.element "<a class='item'>" + item[@list_attr] + "</a>"
70
+ item.bind 'click', (event) ->
71
+ model(event.target.textContent)
72
+ scope.$eval event.target.parentNode.previousSibling.attributes['ng-change-on-blur'].value
73
+ items.push item
74
+ @list.empty()
75
+ @list.append(items)
76
+
77
+ angular.module('AutoComplete', [ 'FactoryName'])
78
+
79
+ .directive 'ngAutocomplete', ->
80
+ restrict: 'E'
81
+ replace: true
82
+ require: 'ngModel'
83
+ require: 'ngListModel'
84
+ template: (element, attributes) ->
85
+ newElement = angular.element('<input>')
86
+ newElement.addClass('autocomplete')
87
+ newElement[0].setAttribute('ng-update',attributes.ngModel)
88
+ newElement[0].setAttribute('auto-complete',true)
89
+ return newElement[0].outerHTML
90
+ controller: ($scope, $element, $filter, $timeout, factoryName) ->
91
+ ac = new Autocomplete($scope,factoryName,$element,$filter)
92
+ if ac.context
93
+ $scope.$watch ac.context, (newVal, oldVal) ->
94
+ if newVal
95
+ ac.load()
96
+ $scope.$watch ac.model_name, (newVal) ->
97
+ ac.updateView(newVal)
98
+
99
+ .directive 'autoComplete', ->
100
+ restrict: 'A'
101
+ require: '?ngModel'
102
+ link: (scope, element, attributes, ngModel) ->
103
+ if element[0].tagName == 'INPUT'
104
+ element.bind 'focus', ->
105
+ pos = element.position()
106
+ element.next()[0].style.left = '0px'
107
+ element.bind 'blur', ->
108
+ element.parent().find('.active').removeClass('active')
109
+ ngModel.$setViewValue(element.val())
110
+ ngModel.$render()
111
+ element.bind 'keydown', (input)->
112
+ if input.keyCode == 40
113
+ selected = element.next().find('a.active')
114
+ if selected.hasClass('active')
115
+ selected.removeClass('active')
116
+ selected = selected.next('a')
117
+ else
118
+ selected = element.next().find('a').first()
119
+ if !selected.html() then selected = element.next().find('a').first()
120
+ scroll = selected[0].scrollHeight * element.next().find('a').index(selected)
121
+ selected[0].parentElement.scrollTop = scroll
122
+ selected.addClass('active')
123
+ element.val(selected.text())
124
+ if input.keyCode == 38
125
+ selected = element.next().find('a.active')
126
+ if selected.hasClass('active')
127
+ selected.removeClass('active')
128
+ selected = selected.prev('a')
129
+ else
130
+ selected = element.next().find('a').last()
131
+ if !selected.html() then selected = element.next().find('a').last()
132
+ scroll = selected[0].scrollHeight * element.next().find('a').index(selected)
133
+ selected[0].parentElement.scrollTop = scroll
134
+ selected.addClass('active')
135
+ element.val(selected.text())
@@ -0,0 +1,34 @@
1
+ angular.module 'NgBoolean', ['Factories', 'FactoryName']
2
+
3
+ .directive 'ngBoolean', ($timeout, $compile) ->
4
+ restrict: 'A'
5
+
6
+ link: (scope, element, attributes, ngModelCtrl) ->
7
+ model = attributes.ngModel
8
+ callFunction = model + ' = !' + model + ' ; update("' + model + '")'
9
+ callFunction += ';' + attributes.ngCallback if attributes.ngCallback
10
+ element.attr("call-function", callFunction)
11
+ element.bind 'click', ->
12
+ scope.$eval(element.attr("call-function"))
13
+
14
+ controller: ($scope, $injector,factoryName) ->
15
+ $scope.update = (modelName)->
16
+ input = modelName.split(',')
17
+ trackby = input.pop() if input.length > 1
18
+ trackby = trackby.split(';') if trackby
19
+ trackby = [] unless trackby
20
+ data = input.splice(0,1)[0].split('.')
21
+ functions = input.join(',').split(')')
22
+ factory = factoryName(data[0])
23
+ object = {id: $scope[data[0]]['id']}
24
+ object[data[0]] = {id: $scope[data[0]]['id']}
25
+ object[data[0]][data[1]] = $scope[data[0]][data[1]]
26
+ list = $injector.get(factory)
27
+ list.update object, (returnData) ->
28
+ for tracked in trackby
29
+ $scope[data[0]][tracked] = returnData[tracked]
30
+ $scope[data[0]][data[1]] = returnData[data[1]] if $scope[data[0]][data[1]] == object[data[0]][data[1]]
31
+ callFunctions = []
32
+ for callFunction in functions
33
+ callFunctions.push(callFunction + ',' + JSON.stringify(returnData) + ')') if callFunction.length > 0
34
+ $scope.$eval( callFunctions.join('') ) if callFunctions.join('').length > 0
@@ -0,0 +1,19 @@
1
+ angular.module('NgChangeOnBlur', [])
2
+ .directive 'ngChangeOnBlur', ($timeout)->
3
+ restrict: 'A',
4
+ require: 'ngModel',
5
+ link: (scope, element, attributes, ngModelCtrl) ->
6
+ return if (attributes.type == 'radio' || attributes.type == 'checkbox')
7
+ callFunction = attributes.ngChangeOnBlur
8
+ oldValue = null
9
+ element.bind 'focus', ->
10
+ scope.$apply ->
11
+ oldValue = element.val()
12
+ element.bind 'blur', (event) ->
13
+ delay = if element.hasClass('autocomplete') then 300 else 0
14
+ $timeout ->
15
+ scope.$apply ->
16
+ newValue = element.val()
17
+ scope.$eval(callFunction) if (newValue != oldValue)
18
+ , delay
19
+
@@ -0,0 +1,27 @@
1
+ angular.module 'NgCreate', ['Factories', 'FactoryName']
2
+
3
+ .directive 'ngCreate', ($timeout, $compile) ->
4
+ restrict: 'A'
5
+ link: (scope, element, attributes) ->
6
+ element.bind 'click', (event) ->
7
+ [parentName, listName] = attributes.ngContext.split('.') if attributes.ngContext
8
+ attr = eval('(' + attributes.ngAttributes + ')') || {}
9
+ scope.create(attributes.ngCreate,parentName,listName,attr)
10
+ controller: ($scope, $injector, factoryName) ->
11
+ $scope.create = (modelName,parentName,listName,attributes) ->
12
+ factory = factoryName(modelName)
13
+ list = $injector.get(factory)
14
+ object = {}
15
+ object[modelName] = attributes
16
+ if parentName
17
+ object[parentName] = $scope[parentName] unless parentName.indexOf('_id') < 0
18
+ object[parentName + '_id'] = $scope[parentName].id if parentName.indexOf('_id') < 0
19
+ list.create object, (returnData) ->
20
+ if listName
21
+ scope = if $scope[parentName] then $scope else $scope.$parent
22
+ scope[parentName] = {} unless scope[parentName]
23
+ scope[parentName][listName] = [] unless scope[parentName][listName]
24
+ scope[parentName][listName].push(returnData)
25
+ else
26
+ $scope[factory] = [] unless $scope[factory]
27
+ $scope[factory].push(returnData)
@@ -0,0 +1,24 @@
1
+ angular.module 'NgDestroy', ['Factories']
2
+
3
+ .directive 'ngDestroy', ($timeout, $compile) ->
4
+ restrict: 'A'
5
+ link: (scope, element, attributes) ->
6
+ element.bind 'click', (event) ->
7
+ scope.destroy(attributes.ngDestroy,attributes.ngContext)
8
+ controller: ($scope, $injector) ->
9
+ $scope.destroy = (modelName,listName) ->
10
+ raw_factory = modelName.split('_')
11
+ factory=[]
12
+ for word in raw_factory
13
+ factory.push(word.charAt(0).toUpperCase() + word.slice(1))
14
+ factory = factory.join('')
15
+ if listName
16
+ list = $scope
17
+ for scope in listName.split('.')
18
+ list = list[scope]
19
+ else
20
+ list = $scope[factory]
21
+ list.splice(list.indexOf($scope[modelName]),1)
22
+ list = $injector.get(factory)
23
+ object = {id: $scope[modelName].id}
24
+ list.delete object
@@ -0,0 +1,8 @@
1
+ angular.module('NgDownload', [])
2
+ .directive 'ngDownload', ->
3
+ replace: true,
4
+ link: (scope, element, attrs) ->
5
+ value = attrs.ngDownload
6
+ value = if value == true || value == 'true' then '' else value
7
+ value = null if (value == null || value == 'false' || value == '')
8
+ element.attr 'download',value
@@ -0,0 +1,122 @@
1
+ angular.module('NgDrag', [])
2
+ .factory 'DragHolder', ->
3
+ object = { scope: '', dragging: '', context: '' }
4
+
5
+ object.set = (scope,dragging,context) ->
6
+ this.scope = scope
7
+ this.dragging = dragging
8
+ this.context = context
9
+
10
+ object.get = ->
11
+ return this
12
+
13
+ return object
14
+ .directive 'ngPositionable', (DragHolder) ->
15
+ link: (scope, element, attributes, ngModelCtrl) ->
16
+ el = element[0]
17
+ element.css('transition', '0.3s all')
18
+ el.draggable = true
19
+ el.addEventListener 'dragstart', (e) ->
20
+ this.classList.add('drag')
21
+ DragHolder.set scope,attributes.ngPositionable,attributes.ngContext
22
+ e.stopPropagation()
23
+ el.addEventListener 'dragend',(e) ->
24
+ this.classList.remove('drag')
25
+ el.droppable = true
26
+ el.addEventListener 'dragover', (e) ->
27
+ e.dataTransfer.dropEffect = 'move'
28
+ e.preventDefault()
29
+ e.stopPropagation()
30
+ this.classList.add('over')
31
+ el.addEventListener 'dragenter', (e) ->
32
+ e.preventDefault()
33
+ e.stopPropagation()
34
+ this.classList.add('over')
35
+ el.addEventListener 'dragleave', (e) ->
36
+ this.classList.remove('over')
37
+ e.preventDefault()
38
+ el.addEventListener 'drop', (e) ->
39
+ e.stopPropagation() if (e.stopPropagation)
40
+ this.classList.remove('over')
41
+ raw_factory = attributes.ngPositionable.split('_')
42
+ factory=[]
43
+ for word in raw_factory
44
+ factory.push(word.charAt(0).toUpperCase() + word.slice(1))
45
+ factory = factory.join('')
46
+ dragged = DragHolder.get()
47
+ dragging = dragged.scope[dragged.dragging]
48
+ if dragged.context
49
+ draggingContext = dragged.scope[dragged.context]
50
+ droppingContext = scope[attributes.ngContext]
51
+ if draggingContext != droppingContext
52
+ dragged.scope[factory].splice(dragged.scope[factory].indexOf(dragging),1)
53
+ scope[factory].push(dragging)
54
+ dropping = scope[attributes.ngPositionable]
55
+ if attributes.ngDisabled
56
+ disabled = attributes.ngDisabled.split('!')
57
+ disabled[0] = '!' if disabled.length > 1
58
+ bool = scope.$parent[disabled.pop()]
59
+ bool = !bool if disabled.length > 0
60
+ else
61
+ bool = false
62
+ unless bool
63
+ scope.setPosition(dragging,dropping,draggingContext,droppingContext,attributes.ngContext,factory)
64
+ controller: ($scope, $element, $filter, $injector) ->
65
+ $scope.setPosition = (dragging,dropping,draggingContext,droppingContext,context,factory) ->
66
+ unless dragging == dropping
67
+ orderedArray = $filter('orderBy')($scope[factory], 'position')
68
+ index = orderedArray.indexOf(dropping)
69
+ unless dragging == orderedArray[index - 1]
70
+ unless index == 0
71
+ dragging.position = parseFloat(dropping.position) - (parseFloat(dropping.position) - parseFloat(orderedArray[index - 1].position)) / 2
72
+ else
73
+ dragging.position = parseFloat(dropping.position) / 2
74
+ object = {id: dragging.id, position: dragging.position}
75
+ object[context + '_id'] = droppingContext.id if context
76
+ list = $injector.get(factory)
77
+ list.update object, (returnData) ->
78
+ dragging = returnData
79
+
80
+ .directive 'ngDrag', ->
81
+ link: (scope, element, attributes, ngModelCtrl) ->
82
+ callFunction = attributes.ngDrag
83
+ el = element[0]
84
+ el.draggable = true
85
+ el.addEventListener 'dragstart', (e) ->
86
+ e.dataTransfer.setData('html',el)
87
+ this.classList.add('drag')
88
+ scope.$eval(callFunction)
89
+ el.addEventListener 'dragend',(e) ->
90
+ this.classList.remove('drag')
91
+
92
+ .directive 'ngDrop', ->
93
+ link: (scope, element, attributes, ngModelCtrl) ->
94
+ callFunction = attributes.ngDrop
95
+ el = element[0]
96
+ el.droppable = true
97
+ el.addEventListener 'dragover', (e) ->
98
+ e.dataTransfer.dropEffect = 'move'
99
+ e.preventDefault()
100
+ this.classList.add('over')
101
+ el.addEventListener 'dragenter', (e) ->
102
+ e.preventDefault()
103
+ this.classList.add('over')
104
+ el.addEventListener 'dragleave', (e) ->
105
+ this.classList.remove('over')
106
+ e.preventDefault()
107
+ el.addEventListener 'drop', (e) ->
108
+ e.stopPropagation() if (e.stopPropagation)
109
+ this.classList.remove('over')
110
+ scope.$eval(callFunction)
111
+
112
+ .directive 'ngChangeDebounce', ($timeout) ->
113
+ restrict: 'A',
114
+ require: 'ngModel',
115
+ link: (scope, element, attr, ngModelCtrl) ->
116
+ return if (attr.type == 'radio' || attr.type == 'checkbox')
117
+ callFunction = attr.ngChangeDebounce
118
+ element.bind 'keyup', ->
119
+ $timeout.cancel(scope.debounce)
120
+ scope.debounce = $timeout ->
121
+ scope.$eval(callFunction)
122
+ ,750
@@ -0,0 +1,21 @@
1
+ angular.module('NgFade', [])
2
+ .directive 'ngFadeOut', ->
3
+ link: (scope, element, attributes) ->
4
+ element.css('transition', '0.3s all')
5
+ scope.$watch attributes.ngFadeOut, (value) ->
6
+ if value
7
+ element.css('opacity', '0')
8
+ element.css('z-index', '0')
9
+ else
10
+ element.css('opacity', '1')
11
+ element.css('z-index', '1')
12
+ .directive 'ngFadeIn', ->
13
+ link: (scope, element, attributes) ->
14
+ element.css('transition', '0.3s all')
15
+ scope.$watch attributes.ngFadeIn, (value) ->
16
+ if value
17
+ element.css('opacity', '1')
18
+ element.css('z-index', '1')
19
+ else
20
+ element.css('opacity', '0')
21
+ element.css('z-index', '0')
@@ -0,0 +1,16 @@
1
+ angular.module 'NgLoad', ['Factories', 'FactoryName']
2
+
3
+ .directive 'ngLoad', ->
4
+ restrict: 'E'
5
+ require: 'ngModel'
6
+
7
+ controller: ($scope, $element, $injector, $routeParams, factoryName) ->
8
+ factory = factoryName($element[0].attributes['ng-model'].value)
9
+ object = {id: $routeParams.id}
10
+ list = $injector.get(factory)
11
+ if $routeParams.id
12
+ list.show object, (returnData) ->
13
+ $scope[$element[0].attributes['ng-model'].value] = returnData
14
+ else
15
+ list.create (returnData) ->
16
+ $scope[$element[0].attributes['ng-model'].value] = returnData
@@ -0,0 +1,14 @@
1
+ angular.module('NgMatches', [])
2
+ .directive 'ngMatches', ->
3
+ replace: true
4
+ scope: {
5
+ ngMatches: '='
6
+ }
7
+ template: (element, attributes) ->
8
+ element[0].setAttribute('ng-show','checkMatch(ngMatches)')
9
+ element[0].removeAttribute('ng-matches')
10
+ return element[0].outerHTML
11
+ controller: ($scope,$element) ->
12
+ $scope.checkMatch = (model) ->
13
+ return true unless model
14
+ return $element[0].textContent.toLowerCase().indexOf(model.toLowerCase()) > -1
@@ -0,0 +1,37 @@
1
+ angular.module('NgPopup', [])
2
+ .directive 'ngPopup',($timeout) ->
3
+ restrict: 'A',
4
+ scope: {
5
+ ngPopup: '@'
6
+ }
7
+ controller: ($scope, $element) ->
8
+ popup = document.createElement('div')
9
+ popup.setAttribute('class','ng-popup ng-hide')
10
+ exitStatus = true
11
+ while exitStatus
12
+ $scope.uniqueId = Math.floor(Math.random()*(1000000))
13
+ exitStatus = !!document.getElementById($scope.uniqueId)
14
+ popup.setAttribute('id', $scope.uniqueId)
15
+ document.body.appendChild(popup)
16
+
17
+ link: (scope, element, attributes) ->
18
+ setView = (start) ->
19
+ if start
20
+ pos = element[0].getBoundingClientRect()
21
+ popup = document.getElementById(scope.uniqueId)
22
+ popup.style.left = (pos.right + 3) + 'px'
23
+ popup.style.top = (pos.top + 3) + 'px'
24
+ scope.runner = $timeout ->
25
+ document.getElementById(scope.uniqueId).innerHTML = scope.ngPopup
26
+ setView(true)
27
+ 30
28
+ popup.classList.remove('ng-hide')
29
+ else
30
+ $timeout.cancel scope.runner
31
+ document.getElementById(scope.uniqueId).classList.add('ng-hide')
32
+ startListener = if (element[0].tagName == 'INPUT' || element[0].tagName == 'INPUT') then 'focus' else 'mouseenter'
33
+ stopListener = if (element[0].tagName == 'INPUT' || element[0].tagName == 'INPUT') then 'blur' else 'mouseout'
34
+ element[0].addEventListener startListener, ->
35
+ setView(true)
36
+ element[0].addEventListener stopListener, ->
37
+ setView()