billy_cms 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 15bc4ec8c016530fced76042b9ae95d1650e5fdc
4
- data.tar.gz: 434f25354c705ecf7d4d5cafea20444af5adacfc
3
+ metadata.gz: 619314e33692f6ce71b51ade84cdc51d0903c5d5
4
+ data.tar.gz: 2fe41171a67e95a210ba083fc5e6116087cd633f
5
5
  SHA512:
6
- metadata.gz: 5698688ce205483968355021a0fc273e56407e90af00832e0d45b6551d515d5b35a197f7a64bdae74b8e4274bc68a60d115e9aac69ff571840d4adcb90a64b80
7
- data.tar.gz: e5970c0b54b6e89d577a5d94da14e3ca4fe61f5979dede5fbf26ad39e87175b78ec2b8858dcc6935197ac5c80a3b22715ad9ef2036f0480b4dc3769561da8019
6
+ metadata.gz: 0b229af480394c3be2e069c97b10de2e9b3f19c837bbb01a18d503b78d73d08b6739b27f7b4b87b5548b8e02725fd2ef36eab1aaaa9527bb44fcf8f7610abdc9
7
+ data.tar.gz: 732487a213014d6b4bed97e20d4184a9d7f8fc28a7ece74d4187b3f0af4db4bcd45281300bca9ec63a25bc957ffb6c8bf4049747748e6e7e9145c6be91a203e3
@@ -1,217 +1,36 @@
1
- var app = angular.module('BillyCmsBackend', [
2
- 'ngJsTree',
3
- 'ui.tinymce',
4
- 'ngMaterial',
5
- 'ngFileUpload',
6
- 'ui.router'
7
- ]);
8
-
9
- app.run(function() {
10
-
11
- });
12
-
13
- app.config(function($stateProvider, $urlRouterProvider) {
14
- $urlRouterProvider.otherwise('/tree');
15
-
16
- $stateProvider
17
- .state('tree', {
18
- url: '/tree',
19
- templateUrl: 'tree/tree.html'
20
- })
21
- .state('page_types', {
22
- url: '/system/types',
23
- templateUrl: 'page_types/page_types.html'
24
- })
25
- .state('additional_attributes', {
26
- url: '/system/attributes',
27
- templateUrl: 'attributes/attributes.html',
28
- controller: 'AttributesCtrl as attrs'
29
- })
30
- });
31
-
32
1
  $(function() {
33
2
  $.jstree.defaults.types['Binary'] = { icon: 'binary-type' };
34
3
  });
35
4
 
36
- app.controller('ApplicationCtrl', ['$scope', '$http', 'BillyObject', 'PageType', function($scope, $http, BillyObject, PageType) {
37
- var ctrl = this;
38
- this.rawPagesData = [];
39
- this.treeConfig = {
40
- core : {
41
- multiple : false,
42
- animation: true,
43
- error : function(error) {
44
- console.error('treeCtrl: error from js tree - ' + angular.toJson(error));
45
- },
46
- check_callback : true,
47
- worker : true
48
- },
49
- plugins: ['sort', 'state', 'types'],
50
- sort: function(node1, node2) {
51
- var sortkey1 = ctrl.findPageById(node1).order_key || 0;
52
- var sortkey2 = ctrl.findPageById(node2).order_key || 0;
53
- return (sortkey2 < sortkey1) ? 1 : -1;
54
- },
55
- version : 1
56
- };
57
- $http.get('/billy_cms/api/page_types').then(function(result) {
58
- ctrl.allPageTypes = result.data.map(function(pageTypeData) {
59
- return new PageType(pageTypeData);
60
- });
61
- });
62
- $http.get('/billy_cms/api/pages').then(function(result) {
63
- ctrl.rawPagesData = result.data.map(function(page) { return new BillyObject(page); });
64
- ctrl.recreateTreeFromRawData();
5
+ angular.module('BillyCmsBackend',
6
+ [
7
+ 'ngJsTree',
8
+ 'ui.tinymce',
9
+ 'ngMaterial',
10
+ 'ngFileUpload',
11
+ 'ui.router'
12
+ ])
13
+
14
+ .run(function() {
15
+
16
+ })
17
+
18
+ .config(function($stateProvider, $urlRouterProvider) {
19
+ $urlRouterProvider.otherwise('/tree');
20
+
21
+ $stateProvider
22
+ .state('tree', {
23
+ url: '/tree',
24
+ templateUrl: 'tree/tree.html'
25
+ })
26
+ .state('page_types', {
27
+ url: '/system/types',
28
+ templateUrl: 'page_types/page_types.html',
29
+ controller: 'PageTypesCtrl as ptctrl'
30
+ })
31
+ .state('additional_attributes', {
32
+ url: '/system/attributes',
33
+ templateUrl: 'attributes/attributes.html',
34
+ controller: 'AttributesCtrl as attrs'
35
+ })
65
36
  });
66
- this.tree = [];
67
-
68
- this.recreateTreeFromRawData = function() {
69
- ctrl.tree = ctrl.rawPagesData.map(function(page) { return page.jsTreeRepresentation(); });
70
- ctrl.tree.push({
71
- id: 'root',
72
- parent: '#',
73
- text: 'Rechtsanwaltskanzlei Arbeitsrecht Sabine Geilen'
74
- });
75
- ctrl.treeConfig.version++;
76
- };
77
-
78
- this.onTreeReady = function() {
79
- $(this).on('changed.jstree', function(node, action) {
80
- var jstree = $(this).jstree();
81
- if (action.action !== 'select_node') {
82
- return;
83
- }
84
- ctrl.selectedNode = ctrl.findPageById(jstree.get_selected()[0]);
85
- $scope.$apply();
86
- });
87
- };
88
-
89
- this.findPageById = function(id) {
90
- return this.rawPagesData.filter(function(page) {
91
- return id.toString() === page.id.toString();
92
- })[0];
93
- };
94
-
95
- this.tinymceOptions = {
96
- content_css: '<%= stylesheet_path 'application' %>',
97
- plugins: 'advlist autolink anchor fullscreen code',
98
- toolbar: 'undo redo bold italic underline fullscreen code',
99
- menubar: '',
100
- height: 350
101
- };
102
-
103
- this.saveNode = function(page) {
104
- $http({
105
- method: 'PATCH',
106
- url: '/billy_cms/api/pages/' + page.id,
107
- data: {
108
- page: page
109
- }
110
- }).then(
111
- function(response) {
112
- if (response.status === 200) {
113
- console.log('page saved');
114
- console.log(response.data.page);
115
- ctrl.recreateTreeFromRawData();
116
- }
117
- },
118
- function(err) {
119
- alert('Ein Fehler ist beim Speichern aufgetreten.');
120
- console.error(err);
121
- }
122
- );
123
- };
124
-
125
- this.createNewPageForNode = function(node) {
126
- var title = prompt('Titel der neuen Seite');
127
- if (!title) {
128
- return;
129
- }
130
- var pageData = {
131
- title: title,
132
- parent_page_id: node && node.id
133
- };
134
- $http.post('/billy_cms/api/pages', {
135
- page: pageData
136
- }).then(function(response) {
137
- if (response.status === 200) {
138
- ctrl.rawPagesData.push(new BillyObject(response.data.page));
139
- ctrl.recreateTreeFromRawData();
140
- }
141
- }, function(response) {
142
- alert('Fehler beim Erstellen der Seite: ', response.statusText);
143
- });
144
- };
145
-
146
- this.createNewFileForNode = function(node) {
147
- var title = prompt('Titel der Datei');
148
- if (!title) {
149
- return;
150
- }
151
- var pageData = {
152
- title: title,
153
- parent_page_id: node && node.id,
154
- page_type: 'Binary'
155
- };
156
- $http.post('/billy_cms/api/pages', {
157
- page: pageData
158
- }).then(function(response) {
159
- if (response.status === 200) {
160
- ctrl.rawPagesData.push(new BillyObject(response.data.page));
161
- ctrl.recreateTreeFromRawData();
162
- }
163
- }, function(response) {
164
- alert('Fehler beim Erstellen der Datei: ', response.statusText);
165
- });
166
- };
167
-
168
- this.deleteNode = function(node) {
169
- if (!node || !node.id) {
170
- alert('Keine gültige Seite ausgewählt!');
171
- return;
172
- }
173
- var message = 'Die Seite "' + node.title + '" wirklich löschen? Das ist unwiederruflich!';
174
- if (window.confirm(message)) {
175
- $http.delete('/billy_cms/api/pages/' + node.id).then(function(response) {
176
- if (response.status === 200) {
177
- var page = ctrl.findPageById(node.id);
178
- if (!page) {
179
- return;
180
- }
181
- var pageIndex = ctrl.rawPagesData.indexOf(page);
182
- if (pageIndex > -1) {
183
- ctrl.rawPagesData.splice(pageIndex, 1);
184
- ctrl.recreateTreeFromRawData();
185
- }
186
- }
187
- }, function(response) {
188
- alert('Fehler beim Löschen der Datei: ', response.status);
189
- });
190
- }
191
- };
192
-
193
- this.setBinaryContent = function($file, node) {
194
- if (!$file) {
195
- node.content = '';
196
- return;
197
- }
198
- var reader = new FileReader();
199
-
200
- reader.onloadend = function() {
201
- var result = reader.result;
202
- node.content = result;
203
- $scope.$apply();
204
- }
205
- reader.readAsDataURL($file);
206
- };
207
-
208
- this.openInPreview = function(node) {
209
- window.open(node.cms_path || ('/' + node.id));
210
- };
211
- }]);
212
-
213
- app.directive('billyHeaderToolbar', function() {
214
- return {
215
- templateUrl: 'header/header.html'
216
- };
217
- });
@@ -0,0 +1,188 @@
1
+ 'use strict';
2
+
3
+ window.angular.module('BillyCmsBackend').controller('ApplicationCtrl', ['$scope', '$http', 'BillyObject', 'PageType', 'AdditionalAttribute', function($scope, $http, BillyObject, PageType, AdditionalAttribute) {
4
+ var ctrl = this;
5
+
6
+ // data
7
+ this.rawPagesData = [];
8
+ this.allPageTypes = [];
9
+ this.allAdditionalAttributes = [];
10
+
11
+ this.treeConfig = {
12
+ core : {
13
+ multiple : false,
14
+ animation: true,
15
+ error : function(error) {
16
+ console.error('treeCtrl: error from js tree - ' + angular.toJson(error));
17
+ },
18
+ check_callback : true,
19
+ worker : true
20
+ },
21
+ plugins: ['sort', 'state', 'types'],
22
+ sort: function(node1, node2) {
23
+ var sortkey1 = ctrl.findPageById(node1).order_key || 0;
24
+ var sortkey2 = ctrl.findPageById(node2).order_key || 0;
25
+ return (sortkey2 < sortkey1) ? 1 : -1;
26
+ },
27
+ version : 1
28
+ };
29
+ $http.get('/billy_cms/api/page_types.json').then(function(result) {
30
+ ctrl.allPageTypes = result.data.map(function(pageTypeData) {
31
+ return new PageType(pageTypeData);
32
+ });
33
+ });
34
+ $http.get('/billy_cms/api/attributes.json').then(function(result) {
35
+ ctrl.allAdditionalAttributes = result.data.map(function(attributeData) {
36
+ return new AdditionalAttribute(attributeData);
37
+ });
38
+ });
39
+ $http.get('/billy_cms/api/pages.json').then(function(result) {
40
+ ctrl.rawPagesData = result.data.map(function(page) { return new BillyObject(page); });
41
+ ctrl.recreateTreeFromRawData();
42
+ });
43
+ this.tree = [];
44
+
45
+ this.recreateTreeFromRawData = function() {
46
+ ctrl.tree = ctrl.rawPagesData.map(function(page) { return page.jsTreeRepresentation(); });
47
+ ctrl.tree.push({
48
+ id: 'root',
49
+ parent: '#',
50
+ text: 'Rechtsanwaltskanzlei Arbeitsrecht Sabine Geilen'
51
+ });
52
+ ctrl.treeConfig.version++;
53
+ };
54
+
55
+ this.onTreeReady = function() {
56
+ $(this).on('changed.jstree', function(node, action) {
57
+ var jstree = $(this).jstree();
58
+ if (action.action !== 'select_node') {
59
+ return;
60
+ }
61
+ ctrl.selectedNode = ctrl.findPageById(jstree.get_selected()[0]);
62
+ $scope.$apply();
63
+ });
64
+ };
65
+
66
+ this.findPageById = function(id) {
67
+ return this.rawPagesData.filter(function(page) {
68
+ return id.toString() === page.id.toString();
69
+ })[0];
70
+ };
71
+
72
+ this.tinymceOptions = {
73
+ content_css: '<%= stylesheet_path 'application' %>',
74
+ plugins: 'advlist autolink anchor fullscreen code',
75
+ toolbar: 'undo redo bold italic underline fullscreen code',
76
+ menubar: '',
77
+ height: 350
78
+ };
79
+
80
+ this.saveNode = function(page) {
81
+ $http({
82
+ method: 'PATCH',
83
+ url: '/billy_cms/api/pages/' + page.id,
84
+ data: {
85
+ page: page
86
+ }
87
+ }).then(
88
+ function(response) {
89
+ if (response.status === 200) {
90
+ console.log('page saved');
91
+ console.log(response.data.page);
92
+ ctrl.recreateTreeFromRawData();
93
+ }
94
+ },
95
+ function(err) {
96
+ alert('Ein Fehler ist beim Speichern aufgetreten.');
97
+ console.error(err);
98
+ }
99
+ );
100
+ };
101
+
102
+ this.createNewPageForNode = function(node) {
103
+ var title = prompt('Titel der neuen Seite');
104
+ if (!title) {
105
+ return;
106
+ }
107
+ var pageData = {
108
+ title: title,
109
+ parent_page_id: node && node.id
110
+ };
111
+ $http.post('/billy_cms/api/pages', {
112
+ page: pageData
113
+ }).then(function(response) {
114
+ if (response.status === 200) {
115
+ ctrl.rawPagesData.push(new BillyObject(response.data.page));
116
+ ctrl.recreateTreeFromRawData();
117
+ }
118
+ }, function(response) {
119
+ alert('Fehler beim Erstellen der Seite: ', response.statusText);
120
+ });
121
+ };
122
+
123
+ this.createNewFileForNode = function(node) {
124
+ var title = prompt('Titel der Datei');
125
+ if (!title) {
126
+ return;
127
+ }
128
+ var pageData = {
129
+ title: title,
130
+ parent_page_id: node && node.id,
131
+ page_type: 'Binary'
132
+ };
133
+ $http.post('/billy_cms/api/pages', {
134
+ page: pageData
135
+ }).then(function(response) {
136
+ if (response.status === 200) {
137
+ ctrl.rawPagesData.push(new BillyObject(response.data.page));
138
+ ctrl.recreateTreeFromRawData();
139
+ }
140
+ }, function(response) {
141
+ alert('Fehler beim Erstellen der Datei: ', response.statusText);
142
+ });
143
+ };
144
+
145
+ this.deleteNode = function(node) {
146
+ if (!node || !node.id) {
147
+ alert('Keine gültige Seite ausgewählt!');
148
+ return;
149
+ }
150
+ var message = 'Die Seite "' + node.title + '" wirklich löschen? Das ist unwiederruflich!';
151
+ if (window.confirm(message)) {
152
+ $http.delete('/billy_cms/api/pages/' + node.id).then(function(response) {
153
+ if (response.status === 200) {
154
+ var page = ctrl.findPageById(node.id);
155
+ if (!page) {
156
+ return;
157
+ }
158
+ var pageIndex = ctrl.rawPagesData.indexOf(page);
159
+ if (pageIndex > -1) {
160
+ ctrl.rawPagesData.splice(pageIndex, 1);
161
+ ctrl.recreateTreeFromRawData();
162
+ }
163
+ }
164
+ }, function(response) {
165
+ alert('Fehler beim Löschen der Datei: ', response.status);
166
+ });
167
+ }
168
+ };
169
+
170
+ this.setBinaryContent = function($file, node) {
171
+ if (!$file) {
172
+ node.content = '';
173
+ return;
174
+ }
175
+ var reader = new FileReader();
176
+
177
+ reader.onloadend = function() {
178
+ var result = reader.result;
179
+ node.content = result;
180
+ $scope.$apply();
181
+ };
182
+ reader.readAsDataURL($file);
183
+ };
184
+
185
+ this.openInPreview = function(node) {
186
+ window.open(node.cms_path || ('/' + node.id));
187
+ };
188
+ }]);
@@ -0,0 +1,19 @@
1
+ window.angular.module('BillyCmsBackend').controller('PageTypesCtrl', ['$scope', function($scope) {
2
+ var self = this;
3
+ $scope.$watch(
4
+ function() { return $scope.app.allPageTypes; },
5
+ function(newPageTypes, oldPageTypes) {
6
+ if ((oldPageTypes === undefined || !oldPageTypes.length) && newPageTypes && newPageTypes.length) {
7
+ self.selectPageType(newPageTypes[0]);
8
+ }
9
+ }
10
+ );
11
+
12
+ this.selectPageType = function(pageType) {
13
+ this.selectedPageType = pageType;
14
+ };
15
+
16
+ if ($scope.app.allPageTypes && $scope.app.allPageTypes.length > 0) {
17
+ this.selectPageType($scope.app.allPageTypes[0]);
18
+ }
19
+ }]);
@@ -0,0 +1,7 @@
1
+ 'use strict';
2
+
3
+ window.angular.module('BillyCmsBackend').directive('billyHeaderToolbar', function() {
4
+ return {
5
+ templateUrl: 'header/header.html'
6
+ };
7
+ });
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ angular.module('BillyCmsBackend').factory('AdditionalAttribute', [function() {
4
+ var AdditionalAttribute = function(options) {
5
+ this.id = options.id || null;
6
+ this.name = options.name || null;
7
+ this.title = options.title || '';
8
+ this.attribute_type = options.attribute_type || 'string';
9
+ };
10
+
11
+ return AdditionalAttribute;
12
+ }]);
@@ -0,0 +1,18 @@
1
+ 'use strict';
2
+
3
+ angular.module('BillyCmsBackend').factory('PageType', ['AdditionalAttribute', function(AdditionalAttribute) {
4
+ var PageType = function(options) {
5
+ this.id = options.id || null;
6
+ this.name = options.name || null;
7
+ this.title = options.title || '';
8
+
9
+ this.additional_attributes = (options.additional_attributes || []).map(function(attributeOptions) {
10
+ return new AdditionalAttribute(attributeOptions);
11
+ })
12
+ };
13
+
14
+
15
+
16
+ return PageType;
17
+
18
+ }]);
@@ -15,3 +15,7 @@ i.jstree-icon.binary-type {
15
15
  background: url(/assets/billy_cms/fileicon.png);
16
16
  background-size: 80% 80%;
17
17
  }
18
+
19
+ md-list-item.selected {
20
+ border-left: 5px mediumslateblue ridge;
21
+ }
@@ -1,7 +1,7 @@
1
1
  module Api
2
2
  class PageTypesController < ApiController
3
3
  def index
4
- render json: BillyCms::PageType.all
4
+ render json: BillyCms::PageType.all.includes(:additional_attributes)
5
5
  end
6
6
 
7
7
  def show
@@ -1,61 +1,65 @@
1
1
  module Api
2
- class PagesController < ApiController
3
- def index
4
- render json: BillyCms::Page.all
5
- end
2
+ class PagesController < ApiController
3
+ def index
4
+ render json: BillyCms::Page.all
5
+ end
6
+
7
+ def show
8
+ render json: BillyCms::Page.find(params[:id])
9
+ end
6
10
 
7
- def update
8
- render nothing: true, status: 400 unless params[:page]
9
- page = BillyCms::Page.find params[:id]
10
- if page.update_attributes page_params
11
- render json: {
12
- success: true,
13
- page: page
14
- }
15
- else
16
- render json: {
17
- success: false,
18
- error: page.errors.full_messages,
19
- }, status: 500
20
- end
21
- end
11
+ def update
12
+ render nothing: true, status: 400 unless params[:page]
13
+ page = BillyCms::Page.find params[:id]
14
+ if page.update_attributes page_params
15
+ render json: {
16
+ success: true,
17
+ page: page
18
+ }
19
+ else
20
+ render json: {
21
+ success: false,
22
+ error: page.errors.full_messages,
23
+ }, status: 500
24
+ end
25
+ end
22
26
 
23
- def create
24
- render nothing: true, status: 400 unless params[:page]
25
- page = BillyCms::Page.new page_params
26
- if page.save
27
- render json: {
28
- success: true,
29
- page: page
30
- }
31
- else
32
- render json: {
33
- success: false,
34
- error: page.error_messages,
35
- }, status: 500
36
- end
37
- end
27
+ def create
28
+ render nothing: true, status: 400 unless params[:page]
29
+ page = BillyCms::Page.new page_params
30
+ if page.save
31
+ render json: {
32
+ success: true,
33
+ page: page
34
+ }
35
+ else
36
+ render json: {
37
+ success: false,
38
+ error: page.error_messages,
39
+ }, status: 500
40
+ end
41
+ end
38
42
 
39
- def destroy
40
- render :nothing, status: 400 unless params[:id]
41
- if BillyCms::Page.delete(params[:id])
42
- render json: {
43
- success: true
44
- }
45
- else
46
- render json: {
47
- success: false,
48
- error: page.error_messages,
49
- }, status: 500
50
- end
51
- end
43
+ def destroy
44
+ render :nothing, status: 400 unless params[:id]
45
+ if BillyCms::Page.delete(params[:id])
46
+ render json: {
47
+ success: true
48
+ }
49
+ else
50
+ render json: {
51
+ success: false,
52
+ error: page.error_messages,
53
+ }, status: 500
54
+ end
55
+ end
52
56
 
53
- private
57
+ private
54
58
 
55
- def page_params
56
- page = BillyCms::Page.find(params[:id]) if params[:id].present?
57
- allowed_types = page ? page.additional_attributes.map(&:name).map(&:to_sym) : []
58
- params.require(:page).permit(:title, :content, :parent_page_id, :order_key, :hide_from_navigation, :page_type, additional_attributes_values: allowed_types) if current_user.admin?
59
- end
59
+ def page_params
60
+ page = BillyCms::Page.find(params[:id]) if params[:id].present?
61
+ allowed_types = page ? page.additional_attributes.map(&:name).map(&:to_sym) : []
62
+ params.require(:page).permit(:title, :content, :parent_page_id, :order_key, :hide_from_navigation, :page_type, additional_attributes_values: allowed_types) if current_user.admin?
60
63
  end
64
+ end
61
65
  end
@@ -1,5 +1,7 @@
1
1
  module BillyCms
2
2
  class AdditionalAttribute < ActiveRecord::Base
3
+ include ActiveModel::Serialization
4
+
3
5
  has_many :additional_attributes_page_types, class_name: 'BillyCms::AdditionalAttributesPageTypes'
4
6
  has_many :page_types, through: :additional_attributes_page_types
5
7
  end
@@ -2,6 +2,8 @@ require 'friendly_id'
2
2
 
3
3
  module BillyCms
4
4
  class Page < ActiveRecord::Base
5
+ include ActiveModel::Serialization
6
+
5
7
  extend FriendlyId
6
8
  friendly_id :title, use: :slugged
7
9
 
@@ -1,5 +1,7 @@
1
1
  module BillyCms
2
2
  class PageType < ActiveRecord::Base
3
+ include ActiveModel::Serialization
4
+
3
5
  has_many :additional_attributes_page_types, class_name: 'BillyCms::AdditionalAttributesPageTypes'
4
6
  has_many :additional_attributes, through: :additional_attributes_page_types
5
7
  belongs_to :page
@@ -1,6 +1,6 @@
1
1
  class BillyCms::AdditionalAttributeSerializer < ActiveModel::Serializer
2
2
  attributes :id,
3
- :title,
4
- :name,
5
- :attribute_type
3
+ :title,
4
+ :name,
5
+ :attribute_type
6
6
  end
@@ -2,4 +2,5 @@ class BillyCms::PageTypeSerializer < ActiveModel::Serializer
2
2
  attributes :id,
3
3
  :title,
4
4
  :name
5
+ has_many :additional_attributes
5
6
  end
@@ -0,0 +1,48 @@
1
+ <div layout="row" layout-wrap>
2
+ <aside flex="30">
3
+ <md-list>
4
+ <md-list-item class="md-2-line" ng-repeat="pageType in app.allPageTypes" ng-click="ptctrl.selectPageType(pageType)" ng-class="{selected: pageType.id == ptctrl.selectedPageType.id}">
5
+ <div class="md-list-item-text" layout="column">
6
+ <h3>{{ pageType.title }}</h3>
7
+ <h4>{{ pageType.name }}</h4>
8
+ </div>
9
+ </md-list-item>
10
+ </md-list>
11
+ </aside>
12
+ <form flex="70" ng-show="ptctrl.selectedPageType" ng-submit="ptctrl.savePageType(ptctrl.selectedPageType)">
13
+ <md-toolbar>
14
+ <div class="md-toolbar-tools">
15
+ <h3>
16
+ <span>{{ptctrl.selectedPageType.title}}</span>
17
+ </h3>
18
+ </div>
19
+ </md-toolbar>
20
+ <md-content>
21
+ <md-input-container class="md-block">
22
+ <label>ID: {{ptctrl.selectedPageType.id}}</label>
23
+ </md-input-container>
24
+ <md-input-container class="md-block">
25
+ <label>Titel</label>
26
+ <input type="text" ng-model="ptctrl.selectedPageType.title" />
27
+ </md-input-container>
28
+ <md-input-container class="md-block">
29
+ <label>Name</label>
30
+ <input type="text" ng-model="ptctrl.selectedPageType.name" />
31
+ </md-input-container>
32
+ </md-content>
33
+ <h2>
34
+ Zusätzliche Eigenschaften
35
+ </h2>
36
+ <md-input-container>
37
+ <label>Hinzufügen:</label>
38
+ <md-select ng-model="ptctrl.attributeToAdd">
39
+ <md-option ng-repeat="attribute in app.allAdditionalAttributes" value="{{attribute}}">{{attribute.title}}</md-option>
40
+ </md-select>
41
+ </md-input-container>
42
+ <ul>
43
+ <li ng-repeat="attribute in ptctrl.selectedPageType.additional_attributes">
44
+ {{attribute.title}}
45
+ </li>
46
+ </ul>
47
+ </form>
48
+ </div>
@@ -6,7 +6,7 @@
6
6
  <%= render partial: 'tree' %>
7
7
  </script>
8
8
  <script type="text/ng-template" id="page_types/page_types.html">
9
- SEITENTYPEN
9
+ <%= render partial: 'page_types' %>
10
10
  </script>
11
11
  <script type="text/ng-template" id="attributes/attributes.html">
12
12
  <%= render partial: 'attributes' %>
@@ -0,0 +1,5 @@
1
+ # Disable for all serializers (except ArraySerializer)
2
+ ActiveModel::Serializer.root = false
3
+
4
+ # Disable for ArraySerializer
5
+ ActiveModel::ArraySerializer.root = false
@@ -0,0 +1,90 @@
1
+ require 'friendly_id'
2
+
3
+ # FriendlyId Global Configuration
4
+ #
5
+ # Use this to set up shared configuration options for your entire application.
6
+ # Any of the configuration options shown here can also be applied to single
7
+ # models by passing arguments to the `friendly_id` class method or defining
8
+ # methods in your model.
9
+ #
10
+ # To learn more, check out the guide:
11
+ #
12
+ # http://norman.github.io/friendly_id/file.Guide.html
13
+
14
+ FriendlyId.defaults do |config|
15
+ # ## Reserved Words
16
+ #
17
+ # Some words could conflict with Rails's routes when used as slugs, or are
18
+ # undesirable to allow as slugs. Edit this list as needed for your app.
19
+ config.use :reserved
20
+
21
+ config.reserved_words = %w(new edit index session login logout users admin
22
+ stylesheets assets javascripts images)
23
+
24
+ # ## Friendly Finders
25
+ #
26
+ # Uncomment this to use friendly finders in all models. By default, if
27
+ # you wish to find a record by its friendly id, you must do:
28
+ #
29
+ # MyModel.friendly.find('foo')
30
+ #
31
+ # If you uncomment this, you can do:
32
+ #
33
+ # MyModel.find('foo')
34
+ #
35
+ # This is significantly more convenient but may not be appropriate for
36
+ # all applications, so you must explicity opt-in to this behavior. You can
37
+ # always also configure it on a per-model basis if you prefer.
38
+ #
39
+ # Something else to consider is that using the :finders addon boosts
40
+ # performance because it will avoid Rails-internal code that makes runtime
41
+ # calls to `Module.extend`.
42
+ #
43
+ # config.use :finders
44
+ #
45
+ # ## Slugs
46
+ #
47
+ # Most applications will use the :slugged module everywhere. If you wish
48
+ # to do so, uncomment the following line.
49
+ #
50
+ # config.use :slugged
51
+ #
52
+ # By default, FriendlyId's :slugged addon expects the slug column to be named
53
+ # 'slug', but you can change it if you wish.
54
+ #
55
+ # config.slug_column = 'slug'
56
+ #
57
+ # When FriendlyId can not generate a unique ID from your base method, it appends
58
+ # a UUID, separated by a single dash. You can configure the character used as the
59
+ # separator. If you're upgrading from FriendlyId 4, you may wish to replace this
60
+ # with two dashes.
61
+ #
62
+ # config.sequence_separator = '-'
63
+ #
64
+ # ## Tips and Tricks
65
+ #
66
+ # ### Controlling when slugs are generated
67
+ #
68
+ # As of FriendlyId 5.0, new slugs are generated only when the slug field is
69
+ # nil, but if you're using a column as your base method can change this
70
+ # behavior by overriding the `should_generate_new_friendly_id` method that
71
+ # FriendlyId adds to your model. The change below makes FriendlyId 5.0 behave
72
+ # more like 4.0.
73
+ #
74
+ # config.use Module.new {
75
+ # def should_generate_new_friendly_id?
76
+ # slug.blank? || <your_column_name_here>_changed?
77
+ # end
78
+ # }
79
+ #
80
+ # FriendlyId uses Rails's `parameterize` method to generate slugs, but for
81
+ # languages that don't use the Roman alphabet, that's not usually sufficient.
82
+ # Here we use the Babosa library to transliterate Russian Cyrillic slugs to
83
+ # ASCII. If you use this, don't forget to add "babosa" to your Gemfile.
84
+ #
85
+ # config.use Module.new {
86
+ # def normalize_friendly_id(text)
87
+ # text.to_slug.normalize! :transliterations => [:russian, :latin]
88
+ # end
89
+ # }
90
+ end
@@ -1,3 +1,3 @@
1
1
  module BillyCms
2
- VERSION = "0.0.10"
2
+ VERSION = "0.0.11"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: billy_cms
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.0.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - unsdrei GbR
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-06-16 00:00:00.000000000 Z
11
+ date: 2016-08-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -127,11 +127,15 @@ files:
127
127
  - app/assets/javascripts/billy_cms/backend.js
128
128
  - app/assets/javascripts/billy_cms/backend/app.js.erb
129
129
  - app/assets/javascripts/billy_cms/backend/attributes.js
130
- - app/assets/javascripts/billy_cms/backend/billy_object.js
130
+ - app/assets/javascripts/billy_cms/backend/controllers/application.controller.js.erb
131
+ - app/assets/javascripts/billy_cms/backend/controllers/page_types.controller.js
132
+ - app/assets/javascripts/billy_cms/backend/directives/header.directive.js
131
133
  - app/assets/javascripts/billy_cms/backend/directives/ng-jstree.js
134
+ - app/assets/javascripts/billy_cms/backend/factories/additional_attribute.js
135
+ - app/assets/javascripts/billy_cms/backend/factories/billy_object.js
136
+ - app/assets/javascripts/billy_cms/backend/factories/page_type.js
132
137
  - app/assets/javascripts/billy_cms/backend/jstree.js
133
138
  - app/assets/javascripts/billy_cms/backend/ngfileupload.js
134
- - app/assets/javascripts/billy_cms/backend/page_type.js
135
139
  - app/assets/javascripts/billy_cms/backend/ui-router.js
136
140
  - app/assets/javascripts/billy_cms/frontend/api_connector.js
137
141
  - app/assets/javascripts/billy_cms/frontend/editing.es6
@@ -166,12 +170,14 @@ files:
166
170
  - app/views/billy_cms/_settings_page_button.html.erb
167
171
  - app/views/billy_cms/backend/_attributes.html.erb
168
172
  - app/views/billy_cms/backend/_header.html.erb
173
+ - app/views/billy_cms/backend/_page_types.html.erb
169
174
  - app/views/billy_cms/backend/_tree.html.erb
170
175
  - app/views/billy_cms/backend/index.html.erb
171
176
  - billy_cms.gemspec
172
177
  - bin/console
173
178
  - bin/setup
174
179
  - config/initializers/active_model_serializers.rb
180
+ - config/initializers/friendly_id.rb
175
181
  - config/routes.rb
176
182
  - lib/billy_cms.rb
177
183
  - lib/billy_cms/version.rb
@@ -1,11 +0,0 @@
1
- 'use strict';
2
-
3
- angular.module('BillyCmsBackend').factory('PageType', function() {
4
- var PageType = function(options) {
5
- this.id = options.id || null;
6
- this.name = options.name || null;
7
- this.title = options.title || '';
8
- };
9
-
10
- return PageType;
11
- });