scrivito_sdk 1.1.0.rc1 → 1.1.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 12a55c387b16a4a537845c0ef7d10d00b4c6bd4a
4
- data.tar.gz: e79c326cc3f757de2d46b05d4287ab0548550aeb
3
+ metadata.gz: a74fbb94276191a2a93a9bc371135f056a17dd91
4
+ data.tar.gz: 92608b0a4cc5523941e4bbd0c25e09635ecbb3c7
5
5
  SHA512:
6
- metadata.gz: 1a9338acbdbd0901b6ed31bc8962c1278f9057c507f2af2791c83291de9480f0d8230fb58acd1c039753a34ab18fd5a2033c39676f67d09ba0205b9c92b7e4e0
7
- data.tar.gz: cd8ba88553f5bf4a3974a7a1901391dda745100e3749b54801e3507825caa8e52817506fe0c3622f105363311db88841596a53c5df4e2b15a3ee88843750c0ff
6
+ metadata.gz: 625a81d42efb11d2476a03fa71ea7ac995989bdf7e9758c6844008a0635f3f3395c9f6efb5ca589f535f77bfc6c46322ebd3b023693ec8a742c6da23f9967699
7
+ data.tar.gz: 234c9870ee5c7af5c102d86a0e95764f6cad72595caa62f2907933a8c788f72dcb33e17ac310409f1b338be3401916b5ebdc182aa57855acc62a064f334bf8fe
data/config/ca-bundle.crt CHANGED
@@ -1,7 +1,7 @@
1
1
  ##
2
2
  ## Bundle of CA Root Certificates
3
3
  ##
4
- ## Certificate data from Mozilla as of: Fri Jan 8 14:27:07 2016
4
+ ## Certificate data from Mozilla as of: Thu Jan 14 17:21:14 2016
5
5
  ##
6
6
  ## This is a bundle of X.509 certificates of public Certificate Authorities
7
7
  ## (CA). These were automatically extracted from Mozilla's root certificates
@@ -31946,13 +31946,16 @@ var scrivito = {}; // jshint ignore:line
31946
31946
  };
31947
31947
 
31948
31948
  var serialize_copied_binary = function(attr_name, attr_value) {
31949
- return [attr_name, {copy: {
31949
+ var copy_params = {
31950
31950
  obj_id: attr_value.obj_id,
31951
31951
  widget_id: attr_value.widget_id,
31952
- attribute_name: attr_value.attr_name,
31953
- filename: attr_value.filename,
31954
- content_type: attr_value.content_type
31955
- }}];
31952
+ attribute_name: attr_value.attr_name
31953
+ };
31954
+
31955
+ if (attr_value.filename) { copy_params.filename = attr_value.filename; }
31956
+ if (attr_value.content_type) { copy_params.content_type = attr_value.content_type; }
31957
+
31958
+ return [attr_name, {copy: copy_params}];
31956
31959
  };
31957
31960
 
31958
31961
  var is_uploaded_binary = function(object) {
@@ -32057,6 +32060,8 @@ var scrivito = {}; // jshint ignore:line
32057
32060
  },
32058
32061
 
32059
32062
  upload_binary: function(params) {
32063
+ assert_valid_params(params);
32064
+
32060
32065
  var blob = params.blob || params.file;
32061
32066
  if (!blob) { $.error('need blob or file'); }
32062
32067
  if (!params.content_type) { params.content_type = blob.type; }
@@ -32067,6 +32072,17 @@ var scrivito = {}; // jshint ignore:line
32067
32072
  params.filename = params.filename.replace(/[^\w\-_\.$]/g, '-');
32068
32073
 
32069
32074
  return $.extend(params, {is_uploaded_binary: true});
32075
+ },
32076
+
32077
+ copy_binary: function(obj_id, widget_id, attr_name, params) {
32078
+ assert_valid_params(params);
32079
+
32080
+ return _.extend({
32081
+ is_copied_binary: true,
32082
+ obj_id: obj_id,
32083
+ widget_id: widget_id,
32084
+ attr_name: attr_name
32085
+ }, params);
32070
32086
  }
32071
32087
  }
32072
32088
  });
@@ -32099,6 +32115,16 @@ var scrivito = {}; // jshint ignore:line
32099
32115
  content_type: content_type
32100
32116
  }});
32101
32117
  };
32118
+
32119
+ var assert_valid_params = function(params) {
32120
+ if (_.has(params, 'filename') && !params.filename) {
32121
+ $.error('filename cannot be blank');
32122
+ }
32123
+
32124
+ if (_.has(params, 'content_type') && !params.content_type) {
32125
+ $.error('content_type cannot be blank');
32126
+ }
32127
+ };
32102
32128
  }());
32103
32129
  (function() {
32104
32130
  _.extend(scrivito, {
@@ -32614,12 +32640,12 @@ var scrivito = {}; // jshint ignore:line
32614
32640
  },
32615
32641
 
32616
32642
  copy: function(params) {
32617
- return _.extend({
32618
- is_copied_binary: true,
32619
- obj_id: that.obj().id(),
32620
- widget_id: that.widget() && that.widget().id(),
32621
- attr_name: that.field_name()
32622
- }, params || {});
32643
+ return scrivito.blob.copy_binary(
32644
+ that.obj().id(),
32645
+ that.widget() && that.widget().id(),
32646
+ that.field_name(),
32647
+ params
32648
+ );
32623
32649
  }
32624
32650
  });
32625
32651
  }
@@ -37061,8 +37087,6 @@ var scrivito = {}; // jshint ignore:line
37061
37087
  };
37062
37088
  })();
37063
37089
  (function() {
37064
- var focus;
37065
- var focus_stack = [];
37066
37090
  var dragging;
37067
37091
 
37068
37092
  // GEOMETRY UTILS
@@ -37070,8 +37094,8 @@ var scrivito = {}; // jshint ignore:line
37070
37094
  // distance between point and rectangle
37071
37095
  // returns 0 if point is inside rectangle
37072
37096
  var distance_point_rectangle = function(point, rect) {
37073
- var clamped_x = Math.max(Math.min(point.x, rect.x + rect.width), rect.x);
37074
- var clamped_y = Math.max(Math.min(point.y, rect.y + rect.height), rect.y);
37097
+ var clamped_x = Math.max(Math.min(point.x, rect.x2), rect.x1);
37098
+ var clamped_y = Math.max(Math.min(point.y, rect.y2), rect.y1);
37075
37099
 
37076
37100
  var dist_x = point.x - clamped_x;
37077
37101
  var dist_y = point.y - clamped_y;
@@ -37079,6 +37103,55 @@ var scrivito = {}; // jshint ignore:line
37079
37103
  return Math.sqrt(dist_x * dist_x + dist_y * dist_y);
37080
37104
  };
37081
37105
 
37106
+ // given a rectangle, calculate it's center
37107
+ var center_of_rectangle = function(rect) {
37108
+ return { x: (rect.x1 + rect.x2) / 2, y: (rect.y1 + rect.y2) / 2 };
37109
+ };
37110
+
37111
+ // given a rectangle, return it's edges.
37112
+ // the edges are returned as rectangles with either
37113
+ // width=0 for left and right, or
37114
+ // heigth=0 for top and bottom.
37115
+ var edges_of_rectangle = function(rect) {
37116
+ return {
37117
+ left: {
37118
+ x1: rect.x1,
37119
+ y1: rect.y1,
37120
+ x2: rect.x1,
37121
+ y2: rect.y2
37122
+ },
37123
+ right: {
37124
+ x1: rect.x2,
37125
+ y1: rect.y1,
37126
+ x2: rect.x2,
37127
+ y2: rect.y2
37128
+ },
37129
+ top: {
37130
+ x1: rect.x1,
37131
+ y1: rect.y1,
37132
+ x2: rect.x2,
37133
+ y2: rect.y1
37134
+ },
37135
+ bottom: {
37136
+ x1: rect.x1,
37137
+ y1: rect.y2,
37138
+ x2: rect.x2,
37139
+ y2: rect.y2
37140
+ }
37141
+ };
37142
+ };
37143
+
37144
+ // calculate the rectangle that results from cropping the rectangle `rect`
37145
+ // to be inside the rectangle `crop`.
37146
+ var crop_rectangle = function(rect, crop) {
37147
+ return {
37148
+ x1: Math.min(crop.x2, Math.max(crop.x1, rect.x1)),
37149
+ y1: Math.min(crop.y2, Math.max(crop.y1, rect.y1)),
37150
+ x2: Math.min(crop.x2, Math.max(crop.x1, rect.x2)),
37151
+ y2: Math.min(crop.y2, Math.max(crop.y1, rect.y2))
37152
+ };
37153
+ };
37154
+
37082
37155
  var is_wrap_between = function(column, next_column) {
37083
37156
  var column_offset = column.offset();
37084
37157
  var next_column_offset = next_column.offset();
@@ -37115,10 +37188,10 @@ var scrivito = {}; // jshint ignore:line
37115
37188
  }
37116
37189
 
37117
37190
  return {
37118
- x: offset.left,
37119
- y: offset.top,
37120
- width: element.outerWidth(),
37121
- height: height
37191
+ x1: offset.left,
37192
+ y1: offset.top,
37193
+ x2: offset.left + element.outerWidth(),
37194
+ y2: offset.top + height
37122
37195
  };
37123
37196
  };
37124
37197
 
@@ -37215,70 +37288,15 @@ var scrivito = {}; // jshint ignore:line
37215
37288
  }
37216
37289
  };
37217
37290
 
37218
- // FOCUS MARKER
37219
-
37220
- var focus_marker = function() {
37221
- var focus_marker;
37222
-
37223
- var rects;
37224
-
37225
- var show_rectangle = function(num, x1, y1, x2, y2) {
37226
- var rect = $(rects[num]);
37227
-
37228
- rect.offset({left: x1, top: y1});
37229
- rect.width(x2 - x1);
37230
- rect.height(y2 - y1);
37231
-
37232
- rect.show();
37233
- };
37234
-
37235
- return {
37236
- init: function() {
37237
- rects = _.map(_.range(4), function() {
37238
- var rect = $("<div class='focus_marker'></div>");
37239
- rect.css("pointer-events", "none");
37240
- rect.css("background", "rgba(255, 159, 0, 0.25)");
37241
- rect.css("position", "absolute");
37242
- rect.hide();
37243
-
37244
- $("body").append(rect);
37245
-
37246
- return rect;
37247
- });
37248
- },
37249
-
37250
- show: function(focus) {
37251
- var offset = scrivito.cms_document.offset(focus)
37252
- var bounds = bounding_rectangle(focus);
37253
- var width = bounds.width;
37254
- var height = bounds.height;
37255
-
37256
- // FIXME, use actual values
37257
- var window_bottom = 2048;
37258
- var window_right = 2048;
37259
-
37260
- show_rectangle(0, 0, 0, offset.left, window_bottom);
37261
- show_rectangle(1, offset.left + width, 0, window_right, window_bottom);
37262
-
37263
- show_rectangle(2, offset.left, 0, offset.left + width, offset.top);
37264
- show_rectangle(3, offset.left, offset.top + height, offset.left + width, window_bottom);
37265
- },
37266
-
37267
- hide: function() {
37268
- _.each(rects, function(rect) { $(rect).hide(); });
37269
- }
37270
- };
37271
- }();
37272
-
37273
37291
  var find_selectable_targets = function(root) {
37274
37292
  root = $(root);
37275
37293
 
37276
- if (root.is('[data-scrivito-widget-obj-class=ColumnWidget]')) {
37294
+ if (root.is('[data-scrivito-widget-obj-class=ColumnWidget]') ||
37295
+ root.is('[data-scrivito-widget-obj-class=ColumnContainerWidget]')) {
37277
37296
  return root.children();
37278
37297
  }
37279
37298
 
37280
- var widgetlists = root.find('[data-scrivito-field-type=widgetlist]')
37281
- .addBack('[data-scrivito-field-type=widgetlist]');
37299
+ var widgetlists = root.find('[data-scrivito-field-type=widgetlist]');
37282
37300
  widgetlists = _.reject(widgetlists, function(widgetlist) {
37283
37301
  // Reject if not a top-level widgetlist.
37284
37302
  var wrapping_widgetlist = $(widgetlist).parent()
@@ -37299,93 +37317,150 @@ var scrivito = {}; // jshint ignore:line
37299
37317
  return selectable_targets;
37300
37318
  };
37301
37319
 
37302
- var find_gesture_targets = function(mouse, focus) {
37303
- var selectable_targets = find_selectable_targets(focus);
37304
- var target_row = detect_closest(mouse, selectable_targets);
37305
- var target;
37320
+ var find_gesture_targets = function(mouse, root) {
37321
+ var selectable_targets = find_selectable_targets(root);
37322
+ var target = detect_closest(mouse, selectable_targets);
37306
37323
 
37307
- if ($(target_row).is("[data-scrivito-widget-obj-class=ColumnContainerWidget]")) {
37308
- target = detect_closest(mouse, $(target_row).children());
37309
- } else {
37310
- target = target_row;
37324
+ if (!target) {
37325
+ return [];
37311
37326
  }
37312
37327
 
37313
- return {
37314
- target_row: target_row,
37315
- target: target
37328
+ if (target === dragging) {
37329
+ return [target];
37330
+ }
37331
+
37332
+ return [target].concat(find_gesture_targets(mouse, target));
37333
+ };
37334
+
37335
+ // given a list of boxes containing each other and the center,
37336
+ // calculate an adjusted list of boxes so that the edges of successive boxes
37337
+ // do not touch each other, i.e. there is free space between successive boxes.
37338
+ // the boxes are adjusted by making successor boxes smaller to create space.
37339
+ // the first box is never adjusted.
37340
+ // if the overall space is to tight to create the desired amount of space,
37341
+ // as much as possible is created, distributed equally between all boxes.
37342
+ // all adjustments are made with respect to the center,
37343
+ // i.e. box edges are moved towards the center, but never across the center.
37344
+ var disperse_boxes = function(center, boxes) {
37345
+ var box = boxes[0];
37346
+ var successor_box = boxes[1];
37347
+
37348
+ if (!successor_box) { return boxes; }
37349
+
37350
+ // the desired amount of space between edges of successive boxes, in pixels.
37351
+ var desired_space = 20;
37352
+
37353
+ // calculate maximum amount of adjustment for each edge
37354
+ // in order to leave enough space for successive boxes.
37355
+ var max_x1 = (center.x - box.x1) / boxes.length;
37356
+ var max_y1 = (center.y - box.y1) / boxes.length;
37357
+ var max_x2 = (box.x2 - center.x) / boxes.length;
37358
+ var max_y2 = (box.y2 - center.y) / boxes.length;
37359
+
37360
+ // the largest possible box within `box` that leaves enough space
37361
+ var maximum_box = {
37362
+ x1: box.x1 + Math.min(desired_space, max_x1),
37363
+ y1: box.y1 + Math.min(desired_space, max_y1),
37364
+ x2: box.x2 - Math.min(desired_space, max_x2),
37365
+ y2: box.y2 - Math.min(desired_space, max_y2)
37316
37366
  };
37367
+
37368
+ // crop successor_box to fit inside the largest possible box
37369
+ var adjusted_box = crop_rectangle(successor_box, maximum_box);
37370
+
37371
+ // recurse on remaining boxes
37372
+ var remaining_boxes = [adjusted_box].concat(boxes.slice(2));
37373
+ return [box].concat(disperse_boxes(center, remaining_boxes));
37317
37374
  };
37318
37375
 
37319
- var detect_gesture = function(mouse, target, target_row) {
37320
- if ($(target).is('[data-scrivito-field-type=widgetlist]')) {
37321
- return {
37322
- name: 'row_insert'
37323
- };
37324
- }
37376
+ var adjust_boxes = function(boxes) {
37377
+ var innermost_box = boxes[boxes.length - 1];
37378
+
37379
+ // crop innermost box to lie inside all outer boxes
37380
+ _.each(boxes, function(box) {
37381
+ innermost_box = crop_rectangle(innermost_box, box);
37382
+ });
37325
37383
 
37326
- target_row = $(target_row);
37327
- var rowY = target_row.offset().top;
37328
- var rowHeight = target_row.height();
37384
+ return disperse_boxes(center_of_rectangle(innermost_box), boxes);
37385
+ };
37329
37386
 
37330
- var targetY = $(target).offset().top;
37331
- var targetHeight = $(target).height();
37387
+ var build_edges_for = function(target, box) {
37388
+ target = $(target);
37332
37389
 
37333
- var event_row_y = (mouse.y - rowY) / rowHeight;
37334
- var event_target_y_abs = mouse.y - targetY;
37335
- var event_target_y = event_target_y_abs / targetHeight;
37390
+ var box_edges = edges_of_rectangle(box);
37336
37391
 
37337
- var is_row_insert_before = event_row_y < (1 / 4) && event_target_y < (1 /4) &&
37338
- event_target_y_abs < 20;
37339
- var is_row_insert_after = event_row_y > (3 / 4) && event_target_y > (3 /4) &&
37340
- event_target_y_abs > (targetHeight - 20);
37392
+ if (target.is('[data-scrivito-widget-obj-class=ColumnWidget]')) {
37393
+ // inserting directly above or below does not make sense
37394
+ // for a Column (user should insert inside the Column instead)
37395
+ delete box_edges.top;
37396
+ delete box_edges.bottom;
37397
+ }
37341
37398
 
37342
- if (is_row_insert_before || is_row_insert_after) {
37399
+ if (target.is('[data-scrivito-widget-obj-class=ColumnContainerWidget]')) {
37400
+ // inserting directly left or right does not make sense
37401
+ // for a ColumnContainer
37402
+ // (user should insert a new Column inside the Container instead)
37403
+ delete box_edges.left;
37404
+ delete box_edges.right;
37405
+ }
37406
+
37407
+ if (
37408
+ target.parent().is('[data-scrivito-widget-obj-class=ColumnWidget]') &&
37409
+ target.siblings().length === 0
37410
+ ) {
37411
+ // inserting directly left or right does not make sense
37412
+ // for the only item inside a Column
37413
+ // (user should insert a new Column instead)
37414
+ delete box_edges.left;
37415
+ delete box_edges.right;
37416
+ }
37417
+
37418
+ if (target.is('[data-scrivito-field-type=widgetlist]')) {
37419
+ // inserting left, right or at the bottom does not make sense
37420
+ // for an empty widgetlist
37421
+ // (user should insert a first Row before inserting Columns)
37422
+ delete box_edges.left;
37423
+ delete box_edges.right;
37424
+ delete box_edges.bottom;
37425
+ }
37426
+
37427
+ return _.map(box_edges, function(rectangle, name) {
37343
37428
  return {
37344
- name: 'row_insert',
37345
- before: is_row_insert_before
37429
+ rectangle: rectangle,
37430
+ target: target,
37431
+ name: name
37346
37432
  };
37347
- } else {
37348
- var targetX = $(target).offset().left;
37349
- var targetWidth = $(target).width();
37350
- var event_target_x_abs = mouse.x - targetX;
37351
- var eventX = event_target_x_abs / targetWidth;
37352
-
37353
- var widget_obj_class = $(target).attr("data-scrivito-widget-obj-class");
37354
- var contains_widgetlist = !!$(target).find('[data-scrivito-field-type=widgetlist]').length;
37355
- var is_applicable_for_insert_inside = (contains_widgetlist || widget_obj_class === 'ColumnWidget') &&
37356
- dragging !== target;
37357
-
37358
- var is_col_insert_before = eventX < (1 / 4) && event_target_x_abs < 20;
37359
- var is_col_insert_after = eventX > (3 / 4) && event_target_x_abs > (targetWidth - 20);
37360
- var distance = distance_point_rectangle(mouse, bounding_rectangle(target));
37361
- if (is_applicable_for_insert_inside && !is_col_insert_before && !is_col_insert_after && distance < 20) {
37362
- return {
37363
- name: 'insert_inside',
37364
- before: event_target_y < (1 / 2)
37365
- };
37366
- } else {
37367
- return {
37368
- name: 'col_insert',
37369
- before: eventX < 0.5
37370
- };
37371
- }
37372
- }
37433
+ });
37373
37434
  };
37374
37435
 
37375
- var loose_focus = function(mouse, focus) {
37376
- if (focus) {
37377
- var distance = distance_point_rectangle(mouse, bounding_rectangle(focus));
37378
- if (distance > 20) {
37379
- return focus_stack.pop();
37380
- } else {
37381
- var targets = find_gesture_targets(mouse, _.last(focus_stack) || $(focus).closest('body'));
37382
- if (targets.target && targets.target !== focus) {
37383
- return focus_stack.pop();
37384
- }
37385
- }
37386
- }
37436
+ var detect_gesture = function(mouse, root) {
37437
+ var targets = find_gesture_targets(mouse, root);
37387
37438
 
37388
- return focus;
37439
+ var boxes = adjust_boxes(_.map(targets, bounding_rectangle));
37440
+
37441
+ var edges = [];
37442
+ _.each(targets, function(target, index) {
37443
+ edges = edges.concat(build_edges_for(target, boxes[index]));
37444
+ });
37445
+
37446
+ var closest_edge = _.min(edges, function(edge) {
37447
+ return distance_point_rectangle(mouse, edge.rectangle);
37448
+ });
37449
+
37450
+ var edge_name = closest_edge.name;
37451
+
37452
+ /*
37453
+ return {
37454
+ target: closest_edge.target,
37455
+ type: edge_name === "left" || edge_name === "right" ? 'column' : 'row',
37456
+ before: edge_name === "left" || edge_name === "top"
37457
+ };
37458
+ */
37459
+
37460
+ return {
37461
+ target: closest_edge.target,
37462
+ edge_name: edge_name,
37463
+ };
37389
37464
  };
37390
37465
 
37391
37466
  var offset_center = function(element, element_offset, next_element, next_element_offset) {
@@ -37413,11 +37488,7 @@ var scrivito = {}; // jshint ignore:line
37413
37488
  cursor.hide();
37414
37489
  $("body").append(cursor);
37415
37490
 
37416
- focus_marker.init();
37417
-
37418
- var insert_at;
37419
- var insert_type;
37420
- var insert_before;
37491
+ var last_gesture;
37421
37492
 
37422
37493
  scrivito.gui.on('document', function(document) {
37423
37494
  var body = document.dom_element().find("body");
@@ -37429,7 +37500,6 @@ var scrivito = {}; // jshint ignore:line
37429
37500
  e.preventDefault(); // Necessary. Allows us to drop.
37430
37501
  }
37431
37502
 
37432
-
37433
37503
  // REPLACE ORIGINAL WITH PLACEHOLDER
37434
37504
  if (!hidden) {
37435
37505
  $(dragging).css("opacity", "0.5");
@@ -37440,18 +37510,9 @@ var scrivito = {}; // jshint ignore:line
37440
37510
  // see https://github.com/jquery/jquery/issues/1925
37441
37511
  var mouse = {x: e.originalEvent.pageX, y: e.originalEvent.pageY}
37442
37512
 
37443
- focus = loose_focus(mouse, focus);
37513
+ var gesture = detect_gesture(mouse, body);
37444
37514
 
37445
- if (focus) {
37446
- focus_marker.show(focus);
37447
- }
37448
- else {
37449
- focus_marker.hide();
37450
- }
37451
-
37452
- var targets = find_gesture_targets(mouse, focus || body);
37453
- var target_row = $(targets.target_row);
37454
- var target = targets.target;
37515
+ var target = $(gesture.target);
37455
37516
 
37456
37517
  // This should NEVER happen!
37457
37518
  if (!target) {
@@ -37459,79 +37520,38 @@ var scrivito = {}; // jshint ignore:line
37459
37520
  return;
37460
37521
  }
37461
37522
 
37462
- var gesture = detect_gesture(mouse, target, target_row);
37463
-
37464
- // TODO take widget into account: if small widget,
37465
- // only upper 1/3 of widget should count as "row"
37466
- if (gesture.name === 'row_insert') {
37467
- var before = gesture.before;
37523
+ if (gesture.target.get(0) === dragging) {
37524
+ return;
37525
+ }
37468
37526
 
37527
+ if (gesture.edge_name === 'top' || gesture.edge_name === 'bottom') {
37469
37528
  // CURSOR
37470
37529
  cursor.height("0px");
37471
- cursor.width(target_row.parent().outerWidth());
37530
+ cursor.width(target.parent().outerWidth());
37472
37531
 
37473
37532
  // TODO update Cursor position on scroll
37474
- // FIXME: why that - offset.top -= 0.5 * cursor.outerHeight();
37475
-
37476
- var offset = scrivito.cms_document.offset(target_row);
37533
+ var offset = scrivito.cms_document.offset(target);
37477
37534
 
37478
- if (before) {
37479
- var prev_row = target_row.prev();
37535
+ if (gesture.edge_name === 'top') {
37536
+ var prev_row = target.prev();
37480
37537
  if (prev_row.length) {
37481
37538
  var prev_row_offset = scrivito.cms_document.offset(prev_row);
37482
- offset.top = offset_center(prev_row, prev_row_offset, target_row, offset).top;
37539
+ offset.top = offset_center(prev_row, prev_row_offset, target, offset).top;
37483
37540
  }
37484
37541
  } else {
37485
- var next_row = target_row.next();
37542
+ var next_row = target.next();
37486
37543
  if (next_row.length) {
37487
37544
  var next_row_offset = scrivito.cms_document.offset(next_row);
37488
- offset.top = offset_center(target_row, offset, next_row, next_row_offset).top;
37545
+ offset.top = offset_center(target, offset, next_row, next_row_offset).top;
37489
37546
  } else {
37490
- offset.top += target_row.outerHeight();
37547
+ offset.top += target.outerHeight();
37491
37548
  }
37492
37549
  }
37493
37550
 
37494
- offset.left = scrivito.cms_document.offset(target_row.parent()).left;
37551
+ offset.left = scrivito.cms_document.offset(target.parent()).left;
37495
37552
  cursor.offset(offset);
37496
37553
  cursor.show();
37497
-
37498
- // REMEMBER
37499
- insert_at = target_row;
37500
- insert_type = "row";
37501
- insert_before = before;
37502
- } else if (gesture.name === 'insert_inside') {
37503
- // CURSOR
37504
-
37505
- var bounds = bounding_rectangle(target);
37506
- cursor.width(bounds.width);
37507
- cursor.height(bounds.height);
37508
-
37509
- // TODO update Cursor position on scroll
37510
- var offset = scrivito.cms_document.offset(target);
37511
- cursor.offset(offset);
37512
- cursor.show();
37513
-
37514
- if (insert_at === target && insert_type === "inside") {
37515
- var focus_time = (new Date()) - focus_since;
37516
-
37517
- if (focus_time > 500) {
37518
- if (focus) {
37519
- focus_stack.push(focus);
37520
- }
37521
- focus = target;
37522
- focus_since = undefined;
37523
- }
37524
- } else {
37525
- focus_since = new Date();
37526
- // REMEMBER
37527
- insert_at = target;
37528
- insert_type = "inside";
37529
- }
37530
-
37531
- insert_before = gesture.before;
37532
- } else if (gesture.name === 'col_insert') {
37533
- var before = gesture.before;
37534
-
37554
+ } else if (gesture.edge_name === 'left' || gesture.edge_name === 'right') {
37535
37555
  // CURSOR
37536
37556
  cursor.height($(target).outerHeight());
37537
37557
  cursor.width("0px");
@@ -37540,7 +37560,7 @@ var scrivito = {}; // jshint ignore:line
37540
37560
  var offset = scrivito.cms_document.offset(target);
37541
37561
  var target_jq = $(target);
37542
37562
 
37543
- if (before) {
37563
+ if (gesture.edge_name === 'left') {
37544
37564
  var prev_column = target_jq.prev();
37545
37565
  if (prev_column.length && !is_wrap_between(prev_column, target_jq)) {
37546
37566
  offset.left = offset_center(prev_column, scrivito.cms_document.offset(prev_column),
@@ -37560,14 +37580,11 @@ var scrivito = {}; // jshint ignore:line
37560
37580
 
37561
37581
  cursor.offset(offset);
37562
37582
  cursor.show();
37563
-
37564
- // REMEMBER
37565
- insert_at = target;
37566
- insert_type = "col";
37567
- insert_before = before;
37568
37583
  } else {
37569
37584
  $.error('Unknown gesture: ' + gesture);
37570
37585
  }
37586
+
37587
+ last_gesture = gesture;
37571
37588
  });
37572
37589
 
37573
37590
  });
@@ -37598,15 +37615,6 @@ var scrivito = {}; // jshint ignore:line
37598
37615
  //e.originalEvent.dataTransfer.setDragImage(dragIcon, -10, -10);
37599
37616
 
37600
37617
  dragging = $(this).parent()[0];
37601
- // FIXME: Find also the structure widget.
37602
- focus = $(dragging).closest("[data-scrivito-widget-obj-class=ColumnWidget]")[0];
37603
-
37604
- if ($(focus).children().length === 1) { // TODO: Only for ColumnContainerWidget
37605
- // if dragging the only widget inside a column
37606
- // focussing that column does not make sense
37607
- focus = $(focus).parent().
37608
- closest("[data-scrivito-widget-obj-class=ColumnWidget]")[0];
37609
- }
37610
37618
 
37611
37619
  hidden = false;
37612
37620
  });
@@ -37615,32 +37623,24 @@ var scrivito = {}; // jshint ignore:line
37615
37623
 
37616
37624
  if (window.debugdrag) { return }
37617
37625
 
37618
- if (insert_at == dragging) {
37626
+ var gesture = last_gesture;
37627
+
37628
+ if (gesture.target == dragging) {
37619
37629
  // dragged a widget on itself - do nothing
37620
37630
  $(dragging).css("opacity", "1");
37621
37631
  }
37622
- else if (insert_at) {
37632
+ else if (gesture.target) {
37633
+ var target = gesture.target;
37623
37634
  var old_parent = $(dragging).parent();
37624
37635
 
37625
- if (insert_type == "inside") {
37626
- // TODO do noting if not ColumnContainerWidget
37627
- // INSIDE EXISTING COLUMN
37628
- $(dragging).hide();
37629
- $(insert_at)[insert_before ? "prepend" : "append"](dragging);
37630
- $(dragging).slideDown(100);
37631
-
37632
- $(dragging).css("opacity", "1");
37633
-
37634
- garbage_collect(old_parent);
37635
- }
37636
- else if (insert_type == "row") {
37636
+ if (gesture.edge_name === 'top' || gesture.edge_name === 'bottom') {
37637
37637
  // ROW INSERT
37638
37638
  $(dragging).hide();
37639
37639
 
37640
- if (insert_before === undefined) {
37641
- $(insert_at).append(dragging);
37640
+ if (target.is('[data-scrivito-field-type=widgetlist]')) {
37641
+ $(target).append(dragging);
37642
37642
  } else {
37643
- $(insert_at)[insert_before ? "before" : "after"](dragging);
37643
+ $(target)[gesture.edge_name === 'top' ? "before" : "after"](dragging);
37644
37644
  }
37645
37645
  $(dragging).css("opacity", "1");
37646
37646
 
@@ -37650,21 +37650,21 @@ var scrivito = {}; // jshint ignore:line
37650
37650
  }
37651
37651
  else {
37652
37652
  // COL INSERT
37653
- var insert_at_obj_class = $(insert_at).attr("data-scrivito-widget-obj-class");
37653
+ var insert_at_obj_class = $(target).attr("data-scrivito-widget-obj-class");
37654
37654
  if (insert_at_obj_class !== "ColumnWidget") {
37655
- $(insert_at).wrap(
37655
+ $(target).wrap(
37656
37656
  "<div class='row' data-scrivito-widget-obj-class=ColumnContainerWidget>" +
37657
37657
  "<div class='col-md-12' data-scrivito-widget-obj-class=ColumnWidget></div>" +
37658
37658
  "</div>");
37659
37659
 
37660
- insert_at = $(insert_at).parent();
37660
+ target = $(target).parent();
37661
37661
  }
37662
37662
 
37663
37663
  $(dragging).detach();
37664
37664
  $(dragging).wrap("<div class='col-md-12' data-scrivito-widget-obj-class=ColumnWidget></div>");
37665
37665
  var insert_column = $(dragging).parent();
37666
37666
 
37667
- $(insert_at)[insert_before ? "before" : "after"](insert_column);
37667
+ $(target)[gesture.edge_name === 'left' ? "before" : "after"](insert_column);
37668
37668
 
37669
37669
  $(dragging).css("opacity", "1");
37670
37670
  $(dragging).show(100);
@@ -37673,12 +37673,11 @@ var scrivito = {}; // jshint ignore:line
37673
37673
  // since it could be inside the same row
37674
37674
  garbage_collect(old_parent);
37675
37675
 
37676
- resize_row($(insert_at).closest(".row"));
37676
+ resize_row($(target).closest(".row"));
37677
37677
  }
37678
37678
  }
37679
37679
 
37680
37680
  cursor.hide();
37681
- focus_marker.hide();
37682
37681
 
37683
37682
  return false;
37684
37683
  });
@@ -6,6 +6,12 @@ module Scrivito
6
6
  class Binary
7
7
  attr_reader :id, :transformation_definition
8
8
 
9
+ def self.assert_valid_options(options)
10
+ options.each_pair do |key, value|
11
+ raise ArgumentError, "#{key} cannot be blank" if value.blank?
12
+ end
13
+ end
14
+
9
15
  def initialize(id, is_public, transformation_definition: nil, original: nil)
10
16
  @id = id
11
17
  @is_public = !!is_public
@@ -13,47 +19,62 @@ class Binary
13
19
  @original = original
14
20
  end
15
21
 
22
+ #
16
23
  # @api public
24
+ #
17
25
  # Uploads a local file to the CMS.
18
- # @example Upload a single file
19
- # @obj.update(blob: Scrivito::Binary.upload("/Desktop/kitten.jpg"))
20
- #
21
- # # equivalent to
22
- # @obj.update(blob: File.new("/Desktop/kitten.jpg"))
23
- # @example Upload a file with a different filename and content type
24
- # @obj.update(blob: Scrivito::Binary.upload(
25
- # "/Desktop/rick_astley", content_type: "Video/MP4", filename: "ufo_landing.m4v"))
26
- # @param file_or_path [File, String] the file to be uploaded or
27
- # the path of the file to be uploaded.
28
- # @param filename [String, Nil] the desired filename. If +nil+,
29
- # the name of the given file is used.
30
- # @param content_type [String, Nil] the desired content type. If +nil+,
31
- # the content type is calculated based on the extension of the filename.
26
+ #
27
+ # @param file_or_path [File, String] the file to be uploaded or the path of the file to be uploaded.
28
+ # @param options [Hash]
29
+ # @option options [String] filename the desired filename. Defaults to the name of the given file.
30
+ # @option options [String] content_type the desired content type. By default, the content type is
31
+ # calculated based on the extension of the filename.
32
+ #
32
33
  # @return [Scrivito::FutureBinary] the returned object should be inserted into the binary field
33
34
  # of an {Scrivito::BasicObj Obj} or {Scrivito::BasicWidget Widget}.
34
- def self.upload(file_or_path, filename: nil, content_type: nil)
35
- if file_or_path.is_a?(File)
36
- file = file_or_path
37
- else
38
- file = File.new(file_or_path)
39
- end
40
- new_filename = filename || File.basename(file_or_path)
41
- FutureBinary.new(content_type: content_type, filename: new_filename, file_to_be_uploaded: file)
35
+ #
36
+ # @raise ArgumentError if given +filename+ or +content_type+ is blank.
37
+ #
38
+ # @example Upload a single file
39
+ # @obj.update(blob: Scrivito::Binary.upload("./kitten.jpg"))
40
+ #
41
+ # # Is equivalent to
42
+ # @obj.update(blob: File.new("./kitten.jpg"))
43
+ #
44
+ # @example Upload a file with a different +filename+ and +content_type+
45
+ # @obj.update(blob: Scrivito::Binary.upload("./rick_astley",
46
+ # filename: "ufo_landing.m4v", content_type: "video/mp4"))
47
+ #
48
+ def self.upload(file_or_path, options = {})
49
+ assert_valid_options(options)
50
+ FutureBinary.new(options.reverse_merge(
51
+ filename: File.basename(file_or_path),
52
+ file_to_upload: file_or_path.is_a?(File) ? file_or_path : File.new(file_or_path)
53
+ ))
42
54
  end
43
55
 
56
+ #
44
57
  # @api public
45
- # Create a copy of this Binary with a different filename and/or content type.
46
- # @example Change filename and content_type of an existing binary. Binary content remains the same.
47
- # @obj.update(blob: @obj.blob.copy(filename: "cute_kitten.jpg", content_type: "video/mp4"))
48
- # @param filename [String, Nil] the desired filename. If +nil+,
49
- # the filename of the original binary is used.
50
- # @param content_type [String, Nil] the desired content type. If +nil+,
51
- # the content type is calculated based on the extension of the filename.
58
+ #
59
+ # Create a copy of this {Scrivito::Binary Binary} with a different filename and/or content type.
60
+ #
61
+ # @param options [Hash]
62
+ # @option options [String] filename the desired filename. Defaults to the +filename+ of the
63
+ # original binary.
64
+ # @option options [String] content_type the desired content type. By default, the content type is
65
+ # calculated based on the extension of the filename.
66
+ #
52
67
  # @return [Scrivito::FutureBinary] the returned object should be inserted into the binary field
53
- # of an Obj or Widget.
54
- def copy(content_type: nil, filename: nil)
55
- new_filename = filename || self.filename
56
- FutureBinary.new(content_type: content_type, filename: new_filename, id_to_be_copied: id)
68
+ # of an {Scrivito::BasicObj Obj} or {Scrivito::BasicWidget Widget}.
69
+ #
70
+ # @raise ArgumentError if given +filename+ or +content_type+ is blank.
71
+ #
72
+ # @example Change +filename+ and +content_type+ of an existing binary. Binary content remains the same.
73
+ # @obj.update(blob: @obj.blob.copy(filename: "cute_kitten.jpg", content_type: "video/mp4"))
74
+ #
75
+ def copy(options = {})
76
+ self.class.assert_valid_options(options)
77
+ FutureBinary.new(options.reverse_merge(filename: self.filename, id_to_copy: id))
57
78
  end
58
79
 
59
80
  # @api public
@@ -68,17 +68,14 @@ module Scrivito
68
68
  @number_of_requests
69
69
  end
70
70
 
71
- def self.upload_future_binary(binary, obj_id)
72
- if binary.id_to_be_copied
73
- id = normalize_path_component(binary.id_to_be_copied)
74
- put("blobs/#{id}/copy", destination_obj_id: obj_id, filename: binary.filename,
75
- content_type: binary.content_type)
71
+ def self.upload_future_binary(future_binary, obj_id)
72
+ if future_binary.id_to_copy
73
+ id = normalize_path_component(future_binary.id_to_copy)
74
+ put("blobs/#{id}/copy", future_binary.to_h.merge(destination_obj_id: obj_id))
76
75
  else
77
- upload_permission = get('blobs/upload_permission')
78
- upload = perform_file_upload(binary.file_to_be_uploaded, binary.content_type,
79
- upload_permission)
80
- activate_upload(upload: upload, obj_id: obj_id, filename: binary.filename,
81
- content_type: binary.content_type)
76
+ permission = get('blobs/upload_permission')
77
+ upload = upload_file(future_binary.file_to_upload, future_binary.content_type, permission)
78
+ activate_upload(future_binary.to_h.merge(upload: upload, obj_id: obj_id))
82
79
  end
83
80
  end
84
81
 
@@ -185,7 +182,7 @@ module Scrivito
185
182
  end
186
183
  end
187
184
 
188
- def perform_file_upload(file, content_type, upload_permission)
185
+ def upload_file(file, content_type, upload_permission)
189
186
  uri = URI.parse(upload_permission['url'])
190
187
 
191
188
  File.open(file) do |open_file|
@@ -1,22 +1,27 @@
1
1
  module Scrivito
2
2
 
3
+ #
3
4
  # @api public
5
+ #
4
6
  # The FutureBinary class represents the data to be stored in a binary field.
5
7
  # See {Scrivito::Binary.upload} and {Scrivito::Binary#copy} for details.
8
+ #
9
+ # @see Scrivito::Binary.upload
10
+ # @see Scrivito::Binary#copy
11
+ #
6
12
  class FutureBinary
7
- attr_reader :filename, :content_type, :id_to_be_copied, :file_to_be_uploaded
13
+ attr_reader :filename, :content_type, :id_to_copy, :file_to_upload
8
14
 
9
- def initialize(filename:, content_type:, id_to_be_copied: nil, file_to_be_uploaded: nil)
10
- @filename = filename
11
- @content_type = content_type || content_type_of_filename(filename)
12
- @id_to_be_copied = id_to_be_copied
13
- @file_to_be_uploaded = file_to_be_uploaded
15
+ def initialize(options = {})
16
+ @filename, @content_type, @id_to_copy, @file_to_upload =
17
+ options.values_at(:filename, :content_type, :id_to_copy, :file_to_upload)
14
18
  end
15
19
 
16
- private
17
-
18
- def content_type_of_filename(filename)
19
- MIME::Types.type_for(filename).first.try(:content_type)
20
+ def to_h
21
+ {
22
+ filename: filename,
23
+ content_type: content_type,
24
+ }.compact
20
25
  end
21
26
  end
22
27
 
@@ -71,7 +71,7 @@ module Scrivito
71
71
  end
72
72
 
73
73
  if binary = (widget || obj)[params[:attribute_name]]
74
- binary.copy(filename: params[:filename], content_type: params[:content_type])
74
+ binary.copy(params.slice(:filename, :content_type).compact)
75
75
  end
76
76
  end
77
77
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scrivito_sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0.rc1
4
+ version: 1.1.0.rc2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Infopark AG
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-08 00:00:00.000000000 Z
11
+ date: 2016-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable