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,650 @@
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
+ var _get = function get(_x4, _x5, _x6) { var _again = true; _function: while (_again) { var object = _x4, property = _x5, receiver = _x6; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x4 = parent; _x5 = property; _x6 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
8
+
9
+ function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } }
10
+
11
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
12
+
13
+ function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
14
+
15
+ (function () {
16
+ var SYSTEM_ATTRIBUTES = {
17
+ _id: 'id',
18
+ _obj_class: 'objClass',
19
+ _path: 'path',
20
+ _permalink: 'permalink',
21
+ _last_changed: 'lastChanged'
22
+ };
23
+
24
+ /**
25
+ * The base class for CMS objects.
26
+ *
27
+ * A CMS object is a collection of properties and their values, as defined
28
+ * by its object class.
29
+ *
30
+ * @borrows scrivito.AttributeContent#get as #get
31
+ */
32
+ scrivito.BasicObj = (function (_scrivito$AttributeContent) {
33
+ _inherits(BasicObj, _scrivito$AttributeContent);
34
+
35
+ _createClass(BasicObj, null, [{
36
+ key: 'fetch',
37
+
38
+ /**
39
+ * Fetch a given Obj by its `id`.
40
+ *
41
+ * @param {string} id - The id of the Obj
42
+ * @returns {Promise<scrivito.BasicObj>} A promise that resolves to the obj with the given
43
+ * id. In case no CMS object with the given `id` exists, the promise is rejected with
44
+ * a {@link scrivito.ResourceNotFoundError}.
45
+ */
46
+ value: function fetch(id) {
47
+ scrivito.asyncMethodStub();
48
+ }
49
+
50
+ /**
51
+ * Get a given Obj by its `id`.
52
+ *
53
+ * @param {string} id - The id of the Obj
54
+ * @throws {scrivito.ResourceNotFoundError} If the CMS object with the given `id`
55
+ * does not exists.
56
+ * @throws {scrivito.NotLoadedError} If the CMS object is not yet loaded.
57
+ * @returns {scrivito.BasicObj}
58
+ */
59
+ }, {
60
+ key: 'get',
61
+ value: function get(id) {
62
+ var objData = scrivito.ObjDataStore.get(id);
63
+ return new scrivito.BasicObj(objData);
64
+ }
65
+
66
+ /**
67
+ * Create a new {@link scrivito.BasicObj Obj}.
68
+ *
69
+ * @param attributes the new obj's attributes. The `_obj_class` has to be provided
70
+ *
71
+ * @return {scrivito.BasicObj} the newly created obj.
72
+ * @throws {scrivito.ArgumentError} if the `_obj_class` is missing or invalid.
73
+ */
74
+ }, {
75
+ key: 'create',
76
+ value: function create(attributes) {
77
+ ensureObjClassExists(attributes._obj_class);
78
+
79
+ if (!attributes._id) {
80
+ attributes._id = this.generateId();
81
+ }
82
+
83
+ return this.createWithSerializedAttributes(_.pick(attributes, '_obj_class', '_id'), attributes);
84
+ }
85
+ }, {
86
+ key: 'createWithDefaults',
87
+ value: function createWithDefaults(_ref) {
88
+ var _this = this;
89
+
90
+ var _obj_class = _ref._obj_class;
91
+ var _path = _ref._path;
92
+
93
+ var attributes = undefined;
94
+ if (_path) {
95
+ attributes = { _path: _path };
96
+ }
97
+
98
+ return scrivito.ObjClass.find(_obj_class).fetchDefaults(attributes).then(function (serializedAttributes) {
99
+ return _this.createWithSerializedAttributes(serializedAttributes);
100
+ }).then(function (obj) {
101
+ return obj.finishSaving().then(function () {
102
+ return obj;
103
+ });
104
+ });
105
+ }
106
+ }, {
107
+ key: 'addChildWithSerializedAttributes',
108
+ value: function addChildWithSerializedAttributes(parentPath, serializedAttributes) {
109
+ var objId = scrivito.BasicObj.generateId();
110
+ var defaultName = serializedAttributes._obj_class || objId; // <-- PATCH HERE
111
+ return this.createWithSerializedAttributes(_.extend({}, serializedAttributes, {
112
+ _id: objId,
113
+ _path: parentPath + '/' + defaultName }));
114
+ }
115
+ }, {
116
+ key: 'createWithSerializedAttributes',
117
+ // <-- PATCH HERE
118
+ value: function createWithSerializedAttributes(serializedAttributes, attributeDict) {
119
+ if (!attributeDict) {
120
+ return this.createWithSerializedAttributes.apply(this, _toConsumableArray(extractAttributeDict(serializedAttributes)));
121
+ }
122
+
123
+ // -- PATCH BEGINS HERE --
124
+ if (!serializedAttributes._path) {
125
+ var page = scrivito.application_document().page();
126
+ var path = typeof page.provided_path === 'function' && page.provided_path();
127
+ if (path) {
128
+ var blobName = undefined;
129
+ if (typeof serializedAttributes.blob === 'object') {
130
+ blobName = serializedAttributes.blob.name || serializedAttributes.blob.filename;
131
+ } else {
132
+ blobName = undefined;
133
+ }
134
+ var defaultName = blobName || serializedAttributes._name || serializedAttributes._obj_class || serializedAttributes._id;
135
+ serializedAttributes._path = path + '/' + defaultName;
136
+ }
137
+ }
138
+ // -- PATCH ENDS HERE --
139
+
140
+ var objData = scrivito.ObjDataStore.createObjData(serializedAttributes._id);
141
+ objData.update(serializedAttributes);
142
+
143
+ var obj = new scrivito.BasicObj(objData);
144
+ obj.update(attributeDict);
145
+
146
+ return obj;
147
+ }
148
+ }, {
149
+ key: 'generateId',
150
+ value: function generateId() {
151
+ return scrivito.random_id();
152
+ }
153
+
154
+ /**
155
+ * Returns an {@link scrivito.ObjSearchIterable} of all {@link scrivito.BasicObj}s.
156
+ * @return {scrivito.ObjSearchIterable}
157
+ */
158
+ }, {
159
+ key: 'all',
160
+ value: function all() {
161
+ return new scrivito.ObjSearchIterable().batchSize(1000);
162
+ }
163
+
164
+ /**
165
+ * Returns an {@link scrivito.ObjSearchIterable} with the given initial subquery consisting
166
+ * of the four arguments.
167
+ *
168
+ * Note that `field` and `value` can also be arrays for searching several fields or searching
169
+ * for several values. For detailed information see {@link scrivito.ObjSearchIterable}.
170
+ *
171
+ * @example
172
+ * // Look for objects with left-over "Lorem", boosting headline matches:
173
+ * scrivito.BasicObj.where(:*, :contains, 'Lorem', headline: 2)
174
+ *
175
+ * @param {String|String[]} field See {@link scrivito.ObjSearchIterable#and} for details
176
+ * @param {String} operator See {@link scrivito.ObjSearchIterable#and} for details
177
+ * @param {String|String[]} value See {@link scrivito.ObjSearchIterable#and} for details
178
+ * @param {Object} [boost] See {@link scrivito.ObjSearchIterable#and} for details
179
+ * @return {scrivito.ObjSearchIterable}
180
+ */
181
+ }, {
182
+ key: 'where',
183
+ value: function where(field, operator, value) {
184
+ var boost = arguments.length <= 3 || arguments[3] === undefined ? null : arguments[3];
185
+
186
+ return new scrivito.ObjSearchIterable().and(field, operator, value, boost);
187
+ }
188
+
189
+ /**
190
+ * Find the {@link scrivito.BasicObj Obj} with the given path.
191
+ * Returns `null` if no matching Obj exists.
192
+ * @param {String} path Path of the {@link scrivito.BasicObj Obj}.
193
+ * @return {scrivito.BasicObj?}
194
+ * @throws {scrivito.NotLoadedError} If the CMS object is not yet loaded.
195
+ */
196
+ }, {
197
+ key: 'findByPath',
198
+ value: function findByPath(path) {
199
+ return scrivito.iterable.firstValueFromIterator(this.where('_path', 'equals', path).iterator());
200
+ }
201
+
202
+ /**
203
+ * Returns the {@link scrivito.BasicObj Obj} with the given permalink, or `null` if no
204
+ * matching Obj exists.
205
+ * @param {String} permalink The permalink of the {@link scrivito.BasicObj Obj}.
206
+ * @return {scrivito.BasicObj?}
207
+ * @throws {scrivito.NotLoadedError} If the CMS object is not yet loaded.
208
+ */
209
+ }, {
210
+ key: 'findByPermalink',
211
+ value: function findByPermalink(permalink) {
212
+ var iterator = this.where('_permalink', 'equals', permalink).iterator();
213
+ return scrivito.iterable.firstValueFromIterator(iterator);
214
+ }
215
+
216
+ /**
217
+ * The constructor is not part of the public API and should **not** be used.
218
+ *
219
+ * Please use {@link scrivito.BasicObj.fetch} to access existing CMS objects or
220
+ * {@link scrivito.BasicObj.create} to create a new one.
221
+ */
222
+ }]);
223
+
224
+ function BasicObj(objData) {
225
+ _classCallCheck(this, BasicObj);
226
+
227
+ _get(Object.getPrototypeOf(BasicObj.prototype), 'constructor', this).call(this);
228
+ this.objData = objData;
229
+ }
230
+
231
+ /**
232
+ * The `id` of the CMS object
233
+ * @type {String}
234
+ */
235
+
236
+ _createClass(BasicObj, [{
237
+ key: 'getParent',
238
+ value: function getParent() {
239
+ if (this._hasParent()) {
240
+ return scrivito.BasicObj.findByPath(computeParentPath(this.path));
241
+ }
242
+
243
+ return null;
244
+ }
245
+ }, {
246
+ key: 'hasConflicts',
247
+ value: function hasConflicts() {
248
+ return !!this._current._conflicts;
249
+ }
250
+ }, {
251
+ key: 'fetchParent',
252
+
253
+ /**
254
+ * Fetches the {@link scrivito.BasicObj} that is the parent of this Obj.
255
+ *
256
+ * @returns {Promise<scrivito.BasicObj>} A promise that resolves to the parent Obj.
257
+ * Resolves to `null` if the obj has no parent.
258
+ */
259
+ value: function fetchParent() {
260
+ scrivito.asyncMethodStub();
261
+ }
262
+
263
+ /**
264
+ * Returns a list of all child {@link scrivito.BasicObj Objs}
265
+ *
266
+ * Throws a {@link scrivito.NotLoadedError} if the children are not yet loaded.
267
+ *
268
+ * @type {scrivito.BasicObj[]}
269
+ */
270
+ }, {
271
+ key: 'update',
272
+
273
+ /**
274
+ * Updates the attributes of the current CMS object.
275
+ *
276
+ * @param {Object} attributes - the new attributes
277
+ *
278
+ * @example
279
+ * // Change the permalink of a CMS object
280
+ * obj.update({_permalink: '/blog'});
281
+ *
282
+ * @example
283
+ * // Change a string and reorder widgets
284
+ * obj.update({title: 'New Title', body: obj.get('body').reverse()});
285
+ */
286
+ value: function update(attributes) {
287
+ this._persistWidgets(this, this._objClass, attributes);
288
+ var patch = scrivito.AttributeSerializer.serialize(this._objClass, attributes);
289
+ this.objData.update(patch);
290
+ this._linkResolution.start();
291
+ }
292
+ }, {
293
+ key: 'copyAsync',
294
+ value: function copyAsync() {
295
+ var copyOptions = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
296
+
297
+ assertValidCopyOptions(copyOptions);
298
+
299
+ return this._copyAttributes().then(function (copiedAttributes) {
300
+ var serializedAttributes = _.extend(copiedAttributes, copyOptions);
301
+ var obj = scrivito.BasicObj.createWithSerializedAttributes(serializedAttributes);
302
+ return obj.finishSaving().then(function () {
303
+ return obj;
304
+ });
305
+ });
306
+ }
307
+ }, {
308
+ key: 'moveToAsync',
309
+ value: function moveToAsync(parentPath) {
310
+ this.update({ _path: parentPath + '/' + this.id });
311
+ return this.finishSaving();
312
+ }
313
+ }, {
314
+ key: 'markResolvedAsync',
315
+ value: function markResolvedAsync() {
316
+ this.update({ _conflicts: null });
317
+ return this.finishSaving();
318
+ }
319
+
320
+ /**
321
+ * Resolves when all previous {@link scrivito.BasicObj#update updates} have been persisted.
322
+ * If an update fails the promise is rejected.
323
+ *
324
+ * @returns {Promise}
325
+ */
326
+ }, {
327
+ key: 'finishSaving',
328
+ value: function finishSaving() {
329
+ var _this2 = this;
330
+
331
+ var finish = this._linkResolution.finishResolving().then(function () {
332
+ return _this2.objData.finishSaving();
333
+ });
334
+ return new scrivito.PublicPromise(finish);
335
+ }
336
+
337
+ /**
338
+ * Access widgets by their ids
339
+ *
340
+ * @param {String} id - the widget's id
341
+ * @returns {?scrivito.BasicWidget}
342
+ */
343
+ }, {
344
+ key: 'widget',
345
+ value: function widget(id) {
346
+ if (this.widgetData(id)) {
347
+ return scrivito.BasicWidget.build(id, this);
348
+ }
349
+ return null;
350
+ }
351
+
352
+ /**
353
+ * Returns all widgets of the given CMS object
354
+ *
355
+ * @returns {scrivito.BasicWidget[]}
356
+ */
357
+ }, {
358
+ key: 'widgets',
359
+ value: function widgets() {
360
+ var _this3 = this;
361
+
362
+ return _.map(_.keys(this._widgetPool), function (id) {
363
+ return _this3.widget(id);
364
+ });
365
+ }
366
+ }, {
367
+ key: 'widgetData',
368
+ value: function widgetData(id) {
369
+ return this._widgetPool[id];
370
+ }
371
+ }, {
372
+ key: 'generateWidgetId',
373
+ value: function generateWidgetId() {
374
+ for (var i = 0; i < 10; i++) {
375
+ var id = scrivito.random_hex();
376
+
377
+ if (!this.widget(id)) {
378
+ return id;
379
+ }
380
+ }
381
+
382
+ $.error('Could not generate a new unused widget id.');
383
+ }
384
+ }, {
385
+ key: 'serializeAttributes',
386
+ value: function serializeAttributes() {
387
+ var serializedAttributes = _get(Object.getPrototypeOf(BasicObj.prototype), 'serializeAttributes', this).call(this);
388
+
389
+ delete serializedAttributes._conflicts;
390
+ delete serializedAttributes._modification;
391
+ delete serializedAttributes._last_changed;
392
+
393
+ return serializedAttributes;
394
+ }
395
+ }, {
396
+ key: '_hasParent',
397
+ value: function _hasParent() {
398
+ return this.path && this.path !== '/';
399
+ }
400
+ }, {
401
+ key: '_copyAttributes',
402
+ value: function _copyAttributes() {
403
+ var objId = scrivito.BasicObj.generateId();
404
+ var serializedAttributes = this.serializeAttributes();
405
+ var uploadPromises = [];
406
+
407
+ _.each(serializedAttributes, function (typeAndValue, name) {
408
+ if (name[0] === '_') {
409
+ delete serializedAttributes[name];
410
+ return;
411
+ }
412
+
413
+ var _typeAndValue = _slicedToArray(typeAndValue, 2);
414
+
415
+ var type = _typeAndValue[0];
416
+ var value = _typeAndValue[1];
417
+
418
+ if (type === 'binary' && value) {
419
+ var futureBinary = new scrivito.FutureBinary({ idToCopy: value.id });
420
+ var promise = futureBinary.into(objId).then(function (binary) {
421
+ return { name: name, binary: binary };
422
+ });
423
+ uploadPromises.push(promise);
424
+ }
425
+ });
426
+
427
+ serializedAttributes._id = objId;
428
+ serializedAttributes._obj_class = this.objClass;
429
+ if (this.path) {
430
+ serializedAttributes._path = computeParentPath(this.path) + '/' + objId;
431
+ }
432
+
433
+ return scrivito.PublicPromise.all(uploadPromises).then(function (binaries) {
434
+ _.each(binaries, function (_ref2) {
435
+ var name = _ref2.name;
436
+ var binary = _ref2.binary;
437
+
438
+ serializedAttributes[name] = ['binary', { id: binary.id }];
439
+ });
440
+
441
+ return serializedAttributes;
442
+ });
443
+ }
444
+ }, {
445
+ key: 'id',
446
+ get: function get() {
447
+ return this._current._id;
448
+ }
449
+
450
+ /**
451
+ * The object class name of the CMS object
452
+ * @type {String}
453
+ */
454
+ }, {
455
+ key: 'objClass',
456
+ get: function get() {
457
+ return this._current._obj_class;
458
+ }
459
+
460
+ /**
461
+ * The date the CMS object was last changed.
462
+ * Returns `null` if the obj has not been changed yet.
463
+ * @type {?Date}
464
+ */
465
+ }, {
466
+ key: 'lastChanged',
467
+ get: function get() {
468
+ if (this._current._last_changed) {
469
+ return scrivito.parseDate(this._current._last_changed);
470
+ }
471
+
472
+ return null;
473
+ }
474
+
475
+ /**
476
+ * The path of the CMS object
477
+ * @type {?String}
478
+ */
479
+ }, {
480
+ key: 'path',
481
+ get: function get() {
482
+ return this._current._path || null;
483
+ }
484
+
485
+ /**
486
+ * The permalink of the CMS object
487
+ * @type {?String}
488
+ */
489
+ }, {
490
+ key: 'permalink',
491
+ get: function get() {
492
+ return this._current._permalink || null;
493
+ }
494
+
495
+ /**
496
+ * Returns the {@link scrivito.BasicObj} that is the parent of this Obj.
497
+ * Returns `null` if the obj has no `path` or is the root Obj.
498
+ *
499
+ * Throws a {@link scrivito.NotLoadedError} if the parent is not yet loaded.
500
+ *
501
+ * @type {?scrivito.BasicObj}
502
+ */
503
+ }, {
504
+ key: 'parent',
505
+ get: function get() {
506
+ return this.getParent();
507
+ }
508
+ }, {
509
+ key: 'modification',
510
+ get: function get() {
511
+ return this._current._modification || null;
512
+ }
513
+ }, {
514
+ key: 'children',
515
+ get: function get() {
516
+ if (this.path) {
517
+ var iterator = scrivito.BasicObj.where('_parent_path', 'equals', this.path).iterator();
518
+ return scrivito.iterable.collectValuesFromIterator(iterator);
519
+ }
520
+
521
+ return [];
522
+ }
523
+
524
+ /**
525
+ * Returns an Array of all the ancestor {@link scrivito.BasicObj Objs}, starting at the
526
+ * root and ending at the parent of this object.
527
+ *
528
+ * Throws a {@link scrivito.NotLoadedError} if the ancestors are not yet loaded.
529
+ *
530
+ * @type {scrivito.BasicObj[]}
531
+ */
532
+ }, {
533
+ key: 'ancestors',
534
+ get: function get() {
535
+ if (this._hasParent()) {
536
+ var parentPath = computeParentPath(this.path);
537
+
538
+ return collectPathComponents(parentPath).map(function (ancestorPath) {
539
+ return scrivito.BasicObj.findByPath(ancestorPath);
540
+ });
541
+ }
542
+
543
+ return [];
544
+ }
545
+ }, {
546
+ key: '_widgetPool',
547
+ get: function get() {
548
+ return this._current._widget_pool || {};
549
+ }
550
+ }, {
551
+ key: '_systemAttributes',
552
+ get: function get() {
553
+ return SYSTEM_ATTRIBUTES;
554
+ }
555
+ }, {
556
+ key: '_current',
557
+ get: function get() {
558
+ return this.objData.current;
559
+ }
560
+ }, {
561
+ key: '_objClass',
562
+ get: function get() {
563
+ return scrivito.ObjClass.find(this.objClass);
564
+ }
565
+ }, {
566
+ key: '_linkResolution',
567
+ get: function get() {
568
+ return scrivito.LinkResolution['for'](this.objData);
569
+ }
570
+ }]);
571
+
572
+ return BasicObj;
573
+ })(scrivito.AttributeContent);
574
+
575
+ scrivito.provideAsyncClassMethods(scrivito.BasicObj, {
576
+ get: 'fetch'
577
+ });
578
+
579
+ scrivito.provideAsyncInstanceMethods(scrivito.BasicObj, {
580
+ getParent: 'fetchParent'
581
+ });
582
+
583
+ function ensureObjClassExists(objClass) {
584
+ if (!objClass) {
585
+ throw new scrivito.ArgumentError('Please provide an obj class as the "_obj_class" property.');
586
+ }
587
+
588
+ if (!scrivito.ObjClass.find(objClass)) {
589
+ throw new scrivito.ArgumentError('The obj class "' + objClass + '" does not exist.');
590
+ }
591
+ }
592
+
593
+ function extractAttributeDict(attributes) {
594
+ var serializedAttributes = {};
595
+ var attributeDict = {};
596
+
597
+ _.each(attributes, function (serializedValue, name) {
598
+ if (_.isArray(serializedValue) && _.first(serializedValue) === 'widgetlist') {
599
+ var widgetlist = _.last(serializedValue);
600
+ attributeDict[name] = _.map(widgetlist, function (serializedWidgetAttributes) {
601
+ return scrivito.BasicWidget.newWithSerializedAttributes(serializedWidgetAttributes);
602
+ });
603
+ } else {
604
+ serializedAttributes[name] = serializedValue;
605
+ }
606
+ });
607
+
608
+ if (!serializedAttributes._id) {
609
+ serializedAttributes._id = scrivito.BasicObj.generateId();
610
+ }
611
+
612
+ return [serializedAttributes, attributeDict];
613
+ }
614
+
615
+ function collectPathComponents(_x7) {
616
+ var _arguments2 = arguments;
617
+ var _again2 = true;
618
+
619
+ _function2: while (_again2) {
620
+ var path = _x7;
621
+ _again2 = false;
622
+ var results = _arguments2.length <= 1 || _arguments2[1] === undefined ? [] : _arguments2[1];
623
+
624
+ if (path === '/') {
625
+ return ['/'].concat(_toConsumableArray(results));
626
+ }
627
+ _arguments2 = [_x7 = computeParentPath(path), [path].concat(_toConsumableArray(results))];
628
+ _again2 = true;
629
+ results = undefined;
630
+ continue _function2;
631
+ }
632
+ }
633
+
634
+ function computeParentPath(path) {
635
+ var pathComponents = path.split('/');
636
+ pathComponents.pop();
637
+ if (pathComponents.length === 1) {
638
+ return '/';
639
+ }
640
+ return pathComponents.join('/');
641
+ }
642
+
643
+ function assertValidCopyOptions(copyOptions) {
644
+ var validCopyOptions = ['_path'];
645
+
646
+ if (_.difference(_.keys(copyOptions), validCopyOptions).length) {
647
+ throw new scrivito.ArgumentError('Currently only "_path" copy option is supported.');
648
+ }
649
+ }
650
+ })();