promethee 0.1.3 → 0.1.5

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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +53 -50
  3. data/app/assets/javascripts/promethee-editor.js +8 -0
  4. data/app/assets/javascripts/promethee.js +0 -59
  5. data/app/assets/stylesheets/promethee-editor.sass +23 -78
  6. data/app/assets/stylesheets/promethee-editor/_component.sass +10 -0
  7. data/app/assets/stylesheets/promethee-editor/_mover.sass +67 -0
  8. data/app/assets/stylesheets/promethee-editor/_preview.sass +25 -0
  9. data/app/assets/stylesheets/promethee.sass +1 -2
  10. data/app/controllers/promethee_controller.rb +8 -0
  11. data/app/views/promethee/_edit.html.erb +52 -123
  12. data/app/views/promethee/_show.html.erb +1 -1
  13. data/app/views/promethee/components/_children.html.erb +4 -0
  14. data/app/views/promethee/components/_children_edit.html.erb +5 -0
  15. data/app/views/promethee/components/_column.html.erb +1 -1
  16. data/app/views/promethee/components/_column_edit.html.erb +35 -33
  17. data/app/views/promethee/components/_image_edit.html.erb +23 -28
  18. data/app/views/promethee/components/_page.html.erb +1 -0
  19. data/app/views/promethee/components/_page_edit.html.erb +10 -0
  20. data/app/views/promethee/components/_row.html.erb +1 -4
  21. data/app/views/promethee/components/_row_edit.html.erb +19 -22
  22. data/app/views/promethee/components/_text_edit.html.erb +16 -20
  23. data/app/views/promethee/components/_video_edit.html.erb +23 -22
  24. data/app/views/promethee/partials/_adder.html.erb +64 -0
  25. data/app/views/promethee/partials/_include_components.html.erb +9 -0
  26. data/app/views/promethee/partials/_mover.html.erb +98 -0
  27. data/app/views/promethee/partials/_navbar.html.erb +26 -0
  28. data/app/views/promethee/partials/_page.html.erb +6 -0
  29. data/app/views/promethee/partials/_preview.html.erb +12 -0
  30. data/app/views/promethee/partials/_toolbar_buttons.html.erb +2 -2
  31. data/app/views/promethee/preview.html.erb +1 -0
  32. data/config/routes.rb +3 -0
  33. data/lib/promethee.rb +2 -21
  34. data/lib/promethee/core_ext/tags.rb +2 -5
  35. data/lib/promethee/rails/version.rb +1 -1
  36. metadata +34 -27
  37. data/app/assets/javascripts/promethee/controller.js +0 -22
  38. data/app/assets/stylesheets/promethee-editor/_mixins.sass +0 -19
  39. data/app/assets/stylesheets/promethee-editor/_variables.sass +0 -4
  40. data/app/views/promethee/components/_index.html.erb +0 -3
  41. data/app/views/promethee/components/_index_edit.html.erb +0 -7
  42. data/app/views/promethee/components/_show.html.erb +0 -4
  43. data/app/views/promethee/components/_show_edit.html.erb +0 -3
  44. data/lib/promethee/component.rb +0 -28
  45. data/lib/promethee/component/attribute.rb +0 -42
  46. data/lib/promethee/component/attribute/boolean.rb +0 -4
  47. data/lib/promethee/component/attribute/float.rb +0 -3
  48. data/lib/promethee/component/attribute/integer.rb +0 -3
  49. data/lib/promethee/component/attribute/string.rb +0 -3
  50. data/lib/promethee/component/attributes.rb +0 -50
  51. data/lib/promethee/component/attributes/definer.rb +0 -13
  52. data/lib/promethee/component/base.rb +0 -68
  53. data/lib/promethee/component/collection.rb +0 -17
  54. data/lib/promethee/component/column.rb +0 -8
  55. data/lib/promethee/component/image.rb +0 -6
  56. data/lib/promethee/component/row.rb +0 -3
  57. data/lib/promethee/component/text.rb +0 -5
  58. data/lib/promethee/component/video.rb +0 -5
  59. data/lib/promethee/grid.rb +0 -52
  60. data/vendor/assets/javascripts/angular-drag-and-drop-lists.js +0 -49
@@ -1,4 +1,3 @@
1
- // @import 'promethee/colors'
2
1
  @import 'bootstrap'
3
2
 
4
- .promethee
3
+ .promethee
@@ -0,0 +1,8 @@
1
+ class PrometheeController < ApplicationController
2
+ # This is acceptable because the iframe is sandboxed
3
+ skip_before_action :verify_authenticity_token
4
+
5
+ def preview
6
+ @data = params[:data]
7
+ end
8
+ end
@@ -1,16 +1,11 @@
1
1
  <%
2
- promethee_id = "promethee-#{SecureRandom.hex 10}"
3
- promethee_data = promethee.data
4
- promethee_data = promethee_data.to_json unless promethee_data.is_a? String
2
+ data = data.to_json unless data.is_a? String
5
3
  %>
6
4
 
7
5
  <script>
8
6
  var promethee = angular
9
- .module('<%= promethee_id %>', ['ui.tinymce', 'dndLists'])
10
- .constant('data', <%= promethee_data.html_safe %>)
11
- .value('state', {
12
- editing: false
13
- })
7
+ .module('Promethee', ['ui.tinymce', 'ngAnimate'])
8
+ .value('data', <%= data.html_safe %>)
14
9
  .value('definitions', [])
15
10
  .filter('htmlSafe', ['$sce', function($sce) {
16
11
  return function(val) {
@@ -28,111 +23,43 @@ promethee_data = promethee_data.to_json unless promethee_data.is_a? String
28
23
  return val[0].toUpperCase() + val.substring(1).toLowerCase();
29
24
  };
30
25
  });
31
- </script>
32
-
33
- <div id="<%= promethee_id %>"
34
- class="promethee-editor"
35
- ng-app="<%= promethee_id %>"
36
- ng-controller="PrometheeController as prometheeController"
37
- ng-class="{
38
- 'fullscreen': fullscreen,
39
- 'promethee-editor--preview': preview,
40
- 'promethee-editor--preview--mobile': preview && previewMode == 'mobile',
41
- 'promethee-editor--preview--tablet': preview && previewMode == 'tablet',
42
- 'promethee-editor--preview--desktop': preview && previewMode == 'desktop'
43
- }">
44
-
45
- <% # TODO custom views %>
46
- <% Dir['app/views/promethee/components/*'].each do |file| %>
47
- <% end %>
48
- <% # TODO iterate over files in gem %>
49
- <% ['index', 'show', 'row', 'column', 'text', 'image', 'video'].each do |type| %>
50
- <%= render partial: "promethee/components/#{type}_edit", locals: { promethee_id: promethee_id } %>
51
- <% end %>
52
-
53
- <input type="hidden" name="page[data]" id="page_data" value="{{data}}" />
54
26
 
55
- <nav class="navbar navbar-default">
56
- <div class="container-fluid">
57
- <div class="navbar-header">
58
- <%= image_tag 'icon-promethee.png', class: 'navbar-brand' %>
59
- </div>
60
- <div id="navbar">
61
- <ul class="nav navbar-nav navbar-right">
62
- <li ng-click="enablePreview()" ng-hide="preview"><a><%= fa_icon :eye %></a></li>
63
- <li ng-click="previewMode = 'mobile'" ng-class="{ active: previewMode == 'mobile' }" ng-show="preview">
64
- <a><%= fa_icon :mobile %></a>
65
- </li>
66
- <li ng-click="previewMode = 'tablet'" ng-class="{ active: previewMode == 'tablet' }" ng-show="preview"><a>
67
- <%= fa_icon :tablet %></a>
68
- </li>
69
- <li ng-click="previewMode = 'desktop'" ng-class="{ active: previewMode == 'desktop' }" ng-show="preview"><a>
70
- <%= fa_icon :desktop %></a>
71
- </li>
72
- <li ng-click="disablePreview()" ng-show="preview"><a><%= fa_icon 'eye-slash' %></a>
73
- </li>
74
- <li ng-click="enableFullscreen()" ng-hide="fullscreen"><a><%= fa_icon :expand %></a></li>
75
- <li ng-click="disableFullscreen()" ng-show="fullscreen"><a><%= fa_icon :compress %></a></li>
76
- </ul>
77
- </div>
78
- </div>
79
- </nav>
80
- <div class="promethee-editor__page" ng-class="{ 'container-fluid': fullscreen }">
81
- <ng-include src="'promethee/components/index'"></ng-include>
82
- </div>
83
-
84
- <span type="button" class="btn btn-default btn-block" ng-click="addComponentTo(data)" style="margin-bottom: 6px">Add component</span>
85
-
86
- <div class="promethee-editor__adder" ng-controller="AdderController">
87
- <div class="modal fade in" tabindex="-1" role="dialog" style="display: {{adding ? 'block' : 'none'}}">
88
- <div class="modal-dialog modal-lg" role="document">
89
- <div class="modal-content">
90
- <div class="modal-header">
91
- <button type="button" class="close" ng-click="close()"><span aria-hidden="true">&times;</span></button>
92
- <h4 class="modal-title">Select component</h4>
93
- </div>
94
- <div class="modal-body">
95
- <div class="row">
96
- <div ng-repeat="definition in definitions"
97
- ng-click="pushComponent(definition)"
98
- class="col-md-3">
99
- <div class="thumbnail">
100
- <img ng-src="{{definition.thumb}}" class="img-responsive">
101
- <h4>{{definition.name}}</h4>
102
- </div>
103
- </div>
104
- </div>
105
- </div>
106
- </div>
107
- </div>
108
- </div>
109
- </div>
110
-
111
- <!-- Work in progress -->
112
- <!-- <iframe id="iframe"></iframe> !-->
113
- </div>
114
-
115
- <script>
116
- promethee.controller('PrometheeController', ['data', '$scope', 'definitions', function(data, $scope, definitions) {
27
+ promethee.controller('PrometheeController', ['data', '$scope', 'definitions', '$http', function(data, $scope, definitions, $http) {
28
+
29
+ // Data (TODO use Adder and probably page definition to init)
117
30
  if (data === null || data === '') {
118
- data = [];
31
+ data = {
32
+ type: 'page',
33
+ children: []
34
+ };
119
35
  }
120
36
  $scope.data = data;
37
+ // $scope.component = {
38
+ // children: data
39
+ // };
40
+
41
+ // Preview modes
121
42
  $scope.fullscreen = false;
43
+ $scope.move = false;
122
44
  $scope.preview = false;
123
45
  $scope.previewMode = 'desktop';
124
- $scope.component = {
125
- children: data
126
- };
127
-
128
- $scope.allowedTypes = definitions.map(function(definition) {
129
- return definition.data.type;
130
- });
131
46
 
132
47
  $scope.enablePreview = function() {
133
48
  this.preview = true;
134
- // Work in progress
135
- // document.getElementById('iframe').contentWindow.document.documentElement.innerHTML = document.documentElement.innerHTML;
49
+ this.move = false;
50
+
51
+ var form = document.createElement('form');
52
+ document.body.appendChild(form);
53
+ form.method = 'POST';
54
+ form.action = 'promethee/preview';
55
+ form.target = 'preview';
56
+ var input = document.createElement('input');
57
+ input.type = 'text';
58
+ input.value = JSON.stringify(data);
59
+ input.name = 'data';
60
+ form.appendChild(input);
61
+ form.submit();
62
+ document.body.removeChild(form);
136
63
  }
137
64
 
138
65
  $scope.disablePreview = function() {
@@ -147,26 +74,28 @@ promethee_data = promethee_data.to_json unless promethee_data.is_a? String
147
74
  this.fullscreen = false;
148
75
  }
149
76
 
150
- }]);
151
-
152
- promethee.controller('AdderController', ['$scope', '$rootScope', 'definitions', function($scope, $rootScope, definitions) {
153
-
154
- $scope.adding = null;
155
- $scope.definitions = definitions;
156
-
157
- $scope.close = function() {
158
- $scope.adding = null;
159
- };
160
-
161
- $scope.pushComponent = function(definition) {
162
- var definition = angular.copy(definition.data);
163
- $scope.adding.push(definition);
164
- $scope.close();
165
- };
166
-
167
- $rootScope.addComponentTo = function(components) {
168
- $scope.adding = components;
169
- };
77
+ $scope.remove = function(component, components) {
78
+ var index = components.indexOf(component);
79
+ components.splice(index, 1);
80
+ }
170
81
 
171
82
  }]);
83
+
172
84
  </script>
85
+
86
+ <div id="promethee"
87
+ class="promethee-editor"
88
+ ng-app="Promethee"
89
+ ng-controller="PrometheeController as prometheeController"
90
+ ng-class="{
91
+ 'promethee-editor--fullscreen': fullscreen,
92
+ 'promethee-editor--move': move,
93
+ 'promethee-editor--preview': preview
94
+ }">
95
+ <input type="hidden" name="page[data]" id="page_data" value="{{data}}" />
96
+ <%= render 'promethee/partials/include_components' %>
97
+ <%= render 'promethee/partials/navbar' %>
98
+ <%= render 'promethee/partials/preview' %>
99
+ <%= render 'promethee/partials/mover' %>
100
+ <%= render 'promethee/partials/page' %>
101
+ </div>
@@ -2,5 +2,5 @@
2
2
  data = JSON.parse data, symbolize_names: true if data.is_a? String
3
3
  %>
4
4
  <div class="promethee">
5
- <%= render partial: 'promethee/components/index', locals: { components: data } %>
5
+ <%= render 'promethee/components/page', page: data %>
6
6
  </div>
@@ -0,0 +1,4 @@
1
+ <% children.each do |component| %>
2
+ <% type = component[:type] %>
3
+ <%= render "promethee/components/#{type}", component: component %>
4
+ <% end %>
@@ -0,0 +1,5 @@
1
+ <script type="text/ng-template" id="promethee/components/children">
2
+ <div ng-repeat="component in component.children">
3
+ <ng-include src="'promethee/components/' + component.type"></ng-include>
4
+ </div>
5
+ </script>
@@ -4,5 +4,5 @@ offset = component[:attributes][:offset]
4
4
  children = component[:children]
5
5
  %>
6
6
  <div class="col col-md-<%= size %><%= " col-md-offset-#{offset}" if offset > 0 %> <%= promethee_class_for component %>">
7
- <%= render partial: 'promethee/components/index', locals: { components: children } %>
7
+ <%= render 'promethee/components/children', children: children %>
8
8
  </div>
@@ -1,40 +1,42 @@
1
1
  <script type="text/ng-template" id="promethee/components/column">
2
- <div ng-controller="ColumnController">
3
- <div class="col col-md-{{component.attributes.size}} col-md-offset-{{component.attributes.offset}}">
4
- <div dnd-draggable="component" dnd-moved="remove()" dnd-type="component.type" class="promethee-editor__component promethee-editor__component--column">
5
- <div class="promethee-editor__toolbar">
6
- Column
7
- <%= render 'promethee/partials/toolbar_buttons' %>
8
- </div>
9
- <div ng-show="editing" class="promethee-editor__wrapper">
10
- <div class="form-group">
11
- <label class="label-control">Size</label>
12
- <input ng-model="component.attributes.size" class="form-control" type="number"/>
13
- </div>
14
- <div class="form-group">
15
- <label class="label-control">Offset</label>
16
- <input ng-model="component.attributes.offset" class="form-control" type="number"/>
17
- </div>
18
- </div>
19
-
20
- <ng-include src="'promethee/components/index'"></ng-include>
21
-
22
- <span type="button" class="btn btn-default btn-block" ng-click="addComponentTo(component.children)" style="margin: 0 6px 6px 6px;width: auto">Add component</span>
2
+ <div class="col
3
+ col-md-{{component.attributes.size}}
4
+ col-md-offset-{{component.attributes.offset}}
5
+ promethee-editor__component
6
+ promethee-editor__component--column">
7
+ <div class="promethee-editor__toolbar">
8
+ Column
9
+ <%= render 'promethee/partials/toolbar_buttons' %>
10
+ </div>
11
+ <div ng-show="editing" class="promethee-editor__wrapper">
12
+ <div class="form-group">
13
+ <label class="label-control">Size</label>
14
+ <input ng-model="component.attributes.size" class="form-control" type="number"/>
15
+ </div>
16
+ <div class="form-group">
17
+ <label class="label-control">Offset</label>
18
+ <input ng-model="component.attributes.offset" class="form-control" type="number"/>
23
19
  </div>
24
20
  </div>
25
- </div>
26
- </script>
27
-
28
- <script>
29
- promethee.controller('ColumnController', ['$scope', 'definitions', function($scope, definitions) {
30
21
 
31
- $scope.allowedTypes = definitions.map(function(definition) {
32
- return definition.data.type;
33
- });
22
+ <ng-include src="'promethee/components/children'"></ng-include>
34
23
 
35
- $scope.remove = function() {
36
- this.components.splice(this.components.indexOf(this.component), 1);
37
- };
24
+ <span type="button"
25
+ class="btn btn-default btn-block"
26
+ ng-click="addComponentTo(component.children)">Add component</span>
27
+ </div>
28
+ </script>
38
29
 
39
- }]);
30
+ <script type="text/ng-template" id="promethee/components/column/move">
31
+ <div class="col col-md-{{component.attributes.size}} col-md-offset-{{component.attributes.offset}}">
32
+ <h1>Column</h1>
33
+ <ng-include src="'promethee/partials/mover'"></ng-include>
34
+ <div class=" promethee-editor__mover--droppable
35
+ promethee-editor__mover--droppable--row
36
+ promethee-editor__mover--droppable--row--inside-column"
37
+ droppable
38
+ data-index="{{$index+1}}"
39
+ data-type="{{type}}"
40
+ >
41
+ </div>
40
42
  </script>
@@ -1,35 +1,34 @@
1
1
  <script type="text/ng-template" id="promethee/components/image">
2
- <div ng-controller="ImageController" style="position: relative">
3
- <div dnd-draggable="component"
4
- dnd-moved="remove()"
5
- dnd-type="component.type"
6
- class="promethee-editor__component promethee-editor__component--image promethee-editor__component--final">
7
- <div class="promethee-editor__toolbar">
8
- Image
9
- <%= render 'promethee/partials/toolbar_buttons' %>
10
- </div>
11
- <div ng-show="editing" class="promethee-editor__wrapper">
12
- <div class="form-group">
13
- <label class="label-control">Url</label>
14
- <input ng-model="component.attributes.src" class="form-control" type="text"/>
15
- </div>
16
- <div class="form-group">
17
- <label class="label-control">Alt</label>
18
- <input ng-model="component.attributes.alt" class="form-control" type="text"/>
19
- </div>
20
- </div>
21
- <div ng-show="component.attributes.src">
22
- <img ng-click="edit()" ng-src="{{component.attributes.src}}" class="img-responsive">
2
+ <div ng-controller="ImageController" class="promethee-editor__component promethee-editor__component--image">
3
+ <div class="promethee-editor__toolbar">
4
+ Image
5
+ <%= render 'promethee/partials/toolbar_buttons' %>
6
+ </div>
7
+ <div ng-show="editing" class="promethee-editor__wrapper">
8
+ <div class="form-group">
9
+ <label class="label-control">Url</label>
10
+ <input ng-model="component.attributes.src" class="form-control" type="text"/>
23
11
  </div>
24
- <div ng-hide="component.attributes.src">
25
- <p ng-hide="editing" ng-click="edit()" class="text-center">Click to set the image</p>
12
+ <div class="form-group">
13
+ <label class="label-control">Alt</label>
14
+ <input ng-model="component.attributes.alt" class="form-control" type="text"/>
26
15
  </div>
27
16
  </div>
17
+ <div ng-show="component.attributes.src">
18
+ <img ng-click="edit()" ng-src="{{component.attributes.src}}" class="img-responsive">
19
+ </div>
20
+ <div ng-hide="component.attributes.src">
21
+ <p ng-hide="editing" ng-click="edit()" class="text-center">Click to set the image</p>
22
+ </div>
28
23
  </div>
29
24
  </script>
30
25
 
26
+ <script type="text/ng-template" id="promethee/components/image/move">
27
+ <img ng-src="{{component.attributes.src}}" class="img-responsive">
28
+ </script>
29
+
31
30
  <script>
32
- angular.injector(['ng', '<%= promethee_id %>']).get('definitions').push({
31
+ angular.injector(['ng', 'Promethee']).get('definitions').push({
33
32
  name: 'Image',
34
33
  thumb: 'http://via.placeholder.com/300x200',
35
34
  data: {
@@ -52,9 +51,5 @@
52
51
  this.editing = false;
53
52
  };
54
53
 
55
- $scope.remove = function() {
56
- this.components.splice(this.components.indexOf(this.component), 1);
57
- };
58
-
59
54
  }]);
60
55
  </script>
@@ -0,0 +1 @@
1
+ <%= render 'promethee/components/children', children: page[:children] %>
@@ -0,0 +1,10 @@
1
+ <script type="text/ng-template" id="promethee/components/page">
2
+ <div ng-init="component = data"
3
+ class="promethee-editor__component promethee-editor__component--page">
4
+ <ng-include src="'promethee/components/children'"></ng-include>
5
+ </div>
6
+ </script>
7
+
8
+ <script type="text/ng-template" id="promethee/components/page/move">
9
+ <ng-include src="'promethee/partials/mover'"></ng-include>
10
+ </script>
@@ -1,6 +1,3 @@
1
- <%
2
- children = component[:children]
3
- %>
4
1
  <div class="row <%= promethee_class_for component %>">
5
- <%= render partial: 'promethee/components/index', locals: { components: children } %>
2
+ <%= render 'promethee/components/children', children: component[:children] %>
6
3
  </div>
@@ -1,26 +1,27 @@
1
1
  <script type="text/ng-template" id="promethee/components/row">
2
- <div ng-controller="RowController">
3
- <div class="row">
4
- <div dnd-draggable="component" dnd-moved="remove()" dnd-type="component.type" class="promethee-editor__component promethee-editor__component--row">
5
- <div class="promethee-editor__toolbar">
6
- Row
7
- <%= render 'promethee/partials/toolbar_buttons' %>
8
- </div>
9
- <div ng-show="editing" class="promethee-editor__wrapper">
10
- Nothing to edit (yet...)
11
- </div>
12
-
13
- <ng-include src="'promethee/components/index'"></ng-include>
14
-
15
- <div class="clearfix"></div>
16
- <span class="btn btn-default btn-block" ng-click="addColumn()" style="margin: 0 6px 6px 6px;width: auto">Add column</span>
17
- </div>
2
+ <div ng-controller="RowController"
3
+ class="row promethee-editor__component promethee-editor__component--row">
4
+ <div class="promethee-editor__toolbar">
5
+ Row
6
+ <%= render 'promethee/partials/toolbar_buttons' %>
18
7
  </div>
8
+ <div ng-show="editing" class="promethee-editor__wrapper">
9
+ </div>
10
+ <ng-include src="'promethee/components/children'"></ng-include>
11
+ <div class="clearfix"></div>
12
+ <span class="btn btn-default btn-block" ng-click="addColumn()" style="margin: 0 6px 6px 6px;width: auto">Add column</span>
13
+ </div>
14
+ </script>
15
+
16
+ <script type="text/ng-template" id="promethee/components/row/move">
17
+ <h1>Row</h1>
18
+ <div class="row">
19
+ <ng-include src="'promethee/partials/mover'"></ng-include>
19
20
  </div>
20
21
  </script>
21
22
 
22
23
  <script>
23
- angular.injector(['ng', '<%= promethee_id %>']).get('definitions').push({
24
+ angular.injector(['ng', 'Promethee']).get('definitions').push({
24
25
  name: 'Row',
25
26
  thumb: 'http://via.placeholder.com/300x200',
26
27
  data: {
@@ -38,16 +39,12 @@
38
39
  this.component.children.push({
39
40
  type: 'column',
40
41
  attributes: {
41
- size: 3,
42
+ size: 4,
42
43
  offset: 0
43
44
  },
44
45
  children: []
45
46
  })
46
47
  }
47
48
 
48
- $scope.remove = function() {
49
- this.components.splice(this.components.indexOf(this.component), 1);
50
- };
51
-
52
49
  }]);
53
50
  </script>