codelation_ui 1.0.1 → 1.0.57
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/codelation_ui/_base_resources/app.js +54 -5
- data/app/assets/javascripts/codelation_ui/base.js +1 -0
- data/app/assets/javascripts/codelation_ui/extended/checkmark.js +31 -0
- data/app/assets/javascripts/codelation_ui/extended/code.js +64 -0
- data/app/assets/javascripts/codelation_ui/extended/fail.js +31 -0
- data/app/assets/javascripts/codelation_ui/extended/radial_progress_bar.js +267 -0
- data/app/assets/javascripts/codelation_ui/extended/slider.js +636 -639
- data/app/assets/javascripts/codelation_ui/extended/spinner.js +103 -0
- data/app/assets/javascripts/codelation_ui/forms/components/input.js +417 -388
- data/app/assets/javascripts/codelation_ui/forms/interfaces/form.js +35 -30
- data/app/assets/javascripts/codelation_ui/std.js +3 -1
- data/app/assets/javascripts/codelation_ui/std/components/info.js +22 -0
- data/app/assets/javascripts/codelation_ui/std/components/transition.js +26 -0
- data/app/assets/javascripts/codelation_ui/std/computed_interfaces/mockAPI.js +17 -0
- data/app/assets/javascripts/codelation_ui/std/interfaces/array.js +28 -0
- data/app/assets/javascripts/codelation_ui/std/interfaces/content_formatters.js +37 -10
- data/app/assets/javascripts/codelation_ui/std/interfaces/date.js +8 -0
- data/app/assets/javascripts/codelation_ui/std/interfaces/number.js +20 -0
- data/app/assets/javascripts/codelation_ui/std/interfaces/rest_api.js +104 -0
- data/app/assets/javascripts/codelation_ui/std/interfaces/string.js +29 -0
- data/app/assets/javascripts/codelation_ui/vue.js +25 -8
- data/app/assets/javascripts/codelation_ui/vue_pages.js +35 -10
- data/app/assets/stylesheets/codelation_ui.scss +1 -3
- data/app/assets/stylesheets/codelation_ui/_base_resources/_turbolinks.scss +11 -0
- data/app/assets/stylesheets/codelation_ui/_base_resources/mixins/button.scss +185 -33
- data/app/assets/stylesheets/codelation_ui/base.scss +3 -0
- data/app/assets/stylesheets/codelation_ui/colors.scss +2 -0
- data/app/assets/stylesheets/codelation_ui/extended/checkmark.scss +53 -0
- data/app/assets/stylesheets/codelation_ui/extended/code.scss +153 -0
- data/app/assets/stylesheets/codelation_ui/extended/fail.scss +50 -0
- data/app/assets/stylesheets/codelation_ui/extended/radial_progress_bar.scss +70 -0
- data/app/assets/stylesheets/codelation_ui/extended/slider.scss +2 -2
- data/app/assets/stylesheets/codelation_ui/extended/spinner.scss +100 -0
- data/app/assets/stylesheets/codelation_ui/std.scss +1 -1
- data/app/assets/stylesheets/codelation_ui/std/info.scss +51 -0
- data/app/assets/stylesheets/codelation_ui/vue_transitions.scss +94 -0
- data/app/helpers/action_view/helpers/url_helper.rb +22 -0
- data/lib/generators/ui/component/USAGE +22 -0
- data/lib/generators/ui/component/component_generator.rb +41 -0
- data/lib/generators/ui/component/templates/javascript.js.erb +20 -0
- data/lib/generators/ui/component/templates/page_javascript.js.erb +20 -0
- data/lib/generators/ui/component/templates/page_stylesheet.scss.erb +3 -0
- data/lib/generators/ui/component/templates/stylesheet.scss.erb +3 -0
- data/lib/generators/ui/component/templates/template.html.erb +5 -0
- data/lib/generators/ui/mixin/USAGE +8 -0
- data/lib/generators/ui/mixin/mixin_generator.rb +11 -0
- data/lib/generators/ui/mixin/templates/javascript.js.erb +8 -0
- data/lib/generators/ui/pages/USAGE +23 -0
- data/lib/generators/ui/pages/pages_generator.rb +48 -0
- data/lib/generators/ui/pages/templates/controller.rb +2 -0
- data/lib/generators/ui/pages/templates/javascript.js.erb +22 -0
- data/lib/generators/ui/pages/templates/stylesheet.scss.erb +3 -0
- data/lib/generators/ui/pages/templates/template.html.erb +3 -0
- data/vendor/assets/javascripts/highlight.pack.js +2 -0
- data/vendor/assets/javascripts/pluralize.js +1 -0
- data/vendor/assets/javascripts/vue.js +4 -10232
- metadata +107 -11
- data/app/assets/javascripts/codelation_ui/std/index.js +0 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f5509d439e28984c350955f88462af5b9cc5a6b7
|
4
|
+
data.tar.gz: 97c05ad5a4b99aa4df39847535eeeebe663ed9ba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ec45bec284dc5b73e9d8196b6472dc1d4113fc95c1be73057c2083be89862aac92442389858a77983e7b5080a0baa696e14c6d0007078dd5f53a50dbe1bef09
|
7
|
+
data.tar.gz: 838960e2773a581d024d335df4cdc30d0de1d4f4f2f5c91f988cc5bd4b974e23f5cc6a17472f1c53f42174d658bc3a5679157b81350baafbebac073c39f121b7
|
@@ -2,14 +2,19 @@
|
|
2
2
|
"use strict";
|
3
3
|
|
4
4
|
var app = window.App;
|
5
|
-
var bodyClass,
|
5
|
+
var bodyClass,
|
6
|
+
bodyElement;
|
6
7
|
|
7
8
|
if (app === undefined) {
|
8
9
|
app = window.App = {};
|
9
10
|
}
|
10
11
|
|
11
|
-
app.enterFunctions = {
|
12
|
-
|
12
|
+
app.enterFunctions = {
|
13
|
+
component: []
|
14
|
+
};
|
15
|
+
app.exitFunctions = {
|
16
|
+
component: []
|
17
|
+
};
|
13
18
|
|
14
19
|
// Register functions to run when any page or specific pages are loaded.
|
15
20
|
//
|
@@ -61,21 +66,49 @@
|
|
61
66
|
bodyElement = $('body');
|
62
67
|
|
63
68
|
// Determine which functions should be fired
|
69
|
+
var fireConfigFunctions = [];
|
70
|
+
var fireFirstFunctions = [];
|
64
71
|
var fireFunctions = [];
|
72
|
+
var fireLastFunctions = [];
|
65
73
|
$.each(app.enterFunctions, function(key, functions) {
|
66
74
|
bodyClass = key.split('.').join(' ');
|
67
75
|
if (bodyClass === 'component' || bodyElement.hasClass(bodyClass)) {
|
68
76
|
fireFunctions = fireFunctions.concat(functions);
|
69
77
|
}
|
78
|
+
|
79
|
+
if (bodyClass === 'last') {
|
80
|
+
fireLastFunctions = fireLastFunctions.concat(functions);
|
81
|
+
}
|
82
|
+
|
83
|
+
if (bodyClass === 'first') {
|
84
|
+
fireFirstFunctions = fireFirstFunctions.concat(functions);
|
85
|
+
}
|
86
|
+
|
87
|
+
if (bodyClass === 'config') {
|
88
|
+
fireConfigFunctions = fireConfigFunctions.concat(functions);
|
89
|
+
}
|
70
90
|
});
|
71
91
|
|
72
92
|
// Fire off each function
|
73
|
-
$.each(
|
93
|
+
$.each(fireConfigFunctions, function() {
|
94
|
+
this.call();
|
95
|
+
});
|
96
|
+
$.each(fireFirstFunctions, function() {
|
97
|
+
this.call();
|
98
|
+
});
|
99
|
+
$.each(fireFunctions, function() {
|
100
|
+
this.call();
|
101
|
+
});
|
102
|
+
$.each(fireLastFunctions, function() {
|
103
|
+
this.call();
|
104
|
+
});
|
74
105
|
});
|
75
106
|
|
76
107
|
// Fires off any callbacks registered for exit, ONLY if using Turbolinks.
|
77
108
|
$(document).on('page:before-unload', function() {
|
109
|
+
var fireFirstFunctions = [];
|
78
110
|
var fireFunctions = [];
|
111
|
+
var fireLastFunctions = [];
|
79
112
|
|
80
113
|
// Determine which functions should be fired
|
81
114
|
$.each(app.exitFunctions, function(key, functions) {
|
@@ -83,9 +116,25 @@
|
|
83
116
|
if (bodyClass === 'component' || bodyElement.hasClass(bodyClass)) {
|
84
117
|
fireFunctions = fireFunctions.concat(functions);
|
85
118
|
}
|
119
|
+
|
120
|
+
if (bodyClass === 'last') {
|
121
|
+
fireLastFunctions = fireLastFunctions.concat(functions);
|
122
|
+
}
|
123
|
+
|
124
|
+
if (bodyClass === 'first') {
|
125
|
+
fireFirstFunctions = fireFirstFunctions.concat(functions);
|
126
|
+
}
|
86
127
|
});
|
87
128
|
|
88
129
|
// Fire off each function
|
89
|
-
$.each(
|
130
|
+
$.each(fireFirstFunctions, function() {
|
131
|
+
this.call();
|
132
|
+
});
|
133
|
+
$.each(fireFunctions, function() {
|
134
|
+
this.call();
|
135
|
+
});
|
136
|
+
$.each(fireLastFunctions, function() {
|
137
|
+
this.call();
|
138
|
+
});
|
90
139
|
});
|
91
140
|
})();
|
@@ -0,0 +1,31 @@
|
|
1
|
+
(function() {
|
2
|
+
"use strict";
|
3
|
+
|
4
|
+
App.vue.components.vueCheckmark = Vue.extend({
|
5
|
+
template: '<div :style="styles">\
|
6
|
+
<svg class="vue-checkmark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52 52">\
|
7
|
+
<circle class="vue-checkmark-circle" cx="26" cy="26" r="25" fill="none" :stroke-width="stroke"/>\
|
8
|
+
<path class="vue-checkmark-check" fill="none" d="M14.1 27.2l7.1 7.2 16.7-16.8" :stroke-width="stroke"/>\
|
9
|
+
</svg></div>\
|
10
|
+
',
|
11
|
+
props: {
|
12
|
+
size: {
|
13
|
+
type: Number,
|
14
|
+
default: 50
|
15
|
+
},
|
16
|
+
stroke: {
|
17
|
+
type: Number,
|
18
|
+
default: 3.5
|
19
|
+
}
|
20
|
+
},
|
21
|
+
computed: {
|
22
|
+
styles: function() {
|
23
|
+
var newSize = this.size + 'px';
|
24
|
+
return {
|
25
|
+
width: newSize,
|
26
|
+
height: newSize
|
27
|
+
};
|
28
|
+
}
|
29
|
+
}
|
30
|
+
});
|
31
|
+
})();
|
@@ -0,0 +1,64 @@
|
|
1
|
+
//= require highlight.pack
|
2
|
+
|
3
|
+
// NORMAL
|
4
|
+
// <vue-code lang="javascript">
|
5
|
+
// function name(){
|
6
|
+
// return 'jake';
|
7
|
+
// }
|
8
|
+
//
|
9
|
+
// //comment
|
10
|
+
// var test = '12' + ' days';
|
11
|
+
// </vue-code>
|
12
|
+
|
13
|
+
// DARK UI
|
14
|
+
// <vue-code lang="javascript" dark>
|
15
|
+
// function name(){
|
16
|
+
// return 'jake';
|
17
|
+
// }
|
18
|
+
//
|
19
|
+
// //comment
|
20
|
+
// var test = '12' + ' days';
|
21
|
+
// </vue-code>
|
22
|
+
|
23
|
+
// INLINE
|
24
|
+
// <vue-code lang="javascript" inline>
|
25
|
+
// function name(){
|
26
|
+
// return 'jake';
|
27
|
+
// }
|
28
|
+
//
|
29
|
+
// //comment
|
30
|
+
// var test = '12' + ' days';
|
31
|
+
// </vue-code>
|
32
|
+
|
33
|
+
(function() {
|
34
|
+
"use strict";
|
35
|
+
|
36
|
+
App.vue.config.code = {
|
37
|
+
'dark': false
|
38
|
+
}
|
39
|
+
|
40
|
+
|
41
|
+
var template = '<div class="vue-code" :class="[inline ? \'vue-code-inline\' : \'vue-code-block\', dark ? \'vue-code-dark\' : \'\']">\
|
42
|
+
<pre v-if="!inline"><code v-el:code :class="lang"><slot></slot></code></pre>\
|
43
|
+
<span v-else><code v-el:code :class="lang"><slot></slot></code></span>\
|
44
|
+
</div>';
|
45
|
+
|
46
|
+
App.vue.components.vueCode = Vue.extend({
|
47
|
+
template: template,
|
48
|
+
props: {
|
49
|
+
lang: String,
|
50
|
+
inline: {
|
51
|
+
type: Boolean,
|
52
|
+
default: false
|
53
|
+
},
|
54
|
+
dark: {
|
55
|
+
type: Boolean,
|
56
|
+
default: App.vue.config.code.dark
|
57
|
+
}
|
58
|
+
},
|
59
|
+
ready: function() {
|
60
|
+
var code = this.$els.code;
|
61
|
+
hljs.highlightBlock(code);
|
62
|
+
}
|
63
|
+
});
|
64
|
+
})();
|
@@ -0,0 +1,31 @@
|
|
1
|
+
(function() {
|
2
|
+
"use strict";
|
3
|
+
|
4
|
+
App.vue.components.vueFail = Vue.extend({
|
5
|
+
template: '<div :style="styles">\
|
6
|
+
<svg class="vue-fail" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52 52">\
|
7
|
+
<circle class="vue-fail-circle" cx="26" cy="26" r="25" fill="none" :stroke-width="stroke"/>\
|
8
|
+
<path class="vue-fail-check" fill="none" d="M16 16 36 36 M36 16 16 36" :stroke-width="stroke"/>\
|
9
|
+
</svg></div>\
|
10
|
+
',
|
11
|
+
props: {
|
12
|
+
size: {
|
13
|
+
type: Number,
|
14
|
+
default: 50
|
15
|
+
},
|
16
|
+
stroke: {
|
17
|
+
type: Number,
|
18
|
+
default: 3.5
|
19
|
+
}
|
20
|
+
},
|
21
|
+
computed: {
|
22
|
+
styles: function() {
|
23
|
+
var newSize = this.size + 'px';
|
24
|
+
return {
|
25
|
+
width: newSize,
|
26
|
+
height: newSize
|
27
|
+
};
|
28
|
+
}
|
29
|
+
}
|
30
|
+
});
|
31
|
+
})();
|
@@ -0,0 +1,267 @@
|
|
1
|
+
// # Use
|
2
|
+
|
3
|
+
// <vue-radial-progress-bar :total-steps="10" :completed-steps="5"><h4>Inner content</h4></vue-radial-progress-bar>
|
4
|
+
|
5
|
+
// # Props
|
6
|
+
|
7
|
+
// Name | Default value | Description
|
8
|
+
// ---|:---:|---
|
9
|
+
// `diameter` | `200` | Diameter of the progress bar circle in pixels.
|
10
|
+
// `totalSteps` | `10` | Total number of steps to complete progress bar.
|
11
|
+
// `completedSteps` | `0` | Number of completed steps in the progress bar.
|
12
|
+
// `startColor` | `#bbff42` | The color of the leading edge of the progress bar gradient.
|
13
|
+
// `stopColor` | `#429321` | The secondary color of the progress bar gradient.
|
14
|
+
// `innerStrokeColor` | `#323232` | Background color of the progress bar.
|
15
|
+
// `strokeWidth` | `10` | The width of the progress bar.
|
16
|
+
// `animateSpeed` | `1000` | The amount of time in milliseconds to animate one step.
|
17
|
+
// `fps` | `60` | The frames per second that the animation should run.
|
18
|
+
// `timingFunc` | `linear` | The transition timing function to use for the CSS transition. See [transition-timing-function](https://developer.mozilla.org/en-US/docs/Web/CSS/transition-timing-function).
|
19
|
+
|
20
|
+
|
21
|
+
(function(){
|
22
|
+
"use strict"
|
23
|
+
|
24
|
+
var template = '<div class="vue-radial-progress-bar-container" :class="[over ? \'vue-radial-progress-bar-over\' : \'\', complete ? \'vue-radial-progress-bar-complete\' : \'\']" :style="containerStyle">\
|
25
|
+
<div class="vue-radial-progress-bar-inner" :style="innerCircleStyle">\
|
26
|
+
<slot></slot>\
|
27
|
+
</div>\
|
28
|
+
<svg class="vue-radial-progress-bar-bar"\
|
29
|
+
:width="diameter"\
|
30
|
+
:height="diameter"\
|
31
|
+
version="1.1"\
|
32
|
+
xmlns="http://www.w3.org/2000/svg">\
|
33
|
+
<defs>\
|
34
|
+
<radialGradient :id="\'radial-gradient\' + _uid"\
|
35
|
+
:fx="gradient.fx"\
|
36
|
+
:fy="gradient.fy"\
|
37
|
+
:cx="gradient.cx"\
|
38
|
+
:cy="gradient.cy"\
|
39
|
+
:r="gradient.r">\
|
40
|
+
<stop class="vue-radial-progress-bar-start-color" offset="30%"/>\
|
41
|
+
<stop class="vue-radial-progress-bar-stop-color" offset="100%"/>\
|
42
|
+
</radialGradient>\
|
43
|
+
</defs>\
|
44
|
+
<circle class="vue-radial-progress-bar-circle" :r="innerCircleRadius"\
|
45
|
+
:cx="radius"\
|
46
|
+
:cy="radius"\
|
47
|
+
fill="transparent"\
|
48
|
+
:stroke-dasharray="circumference"\
|
49
|
+
stroke-dashoffset="0"\
|
50
|
+
stroke-linecap="round"\
|
51
|
+
:style="strokeStyle"></circle>\
|
52
|
+
<circle :transform="\'rotate(270, \' + radius + \',\' + radius + \')\'"\
|
53
|
+
:r="innerCircleRadius"\
|
54
|
+
:cx="radius"\
|
55
|
+
:cy="radius"\
|
56
|
+
fill="transparent"\
|
57
|
+
:stroke="\'url(#radial-gradient\' + _uid + \')\'"\
|
58
|
+
:stroke-dasharray="circumference"\
|
59
|
+
:stroke-dashoffset="circumference"\
|
60
|
+
stroke-linecap="round"\
|
61
|
+
:style="progressStyle"></circle>\
|
62
|
+
</svg>\
|
63
|
+
</div>';
|
64
|
+
|
65
|
+
App.vue.components.vueRadialProgressBar = Vue.extend({
|
66
|
+
template: template,
|
67
|
+
props: {
|
68
|
+
diameter: {
|
69
|
+
type: Number,
|
70
|
+
required: false,
|
71
|
+
default: 200
|
72
|
+
},
|
73
|
+
totalSteps: {
|
74
|
+
type: Number,
|
75
|
+
required: true,
|
76
|
+
default: 10
|
77
|
+
},
|
78
|
+
completedSteps: {
|
79
|
+
type: Number,
|
80
|
+
required: true,
|
81
|
+
default: 0
|
82
|
+
},
|
83
|
+
strokeWidth: {
|
84
|
+
type: Number,
|
85
|
+
required: false,
|
86
|
+
default: 10
|
87
|
+
},
|
88
|
+
animateSpeed: {
|
89
|
+
type: Number,
|
90
|
+
required: false,
|
91
|
+
default: 1000
|
92
|
+
},
|
93
|
+
fps: {
|
94
|
+
type: Number,
|
95
|
+
required: false,
|
96
|
+
default: 60
|
97
|
+
},
|
98
|
+
timingFunc: {
|
99
|
+
type: String,
|
100
|
+
required: false,
|
101
|
+
default: 'linear'
|
102
|
+
}
|
103
|
+
},
|
104
|
+
data: function() {
|
105
|
+
return {
|
106
|
+
gradient: {
|
107
|
+
fx: 0.99,
|
108
|
+
fy: 0.5,
|
109
|
+
cx: 0.5,
|
110
|
+
cy: 0.5,
|
111
|
+
r: 0.65
|
112
|
+
},
|
113
|
+
gradientAnimation: null,
|
114
|
+
currentAngle: 0,
|
115
|
+
strokeDashoffset: 0
|
116
|
+
}
|
117
|
+
},
|
118
|
+
computed: {
|
119
|
+
over: function() {
|
120
|
+
if (this.completedSteps > this.totalSteps) {
|
121
|
+
return true;
|
122
|
+
}
|
123
|
+
|
124
|
+
return false;
|
125
|
+
},
|
126
|
+
complete: function() {
|
127
|
+
if (this.completedSteps === this.totalSteps) {
|
128
|
+
return true;
|
129
|
+
}
|
130
|
+
|
131
|
+
return false;
|
132
|
+
},
|
133
|
+
radius: function() {
|
134
|
+
return this.diameter / 2
|
135
|
+
},
|
136
|
+
circumference: function() {
|
137
|
+
return Math.PI * this.innerCircleDiameter
|
138
|
+
},
|
139
|
+
stepSize: function() {
|
140
|
+
if (this.totalSteps === 0) {
|
141
|
+
return 0
|
142
|
+
}
|
143
|
+
return 100 / this.totalSteps
|
144
|
+
},
|
145
|
+
finishedPercentage: function() {
|
146
|
+
return this.stepSize * this.completedSteps
|
147
|
+
},
|
148
|
+
circleSlice: function() {
|
149
|
+
return 2 * Math.PI / this.totalSteps
|
150
|
+
},
|
151
|
+
animateSlice: function() {
|
152
|
+
return this.circleSlice / this.totalPoints
|
153
|
+
},
|
154
|
+
innerCircleDiameter: function() {
|
155
|
+
return this.diameter - (this.strokeWidth * 2)
|
156
|
+
},
|
157
|
+
innerCircleRadius: function() {
|
158
|
+
return this.innerCircleDiameter / 2
|
159
|
+
},
|
160
|
+
totalPoints: function() {
|
161
|
+
return this.animateSpeed / this.animationIncrements
|
162
|
+
},
|
163
|
+
animationIncrements: function() {
|
164
|
+
return 1000 / this.fps
|
165
|
+
},
|
166
|
+
hasGradient: function() {
|
167
|
+
return true;
|
168
|
+
},
|
169
|
+
containerStyle: function() {
|
170
|
+
return {
|
171
|
+
height: this.diameter + 'px',
|
172
|
+
width: this.diameter + 'px'
|
173
|
+
}
|
174
|
+
},
|
175
|
+
progressStyle: function() {
|
176
|
+
return {
|
177
|
+
height: this.diameter + 'px',
|
178
|
+
width: this.diameter + 'px',
|
179
|
+
strokeWidth: this.strokeWidth + 'px',
|
180
|
+
strokeDashoffset: this.strokeDashoffset,
|
181
|
+
transition: 'stroke-dashoffset ' + this.animateSpeed + 'ms ' + this.timingFunc
|
182
|
+
}
|
183
|
+
},
|
184
|
+
strokeStyle: function() {
|
185
|
+
return {
|
186
|
+
height: this.diameter + 'px',
|
187
|
+
width: this.diameter + 'px',
|
188
|
+
strokeWidth: this.strokeWidth + 'px'
|
189
|
+
}
|
190
|
+
},
|
191
|
+
innerCircleStyle: function() {
|
192
|
+
return {
|
193
|
+
width: this.innerCircleDiameter + 'px'
|
194
|
+
}
|
195
|
+
}
|
196
|
+
},
|
197
|
+
methods: {
|
198
|
+
getStopPointsOfCircle: function(steps) {
|
199
|
+
var points = []
|
200
|
+
for (var i = 0; i < steps; i++) {
|
201
|
+
var angle = this.circleSlice * i
|
202
|
+
points.push(this.getPointOfCircle(angle))
|
203
|
+
}
|
204
|
+
return points
|
205
|
+
},
|
206
|
+
getPointOfCircle: function(angle) {
|
207
|
+
var radius = 0.5
|
208
|
+
var x = radius + (radius * Math.cos(angle))
|
209
|
+
var y = radius + (radius * Math.sin(angle))
|
210
|
+
return { x: x, y: y }
|
211
|
+
},
|
212
|
+
gotoPoint: function() {
|
213
|
+
var point = this.getPointOfCircle(this.currentAngle)
|
214
|
+
this.gradient.fx = point.x
|
215
|
+
this.gradient.fy = point.y
|
216
|
+
},
|
217
|
+
changeProgress: function(args) {
|
218
|
+
var ops = args || {};
|
219
|
+
var isAnimate = ops.isAnimate;
|
220
|
+
this.strokeDashoffset = ((100 - this.finishedPercentage) / 100) * this.circumference
|
221
|
+
if (this.gradientAnimation) {
|
222
|
+
clearInterval(this.gradientAnimation)
|
223
|
+
}
|
224
|
+
if (!isAnimate) {
|
225
|
+
this.gotoNextStep()
|
226
|
+
return
|
227
|
+
}
|
228
|
+
var angleOffset = (this.completedSteps - 1) * this.circleSlice
|
229
|
+
var i = (this.currentAngle - angleOffset) / this.animateSlice
|
230
|
+
var incrementer = Math.abs(i - this.totalPoints) / this.totalPoints
|
231
|
+
var isMoveForward = i < this.totalPoints
|
232
|
+
var self = this;
|
233
|
+
this.gradientAnimation = setInterval(function() {
|
234
|
+
if (isMoveForward && i >= self.totalPoints ||
|
235
|
+
!isMoveForward && i < self.totalPoints) {
|
236
|
+
clearInterval(self.gradientAnimation);
|
237
|
+
return;
|
238
|
+
}
|
239
|
+
self.currentAngle = angleOffset + (self.animateSlice * i);
|
240
|
+
self.gotoPoint();
|
241
|
+
i += isMoveForward ? incrementer : -incrementer;
|
242
|
+
}, self.animationIncrements)
|
243
|
+
},
|
244
|
+
gotoNextStep: function() {
|
245
|
+
this.currentAngle = this.completedSteps * this.circleSlice
|
246
|
+
this.gotoPoint();
|
247
|
+
}
|
248
|
+
},
|
249
|
+
watch: {
|
250
|
+
totalSteps: function() {
|
251
|
+
this.changeProgress({ isAnimate: true })
|
252
|
+
},
|
253
|
+
completedSteps: function() {
|
254
|
+
this.changeProgress({ isAnimate: true })
|
255
|
+
},
|
256
|
+
diameter: function() {
|
257
|
+
this.changeProgress({ isAnimate: true })
|
258
|
+
},
|
259
|
+
strokeWidth: function() {
|
260
|
+
this.changeProgress({ isAnimate: true })
|
261
|
+
}
|
262
|
+
},
|
263
|
+
created: function() {
|
264
|
+
this.changeProgress({ isAnimate: false })
|
265
|
+
}
|
266
|
+
});
|
267
|
+
})()
|