scrivito_sdk 1.11.0 → 1.12.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/cms/scrivito/attribute_content.rb +2 -2
- data/app/cms/scrivito/basic_obj.rb +12 -8
- data/app/cms/scrivito/cms_rest_api/widget_extractor.rb +1 -1
- data/app/cms/scrivito/configuration.rb +17 -14
- data/app/cms/scrivito/controller_helper.rb +1 -1
- data/app/cms/scrivito/obj_collection.rb +19 -15
- data/app/cms/scrivito/obj_facet_value.rb +3 -9
- data/app/cms/scrivito/sdk_engine.rb +1 -0
- data/app/cms/scrivito/type_computer.rb +9 -7
- data/app/cms/scrivito/ui_config.rb +2 -1
- data/app/cms/scrivito/user.rb +9 -3
- data/app/cms/scrivito/user_definition.rb +35 -13
- data/app/cms/scrivito/workspace.rb +1 -3
- data/config/ca-bundle.crt +2 -311
- data/lib/assets/javascripts/scrivito.js +1 -161
- data/lib/assets/javascripts/scrivito_editing.js +26 -0
- data/lib/assets/javascripts/scrivito_ui_redirect.js +1 -89
- data/lib/assets/javascripts/scrivito_with_js_sdk.js +49 -31405
- data/lib/assets/stylesheets/scrivito.css +1 -1
- data/lib/assets/stylesheets/scrivito_editing.css +1 -0
- metadata +21 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: efd3bed6bd4541b87b1b2f29aca12b7f52b1987f
|
4
|
+
data.tar.gz: 50ec7bd514f1eb7753fad198e5e94fc76ccb5d24
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b299c648eda1d976a51e0166cc21916af96b70df1e33c8e2109af73ea9e6c047b843d682371fdc8814ce0efa67a5a882fee1148a24c809ad8574ed84fdfda452
|
7
|
+
data.tar.gz: 3b96d94c18acf4e6c517922f57f64bed70aad55de66d76ed122048983a204f0a790e4a78f05b8e6676d8af8df04586b5d9287f49be1412f61ebdf7307bcba510
|
@@ -556,14 +556,14 @@ module AttributeContent
|
|
556
556
|
# end
|
557
557
|
# end
|
558
558
|
#
|
559
|
+
# MyUser.find_by(email: 'alice@scrivito.com').preferences[:locale] # => 'en'
|
559
560
|
# alice = Scrivito::User.define('alice@scrivito.com')
|
560
|
-
# alice.preferences[:locale] # => 'en'
|
561
561
|
#
|
562
562
|
# my_page = MyPage.create({_path: '/de/test'}, alice)
|
563
563
|
# my_page.title # => 'Your title here'
|
564
564
|
#
|
565
|
+
# MyUser.find_by(email: 'bob@scrivito.com').preferences[:locale] # => 'de'
|
565
566
|
# bob = Scrivito::User.define('bob@scrivito.com')
|
566
|
-
# bob.preferences[:locale] # => 'de'
|
567
567
|
#
|
568
568
|
# my_page = MyPage.create({_path: '/en/test'}, bob)
|
569
569
|
# my_page.title # => 'Hier den Titel eingeben'
|
@@ -59,7 +59,7 @@ module Scrivito
|
|
59
59
|
include Associations
|
60
60
|
|
61
61
|
def self.type_computer
|
62
|
-
@_type_computer ||= TypeComputer.new(
|
62
|
+
@_type_computer ||= TypeComputer.new(BasicObj, ::Obj)
|
63
63
|
end
|
64
64
|
|
65
65
|
def self.reset_type_computer!
|
@@ -164,7 +164,7 @@ module Scrivito
|
|
164
164
|
end
|
165
165
|
|
166
166
|
private_class_method def self.assert_not_basic_obj(method_name)
|
167
|
-
if self ==
|
167
|
+
if self == BasicObj
|
168
168
|
raise ScrivitoError, "Can not call #{method_name} on Scrivito::BasicObj."\
|
169
169
|
" Only call it on Obj or subclasses of Obj"
|
170
170
|
end
|
@@ -264,7 +264,7 @@ module Scrivito
|
|
264
264
|
# @api public
|
265
265
|
def self.where(field, operator, value, boost = nil)
|
266
266
|
assert_not_basic_obj('.where')
|
267
|
-
if self
|
267
|
+
if type_computer.special_class?(self)
|
268
268
|
Workspace.current.objs.where(field, operator, value, boost)
|
269
269
|
else
|
270
270
|
Workspace.current.objs.where(:_obj_class, :equals, name)
|
@@ -279,7 +279,7 @@ module Scrivito
|
|
279
279
|
# @api public
|
280
280
|
def self.all
|
281
281
|
assert_not_basic_obj('.all')
|
282
|
-
if self
|
282
|
+
if type_computer.special_class?(self)
|
283
283
|
Workspace.current.objs.all
|
284
284
|
else
|
285
285
|
find_all_by_obj_class(name)
|
@@ -300,7 +300,8 @@ module Scrivito
|
|
300
300
|
# @return [Obj]
|
301
301
|
# @api public
|
302
302
|
def self.find_by_path(path)
|
303
|
-
Workspace.current.objs.
|
303
|
+
Workspace.current.objs.find_one_by(:path, path,
|
304
|
+
obj_class_name: type_computer.obj_class_name_for_type(self))
|
304
305
|
end
|
305
306
|
|
306
307
|
# Find an {Scrivito::BasicObj Obj} with the given name.
|
@@ -327,7 +328,8 @@ module Scrivito
|
|
327
328
|
# @return [Obj]
|
328
329
|
# @api public
|
329
330
|
def self.find_by_permalink(permalink)
|
330
|
-
Workspace.current.objs.
|
331
|
+
Workspace.current.objs.find_one_by(:permalink, permalink,
|
332
|
+
obj_class_name: type_computer.obj_class_name_for_type(self))
|
331
333
|
end
|
332
334
|
|
333
335
|
# Returns the {Scrivito::BasicObj Obj} with the given permalink, or raises
|
@@ -337,8 +339,10 @@ module Scrivito
|
|
337
339
|
# @return [Obj]
|
338
340
|
# @api public
|
339
341
|
def self.find_by_permalink!(permalink)
|
340
|
-
find_by_permalink(permalink) or
|
341
|
-
|
342
|
+
find_by_permalink(permalink) or begin
|
343
|
+
model_name = type_computer.obj_class_name_for_type(self) || 'Obj'
|
344
|
+
raise ResourceNotFound, "Could not find #{model_name} with permalink '#{permalink}'"
|
345
|
+
end
|
342
346
|
end
|
343
347
|
|
344
348
|
# Hook method that lets you control which page classes are made available for pages with the given path.
|
@@ -18,7 +18,7 @@ module Scrivito
|
|
18
18
|
end
|
19
19
|
|
20
20
|
updated_attributes.each do |attribute_name, value|
|
21
|
-
if value.is_a?(Array) && value.all? {|w| w.is_a?(BasicWidget)}
|
21
|
+
if value.is_a?(Array) && value.all? { |w| w.is_a?(BasicWidget) }
|
22
22
|
value.each do |widget|
|
23
23
|
unless widget.persisted?
|
24
24
|
attach_widget_to_obj(widget, obj)
|
@@ -11,7 +11,7 @@ module Scrivito
|
|
11
11
|
#
|
12
12
|
DEFAULT_CA_FILE = File.expand_path('../../../../config/ca-bundle.crt', __FILE__)
|
13
13
|
|
14
|
-
# Determine if current visitor is permitted to edit content.
|
14
|
+
# Determine if the current visitor is permitted to edit content.
|
15
15
|
def self.find_user_proc=(value)
|
16
16
|
@find_user_proc = value
|
17
17
|
end
|
@@ -21,15 +21,15 @@ module Scrivito
|
|
21
21
|
end
|
22
22
|
|
23
23
|
#
|
24
|
-
# Configures a callback to be invoked when the SDK determines whether current visitor is
|
24
|
+
# Configures a callback to be invoked when the SDK determines whether the current visitor is
|
25
25
|
# permitted to edit content.
|
26
26
|
#
|
27
27
|
# If the callback is missing in the +development+ or +test+ environment, then the SDK will
|
28
|
-
# assume
|
28
|
+
# assume that the current visitor is {Scrivito::User.system_user}, who can always create
|
29
29
|
# workspaces, can always read, write, publish, delete and invite to any workspace.
|
30
30
|
#
|
31
31
|
# If the callback is missing in any other environment (for example in +production+ or
|
32
|
-
# +staging+), then the SDK will assume
|
32
|
+
# +staging+), then the SDK will assume that the current visitor is not permitted to edit
|
33
33
|
# content.
|
34
34
|
#
|
35
35
|
# @api public
|
@@ -58,14 +58,14 @@ module Scrivito
|
|
58
58
|
@editing_auth_callback || default_editing_auth_callback
|
59
59
|
end
|
60
60
|
|
61
|
-
# Configures how to find users for the in-place
|
61
|
+
# Configures how to find users for the in-place UI.
|
62
62
|
# @api public
|
63
63
|
# @param [Proc] find_user_proc proc for finding a user by the user id
|
64
64
|
# @yieldparam [String] user_id id of the user
|
65
65
|
# @yieldreturn [Scrivito::User] if the user with the given user id was found
|
66
66
|
# @yieldreturn [NilClass] if the user with the given user id was not found
|
67
67
|
# @raise [Scrivito::ScrivitoError] if the proc returns neither a {Scrivito::User}, nor +nil+
|
68
|
-
# @note This configuration key is optional. If it is not configured the in-place
|
68
|
+
# @note This configuration key is optional. If it is not configured the in-place UI would
|
69
69
|
# behave normally, but would not be able to find any users.
|
70
70
|
# @example Return a "dummy" {Scrivito::User}
|
71
71
|
# Scrivito.configure do |config|
|
@@ -110,10 +110,10 @@ module Scrivito
|
|
110
110
|
#
|
111
111
|
# Sets the second level cache.
|
112
112
|
#
|
113
|
-
# If it is set, then +Scrivito+ will
|
113
|
+
# If it is set, then +Scrivito+ will additionally store its cache in both: the filesystem cache
|
114
114
|
# and the second level cache. Also +Scrivito+ will search in the second level cache if
|
115
|
-
#
|
116
|
-
# results, then the results will be
|
115
|
+
# a search in the filesystem cache returns no results. If the second level cache returns
|
116
|
+
# results, then the results will be stored in the filesystem cache.
|
117
117
|
#
|
118
118
|
# By default it is not set.
|
119
119
|
#
|
@@ -271,9 +271,12 @@ module Scrivito
|
|
271
271
|
# Configures the in-place UI to use a locale different from the one used by the rest of the
|
272
272
|
# application.
|
273
273
|
#
|
274
|
+
# This configuration overrides the browser-based UI language detection.
|
275
|
+
# The per-user {UserDefinition#ui_locale UI language definition} overrides this.
|
276
|
+
#
|
274
277
|
# @api public
|
275
278
|
# @example
|
276
|
-
# # The application will use +:de+ as locale.
|
279
|
+
# # The application will use +:de+ as the locale.
|
277
280
|
# I18n.locale = :de
|
278
281
|
#
|
279
282
|
# Scrivito.configure do |config|
|
@@ -293,8 +296,8 @@ module Scrivito
|
|
293
296
|
# @deprecated The legacy routing is deprecated and will be removed in the next major
|
294
297
|
# version of Scrivito.
|
295
298
|
#
|
296
|
-
# Scrivito changed its routing to a slug
|
297
|
-
# allows you to switch back to the old id
|
299
|
+
# Scrivito changed its routing to a slug-first url scheme. This configuration option
|
300
|
+
# allows you to switch back to the old id-first url scheme.
|
298
301
|
def self.legacy_routing
|
299
302
|
@legacy_routing
|
300
303
|
end
|
@@ -364,7 +367,7 @@ scrivito_route '/*permalink', using: 'permalink', via: all
|
|
364
367
|
# When delivering binary Objs, the default image transformation will be applied.
|
365
368
|
#
|
366
369
|
# If not changed the default image transformation is an empty transformation (an empty
|
367
|
-
# +Hash+). Set it to +false+ to
|
370
|
+
# +Hash+). Set it to +false+ to disable the default image transformation completely.
|
368
371
|
#
|
369
372
|
# @param [Hash] value the {Scrivito::Binary#transform transformation definition}
|
370
373
|
#
|
@@ -417,7 +420,7 @@ scrivito_route '/*permalink', using: 'permalink', via: all
|
|
417
420
|
|
418
421
|
def self.register_obj_format(name, &block)
|
419
422
|
if name.start_with? '_'
|
420
|
-
raise InvalidFormatNameError
|
423
|
+
raise InvalidFormatNameError, 'Format names starting with an underscore are not allowed.'
|
421
424
|
else
|
422
425
|
obj_formats[name] = block
|
423
426
|
end
|
@@ -43,7 +43,7 @@ module Scrivito
|
|
43
43
|
# @return [NilClass] if no {Scrivito::BasicObj Obj} with the given +path+ exists.
|
44
44
|
#
|
45
45
|
def find_by_path(path)
|
46
|
-
|
46
|
+
find_one_by(:path, path)
|
47
47
|
end
|
48
48
|
|
49
49
|
#
|
@@ -60,7 +60,7 @@ module Scrivito
|
|
60
60
|
# @return [NilClass] if no {Scrivito::BasicObj Obj} with the given +permalink+ exists.
|
61
61
|
#
|
62
62
|
def find_by_permalink(permalink)
|
63
|
-
|
63
|
+
find_one_by(:permalink, permalink)
|
64
64
|
end
|
65
65
|
|
66
66
|
# Returns an {ObjSearchEnumerator} with the given initial subquery consisting of the
|
@@ -98,6 +98,10 @@ module Scrivito
|
|
98
98
|
all.and(:_obj_class, :equals, obj_class)
|
99
99
|
end
|
100
100
|
|
101
|
+
def find_one_by(view, value, **options)
|
102
|
+
find_by(view, [value], options).first.min_by(&:id)
|
103
|
+
end
|
104
|
+
|
101
105
|
def find_by_parent_path(path)
|
102
106
|
find_by(:ppath, [path]).first
|
103
107
|
end
|
@@ -134,24 +138,24 @@ module Scrivito
|
|
134
138
|
end
|
135
139
|
end
|
136
140
|
|
137
|
-
def find_by(view, keys)
|
138
|
-
find_by_including_deleted(view, keys).
|
139
|
-
list.reject(&:deleted?)
|
140
|
-
end
|
141
|
+
def find_by(view, keys, **options)
|
142
|
+
find_by_including_deleted(view, keys, options).each { |objs| objs.reject!(&:deleted?) }
|
141
143
|
end
|
142
144
|
|
143
145
|
# Accepts the name of an "obj_by" view, a list of keys.
|
144
146
|
# Returns a list of lists of Objs: a list of Objs for each given key.
|
145
|
-
def find_by_including_deleted(view, keys)
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
147
|
+
def find_by_including_deleted(view, keys, obj_class_name: nil)
|
148
|
+
revision = workspace.revision
|
149
|
+
CmsBackend.find_obj_data_by(revision, view, keys).map do |obj_datas|
|
150
|
+
if obj_class_name
|
151
|
+
obj_datas = obj_datas.select do |obj_data|
|
152
|
+
obj_class_name == obj_data.value_of('_obj_class')
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
obj_datas.map do |obj_data|
|
153
157
|
obj = BasicObj.instantiate(obj_data)
|
154
|
-
obj.revision =
|
158
|
+
obj.revision = revision
|
155
159
|
|
156
160
|
obj
|
157
161
|
end
|
@@ -18,9 +18,7 @@ module Scrivito
|
|
18
18
|
#
|
19
19
|
# @return [String]
|
20
20
|
# @api public
|
21
|
-
|
22
|
-
@name
|
23
|
-
end
|
21
|
+
attr_reader :name
|
24
22
|
|
25
23
|
# Total number of Objs available that have this value.
|
26
24
|
#
|
@@ -29,9 +27,7 @@ module Scrivito
|
|
29
27
|
#
|
30
28
|
# @return [Integer]
|
31
29
|
# @api public
|
32
|
-
|
33
|
-
@count
|
34
|
-
end
|
30
|
+
attr_reader :count
|
35
31
|
|
36
32
|
# The Objs that were included in this search.
|
37
33
|
#
|
@@ -41,9 +37,7 @@ module Scrivito
|
|
41
37
|
#
|
42
38
|
# @return [Array<BasicObj>]
|
43
39
|
# @api public
|
44
|
-
|
45
|
-
@included_objs
|
46
|
-
end
|
40
|
+
attr_reader :included_objs
|
47
41
|
|
48
42
|
end
|
49
43
|
end
|
@@ -5,8 +5,8 @@ class TypeComputer
|
|
5
5
|
@base_class, @fallback_class = base_class, fallback_class
|
6
6
|
end
|
7
7
|
|
8
|
-
def compute_type(
|
9
|
-
load_class(
|
8
|
+
def compute_type(obj_class_name)
|
9
|
+
load_class(obj_class_name) || @fallback_class
|
10
10
|
end
|
11
11
|
|
12
12
|
def compute_type_without_fallback(obj_class_name)
|
@@ -21,17 +21,19 @@ class TypeComputer
|
|
21
21
|
klass == @base_class || klass == @fallback_class
|
22
22
|
end
|
23
23
|
|
24
|
+
def obj_class_name_for_type(klass)
|
25
|
+
unless special_class?(klass)
|
26
|
+
klass.name
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
24
30
|
private
|
25
31
|
|
26
32
|
def load_class(obj_class)
|
27
33
|
klass = obj_class.constantize
|
28
|
-
klass if
|
34
|
+
klass if klass < @base_class
|
29
35
|
rescue NameError
|
30
36
|
end
|
31
|
-
|
32
|
-
def inherits_from_base?(klass)
|
33
|
-
klass.ancestors.include?(@base_class) && klass != @base_class
|
34
|
-
end
|
35
37
|
end
|
36
38
|
|
37
39
|
end
|
@@ -22,7 +22,8 @@ class UiConfig < Struct.new(:editing_context, :resource, :return_to, :app_extens
|
|
22
22
|
private
|
23
23
|
|
24
24
|
def i18n_config
|
25
|
-
|
25
|
+
locale = editor.try!(:ui_locale) || Scrivito::Configuration.ui_locale
|
26
|
+
{locale: locale}
|
26
27
|
end
|
27
28
|
|
28
29
|
def obj_class_config
|
data/app/cms/scrivito/user.rb
CHANGED
@@ -131,14 +131,20 @@ module Scrivito
|
|
131
131
|
end
|
132
132
|
end
|
133
133
|
|
134
|
-
attr_reader :id
|
134
|
+
attr_reader :id
|
135
|
+
attr_reader :description_proc
|
136
|
+
attr_reader :explicit_rules
|
137
|
+
attr_reader :restriction_set
|
138
|
+
attr_reader :suggest_users_proc
|
139
|
+
attr_reader :ui_locale
|
135
140
|
|
136
141
|
def initialize(options)
|
137
142
|
@id = options[:id]
|
138
|
-
@explicit_rules = options[:explicit_rules]
|
139
143
|
@description_proc = options[:description_proc]
|
140
|
-
@
|
144
|
+
@explicit_rules = options[:explicit_rules]
|
141
145
|
@restriction_set = options[:restriction_set]
|
146
|
+
@suggest_users_proc = options[:suggest_users_proc]
|
147
|
+
@ui_locale = options[:ui_locale]
|
142
148
|
|
143
149
|
@explicit_rules.each { |rule| assert_valid_verb(rule.second) }
|
144
150
|
@explicit_rules_set = Set.new(@explicit_rules.map { |rule| rule.take(3) })
|
@@ -22,7 +22,7 @@ module Scrivito
|
|
22
22
|
#
|
23
23
|
# @param [Symbol] verb the verb of the action (see {Scrivito::User::VERBS}).
|
24
24
|
# @param [Symbol] subject the subject of the action. Currently, only +:workspace+ is supported.
|
25
|
-
# @param [String] message optional message to be displayed in the UI.
|
25
|
+
# @param [String] message an optional message to be displayed in the UI.
|
26
26
|
#
|
27
27
|
# @raise [Scrivito::ScrivitoError] if the given verb is invalid
|
28
28
|
# @raise [Scrivito::ScrivitoError] if the specified rule conflicts with a
|
@@ -57,7 +57,7 @@ module Scrivito
|
|
57
57
|
#
|
58
58
|
# @param [Symbol] verb the verb of the action (see {Scrivito::User::VERBS}).
|
59
59
|
# @param [Symbol] subject the subject of the action. Currently, only +:workspace+ is supported.
|
60
|
-
# @param [String] message optional message to be displayed in the UI.
|
60
|
+
# @param [String] message an optional message to be displayed in the UI.
|
61
61
|
#
|
62
62
|
# @raise [Scrivito::ScrivitoError] if the given verb is invalid
|
63
63
|
# @raise [Scrivito::ScrivitoError] if the specified rule conflicts with a
|
@@ -82,7 +82,7 @@ module Scrivito
|
|
82
82
|
end
|
83
83
|
|
84
84
|
#
|
85
|
-
#
|
85
|
+
# Enables the user to create workspaces, to read from, write to, publish, delete workspaces,
|
86
86
|
# and to invite others to collaborate on any workspace.
|
87
87
|
#
|
88
88
|
# @api public
|
@@ -92,21 +92,21 @@ module Scrivito
|
|
92
92
|
end
|
93
93
|
|
94
94
|
#
|
95
|
-
# Defines the user description to be displayed in the in-place
|
95
|
+
# Defines the user description to be displayed in the in-place UI, e.g. in the workspace menu.
|
96
96
|
#
|
97
97
|
# @api public
|
98
98
|
#
|
99
99
|
# @param [String] description_string the description, defaults to the the user id.
|
100
|
-
# @param [Proc] description_proc proc to calculate the description, defaults to the
|
100
|
+
# @param [Proc] description_proc a proc to calculate the description, defaults to the user id.
|
101
101
|
#
|
102
|
-
# @note The description is calculated "
|
102
|
+
# @note The description is calculated "lazily". The calculated description is cached.
|
103
103
|
#
|
104
104
|
# @see Scrivito::User.define
|
105
105
|
#
|
106
|
-
# @example
|
106
|
+
# @example Displays the user +alice+ as "alice" in the in-place UI:
|
107
107
|
# alice = Scrivito::User.define('alice')
|
108
108
|
#
|
109
|
-
# @example
|
109
|
+
# @example Displays the user +bob+ as "Bob Doe" in the in-place UI:
|
110
110
|
# bob = Scrivito::User.define('bob') do |user|
|
111
111
|
# user.description('Bob Doe')
|
112
112
|
# end
|
@@ -126,17 +126,17 @@ module Scrivito
|
|
126
126
|
end
|
127
127
|
|
128
128
|
#
|
129
|
-
# Defines the proc for fetching users for autocompletion purposes in the in-place
|
129
|
+
# Defines the proc for fetching users for autocompletion purposes in the in-place UI.
|
130
130
|
# User autocompletion is used in the settings dialog of a workspace.
|
131
131
|
# If the proc is not set, {Scrivito::User.find} is used to fetch the suggested users,
|
132
132
|
# assuming the input is part of the user id.
|
133
133
|
#
|
134
134
|
# @api public
|
135
135
|
#
|
136
|
-
# @note Only the first 20 users returned are displayed in the in-place
|
136
|
+
# @note Only the first 20 users returned are displayed in the in-place UI.
|
137
137
|
# @note +suggest_users_proc+ may also be invoked with an empty string.
|
138
138
|
#
|
139
|
-
# @param [Proc] suggest_users_proc proc for fetching users to be suggested in the in-place
|
139
|
+
# @param [Proc] suggest_users_proc proc for fetching users to be suggested in the in-place UI
|
140
140
|
# @yieldparam [String] input an arbitrary string originating from the user autocompletion input field,
|
141
141
|
# e.g. the first letters of a user name
|
142
142
|
# @yieldreturn [Array<Scrivito::User>] users that were found on account of the given input string
|
@@ -168,7 +168,7 @@ module Scrivito
|
|
168
168
|
# with this attribute.
|
169
169
|
#
|
170
170
|
# @param [Hash] options
|
171
|
-
# @option options [Symbol] :using the attribute you
|
171
|
+
# @option options [Symbol] :using the attribute you wish to refer to in the callback
|
172
172
|
# @yield [attribute] the value of the specified attribute
|
173
173
|
# @yieldreturn [String, false] either return a message for the user or +false+ if
|
174
174
|
# no restriction applies
|
@@ -200,13 +200,35 @@ module Scrivito
|
|
200
200
|
restriction_set.add(options, &block)
|
201
201
|
end
|
202
202
|
|
203
|
+
#
|
204
|
+
# Lets you specify the user's in-place UI language.
|
205
|
+
#
|
206
|
+
# Overrides auto-detection from browser language.
|
207
|
+
# Overrides the application-wide scrivito {Configuration.ui_locale UI locale configuration}.
|
208
|
+
#
|
209
|
+
# @api public
|
210
|
+
#
|
211
|
+
# @param [String] language a language code (e.g. 'en')
|
212
|
+
#
|
213
|
+
# @see Scrivito::User.define
|
214
|
+
#
|
215
|
+
# @example Have +robert+ use a UI with German titles:
|
216
|
+
# robert = Scrivito::User.define('robert') do |user|
|
217
|
+
# user.ui_locale('de')
|
218
|
+
# end
|
219
|
+
#
|
220
|
+
def ui_locale(language)
|
221
|
+
@ui_locale = language
|
222
|
+
end
|
223
|
+
|
203
224
|
def user
|
204
225
|
User.new(
|
205
226
|
id: @user_id,
|
206
227
|
explicit_rules: @explicit_rules,
|
207
228
|
description_proc: @description_proc,
|
208
229
|
suggest_users_proc: @suggest_users_proc,
|
209
|
-
restriction_set: restriction_set
|
230
|
+
restriction_set: restriction_set,
|
231
|
+
ui_locale: @ui_locale,
|
210
232
|
)
|
211
233
|
end
|
212
234
|
|