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
@@ -0,0 +1,22 @@
1
+ <%
2
+ init = <<~JAVASCRIPT
3
+ promethee.definitions.push({
4
+ name: 'Table cell',
5
+ icon: #{ promethee_component_render_icon 'table_cell' },
6
+ position: 60,
7
+ library: false,
8
+ data: {
9
+ type: 'table_cell',
10
+ attributes: {
11
+ text: {
12
+ searchable: true,
13
+ translatable: true,
14
+ type: 'string',
15
+ value: ''
16
+ }
17
+ }
18
+ }
19
+ })
20
+ JAVASCRIPT
21
+ %>
22
+ <div ng-init="<%= init %>"></div>
@@ -0,0 +1,3 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="500" height="500" viewBox="0 0 500 500">
2
+ <image id="Objet_dynamique_vectoriel" data-name="Objet dynamique vectoriel" x="72" y="113" width="355" height="274" xlink:href="data:img/png;base64,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"/>
3
+ </svg>
@@ -0,0 +1,14 @@
1
+ <script type="text/ng-template" id="promethee/components/table_cell/localize">
2
+ <div ng-show="master.attributes.text.value !== ''">
3
+ <div class="row mt-2" ng-show="master.attributes.text.value !== ''">
4
+ <div class="col-md-6">
5
+ <b>Text</b>
6
+ <p>{{ master.attributes.text.value }}</p>
7
+ </div>
8
+ <div class="col-md-6">
9
+ <b>Text</b>
10
+ <input class="form-control" ng-model="component.attributes.text.value" type="text">
11
+ </div>
12
+ </div>
13
+ </div>
14
+ </script>
@@ -8,7 +8,12 @@
8
8
  data: {
9
9
  type: 'text',
10
10
  attributes: {
11
- searchable_body: '<p>Edit me</p>'
11
+ body: {
12
+ searchable: true,
13
+ translatable: true,
14
+ type: 'text',
15
+ value: '<p>Edit me</p>'
16
+ }
12
17
  }
13
18
  }
14
19
  })
@@ -1,8 +1,8 @@
1
1
  <script type="text/ng-template" id="promethee/components/text/edit/inspect">
2
2
  <div class="form-group">
3
- <summernote config="summernoteConfig" ng-model="promethee.inspected.attributes.searchable_body"></summernote>
3
+ <summernote config="summernoteConfig" ng-model="promethee.inspected.attributes.body.value"></summernote>
4
4
  </div>
5
5
 
6
- {{promethee.inspected.attributes.searchable_body | textContentFromHTML | numberOfWords}} words<br>
7
- {{promethee.inspected.attributes.searchable_body | textContentFromHTML | numberOfCharacters}} characters
6
+ {{promethee.inspected.attributes.body.value | textContentFromHTML | numberOfWords}} words<br>
7
+ {{promethee.inspected.attributes.body.value | textContentFromHTML | numberOfCharacters}} characters
8
8
  </script>
@@ -1,6 +1,6 @@
1
1
  <script type="text/ng-template" id="promethee/components/text/edit/move">
2
2
  <%= render 'promethee/edit/move.header', type: 'text' %>
3
- <div ng-bind-html="component.attributes.searchable_body | htmlSafe"></div>
3
+ <div ng-bind-html="component.attributes.body.value | htmlSafe"></div>
4
4
  </div>
5
5
  </div>
6
6
  </script>
@@ -1,14 +1,14 @@
1
1
  <script type="text/ng-template" id="promethee/components/text/localize">
2
- <div ng-show="master.attributes.searchable_body">
2
+ <div ng-show="master.attributes.body.value">
3
3
  <hr>
4
4
  <div class="row">
5
5
  <div class="col-md-6">
6
6
  <b>Text</b>
7
- <div ng-bind-html="master.attributes.searchable_body | htmlSafe"></div>
7
+ <div ng-bind-html="master.attributes.body.value | htmlSafe"></div>
8
8
  </div>
9
9
  <div class="col-md-6">
10
10
  <b>Text</b>
11
- <summernote config="summernoteConfig" ng-model="component.attributes.searchable_body"></summernote>
11
+ <summernote config="summernoteConfig" ng-model="component.attributes.body.value"></summernote>
12
12
  </div>
13
13
  </div>
14
14
  </div>
@@ -1,6 +1,6 @@
1
1
  <%
2
- searchable_body = component[:attributes][:searchable_body].to_s
2
+ body = component[:attributes].dig(:body, :value)&.to_s&.html_safe
3
3
  %>
4
4
  <div class="<%= promethee_class_for component %>">
5
- <%= searchable_body.html_safe %>
5
+ <%= body %>
6
6
  </div>
@@ -8,8 +8,18 @@
8
8
  data: {
9
9
  type: 'video',
10
10
  attributes: {
11
- url: 'https://vimeo.com/115082758',
12
- autoplay: false
11
+ url: {
12
+ searchable: false,
13
+ translatable: true,
14
+ type: 'string',
15
+ value: 'https://vimeo.com/115082758'
16
+ },
17
+ autoplay: {
18
+ searchable: false,
19
+ translatable: false,
20
+ type: 'boolean',
21
+ value: false
22
+ }
13
23
  }
14
24
  }
15
25
  })
@@ -1,11 +1,11 @@
1
1
  <script type="text/ng-template" id="promethee/components/video/edit/inspect">
2
2
  <div class="form-group">
3
3
  <label class="label-control">Url</label>
4
- <input ng-model="promethee.inspected.attributes.url" class="form-control" type="text" />
4
+ <input ng-model="promethee.inspected.attributes.url.value" class="form-control" type="text" />
5
5
  </div>
6
6
 
7
7
  <div class="form-group">
8
- <input ng-model="promethee.inspected.attributes.autoplay" type="checkbox" />
8
+ <input ng-model="promethee.inspected.attributes.autoplay.value" type="checkbox" />
9
9
  <label class="label-control"> Autoplay</label>
10
10
  </div>
11
11
  </script>
@@ -2,11 +2,11 @@
2
2
  <%= render 'promethee/edit/move.header', type: 'video' %>
3
3
  <div ng-controller="VideoController">
4
4
  <div class="embed-responsive embed-responsive-16by9">
5
- <iframe ng-if="embed"
6
- frameborder="0"
7
- webkitallowfullscreen=""
8
- mozallowfullscreen=""
9
- allowfullscreen="allowfullscreen"
5
+ <iframe ng-if="embed"
6
+ frameborder="0"
7
+ webkitallowfullscreen=""
8
+ mozallowfullscreen=""
9
+ allowfullscreen="allowfullscreen"
10
10
  ng-src="{{embed | urlSafe}}"></iframe>
11
11
  <div class="video-neutralizing-overlay"></div>
12
12
  </div>
@@ -20,7 +20,7 @@
20
20
  Object.defineProperty($scope, 'embed', {
21
21
  get: function() {
22
22
  var embed = null;
23
- var url = this.component.attributes.url + '';
23
+ var url = this.component.attributes.url.value + '';
24
24
 
25
25
  if(url.includes('vimeo')) {
26
26
  var id = url.replace(/^(?:https?:)?\/\/(?:(?:www|player)\.)?vimeo\.com\/(?:video\/)?(\d+).*?$/, '$1');
@@ -1,15 +1,15 @@
1
1
  <script type="text/ng-template" id="promethee/components/video/localize">
2
- <div ng-show="master.attributes.url !== ''">
2
+ <div ng-show="master.attributes.url.value !== ''">
3
3
  <hr>
4
4
  <div class="row">
5
5
  <div class="col-md-6">
6
6
  <b>URL</b>
7
- <div ng-bind-html="master.attributes.url | htmlSafe"></div>
7
+ <div ng-bind-html="master.attributes.url.value | htmlSafe"></div>
8
8
  </div>
9
9
  <div class="col-md-6">
10
10
  <div class="form-group">
11
- <label class="label-control">URL</label>
12
- <input class="form-control" ng-model="component.attributes.url" type="text">
11
+ <b>URL</b>
12
+ <input class="form-control" ng-model="component.attributes.url.value" type="text">
13
13
  </div>
14
14
  </div>
15
15
  </div>
@@ -1,14 +1,15 @@
1
1
  <%
2
- url = component[:attributes][:url].to_s
2
+ url = component[:attributes].dig(:url, :value)&.to_s
3
+ autoplay = component[:attributes].dig(:autoplay, :value)
3
4
 
4
5
  if 'vimeo'.in? url
5
6
  video_id = url.gsub(/\A(?:https?:)?\/\/(?:(?:www|player)\.)?vimeo\.com\/(?:video\/)?(\d+).*?\z/, '\1')
6
7
  iframe_src = "https://player.vimeo.com/video/#{video_id}?color=ffffff&title=0&byline=0&portrait=0"
7
- iframe_src += "&loop=1&autoplay=1&autopause=0&muted=1" if component[:attributes][:autoplay]
8
+ iframe_src += "&loop=1&autoplay=1&autopause=0&muted=1" if autoplay
8
9
  elsif 'youtube'.in? url
9
10
  video_id = url.split('watch?v=').last
10
11
  iframe_src = "https://www.youtube.com/embed/#{video_id}"
11
- iframe_src += "?autoplay=1&mute=1&loop=1" if component[:attributes][:autoplay]
12
+ iframe_src += "?autoplay=1&mute=1&loop=1" if autoplay
12
13
  else
13
14
  iframe_src = url
14
15
  end
@@ -7,27 +7,192 @@
7
7
  {
8
8
  "type": "row",
9
9
  "attributes": {
10
- "bgcolor": "rgba(255,255,255,0)",
11
- "backgrounds": []
10
+ bgcolor: {
11
+ searchable: false,
12
+ translatable: false,
13
+ type: 'color',
14
+ value: "rgba(255,255,255,0)",
15
+ },
16
+ backgrounds: {
17
+ searchable: false,
18
+ translatable: false,
19
+ type: 'array',
20
+ value: []
21
+ }
12
22
  },
13
23
  "children": [
14
24
  {
15
25
  "type": "column",
16
- "attributes": {"size": 4, "offset": 0},
26
+ "attributes": {
27
+ size: {
28
+ searchable: false,
29
+ translatable: false,
30
+ type: 'integer',
31
+ value: 4
32
+ },
33
+ offset: {
34
+ searchable: false,
35
+ translatable: false,
36
+ type: 'integer',
37
+ value: 0
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: false
49
+ },
50
+ size: {
51
+ searchable: false,
52
+ translatable: false,
53
+ type: 'integer',
54
+ value: 12
55
+ },
56
+ offset: {
57
+ searchable: false,
58
+ translatable: false,
59
+ type: 'integer',
60
+ value: 0
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: false
74
+ },
75
+ size: {
76
+ searchable: false,
77
+ translatable: false,
78
+ type: 'integer',
79
+ value: 12
80
+ },
81
+ offset: {
82
+ searchable: false,
83
+ translatable: false,
84
+ type: 'integer',
85
+ value: 0
86
+ }
87
+ }
88
+ }
89
+ },
17
90
  "children": [
18
91
  {
19
92
  "type": "image",
20
- "attributes": {"id": undefined, "name": ''}
93
+ "attributes": {
94
+ image: {
95
+ searchable: false,
96
+ translatable: false,
97
+ type: 'blob',
98
+ value: {
99
+ id: undefined,
100
+ name: ''
101
+ }
102
+ },
103
+ alt: {
104
+ searchable: true,
105
+ translatable: true,
106
+ type: 'string',
107
+ value: ''
108
+ },
109
+ caption: {
110
+ searchable: true,
111
+ translatable: true,
112
+ type: 'string',
113
+ value: ''
114
+ }
115
+ }
21
116
  }
22
117
  ]
23
118
  },
24
119
  {
25
120
  "type": "column",
26
- "attributes": {"size": 8, "offset": 0},
121
+ "attributes": {
122
+ size: {
123
+ searchable: false,
124
+ translatable: false,
125
+ type: 'integer',
126
+ value: 8
127
+ },
128
+ offset: {
129
+ searchable: false,
130
+ translatable: false,
131
+ type: 'integer',
132
+ value: 0
133
+ },
134
+ mobile: {
135
+ searchable: false,
136
+ translatable: false,
137
+ type: 'hash',
138
+ value: {
139
+ enabled: {
140
+ searchable: false,
141
+ translatable: false,
142
+ type: 'boolean',
143
+ value: false
144
+ },
145
+ size: {
146
+ searchable: false,
147
+ translatable: false,
148
+ type: 'integer',
149
+ value: 12
150
+ },
151
+ offset: {
152
+ searchable: false,
153
+ translatable: false,
154
+ type: 'integer',
155
+ value: 0
156
+ }
157
+ }
158
+ },
159
+ tablet: {
160
+ searchable: false,
161
+ translatable: false,
162
+ type: 'hash',
163
+ value: {
164
+ enabled: {
165
+ searchable: false,
166
+ translatable: false,
167
+ type: 'boolean',
168
+ value: false
169
+ },
170
+ size: {
171
+ searchable: false,
172
+ translatable: false,
173
+ type: 'integer',
174
+ value: 12
175
+ },
176
+ offset: {
177
+ searchable: false,
178
+ translatable: false,
179
+ type: 'integer',
180
+ value: 0
181
+ }
182
+ }
183
+ }
184
+ },
27
185
  "children": [
28
186
  {
29
187
  "type": "text",
30
- "attributes": {"searchable_body": "<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. A dicta, est quos distinctio culpa! Quasi cupiditate, totam nulla reprehenderit animi iusto qui cumque culpa repellat eum sit? Debitis, laboriosam reiciendis!</p>"}
188
+ "attributes": {
189
+ body: {
190
+ searchable: true,
191
+ translatable: true,
192
+ type: 'text',
193
+ value: '<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. A dicta, est quos distinctio culpa! Quasi cupiditate, totam nulla reprehenderit animi iusto qui cumque culpa repellat eum sit? Debitis, laboriosam reiciendis!</p>'
194
+ }
195
+ }
31
196
  }
32
197
  ]
33
198
  }
@@ -25,16 +25,27 @@ class Promethee::Data::Localization < Promethee::Data
25
25
  @master_data.flat.each do |master_component|
26
26
  localized_component = find_localized_component master_component[:id]
27
27
  # We take the localized component if it exists, the master component otherwise
28
- component = localized_component || master_component.except(:attributes)
28
+ component = localized_component || get_component_without_attributes_values(master_component)
29
29
  component[:attributes] ||= {}
30
30
  # We add it to the list of localized components
31
31
  @data[:components] << component
32
32
  end
33
33
  end
34
34
 
35
+ def get_component_without_attributes_values(component)
36
+ clean_component = component.deep_dup
37
+ clean_component[:attributes] = clean_component[:attributes].keep_if { |key, object_value|
38
+ object_value[:translatable]
39
+ }.map { |key, object_value|
40
+ [key, object_value.merge({ value: '' })]
41
+ }.to_h
42
+
43
+ clean_component
44
+ end
45
+
35
46
  def find_localized_component(id)
36
47
  return unless @data_before_merge
37
48
  return unless @data_before_merge.include? :components
38
49
  @data_before_merge[:components].find { |component| component[:id] == id }
39
50
  end
40
- end
51
+ end