billy_cms 0.0.11 → 0.0.14
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/billy_cms/backend/app.js.erb +1 -1
- data/app/assets/javascripts/billy_cms/backend/controllers/attributes.controller.js +27 -0
- data/app/assets/javascripts/billy_cms/backend/controllers/page_types.controller.js +35 -0
- data/app/assets/javascripts/billy_cms/backend/factories/{additional_attribute.js → additional_attribute.factory.js} +1 -0
- data/app/assets/javascripts/billy_cms/backend/factories/page_type.js +53 -8
- data/app/assets/stylesheets/billy_cms/backend/index.scss +13 -0
- data/app/controllers/api/attributes_controller.rb +3 -3
- data/app/controllers/api/page_type_attributes_controller.rb +59 -0
- data/app/helpers/billy_cms/content_helper.rb +8 -1
- data/app/views/billy_cms/backend/_attributes.html.erb +35 -8
- data/app/views/billy_cms/backend/_page_types.html.erb +6 -4
- data/config/routes.rb +3 -1
- data/lib/billy_cms/version.rb +1 -1
- metadata +5 -4
- data/app/assets/javascripts/billy_cms/backend/attributes.js +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1dd64aeeedb98f763d5cefcaada670b0fe5c4798
|
4
|
+
data.tar.gz: fe8743b1229d9ba5e3a0797c02cc612eecc36953
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 658d41360662fbcb6c027b2df5004501499b7a913a8f1131e1140459b21aa40059b2906d22b6cedec2ce6ee1a76d24f92bc78788a7c07714127b956965a239d1
|
7
|
+
data.tar.gz: bc75818c778befa9b4e70a67f789bd3fbb4e5e44380b37b5dd662f0cd2101c7d62d977106a324ec05ee8014266f22716ec835d30e17d7dc1b2c2f8ccd2864bfe
|
@@ -0,0 +1,27 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
3
|
+
angular.module('BillyCmsBackend').controller('AttributesCtrl', ['$scope', '$http', 'AdditionalAttribute', function($scope, $http, AdditionalAttribute) {
|
4
|
+
var self = this;
|
5
|
+
|
6
|
+
this.selectedTabIndex = 0;
|
7
|
+
|
8
|
+
this.resetNewAttribute = function() {
|
9
|
+
this.newAttribute = new AdditionalAttribute();
|
10
|
+
};
|
11
|
+
this.resetNewAttribute();
|
12
|
+
|
13
|
+
this.createAttribute = function() {
|
14
|
+
$http.post('/billy_cms/api/attributes.json', this.newAttribute)
|
15
|
+
.then(function(result) {
|
16
|
+
var attribute = new AdditionalAttribute(result.data.attribute);
|
17
|
+
$scope.app.allAdditionalAttributes.push(attribute);
|
18
|
+
|
19
|
+
self.selectedTabIndex = 0;
|
20
|
+
})
|
21
|
+
.catch(function(err) {
|
22
|
+
alert(err);
|
23
|
+
})
|
24
|
+
}
|
25
|
+
|
26
|
+
return this;
|
27
|
+
}]);
|
@@ -1,3 +1,5 @@
|
|
1
|
+
'use strict';
|
2
|
+
|
1
3
|
window.angular.module('BillyCmsBackend').controller('PageTypesCtrl', ['$scope', function($scope) {
|
2
4
|
var self = this;
|
3
5
|
$scope.$watch(
|
@@ -16,4 +18,37 @@ window.angular.module('BillyCmsBackend').controller('PageTypesCtrl', ['$scope',
|
|
16
18
|
if ($scope.app.allPageTypes && $scope.app.allPageTypes.length > 0) {
|
17
19
|
this.selectPageType($scope.app.allPageTypes[0]);
|
18
20
|
}
|
21
|
+
|
22
|
+
this.addAtributeToSelectedPageType = function() {
|
23
|
+
var attributeId = this.attributeIdToAdd;
|
24
|
+
var pageType = this.selectedPageType;
|
25
|
+
if (!pageType) {
|
26
|
+
return console.error('No Page Type selected.');
|
27
|
+
}
|
28
|
+
return pageType
|
29
|
+
.addAdditionalAttribute(attributeId)
|
30
|
+
.then(function() {
|
31
|
+
self.attributeIdToAdd = null;
|
32
|
+
})
|
33
|
+
.catch(function(error) {
|
34
|
+
alert(error);
|
35
|
+
});
|
36
|
+
};
|
37
|
+
|
38
|
+
this.removeAttribute = function(attribute) {
|
39
|
+
return this.selectedPageType.removeAdditionalAttribute(attribute).catch(function(err) {
|
40
|
+
alert(err);
|
41
|
+
});
|
42
|
+
}
|
43
|
+
|
44
|
+
this.attributesAddableToSelectedPageType = function() {
|
45
|
+
if (!self.selectedPageType) {
|
46
|
+
return [];
|
47
|
+
}
|
48
|
+
return ($scope.app.allAdditionalAttributes || []).filter(function(attribute) {
|
49
|
+
return self.selectedPageType.additional_attributes
|
50
|
+
.map(function(attr) { return attr.id; })
|
51
|
+
.indexOf(attribute.id) < 0;
|
52
|
+
});
|
53
|
+
}
|
19
54
|
}]);
|
@@ -1,17 +1,62 @@
|
|
1
1
|
'use strict';
|
2
2
|
|
3
|
-
angular.module('BillyCmsBackend').factory('PageType', ['AdditionalAttribute', function(AdditionalAttribute) {
|
3
|
+
angular.module('BillyCmsBackend').factory('PageType', ['AdditionalAttribute', '$http', function(AdditionalAttribute, $http) {
|
4
4
|
var PageType = function(options) {
|
5
|
-
|
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
|
-
})
|
5
|
+
this.applyOptions(options);
|
12
6
|
};
|
13
7
|
|
8
|
+
PageType.prototype.applyOptions = function(options) {
|
9
|
+
this.id = options.id || null;
|
10
|
+
this.name = options.name || null;
|
11
|
+
this.title = options.title || '';
|
12
|
+
|
13
|
+
this.additional_attributes = (options.additional_attributes || []).map(function(attributeOptions) {
|
14
|
+
return new AdditionalAttribute(attributeOptions);
|
15
|
+
})
|
16
|
+
}
|
17
|
+
|
18
|
+
PageType.prototype.addAdditionalAttribute = function(attributeOrAttributeId) {
|
19
|
+
var attributeId;
|
20
|
+
var self = this;
|
21
|
+
if (!this.id) {
|
22
|
+
throw new Error('PageType is not valid.');
|
23
|
+
}
|
24
|
+
if (typeof attributeOrAttributeId === 'number' || typeof attributeOrAttributeId === 'string') {
|
25
|
+
attributeId = parseInt(attributeOrAttributeId, 10);
|
26
|
+
} else {
|
27
|
+
attributeId = attributeOrAttributeId.id;
|
28
|
+
}
|
29
|
+
if (!attributeId) {
|
30
|
+
throw new Error('Please pass a valid attribute or attribute id.');
|
31
|
+
}
|
32
|
+
return $http.post('/billy_cms/api/page_types/' + String(this.id) + '/attributes.json', {
|
33
|
+
attribute: {
|
34
|
+
id: attributeId
|
35
|
+
}
|
36
|
+
}).then(function(result) {
|
37
|
+
self.applyOptions(result.data.page_type)
|
38
|
+
});
|
39
|
+
}
|
14
40
|
|
41
|
+
PageType.prototype.removeAdditionalAttribute = function(attributeOrAttributeId) {
|
42
|
+
var self = this;
|
43
|
+
var attributeId;
|
44
|
+
if (!this.id) {
|
45
|
+
throw new Error('PageType is not valid.');
|
46
|
+
}
|
47
|
+
if (typeof attributeOrAttributeId === 'number' || typeof attributeOrAttributeId === 'string') {
|
48
|
+
attributeId = parseInt(attributeOrAttributeId, 10);
|
49
|
+
} else {
|
50
|
+
attributeId = attributeOrAttributeId.id;
|
51
|
+
}
|
52
|
+
if (!attributeId) {
|
53
|
+
throw new Error('Please pass a valid attribute or attribute id.');
|
54
|
+
}
|
55
|
+
return $http.delete('/billy_cms/api/page_types/' + String(this.id) + '/attributes/' + String(attributeId))
|
56
|
+
.then(function(result) {
|
57
|
+
self.applyOptions(result.data.page_type)
|
58
|
+
});
|
59
|
+
}
|
15
60
|
|
16
61
|
return PageType;
|
17
62
|
|
@@ -18,4 +18,17 @@ i.jstree-icon.binary-type {
|
|
18
18
|
|
19
19
|
md-list-item.selected {
|
20
20
|
border-left: 5px mediumslateblue ridge;
|
21
|
+
}
|
22
|
+
|
23
|
+
span.delete-link {
|
24
|
+
color: #730E15;
|
25
|
+
::before {
|
26
|
+
content: '[';
|
27
|
+
}
|
28
|
+
::after {
|
29
|
+
content: ']';
|
30
|
+
}
|
31
|
+
&:hover {
|
32
|
+
color: #ff1e2e;
|
33
|
+
}
|
21
34
|
}
|
@@ -11,7 +11,7 @@ module Api
|
|
11
11
|
def update
|
12
12
|
render nothing: true, status: 400 unless params[:attribute]
|
13
13
|
attribute = BillyCms::AdditionalAttribute.find params[:id]
|
14
|
-
if attribute.update_attributes
|
14
|
+
if attribute.update_attributes attributes_params
|
15
15
|
render json: {
|
16
16
|
success: true,
|
17
17
|
attribute: attribute
|
@@ -26,7 +26,7 @@ module Api
|
|
26
26
|
|
27
27
|
def create
|
28
28
|
render nothing: true, status: 400 unless params[:attribute]
|
29
|
-
attribute = BillyCms::AdditionalAttribute.new
|
29
|
+
attribute = BillyCms::AdditionalAttribute.new attributes_params
|
30
30
|
if attribute.save
|
31
31
|
render json: {
|
32
32
|
success: true,
|
@@ -57,7 +57,7 @@ module Api
|
|
57
57
|
private
|
58
58
|
|
59
59
|
def attributes_params
|
60
|
-
params.require(:attribute).permit(:title, :
|
60
|
+
params.require(:attribute).permit(:title, :name, :attribute_type) if current_user.admin?
|
61
61
|
end
|
62
62
|
end
|
63
63
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Api
|
2
|
+
class PageTypeAttributesController < ApiController
|
3
|
+
before_filter :set_page_type
|
4
|
+
before_filter :set_additional_attribute, only: [:create]
|
5
|
+
before_filter :ensure_user_is_admin
|
6
|
+
|
7
|
+
def index
|
8
|
+
render json: @page_type.additional_attributes
|
9
|
+
end
|
10
|
+
|
11
|
+
def show
|
12
|
+
render json: @page_type.additional_attributes.find(params.fetch(:id))
|
13
|
+
end
|
14
|
+
|
15
|
+
def create
|
16
|
+
if @page_type && @additional_attribute
|
17
|
+
if @page_type.additional_attributes.include? @additional_attribute
|
18
|
+
render json: { success: false, error: 'Attribute already exists.' }, status: 400
|
19
|
+
else
|
20
|
+
@page_type.additional_attributes.push @additional_attribute
|
21
|
+
render json: { success: true, page_type: BillyCms::PageTypeSerializer.new(@page_type) }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def destroy
|
27
|
+
additional_attribute_id = params[:id]
|
28
|
+
@additional_attribute = BillyCms::AdditionalAttribute.find(additional_attribute_id)
|
29
|
+
if @page_type && @additional_attribute
|
30
|
+
unless @page_type.additional_attributes.include? @additional_attribute
|
31
|
+
render json: { success: false, error: "Attribute does not exist on pages of type '#{@page_type.name}'." }, status: 400
|
32
|
+
else
|
33
|
+
@page_type.additional_attributes.delete(additional_attribute_id)
|
34
|
+
render json: { success: true, page_type: BillyCms::PageTypeSerializer.new(@page_type) }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def set_page_type
|
42
|
+
@page_type = BillyCms::PageType.find(params.fetch(:page_type_id))
|
43
|
+
end
|
44
|
+
|
45
|
+
def set_additional_attribute
|
46
|
+
if id = attribute_params[:id]
|
47
|
+
begin
|
48
|
+
@additional_attribute = BillyCms::AdditionalAttribute.find id
|
49
|
+
rescue ActiveRecord::RecordNotFound
|
50
|
+
@additional_attribute = nil
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def attribute_params
|
56
|
+
params.require(:attribute).permit(:id)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -3,7 +3,14 @@ module BillyCms
|
|
3
3
|
|
4
4
|
def page_field(page, field, options = {})
|
5
5
|
tag_name = options[:tag] || :div
|
6
|
-
|
6
|
+
html_options = {
|
7
|
+
:'billycms-attribute' => field.to_s,
|
8
|
+
:'billycms-page' => page[:id],
|
9
|
+
:contenteditable => false,
|
10
|
+
:class => ''
|
11
|
+
}.merge(options[:html] || {})
|
12
|
+
html_options[:class] += " page-#{field.to_s}"
|
13
|
+
content_tag tag_name, page.send(field).to_s.html_safe, html_options
|
7
14
|
end
|
8
15
|
|
9
16
|
def cms_image(obj, options = {})
|
@@ -1,12 +1,39 @@
|
|
1
1
|
<md-content>
|
2
|
-
<
|
2
|
+
<md-tabs md-dynamic-height md-border-bottom md-selected="atctrl.selectedTabIndex">
|
3
|
+
<md-tab label="Alle Attribute">
|
4
|
+
<md-list>
|
5
|
+
<md-list-item class="md-2-line" ng-repeat="attribute in app.allAdditionalAttributes">
|
6
|
+
<div class="md-list-item-text" layout="column">
|
7
|
+
<h3>{{ attribute.title }}</h3>
|
8
|
+
<p>{{ attribute.name }} • {{attribute.attribute_type}}</p>
|
9
|
+
</div>
|
10
|
+
</md-list-item>
|
11
|
+
</md-list>
|
12
|
+
</md-tab>
|
13
|
+
<md-tab label="Neues Attribut hinzufügen">
|
14
|
+
<form ng-submit="atctrl.createAttribute()">
|
15
|
+
<md-input-container class="md-block">
|
16
|
+
<label>Titel:</label>
|
17
|
+
<input type="text" ng-model="atctrl.newAttribute.title" />
|
18
|
+
</md-input-container>
|
19
|
+
<md-input-container class="md-block">
|
20
|
+
<label>Name:</label>
|
21
|
+
<input type="text" ng-model="atctrl.newAttribute.name" />
|
22
|
+
</md-input-container>
|
23
|
+
<md-input-container class="md-block">
|
24
|
+
<label>Typ:</label>
|
25
|
+
<md-select ng-model="atctrl.newAttribute.attribute_type">
|
26
|
+
<md-option value="string">Text</md-option>
|
27
|
+
<md-option value="integer">Zahl</md-option>
|
28
|
+
<md-option value="email">Email</md-option>
|
29
|
+
<md-option value="url">URL</md-option>
|
30
|
+
</md-select>
|
31
|
+
</md-input-container>
|
3
32
|
|
4
|
-
|
5
|
-
|
6
|
-
<div class="md-list-item-text" layout="column">
|
7
|
-
<h3>{{ attribute.title }}</h3>
|
8
|
-
<p>{{ attribute.name }} • {{attribute.attribute_type}}</p>
|
33
|
+
<div layout="row">
|
34
|
+
<input type="submit" value="speichern" class="md-button md-primary md-raised" />
|
9
35
|
</div>
|
10
|
-
</
|
11
|
-
|
36
|
+
</form>
|
37
|
+
</md-tab>
|
38
|
+
</md-tabs>
|
12
39
|
</md-content>
|
@@ -34,14 +34,16 @@
|
|
34
34
|
Zusätzliche Eigenschaften
|
35
35
|
</h2>
|
36
36
|
<md-input-container>
|
37
|
-
<label>
|
38
|
-
<md-select ng-model="ptctrl.
|
39
|
-
<md-option ng-repeat="attribute in
|
37
|
+
<label>Mögliche zusätzliche Eigenschaft hinzufügen:</label>
|
38
|
+
<md-select ng-model="ptctrl.attributeIdToAdd" ng-change="ptctrl.addAtributeToSelectedPageType()">
|
39
|
+
<md-option ng-repeat="attribute in ptctrl.attributesAddableToSelectedPageType() track by $index" value="{{attribute.id}}">
|
40
|
+
{{attribute.title}} ({{attribute.name}})
|
41
|
+
</md-option>
|
40
42
|
</md-select>
|
41
43
|
</md-input-container>
|
42
44
|
<ul>
|
43
45
|
<li ng-repeat="attribute in ptctrl.selectedPageType.additional_attributes">
|
44
|
-
{{attribute.title}}
|
46
|
+
{{attribute.title}} <span class="delete-link" ng-click="ptctrl.removeAttribute(attribute)">entfernen</span>
|
45
47
|
</li>
|
46
48
|
</ul>
|
47
49
|
</form>
|
data/config/routes.rb
CHANGED
data/lib/billy_cms/version.rb
CHANGED
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.
|
4
|
+
version: 0.0.14
|
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-08-
|
11
|
+
date: 2016-08-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -126,12 +126,12 @@ files:
|
|
126
126
|
- app/assets/javascripts/billy_cms.js
|
127
127
|
- app/assets/javascripts/billy_cms/backend.js
|
128
128
|
- app/assets/javascripts/billy_cms/backend/app.js.erb
|
129
|
-
- app/assets/javascripts/billy_cms/backend/attributes.js
|
130
129
|
- app/assets/javascripts/billy_cms/backend/controllers/application.controller.js.erb
|
130
|
+
- app/assets/javascripts/billy_cms/backend/controllers/attributes.controller.js
|
131
131
|
- app/assets/javascripts/billy_cms/backend/controllers/page_types.controller.js
|
132
132
|
- app/assets/javascripts/billy_cms/backend/directives/header.directive.js
|
133
133
|
- app/assets/javascripts/billy_cms/backend/directives/ng-jstree.js
|
134
|
-
- app/assets/javascripts/billy_cms/backend/factories/additional_attribute.js
|
134
|
+
- app/assets/javascripts/billy_cms/backend/factories/additional_attribute.factory.js
|
135
135
|
- app/assets/javascripts/billy_cms/backend/factories/billy_object.js
|
136
136
|
- app/assets/javascripts/billy_cms/backend/factories/page_type.js
|
137
137
|
- app/assets/javascripts/billy_cms/backend/jstree.js
|
@@ -149,6 +149,7 @@ files:
|
|
149
149
|
- app/assets/stylesheets/billy_cms/jstree.scss
|
150
150
|
- app/controllers/api/api_controller.rb
|
151
151
|
- app/controllers/api/attributes_controller.rb
|
152
|
+
- app/controllers/api/page_type_attributes_controller.rb
|
152
153
|
- app/controllers/api/page_types_controller.rb
|
153
154
|
- app/controllers/api/pages_controller.rb
|
154
155
|
- app/controllers/billy_cms/backend_controller.rb
|
@@ -1,33 +0,0 @@
|
|
1
|
-
'use strict';
|
2
|
-
|
3
|
-
angular.module('BillyCmsBackend').controller('AttributesCtrl', function($http, Attribute) {
|
4
|
-
var vm = this;
|
5
|
-
|
6
|
-
vm.possibleAttributes = [];
|
7
|
-
vm.loadAttributes = function() {
|
8
|
-
$http.get('/billy_cms/api/attributes')
|
9
|
-
.then(function(response) {
|
10
|
-
var data = response.data;
|
11
|
-
console.log(data);
|
12
|
-
vm.possibleAttributes = data.attributes.map(function(attr) {
|
13
|
-
return new Attribute(attr);
|
14
|
-
})
|
15
|
-
}, function(err) {
|
16
|
-
alert('Fehler: ', err);
|
17
|
-
});
|
18
|
-
};
|
19
|
-
vm.loadAttributes();
|
20
|
-
|
21
|
-
return vm;
|
22
|
-
});
|
23
|
-
|
24
|
-
angular.module('BillyCmsBackend').factory('Attribute', function() {
|
25
|
-
var Attribute = function(options) {
|
26
|
-
this.title = options.title || '';
|
27
|
-
this.name = options.name || null;
|
28
|
-
this.id = options.id || null;
|
29
|
-
this.attribute_type = options.attribute_type || 'string';
|
30
|
-
};
|
31
|
-
|
32
|
-
return Attribute;
|
33
|
-
});
|