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.
- checksums.yaml +4 -4
- data/Rakefile +33 -0
- data/app/assets/javascripts/fiona7_ui.js +82 -23
- data/app/assets/javascripts/scrivito_patches/ajax.js +222 -0
- data/app/assets/javascripts/scrivito_patches/ajax_error_handling.js +24 -0
- data/app/assets/javascripts/scrivito_patches/attribute_serializer.js +259 -0
- data/app/assets/javascripts/scrivito_patches/base_obj_path.js +17 -0
- data/app/assets/javascripts/scrivito_patches/binary_utils.js +33 -0
- data/app/assets/javascripts/scrivito_patches/cms_rest_api.js +490 -0
- data/app/assets/javascripts/scrivito_patches/models/api/basic_obj.js +650 -0
- data/app/assets/javascripts/scrivito_patches/models/binary_field_element.js +53 -0
- data/app/assets/javascripts/scrivito_patches/models/obj.js +74 -239
- data/app/assets/javascripts/scrivito_patches/obj_serializer.js +91 -0
- data/app/assets/stylesheets/fiona7.css.scss +12 -0
- data/app/assets/stylesheets/fiona7_ui.css.scss +18 -0
- data/app/controllers/fiona7/api_controller.rb +20 -0
- data/app/controllers/fiona7/sessions_controller.rb +2 -10
- data/app/controllers/fiona7_login_page_controller.rb +0 -3
- data/app/controllers/scrivito/obj_class_controller.rb +58 -0
- data/app/controllers/scrivito/objs_controller.rb +2 -38
- data/app/helpers/fiona7_override_helper.rb +25 -0
- data/app/views/fiona7/release/preview.html.erb +1 -1
- data/app/views/fiona7_login_page/index.html.erb +0 -6
- data/app/views/scrivito/ui/index.html.erb +2 -1
- data/app/views/scrivito/webservice/_workspace.json.jbuilder +8 -0
- data/config/locales/errors.yml +18 -0
- data/config/locales/workflow.yml +24 -0
- data/config/precedence_routes.rb +7 -14
- data/infopark_fiona7.gemspec +6 -4
- data/lib/fiona7/assert.rb +2 -2
- data/lib/fiona7/attribute_readers/factory.rb +4 -0
- data/lib/fiona7/attribute_type_mapper.rb +4 -1
- data/lib/fiona7/attribute_writers/binary_as_binary.rb +2 -2
- data/lib/fiona7/attribute_writers/binary_as_linklist.rb +2 -2
- data/lib/fiona7/attribute_writers/factory.rb +4 -0
- data/lib/fiona7/builder/indirect_blob_builder.rb +2 -2
- data/lib/fiona7/builder/lazy_blob_copier.rb +1 -1
- data/lib/fiona7/builder/obj_builder.rb +45 -12
- data/lib/fiona7/controllers/rest_api/error_handler.rb +49 -0
- data/lib/fiona7/controllers/rest_api/obj_controller.rb +34 -20
- data/lib/fiona7/controllers/rest_api/session_controller.rb +13 -0
- data/lib/fiona7/engine.rb +7 -10
- data/lib/fiona7/facet_builder.rb +5 -1
- data/lib/fiona7/naive_search_engine.rb +9 -0
- data/lib/fiona7/routers/rest_api.rb +17 -0
- data/lib/fiona7/scrivito_patches/attribute_content.rb +28 -0
- data/lib/fiona7/scrivito_patches/cms_routing.rb +14 -31
- data/lib/fiona7/scrivito_patches/page_config.rb +1 -0
- data/lib/fiona7/scrivito_user.rb +3 -2
- data/lib/fiona7/type_register.rb +4 -0
- data/lib/fiona7/verity_search_engine.rb +6 -17
- data/lib/fiona7/version.rb +1 -1
- data/lib/fiona7/workspace.rb +2 -0
- metadata +28 -14
- data/app/assets/javascripts/scrivito_patches/models/ajax.js +0 -99
- data/app/assets/javascripts/scrivito_patches/models/blob.js +0 -50
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 741127529a15e35abbb025c194986fca04edb0da
|
4
|
+
data.tar.gz: 87098673b467a0ed0a93cc5e84f298365397f5b5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: aa8b4752d37991650a8d51d0bf84e968d2fbe93b9472c4045591c2a5a7ca6a34c8d5e98b1e9a8813c6231de42bc436b7946e1157ec2d4311343203649275f25e
|
7
|
+
data.tar.gz: 5adea82b2c79308ff97ccf118568545b314226081a2acf9ca3bfb4ae8624383e9b5938ad9b717935ed1bfe408b4e368f98d89afed36b71f3de36a41aaa884751
|
data/Rakefile
CHANGED
@@ -15,7 +15,40 @@ RDoc::Task.new(:rdoc) do |rdoc|
|
|
15
15
|
end
|
16
16
|
|
17
17
|
|
18
|
+
namespace "package" do
|
19
|
+
desc "Package javascript"
|
20
|
+
task "js" do
|
21
|
+
puts "Transpiling javascript files"
|
22
|
+
require 'babel/transpiler'
|
23
|
+
Dir["app/**/*"].each do |fname|
|
24
|
+
if /\.es6\.js$/ =~ fname
|
25
|
+
nfname = ::File.join(::File.dirname(fname), ::File.basename(fname, '.es6.js') + '.js')
|
26
|
+
puts "#{fname} -> #{nfname}"
|
27
|
+
::File.open(nfname, 'w') do |f|
|
28
|
+
f.write Babel::Transpiler.transform(File.read(fname))["code"]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
namespace "clean" do
|
36
|
+
desc "Clean packaged javascript"
|
37
|
+
task "js" do
|
38
|
+
puts "Cleaning transpiled javascript files"
|
39
|
+
Dir["app/**/*"].each do |fname|
|
40
|
+
if /\.es6\.js$/ =~ fname
|
41
|
+
nfname = ::File.join(::File.dirname(fname), ::File.basename(fname, '.es6.js') + '.js')
|
42
|
+
puts "#{nfname}"
|
43
|
+
::FileUtils.rm(nfname) if ::File.exists?(nfname)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
18
48
|
|
49
|
+
task "build" => ["clean:js", "package:js"] do
|
50
|
+
# dummy, needed for dependencies, the rest is added later by bundler
|
51
|
+
end
|
19
52
|
|
20
53
|
Bundler::GemHelper.install_tasks
|
21
54
|
|
@@ -1,6 +1,13 @@
|
|
1
|
-
//= require scrivito_patches/models/
|
2
|
-
//= require scrivito_patches/models/
|
1
|
+
//= require scrivito_patches/models/api/basic_obj
|
2
|
+
//= require scrivito_patches/models/binary_field_element
|
3
3
|
//= require scrivito_patches/models/obj
|
4
|
+
//= require scrivito_patches/ajax
|
5
|
+
//= require scrivito_patches/attribute_serializer
|
6
|
+
//= require scrivito_patches/ajax_error_handling
|
7
|
+
//= require scrivito_patches/base_obj_path
|
8
|
+
//= require scrivito_patches/cms_rest_api
|
9
|
+
//= require scrivito_patches/obj_serializer
|
10
|
+
//= require scrivito_patches/binary_utils
|
4
11
|
//= require_self
|
5
12
|
|
6
13
|
(function() {
|
@@ -87,7 +94,7 @@
|
|
87
94
|
// view loaded
|
88
95
|
});
|
89
96
|
|
90
|
-
scrivito.
|
97
|
+
scrivito.withDialogBehaviour(view, deferred, {enter: accept, escape: cancel});
|
91
98
|
},
|
92
99
|
function(xhr, text_status, error) {
|
93
100
|
});
|
@@ -226,14 +233,84 @@
|
|
226
233
|
};
|
227
234
|
var actions = ["edit", "forward", "reject","commit", "sign", "take"];
|
228
235
|
|
236
|
+
var releaseAction = function (objId) {
|
237
|
+
open_release_dialog(objId).done(function(objIds, comment) {
|
238
|
+
scrivito.withSavingOverlay(scrivito.ajax('PUT', 'objs/release', {data: {objs: objIds, comment: comment}}).then(function() {
|
239
|
+
scrivito.reload();
|
240
|
+
}));
|
241
|
+
});
|
242
|
+
};
|
243
|
+
|
244
|
+
var workflowAction = function (action, objId) {
|
245
|
+
open_confirmation_dialog(action, dialog_icons[action]).done(function(comment) {
|
246
|
+
scrivito.withSavingOverlay(scrivito.ajax('PUT', 'objs/workflow/'+action, {data: {id: objId, comment: comment}}).then(function() {
|
247
|
+
if (action == 'edit' || action == 'take') {
|
248
|
+
if (!scrivito.editing_context.is_editing_mode()) {
|
249
|
+
return scrivito.withSavingOverlay(
|
250
|
+
scrivito.change_editing_context({display_mode: 'editing', workspace_id: 'rtc'}));
|
251
|
+
} else {
|
252
|
+
return scrivito.withSavingOverlay(scrivito.reload());
|
253
|
+
}
|
254
|
+
} else {
|
255
|
+
return scrivito.withSavingOverlay(scrivito.reload());
|
256
|
+
}
|
257
|
+
}));
|
258
|
+
});
|
259
|
+
};
|
260
|
+
|
229
261
|
scrivito.gui.on('document', function(cms_document) {
|
230
262
|
var page_config = (cms_document.page_config() || {})['current_page'] || {};
|
231
263
|
var obj = cms_document.page();
|
232
264
|
var buttons = page_config['buttons'] || [];
|
233
265
|
var workflow_enabled = page_config['workflow'];
|
234
266
|
|
267
|
+
|
235
268
|
if (cms_document.browser_window().name !== 'scrivito_application') {
|
236
269
|
// TODO: add special handling for scrivito_details_dialog and scrivito_inspector
|
270
|
+
var button;
|
271
|
+
|
272
|
+
// enable workflow buttons
|
273
|
+
$.each(buttons, function (idx, action) {
|
274
|
+
// release is handled differently
|
275
|
+
if (action === 'release') {
|
276
|
+
return;
|
277
|
+
}
|
278
|
+
|
279
|
+
// find the workflow button
|
280
|
+
button = $('[data-fiona7-private-workflow-button="' + action + '"]', cms_document.browser_window().document);
|
281
|
+
|
282
|
+
// enable given workflow button
|
283
|
+
button.removeAttr('disabled');
|
284
|
+
button.removeClass('disabled');
|
285
|
+
button.click(function () {
|
286
|
+
workflowAction(action, obj.id());
|
287
|
+
});
|
288
|
+
|
289
|
+
});
|
290
|
+
|
291
|
+
// remove redundant buttons
|
292
|
+
$.each(actions, function (idx, action) {
|
293
|
+
if (buttons.indexOf(action) === -1) {
|
294
|
+
$('[data-fiona7-private-workflow-button="' + action + '"]', cms_document.browser_window().document).remove();
|
295
|
+
}
|
296
|
+
});
|
297
|
+
|
298
|
+
// conditionally enable release button
|
299
|
+
// find the release button
|
300
|
+
button = $('[data-fiona7-private-workflow-button="release"]', cms_document.browser_window().document);
|
301
|
+
if (obj.modification()) {
|
302
|
+
if (obj.has_restriction()) {
|
303
|
+
// release impossibru
|
304
|
+
button.attr('title', obj.restriction_messages().join("; "));
|
305
|
+
} else {
|
306
|
+
button.removeAttr('disabled');
|
307
|
+
button.removeClass('disabled');
|
308
|
+
button.click(function () {
|
309
|
+
releaseAction(obj.id());
|
310
|
+
});
|
311
|
+
}
|
312
|
+
}
|
313
|
+
|
237
314
|
return;
|
238
315
|
}
|
239
316
|
|
@@ -260,11 +337,7 @@
|
|
260
337
|
},
|
261
338
|
|
262
339
|
execute: function() {
|
263
|
-
|
264
|
-
scrivito.with_saving_overlay(scrivito.ajax('PUT', 'objs/release', {data: {objs: objIds, comment: comment}}).then(function() {
|
265
|
-
scrivito.reload();
|
266
|
-
}));
|
267
|
-
});
|
340
|
+
return releaseAction(obj.id());
|
268
341
|
}
|
269
342
|
});
|
270
343
|
/* TODO: enforce permissions */
|
@@ -291,21 +364,7 @@
|
|
291
364
|
},
|
292
365
|
|
293
366
|
execute: function() {
|
294
|
-
|
295
|
-
scrivito.with_saving_overlay(scrivito.ajax('PUT', 'objs/workflow/'+action, {data: {id: obj.id(), comment: comment}}).then(function() {
|
296
|
-
if (action == 'edit' || action == 'take') {
|
297
|
-
|
298
|
-
if (!scrivito.editing_context.is_editing_mode()) {
|
299
|
-
return scrivito.with_saving_overlay(
|
300
|
-
scrivito.change_editing_context({display_mode: 'editing', workspace_id: 'rtc'}));
|
301
|
-
} else {
|
302
|
-
return scrivito.with_saving_overlay(scrivito.reload());
|
303
|
-
}
|
304
|
-
} else {
|
305
|
-
return scrivito.with_saving_overlay(scrivito.reload());
|
306
|
-
}
|
307
|
-
}));
|
308
|
-
});
|
367
|
+
return workflowAction(action, obj.id());
|
309
368
|
}
|
310
369
|
});
|
311
370
|
});
|
@@ -0,0 +1,222 @@
|
|
1
|
+
(function() {
|
2
|
+
var handle_task = function(task) {
|
3
|
+
switch (task.status) {
|
4
|
+
case 'success':
|
5
|
+
return $.Deferred().resolve(task.result);
|
6
|
+
case 'error':
|
7
|
+
return $.Deferred().reject({
|
8
|
+
message: task.message,
|
9
|
+
code: task.code
|
10
|
+
});
|
11
|
+
case 'open':
|
12
|
+
return scrivito.wait(2).then(function() {
|
13
|
+
return single_ajax('GET', 'tasks/' + task.id).then(function(data) {
|
14
|
+
return handle_task(data);
|
15
|
+
});
|
16
|
+
});
|
17
|
+
default:
|
18
|
+
throw { message: "Invalid task (unknown status)", task: task };
|
19
|
+
}
|
20
|
+
};
|
21
|
+
|
22
|
+
// -- PATCH BEGINS HERE --
|
23
|
+
var ajax_with_form_data_required = function(params) {
|
24
|
+
var objParams = params && params.obj;
|
25
|
+
var result = false;
|
26
|
+
var k;
|
27
|
+
|
28
|
+
if (!objParams) {
|
29
|
+
return result;
|
30
|
+
}
|
31
|
+
|
32
|
+
for (k in objParams) {
|
33
|
+
if (objParams.hasOwnProperty(k)) {
|
34
|
+
result = scrivito.BinaryUtils.isFile(objParams[k]) || scrivito.BinaryUtils.isBlob(objParams[k]) || scrivito.BinaryUtils.isBlobWithName(objParams[k]);
|
35
|
+
if (result) {
|
36
|
+
return result;
|
37
|
+
}
|
38
|
+
}
|
39
|
+
}
|
40
|
+
return result;
|
41
|
+
};
|
42
|
+
|
43
|
+
var params_to_form_data = function(params) {
|
44
|
+
var objParams = params && params.obj || {};
|
45
|
+
var fd = new FormData();
|
46
|
+
|
47
|
+
var k, attr, value, widgetId, widgetValue, widgetAttr, i, l, t;
|
48
|
+
|
49
|
+
for (k in objParams) {
|
50
|
+
if (objParams.hasOwnProperty(k)) {
|
51
|
+
|
52
|
+
attr = k;
|
53
|
+
value = objParams[k];
|
54
|
+
|
55
|
+
if (attr === '_widget_pool') {
|
56
|
+
for (w in value) {
|
57
|
+
if (value.hasOwnProperty(w)) {
|
58
|
+
for (widgetAttr in value[w]) {
|
59
|
+
if (value[w].hasOwnProperty(widgetAttr)) {
|
60
|
+
widgetValue = value[w][widgetAttr];
|
61
|
+
|
62
|
+
if (widgetValue.pop) {
|
63
|
+
// value is an array
|
64
|
+
for (i=0; i < widgetValue.length; ++i) {
|
65
|
+
fd.append("obj[" + attr + "][" + w + "][" + widgetAttr + "][]", widgetValue[i]);
|
66
|
+
}
|
67
|
+
} else if (scrivito.BinaryUtils.isFile(widgetValue) || scrivito.BinaryUtils.isBlob(widgetValue)) {
|
68
|
+
// upload
|
69
|
+
fd.append("obj[" + attr + "][" + w + "][" + widgetAttr + "]", widgetValue);
|
70
|
+
} else if (scrivito.BinaryUtils.isBlobWithName(widgetValue)) {
|
71
|
+
fd.append("obj[" + attr + "][" + w + "][" + widgetAttr + "]", widgetValue.blob_to_upload, widgetValue.filename);
|
72
|
+
} else if (typeof value === 'object') {
|
73
|
+
// blob/copy rename
|
74
|
+
for (l in widgetValue) {
|
75
|
+
if (widgetValue.hasOwnProperty(l)) {
|
76
|
+
fd.append("obj[" + attr + "][" + w + "][" + widgetAttr + "][" + l + "]", widgetValue[l]);
|
77
|
+
}
|
78
|
+
}
|
79
|
+
} else if (typeof value !== 'undefined') {
|
80
|
+
fd.append("obj[" + attr + "][" + w + "][" + widgetAttr + "]", widgetValue);
|
81
|
+
}
|
82
|
+
}
|
83
|
+
}
|
84
|
+
}
|
85
|
+
}
|
86
|
+
} else if (value.pop) {
|
87
|
+
// value is an array
|
88
|
+
for (i=0; i < value.length; ++i) {
|
89
|
+
fd.append("obj[" + attr + "][]", value[i]);
|
90
|
+
}
|
91
|
+
} else if (scrivito.BinaryUtils.isFile(value) || scrivito.BinaryUtils.isBlob(value)) {
|
92
|
+
// upload
|
93
|
+
fd.append("obj[" + attr + "]", value);
|
94
|
+
} else if (scrivito.BinaryUtils.isBlobWithName(value)) {
|
95
|
+
fd.append("obj[" + attr + "]", value.blob_to_upload, value.filename);
|
96
|
+
} else if (typeof value === 'object') {
|
97
|
+
// blob/copy rename
|
98
|
+
for (l in value) {
|
99
|
+
if (value.hasOwnProperty(l)) {
|
100
|
+
fd.append("obj[" + attr + "][" + l + "]", value[l]);
|
101
|
+
}
|
102
|
+
}
|
103
|
+
} else if (typeof value !== 'undefined') {
|
104
|
+
fd.append("obj[" + attr + "]", value);
|
105
|
+
}
|
106
|
+
}
|
107
|
+
}
|
108
|
+
|
109
|
+
return fd;
|
110
|
+
};
|
111
|
+
|
112
|
+
var single_ajax_with_form_data = function(type, path, options) {
|
113
|
+
var base_url = window.location.protocol + '//' + window.location.host + '/__scrivito/';
|
114
|
+
if (options && options.data) {
|
115
|
+
options.data = params_to_form_data(options.data);
|
116
|
+
}
|
117
|
+
return $.ajax(base_url + path, _.extend({
|
118
|
+
type: type,
|
119
|
+
contentType: false,
|
120
|
+
processData: false,
|
121
|
+
cache: false // Don't cache GET requests.
|
122
|
+
}, options || {})).then(
|
123
|
+
function(result, text_status, xhr) {
|
124
|
+
return $.Deferred().resolve(result);
|
125
|
+
}, function(xhr, text_status, xhr_error) {
|
126
|
+
try {
|
127
|
+
return $.Deferred().reject(JSON.parse(xhr.responseText));
|
128
|
+
} catch (SyntaxError) {
|
129
|
+
return $.Deferred().reject(xhr_error);
|
130
|
+
}
|
131
|
+
}
|
132
|
+
);
|
133
|
+
};
|
134
|
+
// -- PATCH ENDS HERE --
|
135
|
+
|
136
|
+
var single_ajax = function(type, path, options) {
|
137
|
+
// -- PATCH BEGINS HERE --
|
138
|
+
if (ajax_with_form_data_required(options && options.data || {})) {
|
139
|
+
return single_ajax_with_form_data(type, path, options);
|
140
|
+
}
|
141
|
+
// -- PATCH ENDS HERE --
|
142
|
+
var base_url = window.location.protocol + '//' + window.location.host + '/__scrivito/';
|
143
|
+
if (options && options.data) {
|
144
|
+
options.data = JSON.stringify(options.data);
|
145
|
+
}
|
146
|
+
return $.ajax(base_url + path, _.extend({
|
147
|
+
type: type,
|
148
|
+
dataType: 'json',
|
149
|
+
contentType: 'application/json; charset=utf-8',
|
150
|
+
cache: false // Don't cache GET requests.
|
151
|
+
}, options || {})).then(
|
152
|
+
function(result, text_status, xhr) {
|
153
|
+
return $.Deferred().resolve(result);
|
154
|
+
}, function(xhr, text_status, xhr_error) {
|
155
|
+
try {
|
156
|
+
return $.Deferred().reject(JSON.parse(xhr.responseText));
|
157
|
+
} catch (SyntaxError) {
|
158
|
+
return $.Deferred().reject(xhr_error);
|
159
|
+
}
|
160
|
+
}
|
161
|
+
);
|
162
|
+
};
|
163
|
+
|
164
|
+
_.extend(scrivito, {
|
165
|
+
silent_ajax: function(type, path, options) {
|
166
|
+
var is_write_request = type === 'PUT' || type === 'POST' || type === 'DELETE';
|
167
|
+
var skip_write_monitor = options && options.skip_write_monitor;
|
168
|
+
|
169
|
+
if (is_write_request) {
|
170
|
+
options = options || {};
|
171
|
+
options.timeout = 120000; // miliseconds // <-- PATCH HERE
|
172
|
+
|
173
|
+
if (!skip_write_monitor) {
|
174
|
+
scrivito.write_monitor.start_write();
|
175
|
+
}
|
176
|
+
}
|
177
|
+
|
178
|
+
var ajax_promise = single_ajax(type, path, options).then(function(result) {
|
179
|
+
if (result && result.task && _.size(result) === 1) {
|
180
|
+
return handle_task(result.task);
|
181
|
+
} else {
|
182
|
+
return $.Deferred().resolve(result);
|
183
|
+
}
|
184
|
+
});
|
185
|
+
|
186
|
+
if (is_write_request && !skip_write_monitor) {
|
187
|
+
ajax_promise.always(function() {
|
188
|
+
scrivito.write_monitor.end_write();
|
189
|
+
});
|
190
|
+
}
|
191
|
+
|
192
|
+
return ajax_promise;
|
193
|
+
},
|
194
|
+
|
195
|
+
ajax: function(type, path, options) {
|
196
|
+
return scrivito.silent_ajax(type, path, options).fail(function(error) {
|
197
|
+
scrivito.display_ajax_error(error);
|
198
|
+
});
|
199
|
+
},
|
200
|
+
|
201
|
+
display_ajax_error: function(error) {
|
202
|
+
var message, message_for_editor;
|
203
|
+
|
204
|
+
// -- PATCH BEGINS HERE --
|
205
|
+
if (_.isObject(error)) {
|
206
|
+
if (error.message) {
|
207
|
+
return scrivito.alertDialog(error.message);
|
208
|
+
} else {
|
209
|
+
return scrivito.alertDialog(scrivito.t('ajax_error.communication'));
|
210
|
+
}
|
211
|
+
} else if (_.contains(['abort', 'parsererror', 'timeout'], error)) {
|
212
|
+
message = scrivito.t('ajax_error.communication');
|
213
|
+
} else {
|
214
|
+
message = scrivito.t('ajax_error', error);
|
215
|
+
}
|
216
|
+
scrivito.logError(message);
|
217
|
+
scrivito.errorDialog(message_for_editor || scrivito.t('ajax_error.message_for_editor'),
|
218
|
+
[error.timestamp, message]);
|
219
|
+
// -- PATCH ENDS HERE --
|
220
|
+
}
|
221
|
+
});
|
222
|
+
}());
|
@@ -0,0 +1,24 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
(function () {
|
4
|
+
_.extend(scrivito, {
|
5
|
+
handleAjaxError: function handleAjaxError(error) {
|
6
|
+
var message = undefined;
|
7
|
+
|
8
|
+
// -- PATCH BEGINS HERE --
|
9
|
+
if (typeof error === 'object' && error.message) {
|
10
|
+
scrivito.alertDialog(error.message);
|
11
|
+
} else {
|
12
|
+
message = scrivito.t('ajax_error.communication');
|
13
|
+
scrivito.errorDialog(scrivito.t('ajax_error.message_for_editor'), [message]);
|
14
|
+
}
|
15
|
+
// -- PATCH ENDS HERE --
|
16
|
+
|
17
|
+
scrivito.logError(error);
|
18
|
+
},
|
19
|
+
|
20
|
+
withAjaxErrorHandling: function withAjaxErrorHandling(promise) {
|
21
|
+
return promise['catch'](scrivito.handleAjaxError);
|
22
|
+
}
|
23
|
+
});
|
24
|
+
})();
|
@@ -0,0 +1,259 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
(function () {
|
4
|
+
scrivito.AttributeSerializer = {
|
5
|
+
serialize: function serialize(objClass, attributes) {
|
6
|
+
return _.mapObject(attributes, function (value, name) {
|
7
|
+
if (scrivito.Attribute.isSystemAttribute(name)) {
|
8
|
+
return value;
|
9
|
+
}
|
10
|
+
|
11
|
+
var attribute = objClass && objClass.attribute(name);
|
12
|
+
|
13
|
+
if (!attribute) {
|
14
|
+
throw new scrivito.ScrivitoError('Attribute "' + name + '" is not defined for obj class "' + objClass.name + '".');
|
15
|
+
}
|
16
|
+
|
17
|
+
return [serializeAttributeType(attribute.type, name), serializeAttributeValue(attribute, value, name)];
|
18
|
+
});
|
19
|
+
}
|
20
|
+
};
|
21
|
+
|
22
|
+
function serializeAttributeType(type, name) {
|
23
|
+
switch (type) {
|
24
|
+
case 'enum':
|
25
|
+
return 'string';
|
26
|
+
case 'float':
|
27
|
+
case 'integer':
|
28
|
+
return 'number';
|
29
|
+
case 'multienum':
|
30
|
+
return 'stringlist';
|
31
|
+
case 'binary':
|
32
|
+
case 'date':
|
33
|
+
case 'html':
|
34
|
+
case 'link':
|
35
|
+
case 'linklist':
|
36
|
+
case 'reference':
|
37
|
+
case 'referencelist':
|
38
|
+
case 'string':
|
39
|
+
case 'stringlist':
|
40
|
+
case 'widgetlist':
|
41
|
+
return type;
|
42
|
+
default:
|
43
|
+
throw new scrivito.ScrivitoError('Attribute "' + name + '" is of unsupported type "' + type + '".');
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
function serializeAttributeValue(attribute, value, name) {
|
48
|
+
if (value === null) {
|
49
|
+
return value;
|
50
|
+
}
|
51
|
+
|
52
|
+
switch (attribute.type) {
|
53
|
+
case 'binary':
|
54
|
+
return serializeBinaryAttributeValue(value, name);
|
55
|
+
case 'date':
|
56
|
+
return serializeDateAttributeValue(value, name);
|
57
|
+
case 'enum':
|
58
|
+
return serializeEnumAttributeValue(attribute, value, name);
|
59
|
+
case 'float':
|
60
|
+
return serializeFloatAttributeValue(value, name);
|
61
|
+
case 'integer':
|
62
|
+
return serializeIntegerAttributeValue(value, name);
|
63
|
+
case 'link':
|
64
|
+
return serializeLinkAttributeValue(value, name);
|
65
|
+
case 'linklist':
|
66
|
+
return serializeLinklistAttributeValue(value, name);
|
67
|
+
case 'multienum':
|
68
|
+
return serializeMultienumAttributeValue(attribute, value, name);
|
69
|
+
case 'reference':
|
70
|
+
return serializeReferenceAttributeValue(value, name);
|
71
|
+
case 'referencelist':
|
72
|
+
return serializeReferencelistAttributeValue(value, name);
|
73
|
+
case 'widgetlist':
|
74
|
+
return serializeWidgetlistAttributeValue(value);
|
75
|
+
default:
|
76
|
+
return value;
|
77
|
+
}
|
78
|
+
}
|
79
|
+
|
80
|
+
function invalidAttributeValue(value, name, expected) {
|
81
|
+
throw new scrivito.ScrivitoError('Unexpected value ' + scrivito.prettyPrint(value) + ' for' + (' attribute "' + name + '". Expected: ' + expected));
|
82
|
+
}
|
83
|
+
|
84
|
+
function serializeBinaryAttributeValue(_x, _x2) {
|
85
|
+
var _again = true;
|
86
|
+
|
87
|
+
_function: while (_again) {
|
88
|
+
var value = _x,
|
89
|
+
name = _x2;
|
90
|
+
_again = false;
|
91
|
+
|
92
|
+
// -- PATCH BEGINS HERE --
|
93
|
+
if (value instanceof scrivito.Binary) {
|
94
|
+
return { id: value.id };
|
95
|
+
} else if (value === null) {
|
96
|
+
return null;
|
97
|
+
} else if (value instanceof scrivito.UploadedBlob) {
|
98
|
+
_x = value.copy();
|
99
|
+
_x2 = name;
|
100
|
+
_again = true;
|
101
|
+
continue _function;
|
102
|
+
} else if (value instanceof scrivito.FutureBinary) {
|
103
|
+
var futureBinary = value;
|
104
|
+
|
105
|
+
if (futureBinary.idToCopy) {
|
106
|
+
var blob = {
|
107
|
+
id_to_copy: futureBinary.idToCopy
|
108
|
+
};
|
109
|
+
if (futureBinary.filename) blob.filename = futureBinary.filename;
|
110
|
+
if (futureBinary.contentType) blob.content_type = futureBinary.contentType;
|
111
|
+
|
112
|
+
return blob;
|
113
|
+
} else if (futureBinary.source) {
|
114
|
+
return { blob_to_upload: futureBinary.source, filename: futureBinary.filename };
|
115
|
+
}
|
116
|
+
} else if (scrivito.BinaryUtils.isFile(value) || scrivito.BinaryUtils.isBlob(value)) {
|
117
|
+
return value;
|
118
|
+
} else if (typeof value === 'object' && value.id_to_copy) {
|
119
|
+
return value;
|
120
|
+
} else {
|
121
|
+
invalidAttributeValue(value, name, 'A Binary.');
|
122
|
+
}
|
123
|
+
// -- PATCH ENDS HERE --
|
124
|
+
}
|
125
|
+
}
|
126
|
+
|
127
|
+
function serializeDateAttributeValue(value, name) {
|
128
|
+
if (_.isDate(value)) {
|
129
|
+
return scrivito.types.formatDateToString(value);
|
130
|
+
}
|
131
|
+
if (scrivito.types.isValidDateString(value)) {
|
132
|
+
return value;
|
133
|
+
}
|
134
|
+
|
135
|
+
invalidAttributeValue(value, name, 'A Date.');
|
136
|
+
}
|
137
|
+
|
138
|
+
function serializeEnumAttributeValue(attribute, value, name) {
|
139
|
+
var validValues = attribute.validValues();
|
140
|
+
if (!_.contains(validValues, value)) {
|
141
|
+
var e = 'Valid attribute values are contained in its "validValues" array [' + validValues + '].';
|
142
|
+
invalidAttributeValue(value, name, e);
|
143
|
+
}
|
144
|
+
return value;
|
145
|
+
}
|
146
|
+
|
147
|
+
function serializeFloatAttributeValue(value, name) {
|
148
|
+
if (!scrivito.types.isValidFloat(value)) {
|
149
|
+
var invalidValue = value;
|
150
|
+
if (_.isNumber(value)) {
|
151
|
+
invalidValue = String(value);
|
152
|
+
}
|
153
|
+
invalidAttributeValue(invalidValue, name, 'A Number, that is #isFinite().');
|
154
|
+
}
|
155
|
+
return value;
|
156
|
+
}
|
157
|
+
|
158
|
+
function serializeIntegerAttributeValue(value, name) {
|
159
|
+
if (!scrivito.types.isValidInteger(value)) {
|
160
|
+
invalidAttributeValue(value, name, 'A Number, that is #isSafeInteger().');
|
161
|
+
}
|
162
|
+
return value;
|
163
|
+
}
|
164
|
+
|
165
|
+
function serializeLinkAttributeValue(value, name) {
|
166
|
+
if (!validLinkObject(value)) {
|
167
|
+
invalidAttributeValue(value, name, 'A scrivito.Link instance.');
|
168
|
+
}
|
169
|
+
|
170
|
+
return convertLinkToCmsApi(value);
|
171
|
+
}
|
172
|
+
|
173
|
+
function serializeLinklistAttributeValue(value, name) {
|
174
|
+
if (!Array.isArray(value) || !_.all(value, validLinkObject)) {
|
175
|
+
invalidAttributeValue(value, name, 'An array of scrivito.Link instances.');
|
176
|
+
}
|
177
|
+
|
178
|
+
return _.map(value, convertLinkToCmsApi);
|
179
|
+
}
|
180
|
+
|
181
|
+
function validLinkObject(value) {
|
182
|
+
if (value instanceof scrivito.Link) {
|
183
|
+
return true;
|
184
|
+
}
|
185
|
+
|
186
|
+
// check if value is backend compatible
|
187
|
+
if (!_.isObject(value)) {
|
188
|
+
return false;
|
189
|
+
}
|
190
|
+
var invalidKeys = _.without(_.keys(value), 'fragment', 'obj_id', 'query', 'target', 'title', 'url');
|
191
|
+
return _.isEmpty(invalidKeys);
|
192
|
+
}
|
193
|
+
|
194
|
+
function convertLinkToCmsApi(value) {
|
195
|
+
var backendLink = {
|
196
|
+
fragment: value.fragment,
|
197
|
+
query: value.query,
|
198
|
+
target: value.target,
|
199
|
+
title: value.title,
|
200
|
+
url: value.url
|
201
|
+
};
|
202
|
+
backendLink.obj_id = value.objId || value.obj_id;
|
203
|
+
|
204
|
+
return _.mapObject(backendLink, function (v) {
|
205
|
+
return v || null;
|
206
|
+
});
|
207
|
+
}
|
208
|
+
|
209
|
+
function serializeMultienumAttributeValue(attribute, value, name) {
|
210
|
+
var validValues = attribute.validValues();
|
211
|
+
var errorMessage = 'An array with values from ' + scrivito.prettyPrint(validValues) + '.';
|
212
|
+
|
213
|
+
if (!Array.isArray(value) || !_.all(value, _.isString)) {
|
214
|
+
invalidAttributeValue(value, name, errorMessage);
|
215
|
+
}
|
216
|
+
|
217
|
+
var forbiddenValues = _.difference(value, validValues);
|
218
|
+
if (forbiddenValues.length) {
|
219
|
+
var e = errorMessage + ' Forbidden values: ' + scrivito.prettyPrint(forbiddenValues) + '.';
|
220
|
+
invalidAttributeValue(value, name, e);
|
221
|
+
}
|
222
|
+
return value;
|
223
|
+
}
|
224
|
+
|
225
|
+
function serializeReferenceAttributeValue(value, name) {
|
226
|
+
if (!isValidReference(value)) {
|
227
|
+
invalidAttributeValue(value, name, 'A BasicObj or a String ID.');
|
228
|
+
}
|
229
|
+
return serializeSingleReferenceValue(value);
|
230
|
+
}
|
231
|
+
|
232
|
+
function serializeReferencelistAttributeValue(value, name) {
|
233
|
+
if (!isValidReferencelistValue(value)) {
|
234
|
+
invalidAttributeValue(value, name, 'An array with BasicObjs or String IDs.');
|
235
|
+
}
|
236
|
+
return _.map(value, serializeSingleReferenceValue);
|
237
|
+
}
|
238
|
+
|
239
|
+
function serializeSingleReferenceValue(value) {
|
240
|
+
if (value instanceof scrivito.BasicObj) {
|
241
|
+
return value.id;
|
242
|
+
}
|
243
|
+
return value;
|
244
|
+
}
|
245
|
+
|
246
|
+
function isValidReference(value) {
|
247
|
+
return _.isString(value) || value instanceof scrivito.BasicObj;
|
248
|
+
}
|
249
|
+
|
250
|
+
function isValidReferencelistValue(value) {
|
251
|
+
return _.isArray(value) && _.every(value, function (v) {
|
252
|
+
return isValidReference(v);
|
253
|
+
});
|
254
|
+
}
|
255
|
+
|
256
|
+
function serializeWidgetlistAttributeValue(value) {
|
257
|
+
return _.pluck(value, 'id');
|
258
|
+
}
|
259
|
+
})();
|