scrivito_sdk 1.1.0.rc1 → 1.1.0.rc2

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 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