promethee 3.0.2 → 4.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 (104) hide show
  1. checksums.yaml +5 -5
  2. data/UPGRADING +2 -2
  3. data/app/assets/stylesheets/promethee-edit.sass +1 -0
  4. data/app/assets/stylesheets/promethee-edit/_localizer.sass +4 -0
  5. data/app/models/concerns/promethee_data.rb +57 -34
  6. data/app/services/promethee/structure_upgrader/components/aside.rb +51 -0
  7. data/app/services/promethee/structure_upgrader/components/base.rb +36 -0
  8. data/app/services/promethee/structure_upgrader/components/blockquote.rb +32 -0
  9. data/app/services/promethee/structure_upgrader/components/collection.rb +31 -0
  10. data/app/services/promethee/structure_upgrader/components/collection_item.rb +55 -0
  11. data/app/services/promethee/structure_upgrader/components/column.rb +92 -0
  12. data/app/services/promethee/structure_upgrader/components/cover.rb +49 -0
  13. data/app/services/promethee/structure_upgrader/components/faq.rb +16 -0
  14. data/app/services/promethee/structure_upgrader/components/faq_item.rb +49 -0
  15. data/app/services/promethee/structure_upgrader/components/image.rb +42 -0
  16. data/app/services/promethee/structure_upgrader/components/page.rb +56 -0
  17. data/app/services/promethee/structure_upgrader/components/row.rb +32 -0
  18. data/app/services/promethee/structure_upgrader/components/slider.rb +16 -0
  19. data/app/services/promethee/structure_upgrader/components/slider_item.rb +55 -0
  20. data/app/services/promethee/structure_upgrader/components/table.rb +116 -0
  21. data/app/services/promethee/structure_upgrader/components/table_cell.rb +16 -0
  22. data/app/services/promethee/structure_upgrader/components/text.rb +25 -0
  23. data/app/services/promethee/structure_upgrader/components/video.rb +32 -0
  24. data/app/services/promethee/structure_upgrader_service.rb +110 -0
  25. data/app/views/promethee/_edit.html.erb +34 -4
  26. data/app/views/promethee/_localize.html.erb +34 -3
  27. data/app/views/promethee/components/aside/_edit.define.html.erb +29 -4
  28. data/app/views/promethee/components/aside/_edit.inspect.html.erb +6 -6
  29. data/app/views/promethee/components/aside/_edit.move.html.erb +7 -7
  30. data/app/views/promethee/components/aside/_localize.html.erb +11 -11
  31. data/app/views/promethee/components/aside/_show.html.erb +8 -8
  32. data/app/views/promethee/components/blockquote/_edit.define.html.erb +12 -2
  33. data/app/views/promethee/components/blockquote/_edit.inspect.html.erb +4 -4
  34. data/app/views/promethee/components/blockquote/_edit.move.html.erb +3 -3
  35. data/app/views/promethee/components/blockquote/_localize.html.erb +8 -8
  36. data/app/views/promethee/components/blockquote/_show.html.erb +3 -3
  37. data/app/views/promethee/components/collection/_edit.define.html.erb +12 -1
  38. data/app/views/promethee/components/collection/_edit.inspect.html.erb +4 -4
  39. data/app/views/promethee/components/collection/_edit.move.html.erb +1 -1
  40. data/app/views/promethee/components/collection/_localize.html.erb +0 -1
  41. data/app/views/promethee/components/collection/_show.html.erb +1 -2
  42. data/app/views/promethee/components/collection_item/_edit.define.html.erb +27 -5
  43. data/app/views/promethee/components/collection_item/_edit.inspect.html.erb +6 -6
  44. data/app/views/promethee/components/collection_item/_edit.move.html.erb +5 -5
  45. data/app/views/promethee/components/collection_item/_localize.html.erb +9 -9
  46. data/app/views/promethee/components/collection_item/_show.html.erb +7 -7
  47. data/app/views/promethee/components/column/_edit.define.html.erb +58 -8
  48. data/app/views/promethee/components/column/_edit.inspect.html.erb +19 -19
  49. data/app/views/promethee/components/column/_localize.html.erb +0 -1
  50. data/app/views/promethee/components/column/_show.html.erb +10 -10
  51. data/app/views/promethee/components/cover/_edit.define.html.erb +26 -6
  52. data/app/views/promethee/components/cover/_edit.inspect.html.erb +4 -4
  53. data/app/views/promethee/components/cover/_edit.move.html.erb +4 -4
  54. data/app/views/promethee/components/cover/_localize.html.erb +14 -14
  55. data/app/views/promethee/components/cover/_show.html.erb +10 -10
  56. data/app/views/promethee/components/faq_item/_edit.define.html.erb +25 -5
  57. data/app/views/promethee/components/faq_item/_edit.inspect.html.erb +4 -4
  58. data/app/views/promethee/components/faq_item/_edit.move.html.erb +6 -6
  59. data/app/views/promethee/components/faq_item/_localize.html.erb +7 -7
  60. data/app/views/promethee/components/faq_item/_show.html.erb +7 -7
  61. data/app/views/promethee/components/image/_edit.define.html.erb +19 -4
  62. data/app/views/promethee/components/image/_edit.inspect.html.erb +3 -3
  63. data/app/views/promethee/components/image/_edit.move.html.erb +5 -5
  64. data/app/views/promethee/components/image/_localize.html.erb +20 -17
  65. data/app/views/promethee/components/image/_show.html.erb +6 -6
  66. data/app/views/promethee/components/page/_edit.define.html.erb +32 -7
  67. data/app/views/promethee/components/page/_edit.inspect.html.erb +5 -5
  68. data/app/views/promethee/components/page/_localize.html.erb +8 -8
  69. data/app/views/promethee/components/page/_show.html.erb +4 -4
  70. data/app/views/promethee/components/row/_edit.define.html.erb +12 -2
  71. data/app/views/promethee/components/row/_edit.inspect.html.erb +8 -8
  72. data/app/views/promethee/components/row/_edit.move.html.erb +9 -9
  73. data/app/views/promethee/components/row/_show.html.erb +7 -6
  74. data/app/views/promethee/components/slider_item/_edit.define.html.erb +27 -5
  75. data/app/views/promethee/components/slider_item/_edit.inspect.html.erb +6 -6
  76. data/app/views/promethee/components/slider_item/_edit.move.html.erb +7 -7
  77. data/app/views/promethee/components/slider_item/_localize.html.erb +9 -9
  78. data/app/views/promethee/components/slider_item/_show.html.erb +7 -8
  79. data/app/views/promethee/components/table/_edit.define.html.erb +9 -6
  80. data/app/views/promethee/components/table/_edit.inspect.html.erb +138 -50
  81. data/app/views/promethee/components/table/_edit.move.html.erb +17 -7
  82. data/app/views/promethee/components/table/_localize.html.erb +0 -43
  83. data/app/views/promethee/components/table/_show.html.erb +13 -16
  84. data/app/views/promethee/components/table_cell/_edit.define.html.erb +22 -0
  85. data/app/views/promethee/components/table_cell/_edit.inspect.html.erb +0 -0
  86. data/app/views/promethee/components/table_cell/_edit.move.html.erb +0 -0
  87. data/app/views/promethee/components/table_cell/_icon.svg +3 -0
  88. data/app/views/promethee/components/table_cell/_localize.html.erb +14 -0
  89. data/app/views/promethee/components/table_cell/_show.html.erb +0 -0
  90. data/app/views/promethee/components/text/_edit.define.html.erb +6 -1
  91. data/app/views/promethee/components/text/_edit.inspect.html.erb +3 -3
  92. data/app/views/promethee/components/text/_edit.move.html.erb +1 -1
  93. data/app/views/promethee/components/text/_localize.html.erb +3 -3
  94. data/app/views/promethee/components/text/_show.html.erb +2 -2
  95. data/app/views/promethee/components/video/_edit.define.html.erb +12 -2
  96. data/app/views/promethee/components/video/_edit.inspect.html.erb +2 -2
  97. data/app/views/promethee/components/video/_edit.move.html.erb +6 -6
  98. data/app/views/promethee/components/video/_localize.html.erb +4 -4
  99. data/app/views/promethee/components/video/_show.html.erb +4 -3
  100. data/app/views/promethee/presets/_image-with-text.html.erb +171 -6
  101. data/lib/promethee/data/localization.rb +13 -2
  102. data/lib/promethee/rails/version.rb +1 -1
  103. data/lib/tasks/promethee/promethee.rake +6 -0
  104. metadata +31 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 4dd94a544973da8049159835435db08a39398db7
4
- data.tar.gz: 7a388c762c9f50e1654a0e8263bbe68887d622b4
2
+ SHA256:
3
+ metadata.gz: 9919911b70d645a32c0cc7cb303e88e358964153829f76747dd62b2acbafc8f8
4
+ data.tar.gz: f72bac7ccb51c4c55686bdafe41997d8d6d366f0f00861127ed593786d90938a
5
5
  SHA512:
6
- metadata.gz: 8cf7dde5e3e44eecce1a485107bcd9809db1da80968380bb636038c5e3fc5fb8f0ed9f6fa0a66e7ff0ff0f9db9eac78cbb817a5463343ebed583086fd79dac34
7
- data.tar.gz: cca97c58406b7b5f32ce3a0b2c1203a3140fad8802077f995f3dbd3fef51997fa5abf4aeee56c70f87daf5b7479cac60acb74f6b7b94b3532a483afee8c78c35
6
+ metadata.gz: 53817f67399c99bd21ba4f2e01c276fc4ef0dc80c62f9c3f7a17e25bc6f73d6cb7758983e2990457672d35042623ddd7f476394be8be36249b552e39a7e76d5c
7
+ data.tar.gz: 6832ef6057efface08ee81ee0db720bf9534df96637b34b3cebd703f849b0c1b3d483b94417ae6ed27c66846e520593e0492e3d6d161e3d087ecd2eb81281bf0
data/UPGRADING CHANGED
@@ -1,8 +1,8 @@
1
1
  ###################################
2
- # NOTE FOR UPGRADING TO 3.x.x #
2
+ # NOTE FOR UPGRADING TO 4.x.x #
3
3
  ###################################
4
4
 
5
- In Prométhée 3.0, the access to ActiveStorage blobs is now with signed IDs instead of simple IDs.
5
+ In Prométhée 4.0, to apply the correct sanitization process, every attribute has an explicit type.
6
6
  A rake task is available to upgrade your data.
7
7
 
8
8
  For more details, check the documentation:
@@ -10,3 +10,4 @@ $promethee-color: #ff9900 !default
10
10
  @import 'promethee-edit/move'
11
11
  @import 'promethee-edit/preview'
12
12
  @import 'promethee-edit/summernote'
13
+ @import 'promethee-edit/localizer'
@@ -0,0 +1,4 @@
1
+ .promethee-localizer
2
+ .reference-choice
3
+ min-width: 200px
4
+ width: auto
@@ -4,51 +4,57 @@ module PrometheeData
4
4
  # Setter to serialize data as JSON
5
5
  def data=(value)
6
6
  value = JSON.parse value if value.is_a? String
7
- value = promethee_sanitize(value)
7
+
8
+ if value.has_key? 'components'
9
+ # For translations, contents are in components, not children
10
+ value['components'].map { |component| promethee_sanitize(component) }
11
+ else
12
+ # For masters, contents are in children
13
+ value = promethee_sanitize(value)
14
+ end
8
15
  super(value)
9
16
  end
10
17
 
11
18
  # Getters and setters to get PAGE Title, Description & Thumbnail
12
19
  def promethee_data_page_title
13
- data['attributes']['searchable_title']
20
+ data['attributes']['title']['value']
14
21
  rescue
15
22
  ''
16
23
  end
17
24
 
18
25
  def promethee_data_page_title=(value)
19
- self.data['attributes']['searchable_title'] = value
26
+ self.data['attributes']['title']['value'] = value
20
27
  end
21
28
 
22
29
  def promethee_data_page_description
23
- data['attributes']['searchable_description']
30
+ data['attributes']['description']['value']
24
31
  rescue
25
32
  ''
26
33
  end
27
34
 
28
35
  def promethee_data_page_description=(value)
29
- self.data['attributes']['searchable_description'] = value
36
+ self.data['attributes']['description']['value'] = value
30
37
  end
31
38
 
32
39
  def promethee_data_page_thumbnail
33
- ActiveStorage::Blob.find_signed(data['attributes']['thumbnail']['id'])
40
+ ActiveStorage::Blob.find_signed(data['attributes']['thumbnail']['value']['id'])
34
41
  rescue
35
42
  nil
36
43
  end
37
44
 
38
45
  # Getters to get TRANSLATION Title & Description
39
46
  def promethee_data_translation_title
40
- data['components'].first['attributes']['searchable_title']
47
+ data['components'].first['attributes']['title']['value']
41
48
  rescue
42
49
  ''
43
50
  end
44
51
 
45
52
  def promethee_data_translation_description
46
- data['components'].first['attributes']['searchable_description']
53
+ data['components'].first['attributes']['description']['value']
47
54
  rescue
48
55
  ''
49
56
  end
50
57
 
51
-
52
58
  def promethee_data_searchable
53
59
  promethee_extract_searchable data
54
60
  end
@@ -62,20 +68,25 @@ module PrometheeData
62
68
  searchable = ' '
63
69
  searchable += promethee_extract_searchable_attributes component['attributes'] if component.include?('attributes')
64
70
  # For masters, contents are in children
65
- searchable += promethee_extract_searchable_children component['children'] if component.include? 'children'
71
+ searchable += promethee_extract_searchable_children component['children'] if component.include?('children')
66
72
  # For translations, contents are in components, not children
67
- searchable += promethee_extract_searchable_children component['components'] if component.include? 'components'
73
+ searchable += promethee_extract_searchable_children component['components'] if component.include?('components')
68
74
  searchable
69
75
  end
70
76
 
71
77
  def promethee_extract_searchable_attributes(attributes)
72
78
  searchable = ' '
73
- attributes.each do |key, value|
74
- if key.starts_with? 'searchable_'
75
- clean_value = strip_tags value
79
+ attributes.each do |key, value_object|
80
+ if value_object['searchable']
81
+ clean_value = strip_tags value_object['value']
76
82
  searchable += "#{clean_value} "
77
- elsif value.class == Hash
78
- searchable += promethee_extract_searchable_attributes(value)
83
+ end
84
+ if value_object['type'] == 'array'
85
+ value_object['value'].each do |object|
86
+ searchable += promethee_extract_searchable_attributes(object)
87
+ end
88
+ elsif value_object['type'] == 'hash'
89
+ searchable += promethee_extract_searchable_attributes(value_object['value'])
79
90
  end
80
91
  end
81
92
  searchable
@@ -89,24 +100,36 @@ module PrometheeData
89
100
  searchable
90
101
  end
91
102
 
92
- def promethee_sanitize(data)
93
- return sanitize(data) if data.is_a? String
94
-
95
- data.each do |key, value|
96
- case value.class.to_s
97
- when 'String'
98
- data[key] = sanitize(value)
99
- when 'Hash'
100
- data[key] = promethee_sanitize(value)
101
- when 'Array'
102
- new_array = []
103
- value.each do |element|
104
- new_array << promethee_sanitize(element)
105
- end
106
- data[key] = new_array
107
- end
108
- end if data.respond_to? :each
103
+ def promethee_sanitize(component)
104
+ attributes = component['attributes']
105
+ attributes = promethee_sanitize_attributes(attributes)
106
+
107
+ children = component['children']
108
+ children.each do |child|
109
+ child = promethee_sanitize(child)
110
+ end unless children.nil?
111
+
112
+ component
113
+ end
109
114
 
110
- data
115
+ def promethee_sanitize_attributes(attributes)
116
+ attributes.each do |key, value_object|
117
+ case value_object['type']
118
+ when 'string'
119
+ while value_object['value'] != Loofah.fragment(value_object['value']).text(encode_special_chars: false)
120
+ value_object['value'] = Loofah.fragment(value_object['value']).text(encode_special_chars: false)
121
+ end
122
+ when 'text'
123
+ value_object['value'] = sanitize(value_object['value'])
124
+ when 'hash'
125
+ value_object['value'] = promethee_sanitize_attributes(value_object['value'])
126
+ when 'array'
127
+ value_object['value'].each do |object|
128
+ object = promethee_sanitize_attributes(object)
129
+ end
130
+ end if value_object.has_key?('type')
131
+ attributes[key] = value_object
132
+ end unless attributes.nil?
133
+ attributes
111
134
  end
112
135
  end
@@ -0,0 +1,51 @@
1
+ # Aside Component
2
+ # ================
3
+ #
4
+ # V3
5
+ # -----
6
+ #
7
+ # {
8
+ # searchable_visible_content: '<p>Edit me</p>',
9
+ # searchable_collapsed_content: '',
10
+ # searchable_open_label: 'See more',
11
+ # open_label_position: 'left'
12
+ # }
13
+ #
14
+
15
+ module Promethee::StructureUpgrader::Components
16
+ class Aside < Base
17
+ def upgraded_attributes
18
+ {
19
+ 'visible_content' => {
20
+ 'searchable' => true,
21
+ 'translatable' => true,
22
+ 'type' => 'text',
23
+ 'value' => attribute('searchable_visible_content')
24
+ },
25
+ 'collapsed_content' => {
26
+ 'searchable' => true,
27
+ 'translatable' => true,
28
+ 'type' => 'text',
29
+ 'value' => attribute('searchable_collapsed_content')
30
+ },
31
+ 'open_label' => {
32
+ 'searchable' => true,
33
+ 'translatable' => true,
34
+ 'type' => 'string',
35
+ 'value': string_attribute('searchable_open_label')
36
+ },
37
+ 'open_label_position' => {
38
+ 'collection' => [
39
+ { 'label' => 'Left', 'value' => 'left' },
40
+ { 'label' => 'Center', 'value' => 'center' },
41
+ { 'label' => 'Right', 'value' => 'right' }
42
+ ],
43
+ 'searchable' => false,
44
+ 'translatable' => false,
45
+ 'type' => 'enum',
46
+ 'value' => attribute('open_label_position')
47
+ }
48
+ }
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,36 @@
1
+ module Promethee::StructureUpgrader::Components
2
+ class Base
3
+ def initialize(data)
4
+ @data = data
5
+ # puts "<#{self.class}> Initialized."
6
+
7
+ upgrade
8
+ end
9
+
10
+ def upgraded_data
11
+ @upgraded_data
12
+ end
13
+
14
+ def upgrade
15
+ @upgraded_data = @data.deep_dup
16
+ return if @upgraded_data['attributes'].empty?
17
+
18
+ @upgraded_data['attributes'] = upgraded_attributes.deep_stringify_keys
19
+ end
20
+
21
+ def upgraded_attributes
22
+ raise NotImplementedError
23
+ end
24
+
25
+ protected
26
+
27
+ def string_attribute(*path)
28
+ text = attribute(*path)
29
+ Loofah.fragment(text).text(encode_special_chars: false)
30
+ end
31
+
32
+ def attribute(*path)
33
+ @data.dig('attributes', *path)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,32 @@
1
+ # Blockquote Component
2
+ # ================
3
+ #
4
+ # V3
5
+ # -----
6
+ #
7
+ # {
8
+ # searchable_body: '<p>Edit me</p>',
9
+ # searchable_author: ''
10
+ # }
11
+ #
12
+
13
+ module Promethee::StructureUpgrader::Components
14
+ class Blockquote < Base
15
+ def upgraded_attributes
16
+ {
17
+ 'body' => {
18
+ 'searchable' => true,
19
+ 'translatable' => true,
20
+ 'type' => 'text',
21
+ 'value' => attribute('searchable_body'),
22
+ },
23
+ 'author' => {
24
+ 'searchable' => true,
25
+ 'translatable' => false,
26
+ 'type' => 'string',
27
+ 'value' => string_attribute('searchable_author')
28
+ }
29
+ }
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,31 @@
1
+ # Collection Component
2
+ # ================
3
+ #
4
+ # V3
5
+ # -----
6
+ #
7
+ # {
8
+ # items_per_line: 6
9
+ # }
10
+ #
11
+
12
+ module Promethee::StructureUpgrader::Components
13
+ class Collection < Base
14
+ def upgraded_attributes
15
+ {
16
+ 'items_per_line' => {
17
+ 'collection' => [
18
+ { 'label' => '2', 'value' => 2 },
19
+ { 'label' => '3', 'value' => 3 },
20
+ { 'label' => '4', 'value' => 4 },
21
+ { 'label' => '6', 'value' => 6 }
22
+ ],
23
+ 'searchable' => false,
24
+ 'translatable' => false,
25
+ 'type' => 'enum',
26
+ 'value' => attribute('items_per_line')
27
+ }
28
+ }
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,55 @@
1
+ # Collection Item Component
2
+ # ================
3
+ #
4
+ # V3
5
+ # -----
6
+ #
7
+ # {
8
+ # searchable_caption: "",
9
+ # media_type: "image",
10
+ # image: {
11
+ # id: undefined,
12
+ # name: ""
13
+ # },
14
+ # video: {
15
+ # url: "https://vimeo.com/115082758"
16
+ # }
17
+ # }
18
+ #
19
+
20
+ module Promethee::StructureUpgrader::Components
21
+ class CollectionItem < Base
22
+ def upgraded_attributes
23
+ {
24
+ 'caption' => {
25
+ 'searchable' => true,
26
+ 'translatable' => true,
27
+ 'type' => 'text',
28
+ 'value' => attribute('searchable_caption')
29
+ },
30
+ 'media_type' => {
31
+ 'collection' => [
32
+ { 'label' => 'Image', 'value' => 'image' },
33
+ { 'label' => 'Video', 'value' => 'video' }
34
+ ],
35
+ 'searchable' => false,
36
+ 'translatable' => false,
37
+ 'type' => 'enum',
38
+ 'value' => attribute('media_type')
39
+ },
40
+ 'image' => {
41
+ 'searchable' => false,
42
+ 'translatable' => false,
43
+ 'type' => 'blob',
44
+ 'value' => attribute('image')
45
+ },
46
+ 'video' => {
47
+ 'searchable' => false,
48
+ 'translatable' => true,
49
+ 'type' => 'video',
50
+ 'value' => attribute('video', 'url')
51
+ }
52
+ }
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,92 @@
1
+ # Column Component
2
+ # ================
3
+ #
4
+ # V3
5
+ # -----
6
+ #
7
+ # {
8
+ # size: 4,
9
+ # offset: 0,
10
+ # mobile: {
11
+ # enabled: false,
12
+ # size: 12,
13
+ # offset: 0
14
+ # },
15
+ # tablet: {
16
+ # enabled: false,
17
+ # size: 12,
18
+ # offset: 0
19
+ # }
20
+ # }
21
+ #
22
+
23
+ module Promethee::StructureUpgrader::Components
24
+ class Column < Base
25
+ def upgraded_attributes
26
+ {
27
+ 'size' => {
28
+ 'searchable' => false,
29
+ 'translatable' => false,
30
+ 'type' => 'integer',
31
+ 'value' => attribute('size')
32
+ },
33
+ 'offset' => {
34
+ 'searchable' => false,
35
+ 'translatable' => false,
36
+ 'type' => 'integer',
37
+ 'value' => attribute('offset')
38
+ },
39
+ 'mobile' => {
40
+ 'searchable' => false,
41
+ 'translatable' => false,
42
+ 'type' => 'hash',
43
+ 'value' => {
44
+ 'enabled' => {
45
+ 'searchable' => false,
46
+ 'translatable' => false,
47
+ 'type' => 'boolean',
48
+ 'value' => attribute('mobile', 'enabled')
49
+ },
50
+ 'size' => {
51
+ 'searchable' => false,
52
+ 'translatable' => false,
53
+ 'type' => 'integer',
54
+ 'value' => attribute('mobile', 'size')
55
+ },
56
+ 'offset' => {
57
+ 'searchable' => false,
58
+ 'translatable' => false,
59
+ 'type' => 'integer',
60
+ 'value' => attribute('mobile', 'offset')
61
+ }
62
+ }
63
+ },
64
+ 'tablet' => {
65
+ 'searchable' => false,
66
+ 'translatable' => false,
67
+ 'type' => 'hash',
68
+ 'value' => {
69
+ 'enabled' => {
70
+ 'searchable' => false,
71
+ 'translatable' => false,
72
+ 'type' => 'boolean',
73
+ 'value' => attribute('tablet', 'enabled')
74
+ },
75
+ 'size' => {
76
+ 'searchable' => false,
77
+ 'translatable' => false,
78
+ 'type' => 'integer',
79
+ 'value' => attribute('tablet', 'size')
80
+ },
81
+ 'offset' => {
82
+ 'searchable' => false,
83
+ 'translatable' => false,
84
+ 'type' => 'integer',
85
+ 'value' => attribute('tablet', 'offset')
86
+ }
87
+ }
88
+ }
89
+ }
90
+ end
91
+ end
92
+ end