infopark_fiona7 1.2.0.2.3 → 1.5.2.0.0

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.
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,17 @@
1
+ (function() {
2
+ _.extend(scrivito, {
3
+ path_for_id: function(id) {
4
+ return '/__scrivito/' + id;
5
+ },
6
+
7
+ id_from_path: function(url) {
8
+ // -- PATCH BEGINS HERE --
9
+ var match = /__scrivito\/([a-z0-9]{4,})/.exec(url);
10
+ // -- PATHC ENDS HERE --
11
+
12
+ if (match) {
13
+ return match[1];
14
+ }
15
+ }
16
+ });
17
+ })();
@@ -0,0 +1,33 @@
1
+ 'use strict';
2
+
3
+ (function () {
4
+ scrivito.BinaryUtils = {
5
+ validateBinaryOptions: function validateBinaryOptions(options) {
6
+ if (_.has(options, 'filename') && !options.filename) {
7
+ throw new scrivito.ArgumentError('filename cannot be blank');
8
+ }
9
+
10
+ if (_.has(options, 'content_type') && !options.content_type) {
11
+ throw new scrivito.ArgumentError('content_type cannot be blank');
12
+ }
13
+
14
+ if (_.has(options, 'contentType') && !options.contentType) {
15
+ throw new scrivito.ArgumentError('contentType cannot be blank');
16
+ }
17
+ },
18
+
19
+ isBlob: function isBlob(obj) {
20
+ return !!obj && _.isNumber(obj.size) && _.isString(obj.type);
21
+ },
22
+
23
+ isFile: function isFile(obj) {
24
+ return this.isBlob(obj) && _.isDate(obj.lastModifiedDate) && _.isString(obj.name);
25
+ },
26
+
27
+ // -- PATCH BEGINS HERE --
28
+ isBlobWithName: function isBlobWithName(obj) {
29
+ return typeof obj === 'object' && this.isBlob(obj.blob_to_upload);
30
+ }
31
+ };
32
+ })();
33
+ // -- PATCH ENDS HERE --
@@ -0,0 +1,490 @@
1
+ 'use strict';
2
+
3
+ var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();
4
+
5
+ var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
6
+
7
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
8
+
9
+ (function () {
10
+ var MIN_REQUEST_TIME = 5;
11
+ var DEFAULT_REQUEST_TIMEOUT = 120000; // <-- PATCH HERE
12
+ var backendEndpoint = undefined;
13
+ var tenant = undefined;
14
+
15
+ scrivito.CmsRestApi = {
16
+ init: function init(endpoint, initTenant) {
17
+ backendEndpoint = endpoint;
18
+ tenant = initTenant;
19
+ },
20
+
21
+ get: function get(path, requestParams) {
22
+ return fetch('GET', path, requestParams);
23
+ },
24
+
25
+ put: function put(path, requestParams) {
26
+ return fetch('PUT', path, requestParams);
27
+ },
28
+
29
+ post: function post(path, requestParams) {
30
+ return fetch('POST', path, requestParams);
31
+ },
32
+
33
+ 'delete': function _delete(path) {
34
+ return fetch('DELETE', path);
35
+ }
36
+ };
37
+
38
+ var Timer = (function () {
39
+ function Timer() {
40
+ var timeout = arguments.length <= 0 || arguments[0] === undefined ? DEFAULT_REQUEST_TIMEOUT : arguments[0];
41
+
42
+ _classCallCheck(this, Timer);
43
+
44
+ this.timesOutAt = Date.now() + timeout;
45
+ }
46
+
47
+ _createClass(Timer, [{
48
+ key: 'timedOut',
49
+ value: function timedOut() {
50
+ return this.remainingTime() < MIN_REQUEST_TIME;
51
+ }
52
+ }, {
53
+ key: 'remainingTime',
54
+ value: function remainingTime() {
55
+ return Math.max(this.timesOutAt - Date.now(), 0);
56
+ }
57
+ }, {
58
+ key: 'cover',
59
+ value: function cover(time) {
60
+ return time <= this.timesOutAt - MIN_REQUEST_TIME;
61
+ }
62
+ }]);
63
+
64
+ return Timer;
65
+ })();
66
+
67
+ function fetch(method, path, requestParams) {
68
+ return request(method, path, requestParams).then(function (result) {
69
+ if (result && result.task && _.size(result) === 1) {
70
+ return handleTask(result.task);
71
+ }
72
+ return result;
73
+ });
74
+ }
75
+
76
+ function request(method, path, requestParams) {
77
+ var timer = new Timer();
78
+ return retryOnceOnError(timer, method, function () {
79
+ return retryOnRateLimit(timer, function () {
80
+ return scrivito.SessionKeeper.performWithToken(function (token) {
81
+ var ajaxDeferred = ajax(method, path, requestParams, timer.remainingTime(), token);
82
+ return scrivito.Promise.resolve(ajaxDeferred)['catch'](checkAuthorization);
83
+ });
84
+ })['catch'](function (error) {
85
+ return raiseError(error);
86
+ });
87
+ });
88
+ }
89
+
90
+ function retryOnceOnError(timer, method, requestCallback) {
91
+ if (method === 'POST') {
92
+ return requestCallback();
93
+ }
94
+
95
+ return requestCallback()['catch'](function (error) {
96
+ if (!timer.timedOut()) {
97
+ if (error instanceof scrivito.BackendError) {
98
+ return requestCallback();
99
+ }
100
+ if (error instanceof scrivito.NetworkError) {
101
+ return requestCallback();
102
+ }
103
+ }
104
+ throw error;
105
+ });
106
+ }
107
+
108
+ function retryOnRateLimit(timer, requestCallback) {
109
+ var retry = function retry(retryCount) {
110
+ return requestCallback()['catch'](function (error) {
111
+ if (error.status === 429) {
112
+ var timeout = calculateTimeout(error.getResponseHeader('Retry-After'), retryCount);
113
+ if (timer.cover(Date.now() + timeout)) {
114
+ return scrivito.Promise.resolve(scrivito.waitMs(timeout)).then(function () {
115
+ return retry(retryCount + 1);
116
+ });
117
+ }
118
+ throw new scrivito.RateLimitExceededError('rate limit exceeded', 429);
119
+ }
120
+ throw error;
121
+ });
122
+ };
123
+
124
+ return retry(0);
125
+ }
126
+
127
+ function calculateTimeout(retryAfter, retryCount) {
128
+ var calculatedTimeout = Math.pow(2, retryCount) * 0.5 * 1000;
129
+ return Math.max(calculatedTimeout, retryAfter * 1000);
130
+ }
131
+
132
+ function raiseError(error) {
133
+ if (error.status === undefined || !_.isNumber(error.status)) {
134
+ throw error;
135
+ } else if (error.status === 0) {
136
+ throw new scrivito.NetworkError(error.statusText, error.status);
137
+ }
138
+
139
+ var errorBody = parseError(error);
140
+ var specificOutput = errorBody.error;
141
+
142
+ if (error.status === 403) {
143
+ throw new scrivito.AccessDeniedError(specificOutput, error.status, errorBody.code);
144
+ } else if (error.status.toString()[0] === '4' && specificOutput) {
145
+ throw new scrivito.ClientError(specificOutput, error.status, errorBody.code);
146
+ } else if (error.status === 500 && specificOutput) {
147
+ throw new scrivito.BackendError(specificOutput, error.status);
148
+ }
149
+ throw new scrivito.NetworkError(error.responseText, error.status);
150
+ }
151
+
152
+ function checkAuthorization(error) {
153
+ if (error.status === 401) {
154
+ var errorBody = parseError(error);
155
+ var specificOutput = errorBody.error;
156
+ throw new scrivito.UnauthorizedError(specificOutput, error.status, errorBody.code);
157
+ }
158
+ throw error;
159
+ }
160
+
161
+ function parseError(error) {
162
+ try {
163
+ return JSON.parse(error.responseText);
164
+ } catch (err) {
165
+ if (err instanceof SyntaxError) {
166
+ throw new scrivito.NetworkError(error.responseText, error.status);
167
+ }
168
+ throw err;
169
+ }
170
+ }
171
+
172
+ function prepareAjaxParams(method, path) {
173
+ var requestParams = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
174
+
175
+ var ajaxParams = {
176
+ path: path,
177
+ verb: method,
178
+ params: requestParams
179
+ };
180
+
181
+ return {
182
+ data: JSON.stringify(ajaxParams)
183
+ };
184
+ }
185
+
186
+ function ajax(method, path, requestParams, timeout, token) {
187
+ // -- PATCH BEGINS HERE --
188
+ if (ajaxWithFormDataRequired(requestParams) /* || true */) {
189
+ return ajaxWithFormData(method, path, requestParams, timeout, token);
190
+ }
191
+ // -- PATCH ENDS HERE --
192
+
193
+ var ajaxParams = prepareAjaxParams(method, path, requestParams);
194
+ var ajaxMethod = method === 'POST' ? 'POST' : 'PUT';
195
+ var url = '/_f7/tenants/' + tenant + '/perform'; // <-- PATCH HERE
196
+
197
+ return $.ajax(_.extend({
198
+ url: url,
199
+ method: ajaxMethod,
200
+ contentType: 'application/json; charset=utf-8',
201
+ dataType: 'json',
202
+ //headers: { Authorization: `Session ${token}` }, // <-- PATCH HERE
203
+ timeout: timeout,
204
+ cache: false, // Don't cache GET requests.
205
+ xhrFields: { withCredentials: true }
206
+ }, ajaxParams)).then(function (result, textStatus, xhr) {
207
+ return $.Deferred().resolve(result);
208
+ }, function (xhr, textStatus, xhrError) {
209
+ return $.Deferred().reject(xhr);
210
+ });
211
+ }
212
+
213
+ // -- PATCH BEGINS HERE --
214
+ function ajaxWithFormDataRequired(params) {
215
+ var objParams = params && params.obj;
216
+ var result = false;
217
+
218
+ if (!objParams) {
219
+ return result;
220
+ }
221
+
222
+ var _iteratorNormalCompletion = true;
223
+ var _didIteratorError = false;
224
+ var _iteratorError = undefined;
225
+
226
+ try {
227
+ for (var _iterator = Object.keys(objParams)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
228
+ var k = _step.value;
229
+
230
+ // if params[k] is an array
231
+ if (objParams[k].pop) {
232
+ // file uploads require form data
233
+ result = scrivito.BinaryUtils.isFile(objParams[k][1]) || scrivito.BinaryUtils.isBlob(objParams[k][1]) || scrivito.BinaryUtils.isBlobWithName(objParams[k][1]);
234
+ if (result) {
235
+ return result;
236
+ }
237
+ }
238
+ }
239
+ } catch (err) {
240
+ _didIteratorError = true;
241
+ _iteratorError = err;
242
+ } finally {
243
+ try {
244
+ if (!_iteratorNormalCompletion && _iterator['return']) {
245
+ _iterator['return']();
246
+ }
247
+ } finally {
248
+ if (_didIteratorError) {
249
+ throw _iteratorError;
250
+ }
251
+ }
252
+ }
253
+
254
+ return result;
255
+ }
256
+
257
+ function ajaxWithFormData(method, path, requestParams, timeout, token) {
258
+ var formData = paramsToFormData(method, path, requestParams);
259
+ var ajaxMethod = method === 'POST' ? 'POST' : 'PUT';
260
+ var url = '/_f7/tenants/' + tenant + '/perform';
261
+
262
+ return $.ajax(_.extend({
263
+ url: url,
264
+ method: ajaxMethod,
265
+ contentType: false,
266
+ processData: false,
267
+ data: formData,
268
+ timeout: timeout,
269
+ cache: false, // Don't cache GET requests.
270
+ xhrFields: { withCredentials: true }
271
+ })).then(function (result, textStatus, xhr) {
272
+ return $.Deferred().resolve(result);
273
+ }, function (xhr, textStatus, xhrError) {
274
+ return $.Deferred().reject(xhr);
275
+ });
276
+ }
277
+
278
+ function paramsToFormData(verb, path, params) {
279
+ var objParams = params && params.obj || {};
280
+ var fd = new FormData();
281
+ fd.append('verb', verb);
282
+ fd.append('path', path);
283
+
284
+ var _iteratorNormalCompletion2 = true;
285
+ var _didIteratorError2 = false;
286
+ var _iteratorError2 = undefined;
287
+
288
+ try {
289
+ for (var _iterator2 = Object.keys(objParams)[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
290
+ var attr = _step2.value;
291
+
292
+ // attr is a [type, value] pair
293
+ if (typeof objParams[attr] === 'object' && objParams[attr].pop) {
294
+ var _objParams$attr = _slicedToArray(objParams[attr], 2);
295
+
296
+ var type = _objParams$attr[0];
297
+ var value = _objParams$attr[1];
298
+
299
+ if (value.pop) {
300
+ // multienum / stringlist / widgetlist
301
+ fd.append('params[obj][' + attr + '[]', type);
302
+ for (var i = 0; i < value.length; ++i) {
303
+ fd.append('params[obj][' + attr + '[][formdata$workaround][]', value[i]);
304
+ }
305
+ } else if (scrivito.BinaryUtils.isFile(value) || scrivito.BinaryUtils.isBlob(value)) {
306
+ // upload
307
+ fd.append('params[obj][' + attr + '][]', type);
308
+ fd.append('params[obj][' + attr + '][]', value);
309
+ } else if (scrivito.BinaryUtils.isBlobWithName(value)) {
310
+ fd.append('params[obj][' + attr + '][]', type);
311
+ fd.append('params[obj][' + attr + '][]', value.blob_to_upload, value.filename);
312
+ } else if (typeof value === 'object') {
313
+ // blob/copy rename
314
+ fd.append('params[obj][' + attr + '[]', type);
315
+ var _iteratorNormalCompletion3 = true;
316
+ var _didIteratorError3 = false;
317
+ var _iteratorError3 = undefined;
318
+
319
+ try {
320
+ for (var _iterator3 = Object.keys(value)[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
321
+ var l = _step3.value;
322
+
323
+ fd.append('params[obj][' + attr + '][][' + l + ']', value[l]);
324
+ }
325
+ } catch (err) {
326
+ _didIteratorError3 = true;
327
+ _iteratorError3 = err;
328
+ } finally {
329
+ try {
330
+ if (!_iteratorNormalCompletion3 && _iterator3['return']) {
331
+ _iterator3['return']();
332
+ }
333
+ } finally {
334
+ if (_didIteratorError3) {
335
+ throw _iteratorError3;
336
+ }
337
+ }
338
+ }
339
+ } else if (typeof value !== 'undefined') {
340
+ fd.append('params[obj][' + attr + '][]', type);
341
+ fd.append('params[obj][' + attr + '][]', value);
342
+ }
343
+ // special handling for widget pool
344
+ } else if (attr === '_widget_pool') {
345
+ var value = objParams[attr];
346
+ var _iteratorNormalCompletion4 = true;
347
+ var _didIteratorError4 = false;
348
+ var _iteratorError4 = undefined;
349
+
350
+ try {
351
+ for (var _iterator4 = Object.keys(value)[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
352
+ var widgetId = _step4.value;
353
+
354
+ var widget = value[widgetId];
355
+ var _iteratorNormalCompletion5 = true;
356
+ var _didIteratorError5 = false;
357
+ var _iteratorError5 = undefined;
358
+
359
+ try {
360
+ for (var _iterator5 = Object.keys(widget)[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
361
+ var widgetAttr = _step5.value;
362
+
363
+ if (widget[widgetAttr].pop) {
364
+ var _widget$widgetAttr = _slicedToArray(widget[widgetAttr], 2);
365
+
366
+ var widgetAttrType = _widget$widgetAttr[0];
367
+ var widgetValue = _widget$widgetAttr[1];
368
+
369
+ // FIXME: Duplication
370
+ if (widgetValue.pop) {
371
+ // multienum / stringlist / widgetlist
372
+ fd.append('params[obj][' + attr + '][' + widgetId + '][' + widgetAttr + '][]', widgetAttrType);
373
+ for (var i = 0; i < widgetValue.length; ++i) {
374
+ fd.append('params[obj][' + attr + '][' + widgetId + '][' + widgetAttr + '][][formdata$workaround][]', widgetValue[i]);
375
+ }
376
+ } else if (scrivito.BinaryUtils.isFile(widgetValue) || scrivito.BinaryUtils.isBlob(widgetValue)) {
377
+ // upload
378
+ fd.append('params[obj][' + attr + '][' + widgetId + '][' + widgetAttr + '][]', widgetAttrType);
379
+ fd.append('params[obj][' + attr + '][' + widgetId + '][' + widgetAttr + '][]', widgetValue);
380
+ } else if (scrivito.BinaryUtils.isBlobWithName(widgetValue)) {
381
+ fd.append('params[obj][' + attr + '][' + widgetId + '][' + widgetAttr + '][]', widgetAttrType);
382
+ fd.append('params[obj][' + attr + '][' + widgetId + '][' + widgetAttr + '][]', widgetValue.blob_to_upload, widgetValue.filename);
383
+ } else if (typeof widgetValue === 'object') {
384
+ // blob/copy rename
385
+ fd.append('params[obj][' + attr + '][' + widgetId + '][' + widgetAttr + '][]', widgetAttrType);
386
+ var _iteratorNormalCompletion6 = true;
387
+ var _didIteratorError6 = false;
388
+ var _iteratorError6 = undefined;
389
+
390
+ try {
391
+ for (var _iterator6 = Object.keys(widgetValue)[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
392
+ var l = _step6.value;
393
+
394
+ fd.append('params[obj][' + attr + '][' + widgetId + '][' + widgetAttr + '][][' + l + ']', widgetValue[l]);
395
+ }
396
+ } catch (err) {
397
+ _didIteratorError6 = true;
398
+ _iteratorError6 = err;
399
+ } finally {
400
+ try {
401
+ if (!_iteratorNormalCompletion6 && _iterator6['return']) {
402
+ _iterator6['return']();
403
+ }
404
+ } finally {
405
+ if (_didIteratorError6) {
406
+ throw _iteratorError6;
407
+ }
408
+ }
409
+ }
410
+ } else {
411
+ // normal value
412
+ fd.append('params[obj][' + attr + '][' + widgetId + '][' + widgetAttr + '][]', widgetAttrType);
413
+ fd.append('params[obj][' + attr + '][' + widgetId + '][' + widgetAttr + '][]', widgetValue);
414
+ }
415
+ } else {
416
+ // hopefully a built-in attribute :-)
417
+ fd.append('params[obj][' + attr + '][' + widgetId + '][' + widgetAttr + ']', widget[widgetAttr]);
418
+ }
419
+ }
420
+ } catch (err) {
421
+ _didIteratorError5 = true;
422
+ _iteratorError5 = err;
423
+ } finally {
424
+ try {
425
+ if (!_iteratorNormalCompletion5 && _iterator5['return']) {
426
+ _iterator5['return']();
427
+ }
428
+ } finally {
429
+ if (_didIteratorError5) {
430
+ throw _iteratorError5;
431
+ }
432
+ }
433
+ }
434
+ }
435
+ } catch (err) {
436
+ _didIteratorError4 = true;
437
+ _iteratorError4 = err;
438
+ } finally {
439
+ try {
440
+ if (!_iteratorNormalCompletion4 && _iterator4['return']) {
441
+ _iterator4['return']();
442
+ }
443
+ } finally {
444
+ if (_didIteratorError4) {
445
+ throw _iteratorError4;
446
+ }
447
+ }
448
+ }
449
+ } else {
450
+ // hopefully a built-in attribute :-)
451
+ fd.append('params[obj][' + attr + ']', objParams[attr]);
452
+ }
453
+ }
454
+ } catch (err) {
455
+ _didIteratorError2 = true;
456
+ _iteratorError2 = err;
457
+ } finally {
458
+ try {
459
+ if (!_iteratorNormalCompletion2 && _iterator2['return']) {
460
+ _iterator2['return']();
461
+ }
462
+ } finally {
463
+ if (_didIteratorError2) {
464
+ throw _iteratorError2;
465
+ }
466
+ }
467
+ }
468
+
469
+ return fd;
470
+ }
471
+
472
+ // -- PATCH ENDS HERE --
473
+
474
+ function handleTask(task) {
475
+ switch (task.status) {
476
+ case 'success':
477
+ return task.result;
478
+ case 'error':
479
+ throw new scrivito.ClientError(task.message, undefined, task.code);
480
+ case 'open':
481
+ return scrivito.wait(2).then(function () {
482
+ return request('GET', 'tasks/' + task.id).then(function (result) {
483
+ return handleTask(result);
484
+ });
485
+ });
486
+ default:
487
+ throw new scrivito.ScrivitoError('Invalid task response (unknown status)');
488
+ }
489
+ }
490
+ })();