hooch 0.15.6 → 0.15.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/hooch.js +459 -136
- data/lib/hooch/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 87757569afc7bb198b6efc6b978d20daef57ac0c
|
4
|
+
data.tar.gz: f0ec8d00e72bda10a5b187abaae1f6a623c322f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b800b1996173ea410579738ed930dcf6e10bb52df0ef4137f01841e2148189f7e2aaa5edaded71ec2823838bff83deead01e6ab9895f366f529493567180b15b
|
7
|
+
data.tar.gz: b4a73b4bf2876908ad4e906b912c29dc0d1510dc96fa59208da19b5fa8f61b59ae8c36a85488763f1afb02a777e2a50d110cbba8d42a2c1af2e88b2211a792ea
|
@@ -1,3 +1,37 @@
|
|
1
|
+
Set.prototype.isSuperset = function(subset) {
|
2
|
+
for (var elem of subset) {
|
3
|
+
if (!this.has(elem)) {
|
4
|
+
return false;
|
5
|
+
}
|
6
|
+
}
|
7
|
+
return true;
|
8
|
+
}
|
9
|
+
|
10
|
+
Set.prototype.union = function(setB) {
|
11
|
+
var union = new Set(this);
|
12
|
+
for (var elem of setB) {
|
13
|
+
union.add(elem);
|
14
|
+
}
|
15
|
+
return union;
|
16
|
+
}
|
17
|
+
|
18
|
+
Set.prototype.intersection = function(setB) {
|
19
|
+
var intersection = new Set();
|
20
|
+
for (var elem of setB) {
|
21
|
+
if (this.has(elem)) {
|
22
|
+
intersection.add(elem);
|
23
|
+
}
|
24
|
+
}
|
25
|
+
return intersection;
|
26
|
+
}
|
27
|
+
|
28
|
+
Set.prototype.difference = function(setB) {
|
29
|
+
var difference = new Set(this);
|
30
|
+
for (var elem of setB) {
|
31
|
+
difference.delete(elem);
|
32
|
+
}
|
33
|
+
return difference;
|
34
|
+
}
|
1
35
|
var initHooch = function(){
|
2
36
|
hooch = {
|
3
37
|
Emptier: Class.extend({
|
@@ -851,6 +885,13 @@ var initHooch = function(){
|
|
851
885
|
window.location.href = reload_page;
|
852
886
|
}
|
853
887
|
}),
|
888
|
+
PageReloader: Class.extend({
|
889
|
+
init: function($reloader){
|
890
|
+
$reloader.on('click', function(){
|
891
|
+
window.location.reload(true)
|
892
|
+
})
|
893
|
+
}
|
894
|
+
}),
|
854
895
|
FakeCheckbox: Class.extend({
|
855
896
|
init: function($fake_checkbox){
|
856
897
|
this.$fake_checkbox = $fake_checkbox
|
@@ -1005,88 +1046,88 @@ var initHooch = function(){
|
|
1005
1046
|
Sorter: Class.extend({
|
1006
1047
|
init: function($sorter){
|
1007
1048
|
this.$sorter = $sorter
|
1049
|
+
this.$jq_obj = $sorter
|
1008
1050
|
$sorter.data('sorter',this)
|
1051
|
+
var new_uuid = new UUID
|
1052
|
+
this.uniq_id = new_uuid.value
|
1053
|
+
this.created_at = new Date()
|
1009
1054
|
this.is_visible = $sorter.is(':visible')
|
1010
1055
|
if(this.is_visible){
|
1011
|
-
this.setWidth()
|
1056
|
+
this.setWidth()
|
1057
|
+
this.setBoundaries()
|
1012
1058
|
this.getSortElements()
|
1013
1059
|
}
|
1060
|
+
this.startInactivityRefresh()
|
1014
1061
|
var sorter = this
|
1015
|
-
$(window).on('mouseup', function(e){
|
1016
|
-
sorter.onMouseup()
|
1062
|
+
$(window).on('mouseup touchend touchcancel', function(e){
|
1063
|
+
sorter.onMouseup(e)
|
1017
1064
|
});
|
1018
|
-
$
|
1019
|
-
sorter.
|
1065
|
+
$sorter.on('scroll', function(){
|
1066
|
+
sorter.handleScroll()
|
1067
|
+
})
|
1068
|
+
$sorter.parents().on('scroll', function(){
|
1069
|
+
sorter.handleScroll()
|
1020
1070
|
})
|
1021
1071
|
var observer = new MutationObserver(function(mutations) {
|
1022
|
-
sorter.
|
1072
|
+
sorter.onMutation(mutations)
|
1023
1073
|
});
|
1024
|
-
var config = { childList: true, subtree: true, attributes: true }
|
1074
|
+
var config = { childList: true, subtree: true, attributes: true }
|
1025
1075
|
observer.observe($sorter[0], config);
|
1026
1076
|
},
|
1027
|
-
|
1028
|
-
if(this.
|
1029
|
-
|
1077
|
+
usePolymorphicId: function(){
|
1078
|
+
if(this.$sorter.data('polymorphic-id')){
|
1079
|
+
return true
|
1030
1080
|
} else {
|
1031
|
-
|
1032
|
-
if(pressed_element){
|
1033
|
-
pressed_element.setDragging()
|
1034
|
-
this.handleMouseMove(e)
|
1035
|
-
}
|
1036
|
-
}
|
1037
|
-
return true
|
1038
|
-
},
|
1039
|
-
handleMouseMove: function(e){
|
1040
|
-
hooch.pauseEvent(e)
|
1041
|
-
this.dragging_element.dragging = true
|
1042
|
-
this.redrawDraggingElement(e);
|
1043
|
-
this.refreshSequence(e)
|
1044
|
-
return false
|
1045
|
-
},
|
1046
|
-
onMouseup: function(){
|
1047
|
-
if(this.dragging_element){
|
1048
|
-
var tmp_dragging_element = this.dragging_element
|
1049
|
-
this.removeDraggingElement()
|
1050
|
-
if(tmp_dragging_element.dragging){
|
1051
|
-
this.sendSort()
|
1052
|
-
}
|
1053
|
-
tmp_dragging_element.dragging = false
|
1054
|
-
}
|
1055
|
-
var pressed_element = this.getPressedElement()
|
1056
|
-
if(pressed_element){
|
1057
|
-
pressed_element.unSetPressed()
|
1081
|
+
return false
|
1058
1082
|
}
|
1059
|
-
var sorter = this
|
1060
|
-
setTimeout(function(){
|
1061
|
-
if(!sorter.is_visible){
|
1062
|
-
if(sorter.$sorter.is(':visible')){
|
1063
|
-
sorter.setWidth();
|
1064
|
-
sorter.getSortElements();
|
1065
|
-
}
|
1066
|
-
}
|
1067
|
-
},1000)
|
1068
1083
|
},
|
1069
1084
|
setWidth: function(){
|
1070
|
-
this.width = this.$sorter.
|
1085
|
+
this.width = this.$sorter[0].getBoundingClientRect().width
|
1071
1086
|
this.$sorter.css({width: this.width})
|
1072
1087
|
},
|
1073
|
-
|
1088
|
+
onMutation: function(mutations){
|
1089
|
+
if(this.disabled) return
|
1074
1090
|
var sorter = this;
|
1075
1091
|
mutations.forEach(function(mutation) {
|
1076
1092
|
if(mutation.addedNodes.length > 0){
|
1077
1093
|
var added_node = $(mutation.addedNodes[0])
|
1078
1094
|
if((!added_node.attr('id') || !added_node.attr('id').startsWith('thin_man_ajax_progress')) && !added_node.data('hooch-sorter-managed')){
|
1079
1095
|
sorter.getSortElements()
|
1096
|
+
sorter.setBoundaries()
|
1080
1097
|
}
|
1081
1098
|
}
|
1082
1099
|
if(mutation.removedNodes.length > 0){
|
1083
1100
|
var removed_node = $(mutation.removedNodes[0])
|
1084
1101
|
if((!removed_node.attr('id') || !removed_node.attr('id').startsWith('thin_man_ajax_progress')) && !removed_node.data('hooch-sorter-managed')){
|
1085
1102
|
sorter.getSortElements()
|
1103
|
+
sorter.setBoundaries()
|
1086
1104
|
}
|
1087
1105
|
}
|
1088
1106
|
});
|
1089
1107
|
},
|
1108
|
+
onMouseup: function(e){ // If some user action caused a sorter to become visible, set things up
|
1109
|
+
if(this.disabled) return
|
1110
|
+
var sorter = this
|
1111
|
+
setTimeout(function(){
|
1112
|
+
if(!sorter.is_visible){
|
1113
|
+
if(sorter.$sorter.is(':visible')){
|
1114
|
+
sorter.is_visible = true
|
1115
|
+
sorter.setWidth();
|
1116
|
+
sorter.getSortElements();
|
1117
|
+
}
|
1118
|
+
}
|
1119
|
+
},1000)
|
1120
|
+
},
|
1121
|
+
handleScroll: function(){
|
1122
|
+
var sorter = this
|
1123
|
+
if(this.scroll_finished){
|
1124
|
+
clearTimeout(this.scroll_finished);
|
1125
|
+
}
|
1126
|
+
this.scroll_finished = setTimeout(function(){
|
1127
|
+
sorter.setBoundaries()
|
1128
|
+
sorter.refreshGrid()
|
1129
|
+
}, 100);
|
1130
|
+
},
|
1090
1131
|
getPressedElement: function(){
|
1091
1132
|
if(this.sort_elements){
|
1092
1133
|
var possible_pressed_element = $.grep(this.sort_elements, function(sort_element,i){return sort_element.pressed})
|
@@ -1101,7 +1142,16 @@ var initHooch = function(){
|
|
1101
1142
|
this.sort_elements = []
|
1102
1143
|
var sorter = this;
|
1103
1144
|
this.$sort_elements.each(function(){
|
1104
|
-
|
1145
|
+
if($(this).data('hooch.SortElement')){
|
1146
|
+
tmp_sort_element = $(this).data('hooch.SortElement')
|
1147
|
+
// if(tmp_sort_element.is_placeholder){
|
1148
|
+
// var sort_element = tmp_sort_element.sort_element
|
1149
|
+
// } else {
|
1150
|
+
var sort_element = tmp_sort_element
|
1151
|
+
// }
|
1152
|
+
} else {
|
1153
|
+
var sort_element = new hooch.SortElement($(this),sorter)
|
1154
|
+
}
|
1105
1155
|
sorter.sort_elements.push(sort_element)
|
1106
1156
|
})
|
1107
1157
|
if(this.sort_elements.length > 0){
|
@@ -1114,34 +1164,68 @@ var initHooch = function(){
|
|
1114
1164
|
} else {
|
1115
1165
|
this.mode = 'Vertical'
|
1116
1166
|
}
|
1167
|
+
} else if(this.height > 0){
|
1168
|
+
this.min_elem_width = this.width;
|
1169
|
+
this.refreshGrid();
|
1170
|
+
this.mode = 'Vertical'
|
1117
1171
|
}
|
1118
1172
|
},
|
1173
|
+
setBoundaries: function(){
|
1174
|
+
this.offset = this.$sorter[0].getBoundingClientRect()
|
1175
|
+
this.top_boundary = this.offset.top + window.pageYOffset
|
1176
|
+
this.left_boundary = this.offset.left + window.pageXOffset
|
1177
|
+
this.right_boundary = this.left_boundary + this.width
|
1178
|
+
this.height = this.$sorter[0].getBoundingClientRect().height
|
1179
|
+
this.bottom_boundary = this.top_boundary + this.height
|
1180
|
+
},
|
1181
|
+
handleDrag: function(){
|
1182
|
+
this.refreshSequence()
|
1183
|
+
this.refreshGrid()
|
1184
|
+
},
|
1119
1185
|
refreshGrid: function(){
|
1120
1186
|
this.rows = {}
|
1121
1187
|
var sorter = this
|
1122
1188
|
$.each(this.sort_elements,function(i,sort_element){
|
1189
|
+
let this_element
|
1123
1190
|
if(sort_element != sorter.dragging_element){
|
1124
1191
|
this_element = sort_element
|
1125
1192
|
} else {
|
1126
1193
|
this_element = sort_element.placeholder
|
1127
1194
|
}
|
1128
|
-
|
1129
|
-
|
1130
|
-
sorter.rows[elem_top]
|
1195
|
+
if(this_element){
|
1196
|
+
var elem_top = this_element.getOffset().top;
|
1197
|
+
if(!sorter.rows[elem_top]){
|
1198
|
+
sorter.rows[elem_top] = []
|
1199
|
+
}
|
1200
|
+
sorter.rows[elem_top].push(this_element)
|
1131
1201
|
}
|
1132
|
-
sorter.rows[elem_top].push(this_element)
|
1133
1202
|
})
|
1134
1203
|
this.row_keys = Object.keys(this.rows).map(function(val,i){return parseFloat(val)}).sort(sorter.numberSort)
|
1135
|
-
|
1204
|
+
if('Horizontal' == this.mode){
|
1205
|
+
$.each(this.rows, function(row_key,row){row.sort(sorter.elementHorizontalSort)})
|
1206
|
+
}
|
1136
1207
|
},
|
1137
|
-
|
1138
|
-
this.dragging_element
|
1208
|
+
draggingElementForGrid: function(){
|
1209
|
+
if(this.dragging_element){
|
1210
|
+
if(this.dragging_element.dragging){
|
1211
|
+
return this.dragging_element.placeholder
|
1212
|
+
} else {
|
1213
|
+
return this.dragging_element
|
1214
|
+
}
|
1215
|
+
}
|
1216
|
+
return nil
|
1139
1217
|
},
|
1140
1218
|
refreshSequence: function(){
|
1141
1219
|
var target_location = this.dragging_element.getCenter()
|
1142
1220
|
var refresh_method = this['refreshSequence' + this.mode]
|
1143
1221
|
refresh_method.call(this, target_location)
|
1144
1222
|
},
|
1223
|
+
insertDraggingElement: function(element,e){
|
1224
|
+
this.dragging_element = element
|
1225
|
+
this.refreshSequence()
|
1226
|
+
this.getSortElements()
|
1227
|
+
this.refreshGrid()
|
1228
|
+
},
|
1145
1229
|
refreshSequenceGrid: function(target_location){
|
1146
1230
|
var dragging_element = this.dragging_element
|
1147
1231
|
if(!this.withinCurrentRow(target_location.y)){
|
@@ -1151,13 +1235,11 @@ var initHooch = function(){
|
|
1151
1235
|
var last_element = this.getLastElement();
|
1152
1236
|
if(!last_element.is_placeholder){
|
1153
1237
|
last_element.$sort_element.after(dragging_element.placeholder.$sort_element)
|
1154
|
-
this.refreshGrid()
|
1155
1238
|
}
|
1156
1239
|
} else if('begin' == this.current_row_key){
|
1157
1240
|
var first_element = this.getFirstElement();
|
1158
1241
|
if(!first_element.is_placeholder){
|
1159
1242
|
first_element.$sort_element.before(dragging_element.placeholder.$sort_element)
|
1160
|
-
this.refreshGrid()
|
1161
1243
|
}
|
1162
1244
|
} else {
|
1163
1245
|
var hovered_element = this.getHoveredElementHorizontal(target_location);
|
@@ -1165,10 +1247,8 @@ var initHooch = function(){
|
|
1165
1247
|
if('leftmost' == hovered_element){
|
1166
1248
|
var leftmost_element = this.current_row[0]
|
1167
1249
|
leftmost_element.$sort_element.before(dragging_element.placeholder.$sort_element)
|
1168
|
-
this.refreshGrid()
|
1169
1250
|
} else {
|
1170
1251
|
hovered_element.$sort_element.after(dragging_element.placeholder.$sort_element);
|
1171
|
-
this.refreshGrid()
|
1172
1252
|
}
|
1173
1253
|
}
|
1174
1254
|
}
|
@@ -1176,16 +1256,15 @@ var initHooch = function(){
|
|
1176
1256
|
refreshSequenceVertical: function(target_location){
|
1177
1257
|
var dragging_element = this.dragging_element
|
1178
1258
|
var hovered_element = this.getHoveredElementVertical(target_location)
|
1179
|
-
|
1180
1259
|
if(hovered_element){
|
1181
1260
|
if('first' == hovered_element){
|
1182
1261
|
var first_key = this.row_keys[0]
|
1183
1262
|
var first_element = this.rows[first_key][0]
|
1184
1263
|
first_element.$sort_element.before(dragging_element.placeholder.$sort_element)
|
1185
|
-
|
1264
|
+
} else if('empty' == hovered_element){
|
1265
|
+
this.$sorter.html(dragging_element.placeholder.$sort_element)
|
1186
1266
|
} else {
|
1187
1267
|
hovered_element.$sort_element.after(dragging_element.placeholder.$sort_element)
|
1188
|
-
this.refreshGrid()
|
1189
1268
|
}
|
1190
1269
|
}
|
1191
1270
|
},
|
@@ -1251,37 +1330,41 @@ var initHooch = function(){
|
|
1251
1330
|
}
|
1252
1331
|
},
|
1253
1332
|
getHoveredElementVertical: function(target_location){
|
1254
|
-
|
1255
|
-
|
1256
|
-
|
1257
|
-
|
1258
|
-
|
1259
|
-
var
|
1260
|
-
|
1261
|
-
|
1262
|
-
|
1263
|
-
|
1264
|
-
|
1265
|
-
|
1266
|
-
|
1267
|
-
|
1268
|
-
|
1333
|
+
if(this.$sort_elements.length == 0){
|
1334
|
+
return 'empty'
|
1335
|
+
} else {
|
1336
|
+
var sorter = this
|
1337
|
+
current_element_key = $.grep(sorter.row_keys, function(row_key,i){
|
1338
|
+
var this_elem = sorter.rows[row_key][0]
|
1339
|
+
if(!this_elem.is_placeholder){
|
1340
|
+
var elem_center = this_elem.getCenter()
|
1341
|
+
var slot_top = elem_center.y
|
1342
|
+
var below_top_edge = target_location.y >= slot_top
|
1343
|
+
var next_row = sorter.rows[sorter.row_keys[i+1]]
|
1344
|
+
var above_bottom_edge
|
1345
|
+
var next_elem
|
1346
|
+
if(next_row){
|
1347
|
+
next_elem = next_row[0]
|
1348
|
+
if(next_elem && !next_elem.is_placeholder){
|
1349
|
+
var next_elem_center = next_elem.getCenter()
|
1350
|
+
above_bottom_edge = target_location.y < next_elem_center.y
|
1351
|
+
}
|
1352
|
+
}
|
1353
|
+
if(!next_elem){
|
1354
|
+
above_bottom_edge = below_top_edge
|
1269
1355
|
}
|
1356
|
+
return(below_top_edge && above_bottom_edge)
|
1270
1357
|
}
|
1271
|
-
|
1272
|
-
|
1358
|
+
return false
|
1359
|
+
})[0]
|
1360
|
+
if(current_element_key){
|
1361
|
+
return this.rows[current_element_key][0]
|
1362
|
+
} else {
|
1363
|
+
var first_key = this.row_keys[0]
|
1364
|
+
var first_elem = this.rows[first_key][0]
|
1365
|
+
if(first_elem && !first_elem.is_placeholder && first_elem.getCenter().y > target_location.y){
|
1366
|
+
return 'first'
|
1273
1367
|
}
|
1274
|
-
return(below_top_edge && above_bottom_edge)
|
1275
|
-
}
|
1276
|
-
return false
|
1277
|
-
})[0]
|
1278
|
-
if(current_element_key){
|
1279
|
-
return this.rows[current_element_key][0]
|
1280
|
-
} else {
|
1281
|
-
var first_key = this.row_keys[0]
|
1282
|
-
var first_elem = this.rows[first_key][0]
|
1283
|
-
if(first_elem && !first_elem.is_placeholder && first_elem.getCenter().y > target_location.y){
|
1284
|
-
return 'first'
|
1285
1368
|
}
|
1286
1369
|
}
|
1287
1370
|
},
|
@@ -1323,25 +1406,34 @@ var initHooch = function(){
|
|
1323
1406
|
},
|
1324
1407
|
setDraggingElement: function(sort_element){
|
1325
1408
|
this.dragging_element = sort_element;
|
1326
|
-
var current_row = this.rows[
|
1409
|
+
var current_row = this.rows[sort_element.starting_offset.top]
|
1327
1410
|
drag_index = current_row.indexOf(sort_element)
|
1328
1411
|
if(drag_index > -1){
|
1329
1412
|
current_row.splice(drag_index, 1)
|
1330
1413
|
}
|
1331
|
-
current_row.push(
|
1414
|
+
current_row.push(sort_element.placeholder)
|
1332
1415
|
this.refreshGrid();
|
1333
1416
|
},
|
1334
|
-
|
1335
|
-
|
1336
|
-
|
1337
|
-
|
1417
|
+
giveUpDraggingElement: function(){
|
1418
|
+
let sorter = this
|
1419
|
+
$.each(this.rows, function(row_key, row){
|
1420
|
+
let placeholder_index = sorter.rows[row_key].indexOf(sorter.dragging_element.placeholder)
|
1421
|
+
if(placeholder_index > -1){
|
1422
|
+
sorter.rows[row_key].splice(placeholder_index,1)
|
1423
|
+
}
|
1424
|
+
})
|
1425
|
+
delete this.dragging_element
|
1426
|
+
this.getSortElements()
|
1427
|
+
},
|
1428
|
+
dropDraggingElement: function(){
|
1429
|
+
this.reinsertDraggingElement()
|
1430
|
+
this.sendSort()
|
1338
1431
|
},
|
1339
|
-
|
1432
|
+
reinsertDraggingElement: function(){
|
1340
1433
|
if(this.dragging_element){
|
1341
|
-
|
1342
|
-
this.rows[placeholder_row].push(this.dragging_element)
|
1434
|
+
this.rows[this.placeholderRowKey()].push(this.dragging_element)
|
1343
1435
|
this.dragging_element.drop()
|
1344
|
-
this.dragging_element
|
1436
|
+
delete this.dragging_element
|
1345
1437
|
this.refreshGrid();
|
1346
1438
|
}
|
1347
1439
|
},
|
@@ -1354,13 +1446,17 @@ var initHooch = function(){
|
|
1354
1446
|
},
|
1355
1447
|
getFormData: function(){
|
1356
1448
|
var id_array = $.map(this.$sorter.children(),function(e,i){return $(e).attr('id')})
|
1357
|
-
var first_id = id_array[0]
|
1358
|
-
var last_underscore_location = first_id.lastIndexOf('_')
|
1359
|
-
var array_name = first_id.slice(0,last_underscore_location)
|
1360
1449
|
var form_data = {}
|
1361
|
-
|
1362
|
-
|
1363
|
-
}
|
1450
|
+
if(this.usePolymorphicId()){
|
1451
|
+
form_data['polymorphic_items'] = id_array
|
1452
|
+
} else {
|
1453
|
+
var first_id = id_array[0]
|
1454
|
+
var last_underscore_location = first_id.lastIndexOf('_')
|
1455
|
+
var array_name = first_id.slice(0,last_underscore_location)
|
1456
|
+
form_data[array_name] = id_array.map(function(id){
|
1457
|
+
return id.slice((last_underscore_location + 1))
|
1458
|
+
})
|
1459
|
+
}
|
1364
1460
|
if(this.$sorter.data('sort-field')){
|
1365
1461
|
form_data['sort_field'] = this.$sorter.data('sort-field')
|
1366
1462
|
}
|
@@ -1370,51 +1466,240 @@ var initHooch = function(){
|
|
1370
1466
|
}
|
1371
1467
|
return form_data
|
1372
1468
|
},
|
1373
|
-
|
1469
|
+
placeholderRowKey: function(){
|
1374
1470
|
var sorter = this
|
1375
1471
|
return $.grep(this.row_keys, function(row_key,i){
|
1376
1472
|
var placeholder_index = sorter.rows[row_key].indexOf(sorter.dragging_element.placeholder)
|
1377
1473
|
if(placeholder_index > -1){
|
1378
|
-
sorter.rows[row_key].
|
1474
|
+
sorter.rows[row_key].splice(placeholder_index,1)
|
1379
1475
|
return true
|
1380
1476
|
}
|
1381
1477
|
return false
|
1382
1478
|
})[0]
|
1479
|
+
},
|
1480
|
+
containsPoint: function(point){
|
1481
|
+
let contains_horizontal = this.left_boundary <= point.x && point.x <= this.right_boundary
|
1482
|
+
let contains_vertical = this.top_boundary <= point.y && point.y <= this.bottom_boundary
|
1483
|
+
return contains_horizontal && contains_vertical
|
1484
|
+
},
|
1485
|
+
matchesFilters: function(element_filters){
|
1486
|
+
let recipient_filters = this.$sorter.data('recipient-filters')
|
1487
|
+
if(typeof element_filters.any == 'object'){
|
1488
|
+
// At least one of these is required to match
|
1489
|
+
let any = true
|
1490
|
+
for(var key in element_filters.any){
|
1491
|
+
if(!recipient_filters.hasOwnProperty(key)){
|
1492
|
+
any = false
|
1493
|
+
break
|
1494
|
+
}
|
1495
|
+
let include_source = new Set(recipient_filters[key])
|
1496
|
+
let include_test = new Set(element_filters.any[key])
|
1497
|
+
if(include_source.intersection(include_test).size == 0){
|
1498
|
+
any = false
|
1499
|
+
break
|
1500
|
+
}
|
1501
|
+
}
|
1502
|
+
if(!any) return false
|
1503
|
+
}
|
1504
|
+
// All of these are required to match
|
1505
|
+
let all = true
|
1506
|
+
for(var key in element_filters.all){
|
1507
|
+
if(!recipient_filters.hasOwnProperty(key)){
|
1508
|
+
all = false
|
1509
|
+
break
|
1510
|
+
}
|
1511
|
+
let include_source = new Set(recipient_filters[key])
|
1512
|
+
let include_test = new Set(element_filters.all[key])
|
1513
|
+
if(!include_source.isSuperset(include_test)){
|
1514
|
+
all = false
|
1515
|
+
break
|
1516
|
+
}
|
1517
|
+
}
|
1518
|
+
if(!all) return false
|
1519
|
+
// None of these can be present to match
|
1520
|
+
var none = true
|
1521
|
+
for(var key in element_filters.none){
|
1522
|
+
if(!recipient_filters.hasOwnProperty(key)){continue}
|
1523
|
+
let exclude_source = new Set(recipient_filters[key])
|
1524
|
+
let exclude_test = new Set(element_filters.none[key])
|
1525
|
+
if(exclude_source.intersection(exclude_test).size != 0){
|
1526
|
+
none = false
|
1527
|
+
break
|
1528
|
+
}
|
1529
|
+
}
|
1530
|
+
if(!none) return false
|
1531
|
+
return true
|
1532
|
+
},
|
1533
|
+
maskMe: function(){
|
1534
|
+
this.mask = $('<div>')
|
1535
|
+
.css({position: 'absolute', 'z-index': 1000,
|
1536
|
+
'background-color': 'rgba(64,64,64,0.5)',
|
1537
|
+
top: this.top_boundary, left: this.left_boundary,
|
1538
|
+
width: this.width, height: this.height})
|
1539
|
+
$('body').append(this.mask)
|
1540
|
+
},
|
1541
|
+
unmaskMe: function(){
|
1542
|
+
if(this.mask) this.mask.remove()
|
1543
|
+
},
|
1544
|
+
startInactivityRefresh: function(){
|
1545
|
+
this.last_activity_time = new Date().getTime();
|
1546
|
+
var sorter = this
|
1547
|
+
$('body').on("mousemove keypress", function(e) {
|
1548
|
+
sorter.last_activity_time = new Date().getTime();
|
1549
|
+
});
|
1550
|
+
setTimeout(function(){sorter.inactivityRefresh()}, 6000);
|
1551
|
+
},
|
1552
|
+
inactivityRefresh: function() {
|
1553
|
+
var sorter = this
|
1554
|
+
if(new Date().getTime() - this.last_activity_time >= 1800000){
|
1555
|
+
var $reload_link = $('<a>').text('Reload Page')
|
1556
|
+
new hooch.PageReloader($reload_link)
|
1557
|
+
var $modal_content = $('<div>').html("You must reload the page after 30 minutes of inactivity. ")
|
1558
|
+
$modal_content.append($reload_link)
|
1559
|
+
var modal = new hooch.Modal($modal_content)
|
1560
|
+
modal.$dismisser.remove()
|
1561
|
+
delete modal.dismisser
|
1562
|
+
delete modal.$dismisser
|
1563
|
+
} else {
|
1564
|
+
setTimeout(function(){sorter.inactivityRefresh()}, 60000);
|
1565
|
+
}
|
1566
|
+
},
|
1567
|
+
disable: function(){
|
1568
|
+
this.disabled = true
|
1383
1569
|
}
|
1384
1570
|
}),
|
1385
1571
|
SortElement: Class.extend({
|
1386
1572
|
init: function($sort_element,sorter){
|
1387
|
-
this
|
1388
|
-
|
1389
|
-
this.
|
1390
|
-
this.
|
1391
|
-
this.
|
1392
|
-
|
1393
|
-
this
|
1394
|
-
$sort_element.
|
1573
|
+
this.$jq_obj = $sort_element
|
1574
|
+
var new_uuid = new UUID
|
1575
|
+
this.uniq_id = new_uuid.value
|
1576
|
+
this.created_at = new Date()
|
1577
|
+
if(sorter) this.sorter = sorter;
|
1578
|
+
$sort_element.data('hooch.SortElement', this)
|
1579
|
+
this.$sort_element = $sort_element;
|
1580
|
+
this.reusable = $sort_element.data('sort-reusable')
|
1395
1581
|
if(typeof(window.getComputedStyle) == 'function'){
|
1396
1582
|
var computed_style = window.getComputedStyle(this.$sort_element[0])
|
1397
|
-
|
1398
|
-
this.
|
1583
|
+
var current_offset = this.getOffset()
|
1584
|
+
this.width = current_offset.width
|
1585
|
+
this.height = current_offset.height
|
1586
|
+
this.background_color = computed_style.getPropertyValue('background-color')
|
1587
|
+
this.padding = computed_style.getPropertyValue('padding')
|
1588
|
+
this.float = computed_style.getPropertyValue('float')
|
1399
1589
|
}else{
|
1400
1590
|
this.width = this.$sort_element.width()
|
1401
1591
|
this.height = this.$sort_element.height()
|
1402
1592
|
}
|
1593
|
+
this.original_positioning =
|
1594
|
+
{ position: this.$sort_element.css('position'),
|
1595
|
+
top: this.$sort_element.css('top'),
|
1596
|
+
left: this.$sort_element.css('left'),
|
1597
|
+
width: this.width,
|
1598
|
+
height: this.height
|
1599
|
+
}
|
1600
|
+
$sort_element.css({width: this.width})
|
1403
1601
|
this.dragging = false
|
1404
1602
|
this.getDragHandle()
|
1405
1603
|
this.$sort_element.css({cursor: ''});
|
1406
1604
|
this.$drag_handle.css({cursor: 'move'});
|
1407
1605
|
var sort_element = this
|
1408
|
-
this.$drag_handle.on('mousedown', $.proxy(sort_element.onMousedown, sort_element))
|
1606
|
+
this.$drag_handle.on('mousedown touchstart', $.proxy(sort_element.onMousedown, sort_element))
|
1409
1607
|
this.$sort_element.on('dragstart', function(e){hooch.pauseEvent(e); return false})
|
1608
|
+
this.element_filters = this.getElementFilters() || {}
|
1609
|
+
$(window).on('mousemove touchmove', function(e){
|
1610
|
+
sort_element.onMousemove(e)
|
1611
|
+
})
|
1612
|
+
$(window).on('mouseup touchend touchcancel', function(e){
|
1613
|
+
sort_element.onMouseup(e)
|
1614
|
+
})
|
1410
1615
|
},
|
1411
1616
|
onMousedown: function(e){
|
1617
|
+
if(this.disabled) return
|
1618
|
+
hooch.pauseEvent(e)
|
1412
1619
|
if(1 == e.which){
|
1413
|
-
this.sorter.
|
1414
|
-
|
1415
|
-
|
1416
|
-
|
1620
|
+
if(!this.pressed && !this.dragging && (!this.sorter || !this.sorter.dragging_element)){
|
1621
|
+
this.pressed = true
|
1622
|
+
this.starting_offset = this.getOffset();
|
1623
|
+
this.mouse_start = {top: e.originalEvent.pageY, left: e.originalEvent.pageX}
|
1624
|
+
this.maskNonTargets()
|
1625
|
+
}
|
1626
|
+
}
|
1627
|
+
return false
|
1628
|
+
},
|
1629
|
+
onMousemove: function(e){
|
1630
|
+
if(this.disabled) return
|
1631
|
+
hooch.pauseEvent(e)
|
1632
|
+
if(this.pressed){this.setDragging()}
|
1633
|
+
if(this.dragging){
|
1634
|
+
var target_sorter = this.targetSorter(e)
|
1635
|
+
if(target_sorter){
|
1636
|
+
this.attachToSorter(target_sorter,e)
|
1637
|
+
} else if(this.sorter){
|
1638
|
+
this.sorter.handleDrag()
|
1639
|
+
}
|
1640
|
+
this.setPosition(e)
|
1417
1641
|
}
|
1642
|
+
return false
|
1643
|
+
},
|
1644
|
+
onMouseup: function(e){
|
1645
|
+
if(this.disabled) return
|
1646
|
+
if(this.pressed) this.unSetPressed()
|
1647
|
+
if(this.dragging) this.handleMouseUp()
|
1648
|
+
},
|
1649
|
+
handleMouseUp: function(){
|
1650
|
+
if(this.sorter){
|
1651
|
+
this.sorter.dropDraggingElement()
|
1652
|
+
} else {
|
1653
|
+
this.drop()
|
1654
|
+
}
|
1655
|
+
},
|
1656
|
+
currentSorters: function(){
|
1657
|
+
var sort_element = this
|
1658
|
+
return window.any_time_manager.recordedObjects['hooch.Sorter'].
|
1659
|
+
filter(function(sorter){return sorter != sort_element.sorter}) //Don't need the current parent
|
1660
|
+
},
|
1661
|
+
targetSorter: function(e){
|
1662
|
+
var current_sorters = this.currentSorters()
|
1663
|
+
if(current_sorters){
|
1664
|
+
var current_center = this.getCenter()
|
1665
|
+
var element_filters = this.element_filters
|
1666
|
+
return $.grep(current_sorters, function(sorter,i){
|
1667
|
+
return sorter.containsPoint(current_center) && sorter.matchesFilters(element_filters)
|
1668
|
+
})[0]
|
1669
|
+
}
|
1670
|
+
},
|
1671
|
+
maskNonTargets: function(){
|
1672
|
+
$.each(this.getNonTargets(), function(i,non_target_sorter){
|
1673
|
+
non_target_sorter.maskMe()
|
1674
|
+
})
|
1675
|
+
},
|
1676
|
+
unmaskNonTargets: function(){
|
1677
|
+
$.each(this.getNonTargets(), function(i,non_target_sorter){
|
1678
|
+
non_target_sorter.unmaskMe()
|
1679
|
+
})
|
1680
|
+
},
|
1681
|
+
getNonTargets: function(){
|
1682
|
+
var current_sorters = this.currentSorters()
|
1683
|
+
if(current_sorters){
|
1684
|
+
var element_filters = this.element_filters
|
1685
|
+
return $.grep(current_sorters, function(sorter,i){
|
1686
|
+
return !sorter.matchesFilters(element_filters)
|
1687
|
+
})
|
1688
|
+
}
|
1689
|
+
return []
|
1690
|
+
},
|
1691
|
+
attachToSorter: function(target_sorter,e){
|
1692
|
+
if(this.reusable){
|
1693
|
+
delete this.reusable
|
1694
|
+
} else {
|
1695
|
+
this.destroyPlaceHolder()
|
1696
|
+
}
|
1697
|
+
if(this.sorter){
|
1698
|
+
this.sorter.giveUpDraggingElement()
|
1699
|
+
}
|
1700
|
+
this.createPlaceHolder()
|
1701
|
+
this.sorter = target_sorter
|
1702
|
+
this.sorter.insertDraggingElement(this)
|
1418
1703
|
},
|
1419
1704
|
unSetPressed: function(){
|
1420
1705
|
this.pressed = false
|
@@ -1425,28 +1710,49 @@ var initHooch = function(){
|
|
1425
1710
|
this.$drag_handle = this.$sort_element
|
1426
1711
|
}
|
1427
1712
|
},
|
1713
|
+
createPlaceHolder: function(){
|
1714
|
+
var $placeholder = this.$sort_element.
|
1715
|
+
clone().
|
1716
|
+
removeAttr('id').
|
1717
|
+
removeAttr('data-sort-element').
|
1718
|
+
css(this.original_positioning)
|
1719
|
+
if(!this.reusable){ $placeholder.css({visibility: 'hidden'}) }
|
1720
|
+
if(this.sorter){ $placeholder.data('hooch-sorter-managed',true) }
|
1721
|
+
this.placeholder = new hooch.SortPlaceholder($placeholder,this)
|
1722
|
+
},
|
1723
|
+
destroyPlaceHolder: function(){
|
1724
|
+
this.placeholder.destroy()
|
1725
|
+
delete this.placeholder
|
1726
|
+
},
|
1428
1727
|
setDragging: function(){
|
1429
|
-
this.
|
1728
|
+
this.dragging = true
|
1430
1729
|
this.unSetPressed()
|
1431
|
-
this.
|
1432
|
-
this.placeholder.css({'visibility': 'hidden'});
|
1433
|
-
// this.placeholder.css({'background-color': 'pink'});
|
1730
|
+
this.createPlaceHolder()
|
1434
1731
|
$tmp = $('<div style="display: none;" data-hooch-sorter-managed="true"></div>')
|
1435
1732
|
this.$sort_element.before($tmp)
|
1436
1733
|
this.$sort_element
|
1437
|
-
.css({position: 'absolute', top: this.starting_offset.top, left: this.starting_offset.left, width: this.width, height: this.height})
|
1734
|
+
.css({position: 'absolute', top: this.starting_offset.top, left: this.starting_offset.left, width: this.width, height: this.height, backgroundColor: this.background_color, padding: this.padding, float: this.float})
|
1438
1735
|
.data('hooch-sorter-managed',true)
|
1439
1736
|
.appendTo('body')
|
1440
1737
|
$tmp.replaceWith(this.placeholder.$sort_element)
|
1441
|
-
this.sorter.setDraggingElement(this)
|
1738
|
+
if(this.sorter){this.sorter.setDraggingElement(this)}
|
1442
1739
|
},
|
1443
1740
|
drop: function(){
|
1444
|
-
this.
|
1741
|
+
this.dragging = false
|
1742
|
+
this.css(this.original_positioning).data('hooch-sorter-managed',true)
|
1445
1743
|
this.placeholder.replaceWith(this.$sort_element);
|
1446
|
-
this.placeholder
|
1744
|
+
delete this.placeholder
|
1745
|
+
this.unmaskNonTargets()
|
1746
|
+
},
|
1747
|
+
getElementFilters: function(){
|
1748
|
+
return this.$sort_element.data('target-filters')
|
1447
1749
|
},
|
1448
1750
|
getOffset: function(){
|
1449
|
-
|
1751
|
+
let viewport_offset = this.$sort_element[0].getBoundingClientRect()
|
1752
|
+
return {top: viewport_offset.top + window.pageYOffset,
|
1753
|
+
left: viewport_offset.left + window.pageXOffset,
|
1754
|
+
height: viewport_offset.height,
|
1755
|
+
width: viewport_offset.width}
|
1450
1756
|
},
|
1451
1757
|
setPosition: function(e){
|
1452
1758
|
var delta = this.getDelta(e)
|
@@ -1481,6 +1787,13 @@ var initHooch = function(){
|
|
1481
1787
|
},
|
1482
1788
|
replaceWith: function($jq_obj){
|
1483
1789
|
this.$sort_element.replaceWith($jq_obj)
|
1790
|
+
},
|
1791
|
+
disable: function(){
|
1792
|
+
this.disabled = true
|
1793
|
+
},
|
1794
|
+
destroy: function(){
|
1795
|
+
this.disable()
|
1796
|
+
this.$sort_element.remove()
|
1484
1797
|
}
|
1485
1798
|
}),
|
1486
1799
|
scroll_keys: {37: 1, 38: 1, 39: 1, 40: 1},
|
@@ -1627,8 +1940,12 @@ var initHooch = function(){
|
|
1627
1940
|
})
|
1628
1941
|
};
|
1629
1942
|
hooch.SortPlaceholder = hooch.SortElement.extend({
|
1630
|
-
init: function($sort_element,
|
1631
|
-
|
1943
|
+
init: function($sort_element,sort_element){
|
1944
|
+
var new_uuid = new UUID
|
1945
|
+
this.uniq_id = new_uuid.value
|
1946
|
+
$sort_element.data('hooch.SortElement', this)
|
1947
|
+
this.sort_element = sort_element
|
1948
|
+
this.sorter = sort_element.sorter;
|
1632
1949
|
this.is_placeholder = true;
|
1633
1950
|
this.$sort_element = $sort_element;
|
1634
1951
|
this.width = this.$sort_element.width()
|
@@ -1843,7 +2160,8 @@ var initHooch = function(){
|
|
1843
2160
|
['hover_overflow','hidey_button','hide-show','submit-proxy','click-proxy','field-filler','revealer',
|
1844
2161
|
'checkbox-hidden-proxy','prevent-double-submit','prevent-double-link-click', 'tab-group',
|
1845
2162
|
'hover-reveal', 'emptier', 'remover', 'checkbox-proxy', 'fake-checkbox', 'fake-select', 'select-action-changer',
|
1846
|
-
'sorter','bind-key','modal-trigger','history-pusher', 'history-replacer', 'link', 'atarget'
|
2163
|
+
'sorter', 'sort-element', 'bind-key','modal-trigger','history-pusher', 'history-replacer', 'link', 'atarget',
|
2164
|
+
'page-reloader'],'hooch');
|
1847
2165
|
window.any_time_manager.load();
|
1848
2166
|
};
|
1849
2167
|
hooch.pauseEvent = function(e){
|
@@ -1920,6 +2238,11 @@ var initHooch = function(){
|
|
1920
2238
|
}
|
1921
2239
|
})
|
1922
2240
|
});
|
2241
|
+
$(document).ajaxStop(function(){
|
2242
|
+
$.each(window.any_time_manager.recordedObjects['hooch.Sorter'], function(index, sorter){
|
2243
|
+
sorter.setBoundaries()
|
2244
|
+
})
|
2245
|
+
})
|
1923
2246
|
}
|
1924
2247
|
if(typeof Class === "undefined"){
|
1925
2248
|
$.getScript('https://rawgit.com/edraut/js_inheritance/a6c1e40986ecb276335b0a0b1792abd01f05ff6c/inheritance.js', function(){
|
data/lib/hooch/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hooch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.15.
|
4
|
+
version: 0.15.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Draut
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-10-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|