zwr 0.1.6 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/directives/zt-auto-checkbox.js.coffee +28 -0
- data/app/assets/javascripts/directives/zt-auto-textbox.js.coffee +54 -0
- data/app/assets/javascripts/directives/zt-textbox.js.coffee +52 -0
- data/app/assets/javascripts/directives/ztf-button.js.coffee +45 -0
- data/app/assets/javascripts/directives/ztf-checkbox.js.coffee +28 -0
- data/app/assets/javascripts/directives/ztf-form.js.coffee +71 -0
- data/app/assets/javascripts/directives/ztf-subform.js.coffee +73 -0
- data/app/assets/javascripts/directives/ztf-textbox.js.coffee +30 -0
- data/app/assets/javascripts/includes/zwr.js.coffee +2 -0
- data/app/assets/javascripts/services/zt-base-service.js.coffee +156 -0
- data/app/assets/javascripts/templates/zt-auto-checkbox.html.haml +8 -0
- data/app/assets/javascripts/templates/zt-auto-textbox.html.haml +5 -0
- data/app/assets/javascripts/templates/zt-textbox.html.haml +11 -0
- data/app/assets/javascripts/templates/ztf-button.html.haml +4 -0
- data/app/assets/javascripts/templates/ztf-checkbox.html.haml +11 -0
- data/app/assets/javascripts/templates/ztf-form.html.haml +2 -0
- data/app/assets/javascripts/templates/ztf-subform.html.haml +9 -0
- data/app/assets/javascripts/templates/ztf-textbox.html.haml +12 -0
- data/bin/zwr +2 -2
- data/lib/generators/zwr/angular/directive_generator.rb +20 -2
- data/lib/zwr/app_template.rb +7 -4
- data/zwr.gemspec +3 -3
- metadata +22 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3da34572c18b8f6fbe7fffdd3c0a817a8739df5d
|
4
|
+
data.tar.gz: 485c438b2432f114e484108896199769b971af35
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 619279deb6f205b3dd6da7c3c1ddfe33a39b5f80a0083b2220d6eaee62942f340dde67d65cc719ce0e45afdcadb34bf4fe9f3a523492fce6b5361510c777fa26
|
7
|
+
data.tar.gz: 86cb47fc93d85e10c8226c65b44f3f8cac1d01623d1c60f0cf2253c75b14f9cebef88d5eb8b6d17654b7aad595480cd8485bd755dad748fc3079cad6dd4d36be
|
@@ -0,0 +1,28 @@
|
|
1
|
+
@zt_module.directive 'ztAutoCheckbox', ['$timeout', ($timeout) ->
|
2
|
+
directive_object =
|
3
|
+
restrict: 'E'
|
4
|
+
transclude: true
|
5
|
+
scope:
|
6
|
+
ztItem: '=?'
|
7
|
+
ztField: '@'
|
8
|
+
controller: ($scope) ->
|
9
|
+
$scope.status = 0
|
10
|
+
$scope.getItem = ->
|
11
|
+
$scope.ztItem or $scope.$parent.item
|
12
|
+
$scope.doPerformUpdate = ->
|
13
|
+
$scope.status = 1
|
14
|
+
ct1 = $scope.ct1 = ($scope.ct1 + 1 || 0)
|
15
|
+
$scope.getItem().save()
|
16
|
+
.then ->
|
17
|
+
if ct1 == $scope.ct1 and $scope.status = 1
|
18
|
+
$scope.status = 2
|
19
|
+
ct2 = $scope.ct2 = ($scope.ct2 + 1 || 0)
|
20
|
+
$timeout ->
|
21
|
+
if ct2 == $scope.ct2 and $scope.status == 2
|
22
|
+
$scope.status = 0
|
23
|
+
,2000
|
24
|
+
.catch ->
|
25
|
+
$scope.getItem().revert()
|
26
|
+
$scope.status = 3
|
27
|
+
templateUrl: "zt-auto-checkbox.html"
|
28
|
+
]
|
@@ -0,0 +1,54 @@
|
|
1
|
+
@zt_module.directive 'ztAutoTextbox', ->
|
2
|
+
directive_object =
|
3
|
+
restrict: 'E'
|
4
|
+
transclude: false
|
5
|
+
scope:
|
6
|
+
ztItem: '=?'
|
7
|
+
ztField: '@'
|
8
|
+
ztUpdateSuccess: '&?'
|
9
|
+
link: (scope, elem, attr) ->
|
10
|
+
unless typeof scope.ztItem == "undefined"
|
11
|
+
scope.$watch (scope) ->
|
12
|
+
scope.ztItem
|
13
|
+
, ->
|
14
|
+
scope.revertLocal() if scope.ztItem
|
15
|
+
else
|
16
|
+
scope.$parent.$watch (parent_scope) ->
|
17
|
+
parent_scope.item
|
18
|
+
, ->
|
19
|
+
scope.revertLocal() if scope.$parent.item
|
20
|
+
scope.label_visible = (elem.attr('class').indexOf('zt-inline') == -1)
|
21
|
+
controller: ['$timeout', '$scope', ($timeout, $scope) ->
|
22
|
+
$scope.status = 0
|
23
|
+
$scope.getItem = ->
|
24
|
+
$scope.ztItem or $scope.$parent.item
|
25
|
+
$scope.inputTextChange = ->
|
26
|
+
$scope.status = 1
|
27
|
+
ct1 = $scope.ct1 = ($scope.ct1 + 1 || 0)
|
28
|
+
$timeout ->
|
29
|
+
if ct1 == $scope.ct1
|
30
|
+
$scope.completeEditing()
|
31
|
+
,1000
|
32
|
+
$scope.revertLocal = ->
|
33
|
+
$scope.field_value = $scope.getItem().copy[$scope.ztField]
|
34
|
+
$scope.status = 0
|
35
|
+
$scope.completeEditing = ->
|
36
|
+
$scope.status = 2
|
37
|
+
ct2 = $scope.ct2 = ($scope.ct2 + 1 || 0)
|
38
|
+
$scope.getItem().copy[$scope.ztField] = $scope.field_value
|
39
|
+
$scope.getItem().save()
|
40
|
+
.then ->
|
41
|
+
if ct2 == $scope.ct2 and $scope.status == 2
|
42
|
+
$scope.status = 3
|
43
|
+
ct3 = $scope.ct3 = ($scope.ct3 + 1 || 0)
|
44
|
+
$timeout ->
|
45
|
+
if ct3 == $scope.ct3 and $scope.status == 3
|
46
|
+
$scope.status = 0
|
47
|
+
if $scope.ztUpdateSuccess?
|
48
|
+
$scope.ztUpdateSuccess()
|
49
|
+
,2000
|
50
|
+
.catch ->
|
51
|
+
$scope.status = 4
|
52
|
+
]
|
53
|
+
templateUrl: "zt-auto-textbox.html"
|
54
|
+
|
@@ -0,0 +1,52 @@
|
|
1
|
+
@zt_module.directive 'ztTextbox', ->
|
2
|
+
directive_object =
|
3
|
+
restrict: 'E'
|
4
|
+
transclude: true
|
5
|
+
scope:
|
6
|
+
ztItem: '=?'
|
7
|
+
ztField: '@'
|
8
|
+
ztUpdateSuccess: '&?'
|
9
|
+
link: (scope, elem, attr) ->
|
10
|
+
unless typeof scope.ztItem == "undefined"
|
11
|
+
scope.$watch (scope) ->
|
12
|
+
scope.ztItem
|
13
|
+
, ->
|
14
|
+
scope.revertLocal() if scope.ztItem
|
15
|
+
else
|
16
|
+
scope.$parent.$watch (parent_scope) ->
|
17
|
+
parent_scope.item
|
18
|
+
, ->
|
19
|
+
scope.revertLocal() if scope.$parent.item
|
20
|
+
controller: ['$timeout', '$scope', ($timeout, $scope) ->
|
21
|
+
$scope.status = 0
|
22
|
+
$scope.getItem = ->
|
23
|
+
$scope.ztItem or $scope.$parent.item
|
24
|
+
$scope.startEditing = ->
|
25
|
+
$scope.status = 3 if $scope.status == 0
|
26
|
+
$scope.revertLocal = ->
|
27
|
+
$scope.field_value = $scope.getItem().copy[$scope.ztField]
|
28
|
+
$scope.status = 0
|
29
|
+
$scope.cancelEditing = ->
|
30
|
+
$scope.getItem().revert()
|
31
|
+
$scope.revertLocal()
|
32
|
+
$scope.completeEditing = ->
|
33
|
+
$scope.status = 2
|
34
|
+
ct1 = $scope.ct1 = ($scope.ct1 + 1 || 0)
|
35
|
+
$scope.getItem().copy[$scope.ztField] = $scope.field_value
|
36
|
+
$scope.getItem().save()
|
37
|
+
.then ->
|
38
|
+
if ct1 == $scope.ct1 and $scope.status == 2
|
39
|
+
$scope.status = 1
|
40
|
+
ct2 = $scope.ct2 = ($scope.ct2 + 1 || 0)
|
41
|
+
$timeout ->
|
42
|
+
if ct2 == $scope.ct2 and $scope.status == 1
|
43
|
+
if $scope.ztUpdateSuccess?
|
44
|
+
$scope.ztUpdateSuccess()
|
45
|
+
$scope.status = 0
|
46
|
+
,2000
|
47
|
+
.catch ->
|
48
|
+
$scope.status = 4
|
49
|
+
|
50
|
+
]
|
51
|
+
templateUrl: "zt-textbox.html"
|
52
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
@zt_module.directive 'ztfButton', ->
|
2
|
+
ret =
|
3
|
+
restrict: 'AE' # also possible class C
|
4
|
+
transclude: true # set to false if ignoring content
|
5
|
+
scope:
|
6
|
+
cmd: '&ztfCommit' # isolate scope of a function, passed as a value
|
7
|
+
# of the attribute with the name of the directive
|
8
|
+
disabled: '=' # isolate scope of a model (both ways), passed with an
|
9
|
+
# attribute disabled="XXX", where XXX is a variable of
|
10
|
+
# the scope
|
11
|
+
glyph: '@' # isolate scope of a variable (in only), passed with
|
12
|
+
# an attribute disabled="123"
|
13
|
+
link: (scope, elem, attrs) ->
|
14
|
+
s while !(s = (s || scope).$parent).isZtfForm
|
15
|
+
scope.form = s
|
16
|
+
scope.action = 'commit' if isDefined(attrs.commit)
|
17
|
+
scope.action = 'cancel' if isDefined(attrs.cancel)
|
18
|
+
scope.action = 'edit' if isDefined(attrs.edit)
|
19
|
+
scope.action = 'add' if isDefined(attrs.add)
|
20
|
+
scope.action = 'delete' if isDefined(attrs.delete)
|
21
|
+
scope.action = attrs.action if isDefined(attrs.action)
|
22
|
+
scope.title_given = elem.find('span').length && elem.find('span')[0].children.length;
|
23
|
+
if isDefined(elem.attr('zt-icon'))
|
24
|
+
scope.useIcon = true
|
25
|
+
scope.iconClass = if elem.attr('zt-icon') != ""
|
26
|
+
elem.attr('zt-icon')
|
27
|
+
else if isDefined(attrs.commit)
|
28
|
+
'glyphicon-floppy-disk'
|
29
|
+
else if isDefined(attrs.cancel)
|
30
|
+
'glyphicon-remove'
|
31
|
+
else if isDefined(attrs.edit)
|
32
|
+
'glyphicon-pencil'
|
33
|
+
else if isDefined(attrs.add)
|
34
|
+
'glyphicon-plus'
|
35
|
+
else if isDefined(attrs.delete)
|
36
|
+
'glyphicon-trash'
|
37
|
+
scope.hideMe = ->
|
38
|
+
if isDefined(attrs.commit) or isDefined(attrs.cancel) or isDefined(attrs.add) or isDefined(attrs.delete)
|
39
|
+
!scope.form.editable
|
40
|
+
else if isDefined(attrs.edit)
|
41
|
+
scope.form.editable
|
42
|
+
controller: ($scope) ->
|
43
|
+
$scope.index = ->
|
44
|
+
if isDefined($scope.$parent.$parent.$index) then $scope.$parent.$parent.$index else null
|
45
|
+
templateUrl: "ztf-button.html"
|
@@ -0,0 +1,28 @@
|
|
1
|
+
@zt_module.directive 'ztfCheckbox', ->
|
2
|
+
directive_object =
|
3
|
+
restrict: 'E'
|
4
|
+
transclude: true
|
5
|
+
scope:
|
6
|
+
ztField: '@'
|
7
|
+
link: (scope, elem, attr) ->
|
8
|
+
s while !(s = (s || scope).$parent).hasOwnProperty('isZtfForm')
|
9
|
+
scope.form = s
|
10
|
+
controller: ($scope) ->
|
11
|
+
$scope.index = ->
|
12
|
+
if isDefined($scope.$parent.$parent.$index) then $scope.$parent.$parent.$index else null
|
13
|
+
$scope.itemCopy = ->
|
14
|
+
$scope.form.itemCopy($scope.ztField, $scope.index())
|
15
|
+
$scope.revertLocal = ->
|
16
|
+
$scope.form.revertField($scope.ztField, $scope.index())
|
17
|
+
$scope.fieldModified = ->
|
18
|
+
$scope.form.fieldModified($scope.ztField, $scope.index())
|
19
|
+
$scope.fieldUpdating = ->
|
20
|
+
$scope.form.fieldUpdating($scope.ztField, $scope.index())
|
21
|
+
$scope.fieldError = ->
|
22
|
+
$scope.form.fieldError($scope.ztField, $scope.index())
|
23
|
+
$scope.fieldUpdated = ->
|
24
|
+
$scope.form.fieldUpdated($scope.ztField, $scope.index())
|
25
|
+
$scope.glyphTitle = ->
|
26
|
+
if $scope.form and $scope.itemCopy() and $scope.fieldError()
|
27
|
+
"Could not save changes. Click to revert."
|
28
|
+
templateUrl: "ztf-checkbox.html"
|
@@ -0,0 +1,71 @@
|
|
1
|
+
@zt_module.directive 'ztfForm', ['$timeout', ($timeout) ->
|
2
|
+
ret =
|
3
|
+
restrict: 'AE' # also possible class C
|
4
|
+
transclude: true # set to false if ignoring content
|
5
|
+
scope:
|
6
|
+
ztItem: '=?'
|
7
|
+
ztUpdateSuccess: '&?'
|
8
|
+
link: (scope, elem, attrs, ctrl, transclude) ->
|
9
|
+
scope.lockable = isDefined(attrs.lockable)
|
10
|
+
scope.editable = (scope.getItem() and scope.getItem().clientOnly) || !scope.lockable
|
11
|
+
controller: ($scope) ->
|
12
|
+
$scope.isZtfForm = true
|
13
|
+
$scope.isZtfSubform = false
|
14
|
+
$scope.updated_fields = []
|
15
|
+
$scope.error_fields = []
|
16
|
+
$scope.getItem = ->
|
17
|
+
$scope.ztItem or $scope.$parent.item
|
18
|
+
$scope.commit = ->
|
19
|
+
$scope.error_fields = []
|
20
|
+
$scope.updated_fields = []
|
21
|
+
$scope.updated_fields.push key for own key of $scope.getItem().data when $scope.getItem().data[key] != $scope.getItem().copy[key] and key[0] != '_'
|
22
|
+
$scope.updating = true
|
23
|
+
$scope.getItem().save()
|
24
|
+
.then ->
|
25
|
+
$scope.updating = false
|
26
|
+
if $scope.lockable
|
27
|
+
$scope.editable = false
|
28
|
+
$timeout ->
|
29
|
+
$scope.updated_fields = []
|
30
|
+
if $scope.ztUpdateSuccess?
|
31
|
+
$scope.ztUpdateSuccess()
|
32
|
+
,2000
|
33
|
+
.catch ->
|
34
|
+
$scope.updating = false
|
35
|
+
$scope.error_fields = $scope.updated_fields
|
36
|
+
$scope.updated_fields = []
|
37
|
+
$scope.cancel = ->
|
38
|
+
$scope.getItem().copy = angular.copy($scope.getItem().data)
|
39
|
+
if $scope.lockable
|
40
|
+
$scope.editable = false
|
41
|
+
$scope.edit = ->
|
42
|
+
if $scope.lockable
|
43
|
+
$scope.editable = true
|
44
|
+
$scope.enable_button = (action) ->
|
45
|
+
if action in ['commit', 'cancel']
|
46
|
+
return $scope.editable
|
47
|
+
else if action == 'edit'
|
48
|
+
return !$scope.editable
|
49
|
+
$scope.show_button = (action) ->
|
50
|
+
if action in ['commit', 'cancel']
|
51
|
+
return $scope.editable
|
52
|
+
else if action == 'edit'
|
53
|
+
return !$scope.editable
|
54
|
+
$scope.itemCopy = (ztField, index) ->
|
55
|
+
throw "Form passed an index other than null, which is only allowed on subforms" if index
|
56
|
+
if $scope.getItem() then $scope.getItem().copy else null
|
57
|
+
$scope.revertField = (ztField, index) ->
|
58
|
+
$scope.getItem().copy[ztField] = $scope.getItem().data[ztField] unless $scope.fieldUpdating(ztField, index)
|
59
|
+
$scope.fieldModified = (ztField, index) ->
|
60
|
+
$scope.getItem() and if $scope.getItem().clientOnly
|
61
|
+
$scope.getItem().copy[ztField]
|
62
|
+
else
|
63
|
+
$scope.getItem().copy[ztField] != $scope.getItem().data[ztField]
|
64
|
+
$scope.fieldUpdating = (ztField, index) ->
|
65
|
+
$scope.updating and $scope.updated_fields.indexOf(ztField) > -1
|
66
|
+
$scope.fieldError = (ztField, index) ->
|
67
|
+
$scope.error_fields.indexOf(ztField) > -1 and $scope.fieldModified(ztField, index)
|
68
|
+
$scope.fieldUpdated = (ztField, index) ->
|
69
|
+
$scope.updated_fields.indexOf(ztField) > -1
|
70
|
+
templateUrl: "ztf-form.html"
|
71
|
+
]
|
@@ -0,0 +1,73 @@
|
|
1
|
+
@zt_module.directive 'ztfSubform', ->
|
2
|
+
ret =
|
3
|
+
restrict: 'E' # also possible class C
|
4
|
+
transclude: true # set to false if ignoring content
|
5
|
+
scope:
|
6
|
+
ztField: '@'
|
7
|
+
ztTitle: '@?'
|
8
|
+
link: (scope, elem, attrs, ctrl, transclude) ->
|
9
|
+
s while !(s = (s || scope).$parent).hasOwnProperty('isZtfForm')
|
10
|
+
scope.form = s
|
11
|
+
scope.canAdd = isDefined(attrs.ztAdd)
|
12
|
+
scope.canDelete = isDefined(attrs.ztDelete)
|
13
|
+
scope.editable = scope.form.editable
|
14
|
+
scope.inline = isDefined(attrs.ztInline)
|
15
|
+
scope.form.$watch ->
|
16
|
+
scope.form.editable
|
17
|
+
, ->
|
18
|
+
scope.editable = scope.form.editable
|
19
|
+
controller: ($scope) ->
|
20
|
+
# this directive's scope is a 'form' for all underlying scopes.
|
21
|
+
# However, to this directive, 'form' is a parent form scope.
|
22
|
+
$scope.isZtfForm = true
|
23
|
+
$scope.isZtfSubform = true
|
24
|
+
$scope.superItem = ->
|
25
|
+
$scope.form.getItem()
|
26
|
+
$scope.subitems = ->
|
27
|
+
if $scope.superItem() then $scope.superItem().copy[$scope.ztField] else null
|
28
|
+
$scope.getItem = (index) ->
|
29
|
+
if $scope.subitems() then $scope.subitems()[index] else null
|
30
|
+
$scope.enable_button = (action) ->
|
31
|
+
if action in ['add', 'delete']
|
32
|
+
$scope.form.editable
|
33
|
+
else
|
34
|
+
false
|
35
|
+
$scope.show_button = (action) ->
|
36
|
+
if action in ['add', 'delete']
|
37
|
+
$scope.form.editable
|
38
|
+
else
|
39
|
+
false
|
40
|
+
$scope.fieldValue = (ztField, index, data) ->
|
41
|
+
if data
|
42
|
+
# when looking for the original field, first check if the copy field has the _index
|
43
|
+
if isDefined($scope.superItem().copy[$scope.ztField][index]._index)
|
44
|
+
_index = $scope.superItem().copy[$scope.ztField][index]._index
|
45
|
+
#this means this is one of originally fetched fields which DO have the data
|
46
|
+
#use that index, not the copy index
|
47
|
+
$scope.superItem().data[$scope.ztField][_index][ztField]
|
48
|
+
else
|
49
|
+
null
|
50
|
+
else
|
51
|
+
$scope.superItem().copy[$scope.ztField][index][ztField]
|
52
|
+
$scope.itemCopy = (ztField, index) ->
|
53
|
+
throw "Subform passed a null index, which is only allowed on top level forms" if index == null
|
54
|
+
$scope.getItem(index)
|
55
|
+
$scope.revertField = (ztSubField, index) ->
|
56
|
+
throw "Subform passed a null index, which is only allowed on top level forms" if index == null
|
57
|
+
$scope.superItem().copy[$scope.ztField][index][ztSubField] = $scope.fieldValue(ztSubField, index, true) unless $scope.fieldUpdating(ztSubField, index) or not $scope.fieldValue(ztSubField, index, true)
|
58
|
+
$scope.fieldModified = (ztSubField, index) ->
|
59
|
+
$scope.superItem() and if $scope.superItem().clientOnly
|
60
|
+
$scope.fieldValue(ztSubField, index, false)
|
61
|
+
else
|
62
|
+
$scope.fieldValue(ztSubField, index, false) != $scope.fieldValue(ztSubField, index, true)
|
63
|
+
$scope.fieldUpdating = (ztSubField, index) ->
|
64
|
+
$scope.form.updating and $scope.fieldUpdated(ztSubField, index)
|
65
|
+
$scope.fieldError = (ztSubField, index) ->
|
66
|
+
$scope.form.error_fields.indexOf("#{$scope.ztField}[#{index}].#{ztSubField}") > -1 and $scope.fieldModified(ztSubField, index)
|
67
|
+
$scope.fieldUpdated = (ztSubField, index) ->
|
68
|
+
$scope.form.updated_fields.indexOf("#{$scope.ztField}[#{index}].#{ztSubField}") > -1
|
69
|
+
$scope.add = ->
|
70
|
+
$scope.subitems().push new Object()
|
71
|
+
$scope.delete = (index) ->
|
72
|
+
$scope.subitems().splice(index, 1)
|
73
|
+
templateUrl: "ztf-subform.html"
|
@@ -0,0 +1,30 @@
|
|
1
|
+
@zt_module.directive 'ztfTextbox', ->
|
2
|
+
ret =
|
3
|
+
restrict: 'E'
|
4
|
+
transclude: false
|
5
|
+
scope:
|
6
|
+
ztField: '@'
|
7
|
+
ztLabel: '@'
|
8
|
+
link: (scope, elem, attr) ->
|
9
|
+
s while !(s = (s || scope).$parent).hasOwnProperty('isZtfForm')
|
10
|
+
scope.form = s
|
11
|
+
controller: ($scope) ->
|
12
|
+
$scope.index = ->
|
13
|
+
if isDefined($scope.$parent.$parent.$index) then $scope.$parent.$parent.$index else null
|
14
|
+
$scope.itemCopy = ->
|
15
|
+
$scope.form.itemCopy($scope.ztField, $scope.index())
|
16
|
+
$scope.revertLocal = ->
|
17
|
+
$scope.form.revertField($scope.ztField, $scope.index())
|
18
|
+
$scope.fieldModified = ->
|
19
|
+
$scope.form.fieldModified($scope.ztField, $scope.index())
|
20
|
+
$scope.fieldUpdating = ->
|
21
|
+
$scope.form.fieldUpdating($scope.ztField, $scope.index())
|
22
|
+
$scope.fieldError = ->
|
23
|
+
$scope.form.fieldError($scope.ztField, $scope.index())
|
24
|
+
$scope.fieldUpdated = ->
|
25
|
+
$scope.form.fieldUpdated($scope.ztField, $scope.index())
|
26
|
+
$scope.glyphTitle = ->
|
27
|
+
if $scope.form and $scope.itemCopy() and $scope.fieldError()
|
28
|
+
"Could not save changes. Click to revert."
|
29
|
+
templateUrl: "ztf-textbox.html"
|
30
|
+
|
@@ -0,0 +1,156 @@
|
|
1
|
+
# Since there can be way too many documents, what we do try is to keep on client side aout 1000
|
2
|
+
# around the current one, whatever it is, or the midian one if more than one are active.
|
3
|
+
#
|
4
|
+
# Same principal might be used later for other types of objects, as long as they are
|
5
|
+
# ordered in some way. Documents are ordered always by a @identifier, which must be defined
|
6
|
+
# in the child service.
|
7
|
+
#
|
8
|
+
# This system is assumed to work with the following limits:
|
9
|
+
#
|
10
|
+
# - In the database, any kind of amount is possible, but oading will depend
|
11
|
+
# on that amount. Whatever it can be filtered or sorted on must be indexed.
|
12
|
+
#
|
13
|
+
# - What is retrieved is up to 1000 records (defined by @front_end_buffer_size),
|
14
|
+
# each not bigger than 1-5k, making it up to 1-5M. That should be transfered
|
15
|
+
# within a second.
|
16
|
+
#
|
17
|
+
# - What is shown should never be more than 20-50 record@
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
@zt_module.service 'ztBaseService', [
|
22
|
+
'$http', '$q',
|
23
|
+
($http, $q) ->
|
24
|
+
@front_end_buffer_size = 200
|
25
|
+
@eagerness = 30
|
26
|
+
@page_size = 10
|
27
|
+
# Following is the key by which sorting is done
|
28
|
+
@front_end_buffer = null
|
29
|
+
@front_end_buffer_limit_low = null
|
30
|
+
@front_end_buffer_limit_high = null
|
31
|
+
@front_end_buffer_index_low = null
|
32
|
+
@front_end_buffer_index_high = null
|
33
|
+
@total_count = null
|
34
|
+
# Method 'item' return the item with given id or the first item available
|
35
|
+
# meaning, essentially, any item.
|
36
|
+
@item = (id) ->
|
37
|
+
if @front_end_buffer? and @front_end_buffer_limit_low <= id <= @front_end_buffer_limit_high
|
38
|
+
$q.when { item: @_find_item(id), total_count: @total_count }
|
39
|
+
else
|
40
|
+
me = this
|
41
|
+
@_reload_around_id(id)
|
42
|
+
.then ->
|
43
|
+
{ item: me._find_item(id), total_count: me.total_count }
|
44
|
+
# Method relative returns item with given offset from current item
|
45
|
+
# Normally this would be used with -1 or 1.
|
46
|
+
@item_relative = (item, offset) ->
|
47
|
+
if @front_end_buffer? and @front_end_buffer_index_low <= item.data.index + offset <= @front_end_buffer_index_high
|
48
|
+
#eager loading
|
49
|
+
if (offset < 0 and @front_end_buffer_index_low + @eagerness > item.data.index + offset) or
|
50
|
+
(offset > 0 and item.data.index + offset > @front_end_buffer_index_high - @eagerness)
|
51
|
+
@_reload_by_index(item.data.index, offset)
|
52
|
+
$q.when { item: @_find_by_index(item.data.index + offset), total_count: @total_count }
|
53
|
+
else
|
54
|
+
me = this
|
55
|
+
@_reload_by_index(item.data.index, offset)
|
56
|
+
.then ->
|
57
|
+
{ item: me._find_by_index(item.data.index + offset), total_count: me.total_count }
|
58
|
+
@page_items = (page_no, direction) ->
|
59
|
+
if @front_end_buffer? and @front_end_buffer_index_low <= (page_no - 1) * @page_size and page_no * @page_size<= @front_end_buffer_index_high
|
60
|
+
#eager loading
|
61
|
+
if @front_end_buffer_index_low + @eagerness > (page_no - 1) * @page_size or
|
62
|
+
page_no * @page_size > @front_end_buffer_index_high - @eagerness
|
63
|
+
@_reload_by_index((page_no - 1) * @page_size + @page_size / 2, 0)
|
64
|
+
$q.when { items: @_find_page_items(page_no), page_count: @_total_page_count() }
|
65
|
+
else
|
66
|
+
me = this
|
67
|
+
@_reload_by_index((page_no - 1) * @page_size + @page_size / 2, 0)
|
68
|
+
.then ->
|
69
|
+
{ items: me._find_page_items(page_no), page_count: me._total_page_count() }
|
70
|
+
@range = (low_id, high_id) ->
|
71
|
+
null
|
72
|
+
@update = (item) ->
|
73
|
+
data = new Object()
|
74
|
+
data[@resource_name] = item.copy
|
75
|
+
$http.put "./#{@resource_url}/#{item.data._id.$oid}.json", data
|
76
|
+
@create = (item) ->
|
77
|
+
data = new Object()
|
78
|
+
data[@resource_name] = item.copy
|
79
|
+
$http.post "./#{@resource_url}.json", data
|
80
|
+
@newitem = ->
|
81
|
+
container = this
|
82
|
+
newly_created_item =
|
83
|
+
data: null
|
84
|
+
copy: {}
|
85
|
+
clientOnly: true
|
86
|
+
saved: false
|
87
|
+
save: ->
|
88
|
+
me = this
|
89
|
+
container.create(me)
|
90
|
+
.then ->
|
91
|
+
me.saved = true
|
92
|
+
revert: ->
|
93
|
+
throw "Cannot call revert on new object"
|
94
|
+
is_first: true
|
95
|
+
is_last: true
|
96
|
+
mynewitem =
|
97
|
+
item:
|
98
|
+
newly_created_item
|
99
|
+
if isDefined(@initialize_new_object)
|
100
|
+
@initialize_new_object(mynewitem.item.copy)
|
101
|
+
$q.when mynewitem
|
102
|
+
# private helpers
|
103
|
+
@_find_item = (id) ->
|
104
|
+
id = null if id == "undefined"
|
105
|
+
return item for item in @front_end_buffer when (not id?) or item.data[@identifier] == id
|
106
|
+
@_find_by_index = (index) ->
|
107
|
+
return item for item in @front_end_buffer when item.data.index == index
|
108
|
+
@_reload_around_id = (id) ->
|
109
|
+
id = null if id == "undefined"
|
110
|
+
me = this
|
111
|
+
$http.get("./#{@resource_url}.json?count=#{@front_end_buffer_size}" + (if id? then "&around=#{id}" else "" ))
|
112
|
+
.then (resp) ->
|
113
|
+
me._save_results(resp)
|
114
|
+
@_find_page_items = (page_no) ->
|
115
|
+
skipped = @front_end_buffer_index_low
|
116
|
+
@front_end_buffer.slice (page_no - 1) * @page_size - skipped,
|
117
|
+
page_no * @page_size - skipped
|
118
|
+
@_total_page_count = () ->
|
119
|
+
Math.trunc((@total_count + @page_size - 1) / @page_size)
|
120
|
+
@_reload_by_index = (index, offset) ->
|
121
|
+
me = this
|
122
|
+
$http.get("./#{@resource_url}.json?count=#{@front_end_buffer_size}&index=#{index}" + (if offset then "&offset=#{offset}" else "" ))
|
123
|
+
.then (resp) ->
|
124
|
+
me._save_results(resp)
|
125
|
+
@_save_results = (resp) ->
|
126
|
+
@front_end_buffer = []
|
127
|
+
container = this
|
128
|
+
for d, i in resp.data.list
|
129
|
+
# add indexes to each array
|
130
|
+
for own field of d when d[field] instanceof Array
|
131
|
+
for list_item, i2 in d[field]
|
132
|
+
list_item._index = i2
|
133
|
+
@front_end_buffer.push
|
134
|
+
data: d
|
135
|
+
copy: angular.copy(d)
|
136
|
+
save: ->
|
137
|
+
me = this
|
138
|
+
container.update(me)
|
139
|
+
.then ->
|
140
|
+
for own field of me.copy when me.copy[field] instanceof Array
|
141
|
+
for list_item, i2 in me.copy[field]
|
142
|
+
list_item._index = i2
|
143
|
+
me.data = angular.copy(me.copy)
|
144
|
+
revert: ->
|
145
|
+
this.copy = angular.copy(this.data)
|
146
|
+
is_first: i == 0
|
147
|
+
is_last: i == resp.data.list.length - 1
|
148
|
+
@front_end_buffer_limit_low = resp.data.list[0][@identifier]
|
149
|
+
@front_end_buffer_limit_high = resp.data.list[-1..][0][@identifier]
|
150
|
+
@front_end_buffer_index_low = resp.data.list[0].index
|
151
|
+
@front_end_buffer_index_high = resp.data.list[-1..][0].index
|
152
|
+
@total_count = resp.data.total_count
|
153
|
+
resp.data
|
154
|
+
@extends_to = (obj) ->
|
155
|
+
angular.copy(this, obj)
|
156
|
+
this]
|
@@ -0,0 +1,8 @@
|
|
1
|
+
.checkbox
|
2
|
+
%label(ng-class="{'text-success': status === 2, 'text-warning': status === 1, 'text-danger': status === 3}")
|
3
|
+
%input(type="checkbox" ng-model="getItem().copy[ztField]" ng-click="doPerformUpdate()")
|
4
|
+
%span(ng-transclude)
|
5
|
+
%i.glyphicon.glyphicon-ok.text-success(ng-show="status === 2")
|
6
|
+
%i.glyphicon.glyphicon-refresh.text-warning(ng-show="status === 1")
|
7
|
+
%i.glyphicon.glyphicon-warning-sign.text-danger(ng-show="status === 3" title="Could not save changes. Click icon to try again." ng-click="getItem().copy[ztField] = !getItem().copy[ztField]")
|
8
|
+
|
@@ -0,0 +1,5 @@
|
|
1
|
+
.form-group.has-feedback(ng-class="{'has-warning': status === 1 || status === 2, 'has-success': status === 3, 'has-error': status === 4}")
|
2
|
+
%label.control-label(ng-class="{'sr-only': !label_visible}") Tag name
|
3
|
+
%input.form-control(type="text" placeholder="New tag" ng-model="field_value" ng-change="inputTextChange()")
|
4
|
+
%i.form-control-feedback.glyphicon.glyphicon-warning-sign.text-danger(ng-show="status === 4" title="Could not save changes. Click error icon to retry!" ng-click="completeEditing()")
|
5
|
+
%i.form-control-feedback.glyphicon(ng-show="status === 3 || status === 2" ng-class="{'text-success': status === 3, 'glyphicon-refresh': status === 2, 'text-warning': status === 2, 'glyphicon-ok': status === 3}")
|
@@ -0,0 +1,11 @@
|
|
1
|
+
.form-group.has-feedback(ng-class="{'has-warning': getItem().copy[ztField] != field_value || status == 2, 'has-success': status == 1, 'has-error': status === 4}")
|
2
|
+
%span(ng-transclude ng-hide="status > 1")
|
3
|
+
%span.text-muted(ng-hide="status > 1" ng-click="startEditing()") (edit)
|
4
|
+
%span.glyphicon.glyphicon-ok.text-success(ng-show="status == 1")
|
5
|
+
.input-group(ng-show="status > 1")
|
6
|
+
%input.form-control(ng-model="field_value" )
|
7
|
+
%span.input-group-addon(ng-click="cancelEditing()")
|
8
|
+
%span.glyphicon.glyphicon-remove
|
9
|
+
%span.input-group-addon(ng-click="completeEditing()")
|
10
|
+
%span.glyphicon.glyphicon-warning-sign.text-danger(ng-show="status == 4" title="Could not save changes. Click to try again.")
|
11
|
+
%span.glyphicon(ng-class="{'text-success': status == 1, 'glyphicon-refresh': status == 2, 'text-warning': status == 2, 'glyphicon-ok': status != 2}")
|
@@ -0,0 +1,4 @@
|
|
1
|
+
%button.ztf-button.btn.btn-default(ng-click="form[action](index())" ng-disabled="!form.enable_button(action)" ng-hide="hideMe()")
|
2
|
+
%span(ng-if="!useIcon"ng-transclude)
|
3
|
+
%span(ng-if="!title_given && !useIcon") {{action.capitalize()}}
|
4
|
+
%i.glyphicon(ng-if="useIcon" ng-class="iconClass")
|
@@ -0,0 +1,11 @@
|
|
1
|
+
.ztf-checkbox.checkbox
|
2
|
+
%span(ng-hide="form.editable" ng-class="{'text-success': fieldUpdated()}")
|
3
|
+
%i.glyphicon(ng-class="{'glyphicon-ok': form.getItem().copy[ztField] === true, 'glyphicon-remove': form.getItem().copy[ztField] === false, 'text-success': form.getItem().copy[ztField] === true, 'text-danger': form.getItem().copy[ztField] === false}")
|
4
|
+
%span(ng-transclude)
|
5
|
+
%i.glyphicon.glyphicon-saved.text-success(ng-show="fieldUpdated()")
|
6
|
+
%label(ng-show="form.editable" ng-class="{'text-warning': fieldModified(), 'text-danger': fieldError(),'bg-red': fieldModified(), 'bg-red': fieldError()}")
|
7
|
+
%input(type="checkbox" ng-model="form.getItem().copy[ztField]")
|
8
|
+
%span(ng-transclude)
|
9
|
+
%i.glyphicon.glyphicon-refresh.text-warning(ng-show="fieldUpdating()")
|
10
|
+
%i.glyphicon.glyphicon-warning-sign.text-danger(ng-show="fieldError()" title="{{glyphTitle()}}")
|
11
|
+
|
@@ -0,0 +1,9 @@
|
|
1
|
+
.ztf-subitems
|
2
|
+
%h4(ng-if="ztTitle") {{ztTitle}}
|
3
|
+
.ztf-subitem(style="float: left;clear: both;display: block;" ng-repeat="item in subitems()")
|
4
|
+
%form(role="form" ng-class="{'form-inline': inline}")
|
5
|
+
%ztf-button(style="float: right;clear: none;display: inline;" delete ng-if="canDelete" zt-hide zt-icon zt-inline)
|
6
|
+
%span(style="float: right;clear: none;display: inline;" ng-transclude)
|
7
|
+
.clearfix
|
8
|
+
%ztf-button(add ng-if="canAdd" zt-hide zt-icon)
|
9
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
.form-group.has-feedback()
|
2
|
+
%label(ng-if="isDefined(ztLabel)" ng-class="{'text-success': fieldUpdated()}")
|
3
|
+
{{ztLabel}}:
|
4
|
+
.input-wrapper
|
5
|
+
.input-group(ng-show="form.editable"ng-class="{'has-warning': fieldModified(), 'has-error': fieldError()}")
|
6
|
+
%input.form-control(ng-model="itemCopy()[ztField]" )
|
7
|
+
%span.input-group-addon
|
8
|
+
%i.glyphicon(ng-class="{'glyphicon-remove': !fieldError() && !fieldUpdating(),'glyphicon-refresh': fieldUpdating(), 'text-warning': fieldUpdating(), 'glyphicon-warning-sign': fieldError()}" ng-click="revertLocal()" title="{{glyphTitle()}}")
|
9
|
+
%span(ng-hide="form.editable")
|
10
|
+
{{itemCopy()[ztField]}}
|
11
|
+
%i.glyphicon.glyphicon-saved.text-success(ng-show="fieldUpdated()")
|
12
|
+
|
data/bin/zwr
CHANGED
@@ -78,7 +78,7 @@ when 'new'
|
|
78
78
|
puts "You are in a git repo, and that is not good!"
|
79
79
|
else
|
80
80
|
cmd = <<-CMD.gsub /^ *$\n/, ''
|
81
|
-
rails new #{ARGV[1]} --skip-bundle --skip-spring
|
81
|
+
rails new #{ARGV[1]} #{"--skip-bundle" unless @options[:bundle]} --skip-spring
|
82
82
|
#{"--skip-active-record" if not @options[:activerecord]}
|
83
83
|
-m #{File.expand_path('../../lib/zwr/app_template.rb', __FILE__)}
|
84
84
|
#{"use-mongoid" if @options[:mongoid]}
|
@@ -86,7 +86,7 @@ when 'new'
|
|
86
86
|
#{"use-devise" if @options[:devise]}
|
87
87
|
CMD
|
88
88
|
putsv " \033[35mexec\033[0m #{cmd.strip}"
|
89
|
-
exec(cmd.gsub(/\r/," ").gsub(/\n/," ").gsub(
|
89
|
+
exec(cmd.gsub(/\r/," ").gsub(/\n/," ").gsub(/\ \ +/," "))
|
90
90
|
end
|
91
91
|
when 'deploy'
|
92
92
|
if ARGV.length < 2
|
@@ -5,7 +5,7 @@ module Zwr
|
|
5
5
|
ang_file_name = file_name.gsub("_","-")
|
6
6
|
dir_class = file_name.gsub("-","_").camelize(:lower)
|
7
7
|
create_file "app/assets/javascripts/directives/#{ang_file_name}.js.coffee", <<-FILE.strip_heredoc
|
8
|
-
@#{application_name}.directive '#{dir_class}', ->
|
8
|
+
@#{application_name}.directive '#{dir_class}', ['$timeout', ($timeout) ->
|
9
9
|
ret =
|
10
10
|
restrict: 'AE' # also possible class C
|
11
11
|
transclude: true # set to false if ignoring content
|
@@ -17,7 +17,25 @@ module Zwr
|
|
17
17
|
# the scope
|
18
18
|
glyph: '@' # isolate scope of a variable (in only), passed with
|
19
19
|
# an attribute disabled="123"
|
20
|
-
|
20
|
+
link: (scope, elem, attr) ->
|
21
|
+
scope.$watch (scope) ->
|
22
|
+
scope.ztItem
|
23
|
+
, ->
|
24
|
+
scope.revertLocal() if scope.ztItem
|
25
|
+
scope.$watch () ->
|
26
|
+
element[0].focus() if scope.focusMe == 'true'
|
27
|
+
plunker = ->
|
28
|
+
$timeout ->
|
29
|
+
scope.focuschange = !scope.focuschange
|
30
|
+
plunker()
|
31
|
+
,1000
|
32
|
+
plunker()
|
33
|
+
controller: ($scope) ->
|
34
|
+
$scope.status = 0
|
35
|
+
$scope.getItem = ->
|
36
|
+
$scope.myItem or $scope.$parent.item
|
37
|
+
templateUrl: "#{ang_file_name}.html"
|
38
|
+
]
|
21
39
|
FILE
|
22
40
|
create_file "app/assets/javascripts/templates/#{ang_file_name}.html.haml", <<-FILE.strip_heredoc
|
23
41
|
.#{ang_file_name}
|
data/lib/zwr/app_template.rb
CHANGED
@@ -11,6 +11,9 @@ use_angular = @args.include? 'use-angular'
|
|
11
11
|
use_mongoid = @args.include? 'use-mongoid'
|
12
12
|
use_devise = @args.include? 'use-devise'
|
13
13
|
|
14
|
+
gsub_file "Gemfile","# gem 'therubyracer'", "gem 'therubyracer'"
|
15
|
+
|
16
|
+
|
14
17
|
gem 'zwr'
|
15
18
|
gem 'bootstrap-sass', '~> 3.2.0'
|
16
19
|
gem 'bootstrap_form'
|
@@ -58,6 +61,9 @@ gem 'tzinfo', platforms: [:mingw, :mswin, :x64_mingw]
|
|
58
61
|
|
59
62
|
if use_devise
|
60
63
|
gem 'devise', '~> 3.3.0'
|
64
|
+
unless use_mongoid
|
65
|
+
run 'bundle install --quiet'
|
66
|
+
end
|
61
67
|
generate 'devise:install'
|
62
68
|
generate :scaffold, 'User', 'name:string', 'email:string',
|
63
69
|
'password:string', 'password_confirmation:string', 'admin:boolean'
|
@@ -131,14 +137,11 @@ initializer 'zwr.rb', <<-FILE.strip_heredoc
|
|
131
137
|
|
132
138
|
file 'db/seeds/.keep'
|
133
139
|
|
134
|
-
|
140
|
+
run 'bundle install --quiet'
|
135
141
|
|
136
142
|
rake 'zwr:install'
|
137
143
|
rake 'db:migrate'
|
138
144
|
|
139
|
-
unless use_mongoid
|
140
|
-
run 'bundle install --quiet'
|
141
|
-
end
|
142
145
|
|
143
146
|
# Git commands should be the last so that they catch all the files!
|
144
147
|
git init: '-q'
|
data/zwr.gemspec
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'zwr'
|
3
|
-
s.version = '0.1.
|
4
|
-
s.date = '
|
3
|
+
s.version = '0.1.7'
|
4
|
+
s.date = '2015-01-06'
|
5
5
|
s.summary = "All the Zwr needs"
|
6
|
-
s.description = "
|
6
|
+
s.description = "the livings that fiteth for a gorge bellum."
|
7
7
|
s.author = "Zeljko"
|
8
8
|
s.email = 'zeljko@zwr.fi'
|
9
9
|
s.files = `git ls-files`.split("\n") - %w(.rvmrc .gitignore)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zwr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zeljko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -30,7 +30,7 @@ dependencies:
|
|
30
30
|
- - '>='
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: '3.1'
|
33
|
-
description:
|
33
|
+
description: the livings that fiteth for a gorge bellum.
|
34
34
|
email: zeljko@zwr.fi
|
35
35
|
executables:
|
36
36
|
- zwr
|
@@ -48,12 +48,30 @@ files:
|
|
48
48
|
- app/assets/images/logo_transparent.png
|
49
49
|
- app/assets/javascripts/controllers/.keep
|
50
50
|
- app/assets/javascripts/directives/.keep
|
51
|
+
- app/assets/javascripts/directives/zt-auto-checkbox.js.coffee
|
52
|
+
- app/assets/javascripts/directives/zt-auto-textbox.js.coffee
|
53
|
+
- app/assets/javascripts/directives/zt-textbox.js.coffee
|
54
|
+
- app/assets/javascripts/directives/ztf-button.js.coffee
|
55
|
+
- app/assets/javascripts/directives/ztf-checkbox.js.coffee
|
56
|
+
- app/assets/javascripts/directives/ztf-form.js.coffee
|
57
|
+
- app/assets/javascripts/directives/ztf-subform.js.coffee
|
58
|
+
- app/assets/javascripts/directives/ztf-textbox.js.coffee
|
51
59
|
- app/assets/javascripts/includes/.keep
|
52
60
|
- app/assets/javascripts/includes/angular-local-storage.js
|
53
61
|
- app/assets/javascripts/includes/xml2json.js
|
62
|
+
- app/assets/javascripts/includes/zwr.js.coffee
|
54
63
|
- app/assets/javascripts/services/.keep
|
64
|
+
- app/assets/javascripts/services/zt-base-service.js.coffee
|
55
65
|
- app/assets/javascripts/templates/.keep
|
56
66
|
- app/assets/javascripts/templates/404.html
|
67
|
+
- app/assets/javascripts/templates/zt-auto-checkbox.html.haml
|
68
|
+
- app/assets/javascripts/templates/zt-auto-textbox.html.haml
|
69
|
+
- app/assets/javascripts/templates/zt-textbox.html.haml
|
70
|
+
- app/assets/javascripts/templates/ztf-button.html.haml
|
71
|
+
- app/assets/javascripts/templates/ztf-checkbox.html.haml
|
72
|
+
- app/assets/javascripts/templates/ztf-form.html.haml
|
73
|
+
- app/assets/javascripts/templates/ztf-subform.html.haml
|
74
|
+
- app/assets/javascripts/templates/ztf-textbox.html.haml
|
57
75
|
- app/assets/javascripts/zwr.js.coffee
|
58
76
|
- app/assets/stylesheets/zwr.css.scss.erb
|
59
77
|
- bin/zwr
|
@@ -99,7 +117,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
99
117
|
version: '0'
|
100
118
|
requirements: []
|
101
119
|
rubyforge_project:
|
102
|
-
rubygems_version: 2.
|
120
|
+
rubygems_version: 2.4.3
|
103
121
|
signing_key:
|
104
122
|
specification_version: 4
|
105
123
|
summary: All the Zwr needs
|