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,91 @@
1
+ "use strict";
2
+
3
+ (function () {
4
+ scrivito.ObjSerializer = {
5
+ serialize: function serialize(objId, attrs) {
6
+ var promise = serializeWidgetPool(objId, attrs._widget_pool).then(function (widgetPool) {
7
+ return serializeAttrs(objId, attrs).then(function (serializedAttrs) {
8
+ if (widgetPool) {
9
+ serializedAttrs._widget_pool = widgetPool;
10
+ }
11
+ return serializedAttrs;
12
+ });
13
+ });
14
+
15
+ return scrivito.promise.wrapInJqueryDeferred(promise);
16
+ },
17
+
18
+ serializeValue: function serializeValue(value) {
19
+ if (_.isDate(value)) {
20
+ return moment.utc(value).toISOString();
21
+ }
22
+
23
+ return value;
24
+ }
25
+ };
26
+
27
+ function serializeWidgetPool(objId, widgetPool) {
28
+ if (widgetPool) {
29
+ var promises = _.map(widgetPool, function (attrs, widgetId) {
30
+ return serializeAttrs(objId, attrs).then(function (serializedAttrs) {
31
+ return [widgetId, serializedAttrs];
32
+ });
33
+ });
34
+
35
+ return scrivito.Promise.all(promises).then(function (serializedWidgetPool) {
36
+ return _.object(serializedWidgetPool);
37
+ });
38
+ }
39
+
40
+ return scrivito.Promise.resolve(widgetPool);
41
+ }
42
+
43
+ function serializeAttrs(objId, attrs) {
44
+ var promises = _.map(attrs, function (attrValue, attrName) {
45
+ return serializeAttr(objId, attrName, attrValue);
46
+ });
47
+
48
+ return scrivito.Promise.all(promises).then(function (serializedAttrs) {
49
+ return _.object(serializedAttrs);
50
+ });
51
+ }
52
+
53
+ function serializeAttr(objId, attrName, attrValue) {
54
+ if (scrivito.BinaryUtils.isFile(attrValue) || scrivito.BinaryUtils.isBlob(attrValue)) {
55
+ return serializeFile(objId, attrName, attrValue);
56
+ }
57
+
58
+ if (attrValue instanceof scrivito.UploadedBlob) {
59
+ return serializeUploadedBlob(objId, attrName, attrValue);
60
+ }
61
+
62
+ if (attrValue instanceof scrivito.FutureBinary) {
63
+ return serializeFutureBinary(objId, attrName, attrValue);
64
+ }
65
+
66
+ return scrivito.Promise.resolve([attrName, scrivito.ObjSerializer.serializeValue(attrValue)]);
67
+ }
68
+
69
+ function serializeFile(objId, attrName, file) {
70
+ return scrivito.Promise.resolve([attrName, file]); // <-- PATCH HERE
71
+ }
72
+
73
+ function serializeUploadedBlob(objId, attrName, uploadedBlob) {
74
+ return serializeFutureBinary(objId, attrName, uploadedBlob.copy());
75
+ }
76
+
77
+ function serializeFutureBinary(objId, attrName, futureBinary) {
78
+ if (futureBinary.idToCopy) {
79
+ // blob copy/rename
80
+ var blob = {
81
+ id_to_copy: futureBinary.idToCopy
82
+ };
83
+ if (futureBinary.filename) blob.filename = futureBinary.filename;
84
+ if (futureBinary.contentType) blob.content_type = futureBinary.contentType;
85
+ return scrivito.Promise.resolve([attrName, blob]);
86
+ } else if (futureBinary.source) {
87
+ // normal upload
88
+ return scrivito.Promise.resolve([attrName, { blob_to_upload: futureBinary.source, filename: futureBinary.filename }]);
89
+ }
90
+ }
91
+ })();
@@ -49,3 +49,15 @@ body.scrivito_widget_dragging_active[data-scrivito-display-mode="editing"] *[dat
49
49
  .scrivito_editing_marker {
50
50
  padding: 0 !important;
51
51
  }
52
+
53
+ .scrivito_dialog .workflow.dropdown {
54
+ float: right;
55
+ margin-bottom: 5px;
56
+ button.dropdown-toggle {
57
+ width: 160px;
58
+ }
59
+ }
60
+ .scrivito_dialog .workflow.dropdown:hover .dropdown-menu {
61
+ display: block;
62
+ margin: 0;
63
+ }
@@ -1,3 +1,4 @@
1
+ /*
1
2
  body > div.scrivito_topbar > div > div.scrivito_button_bar.scrivito_app.scrivito_no_hover {
2
3
  width: 170px !important;
3
4
  }
@@ -8,6 +9,23 @@ body > div.scrivito_topbar > div > div.scrivito_button_bar.scrivito_app.scrivito
8
9
  top: 0px;
9
10
  left: 0px;
10
11
  }
12
+ */
13
+
14
+ @mixin fiona_logo() {
15
+ background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy1TVkctMjAwMTA5MDQvRFREL3N2ZzEwLmR0ZCI+PHN2ZyB2ZXJzaW9uPSIxLjAiIGlkPSJFYmVuZV8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDEwMCAyOC42IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMDAgMjguNiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PGc+PHBhdGggZmlsbD0iI0NDMDAwMCIgZD0iTTAsMHYxNy40aDI2LjhjMS4zLDAsMi41LTEuMSwyLjUtMi40VjIuNGMwLTEuMy0xLjEtMi40LTIuNS0yLjRIMHoiLz48cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNMTMuNSw4LjljMC0wLjQsMC40LTAuNywwLjctMC43bDAsMGwwLDBoMS42djUuOGgtMi40VjguOUwxMy41LDguOXogTTE2LjUsNWMwLTAuNy0wLjUtMS4zLTEuOC0xLjNDMTMuOCwzLjcsMTMsNCwxMyw1LjFjMCwwLjcsMC40LDEuMywxLjcsMS4zQzE1LjcsNi40LDE2LjUsNi4xLDE2LjUsNUwxNi41LDV6IE0yMC4zLDZjMC45LDAsMS41LDAuNywxLjUsMS42bDAsMGMwLDAuOS0wLjYsMS42LTEuNSwxLjZoLTIuOXYyLjFoMy4xYzIuMywwLDMuNS0xLjgsMy41LTMuOGMwLTItMS4zLTMuOC0zLjctMy44aC0xLjNjLTAuNCwwLTAuNywwLjMtMC43LDAuN1Y2TDIwLjMsNkwyMC4zLDZ6Ii8+PGc+PHBhdGggZmlsbD0iI0ZGRkZGRiIgZD0iTTM3LjYsNS4xYy0xLDAtMS40LTAuNC0xLjQtMWMwLTAuOSwwLjYtMS4xLDEuNC0xLjFjMSwwLDEuNCwwLjQsMS40LDFDMzksNC44LDM4LjQsNS4xLDM3LjYsNS4xeiBNMzksNy42VjE0YzAsMC44LTAuNCwxLjItMS40LDEuMmMtMS4yLDAtMS40LTAuNS0xLjQtMS41VjcuM2MwLTAuNywwLjQtMS4yLDEtMS4yaDAuNkMzOC42LDYuMSwzOSw2LjYsMzksNy42eiIvPjwvZz48Zz48cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNNDguNSw4Ljl2NS40YzAsMC43LTAuNSwxLTEuMSwxSDQ3Yy0wLjYsMC0xLTAuMy0xLTF2LTMuN2MwLTEuNi0wLjUtMi40LTEuNS0yLjRjLTEsMC0xLjUsMC44LTEuNSwyLjV2My42YzAsMC43LTAuNSwxLTEuMSwxaC0wLjRjLTAuNiwwLTEtMC4zLTEtMS4xVjcuNGMwLTAuNywwLjQtMSwxLjItMWMwLjcsMCwxLjMsMC4yLDEuNywwLjJjMC44LDAsMS4xLTAuNCwyLjMtMC40QzQ3LjUsNi4yLDQ4LjUsNi45LDQ4LjUsOC45eiIvPjwvZz48Zz48cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNNTMuMiw5LjJWMTRjMCwwLjgtMC40LDEuMi0xLjMsMS4yYy0wLjksMC0xLjQtMC4zLTEuNC0xLjJWOS40YzAtMS42LTEuMy0xLjMtMS4zLTIuMmMwLTAuNiwwLjUtMC43LDEtMS4yYzAuMi0wLjIsMC4yLTAuNSwwLjUtMS41QzUwLjksNCw1MS40LDMsNTIuOSwzaDAuN2MwLjcsMCwxLjIsMC40LDEuMiwwLjljMCwwLjQsMC4xLDAuOC0wLjUsMS4xYy0wLjYsMC4zLTAuNywwLjUtMC43LDAuN2MwLDAuMywwLjEsMC40LDAuNiwwLjdjMC40LDAuMiwwLjYsMC41LDAuNiwwLjdjMCwwLjYtMC45LDAuOC0xLjIsMUM1My40LDguMyw1My4yLDguNyw1My4yLDkuMnoiLz48L2c+PGc+PHBhdGggZmlsbD0iI0ZGRkZGRiIgZD0iTTU5LjgsMTUuNGMtMi42LDAtNC43LTEuNi00LjctNC42YzAtMy4yLDIuMy00LjYsNC44LTQuNmMyLjIsMCw0LjgsMS4yLDQuOCw0LjZDNjQuNywxMy40LDYzLjEsMTUuNCw1OS44LDE1LjR6IE01OS45LDEzLjZjMS4zLDAsMi4zLTEuMiwyLjMtMi45YzAtMS41LTAuOC0yLjgtMi4zLTIuOGMtMS4zLDAtMi4zLDEtMi4zLDIuOEM1Ny42LDEyLjQsNTguNSwxMy42LDU5LjksMTMuNnoiLz48L2c+PGc+PHBhdGggZmlsbD0iI0ZGRkZGRiIgZD0iTTc0LjEsMTAuNmMwLDMtMS4zLDQuNy0zLjcsNC43Yy0wLjcsMC0xLjQtMC4yLTEuNi0wLjJjLTAuNiwwLTAuOSwwLjMtMC45LDEuNGMwLDEuMy0wLjIsMS43LTEuMiwxLjdjLTAuOSwwLTEuMi0wLjQtMS4yLTEuMlY3LjRjMC0wLjcsMC4zLTEsMS4xLTFjMC42LDAsMSwwLjIsMS41LDAuMmMwLjcsMCwwLjktMC40LDIuMi0wLjRDNzIuNiw2LjIsNzQuMSw3LjksNzQuMSwxMC42eiBNNjkuOCwxMy43YzEuOSwwLDIuMS0yLjQsMi4xLTMuMWMwLTEuNS0wLjctMi44LTItMi44Yy0xLjIsMC0yLjEsMS4xLTIuMSwzQzY3LjgsMTIuNSw2OC42LDEzLjcsNjkuOCwxMy43eiIvPjwvZz48Zz48cGF0aCBmaWxsPSIjRkZGRkZGIiBkPSJNODEuNiwxNS4yYy0wLjcsMC0xLjEtMC4zLTEuNS0wLjNjLTAuOCwwLTEuNCwwLjYtMi41LDAuNmMtMS45LDAtMy0xLjEtMy0yLjZjMC0xLjUsMS4zLTIuNyw0LjEtMy4xYzEuMi0wLjEsMS41LTAuNiwxLjUtMWMwLTAuNy0wLjYtMS4xLTEuMi0xLjFjLTEuMywwLTEuMiwxLjEtMi43LDEuMWMtMC41LDAtMS0wLjEtMS0wLjdjMC0wLjYsMC43LTEuOSwzLjUtMS45YzIuNCwwLDMuOSwwLjYsMy45LDN2NS4yQzgyLjYsMTUsODIuMiwxNS4yLDgxLjYsMTUuMnogTTc4LjMsMTMuN2MwLjksMCwxLjgtMC44LDEuOC0xLjdjMC0wLjQtMC4yLTAuOC0wLjktMC44Yy0wLjcsMC0yLjIsMC41LTIuMiwxLjVDNzcuMSwxMy4yLDc3LjYsMTMuNyw3OC4zLDEzLjd6Ii8+PC9nPjxnPjxwYXRoIGZpbGw9IiNGRkZGRkYiIGQ9Ik04OC41LDYuM2MwLjYsMCwwLjksMC4zLDAuOSwxYzAsMC44LTAuMiwxLjItMS4yLDEuNWMtMC45LDAuMy0xLjQsMC45LTEuNCwxLjd2My41YzAsMC45LTAuMywxLjMtMS4xLDEuM2gtMC43Yy0wLjcsMC0xLTAuNS0xLTEuNFY3LjRjMC0wLjksMC4zLTEuMywxLjMtMS4zYzEuMSwwLDEuNSwwLjQsMS45LDAuNEM4Ny44LDYuNSw4OCw2LjMsODguNSw2LjN6Ii8+PC9nPjxnPjxwYXRoIGZpbGw9IiNGRkZGRkYiIGQ9Ik05Ny44LDEzLjljMC4yLDAuMywwLjMsMC42LDAuMywwLjhjMCwwLjQtMC4zLDAuNi0xLDAuNmMtMC44LDAtMS40LTAuMy0xLjctMC44bC0wLjktMS41Yy0wLjMtMC42LTAuNy0wLjgtMS0wLjhjLTAuNSwwLTEuMSwwLjQtMS4xLDEuN2MwLDAuOS0wLjIsMS40LTEuMiwxLjRjLTAuOSwwLTEuMi0wLjQtMS4yLTEuMlY0LjVjMC0wLjcsMC4zLTEuMSwxLjItMS4xYzAuOCwwLDEuMiwwLjMsMS4yLDEuMWMwLDMuNywwLDQuMiwwLjYsNC4yYzAuMiwwLDAuNC0wLjEsMS4xLTAuN2MwLDAsMC4yLTAuMiwwLjYtMC42YzAuNC0wLjQsMC42LTAuNiwwLjctMC42YzAuMy0wLjIsMC43LTAuMiwxLjMtMC4yaDAuMmMwLjUsMCwwLjgsMC4yLDAuOCwwLjVjMCwwLjItMC4xLDAuNC0wLjMsMC43TDk2LDljLTAuMywwLjQtMC40LDAuNy0wLjQsMC45YzAsMC4zLDAuMSwwLjYsMC4yLDAuN0w5Ny44LDEzLjl6Ii8+PC9nPjwvZz48dGV4dCB0cmFuc2Zvcm09Im1hdHJpeCgxIDAgMCAxIDY1LjI3MjggMjYuODM3MSkiIGZpbGw9IiNDQ0NDQ0MiIGZvbnQtZmFtaWx5PSInSGVsdmV0aWNhJyIgZm9udC1zaXplPSIxMCI+RmlvbmEgNzwvdGV4dD48L3N2Zz4=);
16
+ background-size:contain;
17
+ background-repeat: no-repeat;
18
+ }
19
+
20
+ .scrivito_topbar .scrivito_button_bar .scrivito_logo {
21
+ display:block;padding:0;
22
+ height:30px;
23
+ width:105px;
24
+ position:absolute;
25
+ left:0;
26
+ top:8px;
27
+ @include fiona_logo;
28
+ }
11
29
 
12
30
  .scrivito_menu_box #scrivito_sdk_workspace_settings, .scrivito_menu_box #scrivito_sdk_rename_workspace, .scrivito_menu_box #scrivito_sdk_rebase_workspace, .scrivito_menu_box #scrivito_sdk_delete_workspace, .scrivito_menu_box #scrivito_sdk_create_workspace {
13
31
  display: none;
@@ -0,0 +1,20 @@
1
+ require 'fiona7/controllers/rest_api/error_handler'
2
+
3
+ module Fiona7
4
+ class ApiController < ActionController::Base
5
+ def perform
6
+ path = params[:path].to_s
7
+ verb = params[:verb].to_s.downcase.to_sym
8
+ payload = params[:params]
9
+
10
+ render json: Scrivito::CmsRestApi.task_unaware_request(verb, path, payload)
11
+ rescue *Fiona7::ErrorHandler::HANDLED_ERRORS => e
12
+ message = Fiona7::ErrorHandler.new(e).api_error
13
+ render json: {error: message}, status: 422
14
+ rescue Scrivito::ApplicationError => e
15
+ render json: {error: e.message}, status: e.http_code
16
+ rescue Scrivito::ClientError => e
17
+ render json: {error: e.message}, status: 422
18
+ end
19
+ end
20
+ end
@@ -7,7 +7,7 @@ module Fiona7
7
7
  if valid_credentials?(login, password)
8
8
  rsession.user_name = login
9
9
 
10
- redirect_to login_redirect
10
+ redirect_to true_root_path
11
11
  else
12
12
  flash[:error] = I18n.t(:"fiona7.invalid_credentails")
13
13
  begin
@@ -20,11 +20,7 @@ module Fiona7
20
20
 
21
21
  def destroy
22
22
  rsession.destroy
23
- begin
24
- redirect_to :back
25
- rescue ActionController::RedirectBackError
26
- redirect_to true_root_path
27
- end
23
+ redirect_to true_root_path
28
24
  end
29
25
 
30
26
  protected
@@ -32,10 +28,6 @@ module Fiona7
32
28
  @login_page = Fiona7LoginPage.instance || Scrivito::BasicObj.root
33
29
  end
34
30
 
35
- def login_redirect
36
- session[:login_redirect].presence || true_root_path
37
- end
38
-
39
31
  def true_root_path
40
32
  if Fiona7.mode == :standalone
41
33
  '/'
@@ -18,9 +18,6 @@ class Fiona7LoginPageController < parent_class
18
18
  end
19
19
 
20
20
  def index
21
- if request.referrer.present?
22
- session[:login_redirect] ||= request.referrer
23
- end
24
21
  super
25
22
  end
26
23
 
@@ -0,0 +1,58 @@
1
+ module Scrivito
2
+ class ObjClassController < WebserviceController
3
+ def defaults
4
+ obj_class_name = params.fetch(:obj_class_name)
5
+ obj_class = fetch_obj_class(obj_class_name)
6
+ if obj_class
7
+ attributes = params.fetch(:attributes, {}).merge(_obj_class: obj_class.to_s) # <-- PATCH HERE
8
+ defaults = obj_class.build_attributes_with_defaults(
9
+ attributes, scrivito_user: scrivito_user)
10
+ @defaults = computed_nested_attributes(defaults, obj_class)
11
+ else
12
+ raise ResourceNotFound, %{The obj class "#{obj_class_name}" is not available.}
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def computed_nested_attributes(defaults, obj_class)
19
+ widget_attributes = {}
20
+ other_attributes = {}
21
+
22
+ defaults.each do |name, value|
23
+ next if value.nil?
24
+
25
+ attribute_type = obj_class.attribute_definitions[name].try(:type)
26
+ if attribute_type == 'widgetlist'
27
+ widgets = value.map do |new_widget|
28
+ computed_nested_attributes(new_widget.attributes_to_be_saved, new_widget.class)
29
+ end
30
+
31
+ widget_attributes[name] = ['widgetlist', widgets]
32
+ elsif attribute_type != 'binary'
33
+ other_attributes[name] = value
34
+ end
35
+ end
36
+
37
+ other_attributes = serialize(other_attributes, obj_class)
38
+
39
+ widget_attributes.merge(other_attributes).merge(_obj_class: obj_class.to_s) # <-- PATCH HERE
40
+ end
41
+
42
+ def serialize(attributes, obj_class)
43
+ serializer = AttributeSerializer.new(obj_class)
44
+
45
+ serializer.serialize(attributes, obj_class.attribute_definitions)
46
+ end
47
+
48
+ def fetch_obj_class(obj_class_name)
49
+ compute_type(Widget, obj_class_name) || compute_type(Obj, obj_class_name)
50
+ end
51
+
52
+ def compute_type(base_class, obj_class_name)
53
+ base_class.type_computer.compute_type_without_fallback(obj_class_name)
54
+ rescue ObjClassNotFound
55
+ nil
56
+ end
57
+ end
58
+ end
@@ -1,12 +1,8 @@
1
1
  module Scrivito
2
2
  class ObjsController < WebserviceController
3
3
  around_action :require_selected_workspace_write_authorization, only: [
4
- :copy,
5
4
  :create,
6
5
  :destroy,
7
- :destroy_widget,
8
- :duplicate,
9
- :mark_resolved,
10
6
  :restore,
11
7
  :restore_widget,
12
8
  :revert,
@@ -15,9 +11,7 @@ module Scrivito
15
11
  ]
16
12
 
17
13
  before_filter :require_identical_selected_and_visible_workspace, only: [
18
- :copy,
19
14
  :create,
20
- :duplicate,
21
15
  :page_class_selection,
22
16
  :update,
23
17
  :widget_class_selection,
@@ -38,8 +32,7 @@ module Scrivito
38
32
  rescue ObjClassNotFound => e
39
33
  raise ClientError.new(
40
34
  "You've tried to create a CMS object based on the \"#{e.message}\" class, which is "\
41
- "either missing or not suitable for the object.",
42
- 400
35
+ "either missing or not suitable for the object."
43
36
  )
44
37
  end
45
38
 
@@ -62,11 +55,6 @@ module Scrivito
62
55
  end
63
56
  end
64
57
 
65
- def destroy_widget
66
- in_selected_workspace { current_widget.destroy }
67
- render_empty_json
68
- end
69
-
70
58
  def revert
71
59
  in_selected_workspace { current_obj.revert }
72
60
  render_empty_json
@@ -88,14 +76,10 @@ module Scrivito
88
76
  end
89
77
 
90
78
  def conflicting_workspaces
91
- @workspaces = []
79
+ @workspaces = selected_workspace.conflict_warning_for(params[:id])
92
80
  render :workspaces
93
81
  end
94
82
 
95
- def is_outdated
96
- @is_outdated = false
97
- end
98
-
99
83
  def binary_no_cache
100
84
  in_selected_workspace do
101
85
  binary = current_obj[params[:attribute_name]]
@@ -103,16 +87,6 @@ module Scrivito
103
87
  end
104
88
  end
105
89
 
106
- def mark_resolved
107
- in_selected_workspace { current_obj.mark_resolved }
108
- render_empty_json
109
- end
110
-
111
- def copy
112
- @obj = copy_obj(current_obj, params[:parent_path])
113
- render :obj
114
- end
115
-
116
90
  def transfer_modifications
117
91
  in_selected_workspace do
118
92
  begin
@@ -129,11 +103,6 @@ module Scrivito
129
103
  end
130
104
  end
131
105
 
132
- def duplicate
133
- @obj = copy_obj(current_obj, current_obj.parent_path)
134
- render :obj
135
- end
136
-
137
106
  def page_class_selection
138
107
  @page_class_markup = valid_page_classes.map do |page_class_name|
139
108
  build_selection_option(page_class_name)
@@ -214,11 +183,6 @@ module Scrivito
214
183
  @widget
215
184
  end
216
185
 
217
- def copy_obj(obj, parent_path)
218
- id = SecureRandom.hex(8)
219
- obj.copy(_id: id, _path: parent_path && "#{parent_path}/#{id}")
220
- end
221
-
222
186
  def fetch_formatter(name)
223
187
  name ? Configuration.obj_formats[name] : proc { |obj, _| obj.id }
224
188
  end
@@ -27,6 +27,31 @@ module Fiona7OverrideHelper
27
27
  scrivito_body_tags
28
28
  end
29
29
 
30
+ def fiona7_workflow_buttons
31
+ locale = Scrivito::Configuration.ui_locale || I18n.locale
32
+ tt = lambda {|action|
33
+ I18n.t(:"fiona7.workflow.#{action}", locale: locale)
34
+ }
35
+ # TODO: add translation
36
+ html = <<-EOHTML
37
+ <div class="btn-group workflow dropdown">
38
+ <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
39
+ #{tt['actions']} <span class="caret"></span>
40
+ </button>
41
+ <ul class="dropdown-menu">
42
+ <li class="disabled" data-fiona7-private-workflow-button="edit" disabled><a href="#">#{tt['edit']}</a></li>
43
+ <li class="disabled" data-fiona7-private-workflow-button="take" disabled><a href="#">#{tt['take']}</a></li>
44
+ <li class="disabled" data-fiona7-private-workflow-button="forward" disabled><a href="#">#{tt['forward']}</a></li>
45
+ <li class="disabled" data-fiona7-private-workflow-button="commit" disabled><a href="#">#{tt['commit']}</a></li>
46
+ <li class="disabled" data-fiona7-private-workflow-button="sign" disabled><a href="#">#{tt['sign']}</a></li>
47
+ <li class="disabled" data-fiona7-private-workflow-button="reject" disabled><a href="#">#{tt['reject']}</a></li>
48
+ <li class="disabled" data-fiona7-private-workflow-button="release" disabled><a href="#">#{tt['release']}</a></li>
49
+ </ul>
50
+ </div>
51
+ EOHTML
52
+ html.html_safe
53
+ end
54
+
30
55
  def fiona7_tag(tag_name, obj_or_widget, field_name, html_options = {}, editing_options = {}, &block)
31
56
  raise "This method can only be used in legacy mode" unless Fiona7.mode == :legacy
32
57
 
@@ -1,7 +1,7 @@
1
1
  <div class="scrivito_prompt_dialog scrivito_center_dialog scrivito_modal_prompt scrivito_green scrivito_show" style="margin-left: -250px; margin-top: -165px; left: 50%;">
2
2
  <div class="scrivito_modal_header">
3
3
  <i class="scrivito_icon"></i>
4
- <h3 class="scrivito_title"><%= t(:"fiona7.release.config", locale: current_locale) %></h3>
4
+ <h3 class="scrivito_title"><%= t(:"fiona7.release.confirm", locale: current_locale) %></h3>
5
5
 
6
6
  <p class="scrivito_description"><%= t(:"fiona7.release.description", locale: current_locale) %></p>
7
7
 
@@ -1,12 +1,6 @@
1
1
  <%= scrivito_tag :h1, @obj, :title %>
2
2
  <%= scrivito_tag :div, @obj, :body %>
3
3
 
4
- <% if flash[:error].present? %>
5
- <div class="alert alert-danger" role="alert">
6
- <%= flash[:error] %>
7
- </div>
8
- <% end %>
9
-
10
4
  <%= form_tag fiona7_login_path, role: 'form' do %>
11
5
  <div class="form-group">
12
6
  <%= label_tag :login, t(:"fiona7.login_field") %>
@@ -1,12 +1,13 @@
1
1
  <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
- <title>Fiona7</title>
4
+ <title>Fiona 7</title>
5
5
  <%= stylesheet_link_tag 'scrivito_ui' %>
6
6
  <%= stylesheet_link_tag 'fiona7_ui' %>
7
7
  <%= javascript_include_tag 'scrivito_ui' %>
8
8
  <%= javascript_include_tag 'scrivito_ui_extensions' %>
9
9
  <%= javascript_include_tag 'fiona7_ui' %>
10
+ <%= csrf_meta_tags %>
10
11
  <meta content="width=device-width, initial-scale=1.0" name="viewport"/>
11
12
  </head>
12
13
  <body id="scrivito_ui">
@@ -0,0 +1,8 @@
1
+ json.extract! workspace, :id, :title
2
+ json.is_accessible can_user_read_workspace?(workspace)
3
+ json.outdated workspace.outdated?
4
+
5
+ json.memberships workspace.memberships do |membership|
6
+ json.extract! membership, :user_id, :role
7
+ json.description membership.user.description
8
+ end
@@ -0,0 +1,18 @@
1
+ de:
2
+ fiona7:
3
+ errors:
4
+ not_permitted: "Ihnen fehlen die Rechte um diese Aktion auszuführen."
5
+ missing_credentials: "Ihre Sitzung ist abgelaufen. Bitte laden Sie die Seite erneut und melden Sie Sich an."
6
+ no_working_version: "Die Datei hat keine Arbeitsversion. Überprüfen Sie, ob Sie eine gültige Datei bearbeiten wollen."
7
+ already_released: "Die Datei wurde bereits freigegeben."
8
+ type_system: "Fehler in der Attributedefinitionen gefunden. Bitte wenden Sie sich an den technischen Ansprechpartner."
9
+
10
+ en:
11
+ fiona7:
12
+ errors:
13
+ not_permitted: "You are lacking the permissions required for this action."
14
+ missing_credentials: "Your session has expired. Please refresh the page and login again."
15
+ no_working_version: "This object has no working version. Please check if you are editing a valid object."
16
+ already_released: "The object has already been released."
17
+ type_system: "Type system errror. Please contact the responsible technician."
18
+