infopark_fiona7 1.2.0.2.3 → 1.5.2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +33 -0
  3. data/app/assets/javascripts/fiona7_ui.js +82 -23
  4. data/app/assets/javascripts/scrivito_patches/ajax.js +222 -0
  5. data/app/assets/javascripts/scrivito_patches/ajax_error_handling.js +24 -0
  6. data/app/assets/javascripts/scrivito_patches/attribute_serializer.js +259 -0
  7. data/app/assets/javascripts/scrivito_patches/base_obj_path.js +17 -0
  8. data/app/assets/javascripts/scrivito_patches/binary_utils.js +33 -0
  9. data/app/assets/javascripts/scrivito_patches/cms_rest_api.js +490 -0
  10. data/app/assets/javascripts/scrivito_patches/models/api/basic_obj.js +650 -0
  11. data/app/assets/javascripts/scrivito_patches/models/binary_field_element.js +53 -0
  12. data/app/assets/javascripts/scrivito_patches/models/obj.js +74 -239
  13. data/app/assets/javascripts/scrivito_patches/obj_serializer.js +91 -0
  14. data/app/assets/stylesheets/fiona7.css.scss +12 -0
  15. data/app/assets/stylesheets/fiona7_ui.css.scss +18 -0
  16. data/app/controllers/fiona7/api_controller.rb +20 -0
  17. data/app/controllers/fiona7/sessions_controller.rb +2 -10
  18. data/app/controllers/fiona7_login_page_controller.rb +0 -3
  19. data/app/controllers/scrivito/obj_class_controller.rb +58 -0
  20. data/app/controllers/scrivito/objs_controller.rb +2 -38
  21. data/app/helpers/fiona7_override_helper.rb +25 -0
  22. data/app/views/fiona7/release/preview.html.erb +1 -1
  23. data/app/views/fiona7_login_page/index.html.erb +0 -6
  24. data/app/views/scrivito/ui/index.html.erb +2 -1
  25. data/app/views/scrivito/webservice/_workspace.json.jbuilder +8 -0
  26. data/config/locales/errors.yml +18 -0
  27. data/config/locales/workflow.yml +24 -0
  28. data/config/precedence_routes.rb +7 -14
  29. data/infopark_fiona7.gemspec +6 -4
  30. data/lib/fiona7/assert.rb +2 -2
  31. data/lib/fiona7/attribute_readers/factory.rb +4 -0
  32. data/lib/fiona7/attribute_type_mapper.rb +4 -1
  33. data/lib/fiona7/attribute_writers/binary_as_binary.rb +2 -2
  34. data/lib/fiona7/attribute_writers/binary_as_linklist.rb +2 -2
  35. data/lib/fiona7/attribute_writers/factory.rb +4 -0
  36. data/lib/fiona7/builder/indirect_blob_builder.rb +2 -2
  37. data/lib/fiona7/builder/lazy_blob_copier.rb +1 -1
  38. data/lib/fiona7/builder/obj_builder.rb +45 -12
  39. data/lib/fiona7/controllers/rest_api/error_handler.rb +49 -0
  40. data/lib/fiona7/controllers/rest_api/obj_controller.rb +34 -20
  41. data/lib/fiona7/controllers/rest_api/session_controller.rb +13 -0
  42. data/lib/fiona7/engine.rb +7 -10
  43. data/lib/fiona7/facet_builder.rb +5 -1
  44. data/lib/fiona7/naive_search_engine.rb +9 -0
  45. data/lib/fiona7/routers/rest_api.rb +17 -0
  46. data/lib/fiona7/scrivito_patches/attribute_content.rb +28 -0
  47. data/lib/fiona7/scrivito_patches/cms_routing.rb +14 -31
  48. data/lib/fiona7/scrivito_patches/page_config.rb +1 -0
  49. data/lib/fiona7/scrivito_user.rb +3 -2
  50. data/lib/fiona7/type_register.rb +4 -0
  51. data/lib/fiona7/verity_search_engine.rb +6 -17
  52. data/lib/fiona7/version.rb +1 -1
  53. data/lib/fiona7/workspace.rb +2 -0
  54. metadata +28 -14
  55. data/app/assets/javascripts/scrivito_patches/models/ajax.js +0 -99
  56. data/app/assets/javascripts/scrivito_patches/models/blob.js +0 -50
@@ -0,0 +1,53 @@
1
+ 'use strict';
2
+
3
+ (function () {
4
+ // -- PATCH BEGINS HERE --
5
+ // remove old scrivito.binaryFieldElement
6
+ var definitions = scrivito.cms_element.definitions;
7
+ for (var i = 0; i < definitions.length; ++i) {
8
+ if (definitions[i] === scrivito.binaryFieldElement) {
9
+ definitions.splice(i, 1);
10
+ break;
11
+ }
12
+ }
13
+ // -- PATCH ENDS HERE --
14
+
15
+ scrivito.binaryFieldElement = {
16
+ create_instance: function create_instance(cmsElement) {
17
+ if (cmsElement.dom_element().attr('data-scrivito-field-type') === 'binary') {
18
+ var that = scrivito.cms_field_element.create_instance(cmsElement);
19
+ // -- PATCH BEGINS HERE --
20
+ /*
21
+ const bufferedWriter = new scrivito.BufferedWriter((value) => {
22
+ if (scrivito.BinaryUtils.isFile(value)) {
23
+ return scrivito.Binary.upload(value).into(that.basic_obj());
24
+ }
25
+ if (value instanceof scrivito.FutureBinary) {
26
+ return value.into(that.basic_obj());
27
+ }
28
+ return scrivito.Promise.resolve(value);
29
+ });
30
+ _.extend(that, {
31
+ preprocess(value) {
32
+ return bufferedWriter.write(value).catch((error) => {
33
+ scrivito.handleAjaxError(error);
34
+ throw error;
35
+ });
36
+ },
37
+ });
38
+ */
39
+
40
+ _.extend(that, {
41
+ preprocess: function preprocess(value) {
42
+ return scrivito.Promise.resolve(value);
43
+ }
44
+ });
45
+ // -- PATCH ENDS HERE --
46
+
47
+ return that;
48
+ }
49
+ }
50
+ };
51
+
52
+ scrivito.cms_element.definitions.push(scrivito.binaryFieldElement);
53
+ })();
@@ -1,14 +1,8 @@
1
1
  (function() {
2
+ var write_promises = {};
3
+
2
4
  _.extend(scrivito, {
3
5
  obj: {
4
- serialize_value: function(value) {
5
- if (_.isDate(value)) {
6
- return serialize_date(value);
7
- } else {
8
- return value;
9
- }
10
- },
11
-
12
6
  create_instance: function(params) {
13
7
  var that = {
14
8
  id: function() {
@@ -19,6 +13,10 @@
19
13
  return params.obj_class;
20
14
  },
21
15
 
16
+ model_class: function() {
17
+ return scrivito.ObjClass.find(params.obj_class);
18
+ },
19
+
22
20
  description_for_editor: function() {
23
21
  return params.description_for_editor;
24
22
  },
@@ -73,57 +71,52 @@
73
71
  return params.last_changed;
74
72
  },
75
73
 
76
- provided_path: function() {
77
- return params.path;
78
- },
79
-
80
74
  parent_path: function() {
81
75
  return params.parent_path;
82
76
  },
83
77
 
78
+ // -- PATCH BEINGS HERE --
79
+ provided_path: function() {
80
+ return params.path;
81
+ },
82
+ // -- PATCH ENDS HERE --
83
+
84
84
  save: function(attrs) {
85
- return prepare_attrs(that.id(), attrs).then(function(prepared_attrs) {
86
- return persist_obj_data(prepared_attrs, that.id());
87
- });
85
+ return scrivito.ObjSerializer.serialize(that.id(), attrs)
86
+ .then(function(serialized_attrs) {
87
+ return that.enqueue_ajax('PUT', 'objs/'+that.id(), {data: {obj: serialized_attrs}});
88
+ });
88
89
  },
89
90
 
90
91
  destroy: function() {
91
- return scrivito.ajax('DELETE', 'objs/' + that.id()).then(function(result) {
92
+ return that.enqueue_ajax('DELETE', 'objs/'+that.id()).then(function(result) {
92
93
  return result.redirect_to;
93
94
  });
94
95
  },
95
96
 
96
- destroy_widget: function(widget_id) {
97
- return scrivito.ajax('PUT',
98
- 'objs/' + that.id() + '/destroy_widget?widget_id=' + widget_id);
99
- },
100
-
101
97
  revert: function() {
102
- return scrivito.ajax('PUT', 'objs/' + that.id() + '/revert');
98
+ return that.enqueue_ajax('PUT', 'objs/'+that.id()+'/revert');
103
99
  },
104
100
 
105
101
  revert_widget: function(widget_id) {
106
- return scrivito.ajax('PUT', 'objs/'+that.id()+'/revert_widget?widget_id='+widget_id);
102
+ return that.enqueue_ajax('PUT',
103
+ 'objs/'+that.id()+'/revert_widget?widget_id='+widget_id);
107
104
  },
108
105
 
109
106
  conflicting_workspaces: function() {
110
- return scrivito.ajax('GET', 'objs/' + that.id() + '/conflicting_workspaces').then(
111
- function(workspace_datas) {
112
- return scrivito.workspace.from_data_collection(workspace_datas);
113
- });
114
- },
115
-
116
- is_outdated: function() {
117
- return scrivito.ajax('GET', 'objs/' + that.id() + '/is_outdated').then(
118
- function(result) { return result.is_outdated; });
107
+ return that.enqueue_ajax('GET', 'objs/'+that.id()+'/conflicting_workspaces')
108
+ .then(function(workspace_datas) {
109
+ return scrivito.workspace.from_data_collection(workspace_datas);
110
+ });
119
111
  },
120
112
 
121
113
  restore: function() {
122
- return scrivito.ajax('PUT', 'objs/' + that.id() + '/restore');
114
+ return that.enqueue_ajax('PUT', 'objs/'+that.id()+'/restore');
123
115
  },
124
116
 
125
117
  restore_widget: function(widget_id) {
126
- return scrivito.ajax('PUT', 'objs/'+that.id()+'/restore_widget?widget_id='+widget_id);
118
+ return that.enqueue_ajax('PUT',
119
+ 'objs/'+that.id()+'/restore_widget?widget_id='+widget_id);
127
120
  },
128
121
 
129
122
  details_src: function() {
@@ -131,37 +124,37 @@
131
124
  return '/__scrivito/page_details/' + that.id();
132
125
  },
133
126
 
134
- mark_resolved: function() {
135
- return scrivito.ajax('PUT', 'objs/' + that.id() + '/mark_resolved');
136
- },
137
-
138
- copy_to: function(path) {
139
- var attrs = {data: {parent_path: path}};
140
- return scrivito.ajax('POST', 'objs/'+that.id()+'/copy', attrs).then(function(data) {
141
- return scrivito.obj.create_instance(data);
142
- });
143
- },
144
-
145
- duplicate: function() {
146
- return scrivito.ajax('POST', 'objs/'+that.id()+'/duplicate').then(function(data) {
147
- return scrivito.obj.create_instance(data);
148
- });
149
- },
150
-
151
127
  transfer_modifications_to: function(workspace_id) {
152
- return scrivito.ajax('PUT', 'objs/'+that.id()+'/transfer_modifications',
128
+ return that.enqueue_ajax('PUT', 'objs/'+that.id()+'/transfer_modifications',
153
129
  {data: {workspace_id: workspace_id}});
154
130
  },
155
131
 
156
132
  reload: function() {
157
- return scrivito.ajax('GET', 'objs/'+that.id()).then(function(data) {
133
+ return that.enqueue_ajax('GET', 'objs/'+that.id()).then(function(data) {
158
134
  params.has_conflict = data.has_conflict;
159
135
  params.modification = data.modification;
160
136
  });
161
137
  },
162
138
 
163
139
  reload_widget: function(widget_id) {
164
- return scrivito.ajax('GET', 'objs/'+that.id()+'/widget?widget_id='+widget_id);
140
+ return that.enqueue_ajax('GET', 'objs/'+that.id()+'/widget?widget_id='+widget_id);
141
+ },
142
+
143
+ enqueue_ajax: function() {
144
+ var args = arguments;
145
+ var ajax = function() { return scrivito.ajax.apply(null, args); };
146
+
147
+ if (args[0] === 'GET') { return ajax(); }
148
+
149
+ var promise = $.Deferred();
150
+ (write_promises[that.id()] || $.Deferred().resolve()).always(function() {
151
+ ajax().then(
152
+ function() { promise.resolve.apply(promise, arguments); },
153
+ function() { promise.reject.apply(promise, arguments); }
154
+ );
155
+ });
156
+ write_promises[that.id()] = promise;
157
+ return promise;
165
158
  }
166
159
  };
167
160
 
@@ -187,7 +180,8 @@
187
180
  return scrivito.ajax('GET', path).then(function(selection) {
188
181
  var names = _.pluck(selection, 'name');
189
182
  var recent = scrivito.obj_class_selection.recent(names);
190
- var popular = _.intersection(scrivito.popular_obj_classes, names);
183
+ var all_popular_valid_obj_classes = _.intersection(scrivito.popular_obj_classes, names);
184
+ var popular = _.take(all_popular_valid_obj_classes, 5);
191
185
  return {
192
186
  all: _.sortBy(selection, 'name'),
193
187
  recent: _.map(recent, function(name) { return _.findWhere(selection, {name: name}); }),
@@ -197,21 +191,30 @@
197
191
  },
198
192
 
199
193
  fetch_page_class_selection: function(params) {
200
- if (!params || params === {}) {
201
- var current_page = scrivito.application_document().page();
202
- var path = (typeof current_page.provided_path === 'function') && current_page.provided_path();
203
- params = {};
204
- params['parent_path'] = path;
205
- }
206
194
  return scrivito.obj.fetch_class_selection('objs/page_class_selection', params);
207
195
  },
208
196
 
209
197
  create: function(attrs) {
210
- return prepare_attrs(scrivito.random_id(), attrs).then(function(prepared_attrs) {
211
- provide_default_path(prepared_attrs, provide_default_name(prepared_attrs));
212
- return persist_obj_data(prepared_attrs).then(function (data) {
213
- scrivito.obj_class_selection.store(prepared_attrs._obj_class);
214
- return scrivito.obj.create_instance(data);
198
+ attrs._id = scrivito.random_id();
199
+ return scrivito.ObjSerializer.serialize(attrs._id, attrs).then(function(serialized_attrs) {
200
+ // -- PATCH BEGINS HERE --
201
+ if (!serialized_attrs._path) {
202
+ var page = scrivito.application_document().page();
203
+ var path = (typeof page.provided_path === 'function') && page.provided_path();
204
+ var blobName;
205
+ if (typeof serialized_attrs.blob === 'object') {
206
+ blobName = serialized_attrs.blob.name || serialized_attrs.blob.filename;
207
+ }
208
+ if (path) {
209
+ var defaultName = blobName || serialized_attrs._obj_class || serialized_attrs._id;
210
+ serialized_attrs._path = path + "/" + defaultName;
211
+ }
212
+ }
213
+ // -- PATCH ENDS HERE --
214
+ var params = {data: {obj: serialized_attrs}};
215
+ return scrivito.ajax('POST', 'objs', params).then(function(obj_data) {
216
+ scrivito.obj_class_selection.store(serialized_attrs._obj_class);
217
+ return scrivito.obj.create_instance(obj_data);
215
218
  });
216
219
  });
217
220
  },
@@ -222,180 +225,12 @@
222
225
  if (result.status !== 'success') { return {obj: obj, reason: result.reason}; }
223
226
  });
224
227
  })).then(function() { return $.Deferred().resolve(_.compact(arguments)); });
225
- }
226
- }
227
- });
228
-
229
- var provide_default_name = function (attrs) {
230
- var default_name = null;
231
-
232
- $.each(attrs, function (key, value) {
233
- if (value && value.is_uploaded_binary && value.filename) {
234
- default_name = value.filename;
235
- } else if (is_file(value)) {
236
- default_name = value.name;
237
- }
238
- });
239
-
240
- if (default_name === null) {
241
- default_name = attrs._obj_class;
242
- } else {
243
- // this removes file extension if present
244
- default_name = default_name.replace(/\.[^\.]+$/, '');
245
- }
246
-
247
- return default_name;
248
- };
249
-
250
- var provide_default_path = function (attrs, default_name) {
251
- if (!(attrs._path)) {
252
- var current_page = scrivito.application_document().page();
253
- var path = (typeof current_page.provided_path === 'function') && current_page.provided_path();
254
-
255
- if (path && path !== "/") {
256
- attrs._path = path + "/" + default_name;
257
- }
258
- }
259
- };
228
+ },
260
229
 
261
- var obj_url = function (obj_id) {
262
- var url = window.location.protocol + '//' + window.location.host + '/__scrivito/objs';
263
- if (typeof obj_id !== 'undefined') {
264
- url = url + "/" + obj_id;
265
- }
266
- return url;
267
- };
268
-
269
- var persist_obj_data = function (attributes, obj_id) {
270
- var has_binary=false;
271
- var fd, defer, url, type;
272
-
273
- $.each(attributes, function (key, value) {
274
- if (value && value.is_uploaded_binary) {
275
- has_binary=true;
276
- } else if (is_file(value)) {
277
- has_binary=true
278
- }
279
- });
280
-
281
- // use standard handling for cases without binary upload
282
- if (!has_binary) {
283
- if (typeof obj_id !== 'undefined') {
284
- return scrivito.ajax('PUT', 'objs/'+obj_id, {data: {obj: attributes}});
285
- } else {
286
- return scrivito.ajax('POST', 'objs', {data: {obj: attributes}});
230
+ // For test purpose only.
231
+ clear_write_promises: function() {
232
+ write_promises = {};
287
233
  }
288
234
  }
289
-
290
- // use special handling for uploads
291
- fd = new FormData();
292
- url = obj_url(obj_id);
293
- type = (typeof obj_id !== 'undefined') ? 'PUT' : 'POST';
294
-
295
- $.each(attributes, function (key, value) {
296
- if ((typeof value === 'object') && (key == '_widget_pool')) {
297
- $.each(value, function (subkey, subval) {
298
- if (typeof value !== 'undefined') {
299
- fd.append('obj[' + key + ']' + '[' + subkey + ']', subval);
300
- }
301
- });
302
- } else if (value && value.is_uploaded_binary && value.filename) {
303
- fd.append('obj[' + key + ']', value.blob || value.file, value.filename);
304
- } else if (typeof value !== 'undefined') {
305
- fd.append('obj[' + key + ']', value);
306
- }
307
- });
308
-
309
- defer = $.Deferred();
310
-
311
- $.ajax({
312
- url: url,
313
- type: type,
314
- data: fd,
315
- processData: false,
316
- contentType: false
317
- })
318
- .error(function (xhr, text_status, error) {
319
- var error_message;
320
- var error_code;
321
- try {
322
- var error_json = JSON.parse(xhr.responseText);
323
- error_message = error_json.error;
324
- error_code = error_json.code;
325
- } catch (SyntaxError) {}
326
-
327
- if (!error_message) {
328
- error_message = error;
329
- }
330
- scrivito.display_ajax_error(error_message);
331
- defer.reject(error_message);
332
- })
333
- .success(function (new_data) {
334
- defer.resolve((new_data));
335
- });
336
-
337
- return defer.promise();
338
- };
339
-
340
- var is_file = function(object) {
341
- return object &&
342
- _.isFunction(object.slice) &&
343
- _.isDate(object.lastModifiedDate) &&
344
- _.isString(object.name);
345
- };
346
-
347
- var format_date_number = function(number) {
348
- var string = number.toString();
349
- return string.length === 1 ? '0' + string : string;
350
- };
351
-
352
- var serialize_date = function(date) {
353
- return date.getUTCFullYear().toString() +
354
- '-' + format_date_number(date.getUTCMonth() + 1) + // Month numbers are starting at 0.
355
- '-' + format_date_number(date.getUTCDate()) +
356
- 'T' + format_date_number(date.getUTCHours()) +
357
- ':' + format_date_number(date.getUTCMinutes()) +
358
- ':' + format_date_number(date.getUTCSeconds()) +
359
- 'Z';
360
- };
361
-
362
- var convert_attrs = function(obj_id, attrs) {
363
- var collected_promises = _.map(attrs, function(value, field_name) {
364
- if (is_file(value)) {
365
- return $.Deferred().resolve([field_name, value]);
366
- } else if (value && value.is_uploaded_binary) {
367
- return $.Deferred().resolve([field_name, value]);
368
- }
369
- return $.Deferred().resolve([field_name, scrivito.obj.serialize_value(value)]);
370
- });
371
-
372
- return $.when.apply(this, collected_promises).then(function() {
373
- return _.object(arguments);
374
- });
375
- };
376
-
377
- var convert_widget_pool = function(obj_id, widget_pool) {
378
- if (widget_pool) {
379
- var conversion_promises = _.map(widget_pool, function(attrs, widget_id) {
380
- return convert_attrs(obj_id, attrs).then(function(converted_attrs) {
381
- return [widget_id, converted_attrs];
382
- });
383
- });
384
-
385
- return $.when.apply(this, conversion_promises).then(function() {
386
- return _.object(arguments);
387
- });
388
- } else {
389
- return $.Deferred().resolve(widget_pool);
390
- }
391
- };
392
-
393
- var prepare_attrs = function(obj_id, attrs) {
394
- return convert_widget_pool(obj_id, attrs._widget_pool).then(function(widget_pool) {
395
- return convert_attrs(obj_id, attrs).then(function(converted_attrs) {
396
- converted_attrs._widget_pool = widget_pool;
397
- return converted_attrs;
398
- });
399
- });
400
- };
235
+ });
401
236
  }());