material_raingular 0.3.3 → 0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 95ebd538a091e42682e232d4c7f484b066f64e5f
4
- data.tar.gz: ac898c80b273df942dea0b41182934b7abc65832
3
+ metadata.gz: 2b4a25561c752fffb57c14c195bb05957cd026e6
4
+ data.tar.gz: d7e59069570e7b59c6d4f713136206493f273e4d
5
5
  SHA512:
6
- metadata.gz: e8ee57135b16f5ce7b1f28cc9bc9061f203e13a67affdb6373249320834354664563f38f642779c26cb4577043ed894cf9259321fc3043145a05ac85cbd0b7d7
7
- data.tar.gz: dfecb25ac53b1c3e01092b158dfa2e08297dcdf0ccd420f0e756c56ffc908c8c20e189353926858cb15d7596db557f9d00d40f1d0f2a529f4a192b01cd658396
6
+ metadata.gz: 32eb70e30c96b3959877e29da4e798cd4dfc055f6ef6c40d4955cf180645a6e1ad7c94f4eaab964efc3b9cb1f1a2b9d80be68cc682f0655196b7642a0b8a6a30
7
+ data.tar.gz: 91db8e9fbda211b774877bf37e40b15492be1deb573cea7ab110ec1c5d69d9a344c7d6f4e7bab85516361d79b944d306c25b3d277196545bbb59792a3017312e
@@ -0,0 +1,13 @@
1
+ class ActiveRecord.$Collection extends Array
2
+ $inject: (args...) ->
3
+ @$injector ||= angular.element(document.body).injector()
4
+ @[item] = @$injector.get(item) for item in args
5
+ constructor: (@$promise,callback,error,@options) ->
6
+ @$resolved = false
7
+ @$inject('$paramSerializer')
8
+ @$promise?.then(@$processResponse).then(callback,error)
9
+ $processResponse: (response)=>
10
+ for item in response.data
11
+ @.push(ActiveRecord.$Resource.initialize(item,@options))
12
+ @$resolved = true
13
+ return response.data
@@ -0,0 +1,171 @@
1
+ class ActiveRecord.Controller extends AngularServiceModel
2
+ @$inject: ['$paramSerializer','$http']
3
+ new: (params,callback,error) -> @$singleRecord(params,'new','GET',callback,error)
4
+ create: (params,callback,error) -> @$singleRecord(params,'create','POST',callback,error)
5
+ show: (params,callback,error) -> @$singleRecord(params,'show','GET',callback,error)
6
+ edit: (params,callback,error) -> @$singleRecord(params,'edit','GET',callback,error)
7
+ update: (params,callback,error) -> @$singleRecord(params,'update','PUT',callback,error)
8
+ destroy: (params,callback,error) -> @$singleRecord(params,'destroy','DELETE',callback,error)
9
+ index: (params,callback,error) -> @$collectionRecord(params,'index','GET',callback,error)
10
+
11
+ # Privte
12
+ __name__: -> @constructor.toString().match(/function\s*(.*?)\(/)?[1]
13
+ __table_name__: -> @__name__().tableize()
14
+ __url__: -> '/' + @__table_name__() + '/:id'
15
+ $rawUrl: (params,route,method)->
16
+ method ||= 'GET'
17
+ @$buildUrls() unless @_urls
18
+ key = Object.keys(params || {}).intersection(Object.keys(@_urls))[0]
19
+ path = @_urls[key][route] if key && route
20
+ path ||= @__url__()
21
+ replacements = {new: 'new',edit: ':id/edit'}
22
+ path = path.replace(':id',replacements[route]) if route in Object.keys(replacements)
23
+ additionals={}
24
+ for key,val of (params || {})
25
+ newPath = path.replace(':' + key, val)
26
+ additionals[key] = val if newPath == path
27
+ path = newPath
28
+ [path,additionals]
29
+ $url: (params,route,method)->
30
+ [path,additionals] = @$rawUrl(params,route,method)
31
+ path = path.split('/').reject( (item)-> item[0] == ':').join('/')
32
+ path += '.json' unless path.match(/\.json$/)
33
+ if method == 'GET'
34
+ query = @$paramSerializer.clean(additionals)
35
+ path += '?' + query if query
36
+ path
37
+
38
+ routes:
39
+ shallow: ['edit','update','show','destroy']
40
+ nonShallow: ['new','create','index']
41
+ restful: ['new','create','index','edit','update','show','destroy']
42
+ $buildUrls: ->
43
+ @_urls ||= {}
44
+ for item in [@parents].compact().flatten()
45
+ atom = if typeof item == 'string' then item else Object.keys(item)[0]
46
+ foreignKey = item[atom]?.foreignKey || atom + '_id'
47
+ @_urls[foreignKey] ||= {}
48
+ for key in @routes.restful
49
+ continue if key not in (item[atom]?.only || []) && item[atom]?.only
50
+ shallow = key in @routes.shallow && (item[atom]?.shallow)
51
+ @_urls[foreignKey][key] = if shallow then '' else '/' + atom.pluralize() + '/:' + foreignKey
52
+ @_urls[foreignKey][key] += @__url__()
53
+ $singleRecord: (params,route,method,callback,error) -> @$fetchRecord(params,route,method,callback,error,'$Resource')
54
+ $collectionRecord: (params,route,method,callback,error) -> @$fetchRecord(params,route,method,callback,error,'$Collection')
55
+ $fetchRecord: (params,route,method,callback,error,type,update_url,destroy_url) ->
56
+ if typeof params == 'function'
57
+ error = callback
58
+ callback = params
59
+ params = {}
60
+ url = if route in @routes.restful then @$url(params,route,method) else route
61
+ promise = @$http(url: url, method: method, data: params)
62
+ options = {
63
+ klass: @__name__()
64
+ update_url: update_url || @$rawUrl(params,'update','PUT')[0]
65
+ destroy_url: destroy_url || @$rawUrl(params,'destroy','DELETE')[0]}
66
+ new ActiveRecord[type](promise,callback,error,options)
67
+ @$addRoutes: (routes) ->
68
+ for key,val of routes
69
+ @::[key] = (params,callback,error)->
70
+ type = if val.collection then '$Collection' else '$Resource'
71
+ @$fetchRecord(params,val.url,(val.method || 'GET'),callback,error,type,val.update_url,val.destroy_url)
72
+
73
+
74
+ ###
75
+ Desired Syntax
76
+ class ActiveRecord.Project extends ActiveRecord.Base
77
+ @register(angular.app)
78
+ @parents: [{company: {shallow: true}},{person: {only: ['index']},'organization'] # Non-Shallow routes index,create,new Shallow routes update,edit,show,destroy
79
+ # Alternate function snytax:
80
+ @parents: ->[{company: {shallow: true}},{person: {only: ['index']},'organization']
81
+
82
+ resulting functionality
83
+ # New
84
+ @Project.new() => /projects/new.json #Method => GET
85
+ @Project.new(company_id: 1) => /companies/1/projects/new.json #Method => GET
86
+ @Project.new(person_id: 1) => /projects/new.json?person_id=1 #Method => GET
87
+ @Project.new(organization_id: 1) => /organizations/1/projects/new.json #Method => GET
88
+ # Create
89
+ @Project.create() => /projects.json #Method => POST
90
+ @Project.create(company_id: 1) => /companies/1/projects.json #Method => POST
91
+ @Project.create(person_id: 1) => /projects.json?person_id=1 #Method => POST
92
+ @Project.create(organization_id: 1) => /organizations/1/projects.json #Method => POST
93
+ # Edit
94
+ @Project.edit(id: 3) => /projects/3/edit.json #Method => GET
95
+ @Project.edit(id: 3,company_id: 1) => /projects/3/edit.json?company_id=1 #Method => GET
96
+ @Project.edit(id: 3,person_id: 1) => /projects/3/edit.json?person_id=1 #Method => GET
97
+ @Project.edit(id: 3,organization_id: 1) => /organizations/1/projects/3/edit.json #Method => GET
98
+ # Update
99
+ @Project.update(id: 3) => /projects/3.json #Method => PUT/PATCH
100
+ @Project.update(id: 3,company_id: 1) => /projects/3.json?company_id=1 #Method => PUT/PATCH
101
+ @Project.update(id: 3,person_id: 1) => /projects/3.json?person_id=1 #Method => PUT/PATCH
102
+ @Project.update(id: 3,organization_id: 1) => /organizations/1/projects/3.json #Method => PUT/PATCH
103
+ # Show
104
+ @Project.show(id: 3) => /projects/3.json #Method => GET
105
+ @Project.show(id: 3,company_id: 1) => /projects/3.json?company_id=1 #Method => GET
106
+ @Project.show(id: 3,person_id: 1) => /projects/3.json?person_id=1 #Method => GET
107
+ @Project.show(id: 3,organization_id: 1) => /organizations/1/projects/3.json #Method => GET
108
+ # Destroy
109
+ @Project.destroy(id: 3) => /projects/3.json #Method => DELETE
110
+ @Project.destroy(id: 3,company_id: 1) => /projects/3.json?company_id=1 #Method => DELETE
111
+ @Project.destroy(id: 3,person_id: 1) => /projects/3.json?person_id=1 #Method => DELETE
112
+ @Project.destroy(id: 3,organization_id: 1) => /organizations/1/projects/3.json #Method => DELETE
113
+ # Index
114
+ @Project.index() => /projects.json #Method => GET
115
+ @Project.index(company_id: 1) => /companies/1/projects.json #Method => GET
116
+ @Project.index(person_id: 1) => /people/1/projects.json #Method => GET
117
+ @Project.index(organization_id: 1) => /organizations/1/projects.json #Method => GET
118
+
119
+ Desired Syntax
120
+ class ActiveRecord.Project extends ActiveRecord.Base
121
+ @register(angular.app)
122
+ @__url__: -> '/not_projects'
123
+ @parents: [{company: {shallow: true}}]
124
+
125
+ resulting functionality
126
+ # New
127
+ @Project.new() => /not_projects/new.json #Method => GET
128
+ @Project.new(company_id: 1) => /companies/1/not_projects/new.json #Method => GET
129
+ # Create
130
+ @Project.create() => /not_projects.json #Method => POST
131
+ @Project.create(company_id: 1) => /companies/1/not_projects.json #Method => POST
132
+ # Edit
133
+ @Project.edit(id: 3) => /not_projects/3/edit.json #Method => GET
134
+ @Project.edit(id: 3,company_id: 1) => /not_projects/3/edit.json?company_id=1 #Method => GET
135
+ # Update
136
+ @Project.update(id: 3) => /not_projects/3.json #Method => PUT/PATCH
137
+ @Project.update(id: 3,company_id: 1) => /not_projects/3.json?company_id=1 #Method => PUT/PATCH
138
+ # Show
139
+ @Project.show(id: 3) => /not_projects/3.json #Method => GET
140
+ @Project.show(id: 3,company_id: 1) => /not_projects/3.json?company_id=1 #Method => GET
141
+ # Destroy
142
+ @Project.destroy(id: 3) => /not_projects/3.json #Method => DELETE
143
+ @Project.destroy(id: 3,company_id: 1) => /not_projects/3.json?company_id=1 #Method => DELETE
144
+ # Index
145
+ @Project.index() => /not_projects.json #Method => GET
146
+ @Project.index(company_id: 1) => /companies/1/not_projects.json #Method => GET
147
+
148
+ Desired Syntax
149
+ class ActiveRecord.Project extends ActiveRecord.Base
150
+ @register(angular.app)
151
+ @__url__: -> '/not_projects'
152
+ @parents: [{company: {shallow: true, url: '/not_companies/:id/something'}}]
153
+
154
+ resulting functionality
155
+ # New
156
+ @Project.new(company_id: 1) => /not_companies/1/something/new.json #Method => GET
157
+ # Create
158
+ @Project.create(company_id: 1) => /not_companies/1/something.json #Method => POST
159
+ # Edit
160
+ @Project.edit(id: 3,company_id: 1) => /not_projects/3/edit.json?company_id=1 #Method => GET
161
+ # Update
162
+ @Project.update(id: 3,company_id: 1) => /not_projects/3.json?company_id=1 #Method => PUT/PATCH
163
+ # Show
164
+ @Project.show(id: 3,company_id: 1) => /not_projects/3.json?company_id=1 #Method => GET
165
+ # Destroy
166
+ @Project.destroy(id: 3,company_id: 1) => /not_projects/3.json?company_id=1 #Method => DELETE
167
+ # Index
168
+ @Project.index(company_id: 1) => /not_companies/1/something.json #Method => GET
169
+
170
+
171
+ ###
@@ -0,0 +1,23 @@
1
+ class $paramSerializer extends AngularServiceModel
2
+ @register(MaterialRaingular.app)
3
+ @inject('$httpParamSerializer')
4
+ clean: (obj) -> @$httpParamSerializer @update(obj)
5
+ update: (obj) ->
6
+ res = {}
7
+ for key,val of @strip(obj)
8
+ continue if val == obj['$' + key + '_was']
9
+ continue if val?.toString() == obj['$' + key + '_was']?.toString()
10
+ res[key] = val
11
+ res
12
+ strip: (obj) ->
13
+ res = {}
14
+ for key,val of obj
15
+ continue if ['$','_'].includes(key[0]) || key in ['constructor','initialize']
16
+ res[key] = if (typeof val == 'object' && val != null && !val instanceof Date) then @strip(val) else val
17
+ res
18
+ create: (obj) ->
19
+ res = {}
20
+ for key,val of @strip(obj)
21
+ continue unless val
22
+ res[key] = val
23
+ res
@@ -0,0 +1,65 @@
1
+ class ActiveRecord.$Resource extends Module
2
+ @include AngularInjectableModel
3
+ constructor: (@$promise,callback,error,@_options) ->
4
+ @$activeRecord = true
5
+ @_options ||= {}
6
+ @$resolved = false
7
+ @$inject('$paramSerializer','$http','$q','$timeout','$rootScope')
8
+ @$promise?.then(@$processResponse.bind(@)).then(callback,error)
9
+ $updatingKeys: []
10
+ $activeRecord: true
11
+ @initialize: (resource,options) ->
12
+ record = new @(null,null,null,options)
13
+ record.$processResponse(data: resource)
14
+ return record
15
+ @_resourcify: (obj,klass) ->
16
+ return if obj.$activeRecord
17
+ record = @initialize(obj,{klass: klass})
18
+ obj[key] = val for key,val of record
19
+
20
+ $deferProcessResponse: (response) ->
21
+ promise = @$timeout => @$processResponse.bind(@)(response,true)
22
+ return promise
23
+
24
+ $processResponse: (response,apply) ->
25
+ @$resolved = true
26
+ for key,val of response.data
27
+ @[key] = val if @[key] == @['$' + key + '_was'] || key in @$updatingKeys
28
+ @['$' + key + '_was'] = val unless key[0] in ['$','_']
29
+ @$updatingKeys = []
30
+ return response.data
31
+
32
+ _defaultWrap: -> @_options.klass.underscore()
33
+ _defaultPath: -> '/' + @_options.klass.tableize() + '/:id'
34
+ $updateUrl: ->
35
+ path = @_options.updateUrl || @_defaultPath()
36
+ path = path.replace(':id', @.id || '').replace(/\/$/,'')
37
+ path += '.json' unless path.match(/\.json$/)
38
+ path
39
+ $destroyUrl: ->
40
+ path = @_options.destroyUrl || @_defaultPath()
41
+ path = path.replace(':id', @.id)
42
+ path += '.json' unless path.match(/\.json$/)
43
+ path
44
+ $save: (callback,error)->
45
+ if @$promise
46
+ @$promise = @$promise.then(@_save.bind(@)).then(callback,error) if (@$promise.$$state.status != 0 || !@$resolved)
47
+ else
48
+ @$promise = @_save.bind(@)().then(callback,error)
49
+ _save: ->
50
+ res = @$paramSerializer.update(@)
51
+ unless Object.keys(res).length > 0
52
+ defer = @$q.defer()
53
+ defer.resolve(@)
54
+ return defer.promise
55
+ @$updatingKeys = Object.keys(res)
56
+ method = if @.id then 'put' else 'post'
57
+ params = {}
58
+ params[@_options.paramWrapper || @_defaultWrap()] = if @.id then @$paramSerializer.update(@) else @$paramSerializer.create(@)
59
+ @["$" + key + "_was"] = val for key,val of res
60
+ return @$http[method](@$updateUrl(),params).then(@$deferProcessResponse.bind(@))
61
+ $destroy: (callback,error)->
62
+ @$promise.$$state.status = 0
63
+ @$promise = @_destroy().then(callback,error)
64
+ _destroy: =>
65
+ return @$http.delete(@$destroyUrl()).then(@$processResponse.bind(@))
@@ -0,0 +1,148 @@
1
+ Array::dup = -> return @slice(0)
2
+ Array::empty = -> @length == 0
3
+ Array::first = -> @[0]
4
+ Array::intersects = (arr) -> @intersection(arr).length > 0
5
+ Array::last = -> @[@length - 1]
6
+ Array::min = -> return Math.min.apply(null,@)
7
+ Array::max = -> return Math.max.apply(null,@)
8
+ Array::present = -> @length != 0
9
+ Array::remove_all = -> @splice(0,@length)
10
+
11
+ Array::add = (arr) ->
12
+ (@push(item) unless @includes(item)) for item in arr
13
+ @
14
+ Array::allIndicesOf = (arg) ->
15
+ res = []
16
+ until res.last() == -1 || res.length > 10
17
+ start = if (res.last() > -1) then res.last() + 1 else 0
18
+ res.push(@indexOf(arg,start))
19
+ res[0..-2]
20
+ Array::compact = ->
21
+ arr = []
22
+ arr.push(i) if !!i or i == false for i in @
23
+ arr
24
+ Array::drop = (entry)->
25
+ if (entry || {}).hasOwnProperty('id')
26
+ index = @pluck('id').indexOf(entry.id)
27
+ else
28
+ index = @indexOf(entry)
29
+ return @ unless index > -1
30
+ @splice(index,1)
31
+ Array::find = (id) ->
32
+ index = @pluck('id').indexOf(id)
33
+ @[index]
34
+ Array::flatten = ->
35
+ arr = []
36
+ for l in @
37
+ if Array.isArray(l)
38
+ for i in l.flatten()
39
+ arr.push i
40
+ else
41
+ arr.push l
42
+ arr
43
+ Array::includes = (entry)->
44
+ return @indexOf(entry) > -1 unless entry
45
+ if entry instanceof Date
46
+ (@map (obj) -> obj.toDateString()).includes(entry.toDateString())
47
+ else if entry.hasOwnProperty('id')
48
+ return @pluck('id').includes(entry.id)
49
+ else
50
+ return @indexOf(entry) > -1
51
+ Array::index = (obj) ->
52
+ return unless (obj || {}).hasOwnProperty('id')
53
+ @pluck('id').indexOf(obj.id)
54
+ Array::$inject = (action) ->
55
+ operators = {
56
+ '+': (a,b) -> a + b
57
+ '-': (a,b) -> a - b
58
+ '*': (a,b) -> a * b
59
+ '/': (a,b) -> a / b
60
+ '&': (a,b) -> a && b
61
+ '|': (a,b) -> a || b
62
+ 'merge': (a,b) ->
63
+ res = new Object(a)
64
+ res[key] = value for key,value of b
65
+ res
66
+ }
67
+ result = null
68
+ for item,index in @
69
+ result ||= item
70
+ continue if index == 0
71
+ result = operators[action](result,item)
72
+ result
73
+ Array::intersection = (arr) ->
74
+ res = []
75
+ (res.push(val) if arr.includes(val)) for val in @
76
+ return res
77
+ Array::merge = (arg) ->
78
+ @push(i) for i in arg
79
+ @
80
+ Array::pluck = (property) ->
81
+ return [] if !(@ && property)
82
+ property = String(property)
83
+ return @map (object) ->
84
+ object = Object(object)
85
+ return object[property] if (object.hasOwnProperty(property))
86
+ return ''
87
+ Array::railsMap = (func)->
88
+ args = func.match(/\|(.*)\|,(.*)/) || []
89
+ throw 'Invalid syntax "|a|, a.b"' unless args.length == 3
90
+ arr = []
91
+ for obj in @
92
+ eval args[1] + '= obj'
93
+ if args[2].includes(':')
94
+ arr.push eval "(" + args[2] + ")"
95
+ else
96
+ arr.push eval args[2]
97
+ arr
98
+ Array::reject = (func) ->
99
+ arr=[]
100
+ (arr.push(item) unless func(item)) for item in @
101
+ arr
102
+ Array::remove = (arr) ->
103
+ indices = []
104
+ for item in arr
105
+ indices.push(@indexOf(item)) if @indexOf(item) > -1
106
+ (while indices.length > 0
107
+ @splice(indices.drop(indices.max())[0],1)).flatten()
108
+ Array::select = (func) ->
109
+ arr=[]
110
+ (arr.push(item) if func(item)) for item in @
111
+ arr
112
+ Array::sum = ->
113
+ total = 0
114
+ (total += parseFloat(i) if i) for i in @
115
+ total
116
+ Array::update = (obj) ->
117
+ return unless (obj || {}).hasOwnProperty('id')
118
+ @[@index(obj)] = obj
119
+ Array::union = (arr) ->
120
+ dup = @slice(0)
121
+ dup.add(arr)
122
+ Array::unique = (filterOn) ->
123
+ equiv = (first,second) ->
124
+ return true if first == second
125
+ return !first && !second
126
+ newItems = []
127
+ for item in @
128
+ item = item[filterOn] if filterOn
129
+ for newItem in newItems
130
+ isDuplicate = false
131
+ if equiv(item,newItem)
132
+ isDuplicate = true
133
+ break
134
+ newItems.push(item) if (!isDuplicate)
135
+ return newItems
136
+ Array::where = (obj) ->
137
+ equiv = (first,second) ->
138
+ return true if first == second
139
+ if !isNaN(first) && !isNaN(second)
140
+ return true if parseFloat(first) == parseFloat(second)
141
+ return false
142
+ result = []
143
+ for entry in @
144
+ addEntry = true
145
+ for key,value of obj
146
+ addEntry = addEntry && equiv(entry[key], value)
147
+ result.push(entry) if addEntry
148
+ result
@@ -0,0 +1,21 @@
1
+ Object.reject = (obj,arg) ->
2
+ res = {}
3
+ for key,val of obj
4
+ unless typeof arg == 'function'
5
+ res[key] = val unless [arg].flatten().includes?(key)
6
+ else
7
+ temp={}
8
+ temp[key] = val
9
+ res[key] = val unless arg(key,val,temp)
10
+ res
11
+
12
+ Object.select = (obj,arg) ->
13
+ res = {}
14
+ for key,val of obj
15
+ unless typeof arg == 'function'
16
+ res[key] = val if [arg].flatten().includes?(key)
17
+ else
18
+ temp={}
19
+ temp[key] = val
20
+ res[key] = val if arg(key,val,temp)
21
+ res
@@ -0,0 +1,13 @@
1
+ String.prototype.to_number = ->
2
+ Number(this)
3
+ String.prototype.to_string = ->
4
+ this.toString()
5
+ String.prototype.to_date = ->
6
+ new Date(this)
7
+ String.prototype.titleize = ->
8
+ return this.replace(/\_/g,' ').replace(/([A-Z])/g, ' $1').trim().replace(/\b[a-z]/g, (letter)->
9
+ return letter[0].toUpperCase())
10
+ String.prototype.to_f = ->
11
+ return parseFloat(this)
12
+ String.prototype.to_i = ->
13
+ return parseInt(this)
@@ -13,14 +13,17 @@ class MrDestroyModel extends AngularLinkModel
13
13
  initialize: ->
14
14
  @_setForm()
15
15
  @$element.bind 'click', @destroy
16
+ @_resourcify()
16
17
  @register(Directives.MrDestroy)
18
+ _resourcify: ->
19
+ ActiveRecord.$Resource._resourcify(@_model(),@_matchedExpression()[1].classify())
17
20
 
18
21
  destroy: =>
19
22
  return if @$attrs.disabled || @form.disabled
20
- @$timeout =>
21
- @_list().drop(@_model())
23
+ @_resourcify()
24
+ @$timeout => @_list().drop(@_model())
22
25
  factory = @$injector.get(@_options().factory || @factoryName(@_matchedExpression()[1]))
23
- factory.destroy {id: @_model().id}, @_callBack
26
+ @_model().$destroy @_callBack
24
27
 
25
28
  _callBack: (data) => @$controller[1]?.evaluate(data)
26
29
  _model: -> @$controller[0].$viewValue
@@ -5,11 +5,20 @@ class DirectiveModels.MrUpdateModel extends AngularLinkModel
5
5
  'RailsUpdater'
6
6
  )
7
7
  initialize: ->
8
- [@ngModelCtrl,@mrCallbackCtrl,@ngTrackByCtrl] = @$controller
9
- @updater = @RailsUpdater.new(@$scope,@$controller,@$attrs.ngModel,@$attrs.ngOverride,@_factory())
8
+ [@ngModelCtrl,@mrCallbackCtrl] = @$controller
9
+ [@parent,@atom] = Helpers.NgModelParse(@$attrs.ngModel,@$scope)
10
+ @parentVal = @$parse(@parent)
11
+ @atomVal = @$parse(@atom)
12
+ @_resourcify()
10
13
  @_bind()
14
+
11
15
  @register(Directives.MrUpdate)
12
16
 
17
+ _resourcify: ->
18
+ ActiveRecord.$Resource._resourcify(@parentVal(@$scope),@parent.classify())
19
+ _update: ->
20
+ @_resourcify()
21
+ @parentVal(@$scope).$save.bind(@parentVal(@$scope))().then((data) => @mrCallbackCtrl?.evaluate(data))
13
22
  _bind: -> @$timeout => @_bindInput()[@_funcName()]()
14
23
  _bindInput: =>
15
24
  radio: => @_boundUpdate('input',true)
@@ -23,7 +32,7 @@ class DirectiveModels.MrUpdateModel extends AngularLinkModel
23
32
  _boundUpdate: (binding,checkValid) ->
24
33
  @$element.bind binding, (event) =>
25
34
  return if !@ngModelCtrl.$valid && checkValid
26
- @updater.update(@$element.val())
35
+ @_update()
27
36
 
28
37
  _bindText: ->
29
38
  @$element.bind 'focus', =>
@@ -37,13 +46,13 @@ class DirectiveModels.MrUpdateModel extends AngularLinkModel
37
46
  return if @$element.val() == @oldValue
38
47
  @$timeout.cancel(@debounce)
39
48
  @debounce = @$timeout =>
40
- @updater.update(@$element.val())
49
+ @_update()
41
50
  ,delay
42
51
 
43
52
  _watcher: ->
44
53
  @$scope.$watch @_modelVal(), (updated,old) =>
45
54
  return if old == undefined
46
- @updater.update(updated) unless updated == old
55
+ @_update()
47
56
  _specificTypes: ['radio','date','checkbox','hidden']
48
57
  _factory: -> @_options().factory
49
58
  _options: -> @$scope.$eval(@$attrs.mrOptions || '{}')
@@ -1,6 +1,6 @@
1
1
  # //= require_tree ./super_classes
2
2
  # //= require inflections
3
- # //= require extensions
3
+ # //= require_tree ./extensions
4
4
  # //= require angular
5
5
  # //= require angular-route
6
6
  # //= require angular-resource
@@ -18,6 +18,7 @@
18
18
  # //= require identifier_interceptor
19
19
  # //= require rails_updater
20
20
  # //= require_self
21
+ # //= require_tree ./active_record
21
22
  # //= require_tree ./material_raingular
22
23
 
23
24
  @MaterialRaingular = {
@@ -28,3 +29,4 @@
28
29
  'ngRoute', 'ngMaterial', 'ngMessages', 'ngResource', 'materialFilters', 'NgCallback'
29
30
  'NgSortable', 'FilteredSelect'])
30
31
  }
32
+ @ActiveRecord = {}
@@ -0,0 +1,5 @@
1
+ class @AngularInjectableModel
2
+ $inject: (args...) ->
3
+ @$injector ||= angular.element(document.body).injector()
4
+ for item in args
5
+ @[item] = @$injector.get(item)
@@ -6,7 +6,8 @@ class @AngularModel extends Module
6
6
  app?[type] name, @
7
7
  # Injects dependencies included in args
8
8
  @inject: (args...) ->
9
- @$inject = args
9
+ @$inject ||= []
10
+ @$inject.merge args
10
11
 
11
12
  constructor: (args...) ->
12
13
  # Bind injected dependencies on scope ie @$scope
@@ -1,3 +1,3 @@
1
1
  module MaterialRaingular
2
- VERSION = "0.3.3"
2
+ VERSION = "0.5"
3
3
  end
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.3.3
4
+ version: '0.5'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Moody
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-27 00:00:00.000000000 Z
11
+ date: 2017-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -67,6 +67,10 @@ files:
67
67
  - LICENSE.txt
68
68
  - README.md
69
69
  - Rakefile
70
+ - lib/assets/javascripts/active_record/collection.coffee
71
+ - lib/assets/javascripts/active_record/controller.coffee
72
+ - lib/assets/javascripts/active_record/param_serializer.coffee
73
+ - lib/assets/javascripts/active_record/resource.coffee
70
74
  - lib/assets/javascripts/ajax_errors.js.coffee
71
75
  - lib/assets/javascripts/dateconverter.coffee
72
76
  - lib/assets/javascripts/dateparser.coffee
@@ -98,7 +102,9 @@ files:
98
102
  - lib/assets/javascripts/directives/table.js.coffee
99
103
  - lib/assets/javascripts/directives/textarea.coffee
100
104
  - lib/assets/javascripts/directives/video.js.coffee
101
- - lib/assets/javascripts/extensions.coffee
105
+ - lib/assets/javascripts/extensions/array.coffee
106
+ - lib/assets/javascripts/extensions/object.coffee
107
+ - lib/assets/javascripts/extensions/string.coffee
102
108
  - lib/assets/javascripts/factory_name.js.coffee
103
109
  - lib/assets/javascripts/identifier_interceptor.js.coffee
104
110
  - lib/assets/javascripts/material_filters.coffee
@@ -127,6 +133,7 @@ files:
127
133
  - lib/assets/javascripts/super_classes/angular_compile_model.coffee
128
134
  - lib/assets/javascripts/super_classes/angular_directive.coffee
129
135
  - lib/assets/javascripts/super_classes/angular_directive_model.coffee
136
+ - lib/assets/javascripts/super_classes/angular_injectable_model.coffee
130
137
  - lib/assets/javascripts/super_classes/angular_link_model.coffee
131
138
  - lib/assets/javascripts/super_classes/angular_model.coffee
132
139
  - lib/assets/javascripts/super_classes/angular_route_model.coffee
@@ -1,118 +0,0 @@
1
- String.prototype.to_number = ->
2
- Number(this)
3
- String.prototype.to_string = ->
4
- this.toString()
5
- String.prototype.to_date = ->
6
- new Date(this)
7
- Array.prototype.empty = ->
8
- this.length == 0
9
- Array.prototype.present = ->
10
- this.length != 0
11
- Array.prototype.min = ->
12
- return Math.min.apply(null,this)
13
- Array.prototype.max = ->
14
- return Math.max.apply(null,this)
15
- Array.prototype.railsMap = (func)->
16
- args = func.match(/\|(.*)\|,(.*)/) || []
17
- throw 'Invalid syntax "|a|, a.b"' unless args.length == 3
18
- arr = []
19
- for obj in this
20
- eval args[1] + '= obj'
21
- if args[2].includes(':')
22
- arr.push eval "(" + args[2] + ")"
23
- else
24
- arr.push eval args[2]
25
- arr
26
- Array.prototype.compact = ->
27
- arr = []
28
- for i in this
29
- arr.push(i) if !!i or i == false
30
- arr
31
- Array.prototype.flatten = ->
32
- arr = []
33
- for l in this
34
- if Array.isArray(l)
35
- for i in l.flatten()
36
- arr.push i
37
- else
38
- arr.push l
39
- arr
40
- Array.prototype.sum = ->
41
- total = 0
42
- for i in this
43
- total += parseFloat(i) if i
44
- total
45
- Array.prototype.includes = (entry)->
46
- return @.indexOf(entry) > -1 unless entry
47
- if entry instanceof Date
48
- (@.map (obj) -> obj.toDateString()).includes(entry.toDateString())
49
- else if entry.hasOwnProperty('id')
50
- return @.pluck('id').includes(entry.id)
51
- else
52
- return @.indexOf(entry) > -1
53
- Array.prototype.drop = (entry)->
54
- if (entry || {}).hasOwnProperty('id')
55
- index = @.pluck('id').indexOf(entry.id)
56
- else
57
- index = @.indexOf(entry)
58
- return this unless index > -1
59
- @.splice(index,1)
60
- String.prototype.titleize = ->
61
- return this.replace(/\_/g,' ').replace(/([A-Z])/g, ' $1').trim().replace(/\b[a-z]/g, (letter)->
62
- return letter[0].toUpperCase())
63
- Array.prototype.pluck = (property) ->
64
- return [] if !(this && property)
65
- property = String(property)
66
- return this.map (object) ->
67
- object = Object(object)
68
- return object[property] if (object.hasOwnProperty(property))
69
- return ''
70
- Array.prototype.unique = (filterOn) ->
71
- equiv = (first,second) ->
72
- return true if first == second
73
- return !first && !second
74
- newItems = []
75
- for item in this
76
- item = item[filterOn] if filterOn
77
- for newItem in newItems
78
- isDuplicate = false
79
- if equiv(item,newItem)
80
- isDuplicate = true
81
- break
82
- newItems.push(item) if (!isDuplicate)
83
- return newItems
84
- String.prototype.to_f = ->
85
- return parseFloat(this)
86
- String.prototype.to_i = ->
87
- return parseInt(this)
88
- Array.prototype.dup = ->
89
- return @.slice(0)
90
- Array.prototype.where = (obj) ->
91
- equiv = (first,second) ->
92
- return true if first == second
93
- if !isNaN(first) && !isNaN(second)
94
- return true if parseFloat(first) == parseFloat(second)
95
- return false
96
- result = []
97
- for entry in @
98
- addEntry = true
99
- for key,value of obj
100
- addEntry = addEntry && equiv(entry[key], value)
101
- result.push(entry) if addEntry
102
- result
103
- Array.prototype.intersection = (arr) ->
104
- res = []
105
- for val in @
106
- res.push(val) if arr.includes(val)
107
- return res
108
- Array.prototype.intersects = (arr) ->
109
- @.intersection(arr).length > 0
110
- Array.prototype.find = (id) ->
111
- index = @.pluck('id').indexOf(id)
112
- @[index]
113
- Array.prototype.index = (obj) ->
114
- return unless (obj || {}).hasOwnProperty('id')
115
- @.pluck('id').indexOf(obj.id)
116
- Array.prototype.update = (obj) ->
117
- return unless (obj || {}).hasOwnProperty('id')
118
- @[@.index(obj)] = obj