promethee 0.1.3 → 0.1.5

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