promethee 3.0.2 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
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