scrivito_sdk 0.66.0 → 0.70.0.rc1
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/app/controllers/scrivito/blobs_controller.rb +5 -0
- data/app/controllers/scrivito/objs_controller.rb +2 -1
- data/app/controllers/scrivito/ui_controller.rb +33 -3
- data/app/helpers/scrivito_helper.rb +14 -20
- data/app/views/scrivito/objs/update.json.jbuilder +1 -1
- data/app/views/scrivito/ui/index.html.erb +1 -1
- data/app/views/scrivito/webservice/_workspace.json.jbuilder +2 -1
- data/config/ca-bundle.crt +1 -1
- data/config/precedence_routes.rb +3 -2
- data/lib/assets/javascripts/scrivito.js +46 -0
- data/lib/assets/javascripts/scrivito_ui.js +931 -501
- data/lib/assets/stylesheets/scrivito.css +1 -0
- data/lib/assets/stylesheets/scrivito_ui.css +1 -1
- data/lib/generators/scrivito/install/templates/app/views/page/index.html.erb +3 -3
- data/lib/generators/scrivito/page/page_generator.rb +3 -0
- data/lib/generators/scrivito/page/templates/model.erb +3 -0
- data/lib/generators/scrivito/widget/templates/model.erb +3 -0
- data/lib/generators/scrivito/widget/widget_generator.rb +3 -0
- data/lib/scrivito/attribute_content.rb +93 -60
- data/lib/scrivito/attribute_definition.rb +3 -3
- data/lib/scrivito/attribute_serializer.rb +2 -2
- data/lib/scrivito/backend/obj_data_cache.rb +22 -9
- data/lib/scrivito/basic_obj.rb +238 -130
- data/lib/scrivito/basic_widget.rb +32 -20
- data/lib/scrivito/binary.rb +74 -45
- data/lib/scrivito/binary_routing.rb +52 -0
- data/lib/scrivito/cache_middleware.rb +0 -5
- data/lib/scrivito/client_attribute_serializer.rb +134 -0
- data/lib/scrivito/cms_backend.rb +51 -33
- data/lib/scrivito/cms_data_cache.rb +1 -0
- data/lib/scrivito/cms_dispatch_controller.rb +1 -1
- data/lib/scrivito/cms_env.rb +1 -11
- data/lib/scrivito/cms_field_tag.rb +10 -7
- data/lib/scrivito/cms_rest_api/rate_limit.rb +5 -5
- data/lib/scrivito/cms_rest_api/request_timer.rb +27 -0
- data/lib/scrivito/cms_rest_api/widget_extractor.rb +8 -6
- data/lib/scrivito/cms_rest_api.rb +107 -54
- data/lib/scrivito/cms_routing.rb +13 -25
- data/lib/scrivito/configuration.rb +5 -2
- data/lib/scrivito/controller_actions.rb +68 -7
- data/lib/scrivito/controller_runtime.rb +8 -0
- data/lib/scrivito/date_attribute.rb +8 -0
- data/lib/scrivito/errors.rb +6 -3
- data/lib/scrivito/generator_helper.rb +13 -0
- data/lib/scrivito/image_tag.rb +24 -30
- data/lib/scrivito/layout_tags.rb +12 -6
- data/lib/scrivito/link.rb +46 -30
- data/lib/scrivito/log_subscriber.rb +15 -0
- data/lib/scrivito/membership.rb +3 -3
- data/lib/scrivito/membership_collection.rb +10 -10
- data/lib/scrivito/meta_data_collection.rb +22 -0
- data/lib/scrivito/model_library.rb +7 -1
- data/lib/scrivito/obj_collection.rb +18 -16
- data/lib/scrivito/obj_params_parser.rb +1 -1
- data/lib/scrivito/obj_search_enumerator.rb +35 -35
- data/lib/scrivito/page_config.rb +55 -0
- data/lib/scrivito/request_homepage.rb +23 -0
- data/lib/scrivito/routing_helper.rb +8 -8
- data/lib/scrivito/sdk_engine.rb +2 -3
- data/lib/scrivito/ui_config.rb +85 -0
- data/lib/scrivito/user.rb +30 -23
- data/lib/scrivito/user_definition.rb +48 -47
- data/lib/scrivito/widget_tag.rb +11 -0
- data/lib/scrivito/workspace.rb +93 -35
- data/lib/scrivito/workspace_selection_middleware.rb +8 -1
- data/lib/scrivito_sdk.rb +24 -24
- metadata +24 -33
- data/lib/assets/javascripts/scrivito_sdk.js +0 -57
- data/lib/assets/stylesheets/scrivito_sdk.css +0 -1
- data/lib/scrivito/client_config.rb +0 -113
- data/lib/scrivito/editing_context_helper.rb +0 -19
- data/lib/scrivito/named_link.rb +0 -39
@@ -1,5 +1,5 @@
|
|
1
1
|
module Scrivito
|
2
|
-
# This class allows you to retrieve
|
2
|
+
# This class allows you to retrieve CMS objects from a specific working copy.
|
3
3
|
# You can get an instance by accessing {Workspace#objs}.
|
4
4
|
# @api public
|
5
5
|
class ObjCollection
|
@@ -9,8 +9,9 @@ module Scrivito
|
|
9
9
|
@workspace = workspace
|
10
10
|
end
|
11
11
|
|
12
|
-
# Find
|
13
|
-
# If the parameter is an Array containing ids, return a list of
|
12
|
+
# Find an {BasicObj Obj} by its id.
|
13
|
+
# If the parameter is an Array containing ids, return a list of the
|
14
|
+
# corresponding {Scrivito::BasicObj Obj}s.
|
14
15
|
# @param [String, Integer, Array<String, Integer>]id_or_list
|
15
16
|
# @return [Obj, Array<Obj>]
|
16
17
|
# @api public
|
@@ -19,8 +20,8 @@ module Scrivito
|
|
19
20
|
end
|
20
21
|
|
21
22
|
# Find a {BasicObj Obj} by its id.
|
22
|
-
# If the parameter is an Array containing ids, return a list of
|
23
|
-
# The results include deleted objects as well.
|
23
|
+
# If the parameter is an Array containing ids, return a list of the
|
24
|
+
# corresponding {Scrivito::BasicObj Obj}s. The results include deleted objects as well.
|
24
25
|
# @param [String, Integer, Array<String, Integer>]id_or_list
|
25
26
|
# @return [Obj, Array<Obj>]
|
26
27
|
# @api public
|
@@ -28,8 +29,8 @@ module Scrivito
|
|
28
29
|
find_using(id_or_list, :find_by_including_deleted)
|
29
30
|
end
|
30
31
|
|
31
|
-
# Find the {BasicObj Obj}
|
32
|
-
# Returns +nil+ if no matching
|
32
|
+
# Find the {BasicObj Obj} that has the given path.
|
33
|
+
# Returns +nil+ if no matching object exists.
|
33
34
|
# @param [String] path Path of the {BasicObj Obj}.
|
34
35
|
# @return [Obj]
|
35
36
|
# @api public
|
@@ -37,7 +38,7 @@ module Scrivito
|
|
37
38
|
find_by(:path, [path]).first.first
|
38
39
|
end
|
39
40
|
|
40
|
-
# Returns the {BasicObj Obj}
|
41
|
+
# Returns the {BasicObj Obj} that has the given permalink, or +nil+ if no matching object exists.
|
41
42
|
# @param [String] permalink The permalink of the {BasicObj Obj}.
|
42
43
|
# @return [Obj]
|
43
44
|
# @api public
|
@@ -45,11 +46,12 @@ module Scrivito
|
|
45
46
|
find_by(:permalink, [permalink]).first.first
|
46
47
|
end
|
47
48
|
|
48
|
-
# Returns
|
49
|
+
# Returns an {ObjSearchEnumerator} with the given initial subquery consisting of the four arguments.
|
49
50
|
#
|
50
|
-
# Note that +field+ and +value+
|
51
|
+
# Note that +field+ and +value+ may also be arrays for searching several fields or searching for several values.
|
51
52
|
#
|
52
|
-
# {ObjSearchEnumerator}s can be chained using one of the chainable methods
|
53
|
+
# {ObjSearchEnumerator}s can be chained using one of the chainable methods
|
54
|
+
# (e.g. {ObjSearchEnumerator#and} and {ObjSearchEnumerator#and_not}).
|
53
55
|
#
|
54
56
|
# @param [Symbol, String, Array<Symbol, String>] field See {ObjSearchEnumerator#and} for details
|
55
57
|
# @param [Symbol, String] operator See {ObjSearchEnumerator#and} for details
|
@@ -62,15 +64,15 @@ module Scrivito
|
|
62
64
|
.and(field, operator, value, boost)
|
63
65
|
end
|
64
66
|
|
65
|
-
# Returns
|
67
|
+
# Returns an {ObjSearchEnumerator} of all {BasicObj Obj}s.
|
66
68
|
# @return [ObjSearchEnumerator]
|
67
69
|
# @api public
|
68
70
|
def all
|
69
71
|
ObjSearchEnumerator.new(workspace).batch_size(1000)
|
70
72
|
end
|
71
73
|
|
72
|
-
# Returns
|
73
|
-
# @param [String] obj_class name of the
|
74
|
+
# Returns an {ObjSearchEnumerator} of all {BasicObj Obj}s with the given +obj_class+.
|
75
|
+
# @param [String] obj_class name of the object class.
|
74
76
|
# @return [ObjSearchEnumerator]
|
75
77
|
# @api public
|
76
78
|
def find_all_by_obj_class(obj_class)
|
@@ -115,8 +117,8 @@ module Scrivito
|
|
115
117
|
end
|
116
118
|
end
|
117
119
|
|
118
|
-
#
|
119
|
-
#
|
120
|
+
# Accepts the name of an "obj_by" view, a list of keys.
|
121
|
+
# Returns a list of lists of Objs: a list of Objs for each given key.
|
120
122
|
def find_by_including_deleted(view, keys)
|
121
123
|
result = CmsBackend.instance.find_obj_data_by(
|
122
124
|
workspace.revision,
|
@@ -1,38 +1,38 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
module Scrivito
|
3
|
-
# Provides an enumerator for iterating over
|
4
|
-
# This is
|
3
|
+
# Provides an enumerator for iterating over the results of searches for CMS objects to retrieve instances of these objects.
|
4
|
+
# This is achieved through the {http://ruby-doc.org/core-2.1.3/Enumerable.html <code>Enumerable</code> mixin},
|
5
5
|
# which provides methods such as <code>map</code>, <code>select</code> or <code>take</code>.
|
6
6
|
#
|
7
|
-
# This enumerator is lazy. If for example you are looking for {BasicObj Obj}s
|
8
|
-
# and there are 93
|
9
|
-
# ignoring the other 83
|
10
|
-
# This
|
11
|
-
# If you want to get all
|
7
|
+
# This enumerator is lazy. If, for example, you are looking for {BasicObj Obj}s whose object class is "Publication",
|
8
|
+
# and there are 93 objects in total, then <code>enum.take(10)</code> fetches the first 10 objects only,
|
9
|
+
# ignoring the other 83.
|
10
|
+
# This implies that repeatedly iterating over this enumerator causes the search results and the objects to be fetched again and again.
|
11
|
+
# If you want to get all objects at once, use <code>enum.to_a</code>.
|
12
12
|
#
|
13
|
-
# To start searching use one of the {BasicObj Obj} methods that
|
13
|
+
# To start searching, use one of the {BasicObj Obj} methods that return an {ObjSearchEnumerator}. The preferred way is to start with {BasicObj.where Obj.where}.
|
14
14
|
#
|
15
15
|
# == Currently available fields and their values
|
16
16
|
#
|
17
17
|
# [+:*+] Searches all fields.
|
18
|
-
# This is only possible with the
|
18
|
+
# This is only possible with the +contains+ and +starts_with+ operators.
|
19
19
|
# [+:id+] Id of an {BasicObj Obj}. This is a +string+ field.
|
20
20
|
# [+:_path+] Path of an {BasicObj Obj}. This is a +string+ field.
|
21
21
|
# [+:_name+] Name of an {BasicObj Obj}. This is a +string+ field.
|
22
22
|
# [+:title+] Title of an {BasicObj Obj}. This is a +string+ field.
|
23
23
|
# [+:body+] Body of an {BasicObj Obj}. This is an +html+ field. Thus, only the +contains+ and
|
24
24
|
# +contains_prefix+ operators can be applied to this field.
|
25
|
-
# [+:_obj_class+]
|
25
|
+
# [+:_obj_class+] Object class of an {BasicObj Obj}. This is a +string+ field.
|
26
26
|
# [+:_permalink+] Permalink of an {BasicObj Obj}. This is a +string+ field.
|
27
27
|
# [+:_last_changed+] Date of last change of an {BasicObj Obj}.
|
28
28
|
# [every <em><code>:custom_attribute</code></em>] Custom attribute of an {BasicObj Obj}. Note that
|
29
29
|
# depending on the attribute type (e.g. an
|
30
|
-
# +html+ field), some operators
|
30
|
+
# +html+ field), some operators cannot be applied.
|
31
31
|
#
|
32
32
|
# All values are stored as strings.
|
33
33
|
#
|
34
34
|
# Date values are stored in the format YYYYMMDDHHMMSS in UTC. For example, 2000-01-01 00:00:00 UTC is stored as "<code>20000101000000</code>".
|
35
|
-
# This is relevant for string comparisons
|
35
|
+
# This is relevant for string comparisons in which the +is_less_than+ and +is_greater_than+ operators are used.
|
36
36
|
#
|
37
37
|
# == Currently available operators
|
38
38
|
#
|
@@ -48,7 +48,7 @@ module Scrivito
|
|
48
48
|
# ✘ "behi clo" (not whole words)
|
49
49
|
#
|
50
50
|
# ✘ "behind everything" (second word does not match)
|
51
|
-
# [+:contains_prefix+] Searches for one prefix. A whole word
|
51
|
+
# [+:contains_prefix+] Searches for one prefix. A whole word also counts as a prefix.
|
52
52
|
#
|
53
53
|
# Example subquery values:
|
54
54
|
#
|
@@ -118,16 +118,16 @@ module Scrivito
|
|
118
118
|
|
119
119
|
# @group Chainable methods
|
120
120
|
|
121
|
-
# Adds
|
121
|
+
# Adds the given AND subquery to this {ObjSearchEnumerator}.
|
122
122
|
#
|
123
123
|
# Compares the +field(s)+ with the +value(s)+ using the +operator+ of this subquery.
|
124
|
-
# All
|
124
|
+
# All CMS objects to which this criterion applies remain in the result set.
|
125
125
|
#
|
126
126
|
# @param [Symbol, String, Array<Symbol, String>] field Name(s) of the field(s) to be searched.
|
127
|
-
# For arrays, the subquery matches
|
128
|
-
# @param [Symbol, String] operator See "Currently available operators"
|
129
|
-
# @param [String, Array<String>] value The value(s) with
|
130
|
-
# For arrays, the subquery matches
|
127
|
+
# For arrays, the subquery matches if one or more of these fields meet this criterion.
|
128
|
+
# @param [Symbol, String] operator See "Currently available operators" above.
|
129
|
+
# @param [String, Array<String>] value The value(s) to compare with the field value(s) using the +operator+ of this subquery.
|
130
|
+
# For arrays, the subquery matches if the condition is met for one or more of the array elements.
|
131
131
|
# @param [Hash] boost A hash where the keys are field names and their values are boosting factors.
|
132
132
|
# Boosting factors must be in the range from 1 to 10.
|
133
133
|
# Boosting can only be applied to subqueries in which the +contains+ or +contains_prefix+ operator is used.
|
@@ -151,18 +151,18 @@ module Scrivito
|
|
151
151
|
self
|
152
152
|
end
|
153
153
|
|
154
|
-
# Adds
|
154
|
+
# Adds the given negated AND subquery to this {ObjSearchEnumerator}.
|
155
155
|
#
|
156
156
|
# Compares the +field(s)+ with the +value(s)+ using the negated +operator+ of this subquery.
|
157
|
-
# All
|
157
|
+
# All CMS objects to which this criterion applies are removed from the result set.
|
158
158
|
#
|
159
159
|
# @param [Symbol, String, Array<Symbol, String>] field Name(s) of the field(s) to be searched.
|
160
|
-
# For arrays, the subquery matches
|
160
|
+
# For arrays, the subquery matches if one or more of these fields meet this criterion.
|
161
161
|
# @param [Symbol, String] operator Only applicable to subqueries in which the +equals+,
|
162
|
-
# +starts_with+, +is_greater_than+
|
163
|
-
# (See "Currently available operators"
|
164
|
-
# @param [String, Array<String>] value The value(s) with
|
165
|
-
# For arrays, the subquery matches
|
162
|
+
# +starts_with+, +is_greater_than+ or +is_less_than+ operator is used.
|
163
|
+
# (See "Currently available operators" above).
|
164
|
+
# @param [String, Array<String>] value The value(s) to compare with the field value(s) using the +operator+ of this subquery.
|
165
|
+
# For arrays, the subquery matches if the condition is met for one or more of the array elements.
|
166
166
|
# @return [ObjSearchEnumerator]
|
167
167
|
# @api public
|
168
168
|
def and_not(field, operator, value)
|
@@ -180,7 +180,7 @@ module Scrivito
|
|
180
180
|
end
|
181
181
|
|
182
182
|
# Orders the results by +field_name+.
|
183
|
-
# @param [Symbol, String] field_name This parameter
|
183
|
+
# @param [Symbol, String] field_name This parameter specifies the field by which the hits are sorted (e.g. +:_path+).
|
184
184
|
# @return [ObjSearchEnumerator]
|
185
185
|
# @api public
|
186
186
|
def order(field_name)
|
@@ -189,7 +189,7 @@ module Scrivito
|
|
189
189
|
self
|
190
190
|
end
|
191
191
|
|
192
|
-
# Reverses the order of the results. Requires {#order} to be
|
192
|
+
# Reverses the order of the results. Requires {#order} to be applied before.
|
193
193
|
# @return [ObjSearchEnumerator]
|
194
194
|
# @api public
|
195
195
|
def reverse_order
|
@@ -201,7 +201,7 @@ module Scrivito
|
|
201
201
|
end
|
202
202
|
|
203
203
|
# Number of search results to be returned by each of the internal search requests.
|
204
|
-
# The default is +10+. The server may
|
204
|
+
# The default is +10+. The server may reduce large batches to a reasonable size.
|
205
205
|
# @param [Integer] size A value in the range from +1+ to +100+.
|
206
206
|
# @return [ObjSearchEnumerator]
|
207
207
|
# @api public
|
@@ -212,7 +212,7 @@ module Scrivito
|
|
212
212
|
end
|
213
213
|
|
214
214
|
|
215
|
-
# Omits the first +amount+
|
215
|
+
# Omits the first +amount+ of {BasicObj Obj}s from the results. The default is +0+.
|
216
216
|
# @param [Integer] amount
|
217
217
|
# @return [ObjSearchEnumerator]
|
218
218
|
# @api public
|
@@ -272,10 +272,10 @@ module Scrivito
|
|
272
272
|
@size ||= CmsBackend.instance.search_objs(workspace, size_query)['total'].to_i
|
273
273
|
end
|
274
274
|
|
275
|
-
#
|
276
|
-
#
|
277
|
-
#
|
278
|
-
# but may occasionally return fewer than
|
275
|
+
# Loads a single batch of search results from the backend.
|
276
|
+
# @return [Array] of {BasicObj Obj}.
|
277
|
+
# Usually returns +batch_size+ results if available,
|
278
|
+
# but may occasionally return fewer than +batch_size+ results (due to rate limit, for example).
|
279
279
|
# @api public
|
280
280
|
def load_batch
|
281
281
|
next_batch = fetch_next_batch(options[:offset] || 0)
|
@@ -305,7 +305,7 @@ module Scrivito
|
|
305
305
|
if value.is_a?(Time) || value.is_a?(Date)
|
306
306
|
DateAttribute.serialize(value)
|
307
307
|
else
|
308
|
-
value
|
308
|
+
value.to_s
|
309
309
|
end
|
310
310
|
end
|
311
311
|
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Scrivito
|
2
|
+
|
3
|
+
class PageConfig < Struct.new(:obj, :editing_context, :lookup_context)
|
4
|
+
|
5
|
+
def initialize(**named_params)
|
6
|
+
named_params.each { |key, value| self[key] = value }
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_json
|
10
|
+
{
|
11
|
+
current_page: current_page_config,
|
12
|
+
user_id: user_id_config,
|
13
|
+
}.to_json
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def user_id_config
|
19
|
+
editor.id
|
20
|
+
end
|
21
|
+
|
22
|
+
def current_page_config
|
23
|
+
return {} unless obj
|
24
|
+
{
|
25
|
+
id: obj.id,
|
26
|
+
obj_class_name: obj.obj_class_name,
|
27
|
+
has_children: obj.children.any?,
|
28
|
+
has_conflict: obj.has_conflict?,
|
29
|
+
has_details_view: obj_has_details_view?,
|
30
|
+
modification: modification(obj),
|
31
|
+
restriction_messages: editor.restriction_messages_for(obj),
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
def obj_has_details_view?
|
36
|
+
lookup_context.find(obj.details_view_path).present?
|
37
|
+
rescue ActionView::MissingTemplate
|
38
|
+
false
|
39
|
+
end
|
40
|
+
|
41
|
+
def modification(obj_or_resource)
|
42
|
+
comparison = editing_context.comparison
|
43
|
+
if comparison.active?
|
44
|
+
comparison.modification(obj_or_resource)
|
45
|
+
else
|
46
|
+
obj_or_resource.modification
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def editor
|
51
|
+
editing_context.editor
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Scrivito
|
2
|
+
module RequestHomepage
|
3
|
+
HOMEPAGE_ENV_KEY = "SCRIVITO_HOMEPAGE"
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def call(env)
|
7
|
+
env[HOMEPAGE_ENV_KEY] ||= fetch_homepage(env)
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def fetch_homepage(env)
|
13
|
+
callback_result = Scrivito::Configuration.choose_homepage_callback.call(env)
|
14
|
+
if callback_result.is_a?(Obj)
|
15
|
+
callback_result
|
16
|
+
else
|
17
|
+
raise "choose_homepage callback did not return an Obj. "\
|
18
|
+
"Instead saw #{callback_result.class}."
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -1,21 +1,21 @@
|
|
1
1
|
module Scrivito
|
2
2
|
#
|
3
|
-
#
|
3
|
+
# This helper contains methods for generating URLs that point to CMS content.
|
4
4
|
# Use {Scrivito::RoutingHelper#scrivito_path} or {Scrivito::RoutingHelper#scrivito_url} when linking or
|
5
|
-
# redirecting to CMS objects. These methods are available in
|
5
|
+
# redirecting to CMS objects. These methods are available in both your views and your controllers.
|
6
6
|
#
|
7
7
|
# @api public
|
8
8
|
#
|
9
9
|
module RoutingHelper
|
10
10
|
#
|
11
|
-
# Returns the (URL-)path
|
11
|
+
# Returns the (URL-)path of a CMS object.
|
12
12
|
#
|
13
13
|
# @api public
|
14
14
|
#
|
15
15
|
# @param target [Obj, Link, Array<Link>, Binary]
|
16
16
|
# If +target+ is an +Array+ of +Links+, it must be non-empty.
|
17
|
-
#
|
18
|
-
# @param options [Hash] include url settings such as path parameters or protocol.
|
17
|
+
# Only the first {Link} of the +Array+ is used.
|
18
|
+
# @param options [Hash] include url settings such as path parameters or the protocol.
|
19
19
|
#
|
20
20
|
# @return [String]
|
21
21
|
#
|
@@ -24,14 +24,14 @@ module Scrivito
|
|
24
24
|
end
|
25
25
|
|
26
26
|
#
|
27
|
-
# Returns the absolute URL
|
27
|
+
# Returns the absolute URL of a CMS object.
|
28
28
|
#
|
29
29
|
# @api public
|
30
30
|
#
|
31
31
|
# @param target [Obj, Link, Array<Link>, Binary]
|
32
32
|
# If +target+ is an +Array+ of +Links+, it must be non-empty.
|
33
|
-
#
|
34
|
-
# @param options [Hash] include url settings such as path parameters or protocol.
|
33
|
+
# Only the first {Link} of the +Array+ is used.
|
34
|
+
# @param options [Hash] include url settings such as path parameters or the protocol.
|
35
35
|
#
|
36
36
|
# @return [String]
|
37
37
|
#
|
data/lib/scrivito/sdk_engine.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'rails'
|
2
2
|
|
3
3
|
require 'jbuilder'
|
4
|
-
require 'jquery-rails'
|
5
4
|
require 'net/http/post/multipart'
|
6
5
|
|
7
6
|
module ::Scrivito
|
@@ -43,8 +42,8 @@ module ::Scrivito
|
|
43
42
|
initializer 'scrivito.add_sdk_assets' do |app|
|
44
43
|
# Specify which file should be precompiled for packaging
|
45
44
|
app.config.assets.precompile += %w[
|
46
|
-
|
47
|
-
|
45
|
+
scrivito.css
|
46
|
+
scrivito.js
|
48
47
|
scrivito_ui.css
|
49
48
|
scrivito_ui.js
|
50
49
|
]
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module Scrivito
|
2
|
+
|
3
|
+
class UiConfig < Struct.new(:editing_context, :resource, :return_to, :app_extension_tags)
|
4
|
+
def initialize(**named_params)
|
5
|
+
named_params.each { |key, value| self[key] = value }
|
6
|
+
end
|
7
|
+
|
8
|
+
def to_json
|
9
|
+
{
|
10
|
+
editing_context: editing_context_config,
|
11
|
+
i18n: i18n_config,
|
12
|
+
is_development_mode: Rails.env.development?,
|
13
|
+
resource_dialog: resource_dialog_config,
|
14
|
+
user: user_config,
|
15
|
+
user_permissions: user_permissions_config,
|
16
|
+
app_extension_tags: app_extension_tags,
|
17
|
+
}.to_json
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def editing_context_config
|
23
|
+
{
|
24
|
+
display_mode: editing_context.display_mode,
|
25
|
+
selected_workspace: workspace_config(selected_workspace),
|
26
|
+
visible_workspace: workspace_config(visible_workspace),
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
def workspace_config(workspace)
|
31
|
+
{
|
32
|
+
id: workspace.id,
|
33
|
+
memberships: workspace.memberships.map do |membership|
|
34
|
+
{
|
35
|
+
user_id: membership.user_id,
|
36
|
+
role: membership.role,
|
37
|
+
description: membership.user.description
|
38
|
+
}
|
39
|
+
end,
|
40
|
+
outdated: workspace.outdated?,
|
41
|
+
title: workspace.title,
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
def i18n_config
|
46
|
+
{locale: Scrivito::Configuration.ui_locale || I18n.locale}
|
47
|
+
end
|
48
|
+
|
49
|
+
def resource_dialog_config
|
50
|
+
return {} unless resource
|
51
|
+
{
|
52
|
+
obj: Configuration.obj_formats.fetch('_default').call(resource, editor),
|
53
|
+
return_to: return_to,
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
def user_permissions_config
|
58
|
+
{
|
59
|
+
create_workspace: editor.can?(:create, :workspace),
|
60
|
+
publish_workspace: editor.can?(:publish, selected_workspace),
|
61
|
+
}
|
62
|
+
end
|
63
|
+
|
64
|
+
def user_config
|
65
|
+
{
|
66
|
+
current: {
|
67
|
+
id: editor.id
|
68
|
+
}
|
69
|
+
}
|
70
|
+
end
|
71
|
+
|
72
|
+
def editor
|
73
|
+
editing_context.editor
|
74
|
+
end
|
75
|
+
|
76
|
+
def selected_workspace
|
77
|
+
editing_context.selected_workspace
|
78
|
+
end
|
79
|
+
|
80
|
+
def visible_workspace
|
81
|
+
editing_context.visible_workspace
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
data/lib/scrivito/user.rb
CHANGED
@@ -22,9 +22,9 @@ module Scrivito
|
|
22
22
|
#
|
23
23
|
# @api public
|
24
24
|
#
|
25
|
-
# @param [String] id
|
25
|
+
# @param [String] id The unique, unalterable id of the user.
|
26
26
|
# The user id is used to associate the user with the corresponding CMS resources.
|
27
|
-
# It
|
27
|
+
# It is persisted in the CMS.
|
28
28
|
#
|
29
29
|
# @raise [Scrivito::ScrivitoError] if id is blank
|
30
30
|
# @raise [Scrivito::ScrivitoError] if id is more than 64 characters long
|
@@ -38,21 +38,21 @@ module Scrivito
|
|
38
38
|
# @see Scrivito::UserDefinition#suggest_users
|
39
39
|
#
|
40
40
|
# @example
|
41
|
-
# Scrivito::User.define('alice') do |
|
42
|
-
#
|
41
|
+
# Scrivito::User.define('alice') do |user_definition|
|
42
|
+
# user_definition.description { 'Alice Almighty' }
|
43
43
|
#
|
44
|
-
#
|
45
|
-
#
|
46
|
-
#
|
44
|
+
# user_definition.can_always(:read, :workspace)
|
45
|
+
# user_definition.can_always(:write, :workspace)
|
46
|
+
# user_definition.can_always(:publish, :workspace, 'You can always publish workspaces.')
|
47
47
|
# end
|
48
48
|
#
|
49
|
-
# Scrivito::User.define('bob') do |
|
50
|
-
#
|
49
|
+
# Scrivito::User.define('bob') do |user_definition|
|
50
|
+
# user_definition.description('Bob Doe')
|
51
51
|
#
|
52
|
-
#
|
53
|
-
#
|
52
|
+
# user_definition.can_never(:create, :workspace, 'You are not allowed to create workspaces.')
|
53
|
+
# user_definition.can_always(:read, :workspace)
|
54
54
|
#
|
55
|
-
#
|
55
|
+
# user_definition.restrict_obj_publish(using: :_obj_class_name) do |obj_class_name|
|
56
56
|
# if obj_class_name == 'BlogPost'
|
57
57
|
# false
|
58
58
|
# else
|
@@ -67,8 +67,15 @@ module Scrivito
|
|
67
67
|
end
|
68
68
|
|
69
69
|
#
|
70
|
-
# Returns an anonymous system user
|
71
|
-
# publish, delete and invite to any workspace.
|
70
|
+
# Returns an anonymous system user who can always create workspaces, can always read, write,
|
71
|
+
# publish, delete, and invite others to collaborate on any workspace.
|
72
|
+
# @example Check whether the user may publish a particular object:
|
73
|
+
# Scrivito::User.system_user.can_publish?(Obj.root)
|
74
|
+
# # => true
|
75
|
+
#
|
76
|
+
# @example Get the notification messages for publishing restrictions. An empty array indicates that no restrictions exist.
|
77
|
+
# Scrivito::User.system_user.restriction_messages_for(Obj.root)
|
78
|
+
# # => []
|
72
79
|
#
|
73
80
|
# @api public
|
74
81
|
# @return [Scrivito::User] the system user
|
@@ -145,24 +152,24 @@ module Scrivito
|
|
145
152
|
end
|
146
153
|
|
147
154
|
#
|
148
|
-
#
|
155
|
+
# Checks whether the User may publish changes to a specific {Scrivito::BasicObj Obj}.
|
149
156
|
#
|
150
157
|
# @api public
|
151
|
-
# @param [BasicObj] obj the
|
152
|
-
# @return [Boolean] true if the user is allowed to publish otherwise false
|
158
|
+
# @param [BasicObj] obj the object to be published
|
159
|
+
# @return [Boolean] true if the user is allowed to publish the object, otherwise false
|
153
160
|
#
|
154
161
|
def can_publish?(obj)
|
155
162
|
restriction_messages_for(obj).empty?
|
156
163
|
end
|
157
164
|
|
158
165
|
#
|
159
|
-
# Checks
|
160
|
-
# specified in a {UserDefinition#restrict_obj_publish} callback if they
|
161
|
-
# If the user
|
166
|
+
# Checks whether the User may publish changes to an {Scrivito::BasicObj Obj} and returns
|
167
|
+
# the message specified in a {UserDefinition#restrict_obj_publish} callback if they may not.
|
168
|
+
# If the user may publish the CMS object, an empty array is returned.
|
162
169
|
#
|
163
170
|
# @api public
|
164
|
-
# @param [BasicObj] obj the
|
165
|
-
# @return [Array<String>] Hints why the user
|
171
|
+
# @param [BasicObj] obj the object to be published
|
172
|
+
# @return [Array<String>] Hints on why the user cannot publish the object
|
166
173
|
#
|
167
174
|
def restriction_messages_for(obj)
|
168
175
|
assert_restrictions_applicable(obj)
|
@@ -193,7 +200,7 @@ module Scrivito
|
|
193
200
|
end
|
194
201
|
end
|
195
202
|
|
196
|
-
#
|
203
|
+
# By convention, only the anonymous admin user has a +nil+ id.
|
197
204
|
def system_user?
|
198
205
|
id.nil?
|
199
206
|
end
|