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,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
+ })();