ajax_canvas_field 0.0.5 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/assets/javascripts/ajax_canvas_field.js +256 -195
- data/app/assets/stylesheets/ajax_canvas_field.css +1 -5
- data/app/helpers/canvas_field_helper.rb +8 -6
- data/lib/ajax_canvas_field/config.rb +1 -1
- data/lib/ajax_canvas_field/rails/engine.rb +4 -2
- data/lib/ajax_canvas_field/rails/version.rb +1 -1
- metadata +3 -4
- data/app/assets/javascripts/ro_canvas_field.js +0 -42
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf10d08ef3a76a3276c6a2cba8a371d451a7d7bc
|
4
|
+
data.tar.gz: c28991ea6197847f70f6b13bc60585027944402b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0dbeab8a431220af99fa794f8b8e6c4d043ea9620fb88484342382dbd4d8efd93f0eb525a3fe34149c9f909c1995b4f0511eac0ef72d771a9c6218fc416d0e05
|
7
|
+
data.tar.gz: a5cc0f4448b335e735d1769bb0580aae732d8e7a3bf5c7cd23f99afc9e67b7f91833d888489dd5959f6660f3b8046a4534edb00899ff985425dc7495ad7fe488
|
@@ -1,198 +1,259 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
function refreshAll(canvas, context, points, e) {
|
2
|
+
points = [];
|
3
|
+
initCircles(canvas, context, points);
|
4
|
+
}
|
5
|
+
|
6
|
+
function initCircles(canvas, context, points) {
|
7
|
+
var initial_data = JSON.parse(find_data_field(canvas).dataset.initialData);
|
8
|
+
for (i = 0; i < initial_data.length; i++) {
|
9
|
+
var point = buildCircle(initial_data[i][1], initial_data[i][2], initial_data[i][3], canvas);
|
10
|
+
point.database_id = initial_data[i][0];
|
11
|
+
points.push(point);
|
12
|
+
}
|
13
|
+
redrawAllCircles(canvas, context, points);
|
14
|
+
return points;
|
15
|
+
}
|
16
|
+
|
17
|
+
function isPixelCollision(canvas, e) {
|
18
|
+
e.preventDefault();
|
19
|
+
if (e.type == "contextmenu")
|
20
|
+
return;
|
21
|
+
var r = canvas.getBoundingClientRect(),
|
22
|
+
context = canvas.getContext('2d'),
|
23
|
+
points = [],
|
24
|
+
x = e.clientX - r.left,
|
25
|
+
y = e.clientY - r.top,
|
26
|
+
removed = false,
|
27
|
+
i;
|
28
|
+
|
29
|
+
points = initCircles(canvas, context, points);
|
30
|
+
for (i = points.length - 1; i >= 0; --i) {
|
31
|
+
if (context.isPointInPath(points[i], x, y, 'nonzero')) {
|
32
|
+
deleteAjax(i, canvas, context, points);
|
33
|
+
removed = true;
|
34
|
+
}
|
35
|
+
}
|
36
|
+
|
37
|
+
if (removed == false) {
|
38
|
+
createAjax(x, y, e, canvas, context, points);
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
function buildCircle(x, y, e, canvas) {
|
43
|
+
var c = new Path2D(),
|
44
|
+
offset = 3.5;
|
45
|
+
|
46
|
+
c.arc(x - offset, y - offset, 7, 0, Math.PI * 2);
|
47
|
+
c.color = (typeof e === 'string')
|
48
|
+
? e
|
49
|
+
: chooseColor(e, canvas);
|
50
|
+
c.x = x;
|
51
|
+
c.y = y;
|
52
|
+
return c;
|
53
|
+
}
|
54
|
+
|
55
|
+
function chooseColor(e, canvas) {
|
56
|
+
if (e === null)
|
57
|
+
return '#ff0000';
|
58
|
+
switch (e.which) {
|
59
|
+
case 1:
|
60
|
+
return canvas.dataset.leftColor;
|
61
|
+
case 2:
|
62
|
+
return canvas.dataset.middleColor;
|
63
|
+
case 3:
|
64
|
+
return canvas.dataset.rightColor;
|
65
|
+
}
|
66
|
+
}
|
67
|
+
|
68
|
+
function chooseButton(e) {
|
69
|
+
if (e === null)
|
70
|
+
return null;
|
71
|
+
switch (e.which) {
|
72
|
+
case 1:
|
73
|
+
return 'left';
|
74
|
+
case 2:
|
75
|
+
return 'middle';
|
76
|
+
case 3:
|
77
|
+
return 'right';
|
78
|
+
}
|
79
|
+
}
|
80
|
+
|
81
|
+
function deleteAjax(i, canvas, context, points) {
|
82
|
+
var id = points[i].database_id;
|
83
|
+
$.ajax({
|
84
|
+
type: 'DELETE',
|
85
|
+
url: canvas.dataset.url + '/' + id,
|
86
|
+
headers: {
|
87
|
+
'Authorization': 'Token token=' + canvas.dataset.token
|
88
|
+
},
|
89
|
+
dataType: "json",
|
90
|
+
success: function(data) {
|
91
|
+
removeCircle(i, data, canvas, context, points);
|
92
|
+
},
|
93
|
+
error: function(data) {
|
94
|
+
alert('No connection to Server');
|
95
|
+
}
|
96
|
+
});
|
97
|
+
}
|
98
|
+
|
99
|
+
function removeCircle(i, data, canvas, context, points) {
|
100
|
+
points.splice(i, 1);
|
101
|
+
redrawAllCircles(canvas, context, points);
|
102
|
+
}
|
103
|
+
|
104
|
+
function createAjax(x, y, e, canvas, context, points) {
|
105
|
+
post_data = collectPostData(x, y, e, canvas, context, points);
|
106
|
+
$.ajax({
|
107
|
+
type: 'POST',
|
108
|
+
url: canvas.dataset.url,
|
109
|
+
headers: {
|
110
|
+
'Authorization': 'Token token=' + canvas.dataset.token
|
111
|
+
},
|
112
|
+
data: post_data,
|
113
|
+
dataType: "json",
|
114
|
+
success: function(data) {
|
115
|
+
addCircle(x, y, data, e, canvas, context, points);
|
116
|
+
},
|
117
|
+
error: function(data) {
|
118
|
+
alert('No connection to Server');
|
119
|
+
}
|
120
|
+
});
|
121
|
+
}
|
122
|
+
|
123
|
+
function collectPostData(x, y, e, canvas, context, points) {
|
124
|
+
var params = {};
|
125
|
+
var param = canvas.dataset.strongParam;
|
126
|
+
|
127
|
+
var additional_data = JSON.parse(find_data_field(canvas).dataset.additionalData);
|
128
|
+
params[param] = {
|
129
|
+
x_value: x,
|
130
|
+
y_value: y,
|
131
|
+
button: chooseButton(e)
|
132
|
+
};
|
133
|
+
for (var attrname in additional_data) {
|
134
|
+
params[param][attrname] = additional_data[attrname];
|
135
|
+
}
|
136
|
+
return params;
|
137
|
+
}
|
138
|
+
|
139
|
+
function find_data_field(canvas) {
|
140
|
+
var active_datafields = document.getElementsByClassName('active canvas_data_field');
|
141
|
+
var fields = document.querySelectorAll('.canvas_field, .ro_canvas_field');
|
142
|
+
if (active_datafields.length == 1)
|
143
|
+
return active_datafields[0];
|
144
|
+
if (fields.length == 1)
|
145
|
+
return active_datafields[0];
|
146
|
+
var active_id_fields = document.querySelectorAll('.canvas_data_field.active[data-for=' + canvas.id + ']');
|
147
|
+
if (active_id_fields.length == 1)
|
148
|
+
return active_id_fields[0];
|
149
|
+
return active_datafields[0];
|
150
|
+
}
|
151
|
+
|
152
|
+
function addCircle(x, y, data, e, canvas, context, points) {
|
153
|
+
new_point = buildCircle(x, y, e, canvas);
|
154
|
+
new_point['database_id'] = data.id;
|
155
|
+
points.push(new_point);
|
156
|
+
redrawAllCircles(canvas, context, points);
|
157
|
+
}
|
158
|
+
|
159
|
+
function redrawAllCircles(canvas, context, points) {
|
160
|
+
var tmpData = [];
|
161
|
+
context.clearRect(0, 0, canvas.width, canvas.height);
|
162
|
+
for (i = 0; i < points.length; i++) {
|
163
|
+
context.fillStyle = points[i].color;
|
164
|
+
context.fill(points[i], 'nonzero');
|
165
|
+
context.stroke(points[i], 'nonzero');
|
166
|
+
|
167
|
+
tmpData.push([
|
168
|
+
points[i].database_id,
|
169
|
+
points[i].x,
|
170
|
+
points[i].y,
|
171
|
+
points[i].color
|
172
|
+
]);
|
173
|
+
}
|
174
|
+
find_data_field(canvas).dataset.initialData = JSON.stringify(tmpData);
|
175
|
+
}
|
176
|
+
|
177
|
+
function handle_data_table(data_fields, canvas, context, points) {
|
178
|
+
var tableRows = document.getElementsByClassName('request_row');
|
179
|
+
var markRequestRow = function() {
|
180
|
+
for (var i = 0; i < tableRows.length; i++) {
|
181
|
+
tableRows[i].classList.remove('active');
|
182
|
+
}
|
183
|
+
for (var i = 0; i < data_fields.length; i++) {
|
184
|
+
data_fields[i].classList.remove('active');
|
185
|
+
}
|
186
|
+
this.classList.add('active');
|
187
|
+
this.getElementsByClassName('canvas_data_field')[0].classList.add('active');
|
188
|
+
refreshAll(canvas, context, points, event);
|
189
|
+
};
|
190
|
+
|
191
|
+
for (var i = 0; i < tableRows.length; i++) {
|
192
|
+
tableRows[i].addEventListener('click', markRequestRow, false);
|
193
|
+
}
|
194
|
+
}
|
195
|
+
|
196
|
+
var start_with_canvas_fields = function() {
|
197
|
+
var canvas_fields = document.getElementsByClassName('canvas_field');
|
198
|
+
var ro_canvas_fields = document.getElementsByClassName('ro_canvas_field');
|
3
199
|
var data_fields = document.getElementsByClassName('canvas_data_field');
|
4
|
-
if (
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
param = canvas.dataset.strongParam,
|
15
|
-
token = canvas.dataset.token,
|
16
|
-
points = [];
|
17
|
-
|
18
|
-
function refreshAll(e) {
|
19
|
-
points = [];
|
20
|
-
initCircles();
|
21
|
-
}
|
22
|
-
|
23
|
-
function initCircles() {
|
24
|
-
var data_field = document.getElementsByClassName('active canvas_data_field')[0].dataset;
|
25
|
-
var initialData = JSON.parse(data_field.initialData);
|
26
|
-
for (i = 0; i < initialData.length; i++) {
|
27
|
-
var point = buildCircle(initialData[i][1], initialData[i][2], initialData[i][3]);
|
28
|
-
point.database_id = initialData[i][0];
|
29
|
-
points.push(point);
|
30
|
-
}
|
31
|
-
redrawAllCircles();
|
32
|
-
}
|
33
|
-
|
34
|
-
function isPixelCollision(e) {
|
35
|
-
e.preventDefault();
|
36
|
-
|
37
|
-
if (e.type == "contextmenu") return;
|
38
|
-
|
39
|
-
var r = canvas.getBoundingClientRect(),
|
40
|
-
x = e.clientX - r.left,
|
41
|
-
y = e.clientY - r.top,
|
42
|
-
removed = false,
|
43
|
-
i;
|
44
|
-
|
45
|
-
for (i = points.length - 1; i >= 0; --i) {
|
46
|
-
if (context.isPointInPath(points[i], x, y, 'nonzero')) {
|
47
|
-
deleteAjax(i);
|
48
|
-
removed = true;
|
49
|
-
}
|
50
|
-
}
|
51
|
-
|
52
|
-
if (removed == false) {
|
53
|
-
createAjax(x, y, e);
|
54
|
-
}
|
55
|
-
}
|
56
|
-
|
57
|
-
function buildCircle(x, y, e) {
|
58
|
-
var c = new Path2D(),
|
59
|
-
offset = 3.5;
|
60
|
-
|
61
|
-
c.arc(x - offset, y - offset, 7, 0, Math.PI * 2);
|
62
|
-
c.color = (typeof e === 'string') ? e : chooseColor(e)
|
63
|
-
c.x = x;
|
64
|
-
c.y = y;
|
65
|
-
return c;
|
66
|
-
}
|
67
|
-
|
68
|
-
function chooseColor(e) {
|
69
|
-
if (e === null) return '#ff0000';
|
70
|
-
switch (e.which) {
|
71
|
-
case 1:
|
72
|
-
return canvas.dataset.leftColor;
|
73
|
-
case 2:
|
74
|
-
return canvas.dataset.middleColor;
|
75
|
-
case 3:
|
76
|
-
return canvas.dataset.rightColor;
|
77
|
-
}
|
78
|
-
}
|
79
|
-
|
80
|
-
function chooseButton(e) {
|
81
|
-
if (e === null) return null;
|
82
|
-
switch (e.which) {
|
83
|
-
case 1:
|
84
|
-
return 'left';
|
85
|
-
case 2:
|
86
|
-
return 'middle';
|
87
|
-
case 3:
|
88
|
-
return 'right';
|
89
|
-
}
|
90
|
-
}
|
91
|
-
|
92
|
-
function deleteAjax(i) {
|
93
|
-
var id = points[i].database_id;
|
94
|
-
$.ajax({
|
95
|
-
type: 'DELETE',
|
96
|
-
url: url + '/' + id,
|
97
|
-
headers: {
|
98
|
-
'Authorization': 'Token token=' + token
|
99
|
-
},
|
100
|
-
dataType: "json",
|
101
|
-
success: function(data) {
|
102
|
-
removeCircle(i, data);
|
103
|
-
},
|
104
|
-
error: function(data) {
|
105
|
-
alert('No connection to Server');
|
106
|
-
}
|
107
|
-
});
|
108
|
-
}
|
109
|
-
|
110
|
-
function removeCircle(i, data) {
|
111
|
-
points.splice(i, 1);
|
112
|
-
redrawAllCircles();
|
113
|
-
}
|
114
|
-
|
115
|
-
function createAjax(x, y, e) {
|
116
|
-
post_data = collectPostData(x, y, e);
|
117
|
-
$.ajax({
|
118
|
-
type: 'POST',
|
119
|
-
url: url,
|
120
|
-
headers: {
|
121
|
-
'Authorization': 'Token token=' + token
|
122
|
-
},
|
123
|
-
data: post_data,
|
124
|
-
dataType: "json",
|
125
|
-
success: function(data) {
|
126
|
-
addCircle(x, y, data, e);
|
127
|
-
},
|
128
|
-
error: function(data) {
|
129
|
-
alert('No connection to Server');
|
130
|
-
}
|
131
|
-
});
|
132
|
-
}
|
133
|
-
|
134
|
-
function collectPostData(x, y, e) {
|
135
|
-
var params = {};
|
136
|
-
var data_field = document.getElementsByClassName('active canvas_data_field')[0].dataset;
|
137
|
-
var additionalData = JSON.parse(data_field.additionalData);
|
138
|
-
params[param] = {
|
139
|
-
x_value: x,
|
140
|
-
y_value: y,
|
141
|
-
button: chooseButton(e)
|
142
|
-
};
|
143
|
-
for (var attrname in additionalData) {
|
144
|
-
params[param][attrname] = additionalData[attrname];
|
145
|
-
}
|
146
|
-
return params;
|
147
|
-
}
|
148
|
-
|
149
|
-
function addCircle(x, y, data, e) {
|
150
|
-
new_point = buildCircle(x, y, e);
|
151
|
-
new_point['database_id'] = data.id;
|
152
|
-
points.push(new_point);
|
153
|
-
redrawAllCircles();
|
154
|
-
}
|
155
|
-
|
156
|
-
function redrawAllCircles() {
|
157
|
-
var tmpData = [];
|
158
|
-
context.clearRect(0, 0, canvas.width, canvas.height);
|
159
|
-
for (i = 0; i < points.length; i++) {
|
160
|
-
context.fillStyle = points[i].color;
|
161
|
-
context.fill(points[i], 'nonzero');
|
162
|
-
context.stroke(points[i], 'nonzero');
|
163
|
-
|
164
|
-
tmpData.push([points[i].database_id, points[i].x, points[i].y, points[i].color]);
|
165
|
-
}
|
166
|
-
document.getElementsByClassName('active canvas_data_field')[0].dataset.initialData = JSON.stringify(tmpData);
|
167
|
-
}
|
168
|
-
|
169
|
-
if (canvas.dataset.leftActive == 'true') {
|
170
|
-
canvas.addEventListener('click', isPixelCollision, false);
|
171
|
-
}
|
172
|
-
if (canvas.dataset.middleActive == 'true') {
|
173
|
-
canvas.addEventListener('auxclick', isPixelCollision, false);
|
174
|
-
}
|
175
|
-
if (canvas.dataset.rightActive == 'true') {
|
176
|
-
canvas.addEventListener('contextmenu', isPixelCollision, false);
|
177
|
-
}
|
178
|
-
initCircles();
|
179
|
-
|
180
|
-
var tableRows = document.getElementsByClassName('request_row');
|
181
|
-
var markRequestRow = function() {
|
182
|
-
for (var i = 0; i < tableRows.length; i++) {
|
183
|
-
tableRows[i].classList.remove('active');
|
184
|
-
}
|
185
|
-
for (var i = 0; i < data_fields.length; i++) {
|
186
|
-
data_fields[i].classList.remove('active');
|
187
|
-
}
|
188
|
-
this.classList.add('active');
|
189
|
-
this.getElementsByClassName('canvas_data_field')[0].classList.add('active');
|
190
|
-
refreshAll();
|
191
|
-
};
|
192
|
-
|
193
|
-
for (var i = 0; i < tableRows.length; i++) {
|
194
|
-
tableRows[i].addEventListener('click', markRequestRow, false);
|
195
|
-
}
|
200
|
+
if (canvas_fields.length == 0 && ro_canvas_fields.length == 0) {
|
201
|
+
return;
|
202
|
+
}
|
203
|
+
if (data_fields.length == 0) {
|
204
|
+
console.log('No Data Field found. Please add canvas_data_field in your code!');
|
205
|
+
for (o = 0; o < canvas_table.length; o++) {
|
206
|
+
document.getElementsByClassName('canvas_table')[o].style.display = 'none';
|
207
|
+
}
|
208
|
+
for (o = 0; o < canvas_fields.length; o++) {
|
209
|
+
document.getElementsByClassName('canvas_fields')[o].style.display = 'none';
|
196
210
|
}
|
211
|
+
for (o = 0; o < ro_canvas_fields.length; o++) {
|
212
|
+
document.getElementsByClassName('ro_canvas_fields')[o].style.display = 'none';
|
213
|
+
}
|
214
|
+
return;
|
197
215
|
}
|
198
|
-
|
216
|
+
|
217
|
+
for (o = 0; o < canvas_fields.length; o++) {
|
218
|
+
var canvas = canvas_fields[o];
|
219
|
+
canvas.width = canvas.dataset.width;
|
220
|
+
canvas.height = canvas.dataset.height;
|
221
|
+
var context = canvas.getContext('2d');
|
222
|
+
var points = [];
|
223
|
+
if (canvas.dataset.leftActive == 'true') {
|
224
|
+
canvas.addEventListener('click', function() {
|
225
|
+
isPixelCollision(this, event)
|
226
|
+
}, false);
|
227
|
+
}
|
228
|
+
if (canvas.dataset.middleActive == 'true') {
|
229
|
+
canvas.addEventListener('auxclick', function() {
|
230
|
+
isPixelCollision(this, event)
|
231
|
+
}, false);
|
232
|
+
}
|
233
|
+
if (canvas.dataset.rightActive == 'true') {
|
234
|
+
canvas.addEventListener('contextmenu', function() {
|
235
|
+
isPixelCollision(this, event)
|
236
|
+
}, false);
|
237
|
+
}
|
238
|
+
initCircles(canvas, context, points);
|
239
|
+
|
240
|
+
handle_data_table(data_fields, canvas, context, points);
|
241
|
+
}
|
242
|
+
|
243
|
+
for (o = 0; o < ro_canvas_fields.length; o++) {
|
244
|
+
var canvas = ro_canvas_fields[o];
|
245
|
+
canvas.width = canvas.dataset.width;
|
246
|
+
canvas.height = canvas.dataset.height;
|
247
|
+
var context = canvas.getContext('2d');
|
248
|
+
var points = [];
|
249
|
+
initCircles(canvas, context, points);
|
250
|
+
|
251
|
+
handle_data_table(data_fields, canvas, context, points);
|
252
|
+
}
|
253
|
+
};
|
254
|
+
|
255
|
+
if (document.readyState === "complete" || (document.readyState !== "loading" && !document.documentElement.doScroll)) {
|
256
|
+
start_with_canvas_fields();
|
257
|
+
} else {
|
258
|
+
document.addEventListener("DOMContentLoaded", start_with_canvas_fields);
|
259
|
+
}
|
@@ -10,15 +10,15 @@ module CanvasFieldHelper
|
|
10
10
|
background_url = options[:background_url].blank? ? '' : "url(#{options[:background_url]})"
|
11
11
|
background = "background: #fff #{background_url} no-repeat center top"
|
12
12
|
failure_message = 'Your browser does not support the canvas element.'
|
13
|
-
|
14
|
-
content_tag :canvas, failure_message,
|
13
|
+
additional_classes = options[:class] || ''
|
14
|
+
content_tag :canvas, failure_message, class: "#{additional_classes} canvas_field", id: options[:id],
|
15
|
+
data: collect_data(url, options), style: background
|
15
16
|
end
|
16
17
|
|
17
18
|
def canvas_data_field(active = false, options = {})
|
18
19
|
klass = active ? 'active' : ''
|
19
|
-
data = { additional_data: options[:additional_data].to_json,
|
20
|
-
|
21
|
-
content: options[:content] || '' }
|
20
|
+
data = { additional_data: options[:additional_data].to_json, initial_data: options[:initial_data].to_json,
|
21
|
+
content: options[:content] || '', for: options[:for] }
|
22
22
|
content_tag(:span, '', class: "#{klass} canvas_data_field", data: data)
|
23
23
|
end
|
24
24
|
|
@@ -43,8 +43,10 @@ module CanvasFieldHelper
|
|
43
43
|
background += "; background-size: #{data[:width]}px #{data[:height]}px"
|
44
44
|
end
|
45
45
|
failure_message = 'Your browser does not support the canvas element.'
|
46
|
+
additional_classes = options[:class] || ''
|
46
47
|
|
47
|
-
content_tag :canvas, failure_message,
|
48
|
+
content_tag :canvas, failure_message, class: "#{additional_classes} ro_canvas_field",
|
49
|
+
id: options[:id], data: data, style: background
|
48
50
|
end
|
49
51
|
|
50
52
|
private
|
@@ -22,7 +22,7 @@ module AjaxCanvasField
|
|
22
22
|
# Configure through yaml file
|
23
23
|
def self.configure_with(path_to_yaml_file)
|
24
24
|
begin
|
25
|
-
config = YAML.
|
25
|
+
config = YAML.load(IO.read(path_to_yaml_file))
|
26
26
|
rescue Errno::ENOENT
|
27
27
|
log(:warning, "YAML configuration file couldn't be found. Using defaults."); return
|
28
28
|
rescue Psych::SyntaxError
|
@@ -1,11 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module AjaxCanvasField #:nodoc:
|
2
4
|
module Rails #:nodoc:
|
3
5
|
class Engine < ::Rails::Engine
|
4
6
|
initializer 'ajax_canvas_field.assets.precompile' do |app|
|
5
|
-
%w
|
7
|
+
%w[stylesheets javascripts images].each do |sub|
|
6
8
|
app.config.assets.paths << root.join('app/assets', sub).to_s
|
7
9
|
end
|
8
|
-
app.config.assets.precompile += %w
|
10
|
+
app.config.assets.precompile += %w[mouse_left.png mouse_right.png mouse_middle.png]
|
9
11
|
end
|
10
12
|
end
|
11
13
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ajax_canvas_field
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- datyv
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -53,7 +53,6 @@ files:
|
|
53
53
|
- app/assets/images/mouse_middle.png
|
54
54
|
- app/assets/images/mouse_right.png
|
55
55
|
- app/assets/javascripts/ajax_canvas_field.js
|
56
|
-
- app/assets/javascripts/ro_canvas_field.js
|
57
56
|
- app/assets/stylesheets/ajax_canvas_field.css
|
58
57
|
- app/helpers/canvas_field_helper.rb
|
59
58
|
- app/views/ajax_canvas_field/_canvas_legend.html.haml
|
@@ -86,7 +85,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
86
85
|
version: '0'
|
87
86
|
requirements: []
|
88
87
|
rubyforge_project:
|
89
|
-
rubygems_version: 2.
|
88
|
+
rubygems_version: 2.6.13
|
90
89
|
signing_key:
|
91
90
|
specification_version: 4
|
92
91
|
summary: HTML5 CanvasField Support
|
@@ -1,42 +0,0 @@
|
|
1
|
-
var canvases = document.getElementsByClassName('canvas_field');
|
2
|
-
if (canvases) {
|
3
|
-
for (o = 0; o < canvases.length; o++) {
|
4
|
-
var canvas = canvases[o];
|
5
|
-
canvas.width = canvas.dataset.width;
|
6
|
-
canvas.height = canvas.dataset.height;
|
7
|
-
var context = canvas.getContext('2d');
|
8
|
-
var points = [];
|
9
|
-
|
10
|
-
function initCircles() {
|
11
|
-
var initialData = JSON.parse(canvas.dataset.initialData);
|
12
|
-
for (i = 0; i < initialData.length; i++) {
|
13
|
-
var point = buildCircle(initialData[i][1], initialData[i][2], initialData[i][3]);
|
14
|
-
point.database_id = initialData[i][0];
|
15
|
-
points.push(point);
|
16
|
-
}
|
17
|
-
redrawAllCircles();
|
18
|
-
}
|
19
|
-
|
20
|
-
function buildCircle(x, y, e) {
|
21
|
-
var c = new Path2D(),
|
22
|
-
offset = 3.5;
|
23
|
-
|
24
|
-
c.arc(x - offset, y - offset, 7, 0, Math.PI * 2);
|
25
|
-
c.color = (typeof e === 'string') ? e : '#ff0000'
|
26
|
-
c.x = x;
|
27
|
-
c.y = y;
|
28
|
-
return c;
|
29
|
-
}
|
30
|
-
|
31
|
-
function redrawAllCircles() {
|
32
|
-
context.clearRect(0, 0, canvas.width, canvas.height);
|
33
|
-
for (i = 0; i < points.length; i++) {
|
34
|
-
context.fillStyle = points[i].color;
|
35
|
-
context.fill(points[i], 'nonzero');
|
36
|
-
context.stroke(points[i], 'nonzero');
|
37
|
-
}
|
38
|
-
}
|
39
|
-
|
40
|
-
initCircles();
|
41
|
-
}
|
42
|
-
}
|